diff --git a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt
index c03f50a293b26523cf500c9ccedf75360ced2111..65af5d76ee017656ea700023be2b34b6e51feb83 100644
--- a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt
@@ -38,6 +38,7 @@ set(SOURCES
     instance/serialize_path.cpp
 
     instance/display_visitors/DataDisplayVisitor.cpp
+    instance/display_visitors/StringStreamMixin.cpp
     instance/display_visitors/TypedDataDisplayVisitor.cpp
 
     instance/tree_builders/DataTreeBuilder.cpp
@@ -87,6 +88,7 @@ set(HEADERS
     instance/serialize_path.h
 
     instance/display_visitors/DataDisplayVisitor.h
+    instance/display_visitors/StringStreamMixin.h
     instance/display_visitors/TypedDataDisplayVisitor.h
 
     instance/tree_builders/DataTreeBuilder.h
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
index 99f95201e220830607148af08c1a9cce6ded71d2..a814c111cf8d24b728e0406ff89d9f428ab6ed99 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
@@ -5,26 +5,30 @@
 namespace armarx::aron
 {
 
-    std::string DataDisplayVisitor::getValue(const data::VariantPtr& n)
+    std::string
+    DataDisplayVisitor::getValue(const data::VariantPtr& n)
     {
         DataDisplayVisitor v;
         data::visit(v, n);
         return v.value.str();
     }
 
-    void DataDisplayVisitor::visitDict(const data::VariantPtr& n)
+    void
+    DataDisplayVisitor::visitDict(const data::VariantPtr& n)
     {
         auto x = data::Dict::DynamicCastAndCheck(n);
         value << x->childrenSize() << " items";
     }
 
-    void DataDisplayVisitor::visitList(const data::VariantPtr& n)
+    void
+    DataDisplayVisitor::visitList(const data::VariantPtr& n)
     {
         auto x = data::List::DynamicCastAndCheck(n);
         value << x->childrenSize() << " items";
     }
 
-    void DataDisplayVisitor::visitBool(const data::VariantPtr& b)
+    void
+    DataDisplayVisitor::visitBool(const data::VariantPtr& b)
     {
         auto x = data::Bool::DynamicCastAndCheck(b);
         if (x->getValue())
@@ -37,41 +41,101 @@ namespace armarx::aron
         }
     }
 
-    void DataDisplayVisitor::visitDouble(const data::VariantPtr& n)
+    void
+    DataDisplayVisitor::visitDouble(const data::VariantPtr& n)
     {
         auto x = data::Double::DynamicCastAndCheck(n);
         value << x->getValue();
     }
 
-    void DataDisplayVisitor::visitFloat(const data::VariantPtr& n)
+    void
+    DataDisplayVisitor::visitFloat(const data::VariantPtr& n)
     {
         auto x = data::Float::DynamicCastAndCheck(n);
         value << x->getValue();
     }
 
-    void DataDisplayVisitor::visitInt(const data::VariantPtr& n)
+    void
+    DataDisplayVisitor::visitInt(const data::VariantPtr& n)
     {
         auto x = data::Int::DynamicCastAndCheck(n);
         value << x->getValue();
     }
 
-    void DataDisplayVisitor::visitLong(const data::VariantPtr& n)
+    void
+    DataDisplayVisitor::visitLong(const data::VariantPtr& n)
     {
         auto x = data::Long::DynamicCastAndCheck(n);
         value << x->getValue();
     }
 
-    void DataDisplayVisitor::visitString(const data::VariantPtr& n)
+    void
+    DataDisplayVisitor::visitString(const data::VariantPtr& n)
     {
         auto x = data::String::DynamicCastAndCheck(n);
         value << "'" << x->getValue() << "'";
     }
 
-    void DataDisplayVisitor::visitNDArray(const data::VariantPtr& n)
+    void
+    DataDisplayVisitor::visitNDArray(const data::VariantPtr& data)
     {
-        auto x = data::NDArray::DynamicCastAndCheck(n);
-        value << "shape " << aron::data::NDArray::DimensionsToString(x->getShape()) << ", type '" << x->getType() << "'";
+        auto d = data::NDArray::DynamicCastAndCheck(data);
+
+        if (d->getType() == "float")
+        {
+            setStreamPrecision();
+            processMatrix<float>(*d);
+        }
+        else if (d->getType() == "double")
+        {
+            setStreamPrecision();
+            processMatrix<double>(*d);
+        }
+        else
+        {
+            printShape(*d);
+        }
+    }
+
+    void
+    DataDisplayVisitor::printShape(const data::NDArray& d)
+    {
+        value << "shape " << aron::data::NDArray::DimensionsToString(d.getShape()) << ", type '"
+              << d.getType() << "'";
+    }
+
+    template <typename ScalarT>
+    void
+    DataDisplayVisitor::processMatrix(const data::NDArray& data)
+    {
+        const int rows = data.getShape().at(0);
+        const int cols = data.getShape().at(1);
+
+        const Eigen::Map<Eigen::Matrix<ScalarT, Eigen::Dynamic, Eigen::Dynamic>> m(
+            reinterpret_cast<ScalarT*>(data.getData()), rows, cols);
+
+        const int maxRows = 10;
+        const int maxCols = 10;
+
+        if (cols > maxCols)
+        {
+            printShape(data);
+        }
+        else if (rows > maxRows)
+        {
+            int shownRows = 2;
+
+            value << "(";
+            printShape(data);
+            value << ")\n"
+                  << m.block(0, 0, shownRows, cols) << "\n...\n"
+                  << m.block(rows - shownRows, 0, shownRows, cols);
+        }
+        else
+        {
+            value << m.format(eigenIof);
+        }
     }
 
 
-}
+} // namespace armarx::aron
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h
index 1595e6ffb601278cb186d61f3a5f2535ff8bbcfb..26d8aae07a87dbc82bb3b44e9e8154f3cfc8315f 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h
@@ -4,20 +4,18 @@
 
 #include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h>
 
