diff --git a/alib2abstraction/src/registration/AlgoRegistration.hpp b/alib2abstraction/src/registration/AlgoRegistration.hpp
index f58f6d07e0249e9a7de8e38874764e26dd923c52..7ffc75729998201b8797fdf985901ae048c83385 100644
--- a/alib2abstraction/src/registration/AlgoRegistration.hpp
+++ b/alib2abstraction/src/registration/AlgoRegistration.hpp
@@ -21,11 +21,13 @@ protected:
 
 template < class Algorithm, class ReturnType, class ... ParameterTypes >
 class AbstractRegister : public AlgoRegister {
+	abstraction::AlgorithmCategories::AlgorithmCategory m_category;
+
+	registration::NormalizationRegister < ReturnType > normalize;
+
 public:
 	template < class ... ParamNames >
-	AbstractRegister ( ReturnType ( * callback ) ( ParameterTypes ... ), abstraction::AlgorithmCategories::AlgorithmCategory category, ParamNames ... paramNames ) {
-		registration::NormalizationRegister < ReturnType > ( );
-
+	AbstractRegister ( ReturnType ( * callback ) ( ParameterTypes ... ), abstraction::AlgorithmCategories::AlgorithmCategory category, ParamNames ... paramNames ) : m_category ( category ) {
 		std::array < std::string, sizeof ... ( ParameterTypes ) > parameterNames = generateNames < sizeof ... ( ParameterTypes ) > ( paramNames ... );
 
 		abstraction::AlgorithmRegistry::registerAlgorithm < Algorithm, ReturnType, ParameterTypes ... > ( callback, category, std::move ( parameterNames ) );
@@ -34,6 +36,10 @@ public:
 	template < class ... ParamNames >
 	AbstractRegister ( ReturnType ( * callback ) ( ParameterTypes ... ) ) : AbstractRegister ( callback, abstraction::AlgorithmCategories::AlgorithmCategory::DEFAULT ) {
 	}
+
+	~AbstractRegister ( ) {
+		abstraction::AlgorithmRegistry::unregisterAlgorithm < Algorithm, ParameterTypes ... > ( m_category );
+	}
 };
 
 template < class Algorithm, class ReturnType, class ... ParameterTypes >
@@ -46,20 +52,29 @@ public:
 		abstraction::AlgorithmRegistry::registerWrapper < Algorithm, ReturnType, ParameterTypes ... > ( callback, std::move ( parameterNames ) );
 	}
 
+	~WrapperRegister ( ) {
+		abstraction::AlgorithmRegistry::unregisterWrapper < Algorithm, ParameterTypes ... > ( );
+	}
 };
 
 template < class Algorithm, class ReturnType, class ObjectType, class ... ParameterTypes >
 class MethodRegister : public AlgoRegister {
+	std::string m_methodName;
+
+	registration::NormalizationRegister < ReturnType > normalize;
+
 public:
 	template < class ... ParamNames >
-	MethodRegister ( ReturnType ( ObjectType::* callback ) ( ParameterTypes ... ), std::string methodName, ParamNames ... paramNames ) {
-		registration::NormalizationRegister < ReturnType > ( );
-
+	MethodRegister ( ReturnType ( ObjectType::* callback ) ( ParameterTypes ... ), std::string methodName, ParamNames ... paramNames ) : m_methodName ( methodName ) {
 		std::array < std::string, sizeof ... ( ParameterTypes ) > parameterNames = generateNames < sizeof ... ( ParameterTypes ) > ( paramNames ... );
 
 		abstraction::AlgorithmRegistry::registerMethod < Algorithm > ( callback, methodName, std::move ( parameterNames ) );
 	}
 
+	~MethodRegister ( ) {
+		abstraction::AlgorithmRegistry::unregisterMethod < Algorithm, ObjectType, ParameterTypes ... > ( m_methodName );
+	}
+
 };
 
 } /* namespace registration */
