diff --git a/source/RobotAPI/components/ArViz/CMakeLists.txt b/source/RobotAPI/components/ArViz/CMakeLists.txt
index abef16bad1546466c10c7bd2ed11d3e58d6e2244..bdc666ed554c8acacd87d57ced6f0c2c3e12d144 100644
--- a/source/RobotAPI/components/ArViz/CMakeLists.txt
+++ b/source/RobotAPI/components/ArViz/CMakeLists.txt
@@ -38,6 +38,7 @@ Coin/ElementVisualizer.h
 # Inventor
 Coin/VisualizationBox.h
 Coin/VisualizationCylinder.h
+Coin/VisualizationEllipsoid.h
 Coin/VisualizationSphere.h
 Coin/VisualizationPose.h
 Coin/VisualizationLine.h
diff --git a/source/RobotAPI/components/ArViz/Client/Elements.h b/source/RobotAPI/components/ArViz/Client/Elements.h
index 02d2c5b10fea35b8e3d7961da0a9c3e8a9dd517d..63239bc47c03173cb254846f47035e7ffed79efe 100644
--- a/source/RobotAPI/components/ArViz/Client/Elements.h
+++ b/source/RobotAPI/components/ArViz/Client/Elements.h
@@ -153,12 +153,46 @@ namespace armarx::viz
         }
     };
 
+
+    class Ellipsoid : public ElementOps<Ellipsoid, data::ElementEllipsoid>
+    {
+    public:
+        Ellipsoid(const std::string& name) :
+            ElementOps(name)
+        {
+            data_->curvature.e0 = 1;
+            data_->curvature.e1 = 1;
+            data_->curvature.e2 = 1;
+        }
+
+        Ellipsoid& size(const Eigen::Vector3f& size)
+        {
+            data_->size.e0 = size.x();
+            data_->size.e1 = size.y();
+            data_->size.e2 = size.z();
+
+            return *this;
+        }
+
+        Ellipsoid& curvature(const Eigen::Vector3f& curvature)
+        {
+            ARMARX_WARNING << "Stub!  Curvature not yet implemented.  Has no effect.";
+            data_->curvature.e0 = curvature.x();
+            data_->curvature.e1 = curvature.y();
+            data_->curvature.e2 = curvature.z();
+
+            return *this;
+        }
+    };
+
+
     class Pose : public ElementOps<Pose, data::ElementPose>
     {
     public:
         using ElementOps::ElementOps;
     };
 