+#include "StringStreamMixin.h"
 
 namespace armarx::aron
 {
 
-    class DataDisplayVisitor : public aron::data::ConstVariantVisitor
+    class DataDisplayVisitor : public aron::data::ConstVariantVisitor, public StringStreamMixin
     {
     public:
         static std::string getValue(const data::VariantPtr& n);
 
 
     public:
-
-        std::stringstream value;
-
         void visitDict(const data::VariantPtr& n) override;
         void visitList(const data::VariantPtr& n) override;
 
@@ -30,6 +28,11 @@ namespace armarx::aron
 
         void visitNDArray(const data::VariantPtr& n) override;
 
+    private:
+        template <typename ScalarT>
+        void processMatrix(const data::NDArray& data);
+
+        void printShape(const data::NDArray& data);
     };
 
-}
+} // namespace armarx::aron
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..768a69b885efa7ae7aa36d8534cb52ece737dd00
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.cpp
@@ -0,0 +1,24 @@
+#include "StringStreamMixin.h"
+
+#include <iomanip> // std::setprecision
+
+namespace armarx::aron
+{
+    StringStreamMixin::StringStreamMixin() :
+        coeffSep("  "), eigenIof(Eigen::StreamPrecision, 0, coeffSep, "\n", "", "", "", "")
+    {
+    }
+
+    void
+    StringStreamMixin::setStreamPrecision()
+    {
+        setStreamPrecision(value);
+    }
+
+    void
+    StringStreamMixin::setStreamPrecision(std::ostream& os)
+    {
+        os << std::setprecision(2) << std::fixed;
+    }
+
+} // namespace armarx::aron
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.h b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.h
new file mode 100644
index 0000000000000000000000000000000000000000..01dfb9d91bef2208400c7a25cad3c5cfa29b8df5
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.h
@@ -0,0 +1,27 @@
+#pragma once
+
+#include <sstream>
+
+#include <Eigen/Core>
+
+namespace armarx::aron
+{
+
+    class StringStreamMixin
+    {
+    public:
+        StringStreamMixin();
+
+    protected:
+        void setStreamPrecision();
+        void setStreamPrecision(std::ostream& os);
+
+    public:
+        std::stringstream value;
+
+    protected:
+        const std::string coeffSep;
+        const Eigen::IOFormat eigenIof;
+    };
+
+} // namespace armarx::aron
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
index 6e2e92a7cea71f53f2eb16f4ea369f53176f7079..e9bb7bc4441bb2246ca2d360dc747a3398b4fdfd 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
@@ -24,8 +24,7 @@ namespace armarx::aron
         return v.value.str();
     }
 
