diff --git a/source/RobotAPI/drivers/GamepadUnit/README.md b/source/RobotAPI/drivers/GamepadUnit/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f987b05e9a80bc59741e77b07502516f7de3d842
--- /dev/null
+++ b/source/RobotAPI/drivers/GamepadUnit/README.md
@@ -0,0 +1,17 @@
+# GamepadUnit
+
+This component is used to control the robot with a gamepad.
+
+You have to set two device names:
+ - `GamepadDeviceName`
+   - Used to read the input from the device.
+    You can find the proper name by checking various names from `/dev/input/js*` with the command line util `jstest`.
+ - `GamepadForceFeedbackName`
+   - Used to give force feedback on the controller.
+    You can find the proper name by checking various names from `/dev/input/event*` with the command line util `fftest` or `evtest`.
+
+Alternatively you can find the proper name through `/dev/input/by-id`.
+
+E.g. for a Logitech F710 gamepad the proper names are: \
+`GamepadDeviceName=/dev/input/by-id/usb-Logitech_Wireless_Gamepad_F710_582F9A6B-joystick` \
+`GamepadForceFeedbackName=/dev/input/by-id/usb-Logitech_Wireless_Gamepad_F710_582F9A6B-event-joystick`
diff --git a/source/RobotAPI/libraries/armem_vision/CMakeLists.txt b/source/RobotAPI/libraries/armem_vision/CMakeLists.txt
index eed9e12ee2b2d5870ef6f0262bd2f23bda92fb9e..74a2ece78b8db2462731d6460836387d143cf514 100644
--- a/source/RobotAPI/libraries/armem_vision/CMakeLists.txt
+++ b/source/RobotAPI/libraries/armem_vision/CMakeLists.txt
@@ -19,16 +19,12 @@ armarx_add_library(
         ./aron_conversions.h
         ./client/occupancy_grid/Reader.h
         ./client/occupancy_grid/Writer.h
-        ./client/laser_scanner_features/Reader.h
-        ./client/laser_scanner_features/Writer.h
         ./OccupancyGridHelper.h
         constants.h
     SOURCES
         ./aron_conversions.cpp
         ./client/occupancy_grid/Reader.cpp
         ./client/occupancy_grid/Writer.cpp
-        ./client/laser_scanner_features/Reader.cpp
-        ./client/laser_scanner_features/Writer.cpp
         ./OccupancyGridHelper.cpp
 )
 
@@ -36,7 +32,6 @@ armarx_enable_aron_file_generation_for_target(
     TARGET_NAME
         "${LIB_NAME}"
     ARON_FILES
-        aron/LaserScannerFeatures.xml
         aron/OccupancyGrid.xml
 )
 
