diff --git a/idl/gepetto/viewer/graphical-interface.idl b/idl/gepetto/viewer/graphical-interface.idl
index bec1455692beacc597b2f3d6afbe79167906d61f..9489eaee3dad25240f5c75fd755bc87fb851627c 100644
--- a/idl/gepetto/viewer/graphical-interface.idl
+++ b/idl/gepetto/viewer/graphical-interface.idl
@@ -209,6 +209,11 @@ typedef float Color [4];
     /// \param input groupName : name of the mother node (=group node).
     boolean addToGroup(in string nodeName, in string groupName) raises (Error);
 
+    /// remove the node from the child list of a group node.
+    /// \param input nodeName : name of the child node.
+    /// \param input groupName : name of the mother node (=group node).
+    boolean removeFromGroup(in string nodeName, in string groupName) raises (Error);
+
     /// Set a new configuration to a node. THIS CONFIGURATION WILL AFFECTIVE ONLY AFTER CALLING REFRESH FUNCTION!!!
     /// \param input nodeName : name of the node.
     /// \param input configuration : Float[7] new configuration.
diff --git a/include/gepetto/viewer/corba/windows-manager.h b/include/gepetto/viewer/corba/windows-manager.h
index 1c4065a6dc782f21628c417f341eefa832f144cb..7fbd51d6e278bf3bc629c5d7707732bd061adb74 100644
--- a/include/gepetto/viewer/corba/windows-manager.h
+++ b/include/gepetto/viewer/corba/windows-manager.h
@@ -109,9 +109,9 @@ namespace graphics {
 
             virtual bool createRoadmap(const char* nameCorba,const value_type* colorNodeCorba, float radius, float sizeAxis, const value_type* colorEdgeCorba);
 
-            virtual bool addEdgeToRoadmap(const char* nameRoadmap, const value_type* posFromCorba, const value_type* posToCorba);
+            virtual bool addEdgeToRoadmap(const char* nameRoadmapCorba, const value_type* posFromCorba, const value_type* posToCorba);
 
-            virtual bool addNodeToRoadmap(const char* nameRoadmap, const value_type* configuration);
+            virtual bool addNodeToRoadmap(const char* nameRoadmapCorba, const value_type* configuration);
 
             virtual bool addURDF(const char* urdfNameCorba, const char* urdfPathCorba, const char* urdfPackagePathCorba);
 
@@ -126,6 +126,8 @@ namespace graphics {
 
             virtual bool createGroup(const char* groupNameCorba);
             virtual bool addToGroup(const char* nodeNameCorba, const char* groupNameCorba);
+            virtual bool removeFromGroup (const char* nodeNameCorba, const char* groupNameCorba);
+
 
             virtual bool applyConfiguration(const char* nodeNameCorba, const value_type* configuration);
 
diff --git a/src/graphical-interface.impl.cpp b/src/graphical-interface.impl.cpp
index 0cbca83a75d0bb95bba4606a0ef9557794b483d4..3394473a92d45b57f7ce9f80a85e1b8c1251d94b 100644
--- a/src/graphical-interface.impl.cpp
+++ b/src/graphical-interface.impl.cpp
@@ -308,6 +308,16 @@ namespace graphics {
 	}
       }
 
+      bool GraphicalInterface::removeFromGroup (const char* nodeNameCorba,
+                       const char* groupNameCorba) throw (Error)
+      {
+    try {
+      return windowsManager_->removeFromGroup ( nodeNameCorba, groupNameCorba) ;
+    } catch (const std::exception& exc) {
+      throw Error (exc.what ());
+    }
+      }
+
       bool GraphicalInterface::applyConfiguration (const char* nodeNameCorba, const value_type* configurationCorba) throw (Error)
       {
 	try {
diff --git a/src/graphical-interface.impl.hh b/src/graphical-interface.impl.hh
index b4f07fae9338af4f10c45dba1f5dee5c0195a8df..5e47276247c1aa04d3821129448b309e2ff1fa5b 100644
--- a/src/graphical-interface.impl.hh
+++ b/src/graphical-interface.impl.hh
@@ -95,6 +95,7 @@ public:
 
   virtual bool createGroup(const char* groupNameCorba)  throw (Error);
   virtual bool addToGroup(const char* nodeNameCorba, const char* groupNameCorba)  throw (Error);
+  virtual bool removeFromGroup (const char* nodeNameCorba,const char* groupNameCorba)  throw (Error);
 
   virtual bool applyConfiguration(const char* nodeNameCorba, const value_type* configuration)  throw (Error);
 
diff --git a/src/windows-manager.cpp b/src/windows-manager.cpp
index 5d00e95bf5dc442db296099d6561dc79ea781c93..60c467e93e00b628cf17d8a3b03a8b5646360c9c 100644
--- a/src/windows-manager.cpp
+++ b/src/windows-manager.cpp
@@ -142,6 +142,7 @@ namespace graphics {
         return parentName;
     }
 
+
     void WindowsManager::initParent (const std::string& nodeName,
             NodePtr_t node)
     {
@@ -175,6 +176,8 @@ namespace graphics {
         }
     }
 
+
+
     osgQuat WindowsManager::corbaConfToOsgQuat (const value_type* configCorba)
     {
         // configurationCorba = trans (x, y, z), quat (w, x, y, z)
@@ -232,8 +235,8 @@ namespace graphics {
                 it != newNodeConfigurations_.end (); it++) {
             (*it).node->applyConfiguration ( (*it).position, (*it).quat);
         }
-        mtx_.unlock ();
         newNodeConfigurations_.clear ();
+        mtx_.unlock ();
     }
 
     void WindowsManager::createScene (const char* sceneNameCorba)
@@ -526,13 +529,29 @@ namespace graphics {
             RoadmapViewerPtr_t rm_ptr = roadmapNodes_[nameRoadmap];
             osgVector3 posFrom = osgVector3(posFromCorba[0], posFromCorba[1],posFromCorba[2]);
             osgVector3 posTo = osgVector3(posToCorba[0], posToCorba[1],posToCorba[2]);
-            rm_ptr->addEdge(posFrom,posTo);
+          //  mtx_.lock(); mtx is now locked only when required in addEdge
+            rm_ptr->addEdge(posFrom,posTo,mtx_);
+         //   mtx_.unlock();
             return true;
         }
     }
 
-    bool WindowsManager::addNodeToRoadmap(const char* nameRoadmap, const value_type* configuration){
-//TODO
+    bool WindowsManager::addNodeToRoadmap(const char* nameRoadmapCorba, const value_type* configuration){
+        const std::string nameRoadmap (nameRoadmapCorba);
+        if (roadmapNodes_.find (nameRoadmap) == roadmapNodes_.end ()) {
+            //no node named nodeName
+            std::cout << "No roadmap named \"" << nameRoadmap << "\"" << std::endl;
+            return false;
+        }
+        else {
+            RoadmapViewerPtr_t rm_ptr = roadmapNodes_[nameRoadmap];
+            osgVector3 position =  WindowsManager::corbaConfToOsgVec3 (configuration);
+            osgQuat quat  = WindowsManager::corbaConfToOsgQuat (configuration);
+           // mtx_.lock();
+            rm_ptr->addNode(position,quat,mtx_);
+           // mtx_.unlock();
+            return true;
+        }
     }
 
     std::vector<std::string> WindowsManager::getNodeList ()
@@ -686,6 +705,23 @@ namespace graphics {
         }
     }
 
+    bool WindowsManager::removeFromGroup (const char* nodeNameCorba,
+            const char* groupNameCorba)
+    {
+        const std::string nodeName (nodeNameCorba);
+        const std::string groupName (groupNameCorba);
+        if (nodes_.find (nodeName) == nodes_.end () ||
+                groupNodes_.find (groupName) == groupNodes_.end ()) {
+            std::cout << "Node name \"" << nodeName << "\" and/or groupNode \""
+                << groupName << "\" doesn't exist." << std::endl;
+            return false;
+        }
+        else {
+            groupNodes_[groupName]->removeChild(nodes_[nodeName]);
+            return true;
+        }
+    }
+
     bool WindowsManager::applyConfiguration (const char* nodeNameCorba,
             const value_type* configurationCorba)
     {
@@ -709,7 +745,9 @@ namespace graphics {
                     "quatY, quatZ]" <<std::endl;
                 return false;
             }
+            mtx_.lock();
             newNodeConfigurations_.push_back (newNodeConfiguration);
+            mtx_.unlock();
             return true;
         }
     }