diff --git a/source/RobotAPI/components/units/RobotUnit/Units/InertialMeasurementSubUnit.cpp b/source/RobotAPI/components/units/RobotUnit/Units/InertialMeasurementSubUnit.cpp
index 7e76e215ea9a3652401772d62d07d0fbf29660a5..b26ef7db0164fd7b57bda1e7da99296bfded2d7a 100644
--- a/source/RobotAPI/components/units/RobotUnit/Units/InertialMeasurementSubUnit.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/Units/InertialMeasurementSubUnit.cpp
@@ -22,6 +22,12 @@
 #include "InertialMeasurementSubUnit.h"
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
+void armarx::InertialMeasurementSubUnit::onStartIMU()
+{
+
+}
+
+
 void armarx::InertialMeasurementSubUnit::update(const armarx::SensorAndControl& sc, const JointAndNJointControllers&)
 {
     if (!getProxy())
@@ -35,17 +41,21 @@ void armarx::InertialMeasurementSubUnit::update(const armarx::SensorAndControl&
         return;
     }
     TimestampVariantPtr t = new TimestampVariant(sc.sensorValuesTimestamp);
+    InertialMeasurementUnitListenerPrx batchPrx = IMUTopicPrx->ice_batchOneway();
     for (auto nam2idx : devs)
     {
         const auto devidx = nam2idx.second;
         const auto& dev = nam2idx.first;
         const SensorValueBase* sv = sc.sensors.at(devidx).get();
         ARMARX_CHECK_EXPRESSION(sv->isA<SensorValueIMU>());
-        //        const SensorValueIMU* s = sv->asA<SensorValueIMU>();
+        const SensorValueIMU* s = sv->asA<SensorValueIMU>();
         IMUData data;
-        //                data.acceleration = s->linearAcceleration;
-        //                data.gyroscopeRotation = s->angularVelocity;
-        IMUTopicPrx->reportSensorValues(dev, "name", data, t);
-        ///TODO fix unclear imu stuff
+        data.acceleration = Ice::FloatSeq(s->linearAcceleration.data(), s->linearAcceleration.data() + s->linearAcceleration.rows() * s->linearAcceleration.cols());
+        data.gyroscopeRotation = Ice::FloatSeq(s->angularVelocity.data(), s->angularVelocity.data() + s->angularVelocity.rows() * s->angularVelocity.cols());;
+        data.orientationQuaternion = {s->orientation.w(), s->orientation.x(), s->orientation.y(), s->orientation.z()};
+        auto frame = dev;
+        IMUTopicPrx->reportSensorValues(dev, frame, data, t);
     }
+    batchPrx->ice_flushBatchRequests();
 }
+
diff --git a/source/RobotAPI/components/units/RobotUnit/Units/InertialMeasurementSubUnit.h b/source/RobotAPI/components/units/RobotUnit/Units/InertialMeasurementSubUnit.h
index 1156c1632607cac9bddfcea50e6ba9133320d85a..63da55096b2a3bf461ba838ae85b648e340eca9d 100644
--- a/source/RobotAPI/components/units/RobotUnit/Units/InertialMeasurementSubUnit.h
+++ b/source/RobotAPI/components/units/RobotUnit/Units/InertialMeasurementSubUnit.h
@@ -44,7 +44,7 @@ namespace armarx
         // InertialMeasurementUnit interface
     protected:
         virtual void onInitIMU()  override {}
-        virtual void onStartIMU() override {}
+        virtual void onStartIMU() override;
         virtual void onExitIMU()  override {}
     public:
         std::map<std::string, std::size_t> devs;