diff --git a/source/RobotAPI/libraries/armem_vision/aron/LaserScannerFeatures.xml b/source/RobotAPI/libraries/armem_vision/aron/LaserScannerFeatures.xml
deleted file mode 100644
index 32600d7d19eef8f3969bde99c4a66d60635cf4c6..0000000000000000000000000000000000000000
--- a/source/RobotAPI/libraries/armem_vision/aron/LaserScannerFeatures.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<!--Some fancy comment -->
-<?xml version="1.0" encoding="UTF-8" ?>
-<AronTypeDefinition>
-    <CodeIncludes>
-    </CodeIncludes>
-    <AronIncludes>
-    </AronIncludes>
-
-    <GenerateTypes>
-
-        <Object name='armarx::armem::vision::arondto::Ellipsoid'>
-            <ObjectChild key='globalPose'>
-                <Pose />
-            </ObjectChild>
-            <ObjectChild key='radii'>
-                <Matrix rows="2" cols="1" type="float32" />
-            </ObjectChild>
-        </Object>
-
-        <Object name='armarx::armem::vision::arondto::Circle'>
-            <ObjectChild key='center'>
-                <Matrix rows="2" cols="1" type="float32" />
-            </ObjectChild>
-            <ObjectChild key='radius'>
-                <float />
-            </ObjectChild>
-        </Object>
-
-        <Object name="armarx::armem::vision::arondto::LaserScannerFeature">
-            <ObjectChild key="convexHull">
-                <List>
-                    <Matrix rows="2" cols="1" type="float32" />
-                </List>
-            </ObjectChild>
-            <ObjectChild key="circle">
-                <armarx::armem::vision::arondto::Circle/>
-            </ObjectChild>
-            <ObjectChild key="ellipsoid">
-                <armarx::armem::vision::arondto::Ellipsoid/>
-            </ObjectChild>
-            <!-- <ObjectChild key="chain">
-                <armarx::armem::vision::arondto::Chain/>
-            </ObjectChild> -->
-            <ObjectChild key="points">
-                <List>
-                    <Matrix rows="2" cols="1" type="float32" />
-                </List>
-            </ObjectChild>
-        </Object>
-
-         <Object name="armarx::armem::vision::arondto::LaserScannerFeatures">
-            <ObjectChild key="frame">
-                <String/>
-            </ObjectChild>
-            <ObjectChild key="frameGlobalPose">
-                <Pose/>
-            </ObjectChild>
-            <ObjectChild key="features">
-                <List>
-                    <armarx::armem::vision::arondto::LaserScannerFeature />
-                </List>
-            </ObjectChild>
-        </Object>
-
-
-    </GenerateTypes>
-</AronTypeDefinition> 
diff --git a/source/RobotAPI/libraries/armem_vision/aron_conversions.cpp b/source/RobotAPI/libraries/armem_vision/aron_conversions.cpp
index 86a6c62c0e047f528a5b4eb649056659886d18d8..7051c186ac290a3e71fe3cbb435d1b9ab09b997d 100644
--- a/source/RobotAPI/libraries/armem_vision/aron_conversions.cpp
+++ b/source/RobotAPI/libraries/armem_vision/aron_conversions.cpp
@@ -4,34 +4,18 @@
 #include <cstdint>
 #include <iterator>
 
-#include <RobotAPI/interface/units/LaserScannerUnit.h>
 #include <RobotAPI/libraries/armem/core/aron_conversions.h>
-#include <RobotAPI/libraries/armem_laser_scans/aron/LaserScan.aron.generated.h>
-#include <RobotAPI/libraries/armem_vision/aron/LaserScannerFeatures.aron.generated.h>
 #include <RobotAPI/libraries/aron/common/aron_conversions.h>
 #include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h>
 
 #include "types.h"
 