diff --git a/alib2abstraction/src/registration/CastRegistration.hpp b/alib2abstraction/src/registration/CastRegistration.hpp
index e65a651a983d4b868a9174f990b806d697d29485..abf8fa8eb6dc54f0a84f7108b6d637ce8c7a98ad 100644
--- a/alib2abstraction/src/registration/CastRegistration.hpp
+++ b/alib2abstraction/src/registration/CastRegistration.hpp
@@ -9,16 +9,20 @@ namespace registration {
 
 template < class To, class From >
 class CastRegister {
+	registration::NormalizationRegister < To > normalize;
+
 public:
 	CastRegister ( ) {
-		registration::NormalizationRegister < To > ( );
 		abstraction::CastRegistry::registerCast < To, From > ( );
 	}
 
 	CastRegister ( To ( * castFunction ) ( const From & ) ) {
-		registration::NormalizationRegister < To > ( );
 		abstraction::CastRegistry::registerCastAlgorithm < To, From > ( castFunction );
 	}
+
+	~CastRegister ( ) {
+		abstraction::CastRegistry::unregisterCast < To, From > ( );
+	}
 };
 
 } /* namespace registration */
diff --git a/alib2abstraction/src/registration/ComponentRegistration.hpp b/alib2abstraction/src/registration/ComponentRegistration.hpp
index 0482c7f716488dcca80c91437d0a4b0a7caf8f97..68d555c232887ede3d8443e19ed3d491e3b374d2 100644
--- a/alib2abstraction/src/registration/ComponentRegistration.hpp
+++ b/alib2abstraction/src/registration/ComponentRegistration.hpp
@@ -10,6 +10,10 @@ public:
 		ObjectType::registerComponent ( );
 	}
 
+	~ComponentRegister ( ) {
+		ObjectType::unregisterComponent ( );
+	}
+
 };
 
 } /* namespace registration */
diff --git a/alib2abstraction/src/registration/NormalizationRegistration.hpp b/alib2abstraction/src/registration/NormalizationRegistration.hpp
index 78a41442220a177489e3488f3cd9eed8c2f0f96a..b4806357f59e203506de34d1ecc40f936ab792f0 100644
--- a/alib2abstraction/src/registration/NormalizationRegistration.hpp
+++ b/alib2abstraction/src/registration/NormalizationRegistration.hpp
@@ -18,9 +18,15 @@ public:
 
 template < class ReturnType >
 class NormalizationRegister < ReturnType, typename std::enable_if < ! std::is_same < ReturnType, core::normalizationResult < ReturnType > >::value >::type > {
+	std::list < std::unique_ptr < abstraction::NormalizeRegistry::Entry > >::const_iterator iter;
+
 public:
 	NormalizationRegister ( ) {
-		abstraction::NormalizeRegistry::registerNormalize < ReturnType > ( );
+		iter = abstraction::NormalizeRegistry::registerNormalize < ReturnType > ( );
+	}
+
+	~NormalizationRegister ( ) {
+		abstraction::NormalizeRegistry::unregisterNormalize < ReturnType > ( iter );
 	}
 
 	bool requireNormalization ( ) const {
diff --git a/alib2abstraction/src/registration/SetRegistration.hpp b/alib2abstraction/src/registration/SetRegistration.hpp
index 67a83b0d31a959ef1c2814834e853778dd1de3be..ce0c120ba6c87f2b1a12d332398c58e77b99e1bb 100644
--- a/alib2abstraction/src/registration/SetRegistration.hpp
+++ b/alib2abstraction/src/registration/SetRegistration.hpp
@@ -13,6 +13,10 @@ public:
 	SetRegister ( ) {
 		abstraction::ContainerRegistry::registerSet < Param > ( );
 	}
+
+	~SetRegister ( ) {
+		abstraction::ContainerRegistry::unregisterSet < Param > ( );
+	}
 };
 
 } /* namespace registration */
diff --git a/alib2abstraction/src/registration/ValuePrinterRegistration.hpp b/alib2abstraction/src/registration/ValuePrinterRegistration.hpp
index 676f44f0d771e702f4fd07741e8618aa1a7cbac9..799987f8d870faa682f2a18b01c48bf3b94bcb30 100644
--- a/alib2abstraction/src/registration/ValuePrinterRegistration.hpp
+++ b/alib2abstraction/src/registration/ValuePrinterRegistration.hpp
@@ -11,6 +11,10 @@ public:
 	ValuePrinterRegister ( ) {
 		abstraction::ValuePrinterRegistry::registerValuePrinter < Type > ( );
 	}
