diff --git a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
index 114f2b79413e4ef5c79fcb650d29299598456ad4..a26840ac78305a9afcf6ab55498d5bdf45d9c017 100644
--- a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt
@@ -17,7 +17,9 @@ armarx_add_library(
         RobotAPI::libraries::armem
     HEADERS
         aron_conversions.h
+        aron_forward_declarations.h
 
+        server/class/FloorVis.h
         server/class/Segment.h
 
         server/instance/Segment.h
@@ -28,6 +30,7 @@ armarx_add_library(
     SOURCES
         aron_conversions.cpp
 
+        server/class/FloorVis.cpp
         server/class/Segment.cpp
 
         server/instance/Segment.cpp
diff --git a/source/RobotAPI/libraries/armem_objects/aron_forward_declarations.h b/source/RobotAPI/libraries/armem_objects/aron_forward_declarations.h
new file mode 100644
index 0000000000000000000000000000000000000000..9416a033d713f5c8dab28506538c1a56534dbb53
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/aron_forward_declarations.h
@@ -0,0 +1,8 @@
+#pragma once
+
+
+namespace armarx::armem::arondto
+{
+    class ObjectClass;
+    class ObjectInstance;
+}
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/FloorVis.cpp b/source/RobotAPI/libraries/armem_objects/server/class/FloorVis.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..08927d1e77d1963234f42ea9ab861ec9a33f86c4
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/server/class/FloorVis.cpp
@@ -0,0 +1,77 @@
+#include "FloorVis.h"
+
+#include <RobotAPI/libraries/armem/core/workingmemory/CoreSegment.h>
+#include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
+
+#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
+
+
+namespace armarx::armem::server::obj::clazz
+{
+
+    FloorVis::FloorVis()
+    {
+    }
+
+    void FloorVis::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
+    {
+        properties.define(defs, prefix);
+    }
+
+    void FloorVis::setArViz(armarx::viz::Client arviz)
+    {
+        this->arviz = arviz;
+    }
+
+    void FloorVis::updateFloorObject(const wm::CoreSegment& classCoreSegment)
+    {
+        viz::Layer layer = arviz.layer(properties.layerName);
+        if (properties.show)
+        {
+            const wm::Entity* entity = classCoreSegment.findEntity(MemoryID().withEntityName(properties.entityName));
+            if (entity)
+            {
+                ARMARX_INFO << "Drawing floor class '" << properties.entityName << "'.";
+                layer.add(makeFloorObject(*entity));
+            }
+            else
+            {
+                ARMARX_INFO << "Did not find floor class '" << properties.entityName << "'.";
+            }
+        }
+        arviz.commit(layer);
+    }
+
+    armarx::viz::Object FloorVis::makeFloorObject(const wm::Entity& classEntity)
+    {
+        const wm::EntityInstance& instance = classEntity.getLatestSnapshot().getInstance(0);
+        arondto::ObjectClass data;
+        data.fromAron(instance.data());
+        return makeFloorObject(classEntity.name(), data);
+    }
+
+    armarx::viz::Object FloorVis::makeFloorObject(
+        const std::string& name,
+        const arondto::ObjectClass& objectClass)
+    {
+        ARMARX_TRACE;
+        return armarx::viz::Object(name)
+               .file(objectClass.simoxXmlPath.package, objectClass.simoxXmlPath.path)
+               .position(Eigen::Vector3f(0, 0, properties.height));
+    }
+
+
+
+    void FloorVis::Properties::define(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
+    {
+        defs->optional(show, prefix + "Show", "Whether to show the floor.");
+        defs->optional(entityName, prefix +  "EntityName", "Object class entity of the floor.");
+        defs->optional(layerName, prefix +  "LayerName", "Layer to draw the floor on.");
+        defs->optional(height, prefix +  "Height",
+                       "Height (z) of the floor plane. \n"
+                       "Set slightly below 0 to avoid z-fighting when drawing planes on the ground.");
+    }
+
+}
+
+
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/FloorVis.h b/source/RobotAPI/libraries/armem_objects/server/class/FloorVis.h
new file mode 100644
index 0000000000000000000000000000000000000000..4c3be719fce4148970fa0ef16d8465d2df7a10d3
--- /dev/null
+++ b/source/RobotAPI/libraries/armem_objects/server/class/FloorVis.h
@@ -0,0 +1,58 @@
+#pragma once
+
+#include <string>
+
+#include <RobotAPI/components/ArViz/Client/Client.h>
+#include <RobotAPI/libraries/armem_objects/aron_forward_declarations.h>
+
+
+namespace armarx
+{
+    using PropertyDefinitionsPtr = IceUtil::Handle<class PropertyDefinitionContainer>;
+}
+namespace armarx::armem::wm
+{
+    class CoreSegment;
+    class Entity;
+}
+
+namespace armarx::armem::server::obj::clazz
+{
+    class FloorVis
+    {
+    public:
+
+        FloorVis();
+
+        void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
+        void setArViz(armarx::viz::Client arviz);
+
+        /// Draw a the floor as a simox object.
+        /// @see `makeFloorObject()`
+        void updateFloorObject(const wm::CoreSegment& classCoreSegment);
+
+        armarx::viz::Object makeFloorObject(const wm::Entity& classEntity);
+        armarx::viz::Object makeFloorObject(const std::string& name, const arondto::ObjectClass& objectClass);
+
+
+    public:
+
+        struct Properties
+        {
+            bool show = true;
+
+            std::string entityName = "Environment/floor-20x20";
+            std::string layerName = "Floor";
+            bool height = 1;
+
+            void define(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "");
+        };
+
+    private:
+
+        Properties properties;
+
+        armarx::viz::Client arviz;
+
+    };
+}
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
index fcb0d8156e19658f98faf0da88f1da2223c86e43..38b143f2baded43c3a4f028174380abaef288dcf 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp
@@ -34,6 +34,8 @@ namespace armarx::armem::server::obj::clazz
         defs->optional(p.objectsPackage, prefix + "ObjectsPackgage", "Name of the objects package to load from.");
         defs->optional(p.loadFromObjectsPackage, prefix + "LoadFromObjectsPackage",
                        "If true, load the objects from the objects package on startup.");
+
+        floorVis.defineProperties(defs, prefix + "Floor.");
     }
 
     void Segment::init()
@@ -52,6 +54,9 @@ namespace armarx::armem::server::obj::clazz
     void Segment::connect(viz::Client arviz)
     {
         this->arviz = arviz;
+
+        floorVis.setArViz(arviz);
+        floorVis.updateFloorObject(*coreSegment);
     }
 
 
diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
index 92fa7c182db309aa743ebc6b3e863d9a76a03440..7356e6a1d9e490840f7c19b5e41e27506ddf2ecf 100644
--- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
+++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.h
@@ -15,6 +15,7 @@
 #include <RobotAPI/libraries/armem/core/workingmemory/Memory.h>
 #include <RobotAPI/libraries/armem/server/MemoryToIceAdapter.h>
 #include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h>
+#include <RobotAPI/libraries/armem_objects/server/class/FloorVis.h>
 
 
 namespace armarx::armem::server::obj::clazz
@@ -51,6 +52,7 @@ namespace armarx::armem::server::obj::clazz
         ObjectFinder objectFinder;
 
         viz::Client arviz;
+        FloorVis floorVis;
 
 
         struct Properties
diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
index f570ca9b40c4e57f559cc55cdfdd535eba6e3d03..3773c087bf70fa68981be86696b01c6fae7645d6 100644
--- a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
+++ b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp
@@ -472,6 +472,7 @@ namespace armarx::armem::server::obj::instance
             VSpacer()
         };
 
+        group = {};
         group.setLabel("Instance");
         group.addChild(layout);
     }