-
 namespace armarx::armem::vision
 {
 
 
     /************ toAron ************/
 
-    // auto toAron(const LaserScan& laserScan, aron::LaserScan& aronLaserScan)
-    // {
-    //     aronLaserScan.scan = toAron(laserScan);
-    // }
-
-    int64_t
-    toAron(const armem::Time& timestamp)
-    {
-        return timestamp.toMicroSecondsSinceEpoch();
-    }
-    
-
     void
     toAron(arondto::OccupancyGrid& dto, const OccupancyGrid& bo)
     {
@@ -50,70 +34,4 @@ namespace armarx::armem::vision
         // bo.grid is NdArray -> need special handling.
     }
 
-    // LaserScannerFeatures
-
-
-    void
-    toAron(arondto::Circle& dto, const Circle& bo)
-    {
-        dto.center = bo.center;
-        dto.radius = bo.radius;
-    }
-
-    void
-    toAron(arondto::Ellipsoid& dto, const Ellipsoid& bo)
-    {
-        dto.globalPose = bo.pose.matrix();
-        dto.radii = bo.radii;
-    }
-
-    void
-    toAron(arondto::LaserScannerFeature& dto, const LaserScannerFeature& bo)
-    {
-        toAron(dto.circle, bo.circle);
-        dto.convexHull = bo.convexHull;
-        toAron(dto.ellipsoid, bo.ellipsoid);
-        dto.points = bo.points;
-    }
-
-    void
-    toAron(arondto::LaserScannerFeatures& dto, const LaserScannerFeatures& bo)
-    {
-        aron::toAron(dto.frame, bo.frame);
-        aron::toAron(dto.frameGlobalPose, bo.frameGlobalPose);
-        aron::toAron(dto.features, bo.features);
-    }
-
-    void
-    fromAron(const arondto::Circle& dto, Circle& bo)
-    {
-        bo.center = dto.center;
-        bo.radius = dto.radius;
-    }
-    void
-    fromAron(const arondto::Ellipsoid& dto, Ellipsoid& bo)
-    {
-        bo.pose = dto.globalPose;
-        bo.radii = dto.radii;
-    }
-
-    void
-    fromAron(const arondto::LaserScannerFeature& dto, LaserScannerFeature& bo)
-    {
-        bo.convexHull = dto.convexHull;
-        fromAron(dto.circle, bo.circle);
-        fromAron(dto.ellipsoid, bo.ellipsoid);
-
-        // bo.chain = dto.chain;
-        bo.points = dto.points;
-    }
-
-    void
-    fromAron(const arondto::LaserScannerFeatures& dto, LaserScannerFeatures& bo)
-    {
-        aron::fromAron(dto.frame, bo.frame);
-        aron::fromAron(dto.frameGlobalPose, bo.frameGlobalPose);
-        aron::fromAron(dto.features, bo.features);
-    }
-
 } // namespace armarx::armem::vision
diff --git a/source/RobotAPI/libraries/armem_vision/aron_conversions.h b/source/RobotAPI/libraries/armem_vision/aron_conversions.h
index 4d70758f166b66666b9feb22b2dd2a754082bb76..f6f1a53225698f2617559073db3f19c3351b1dd1 100644
--- a/source/RobotAPI/libraries/armem_vision/aron_conversions.h
+++ b/source/RobotAPI/libraries/armem_vision/aron_conversions.h
@@ -21,9 +21,7 @@
 
 #pragma once
 
-#include <RobotAPI/interface/units/LaserScannerUnit.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
-#include <RobotAPI/libraries/armem_vision/aron/LaserScannerFeatures.aron.generated.h>
 #include <RobotAPI/libraries/armem_vision/aron/OccupancyGrid.aron.generated.h>
 #include <RobotAPI/libraries/armem_vision/types.h>
 #include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h>
@@ -33,42 +31,6 @@
 namespace armarx::armem::vision
 {
 
-    namespace arondto
-    {
-        struct LaserScanStamped;
-    } // namespace arondto
-
-    // struct LaserScan;
-    struct LaserScanStamped;
-
-    void fromAron(const arondto::LaserScanStamped& aronLaserScan,
-                  LaserScan& laserScan,
-                  std::int64_t& timestamp,
-                  std::string& frame,
-                  std::string& agentName);
-
-    template <typename T>
-    auto
-    fromAron(const aron::data::NDArrayPtr& navigator)
-    {
-        return aron::data::converter::AronVectorConverter::ConvertToVector<T>(navigator);
-    }
-
-    void fromAron(const arondto::LaserScanStamped& aronLaserScan, LaserScanStamped& laserScan);
-
-    void toAron(const LaserScan& laserScan,
-                const armem::Time& timestamp,
-                const std::string& frame,
-                const std::string& agentName,
-                arondto::LaserScanStamped& aronLaserScan);
-
-    inline aron::data::NDArrayPtr
-    toAron(const LaserScan& laserScan)
-    {
-        using aron::data::converter::AronVectorConverter;
-        return AronVectorConverter::ConvertFromVector(laserScan);
-    }
-
     // OccupancyGrid
     void toAron(arondto::OccupancyGrid& dto, const OccupancyGrid& bo);
     void fromAron(const arondto::OccupancyGrid& dto, OccupancyGrid& bo);
@@ -79,8 +41,4 @@ namespace armarx::armem::vision
         return aron::data::converter::AronEigenConverter::ConvertFromArray(grid);
     }
 