+
+	~ValuePrinterRegister ( ) {
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < Type > ( );
+	}
 };
 
 } /* namespace registration */
diff --git a/alib2abstraction/src/registry/AlgorithmRegistry.cpp b/alib2abstraction/src/registry/AlgorithmRegistry.cpp
index 364236583efbdf514575c7e2caf1dd7372597035..a951d6ad2a9c15fd2bcd88932c6d8a7cf2cfc1a5 100644
--- a/alib2abstraction/src/registry/AlgorithmRegistry.cpp
+++ b/alib2abstraction/src/registry/AlgorithmRegistry.cpp
@@ -60,6 +60,8 @@ void AlgorithmRegistry::unregisterInternal ( std::string algorithm, ext::vector
 			throw std::invalid_argument ( "Templated entry " + algorithm + " < " + ext::to_string ( templateParams ) + " > with parameters " + ext::to_string ( params ) + " not registered." );
 	}
 	group.erase ( iter );
+	if ( group.size ( ) == 0 )
+		getEntries ( ).erase ( ext::make_pair ( algorithm, templateParams ) );
 }
 
 ext::map < ext::pair < std::string, ext::vector < std::string > >, ext::list < ext::tuple < AlgorithmCategories::AlgorithmCategory, ext::vector < ext::tuple < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier >, std::string > >, ext::pair < ext::pair < std::string, ext::set < abstraction::ParamQualifiers::ParamQualifier > >, std::shared_ptr < AlgorithmRegistry::Entry > > > > >::const_iterator AlgorithmRegistry::findAbstractionGroup ( const std::string & name, const ext::vector < std::string > & templateParams ) {
diff --git a/alib2cli/src/command/UnloadCommand.h b/alib2cli/src/command/UnloadCommand.h
new file mode 100644
index 0000000000000000000000000000000000000000..a33107a7364584fc69e2db9c6162ef41b4b60ad9
--- /dev/null
+++ b/alib2cli/src/command/UnloadCommand.h
@@ -0,0 +1,26 @@
+#ifndef _CLI_UNLOAD_COMMAND_H_
+#define _CLI_UNLOAD_COMMAND_H_
+
+#include <command/Command.h>
+#include <environment/Environment.h>
+
+#include <common/LibraryLoader.h>
+
+namespace cli {
+
+class UnloadCommand : public Command {
+	std::string m_libraryName;
+
+public:
+	UnloadCommand ( std::string libraryName ) : m_libraryName ( std::move ( libraryName ) ) {
+	}
+
+	virtual Command::Result run ( Environment & ) const override {
+		cli::LibraryLoader::unload ( m_libraryName );
+		return Command::Result::OK;
+	}
+};
+
+} /* namespace cli */
+
+#endif /* _CLI_UNLOAD_COMMAND_H_ */
diff --git a/alib2cli/src/common/LibraryLoader.cpp b/alib2cli/src/common/LibraryLoader.cpp
index 0b0ba38f810aafdc624798889f1a3b026d93313b..be7bf83a92f33c40a1b697753031ac04311a0eab 100644
--- a/alib2cli/src/common/LibraryLoader.cpp
+++ b/alib2cli/src/common/LibraryLoader.cpp
@@ -17,7 +17,12 @@ void LibraryLoader::load ( const std::string & name ) {
 	std::list < LibraryLoader::Library >::iterator iter = find ( name );
 	if ( iter == libraries.end ( ) )
 		iter = libraries.emplace ( libraries.end ( ), std::move ( name ) );
-	iter->load ( );
+}
+
+void LibraryLoader::unload ( const std::string & name ) {
+	std::list < LibraryLoader::Library >::iterator iter = find ( name );
+	if ( iter != libraries.end ( ) )
+		libraries.erase ( iter );
 }
 
 } /* namespace cli */
