diff --git a/source/RobotAPI/components/ArViz/CMakeLists.txt b/source/RobotAPI/components/ArViz/CMakeLists.txt
index d79d9a4ba4e3ee75d0860328997112e864c008d3..23bc568751839f9758cd09597b2b4f58b8b5e419 100644
--- a/source/RobotAPI/components/ArViz/CMakeLists.txt
+++ b/source/RobotAPI/components/ArViz/CMakeLists.txt
@@ -16,6 +16,7 @@ set(SOURCES
     Client/elements/Robot.cpp
     Client/elements/RobotHand.cpp
     Client/drawer/ArVizDrawerBase.cpp
+    Client/ScopedClient.cpp
 
     Coin/ElementVisualizer.cpp
 
@@ -65,6 +66,7 @@ set(HEADERS
     Client/Layer.h
     Client/Elements.h
     Client/Client.h
+    Client/ScopedClient.h
     Client/ClientCGALExtensions.h
     Client/Color.h
 
diff --git a/source/RobotAPI/components/ArViz/Client/Client.h b/source/RobotAPI/components/ArViz/Client/Client.h
index cc8e7289a57f4302b65fae48574d04f8931d4bc5..71e4197cc71b0ec094ecec84b47a4e35f0a3854a 100644
--- a/source/RobotAPI/components/ArViz/Client/Client.h
+++ b/source/RobotAPI/components/ArViz/Client/Client.h
@@ -51,7 +51,7 @@ namespace armarx::viz
 
         // ////////////////////////////////////////////////////////////////// //
         //layer
-        Layer layer(std::string const& name) const
+        virtual Layer layer(std::string const& name) const
         {
             return Layer(componentName, name);
         }
diff --git a/source/RobotAPI/components/ArViz/Client/ScopedClient.cpp b/source/RobotAPI/components/ArViz/Client/ScopedClient.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2e968ca7dd19298ac9eff6080370edb73a5138ca
--- /dev/null
+++ b/source/RobotAPI/components/ArViz/Client/ScopedClient.cpp
@@ -0,0 +1,43 @@
+/*
+ * 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
+ */
+
+
+#include "ScopedClient.h"
+
+namespace armarx::viz
+{
+
+    Layer ScopedClient::layer(std::string const& name) const
+    {
+        layers.insert(name);
+
+        return Client::layer(name);
+    }
+
+    ScopedClient::~ScopedClient()
+    {
+        for (const auto& layer : layers)
+        {
+            Client::commitDeleteLayer(layer);
+        }
+    }
+
+}  // namespace armarx::viz
diff --git a/source/RobotAPI/components/ArViz/Client/ScopedClient.h b/source/RobotAPI/components/ArViz/Client/ScopedClient.h
new file mode 100644
index 0000000000000000000000000000000000000000..23271b5ba6de545b183728ba04fdaa86f7938e0a
--- /dev/null
+++ b/source/RobotAPI/components/ArViz/Client/ScopedClient.h
@@ -0,0 +1,52 @@
+/*
+ * 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
+ */
+
+#include <set>
+
+#include "Client.h"
+
+namespace armarx::viz
+{
+    /**
+     * @brief `viz::Client` that will delete (clear) committed layers when destroyed.
+     *
+     * Note that, as a consequence, a network call be performed in the destructor.
+     *
+     * This might be useful if you have a class `MyTask` perform visualizing while performing some task,
+     * but whose visualization should be removed when the task finished.
+     * In this case, `MyTask` can have a `viz::ScopedClient` (which can be created from a regular `viz::Client`).
+     * When destructing the instance of `MyTask`, all visualization done by `MyTask` will be cleared
+     * (as `viz::ScopedClient` will go out of scope as well).
+     *
+     */
+    class ScopedClient: virtual public Client
+    {
+    public:
+        using Client::Client;
+
+        Layer layer(std::string const& name) const override;
+
+        virtual ~ScopedClient();
+
+    private:
+        mutable std::set<std::string> layers;
+    };
+}  // namespace armarx::viz
\ No newline at end of file