-    // LaserScannerFeatures
-    void toAron(arondto::LaserScannerFeatures& dto, const LaserScannerFeatures& bo);
-    void fromAron(const arondto::LaserScannerFeatures& dto, LaserScannerFeatures& bo);
-
 } // namespace armarx::armem::vision
diff --git a/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Reader.cpp b/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Reader.cpp
deleted file mode 100644
index 216088b410231671dd49a22a95f9fa2b6ae9362b..0000000000000000000000000000000000000000
--- a/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Reader.cpp
+++ /dev/null
@@ -1,218 +0,0 @@
-#include "Reader.h"
-
-// STD / STL
-#include <algorithm>
-#include <cstring>
-#include <map>
-#include <optional>
-#include <ostream>
-#include <type_traits>
-#include <utility>
-#include <vector>
-
-// ICE
-#include <IceUtil/Handle.h>
-#include <IceUtil/Time.h>
-
-// Simox
-#include <SimoxUtility/algorithm/get_map_keys_values.h>
-
-// ArmarXCore
-#include <ArmarXCore/core/exceptions/local/ExpressionException.h>
-#include <ArmarXCore/core/logging/LogSender.h>
-#include <ArmarXCore/core/logging/Logging.h>
-
-// RobotAPI Interfaces
-#include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h>
-#include <RobotAPI/interface/armem/server/ReadingMemoryInterface.h>
-#include <RobotAPI/interface/units/LaserScannerUnit.h>
-
-// RobotAPI Aron
-#include <RobotAPI/libraries/armem_vision/aron/LaserScannerFeatures.aron.generated.h>
-#include <RobotAPI/libraries/aron/core/Exception.h>
-#include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h>
-
-// RobotAPI Armem
-#include <RobotAPI/libraries/armem/client/Query.h>
-#include <RobotAPI/libraries/armem/client/Reader.h>
-#include <RobotAPI/libraries/armem/client/query/Builder.h>
-#include <RobotAPI/libraries/armem/client/query/selectors.h>
-#include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h>
-#include <RobotAPI/libraries/armem/util/util.h>
-#include <RobotAPI/libraries/armem_laser_scans/aron/LaserScan.aron.generated.h>
-#include <RobotAPI/libraries/armem_vision/aron_conversions.h>
-#include <RobotAPI/libraries/armem_vision/types.h>
-
-
-namespace armarx::armem::vision::laser_scanner_features::client
-{
-
-    Reader::Reader(armem::client::MemoryNameSystem& memoryNameSystem) :
-        memoryNameSystem(memoryNameSystem)
-    {
-    }
-    Reader::~Reader() = default;
-
-
-    void
-    Reader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def)
-    {
-        // ARMARX_DEBUG << "TransformReader: registerPropertyDefinitions";
-        // registerPropertyDefinitions(def);
-
-        const std::string prefix = propertyPrefix;
-
-        def->optional(properties.coreSegmentName,
-                      prefix + "CoreSegment",
-                      "Name of the mapping memory core segment to use.");
-
-        def->optional(properties.memoryName, prefix + "MemoryName");
-    }
-
-    void
-    Reader::connect()
-    {
-        // Wait for the memory to become available and add it as dependency.
-        ARMARX_IMPORTANT << "MappingDataReader: Waiting for memory '" << properties.memoryName
-                         << "' ...";
-        try
-        {
-            memoryReader =
-                memoryNameSystem.useReader(MemoryID().withMemoryName(properties.memoryName));
-            ARMARX_IMPORTANT << "MappingDataReader: Connected to memory '" << properties.memoryName
-                             << "'";
-        }
-        catch (const armem::error::CouldNotResolveMemoryServer& e)
-        {
-            ARMARX_ERROR << e.what();
-            return;
-        }
-    }
-
-    armarx::armem::client::query::Builder
-    Reader::buildQuery(const Query& query) const
-    {
-        armarx::armem::client::query::Builder qb;
-
-        qb.coreSegments()
-                       .withName(properties.coreSegmentName)
-                       .providerSegments()
-                       .withName(query.providerName)
-                       .entities()
-                       .all()
-                       .snapshots()
-                       .beforeOrAtTime(query.timestamp);
-
-        // auto entitySel = [&]()
-        // {
-        //     if (query.name.empty())
-        //     {
-        //         ARMARX_INFO << "querying all entities";
-        //         return sel.entities().all();
-        //     }
-        //     return sel.entities().withName(query.name);
-        // }();
-
-        // entitySel.snapshots().beforeOrAtTime(query.timestamp);
-
-        return qb;
-    }
-
-    std::vector<LaserScannerFeatures>
-    asFeaturesList(const wm::ProviderSegment& providerSegment)
-    {
-        if (providerSegment.empty())
-        {
-            ARMARX_WARNING << "No entities!";
-            return {};
-        }
-
-        // const auto convert = [](const auto& aronLaserScanStamped,
-        //                         const wm::EntityInstance& ei) -> LaserScanStamped
-        // {
-        //     LaserScanStamped laserScanStamped;
-        //     fromAron(aronLaserScanStamped, laserScanStamped);
-
-        //     const auto ndArrayNavigator =
-        //         aron::data::NDArray::DynamicCast(ei.data()->getElement("scan"));
-
-        //     ARMARX_CHECK_NOT_NULL(ndArrayNavigator);
-
-        //     laserScanStamped.data = fromAron<LaserScanStep>(ndArrayNavigator);
-        //     ARMARX_IMPORTANT << "4";
-
-        //     return laserScanStamped;
-        // };
-
-        std::vector<LaserScannerFeatures> laserScannerFeatures;
-
-        // loop over all entities and their snapshots
-        providerSegment.forEachEntity(
-            [&](const wm::Entity& entity)
-            {
-                // If we don't need this warning, we could directly iterate over the snapshots.
-                if (entity.empty())
-                {
-                    ARMARX_WARNING << "Empty history for " << entity.id();
-                }
-                ARMARX_DEBUG << "History size: " << entity.size();
-
-                entity.forEachInstance(
-                    [&](const wm::EntityInstance& entityInstance)
-                    {
-                        if (const auto o = tryCast<arondto::LaserScannerFeatures>(entityInstance))
-                        {
-                            LaserScannerFeatures& f = laserScannerFeatures.emplace_back();
-                            fromAron(o.value(), f);
-                        }
-                        return true;
-                    });
-                return true;
-            });
-
-        return laserScannerFeatures;
-    }
-
-    Reader::Result
-    Reader::queryData(const Query& query) const
-    {
-        const auto qb = buildQuery(query);
-
-        ARMARX_DEBUG << "[MappingDataReader] query ... ";
-
-        const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
-
-        ARMARX_DEBUG << "[MappingDataReader] result: " << qResult;
-
-        if (not qResult.success)
-        {
-            ARMARX_WARNING << "Failed to query data from memory: " << qResult.errorMessage;
-            return {.features = {},
-                    .status = Result::Status::Error,
-                    .errorMessage = qResult.errorMessage};
-        }
-
-        // now create result from memory
-        const wm::ProviderSegment& providerSegment =
-            qResult.memory.getCoreSegment(properties.coreSegmentName)
-                .getProviderSegment(query.providerName);
-
-        const auto features = asFeaturesList(providerSegment);
-
-        // const auto laserScans = asLaserScans(providerSegment);
-        // std::vector<std::string> sensors;
-        // providerSegment.forEachEntity(
-        //     [&sensors](const wm::Entity& entity)
-        //     {
-        //         sensors.push_back(entity.name());
-        //         return true;
-        //     });
-
-        return {.features = features,
-                // .sensors = sensors,
-                .status = Result::Status::Success,
-                .errorMessage = ""};
-    }
-
-} // namespace armarx::armem::vision::laser_scanner_features::client
diff --git a/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Reader.h b/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Reader.h
deleted file mode 100644
index 4752ca85cf3df286b3d1378c2a0526f5a89f1a31..0000000000000000000000000000000000000000
--- a/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Reader.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * This file is part of ArmarX.
- *
- * ArmarX is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * ArmarX is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * @author     Fabian Reister ( fabian dot reister at kit dot edu )
- * @date       2021
- * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
- *             GNU General Public License
- */
-
-#pragma once
-
-#include <string>
-#include <vector>
-
-#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
-#include <ArmarXCore/core/time/DateTime.h>
-
-#include <RobotAPI/libraries/armem/client.h>
-#include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
-#include <RobotAPI/libraries/armem/client/Reader.h>
-#include <RobotAPI/libraries/armem/client/query/Builder.h>
-#include <RobotAPI/libraries/armem_vision/types.h>
-
-
-namespace armarx
-{
-    class ManagedIceObject;
-}
-
-namespace armarx::armem::vision::laser_scanner_features::client
-{
-
-
-    /**
-    * @defgroup Component-ExampleClient ExampleClient
-    * @ingroup RobotAPI-Components
-    * A description of the component ExampleClient.
-    *
-    * @class ExampleClient
-    * @ingroup Component-ExampleClient
-    * @brief Brief description of class ExampleClient.
-    *
-    * Detailed description of class ExampleClient.
-    */
-    class Reader
-    {
-    public:
-        Reader(armem::client::MemoryNameSystem& memoryNameSystem);
-        virtual ~Reader();
-
-        void connect();
-
-        struct Query
-        {
-            std::string providerName;
-
-            std::string name; // sensor name
-
-            armarx::core::time::DateTime timestamp;
-
-            // std::vector<std::string> sensorList;
-        };
-
-        struct Result
-        {
-            std::vector<LaserScannerFeatures> features;
-
-            // std::vector<std::string> sensors;
-
-            enum Status
-            {
-                Error,
-                Success
-            } status;
-
-            std::string errorMessage;
-        };
-
-        Result queryData(const Query& query) const;
-
-        void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def);
-
-
-    protected:
-        armarx::armem::client::query::Builder buildQuery(const Query& query) const;
-
-    private:
-        armem::client::MemoryNameSystem& memoryNameSystem;
-        armem::client::Reader memoryReader;
-
-        // Properties
-        struct Properties
-        {
-            std::string memoryName = "Vision";
-            std::string coreSegmentName = "LaserScannerFeatures";
-        } properties;
-
-        const std::string propertyPrefix = "mem.vision.laser_scanner_features.";
-    };
-
-} // namespace armarx::armem::vision::laser_scanner_features::client
diff --git a/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Writer.cpp b/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Writer.cpp
deleted file mode 100644
index 8ae7ba4379288420d3578d7f30ae9bc9c58c559d..0000000000000000000000000000000000000000
--- a/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Writer.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-#include "Writer.h"
-
-#include "RobotAPI/libraries/armem_vision/constants.h"
-#include <RobotAPI/libraries/armem/core/error.h>
-#include <RobotAPI/libraries/armem_laser_scans/aron/LaserScan.aron.generated.h>
-#include <RobotAPI/libraries/armem_vision/aron/LaserScannerFeatures.aron.generated.h>
-#include <RobotAPI/libraries/armem_vision/aron_conversions.h>
-
-
-namespace armarx::armem::vision::laser_scanner_features::client
-{
-
-    Writer::Writer(armem::client::MemoryNameSystem& memoryNameSystem) :
-        memoryNameSystem(memoryNameSystem)
-    {
-    }
-    Writer::~Writer() = default;
-
-
-    void
-    Writer::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def)
-    {
-        ARMARX_DEBUG << "LaserScansWriter: registerPropertyDefinitions";
-
-        const std::string prefix = propertyPrefix;
-
-        // def->optional(properties.coreSegmentName,
-        //               prefix + "CoreSegment",
-        //               "Name of the mapping memory core segment to use.");
-
-        // def->optional(properties.memoryName, prefix + "MemoryName");
-    }
-
-    void
-    Writer::connect()
-    {
-        // Wait for the memory to become available and add it as dependency.
-        ARMARX_IMPORTANT << "LaserScansWriter: Waiting for memory '" << constants::memoryName
-                         << "' ...";
-        try
-        {
-            memoryWriter =
-                memoryNameSystem.useWriter(MemoryID().withMemoryName(constants::memoryName));
-            ARMARX_IMPORTANT << "MappingDataWriter: Connected to memory '" << constants::memoryName
-                             << "'";
-        }
-        catch (const armem::error::CouldNotResolveMemoryServer& e)
-        {
-            ARMARX_ERROR << e.what();
-            return;
-        }
-
-        ARMARX_IMPORTANT << "LaserScansWriter: Connected to memory '" << constants::memoryName;
-    }
-
-    bool
-    Writer::store(const LaserScannerFeatures& features,
-                  const std::string& providerName,
-                  const Time& timestamp)
-    {
-        std::lock_guard g{memoryWriterMutex};
-
-        // const auto result = memoryWriter.addSegment(constants::memoryName,
-        //                                             constants::laserScannerFeaturesCoreSegment);
-
-        // if (not result.success)
-        // {
-        //     ARMARX_ERROR << result.errorMessage;
-
-        //     // TODO(fabian.reister): message
-        //     return false;
-        // }
-
-        const auto entityID = armem::MemoryID()
-                                    .withMemoryName(constants::memoryName)
-                                    .withCoreSegmentName(constants::laserScannerFeaturesCoreSegment)
-                                    .withProviderSegmentName(providerName)
-                                    .withEntityName(features.frame)
-                                    .withTimestamp(timestamp);
-
-        ARMARX_VERBOSE << "Memory id is " << entityID.str();
-
-        armem::EntityUpdate update;
-        update.entityID = entityID;
-
-        ARMARX_TRACE;
-
-        arondto::LaserScannerFeatures dto;
-        toAron(dto, features);
-
-        ARMARX_TRACE;
-
-        update.instancesData = {dto.toAron()};
-        update.referencedTime = timestamp;
-
-        ARMARX_DEBUG << "Committing " << update << " at time " << timestamp;
-
-        ARMARX_TRACE;
-        armem::EntityUpdateResult updateResult = memoryWriter.commit(update);
-
-        ARMARX_DEBUG << updateResult;
-
-        if (not updateResult.success)
-        {
-            ARMARX_ERROR << updateResult.errorMessage;
-        }
-
-        return updateResult.success;
-    }
-
-} // namespace armarx::armem::vision::laser_scanner_features::client
diff --git a/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Writer.h b/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Writer.h
deleted file mode 100644
index ca58005772268d70f7eedf06189c02250c75fef6..0000000000000000000000000000000000000000
--- a/source/RobotAPI/libraries/armem_vision/client/laser_scanner_features/Writer.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * This file is part of ArmarX.
- *
- * ArmarX is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * ArmarX is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * @package    RobotAPI::ArmarXObjects::
- * @author     Fabian Reister ( fabian dot reister at kit dot edu )
- * @date       2021
- * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
- *             GNU General Public License
- */
-
-#pragma once
-
-#include <mutex>
-
-#include <ArmarXCore/core/application/properties/PropertyDefinitionContainer.h>
-
-#include "RobotAPI/libraries/armem_vision/types.h"
-#include <RobotAPI/interface/units/LaserScannerUnit.h>
-#include <RobotAPI/libraries/armem/client/MemoryNameSystem.h>
-#include <RobotAPI/libraries/armem/client/Writer.h>
-
-
-namespace armarx::armem::vision::laser_scanner_features::client
-{
-
-    /**
-    * @defgroup Component-ExampleClient ExampleClient
-    * @ingroup RobotAPI-Components
-    * A description of the component ExampleClient.
-    *
-    * @class ExampleClient
-    * @ingroup Component-ExampleClient
-    * @brief Brief description of class ExampleClient.
-    *
-    * Detailed description of class ExampleClient.
-    */
-    class Writer
-    {
-    public:
-        Writer(armem::client::MemoryNameSystem& memoryNameSystem);
-        virtual ~Writer();
-
-
-        void connect();
-
-        // MappingDataWriterInterface
-        /// to be called in Component::onConnectComponent
-        // void connect() override;
-
-        /// to be called in Component::addPropertyDefinitions
-        void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def) /*override*/;
-
-        bool store(const LaserScannerFeatures& features,
-                   const std::string& providerName,
-                   const Time& timestamp);
-
-    private:
-        armem::client::MemoryNameSystem& memoryNameSystem;
-        armem::client::Writer memoryWriter;
-
-        // Properties
-        struct Properties
-        {
-            // std::string memoryName = "Vision";
-            // std::string coreSegmentName = "LaserScannerFeatures";
-        } properties;
-
-        std::mutex memoryWriterMutex;
-
-        const std::string propertyPrefix = "mem.vision.laser_scanner_features.";
-    };
-
-} // namespace armarx::armem::vision::laser_scanner_features::client
diff --git a/source/RobotAPI/libraries/armem_vision/constants.h b/source/RobotAPI/libraries/armem_vision/constants.h
index 653d6fda6fc9e787d00f570af5440a6c81c6108b..3474d925b7b548068fc9059d82e5ec469b0f24b3 100644
--- a/source/RobotAPI/libraries/armem_vision/constants.h
+++ b/source/RobotAPI/libraries/armem_vision/constants.h
@@ -28,6 +28,5 @@ namespace armarx::armem::vision::constants
     const inline std::string memoryName = "Vision";
 
     // core segments