diff --git a/alib2cli/src/common/LibraryLoader.h b/alib2cli/src/common/LibraryLoader.h
index fbcfded96398e97d565c3ff15cd3f522c73a8984..1a4c1ff8279cb8c75fa162e1fa914af308c1d548 100644
--- a/alib2cli/src/common/LibraryLoader.h
+++ b/alib2cli/src/common/LibraryLoader.h
@@ -20,6 +20,7 @@ class LibraryLoader {
 
 	public:
 		Library ( const std::string & path ) : m_path ( path ), m_handle ( NULL ) {
+			load ( );
 		}
 
 		Library ( const Library & ) = delete;
@@ -65,6 +66,7 @@ class LibraryLoader {
 
 public:
 	static void load ( const std::string & name );
+	static void unload ( const std::string & name );
 };
 
 } /* namespace cli */
diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp
index 3d83c5c5fa3d9a9ca5059b8f5612dbc2e6c1de3e..58f2426749a50b77411d214fcfeedd7818d95fa6 100644
--- a/alib2cli/src/parser/Parser.cpp
+++ b/alib2cli/src/parser/Parser.cpp
@@ -24,6 +24,7 @@
 #include <command/CastsIntrospectionCommand.h>
 #include <command/SetCommand.h>
 #include <command/LoadCommand.h>
+#include <command/UnloadCommand.h>
 
 namespace cli {
 
@@ -364,6 +365,12 @@ std::unique_ptr < Command > Parser::parse ( ) {
 		match ( cli::Lexer::TokenType::INTEGER, cli::Lexer::TokenType::IDENTIFIER, cli::Lexer::TokenType::STRING );
 		match ( cli::Lexer::TokenType::EOS );
 		return std::make_unique < LoadCommand > ( std::move ( libraryName ) );
+	} else if ( check_nonreserved_kw ( "unload" ) ) {
+		match_nonreserved_kw ( "unload" );
+		std::string libraryName = getTokenValue ( );
+		match ( cli::Lexer::TokenType::INTEGER, cli::Lexer::TokenType::IDENTIFIER, cli::Lexer::TokenType::STRING );
+		match ( cli::Lexer::TokenType::EOS );
+		return std::make_unique < UnloadCommand > ( std::move ( libraryName ) );
 	} else if ( check ( cli::Lexer::TokenType::EOT ) ) {
 		return std::make_unique < QuitCommand > ( nullptr );
 	} else {
diff --git a/alib2common/src/PrimitiveRegistrator.cpp b/alib2common/src/PrimitiveRegistrator.cpp
index 3b416e9bbf9433de0e4fe8353726565a72554cca..43bba9d747a3b73a4d5def1f34de6ac74bdda45d 100644
--- a/alib2common/src/PrimitiveRegistrator.cpp
+++ b/alib2common/src/PrimitiveRegistrator.cpp
@@ -72,6 +72,61 @@ public:
 		abstraction::ValuePrinterRegistry::registerValuePrinter < ext::map < ext::pair < object::Object, object::Object >, ext::map < ext::pair < object::Object, object::Object >, long > > > ( );
 		abstraction::ContainerRegistry::registerSet < object::Object > ( );
 	}
+
+	~PrimitiveRegistrator ( ) {
+		abstraction::CastRegistry::unregisterCast < double, int > ( );
+		abstraction::CastRegistry::unregisterCast < int, double > ( );
+
+		abstraction::CastRegistry::unregisterCast < std::string, int > ( );
+		abstraction::CastRegistry::unregisterCast < int, std::string > ( );
+
+		abstraction::CastRegistry::unregisterCast < bool, int > ( );
+		abstraction::CastRegistry::unregisterCast < bool, std::string > ( );
+		abstraction::CastRegistry::unregisterCast ( "unsigned", ext::to_string < std::string > ( ) );
+		abstraction::CastRegistry::unregisterCast < double, std::string > ( );
+
+		abstraction::CastRegistry::unregisterCast ( "size_t", ext::to_string < int > ( ) );
+		abstraction::CastRegistry::unregisterCast < size_t, int > ( );
+		abstraction::CastRegistry::unregisterCast < int, size_t > ( );
+		abstraction::CastRegistry::unregisterCast < unsigned, int > ( );
+
+		abstraction::CastRegistry::unregisterCast ( "long", ext::to_string < int > ( ) );
+
+		abstraction::ContainerRegistry::unregisterSet < int > ( );
+
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < int > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < unsigned > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < double > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < std::string > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < void > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < bool > ( );
+
+		abstraction::ImmediateRegistry::unregisterImmediate < int > ( );
+		abstraction::ImmediateRegistry::unregisterImmediate < std::string > ( );
+
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < object::Object > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::set < object::Object > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::trie < object::Object, bool > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::set < unsigned > > ( );
+
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::vector < object::Object > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::vector < unsigned > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::vector < ext::pair < object::Object, object::Object > > > ( );
+
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::pair < ext::vector < object::Object >, double > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::pair < ext::vector < object::Object >, int > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::pair < ext::vector < object::Object >, long > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::pair < ext::vector < ext::pair < object::Object, object::Object > >, double > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::pair < ext::vector < ext::pair < object::Object, object::Object > >, int > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::pair < ext::vector < ext::pair < object::Object, object::Object > >, long > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::map < object::Object, ext::map < object::Object, double > > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::map < object::Object, ext::map < object::Object, int > > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::map < object::Object, ext::map < object::Object, long > > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::map < ext::pair < object::Object, object::Object >, ext::map < ext::pair < object::Object, object::Object >, double > > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::map < ext::pair < object::Object, object::Object >, ext::map < ext::pair < object::Object, object::Object >, int > > > ( );
+		abstraction::ValuePrinterRegistry::unregisterValuePrinter < ext::map < ext::pair < object::Object, object::Object >, ext::map < ext::pair < object::Object, object::Object >, long > > > ( );
+		abstraction::ContainerRegistry::unregisterSet < object::Object > ( );
+	}
 };
 
 auto primitiveRegistrator = PrimitiveRegistrator ( );
