diff --git a/.gitignore b/.gitignore
index c53649ddde0067e3c77aa3809a2cbc482b67d4ab..36b9b1d57de5e45d1cf4ca22dac09aa0619b02fc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -45,4 +45,5 @@ data/dbdump/
 # Generated Scenario Files
 scenarios/*/startScenario.sh
 scenarios/*/stopScenario.sh
+scenarios/*/startGui.sh
 
diff --git a/interface/slice/units/HapticUnit.ice b/interface/slice/units/HapticUnit.ice
index 51be7139e96ae67cf2b48bd62d14094a4d851967..adcba86504049b042850b8b419368cfbe33f03ca 100644
--- a/interface/slice/units/HapticUnit.ice
+++ b/interface/slice/units/HapticUnit.ice
@@ -29,6 +29,7 @@
 #include <core/BasicTypes.ice>
 #include <observers/VariantBase.ice>
 #include <observers/Matrix.ice>
+#include <observers/Timestamp.ice>
 #include <observers/ObserverInterface.ice>
 #include <robotstate/RobotState.ice>
 
@@ -40,7 +41,7 @@ module armarx
 
     interface HapticUnitListener
     {
-        void reportSensorValues(string type, MatrixFloatBase values);
+        void reportSensorValues(string device, string name, MatrixFloatBase values, TimestampBase timestamp);
     };
 
     interface HapticUnitObserverInterface extends ObserverInterface, HapticUnitListener
diff --git a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp
index 80bd04d05aa08ddb997ca632f329781b27a60ff1..5e2ddaeb4920ebc0175c3a451f28f11b7f5ee5e2 100644
--- a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp
+++ b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp
@@ -57,7 +57,7 @@ PropertyDefinitionsPtr WeissHapticSensorListener::createPropertyDefinitions()
                                       getConfigIdentifier()));
 }
 
-void armarx::WeissHapticSensorListener::reportSensorValues(const std::string& type, const armarx::MatrixFloatBasePtr& values, const Ice::Current&)
+void armarx::WeissHapticSensorListener::reportSensorValues(const std::string& device, const std::string& name, const armarx::MatrixFloatBasePtr& values, const armarx::TimestampBasePtr& timestamp, const Ice::Current&)
 {
     ARMARX_LOG << deactivateSpam(1) << "WeissHapticSensorListener::reportSensorValues" << MatrixFloatPtr::dynamicCast(values)->toEigen();
 
diff --git a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h
index 2287e9060a7aecbad51b90976a7b0f15b7b931c6..11b773cb28684d48825035af867ec7feeca92b53 100644
--- a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h
+++ b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h
@@ -30,6 +30,7 @@
 #include <Core/util/variants/eigen3/MatrixVariant.h>
 #include <Core/util/variants/eigen3/VariantObjectFactories.h>
 
+
 namespace armarx
 {
     /**
@@ -68,7 +69,7 @@ namespace armarx
             return "WeissHapticSensorListener";
         }
 
-        virtual void reportSensorValues(const ::std::string& type, const ::armarx::MatrixFloatBasePtr& values, const ::Ice::Current& = ::Ice::Current());
+        virtual void reportSensorValues(const ::std::string& device, const ::std::string& name, const ::armarx::MatrixFloatBasePtr& values, const ::armarx::TimestampBasePtr& timestamp, const ::Ice::Current& = ::Ice::Current());
 
     protected:
         /**
diff --git a/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensor.cpp b/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensor.cpp
index e366018681ebe62e2ebce4c61e64f6f7eb49217a..35af9bd41ab8ccc0dcf3485d92c18446ca855f32 100644
--- a/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensor.cpp
+++ b/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensor.cpp
@@ -1,5 +1,6 @@
 #include "WeissHapticSensor.h"
 #include <Core/util/variants/eigen3/MatrixVariant.h>
+#include <Core/observers/variant/TimestampVariant.h>
 
 
 using namespace armarx;
@@ -85,7 +86,8 @@ void WeissHapticSensor::readAndReportSensorValues()
                 (*matrix)(y, x) = val;
             }
         }
-        listenerPrx->reportSensorValues(tag, matrix);
+        TimestampVariantPtr timestamp = new TimestampVariant(0);
+        listenerPrx->reportSensorValues(device, tag, matrix, timestamp);
     }
 
     cout << this << ": stopPeriodicFrameAcquisition" << endl;
diff --git a/source/RobotAPI/units/HapticObserver.cpp b/source/RobotAPI/units/HapticObserver.cpp
index 2867e505aa29cecf074cc6ca842781c281165203..2964cb2ff0ee9461d2369793e6faeeef83fedf87 100644
--- a/source/RobotAPI/units/HapticObserver.cpp
+++ b/source/RobotAPI/units/HapticObserver.cpp
@@ -40,28 +40,29 @@ void HapticObserver::onConnectObserver()
 {
 }
 
-void HapticObserver::reportSensorValues(const std::string &type, const MatrixFloatBasePtr &values, const Ice::Current &)
+void HapticObserver::reportSensorValues(const std::string& device, const std::string& name, const armarx::MatrixFloatBasePtr& values, const armarx::TimestampBasePtr& timestamp, const Ice::Current&)
 {
     ScopedLock lock(dataMutex);
     MatrixFloatPtr matrix = MatrixFloatPtr::dynamicCast(values);
     Eigen::MatrixXf eigenMatrix = matrix->toEigen();
     float max = eigenMatrix.maxCoeff();
     float mean = eigenMatrix.mean();
-    if(!existsChannel(type))
+    if(!existsChannel(device))
     {
-        offerChannel(type, "Force and Torque vectors on specific parts of the robot.");
-        offerDataFieldWithDefault(type, "matrix", matrix, "Raw tactile matrix data");
-        offerDataFieldWithDefault(type, "max", Variant(max), "Maximum value");
-        offerDataFieldWithDefault(type, "mean", Variant(mean), "Mean value");
+        offerChannel(device, "Haptic data");
+        offerDataFieldWithDefault(device, "name", Variant(name), "Name of the tactile sensor");
+        offerDataFieldWithDefault(device, "matrix", matrix, "Raw tactile matrix data");
+        offerDataFieldWithDefault(device, "max", Variant(max), "Maximum value");
+        offerDataFieldWithDefault(device, "mean", Variant(mean), "Mean value");
     }
     else
     {
-        setDataField(type, "matrix", matrix);
-        setDataField(type, "max", Variant(max));
-        setDataField(type, "mean", Variant(mean));
+        setDataField(device, "matrix", matrix);
+        setDataField(device, "max", Variant(max));
+        setDataField(device, "mean", Variant(mean));
     }
 
-    updateChannel(type);
+    updateChannel(device);
 }
 
 PropertyDefinitionsPtr HapticObserver::createPropertyDefinitions()
diff --git a/source/RobotAPI/units/HapticObserver.h b/source/RobotAPI/units/HapticObserver.h
index f3cbc18ebccfbc39ec975745e29c17be2d87b341..9eb13fcf4403edc25091bc3da7ad8482a079e18c 100644
--- a/source/RobotAPI/units/HapticObserver.h
+++ b/source/RobotAPI/units/HapticObserver.h
@@ -56,7 +56,7 @@ namespace armarx
         void onInitObserver();
         void onConnectObserver();
 
-        void reportSensorValues(const std::string &type, const ::armarx::MatrixFloatBasePtr &values, const ::Ice::Current& = ::Ice::Current());
+        void reportSensorValues(const ::std::string& device, const ::std::string& name, const ::armarx::MatrixFloatBasePtr& values, const ::armarx::TimestampBasePtr& timestamp, const ::Ice::Current& = ::Ice::Current());
 
         /**
          * @see PropertyUser::createPropertyDefinitions()