+
     class Text : public ElementOps<Text, data::ElementText>
     {
     public:
diff --git a/source/RobotAPI/components/ArViz/Coin/RegisterVisualizationTypes.cpp b/source/RobotAPI/components/ArViz/Coin/RegisterVisualizationTypes.cpp
index 69e20c6d03134b0dcde38a7293dca106d503b679..70d49b71bd6159b632e584725154bb966fe7e1b7 100644
--- a/source/RobotAPI/components/ArViz/Coin/RegisterVisualizationTypes.cpp
+++ b/source/RobotAPI/components/ArViz/Coin/RegisterVisualizationTypes.cpp
@@ -3,6 +3,7 @@
 #include "VisualizationBox.h"
 #include "VisualizationCylinder.h"
 #include "VisualizationSphere.h"
+#include "VisualizationEllipsoid.h"
 #include "VisualizationPose.h"
 #include "VisualizationLine.h"
 #include "VisualizationText.h"
@@ -19,11 +20,12 @@ void armarx::viz::CoinVisualizer::registerVisualizationTypes()
 {
     using namespace armarx::viz::coin;
 
-    elementVisualizers.reserve(13);
+    elementVisualizers.reserve(14);
 
     registerVisualizerFor<VisualizationBox>();
     registerVisualizerFor<VisualizationCylinder>();
     registerVisualizerFor<VisualizationSphere>();
+    registerVisualizerFor<VisualizationEllipsoid>();
     registerVisualizerFor<VisualizationPose>();
     registerVisualizerFor<VisualizationLine>();
     registerVisualizerFor<VisualizationText>();
diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizationEllipsoid.h b/source/RobotAPI/components/ArViz/Coin/VisualizationEllipsoid.h
new file mode 100644
index 0000000000000000000000000000000000000000..5d95205013a3695c764f94710a504db4d67370c5
--- /dev/null
+++ b/source/RobotAPI/components/ArViz/Coin/VisualizationEllipsoid.h
@@ -0,0 +1,59 @@
+#pragma once
+
+#include "ElementVisualizer.h"
+
+#include <RobotAPI/interface/ArViz/Elements.h>
+#include <Inventor/nodes/SoCone.h>
+#include <Inventor/nodes/SoCylinder.h>
+#include <Inventor/nodes/SoSphere.h>
+#include <Inventor/nodes/SoTranslation.h>
+
+#include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h>
+#include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h>
+
+namespace armarx::viz::coin
+{
+    struct VisualizationEllipsoid : TypedElementVisualization<SoSeparator>
+    {
+        using ElementType = data::ElementEllipsoid;
+
+        bool update(ElementType const& element)
+        {
+            auto color = element.color;
+            constexpr float conv = 1.0f / 255.0f;
+            const float r = color.r * conv;
+            const float g = color.g * conv;
+            const float b = color.b * conv;
+            const float a = color.a * conv;
+
+            VirtualRobot::VisualizationNodePtr ellipsoid_node;
+            {
+                // Params.
+                SoMaterial* mat = new SoMaterial;
+                mat->diffuseColor.setValue(r, g, b);
+                mat->ambientColor.setValue(r, g, b);
+                mat->transparency.setValue(1. - a);
+                const bool show_axes = false;  // Do not show axes.  If needed, draw a Pose instead.
+
+                SoSeparator* res = new SoSeparator();
+                res->ref();
+                SoUnits* u = new SoUnits();
+                u->units = SoUnits::MILLIMETERS;
+                res->addChild(u);
+                res->addChild(VirtualRobot::CoinVisualizationFactory::CreateEllipse(
+                                  element.size.e0, element.size.e1, element.size.e2, mat,
+                                  show_axes));
+                ellipsoid_node.reset(new VirtualRobot::CoinVisualizationNode(res));
+                res->unref();
+            }
+
+            SoNode* ellipsoid = dynamic_cast<VirtualRobot::CoinVisualizationNode&>(
+                                    *ellipsoid_node).getCoinVisualization();
+
+            node->removeAllChildren();
+            node->addChild(ellipsoid);
+
+            return true;
+        }
+    };
+}
diff --git a/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp b/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp
index 4df1b1f39bc32b133a0273d5408eed51c7a99672..e508a784442a3270c8cc77614e88030a02fa6f84 100644
--- a/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp
+++ b/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp
@@ -69,6 +69,17 @@ namespace armarx
 
             layer.add(box);
         }
+        {
+            const float pos_y = 100. * std::cos(timeInSeconds);
+            const Eigen::Vector3f pos{0.f, pos_y, 150.f};
+
+            viz::Ellipsoid ell = viz::Ellipsoid{"ellipsoid"}
+                                 .position(pos)
+                                 .color(viz::Color::blue())
+                                 .size(Eigen::Vector3f{50, 50, 100});
+
+            layer.add(ell);
+        }
         {
             Eigen::Vector3f pos = Eigen::Vector3f::Zero();
             pos.y() = 100.0f * std::sin(timeInSeconds);
diff --git a/source/RobotAPI/components/ArViz/Introspection/json_elements.cpp b/source/RobotAPI/components/ArViz/Introspection/json_elements.cpp
index 14fbb8bb3d7312775ffdd9f2adbc1bee41bae56f..1b1285ee98b15b3b96740deda472bab749401c73 100644
--- a/source/RobotAPI/components/ArViz/Introspection/json_elements.cpp
+++ b/source/RobotAPI/components/ArViz/Introspection/json_elements.cpp
@@ -187,6 +187,20 @@ namespace armarx::viz
     }
 
 
+    void data::to_json(nlohmann::json& j, const ElementEllipsoid& ellipsoid)
+    {
+        json::to_json_base(j, ellipsoid);
+        j["size"] = ellipsoid.size;
+        j["curvature"] = ellipsoid.curvature;
+    }
+    void data::from_json(const nlohmann::json& j, ElementEllipsoid& ellipsoid)
+    {
+        json::from_json_base(j, ellipsoid);
+        ellipsoid.size = j.at("size");
+        ellipsoid.curvature = j.at("curvature");
+    }
+
+
     void data::to_json(nlohmann::json& j, const ElementText& text)
     {
         json::to_json_base(j, text);
diff --git a/source/RobotAPI/components/ArViz/Introspection/json_elements.h b/source/RobotAPI/components/ArViz/Introspection/json_elements.h
index 15b59b676460333496c39d6410b76a46067214c0..161017340c7d83bdb91d23e79eec9ccb81ae36bf 100644
--- a/source/RobotAPI/components/ArViz/Introspection/json_elements.h
+++ b/source/RobotAPI/components/ArViz/Introspection/json_elements.h
@@ -74,6 +74,10 @@ namespace armarx::viz::data
     void from_json(const nlohmann::json& j, ElementSphere& sphere);
 
 
+    void to_json(nlohmann::json& j, const ElementEllipsoid& sphere);
+    void from_json(const nlohmann::json& j, ElementEllipsoid& sphere);
+
+
     void to_json(nlohmann::json& j, const ElementText& text);
     void from_json(const nlohmann::json& j, ElementText& text);
 
diff --git a/source/RobotAPI/components/ArViz/Introspection/register_element_json_serializers.cpp b/source/RobotAPI/components/ArViz/Introspection/register_element_json_serializers.cpp
index f5b2b44c45fc8bab1c5baaba22dcbcc507e846b7..d839d39d681f2b1ce875f3171919030f18683f54 100644
--- a/source/RobotAPI/components/ArViz/Introspection/register_element_json_serializers.cpp
+++ b/source/RobotAPI/components/ArViz/Introspection/register_element_json_serializers.cpp
@@ -8,6 +8,7 @@ void armarx::viz::json::ElementJsonSerializers::registerElements()
     registerSerializer<data::ElementArrowCircle>(viz::data::to_json, viz::data::from_json);
     registerSerializer<data::ElementBox>(viz::data::to_json, viz::data::from_json);
     registerSerializer<data::ElementCylinder>(viz::data::to_json, viz::data::from_json);
+    registerSerializer<data::ElementEllipsoid>(viz::data::to_json, viz::data::from_json);
     registerSerializer<data::ElementLine>(viz::data::to_json, viz::data::from_json);
     registerSerializer<data::ElementMesh>(viz::data::to_json, viz::data::from_json);
     registerSerializer<data::ElementObject>(viz::data::to_json, viz::data::from_json);
diff --git a/source/RobotAPI/interface/ArViz/Elements.ice b/source/RobotAPI/interface/ArViz/Elements.ice
index d0da8aefa748a7fc55bf072c2b7f151de9fce3c1..4b13ca3e1fafdbe6565295185e3d8e8870cd55d5 100644
--- a/source/RobotAPI/interface/ArViz/Elements.ice
+++ b/source/RobotAPI/interface/ArViz/Elements.ice
@@ -67,6 +67,12 @@ module data
         float radius = 10.0f;
     };
 
+    class ElementEllipsoid extends Element
+    {
+        Vector3f size;
+        Vector3f curvature;
+    };
+
     class ElementCylinder extends Element
     {
         float height = 10.0f;