diff --git a/alib2data/src/PrimitiveRegistrator.cpp b/alib2data/src/PrimitiveRegistrator.cpp
index a72f94cb6028fdf6efdf5035ebc8fec307038306..06ea49f93852af41720a617289a777917f295d54 100644
--- a/alib2data/src/PrimitiveRegistrator.cpp
+++ b/alib2data/src/PrimitiveRegistrator.cpp
@@ -28,24 +28,35 @@
 namespace {
 
 class PrimitiveRegistrator {
+	registration::XmlWriterRegister < ext::set < common::ranked_symbol < object::Object, unsigned > > > member1;
+	registration::XmlWriterRegister < ext::vector < ext::map < std::pair < object::Object, object::Object >, ext::map < object::Object, object::Object > > > > member2;
+	registration::XmlWriterRegister < ext::vector < ext::vector < ext::set < object::Object > > > > member3;
+	registration::XmlWriterRegister < ext::map < common::ranked_symbol < object::Object, unsigned >, size_t > > member4;
+	registration::XmlWriterRegister < ext::set < string::LinearString < > > > member5;
+	registration::XmlWriterRegister < ext::trie < DefaultSymbolType, bool > > member6;
+
 public:
 	PrimitiveRegistrator ( ) {
 		abstraction::ContainerRegistry::registerSet < common::ranked_symbol < object::Object, unsigned > > ( "RankedSymbol" );
 		abstraction::XmlContainerParserRegistry::registerSet < common::ranked_symbol < object::Object, unsigned > > ( "RankedSymbol" );
 
-		registration::XmlWriterRegister < ext::set < common::ranked_symbol < object::Object, unsigned > > > ( );
-		registration::XmlWriterRegister < ext::vector < ext::map < std::pair < object::Object, object::Object >, ext::map < object::Object, object::Object > > > > ( );
-		registration::XmlWriterRegister < ext::vector < ext::vector < ext::set < object::Object > > > > ( );
-		registration::XmlWriterRegister < ext::map < common::ranked_symbol < object::Object, unsigned >, size_t > > ( );
-		registration::XmlWriterRegister < ext::set < string::LinearString < > > > ( );
-		registration::XmlWriterRegister < ext::trie < DefaultSymbolType, bool > > ( );
-
 		abstraction::XmlParserRegistry::registerXmlParser < object::Object > ( "DefaultStateType" );
 
 		core::xmlApi < object::Object >::template registerXmlWriter < ext::set < common::ranked_symbol < object::Object, unsigned > > > ( );
 		core::xmlApi < object::Object >::template registerXmlWriter < ext::pair < ext::set < ext::pair < object::Object, object::Object > >, ext::variant < string::Epsilon < object::Object >, object::Object > > > ( );
 		core::xmlApi < object::Object >::template registerXmlWriter < ext::pair < object::Object, ext::variant < string::Epsilon < object::Object >, object::Object > > > ( );
 	}
+
+	~PrimitiveRegistrator ( ) {
+		abstraction::ContainerRegistry::unregisterSet ( "RankedSymbol" );
+		abstraction::XmlContainerParserRegistry::unregisterSet ( "RankedSymbol" );
+
+		abstraction::XmlParserRegistry::unregisterXmlParser ( "DefaultStateType" );
+
+		core::xmlApi < object::Object >::template unregisterXmlWriter < ext::set < common::ranked_symbol < object::Object, unsigned > > > ( );
+		core::xmlApi < object::Object >::template unregisterXmlWriter < ext::pair < ext::set < ext::pair < object::Object, object::Object > >, ext::variant < string::Epsilon < object::Object >, object::Object > > > ( );
+		core::xmlApi < object::Object >::template unregisterXmlWriter < ext::pair < object::Object, ext::variant < string::Epsilon < object::Object >, object::Object > > > ( );
+	}
 };
 
 auto primitiveRegistrator = PrimitiveRegistrator ( );
diff --git a/alib2raw/src/registration/RawRegistration.hpp b/alib2raw/src/registration/RawRegistration.hpp
index f72486a3bd7cb8de14d85a1f80979de8839e46d3..4cdb01f64897a4170066194faca584228da4bce4 100644
--- a/alib2raw/src/registration/RawRegistration.hpp
+++ b/alib2raw/src/registration/RawRegistration.hpp
@@ -39,6 +39,11 @@ public:
 		abstraction::RawReaderRegistry::registerRawReader < Type > ( );
 		abstraction::AlgorithmRegistry::registerWrapper < raw::Parse < Type >, Type, const std::string & > ( raw::Parse < Type >::abstractionFromString, std::array < std::string, 1 > { { "arg0" } } );
 	}
