diff --git a/include/dynamic_graph_bridge/ros_init.hh b/include/dynamic_graph_bridge/ros_init.hh
index e7dea47d824487043dff0fe1563fd1dac57d8e99..996d2442d625392354d56f27637865e91786492a 100644
--- a/include/dynamic_graph_bridge/ros_init.hh
+++ b/include/dynamic_graph_bridge/ros_init.hh
@@ -4,7 +4,11 @@
 
 namespace dynamicgraph
 {
-  ros::NodeHandle& rosInit();
+  ros::NodeHandle& rosInit (bool createAsyncSpinner);
+
+  /// \brief Return spinner or throw an exception if spinner
+  /// creation has been disabled at startup.
+  ros::AsyncSpinner& spinner ();
 
 } // end of namespace dynamicgraph.
 
diff --git a/src/interpreter.cpp b/src/interpreter.cpp
index a9b4e8a9fcc2e997f654d6df3636b39c975088d0..db9efb67707d33d9f42b57771dae3f3b4d183245 100644
--- a/src/interpreter.cpp
+++ b/src/interpreter.cpp
@@ -3,7 +3,8 @@
 
 int main ()
 {
-  ros::NodeHandle& nodeHandle = dynamicgraph::rosInit ();
+  // we spin explicitly so we do not need an async spinner here.
+  ros::NodeHandle& nodeHandle = dynamicgraph::rosInit (false);
   dynamicgraph::Interpreter interpreter (nodeHandle);
   ros::spin ();
 }
diff --git a/src/ros_export.cpp b/src/ros_export.cpp
index ea74ff6f02f62d98465692dc427fcadbc2946344..0336ff45e294c9fdfd288c1a2d6db90636646328 100644
--- a/src/ros_export.cpp
+++ b/src/ros_export.cpp
@@ -119,12 +119,9 @@ namespace dynamicgraph
 
   RosExport::RosExport (const std::string& n)
     : dynamicgraph::Entity(n),
-      nh_ (rosInit ()),
-      bindedSignal_ (),
-      spinner_ (1)
+      nh_ (rosInit (true)),
+      bindedSignal_ ()
   {
-    spinner_.start ();
-
     std::string docstring;
     addCommand ("add",
 		new command::rosExport::Add
@@ -141,10 +138,7 @@ namespace dynamicgraph
   }
 
   RosExport::~RosExport ()
-  {
-    spinner_.stop ();
-    nh_.shutdown ();
-  }
+  {}
 
   void RosExport::display (std::ostream& os) const
   {
diff --git a/src/ros_export.hh b/src/ros_export.hh
index 800df9cbf73211b1ba0235c033d800f1c192bf8d..564ee6457cbeef409d8c01ebaa0f821db4e9863f 100644
--- a/src/ros_export.hh
+++ b/src/ros_export.hh
@@ -99,9 +99,8 @@ namespace dynamicgraph
     template <typename T>
     friend class internal::Add;
   private:
-    ros::NodeHandle nh_;
+    ros::NodeHandle& nh_;
     std::map<std::string, bindedSignal_t> bindedSignal_;
-    ros::AsyncSpinner spinner_;
   };
 } // end of namespace dynamicgraph.
 
diff --git a/src/ros_import.cpp b/src/ros_import.cpp
index 1f007a4426a9a656881eb71a8c79304a0968b519..6fdde8ca62e87ad00f8a651716b469ed4490586a 100644
--- a/src/ros_import.cpp
+++ b/src/ros_import.cpp
@@ -122,7 +122,8 @@ namespace dynamicgraph
 
   RosImport::RosImport (const std::string& n)
     : dynamicgraph::Entity(n),
