diff --git a/alib2xml/src/core/xmlApi.hpp b/alib2xml/src/core/xmlApi.hpp
index 7115e1de792335ce80a8b382f6095595971c88d4..6959f95087dfc868b90b71b3d877f86ccad0298b 100644
--- a/alib2xml/src/core/xmlApi.hpp
+++ b/alib2xml/src/core/xmlApi.hpp
@@ -29,49 +29,28 @@ template < typename T, typename Enable = void >
 struct xmlApi { };
 
 class xmlApiInputContext : public ext::deque < sax::Token >::iterator {
-	template < typename T, typename Enable >
-	friend struct xmlApi;
-
-	ext::map < std::string, ext::map < int, object::Object * > > idToInstanceContexts;
-	int idMaxContext;
+	ext::map < int, object::Object > idToInstanceContexts;
 
 public:
-	xmlApiInputContext ( ext::deque < sax::Token >::iterator iter ) : ext::deque < sax::Token >::iterator ( iter ), idMaxContext ( 0 ) {
-	}
-
-	~xmlApiInputContext ( ) {
-		for ( const std::pair < const std::string, ext::map < int, object::Object * > > context : idToInstanceContexts )
-			for ( const std::pair < const int, object::Object * > entry : context.second )
-				delete entry.second;
-	}
-
-	ext::map < int, object::Object * > & idToInstance ( const std::string & name ) {
-		return idToInstanceContexts[name];
+	xmlApiInputContext ( ext::deque < sax::Token >::iterator iter ) : ext::deque < sax::Token >::iterator ( iter ) {
 	}
 
-	int & idMax ( ) {
-		return idMaxContext;
-	}
-
-	const ext::map < std::string, ext::map < int, object::Object * > > & dump ( ) const {
+	ext::map < int, object::Object > & idToInstance ( ) {
 		return idToInstanceContexts;
 	}
 
 };
 
 class xmlApiOutputContext : public ext::deque < sax::Token > {
-	template < typename T, typename Enable >
-	friend struct xmlApi;
-
-	ext::map < std::string, ext::map < const base::CommonBaseBase *, int > > instanceToIdContexts;
+	ext::map < object::Object, int > instanceToIdContexts;
 	int idMaxContext;
 
 public:
 	xmlApiOutputContext ( ) : idMaxContext ( 0 ) {
 	}
 
-	ext::map < const base::CommonBaseBase *, int > & instanceToId ( const std::string & name ) {
-		return instanceToIdContexts[name];
+	ext::map < object::Object, int > & instanceToId ( ) {
+		return instanceToIdContexts;
 	}
 
 	int & idMax ( ) {
@@ -179,14 +158,14 @@ public:
 			int id = ext::from_string < int > ( sax::FromXMLParserHelper::popTokenData ( input, sax::Token::TokenType::CHARACTER ) );
 			sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ATTRIBUTE, "id" );
 			sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "Ref" );
-			ext::map < int, object::Object * >::iterator elem = input.idToInstance ( ext::to_string < object::Object > ( ) ).find ( id );
+			ext::map < int, object::Object >::iterator elem = input.idToInstance ( ).find ( id );
 
-			if ( elem == input.idToInstance ( ext::to_string < object::Object > ( ) ).end ( ) ) {
-				common::Streams::err << input.dump ( ) << std::endl;
-				throw exception::CommonException ( "XML Inconsistent ( id not found " + ext::to_string ( id  ) + " )" );
+			if ( elem == input.idToInstance ( ).end ( ) ) {
+				common::Streams::err << input.idToInstance ( ) << std::endl;
+				throw exception::CommonException ( "XML Inconsistent ( id not found " + ext::to_string ( id ) + " )" );
 			}
 
-			return * ( ( object::Object * ) elem->second );
+			return elem->second;
 		} else {
 			typename ext::map < std::string, std::unique_ptr < GroupParser > >::iterator callback = parseFunctions ( ).find ( tagName );
 
@@ -204,7 +183,7 @@ public:
 
 			/* if object is a base of reference, register it */
 			if ( ref )
-				input.idToInstance ( ext::to_string < object::Object > ( ) ).insert ( std::make_pair ( id, ( object::Object * ) new object::Object ( res ) ) );
+				input.idToInstance ( ).insert ( std::make_pair ( id, res ) );
 
 			return res;
 		}
@@ -231,9 +210,9 @@ public:
 	static void compose ( ext::deque < sax::Token > & output, const object::Object & data ) {
 		xmlApiOutputContext & context = ( xmlApiOutputContext & ) output;
 
-		typename ext::map < const base::CommonBaseBase *, int >::iterator elem = context.instanceToId ( ext::to_string < object::Object > ( ) ).find ( static_cast < const base::CommonBaseBase * > ( & data.getData ( ) ) );
+		typename ext::map < object::Object, int >::iterator elem = context.instanceToId ( ).find ( data );
 
-		if ( common::GlobalData::optimizeXml && elem != context.instanceToId ( ext::to_string < object::Object > ( ) ).end ( ) ) {
+		if ( common::GlobalData::optimizeXml && elem != context.instanceToId ( ).end ( ) ) {
 			output.emplace_back ( "Ref", sax::Token::TokenType::START_ELEMENT );
 			output.emplace_back ( "id", sax::Token::TokenType::START_ATTRIBUTE );
 			output.emplace_back ( ext::to_string ( elem->second ), sax::Token::TokenType::CHARACTER );
@@ -262,7 +241,7 @@ public:
 				output.emplace ( output.begin ( ) + pos + 2, ext::to_string ( id ), sax::Token::TokenType::CHARACTER );
 				output.emplace ( output.begin ( ) + pos + 3, "ref", sax::Token::TokenType::END_ATTRIBUTE );
 
-				context.instanceToId ( ext::to_string < object::Object > ( ) ).insert ( std::make_pair ( static_cast< const base::CommonBaseBase * > ( & data.getData ( ) ), id ) );
+				context.instanceToId ( ).insert ( std::make_pair ( data, id ) );
 			}
 		}
 	}