diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui b/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui
index 13bd424c85b1bc1949a9d3e3a4c46b387562bc26..e81ea5d2e39049ea51e092c058c0dd621084202d 100644
--- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui
+++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>576</width>
-    <height>400</height>
+    <width>626</width>
+    <height>429</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -39,18 +39,44 @@
          </property>
         </widget>
        </item>
+      </layout>
+     </item>
+     <item>
+      <layout class="QHBoxLayout" name="horizontalLayout_3">
+       <item>
+        <widget class="QLabel" name="label_2">
+         <property name="text">
+          <string>Layers:</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="hideAllButton">
+         <property name="text">
+          <string>Hide All</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="showAllButton">
+         <property name="text">
+          <string>Show All</string>
+         </property>
+        </widget>
+       </item>
        <item>
-        <spacer name="horizontalSpacer">
-         <property name="orientation">
-          <enum>Qt::Horizontal</enum>
+        <widget class="QPushButton" name="hideFilteredButton">
+         <property name="text">
+          <string>Hide Filtered</string>
          </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>40</width>
-           <height>20</height>
-          </size>
+        </widget>
+       </item>
+       <item>
+        <widget class="QPushButton" name="showFilteredButton">
+         <property name="text">
+          <string>Show Filtered</string>
          </property>
-        </spacer>
+        </widget>
        </item>
       </layout>
      </item>
diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
index 0e95b31acc62e8b96a1884f3ef38bf1908af2bce..54afae0a8a36f762ab73bb23b483b473edadd790 100644
--- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
@@ -38,6 +38,10 @@ ArVizWidgetController::ArVizWidgetController()
     connect(widget.expandButton, &QPushButton::clicked, this, &ArVizWidgetController::onExpandAll);
     connect(widget.collapseButton, &QPushButton::clicked, this, &ArVizWidgetController::onCollapseAll);
     connect(widget.filterEdit, &QLineEdit::textChanged, this, &ArVizWidgetController::onFilterTextChanged);
+    connect(widget.hideAllButton, &QPushButton::clicked, this, &ArVizWidgetController::onHideAll);
+    connect(widget.showAllButton, &QPushButton::clicked, this, &ArVizWidgetController::onShowAll);
+    connect(widget.hideFilteredButton, &QPushButton::clicked, this, &ArVizWidgetController::onHideFiltered);
+    connect(widget.showFilteredButton, &QPushButton::clicked, this, &ArVizWidgetController::onShowFiltered);
 
 
     // We need a callback from the visualizer, when the layers have changed
@@ -210,6 +214,26 @@ void ArVizWidgetController::onExpandAll(bool)
     widget.layerTree->expandAll();
 }
 
+void ArVizWidgetController::onHideAll(bool)
+{
+    showAllLayers(false);
+}
+
+void ArVizWidgetController::onShowAll(bool)
+{
+    showAllLayers(true);
+}
+
+void ArVizWidgetController::onHideFiltered(bool)
+{
+    showFilteredLayers(false);
+}
+
+void ArVizWidgetController::onShowFiltered(bool)
+{
+    showFilteredLayers(true);
+}
+
 void ArVizWidgetController::onFilterTextChanged(const QString& filter)
 {
     // Now we need to show these matches and hide the other items
@@ -229,6 +253,46 @@ void ArVizWidgetController::onFilterTextChanged(const QString& filter)
     }
 }
 
+void ArVizWidgetController::showAllLayers(bool visible)
+{
+    widget.layerTree->blockSignals(true);
+
+    for (QTreeWidgetItemIterator iter(widget.layerTree); *iter; ++iter)
+    {
+        QTreeWidgetItem* item = *iter;
+        item->setCheckState(0, visible ? Qt::Checked : Qt::Unchecked);
+    }
+
+    widget.layerTree->blockSignals(false);
+
+    // Update shown/hidden layers
+    layerTreeChanged(nullptr, 0);
+}
+
+void ArVizWidgetController::showFilteredLayers(bool visible)
+{
+    widget.layerTree->blockSignals(true);
+
+    QString filter = widget.filterEdit->text();
+    QRegExp rx(filter, Qt::CaseInsensitive, QRegExp::Wildcard);
+
+    for (QTreeWidgetItemIterator iter(widget.layerTree); *iter; ++iter)
+    {
+        QTreeWidgetItem* item = *iter;
+        QString itemText = item->text(0);
+        bool matches = filter.size() == 0 || itemText.contains(rx);
+        if (matches)
+        {
+            item->setCheckState(0, visible ? Qt::Checked : Qt::Unchecked);
+        }
+    }
+
+    widget.layerTree->blockSignals(false);
+
+    // Update shown/hidden layers
+    layerTreeChanged(nullptr, 0);
+}
+
 SoNode* ArVizWidgetController::getScene()
 {
     return visualizer.root;
diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
index 4c56e6917fc856453c3577abb019d8256b788c5e..13db4a5aeb7836a8207f8f7a5840b9ad6da91a98 100644
--- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
+++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
@@ -111,8 +111,16 @@ namespace armarx
         void onCollapseAll(bool);
         void onExpandAll(bool);
 
+        void onHideAll(bool);
+        void onShowAll(bool);
+        void onHideFiltered(bool);
+        void onShowFiltered(bool);
+
         void onFilterTextChanged(QString const& filter);
 
+        void showAllLayers(bool visible);
+        void showFilteredLayers(bool visible);
+
 
     private:
         Ui::ArVizWidget widget;