-      nh_ (rosInit ()),
+      // rosImport do not use callback so do not create a useless spinner.
+      nh_ (rosInit (false)),
       bindedSignal_ (),
       trigger_ (boost::bind (&RosImport::trigger, this, _1, _2),
 		sotNOSIGNAL,
diff --git a/src/ros_import.hh b/src/ros_import.hh
index aff0cd23936f422e82ad9e1a7baa46c24513f448..c42723aac538638adf44bd14a53f20e133ff724f 100644
--- a/src/ros_import.hh
+++ b/src/ros_import.hh
@@ -87,7 +87,7 @@ namespace dynamicgraph
     void add (const std::string& signal, const std::string& topic);
 
   private:
-    ros::NodeHandle nh_;
+    ros::NodeHandle& nh_;
     std::map<std::string, bindedSignal_t> bindedSignal_;
     dynamicgraph::SignalTimeDependent<int,int> trigger_;
     ros::Duration rate_;
diff --git a/src/ros_init.cpp b/src/ros_init.cpp
index fc7c83f0c18c2342ffbc297e3b818e7749a3e3c6..8253d100ba2828cf6c41a406e397a4d008eb711a 100644
--- a/src/ros_init.cpp
+++ b/src/ros_init.cpp
@@ -1,3 +1,4 @@
+#include <stdexcept>
 #include <boost/make_shared.hpp>
 #include <boost/shared_ptr.hpp>
 
@@ -5,11 +6,24 @@
 
 namespace dynamicgraph
 {
-  boost::shared_ptr<ros::NodeHandle> nodeHandle;
+  struct GlobalRos
+  {
+    ~GlobalRos ()
+    {
+      if (spinner)
+	spinner->stop ();
+      if (nodeHandle)
+	nodeHandle->shutdown ();
+    }
+
+    boost::shared_ptr<ros::NodeHandle> nodeHandle;
+    boost::shared_ptr<ros::AsyncSpinner> spinner;
+  };
+  GlobalRos ros;
 
-  ros::NodeHandle& rosInit()
+  ros::NodeHandle& rosInit (bool createAsyncSpinner)
   {
-    if (!nodeHandle)
+    if (!ros.nodeHandle)
       {
 	int argc = 1;
 	char* arg0 = strdup("dynamic_graph_bridge");
@@ -17,8 +31,20 @@ namespace dynamicgraph
 	ros::init(argc, argv, "dynamic_graph_bridge");
 	free (arg0);
 
-	nodeHandle = boost::make_shared<ros::NodeHandle> ("dynamic_graph");
+	ros.nodeHandle = boost::make_shared<ros::NodeHandle> ("dynamic_graph");
+      }
+    if (!ros.spinner && createAsyncSpinner)
+      {
+	ros.spinner = boost::make_shared<ros::AsyncSpinner> (1);
+	ros.spinner->start ();
       }
-    return *nodeHandle;
+    return *ros.nodeHandle;
+  }
+
+  ros::AsyncSpinner& spinner ()
+  {
+    if (!ros.spinner)
+      throw std::runtime_error ("spinner has not been created");
+    return *ros.spinner;
   }
 } // end of namespace dynamicgraph.
diff --git a/src/ros_joint_state.cpp b/src/ros_joint_state.cpp
index eeddd6848d6d883d268d430e29a60d2d6d3030cd..b35fe82a12c10e344d144de3593d0e1fd0917583 100644
--- a/src/ros_joint_state.cpp
+++ b/src/ros_joint_state.cpp
@@ -3,6 +3,7 @@
 
 #include <dynamic-graph/factory.h>
 
+#include "dynamic_graph_bridge/ros_init.hh"
 #include "ros_joint_state.hh"
 #include "sot_to_ros.hh"
 
@@ -40,19 +41,10 @@ namespace dynamicgraph
 {
   DYNAMICGRAPH_FACTORY_ENTITY_PLUGIN(RosJointState, "RosJointState");
 
-  static const char* rosInit()
-  {
-    int argc = 1;
-    char* arg0 = strdup("ros_joint_state");
-    char* argv[] = {arg0, 0};
-    ros::init(argc, argv, "ros_joint_state");
-    free (arg0);
-    return "dynamic_graph";
-  }
-
   RosJointState::RosJointState (const std::string& n)
     : Entity (n),
-      nh_ (rosInit ()),
+      // do not use callbacks, so do not create a useless spinner
+      nh_ (rosInit (false)),
       state_ (0, MAKE_SIGNAL_STRING(name, true, "Vector", "state")),
       publisher_ (nh_, "joint_states", 5),
       jointState_ (),
diff --git a/src/ros_joint_state.hh b/src/ros_joint_state.hh
index ea9a1a6747a1a1e01da001c0d533d315c9c3fca9..9d9ff2b3ea5e3dccdc35e950490b39344dd292f7 100644
--- a/src/ros_joint_state.hh
+++ b/src/ros_joint_state.hh
@@ -28,7 +28,7 @@ namespace dynamicgraph
 
     int& trigger (int&, int);
   private:
-    ros::NodeHandle nh_;
+    ros::NodeHandle& nh_;
     signalVectorIn_t state_;
     realtime_tools::RealtimePublisher<sensor_msgs::JointState> publisher_;
     sensor_msgs::JointState jointState_;