diff --git a/include/dynamic-graph/signal-caster.h b/include/dynamic-graph/signal-caster.h
index f0b589add33224932bf5e3f4c247f8dd5c6afcbb..07b995dd0e8b10ebc24b270e38399c89e23c41be 100644
--- a/include/dynamic-graph/signal-caster.h
+++ b/include/dynamic-graph/signal-caster.h
@@ -74,6 +74,7 @@ private:
 	 * using boost::function with 'compatible' syntax
 	 */
 	std::map<std::string, cast_functions_type> functions_;
+	std::map<std::string, const std::type_info*> type_info_;
 };
 
 
diff --git a/src/signal/signal-caster.cpp b/src/signal/signal-caster.cpp
index c098efc1d32e1af9c8d1f86b1bf61f5043999a12..7548715e0acf49afd18b58f6e6563a12613f9ffe 100644
--- a/src/signal/signal-caster.cpp
+++ b/src/signal/signal-caster.cpp
@@ -43,13 +43,22 @@ SignalCaster::~SignalCaster() {
 void SignalCaster::registerCast(const type_info& type, SignalCaster::displayer_type displayer,
 		SignalCaster::caster_type caster, SignalCaster::tracer_type tracer) {
   if ( existsCast(type) ) {
-    std::string typeName(type.name());
-    std::ostringstream os;
-    os << "cast already registered for type " << typeName << ".";
-    throw ExceptionSignal(ExceptionSignal::GENERIC,
-			  os.str()); //TODO: throw "cast already registered for type" exception
+    // If type name has already been registered for same type, do not throw.
+    if ( type_info_[type.name()] != &type) {
+      std::string typeName(type.name());
+      std::ostringstream os;
+      os << "cast already registered for typename " << typeName << "\n"
+	 << "and types differ: " << &type << " != " << type_info_[type.name()]
+	 << ".\n"
+	 << "A possible reason is that the dynamic library defining this type\n"
+	 << "has been loaded several times, defining different symbols"
+	 << " for the same type.";
+      throw ExceptionSignal(ExceptionSignal::GENERIC,
+			    os.str());
+    }
   }
 	functions_[type.name()] = cast_functions_type(displayer,caster, tracer);
+	type_info_[type.name()] = &type;
 }
 
 void SignalCaster::unregisterCast(const std::type_info& type) {