-    TypedDataDisplayVisitor::TypedDataDisplayVisitor() :
-        coeffSep("  "), eigenIof(Eigen::StreamPrecision, 0, coeffSep, "\n", "", "", "", "")
+    TypedDataDisplayVisitor::TypedDataDisplayVisitor()
     {
     }
 
@@ -104,7 +103,9 @@ namespace armarx::aron
     TypedDataDisplayVisitor::processMatrix(const type::Matrix& type, const data::NDArray& data)
     {
         Eigen::Map<Eigen::Matrix<ScalarT, Eigen::Dynamic, Eigen::Dynamic>> m(
-            reinterpret_cast<ScalarT*>(data.getData()), type.getRows(), type.getCols());
+            reinterpret_cast<ScalarT*>(data.getData()),
+            data.getShape().at(0),
+            data.getShape().at(1));
         value << m.format(eigenIof);
     }
 
@@ -158,28 +159,7 @@ namespace armarx::aron
     void
     TypedDataDisplayVisitor::visitMatrix(const data::VariantPtr& data, const type::VariantPtr& type)
     {
-        auto t = *type::Matrix::DynamicCastAndCheck(type);
-        auto d = *data::NDArray::DynamicCastAndCheck(data);
-
-        if (std::max(t.getRows(), t.getCols()) > 10)
-        {
-            // Just show the shape.
-            value << DataDisplayVisitor::getValue(data);
-        }
-        else if (d.getType() == "float")
-        {
-            setStreamPrecision();
-            processMatrix<float>(t, d);
-        }
-        else if (d.getType() == "double")
-        {
-            setStreamPrecision();
-            processMatrix<double>(t, d);
-        }
-        else
-        {
-            value << DataDisplayVisitor::getValue(data);
-        }
+        value << DataDisplayVisitor::getValue(data);
     }
 
     void
@@ -204,16 +184,4 @@ namespace armarx::aron
         value << DataDisplayVisitor::getValue(data);
     }
 
-    void
-    TypedDataDisplayVisitor::setStreamPrecision()
-    {
-        setStreamPrecision(value);
-    }
-
-    void
-    TypedDataDisplayVisitor::setStreamPrecision(std::ostream& os)
-    {
-        os << std::setprecision(2) << std::fixed;
-    }
-
 } // namespace armarx::aron
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h
index 9d0193e376c3ddf9d346d9f3d2114be547138fcb..cdbcf69129ff9a3224c3f14d8f87a168d54238c4 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h
@@ -7,25 +7,22 @@
 
 #include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h>
 
+#include "StringStreamMixin.h"
 
 namespace armarx::aron
 {
 
-    class TypedDataDisplayVisitor : public aron::data::ConstTypedVariantVisitor
+    class TypedDataDisplayVisitor :
+        public aron::data::ConstTypedVariantVisitor,
+        public StringStreamMixin
     {
     public:
-
         static std::string getValue(const type::VariantPtr& type, const data::VariantPtr& data);
 
 
     public:
-
         TypedDataDisplayVisitor();
 
-
-        std::stringstream value;
-
-
         void visitDict(const data::VariantPtr& data, const type::VariantPtr& type) override;
         void visitObject(const data::VariantPtr& data, const type::VariantPtr& type) override;
 
@@ -48,14 +45,7 @@ namespace armarx::aron
         // What about NDArray? currently defaulted
 
 
-    protected:
-
-        std::string coeffSep;
-        Eigen::IOFormat eigenIof;
-
-
     private:
-
         template <typename ScalarT>
         void processMatrix(const type::Matrix&, const data::NDArray& data);
         void processQuaternion(const data::NDArray& data);
@@ -63,10 +53,6 @@ namespace armarx::aron
         void processPose(const type::Matrix&, const data::NDArray& data);
         void processPosition(const type::Matrix&, const data::NDArray& data);
         void processOrientation(const type::Quaternion&, const data::NDArray& data);
-
-        void setStreamPrecision();
-        void setStreamPrecision(std::ostream& os);
-
     };
 
-}
+} // namespace armarx::aron