-    const inline std::string laserScannerFeaturesCoreSegment = "LaserScannerFeatures";
 
 } // namespace armarx::armem::vision::constants
diff --git a/source/RobotAPI/libraries/armem_vision/types.h b/source/RobotAPI/libraries/armem_vision/types.h
index fe584e3dc235a19333fd9b174cfab390c1a5d435..1a6b6b7d69eb52cc7857744dfb774564ac984720 100644
--- a/source/RobotAPI/libraries/armem_vision/types.h
+++ b/source/RobotAPI/libraries/armem_vision/types.h
@@ -47,45 +47,5 @@ namespace armarx::armem::vision
         Grid grid;
     };
 
-    struct Ellipsoid
-    {
-        Eigen::Isometry3f pose = Eigen::Isometry3f::Identity();
-
-        Eigen::Vector2f radii = Eigen::Vector2f::Zero();
-    };
-
-    struct Circle
-    {
-        Eigen::Vector2f center = Eigen::Vector2f::Zero();
-        float radius = 0.F;
-    };
-
-    struct LaserScannerFeature
-    {
-        using Points = std::vector<Eigen::Vector2f>;
-        using Chain = Points;
-
-        Points convexHull;
-
-        Circle circle;
-        Ellipsoid ellipsoid;
-
-        Chain chain;
-
-        Points points;
-    };
-
-    struct LaserScannerFeatures
-    {
-        // TODO(fabian.reister): framed pose
-        std::string frame;
-        Eigen::Isometry3f frameGlobalPose;
-
-        std::vector<LaserScannerFeature> features;
-
-
-        // std::vector<Ellipsoid> linesAsEllipsoids(float axisLength) const;
-    };
-
 
 } // namespace armarx::armem::vision