diff --git a/modules/gfx/doc/scene.rst b/modules/gfx/doc/scene.rst
index a31836aba84e028a379f012bb267d6398766c8b8..d1eb368c3a75b5b6fdd45ad80d28e5636582b7bf 100644
--- a/modules/gfx/doc/scene.rst
+++ b/modules/gfx/doc/scene.rst
@@ -214,7 +214,12 @@ It is interesting to note that the offset from center (`trans`) is given in rota
     
     :param obj:
     :type  obj: :class:`GfxNode`
-
+  
+  .. method:: RemoveAll()
+  
+    Remove all objects from the scene
+    
+    
   .. method:: RenderGL()
 
     Renders the scene.
diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc
index e66235742552df1b54d131abc39285fe057e8210..1f9b2c459c68217e804777b513ef4ef332dcc987 100644
--- a/modules/gfx/pymod/export_scene.cc
+++ b/modules/gfx/pymod/export_scene.cc
@@ -127,6 +127,7 @@ void export_Scene()
     .def("GetSelectionMode",&Scene::GetSelectionMode)
     .def("SetBlur",&Scene::SetBlur)
     .def("BlurSnapshot",&Scene::BlurSnapshot)
+    .def("RemoveAll", &Scene::RemoveAll)
     .def("SetShadow",&Scene::SetShadow)
     .def("SetShadowQuality",&Scene::SetShadowQuality)
     .def("AttachObserver",&Scene::AttachObserver)
diff --git a/modules/gfx/src/gfx_node.cc b/modules/gfx/src/gfx_node.cc
index f3a61c11ebf8da0eb9fcacc39cd154d611c6f20d..93f900980fd15afde02631f7c26790b6c7109bf3 100644
--- a/modules/gfx/src/gfx_node.cc
+++ b/modules/gfx/src/gfx_node.cc
@@ -16,6 +16,7 @@
 // along with this library; if not, write to the Free Software Foundation, Inc.,
 // 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 //------------------------------------------------------------------------------
+#include <boost/bind.hpp>
 #include <ost/dyn_cast.hh>
 #include "gfx_node.hh"
 #include "gfx_object.hh"
@@ -113,6 +114,17 @@ void GfxNode::Remove(GfxObjP obj)
     node_vector_.erase(it);
   }
 }
+using boost::bind;
+void GfxNode::RemoveAll()
+{
+  GfxNodeVector v=node_vector_;
+  node_vector_.clear();
+  for (GfxNodeVector::iterator i=v.begin(), e=v.end(); i!=e; ++i) {
+    if (GfxObjP o=dyn_cast<GfxObj>(*i)) {
+      Scene::Instance().NotifyObservers(bind(&SceneObserver::NodeRemoved, _1, o));
+    }
+  }
+}
 
 void GfxNode::Add(GfxNodeP node)
 {
diff --git a/modules/gfx/src/gfx_node.hh b/modules/gfx/src/gfx_node.hh
index 0f7ecc2d009e7071766d7e08a84141a722f2c9cd..c91df438b41fe91a92bc910126c8534a5eb2acc6 100644
--- a/modules/gfx/src/gfx_node.hh
+++ b/modules/gfx/src/gfx_node.hh
@@ -68,6 +68,8 @@ class DLLEXPORT_OST_GFX GfxNode: public boost::enable_shared_from_this<GfxNode>
   // return name
   String GetName() const;
 
+  // remove all child nodes
+  void RemoveAll();
   // change name
   void Rename(const String& name);
 
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index 46af476261dc78f9552f4ec9f166669ec2fdbb7c..715d5ba211bd42e3b2a1c7fc9a7bf43e0fac7a96 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -607,6 +607,12 @@ void Scene::Remove(const GfxNodeP& go)
   this->RequestRedraw();
 }
 
+void Scene::RemoveAll()
+{
+  root_node_->RemoveAll();
+  this->RequestRedraw();
+}
+
 void Scene::Remove(const String& name)
 {
   FindNode fn(name);
diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh
index d86e46a6a6d9653f6cc95256714fff4331b61cfc..f4763be55f690af3cf525dfe427162118d67588e 100644
--- a/modules/gfx/src/scene.hh
+++ b/modules/gfx/src/scene.hh
@@ -281,6 +281,10 @@ class DLLEXPORT_OST_GFX Scene {
   void Remove(const GfxNodeP& go);
   /// remove graphical object from the scene
   void Remove(const String& name);
+  
+  /// \brief remove all objects from the scene
+  void RemoveAll();
+  
   /// \brief rename an existing graphical object
   /// defunct for now
   bool Rename(const String& old_name, const String& new_name);