diff --git a/alib2str/src/core/stringApi.cpp b/alib2str/src/core/stringApi.cpp
index 923aa7da42e97de60eaddc3e37c74a1d23c6444e..98eead5e03f98b3c1605c95d3b4914604e6c2674 100644
--- a/alib2str/src/core/stringApi.cpp
+++ b/alib2str/src/core/stringApi.cpp
@@ -2,8 +2,8 @@
 
 namespace core {
 
-ext::map < std::string, std::unique_ptr < stringApi < object::Object >::GroupWriter > > & stringApi < object::Object >::composeFunctions ( ) {
-	static ext::map < std::string, std::unique_ptr < GroupWriter > > res;
+ext::map < core::type_details, std::unique_ptr < stringApi < object::Object >::GroupWriter > > & stringApi < object::Object >::composeFunctions ( ) {
+	static ext::map < core::type_details, std::unique_ptr < GroupWriter > > res;
 
 	return res;
 }
@@ -27,20 +27,20 @@ ext::list < std::pair < std::function < bool ( ext::istream & ) >, std::unique_p
 	return entries.insert ( entries.end ( ), std::make_pair ( std::move ( first ), std::move ( entry ) ) );
 }
 
-void stringApi < object::Object >::unregisterStringWriter ( const std::string & type, const std::string & typeName ) {
+void stringApi < object::Object >::unregisterStringWriter ( const core::type_details & type ) {
 	if ( ! composeFunctions ( ).erase ( type ) ) {
 		std::string groupName = ext::to_string < object::Object > ( );
 
-		throw::exception::CommonException ( "Parse callback of " + typeName + " not registered in group " + groupName + "." );
+		throw::exception::CommonException ( "Parse callback of " + ext::to_string ( type ) + " not registered in group " + groupName + "." );
 	}
 }
 
-void stringApi < object::Object >::registerStringWriter ( std::string type, const std::string & typeName, std::unique_ptr < GroupWriter > entry ) {
+void stringApi < object::Object >::registerStringWriter ( const core::type_details & type, std::unique_ptr < GroupWriter > entry ) {
 	bool res = composeFunctions ( ).insert ( std::make_pair ( std::move ( type ), std::move ( entry ) ) ).second;
 	if ( ! res ) {
 		std::string groupName = ext::to_string < object::Object > ( );
 
-		throw::exception::CommonException ( "Parse callback of " + typeName + " already registered in group " + groupName + "." );
+		throw::exception::CommonException ( "Parse callback of " + ext::to_string ( type ) + " already registered in group " + groupName + "." );
 	}
 }
 
@@ -80,11 +80,10 @@ bool stringApi < object::Object >::first ( ext::istream & input ) {
 }
 
 void stringApi < object::Object >::compose ( ext::ostream & output, const object::Object & data ) {
-	const auto & content = data.getData ( );
-	std::string type = ext::to_string ( ext::type_index ( typeid ( content ) ) );
-	auto callback = composeFunctions ( ).find ( type );
+	core::type_details type = core::type_details::get ( data );
+	auto callback = std::find_if ( composeFunctions ( ).begin ( ), composeFunctions ( ).end ( ), [ & ] ( const std::pair < const core::type_details, std::unique_ptr < GroupWriter > > & entry ) { return entry.first.compatible_with ( type ); } );
 
-	if ( callback == composeFunctions ( ).end ( ) ) throw exception::CommonException ( "Compose callback for " + type + " tag not registered." );
+	if ( callback == composeFunctions ( ).end ( ) ) throw exception::CommonException ( "Compose callback for " + ext::to_string ( type ) + " tag not registered." );
 
 	callback->second->compose ( output, data );
 	for ( unsigned i = 0; i < data.getId ( ); ++ i )
diff --git a/alib2str/src/core/stringApi.hpp b/alib2str/src/core/stringApi.hpp
index fe7689cd4eaf42e34761be5c841497b3c0888564..f19e4e4edd8c226b2320e3af0beb770e34cf61b3 100644
--- a/alib2str/src/core/stringApi.hpp
+++ b/alib2str/src/core/stringApi.hpp
@@ -52,7 +52,7 @@ public:
 	};
 
 private:
-	static ext::map < std::string, std::unique_ptr < GroupWriter > > & composeFunctions ( );
+	static ext::map < core::type_details, std::unique_ptr < GroupWriter > > & composeFunctions ( );
 
 	template < class Type >
 	class WriterRegister : public GroupWriter {
@@ -74,18 +74,18 @@ public:
 		return registerStringReader ( stringApi < Type >::first, std::unique_ptr < GroupReader > ( new ReaderRegister < Type > ( ) ) );
 	}
 
-	static void unregisterStringWriter ( const std::string & type, const std::string & typeName );
+	static void unregisterStringWriter ( const core::type_details & type );
 
 	template < class Type >
 	static void unregisterStringWriter ( ) {
-		unregisterStringWriter ( ext::to_string < object::AnyObject < Type > > ( ), ext::to_string < Type > ( ) );
+		unregisterStringWriter ( core::type_details::get < Type > ( ) );
 	}
 
-	static void registerStringWriter ( std::string type, const std::string & typeName, std::unique_ptr < GroupWriter > entry );
+	static void registerStringWriter ( const core::type_details & type, std::unique_ptr < GroupWriter > entry );
 
 	template < class Type >
 	static void registerStringWriter ( ) {
-		registerStringWriter ( ext::to_string < object::AnyObject < Type > > ( ), ext::to_string < Type > ( ), std::unique_ptr < GroupWriter > ( new WriterRegister < Type > ( ) ) );
+		registerStringWriter ( core::type_details::get < Type > ( ), std::unique_ptr < GroupWriter > ( new WriterRegister < Type > ( ) ) );
 	}
 
 	static object::Object parse ( ext::istream & input );
diff --git a/alib2xml/src/core/xmlApi.cpp b/alib2xml/src/core/xmlApi.cpp
index a08a73b03a09f176a8902cf300393c7bdea39588..4473eb5e86450255e3729b2f5f08102c4c3ac28f 100644
--- a/alib2xml/src/core/xmlApi.cpp
+++ b/alib2xml/src/core/xmlApi.cpp
@@ -8,8 +8,8 @@ ext::map < std::string, std::unique_ptr < xmlApi < object::Object >::GroupParser
 	return res;
 }
 
-ext::map < std::string, std::unique_ptr < xmlApi < object::Object >::GroupComposer > > & xmlApi < object::Object >::composeFunctions ( ) {
-	static ext::map < std::string, std::unique_ptr < GroupComposer > > res;
+ext::map < core::type_details, std::unique_ptr < xmlApi < object::Object >::GroupComposer > > & xmlApi < object::Object >::composeFunctions ( ) {
+	static ext::map < core::type_details, std::unique_ptr < GroupComposer > > res;
 
 	return res;
 }
@@ -31,20 +31,20 @@ void xmlApi < object::Object >::registerXmlReader ( std::string tagName, const c
 	}
 }
 
-void xmlApi < object::Object >::unregisterXmlWriter ( const std::string & type, const core::type_details & typeName ) {
+void xmlApi < object::Object >::unregisterXmlWriter ( const core::type_details & type ) {
 	if ( ! composeFunctions ( ).erase ( type ) ) {
 		std::string groupName = ext::to_string < object::Object > ( );
 
-		throw::exception::CommonException ( "Compose callback of " + ext::to_string ( typeName ) + " not registered in group " + groupName + "." );
+		throw::exception::CommonException ( "Compose callback of " + ext::to_string ( type ) + " not registered in group " + groupName + "." );
 	}
 }
 
-void xmlApi < object::Object >::registerXmlWriter ( std::string type, const core::type_details & typeName, std::unique_ptr < GroupComposer > entry ) {
+void xmlApi < object::Object >::registerXmlWriter ( const core::type_details & type, std::unique_ptr < GroupComposer > entry ) {
 	bool res = composeFunctions ( ).insert ( std::make_pair ( std::move ( type ), std::move ( entry ) ) ).second;
 	if ( ! res ) {
 		std::string groupName = ext::to_string < object::Object > ( );
 
-		throw::exception::CommonException ( "Compose callback of " + ext::to_string ( typeName ) + " already registered in group " + groupName + "." );
+		throw::exception::CommonException ( "Compose callback of " + ext::to_string ( type ) + " already registered in group " + groupName + "." );
 	}
 }
 
@@ -150,11 +150,11 @@ void xmlApi < object::Object >::composeUnique ( xmlApiOutputContext & output, co
 }
 
 void xmlApi < object::Object >::composeObject ( xmlApiOutputContext & output, const object::Object & data ) {
-	const auto & content = data.getData ( );
-	std::string type = ext::to_string ( ext::type_index ( typeid ( content ) ) );
-	typename ext::map < std::string, std::unique_ptr < GroupComposer > >::iterator callback = composeFunctions ( ).find ( type );
+	core::type_details type = core::type_details::get ( data );
+	auto callback = std::find_if ( composeFunctions ( ).begin ( ), composeFunctions ( ).end ( ), [ & ] ( const std::pair < const core::type_details, std::unique_ptr < GroupComposer > > & entry ) { return entry.first.compatible_with ( type ); } );
 
-	if ( callback == composeFunctions ( ).end ( ) ) throw exception::CommonException ( "Compose callback for " + type + " tag not registered." );
+	if ( callback == composeFunctions ( ).end ( ) )
+		throw exception::CommonException ( "Compose callback for " + ext::to_string ( type ) + " tag not registered." );
 
 	/* encode referenced object */
 	callback->second->compose ( output, data );
diff --git a/alib2xml/src/core/xmlApi.hpp b/alib2xml/src/core/xmlApi.hpp
index 7ab967499da3093e62af6fdc58206ef9d629baa6..6aed490437b350b950f48fa8f04cf2dfa71a6d9c 100644
--- a/alib2xml/src/core/xmlApi.hpp
+++ b/alib2xml/src/core/xmlApi.hpp
@@ -83,7 +83,7 @@ public:
 	};
 
 private:
-	static ext::map < std::string, std::unique_ptr < GroupComposer > > & composeFunctions ( );
+	static ext::map < core::type_details, std::unique_ptr < GroupComposer > > & composeFunctions ( );
 
 	template < class Type >
 	class ComposerRegister : public GroupComposer {
@@ -109,18 +109,18 @@ public:
 		registerXmlReader ( xmlApi < Type >::xmlTagName ( ), core::type_details::get < Type > ( ), std::unique_ptr < GroupParser > ( new ParserRegister < Type > ( ) ) );
 	}
 
-	static void unregisterXmlWriter ( const std::string & type, const core::type_details & typeName );
+	static void unregisterXmlWriter ( const core::type_details & type );
 
 	template < class Type >
 	static void unregisterXmlWriter ( ) {
-		unregisterXmlWriter ( ext::to_string < object::AnyObject < Type > > ( ), core::type_details::get < Type > ( ) );
+		unregisterXmlWriter ( core::type_details::get < Type > ( ) );
 	}
 
-	static void registerXmlWriter ( std::string type, const core::type_details & typeName, std::unique_ptr < GroupComposer > entry );
+	static void registerXmlWriter ( const core::type_details & type, std::unique_ptr < GroupComposer > entry );
 
 	template < class Type >
 	static void registerXmlWriter ( ) {
-		registerXmlWriter ( ext::to_string < object::AnyObject < Type > > ( ), core::type_details::get < Type > ( ), std::unique_ptr < GroupComposer > ( new ComposerRegister < Type > ( ) ) );
+		registerXmlWriter ( core::type_details::get < Type > ( ), std::unique_ptr < GroupComposer > ( new ComposerRegister < Type > ( ) ) );
 	}
 
 	static object::Object parseRef ( xmlApiInputContext & input );