diff --git a/source/RobotAPI/libraries/CMakeLists.txt b/source/RobotAPI/libraries/CMakeLists.txt
index 3be572965d724b6b91e0af11d7266aa5b78afbfb..c3d725373ed3d4a44f2cc629f1775fe3e7be8e43 100644
--- a/source/RobotAPI/libraries/CMakeLists.txt
+++ b/source/RobotAPI/libraries/CMakeLists.txt
@@ -1,2 +1,4 @@
 add_subdirectory(drivers)
 add_subdirectory(core)
+add_subdirectory(widgets)
+
diff --git a/source/RobotAPI/libraries/widgets/CMakeLists.txt b/source/RobotAPI/libraries/widgets/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..223e2489c1886a33f3be0ea509a251a131cf8b45
--- /dev/null
+++ b/source/RobotAPI/libraries/widgets/CMakeLists.txt
@@ -0,0 +1,52 @@
+armarx_set_target("RobotAPI Library: RobotAPIWidgets")
+
+find_package(Qt4 COMPONENTS QtCore QtGui QtDesigner)
+armarx_build_if(QT_FOUND "Qt not available")
+find_package(Coin3D REQUIRED)
+armarx_build_if(Coin3D_FOUND "Coin3D not available")
+find_package(SoQt REQUIRED)
+armarx_build_if(SOQT_FOUND "SoQt not available")
+find_package(jsoncpp QUIET)
+armarx_build_if(jsoncpp_FOUND "jsoncpp not available")
+
+include(${QT_USE_FILE})
+include_directories(${Eigen3_INCLUDE_DIR})
+include_directories(
+        ${Coin3D_INCLUDE_DIRS}
+        ${SoQt_INCLUDE_DIRS}
+        ${jsoncpp_INCLUDE_DIR})
+
+
+set(LIB_NAME       RobotAPIWidgets)
+
+
+
+set(LIBS ArmarXCore RobotAPICore ${QT_LIBRARIES})
+
+set(LIB_FILES
+    DebugLayerControlWidget.cpp
+)
+
+set(LIB_HEADERS
+    DebugLayerControlWidget.h
+)
+
+set(GUI_UIS
+    DebugLayerControlWidget.ui
+)
+
+# and finally a resource file
+#SET( QT_RESOURCES
+#   armarxicons.qrc
+#)
+#QT4_ADD_RESOURCES( QT_RC_SRCS ${QT_RESOURCES} )
+
+qt4_wrap_cpp(LIB_FILES
+    DebugLayerControlWidget.h
+    )
+qt4_wrap_ui(UI_HEADER ${GUI_UIS})
+
+list(APPEND LIB_HEADERS ${UI_HEADER})
+#list(APPEND LIB_FILES ${QT_RC_SRCS})
+
+armarx_add_library("${LIB_NAME}"  "${LIB_FILES}" "${LIB_HEADERS}" "${LIBS}")
diff --git a/source/RobotAPI/libraries/widgets/DebugLayerControlWidget.cpp b/source/RobotAPI/libraries/widgets/DebugLayerControlWidget.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8d59a733879f76dd088a93e9b1e76836efa405c2
--- /dev/null
+++ b/source/RobotAPI/libraries/widgets/DebugLayerControlWidget.cpp
@@ -0,0 +1,107 @@
+#include "DebugLayerControlWidget.h"
+#include <RobotAPI/libraries/widgets/ui_DebugLayerControlWidget.h>
+
+#define UPDATE_INTERVAL 1.0 // update every second
+
+DebugLayerControlWidget::DebugLayerControlWidget(QWidget *parent) :
+    QWidget(parent),
+    ui(new Ui::DebugLayerControlWidget)
+{
+    entityDrawer = NULL;
+    ui->setupUi(this);
+
+    //init timer
+    SoSensorManager* sensor_mgr = SoDB::getSensorManager();
+    timerSensor = new SoTimerSensor(onTimer, this);
+    timerSensor->setInterval(SbTime(UPDATE_INTERVAL));
+    sensor_mgr->insertTimerSensor(timerSensor);
+
+    //connect signal mapper
+    QObject::connect(&layerSignalMapperVisible,SIGNAL(mapped(QString)),this,SLOT(layerToggleVisibility(QString)));
+    QObject::connect(&layerSignalMapperRemove,SIGNAL(mapped(QString)),this,SLOT(layerRemove(QString)));
+}
+
+DebugLayerControlWidget::~DebugLayerControlWidget()
+{
+    //destroy timer
+    if (timerSensor)
+    {
+        SoSensorManager* sensor_mgr = SoDB::getSensorManager();
+        sensor_mgr->removeTimerSensor(timerSensor);
+    }
+    delete ui;
+}
+
+void DebugLayerControlWidget::setEntityDrawer(DebugDrawerComponentPtr entityDrawer)
+{
+    this->entityDrawer = entityDrawer;
+}
+
+void DebugLayerControlWidget::updateLayers()
+{
+    //ui.layerTable->clear();
+    if (entityDrawer) {
+        armarx::LayerInformationSequence layers = entityDrawer->layerInformation();
+        ui->layerTable->setRowCount(layers.size());
+
+        for (std::size_t i=0;i<layers.size();++i)
+        {
+            const auto& layer=layers.at(i);
+            QString name=QString::fromStdString(layer.layerName);
+
+            //store visibility
+            layerVisibility[layer.layerName]=layer.visible;
+
+            //add name and number of elements
+            ui->layerTable->setItem(i,0,new QTableWidgetItem{name});
+            ui->layerTable->setItem(i,1,new QTableWidgetItem{QString::number(layer.elementCount)});
+
+            //add visibility checkbox
+            std::unique_ptr<QCheckBox> box{new QCheckBox};
+            box->setChecked(layer.visible);
+            layerSignalMapperVisible.setMapping(box.get(),name);
+            QObject::connect(box.get(), SIGNAL(stateChanged(int)), &layerSignalMapperVisible, SLOT(map()));
+            ui->layerTable->setCellWidget(i,2,box.release());
+
+            //add remove button
+            std::unique_ptr<QPushButton> removeB{new QPushButton("remove")};
+            layerSignalMapperRemove.setMapping(removeB.get(),name);
+            QObject::connect(removeB.get(), SIGNAL(clicked()), &layerSignalMapperRemove, SLOT(map()));
+            ui->layerTable->setCellWidget(i, 3, removeB.release());
+        }
+    } else {
+        VR_INFO << "No Debug Drawer" << std::endl;
+    }
+}
+
+void DebugLayerControlWidget::layerToggleVisibility(QString layerName)
+{
+    //VR_INFO << "should toggle: " << layerName.toStdString() << std::endl;
+    auto name = layerName.toStdString();
+    if (layerVisibility.find(name)!=layerVisibility.end())
+    {
+        if (entityDrawer)
+        {
+            entityDrawer->enableLayerVisu(name, !layerVisibility.at(name));
+        }
+    } else
+        VR_INFO << "name not present" << std::endl;
+}
+
+void DebugLayerControlWidget::layerRemove(QString layerName)
+{
+    auto name = layerName.toStdString();
+    VR_INFO << "remove layer: " << name << std::endl;
+
+    if (entityDrawer->hasLayer(name)) {
+        entityDrawer->removeLayer(name);
+    } else
+        VR_INFO << "name not present" << std::endl;
+}
+
+void DebugLayerControlWidget::onTimer(void* data, SoSensor *sensor)
+{
+    DebugLayerControlWidget* controller = static_cast<DebugLayerControlWidget*>(data);
+    if (controller)
+        controller->updateLayers();
+}
diff --git a/source/RobotAPI/libraries/widgets/DebugLayerControlWidget.h b/source/RobotAPI/libraries/widgets/DebugLayerControlWidget.h
new file mode 100644
index 0000000000000000000000000000000000000000..9bc1e4201a9aee717980b25c55e0fa159811771e
--- /dev/null
+++ b/source/RobotAPI/libraries/widgets/DebugLayerControlWidget.h
@@ -0,0 +1,93 @@
+/*
+* 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    MemoryX::WorkingMemoryGui
+* @author     Dominik Muth
+* @copyright  2015 KIT
+* @license    http://www.gnu.org/licenses/gpl-2.0.txt
+*             GNU General Public License
+
+*/
+
+#ifndef DEBUGLAYERWIDGET_H
+#define DEBUGLAYERWIDGET_H
+
+/* ArmarX headers */
+
+#include <ArmarXCore/core/Component.h>
+#include <RobotAPI/components/DebugDrawer/DebugDrawerComponent.h>
+
+/* QT headers */
+#include <QWidget>
+#include <QCheckBox>
+#include <QSignalMapper>
+#include <QPushButton>
+
+/* STD headers */
+#include <unordered_map>
+
+/* Inventor headers */
+#include <Inventor/sensors/SoTimerSensor.h>
+#include <Inventor/SoDB.h>
+#include <Inventor/Qt/SoQt.h>
+
+/* System headers */
+#include <string>
+
+using namespace armarx;
+
+namespace Ui {
+class DebugLayerControlWidget;
+}
+
+class DebugLayerControlWidget : public QWidget
+{
+    Q_OBJECT
+
+public:
+    DebugLayerControlWidget(QWidget *parent = 0);
+    ~DebugLayerControlWidget();
+    void setEntityDrawer(DebugDrawerComponentPtr entityDrawer);
+
+public slots:
+    void updateLayers();
+
+    void layerToggleVisibility(QString layerName);
+
+protected:
+    DebugDrawerComponentPtr entityDrawer;
+    SoTimerSensor* timerSensor;
+    /**
+     * @brief Maps events to toggle a layer's visibility from checkboxes contained in the table to layerToggleVisibility.
+     */
+    QSignalMapper layerSignalMapperVisible;
+    /**
+     * @brief Maps events to remove a layer.
+     */
+    QSignalMapper layerSignalMapperRemove;
+    /**
+     * @brief Stores whether a layer is currently visible.
+     */
+    std::unordered_map<std::string,bool> layerVisibility;
+
+    static void onTimer(void *data, SoSensor *sensor);
+
+protected slots:
+    void layerRemove(QString layerName);
+private:
+    Ui::DebugLayerControlWidget *ui;
+};
+
+#endif // DEBUGLAYERWIDGET_H
diff --git a/source/RobotAPI/libraries/widgets/DebugLayerControlWidget.ui b/source/RobotAPI/libraries/widgets/DebugLayerControlWidget.ui
new file mode 100644
index 0000000000000000000000000000000000000000..448cdf6afebefce720a80353177509ff142f5c43
--- /dev/null
+++ b/source/RobotAPI/libraries/widgets/DebugLayerControlWidget.ui
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>DebugLayerControlWidget</class>
+ <widget class="QWidget" name="DebugLayerControlWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>447</width>
+    <height>197</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QGridLayout" name="gridLayout">
+   <item row="0" column="0">
+    <widget class="QGroupBox" name="groupBoxLayer">
+     <property name="title">
+      <string>Visualisation layer</string>
+     </property>
+     <layout class="QGridLayout" name="gridLayout_2">
+      <item row="0" column="0">
+       <widget class="QTableWidget" name="layerTable">
+        <property name="editTriggers">
+         <set>QAbstractItemView::NoEditTriggers</set>
+        </property>
+        <property name="showDropIndicator" stdset="0">
+         <bool>false</bool>
+        </property>
+        <property name="dragDropOverwriteMode">
+         <bool>false</bool>
+        </property>
+        <property name="alternatingRowColors">
+         <bool>true</bool>
+        </property>
+        <property name="selectionMode">
+         <enum>QAbstractItemView::NoSelection</enum>
+        </property>
+        <property name="selectionBehavior">
+         <enum>QAbstractItemView::SelectRows</enum>
+        </property>
+        <column>
+         <property name="text">
+          <string>Name</string>
+         </property>
+        </column>
+        <column>
+         <property name="text">
+          <string>Elements</string>
+         </property>
+        </column>
+        <column>
+         <property name="text">
+          <string>Visible</string>
+         </property>
+        </column>
+        <column>
+         <property name="text">
+          <string/>
+         </property>
+        </column>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>