+
+	~RawReaderRegister ( ) {
+		abstraction::RawReaderRegistry::unregisterRawReader < Type > ( );
+		abstraction::AlgorithmRegistry::unregisterWrapper < raw::Parse < Type >, const std::string & > ( );
+	}
 };
 
 template < class Type >
@@ -48,6 +53,11 @@ public:
 		abstraction::RawWriterRegistry::registerRawWriter < Type > ( );
 		abstraction::AlgorithmRegistry::registerWrapper < raw::Compose, std::string, const Type & > ( raw::Compose::abstractionFromType, std::array < std::string, 1 > { { "arg0" } } );
 	}
+
+	~RawWriterRegister ( ) {
+		abstraction::RawWriterRegistry::unregisterRawWriter < Type > ( );
+		abstraction::AlgorithmRegistry::unregisterWrapper < raw::Compose, const Type & > ( );
+	}
 };
 
 } /* namespace registration */
diff --git a/alib2str/src/registration/StringRegistration.hpp b/alib2str/src/registration/StringRegistration.hpp
index 38c645fb8f9405f2a173e96f217686df9deeaad4..b09428bbf28fc3738c1fe83bdb30f7ade72999ad 100644
--- a/alib2str/src/registration/StringRegistration.hpp
+++ b/alib2str/src/registration/StringRegistration.hpp
@@ -34,9 +34,15 @@ namespace registration {
 
 template < class Group, class Type >
 class StringReaderRegister {
+	ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < abstraction::StringReaderRegistry::Entry > > >::const_iterator iter;
+
 public:
 	StringReaderRegister ( ) {
-		abstraction::StringReaderRegistry::registerStringReader < Group, Type > ( );
+		iter = abstraction::StringReaderRegistry::registerStringReader < Group, Type > ( );
+	}
+
+	~StringReaderRegister ( ) {
+		abstraction::StringReaderRegistry::unregisterStringReader < Group > ( iter );
 	}
 };
 
@@ -46,6 +52,10 @@ public:
 	StringReaderGroupRegister ( ) {
 		abstraction::AlgorithmRegistry::registerWrapper < string::Parse < Group >, abstraction::UnspecifiedType, std::string && > ( string::Parse < Group >::abstractionFromString, std::array < std::string, 1 > { { "arg0" } } );
 	}
+
+	~StringReaderGroupRegister ( ) {
+		abstraction::AlgorithmRegistry::unregisterWrapper < string::Parse < Group >, std::string && > ( );
+	}
 };
 
 template < class Type >
