diff --git a/src/graphical-interface.impl.cpp b/src/graphical-interface.impl.cpp
index 5fc9dd0a885a89625d8db5e261704df0822e4034..1abd32e5c66265b7293c5b90e815551ee9bf4e4a 100644
--- a/src/graphical-interface.impl.cpp
+++ b/src/graphical-interface.impl.cpp
@@ -221,8 +221,10 @@ namespace graphics {
 	      throw std::runtime_error (oss.str ());
 	  }
 	  else {
+            mtx_.lock();
 	    GroupNodePtr_t mainNode = GroupNode::create (sceneName);
 	    addGroup (sceneName, mainNode);
+            mtx_.unlock();
 	  }
 	} catch (const std::exception& exc) {
 	  throw Error (exc.what ());
@@ -241,12 +243,14 @@ namespace graphics {
 	      throw std::runtime_error (oss.str ());
 	  }
 	  else {
+            mtx_.lock();
 	    GroupNodePtr_t mainNode = GroupNode::create (sceneName);
 	    addGroup (sceneName, mainNode);
 	    std::string floorName = sceneName + "/floor";
 	    LeafNodeGroundPtr_t floor = LeafNodeGround::create (floorName);
 	    addNode (floorName, floor);
 	    mainNode->addChild (floor);
+            mtx_.unlock();
 	  }
 	} catch (const std::exception& exc) {
 	  throw Error (exc.what ());
@@ -261,7 +265,9 @@ namespace graphics {
 	  std::string sceneName (sceneNameCorba);
 	  if ((windowId >= 0 || windowId < windowManagers_.size ()) &&
 	      groupNodes_.find (sceneName) != groupNodes_.end () ) {
+            mtx_.lock();
 	    windowManagers_[windowId]->addNode (groupNodes_[sceneName]);
+            mtx_.unlock();
 	    return true;
 	  }
 	  else {
@@ -289,11 +295,13 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    LeafNodeBoxPtr_t box = LeafNodeBox::create
 	      (boxName, osgVector3 (boxSize1, boxSize2, boxSize3),
 	       getColor (colorCorba));
 	    GraphicalInterface::initParent (boxName, box);
 	    addNode (boxName, box);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -315,10 +323,12 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    LeafNodeCapsulePtr_t capsule = LeafNodeCapsule::create
 	      (capsuleName, radius, height, getColor (colorCorba));
 	    GraphicalInterface::initParent (capsuleName, capsule);
 	    addNode (capsuleName, capsule);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -339,10 +349,12 @@ namespace graphics {
 	  }
 	  else {
 	    try {
+              mtx_.lock();
 	      LeafNodeColladaPtr_t mesh = LeafNodeCollada::create
 		(meshName, meshPath);
 	      GraphicalInterface::initParent (meshName, mesh);
 	      addNode (meshName, mesh);
+              mtx_.unlock();
 	      return true;
 	    } catch (const std::exception& exc) {
 	      std::cout << "Mesh \"" << meshPath << "\" not found." << std::endl;
@@ -366,10 +378,12 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    LeafNodeConePtr_t cone = LeafNodeCone::create
 	      (coneName, radius, height);
 	    GraphicalInterface::initParent (coneName, cone);
 	    addNode (coneName, cone);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -391,10 +405,12 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    LeafNodeCylinderPtr_t cylinder = LeafNodeCylinder::create
 	      (cylinderName, radius, height, getColor (colorCorba));
 	    GraphicalInterface::initParent (cylinderName, cylinder);
 	    addNode (cylinderName, cylinder);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -415,10 +431,12 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    LeafNodeSpherePtr_t sphere = LeafNodeSphere::create
 	      (sphereName, radius, getColor (colorCorba));
 	    GraphicalInterface::initParent (sphereName, sphere);
 	    addNode (sphereName, sphere);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -439,12 +457,14 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    osgVector3 pos1 (posCorba1[0], posCorba1[1], posCorba1[2]);
 	    osgVector3 pos2 (posCorba2[0], posCorba2[1], posCorba2[2]);
 	    LeafNodeLinePtr_t line = LeafNodeLine::create
 	      (lineName, pos1, pos2, getColor (colorCorba));
 	    GraphicalInterface::initParent (lineName, line);
 	    addNode (lineName, line);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -467,6 +487,7 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    osgVector3 pos1 (posCorba1[0], posCorba1[1], posCorba1[2]);
 	    osgVector3 pos2 (posCorba2[0], posCorba2[1], posCorba2[2]);
 	    osgVector3 pos3 (posCorba3[0], posCorba3[1], posCorba3[2]);
@@ -474,6 +495,7 @@ namespace graphics {
 	      (faceName, pos1, pos2, pos3, getColor (colorCorba));
 	    GraphicalInterface::initParent (faceName, face);
 	    addNode (faceName, face);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -497,6 +519,7 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    osgVector3 pos1 (posCorba1[0], posCorba1[1], posCorba1[2]);
 	    osgVector3 pos2 (posCorba2[0], posCorba2[1], posCorba2[2]);
 	    osgVector3 pos3 (posCorba3[0], posCorba3[1], posCorba3[2]);
@@ -505,7 +528,8 @@ namespace graphics {
 	      (faceName, pos1, pos2, pos3, pos3, getColor (colorCorba));
 	    GraphicalInterface::initParent (faceName, face);
 	    addNode (faceName, face);
-	    return true;
+	    mtx_.unlock();
+            return true;
 	  }
 	} catch (const std::exception& exc) {
 	  throw Error (exc.what ());
@@ -551,9 +575,11 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    GroupNodePtr_t groupNode = GroupNode::create (groupName);
 	    GraphicalInterface::initParent (groupName, groupNode);
 	    addGroup (groupName, groupNode);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -576,6 +602,7 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    GroupNodePtr_t urdf = urdfParser::parse
 	 (urdfName, urdfPath, urdfPackagePath);
 	    NodePtr_t link;
@@ -585,6 +612,7 @@ namespace graphics {
 	    }
 	    GraphicalInterface::initParent (urdfName, urdf);
 	    addGroup (urdfName, urdf);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -606,6 +634,7 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    GroupNodePtr_t urdf = urdfParser::parse
 	      (urdfName, urdfPath, urdfPackagePath, "collision");
 	    NodePtr_t link;
@@ -615,6 +644,7 @@ namespace graphics {
 	    }
 	    GraphicalInterface::initParent (urdfName, urdf);
 	    addGroup (urdfName, urdf);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -642,6 +672,7 @@ namespace graphics {
 		<< "\" already exist.";
 	    throw std::runtime_error (oss.str ());
 	  }
+          mtx_.lock();
 	  GroupNodePtr_t urdf = urdfParser::parse
 	    (urdfName, urdfPath, urdfPackagePath,
 	     visual ? "visual" : "collision", "object");
@@ -652,6 +683,7 @@ namespace graphics {
 	  }
 	  GraphicalInterface::initParent (urdfName, urdf);
 	  addGroup (urdfName, urdf);
+          mtx_.unlock();
 	} catch (const std::exception& exc) {
 	  throw Error (exc.what ());
 	}
@@ -671,7 +703,9 @@ namespace graphics {
 	    return false;
 	  }
 	  else {
+            mtx_.lock();
 	    groupNodes_[groupName]->addChild (nodes_[nodeName]);
+            mtx_.unlock();
 	    return true;
 	  }
 	} catch (const std::exception& exc) {
@@ -724,7 +758,9 @@ namespace graphics {
 		      << std::endl;
 	    return false;
 	  }
+	  mtx_.lock();
 	  nodes_[nodeName]->addLandmark (size);
+          mtx_.unlock();
 	  return true;
 	} catch (const std::exception& exc) {
 	  throw Error (exc.what ());
@@ -742,7 +778,9 @@ namespace graphics {
 		      << std::endl;
 	    return false;
 	  }
+          mtx_.lock();
 	  nodes_[nodeName]->deleteLandmark ();
+          mtx_.unlock();
 	  return true;
 	} catch (const std::exception& exc) {
 	  throw Error (exc.what ());
@@ -762,7 +800,9 @@ namespace graphics {
 		      << std::endl;
 	    return false;
 	  }
+          mtx_.lock();
 	  nodes_[nodeName]->setVisibilityMode (visibility);
+          mtx_.unlock();
 	  return true;
 	} catch (const std::exception& exc) {
 	  throw Error (exc.what ());
@@ -782,7 +822,9 @@ namespace graphics {
 		      << std::endl;
 	    return false;
 	  }
+          mtx_.lock();
 	  nodes_[nodeName]->setWireFrameMode (wire);
+          mtx_.unlock();
 	  return true;
 	} catch (const std::exception& exc) {
 	  throw Error (exc.what ());
@@ -802,7 +844,9 @@ namespace graphics {
 		      << std::endl;
 	    return false;
 	  }
+          mtx_.lock();
 	  nodes_[nodeName]->setLightingMode (light);
+          mtx_.unlock();
 	  return true;
 	} catch (const std::exception& exc) {
 	  throw Error (exc.what ());