diff --git a/src/ros_publish.cpp b/src/ros_publish.cpp
index 489f5962ec5f0356c7611c8aa901aa5c109bb8c3..cef0afa558f642d92c8d0c98d84d03ff6a6766cd 100644
--- a/src/ros_publish.cpp
+++ b/src/ros_publish.cpp
@@ -203,7 +203,14 @@ namespace dynamicgraph
 
   void RosPublish::rm (const std::string& signal)
   {
+    if(bindedSignal_.find(signal) == bindedSignal_.end())
+      return;
+
+    //lock the mutex to avoid deleting the signal during a call to trigger
+    while(! mutex_.try_lock() ){}
     bindedSignal_.erase (signal);
+    signalDeregistration(signal);
+    mutex_.unlock();
   }
 
   std::string RosPublish::list () const
@@ -230,11 +237,13 @@ namespace dynamicgraph
     if (dt < rate_)
       return dummy;
 
+    while(! mutex_.try_lock() ){}
     for (iterator_t it = bindedSignal_.begin ();
 	 it != bindedSignal_.end (); ++it)
       {
 	boost::get<1>(it->second) (t);
       }
+    mutex_.unlock();
     return dummy;
   }
 
diff --git a/src/ros_publish.hh b/src/ros_publish.hh
index 3a6d5d426b1948ed2a8ec25c347dffba7cfa6526..5cb5ce23beb1eae6a4ccf8ee898420fb8c1d6973 100644
--- a/src/ros_publish.hh
+++ b/src/ros_publish.hh
@@ -5,6 +5,7 @@
 
 # include <boost/shared_ptr.hpp>
 # include <boost/tuple/tuple.hpp>
+# include <boost/interprocess/sync/interprocess_mutex.hpp>
 
 # include <dynamic-graph/entity.h>
 # include <dynamic-graph/signal-time-dependent.h>
@@ -94,6 +95,7 @@ namespace dynamicgraph
     dynamicgraph::SignalTimeDependent<int,int> trigger_;
     ros::Duration rate_;
     ros::Time lastPublicated_;
+    boost::interprocess::interprocess_mutex mutex_;
   };
 } // end of namespace dynamicgraph.