@@ -55,13 +65,24 @@ public:
 		abstraction::StringWriterRegistry::registerStringWriter < Type > ( );
 		abstraction::AlgorithmRegistry::registerWrapper < string::Compose, std::string, const Type & > ( string::Compose::abstractionFromType, std::array < std::string, 1 > { { "arg0" } } );
 	}
+
+	~StringWriterRegister ( ) {
+		abstraction::StringWriterRegistry::unregisterStringWriter < Type > ( );
+		abstraction::AlgorithmRegistry::unregisterWrapper < string::Compose, const Type & > ( );
+	}
 };
 
 template < class Group, class Type >
 class StringReaderRegisterTypeInGroup {
+	typename ext::list < std::pair < std::function < bool ( std::istream & ) >, std::unique_ptr < typename core::stringApi < Group >::GroupReader > > >::const_iterator iter;
+
 public:
 	StringReaderRegisterTypeInGroup ( ) {
-		core::stringApi < Group >::template registerStringReader < Type > ( );
+		iter = core::stringApi < Group >::template registerStringReader < Type > ( );
+	}
+
+	~StringReaderRegisterTypeInGroup ( ) {
+		core::stringApi < Group >::template unregisterStringReader < Type > ( iter );
 	}
 };
 
@@ -71,6 +92,10 @@ public:
 	StringWriterRegisterTypeInGroup ( ) {
 		core::stringApi < Group >::template registerStringWriter < Type > ( );
 	}
+
+	~StringWriterRegisterTypeInGroup ( ) {
+		core::stringApi < Group >::template unregisterStringWriter < Type > ( );
+	}
 };
 
 } /* namespace registration */
