diff --git a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp
index ffc286590837b87defa10ac9c183092dd185f372..ff525ff98eda9eb834dfabb2f6bdfcd42ddb019b 100644
--- a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp
+++ b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp
@@ -7,6 +7,15 @@
 #include <Inventor/nodes/SoUnits.h>
 #include <thread>
 
+
+#include <Inventor/actions/SoWriteAction.h>
+#include <Inventor/actions/SoToVRML2Action.h>
+#include <Inventor/VRMLnodes/SoVRMLGroup.h>
+#include <Inventor/nodes/SoRotation.h>
+#include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h>
+#include <VirtualRobot/Visualization/VisualizationFactory.h>
+
+
 #include "VisualizationRobot.h"
 
 namespace armarx::viz
@@ -416,4 +425,37 @@ namespace armarx::viz
             }
         }
     }
+
+    void CoinVisualizer::exportToVRML(const std::string& s)
+    {
+
+
+        SoOutput* so = new SoOutput();
+        if (!so->openFile(s.c_str()))
+        {
+            ARMARX_ERROR << "Could not open file " << s << " for writing." << std::endl;
+            return;
+        }
+
+        so->setHeaderString("#VRML V2.0 utf8");
+
+        SoGroup* n = new SoGroup;
+        n->ref();
+        n->addChild(root);
+        SoGroup* newVisu = VirtualRobot::CoinVisualizationFactory::convertSoFileChildren(n);
+        newVisu->ref();
+
+        SoToVRML2Action tovrml2;
+        tovrml2.apply(newVisu);
+        SoVRMLGroup* newroot = tovrml2.getVRML2SceneGraph();
+        newroot->ref();
+        SoWriteAction wra(so);
+        wra.apply(newroot);
+        newroot->unref();
+
+        so->closeFile();
+
+        newVisu->unref();
+        n->unref();
+    }
 }
diff --git a/source/RobotAPI/components/ArViz/Coin/Visualizer.h b/source/RobotAPI/components/ArViz/Coin/Visualizer.h
index f3a2248254821f96067f16a6306b02141a1438a6..e2d9a4634d5f1747174c125292a33233699dceda 100644
--- a/source/RobotAPI/components/ArViz/Coin/Visualizer.h
+++ b/source/RobotAPI/components/ArViz/Coin/Visualizer.h
@@ -129,6 +129,8 @@ namespace armarx::viz
 
         void update();
 
+        void exportToVRML(const std::string& s);
+
         template <typename ElementVisuT>
         void registerVisualizerFor()
         {
diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui b/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui
index b5dc5e5dd125a004758a383ad4c431517bd3f1d2..f5bb28f2f794200a6af845cfb107587149929d35 100644
--- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui
+++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui
@@ -99,6 +99,30 @@
            </column>
           </widget>
          </item>
+         <item>
+          <layout class="QHBoxLayout" name="horizontalLayout_12">
+           <item>
+            <spacer name="horizontalSpacer_7">
+             <property name="orientation">
+              <enum>Qt::Horizontal</enum>
+             </property>
+             <property name="sizeHint" stdset="0">
+              <size>
+               <width>40</width>
+               <height>20</height>
+              </size>
+             </property>
+            </spacer>
+           </item>
+           <item>
+            <widget class="QPushButton" name="exportToVRMLButton">
+             <property name="text">
+              <string>Export To VRML</string>
+             </property>
+            </widget>
+           </item>
+          </layout>
+         </item>
         </layout>
        </item>
        <item>
diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
index 697ce64b02e1a3f5c3896406f430a8144db202e3..cf42b9ff2bb4d42f04a6067f08803ea6ac69f873 100644
--- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
+++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp
@@ -34,6 +34,10 @@
 
 #include <ArmarXCore/observers/variant/Variant.h>
 
+
+#include <QFileDialog>
+#include  <boost/algorithm/string/predicate.hpp>
+
 #define ENABLE_INTROSPECTION 1
 
 
@@ -89,6 +93,8 @@ namespace armarx
         connect(widget.replayStopButton, &QPushButton::clicked, this, &This::onReplayStop);
         connect(widget.replayTimedButton, &QPushButton::toggled, this, &This::onReplayTimedStart);
 
+        connect(widget.exportToVRMLButton, &QPushButton::clicked, this, &This::exportToVRML);
+
         connect(this, &This::connectGui, this, &This::onConnectGui, Qt::QueuedConnection);
         connect(this, &This::disconnectGui, this, &This::onDisconnectGui, Qt::QueuedConnection);
 
@@ -989,4 +995,23 @@ namespace armarx
             debugObserverName = configDialog->getProxyName(CONFIG_KEY_DEBUG_OBSERVER);
         }
     }
+
+
+    void ArVizWidgetController::exportToVRML()
+    {
+
+        QString fi = QFileDialog::getSaveFileName(Q_NULLPTR, tr("VRML 2.0 File"), QString(), tr("VRML Files (*.wrl)"));
+        std::string s = std::string(fi.toLatin1());
+
+        if (s.empty())
+        {
+            return;
+        }
+        if (!boost::algorithm::ends_with(s, ".wrl"))
+        {
+            s += ".wrl";
+        }
+
+        visualizer.exportToVRML(s);
+    }
 }
diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
index 4e9c887def80f19350373070799b456dca75d2db..e59b685797f5e8ee4b56220c9c5070109e50a140 100644
--- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
+++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h
@@ -162,6 +162,7 @@ namespace armarx
         long getRevisionForTimestamp(long timestamp);
         void onReplayTimedStart(bool checked);
         void onReplayTimerTick();
+        void exportToVRML();
 
         void changeMode(ArVizWidgetMode newMode);
         void enableWidgetAccordingToMode();