diff --git a/alib2xml/src/PrimitiveRegistrator.cpp b/alib2xml/src/PrimitiveRegistrator.cpp
index cecb0dcae2684da39148bcbebd86f6f425f4ab4e..6e2d795e52021f8cd277a6132cd0700a6f1b81be 100644
--- a/alib2xml/src/PrimitiveRegistrator.cpp
+++ b/alib2xml/src/PrimitiveRegistrator.cpp
@@ -26,21 +26,21 @@
 namespace {
 
 class PrimitiveRegistrator {
+	registration::XmlWriterRegister < ext::vector < size_t > > member1;
+	registration::XmlWriterRegister < ext::vector < unsigned > > member2;
+	registration::XmlWriterRegister < ext::vector < int > > member3;
+	registration::XmlWriterRegister < ext::set < size_t > > member4;
+	registration::XmlWriterRegister < ext::set < unsigned > > member5;
+	registration::XmlWriterRegister < ext::set < int > > member6;
+	registration::XmlWriterRegister < ext::map < object::Object, size_t > > member7;
+	registration::XmlWriterRegister < object::Object > member8;
+
 public:
 	PrimitiveRegistrator ( ) {
 		abstraction::XmlContainerParserRegistry::registerSet < int > ( );
 		abstraction::XmlParserRegistry::registerXmlParser < int > ( "int" );
 		abstraction::XmlParserRegistry::registerXmlParser < ext::set < ext::pair < object::Object, object::Object > > > ( "pair_set" );
 
-		registration::XmlWriterRegister < ext::vector < size_t > > ( );
-		registration::XmlWriterRegister < ext::vector < unsigned > > ( );
-		registration::XmlWriterRegister < ext::vector < int > > ( );
-		registration::XmlWriterRegister < ext::set < size_t > > ( );
-		registration::XmlWriterRegister < ext::set < unsigned > > ( );
-		registration::XmlWriterRegister < ext::set < int > > ( );
-		registration::XmlWriterRegister < ext::map < object::Object, size_t > > ( );
-		registration::XmlWriterRegister < object::Object > ( );
-
 		abstraction::ContainerRegistry::registerSet < object::Object > ( "Object" );
 		abstraction::XmlContainerParserRegistry::registerSet < object::Object > ( "Object" );
 		abstraction::XmlParserRegistry::registerXmlParser < object::Object > ( "Object" );
@@ -52,6 +52,23 @@ public:
 		core::xmlApi < object::Object >::template registerXmlWriter < ext::pair < object::Object, unsigned int > > ( );
 		core::xmlApi < object::Object >::template registerXmlWriter < ext::set < char > > ( );
 	}
+
+	~PrimitiveRegistrator ( ) {
+		abstraction::XmlContainerParserRegistry::unregisterSet < int > ( );
+		abstraction::XmlParserRegistry::unregisterXmlParser ( "int" );
+		abstraction::XmlParserRegistry::unregisterXmlParser ( "pair_set" );
+
+		abstraction::ContainerRegistry::unregisterSet ( "Object" );
+		abstraction::XmlContainerParserRegistry::unregisterSet ( "Object" );
+		abstraction::XmlParserRegistry::unregisterXmlParser ( "Object" );
+
+		core::xmlApi < object::Object >::template unregisterXmlWriter < ext::set < ext::pair < object::Object, object::Object > > > ( );
+		core::xmlApi < object::Object >::template unregisterXmlWriter < ext::pair < ext::set < ext::pair < object::Object, object::Object > >, object::Object > > ( );
+		core::xmlApi < object::Object >::template unregisterXmlWriter < ext::vector < ext::variant < object::Object, object::Object > > > ( );
+		core::xmlApi < object::Object >::template unregisterXmlWriter < ext::pair < unsigned int, unsigned int > > ( );
+		core::xmlApi < object::Object >::template unregisterXmlWriter < ext::pair < object::Object, unsigned int > > ( );
+		core::xmlApi < object::Object >::template unregisterXmlWriter < ext::set < char > > ( );
+	}
 };
 
 auto primitiveRegistrator = PrimitiveRegistrator ( );
diff --git a/alib2xml/src/registration/XmlRegistration.hpp b/alib2xml/src/registration/XmlRegistration.hpp
index 8fc8b9836a53b733387cb219229f7cd30d18b6bc..9e159c91092b5226a76e671504c136df72a0daa6 100644
--- a/alib2xml/src/registration/XmlRegistration.hpp
+++ b/alib2xml/src/registration/XmlRegistration.hpp
@@ -38,6 +38,10 @@ public:
 	XmlReaderRegister ( ) {
 		abstraction::XmlParserRegistry::registerXmlParser < Type > ( );
 	}
+
+	~XmlReaderRegister ( ) {
+		abstraction::XmlParserRegistry::unregisterXmlParser < Type > ( );
+	}
 };
 
 template < class Type >
@@ -47,6 +51,11 @@ public:
 		abstraction::XmlComposerRegistry::registerXmlComposer < Type > ( );
 		abstraction::AlgorithmRegistry::registerWrapper < xml::Compose, ext::deque < sax::Token >, const Type & > ( xml::Compose::abstractionFromType, std::array < std::string, 1 > { { "arg0" } } );
 	}
+
+	~XmlWriterRegister ( ) {
+		abstraction::XmlComposerRegistry::unregisterXmlComposer < Type > ( );
+		abstraction::AlgorithmRegistry::unregisterWrapper < xml::Compose, const Type & > ( );
+	}
 };
 
 template < class Group, class Type >
@@ -56,6 +65,11 @@ public:
 		core::xmlApi < Group >::template registerXmlReader < Type > ( );
 		core::xmlApi < Group >::template registerXmlWriter < Type > ( );
 	}
+
+	~XmlRegisterTypeInGroup ( ) {
+		core::xmlApi < Group >::template unregisterXmlReader < Type > ( );
+		core::xmlApi < Group >::template unregisterXmlWriter < Type > ( );
+	}
 };
 
 } /* namespace registration */