From 7968cd68b772fd0a838501cfdbd6921d479ee8f0 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Mon, 10 Jul 2017 18:12:02 +0200
Subject: [PATCH] algorithm overloads registration unified

---
 aaccess2/src/AutomatonAccess.cpp              |  13 +-
 aaccess2/src/GrammarAccess.cpp                |   5 +-
 aaccess2/src/RegExpAccess.cpp                 |   5 +-
 aaccess2/src/StringAccess.cpp                 |   5 +-
 aaccess2/src/TreeAccess.cpp                   |   9 +-
 acompare2/src/AutomatonCompare.cpp            |  39 +++---
 acompare2/src/GrammarCompare.cpp              |  27 ++--
 acompare2/src/StringCompare.cpp               |   5 +-
 aconvert2/src/DotConverter.cpp                |  39 +++---
 aconvert2/src/GasTexConverter.cpp             |  39 +++---
 aconvert2/src/TikZConverter.cpp               |  39 +++---
 .../src/arbology/exact/BoyerMooreHorspool.cpp |   7 +-
 ...neUsingBadCharacterShiftAndBorderArray.cpp |   9 +-
 .../ExactNonlinearTreePatternAutomaton.cpp    |   3 +-
 .../src/arbology/exact/ExactPatternMatch.cpp  |  15 ++-
 .../exact/ExactPatternMatchingAutomaton.cpp   |  13 +-
 .../arbology/exact/ExactSubtreeAutomaton.cpp  |   3 +-
 .../src/arbology/exact/ExactSubtreeMatch.cpp  |   9 +-
 .../exact/ExactSubtreeMatchingAutomaton.cpp   |   7 +-
 .../exact/ExactTreePatternAutomaton.cpp       |   3 +-
 .../src/arbology/exact/KnuthMorrisPratt.cpp   |   9 +-
 .../exact/ReversedBoyerMooreHorspool.cpp      |  13 +-
 ...CompressedBitParallelIndexConstruction.cpp |   5 +-
 .../FullAndLinearIndexConstruction.cpp        |   5 +-
 ...onlinearFullAndLinearIndexConstruction.cpp |   5 +-
 .../CompressedBitParallelismPatterns.cpp      |   5 +-
 .../query/FullAndLinearIndexPatterns.cpp      |   5 +-
 .../NonlinearFullAndLinearIndexPatterns.cpp   |   5 +-
 .../arbology/transform/BeginToEndIndex.cpp    |   5 +-
 alib2algo/src/automaton/convert/ToGrammar.cpp |   5 +-
 .../src/automaton/convert/ToGrammarLeftRG.cpp |   5 +-
 .../automaton/convert/ToGrammarRightRG.cpp    |   5 +-
 .../convert/ToPostfixPushdownAutomaton.cpp    |   6 +-
 alib2algo/src/automaton/convert/ToRegExp.cpp  |  13 +-
 .../automaton/convert/ToRegExpAlgebraic.cpp   |   9 +-
 .../convert/ToRegExpStateElimination.cpp      |  13 +-
 .../src/automaton/determinize/Determinize.cpp |  23 ++--
 .../determinize/DeterminizeIDPDAPart.cxx      |   2 +-
 .../determinize/DeterminizeNFTAPart.cxx       |   2 +-
 .../determinize/DeterminizeRHDPDAPart.cxx     |   2 +-
 .../determinize/DeterminizeVPAPart.cxx        |   2 +-
 .../automaton/generate/RandomizeAutomaton.cpp |   9 +-
 .../properties/AllEpsilonClosure.cpp          |  17 +--
 .../automaton/properties/EpsilonClosure.cpp   |  15 ++-
 .../automaton/properties/ReachableStates.cpp  |  13 +-
 .../automaton/properties/UsefullStates.cpp    |  15 ++-
 alib2algo/src/automaton/run/Accept.cpp        |  19 +--
 alib2algo/src/automaton/run/Occurrences.cpp   |  13 +-
 alib2algo/src/automaton/run/Result.cpp        |  13 +-
 alib2algo/src/automaton/run/Translate.cpp     |   3 +-
 .../simplify/EpsilonRemoverIncoming.cpp       |   9 +-
 .../simplify/EpsilonRemoverOutgoing.cpp       |   9 +-
 alib2algo/src/automaton/simplify/Minimize.cpp |   5 +-
 .../automaton/simplify/MinimizeBrzozowski.cpp |   5 +-
 .../src/automaton/simplify/Normalize.cpp      |   5 +-
 alib2algo/src/automaton/simplify/Rename.cpp   |  13 +-
 .../automaton/simplify/SingleInitialState.cpp |  13 +-
 alib2algo/src/automaton/simplify/Total.cpp    |   5 +-
 alib2algo/src/automaton/simplify/Trim.cpp     |  15 ++-
 .../simplify/UnreachableStatesRemover.cpp     |  15 ++-
 .../simplify/UselessStatesRemover.cpp         |  15 ++-
 .../transform/AutomataConcatenation.cpp       |   5 +-
 ...AutomataConcatenationEpsilonTransition.cpp |   7 +-
 .../AutomataIntersectionCartesianProduct.cpp  |   5 +-
 .../AutomataUnionCartesianProduct.cpp         |   5 +-
 .../AutomataUnionEpsilonTransition.cpp        |   7 +-
 .../transform/AutomatonIteration.cpp          |   5 +-
 .../AutomatonIterationEpsilonTransition.cpp   |   7 +-
 .../src/automaton/transform/Compaction.cpp    |   7 +-
 .../src/automaton/transform/PDAToRHPDA.cpp    |   9 +-
 .../src/automaton/transform/RHPDAToPDA.cpp    |   5 +-
 alib2algo/src/automaton/transform/Reverse.cpp |   7 +-
 alib2algo/src/grammar/convert/ToAutomaton.cpp |   9 +-
 .../grammar/convert/ToAutomatonBottomUp.cpp   |   5 +-
 .../src/grammar/convert/ToGrammarLeftRG.cpp   |   3 +-
 .../src/grammar/convert/ToGrammarRightRG.cpp  |   3 +-
 alib2algo/src/grammar/convert/ToRegExp.cpp    |   5 +-
 .../src/grammar/convert/ToRegExpAlgebraic.cpp |   5 +-
 .../grammar/generate/CockeYoungerKasami.cpp   |   3 +-
 .../grammar/generate/GenerateUpToLength.cpp   |  11 +-
 .../grammar/generate/RandomGrammarFactory.cpp |   1 +
 .../src/grammar/generate/RandomizeGrammar.cpp |  11 +-
 .../grammar/properties/IsLanguageEmpty.cpp    |  19 +--
 .../IsLanguageGeneratingEpsilon.cpp           |  19 +--
 .../properties/NonterminalUnitRuleCycle.cpp   |  19 +--
 .../properties/NullableNonterminals.cpp       |  19 +--
 .../properties/ProductiveNonterminals.cpp     |  19 +--
 .../properties/RecursiveNonterminal.cpp       |  19 +--
 .../grammar/properties/UnreachableSymbols.cpp |  19 +--
 .../src/grammar/simplify/EpsilonRemover.cpp   |  19 +--
 .../grammar/simplify/LeftRecursionRemover.cpp |  15 ++-
 alib2algo/src/grammar/simplify/Rename.cpp     |   5 +-
 .../grammar/simplify/SimpleRulesRemover.cpp   |  19 +--
 alib2algo/src/grammar/simplify/ToCNF.cpp      |  19 +--
 alib2algo/src/grammar/simplify/ToGNF.cpp      |  19 +--
 alib2algo/src/grammar/simplify/Trim.cpp       |  19 +--
 .../simplify/UnproductiveSymbolsRemover.cpp   |  19 +--
 .../simplify/UnreachableSymbolsRemover.cpp    |  19 +--
 alib2algo/src/regexp/convert/ToAutomaton.cpp  |   5 +-
 .../regexp/convert/ToAutomatonDerivation.cpp  |   5 +-
 .../regexp/convert/ToAutomatonGlushkov.cpp    |   5 +-
 .../regexp/convert/ToAutomatonThompson.cpp    |   5 +-
 alib2algo/src/regexp/convert/ToGrammar.cpp    |   5 +-
 .../convert/ToGrammarRightRGDerivation.cpp    |   5 +-
 .../convert/ToGrammarRightRGGlushkov.cpp      |   5 +-
 .../src/regexp/properties/RegExpEmpty.cpp     |   5 +-
 .../src/regexp/properties/RegExpEpsilon.cpp   |   5 +-
 .../src/regexp/simplify/RegExpOptimize.cpp    |   5 +-
 .../src/regexp/transform/RegExpAlternate.cpp  |   5 +-
 .../regexp/transform/RegExpConcatenate.cpp    |   5 +-
 .../src/regexp/transform/RegExpDerivation.cpp |   5 +-
 .../src/regexp/transform/RegExpIntegral.cpp   |   5 +-
 .../src/regexp/transform/RegExpIterate.cpp    |   5 +-
 .../convert/ToPostfixPushdownAutomaton.cpp    |   3 +-
 .../ToPostfixPushdownAutomatonGlushkov.cpp    |   3 +-
 .../generate/RandomSubstringFactory.cpp       |   3 +-
 alib2algo/src/string/naive/ExactCompare.cpp   |   7 +-
 alib2algo/src/string/naive/ExactEqual.cpp     |   7 +-
 .../properties/BadCharacterShiftTable.cpp     |   3 +-
 .../src/string/properties/BorderArray.cpp     |   3 +-
 .../properties/GoodSuffixShiftTable.cpp       |   3 +-
 .../ReversedBadCharacterShiftTable.cpp        |   3 +-
 .../src/string/simplify/NormalizeAlphabet.cpp |   3 +-
 .../src/string/simplify/NormalizeRotation.cpp |   3 +-
 .../src/stringology/exact/BoyerMoore.cpp      |   3 +-
 .../stringology/exact/BoyerMooreHorspool.cpp  |   3 +-
 .../exact/DeadZoneUsingBadCharacterShift.cpp  |   3 +-
 .../stringology/exact/ExactFactorMatch.cpp    |   3 +-
 .../exact/ReversedBoyerMooreHorspool.cpp      |   3 +-
 .../indexing/BitParallelIndexConstruction.cpp |   3 +-
 ...CompressedBitParallelIndexConstruction.cpp |   3 +-
 .../indexing/ExactFactorOracleAutomaton.cpp   |   3 +-
 ...ctNondeterministicSubsequenceAutomaton.cpp |   3 +-
 .../indexing/ExactSubsequenceAutomaton.cpp    |   3 +-
 .../indexing/ExactSuffixAutomaton.cpp         |   3 +-
 .../NondeterministicExactFactorAutomaton.cpp  |   3 +-
 .../NondeterministicExactSuffixAutomaton.cpp  |   3 +-
 .../indexing/PositionHeapNaive.cpp            |   3 +-
 .../stringology/indexing/SuffixArrayNaive.cpp |   3 +-
 .../stringology/indexing/SuffixTrieNaive.cpp  |   3 +-
 .../matching/BNDMMatcherConstruction.cpp      |   3 +-
 .../matching/DAWGMatcherConstruction.cpp      |   3 +-
 .../matching/ExactMatchingAutomaton.cpp       |   3 +-
 .../matching/NaiveDAWGMatcherConstruction.cpp |   3 +-
 .../matching/OracleMatcherConstruction.cpp    |   3 +-
 .../matching/WideBNDMMatcherConstruction.cpp  |   3 +-
 .../stringology/properties/BackboneLength.cpp |   3 +-
 .../src/stringology/query/BNDMOccurrences.cpp |   3 +-
 .../query/BackwardDAWGMatching.cpp            |   3 +-
 .../query/BackwardOracleMatching.cpp          |   3 +-
 .../query/BitParallelismFactors.cpp           |   3 +-
 .../query/CompressedBitParallelismFactors.cpp |   3 +-
 .../stringology/query/PositionHeapFactors.cpp |   3 +-
 .../stringology/query/SuffixArrayFactors.cpp  |   3 +-
 .../stringology/query/SuffixTrieFactors.cpp   |   3 +-
 .../stringology/query/WideBNDMOccurrences.cpp |   3 +-
 alib2algo/src/tree/NormalizeTreeLabels.cpp    |   3 +-
 .../properties/BadCharacterShiftTable.cpp     |   5 +-
 .../src/tree/properties/BorderArrayNaive.cpp  |   5 +-
 .../tree/properties/ExactSubtreeRepeats.cpp   |   3 +-
 .../properties/ExactSubtreeRepeatsNaive.cpp   |   9 +-
 .../ReversedBadCharacterShiftTable.cpp        |   9 +-
 .../src/tree/properties/SubtreeJumpTable.cpp  |   9 +-
 .../parsing/DeterministicLL1Grammar.cpp       |   3 +-
 .../src/grammar/parsing/First.cpp             |  37 +++---
 .../src/grammar/parsing/Follow.cpp            |  37 +++---
 .../src/grammar/parsing/LL1ParseTable.cpp     |  19 +--
 .../src/graph/maximumflow/FordFulkerson.cpp   |   3 +-
 .../src/graph/minimumcut/FordFulkerson.cpp    |   3 +-
 .../src/graph/shortestpath/BellmanFord.cpp    |   5 +-
 .../src/graph/shortestpath/Dijkstra.cpp       |   5 +-
 .../src/graph/shortestpath/FloydWarshall.cpp  |   5 +-
 .../src/graph/sort/TopologicalSort.cpp        |   3 +-
 .../src/graph/spanningtree/Edmonds.cpp        |   3 +-
 .../src/graph/spanningtree/JarnikPrim.cpp     |   3 +-
 .../src/graph/spanningtree/Kruskal.cpp        |   3 +-
 .../src/graph/traverse/Bfs.cpp                |   9 +-
 .../src/graph/traverse/Dfs.cpp                |   9 +-
 .../indexing/ExperimentalSuffixTrie.cpp       |   3 +-
 alib2common/src/core/multipleDispatch.hpp     | 122 +++++++++++-------
 alib2common/src/introspection/Algorithms.hpp  |   2 +-
 .../src/registration/AlgoRegistration.hpp     |  23 ++++
 alib2common/test-src/core/DispatchTest.cpp    |  20 +--
 .../efficient/AllEpsilonClosure.cpp           |  13 +-
 .../properties/efficient/ReachableStates.cpp  |  13 +-
 .../properties/efficient/UsefullStates.cpp    |  13 +-
 .../efficient/EpsilonRemoverIncoming.cpp      |   9 +-
 .../efficient/EpsilonRemoverOutgoing.cpp      |   9 +-
 .../src/automaton/simplify/efficient/Trim.cpp |  13 +-
 .../efficient/UnreachableStatesRemover.cpp    |  13 +-
 .../efficient/UselessStatesRemover.cpp        |  13 +-
 alib2raw/src/string/StringToRawComposer.cpp   |   4 +-
 alib2raw/src/tree/TreeToRawComposer.cpp       |  10 +-
 .../automaton/AutomatonToStringComposer.cpp   |  19 +--
 .../src/grammar/GrammarToStringComposer.cpp   |  55 ++++----
 .../src/object/ObjectToStringComposer.cpp     |  69 +++++-----
 .../src/regexp/RegExpToStringComposer.cpp     |  11 +-
 .../src/string/StringToStringComposer.cpp     |  16 ++-
 alib2str/src/tree/TreeToStringComposer.cpp    |  20 +--
 .../src/graph/GraphToStringComposer.cpp       |  14 +-
 .../src/label/LabelToStringComposer.cpp       |  16 ++-
 .../primitive/PrimitiveToStringComposer.cpp   |  12 +-
 astat2/src/SizeStat.cpp                       |   3 +-
 203 files changed, 1123 insertions(+), 869 deletions(-)
 create mode 100644 alib2common/src/registration/AlgoRegistration.hpp

diff --git a/aaccess2/src/AutomatonAccess.cpp b/aaccess2/src/AutomatonAccess.cpp
index c4ec1590d7..a47ece4fe5 100644
--- a/aaccess2/src/AutomatonAccess.cpp
+++ b/aaccess2/src/AutomatonAccess.cpp
@@ -26,6 +26,7 @@
 #include <container/ObjectsTree.h>
 
 #include "common/AccessHelpers.hpp"
+#include <registration/AlgoRegistration.hpp>
 
 void AutomatonAccess::access ( automaton::Automaton & automaton, const AutomatonSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	dispatch ( automaton.getData ( ), settings, operation, argument );
@@ -50,7 +51,7 @@ void AutomatonAccess::access ( automaton::NFA < > & automaton, const AutomatonSe
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto AutomatonAccessNFA = AutomatonAccess::RegistratorWrapper < void, automaton::NFA < > > ( AutomatonAccess::access );
+auto AutomatonAccessNFA = registration::OverloadRegister < AutomatonAccess, void, automaton::NFA < > > ( AutomatonAccess::access );
 
 void AutomatonAccess::access ( automaton::DFA<> & automaton, const AutomatonSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == AutomatonSettings::Settings::STATES )
@@ -71,7 +72,7 @@ void AutomatonAccess::access ( automaton::DFA<> & automaton, const AutomatonSett
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto AutomatonAccessDFA = AutomatonAccess::RegistratorWrapper < void, automaton::DFA<> > ( AutomatonAccess::access );
+auto AutomatonAccessDFA = registration::OverloadRegister < AutomatonAccess, void, automaton::DFA<> > ( AutomatonAccess::access );
 
 void AutomatonAccess::access ( automaton::InputDrivenNPDA < > & automaton, const AutomatonSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == AutomatonSettings::Settings::STATES )
@@ -92,7 +93,7 @@ void AutomatonAccess::access ( automaton::InputDrivenNPDA < > & automaton, const
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto AutomatonAccessInputDrivenNPDA = AutomatonAccess::RegistratorWrapper < void, automaton::InputDrivenNPDA < > > ( AutomatonAccess::access );
+auto AutomatonAccessInputDrivenNPDA = registration::OverloadRegister < AutomatonAccess, void, automaton::InputDrivenNPDA < > > ( AutomatonAccess::access );
 
 void AutomatonAccess::access ( automaton::InputDrivenDPDA < > & automaton, const AutomatonSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == AutomatonSettings::Settings::STATES )
@@ -113,7 +114,7 @@ void AutomatonAccess::access ( automaton::InputDrivenDPDA < > & automaton, const
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto AutomatonAccessInputDrivenDPDA = AutomatonAccess::RegistratorWrapper < void, automaton::InputDrivenDPDA < > > ( AutomatonAccess::access );
+auto AutomatonAccessInputDrivenDPDA = registration::OverloadRegister < AutomatonAccess, void, automaton::InputDrivenDPDA < > > ( AutomatonAccess::access );
 
 void AutomatonAccess::access ( automaton::NPDA < > & automaton, const AutomatonSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == AutomatonSettings::Settings::STATES )
@@ -134,7 +135,7 @@ void AutomatonAccess::access ( automaton::NPDA < > & automaton, const AutomatonS
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto AutomatonAccessNPDA = AutomatonAccess::RegistratorWrapper < void, automaton::NPDA < > > ( AutomatonAccess::access );
+auto AutomatonAccessNPDA = registration::OverloadRegister < AutomatonAccess, void, automaton::NPDA < > > ( AutomatonAccess::access );
 
 void AutomatonAccess::access ( automaton::DPDA < > & automaton, const AutomatonSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == AutomatonSettings::Settings::STATES )
@@ -155,4 +156,4 @@ void AutomatonAccess::access ( automaton::DPDA < > & automaton, const AutomatonS
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto AutomatonAccessDPDA = AutomatonAccess::RegistratorWrapper < void, automaton::DPDA < > > ( AutomatonAccess::access );
+auto AutomatonAccessDPDA = registration::OverloadRegister < AutomatonAccess, void, automaton::DPDA < > > ( AutomatonAccess::access );
diff --git a/aaccess2/src/GrammarAccess.cpp b/aaccess2/src/GrammarAccess.cpp
index 3a8002921d..2704a566ca 100644
--- a/aaccess2/src/GrammarAccess.cpp
+++ b/aaccess2/src/GrammarAccess.cpp
@@ -20,6 +20,7 @@
 #include <container/ObjectsTree.h>
 
 #include "common/AccessHelpers.hpp"
+#include <registration/AlgoRegistration.hpp>
 
 void GrammarAccess::access ( grammar::Grammar & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	dispatch ( grammar.getData ( ), settings, operation, argument );
@@ -41,7 +42,7 @@ void GrammarAccess::access ( grammar::RightRG < > & grammar, const GrammarSettin
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto GrammarAccessRightRG = GrammarAccess::RegistratorWrapper < void, grammar::RightRG < > > ( GrammarAccess::access );
+auto GrammarAccessRightRG = registration::OverloadRegister < GrammarAccess, void, grammar::RightRG < > > ( GrammarAccess::access );
 
 void GrammarAccess::access ( grammar::RightLG < > & grammar, const GrammarSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == GrammarSettings::Settings::NONTERMINALS )
@@ -59,4 +60,4 @@ void GrammarAccess::access ( grammar::RightLG < > & grammar, const GrammarSettin
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto GrammarAccessRightLG = GrammarAccess::RegistratorWrapper < void, grammar::RightLG < > > ( GrammarAccess::access );
+auto GrammarAccessRightLG = registration::OverloadRegister < GrammarAccess, void, grammar::RightLG < > > ( GrammarAccess::access );
diff --git a/aaccess2/src/RegExpAccess.cpp b/aaccess2/src/RegExpAccess.cpp
index b2a8aa3113..cee1a7cd0f 100644
--- a/aaccess2/src/RegExpAccess.cpp
+++ b/aaccess2/src/RegExpAccess.cpp
@@ -24,6 +24,7 @@
 #include <container/ObjectsTree.h>
 
 #include "common/AccessHelpers.hpp"
+#include <registration/AlgoRegistration.hpp>
 
 void RegExpAccess::access ( regexp::RegExp & regexp, const RegExpSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	dispatch ( regexp.getData ( ), settings, operation, argument );
@@ -38,7 +39,7 @@ void RegExpAccess::access ( regexp::FormalRegExp < > & regexp, const RegExpSetti
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto RegExpAccessFormalRegExp = RegExpAccess::RegistratorWrapper < void, regexp::FormalRegExp < > > ( RegExpAccess::access );
+auto RegExpAccessFormalRegExp = registration::OverloadRegister < RegExpAccess, void, regexp::FormalRegExp < > > ( RegExpAccess::access );
 
 void RegExpAccess::access ( regexp::UnboundedRegExp < > & regexp, const RegExpSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == RegExpSettings::Settings::ALPHABET )
@@ -49,4 +50,4 @@ void RegExpAccess::access ( regexp::UnboundedRegExp < > & regexp, const RegExpSe
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto RegExpAccessUnboundedRegExp = RegExpAccess::RegistratorWrapper < void, regexp::UnboundedRegExp < > > ( RegExpAccess::access );
+auto RegExpAccessUnboundedRegExp = registration::OverloadRegister < RegExpAccess, void, regexp::UnboundedRegExp < > > ( RegExpAccess::access );
diff --git a/aaccess2/src/StringAccess.cpp b/aaccess2/src/StringAccess.cpp
index 217ad73a06..87a2eef0d3 100644
--- a/aaccess2/src/StringAccess.cpp
+++ b/aaccess2/src/StringAccess.cpp
@@ -20,6 +20,7 @@
 #include <container/ObjectsTree.h>
 
 #include "common/AccessHelpers.hpp"
+#include <registration/AlgoRegistration.hpp>
 
 void StringAccess::access ( string::String & string, const StringSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	dispatch ( string.getData ( ), settings, operation, argument );
@@ -35,7 +36,7 @@ void StringAccess::access ( string::LinearString < > & string, const StringSetti
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto StringAccessFormalString = StringAccess::RegistratorWrapper < void, string::LinearString < > > ( StringAccess::access );
+auto StringAccessFormalString = registration::OverloadRegister < StringAccess, void, string::LinearString < > > ( StringAccess::access );
 
 void StringAccess::access ( string::CyclicString < > & string, const StringSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == StringSettings::Settings::ALPHABET )
@@ -47,4 +48,4 @@ void StringAccess::access ( string::CyclicString < > & string, const StringSetti
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto StringAccessUnboundedString = StringAccess::RegistratorWrapper < void, string::CyclicString < > > ( StringAccess::access );
+auto StringAccessUnboundedString = registration::OverloadRegister < StringAccess, void, string::CyclicString < > > ( StringAccess::access );
diff --git a/aaccess2/src/TreeAccess.cpp b/aaccess2/src/TreeAccess.cpp
index 8ae88c8795..da006d7dde 100644
--- a/aaccess2/src/TreeAccess.cpp
+++ b/aaccess2/src/TreeAccess.cpp
@@ -22,6 +22,7 @@
 #include <container/ObjectsTree.h>
 
 #include "common/AccessHelpers.hpp"
+#include <registration/AlgoRegistration.hpp>
 
 void TreeAccess::access ( tree::Tree & tree, const TreeSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	dispatch ( tree.getData ( ), settings, operation, argument );
@@ -37,7 +38,7 @@ void TreeAccess::access ( tree::RankedTree < > & tree, const TreeSettings::Setti
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto TreeAccessRankedTree = TreeAccess::RegistratorWrapper < void, tree::RankedTree < > > ( TreeAccess::access );
+auto TreeAccessRankedTree = registration::OverloadRegister < TreeAccess, void, tree::RankedTree < > > ( TreeAccess::access );
 
 void TreeAccess::access ( tree::RankedPattern < > & tree, const TreeSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == TreeSettings::Settings::ALPHABET )
@@ -52,7 +53,7 @@ void TreeAccess::access ( tree::RankedPattern < > & tree, const TreeSettings::Se
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto TreeAccessRankedPattern = TreeAccess::RegistratorWrapper < void, tree::RankedPattern < > > ( TreeAccess::access );
+auto TreeAccessRankedPattern = registration::OverloadRegister < TreeAccess, void, tree::RankedPattern < > > ( TreeAccess::access );
 
 void TreeAccess::access ( tree::RankedNonlinearPattern < > & tree, const TreeSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == TreeSettings::Settings::ALPHABET )
@@ -70,7 +71,7 @@ void TreeAccess::access ( tree::RankedNonlinearPattern < > & tree, const TreeSet
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto TreeAccessRankedNonlinearPattern = TreeAccess::RegistratorWrapper < void, tree::RankedNonlinearPattern < > > ( TreeAccess::access );
+auto TreeAccessRankedNonlinearPattern = registration::OverloadRegister < TreeAccess, void, tree::RankedNonlinearPattern < > > ( TreeAccess::access );
 
 void TreeAccess::access ( tree::UnrankedTree < > & tree, const TreeSettings::Settings & settings, const OperationSettings::Settings & operation, std::deque < sax::Token > & argument ) {
 	if ( settings == TreeSettings::Settings::ALPHABET )
@@ -82,4 +83,4 @@ void TreeAccess::access ( tree::UnrankedTree < > & tree, const TreeSettings::Set
 	throw exception::CommonException ( "Component not available" );
 }
 
-auto TreeAccessUnrankedTree = TreeAccess::RegistratorWrapper < void, tree::UnrankedTree < > > ( TreeAccess::access );
+auto TreeAccessUnrankedTree = registration::OverloadRegister < TreeAccess, void, tree::UnrankedTree < > > ( TreeAccess::access );
diff --git a/acompare2/src/AutomatonCompare.cpp b/acompare2/src/AutomatonCompare.cpp
index f8e49fc265..32c7ae6740 100644
--- a/acompare2/src/AutomatonCompare.cpp
+++ b/acompare2/src/AutomatonCompare.cpp
@@ -6,29 +6,30 @@
  */
 
 #include "AutomatonCompare.h"
+#include <registration/AlgoRegistration.hpp>
 
-auto AutomatonCompareDFA = AutomatonCompare::RegistratorWrapper<int, automaton::DFA < >, automaton::DFA < > >(AutomatonCompare::compare);
-auto AutomatonCompareNFA = AutomatonCompare::RegistratorWrapper<int, automaton::NFA < > , automaton::NFA < > >(AutomatonCompare::compare);
-auto AutomatonCompareMultiInitialStateNFA = AutomatonCompare::RegistratorWrapper<int, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > >(AutomatonCompare::compare);
-auto AutomatonCompareEpsilonNFA = AutomatonCompare::RegistratorWrapper<int, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(AutomatonCompare::compare);
-auto AutomatonCompareExtendedNFA = AutomatonCompare::RegistratorWrapper<int, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > >(AutomatonCompare::compare);
-auto AutomatonCompareCompactNFA = AutomatonCompare::RegistratorWrapper<int, automaton::CompactNFA < >, automaton::CompactNFA < > >(AutomatonCompare::compare);
+auto AutomatonCompareDFA = registration::OverloadRegister < AutomatonCompare, int, automaton::DFA < >, automaton::DFA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareNFA = registration::OverloadRegister < AutomatonCompare, int, automaton::NFA < > , automaton::NFA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareMultiInitialStateNFA = registration::OverloadRegister < AutomatonCompare, int, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareEpsilonNFA = registration::OverloadRegister < AutomatonCompare, int, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareExtendedNFA = registration::OverloadRegister < AutomatonCompare, int, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareCompactNFA = registration::OverloadRegister < AutomatonCompare, int, automaton::CompactNFA < >, automaton::CompactNFA < > > ( AutomatonCompare::compare );
 
-auto AutomatonCompareDFTA = AutomatonCompare::RegistratorWrapper<int, automaton::DFTA < >, automaton::DFTA < > >(AutomatonCompare::compare);
-auto AutomatonCompareNFTA = AutomatonCompare::RegistratorWrapper<int, automaton::NFTA < >, automaton::NFTA < > >(AutomatonCompare::compare);
+auto AutomatonCompareDFTA = registration::OverloadRegister < AutomatonCompare, int, automaton::DFTA < >, automaton::DFTA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareNFTA = registration::OverloadRegister < AutomatonCompare, int, automaton::NFTA < >, automaton::NFTA < > > ( AutomatonCompare::compare );
 
-auto AutomatonCompareDPDA = AutomatonCompare::RegistratorWrapper<int, automaton::DPDA < >, automaton::DPDA < > >(AutomatonCompare::compare);
-auto AutomatonCompareNPDA = AutomatonCompare::RegistratorWrapper<int, automaton::NPDA < >, automaton::NPDA < > >(AutomatonCompare::compare);
-auto AutomatonCompareInputDrivenDPDA = AutomatonCompare::RegistratorWrapper<int, automaton::InputDrivenDPDA < >, automaton::InputDrivenDPDA < > >(AutomatonCompare::compare);
-auto AutomatonCompareInputDrivenNPDA = AutomatonCompare::RegistratorWrapper<int, automaton::InputDrivenNPDA < >, automaton::InputDrivenNPDA < > >(AutomatonCompare::compare);
-auto AutomatonCompareVisiblyPushdownDPDA = AutomatonCompare::RegistratorWrapper<int, automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownDPDA < > >(AutomatonCompare::compare);
-auto AutomatonCompareVisiblyPushdownNPDA = AutomatonCompare::RegistratorWrapper<int, automaton::VisiblyPushdownNPDA < >, automaton::VisiblyPushdownNPDA < > >(AutomatonCompare::compare);
-auto AutomatonCompareRealTimeHeightDeterministicDPDA = AutomatonCompare::RegistratorWrapper<int, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > >(AutomatonCompare::compare);
-auto AutomatonCompareRealTimeHeightDeterministicNPDA = AutomatonCompare::RegistratorWrapper<int, automaton::RealTimeHeightDeterministicNPDA < >, automaton::RealTimeHeightDeterministicNPDA < > >(AutomatonCompare::compare);
-auto AutomatonCompareSinglePopDPDA = AutomatonCompare::RegistratorWrapper<int, automaton::SinglePopDPDA < >, automaton::SinglePopDPDA < > >(AutomatonCompare::compare);
-auto AutomatonCompareSinglePopNPDA = AutomatonCompare::RegistratorWrapper<int, automaton::SinglePopNPDA < >, automaton::SinglePopNPDA < > >(AutomatonCompare::compare);
+auto AutomatonCompareDPDA = registration::OverloadRegister < AutomatonCompare, int, automaton::DPDA < >, automaton::DPDA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareNPDA = registration::OverloadRegister < AutomatonCompare, int, automaton::NPDA < >, automaton::NPDA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareInputDrivenDPDA = registration::OverloadRegister < AutomatonCompare, int, automaton::InputDrivenDPDA < >, automaton::InputDrivenDPDA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareInputDrivenNPDA = registration::OverloadRegister < AutomatonCompare, int, automaton::InputDrivenNPDA < >, automaton::InputDrivenNPDA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareVisiblyPushdownDPDA = registration::OverloadRegister < AutomatonCompare, int, automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownDPDA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareVisiblyPushdownNPDA = registration::OverloadRegister < AutomatonCompare, int, automaton::VisiblyPushdownNPDA < >, automaton::VisiblyPushdownNPDA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareRealTimeHeightDeterministicDPDA = registration::OverloadRegister < AutomatonCompare, int, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareRealTimeHeightDeterministicNPDA = registration::OverloadRegister < AutomatonCompare, int, automaton::RealTimeHeightDeterministicNPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareSinglePopDPDA = registration::OverloadRegister < AutomatonCompare, int, automaton::SinglePopDPDA < >, automaton::SinglePopDPDA < > > ( AutomatonCompare::compare );
+auto AutomatonCompareSinglePopNPDA = registration::OverloadRegister < AutomatonCompare, int, automaton::SinglePopNPDA < >, automaton::SinglePopNPDA < > > ( AutomatonCompare::compare );
 
-auto AutomatonCompareOneTapeDTM = AutomatonCompare::RegistratorWrapper<int, automaton::OneTapeDTM < >, automaton::OneTapeDTM < > >(AutomatonCompare::compare);
+auto AutomatonCompareOneTapeDTM = registration::OverloadRegister < AutomatonCompare, int, automaton::OneTapeDTM < >, automaton::OneTapeDTM < > > ( AutomatonCompare::compare );
 
 int AutomatonCompare::compare(const automaton::Automaton& a, const automaton::Automaton& b) {
 	return dispatch(a.getData(), b.getData());
diff --git a/acompare2/src/GrammarCompare.cpp b/acompare2/src/GrammarCompare.cpp
index 560ba1b3ac..d279838daf 100644
--- a/acompare2/src/GrammarCompare.cpp
+++ b/acompare2/src/GrammarCompare.cpp
@@ -29,6 +29,7 @@
 #include "grammar/ContextSensitive/NonContractingGrammar.h"
 #include "grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h"
 #include "grammar/Unrestricted/UnrestrictedGrammar.h"
+#include <registration/AlgoRegistration.hpp>
 
 bool GrammarCompare::testCompare(const grammar::LeftLG < > & a, const grammar::LeftLG < > & b) {
 	return  	a.getNonterminalAlphabet() == b.getNonterminalAlphabet() &&
@@ -559,22 +560,22 @@ void GrammarCompare::printCompare(const grammar::UnrestrictedGrammar < > & a, co
 	}
 }
 
-auto GrammarCompareLeftLG = GrammarCompare::RegistratorWrapper<int, grammar::LeftLG < >, grammar::LeftLG < > >(GrammarCompare::compare);
-auto GrammarCompareLeftRG = GrammarCompare::RegistratorWrapper<int, grammar::LeftRG < >, grammar::LeftRG < > >(GrammarCompare::compare);
-auto GrammarCompareRightLG = GrammarCompare::RegistratorWrapper<int, grammar::RightLG < >, grammar::RightLG < > >(GrammarCompare::compare);
-auto GrammarCompareRightRG = GrammarCompare::RegistratorWrapper<int, grammar::RightRG < >, grammar::RightRG < > >(GrammarCompare::compare);
+auto GrammarCompareLeftLG = registration::OverloadRegister < GrammarCompare, int, grammar::LeftLG < >, grammar::LeftLG < > > ( GrammarCompare::compare );
+auto GrammarCompareLeftRG = registration::OverloadRegister < GrammarCompare, int, grammar::LeftRG < >, grammar::LeftRG < > > ( GrammarCompare::compare );
+auto GrammarCompareRightLG = registration::OverloadRegister < GrammarCompare, int, grammar::RightLG < >, grammar::RightLG < > > ( GrammarCompare::compare );
+auto GrammarCompareRightRG = registration::OverloadRegister < GrammarCompare, int, grammar::RightRG < >, grammar::RightRG < > > ( GrammarCompare::compare );
 
-auto GrammarCompareLG = GrammarCompare::RegistratorWrapper<int, grammar::LG < >, grammar::LG < > >(GrammarCompare::compare);
-auto GrammarCompareCFG = GrammarCompare::RegistratorWrapper<int, grammar::CFG < >, grammar::CFG < > >(GrammarCompare::compare);
-auto GrammarCompareEpsilonFreeCFG = GrammarCompare::RegistratorWrapper<int, grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(GrammarCompare::compare);
-auto GrammarCompareCNF = GrammarCompare::RegistratorWrapper<int, grammar::CNF < >, grammar::CNF < > >(GrammarCompare::compare);
-auto GrammarCompareGNF = GrammarCompare::RegistratorWrapper<int, grammar::GNF < >, grammar::GNF < > >(GrammarCompare::compare);
-auto GrammarCompareCSG = GrammarCompare::RegistratorWrapper<int, grammar::CSG < >, grammar::CSG < > >(GrammarCompare::compare);
+auto GrammarCompareLG = registration::OverloadRegister < GrammarCompare, int, grammar::LG < >, grammar::LG < > > ( GrammarCompare::compare );
+auto GrammarCompareCFG = registration::OverloadRegister < GrammarCompare, int, grammar::CFG < >, grammar::CFG < > > ( GrammarCompare::compare );
+auto GrammarCompareEpsilonFreeCFG = registration::OverloadRegister < GrammarCompare, int, grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > > ( GrammarCompare::compare );
+auto GrammarCompareCNF = registration::OverloadRegister < GrammarCompare, int, grammar::CNF < >, grammar::CNF < > > ( GrammarCompare::compare );
+auto GrammarCompareGNF = registration::OverloadRegister < GrammarCompare, int, grammar::GNF < >, grammar::GNF < > > ( GrammarCompare::compare );
+auto GrammarCompareCSG = registration::OverloadRegister < GrammarCompare, int, grammar::CSG < >, grammar::CSG < > > ( GrammarCompare::compare );
 
-auto GrammarCompareNonContractingGrammar = GrammarCompare::RegistratorWrapper<int, grammar::NonContractingGrammar < >, grammar::NonContractingGrammar < > >(GrammarCompare::compare);
-auto GrammarCompareContextPreservingUnrestrictedGrammar = GrammarCompare::RegistratorWrapper<int, grammar::ContextPreservingUnrestrictedGrammar < >, grammar::ContextPreservingUnrestrictedGrammar < > >(GrammarCompare::compare);
+auto GrammarCompareNonContractingGrammar = registration::OverloadRegister < GrammarCompare, int, grammar::NonContractingGrammar < >, grammar::NonContractingGrammar < > > ( GrammarCompare::compare );
+auto GrammarCompareContextPreservingUnrestrictedGrammar = registration::OverloadRegister < GrammarCompare, int, grammar::ContextPreservingUnrestrictedGrammar < >, grammar::ContextPreservingUnrestrictedGrammar < > > ( GrammarCompare::compare );
 
-auto GrammarCompareUnrestrictedGrammar = GrammarCompare::RegistratorWrapper<int, grammar::UnrestrictedGrammar < >, grammar::UnrestrictedGrammar < > >(GrammarCompare::compare);
+auto GrammarCompareUnrestrictedGrammar = registration::OverloadRegister < GrammarCompare, int, grammar::UnrestrictedGrammar < >, grammar::UnrestrictedGrammar < > > ( GrammarCompare::compare );
 
 int GrammarCompare::compare(const grammar::Grammar& a, const grammar::Grammar& b) {
 	return dispatch(a.getData(), b.getData());
diff --git a/acompare2/src/StringCompare.cpp b/acompare2/src/StringCompare.cpp
index 4946e9c3aa..5919a5481e 100644
--- a/acompare2/src/StringCompare.cpp
+++ b/acompare2/src/StringCompare.cpp
@@ -9,6 +9,7 @@
 
 #include "string/CyclicString.h"
 #include "string/LinearString.h"
+#include <registration/AlgoRegistration.hpp>
 
 bool StringCompare::testCompare ( const string::LinearString < > & a, const string::LinearString < > & b ) {
 	return a.getContent ( ) == b.getContent ( ) && a.getAlphabet ( ) == b.getAlphabet ( );
@@ -72,8 +73,8 @@ void StringCompare::printCompare ( const string::LinearString < > & a, const str
 	}
 }
 
-auto StringCompareLinear = StringCompare::RegistratorWrapper < int, string::LinearString < >, string::LinearString < > > ( StringCompare::compare );
-auto StringCompareCyclic = StringCompare::RegistratorWrapper < int, string::CyclicString < >, string::CyclicString < > > ( StringCompare::compare );
+auto StringCompareLinear = registration::OverloadRegister < StringCompare, int, string::LinearString < >, string::LinearString < > > ( StringCompare::compare );
+auto StringCompareCyclic = registration::OverloadRegister < StringCompare, int, string::CyclicString < >, string::CyclicString < > > ( StringCompare::compare );
 
 int StringCompare::compare ( const string::String & a, const string::String & b ) {
 	return dispatch ( a.getData ( ), b.getData ( ) );
diff --git a/aconvert2/src/DotConverter.cpp b/aconvert2/src/DotConverter.cpp
index aa281a9f88..e7cb21094c 100644
--- a/aconvert2/src/DotConverter.cpp
+++ b/aconvert2/src/DotConverter.cpp
@@ -6,28 +6,29 @@
  */
 
 #include "DotConverter.h"
+#include <registration/AlgoRegistration.hpp>
 
 void DotConverter::convert(std::ostream& out, const automaton::Automaton& a) {
 	dispatch(out, a.getData());
 }
 
-auto DotConverterEpsilonNFA = DotConverter::RegistratorWrapper<void, automaton::EpsilonNFA < > >(DotConverter::convert);
-auto DotConverterMultiInitialStateNFA = DotConverter::RegistratorWrapper<void, automaton::MultiInitialStateNFA < >>(DotConverter::convert);
-auto DotConverterNFA = DotConverter::RegistratorWrapper<void, automaton::NFA < > >(DotConverter::convert);
-auto DotConverterDFA = DotConverter::RegistratorWrapper<void, automaton::DFA < > >(DotConverter::convert);
-auto DotConverterExtendedNFA = DotConverter::RegistratorWrapper<void, automaton::ExtendedNFA < > >(DotConverter::convert);
-auto DotConverterCompactNFA = DotConverter::RegistratorWrapper<void, automaton::CompactNFA < > >(DotConverter::convert);
-auto DotConverterNFTA = DotConverter::RegistratorWrapper<void, automaton::NFTA < > >(DotConverter::convert);
-auto DotConverterDFTA = DotConverter::RegistratorWrapper<void, automaton::DFTA < > >(DotConverter::convert);
-auto DotConverterDPDA = DotConverter::RegistratorWrapper<void, automaton::DPDA < > >(DotConverter::convert);
-auto DotConverterSinglePopDPDA = DotConverter::RegistratorWrapper<void, automaton::SinglePopDPDA < > >(DotConverter::convert);
-auto DotConverterInputDrivenDPDA = DotConverter::RegistratorWrapper<void, automaton::InputDrivenDPDA < > >(DotConverter::convert);
-auto DotConverterInputDrivenNPDA = DotConverter::RegistratorWrapper<void, automaton::InputDrivenNPDA < > >(DotConverter::convert);
-auto DotConverterVisiblyPushdownDPDA = DotConverter::RegistratorWrapper<void, automaton::VisiblyPushdownDPDA < > >(DotConverter::convert);
-auto DotConverterVisiblyPushdownNPDA = DotConverter::RegistratorWrapper<void, automaton::VisiblyPushdownNPDA < > >(DotConverter::convert);
-auto DotConverterRealTimeHeightDeterministicDPDA = DotConverter::RegistratorWrapper<void, automaton::RealTimeHeightDeterministicDPDA < > >(DotConverter::convert);
-auto DotConverterRealTimeHeightDeterministicNPDA = DotConverter::RegistratorWrapper<void, automaton::RealTimeHeightDeterministicNPDA < > >(DotConverter::convert);
-auto DotConverterNPDA = DotConverter::RegistratorWrapper<void, automaton::NPDA < > >(DotConverter::convert);
-auto DotConverterSinglePopNPDA = DotConverter::RegistratorWrapper<void, automaton::SinglePopNPDA < > >(DotConverter::convert);
-auto DotConverterOneTapeDTM = DotConverter::RegistratorWrapper<void, automaton::OneTapeDTM < > >(DotConverter::convert);
+auto DotConverterEpsilonNFA = registration::OverloadRegister < DotConverter, void, automaton::EpsilonNFA < > > ( DotConverter::convert );
+auto DotConverterMultiInitialStateNFA = registration::OverloadRegister < DotConverter, void, automaton::MultiInitialStateNFA < >> ( DotConverter::convert );
+auto DotConverterNFA = registration::OverloadRegister < DotConverter, void, automaton::NFA < > > ( DotConverter::convert );
+auto DotConverterDFA = registration::OverloadRegister < DotConverter, void, automaton::DFA < > > ( DotConverter::convert );
+auto DotConverterExtendedNFA = registration::OverloadRegister < DotConverter, void, automaton::ExtendedNFA < > > ( DotConverter::convert );
+auto DotConverterCompactNFA = registration::OverloadRegister < DotConverter, void, automaton::CompactNFA < > > ( DotConverter::convert );
+auto DotConverterNFTA = registration::OverloadRegister < DotConverter, void, automaton::NFTA < > > ( DotConverter::convert );
+auto DotConverterDFTA = registration::OverloadRegister < DotConverter, void, automaton::DFTA < > > ( DotConverter::convert );
+auto DotConverterDPDA = registration::OverloadRegister < DotConverter, void, automaton::DPDA < > > ( DotConverter::convert );
+auto DotConverterSinglePopDPDA = registration::OverloadRegister < DotConverter, void, automaton::SinglePopDPDA < > > ( DotConverter::convert );
+auto DotConverterInputDrivenDPDA = registration::OverloadRegister < DotConverter, void, automaton::InputDrivenDPDA < > > ( DotConverter::convert );
+auto DotConverterInputDrivenNPDA = registration::OverloadRegister < DotConverter, void, automaton::InputDrivenNPDA < > > ( DotConverter::convert );
+auto DotConverterVisiblyPushdownDPDA = registration::OverloadRegister < DotConverter, void, automaton::VisiblyPushdownDPDA < > > ( DotConverter::convert );
+auto DotConverterVisiblyPushdownNPDA = registration::OverloadRegister < DotConverter, void, automaton::VisiblyPushdownNPDA < > > ( DotConverter::convert );
+auto DotConverterRealTimeHeightDeterministicDPDA = registration::OverloadRegister < DotConverter, void, automaton::RealTimeHeightDeterministicDPDA < > > ( DotConverter::convert );
+auto DotConverterRealTimeHeightDeterministicNPDA = registration::OverloadRegister < DotConverter, void, automaton::RealTimeHeightDeterministicNPDA < > > ( DotConverter::convert );
+auto DotConverterNPDA = registration::OverloadRegister < DotConverter, void, automaton::NPDA < > > ( DotConverter::convert );
+auto DotConverterSinglePopNPDA = registration::OverloadRegister < DotConverter, void, automaton::SinglePopNPDA < > > ( DotConverter::convert );
+auto DotConverterOneTapeDTM = registration::OverloadRegister < DotConverter, void, automaton::OneTapeDTM < > > ( DotConverter::convert );
 
diff --git a/aconvert2/src/GasTexConverter.cpp b/aconvert2/src/GasTexConverter.cpp
index e9845d297b..7c19576782 100644
--- a/aconvert2/src/GasTexConverter.cpp
+++ b/aconvert2/src/GasTexConverter.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "GasTexConverter.h"
+#include <registration/AlgoRegistration.hpp>
 
 void GasTexConverter::printTransitionMap(const std::map<std::pair<std::string, std::string>, std::string> transitionMap, std::ostream& out) {
 	for (const auto& transition : transitionMap) {
@@ -36,23 +37,23 @@ void GasTexConverter::convert(std::ostream& out, const automaton::Automaton& a)
 	dispatch(out, a.getData());
 }
 
-auto GasTexConverterEpsilonNFA = GasTexConverter::RegistratorWrapper<void, automaton::EpsilonNFA < > >(GasTexConverter::convert);
-auto GasTexConverterMultiInitialStateNFA = GasTexConverter::RegistratorWrapper<void, automaton::MultiInitialStateNFA < > >(GasTexConverter::convert);
-auto GasTexConverterNFA = GasTexConverter::RegistratorWrapper<void, automaton::NFA < > >(GasTexConverter::convert);
-auto GasTexConverterDFA = GasTexConverter::RegistratorWrapper<void, automaton::DFA < > >(GasTexConverter::convert);
-auto GasTexConverterExtendedNFA = GasTexConverter::RegistratorWrapper<void, automaton::ExtendedNFA < > >(GasTexConverter::convert);
-auto GasTexConverterCompactNFA = GasTexConverter::RegistratorWrapper<void, automaton::CompactNFA < > >(GasTexConverter::convert);
-auto GasTexConverterNFTA = GasTexConverter::RegistratorWrapper<void, automaton::NFTA < > >(GasTexConverter::convert);
-auto GasTexConverterDFTA = GasTexConverter::RegistratorWrapper<void, automaton::DFTA < > >(GasTexConverter::convert);
-auto GasTexConverterDPDA = GasTexConverter::RegistratorWrapper<void, automaton::DPDA < > >(GasTexConverter::convert);
-auto GasTexConverterSinglePopDPDA = GasTexConverter::RegistratorWrapper<void, automaton::SinglePopDPDA < > >(GasTexConverter::convert);
-auto GasTexConverterInputDrivenDPDA = GasTexConverter::RegistratorWrapper<void, automaton::InputDrivenDPDA < > >(GasTexConverter::convert);
-auto GasTexConverterInputDrivenNPDA = GasTexConverter::RegistratorWrapper<void, automaton::InputDrivenNPDA < > >(GasTexConverter::convert);
-auto GasTexConverterVisiblyPushdownDPDA = GasTexConverter::RegistratorWrapper<void, automaton::VisiblyPushdownDPDA < > >(GasTexConverter::convert);
-auto GasTexConverterVisiblyPushdownNPDA = GasTexConverter::RegistratorWrapper<void, automaton::VisiblyPushdownNPDA < > >(GasTexConverter::convert);
-auto GasTexConverterRealTimeHeightDeterministicDPDA = GasTexConverter::RegistratorWrapper<void, automaton::RealTimeHeightDeterministicDPDA < > >(GasTexConverter::convert);
-auto GasTexConverterRealTimeHeightDeterministicNPDA = GasTexConverter::RegistratorWrapper<void, automaton::RealTimeHeightDeterministicNPDA < > >(GasTexConverter::convert);
-auto GasTexConverterNPDA = GasTexConverter::RegistratorWrapper<void, automaton::NPDA < > >(GasTexConverter::convert);
-auto GasTexConverterSinglePopNPDA = GasTexConverter::RegistratorWrapper<void, automaton::SinglePopNPDA < > >(GasTexConverter::convert);
-auto GasTexConverterOneTapeDTM = GasTexConverter::RegistratorWrapper<void, automaton::OneTapeDTM < > >(GasTexConverter::convert);
+auto GasTexConverterEpsilonNFA = registration::OverloadRegister < GasTexConverter, void, automaton::EpsilonNFA < > > ( GasTexConverter::convert );
+auto GasTexConverterMultiInitialStateNFA = registration::OverloadRegister < GasTexConverter, void, automaton::MultiInitialStateNFA < > > ( GasTexConverter::convert );
+auto GasTexConverterNFA = registration::OverloadRegister < GasTexConverter, void, automaton::NFA < > > ( GasTexConverter::convert );
+auto GasTexConverterDFA = registration::OverloadRegister < GasTexConverter, void, automaton::DFA < > > ( GasTexConverter::convert );
+auto GasTexConverterExtendedNFA = registration::OverloadRegister < GasTexConverter, void, automaton::ExtendedNFA < > > ( GasTexConverter::convert );
+auto GasTexConverterCompactNFA = registration::OverloadRegister < GasTexConverter, void, automaton::CompactNFA < > > ( GasTexConverter::convert );
+auto GasTexConverterNFTA = registration::OverloadRegister < GasTexConverter, void, automaton::NFTA < > > ( GasTexConverter::convert );
+auto GasTexConverterDFTA = registration::OverloadRegister < GasTexConverter, void, automaton::DFTA < > > ( GasTexConverter::convert );
+auto GasTexConverterDPDA = registration::OverloadRegister < GasTexConverter, void, automaton::DPDA < > > ( GasTexConverter::convert );
+auto GasTexConverterSinglePopDPDA = registration::OverloadRegister < GasTexConverter, void, automaton::SinglePopDPDA < > > ( GasTexConverter::convert );
+auto GasTexConverterInputDrivenDPDA = registration::OverloadRegister < GasTexConverter, void, automaton::InputDrivenDPDA < > > ( GasTexConverter::convert );
+auto GasTexConverterInputDrivenNPDA = registration::OverloadRegister < GasTexConverter, void, automaton::InputDrivenNPDA < > > ( GasTexConverter::convert );
+auto GasTexConverterVisiblyPushdownDPDA = registration::OverloadRegister < GasTexConverter, void, automaton::VisiblyPushdownDPDA < > > ( GasTexConverter::convert );
+auto GasTexConverterVisiblyPushdownNPDA = registration::OverloadRegister < GasTexConverter, void, automaton::VisiblyPushdownNPDA < > > ( GasTexConverter::convert );
+auto GasTexConverterRealTimeHeightDeterministicDPDA = registration::OverloadRegister < GasTexConverter, void, automaton::RealTimeHeightDeterministicDPDA < > > ( GasTexConverter::convert );
+auto GasTexConverterRealTimeHeightDeterministicNPDA = registration::OverloadRegister < GasTexConverter, void, automaton::RealTimeHeightDeterministicNPDA < > > ( GasTexConverter::convert );
+auto GasTexConverterNPDA = registration::OverloadRegister < GasTexConverter, void, automaton::NPDA < > > ( GasTexConverter::convert );
+auto GasTexConverterSinglePopNPDA = registration::OverloadRegister < GasTexConverter, void, automaton::SinglePopNPDA < > > ( GasTexConverter::convert );
+auto GasTexConverterOneTapeDTM = registration::OverloadRegister < GasTexConverter, void, automaton::OneTapeDTM < > > ( GasTexConverter::convert );
 
diff --git a/aconvert2/src/TikZConverter.cpp b/aconvert2/src/TikZConverter.cpp
index b283e06dff..f379a53e7f 100644
--- a/aconvert2/src/TikZConverter.cpp
+++ b/aconvert2/src/TikZConverter.cpp
@@ -6,28 +6,29 @@
  */
 
 #include "TikZConverter.h"
+#include <registration/AlgoRegistration.hpp>
 
 void TikZConverter::convert ( std::ostream & out, const automaton::Automaton & a ) {
 	dispatch ( out, a.getData ( ) );
 }
 
-auto TikZConverterEpsilonNFA = TikZConverter::RegistratorWrapper < void, automaton::EpsilonNFA < > > ( TikZConverter::convert );
-auto TikZConverterMultiInitialStateNFA = TikZConverter::RegistratorWrapper < void, automaton::MultiInitialStateNFA < > > ( TikZConverter::convert );
-auto TikZConverterNFA = TikZConverter::RegistratorWrapper < void, automaton::NFA < > > ( TikZConverter::convert );
-auto TikZConverterDFA = TikZConverter::RegistratorWrapper < void, automaton::DFA < > > ( TikZConverter::convert );
-auto TikZConverterExtendedNFA = TikZConverter::RegistratorWrapper < void, automaton::ExtendedNFA < > > ( TikZConverter::convert );
-auto TikZConverterCompactNFA = TikZConverter::RegistratorWrapper < void, automaton::CompactNFA < > > ( TikZConverter::convert );
-auto TikZConverterNFTA = TikZConverter::RegistratorWrapper < void, automaton::NFTA < > > ( TikZConverter::convert );
-auto TikZConverterDFTA = TikZConverter::RegistratorWrapper < void, automaton::DFTA < > > ( TikZConverter::convert );
-auto TikZConverterDPDA = TikZConverter::RegistratorWrapper < void, automaton::DPDA < > > ( TikZConverter::convert );
-auto TikZConverterSinglePopDPDA = TikZConverter::RegistratorWrapper < void, automaton::SinglePopDPDA < > > ( TikZConverter::convert );
-auto TikZConverterInputDrivenDPDA = TikZConverter::RegistratorWrapper < void, automaton::InputDrivenDPDA < > > ( TikZConverter::convert );
-auto TikZConverterInputDrivenNPDA = TikZConverter::RegistratorWrapper < void, automaton::InputDrivenNPDA < > > ( TikZConverter::convert );
-auto TikZConverterVisiblyPushdownDPDA = TikZConverter::RegistratorWrapper < void, automaton::VisiblyPushdownDPDA < > > ( TikZConverter::convert );
-auto TikZConverterVisiblyPushdownNPDA = TikZConverter::RegistratorWrapper < void, automaton::VisiblyPushdownNPDA < > > ( TikZConverter::convert );
-auto TikZConverterRealTimeHeightDeterministicDPDA = TikZConverter::RegistratorWrapper < void, automaton::RealTimeHeightDeterministicDPDA < > > ( TikZConverter::convert );
-auto TikZConverterRealTimeHeightDeterministicNPDA = TikZConverter::RegistratorWrapper < void, automaton::RealTimeHeightDeterministicNPDA < > > ( TikZConverter::convert );
-auto TikZConverterNPDA = TikZConverter::RegistratorWrapper < void, automaton::NPDA < > > ( TikZConverter::convert );
-auto TikZConverterSinglePopNPDA = TikZConverter::RegistratorWrapper < void, automaton::SinglePopNPDA < > > ( TikZConverter::convert );
-auto TikZConverterOneTapeDTM = TikZConverter::RegistratorWrapper < void, automaton::OneTapeDTM < > > ( TikZConverter::convert );
+auto TikZConverterEpsilonNFA = registration::OverloadRegister < TikZConverter, void, automaton::EpsilonNFA < > > ( TikZConverter::convert );
+auto TikZConverterMultiInitialStateNFA = registration::OverloadRegister < TikZConverter, void, automaton::MultiInitialStateNFA < > > ( TikZConverter::convert );
+auto TikZConverterNFA = registration::OverloadRegister < TikZConverter, void, automaton::NFA < > > ( TikZConverter::convert );
+auto TikZConverterDFA = registration::OverloadRegister < TikZConverter, void, automaton::DFA < > > ( TikZConverter::convert );
+auto TikZConverterExtendedNFA = registration::OverloadRegister < TikZConverter, void, automaton::ExtendedNFA < > > ( TikZConverter::convert );
+auto TikZConverterCompactNFA = registration::OverloadRegister < TikZConverter, void, automaton::CompactNFA < > > ( TikZConverter::convert );
+auto TikZConverterNFTA = registration::OverloadRegister < TikZConverter, void, automaton::NFTA < > > ( TikZConverter::convert );
+auto TikZConverterDFTA = registration::OverloadRegister < TikZConverter, void, automaton::DFTA < > > ( TikZConverter::convert );
+auto TikZConverterDPDA = registration::OverloadRegister < TikZConverter, void, automaton::DPDA < > > ( TikZConverter::convert );
+auto TikZConverterSinglePopDPDA = registration::OverloadRegister < TikZConverter, void, automaton::SinglePopDPDA < > > ( TikZConverter::convert );
+auto TikZConverterInputDrivenDPDA = registration::OverloadRegister < TikZConverter, void, automaton::InputDrivenDPDA < > > ( TikZConverter::convert );
+auto TikZConverterInputDrivenNPDA = registration::OverloadRegister < TikZConverter, void, automaton::InputDrivenNPDA < > > ( TikZConverter::convert );
+auto TikZConverterVisiblyPushdownDPDA = registration::OverloadRegister < TikZConverter, void, automaton::VisiblyPushdownDPDA < > > ( TikZConverter::convert );
+auto TikZConverterVisiblyPushdownNPDA = registration::OverloadRegister < TikZConverter, void, automaton::VisiblyPushdownNPDA < > > ( TikZConverter::convert );
+auto TikZConverterRealTimeHeightDeterministicDPDA = registration::OverloadRegister < TikZConverter, void, automaton::RealTimeHeightDeterministicDPDA < > > ( TikZConverter::convert );
+auto TikZConverterRealTimeHeightDeterministicNPDA = registration::OverloadRegister < TikZConverter, void, automaton::RealTimeHeightDeterministicNPDA < > > ( TikZConverter::convert );
+auto TikZConverterNPDA = registration::OverloadRegister < TikZConverter, void, automaton::NPDA < > > ( TikZConverter::convert );
+auto TikZConverterSinglePopNPDA = registration::OverloadRegister < TikZConverter, void, automaton::SinglePopNPDA < > > ( TikZConverter::convert );
+auto TikZConverterOneTapeDTM = registration::OverloadRegister < TikZConverter, void, automaton::OneTapeDTM < > > ( TikZConverter::convert );
 
diff --git a/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp b/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp
index d31d1e892b..1640c25357 100644
--- a/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp
+++ b/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "BoyerMooreHorspool.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -15,9 +16,9 @@ std::set < unsigned > BoyerMooreHorspool::match ( const tree::Tree & subject, co
 	return dispatch ( subject.getData ( ), pattern.getData ( ) );
 }
 
-auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarTree = BoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarTree < > > ( BoyerMooreHorspool::match );
-auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarPattern = BoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( BoyerMooreHorspool::match );
-auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = BoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( BoyerMooreHorspool::match );
+auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarTree = registration::OverloadRegister < BoyerMooreHorspool, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarTree < > > ( BoyerMooreHorspool::match );
+auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarPattern = registration::OverloadRegister < BoyerMooreHorspool, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( BoyerMooreHorspool::match );
+auto BoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = registration::OverloadRegister < BoyerMooreHorspool, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( BoyerMooreHorspool::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/DeadZoneUsingBadCharacterShiftAndBorderArray.cpp b/alib2algo/src/arbology/exact/DeadZoneUsingBadCharacterShiftAndBorderArray.cpp
index 8ef1994b84..349e93c4d8 100644
--- a/alib2algo/src/arbology/exact/DeadZoneUsingBadCharacterShiftAndBorderArray.cpp
+++ b/alib2algo/src/arbology/exact/DeadZoneUsingBadCharacterShiftAndBorderArray.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "DeadZoneUsingBadCharacterShiftAndBorderArray.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -15,10 +16,10 @@ std::set < unsigned > DeadZoneUsingBadCharacterShiftAndBorderArray::match ( cons
 	return dispatch ( subject.getData ( ), pattern.getData ( ) );
 }
 
-auto DeadZoneUsingBadCharacterShiftAndBorderArrayPrefixRankedBarTreePrefixRankedBarTree = DeadZoneUsingBadCharacterShiftAndBorderArray::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarTree < > > ( DeadZoneUsingBadCharacterShiftAndBorderArray::match );
-auto DeadZoneUsingBadCharacterShiftAndBorderArrayPrefixRankedBarTreePrefixRankedBarPattern = DeadZoneUsingBadCharacterShiftAndBorderArray::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( DeadZoneUsingBadCharacterShiftAndBorderArray::match );
-auto DeadZoneUsingBadCharacterShiftAndBorderArrayPrefixRankedTreePrefixRankedTree = DeadZoneUsingBadCharacterShiftAndBorderArray::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedTree < > > ( DeadZoneUsingBadCharacterShiftAndBorderArray::match );
-auto DeadZoneUsingBadCharacterShiftAndBorderArrayPrefixRankedTreePrefixRankedPattern = DeadZoneUsingBadCharacterShiftAndBorderArray::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( DeadZoneUsingBadCharacterShiftAndBorderArray::match );
+auto DeadZoneUsingBadCharacterShiftAndBorderArrayPrefixRankedBarTreePrefixRankedBarTree = registration::OverloadRegister < DeadZoneUsingBadCharacterShiftAndBorderArray, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarTree < > > ( DeadZoneUsingBadCharacterShiftAndBorderArray::match );
+auto DeadZoneUsingBadCharacterShiftAndBorderArrayPrefixRankedBarTreePrefixRankedBarPattern = registration::OverloadRegister < DeadZoneUsingBadCharacterShiftAndBorderArray, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( DeadZoneUsingBadCharacterShiftAndBorderArray::match );
+auto DeadZoneUsingBadCharacterShiftAndBorderArrayPrefixRankedTreePrefixRankedTree = registration::OverloadRegister < DeadZoneUsingBadCharacterShiftAndBorderArray, std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedTree < > > ( DeadZoneUsingBadCharacterShiftAndBorderArray::match );
+auto DeadZoneUsingBadCharacterShiftAndBorderArrayPrefixRankedTreePrefixRankedPattern = registration::OverloadRegister < DeadZoneUsingBadCharacterShiftAndBorderArray, std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( DeadZoneUsingBadCharacterShiftAndBorderArray::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.cpp b/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.cpp
index 28649b9ca6..b27ef0ab7c 100644
--- a/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.cpp
+++ b/alib2algo/src/arbology/exact/ExactNonlinearTreePatternAutomaton.cpp
@@ -15,6 +15,7 @@
 
 #include <deque>
 #include <alphabet/RankedSymbol.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -128,7 +129,7 @@ automaton::InputDrivenNPDA < > ExactNonlinearTreePatternAutomaton::construct ( c
 	return constructInternal ( tree, subtreeWildcard, * nonlinearVariables.begin ( ), nonlinearVariables );
 }
 
-auto ExactNonlinearTreePatternAutomatonPrefixRankedTree = ExactNonlinearTreePatternAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactNonlinearTreePatternAutomaton::construct );
+auto ExactNonlinearTreePatternAutomatonPrefixRankedTree = registration::OverloadRegister < ExactNonlinearTreePatternAutomaton, automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactNonlinearTreePatternAutomaton::construct );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
index bbb2ebdead..d6bfa10251 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
+++ b/alib2algo/src/arbology/exact/ExactPatternMatch.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ExactPatternMatch.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -15,13 +16,13 @@ std::set < unsigned > ExactPatternMatch::match ( const tree::Tree & subject, con
 	return dispatch ( subject.getData ( ), pattern.getData ( ) );
 }
 
-auto ExactPatternMatchUnrankedPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::UnrankedTree < >, tree::UnrankedPattern < > > ( ExactPatternMatch::match );
-auto ExactPatternMatchRankedPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::RankedTree < >, tree::RankedPattern < > > ( ExactPatternMatch::match );
-auto ExactPatternMatchRankedNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::RankedTree < >, tree::RankedNonlinearPattern < > > ( ExactPatternMatch::match );
-auto ExactPatternMatchPrefixRankedPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( ExactPatternMatch::match );
-auto ExactPatternMatchPrefixRankedNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern < > > ( ExactPatternMatch::match );
-auto ExactPatternMatchPrefixRankedBarPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( ExactPatternMatch::match );
-auto ExactPatternMatchPrefixRankedBarNonlinearPattern = ExactPatternMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( ExactPatternMatch::match );
+auto ExactPatternMatchUnrankedPattern = registration::OverloadRegister < ExactPatternMatch, std::set < unsigned >, tree::UnrankedTree < >, tree::UnrankedPattern < > > ( ExactPatternMatch::match );
+auto ExactPatternMatchRankedPattern = registration::OverloadRegister < ExactPatternMatch, std::set < unsigned >, tree::RankedTree < >, tree::RankedPattern < > > ( ExactPatternMatch::match );
+auto ExactPatternMatchRankedNonlinearPattern = registration::OverloadRegister < ExactPatternMatch, std::set < unsigned >, tree::RankedTree < >, tree::RankedNonlinearPattern < > > ( ExactPatternMatch::match );
+auto ExactPatternMatchPrefixRankedPattern = registration::OverloadRegister < ExactPatternMatch, std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( ExactPatternMatch::match );
+auto ExactPatternMatchPrefixRankedNonlinearPattern = registration::OverloadRegister < ExactPatternMatch, std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern < > > ( ExactPatternMatch::match );
+auto ExactPatternMatchPrefixRankedBarPattern = registration::OverloadRegister < ExactPatternMatch, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( ExactPatternMatch::match );
+auto ExactPatternMatchPrefixRankedBarNonlinearPattern = registration::OverloadRegister < ExactPatternMatch, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( ExactPatternMatch::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp
index b8cd013090..869dd5b68f 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp
+++ b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp
@@ -25,6 +25,7 @@
 
 #include <deque>
 #include <alphabet/RankedSymbol.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -38,7 +39,7 @@ automaton::InputDrivenNPDA < > ExactPatternMatchingAutomaton::construct ( const
 	return ExactSubtreeMatchingAutomaton::construct ( pattern );
 }
 
-auto ExactPatternMatchingAutomatonPrefixRankedTree = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactPatternMatchingAutomaton::construct );
+auto ExactPatternMatchingAutomatonPrefixRankedTree = registration::OverloadRegister < ExactPatternMatchingAutomaton, automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactPatternMatchingAutomaton::construct );
 
 std::vector < DefaultSymbolType > computeRHS ( const tree::PrefixRankedPattern < > & pattern, const std::vector < int > & patternSubtreeJumpTable, int i ) {
 	const std::vector < std::ranked_symbol < > > & content = pattern.getContent ( );
@@ -114,13 +115,13 @@ automaton::NPDA < > ExactPatternMatchingAutomaton::construct ( const tree::Prefi
 	return res;
 }
 
-auto ExactPatternMatchingAutomatonPrefixRankedPattern = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::NPDA < >, tree::PrefixRankedPattern < > > ( ExactPatternMatchingAutomaton::construct );
+auto ExactPatternMatchingAutomatonPrefixRankedPattern = registration::OverloadRegister < ExactPatternMatchingAutomaton, automaton::NPDA < >, tree::PrefixRankedPattern < > > ( ExactPatternMatchingAutomaton::construct );
 
 automaton::InputDrivenNPDA < > ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarTree < > & pattern ) {
 	return ExactSubtreeMatchingAutomaton::construct ( pattern );
 }
 
-auto ExactPatternMatchingAutomatonPrefixRankedBarTree = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedBarTree < > > ( ExactPatternMatchingAutomaton::construct );
+auto ExactPatternMatchingAutomatonPrefixRankedBarTree = registration::OverloadRegister < ExactPatternMatchingAutomaton, automaton::InputDrivenNPDA < >, tree::PrefixRankedBarTree < > > ( ExactPatternMatchingAutomaton::construct );
 
 automaton::VisiblyPushdownNPDA < > ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarPattern < > & pattern ) {
 	automaton::VisiblyPushdownNPDA < > res ( alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ) );
@@ -187,13 +188,13 @@ automaton::VisiblyPushdownNPDA < > ExactPatternMatchingAutomaton::construct ( co
 	return res;
 }
 
-auto ExactPatternMatchingAutomatonPrefixRankedBarPattern = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::VisiblyPushdownNPDA < >, tree::PrefixRankedBarPattern < > > ( ExactPatternMatchingAutomaton::construct );
+auto ExactPatternMatchingAutomatonPrefixRankedBarPattern = registration::OverloadRegister < ExactPatternMatchingAutomaton, automaton::VisiblyPushdownNPDA < >, tree::PrefixRankedBarPattern < > > ( ExactPatternMatchingAutomaton::construct );
 
 automaton::NFTA < > ExactPatternMatchingAutomaton::construct ( const tree::RankedTree < > & pattern ) {
 	return ExactSubtreeMatchingAutomaton::construct ( pattern );
 }
 
-auto ExactPatternMatchingAutomatonRankedTree = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::NFTA < >, tree::RankedTree < > > ( ExactPatternMatchingAutomaton::construct );
+auto ExactPatternMatchingAutomatonRankedTree = registration::OverloadRegister < ExactPatternMatchingAutomaton, automaton::NFTA < >, tree::RankedTree < > > ( ExactPatternMatchingAutomaton::construct );
 
 DefaultStateType constructRecursivePattern ( const std::tree < std::ranked_symbol < > > & node, automaton::NFTA < > & res, const std::ranked_symbol < > & subtreeWildcard, const DefaultStateType & loopState, int & nextState ) {
 	if ( node.getData ( ) == subtreeWildcard ) {
@@ -252,7 +253,7 @@ automaton::NFTA < > ExactPatternMatchingAutomaton::construct ( const tree::Ranke
 	return res;
 }
 
-auto ExactPatternMatchingAutomatonRankedPattern = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::NFTA < >, tree::RankedPattern < > > ( ExactPatternMatchingAutomaton::construct );
+auto ExactPatternMatchingAutomatonRankedPattern = registration::OverloadRegister < ExactPatternMatchingAutomaton, automaton::NFTA < >, tree::RankedPattern < > > ( ExactPatternMatchingAutomaton::construct );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ExactSubtreeAutomaton.cpp b/alib2algo/src/arbology/exact/ExactSubtreeAutomaton.cpp
index d6e8ff4c6b..afb93c4964 100644
--- a/alib2algo/src/arbology/exact/ExactSubtreeAutomaton.cpp
+++ b/alib2algo/src/arbology/exact/ExactSubtreeAutomaton.cpp
@@ -13,6 +13,7 @@
 #include <alphabet/RankedSymbol.h>
 
 #include <deque>
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -46,7 +47,7 @@ automaton::InputDrivenNPDA < > ExactSubtreeAutomaton::construct ( const tree::Pr
 	return res;
 }
 
-auto ExactSubtreeAutomatonPrefixRankedTree = ExactSubtreeAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactSubtreeAutomaton::construct );
+auto ExactSubtreeAutomatonPrefixRankedTree = registration::OverloadRegister < ExactSubtreeAutomaton, automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactSubtreeAutomaton::construct );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp b/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp
index 22d0f0bcfd..cf35207beb 100644
--- a/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp
+++ b/alib2algo/src/arbology/exact/ExactSubtreeMatch.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ExactSubtreeMatch.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -15,10 +16,10 @@ std::set < unsigned > ExactSubtreeMatch::match ( const tree::Tree & subject, con
 	return dispatch ( subject.getData ( ), pattern.getData ( ) );
 }
 
-auto ExactSubtreeMatchUnrankedTree = ExactSubtreeMatch::RegistratorWrapper < std::set < unsigned >, tree::UnrankedTree < > > ( ExactSubtreeMatch::match );
-auto ExactSubtreeMatchRankedTree = ExactSubtreeMatch::RegistratorWrapper < std::set < unsigned >, tree::RankedTree < > > ( ExactSubtreeMatch::match );
-auto ExactSubtreeMatchPrefixRankedTree = ExactSubtreeMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < > > ( ExactSubtreeMatch::match );
-auto ExactSubtreeMatchPrefixRankedBarTree = ExactSubtreeMatch::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < > > ( ExactSubtreeMatch::match );
+auto ExactSubtreeMatchUnrankedTree = registration::OverloadRegister < ExactSubtreeMatch, std::set < unsigned >, tree::UnrankedTree < > > ( ExactSubtreeMatch::match );
+auto ExactSubtreeMatchRankedTree = registration::OverloadRegister < ExactSubtreeMatch, std::set < unsigned >, tree::RankedTree < > > ( ExactSubtreeMatch::match );
+auto ExactSubtreeMatchPrefixRankedTree = registration::OverloadRegister < ExactSubtreeMatch, std::set < unsigned >, tree::PrefixRankedTree < > > ( ExactSubtreeMatch::match );
+auto ExactSubtreeMatchPrefixRankedBarTree = registration::OverloadRegister < ExactSubtreeMatch, std::set < unsigned >, tree::PrefixRankedBarTree < > > ( ExactSubtreeMatch::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp
index 58756dc272..28de78f9d5 100644
--- a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp
+++ b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp
@@ -16,6 +16,7 @@
 #include <alphabet/BottomOfTheStackSymbol.h>
 
 #include <deque>
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -49,7 +50,7 @@ automaton::InputDrivenNPDA < > ExactSubtreeMatchingAutomaton::construct ( const
 	return res;
 }
 
-auto ExactSubtreeMatchingAutomatonPrefixRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactSubtreeMatchingAutomaton::construct );
+auto ExactSubtreeMatchingAutomatonPrefixRankedTree = registration::OverloadRegister < ExactSubtreeMatchingAutomaton, automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactSubtreeMatchingAutomaton::construct );
 
 automaton::InputDrivenNPDA < > ExactSubtreeMatchingAutomaton::construct ( const tree::PrefixRankedBarTree < > & pattern ) {
 	automaton::InputDrivenNPDA < > res ( DefaultStateType ( 0 ), alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ) );
@@ -81,7 +82,7 @@ automaton::InputDrivenNPDA < > ExactSubtreeMatchingAutomaton::construct ( const
 	return res;
 }
 
-auto ExactSubtreeMatchingAutomatonPrefixRankedBarTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedBarTree < > > ( ExactSubtreeMatchingAutomaton::construct );
+auto ExactSubtreeMatchingAutomatonPrefixRankedBarTree = registration::OverloadRegister < ExactSubtreeMatchingAutomaton, automaton::InputDrivenNPDA < >, tree::PrefixRankedBarTree < > > ( ExactSubtreeMatchingAutomaton::construct );
 
 DefaultStateType constructRecursive ( const std::tree < std::ranked_symbol < > > & node, automaton::NFTA < > & res, int & nextState ) {
 	std::vector < DefaultStateType > states;
@@ -106,7 +107,7 @@ automaton::NFTA < > ExactSubtreeMatchingAutomaton::construct ( const tree::Ranke
 	return res;
 }
 
-auto ExactSubtreeMatchingAutomatonRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::NFTA < >, tree::RankedTree < > > ( ExactSubtreeMatchingAutomaton::construct );
+auto ExactSubtreeMatchingAutomatonRankedTree = registration::OverloadRegister < ExactSubtreeMatchingAutomaton, automaton::NFTA < >, tree::RankedTree < > > ( ExactSubtreeMatchingAutomaton::construct );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ExactTreePatternAutomaton.cpp b/alib2algo/src/arbology/exact/ExactTreePatternAutomaton.cpp
index be08b6bc07..9771dd8a36 100644
--- a/alib2algo/src/arbology/exact/ExactTreePatternAutomaton.cpp
+++ b/alib2algo/src/arbology/exact/ExactTreePatternAutomaton.cpp
@@ -13,6 +13,7 @@
 #include <automaton/PDA/InputDrivenNPDA.h>
 
 #include <deque>
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -59,7 +60,7 @@ automaton::InputDrivenNPDA < > ExactTreePatternAutomaton::construct ( const tree
 	return res;
 }
 
-auto ExactTreePatternAutomatonPrefixRankedTree = ExactTreePatternAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactTreePatternAutomaton::construct );
+auto ExactTreePatternAutomatonPrefixRankedTree = registration::OverloadRegister < ExactTreePatternAutomaton, automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactTreePatternAutomaton::construct );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/KnuthMorrisPratt.cpp b/alib2algo/src/arbology/exact/KnuthMorrisPratt.cpp
index 8810d77956..8ac67d5dad 100644
--- a/alib2algo/src/arbology/exact/KnuthMorrisPratt.cpp
+++ b/alib2algo/src/arbology/exact/KnuthMorrisPratt.cpp
@@ -16,6 +16,7 @@
 #include <tree/ranked/PrefixRankedPattern.h>
 
 #include <map>
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -29,7 +30,7 @@ std::set < unsigned > KnuthMorrisPratt::match ( const tree::PrefixRankedBarTree
 	return match ( subject, tree::PrefixRankedBarPattern < > ( pattern ) );
 }
 
-auto KnuthMorrisPrattPrefixRankedBarTreePrefixRankedBarTree = KnuthMorrisPratt::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarTree < > > ( KnuthMorrisPratt::match );
+auto KnuthMorrisPrattPrefixRankedBarTreePrefixRankedBarTree = registration::OverloadRegister < KnuthMorrisPratt, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarTree < > > ( KnuthMorrisPratt::match );
 
 std::set < unsigned > KnuthMorrisPratt::match ( const tree::PrefixRankedBarTree < > & subject, const tree::PrefixRankedBarPattern < > & pattern ) {
 	std::set < unsigned > occ;
@@ -72,13 +73,13 @@ std::set < unsigned > KnuthMorrisPratt::match ( const tree::PrefixRankedBarTree
 	return occ;
 }
 
-auto KnuthMorrisPrattPrefixRankedBarTreePrefixRankedBarPattern = KnuthMorrisPratt::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( KnuthMorrisPratt::match );
+auto KnuthMorrisPrattPrefixRankedBarTreePrefixRankedBarPattern = registration::OverloadRegister < KnuthMorrisPratt, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( KnuthMorrisPratt::match );
 
 std::set < unsigned > KnuthMorrisPratt::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedTree < > & pattern ) {
 	return match ( subject, tree::PrefixRankedPattern < > ( pattern ) );
 }
 
-auto KnuthMorrisPrattPrefixRankedTreePrefixRankedTree = KnuthMorrisPratt::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedTree < > > ( KnuthMorrisPratt::match );
+auto KnuthMorrisPrattPrefixRankedTreePrefixRankedTree = registration::OverloadRegister < KnuthMorrisPratt, std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedTree < > > ( KnuthMorrisPratt::match );
 
 std::set < unsigned > KnuthMorrisPratt::match ( const tree::PrefixRankedTree < > & subject, const tree::PrefixRankedPattern < > & pattern ) {
 	std::set < unsigned > occ;
@@ -121,7 +122,7 @@ std::set < unsigned > KnuthMorrisPratt::match ( const tree::PrefixRankedTree < >
 	return occ;
 }
 
-auto KnuthMorrisPrattPrefixRankedTreePrefixRankedPattern = KnuthMorrisPratt::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( KnuthMorrisPratt::match );
+auto KnuthMorrisPrattPrefixRankedTreePrefixRankedPattern = registration::OverloadRegister < KnuthMorrisPratt, std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( KnuthMorrisPratt::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp
index 8535cf8561..7df9b027dd 100644
--- a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp
+++ b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ReversedBoyerMooreHorspool.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -15,12 +16,12 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::Tree & sub
 	return dispatch ( subject.getData ( ), pattern.getData ( ) );
 }
 
-auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarTree = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarTree < > > ( ReversedBoyerMooreHorspool::match );
-auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( ReversedBoyerMooreHorspool::match );
-auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( ReversedBoyerMooreHorspool::match );
-auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedTree = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedTree < > > ( ReversedBoyerMooreHorspool::match );
-auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( ReversedBoyerMooreHorspool::match );
-auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedNonlinearPattern = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern < > > ( ReversedBoyerMooreHorspool::match );
+auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarTree = registration::OverloadRegister < ReversedBoyerMooreHorspool, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarTree < > > ( ReversedBoyerMooreHorspool::match );
+auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarPattern = registration::OverloadRegister < ReversedBoyerMooreHorspool, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarPattern < > > ( ReversedBoyerMooreHorspool::match );
+auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedBarNonlinearPattern = registration::OverloadRegister < ReversedBoyerMooreHorspool, std::set < unsigned >, tree::PrefixRankedBarTree < >, tree::PrefixRankedBarNonlinearPattern < > > ( ReversedBoyerMooreHorspool::match );
+auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedTree = registration::OverloadRegister < ReversedBoyerMooreHorspool, std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedTree < > > ( ReversedBoyerMooreHorspool::match );
+auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedPattern = registration::OverloadRegister < ReversedBoyerMooreHorspool, std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedPattern < > > ( ReversedBoyerMooreHorspool::match );
+auto ReversedBoyerMooreHorspoolPrefixRankedBarTreePrefixRankedNonlinearPattern = registration::OverloadRegister < ReversedBoyerMooreHorspool, std::set < unsigned >, tree::PrefixRankedTree < >, tree::PrefixRankedNonlinearPattern < > > ( ReversedBoyerMooreHorspool::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/arbology/indexing/CompressedBitParallelIndexConstruction.cpp b/alib2algo/src/arbology/indexing/CompressedBitParallelIndexConstruction.cpp
index e1019f6e80..d2a8d13ff5 100644
--- a/alib2algo/src/arbology/indexing/CompressedBitParallelIndexConstruction.cpp
+++ b/alib2algo/src/arbology/indexing/CompressedBitParallelIndexConstruction.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "CompressedBitParallelIndexConstruction.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -15,9 +16,9 @@ indexes::arbology::CompressedBitParallelTreeIndex < std::ranked_symbol < Default
 	return dispatch ( tree.getData ( ) );
 }
 
-auto compressedBitParallelIndexConstructionPrefixRankedTree = CompressedBitParallelIndexConstruction::RegistratorWrapper < indexes::arbology::CompressedBitParallelTreeIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedTree < > > ( CompressedBitParallelIndexConstruction::construct );
+auto compressedBitParallelIndexConstructionPrefixRankedTree = registration::OverloadRegister < CompressedBitParallelIndexConstruction, indexes::arbology::CompressedBitParallelTreeIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedTree < > > ( CompressedBitParallelIndexConstruction::construct );
 
-auto compressedBitParallelIndexConstructionPrefixRankedBarTree = CompressedBitParallelIndexConstruction::RegistratorWrapper < indexes::arbology::CompressedBitParallelTreeIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarTree < > > ( CompressedBitParallelIndexConstruction::construct );
+auto compressedBitParallelIndexConstructionPrefixRankedBarTree = registration::OverloadRegister < CompressedBitParallelIndexConstruction, indexes::arbology::CompressedBitParallelTreeIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarTree < > > ( CompressedBitParallelIndexConstruction::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/arbology/indexing/FullAndLinearIndexConstruction.cpp b/alib2algo/src/arbology/indexing/FullAndLinearIndexConstruction.cpp
index e29d4d88be..98897749f2 100644
--- a/alib2algo/src/arbology/indexing/FullAndLinearIndexConstruction.cpp
+++ b/alib2algo/src/arbology/indexing/FullAndLinearIndexConstruction.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "FullAndLinearIndexConstruction.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -15,8 +16,8 @@ indexes::arbology::FullAndLinearIndex < std::ranked_symbol < DefaultSymbolType,
 	return dispatch ( tree.getData ( ) );
 }
 
-auto fullAndLinearIndexConstructionPrefixRankedTree = FullAndLinearIndexConstruction::RegistratorWrapper < indexes::arbology::FullAndLinearIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedTree < > > ( FullAndLinearIndexConstruction::construct );
-auto fullAndLinearIndexConstructionPrefixRankedBarTree = FullAndLinearIndexConstruction::RegistratorWrapper < indexes::arbology::FullAndLinearIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarTree < > > ( FullAndLinearIndexConstruction::construct );
+auto fullAndLinearIndexConstructionPrefixRankedTree = registration::OverloadRegister < FullAndLinearIndexConstruction, indexes::arbology::FullAndLinearIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedTree < > > ( FullAndLinearIndexConstruction::construct );
+auto fullAndLinearIndexConstructionPrefixRankedBarTree = registration::OverloadRegister < FullAndLinearIndexConstruction, indexes::arbology::FullAndLinearIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarTree < > > ( FullAndLinearIndexConstruction::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/arbology/indexing/NonlinearFullAndLinearIndexConstruction.cpp b/alib2algo/src/arbology/indexing/NonlinearFullAndLinearIndexConstruction.cpp
index 63fbe97096..46521fb84f 100644
--- a/alib2algo/src/arbology/indexing/NonlinearFullAndLinearIndexConstruction.cpp
+++ b/alib2algo/src/arbology/indexing/NonlinearFullAndLinearIndexConstruction.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "NonlinearFullAndLinearIndexConstruction.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -15,8 +16,8 @@ indexes::arbology::NonlinearFullAndLinearIndex < std::ranked_symbol < DefaultSym
 	return dispatch ( tree.getData ( ) );
 }
 
-auto nonlinearFullAndLinearIndexConstructionPrefixRankedTree = NonlinearFullAndLinearIndexConstruction::RegistratorWrapper < indexes::arbology::NonlinearFullAndLinearIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedTree < > > ( NonlinearFullAndLinearIndexConstruction::construct );
-auto nonlinearFullAndLinearIndexConstructionPrefixRankedBarTree = NonlinearFullAndLinearIndexConstruction::RegistratorWrapper < indexes::arbology::NonlinearFullAndLinearIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarTree < > > ( NonlinearFullAndLinearIndexConstruction::construct );
+auto nonlinearFullAndLinearIndexConstructionPrefixRankedTree = registration::OverloadRegister < NonlinearFullAndLinearIndexConstruction, indexes::arbology::NonlinearFullAndLinearIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedTree < > > ( NonlinearFullAndLinearIndexConstruction::construct );
+auto nonlinearFullAndLinearIndexConstructionPrefixRankedBarTree = registration::OverloadRegister < NonlinearFullAndLinearIndexConstruction, indexes::arbology::NonlinearFullAndLinearIndex < std::ranked_symbol < DefaultSymbolType, DefaultRankType > >, tree::PrefixRankedBarTree < > > ( NonlinearFullAndLinearIndexConstruction::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.cpp b/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.cpp
index 1d6da3515b..54c98682af 100644
--- a/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.cpp
+++ b/alib2algo/src/arbology/query/CompressedBitParallelismPatterns.cpp
@@ -8,6 +8,7 @@
 #include "CompressedBitParallelismPatterns.h"
 
 #include <tree/ranked/PrefixRankedPattern.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -17,8 +18,8 @@ std::set < unsigned > CompressedBitParallelismPatterns::query ( const indexes::a
 	return dispatch ( compressedBitParallelIndex, tree.getData ( ) );
 }
 
-auto CompressedBitParallelismPatternsPrefixRankedPattern = CompressedBitParallelismPatterns::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedPattern < > > ( CompressedBitParallelismPatterns::query );
-auto CompressedBitParallelismPatternsPrefixRankedBarPattern = CompressedBitParallelismPatterns::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarPattern < > > ( CompressedBitParallelismPatterns::query );
+auto CompressedBitParallelismPatternsPrefixRankedPattern = registration::OverloadRegister < CompressedBitParallelismPatterns, std::set < unsigned >, tree::PrefixRankedPattern < > > ( CompressedBitParallelismPatterns::query );
+auto CompressedBitParallelismPatternsPrefixRankedBarPattern = registration::OverloadRegister < CompressedBitParallelismPatterns, std::set < unsigned >, tree::PrefixRankedBarPattern < > > ( CompressedBitParallelismPatterns::query );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/arbology/query/FullAndLinearIndexPatterns.cpp b/alib2algo/src/arbology/query/FullAndLinearIndexPatterns.cpp
index dde3553975..39f76f30ce 100644
--- a/alib2algo/src/arbology/query/FullAndLinearIndexPatterns.cpp
+++ b/alib2algo/src/arbology/query/FullAndLinearIndexPatterns.cpp
@@ -8,6 +8,7 @@
 #include "FullAndLinearIndexPatterns.h"
 
 #include <tree/ranked/PrefixRankedPattern.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -17,8 +18,8 @@ std::set < unsigned > FullAndLinearIndexPatterns::query ( const indexes::arbolog
 	return dispatch ( fullAndLinearIndex, tree.getData ( ) );
 }
 
-auto fullAndLinearIndexPatternsPrefixRankedPattern = FullAndLinearIndexPatterns::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedPattern < > > ( FullAndLinearIndexPatterns::query );
-auto fullAndLinearIndexPatternsPrefixRankedBarPattern = FullAndLinearIndexPatterns::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarPattern < > > ( FullAndLinearIndexPatterns::query );
+auto fullAndLinearIndexPatternsPrefixRankedPattern = registration::OverloadRegister < FullAndLinearIndexPatterns, std::set < unsigned >, tree::PrefixRankedPattern < > > ( FullAndLinearIndexPatterns::query );
+auto fullAndLinearIndexPatternsPrefixRankedBarPattern = registration::OverloadRegister < FullAndLinearIndexPatterns, std::set < unsigned >, tree::PrefixRankedBarPattern < > > ( FullAndLinearIndexPatterns::query );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/arbology/query/NonlinearFullAndLinearIndexPatterns.cpp b/alib2algo/src/arbology/query/NonlinearFullAndLinearIndexPatterns.cpp
index 957011a4c6..e6533ca90e 100644
--- a/alib2algo/src/arbology/query/NonlinearFullAndLinearIndexPatterns.cpp
+++ b/alib2algo/src/arbology/query/NonlinearFullAndLinearIndexPatterns.cpp
@@ -8,6 +8,7 @@
 #include "NonlinearFullAndLinearIndexPatterns.h"
 
 #include <tree/ranked/PrefixRankedPattern.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -17,8 +18,8 @@ std::set < unsigned > NonlinearFullAndLinearIndexPatterns::query ( const indexes
 	return dispatch ( nonlinearFullAndLinearIndex, tree.getData ( ) );
 }
 
-auto nonlinearFullAndLinearIndexPatternsPrefixRankedPattern = NonlinearFullAndLinearIndexPatterns::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedNonlinearPattern < > > ( NonlinearFullAndLinearIndexPatterns::query );
-auto nonlinearFullAndLinearIndexPatternsPrefixRankedBarPattern = NonlinearFullAndLinearIndexPatterns::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarNonlinearPattern < > > ( NonlinearFullAndLinearIndexPatterns::query );
+auto nonlinearFullAndLinearIndexPatternsPrefixRankedPattern = registration::OverloadRegister < NonlinearFullAndLinearIndexPatterns, std::set < unsigned >, tree::PrefixRankedNonlinearPattern < > > ( NonlinearFullAndLinearIndexPatterns::query );
+auto nonlinearFullAndLinearIndexPatternsPrefixRankedBarPattern = registration::OverloadRegister < NonlinearFullAndLinearIndexPatterns, std::set < unsigned >, tree::PrefixRankedBarNonlinearPattern < > > ( NonlinearFullAndLinearIndexPatterns::query );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/arbology/transform/BeginToEndIndex.cpp b/alib2algo/src/arbology/transform/BeginToEndIndex.cpp
index 06031a5e83..af95b051ff 100644
--- a/alib2algo/src/arbology/transform/BeginToEndIndex.cpp
+++ b/alib2algo/src/arbology/transform/BeginToEndIndex.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "BeginToEndIndex.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace arbology {
 
@@ -15,8 +16,8 @@ std::set < unsigned > BeginToEndIndex::transform ( const tree::Tree & subject, c
 	return dispatch ( subject.getData ( ), indexes );
 }
 
-auto BeginToEndIndexPrefixRankedBarTreePrefixRankedBarTree = BeginToEndIndex::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedBarTree < > > ( BeginToEndIndex::transform );
-auto BeginToEndIndexPrefixRankedBarTreePrefixRankedBarPattern = BeginToEndIndex::RegistratorWrapper < std::set < unsigned >, tree::PrefixRankedTree < > > ( BeginToEndIndex::transform );
+auto BeginToEndIndexPrefixRankedBarTreePrefixRankedBarTree = registration::OverloadRegister < BeginToEndIndex, std::set < unsigned >, tree::PrefixRankedBarTree < > > ( BeginToEndIndex::transform );
+auto BeginToEndIndexPrefixRankedBarTreePrefixRankedBarPattern = registration::OverloadRegister < BeginToEndIndex, std::set < unsigned >, tree::PrefixRankedTree < > > ( BeginToEndIndex::transform );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/convert/ToGrammar.cpp b/alib2algo/src/automaton/convert/ToGrammar.cpp
index 469033cba8..24f5d08433 100644
--- a/alib2algo/src/automaton/convert/ToGrammar.cpp
+++ b/alib2algo/src/automaton/convert/ToGrammar.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ToGrammar.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -15,9 +16,9 @@ grammar::Grammar ToGrammar::convert(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
 }
 
-auto ToGrammarNFA = ToGrammar::RegistratorWrapper<grammar::Grammar, automaton::NFA < > >(ToGrammar::convert);
+auto ToGrammarNFA = registration::OverloadRegister < ToGrammar, grammar::Grammar, automaton::NFA < > >(ToGrammar::convert);
 
-auto ToGrammarDFA = ToGrammar::RegistratorWrapper<grammar::Grammar, automaton::DFA < > >(ToGrammar::convert);
+auto ToGrammarDFA = registration::OverloadRegister < ToGrammar, grammar::Grammar, automaton::DFA < > >(ToGrammar::convert);
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp b/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp
index 2814f5ae91..5b4eeafbe7 100644
--- a/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp
+++ b/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp
@@ -10,6 +10,7 @@
 #include <common/createUnique.hpp>
 
 #include <alphabet/InitialSymbol.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -64,7 +65,7 @@ grammar::LeftRG < > ToGrammarLeftRG::convert(const automaton::NFA < > & automato
 	return grammar;
 }
 
-auto ToGrammarLeftRGNFA = ToGrammarLeftRG::RegistratorWrapper<grammar::LeftRG < >, automaton::NFA < > >(ToGrammarLeftRG::convert);
+auto ToGrammarLeftRGNFA = registration::OverloadRegister < ToGrammarLeftRG, grammar::LeftRG < >, automaton::NFA < >  >(ToGrammarLeftRG::convert);
 
 grammar::LeftRG < > ToGrammarLeftRG::convert(const automaton::DFA<>& automaton) {
 	std::map<DefaultStateType, DefaultSymbolType> nonterminalMap;
@@ -109,7 +110,7 @@ grammar::LeftRG < > ToGrammarLeftRG::convert(const automaton::DFA<>& automaton)
 	return grammar;
 }
 
-auto ToGrammarLeftRGDFA = ToGrammarLeftRG::RegistratorWrapper<grammar::LeftRG < >, automaton::DFA<>>(ToGrammarLeftRG::convert);
+auto ToGrammarLeftRGDFA = registration::OverloadRegister < ToGrammarLeftRG, grammar::LeftRG < >, automaton::DFA < > >( ToGrammarLeftRG::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp b/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp
index da14f59c2c..7b89abb3c5 100644
--- a/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp
+++ b/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp
@@ -7,6 +7,7 @@
 
 #include "ToGrammarRightRG.h"
 #include <common/createUnique.hpp>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -57,7 +58,7 @@ grammar::RightRG < > ToGrammarRightRG::convert(const automaton::NFA < > & automa
 	return grammar;
 }
 
-auto ToGrammarRightRGNFA = ToGrammarRightRG::RegistratorWrapper<grammar::RightRG < >, automaton::NFA < > >(ToGrammarRightRG::convert);
+auto ToGrammarRightRGNFA = registration::OverloadRegister < ToGrammarRightRG, grammar::RightRG < >, automaton::NFA < >  >(ToGrammarRightRG::convert);
 
 grammar::RightRG < > ToGrammarRightRG::convert(const automaton::DFA<>& automaton) {
 	std::map<DefaultStateType, DefaultSymbolType> nonterminalMap;
@@ -100,7 +101,7 @@ grammar::RightRG < > ToGrammarRightRG::convert(const automaton::DFA<>& automaton
 	return grammar;
 }
 
-auto ToGrammarRightRGDFA = ToGrammarRightRG::RegistratorWrapper<grammar::RightRG < >, automaton::DFA<>>(ToGrammarRightRG::convert);
+auto ToGrammarRightRGDFA = registration::OverloadRegister < ToGrammarRightRG, grammar::RightRG < >, automaton::DFA < > >( ToGrammarRightRG::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.cpp b/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.cpp
index 00b4a2bda6..4113c7adb1 100644
--- a/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.cpp
+++ b/alib2algo/src/automaton/convert/ToPostfixPushdownAutomaton.cpp
@@ -19,7 +19,7 @@
 #include <automaton/PDA/DPDA.h>
 #include <automaton/PDA/NPDA.h>
 
-#include <factory/XmlDataFactory.hpp>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -101,8 +101,8 @@ automaton::NPDA < > ToPostfixPushdownAutomaton::convert ( const automaton::NFTA
 	return automaton;
 }
 
-auto ToAutomatonDFTA = ToPostfixPushdownAutomaton::RegistratorWrapper < automaton::DPDA < >, automaton::DFTA < > > ( ToPostfixPushdownAutomaton::convert );
-auto ToAutomatonNFTA = ToPostfixPushdownAutomaton::RegistratorWrapper < automaton::NPDA < >, automaton::NFTA < > > ( ToPostfixPushdownAutomaton::convert );
+auto ToAutomatonDFTA = registration::OverloadRegister < ToPostfixPushdownAutomaton, automaton::DPDA < >, automaton::DFTA < > > ( ToPostfixPushdownAutomaton::convert );
+auto ToAutomatonNFTA = registration::OverloadRegister < ToPostfixPushdownAutomaton, automaton::NPDA < >, automaton::NFTA < > > ( ToPostfixPushdownAutomaton::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToRegExp.cpp b/alib2algo/src/automaton/convert/ToRegExp.cpp
index cd9f595146..70c4788526 100644
--- a/alib2algo/src/automaton/convert/ToRegExp.cpp
+++ b/alib2algo/src/automaton/convert/ToRegExp.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ToRegExp.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -15,12 +16,12 @@ regexp::RegExp ToRegExp::convert(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
 }
 
-auto ToRegExpEpsilonNFA = ToRegExp::RegistratorWrapper<regexp::RegExp, automaton::EpsilonNFA < > >(ToRegExp::convert);
-auto ToRegExpMultiInitialStateNFA = ToRegExp::RegistratorWrapper<regexp::RegExp, automaton::MultiInitialStateNFA < > >(ToRegExp::convert);
-auto ToRegExpNFA = ToRegExp::RegistratorWrapper<regexp::RegExp, automaton::NFA < > >(ToRegExp::convert);
-auto ToRegExpDFA = ToRegExp::RegistratorWrapper<regexp::RegExp, automaton::DFA<>>(ToRegExp::convert);
-auto ToRegExpExtendedNFA = ToRegExp::RegistratorWrapper<regexp::RegExp, automaton::ExtendedNFA < > >(ToRegExp::convert);
-auto ToRegExpCompactNFA = ToRegExp::RegistratorWrapper<regexp::RegExp, automaton::CompactNFA < > >(ToRegExp::convert);
+auto ToRegExpEpsilonNFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::EpsilonNFA < > > ( ToRegExp::convert );
+auto ToRegExpMultiInitialStateNFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::MultiInitialStateNFA < > > ( ToRegExp::convert );
+auto ToRegExpNFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::NFA < > > ( ToRegExp::convert );
+auto ToRegExpDFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::DFA < > > ( ToRegExp::convert );
+auto ToRegExpExtendedNFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::ExtendedNFA < > > ( ToRegExp::convert );
+auto ToRegExpCompactNFA = registration::OverloadRegister < ToRegExp, regexp::RegExp, automaton::CompactNFA < > > ( ToRegExp::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToRegExpAlgebraic.cpp b/alib2algo/src/automaton/convert/ToRegExpAlgebraic.cpp
index 0284791628..4a08999697 100644
--- a/alib2algo/src/automaton/convert/ToRegExpAlgebraic.cpp
+++ b/alib2algo/src/automaton/convert/ToRegExpAlgebraic.cpp
@@ -14,6 +14,7 @@
 
 #include "../../equations/RightRegularEquationSolver.h"
 #include <regexp/unbounded/UnboundedRegExpElements.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -50,7 +51,7 @@ regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::Epsilon
 	return solver.solve( DefaultSymbolType( automaton.getInitialState() ) );
 }
 
-auto ToRegExpAlgebraicEpsilonNFA = ToRegExpAlgebraic::RegistratorWrapper<regexp::UnboundedRegExp < >, automaton::EpsilonNFA < > >(ToRegExpAlgebraic::convert);
+auto ToRegExpAlgebraicEpsilonNFA = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, automaton::EpsilonNFA < > > ( ToRegExpAlgebraic::convert );
 
 regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::MultiInitialStateNFA < > & automaton ) {
 	equations::RightRegularEquationSolver < DefaultSymbolType > solver;
@@ -81,7 +82,7 @@ regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::MultiIn
 	return regexp::UnboundedRegExp < > { regexp::UnboundedRegExpStructure < DefaultSymbolType > ( alternation ) };
 }
 
-auto ToRegExpAlgebraicMultiInitialStateNFA = ToRegExpAlgebraic::RegistratorWrapper<regexp::UnboundedRegExp < >, automaton::MultiInitialStateNFA < > >(ToRegExpAlgebraic::convert);
+auto ToRegExpAlgebraicMultiInitialStateNFA = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, automaton::MultiInitialStateNFA < > > ( ToRegExpAlgebraic::convert );
 
 regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::NFA < > & automaton ) {
 	equations::RightRegularEquationSolver < DefaultSymbolType > solver;
@@ -104,7 +105,7 @@ regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::NFA < >
 	return solver.solve( DefaultSymbolType( automaton.getInitialState() ) );
 }
 
-auto ToRegExpAlgebraicNFA = ToRegExpAlgebraic::RegistratorWrapper<regexp::UnboundedRegExp < >, automaton::NFA < > >(ToRegExpAlgebraic::convert);
+auto ToRegExpAlgebraicNFA = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, automaton::NFA < > > ( ToRegExpAlgebraic::convert );
 
 regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::DFA < > & automaton ) {
 	equations::RightRegularEquationSolver < DefaultSymbolType > solver;
@@ -125,7 +126,7 @@ regexp::UnboundedRegExp < > ToRegExpAlgebraic::convert( const automaton::DFA < >
 	return solver.solve( DefaultSymbolType( automaton.getInitialState() ) );
 }
 
-auto ToRegExpAlgebraicDFA = ToRegExpAlgebraic::RegistratorWrapper<regexp::UnboundedRegExp < >, automaton::DFA < > >(ToRegExpAlgebraic::convert);
+auto ToRegExpAlgebraicDFA = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, automaton::DFA < > > ( ToRegExpAlgebraic::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp b/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp
index 4620ee7b60..493de15cd2 100644
--- a/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp
+++ b/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp
@@ -15,6 +15,7 @@
 #include <common/createUnique.hpp>
 
 #include <label/FinalStateLabel.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -48,12 +49,12 @@ regexp::UnboundedRegExp < > ToRegExpStateElimination::convert(const T& automaton
 	return regexp::UnboundedRegExp < > (regexp::simplify::RegExpOptimize::optimize(initialToFinalState));
 }
 
-auto ToRegExpStateEliminationEpsilonNFA = ToRegExpStateElimination::RegistratorWrapper<regexp::UnboundedRegExp < >, automaton::EpsilonNFA < > >(ToRegExpStateElimination::convert);
-auto ToRegExpStateEliminationMultiInitialStateNFA = ToRegExpStateElimination::RegistratorWrapper<regexp::UnboundedRegExp < >, automaton::MultiInitialStateNFA < > >(ToRegExpStateElimination::convert);
-auto ToRegExpStateEliminationNFA = ToRegExpStateElimination::RegistratorWrapper<regexp::UnboundedRegExp < >, automaton::NFA < > >(ToRegExpStateElimination::convert);
-auto ToRegExpStateEliminationDFA = ToRegExpStateElimination::RegistratorWrapper<regexp::UnboundedRegExp < >, automaton::DFA<>>(ToRegExpStateElimination::convert);
-auto ToRegExpStateEliminationExtendedNFA = ToRegExpStateElimination::RegistratorWrapper<regexp::UnboundedRegExp < >, automaton::ExtendedNFA < > >(ToRegExpStateElimination::convert);
-auto ToRegExpStateEliminationCompactNFA = ToRegExpStateElimination::RegistratorWrapper<regexp::UnboundedRegExp < >, automaton::CompactNFA < > >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationEpsilonNFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::EpsilonNFA < > >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationMultiInitialStateNFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::MultiInitialStateNFA < > >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationNFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::NFA < > >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationDFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::DFA < > >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationExtendedNFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::ExtendedNFA < > >(ToRegExpStateElimination::convert);
+auto ToRegExpStateEliminationCompactNFA = registration::OverloadRegister < ToRegExpStateElimination, regexp::UnboundedRegExp < >, automaton::CompactNFA < > >(ToRegExpStateElimination::convert);
 
 automaton::ExtendedNFA < > ToRegExpStateElimination::eliminateState(const automaton::ExtendedNFA < > & extendedAutomaton, const DefaultStateType& q) {
 	automaton::ExtendedNFA < > newAutomaton(extendedAutomaton.getInitialState()); // sure that q is neither initial nor final (follows from step 2 - extending ExtendedNFA)
diff --git a/alib2algo/src/automaton/determinize/Determinize.cpp b/alib2algo/src/automaton/determinize/Determinize.cpp
index cf64deb03e..cf2b32c8d8 100644
--- a/alib2algo/src/automaton/determinize/Determinize.cpp
+++ b/alib2algo/src/automaton/determinize/Determinize.cpp
@@ -20,6 +20,7 @@
 #include <automaton/TM/OneTapeDTM.h>
 #include <automaton/TA/DFTA.h>
 #include "automaton/PDA/RealTimeHeightDeterministicNPDA.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -35,37 +36,37 @@ DFA<> Determinize::determinize(const automaton::DFA<>& automaton) {
 	return automaton;
 }
 
-auto DeterminizeDFA = Determinize::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(Determinize::determinize);
+auto DeterminizeDFA = registration::OverloadRegister < Determinize, automaton::DFA<>, automaton::DFA<> >(Determinize::determinize);
 
 DPDA < > Determinize::determinize(const automaton::DPDA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeDPDA = Determinize::RegistratorWrapper<automaton::DPDA < >, automaton::DPDA < > >(Determinize::determinize);
+auto DeterminizeDPDA = registration::OverloadRegister < Determinize, automaton::DPDA < >, automaton::DPDA < > >(Determinize::determinize);
 
 SinglePopDPDA < > Determinize::determinize(const automaton::SinglePopDPDA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeSinglePopDPDA = Determinize::RegistratorWrapper<automaton::SinglePopDPDA < >, automaton::SinglePopDPDA < > >(Determinize::determinize);
+auto DeterminizeSinglePopDPDA = registration::OverloadRegister < Determinize, automaton::SinglePopDPDA < >, automaton::SinglePopDPDA < > >(Determinize::determinize);
 
 InputDrivenDPDA < > Determinize::determinize(const automaton::InputDrivenDPDA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeInputDrivenDPDA = Determinize::RegistratorWrapper<automaton::InputDrivenDPDA < >, automaton::InputDrivenDPDA < > >(Determinize::determinize);
+auto DeterminizeInputDrivenDPDA = registration::OverloadRegister < Determinize, automaton::InputDrivenDPDA < >, automaton::InputDrivenDPDA < > >(Determinize::determinize);
 
 VisiblyPushdownDPDA < > Determinize::determinize(const automaton::VisiblyPushdownDPDA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeVisiblyPushdownDPDA = Determinize::RegistratorWrapper<automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownDPDA < > >(Determinize::determinize);
+auto DeterminizeVisiblyPushdownDPDA = registration::OverloadRegister < Determinize, automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownDPDA < > >(Determinize::determinize);
 
 RealTimeHeightDeterministicDPDA < > Determinize::determinize(const automaton::RealTimeHeightDeterministicDPDA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeRealTimeHeightDeterministicDPDA = Determinize::RegistratorWrapper<automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > >(Determinize::determinize);
+auto DeterminizeRealTimeHeightDeterministicDPDA = registration::OverloadRegister < Determinize, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > >(Determinize::determinize);
 
 DPDA < > Determinize::determinize(const automaton::NPDA < > & automaton) {
 	automaton::RealTimeHeightDeterministicNPDA < > rhpda = automaton::PDAToRHPDA::convert(automaton);
@@ -73,24 +74,24 @@ DPDA < > Determinize::determinize(const automaton::NPDA < > & automaton) {
 	return automaton::RHPDAToPDA::convert(dpda);
 }
 
-auto DeterminizeNPDA = Determinize::RegistratorWrapper<automaton::DPDA < >, automaton::NPDA < > >(Determinize::determinize);
+auto DeterminizeNPDA = registration::OverloadRegister < Determinize, automaton::DPDA < >, automaton::NPDA < > >(Determinize::determinize);
 
 OneTapeDTM<> Determinize::determinize(const automaton::OneTapeDTM<>& automaton) {
 	return automaton;
 }
 
-auto DeterminizeOneTapeDTM = Determinize::RegistratorWrapper<automaton::OneTapeDTM<>, automaton::OneTapeDTM<>>(Determinize::determinize);
+auto DeterminizeOneTapeDTM = registration::OverloadRegister < Determinize, automaton::OneTapeDTM<>, automaton::OneTapeDTM < > >(Determinize::determinize);
 
 DFTA < > Determinize::determinize(const automaton::DFTA < > & automaton) {
 	return automaton;
 }
 
-auto DeterminizeDFTA = Determinize::RegistratorWrapper<automaton::DFTA < >, automaton::DFTA < > >(Determinize::determinize);
+auto DeterminizeDFTA = registration::OverloadRegister < Determinize, automaton::DFTA < >, automaton::DFTA < > >(Determinize::determinize);
 
 
 
-auto DeterminizeMultiInitialStateNFA = Determinize::RegistratorWrapper < automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > >, automaton::MultiInitialStateNFA < > > ( Determinize::determinize );
-auto DeterminizeNFA = Determinize::RegistratorWrapper < automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > >, automaton::NFA < > > ( Determinize::determinize );
+auto DeterminizeMultiInitialStateNFA = registration::OverloadRegister < Determinize, automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > >, automaton::MultiInitialStateNFA < > > ( Determinize::determinize );
+auto DeterminizeNFA = registration::OverloadRegister < Determinize, automaton::DFA < DefaultSymbolType, std::set < DefaultStateType > >, automaton::NFA < > > ( Determinize::determinize );
 
 } /* namespace determinize */
 
diff --git a/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cxx
index 315c108ae4..76a803cbaa 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cxx
+++ b/alib2algo/src/automaton/determinize/DeterminizeIDPDAPart.cxx
@@ -70,7 +70,7 @@ automaton::InputDrivenDPDA < > Determinize::determinize ( const automaton::Input
 	return res;
 }
 
-auto DeterminizeInputDrivenNPDA = Determinize::RegistratorWrapper < automaton::InputDrivenDPDA < >, automaton::InputDrivenNPDA < > > ( Determinize::determinize );
+auto DeterminizeInputDrivenNPDA = registration::OverloadRegister < Determinize, automaton::InputDrivenDPDA < >, automaton::InputDrivenNPDA < > > ( Determinize::determinize );
 
 } /* namespace determinize */
 
diff --git a/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cxx
index 6ab425afba..63b2c78a8a 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cxx
+++ b/alib2algo/src/automaton/determinize/DeterminizeNFTAPart.cxx
@@ -94,7 +94,7 @@ DFTA < > Determinize::determinize(const NFTA < > & nfta) {
 	return res;
 }
 
-auto DeterminizeNFTA = Determinize::RegistratorWrapper<automaton::DFTA < >, automaton::NFTA < > >( Determinize::determinize );
+auto DeterminizeNFTA = registration::OverloadRegister < Determinize, automaton::DFTA < >, automaton::NFTA < > > ( Determinize::determinize );
 
 } /* namespace determinize */
 
diff --git a/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx
index 3291c4d564..ea9c065ff8 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx
+++ b/alib2algo/src/automaton/determinize/DeterminizeRHDPDAPart.cxx
@@ -277,7 +277,7 @@ automaton::RealTimeHeightDeterministicDPDA < > Determinize::determinize(const au
 	return d;
 }
 
-auto DeterminizeRealTimeHeightDeterministicNPDA = Determinize::RegistratorWrapper<automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicNPDA < > >( Determinize::determinize );
+auto DeterminizeRealTimeHeightDeterministicNPDA = registration::OverloadRegister < Determinize, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( Determinize::determinize );
 
 } /* namespace determinize */
 
diff --git a/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cxx b/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cxx
index 547bd16379..031355d259 100644
--- a/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cxx
+++ b/alib2algo/src/automaton/determinize/DeterminizeVPAPart.cxx
@@ -205,7 +205,7 @@ automaton::VisiblyPushdownDPDA < > Determinize::determinize(const automaton::Vis
 	return d;
 }
 
-auto DeterminizeVisiblyPushdownNPDA = Determinize::RegistratorWrapper<automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownNPDA < > >( Determinize::determinize );
+auto DeterminizeVisiblyPushdownNPDA = registration::OverloadRegister < Determinize, automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownNPDA < > > ( Determinize::determinize );
 
 } /* namespace determinize */
 
diff --git a/alib2algo/src/automaton/generate/RandomizeAutomaton.cpp b/alib2algo/src/automaton/generate/RandomizeAutomaton.cpp
index 1e3b2d8b8d..bb02784f74 100644
--- a/alib2algo/src/automaton/generate/RandomizeAutomaton.cpp
+++ b/alib2algo/src/automaton/generate/RandomizeAutomaton.cpp
@@ -7,15 +7,16 @@
 
 #include "RandomizeAutomaton.h"
 #include <automaton/Automaton.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
 namespace generate {
 
-auto RandomizeAutomatonDFA = RandomizeAutomaton::RegistratorWrapper < automaton::DFA < >, automaton::DFA < > > ( RandomizeAutomaton::randomize );
-auto RandomizeAutomatonMultiInitialStateNFA = RandomizeAutomaton::RegistratorWrapper < automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( RandomizeAutomaton::randomize );
-auto RandomizeAutomatonNFA = RandomizeAutomaton::RegistratorWrapper < automaton::NFA < >, automaton::NFA < > > ( RandomizeAutomaton::randomize );
-auto RandomizeAutomatonEpsilonNFA = RandomizeAutomaton::RegistratorWrapper < automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( RandomizeAutomaton::randomize );
+auto RandomizeAutomatonDFA = registration::OverloadRegister < RandomizeAutomaton, automaton::DFA < >, automaton::DFA < > > ( RandomizeAutomaton::randomize );
+auto RandomizeAutomatonMultiInitialStateNFA = registration::OverloadRegister < RandomizeAutomaton, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( RandomizeAutomaton::randomize );
+auto RandomizeAutomatonNFA = registration::OverloadRegister < RandomizeAutomaton, automaton::NFA < >, automaton::NFA < > > ( RandomizeAutomaton::randomize );
+auto RandomizeAutomatonEpsilonNFA = registration::OverloadRegister < RandomizeAutomaton, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( RandomizeAutomaton::randomize );
 
 automaton::Automaton RandomizeAutomaton::randomize ( const automaton::Automaton & automaton ) {
 	return dispatch ( automaton.getData ( ) );
diff --git a/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp b/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp
index 064c765b37..78a9c1522c 100644
--- a/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp
+++ b/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "AllEpsilonClosure.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
 namespace properties {
 
-auto AllEpsilonClosureEpsilonNFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::EpsilonNFA < > >(AllEpsilonClosure::allEpsilonClosure);
-auto AllEpsilonClosureMultiInitialStateNFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::MultiInitialStateNFA < > >(AllEpsilonClosure::allEpsilonClosure);
-auto AllEpsilonClosureNFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::NFA < > >(AllEpsilonClosure::allEpsilonClosure);
-auto AllEpsilonClosureDFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::DFA<>>(AllEpsilonClosure::allEpsilonClosure);
-auto AllEpsilonClosureExtendedNFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::ExtendedNFA < > >(AllEpsilonClosure::allEpsilonClosure);
-auto AllEpsilonClosureCompactNFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::CompactNFA < > >(AllEpsilonClosure::allEpsilonClosure);
+auto AllEpsilonClosureEpsilonNFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set < DefaultStateType > >, automaton::EpsilonNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureMultiInitialStateNFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set < DefaultStateType > >, automaton::MultiInitialStateNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureNFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set < DefaultStateType > >, automaton::NFA < > > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureDFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set < DefaultStateType > >, automaton::DFA < > > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureExtendedNFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set < DefaultStateType > >, automaton::ExtendedNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureCompactNFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set < DefaultStateType > >, automaton::CompactNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
 
-std::map<DefaultStateType, std::set<DefaultStateType>> AllEpsilonClosure::allEpsilonClosure(const Automaton& automaton) {
-	return dispatch(automaton.getData());
+std::map < DefaultStateType, std::set < DefaultStateType > > AllEpsilonClosure::allEpsilonClosure ( const Automaton& automaton ) {
+	return dispatch ( automaton.getData ( ) );
 }
 
 } /* namespace properties */
diff --git a/alib2algo/src/automaton/properties/EpsilonClosure.cpp b/alib2algo/src/automaton/properties/EpsilonClosure.cpp
index 6061c6c0ad..3b7f9dfb9b 100644
--- a/alib2algo/src/automaton/properties/EpsilonClosure.cpp
+++ b/alib2algo/src/automaton/properties/EpsilonClosure.cpp
@@ -6,19 +6,20 @@
  */
 
 #include "EpsilonClosure.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
 namespace properties {
 
-auto EpsilonClosureEpsilonNFA = EpsilonClosure::RegistratorWrapper<std::set<DefaultStateType>, automaton::EpsilonNFA < > >(EpsilonClosure::epsilonClosure);
-auto EpsilonClosureMultiInitialStateNFA = EpsilonClosure::RegistratorWrapper<std::set<DefaultStateType>, automaton::MultiInitialStateNFA < > >(EpsilonClosure::epsilonClosure);
-auto EpsilonClosureNFA = EpsilonClosure::RegistratorWrapper<std::set<DefaultStateType>, automaton::NFA < > >(EpsilonClosure::epsilonClosure);
-auto EpsilonClosureDFA = EpsilonClosure::RegistratorWrapper<std::set<DefaultStateType>, automaton::DFA<>>(EpsilonClosure::epsilonClosure);
-auto EpsilonClosureExtendedNFA = EpsilonClosure::RegistratorWrapper<std::set<DefaultStateType>, automaton::ExtendedNFA < > >(EpsilonClosure::epsilonClosure);
-auto EpsilonClosureCompactNFA = EpsilonClosure::RegistratorWrapper<std::set<DefaultStateType>, automaton::CompactNFA < > >(EpsilonClosure::epsilonClosure);
+auto EpsilonClosureEpsilonNFA = registration::OverloadRegister < EpsilonClosure, std::set < DefaultStateType >, automaton::EpsilonNFA < > > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureMultiInitialStateNFA = registration::OverloadRegister < EpsilonClosure, std::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureNFA = registration::OverloadRegister < EpsilonClosure, std::set < DefaultStateType >, automaton::NFA < > > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureDFA = registration::OverloadRegister < EpsilonClosure, std::set < DefaultStateType >, automaton::DFA < > > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureExtendedNFA = registration::OverloadRegister < EpsilonClosure, std::set < DefaultStateType >, automaton::ExtendedNFA < > > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureCompactNFA = registration::OverloadRegister < EpsilonClosure, std::set < DefaultStateType >, automaton::CompactNFA < > > ( EpsilonClosure::epsilonClosure );
 
-std::set<DefaultStateType> EpsilonClosure::epsilonClosure(const Automaton& automaton, const DefaultStateType& q) {
+std::set < DefaultStateType > EpsilonClosure::epsilonClosure(const Automaton& automaton, const DefaultStateType& q) {
 	return dispatch(automaton.getData(), q);
 }
 
diff --git a/alib2algo/src/automaton/properties/ReachableStates.cpp b/alib2algo/src/automaton/properties/ReachableStates.cpp
index 5130b8555c..10657e4c92 100644
--- a/alib2algo/src/automaton/properties/ReachableStates.cpp
+++ b/alib2algo/src/automaton/properties/ReachableStates.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ReachableStates.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -15,12 +16,12 @@ std::set<DefaultStateType> ReachableStates::reachableStates(const Automaton& aut
 	return dispatch(automaton.getData());
 }
 
-auto ReachableStatesEpsilonNFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::EpsilonNFA < > >(ReachableStates::reachableStates);
-auto ReachableStatesNFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::NFA < > >(ReachableStates::reachableStates);
-auto ReachableStatesCompactNFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::CompactNFA < > >(ReachableStates::reachableStates);
-auto ReachableStatesExtendedNFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::ExtendedNFA < > >(ReachableStates::reachableStates);
-auto ReachableStatesMultiInitialStateNFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::MultiInitialStateNFA < > >(ReachableStates::reachableStates);
-auto ReachableStatesDFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::DFA<>>(ReachableStates::reachableStates);
+auto ReachableStatesEpsilonNFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::EpsilonNFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesNFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::NFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesCompactNFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::CompactNFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesExtendedNFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::ExtendedNFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesMultiInitialStateNFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesDFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::DFA < > > ( ReachableStates::reachableStates );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/automaton/properties/UsefullStates.cpp b/alib2algo/src/automaton/properties/UsefullStates.cpp
index 353e9c23a5..9d5e6f30de 100644
--- a/alib2algo/src/automaton/properties/UsefullStates.cpp
+++ b/alib2algo/src/automaton/properties/UsefullStates.cpp
@@ -6,21 +6,22 @@
  */
 
 #include "UsefullStates.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
 namespace properties {
 
-std::set<DefaultStateType> UsefullStates::usefullStates(const Automaton& automaton) {
+std::set < DefaultStateType > UsefullStates::usefullStates(const Automaton& automaton) {
 	return dispatch(automaton.getData());
 }
 
-auto UsefullStatesEpsilonNFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::EpsilonNFA < > >(UsefullStates::usefullStates);
-auto UsefullStatesNFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::NFA < > >(UsefullStates::usefullStates);
-auto UsefullStatesCompactNFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::CompactNFA < > >(UsefullStates::usefullStates);
-auto UsefullStatesExtendedNFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::ExtendedNFA < > >(UsefullStates::usefullStates);
-auto UsefullStatesMultiInitialStateNFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::MultiInitialStateNFA < > >(UsefullStates::usefullStates);
-auto UsefullStatesDFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::DFA<>>(UsefullStates::usefullStates);
+auto UsefullStatesEpsilonNFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::EpsilonNFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesNFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::NFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesCompactNFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::CompactNFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesExtendedNFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::ExtendedNFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesMultiInitialStateNFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesDFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::DFA < > > ( UsefullStates::usefullStates );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/automaton/run/Accept.cpp b/alib2algo/src/automaton/run/Accept.cpp
index 9252ee6c4c..5b76d09db4 100644
--- a/alib2algo/src/automaton/run/Accept.cpp
+++ b/alib2algo/src/automaton/run/Accept.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "Accept.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -23,15 +24,15 @@ bool Accept::accept ( const automaton::Automaton & automaton, const tree::Ranked
 	return dispatch ( automaton.getData ( ), tree );
 }
 
-auto AcceptDFALinearString = Accept::RegistratorWrapper < bool, automaton::DFA < >, string::LinearString < > > ( Accept::accept );
-auto AcceptNFALinearString = Accept::RegistratorWrapper < bool, automaton::NFA < > , string::LinearString < > > ( Accept::accept );
-auto AcceptDFTARankedTree = Accept::RegistratorWrapper < bool, automaton::DFTA < >, tree::RankedTree < > > ( Accept::accept );
-auto AcceptNFTARankedTree = Accept::RegistratorWrapper < bool, automaton::NFTA < >, tree::RankedTree < > > ( Accept::accept );
-auto AcceptInputDrivenDPDALinearString = Accept::RegistratorWrapper < bool, automaton::InputDrivenDPDA < >, string::LinearString < > > ( Accept::accept );
-auto AcceptVisiblyPushdownDPDALinearString = Accept::RegistratorWrapper < bool, automaton::VisiblyPushdownDPDA < >, string::LinearString < > > ( Accept::accept );
-auto AcceptRealTimeHeightDeterministicDPDALinearString = Accept::RegistratorWrapper < bool, automaton::RealTimeHeightDeterministicDPDA < >, string::LinearString < > > ( Accept::accept );
-auto AcceptDPDALinearString = Accept::RegistratorWrapper < bool, automaton::DPDA < >, string::LinearString < > > ( Accept::accept );
-auto AcceptNPDTALinearString = Accept::RegistratorWrapper < bool, automaton::NPDTA < >, string::LinearString < > > ( Accept::accept );
+auto AcceptDFALinearString = registration::OverloadRegister < Accept, bool, automaton::DFA < >, string::LinearString < > > ( Accept::accept );
+auto AcceptNFALinearString = registration::OverloadRegister < Accept, bool, automaton::NFA < >, string::LinearString < > > ( Accept::accept );
+auto AcceptDFTARankedTree = registration::OverloadRegister < Accept, bool, automaton::DFTA < >, tree::RankedTree < > > ( Accept::accept );
+auto AcceptNFTARankedTree = registration::OverloadRegister < Accept, bool, automaton::NFTA < >, tree::RankedTree < > > ( Accept::accept );
+auto AcceptInputDrivenDPDALinearString = registration::OverloadRegister < Accept, bool, automaton::InputDrivenDPDA < >, string::LinearString < > > ( Accept::accept );
+auto AcceptVisiblyPushdownDPDALinearString = registration::OverloadRegister < Accept, bool, automaton::VisiblyPushdownDPDA < >, string::LinearString < > > ( Accept::accept );
+auto AcceptRealTimeHeightDeterministicDPDALinearString = registration::OverloadRegister < Accept, bool, automaton::RealTimeHeightDeterministicDPDA < >, string::LinearString < > > ( Accept::accept );
+auto AcceptDPDALinearString = registration::OverloadRegister < Accept, bool, automaton::DPDA < >, string::LinearString < > > ( Accept::accept );
+auto AcceptNPDTALinearString = registration::OverloadRegister < Accept, bool, automaton::NPDTA < >, string::LinearString < > > ( Accept::accept );
 
 } /* namespace run */
 
diff --git a/alib2algo/src/automaton/run/Occurrences.cpp b/alib2algo/src/automaton/run/Occurrences.cpp
index ef7b2f57bd..2dc4ae662f 100644
--- a/alib2algo/src/automaton/run/Occurrences.cpp
+++ b/alib2algo/src/automaton/run/Occurrences.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "Occurrences.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -23,12 +24,12 @@ std::set < unsigned > Occurrences::occurrences ( const automaton::Automaton & au
 	return dispatch ( automaton.getData ( ), tree );
 }
 
-auto OccurrencesDFALinearString = Occurrences::RegistratorWrapper < std::set < unsigned >, automaton::DFA < >, string::LinearString < > > ( Occurrences::occurrences );
-auto OccurrencesDFTARankedTree = Occurrences::RegistratorWrapper < std::set < unsigned >, automaton::DFTA < >, tree::RankedTree < > > ( Occurrences::occurrences );
-auto OccurrencesInputDrivenDPDALinearString = Occurrences::RegistratorWrapper < std::set < unsigned >, automaton::InputDrivenDPDA < >, string::LinearString < > > ( Occurrences::occurrences );
-auto OccurrencesVisiblyPushdownDPDALinearString = Occurrences::RegistratorWrapper < std::set < unsigned >, automaton::VisiblyPushdownDPDA < >, string::LinearString < > > ( Occurrences::occurrences );
-auto OccurrencesRealTimeHeightDeterministicDPDALinearString = Occurrences::RegistratorWrapper < std::set < unsigned >, automaton::RealTimeHeightDeterministicDPDA < >, string::LinearString < > > ( Occurrences::occurrences );
-auto OccurrencesDPDALinearString = Occurrences::RegistratorWrapper < std::set < unsigned >, automaton::DPDA < >, string::LinearString < > > ( Occurrences::occurrences );
+auto OccurrencesDFALinearString = registration::OverloadRegister < Occurrences, std::set < unsigned >, automaton::DFA < >, string::LinearString < > > ( Occurrences::occurrences );
+auto OccurrencesDFTARankedTree = registration::OverloadRegister < Occurrences, std::set < unsigned >, automaton::DFTA < >, tree::RankedTree < > > ( Occurrences::occurrences );
+auto OccurrencesInputDrivenDPDALinearString = registration::OverloadRegister < Occurrences, std::set < unsigned >, automaton::InputDrivenDPDA < >, string::LinearString < > > ( Occurrences::occurrences );
+auto OccurrencesVisiblyPushdownDPDALinearString = registration::OverloadRegister < Occurrences, std::set < unsigned >, automaton::VisiblyPushdownDPDA < >, string::LinearString < > > ( Occurrences::occurrences );
+auto OccurrencesRealTimeHeightDeterministicDPDALinearString = registration::OverloadRegister < Occurrences, std::set < unsigned >, automaton::RealTimeHeightDeterministicDPDA < >, string::LinearString < > > ( Occurrences::occurrences );
+auto OccurrencesDPDALinearString = registration::OverloadRegister < Occurrences, std::set < unsigned >, automaton::DPDA < >, string::LinearString < > > ( Occurrences::occurrences );
 
 } /* namespace run */
 
diff --git a/alib2algo/src/automaton/run/Result.cpp b/alib2algo/src/automaton/run/Result.cpp
index f6bbb9005c..67a4f7e953 100644
--- a/alib2algo/src/automaton/run/Result.cpp
+++ b/alib2algo/src/automaton/run/Result.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "Result.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -15,12 +16,12 @@ DefaultStateType Result::result ( const automaton::Automaton & automaton, const
 	return dispatch ( automaton.getData ( ), object.getData ( ), failLabel );
 }
 
-auto ResultDFALinearString = Result::RegistratorWrapper < DefaultStateType, automaton::DFA < >, string::LinearString < > > ( Result::result );
-auto ResultDFTARankedTree = Result::RegistratorWrapper < DefaultStateType, automaton::DFTA < >, tree::RankedTree < > > ( Result::result );
-auto ResultInputDrivenDPDALinearString = Result::RegistratorWrapper < DefaultStateType, automaton::InputDrivenDPDA < >, string::LinearString < > > ( Result::result );
-auto ResultVisiblyPushdownDPDALinearString = Result::RegistratorWrapper < DefaultStateType, automaton::VisiblyPushdownDPDA < >, string::LinearString < > > ( Result::result );
-auto ResultRealTimeHeightDeterministicDPDALinearString = Result::RegistratorWrapper < DefaultStateType, automaton::RealTimeHeightDeterministicDPDA < >, string::LinearString < > > ( Result::result );
-auto ResultDPDALinearString = Result::RegistratorWrapper < DefaultStateType, automaton::DPDA < >, string::LinearString < > > ( Result::result );
+auto ResultDFALinearString = registration::OverloadRegister < Result, DefaultStateType, automaton::DFA < >, string::LinearString < > > ( Result::result );
+auto ResultDFTARankedTree = registration::OverloadRegister < Result, DefaultStateType, automaton::DFTA < >, tree::RankedTree < > > ( Result::result );
+auto ResultInputDrivenDPDALinearString = registration::OverloadRegister < Result, DefaultStateType, automaton::InputDrivenDPDA < >, string::LinearString < > > ( Result::result );
+auto ResultVisiblyPushdownDPDALinearString = registration::OverloadRegister < Result, DefaultStateType, automaton::VisiblyPushdownDPDA < >, string::LinearString < > > ( Result::result );
+auto ResultRealTimeHeightDeterministicDPDALinearString = registration::OverloadRegister < Result, DefaultStateType, automaton::RealTimeHeightDeterministicDPDA < >, string::LinearString < > > ( Result::result );
+auto ResultDPDALinearString = registration::OverloadRegister < Result, DefaultStateType, automaton::DPDA < >, string::LinearString < > > ( Result::result );
 
 } /* namespace run */
 
diff --git a/alib2algo/src/automaton/run/Translate.cpp b/alib2algo/src/automaton/run/Translate.cpp
index fb1bebc5c3..9c39641621 100644
--- a/alib2algo/src/automaton/run/Translate.cpp
+++ b/alib2algo/src/automaton/run/Translate.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "Translate.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -19,7 +20,7 @@ std::set < string::LinearString < > > Translate::translate ( const automaton::Au
 	return dispatch ( automaton.getData ( ), string );
 }
 
-auto TranslateNPDTALinearString = Translate::RegistratorWrapper < std::set < string::LinearString < > >, automaton::NPDTA < >, string::LinearString < > > ( Translate::translate );
+auto TranslateNPDTALinearString = registration::OverloadRegister < Translate, std::set < string::LinearString < > >, automaton::NPDTA < >, string::LinearString < > > ( Translate::translate );
 
 } /* namespace run */
 
diff --git a/alib2algo/src/automaton/simplify/EpsilonRemoverIncoming.cpp b/alib2algo/src/automaton/simplify/EpsilonRemoverIncoming.cpp
index 417297655e..93f04298f8 100644
--- a/alib2algo/src/automaton/simplify/EpsilonRemoverIncoming.cpp
+++ b/alib2algo/src/automaton/simplify/EpsilonRemoverIncoming.cpp
@@ -6,15 +6,16 @@
  */
 
 #include "EpsilonRemoverIncoming.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
 namespace simplify {
 
-auto EpsilonRemoverIncomingDFA = EpsilonRemoverIncoming::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(EpsilonRemoverIncoming::remove);
-auto EpsilonRemoverIncomingMultiInitialStateNFA = EpsilonRemoverIncoming::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > >(EpsilonRemoverIncoming::remove);
-auto EpsilonRemoverIncomingNFA = EpsilonRemoverIncoming::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(EpsilonRemoverIncoming::remove);
-auto EpsilonRemoverIncomingEpsilonNFA = EpsilonRemoverIncoming::RegistratorWrapper<automaton::NFA < > , automaton::EpsilonNFA < > >(EpsilonRemoverIncoming::remove);
+auto EpsilonRemoverIncomingDFA = registration::OverloadRegister < EpsilonRemoverIncoming, automaton::DFA < >, automaton::DFA < > > ( EpsilonRemoverIncoming::remove );
+auto EpsilonRemoverIncomingMultiInitialStateNFA = registration::OverloadRegister < EpsilonRemoverIncoming, automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > > ( EpsilonRemoverIncoming::remove );
+auto EpsilonRemoverIncomingNFA = registration::OverloadRegister < EpsilonRemoverIncoming, automaton::NFA < > , automaton::NFA < > > ( EpsilonRemoverIncoming::remove );
+auto EpsilonRemoverIncomingEpsilonNFA = registration::OverloadRegister < EpsilonRemoverIncoming, automaton::NFA < > , automaton::EpsilonNFA < > > ( EpsilonRemoverIncoming::remove );
 
 automaton::Automaton EpsilonRemoverIncoming::remove(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
diff --git a/alib2algo/src/automaton/simplify/EpsilonRemoverOutgoing.cpp b/alib2algo/src/automaton/simplify/EpsilonRemoverOutgoing.cpp
index 2168d23ba9..0bcb7fc489 100644
--- a/alib2algo/src/automaton/simplify/EpsilonRemoverOutgoing.cpp
+++ b/alib2algo/src/automaton/simplify/EpsilonRemoverOutgoing.cpp
@@ -6,15 +6,16 @@
  */
 
 #include "EpsilonRemoverOutgoing.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
 namespace simplify {
 
-auto EpsilonRemoverOutgoingDFA = EpsilonRemoverOutgoing::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(EpsilonRemoverOutgoing::remove);
-auto EpsilonRemoverOutgoingMultiInitialStateNFA = EpsilonRemoverOutgoing::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > >(EpsilonRemoverOutgoing::remove);
-auto EpsilonRemoverOutgoingNFA = EpsilonRemoverOutgoing::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(EpsilonRemoverOutgoing::remove);
-auto EpsilonRemoverOutgoingEpsilonNFA = EpsilonRemoverOutgoing::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::EpsilonNFA < > >(EpsilonRemoverOutgoing::remove);
+auto EpsilonRemoverOutgoingDFA = registration::OverloadRegister < EpsilonRemoverOutgoing, automaton::DFA < >, automaton::DFA < > > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingMultiInitialStateNFA = registration::OverloadRegister < EpsilonRemoverOutgoing, automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingNFA = registration::OverloadRegister < EpsilonRemoverOutgoing, automaton::NFA < > , automaton::NFA < > > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingEpsilonNFA = registration::OverloadRegister < EpsilonRemoverOutgoing, automaton::MultiInitialStateNFA < > , automaton::EpsilonNFA < > > ( EpsilonRemoverOutgoing::remove );
 
 automaton::Automaton EpsilonRemoverOutgoing::remove(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
diff --git a/alib2algo/src/automaton/simplify/Minimize.cpp b/alib2algo/src/automaton/simplify/Minimize.cpp
index 110d208996..55d2cd267f 100644
--- a/alib2algo/src/automaton/simplify/Minimize.cpp
+++ b/alib2algo/src/automaton/simplify/Minimize.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "Minimize.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -15,8 +16,8 @@ automaton::Automaton Minimize::minimize(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
 }
 
-auto MinimizeNFA = Minimize::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>( Minimize::minimize );
-auto MinimizeNFTA = Minimize::RegistratorWrapper<automaton::DFTA<>, automaton::DFTA<>>( Minimize::minimize );
+auto MinimizeNFA = registration::OverloadRegister < Minimize, automaton::DFA < >, automaton::DFA < > >( Minimize::minimize );
+auto MinimizeNFTA = registration::OverloadRegister < Minimize, automaton::DFTA < >, automaton::DFTA < > >( Minimize::minimize );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp b/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp
index 7cac064e2c..a7977c9ce4 100644
--- a/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp
+++ b/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "MinimizeBrzozowski.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -17,8 +18,8 @@ automaton::Automaton MinimizeBrzozowski::minimize(const automaton::Automaton& au
 	return res;
 }
 
-auto MinimizeBrzozowskiDFA = MinimizeBrzozowski::RegistratorWrapper<automaton::DFA < DefaultSymbolType, std::set < std::set < DefaultStateType > > >, automaton::DFA < > >(MinimizeBrzozowski::minimize);
-auto MinimizeBrzozowskiNFA = MinimizeBrzozowski::RegistratorWrapper<automaton::DFA < DefaultSymbolType, std::set < std::set < DefaultStateType > > >, automaton::NFA < > >(MinimizeBrzozowski::minimize);
+auto MinimizeBrzozowskiDFA = registration::OverloadRegister < MinimizeBrzozowski, automaton::DFA < DefaultSymbolType, std::set < std::set < DefaultStateType > > >, automaton::DFA < > > ( MinimizeBrzozowski::minimize );
+auto MinimizeBrzozowskiNFA = registration::OverloadRegister < MinimizeBrzozowski, automaton::DFA < DefaultSymbolType, std::set < std::set < DefaultStateType > > >, automaton::NFA < > > ( MinimizeBrzozowski::minimize );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/Normalize.cpp b/alib2algo/src/automaton/simplify/Normalize.cpp
index 3701f1a3ae..88a29a072c 100644
--- a/alib2algo/src/automaton/simplify/Normalize.cpp
+++ b/alib2algo/src/automaton/simplify/Normalize.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "Normalize.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -17,8 +18,8 @@ automaton::Automaton Normalize::normalize(const automaton::Automaton& automaton)
 	return res;
 }
 
-auto NormalizeDFA = Normalize::RegistratorWrapper<automaton::DFA < DefaultSymbolType, unsigned >, automaton::DFA < > >(Normalize::normalize);
-auto NormalizeDPDA = Normalize::RegistratorWrapper<automaton::DPDA < DefaultSymbolType, DefaultEpsilonType, unsigned, unsigned >, automaton::DPDA < > >(Normalize::normalize);
+auto NormalizeDFA = registration::OverloadRegister < Normalize, automaton::DFA < DefaultSymbolType, unsigned >, automaton::DFA < > > ( Normalize::normalize );
+auto NormalizeDPDA = registration::OverloadRegister < Normalize, automaton::DPDA < DefaultSymbolType, DefaultEpsilonType, unsigned, unsigned >, automaton::DPDA < > > ( Normalize::normalize );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/Rename.cpp b/alib2algo/src/automaton/simplify/Rename.cpp
index 969cfce116..7c8040a0b4 100644
--- a/alib2algo/src/automaton/simplify/Rename.cpp
+++ b/alib2algo/src/automaton/simplify/Rename.cpp
@@ -14,6 +14,7 @@
 #include <algorithm>
 #include <sstream>
 #include <iostream>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -50,7 +51,7 @@ automaton::DFA<> Rename::rename(const automaton::DFA<>& fsm) {
 	return result;
 }
 
-auto RenameDFA = Rename::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(Rename::rename);
+auto RenameDFA = registration::OverloadRegister < Rename, automaton::DFA < >, automaton::DFA < > > ( Rename::rename );
 
 automaton::DPDA < > Rename::rename(const automaton::DPDA < > & pda) {
 	int counterState = 0;
@@ -92,7 +93,7 @@ automaton::DPDA < > Rename::rename(const automaton::DPDA < > & pda) {
 	return result;
 }
 
-auto RenameDPDA = Rename::RegistratorWrapper<automaton::DPDA < >, automaton::DPDA < > >(Rename::rename);
+auto RenameDPDA = registration::OverloadRegister < Rename, automaton::DPDA < >, automaton::DPDA < > > ( Rename::rename );
 
 automaton::SinglePopDPDA < > Rename::rename(const automaton::SinglePopDPDA < > & pda) {
 	int counterState = 0;
@@ -133,7 +134,7 @@ automaton::SinglePopDPDA < > Rename::rename(const automaton::SinglePopDPDA < > &
 	return result;
 }
 
-auto RenameSinglePopDPDA = Rename::RegistratorWrapper<automaton::SinglePopDPDA < >, automaton::SinglePopDPDA < > >(Rename::rename);
+auto RenameSinglePopDPDA = registration::OverloadRegister < Rename, automaton::SinglePopDPDA < >, automaton::SinglePopDPDA < > > ( Rename::rename );
 
 automaton::InputDrivenDPDA < > Rename::rename(const automaton::InputDrivenDPDA < > & pda) {
 	int counter = 0;
@@ -182,7 +183,7 @@ automaton::InputDrivenDPDA < > Rename::rename(const automaton::InputDrivenDPDA <
 	return result;
 }
 
-auto RenameInputDrivenDPDA = Rename::RegistratorWrapper<automaton::InputDrivenDPDA < >, automaton::InputDrivenDPDA < > >(Rename::rename);
+auto RenameInputDrivenDPDA = registration::OverloadRegister < Rename, automaton::InputDrivenDPDA < >, automaton::InputDrivenDPDA < > > ( Rename::rename );
 
 automaton::VisiblyPushdownDPDA < > Rename::rename(const automaton::VisiblyPushdownDPDA < > & pda) {
 	int counterState = 0;
@@ -229,7 +230,7 @@ automaton::VisiblyPushdownDPDA < > Rename::rename(const automaton::VisiblyPushdo
 	return result;
 }
 
-auto RenameVisiblyPushdownDPDA = Rename::RegistratorWrapper<automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownDPDA < > >(Rename::rename);
+auto RenameVisiblyPushdownDPDA = registration::OverloadRegister < Rename, automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownDPDA < > > ( Rename::rename );
 
 automaton::RealTimeHeightDeterministicDPDA < > Rename::rename(const automaton::RealTimeHeightDeterministicDPDA < > & pda) {
 	int counterState = 0;
@@ -274,7 +275,7 @@ automaton::RealTimeHeightDeterministicDPDA < > Rename::rename(const automaton::R
 	return result;
 }
 
-auto RenameRealTimeHeightDeterministicDPDA = Rename::RegistratorWrapper<automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > >(Rename::rename);
+auto RenameRealTimeHeightDeterministicDPDA = registration::OverloadRegister < Rename, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( Rename::rename );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/SingleInitialState.cpp b/alib2algo/src/automaton/simplify/SingleInitialState.cpp
index 9e93035417..ae0e27ccfa 100644
--- a/alib2algo/src/automaton/simplify/SingleInitialState.cpp
+++ b/alib2algo/src/automaton/simplify/SingleInitialState.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "SingleInitialState.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -15,12 +16,12 @@ automaton::Automaton SingleInitialState::convert(const Automaton& automaton) {
 	return dispatch(automaton.getData());
 }
 
-auto SingleInitialStateMultiInitialStateNFA = SingleInitialState::RegistratorWrapper<automaton::NFA < >, automaton::MultiInitialStateNFA < > >(SingleInitialState::convert);
-auto SingleInitialStateDFA = SingleInitialState::RegistratorWrapper<automaton::DFA < >, automaton::DFA < > >(SingleInitialState::convert);
-auto SingleInitialStateEpsilonNFA = SingleInitialState::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(SingleInitialState::convert);
-auto SingleInitialStateNFA = SingleInitialState::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(SingleInitialState::convert);
-auto SingleInitialStateCompactNFA = SingleInitialState::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(SingleInitialState::convert);
-auto SingleInitialStateExtendedNFA = SingleInitialState::RegistratorWrapper<automaton::ExtendedNFA < >, automaton::ExtendedNFA < > >(SingleInitialState::convert);
+auto SingleInitialStateMultiInitialStateNFA = registration::OverloadRegister < SingleInitialState, automaton::NFA < >, automaton::MultiInitialStateNFA < > > ( SingleInitialState::convert );
+auto SingleInitialStateDFA = registration::OverloadRegister < SingleInitialState, automaton::DFA < >, automaton::DFA < > > ( SingleInitialState::convert );
+auto SingleInitialStateEpsilonNFA = registration::OverloadRegister < SingleInitialState, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( SingleInitialState::convert );
+auto SingleInitialStateNFA = registration::OverloadRegister < SingleInitialState, automaton::NFA < > , automaton::NFA < > > ( SingleInitialState::convert );
+auto SingleInitialStateCompactNFA = registration::OverloadRegister < SingleInitialState, automaton::CompactNFA < >, automaton::CompactNFA < > > ( SingleInitialState::convert );
+auto SingleInitialStateExtendedNFA = registration::OverloadRegister < SingleInitialState, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > > ( SingleInitialState::convert );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/Total.cpp b/alib2algo/src/automaton/simplify/Total.cpp
index 4dd40fe3cc..decea974d7 100644
--- a/alib2algo/src/automaton/simplify/Total.cpp
+++ b/alib2algo/src/automaton/simplify/Total.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "Total.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -15,8 +16,8 @@ automaton::Automaton Total::total(const Automaton& automaton) {
 	return dispatch(automaton.getData());
 }
 
-auto TotalNFA = Total::RegistratorWrapper<automaton::NFA < >, automaton::NFA < > >(Total::total);
-auto TotalDFA = Total::RegistratorWrapper<automaton::DFA < >, automaton::DFA < > >(Total::total);
+auto TotalNFA = registration::OverloadRegister < Total, automaton::NFA < >, automaton::NFA < > > ( Total::total );
+auto TotalDFA = registration::OverloadRegister < Total, automaton::DFA < >, automaton::DFA < > > ( Total::total );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/Trim.cpp b/alib2algo/src/automaton/simplify/Trim.cpp
index 5e639c8453..e52e9e2e00 100644
--- a/alib2algo/src/automaton/simplify/Trim.cpp
+++ b/alib2algo/src/automaton/simplify/Trim.cpp
@@ -13,18 +13,19 @@
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
 #include <automaton/TA/DFTA.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
 namespace simplify {
 
-auto TrimDFA = Trim::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(Trim::trim);
-auto TrimNFA = Trim::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(Trim::trim);
-auto TrimMultiInitialStateNFA = Trim::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > >(Trim::trim);
-auto TrimEpsilonNFA = Trim::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(Trim::trim);
-auto TrimCompactNFA = Trim::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(Trim::trim);
-auto TrimExtendedNFA = Trim::RegistratorWrapper<automaton::ExtendedNFA < >, automaton::ExtendedNFA < > >(Trim::trim);
-auto TrimDFTA = Trim::RegistratorWrapper<automaton::DFTA<>, automaton::DFTA<>>(Trim::trim);
+auto TrimDFA = registration::OverloadRegister < Trim, automaton::DFA < >, automaton::DFA < > > ( Trim::trim );
+auto TrimNFA = registration::OverloadRegister < Trim, automaton::NFA < > , automaton::NFA < > >( Trim::trim );
+auto TrimMultiInitialStateNFA = registration::OverloadRegister < Trim, automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > > ( Trim::trim );
+auto TrimEpsilonNFA = registration::OverloadRegister < Trim, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( Trim::trim );
+auto TrimCompactNFA = registration::OverloadRegister < Trim, automaton::CompactNFA < >, automaton::CompactNFA < > > ( Trim::trim );
+auto TrimExtendedNFA = registration::OverloadRegister < Trim, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > > ( Trim::trim );
+auto TrimDFTA = registration::OverloadRegister < Trim, automaton::DFTA < >, automaton::DFTA < > > ( Trim::trim );
 
 automaton::Automaton Trim::trim(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
diff --git a/alib2algo/src/automaton/simplify/UnreachableStatesRemover.cpp b/alib2algo/src/automaton/simplify/UnreachableStatesRemover.cpp
index 39701c6f10..e0050a01e0 100644
--- a/alib2algo/src/automaton/simplify/UnreachableStatesRemover.cpp
+++ b/alib2algo/src/automaton/simplify/UnreachableStatesRemover.cpp
@@ -6,18 +6,19 @@
  */
 
 #include "UnreachableStatesRemover.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
 namespace simplify {
 
-auto UnreachableStatesRemoverEpsilonNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverCompactNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverExtendedNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::ExtendedNFA < >, automaton::ExtendedNFA < > >(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverDFA = UnreachableStatesRemover::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverMultiInitialStateNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > >(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverDFTA = UnreachableStatesRemover::RegistratorWrapper<automaton::DFTA<>, automaton::DFTA < > >(UnreachableStatesRemover::remove);
+auto UnreachableStatesRemoverEpsilonNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::NFA < > , automaton::NFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverCompactNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::CompactNFA < >, automaton::CompactNFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverExtendedNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverDFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::DFA < >, automaton::DFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverMultiInitialStateNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverDFTA = registration::OverloadRegister < UnreachableStatesRemover, automaton::DFTA < >, automaton::DFTA < > > ( UnreachableStatesRemover::remove );
 
 automaton::Automaton UnreachableStatesRemover::remove(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
diff --git a/alib2algo/src/automaton/simplify/UselessStatesRemover.cpp b/alib2algo/src/automaton/simplify/UselessStatesRemover.cpp
index 8b008413f2..190ec3c0c6 100644
--- a/alib2algo/src/automaton/simplify/UselessStatesRemover.cpp
+++ b/alib2algo/src/automaton/simplify/UselessStatesRemover.cpp
@@ -6,18 +6,19 @@
  */
 
 #include "UselessStatesRemover.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
 namespace simplify {
 
-auto UselessStatesRemoverEpsilonNFA = UselessStatesRemover::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(UselessStatesRemover::remove);
-auto UselessStatesRemoverNFA = UselessStatesRemover::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(UselessStatesRemover::remove);
-auto UselessStatesRemoverCompactNFA = UselessStatesRemover::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(UselessStatesRemover::remove);
-auto UselessStatesRemoverExtendedNFA = UselessStatesRemover::RegistratorWrapper<automaton::ExtendedNFA < >, automaton::ExtendedNFA < > >(UselessStatesRemover::remove);
-auto UselessStatesRemoverDFA = UselessStatesRemover::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(UselessStatesRemover::remove);
-auto UselessStatesRemoverMultiInitialStateNFA = UselessStatesRemover::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > >(UselessStatesRemover::remove);
-auto UselessStatesRemoverDFTA = UselessStatesRemover::RegistratorWrapper<automaton::DFTA<>, automaton::DFTA<>>(UselessStatesRemover::remove);
+auto UselessStatesRemoverEpsilonNFA = registration::OverloadRegister < UselessStatesRemover, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverNFA = registration::OverloadRegister < UselessStatesRemover, automaton::NFA < > , automaton::NFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverCompactNFA = registration::OverloadRegister < UselessStatesRemover, automaton::CompactNFA < >, automaton::CompactNFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverExtendedNFA = registration::OverloadRegister < UselessStatesRemover, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverDFA = registration::OverloadRegister < UselessStatesRemover, automaton::DFA < >, automaton::DFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverMultiInitialStateNFA = registration::OverloadRegister < UselessStatesRemover, automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverDFTA = registration::OverloadRegister < UselessStatesRemover, automaton::DFTA < >, automaton::DFTA < > > ( UselessStatesRemover::remove );
 
 automaton::Automaton UselessStatesRemover::remove(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
diff --git a/alib2algo/src/automaton/transform/AutomataConcatenation.cpp b/alib2algo/src/automaton/transform/AutomataConcatenation.cpp
index 8494c78826..fb3641c2df 100644
--- a/alib2algo/src/automaton/transform/AutomataConcatenation.cpp
+++ b/alib2algo/src/automaton/transform/AutomataConcatenation.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "AutomataConcatenation.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -15,8 +16,8 @@ automaton::Automaton AutomataConcatenation::concatenation(const automaton::Autom
 	return dispatch(first.getData(), second.getData());
 }
 
-auto AutomataConcatenationNFA = AutomataConcatenation::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(AutomataConcatenation::concatenation);
-auto AutomataConcatenationDFA = AutomataConcatenation::RegistratorWrapper<automaton::NFA < > , automaton::DFA < > >(AutomataConcatenation::concatenation);
+auto AutomataConcatenationNFA = registration::OverloadRegister < AutomataConcatenation, automaton::NFA < >, automaton::NFA < > > ( AutomataConcatenation::concatenation );
+auto AutomataConcatenationDFA = registration::OverloadRegister < AutomataConcatenation, automaton::NFA < >, automaton::DFA < > > ( AutomataConcatenation::concatenation );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/transform/AutomataConcatenationEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomataConcatenationEpsilonTransition.cpp
index a4c7a46399..989e9821c7 100644
--- a/alib2algo/src/automaton/transform/AutomataConcatenationEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomataConcatenationEpsilonTransition.cpp
@@ -7,6 +7,7 @@
 
 #include "AutomataConcatenationEpsilonTransition.h"
 #include <common/DefaultStateType.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -16,9 +17,9 @@ automaton::Automaton AutomataConcatenationEpsilonTransition::concatenation(const
 	return dispatch(first.getData(), second.getData());
 }
 
-auto AutomataConcatenationEpsilonTransitionDFA = AutomataConcatenationEpsilonTransition::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::DFA < > >(AutomataConcatenationEpsilonTransition::concatenation);
-auto AutomataConcatenationEpsilonTransitionNFA = AutomataConcatenationEpsilonTransition::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::NFA < > >(AutomataConcatenationEpsilonTransition::concatenation);
-auto AutomataConcatenationEpsilonTransitionEpsilonNFA = AutomataConcatenationEpsilonTransition::RegistratorWrapper<automaton::EpsilonNFA < > , automaton::EpsilonNFA < > >(AutomataConcatenationEpsilonTransition::concatenation);
+auto AutomataConcatenationEpsilonTransitionDFA = registration::OverloadRegister < AutomataConcatenationEpsilonTransition, automaton::EpsilonNFA < >, automaton::DFA < > > ( AutomataConcatenationEpsilonTransition::concatenation );
+auto AutomataConcatenationEpsilonTransitionNFA = registration::OverloadRegister < AutomataConcatenationEpsilonTransition, automaton::EpsilonNFA < >, automaton::NFA < > > ( AutomataConcatenationEpsilonTransition::concatenation );
+auto AutomataConcatenationEpsilonTransitionEpsilonNFA = registration::OverloadRegister < AutomataConcatenationEpsilonTransition, automaton::EpsilonNFA < > , automaton::EpsilonNFA < > > ( AutomataConcatenationEpsilonTransition::concatenation );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/transform/AutomataIntersectionCartesianProduct.cpp b/alib2algo/src/automaton/transform/AutomataIntersectionCartesianProduct.cpp
index 23641c1250..f5feba0822 100644
--- a/alib2algo/src/automaton/transform/AutomataIntersectionCartesianProduct.cpp
+++ b/alib2algo/src/automaton/transform/AutomataIntersectionCartesianProduct.cpp
@@ -7,6 +7,7 @@
 
 #include "AutomataIntersectionCartesianProduct.h"
 #include <common/DefaultStatesPairType.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -18,8 +19,8 @@ automaton::Automaton AutomataIntersectionCartesianProduct::intersection(const au
 	return res;
 }
 
-auto AutomataIntersectionCartesianProductDFA = AutomataIntersectionCartesianProduct::RegistratorWrapper<automaton::DFA < DefaultSymbolType, std::pair < DefaultStateType, DefaultStateType > >, automaton::DFA < > >(AutomataIntersectionCartesianProduct::intersection);
-auto AutomataIntersectionCartesianProductNFA = AutomataIntersectionCartesianProduct::RegistratorWrapper<automaton::NFA < DefaultSymbolType, std::pair < DefaultStateType, DefaultStateType > >, automaton::NFA < > >(AutomataIntersectionCartesianProduct::intersection);
+auto AutomataIntersectionCartesianProductDFA = registration::OverloadRegister < AutomataIntersectionCartesianProduct, automaton::DFA < DefaultSymbolType, std::pair < DefaultStateType, DefaultStateType > >, automaton::DFA < > > ( AutomataIntersectionCartesianProduct::intersection );
+auto AutomataIntersectionCartesianProductNFA = registration::OverloadRegister < AutomataIntersectionCartesianProduct, automaton::NFA < DefaultSymbolType, std::pair < DefaultStateType, DefaultStateType > >, automaton::NFA < > > ( AutomataIntersectionCartesianProduct::intersection );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/transform/AutomataUnionCartesianProduct.cpp b/alib2algo/src/automaton/transform/AutomataUnionCartesianProduct.cpp
index b1a7e17486..901d836686 100644
--- a/alib2algo/src/automaton/transform/AutomataUnionCartesianProduct.cpp
+++ b/alib2algo/src/automaton/transform/AutomataUnionCartesianProduct.cpp
@@ -8,6 +8,7 @@
 #include "AutomataUnionCartesianProduct.h"
 #include <exception/CommonException.h>
 #include <common/DefaultStatesPairType.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -19,8 +20,8 @@ automaton::Automaton AutomataUnionCartesianProduct::unification(const automaton:
 	return res;
 }
 
-auto AutomataUnionCartesianProductDFA = AutomataUnionCartesianProduct::RegistratorWrapper<automaton::DFA < DefaultSymbolType, std::pair < DefaultStateType, DefaultStateType > >, automaton::DFA < > >(AutomataUnionCartesianProduct::unification);
-auto AutomataUnionCartesianProductNFA = AutomataUnionCartesianProduct::RegistratorWrapper<automaton::NFA < DefaultSymbolType, std::pair < DefaultStateType, DefaultStateType > >, automaton::NFA < > >(AutomataUnionCartesianProduct::unification);
+auto AutomataUnionCartesianProductDFA = registration::OverloadRegister < AutomataUnionCartesianProduct, automaton::DFA < DefaultSymbolType, std::pair < DefaultStateType, DefaultStateType > >, automaton::DFA < > > ( AutomataUnionCartesianProduct::unification );
+auto AutomataUnionCartesianProductNFA = registration::OverloadRegister < AutomataUnionCartesianProduct, automaton::NFA < DefaultSymbolType, std::pair < DefaultStateType, DefaultStateType > >, automaton::NFA < > > ( AutomataUnionCartesianProduct::unification );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
index bba6f9ceec..77bcccf9a9 100644
--- a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
@@ -8,6 +8,7 @@
 #include "AutomataUnionEpsilonTransition.h"
 #include <label/InitialStateLabel.h>
 #include <common/createUnique.hpp>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -17,9 +18,9 @@ automaton::Automaton AutomataUnionEpsilonTransition::unification(const automaton
 	return dispatch(first.getData(), second.getData());
 }
 
-auto AutomataUnionEpsilonTransitionEpsilonNFA = AutomataUnionEpsilonTransition::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(AutomataUnionEpsilonTransition::unification);
-auto AutomataUnionEpsilonTransitionNFA = AutomataUnionEpsilonTransition::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::NFA < > >(AutomataUnionEpsilonTransition::unification);
-auto AutomataUnionEpsilonTransitionDFA = AutomataUnionEpsilonTransition::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::DFA < > >(AutomataUnionEpsilonTransition::unification);
+auto AutomataUnionEpsilonTransitionEpsilonNFA = registration::OverloadRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( AutomataUnionEpsilonTransition::unification );
+auto AutomataUnionEpsilonTransitionNFA = registration::OverloadRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, automaton::NFA < > > ( AutomataUnionEpsilonTransition::unification );
+auto AutomataUnionEpsilonTransitionDFA = registration::OverloadRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, automaton::DFA < > > ( AutomataUnionEpsilonTransition::unification );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/transform/AutomatonIteration.cpp b/alib2algo/src/automaton/transform/AutomatonIteration.cpp
index c079d65a95..f3646df4b1 100644
--- a/alib2algo/src/automaton/transform/AutomatonIteration.cpp
+++ b/alib2algo/src/automaton/transform/AutomatonIteration.cpp
@@ -7,6 +7,7 @@
 
 #include "AutomatonIteration.h"
 #include <common/createUnique.hpp>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -16,8 +17,8 @@ automaton::Automaton AutomatonIteration::iteration(const automaton::Automaton& a
 	return dispatch(automaton.getData());
 }
 
-auto AutomatonIterationDFA = AutomatonIteration::RegistratorWrapper < automaton::NFA < >, automaton::DFA < > > ( AutomatonIteration::iteration );
-auto AutomatonIterationNFA = AutomatonIteration::RegistratorWrapper < automaton::NFA < >, automaton::NFA < > > (AutomatonIteration::iteration);
+auto AutomatonIterationDFA = registration::OverloadRegister < AutomatonIteration, automaton::NFA < >, automaton::DFA < > > ( AutomatonIteration::iteration );
+auto AutomatonIterationNFA = registration::OverloadRegister < AutomatonIteration, automaton::NFA < >, automaton::NFA < > > ( AutomatonIteration::iteration );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp
index 67d92430ae..fea903fdb9 100644
--- a/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp
@@ -7,6 +7,7 @@
 
 #include "AutomatonIterationEpsilonTransition.h"
 #include <common/createUnique.hpp>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -16,9 +17,9 @@ automaton::Automaton AutomatonIterationEpsilonTransition::iteration(const automa
 	return dispatch(automaton.getData());
 }
 
-auto AutomatonIterationEpsilonTransitionDFA = AutomatonIterationEpsilonTransition::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::DFA < > >(AutomatonIterationEpsilonTransition::iteration);
-auto AutomatonIterationEpsilonTransitionNFA = AutomatonIterationEpsilonTransition::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::NFA < > >(AutomatonIterationEpsilonTransition::iteration);
-auto AutomatonIterationEpsilonTransitionEpsilonNFA = AutomatonIterationEpsilonTransition::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(AutomatonIterationEpsilonTransition::iteration);
+auto AutomatonIterationEpsilonTransitionDFA = registration::OverloadRegister < AutomatonIterationEpsilonTransition, automaton::EpsilonNFA < >, automaton::DFA < > > ( AutomatonIterationEpsilonTransition::iteration );
+auto AutomatonIterationEpsilonTransitionNFA = registration::OverloadRegister < AutomatonIterationEpsilonTransition, automaton::EpsilonNFA < >, automaton::NFA < > > ( AutomatonIterationEpsilonTransition::iteration );
+auto AutomatonIterationEpsilonTransitionEpsilonNFA = registration::OverloadRegister < AutomatonIterationEpsilonTransition, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( AutomatonIterationEpsilonTransition::iteration );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/transform/Compaction.cpp b/alib2algo/src/automaton/transform/Compaction.cpp
index 32e58355f5..a0ece87258 100644
--- a/alib2algo/src/automaton/transform/Compaction.cpp
+++ b/alib2algo/src/automaton/transform/Compaction.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "Compaction.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -15,9 +16,9 @@ automaton::Automaton Compaction::convert(const automaton::Automaton& automaton)
 	return dispatch(automaton.getData());
 }
 
-auto CompactionCompactNFA = Compaction::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(Compaction::convert);
-auto CompactionDFA = Compaction::RegistratorWrapper<automaton::CompactNFA < >, automaton::DFA < > >(Compaction::convert);
-auto CompactionNFA = Compaction::RegistratorWrapper<automaton::CompactNFA < >, automaton::NFA < > >(Compaction::convert);
+auto CompactionCompactNFA = registration::OverloadRegister < Compaction, automaton::CompactNFA < >, automaton::CompactNFA < > > ( Compaction::convert );
+auto CompactionDFA = registration::OverloadRegister < Compaction, automaton::CompactNFA < >, automaton::DFA < > > ( Compaction::convert );
+auto CompactionNFA = registration::OverloadRegister < Compaction, automaton::CompactNFA < >, automaton::NFA < > > ( Compaction::convert );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
index 11dd7ea3af..870eecdde9 100644
--- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
+++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
@@ -22,6 +22,7 @@
 #include <common/createUnique.hpp>
 
 #include <registration/CastRegistration.hpp>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -29,13 +30,13 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom
 	return pda;
 }
 
-auto PDAToRHPDARealTimeHeightDeterministicDPDA = PDAToRHPDA::RegistratorWrapper < automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( PDAToRHPDA::convert );
+auto PDAToRHPDARealTimeHeightDeterministicDPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const automaton::RealTimeHeightDeterministicNPDA < > & pda ) {
 	return pda;
 }
 
-auto PDAToRHPDARealTimeHeightDeterministicNPDA = PDAToRHPDA::RegistratorWrapper < automaton::RealTimeHeightDeterministicNPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( PDAToRHPDA::convert );
+auto PDAToRHPDARealTimeHeightDeterministicNPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicNPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const automaton::DPDA < > & pda ) {
 	DefaultStateType q0 = common::createUnique ( label::InitialStateLabel::instance < DefaultStateType > ( ), pda.getStates ( ) );
@@ -111,7 +112,7 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom
 	return res;
 }
 
-auto PDAToRHPDADPDA = PDAToRHPDA::RegistratorWrapper < automaton::RealTimeHeightDeterministicDPDA < >, automaton::DPDA < > > ( PDAToRHPDA::convert );
+auto PDAToRHPDADPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicDPDA < >, automaton::DPDA < > > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const automaton::NPDA < > & pda ) {
 	RealTimeHeightDeterministicNPDA < > res ( alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ) );
@@ -185,7 +186,7 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom
 	return res;
 }
 
-auto PDAToRHPDANPDA = PDAToRHPDA::RegistratorWrapper < automaton::RealTimeHeightDeterministicNPDA < >, automaton::NPDA < > > ( PDAToRHPDA::convert );
+auto PDAToRHPDANPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicNPDA < >, automaton::NPDA < > > ( PDAToRHPDA::convert );
 
 automaton::Automaton PDAToRHPDA::convert ( const Automaton & automaton ) {
 	return dispatch ( automaton.getData ( ) );
diff --git a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
index 2a618e9173..b300d21fdf 100644
--- a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
+++ b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
@@ -21,6 +21,7 @@
 #include <iostream>
 
 #include <registration/CastRegistration.hpp>
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -155,7 +156,7 @@ automaton::DPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDetermi
 	return res;
 }
 
-auto RHPDAToPDARealTimeHeightDeterministicDPDA = RHPDAToPDA::RegistratorWrapper < automaton::DPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( RHPDAToPDA::convert );
+auto RHPDAToPDARealTimeHeightDeterministicDPDA = registration::OverloadRegister < RHPDAToPDA, automaton::DPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( RHPDAToPDA::convert );
 
  // This may not work correctly -- generation of initial state and initial symbol
 automaton::NPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDeterministicNPDA < > & pda ) {
@@ -271,7 +272,7 @@ automaton::NPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDetermi
 	return res;
 }
 
-auto RHPDAToPDARealTimeHeightDeterministicNPDA = RHPDAToPDA::RegistratorWrapper < automaton::NPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( RHPDAToPDA::convert );
+auto RHPDAToPDARealTimeHeightDeterministicNPDA = registration::OverloadRegister < RHPDAToPDA, automaton::NPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( RHPDAToPDA::convert );
 
 automaton::Automaton RHPDAToPDA::convert ( const Automaton & automaton ) {
 	return dispatch ( automaton.getData ( ) );
diff --git a/alib2algo/src/automaton/transform/Reverse.cpp b/alib2algo/src/automaton/transform/Reverse.cpp
index ed567ffa4b..de1af487f4 100644
--- a/alib2algo/src/automaton/transform/Reverse.cpp
+++ b/alib2algo/src/automaton/transform/Reverse.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "Reverse.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -15,9 +16,9 @@ automaton::Automaton Reverse::convert(const Automaton& automaton) {
 	return dispatch(automaton.getData());
 }
 
-auto ReverseDFA = Reverse::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::DFA<>>(Reverse::convert);
-auto ReverseNFA = Reverse::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::NFA < > >(Reverse::convert);
-auto ReverseMultiInitialStateNFA = Reverse::RegistratorWrapper<automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > >(Reverse::convert);
+auto ReverseDFA = registration::OverloadRegister < Reverse, automaton::MultiInitialStateNFA < >, automaton::DFA < > > ( Reverse::convert );
+auto ReverseNFA = registration::OverloadRegister < Reverse, automaton::MultiInitialStateNFA < >, automaton::NFA < > > ( Reverse::convert );
+auto ReverseMultiInitialStateNFA = registration::OverloadRegister < Reverse, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( Reverse::convert );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/grammar/convert/ToAutomaton.cpp b/alib2algo/src/grammar/convert/ToAutomaton.cpp
index 57e76a919a..2c214c1f1e 100644
--- a/alib2algo/src/grammar/convert/ToAutomaton.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomaton.cpp
@@ -10,6 +10,7 @@
 
 #include <label/InitialStateLabel.h>
 #include <label/FinalStateLabel.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -60,7 +61,7 @@ automaton::NFA < > ToAutomaton::convert(const grammar::LeftRG < > & grammar) {
 	return automaton;
 }
 
-auto ToAutomatonLeftRG = ToAutomaton::RegistratorWrapper<automaton::NFA < > , grammar::LeftRG < > >(ToAutomaton::convert);
+auto ToAutomatonLeftRG = registration::OverloadRegister < ToAutomaton, automaton::NFA < >, grammar::LeftRG < > > ( ToAutomaton::convert );
 
 automaton::NFA < > ToAutomaton::convert(const grammar::RightRG < > & grammar) {
 	std::map<DefaultSymbolType, DefaultStateType> stateMap;
@@ -104,7 +105,7 @@ automaton::NFA < > ToAutomaton::convert(const grammar::RightRG < > & grammar) {
 	return automaton;
 }
 
-auto ToAutomatonRightRG = ToAutomaton::RegistratorWrapper<automaton::NFA < > , grammar::RightRG < > >(ToAutomaton::convert);
+auto ToAutomatonRightRG = registration::OverloadRegister < ToAutomaton, automaton::NFA < >, grammar::RightRG < > > ( ToAutomaton::convert );
 
 template <class T>
 automaton::NPDA < > ToAutomaton::convert(const T& grammar) {
@@ -126,8 +127,8 @@ automaton::NPDA < > ToAutomaton::convert(const T& grammar) {
 	return automaton;
 }
 
-auto ToAutomatonCFG = ToAutomaton::RegistratorWrapper<automaton::NPDA < > , grammar::CFG < > >(ToAutomaton::convert);
-auto ToAutomatonEpsilonFreeCFG = ToAutomaton::RegistratorWrapper<automaton::NPDA < >, grammar::EpsilonFreeCFG < > >(ToAutomaton::convert);
+auto ToAutomatonCFG = registration::OverloadRegister < ToAutomaton, automaton::NPDA < >, grammar::CFG < > > ( ToAutomaton::convert );
+auto ToAutomatonEpsilonFreeCFG = registration::OverloadRegister < ToAutomaton, automaton::NPDA < >, grammar::EpsilonFreeCFG < > > ( ToAutomaton::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
index 20310099e7..3329e1c26e 100644
--- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp
@@ -5,6 +5,7 @@
  * Author: Tomas Pecka
  */
 #include "ToAutomatonBottomUp.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -14,8 +15,8 @@ automaton::Automaton ToAutomatonBottomUp::convert(const grammar::Grammar& gramma
 	 return dispatch(grammar.getData());
 }
 
-auto ToAutomatonBottomUpCFG = ToAutomatonBottomUp::RegistratorWrapper<automaton::NPDA < > , grammar::CFG < > >(ToAutomatonBottomUp::convert);
-auto ToAutomatonBottomUpEpsilonFreeCFG = ToAutomatonBottomUp::RegistratorWrapper<automaton::NPDA < >, grammar::EpsilonFreeCFG < > >(ToAutomatonBottomUp::convert);
+auto ToAutomatonBottomUpCFG = registration::OverloadRegister < ToAutomatonBottomUp, automaton::NPDA < >, grammar::CFG < > > ( ToAutomatonBottomUp::convert );
+auto ToAutomatonBottomUpEpsilonFreeCFG = registration::OverloadRegister < ToAutomatonBottomUp, automaton::NPDA < >, grammar::EpsilonFreeCFG < > > ( ToAutomatonBottomUp::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp b/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp
index ab7ae99d68..33ae387e1d 100644
--- a/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp
+++ b/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ToGrammarLeftRG.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -15,7 +16,7 @@ grammar::Grammar ToGrammarLeftRG::convert(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
 }
 
-auto ToGrammarLeftRGRightRG = ToGrammarLeftRG::RegistratorWrapper<grammar::LeftRG < >, grammar::RightRG < > >(ToGrammarLeftRG::convert);
+auto ToGrammarLeftRGRightRG = registration::OverloadRegister < ToGrammarLeftRG, grammar::LeftRG < >, grammar::RightRG < > > ( ToGrammarLeftRG::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp b/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp
index 062ed8e822..4a549e9293 100644
--- a/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp
+++ b/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ToGrammarRightRG.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -15,7 +16,7 @@ grammar::Grammar ToGrammarRightRG::convert(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
 }
 
-auto ToGrammarRightRGLeftRG = ToGrammarRightRG::RegistratorWrapper<grammar::RightRG < >, grammar::LeftRG < > >(ToGrammarRightRG::convert);
+auto ToGrammarRightRGLeftRG = registration::OverloadRegister < ToGrammarRightRG, grammar::RightRG < >, grammar::LeftRG < > > ( ToGrammarRightRG::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToRegExp.cpp b/alib2algo/src/grammar/convert/ToRegExp.cpp
index b4c7e4a280..692ad5161a 100644
--- a/alib2algo/src/grammar/convert/ToRegExp.cpp
+++ b/alib2algo/src/grammar/convert/ToRegExp.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ToRegExp.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -15,8 +16,8 @@ regexp::RegExp ToRegExp::convert(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
 }
 
-auto ToRegExpRightRG = ToRegExp::RegistratorWrapper<regexp::RegExp, grammar::RightRG < > >(ToRegExp::convert);
-auto ToRegExpLeftRG = ToRegExp::RegistratorWrapper<regexp::RegExp, grammar::LeftRG < > >(ToRegExp::convert);
+auto ToRegExpRightRG = registration::OverloadRegister < ToRegExp, regexp::RegExp, grammar::RightRG < > > ( ToRegExp::convert );
+auto ToRegExpLeftRG = registration::OverloadRegister < ToRegExp, regexp::RegExp, grammar::LeftRG < > > ( ToRegExp::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToRegExpAlgebraic.cpp b/alib2algo/src/grammar/convert/ToRegExpAlgebraic.cpp
index a1203f3896..bb1c3d3027 100644
--- a/alib2algo/src/grammar/convert/ToRegExpAlgebraic.cpp
+++ b/alib2algo/src/grammar/convert/ToRegExpAlgebraic.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ToRegExpAlgebraic.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -15,8 +16,8 @@ regexp::RegExp ToRegExpAlgebraic::convert(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
 }
 
-auto ToRegExpAlgebraicLeftRG = ToRegExpAlgebraic::RegistratorWrapper<regexp::UnboundedRegExp < >, grammar::LeftRG < > >(ToRegExpAlgebraic::convert);
-auto ToRegExpAlgebraicRightRG = ToRegExpAlgebraic::RegistratorWrapper<regexp::UnboundedRegExp < >, grammar::RightRG < > >(ToRegExpAlgebraic::convert);
+auto ToRegExpAlgebraicLeftRG = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, grammar::LeftRG < > > ( ToRegExpAlgebraic::convert );
+auto ToRegExpAlgebraicRightRG = registration::OverloadRegister < ToRegExpAlgebraic, regexp::UnboundedRegExp < >, grammar::RightRG < > > ( ToRegExpAlgebraic::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp b/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp
index bc75619a6b..b1e57761d2 100644
--- a/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp
+++ b/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp
@@ -6,12 +6,13 @@
  */
 
 #include "CockeYoungerKasami.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace generate {
 
-auto CockeYoungerKasamiCNF = CockeYoungerKasami::RegistratorWrapper < bool, grammar::CNF < > > ( CockeYoungerKasami::generate );
+auto CockeYoungerKasamiCNF = registration::OverloadRegister < CockeYoungerKasami, bool, grammar::CNF < > > ( CockeYoungerKasami::generate );
 
 bool CockeYoungerKasami::generate ( const grammar::Grammar & grammar, const string::LinearString < > & string ) {
 	return dispatch ( grammar.getData ( ), string );
diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
index 4ad8f0f544..687a2ecfe9 100644
--- a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
+++ b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
@@ -6,16 +6,17 @@
  */
 
 #include "GenerateUpToLength.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace generate {
 
-auto GenerateUpToLengthEpsilonFreeCFG = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::EpsilonFreeCFG < > >(GenerateUpToLength::generate);
-auto GenerateUpToLengthGNF = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::GNF < > >(GenerateUpToLength::generate);
-auto GenerateUpToLengthCNF = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::CNF < > >(GenerateUpToLength::generate);
-auto GenerateUpToLengthLeftRG = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::LeftRG < > >(GenerateUpToLength::generate);
-auto GenerateUpToLengthRightRG = GenerateUpToLength::RegistratorWrapper<std::set<string::LinearString < >>, grammar::RightRG < > >(GenerateUpToLength::generate);
+auto GenerateUpToLengthEpsilonFreeCFG = registration::OverloadRegister < GenerateUpToLength, std::set < string::LinearString < > >, grammar::EpsilonFreeCFG < > > ( GenerateUpToLength::generate );
+auto GenerateUpToLengthGNF = registration::OverloadRegister < GenerateUpToLength, std::set < string::LinearString < > >, grammar::GNF < > > ( GenerateUpToLength::generate );
+auto GenerateUpToLengthCNF = registration::OverloadRegister < GenerateUpToLength, std::set < string::LinearString < > >, grammar::CNF < > > ( GenerateUpToLength::generate );
+auto GenerateUpToLengthLeftRG = registration::OverloadRegister < GenerateUpToLength, std::set < string::LinearString < > >, grammar::LeftRG < > > ( GenerateUpToLength::generate );
+auto GenerateUpToLengthRightRG = registration::OverloadRegister < GenerateUpToLength, std::set < string::LinearString < > >, grammar::RightRG < > > ( GenerateUpToLength::generate );
 
 std::set<string::LinearString < >> GenerateUpToLength::generate(const grammar::Grammar& grammar, unsigned length) {
 	return dispatch(grammar.getData(), length);
diff --git a/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp b/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp
index 316879b00c..aeb2b0672a 100644
--- a/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp
+++ b/alib2algo/src/grammar/generate/RandomGrammarFactory.cpp
@@ -11,6 +11,7 @@
 
 #include <algorithm>
 #include <random>
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
diff --git a/alib2algo/src/grammar/generate/RandomizeGrammar.cpp b/alib2algo/src/grammar/generate/RandomizeGrammar.cpp
index 993b6476d8..b349b0d339 100644
--- a/alib2algo/src/grammar/generate/RandomizeGrammar.cpp
+++ b/alib2algo/src/grammar/generate/RandomizeGrammar.cpp
@@ -7,16 +7,17 @@
 
 #include "RandomizeGrammar.h"
 #include <grammar/Grammar.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace generate {
 
-auto RandomizeGrammarLeftRG = RandomizeGrammar::RegistratorWrapper < grammar::LeftRG < >, grammar::LeftRG < > > ( RandomizeGrammar::randomize );
-auto RandomizeGrammarLeftLG = RandomizeGrammar::RegistratorWrapper < grammar::LeftLG < >, grammar::LeftLG < > > ( RandomizeGrammar::randomize );
-auto RandomizeGrammarRightRG = RandomizeGrammar::RegistratorWrapper < grammar::RightRG < >, grammar::RightRG < > > ( RandomizeGrammar::randomize );
-auto RandomizeGrammarRightLG = RandomizeGrammar::RegistratorWrapper < grammar::RightLG < >, grammar::RightLG < > > ( RandomizeGrammar::randomize );
-auto RandomizeGrammarCFG = RandomizeGrammar::RegistratorWrapper < grammar::CFG < >, grammar::CFG < > > ( RandomizeGrammar::randomize );
+auto RandomizeGrammarLeftRG = registration::OverloadRegister < RandomizeGrammar, grammar::LeftRG < >, grammar::LeftRG < > > ( RandomizeGrammar::randomize );
+auto RandomizeGrammarLeftLG = registration::OverloadRegister < RandomizeGrammar, grammar::LeftLG < >, grammar::LeftLG < > > ( RandomizeGrammar::randomize );
+auto RandomizeGrammarRightRG = registration::OverloadRegister < RandomizeGrammar, grammar::RightRG < >, grammar::RightRG < > > ( RandomizeGrammar::randomize );
+auto RandomizeGrammarRightLG = registration::OverloadRegister < RandomizeGrammar, grammar::RightLG < >, grammar::RightLG < > > ( RandomizeGrammar::randomize );
+auto RandomizeGrammarCFG = registration::OverloadRegister < RandomizeGrammar, grammar::CFG < >, grammar::CFG < > > ( RandomizeGrammar::randomize );
 
 grammar::Grammar RandomizeGrammar::randomize ( const grammar::Grammar & grammar ) {
 	return dispatch ( grammar.getData ( ) );
diff --git a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp
index c0caf51f88..c510f9d62c 100644
--- a/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp
+++ b/alib2algo/src/grammar/properties/IsLanguageEmpty.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "IsLanguageEmpty.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -15,15 +16,15 @@ bool IsLanguageEmpty::isLanguageEmpty(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
 }
 
-auto IsLanguageEmptyCFG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::CFG < > >(IsLanguageEmpty::isLanguageEmpty);
-auto IsLanguageEmptyEpsilonFreeCFG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::EpsilonFreeCFG < > >(IsLanguageEmpty::isLanguageEmpty);
-auto IsLanguageEmptyGNF = IsLanguageEmpty::RegistratorWrapper<bool, grammar::GNF < > >(IsLanguageEmpty::isLanguageEmpty);
-auto IsLanguageEmptyCNF = IsLanguageEmpty::RegistratorWrapper<bool, grammar::CNF < > >(IsLanguageEmpty::isLanguageEmpty);
-auto IsLanguageEmptyLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LG < > >(IsLanguageEmpty::isLanguageEmpty);
-auto IsLanguageEmptyLeftLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LeftLG < > >(IsLanguageEmpty::isLanguageEmpty);
-auto IsLanguageEmptyLeftRG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::LeftRG < > >(IsLanguageEmpty::isLanguageEmpty);
-auto IsLanguageEmptyRightLG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::RightLG < > >(IsLanguageEmpty::isLanguageEmpty);
-auto IsLanguageEmptyRightRG = IsLanguageEmpty::RegistratorWrapper<bool, grammar::RightRG < > >(IsLanguageEmpty::isLanguageEmpty);
+auto IsLanguageEmptyCFG = registration::OverloadRegister < IsLanguageEmpty, bool, grammar::CFG < > > ( IsLanguageEmpty::isLanguageEmpty );
+auto IsLanguageEmptyEpsilonFreeCFG = registration::OverloadRegister < IsLanguageEmpty, bool, grammar::EpsilonFreeCFG < > > ( IsLanguageEmpty::isLanguageEmpty );
+auto IsLanguageEmptyGNF = registration::OverloadRegister < IsLanguageEmpty, bool, grammar::GNF < > > ( IsLanguageEmpty::isLanguageEmpty );
+auto IsLanguageEmptyCNF = registration::OverloadRegister < IsLanguageEmpty, bool, grammar::CNF < > > ( IsLanguageEmpty::isLanguageEmpty );
+auto IsLanguageEmptyLG = registration::OverloadRegister < IsLanguageEmpty, bool, grammar::LG < > > ( IsLanguageEmpty::isLanguageEmpty );
+auto IsLanguageEmptyLeftLG = registration::OverloadRegister < IsLanguageEmpty, bool, grammar::LeftLG < > > ( IsLanguageEmpty::isLanguageEmpty );
+auto IsLanguageEmptyLeftRG = registration::OverloadRegister < IsLanguageEmpty, bool, grammar::LeftRG < > > ( IsLanguageEmpty::isLanguageEmpty );
+auto IsLanguageEmptyRightLG = registration::OverloadRegister < IsLanguageEmpty, bool, grammar::RightLG < > > ( IsLanguageEmpty::isLanguageEmpty );
+auto IsLanguageEmptyRightRG = registration::OverloadRegister < IsLanguageEmpty, bool, grammar::RightRG < > > ( IsLanguageEmpty::isLanguageEmpty );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp
index d8666e129f..7c126e800c 100644
--- a/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp
+++ b/alib2algo/src/grammar/properties/IsLanguageGeneratingEpsilon.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "IsLanguageGeneratingEpsilon.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -15,15 +16,15 @@ bool IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon(const grammar::Gra
 	return dispatch(grammar.getData());
 }
 
-auto IsLanguageGeneratingEpsilonCFG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::CFG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
-auto IsLanguageGeneratingEpsilonEpsilonFreeCFG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::EpsilonFreeCFG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
-auto IsLanguageGeneratingEpsilonGNF = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::GNF < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
-auto IsLanguageGeneratingEpsilonCNF = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::CNF < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
-auto IsLanguageGeneratingEpsilonLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
-auto IsLanguageGeneratingEpsilonLeftLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LeftLG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
-auto IsLanguageGeneratingEpsilonLeftRG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::LeftRG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
-auto IsLanguageGeneratingEpsilonRightLG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::RightLG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
-auto IsLanguageGeneratingEpsilonRightRG = IsLanguageGeneratingEpsilon::RegistratorWrapper<bool, grammar::RightRG < > >(IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon);
+auto IsLanguageGeneratingEpsilonCFG = registration::OverloadRegister < IsLanguageGeneratingEpsilon, bool, grammar::CFG < > > ( IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon );
+auto IsLanguageGeneratingEpsilonEpsilonFreeCFG = registration::OverloadRegister < IsLanguageGeneratingEpsilon, bool, grammar::EpsilonFreeCFG < > > ( IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon );
+auto IsLanguageGeneratingEpsilonGNF = registration::OverloadRegister < IsLanguageGeneratingEpsilon, bool, grammar::GNF < > > ( IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon );
+auto IsLanguageGeneratingEpsilonCNF = registration::OverloadRegister < IsLanguageGeneratingEpsilon, bool, grammar::CNF < > > ( IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon );
+auto IsLanguageGeneratingEpsilonLG = registration::OverloadRegister < IsLanguageGeneratingEpsilon, bool, grammar::LG < > > ( IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon );
+auto IsLanguageGeneratingEpsilonLeftLG = registration::OverloadRegister < IsLanguageGeneratingEpsilon, bool, grammar::LeftLG < > > ( IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon );
+auto IsLanguageGeneratingEpsilonLeftRG = registration::OverloadRegister < IsLanguageGeneratingEpsilon, bool, grammar::LeftRG < > > ( IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon );
+auto IsLanguageGeneratingEpsilonRightLG = registration::OverloadRegister < IsLanguageGeneratingEpsilon, bool, grammar::RightLG < > > ( IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon );
+auto IsLanguageGeneratingEpsilonRightRG = registration::OverloadRegister < IsLanguageGeneratingEpsilon, bool, grammar::RightRG < > > ( IsLanguageGeneratingEpsilon::isLanguageGeneratingEpsilon );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp b/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp
index ae446e2504..b9e0b06ae8 100644
--- a/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp
+++ b/alib2algo/src/grammar/properties/NonterminalUnitRuleCycle.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "NonterminalUnitRuleCycle.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace properties {
 
-auto NonterminalUnitRuleCycleCFG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::CFG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
-auto NonterminalUnitRuleCycleEpsilonFreeCFG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::EpsilonFreeCFG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
-auto NonterminalUnitRuleCycleGNF = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::GNF < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
-auto NonterminalUnitRuleCycleCNF = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::CNF < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
-auto NonterminalUnitRuleCycleLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
-auto NonterminalUnitRuleCycleLeftLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LeftLG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
-auto NonterminalUnitRuleCycleLeftRG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LeftRG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
-auto NonterminalUnitRuleCycleRightLG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::RightLG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
-auto NonterminalUnitRuleCycleRightRG = NonterminalUnitRuleCycle::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::RightRG < > >(NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle);
+auto NonterminalUnitRuleCycleCFG = registration::OverloadRegister < NonterminalUnitRuleCycle, std::set < DefaultSymbolType >, grammar::CFG < > > ( NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle );
+auto NonterminalUnitRuleCycleEpsilonFreeCFG = registration::OverloadRegister < NonterminalUnitRuleCycle, std::set < DefaultSymbolType >, grammar::EpsilonFreeCFG < > > ( NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle );
+auto NonterminalUnitRuleCycleGNF = registration::OverloadRegister < NonterminalUnitRuleCycle, std::set < DefaultSymbolType >, grammar::GNF < > > ( NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle );
+auto NonterminalUnitRuleCycleCNF = registration::OverloadRegister < NonterminalUnitRuleCycle, std::set < DefaultSymbolType >, grammar::CNF < > > ( NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle );
+auto NonterminalUnitRuleCycleLG = registration::OverloadRegister < NonterminalUnitRuleCycle, std::set < DefaultSymbolType >, grammar::LG < > > ( NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle );
+auto NonterminalUnitRuleCycleLeftLG = registration::OverloadRegister < NonterminalUnitRuleCycle, std::set < DefaultSymbolType >, grammar::LeftLG < > > ( NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle );
+auto NonterminalUnitRuleCycleLeftRG = registration::OverloadRegister < NonterminalUnitRuleCycle, std::set < DefaultSymbolType >, grammar::LeftRG < > > ( NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle );
+auto NonterminalUnitRuleCycleRightLG = registration::OverloadRegister < NonterminalUnitRuleCycle, std::set < DefaultSymbolType >, grammar::RightLG < > > ( NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle );
+auto NonterminalUnitRuleCycleRightRG = registration::OverloadRegister < NonterminalUnitRuleCycle, std::set < DefaultSymbolType >, grammar::RightRG < > > ( NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle );
 
 std::set<DefaultSymbolType> NonterminalUnitRuleCycle::getNonterminalUnitRuleCycle(const grammar::Grammar& grammar, const DefaultSymbolType& nonterminal) {
 	return dispatch(grammar.getData(), nonterminal);
diff --git a/alib2algo/src/grammar/properties/NullableNonterminals.cpp b/alib2algo/src/grammar/properties/NullableNonterminals.cpp
index 3351dc152c..30eb6a5c78 100644
--- a/alib2algo/src/grammar/properties/NullableNonterminals.cpp
+++ b/alib2algo/src/grammar/properties/NullableNonterminals.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "NullableNonterminals.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace properties {
 
-auto NullableNonterminalsCFG = NullableNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::CFG < > >(NullableNonterminals::getNullableNonterminals);
-auto NullableNonterminalsEpsilonFreeCFG = NullableNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::EpsilonFreeCFG < > >(NullableNonterminals::getNullableNonterminals);
-auto NullableNonterminalsGNF = NullableNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::GNF < > >(NullableNonterminals::getNullableNonterminals);
-auto NullableNonterminalsCNF = NullableNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::CNF < > >(NullableNonterminals::getNullableNonterminals);
-auto NullableNonterminalsLG = NullableNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LG < > >(NullableNonterminals::getNullableNonterminals);
-auto NullableNonterminalsLeftLG = NullableNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LeftLG < > >(NullableNonterminals::getNullableNonterminals);
-auto NullableNonterminalsLeftRG = NullableNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LeftRG < > >(NullableNonterminals::getNullableNonterminals);
-auto NullableNonterminalsRightLG = NullableNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::RightLG < > >(NullableNonterminals::getNullableNonterminals);
-auto NullableNonterminalsRightRG = NullableNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::RightRG < > >(NullableNonterminals::getNullableNonterminals);
+auto NullableNonterminalsCFG = registration::OverloadRegister < NullableNonterminals, std::set < DefaultSymbolType >, grammar::CFG < > > ( NullableNonterminals::getNullableNonterminals );
+auto NullableNonterminalsEpsilonFreeCFG = registration::OverloadRegister < NullableNonterminals, std::set < DefaultSymbolType >, grammar::EpsilonFreeCFG < > > ( NullableNonterminals::getNullableNonterminals );
+auto NullableNonterminalsGNF = registration::OverloadRegister < NullableNonterminals, std::set < DefaultSymbolType >, grammar::GNF < > > ( NullableNonterminals::getNullableNonterminals );
+auto NullableNonterminalsCNF = registration::OverloadRegister < NullableNonterminals, std::set < DefaultSymbolType >, grammar::CNF < > > ( NullableNonterminals::getNullableNonterminals );
+auto NullableNonterminalsLG = registration::OverloadRegister < NullableNonterminals, std::set < DefaultSymbolType >, grammar::LG < > > ( NullableNonterminals::getNullableNonterminals );
+auto NullableNonterminalsLeftLG = registration::OverloadRegister < NullableNonterminals, std::set < DefaultSymbolType >, grammar::LeftLG < > > ( NullableNonterminals::getNullableNonterminals );
+auto NullableNonterminalsLeftRG = registration::OverloadRegister < NullableNonterminals, std::set < DefaultSymbolType >, grammar::LeftRG < > > ( NullableNonterminals::getNullableNonterminals );
+auto NullableNonterminalsRightLG = registration::OverloadRegister < NullableNonterminals, std::set < DefaultSymbolType >, grammar::RightLG < > > ( NullableNonterminals::getNullableNonterminals );
+auto NullableNonterminalsRightRG = registration::OverloadRegister < NullableNonterminals, std::set < DefaultSymbolType >, grammar::RightRG < > > ( NullableNonterminals::getNullableNonterminals );
 
 std::set<DefaultSymbolType> NullableNonterminals::getNullableNonterminals(const grammar::Grammar& grammar ) {
 	return dispatch(grammar.getData());
diff --git a/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp b/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp
index 9a4662866e..595e3f3af0 100644
--- a/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp
+++ b/alib2algo/src/grammar/properties/ProductiveNonterminals.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "ProductiveNonterminals.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace properties {
 
-auto ProductiveNonterminalsCFG = ProductiveNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::CFG < > >(ProductiveNonterminals::getProductiveNonterminals);
-auto ProductiveNonterminalsEpsilonFreeCFG = ProductiveNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::EpsilonFreeCFG < > >(ProductiveNonterminals::getProductiveNonterminals);
-auto ProductiveNonterminalsGNF = ProductiveNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::GNF < > >(ProductiveNonterminals::getProductiveNonterminals);
-auto ProductiveNonterminalsCNF = ProductiveNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::CNF < > >(ProductiveNonterminals::getProductiveNonterminals);
-auto ProductiveNonterminalsLG = ProductiveNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LG < > >(ProductiveNonterminals::getProductiveNonterminals);
-auto ProductiveNonterminalsLeftLG = ProductiveNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LeftLG < > >(ProductiveNonterminals::getProductiveNonterminals);
-auto ProductiveNonterminalsLeftRG = ProductiveNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LeftRG < > >(ProductiveNonterminals::getProductiveNonterminals);
-auto ProductiveNonterminalsRightLG = ProductiveNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::RightLG < > >(ProductiveNonterminals::getProductiveNonterminals);
-auto ProductiveNonterminalsRightRG = ProductiveNonterminals::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::RightRG < > >(ProductiveNonterminals::getProductiveNonterminals);
+auto ProductiveNonterminalsCFG = registration::OverloadRegister < ProductiveNonterminals, std::set < DefaultSymbolType >, grammar::CFG < > > ( ProductiveNonterminals::getProductiveNonterminals );
+auto ProductiveNonterminalsEpsilonFreeCFG = registration::OverloadRegister < ProductiveNonterminals, std::set < DefaultSymbolType >, grammar::EpsilonFreeCFG < > > ( ProductiveNonterminals::getProductiveNonterminals );
+auto ProductiveNonterminalsGNF = registration::OverloadRegister < ProductiveNonterminals, std::set < DefaultSymbolType >, grammar::GNF < > > ( ProductiveNonterminals::getProductiveNonterminals );
+auto ProductiveNonterminalsCNF = registration::OverloadRegister < ProductiveNonterminals, std::set < DefaultSymbolType >, grammar::CNF < > > ( ProductiveNonterminals::getProductiveNonterminals );
+auto ProductiveNonterminalsLG = registration::OverloadRegister < ProductiveNonterminals, std::set < DefaultSymbolType >, grammar::LG < > > ( ProductiveNonterminals::getProductiveNonterminals );
+auto ProductiveNonterminalsLeftLG = registration::OverloadRegister < ProductiveNonterminals, std::set < DefaultSymbolType >, grammar::LeftLG < > > ( ProductiveNonterminals::getProductiveNonterminals );
+auto ProductiveNonterminalsLeftRG = registration::OverloadRegister < ProductiveNonterminals, std::set < DefaultSymbolType >, grammar::LeftRG < > > ( ProductiveNonterminals::getProductiveNonterminals );
+auto ProductiveNonterminalsRightLG = registration::OverloadRegister < ProductiveNonterminals, std::set < DefaultSymbolType >, grammar::RightLG < > > ( ProductiveNonterminals::getProductiveNonterminals );
+auto ProductiveNonterminalsRightRG = registration::OverloadRegister < ProductiveNonterminals, std::set < DefaultSymbolType >, grammar::RightRG < > > ( ProductiveNonterminals::getProductiveNonterminals );
 
 std::set<DefaultSymbolType> ProductiveNonterminals::getProductiveNonterminals(const grammar::Grammar& grammar ) {
 	return dispatch(grammar.getData());
diff --git a/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp b/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp
index 3830ae0018..afc32c0001 100644
--- a/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp
+++ b/alib2algo/src/grammar/properties/RecursiveNonterminal.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "RecursiveNonterminal.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace properties {
 
-auto RecursiveNonterminalCFG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::CFG < > > ( RecursiveNonterminal::isNonterminalRecursive );
-auto RecursiveNonterminalEpsilonFreeCFG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::EpsilonFreeCFG < > > ( RecursiveNonterminal::isNonterminalRecursive );
-auto RecursiveNonterminalGNF = RecursiveNonterminal::RegistratorWrapper < bool, grammar::GNF < > > ( RecursiveNonterminal::isNonterminalRecursive );
-auto RecursiveNonterminalCNF = RecursiveNonterminal::RegistratorWrapper < bool, grammar::CNF < > > ( RecursiveNonterminal::isNonterminalRecursive );
-auto RecursiveNonterminalLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LG < > > ( RecursiveNonterminal::isNonterminalRecursive );
-auto RecursiveNonterminalLeftLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LeftLG < > > ( RecursiveNonterminal::isNonterminalRecursive );
-auto RecursiveNonterminalLeftRG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::LeftRG < > > ( RecursiveNonterminal::isNonterminalRecursive );
-auto RecursiveNonterminalRightLG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::RightLG < > > ( RecursiveNonterminal::isNonterminalRecursive );
-auto RecursiveNonterminalRightRG = RecursiveNonterminal::RegistratorWrapper < bool, grammar::RightRG < > > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalCFG = registration::OverloadRegister < RecursiveNonterminal, bool, grammar::CFG < > > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalEpsilonFreeCFG = registration::OverloadRegister < RecursiveNonterminal, bool, grammar::EpsilonFreeCFG < > > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalGNF = registration::OverloadRegister < RecursiveNonterminal, bool, grammar::GNF < > > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalCNF = registration::OverloadRegister < RecursiveNonterminal, bool, grammar::CNF < > > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalLG = registration::OverloadRegister < RecursiveNonterminal, bool, grammar::LG < > > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalLeftLG = registration::OverloadRegister < RecursiveNonterminal, bool, grammar::LeftLG < > > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalLeftRG = registration::OverloadRegister < RecursiveNonterminal, bool, grammar::LeftRG < > > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalRightLG = registration::OverloadRegister < RecursiveNonterminal, bool, grammar::RightLG < > > ( RecursiveNonterminal::isNonterminalRecursive );
+auto RecursiveNonterminalRightRG = registration::OverloadRegister < RecursiveNonterminal, bool, grammar::RightRG < > > ( RecursiveNonterminal::isNonterminalRecursive );
 
 bool RecursiveNonterminal::isNonterminalRecursive ( const grammar::Grammar & grammar, const DefaultSymbolType & nonterminal ) {
 	return dispatch ( grammar.getData ( ), nonterminal );
diff --git a/alib2algo/src/grammar/properties/UnreachableSymbols.cpp b/alib2algo/src/grammar/properties/UnreachableSymbols.cpp
index 51b47d3f4a..28e44eed4b 100644
--- a/alib2algo/src/grammar/properties/UnreachableSymbols.cpp
+++ b/alib2algo/src/grammar/properties/UnreachableSymbols.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "UnreachableSymbols.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace properties {
 
-auto UnreachableSymbolsCFG = UnreachableSymbols::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::CFG < > >(UnreachableSymbols::getUnreachableSymbols);
-auto UnreachableSymbolsEpsilonFreeCFG = UnreachableSymbols::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::EpsilonFreeCFG < > >(UnreachableSymbols::getUnreachableSymbols);
-auto UnreachableSymbolsGNF = UnreachableSymbols::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::GNF < > >(UnreachableSymbols::getUnreachableSymbols);
-auto UnreachableSymbolsCNF = UnreachableSymbols::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::CNF < > >(UnreachableSymbols::getUnreachableSymbols);
-auto UnreachableSymbolsLG = UnreachableSymbols::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LG < > >(UnreachableSymbols::getUnreachableSymbols);
-auto UnreachableSymbolsLeftLG = UnreachableSymbols::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LeftLG < > >(UnreachableSymbols::getUnreachableSymbols);
-auto UnreachableSymbolsLeftRG = UnreachableSymbols::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::LeftRG < > >(UnreachableSymbols::getUnreachableSymbols);
-auto UnreachableSymbolsRightLG = UnreachableSymbols::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::RightLG < > >(UnreachableSymbols::getUnreachableSymbols);
-auto UnreachableSymbolsRightRG = UnreachableSymbols::RegistratorWrapper<std::set<DefaultSymbolType>, grammar::RightRG < > >(UnreachableSymbols::getUnreachableSymbols);
+auto UnreachableSymbolsCFG = registration::OverloadRegister < UnreachableSymbols, std::set < DefaultSymbolType >, grammar::CFG < > > ( UnreachableSymbols::getUnreachableSymbols );
+auto UnreachableSymbolsEpsilonFreeCFG = registration::OverloadRegister < UnreachableSymbols, std::set < DefaultSymbolType >, grammar::EpsilonFreeCFG < > > ( UnreachableSymbols::getUnreachableSymbols );
+auto UnreachableSymbolsGNF = registration::OverloadRegister < UnreachableSymbols, std::set < DefaultSymbolType >, grammar::GNF < > > ( UnreachableSymbols::getUnreachableSymbols );
+auto UnreachableSymbolsCNF = registration::OverloadRegister < UnreachableSymbols, std::set < DefaultSymbolType >, grammar::CNF < > > ( UnreachableSymbols::getUnreachableSymbols );
+auto UnreachableSymbolsLG = registration::OverloadRegister < UnreachableSymbols, std::set < DefaultSymbolType >, grammar::LG < > > ( UnreachableSymbols::getUnreachableSymbols );
+auto UnreachableSymbolsLeftLG = registration::OverloadRegister < UnreachableSymbols, std::set < DefaultSymbolType >, grammar::LeftLG < > > ( UnreachableSymbols::getUnreachableSymbols );
+auto UnreachableSymbolsLeftRG = registration::OverloadRegister < UnreachableSymbols, std::set < DefaultSymbolType >, grammar::LeftRG < > > ( UnreachableSymbols::getUnreachableSymbols );
+auto UnreachableSymbolsRightLG = registration::OverloadRegister < UnreachableSymbols, std::set < DefaultSymbolType >, grammar::RightLG < > > ( UnreachableSymbols::getUnreachableSymbols );
+auto UnreachableSymbolsRightRG = registration::OverloadRegister < UnreachableSymbols, std::set < DefaultSymbolType >, grammar::RightRG < > > ( UnreachableSymbols::getUnreachableSymbols );
 
 std::set < DefaultSymbolType > UnreachableSymbols::getUnreachableSymbols ( const grammar::Grammar & grammar ) {
 	return dispatch ( grammar.getData ( ) );
diff --git a/alib2algo/src/grammar/simplify/EpsilonRemover.cpp b/alib2algo/src/grammar/simplify/EpsilonRemover.cpp
index 76abf3b1ba..5c9fa06efa 100644
--- a/alib2algo/src/grammar/simplify/EpsilonRemover.cpp
+++ b/alib2algo/src/grammar/simplify/EpsilonRemover.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "EpsilonRemover.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace simplify {
 
-auto EpsilonRemoverCFG = EpsilonRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::CFG < > >(EpsilonRemover::remove);
-auto EpsilonRemoverEpsilonFreeCFG = EpsilonRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(EpsilonRemover::remove);
-auto EpsilonRemoverCNF = EpsilonRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(EpsilonRemover::remove);
-auto EpsilonRemoverGNF = EpsilonRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(EpsilonRemover::remove);
-auto EpsilonRemoverLG = EpsilonRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::LG < > >(EpsilonRemover::remove);
-auto EpsilonRemoverLeftLG = EpsilonRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::LeftLG < > >(EpsilonRemover::remove);
-auto EpsilonRemoverLeftRG = EpsilonRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(EpsilonRemover::remove);
-auto EpsilonRemoverRightLG = EpsilonRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::RightLG < > >(EpsilonRemover::remove);
-auto EpsilonRemoverRightRG = EpsilonRemover::RegistratorWrapper<grammar::RightRG < >, grammar::RightRG < > >(EpsilonRemover::remove);
+auto EpsilonRemoverCFG = registration::OverloadRegister < EpsilonRemover, grammar::EpsilonFreeCFG < >, grammar::CFG < > > ( EpsilonRemover::remove );
+auto EpsilonRemoverEpsilonFreeCFG = registration::OverloadRegister < EpsilonRemover, grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > > ( EpsilonRemover::remove );
+auto EpsilonRemoverCNF = registration::OverloadRegister < EpsilonRemover, grammar::CNF < >, grammar::CNF < > > ( EpsilonRemover::remove );
+auto EpsilonRemoverGNF = registration::OverloadRegister < EpsilonRemover, grammar::GNF < >, grammar::GNF < > > ( EpsilonRemover::remove );
+auto EpsilonRemoverLG = registration::OverloadRegister < EpsilonRemover, grammar::EpsilonFreeCFG < >, grammar::LG < > > ( EpsilonRemover::remove );
+auto EpsilonRemoverLeftLG = registration::OverloadRegister < EpsilonRemover, grammar::EpsilonFreeCFG < >, grammar::LeftLG < > > ( EpsilonRemover::remove );
+auto EpsilonRemoverLeftRG = registration::OverloadRegister < EpsilonRemover, grammar::LeftRG < >, grammar::LeftRG < > > ( EpsilonRemover::remove );
+auto EpsilonRemoverRightLG = registration::OverloadRegister < EpsilonRemover, grammar::EpsilonFreeCFG < >, grammar::RightLG < > > ( EpsilonRemover::remove );
+auto EpsilonRemoverRightRG = registration::OverloadRegister < EpsilonRemover, grammar::RightRG < >, grammar::RightRG < > > ( EpsilonRemover::remove );
 
 grammar::Grammar EpsilonRemover::remove(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
index 5758a2a683..13f9b113ae 100644
--- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
+++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
@@ -6,18 +6,19 @@
  */
 
 #include "LeftRecursionRemover.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace simplify {
 
-auto LeftRecursionRemoverEpsilonFreeCFG = LeftRecursionRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(LeftRecursionRemover::remove);
-auto LeftRecursionRemoverCNF = LeftRecursionRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::CNF < > >(LeftRecursionRemover::remove);
-auto LeftRecursionRemoverGNF = LeftRecursionRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(LeftRecursionRemover::remove);
-auto LeftRecursionRemoverRightRG = LeftRecursionRemover::RegistratorWrapper<grammar::RightRG < >, grammar::RightRG < > >(LeftRecursionRemover::remove);
-auto LeftRecursionRemoverRightLG = LeftRecursionRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(LeftRecursionRemover::remove);
-auto LeftRecursionRemoverLeftRG = LeftRecursionRemover::RegistratorWrapper<grammar::RightRG < >, grammar::LeftRG < > >(LeftRecursionRemover::remove);
-auto LeftRecursionRemoverLeftLG = LeftRecursionRemover::RegistratorWrapper<grammar::RightLG < >, grammar::LeftLG < > >(LeftRecursionRemover::remove);
+auto LeftRecursionRemoverEpsilonFreeCFG = registration::OverloadRegister < LeftRecursionRemover, grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > > ( LeftRecursionRemover::remove );
+auto LeftRecursionRemoverCNF = registration::OverloadRegister < LeftRecursionRemover, grammar::EpsilonFreeCFG < >, grammar::CNF < > > ( LeftRecursionRemover::remove );
+auto LeftRecursionRemoverGNF = registration::OverloadRegister < LeftRecursionRemover, grammar::GNF < >, grammar::GNF < > > ( LeftRecursionRemover::remove );
+auto LeftRecursionRemoverRightRG = registration::OverloadRegister < LeftRecursionRemover, grammar::RightRG < >, grammar::RightRG < > > ( LeftRecursionRemover::remove );
+auto LeftRecursionRemoverRightLG = registration::OverloadRegister < LeftRecursionRemover, grammar::RightLG < >, grammar::RightLG < > > ( LeftRecursionRemover::remove );
+auto LeftRecursionRemoverLeftRG = registration::OverloadRegister < LeftRecursionRemover, grammar::RightRG < >, grammar::LeftRG < > > ( LeftRecursionRemover::remove );
+auto LeftRecursionRemoverLeftLG = registration::OverloadRegister < LeftRecursionRemover, grammar::RightLG < >, grammar::LeftLG < > > ( LeftRecursionRemover::remove );
 
 grammar::Grammar LeftRecursionRemover::remove(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
diff --git a/alib2algo/src/grammar/simplify/Rename.cpp b/alib2algo/src/grammar/simplify/Rename.cpp
index 2978978cef..cb85195a1f 100644
--- a/alib2algo/src/grammar/simplify/Rename.cpp
+++ b/alib2algo/src/grammar/simplify/Rename.cpp
@@ -16,6 +16,7 @@
 #include <vector>
 
 #include <hexavigesimal>
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -61,7 +62,7 @@ grammar::RightRG < > Rename::rename ( const grammar::RightRG < > & rrg ) {
 	return result;
 }
 
-auto RenameRightRG = Rename::RegistratorWrapper < grammar::RightRG < >, grammar::RightRG < > > ( Rename::rename );
+auto RenameRightRG = registration::OverloadRegister < Rename, grammar::RightRG < >, grammar::RightRG < > > ( Rename::rename );
 
 grammar::LeftRG < > Rename::rename ( const grammar::LeftRG < > & rrg ) {
 	int counter = 0;
@@ -99,7 +100,7 @@ grammar::LeftRG < > Rename::rename ( const grammar::LeftRG < > & rrg ) {
 	return result;
 }
 
-auto RenameLeftRG = Rename::RegistratorWrapper < grammar::LeftRG < >, grammar::LeftRG < > > ( Rename::rename );
+auto RenameLeftRG = registration::OverloadRegister < Rename, grammar::LeftRG < >, grammar::LeftRG < > > ( Rename::rename );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp b/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp
index dad3a970c9..575ad4aafd 100644
--- a/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp
+++ b/alib2algo/src/grammar/simplify/SimpleRulesRemover.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "SimpleRulesRemover.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -15,15 +16,15 @@ grammar::Grammar SimpleRulesRemover::remove ( const grammar::Grammar & grammar )
 	return dispatch ( grammar.getData ( ) );
 }
 
-auto SimpleRulesRemoverCFG = SimpleRulesRemover::RegistratorWrapper<grammar::CFG < >, grammar::CFG < > >(SimpleRulesRemover::remove);
-auto SimpleRulesRemoverEpsilonFreeCFG = SimpleRulesRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(SimpleRulesRemover::remove);
-auto SimpleRulesRemoverCNF = SimpleRulesRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(SimpleRulesRemover::remove);
-auto SimpleRulesRemoverGNF = SimpleRulesRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(SimpleRulesRemover::remove);
-auto SimpleRulesRemoverLG = SimpleRulesRemover::RegistratorWrapper<grammar::LG < >, grammar::LG < > >(SimpleRulesRemover::remove);
-auto SimpleRulesRemoverLeftLG = SimpleRulesRemover::RegistratorWrapper<grammar::LeftLG < >, grammar::LeftLG < > >(SimpleRulesRemover::remove);
-auto SimpleRulesRemoverLeftRG = SimpleRulesRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(SimpleRulesRemover::remove);
-auto SimpleRulesRemoverRightLG = SimpleRulesRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(SimpleRulesRemover::remove);
-auto SimpleRulesRemoverRightRG = SimpleRulesRemover::RegistratorWrapper<grammar::RightRG < >, grammar::RightRG < > >(SimpleRulesRemover::remove);
+auto SimpleRulesRemoverCFG = registration::OverloadRegister < SimpleRulesRemover, grammar::CFG < >, grammar::CFG < > > ( SimpleRulesRemover::remove );
+auto SimpleRulesRemoverEpsilonFreeCFG = registration::OverloadRegister < SimpleRulesRemover, grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > > ( SimpleRulesRemover::remove );
+auto SimpleRulesRemoverCNF = registration::OverloadRegister < SimpleRulesRemover, grammar::CNF < >, grammar::CNF < > > ( SimpleRulesRemover::remove );
+auto SimpleRulesRemoverGNF = registration::OverloadRegister < SimpleRulesRemover, grammar::GNF < >, grammar::GNF < > > ( SimpleRulesRemover::remove );
+auto SimpleRulesRemoverLG = registration::OverloadRegister < SimpleRulesRemover, grammar::LG < >, grammar::LG < > > ( SimpleRulesRemover::remove );
+auto SimpleRulesRemoverLeftLG = registration::OverloadRegister < SimpleRulesRemover, grammar::LeftLG < >, grammar::LeftLG < > > ( SimpleRulesRemover::remove );
+auto SimpleRulesRemoverLeftRG = registration::OverloadRegister < SimpleRulesRemover, grammar::LeftRG < >, grammar::LeftRG < > > ( SimpleRulesRemover::remove );
+auto SimpleRulesRemoverRightLG = registration::OverloadRegister < SimpleRulesRemover, grammar::RightLG < >, grammar::RightLG < > > ( SimpleRulesRemover::remove );
+auto SimpleRulesRemoverRightRG = registration::OverloadRegister < SimpleRulesRemover, grammar::RightRG < >, grammar::RightRG < > > ( SimpleRulesRemover::remove );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/grammar/simplify/ToCNF.cpp b/alib2algo/src/grammar/simplify/ToCNF.cpp
index 5f527b0e51..de70a44cc9 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToCNF.cpp
@@ -12,6 +12,7 @@
 #include <common/DefaultSymbolsPairType.h>
 #include <exception/CommonException.h>
 #include <common/createUnique.hpp>
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -121,55 +122,55 @@ grammar::CNF < > ToCNF::convert(const grammar::CFG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)));
 }
 
-auto ToCNFCFG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::CFG < > >(ToCNF::convert);
+auto ToCNFCFG = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::CFG < > > ( ToCNF::convert );
 
 grammar::CNF < > ToCNF::convert(const grammar::EpsilonFreeCFG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(origGrammar));
 }
 
-auto ToCNFEpsilonFreeCFG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::EpsilonFreeCFG < > >(ToCNF::convert);
+auto ToCNFEpsilonFreeCFG = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::EpsilonFreeCFG < > > ( ToCNF::convert );
 
 grammar::CNF < > ToCNF::convert(const grammar::CNF < > & origGrammar) {
 	return origGrammar;
 }
 
-auto ToCNFCNF = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(ToCNF::convert);
+auto ToCNFCNF = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::CNF < > > ( ToCNF::convert );
 
 grammar::CNF < > ToCNF::convert(const grammar::GNF < > & origGrammar) {
 	return convertInternal(origGrammar);
 }
 
-auto ToCNFGNF = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::GNF < > >(ToCNF::convert);
+auto ToCNFGNF = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::GNF < > > ( ToCNF::convert );
 
 grammar::CNF < > ToCNF::convert(const grammar::LG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)));
 }
 
-auto ToCNFLG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::LG < > >(ToCNF::convert);
+auto ToCNFLG = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::LG < > > ( ToCNF::convert );
 
 grammar::CNF < > ToCNF::convert(const grammar::LeftLG< > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)));
 }
 
-auto ToCNFLeftLG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::LeftLG < > >(ToCNF::convert);
+auto ToCNFLeftLG = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::LeftLG < > > ( ToCNF::convert );
 
 grammar::CNF < > ToCNF::convert(const grammar::LeftRG < > & origGrammar) {
 	return convertInternal(origGrammar);
 }
 
-auto ToCNFLeftRG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::LeftRG < > >(ToCNF::convert);
+auto ToCNFLeftRG = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::LeftRG < > > ( ToCNF::convert );
 
 grammar::CNF < > ToCNF::convert(const grammar::RightLG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)));
 }
 
-auto ToCNFRightLG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::RightLG < > >(ToCNF::convert);
+auto ToCNFRightLG = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::RightLG < > > ( ToCNF::convert );
 
 grammar::CNF < > ToCNF::convert(const grammar::RightRG < > & origGrammar) {
 	return convertInternal(origGrammar);
 }
 
-auto ToCNFRightRG = ToCNF::RegistratorWrapper<grammar::CNF < >, grammar::RightRG < > >(ToCNF::convert);
+auto ToCNFRightRG = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::RightRG < > > ( ToCNF::convert );
 
 grammar::Grammar ToCNF::convert(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
diff --git a/alib2algo/src/grammar/simplify/ToGNF.cpp b/alib2algo/src/grammar/simplify/ToGNF.cpp
index 504937b475..557bc9ca1a 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToGNF.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "ToGNF.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace simplify {
 
-auto ToGNFCFG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::CFG < > >(ToGNF::convert);
-auto ToGNFEpsilonFreeCFG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::EpsilonFreeCFG < > >(ToGNF::convert);
-auto ToGNFCNF = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::CNF < > >(ToGNF::convert);
-auto ToGNFGNF = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(ToGNF::convert);
-auto ToGNFLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::LG < > >(ToGNF::convert);
-auto ToGNFLeftLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::LeftLG < > >(ToGNF::convert);
-auto ToGNFLeftRG = ToGNF::RegistratorWrapper<grammar::RightRG < >, grammar::LeftRG < > >(ToGNF::convert);
-auto ToGNFRightLG = ToGNF::RegistratorWrapper<grammar::GNF < >, grammar::RightLG < > >(ToGNF::convert);
-auto ToGNFRightRG = ToGNF::RegistratorWrapper<grammar::RightRG < >, grammar::RightRG < > >(ToGNF::convert);
+auto ToGNFCFG = registration::OverloadRegister < ToGNF, grammar::GNF < >, grammar::CFG < > > ( ToGNF::convert );
+auto ToGNFEpsilonFreeCFG = registration::OverloadRegister < ToGNF, grammar::GNF < >, grammar::EpsilonFreeCFG < > > ( ToGNF::convert );
+auto ToGNFCNF = registration::OverloadRegister < ToGNF, grammar::GNF < >, grammar::CNF < > > ( ToGNF::convert );
+auto ToGNFGNF = registration::OverloadRegister < ToGNF, grammar::GNF < >, grammar::GNF < > > ( ToGNF::convert );
+auto ToGNFLG = registration::OverloadRegister < ToGNF, grammar::GNF < >, grammar::LG < > > ( ToGNF::convert );
+auto ToGNFLeftLG = registration::OverloadRegister < ToGNF, grammar::GNF < >, grammar::LeftLG < > > ( ToGNF::convert );
+auto ToGNFLeftRG = registration::OverloadRegister < ToGNF, grammar::RightRG < >, grammar::LeftRG < > > ( ToGNF::convert );
+auto ToGNFRightLG = registration::OverloadRegister < ToGNF, grammar::GNF < >, grammar::RightLG < > > ( ToGNF::convert );
+auto ToGNFRightRG = registration::OverloadRegister < ToGNF, grammar::RightRG < >, grammar::RightRG < > > ( ToGNF::convert );
 
 grammar::Grammar ToGNF::convert(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
diff --git a/alib2algo/src/grammar/simplify/Trim.cpp b/alib2algo/src/grammar/simplify/Trim.cpp
index 046d7fae06..580585fc28 100644
--- a/alib2algo/src/grammar/simplify/Trim.cpp
+++ b/alib2algo/src/grammar/simplify/Trim.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "Trim.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace simplify {
 
-auto TrimCFG = Trim::RegistratorWrapper<grammar::CFG < >, grammar::CFG < > >(Trim::trim);
-auto TrimEpsilonFreeCFG = Trim::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(Trim::trim);
-auto TrimGNF = Trim::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(Trim::trim);
-auto TrimCNF = Trim::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(Trim::trim);
-auto TrimLG = Trim::RegistratorWrapper<grammar::LG < >, grammar::LG < > >(Trim::trim);
-auto TrimLeftLG = Trim::RegistratorWrapper<grammar::LeftLG < >, grammar::LeftLG < > >(Trim::trim);
-auto TrimLeftRG = Trim::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(Trim::trim);
-auto TrimRightLG = Trim::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(Trim::trim);
-auto TrimRightRG = Trim::RegistratorWrapper<grammar::RightRG < >, grammar::RightRG < > >(Trim::trim);
+auto TrimCFG = registration::OverloadRegister < Trim, grammar::CFG < >, grammar::CFG < > > ( Trim::trim );
+auto TrimEpsilonFreeCFG = registration::OverloadRegister < Trim, grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > > ( Trim::trim );
+auto TrimGNF = registration::OverloadRegister < Trim, grammar::GNF < >, grammar::GNF < > > ( Trim::trim );
+auto TrimCNF = registration::OverloadRegister < Trim, grammar::CNF < >, grammar::CNF < > > ( Trim::trim );
+auto TrimLG = registration::OverloadRegister < Trim, grammar::LG < >, grammar::LG < > > ( Trim::trim );
+auto TrimLeftLG = registration::OverloadRegister < Trim, grammar::LeftLG < >, grammar::LeftLG < > > ( Trim::trim );
+auto TrimLeftRG = registration::OverloadRegister < Trim, grammar::LeftRG < >, grammar::LeftRG < > > ( Trim::trim );
+auto TrimRightLG = registration::OverloadRegister < Trim, grammar::RightLG < >, grammar::RightLG < > > ( Trim::trim );
+auto TrimRightRG = registration::OverloadRegister < Trim, grammar::RightRG < >, grammar::RightRG < > > ( Trim::trim );
 
 grammar::Grammar Trim::trim(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
diff --git a/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp b/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp
index ba8d91e10f..13d2ffab63 100644
--- a/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp
+++ b/alib2algo/src/grammar/simplify/UnproductiveSymbolsRemover.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "UnproductiveSymbolsRemover.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace simplify {
 
-auto UnproductiveSymbolsRemoverCFG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::CFG < >, grammar::CFG < > >(UnproductiveSymbolsRemover::remove);
-auto UnproductiveSymbolsRemoverEpsilonFreeCFG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(UnproductiveSymbolsRemover::remove);
-auto UnproductiveSymbolsRemoverGNF = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(UnproductiveSymbolsRemover::remove);
-auto UnproductiveSymbolsRemoverCNF = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(UnproductiveSymbolsRemover::remove);
-auto UnproductiveSymbolsRemoverLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LG < >, grammar::LG < > >(UnproductiveSymbolsRemover::remove);
-auto UnproductiveSymbolsRemoverLeftLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LeftLG < >, grammar::LeftLG < > >(UnproductiveSymbolsRemover::remove);
-auto UnproductiveSymbolsRemoverLeftRG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(UnproductiveSymbolsRemover::remove);
-auto UnproductiveSymbolsRemoverRightLG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(UnproductiveSymbolsRemover::remove);
-auto UnproductiveSymbolsRemoverRightRG = UnproductiveSymbolsRemover::RegistratorWrapper<grammar::RightRG < >, grammar::RightRG < > >(UnproductiveSymbolsRemover::remove);
+auto UnproductiveSymbolsRemoverCFG = registration::OverloadRegister < UnproductiveSymbolsRemover, grammar::CFG < >, grammar::CFG < > > ( UnproductiveSymbolsRemover::remove );
+auto UnproductiveSymbolsRemoverEpsilonFreeCFG = registration::OverloadRegister < UnproductiveSymbolsRemover, grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > > ( UnproductiveSymbolsRemover::remove );
+auto UnproductiveSymbolsRemoverGNF = registration::OverloadRegister < UnproductiveSymbolsRemover, grammar::GNF < >, grammar::GNF < > > ( UnproductiveSymbolsRemover::remove );
+auto UnproductiveSymbolsRemoverCNF = registration::OverloadRegister < UnproductiveSymbolsRemover, grammar::CNF < >, grammar::CNF < > > ( UnproductiveSymbolsRemover::remove );
+auto UnproductiveSymbolsRemoverLG = registration::OverloadRegister < UnproductiveSymbolsRemover, grammar::LG < >, grammar::LG < > > ( UnproductiveSymbolsRemover::remove );
+auto UnproductiveSymbolsRemoverLeftLG = registration::OverloadRegister < UnproductiveSymbolsRemover, grammar::LeftLG < >, grammar::LeftLG < > > ( UnproductiveSymbolsRemover::remove );
+auto UnproductiveSymbolsRemoverLeftRG = registration::OverloadRegister < UnproductiveSymbolsRemover, grammar::LeftRG < >, grammar::LeftRG < > > ( UnproductiveSymbolsRemover::remove );
+auto UnproductiveSymbolsRemoverRightLG = registration::OverloadRegister < UnproductiveSymbolsRemover, grammar::RightLG < >, grammar::RightLG < > > ( UnproductiveSymbolsRemover::remove );
+auto UnproductiveSymbolsRemoverRightRG = registration::OverloadRegister < UnproductiveSymbolsRemover, grammar::RightRG < >, grammar::RightRG < > > ( UnproductiveSymbolsRemover::remove );
 
 grammar::Grammar UnproductiveSymbolsRemover::remove(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
diff --git a/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp b/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp
index 860b36a43a..34f7382693 100644
--- a/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp
+++ b/alib2algo/src/grammar/simplify/UnreachableSymbolsRemover.cpp
@@ -6,20 +6,21 @@
  */
 
 #include "UnreachableSymbolsRemover.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
 namespace simplify {
 
-auto UnreachableSymbolsRemoverCFG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::CFG < >, grammar::CFG < > >(UnreachableSymbolsRemover::remove);
-auto UnreachableSymbolsRemoverEpsilonFreeCFG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > >(UnreachableSymbolsRemover::remove);
-auto UnreachableSymbolsRemoverGNF = UnreachableSymbolsRemover::RegistratorWrapper<grammar::GNF < >, grammar::GNF < > >(UnreachableSymbolsRemover::remove);
-auto UnreachableSymbolsRemoverCNF = UnreachableSymbolsRemover::RegistratorWrapper<grammar::CNF < >, grammar::CNF < > >(UnreachableSymbolsRemover::remove);
-auto UnreachableSymbolsRemoverLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LG < >, grammar::LG < > >(UnreachableSymbolsRemover::remove);
-auto UnreachableSymbolsRemoverLeftLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LeftLG < >, grammar::LeftLG < > >(UnreachableSymbolsRemover::remove);
-auto UnreachableSymbolsRemoverLeftRG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::LeftRG < >, grammar::LeftRG < > >(UnreachableSymbolsRemover::remove);
-auto UnreachableSymbolsRemoverRightLG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::RightLG < >, grammar::RightLG < > >(UnreachableSymbolsRemover::remove);
-auto UnreachableSymbolsRemoverRightRG = UnreachableSymbolsRemover::RegistratorWrapper<grammar::RightRG < >, grammar::RightRG < > >(UnreachableSymbolsRemover::remove);
+auto UnreachableSymbolsRemoverCFG = registration::OverloadRegister < UnreachableSymbolsRemover, grammar::CFG < >, grammar::CFG < > > ( UnreachableSymbolsRemover::remove );
+auto UnreachableSymbolsRemoverEpsilonFreeCFG = registration::OverloadRegister < UnreachableSymbolsRemover, grammar::EpsilonFreeCFG < >, grammar::EpsilonFreeCFG < > > ( UnreachableSymbolsRemover::remove );
+auto UnreachableSymbolsRemoverGNF = registration::OverloadRegister < UnreachableSymbolsRemover, grammar::GNF < >, grammar::GNF < > > ( UnreachableSymbolsRemover::remove );
+auto UnreachableSymbolsRemoverCNF = registration::OverloadRegister < UnreachableSymbolsRemover, grammar::CNF < >, grammar::CNF < > > ( UnreachableSymbolsRemover::remove );
+auto UnreachableSymbolsRemoverLG = registration::OverloadRegister < UnreachableSymbolsRemover, grammar::LG < >, grammar::LG < > > ( UnreachableSymbolsRemover::remove );
+auto UnreachableSymbolsRemoverLeftLG = registration::OverloadRegister < UnreachableSymbolsRemover, grammar::LeftLG < >, grammar::LeftLG < > > ( UnreachableSymbolsRemover::remove );
+auto UnreachableSymbolsRemoverLeftRG = registration::OverloadRegister < UnreachableSymbolsRemover, grammar::LeftRG < >, grammar::LeftRG < > > ( UnreachableSymbolsRemover::remove );
+auto UnreachableSymbolsRemoverRightLG = registration::OverloadRegister < UnreachableSymbolsRemover, grammar::RightLG < >, grammar::RightLG < > > ( UnreachableSymbolsRemover::remove );
+auto UnreachableSymbolsRemoverRightRG = registration::OverloadRegister < UnreachableSymbolsRemover, grammar::RightRG < >, grammar::RightRG < > > ( UnreachableSymbolsRemover::remove );
 
 grammar::Grammar UnreachableSymbolsRemover::remove(const grammar::Grammar& grammar) {
 	return dispatch(grammar.getData());
diff --git a/alib2algo/src/regexp/convert/ToAutomaton.cpp b/alib2algo/src/regexp/convert/ToAutomaton.cpp
index e943f5b298..b24803b209 100644
--- a/alib2algo/src/regexp/convert/ToAutomaton.cpp
+++ b/alib2algo/src/regexp/convert/ToAutomaton.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ToAutomaton.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -15,8 +16,8 @@ automaton::Automaton ToAutomaton::convert(const regexp::RegExp& regexp) {
 	return dispatch(regexp.getData());
 }
 
-auto ToAutomatonFormalRegExp = ToAutomaton::RegistratorWrapper<automaton::Automaton, regexp::FormalRegExp < > >(ToAutomaton::convert);
-auto ToAutomatonUnboundedRegExp = ToAutomaton::RegistratorWrapper<automaton::Automaton, regexp::UnboundedRegExp < > >( ToAutomaton::convert);
+auto ToAutomatonFormalRegExp = registration::OverloadRegister < ToAutomaton, automaton::Automaton, regexp::FormalRegExp < > > ( ToAutomaton::convert );
+auto ToAutomatonUnboundedRegExp = registration::OverloadRegister < ToAutomaton, automaton::Automaton, regexp::UnboundedRegExp < > > ( ToAutomaton::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToAutomatonDerivation.cpp b/alib2algo/src/regexp/convert/ToAutomatonDerivation.cpp
index 188a9f70ca..1b38a425e5 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonDerivation.cpp
+++ b/alib2algo/src/regexp/convert/ToAutomatonDerivation.cpp
@@ -18,6 +18,7 @@
 #include "../transform/RegExpDerivation.h"
 #include "../simplify/RegExpOptimize.h"
 #include "../properties/RegExpEpsilon.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -99,8 +100,8 @@ automaton::DFA<> ToAutomatonDerivation::convert(const T& regexp) {
 	return automaton;
 }
 
-auto ToAutomatonDerivationFormalRegExp = ToAutomatonDerivation::RegistratorWrapper<automaton::DFA<>, regexp::FormalRegExp < > >( ToAutomatonDerivation::convert);
-auto ToAutomatonDerivationUnboundedRegExp = ToAutomatonDerivation::RegistratorWrapper<automaton::DFA<>, regexp::UnboundedRegExp < > >( ToAutomatonDerivation::convert);
+auto ToAutomatonDerivationFormalRegExp = registration::OverloadRegister < ToAutomatonDerivation, automaton::DFA < >, regexp::FormalRegExp < > > ( ToAutomatonDerivation::convert );
+auto ToAutomatonDerivationUnboundedRegExp = registration::OverloadRegister < ToAutomatonDerivation, automaton::DFA < >, regexp::UnboundedRegExp < > > ( ToAutomatonDerivation::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp b/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp
index 466669c8e9..54e9b8b8b4 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp
+++ b/alib2algo/src/regexp/convert/ToAutomatonGlushkov.cpp
@@ -19,6 +19,7 @@
 
 #include "../properties/RegExpEpsilon.h"
 #include <exception/CommonException.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -81,13 +82,13 @@ automaton::NFA < > ToAutomatonGlushkov::convert ( const regexp::UnboundedRegExp
 	return automaton;
 }
 
-auto ToAutomatonGlushkovUnboundedRegExp = ToAutomatonGlushkov::RegistratorWrapper < automaton::NFA < >, regexp::UnboundedRegExp < > > ( ToAutomatonGlushkov::convert );
+auto ToAutomatonGlushkovUnboundedRegExp = registration::OverloadRegister < ToAutomatonGlushkov, automaton::NFA < >, regexp::UnboundedRegExp < > > ( ToAutomatonGlushkov::convert );
 
 automaton::NFA < > ToAutomatonGlushkov::convert ( const regexp::FormalRegExp < > & /* regexp */ ) {
 	throw exception::CommonException ( "Glushkov: Converting FormalRegExp NYI" ); // TODO
 }
 
-auto ToAutomatonGlushkovFormalRegExp = ToAutomatonGlushkov::RegistratorWrapper < automaton::NFA < >, regexp::FormalRegExp < > > ( ToAutomatonGlushkov::convert );
+auto ToAutomatonGlushkovFormalRegExp = registration::OverloadRegister < ToAutomatonGlushkov, automaton::NFA < >, regexp::FormalRegExp < > > ( ToAutomatonGlushkov::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToAutomatonThompson.cpp b/alib2algo/src/regexp/convert/ToAutomatonThompson.cpp
index 6f6a716d2e..a3b6e1b9c8 100644
--- a/alib2algo/src/regexp/convert/ToAutomatonThompson.cpp
+++ b/alib2algo/src/regexp/convert/ToAutomatonThompson.cpp
@@ -8,6 +8,7 @@
 #include "regexp/unbounded/UnboundedRegExpElements.h"
 #include "regexp/formal/FormalRegExpElements.h"
 #include <tuple>
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -36,7 +37,7 @@ automaton::EpsilonNFA < > ToAutomatonThompson::convert(const regexp::FormalRegEx
 	return automaton;
 }
 
-auto ToAutomatonThompsonFormalRegExp = ToAutomatonThompson::RegistratorWrapper<automaton::EpsilonNFA < >, regexp::FormalRegExp < > >(ToAutomatonThompson::convert);
+auto ToAutomatonThompsonFormalRegExp = registration::OverloadRegister < ToAutomatonThompson, automaton::EpsilonNFA < >, regexp::FormalRegExp < > > ( ToAutomatonThompson::convert );
 
 automaton::EpsilonNFA < > ToAutomatonThompson::convert(const regexp::UnboundedRegExp < > & regexp) {
 	//FIXME use actual algorithms that implement product alternation and iteration of re over automata and remove terrible TERRIBLE hack with dummy initial state
@@ -57,7 +58,7 @@ automaton::EpsilonNFA < > ToAutomatonThompson::convert(const regexp::UnboundedRe
 	return automaton;
 }
 
-auto ToAutomatonThompsonUnboundedRegExp = ToAutomatonThompson::RegistratorWrapper<automaton::EpsilonNFA < >, regexp::UnboundedRegExp < > >(ToAutomatonThompson::convert);
+auto ToAutomatonThompsonUnboundedRegExp = registration::OverloadRegister < ToAutomatonThompson, automaton::EpsilonNFA < >, regexp::UnboundedRegExp < > > ( ToAutomatonThompson::convert );
 
 // ----------------------------------------------------------------------------
 
diff --git a/alib2algo/src/regexp/convert/ToGrammar.cpp b/alib2algo/src/regexp/convert/ToGrammar.cpp
index 0b51d8f6eb..038582b6b5 100644
--- a/alib2algo/src/regexp/convert/ToGrammar.cpp
+++ b/alib2algo/src/regexp/convert/ToGrammar.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ToGrammar.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -15,8 +16,8 @@ grammar::Grammar ToGrammar::convert(const regexp::RegExp& regexp) {
 	return dispatch(regexp.getData());
 }
 
-auto ToGrammarFormalRegExp = ToGrammar::RegistratorWrapper<grammar::Grammar, regexp::FormalRegExp < > >(ToGrammar::convert);
-auto ToGrammarUnboundedRegExp = ToGrammar::RegistratorWrapper<grammar::Grammar, regexp::UnboundedRegExp < > >(ToGrammar::convert);
+auto ToGrammarFormalRegExp = registration::OverloadRegister < ToGrammar, grammar::Grammar, regexp::FormalRegExp < > > ( ToGrammar::convert );
+auto ToGrammarUnboundedRegExp = registration::OverloadRegister < ToGrammar, grammar::Grammar, regexp::UnboundedRegExp < > > ( ToGrammar::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp b/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp
index 58eccfe3df..4bb6176bd6 100644
--- a/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp
+++ b/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp
@@ -18,6 +18,7 @@
 #include "../simplify/RegExpOptimize.h"
 #include "../transform/RegExpDerivation.h"
 #include "../properties/RegExpEpsilon.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -101,8 +102,8 @@ grammar::RightRG < > ToGrammarRightRGDerivation::convert(const T& regexp) {
 	return grammar;
 }
 
-auto ToGrammarRightRGDerivationUnboundedRegExp = ToGrammarRightRGDerivation::RegistratorWrapper<grammar::RightRG < >, regexp::UnboundedRegExp < > >(ToGrammarRightRGDerivation::convert);
-auto ToGrammarRightRGDerivationFormalRegExp = ToGrammarRightRGDerivation::RegistratorWrapper<grammar::RightRG < >, regexp::FormalRegExp < > >(ToGrammarRightRGDerivation::convert);
+auto ToGrammarRightRGDerivationUnboundedRegExp = registration::OverloadRegister < ToGrammarRightRGDerivation, grammar::RightRG < >, regexp::UnboundedRegExp < > > ( ToGrammarRightRGDerivation::convert );
+auto ToGrammarRightRGDerivationFormalRegExp = registration::OverloadRegister < ToGrammarRightRGDerivation, grammar::RightRG < >, regexp::FormalRegExp < > > ( ToGrammarRightRGDerivation::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp b/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp
index d6c47e4031..be2eec8dee 100644
--- a/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp
+++ b/alib2algo/src/regexp/convert/ToGrammarRightRGGlushkov.cpp
@@ -18,6 +18,7 @@
 
 #include "../properties/RegExpEpsilon.h"
 #include <exception/CommonException.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -83,13 +84,13 @@ grammar::RightRG < > ToGrammarRightRGGlushkov::convert ( const regexp::Unbounded
 	return grammar;
 }
 
-auto ToGrammarRightRGGlushkovUnboundedRegExp = ToGrammarRightRGGlushkov::RegistratorWrapper < grammar::RightRG < >, regexp::UnboundedRegExp < > > ( ToGrammarRightRGGlushkov::convert );
+auto ToGrammarRightRGGlushkovUnboundedRegExp = registration::OverloadRegister < ToGrammarRightRGGlushkov, grammar::RightRG < >, regexp::UnboundedRegExp < > > ( ToGrammarRightRGGlushkov::convert );
 
 grammar::RightRG < > ToGrammarRightRGGlushkov::convert ( const regexp::FormalRegExp < > & /* regexp */ ) {
 	throw exception::CommonException ( "Glushkov: Converting FormalRegExp NYI" ); // TODO
 }
 
-auto ToGrammarRightRGGlushkovFormalRegExp = ToGrammarRightRGGlushkov::RegistratorWrapper < grammar::RightRG < >, regexp::FormalRegExp < > > ( ToGrammarRightRGGlushkov::convert );
+auto ToGrammarRightRGGlushkovFormalRegExp = registration::OverloadRegister < ToGrammarRightRGGlushkov, grammar::RightRG < >, regexp::FormalRegExp < > > ( ToGrammarRightRGGlushkov::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/regexp/properties/RegExpEmpty.cpp b/alib2algo/src/regexp/properties/RegExpEmpty.cpp
index f1a432c477..3d1f5d579f 100644
--- a/alib2algo/src/regexp/properties/RegExpEmpty.cpp
+++ b/alib2algo/src/regexp/properties/RegExpEmpty.cpp
@@ -8,6 +8,7 @@
 #include "RegExpEmpty.h"
 #include <regexp/formal/FormalRegExpElements.h>
 #include <regexp/unbounded/UnboundedRegExpElements.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -17,8 +18,8 @@ bool RegExpEmpty::languageIsEmpty(const regexp::RegExp& regexp) {
 	return dispatch(regexp.getData());
 }
 
-auto RegExpEmptyFormalRegExp = RegExpEmpty::RegistratorWrapper<bool, regexp::FormalRegExp < > >( RegExpEmpty::languageIsEmpty);
-auto RegExpEmptyUnboundedRegExp = RegExpEmpty::RegistratorWrapper<bool, regexp::UnboundedRegExp < > >( RegExpEmpty::languageIsEmpty);
+auto RegExpEmptyFormalRegExp = registration::OverloadRegister < RegExpEmpty, bool, regexp::FormalRegExp < > > ( RegExpEmpty::languageIsEmpty );
+auto RegExpEmptyUnboundedRegExp = registration::OverloadRegister < RegExpEmpty, bool, regexp::UnboundedRegExp < > > ( RegExpEmpty::languageIsEmpty );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/regexp/properties/RegExpEpsilon.cpp b/alib2algo/src/regexp/properties/RegExpEpsilon.cpp
index bdfc6f9cde..f1521fc644 100644
--- a/alib2algo/src/regexp/properties/RegExpEpsilon.cpp
+++ b/alib2algo/src/regexp/properties/RegExpEpsilon.cpp
@@ -8,6 +8,7 @@
 #include "RegExpEpsilon.h"
 #include <regexp/formal/FormalRegExpElements.h>
 #include <regexp/unbounded/UnboundedRegExpElements.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -17,8 +18,8 @@ bool RegExpEpsilon::languageContainsEpsilon(const regexp::RegExp& regexp) {
 	return dispatch(regexp.getData());
 }
 
-auto RegExpEpsilonFormalRegExp = RegExpEpsilon::RegistratorWrapper<bool, regexp::FormalRegExp < > >( RegExpEpsilon::languageContainsEpsilon);
-auto RegExpEpsilonUnboundedRegExp = RegExpEpsilon::RegistratorWrapper<bool, regexp::UnboundedRegExp < > >( RegExpEpsilon::languageContainsEpsilon);
+auto RegExpEpsilonFormalRegExp = registration::OverloadRegister < RegExpEpsilon, bool, regexp::FormalRegExp < > > ( RegExpEpsilon::languageContainsEpsilon );
+auto RegExpEpsilonUnboundedRegExp = registration::OverloadRegister < RegExpEpsilon, bool, regexp::UnboundedRegExp < > > ( RegExpEpsilon::languageContainsEpsilon );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/regexp/simplify/RegExpOptimize.cpp b/alib2algo/src/regexp/simplify/RegExpOptimize.cpp
index 89c3430354..3aeb040de1 100644
--- a/alib2algo/src/regexp/simplify/RegExpOptimize.cpp
+++ b/alib2algo/src/regexp/simplify/RegExpOptimize.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "RegExpOptimize.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -15,8 +16,8 @@ regexp::RegExp RegExpOptimize::optimize(const regexp::RegExp& regexp) {
 	return dispatch(regexp.getData());
 }
 
-auto RegExpOptimizeFormalRegExp = RegExpOptimize::RegistratorWrapper<FormalRegExp < >, FormalRegExp < > >(RegExpOptimize::optimize);
-auto RegExpOptimizeUnboundedRegExp = RegExpOptimize::RegistratorWrapper<UnboundedRegExp < >, UnboundedRegExp < > >(RegExpOptimize::optimize);
+auto RegExpOptimizeFormalRegExp = registration::OverloadRegister < RegExpOptimize, FormalRegExp < >, FormalRegExp < > > ( RegExpOptimize::optimize );
+auto RegExpOptimizeUnboundedRegExp = registration::OverloadRegister < RegExpOptimize, UnboundedRegExp < >, UnboundedRegExp < > > ( RegExpOptimize::optimize );
 
 } /* namespace regexp */
 
diff --git a/alib2algo/src/regexp/transform/RegExpAlternate.cpp b/alib2algo/src/regexp/transform/RegExpAlternate.cpp
index 990d1c3bab..0f1897263a 100644
--- a/alib2algo/src/regexp/transform/RegExpAlternate.cpp
+++ b/alib2algo/src/regexp/transform/RegExpAlternate.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "RegExpAlternate.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -13,7 +14,7 @@ regexp::RegExp RegExpAlternate::alternate(const regexp::RegExp& first, const reg
 	return dispatch(first.getData(), second.getData());
 }
 
-auto RegExpAlternateFormalRegExp = RegExpAlternate::RegistratorWrapper<regexp::FormalRegExp < > , regexp::FormalRegExp < > >(RegExpAlternate::alternate);
-auto RegExpAlternateUnboundedRegExp = RegExpAlternate::RegistratorWrapper<regexp::UnboundedRegExp < >, regexp::UnboundedRegExp < > >(RegExpAlternate::alternate);
+auto RegExpAlternateFormalRegExp = registration::OverloadRegister < RegExpAlternate, regexp::FormalRegExp < > , regexp::FormalRegExp < > > ( RegExpAlternate::alternate );
+auto RegExpAlternateUnboundedRegExp = registration::OverloadRegister < RegExpAlternate, regexp::UnboundedRegExp < >, regexp::UnboundedRegExp < > > ( RegExpAlternate::alternate );
 
 } /* namespace regexp */
diff --git a/alib2algo/src/regexp/transform/RegExpConcatenate.cpp b/alib2algo/src/regexp/transform/RegExpConcatenate.cpp
index 3dc1f3be4e..1139d0c5f3 100644
--- a/alib2algo/src/regexp/transform/RegExpConcatenate.cpp
+++ b/alib2algo/src/regexp/transform/RegExpConcatenate.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "RegExpConcatenate.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -13,7 +14,7 @@ regexp::RegExp RegExpConcatenate::concatenate(const regexp::RegExp& first, const
 	return dispatch(first.getData(), second.getData());
 }
 
-auto RegExpConcatenateFormalRegExp = RegExpConcatenate::RegistratorWrapper<regexp::FormalRegExp < >, regexp::FormalRegExp < > > (RegExpConcatenate::concatenate);
-auto RegExpConcatenateUnboundedRegExp = RegExpConcatenate::RegistratorWrapper<regexp::UnboundedRegExp < >, regexp::UnboundedRegExp < > >(RegExpConcatenate::concatenate);
+auto RegExpConcatenateFormalRegExp = registration::OverloadRegister < RegExpConcatenate, regexp::FormalRegExp < >, regexp::FormalRegExp < > > ( RegExpConcatenate::concatenate );
+auto RegExpConcatenateUnboundedRegExp = registration::OverloadRegister < RegExpConcatenate, regexp::UnboundedRegExp < >, regexp::UnboundedRegExp < > > ( RegExpConcatenate::concatenate );
 
 } /* namespace regexp */
diff --git a/alib2algo/src/regexp/transform/RegExpDerivation.cpp b/alib2algo/src/regexp/transform/RegExpDerivation.cpp
index b1e7852540..ace0c75095 100644
--- a/alib2algo/src/regexp/transform/RegExpDerivation.cpp
+++ b/alib2algo/src/regexp/transform/RegExpDerivation.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "RegExpDerivation.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -13,7 +14,7 @@ regexp::RegExp RegExpDerivation::derivation(const regexp::RegExp& regexp, const
 	return dispatch(regexp.getData(), string);
 }
 
-auto RegExpDerivationFormalRegExp = RegExpDerivation::RegistratorWrapper<regexp::FormalRegExp < >, regexp::FormalRegExp < > >(RegExpDerivation::derivation);
-auto RegExpDerivationUnboundedRegExp = RegExpDerivation::RegistratorWrapper<regexp::UnboundedRegExp < >, regexp::UnboundedRegExp < > >(RegExpDerivation::derivation);
+auto RegExpDerivationFormalRegExp = registration::OverloadRegister < RegExpDerivation, regexp::FormalRegExp < >, regexp::FormalRegExp < > > ( RegExpDerivation::derivation );
+auto RegExpDerivationUnboundedRegExp = registration::OverloadRegister < RegExpDerivation, regexp::UnboundedRegExp < >, regexp::UnboundedRegExp < > > ( RegExpDerivation::derivation );
 
 } /* namespace regexp */
diff --git a/alib2algo/src/regexp/transform/RegExpIntegral.cpp b/alib2algo/src/regexp/transform/RegExpIntegral.cpp
index f4558d7350..dc980d025b 100644
--- a/alib2algo/src/regexp/transform/RegExpIntegral.cpp
+++ b/alib2algo/src/regexp/transform/RegExpIntegral.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "RegExpIntegral.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -13,7 +14,7 @@ regexp::RegExp RegExpIntegral::integral(const regexp::RegExp& regexp, const stri
 	return dispatch(regexp.getData(), string);
 }
 
-auto RegExpIntegralFormalRegExp = RegExpIntegral::RegistratorWrapper<regexp::FormalRegExp < >, regexp::FormalRegExp < > > ( RegExpIntegral::integral );
-auto RegExpIntegralUnboundedRegExp = RegExpIntegral::RegistratorWrapper<regexp::UnboundedRegExp < >, regexp::UnboundedRegExp < > > ( RegExpIntegral::integral );
+auto RegExpIntegralFormalRegExp = registration::OverloadRegister < RegExpIntegral, regexp::FormalRegExp < >, regexp::FormalRegExp < > > ( RegExpIntegral::integral );
+auto RegExpIntegralUnboundedRegExp = registration::OverloadRegister < RegExpIntegral, regexp::UnboundedRegExp < >, regexp::UnboundedRegExp < > > ( RegExpIntegral::integral );
 
 } /* namespace regexp */
diff --git a/alib2algo/src/regexp/transform/RegExpIterate.cpp b/alib2algo/src/regexp/transform/RegExpIterate.cpp
index b89f389774..4205a203f8 100644
--- a/alib2algo/src/regexp/transform/RegExpIterate.cpp
+++ b/alib2algo/src/regexp/transform/RegExpIterate.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "RegExpIterate.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -13,7 +14,7 @@ regexp::RegExp RegExpIterate::iterate(const regexp::RegExp& regexp) {
 	return dispatch(regexp.getData());
 }
 
-auto RegExpIterateFormalRegExpFormalRegExp = RegExpIterate::RegistratorWrapper<regexp::FormalRegExp < >, regexp::FormalRegExp < > >(RegExpIterate::iterate);
-auto RegExpIterateUnboundedRegExpUnboundedRegExp = RegExpIterate::RegistratorWrapper<regexp::UnboundedRegExp < >, regexp::UnboundedRegExp < > >(RegExpIterate::iterate);
+auto RegExpIterateFormalRegExpFormalRegExp = registration::OverloadRegister < RegExpIterate, regexp::FormalRegExp < >, regexp::FormalRegExp < > > ( RegExpIterate::iterate );
+auto RegExpIterateUnboundedRegExpUnboundedRegExp = registration::OverloadRegister < RegExpIterate, regexp::UnboundedRegExp < >, regexp::UnboundedRegExp < > > ( RegExpIterate::iterate );
 
 } /* namespace regexp */
diff --git a/alib2algo/src/rte/convert/ToPostfixPushdownAutomaton.cpp b/alib2algo/src/rte/convert/ToPostfixPushdownAutomaton.cpp
index 44726d5bf1..4d10836452 100644
--- a/alib2algo/src/rte/convert/ToPostfixPushdownAutomaton.cpp
+++ b/alib2algo/src/rte/convert/ToPostfixPushdownAutomaton.cpp
@@ -8,6 +8,7 @@
 #include "ToPostfixPushdownAutomaton.h"
 #include "ToPostfixPushdownAutomatonGlushkov.h"
 #include <exception/CommonException.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace rte {
 
@@ -21,7 +22,7 @@ automaton::Automaton ToPostfixPushdownAutomaton::convert ( const rte::FormalRTE
 	return automaton::Automaton ( ToPostfixPushdownAutomatonGlushkov::convert ( rte ) );
 }
 
-auto ToAutomatonFormalRegExp = ToPostfixPushdownAutomaton::RegistratorWrapper < automaton::Automaton, rte::FormalRTE < > > ( ToPostfixPushdownAutomaton::convert );
+auto ToAutomatonFormalRegExp = registration::OverloadRegister < ToPostfixPushdownAutomaton, automaton::Automaton, rte::FormalRTE < > > ( ToPostfixPushdownAutomaton::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp
index 376e5cdb46..c323993418 100644
--- a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp
+++ b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp
@@ -17,6 +17,7 @@
 #include "../glushkov/GlushkovFollow.h"
 #include "../glushkov/GlushkovIndexate.h"
 #include "../glushkov/GlushkovFirst.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace rte {
 
@@ -135,7 +136,7 @@ automaton::NPDA < > ToPostfixPushdownAutomatonGlushkov::convert ( const rte::For
 	return automaton;
 }
 
-auto ToAutomatonGlushkovFormalRegExp = ToPostfixPushdownAutomatonGlushkov::RegistratorWrapper < automaton::NPDA < >, rte::FormalRTE < > > ( ToPostfixPushdownAutomatonGlushkov::convert );
+auto ToAutomatonGlushkovFormalRegExp = registration::OverloadRegister < ToPostfixPushdownAutomatonGlushkov, automaton::NPDA < >, rte::FormalRTE < > > ( ToPostfixPushdownAutomatonGlushkov::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/string/generate/RandomSubstringFactory.cpp b/alib2algo/src/string/generate/RandomSubstringFactory.cpp
index f624a03a54..be69bb6f0d 100644
--- a/alib2algo/src/string/generate/RandomSubstringFactory.cpp
+++ b/alib2algo/src/string/generate/RandomSubstringFactory.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "RandomSubstringFactory.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace string {
 
@@ -15,7 +16,7 @@ string::String RandomSubstringFactory::generateSubstring ( size_t size, const st
 	return dispatch ( size, v.getData ( ) );
 }
 
-auto RandomSubstringFactoryLinearString = RandomSubstringFactory::RegistratorWrapper < string::LinearString < >, string::LinearString < > > ( RandomSubstringFactory::generateSubstring );
+auto RandomSubstringFactoryLinearString = registration::OverloadRegister < RandomSubstringFactory, string::LinearString < >, string::LinearString < > > ( RandomSubstringFactory::generateSubstring );
 
 } /* namespace generate */
 
diff --git a/alib2algo/src/string/naive/ExactCompare.cpp b/alib2algo/src/string/naive/ExactCompare.cpp
index fe94c525c0..8dff42d677 100644
--- a/alib2algo/src/string/naive/ExactCompare.cpp
+++ b/alib2algo/src/string/naive/ExactCompare.cpp
@@ -9,6 +9,7 @@
 #include "string/LinearString.h"
 #include "string/CyclicString.h"
 #include "string/Epsilon.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace string {
 
@@ -18,9 +19,9 @@ int ExactCompare::compare ( const string::String & u, const string::String & v )
 	return dispatch ( u.getData ( ), v.getData ( ) );
 }
 
-auto ExactCompareEpsilon = ExactCompare::RegistratorWrapper < int, string::Epsilon < > > ( ExactCompare::compare );
-auto ExactCompareLinearString = ExactCompare::RegistratorWrapper < int, string::LinearString < > > ( ExactCompare::compare );
-auto ExactCompareCyclicString = ExactCompare::RegistratorWrapper < int, string::CyclicString < > > ( ExactCompare::compare );
+auto ExactCompareEpsilon = registration::OverloadRegister < ExactCompare, int, string::Epsilon < > > ( ExactCompare::compare );
+auto ExactCompareLinearString = registration::OverloadRegister < ExactCompare, int, string::LinearString < > > ( ExactCompare::compare );
+auto ExactCompareCyclicString = registration::OverloadRegister < ExactCompare, int, string::CyclicString < > > ( ExactCompare::compare );
 
 } /* namespace naive */
 
diff --git a/alib2algo/src/string/naive/ExactEqual.cpp b/alib2algo/src/string/naive/ExactEqual.cpp
index c732935b86..1ad6e5a90f 100644
--- a/alib2algo/src/string/naive/ExactEqual.cpp
+++ b/alib2algo/src/string/naive/ExactEqual.cpp
@@ -9,6 +9,7 @@
 #include "string/LinearString.h"
 #include "string/CyclicString.h"
 #include "string/Epsilon.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace string {
 
@@ -18,9 +19,9 @@ bool ExactEqual::equals ( const string::String & u, const string::String & v ) {
 	return dispatch ( u.getData ( ), v.getData ( ) );
 }
 
-auto ExactEqualEpsilon = ExactEqual::RegistratorWrapper < bool, string::Epsilon < > > ( ExactEqual::equals );
-auto ExactEqualLinearString = ExactEqual::RegistratorWrapper < bool, string::LinearString < > > ( ExactEqual::equals );
-auto ExactEqualCyclicString = ExactEqual::RegistratorWrapper < bool, string::CyclicString < > > ( ExactEqual::equals );
+auto ExactEqualEpsilon = registration::OverloadRegister < ExactEqual, bool, string::Epsilon < > > ( ExactEqual::equals );
+auto ExactEqualLinearString = registration::OverloadRegister < ExactEqual, bool, string::LinearString < > > ( ExactEqual::equals );
+auto ExactEqualCyclicString = registration::OverloadRegister < ExactEqual, bool, string::CyclicString < > > ( ExactEqual::equals );
 
 } /* namespace naive */
 
diff --git a/alib2algo/src/string/properties/BadCharacterShiftTable.cpp b/alib2algo/src/string/properties/BadCharacterShiftTable.cpp
index 2ce43f29d3..0237803dca 100644
--- a/alib2algo/src/string/properties/BadCharacterShiftTable.cpp
+++ b/alib2algo/src/string/properties/BadCharacterShiftTable.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "BadCharacterShiftTable.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace string {
 
@@ -15,7 +16,7 @@ std::map<DefaultSymbolType, size_t> BadCharacterShiftTable::bcs(const string::St
 	return dispatch(pattern.getData());
 }
 
-auto BadCharacterShiftTableLinearString = BadCharacterShiftTable::RegistratorWrapper<std::map<DefaultSymbolType, size_t>, string::LinearString < >>(BadCharacterShiftTable::bcs);
+auto BadCharacterShiftTableLinearString = registration::OverloadRegister < BadCharacterShiftTable, std::map < DefaultSymbolType, size_t >, string::LinearString < > > ( BadCharacterShiftTable::bcs );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/string/properties/BorderArray.cpp b/alib2algo/src/string/properties/BorderArray.cpp
index da63c9319f..167c4b7676 100644
--- a/alib2algo/src/string/properties/BorderArray.cpp
+++ b/alib2algo/src/string/properties/BorderArray.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "BorderArray.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace string {
 
@@ -15,7 +16,7 @@ std::vector<unsigned> BorderArray::construct(const string::String& string) {
 	return dispatch(string.getData());
 }
 
-auto BorderArrayLinearString = BorderArray::RegistratorWrapper<std::vector<unsigned>, string::LinearString < >>(BorderArray::construct);
+auto BorderArrayLinearString = registration::OverloadRegister < BorderArray, std::vector < unsigned >, string::LinearString < > > ( BorderArray::construct );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/string/properties/GoodSuffixShiftTable.cpp b/alib2algo/src/string/properties/GoodSuffixShiftTable.cpp
index 9d6cd1026f..48970cc1e6 100644
--- a/alib2algo/src/string/properties/GoodSuffixShiftTable.cpp
+++ b/alib2algo/src/string/properties/GoodSuffixShiftTable.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "GoodSuffixShiftTable.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace string {
 
@@ -15,7 +16,7 @@ std::vector < size_t > GoodSuffixShiftTable::gss ( const string::String & patter
 	return dispatch ( pattern.getData ( ) );
 }
 
-auto GoodSuffixShiftTableLinearString = GoodSuffixShiftTable::RegistratorWrapper < std::vector < size_t >, string::LinearString < > > ( GoodSuffixShiftTable::gss );
+auto GoodSuffixShiftTableLinearString = registration::OverloadRegister < GoodSuffixShiftTable, std::vector < size_t >, string::LinearString < > > ( GoodSuffixShiftTable::gss );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/string/properties/ReversedBadCharacterShiftTable.cpp b/alib2algo/src/string/properties/ReversedBadCharacterShiftTable.cpp
index 640fb26e96..295d9862ce 100644
--- a/alib2algo/src/string/properties/ReversedBadCharacterShiftTable.cpp
+++ b/alib2algo/src/string/properties/ReversedBadCharacterShiftTable.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ReversedBadCharacterShiftTable.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace string {
 
@@ -15,7 +16,7 @@ std::map < DefaultSymbolType, size_t > ReversedBadCharacterShiftTable::bcs ( con
 	return dispatch ( pattern.getData ( ) );
 }
 
-auto ReversedBadCharacterShiftTableLinearString = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < DefaultSymbolType, size_t >, string::LinearString < > > ( ReversedBadCharacterShiftTable::bcs );
+auto ReversedBadCharacterShiftTableLinearString = registration::OverloadRegister < ReversedBadCharacterShiftTable, std::map < DefaultSymbolType, size_t >, string::LinearString < > > ( ReversedBadCharacterShiftTable::bcs );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/string/simplify/NormalizeAlphabet.cpp b/alib2algo/src/string/simplify/NormalizeAlphabet.cpp
index c70d1436c8..595a4cafc9 100644
--- a/alib2algo/src/string/simplify/NormalizeAlphabet.cpp
+++ b/alib2algo/src/string/simplify/NormalizeAlphabet.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "NormalizeAlphabet.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace string {
 
@@ -15,7 +16,7 @@ string::String NormalizeAlphabet::normalize(const string::String& string) {
 	return dispatch(string.getData());
 }
 
-auto NormalizeAlphabetLinearString = NormalizeAlphabet::RegistratorWrapper<string::LinearString < >, string::LinearString < >>(NormalizeAlphabet::normalize);
+auto NormalizeAlphabetLinearString = registration::OverloadRegister < NormalizeAlphabet, string::LinearString < >, string::LinearString < > > ( NormalizeAlphabet::normalize );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/string/simplify/NormalizeRotation.cpp b/alib2algo/src/string/simplify/NormalizeRotation.cpp
index db2c2c689f..18d24531aa 100644
--- a/alib2algo/src/string/simplify/NormalizeRotation.cpp
+++ b/alib2algo/src/string/simplify/NormalizeRotation.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "NormalizeRotation.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace string {
 
@@ -15,7 +16,7 @@ string::String NormalizeRotation::normalize(const string::String& string) {
 	return dispatch(string.getData());
 }
 
-auto NormalizeRotationCyclicString = NormalizeRotation::RegistratorWrapper<string::CyclicString < >, string::CyclicString < >>(NormalizeRotation::normalize);
+auto NormalizeRotationCyclicString = registration::OverloadRegister < NormalizeRotation, string::CyclicString < >, string::CyclicString < > > ( NormalizeRotation::normalize );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/stringology/exact/BoyerMoore.cpp b/alib2algo/src/stringology/exact/BoyerMoore.cpp
index 3b51d1958e..567785fe90 100644
--- a/alib2algo/src/stringology/exact/BoyerMoore.cpp
+++ b/alib2algo/src/stringology/exact/BoyerMoore.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "BoyerMoore.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -15,7 +16,7 @@ std::set<unsigned> BoyerMoore::match(const string::String& subject, const string
 	return dispatch(subject.getData(), pattern.getData());
 }
 
-auto BoyerMooreLinearStringLinearString = BoyerMoore::RegistratorWrapper<std::set<unsigned>, string::LinearString < >, string::LinearString < >>(BoyerMoore::match);
+auto BoyerMooreLinearStringLinearString = registration::OverloadRegister < BoyerMoore, std::set < unsigned >, string::LinearString < >, string::LinearString < > > ( BoyerMoore::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/stringology/exact/BoyerMooreHorspool.cpp b/alib2algo/src/stringology/exact/BoyerMooreHorspool.cpp
index 71d1eeb506..0edac2ab71 100644
--- a/alib2algo/src/stringology/exact/BoyerMooreHorspool.cpp
+++ b/alib2algo/src/stringology/exact/BoyerMooreHorspool.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "BoyerMooreHorspool.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -15,7 +16,7 @@ std::set<unsigned> BoyerMooreHorspool::match(const string::String& subject, cons
 	return dispatch(subject.getData(), pattern.getData());
 }
 
-auto BoyerMooreHorspoolLinearStringLinearString = BoyerMooreHorspool::RegistratorWrapper<std::set<unsigned>, string::LinearString < >, string::LinearString < >>(BoyerMooreHorspool::match);
+auto BoyerMooreHorspoolLinearStringLinearString = registration::OverloadRegister < BoyerMooreHorspool, std::set < unsigned >, string::LinearString < >, string::LinearString < > > ( BoyerMooreHorspool::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/stringology/exact/DeadZoneUsingBadCharacterShift.cpp b/alib2algo/src/stringology/exact/DeadZoneUsingBadCharacterShift.cpp
index 5006c77bc4..1e065c73b3 100644
--- a/alib2algo/src/stringology/exact/DeadZoneUsingBadCharacterShift.cpp
+++ b/alib2algo/src/stringology/exact/DeadZoneUsingBadCharacterShift.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "DeadZoneUsingBadCharacterShift.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -15,7 +16,7 @@ std::set < unsigned > DeadZoneUsingBadCharacterShift::match ( const string::Stri
 	return dispatch ( subject.getData ( ), pattern.getData ( ) );
 }
 
-auto DeadZoneUsingBadCharacterShiftLinearStringLinearString = DeadZoneUsingBadCharacterShift::RegistratorWrapper < std::set < unsigned >, string::LinearString < >, string::LinearString < > > ( DeadZoneUsingBadCharacterShift::match );
+auto DeadZoneUsingBadCharacterShiftLinearStringLinearString = registration::OverloadRegister < DeadZoneUsingBadCharacterShift, std::set < unsigned >, string::LinearString < >, string::LinearString < > > ( DeadZoneUsingBadCharacterShift::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/stringology/exact/ExactFactorMatch.cpp b/alib2algo/src/stringology/exact/ExactFactorMatch.cpp
index 3ad442f933..265cbf8c88 100644
--- a/alib2algo/src/stringology/exact/ExactFactorMatch.cpp
+++ b/alib2algo/src/stringology/exact/ExactFactorMatch.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ExactFactorMatch.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -15,7 +16,7 @@ std::set < unsigned > ExactFactorMatch::match ( const string::String & subject,
 	return dispatch ( subject.getData ( ), pattern.getData ( ) );
 }
 
-auto ExactFactorMatchLinearString = ExactFactorMatch::RegistratorWrapper < std::set < unsigned >, string::LinearString < > > ( ExactFactorMatch::match );
+auto ExactFactorMatchLinearString = registration::OverloadRegister < ExactFactorMatch, std::set < unsigned >, string::LinearString < > > ( ExactFactorMatch::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/stringology/exact/ReversedBoyerMooreHorspool.cpp b/alib2algo/src/stringology/exact/ReversedBoyerMooreHorspool.cpp
index 6b6d1d8804..57358def6e 100644
--- a/alib2algo/src/stringology/exact/ReversedBoyerMooreHorspool.cpp
+++ b/alib2algo/src/stringology/exact/ReversedBoyerMooreHorspool.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ReversedBoyerMooreHorspool.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -15,7 +16,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const string::String &
 	return dispatch ( subject.getData ( ), pattern.getData ( ) );
 }
 
-auto ReversedBoyerMooreHorpoolLinearStringLinearString = ReversedBoyerMooreHorspool::RegistratorWrapper < std::set < unsigned >, string::LinearString < >, string::LinearString < > > ( ReversedBoyerMooreHorspool::match );
+auto ReversedBoyerMooreHorpoolLinearStringLinearString = registration::OverloadRegister < ReversedBoyerMooreHorspool, std::set < unsigned >, string::LinearString < >, string::LinearString < > > ( ReversedBoyerMooreHorspool::match );
 
 } /* namespace exact */
 
diff --git a/alib2algo/src/stringology/indexing/BitParallelIndexConstruction.cpp b/alib2algo/src/stringology/indexing/BitParallelIndexConstruction.cpp
index ab1944e02b..0ff8dbd626 100644
--- a/alib2algo/src/stringology/indexing/BitParallelIndexConstruction.cpp
+++ b/alib2algo/src/stringology/indexing/BitParallelIndexConstruction.cpp
@@ -8,6 +8,7 @@
 #include "BitParallelIndexConstruction.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ indexes::stringology::BitParallelIndex < DefaultSymbolType > BitParallelIndexCon
 	return dispatch ( string.getData ( ) );
 }
 
-auto bitParallelIndexConstructionLinearString = BitParallelIndexConstruction::RegistratorWrapper < indexes::stringology::BitParallelIndex < DefaultSymbolType >, string::LinearString < > > ( BitParallelIndexConstruction::construct );
+auto bitParallelIndexConstructionLinearString = registration::OverloadRegister < BitParallelIndexConstruction, indexes::stringology::BitParallelIndex < DefaultSymbolType >, string::LinearString < > > ( BitParallelIndexConstruction::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/indexing/CompressedBitParallelIndexConstruction.cpp b/alib2algo/src/stringology/indexing/CompressedBitParallelIndexConstruction.cpp
index d88f00999c..1621e935b0 100644
--- a/alib2algo/src/stringology/indexing/CompressedBitParallelIndexConstruction.cpp
+++ b/alib2algo/src/stringology/indexing/CompressedBitParallelIndexConstruction.cpp
@@ -8,6 +8,7 @@
 #include "CompressedBitParallelIndexConstruction.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ indexes::stringology::CompressedBitParallelIndex < DefaultSymbolType > Compresse
 	return dispatch ( string.getData ( ) );
 }
 
-auto compressedCompressedBitParallelIndexConstructionLinearString = CompressedBitParallelIndexConstruction::RegistratorWrapper < indexes::stringology::CompressedBitParallelIndex < DefaultSymbolType >, string::LinearString < > > ( CompressedBitParallelIndexConstruction::construct );
+auto compressedCompressedBitParallelIndexConstructionLinearString = registration::OverloadRegister < CompressedBitParallelIndexConstruction, indexes::stringology::CompressedBitParallelIndex < DefaultSymbolType >, string::LinearString < > > ( CompressedBitParallelIndexConstruction::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp
index 459e1325d7..63ba8fdf81 100644
--- a/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp
+++ b/alib2algo/src/stringology/indexing/ExactFactorOracleAutomaton.cpp
@@ -4,6 +4,7 @@
 
 #include "ExactFactorOracleAutomaton.h"
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -53,7 +54,7 @@ void ExactFactorOracleAutomaton::oracleAddLetter ( automaton::DFA < > & oracle,
 	supplyFunction.insert( { newState, supplyState } );
 }
 
-auto FactorOracleAutomatonLinearString = ExactFactorOracleAutomaton::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( ExactFactorOracleAutomaton::construct );
+auto FactorOracleAutomatonLinearString = registration::OverloadRegister < ExactFactorOracleAutomaton, automaton::DFA < >, string::LinearString < > > ( ExactFactorOracleAutomaton::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/indexing/ExactNondeterministicSubsequenceAutomaton.cpp b/alib2algo/src/stringology/indexing/ExactNondeterministicSubsequenceAutomaton.cpp
index feb46bf22c..7a0c25b44b 100644
--- a/alib2algo/src/stringology/indexing/ExactNondeterministicSubsequenceAutomaton.cpp
+++ b/alib2algo/src/stringology/indexing/ExactNondeterministicSubsequenceAutomaton.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ExactNondeterministicSubsequenceAutomaton.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -15,7 +16,7 @@ automaton::Automaton ExactNondeterministicSubsequenceAutomaton::construct(const
 	return dispatch(text.getData());
 }
 
-auto ExactNondeterministicSubsequenceAutomatonLinearString = ExactNondeterministicSubsequenceAutomaton::RegistratorWrapper < automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned >, string::LinearString < > > ( ExactNondeterministicSubsequenceAutomaton::construct );
+auto ExactNondeterministicSubsequenceAutomatonLinearString = registration::OverloadRegister < ExactNondeterministicSubsequenceAutomaton, automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned >, string::LinearString < > > ( ExactNondeterministicSubsequenceAutomaton::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/indexing/ExactSubsequenceAutomaton.cpp b/alib2algo/src/stringology/indexing/ExactSubsequenceAutomaton.cpp
index 3da7a3dcd3..185498842f 100644
--- a/alib2algo/src/stringology/indexing/ExactSubsequenceAutomaton.cpp
+++ b/alib2algo/src/stringology/indexing/ExactSubsequenceAutomaton.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ExactSubsequenceAutomaton.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -15,7 +16,7 @@ automaton::Automaton ExactSubsequenceAutomaton::construct(const string::String&
 	return dispatch(text.getData());
 }
 
-auto ExactSubsequenceAutomatonLinearString = ExactSubsequenceAutomaton::RegistratorWrapper < automaton::DFA < DefaultSymbolType, unsigned >, string::LinearString < > > ( ExactSubsequenceAutomaton::construct );
+auto ExactSubsequenceAutomatonLinearString = registration::OverloadRegister < ExactSubsequenceAutomaton, automaton::DFA < DefaultSymbolType, unsigned >, string::LinearString < > > ( ExactSubsequenceAutomaton::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/indexing/ExactSuffixAutomaton.cpp b/alib2algo/src/stringology/indexing/ExactSuffixAutomaton.cpp
index 15d808a8a8..59f5f5706a 100644
--- a/alib2algo/src/stringology/indexing/ExactSuffixAutomaton.cpp
+++ b/alib2algo/src/stringology/indexing/ExactSuffixAutomaton.cpp
@@ -3,6 +3,7 @@
  */
 
 #include "ExactSuffixAutomaton.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -81,7 +82,7 @@ void ExactSuffixAutomaton::suffixAutomatonAddSymbol ( automaton::DFA < > & suffi
 	lastState = newState;
 }
 
-auto SuffixAutomatonLinearString = ExactSuffixAutomaton::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( ExactSuffixAutomaton::construct );
+auto SuffixAutomatonLinearString = registration::OverloadRegister < ExactSuffixAutomaton, automaton::DFA < >, string::LinearString < > > ( ExactSuffixAutomaton::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/indexing/NondeterministicExactFactorAutomaton.cpp b/alib2algo/src/stringology/indexing/NondeterministicExactFactorAutomaton.cpp
index 0fa8a91dc2..ca86dc7c6d 100644
--- a/alib2algo/src/stringology/indexing/NondeterministicExactFactorAutomaton.cpp
+++ b/alib2algo/src/stringology/indexing/NondeterministicExactFactorAutomaton.cpp
@@ -10,6 +10,7 @@
 #include <string/Epsilon.h>
 
 #include <deque>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -19,7 +20,7 @@ automaton::Automaton NondeterministicExactFactorAutomaton::construct(const strin
 	return dispatch(text.getData());
 }
 
-auto ExactFactorAutomatonLinearString = NondeterministicExactFactorAutomaton::RegistratorWrapper<automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned >, string::LinearString < > >(NondeterministicExactFactorAutomaton::construct);
+auto ExactFactorAutomatonLinearString = registration::OverloadRegister < NondeterministicExactFactorAutomaton, automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned >, string::LinearString < > > ( NondeterministicExactFactorAutomaton::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.cpp b/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.cpp
index fa825f6d39..9e387658c1 100644
--- a/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.cpp
+++ b/alib2algo/src/stringology/indexing/NondeterministicExactSuffixAutomaton.cpp
@@ -3,6 +3,7 @@
  */
 
 #include "NondeterministicExactSuffixAutomaton.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -29,7 +30,7 @@ automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned > Nondet
 	return nfaSuffixAutomaton;
 }
 
-auto SuffixAutomatonNondeterministicLinearString = NondeterministicExactSuffixAutomaton::RegistratorWrapper < automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned >, string::LinearString < > > ( NondeterministicExactSuffixAutomaton::construct );
+auto SuffixAutomatonNondeterministicLinearString = registration::OverloadRegister < NondeterministicExactSuffixAutomaton, automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, unsigned >, string::LinearString < > > ( NondeterministicExactSuffixAutomaton::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/indexing/PositionHeapNaive.cpp b/alib2algo/src/stringology/indexing/PositionHeapNaive.cpp
index 0cf33b4968..e9dc4ffbfa 100644
--- a/alib2algo/src/stringology/indexing/PositionHeapNaive.cpp
+++ b/alib2algo/src/stringology/indexing/PositionHeapNaive.cpp
@@ -8,6 +8,7 @@
 #include "PositionHeapNaive.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ indexes::stringology::PositionHeap < DefaultSymbolType > PositionHeapNaive::cons
 	return dispatch ( string.getData ( ) );
 }
 
-auto positionHeapNaiveLinearString = PositionHeapNaive::RegistratorWrapper < indexes::stringology::PositionHeap < DefaultSymbolType >, string::LinearString < > > ( PositionHeapNaive::construct );
+auto positionHeapNaiveLinearString = registration::OverloadRegister < PositionHeapNaive, indexes::stringology::PositionHeap < DefaultSymbolType >, string::LinearString < > > ( PositionHeapNaive::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/indexing/SuffixArrayNaive.cpp b/alib2algo/src/stringology/indexing/SuffixArrayNaive.cpp
index b003e712e0..4a4d26a02c 100644
--- a/alib2algo/src/stringology/indexing/SuffixArrayNaive.cpp
+++ b/alib2algo/src/stringology/indexing/SuffixArrayNaive.cpp
@@ -8,6 +8,7 @@
 #include "SuffixArrayNaive.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ indexes::stringology::SuffixArray < > SuffixArrayNaive::construct ( const string
 	return dispatch ( string.getData ( ) );
 }
 
-auto suffixArrayNaiveLinearString = SuffixArrayNaive::RegistratorWrapper < indexes::stringology::SuffixArray < >, string::LinearString < > > ( SuffixArrayNaive::construct );
+auto suffixArrayNaiveLinearString = registration::OverloadRegister < SuffixArrayNaive, indexes::stringology::SuffixArray < >, string::LinearString < > > ( SuffixArrayNaive::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/indexing/SuffixTrieNaive.cpp b/alib2algo/src/stringology/indexing/SuffixTrieNaive.cpp
index c5bb33a5a7..82aa80eb7f 100644
--- a/alib2algo/src/stringology/indexing/SuffixTrieNaive.cpp
+++ b/alib2algo/src/stringology/indexing/SuffixTrieNaive.cpp
@@ -8,6 +8,7 @@
 #include "SuffixTrieNaive.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ indexes::stringology::SuffixTrie < DefaultSymbolType > SuffixTrieNaive::construc
 	return dispatch ( string.getData ( ) );
 }
 
-auto suffixTrieNaiveLinearString = SuffixTrieNaive::RegistratorWrapper < indexes::stringology::SuffixTrie < DefaultSymbolType >, string::LinearString < > > ( SuffixTrieNaive::construct );
+auto suffixTrieNaiveLinearString = registration::OverloadRegister < SuffixTrieNaive, indexes::stringology::SuffixTrie < DefaultSymbolType >, string::LinearString < > > ( SuffixTrieNaive::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2algo/src/stringology/matching/BNDMMatcherConstruction.cpp b/alib2algo/src/stringology/matching/BNDMMatcherConstruction.cpp
index 01c752df57..30e4712a7e 100644
--- a/alib2algo/src/stringology/matching/BNDMMatcherConstruction.cpp
+++ b/alib2algo/src/stringology/matching/BNDMMatcherConstruction.cpp
@@ -8,6 +8,7 @@
 #include "BNDMMatcherConstruction.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ indexes::stringology::BNDMMatcher < DefaultSymbolType > BNDMMatcherConstruction:
 	return dispatch ( string.getData ( ) );
 }
 
-auto BNDMIndexConstructionLinearString = BNDMMatcherConstruction::RegistratorWrapper < indexes::stringology::BNDMMatcher < >, string::LinearString < > > ( BNDMMatcherConstruction::construct );
+auto BNDMIndexConstructionLinearString = registration::OverloadRegister < BNDMMatcherConstruction, indexes::stringology::BNDMMatcher < >, string::LinearString < > > ( BNDMMatcherConstruction::construct );
 
 } /* namespace matching */
 
diff --git a/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp b/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp
index 1a5268690e..3ed8a2c25a 100644
--- a/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp
+++ b/alib2algo/src/stringology/matching/DAWGMatcherConstruction.cpp
@@ -4,6 +4,7 @@
 
 #include "DAWGMatcherConstruction.h"
 #include <stringology/indexing/ExactSuffixAutomaton.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -21,7 +22,7 @@ automaton::DFA < > DAWGMatcherConstruction::construct ( const string::LinearStri
 	return stringology::indexing::ExactSuffixAutomaton::construct ( reversedPattern );
 }
 
-auto DAWGMatcherConstructionLinearString = DAWGMatcherConstruction::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( DAWGMatcherConstruction::construct );
+auto DAWGMatcherConstructionLinearString = registration::OverloadRegister < DAWGMatcherConstruction, automaton::DFA < >, string::LinearString < > > ( DAWGMatcherConstruction::construct );
 
 } /* namespace matching */
 
diff --git a/alib2algo/src/stringology/matching/ExactMatchingAutomaton.cpp b/alib2algo/src/stringology/matching/ExactMatchingAutomaton.cpp
index f7114e25c5..d176d08337 100644
--- a/alib2algo/src/stringology/matching/ExactMatchingAutomaton.cpp
+++ b/alib2algo/src/stringology/matching/ExactMatchingAutomaton.cpp
@@ -10,6 +10,7 @@
 #include <string/Epsilon.h>
 
 #include <deque>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -19,7 +20,7 @@ automaton::Automaton ExactMatchingAutomaton::construct(const string::String& pat
 	return dispatch(pattern.getData());
 }
 
-auto ExactMatchingAutomatonLinearString = ExactMatchingAutomaton::RegistratorWrapper<automaton::NFA < DefaultSymbolType, unsigned > , string::LinearString < > >(ExactMatchingAutomaton::construct);
+auto ExactMatchingAutomatonLinearString = registration::OverloadRegister < ExactMatchingAutomaton, automaton::NFA < DefaultSymbolType, unsigned >, string::LinearString < > > ( ExactMatchingAutomaton::construct );
 
 } /* namespace matching */
 
diff --git a/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp b/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp
index c9f139a742..8812888071 100644
--- a/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp
+++ b/alib2algo/src/stringology/matching/NaiveDAWGMatcherConstruction.cpp
@@ -7,6 +7,7 @@
 #include <automaton/simplify/Minimize.h>
 #include <automaton/simplify/EpsilonRemoverIncoming.h>
 #include <stringology/indexing/NondeterministicExactSuffixAutomaton.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -27,7 +28,7 @@ automaton::DFA < DefaultSymbolType, std::set < unsigned > > NaiveDAWGMatcherCons
 
 }
 
-auto NaiveDAWGMatcherConstructionLinearString = NaiveDAWGMatcherConstruction::RegistratorWrapper < automaton::DFA < DefaultSymbolType, std::set < unsigned > >, string::LinearString < > > ( NaiveDAWGMatcherConstruction::naiveConstruct );
+auto NaiveDAWGMatcherConstructionLinearString = registration::OverloadRegister < NaiveDAWGMatcherConstruction, automaton::DFA < DefaultSymbolType, std::set < unsigned > >, string::LinearString < > > ( NaiveDAWGMatcherConstruction::naiveConstruct );
 
 } /* namespace matching */
 
diff --git a/alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp b/alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp
index aa9b1f24dd..c345342bdc 100644
--- a/alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp
+++ b/alib2algo/src/stringology/matching/OracleMatcherConstruction.cpp
@@ -4,6 +4,7 @@
 
 #include "OracleMatcherConstruction.h"
 #include <stringology/indexing/ExactSuffixAutomaton.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -21,7 +22,7 @@ automaton::DFA < > OracleMatcherConstruction::construct ( const string::LinearSt
 	return stringology::indexing::ExactSuffixAutomaton::construct ( reversedPattern );
 }
 
-auto OracleMatcherConstructionLinearString = OracleMatcherConstruction::RegistratorWrapper < automaton::DFA < >, string::LinearString < > > ( OracleMatcherConstruction::construct );
+auto OracleMatcherConstructionLinearString = registration::OverloadRegister < OracleMatcherConstruction, automaton::DFA < >, string::LinearString < > > ( OracleMatcherConstruction::construct );
 
 } /* namespace matching */
 
diff --git a/alib2algo/src/stringology/matching/WideBNDMMatcherConstruction.cpp b/alib2algo/src/stringology/matching/WideBNDMMatcherConstruction.cpp
index 1357d72957..5231f71f0c 100644
--- a/alib2algo/src/stringology/matching/WideBNDMMatcherConstruction.cpp
+++ b/alib2algo/src/stringology/matching/WideBNDMMatcherConstruction.cpp
@@ -8,6 +8,7 @@
 #include "WideBNDMMatcherConstruction.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ indexes::stringology::BitParallelIndex < DefaultSymbolType > WideBNDMMatcherCons
 	return dispatch ( string.getData ( ) );
 }
 
-auto WideBNDMIndexConstructionLinearString = WideBNDMMatcherConstruction::RegistratorWrapper < indexes::stringology::BitParallelIndex < DefaultSymbolType >, string::LinearString < > > ( WideBNDMMatcherConstruction::construct );
+auto WideBNDMIndexConstructionLinearString = registration::OverloadRegister < WideBNDMMatcherConstruction, indexes::stringology::BitParallelIndex < DefaultSymbolType >, string::LinearString < > > ( WideBNDMMatcherConstruction::construct );
 
 } /* namespace matching */
 
diff --git a/alib2algo/src/stringology/properties/BackboneLength.cpp b/alib2algo/src/stringology/properties/BackboneLength.cpp
index f1f9f2d3de..25189e865a 100644
--- a/alib2algo/src/stringology/properties/BackboneLength.cpp
+++ b/alib2algo/src/stringology/properties/BackboneLength.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "BackboneLength.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -15,7 +16,7 @@ unsigned BackboneLength::length ( const automaton::Automaton & automaton ) {
 	return dispatch ( automaton.getData ( ) );
 }
 
-auto backboneLengthDFA = BackboneLength::RegistratorWrapper < unsigned, automaton::DFA < > > ( BackboneLength::length );
+auto backboneLengthDFA = registration::OverloadRegister < BackboneLength, unsigned, automaton::DFA < > > ( BackboneLength::length );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/stringology/query/BNDMOccurrences.cpp b/alib2algo/src/stringology/query/BNDMOccurrences.cpp
index d184d80aa4..fa0e65f776 100644
--- a/alib2algo/src/stringology/query/BNDMOccurrences.cpp
+++ b/alib2algo/src/stringology/query/BNDMOccurrences.cpp
@@ -8,6 +8,7 @@
 #include "BNDMOccurrences.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ std::set < unsigned > BNDMOccurrences::query ( const indexes::stringology::BNDMM
 	return dispatch ( pattern, subject.getData ( ) );
 }
 
-auto bndmOccurrencesLinearString = BNDMOccurrences::RegistratorWrapper < std::set < unsigned >, string::LinearString < > > ( BNDMOccurrences::query );
+auto bndmOccurrencesLinearString = registration::OverloadRegister < BNDMOccurrences, std::set < unsigned >, string::LinearString < > > ( BNDMOccurrences::query );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/stringology/query/BackwardDAWGMatching.cpp b/alib2algo/src/stringology/query/BackwardDAWGMatching.cpp
index e93db0dd56..8f075f3eae 100644
--- a/alib2algo/src/stringology/query/BackwardDAWGMatching.cpp
+++ b/alib2algo/src/stringology/query/BackwardDAWGMatching.cpp
@@ -12,6 +12,7 @@
 #include <algorithm>
 #include <map>
 #include <measure>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -62,7 +63,7 @@ std::set < unsigned > BackwardDAWGMatching::match ( const string::LinearString <
 	return occ;
 }
 
-auto BackwardDAWGMatchingLinearStringLinearString = BackwardDAWGMatching::RegistratorWrapper < std::set < unsigned >, string::LinearString < >, automaton::DFA < > > ( BackwardDAWGMatching::match );
+auto BackwardDAWGMatchingLinearStringLinearString = registration::OverloadRegister < BackwardDAWGMatching, std::set < unsigned >, string::LinearString < >, automaton::DFA < > > ( BackwardDAWGMatching::match );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/stringology/query/BackwardOracleMatching.cpp b/alib2algo/src/stringology/query/BackwardOracleMatching.cpp
index 57da6ea3b5..a4f6b39222 100644
--- a/alib2algo/src/stringology/query/BackwardOracleMatching.cpp
+++ b/alib2algo/src/stringology/query/BackwardOracleMatching.cpp
@@ -12,6 +12,7 @@
 #include <algorithm>
 #include <map>
 #include <measure>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -58,7 +59,7 @@ std::set < unsigned > BackwardOracleMatching::match ( const string::LinearString
 	return occ;
 }
 
-auto BackwardOracleMatchingLinearStringLinearString = BackwardOracleMatching::RegistratorWrapper < std::set < unsigned >, string::LinearString < >, automaton::DFA < > > ( BackwardOracleMatching::match );
+auto BackwardOracleMatchingLinearStringLinearString = registration::OverloadRegister < BackwardOracleMatching, std::set < unsigned >, string::LinearString < >, automaton::DFA < > > ( BackwardOracleMatching::match );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/stringology/query/BitParallelismFactors.cpp b/alib2algo/src/stringology/query/BitParallelismFactors.cpp
index d2eb2f41cf..80720e9a33 100644
--- a/alib2algo/src/stringology/query/BitParallelismFactors.cpp
+++ b/alib2algo/src/stringology/query/BitParallelismFactors.cpp
@@ -8,6 +8,7 @@
 #include "BitParallelismFactors.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ std::set < unsigned > BitParallelismFactors::query ( const indexes::stringology:
 	return dispatch ( bitParallelIndex, string.getData ( ) );
 }
 
-auto BitParallelismFactorsLinearString = BitParallelismFactors::RegistratorWrapper < std::set < unsigned >, string::LinearString < > > ( BitParallelismFactors::query );
+auto BitParallelismFactorsLinearString = registration::OverloadRegister < BitParallelismFactors, std::set < unsigned >, string::LinearString < > > ( BitParallelismFactors::query );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/stringology/query/CompressedBitParallelismFactors.cpp b/alib2algo/src/stringology/query/CompressedBitParallelismFactors.cpp
index d1eea5dd83..14e50e1b31 100644
--- a/alib2algo/src/stringology/query/CompressedBitParallelismFactors.cpp
+++ b/alib2algo/src/stringology/query/CompressedBitParallelismFactors.cpp
@@ -8,6 +8,7 @@
 #include "CompressedBitParallelismFactors.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ std::set < unsigned > CompressedBitParallelismFactors::query ( const indexes::st
 	return dispatch ( compressedBitParallelIndex, string.getData ( ) );
 }
 
-auto CompressedBitParallelismFactorsLinearString = CompressedBitParallelismFactors::RegistratorWrapper < std::set < unsigned >, string::LinearString < > > ( CompressedBitParallelismFactors::query );
+auto CompressedBitParallelismFactorsLinearString = registration::OverloadRegister < CompressedBitParallelismFactors, std::set < unsigned >, string::LinearString < > > ( CompressedBitParallelismFactors::query );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/stringology/query/PositionHeapFactors.cpp b/alib2algo/src/stringology/query/PositionHeapFactors.cpp
index ce32e67fca..2433b6a1ae 100644
--- a/alib2algo/src/stringology/query/PositionHeapFactors.cpp
+++ b/alib2algo/src/stringology/query/PositionHeapFactors.cpp
@@ -8,6 +8,7 @@
 #include "PositionHeapFactors.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ std::set < unsigned > PositionHeapFactors::query ( const indexes::stringology::P
 	return dispatch ( positionHeap, string.getData ( ) );
 }
 
-auto PositionHeapFactorsLinearString = PositionHeapFactors::RegistratorWrapper < std::set < unsigned >, string::LinearString < > > ( PositionHeapFactors::query );
+auto PositionHeapFactorsLinearString = registration::OverloadRegister < PositionHeapFactors, std::set < unsigned >, string::LinearString < > > ( PositionHeapFactors::query );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/stringology/query/SuffixArrayFactors.cpp b/alib2algo/src/stringology/query/SuffixArrayFactors.cpp
index 52d61687c4..dda1a69ca6 100644
--- a/alib2algo/src/stringology/query/SuffixArrayFactors.cpp
+++ b/alib2algo/src/stringology/query/SuffixArrayFactors.cpp
@@ -8,6 +8,7 @@
 #include "SuffixArrayFactors.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ std::set < unsigned > SuffixArrayFactors::query ( const indexes::stringology::Su
 	return dispatch ( suffixArray, string.getData ( ) );
 }
 
-auto SuffixArrayFactorsLinearString = SuffixArrayFactors::RegistratorWrapper < std::set < unsigned >, string::LinearString < > > ( SuffixArrayFactors::query );
+auto SuffixArrayFactorsLinearString = registration::OverloadRegister < SuffixArrayFactors, std::set < unsigned >, string::LinearString < > > ( SuffixArrayFactors::query );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/stringology/query/SuffixTrieFactors.cpp b/alib2algo/src/stringology/query/SuffixTrieFactors.cpp
index c47ad35bd8..4c2fea5f5d 100644
--- a/alib2algo/src/stringology/query/SuffixTrieFactors.cpp
+++ b/alib2algo/src/stringology/query/SuffixTrieFactors.cpp
@@ -8,6 +8,7 @@
 #include "SuffixTrieFactors.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ std::set < unsigned > SuffixTrieFactors::query ( const indexes::stringology::Suf
 	return dispatch ( suffixTrie, string.getData ( ) );
 }
 
-auto SuffixTrieFactorsLinearString = SuffixTrieFactors::RegistratorWrapper < std::set < unsigned >, string::LinearString < > > ( SuffixTrieFactors::query );
+auto SuffixTrieFactorsLinearString = registration::OverloadRegister < SuffixTrieFactors, std::set < unsigned >, string::LinearString < > > ( SuffixTrieFactors::query );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/stringology/query/WideBNDMOccurrences.cpp b/alib2algo/src/stringology/query/WideBNDMOccurrences.cpp
index e028f64898..c29332bdba 100644
--- a/alib2algo/src/stringology/query/WideBNDMOccurrences.cpp
+++ b/alib2algo/src/stringology/query/WideBNDMOccurrences.cpp
@@ -8,6 +8,7 @@
 #include "WideBNDMOccurrences.h"
 
 #include <string/LinearString.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -17,7 +18,7 @@ std::set < unsigned > WideBNDMOccurrences::query ( const indexes::stringology::B
 	return dispatch ( pattern, subject.getData ( ) );
 }
 
-auto wideBNDMOccurrencesLinearString = WideBNDMOccurrences::RegistratorWrapper < std::set < unsigned >, string::LinearString < > > ( WideBNDMOccurrences::query );
+auto wideBNDMOccurrencesLinearString = registration::OverloadRegister < WideBNDMOccurrences, std::set < unsigned >, string::LinearString < > > ( WideBNDMOccurrences::query );
 
 } /* namespace query */
 
diff --git a/alib2algo/src/tree/NormalizeTreeLabels.cpp b/alib2algo/src/tree/NormalizeTreeLabels.cpp
index 26b509933e..ad56aaeeb2 100644
--- a/alib2algo/src/tree/NormalizeTreeLabels.cpp
+++ b/alib2algo/src/tree/NormalizeTreeLabels.cpp
@@ -7,6 +7,7 @@
 
 #include "NormalizeTreeLabels.h"
 #include <tree/Tree.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace tree {
 
@@ -14,6 +15,6 @@ tree::Tree NormalizeTreeLabels::normalize ( const tree::Tree & tree ) {
 	return dispatch ( tree.getData ( ) );
 }
 
-auto NormalizeTreeLabelsRankedTree = NormalizeTreeLabels::RegistratorWrapper < tree::RankedTree < unsigned, DefaultRankType >, tree::RankedTree < > > ( NormalizeTreeLabels::normalize );
+auto NormalizeTreeLabelsRankedTree = registration::OverloadRegister < NormalizeTreeLabels, tree::RankedTree < unsigned, DefaultRankType >, tree::RankedTree < > > ( NormalizeTreeLabels::normalize );
 
 } /* namespace tree */
diff --git a/alib2algo/src/tree/properties/BadCharacterShiftTable.cpp b/alib2algo/src/tree/properties/BadCharacterShiftTable.cpp
index 413c76d9d3..8ec1c7e51b 100644
--- a/alib2algo/src/tree/properties/BadCharacterShiftTable.cpp
+++ b/alib2algo/src/tree/properties/BadCharacterShiftTable.cpp
@@ -9,6 +9,7 @@
 
 #include <tree/ranked/PrefixRankedBarPattern.h>
 #include <tree/ranked/PrefixRankedBarNonlinearPattern.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace tree {
 
@@ -18,8 +19,8 @@ std::map < std::ranked_symbol < >, size_t > BadCharacterShiftTable::bcs ( const
 	return dispatch ( pattern.getData ( ) );
 }
 
-auto BadCharacterShiftTablePrefixRankedBarPattern = BadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarPattern < > > ( BadCharacterShiftTable::bcs );
-auto BadCharacterShiftTablePrefixRankedBarNonlinearPattern = BadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern < > > ( BadCharacterShiftTable::bcs );
+auto BadCharacterShiftTablePrefixRankedBarPattern = registration::OverloadRegister < BadCharacterShiftTable, std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarPattern < > > ( BadCharacterShiftTable::bcs );
+auto BadCharacterShiftTablePrefixRankedBarNonlinearPattern = registration::OverloadRegister < BadCharacterShiftTable, std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern < > > ( BadCharacterShiftTable::bcs );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/tree/properties/BorderArrayNaive.cpp b/alib2algo/src/tree/properties/BorderArrayNaive.cpp
index 8163b735d9..38b4061d2c 100644
--- a/alib2algo/src/tree/properties/BorderArrayNaive.cpp
+++ b/alib2algo/src/tree/properties/BorderArrayNaive.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "BorderArrayNaive.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace tree {
 
@@ -15,8 +16,8 @@ std::vector < size_t > BorderArrayNaive::ba ( const tree::Tree & pattern ) {
 	return dispatch ( pattern.getData ( ) );
 }
 
-auto BorderArrayPrefixRankedBarPattern = BorderArrayNaive::RegistratorWrapper < std::vector < size_t >, tree::PrefixRankedBarPattern < > > ( BorderArrayNaive::ba );
-auto BorderArrayPrefixRankedPattern = BorderArrayNaive::RegistratorWrapper < std::vector < size_t >, tree::PrefixRankedPattern < > > ( BorderArrayNaive::ba );
+auto BorderArrayPrefixRankedBarPattern = registration::OverloadRegister < BorderArrayNaive, std::vector < size_t >, tree::PrefixRankedBarPattern < > > ( BorderArrayNaive::ba );
+auto BorderArrayPrefixRankedPattern = registration::OverloadRegister < BorderArrayNaive, std::vector < size_t >, tree::PrefixRankedPattern < > > ( BorderArrayNaive::ba );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/tree/properties/ExactSubtreeRepeats.cpp b/alib2algo/src/tree/properties/ExactSubtreeRepeats.cpp
index dbf6c3cd59..fda17f58fc 100644
--- a/alib2algo/src/tree/properties/ExactSubtreeRepeats.cpp
+++ b/alib2algo/src/tree/properties/ExactSubtreeRepeats.cpp
@@ -7,6 +7,7 @@
 
 #include "ExactSubtreeRepeats.h"
 #include <tree/Tree.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace tree {
 
@@ -16,7 +17,7 @@ tree::Tree ExactSubtreeRepeats::repeats ( const tree::Tree & tree ) {
 	return dispatch ( tree.getData ( ) );
 }
 
-auto ExactRepeatsPostfixRankedTree = ExactSubtreeRepeats::RegistratorWrapper < tree::PostfixRankedTree < unsigned, DefaultRankType >, tree::PostfixRankedTree < > > ( ExactSubtreeRepeats::repeats );
+auto ExactRepeatsPostfixRankedTree = registration::OverloadRegister < ExactSubtreeRepeats, tree::PostfixRankedTree < unsigned, DefaultRankType >, tree::PostfixRankedTree < > > ( ExactSubtreeRepeats::repeats );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/tree/properties/ExactSubtreeRepeatsNaive.cpp b/alib2algo/src/tree/properties/ExactSubtreeRepeatsNaive.cpp
index 8c8f547453..4f8a62cb2a 100644
--- a/alib2algo/src/tree/properties/ExactSubtreeRepeatsNaive.cpp
+++ b/alib2algo/src/tree/properties/ExactSubtreeRepeatsNaive.cpp
@@ -7,6 +7,7 @@
 
 #include "ExactSubtreeRepeatsNaive.h"
 #include <tree/Tree.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace tree {
 
@@ -16,10 +17,10 @@ tree::Tree ExactSubtreeRepeatsNaive::repeats ( const tree::Tree & tree ) {
 	return dispatch ( tree.getData ( ) );
 }
 
-auto ExactRepeatsNaiveRankedTree = ExactSubtreeRepeatsNaive::RegistratorWrapper < tree::RankedTree < unsigned, DefaultRankType >, tree::RankedTree < > > ( ExactSubtreeRepeatsNaive::repeats );
-auto ExactRepeatsNaivePrefixRankedTree = ExactSubtreeRepeatsNaive::RegistratorWrapper < tree::PrefixRankedTree < unsigned, DefaultRankType >, tree::PrefixRankedTree < > > ( ExactSubtreeRepeatsNaive::repeats );
-auto ExactRepeatsNaivePostfixRankedTree = ExactSubtreeRepeatsNaive::RegistratorWrapper < tree::PostfixRankedTree < unsigned, DefaultRankType >, tree::PostfixRankedTree < > > ( ExactSubtreeRepeatsNaive::repeats );
-auto ExactRepeatsNaivePrefixRankedBarTree = ExactSubtreeRepeatsNaive::RegistratorWrapper < tree::PrefixRankedBarTree < unsigned, DefaultRankType >, tree::PrefixRankedBarTree < > > ( ExactSubtreeRepeatsNaive::repeats );
+auto ExactRepeatsNaiveRankedTree = registration::OverloadRegister < ExactSubtreeRepeatsNaive, tree::RankedTree < unsigned, DefaultRankType >, tree::RankedTree < > > ( ExactSubtreeRepeatsNaive::repeats );
+auto ExactRepeatsNaivePrefixRankedTree = registration::OverloadRegister < ExactSubtreeRepeatsNaive, tree::PrefixRankedTree < unsigned, DefaultRankType >, tree::PrefixRankedTree < > > ( ExactSubtreeRepeatsNaive::repeats );
+auto ExactRepeatsNaivePostfixRankedTree = registration::OverloadRegister < ExactSubtreeRepeatsNaive, tree::PostfixRankedTree < unsigned, DefaultRankType >, tree::PostfixRankedTree < > > ( ExactSubtreeRepeatsNaive::repeats );
+auto ExactRepeatsNaivePrefixRankedBarTree = registration::OverloadRegister < ExactSubtreeRepeatsNaive, tree::PrefixRankedBarTree < unsigned, DefaultRankType >, tree::PrefixRankedBarTree < > > ( ExactSubtreeRepeatsNaive::repeats );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/tree/properties/ReversedBadCharacterShiftTable.cpp b/alib2algo/src/tree/properties/ReversedBadCharacterShiftTable.cpp
index dd9f293170..c1e4f0d9e3 100644
--- a/alib2algo/src/tree/properties/ReversedBadCharacterShiftTable.cpp
+++ b/alib2algo/src/tree/properties/ReversedBadCharacterShiftTable.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ReversedBadCharacterShiftTable.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace tree {
 
@@ -15,10 +16,10 @@ std::map < std::ranked_symbol < >, size_t > ReversedBadCharacterShiftTable::bcs
 	return dispatch ( pattern.getData ( ) );
 }
 
-auto ReversedBadCharacterShiftTablePrefixRankedBarPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarPattern < > > ( ReversedBadCharacterShiftTable::bcs );
-auto ReversedBadCharacterShiftTablePrefixRankedBarNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern < > > ( ReversedBadCharacterShiftTable::bcs );
-auto ReversedBadCharacterShiftTablePrefixRankedPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedPattern < > > ( ReversedBadCharacterShiftTable::bcs );
-auto ReversedBadCharacterShiftTablePrefixRankedNonlinearPattern = ReversedBadCharacterShiftTable::RegistratorWrapper < std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedNonlinearPattern < > > ( ReversedBadCharacterShiftTable::bcs );
+auto ReversedBadCharacterShiftTablePrefixRankedBarPattern = registration::OverloadRegister < ReversedBadCharacterShiftTable, std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarPattern < > > ( ReversedBadCharacterShiftTable::bcs );
+auto ReversedBadCharacterShiftTablePrefixRankedBarNonlinearPattern = registration::OverloadRegister < ReversedBadCharacterShiftTable, std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedBarNonlinearPattern < > > ( ReversedBadCharacterShiftTable::bcs );
+auto ReversedBadCharacterShiftTablePrefixRankedPattern = registration::OverloadRegister < ReversedBadCharacterShiftTable, std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedPattern < > > ( ReversedBadCharacterShiftTable::bcs );
+auto ReversedBadCharacterShiftTablePrefixRankedNonlinearPattern = registration::OverloadRegister < ReversedBadCharacterShiftTable, std::map < std::ranked_symbol < >, size_t >, tree::PrefixRankedNonlinearPattern < > > ( ReversedBadCharacterShiftTable::bcs );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/tree/properties/SubtreeJumpTable.cpp b/alib2algo/src/tree/properties/SubtreeJumpTable.cpp
index cd756d6f64..2ecbcc7d62 100644
--- a/alib2algo/src/tree/properties/SubtreeJumpTable.cpp
+++ b/alib2algo/src/tree/properties/SubtreeJumpTable.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "SubtreeJumpTable.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace tree {
 
@@ -15,10 +16,10 @@ std::vector < int > SubtreeJumpTable::compute ( const tree::RankedTreeWrapper &
 	return dispatch ( subject.getData ( ) );
 }
 
-auto SubtreeSizesPrefixRankedBarTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedBarTree < > > ( SubtreeJumpTable::compute );
-auto SubtreeSizesPrefixRankedBarPattern = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedBarPattern < > > ( SubtreeJumpTable::compute );
-auto SubtreeSizesPrefixRankedTree = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedTree < > > ( SubtreeJumpTable::compute );
-auto SubtreeSizesPrefixRankedPattern = SubtreeJumpTable::RegistratorWrapper < std::vector < int >, tree::PrefixRankedPattern < > > ( SubtreeJumpTable::compute );
+auto SubtreeSizesPrefixRankedBarTree = registration::OverloadRegister < SubtreeJumpTable, std::vector < int >, tree::PrefixRankedBarTree < > > ( SubtreeJumpTable::compute );
+auto SubtreeSizesPrefixRankedBarPattern = registration::OverloadRegister < SubtreeJumpTable, std::vector < int >, tree::PrefixRankedBarPattern < > > ( SubtreeJumpTable::compute );
+auto SubtreeSizesPrefixRankedTree = registration::OverloadRegister < SubtreeJumpTable, std::vector < int >, tree::PrefixRankedTree < > > ( SubtreeJumpTable::compute );
+auto SubtreeSizesPrefixRankedPattern = registration::OverloadRegister < SubtreeJumpTable, std::vector < int >, tree::PrefixRankedPattern < > > ( SubtreeJumpTable::compute );
 
 } /* namespace properties */
 
diff --git a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp
index 686e3de703..eefcd92fdb 100644
--- a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp
@@ -15,6 +15,7 @@
 #include <algorithm>
 
 #include <grammar/properties/RecursiveNonterminal.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -79,7 +80,7 @@ grammar::CFG < > DeterministicLL1Grammar::convert ( const grammar::CFG < > & par
 	}
 }
 
-auto DeterministicLL1GrammarCFG = DeterministicLL1Grammar::RegistratorWrapper < grammar::CFG < >, grammar::CFG < > > ( DeterministicLL1Grammar::convert );
+auto DeterministicLL1GrammarCFG = registration::OverloadRegister < DeterministicLL1Grammar, grammar::CFG < >, grammar::CFG < > > ( DeterministicLL1Grammar::convert );
 
 grammar::Grammar DeterministicLL1Grammar::convert ( const grammar::Grammar & grammar ) {
 	return dispatch ( grammar.getData ( ) );
diff --git a/alib2algo_experimental/src/grammar/parsing/First.cpp b/alib2algo_experimental/src/grammar/parsing/First.cpp
index 9e736b686e..19cd4f71b9 100644
--- a/alib2algo_experimental/src/grammar/parsing/First.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/First.cpp
@@ -17,6 +17,7 @@
 #include <grammar/Regular/RightLG.h>
 #include <grammar/Regular/RightRG.h>
 #include <exception/CommonException.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -104,29 +105,29 @@ std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > First::firs
 	return first ( grammar.getTerminalAlphabet ( ), grammar.getNonterminalAlphabet ( ), firstNt, rhs );
 }
 
-auto FirstCFG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::CFG < > > ( First::first );
-auto FirstEpsilonFreeCFG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::EpsilonFreeCFG < > > ( First::first );
-auto FirstGNF = FirstBase1::RegistratorWrapper < FirstResult1, grammar::GNF < > > ( First::first );
-auto FirstCNF = FirstBase1::RegistratorWrapper < FirstResult1, grammar::CNF < > > ( First::first );
-auto FirstLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LG < > > ( First::first );
-auto FirstLeftLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LeftLG < > > ( First::first );
-auto FirstLeftRG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::LeftRG < > > ( First::first );
-auto FirstRightLG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightLG < > > ( First::first );
-auto FirstRightRG = FirstBase1::RegistratorWrapper < FirstResult1, grammar::RightRG < > > ( First::first );
+auto FirstCFG = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::CFG < > > ( First::first );
+auto FirstEpsilonFreeCFG = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::EpsilonFreeCFG < > > ( First::first );
+auto FirstGNF = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::GNF < > > ( First::first );
+auto FirstCNF = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::CNF < > > ( First::first );
+auto FirstLG = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::LG < > > ( First::first );
+auto FirstLeftLG = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::LeftLG < > > ( First::first );
+auto FirstLeftRG = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::LeftRG < > > ( First::first );
+auto FirstRightLG = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::RightLG < > > ( First::first );
+auto FirstRightRG = registration::OverloadRegister < FirstBase1, FirstResult1, grammar::RightRG < > > ( First::first );
 
 std::map < std::vector < DefaultSymbolType >, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > First::first ( const grammar::Grammar & grammar ) {
 	return FirstBase1::dispatch ( grammar.getData ( ) );
 }
 
-auto FirstCFG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::CFG < > > ( First::first );
-auto FirstEpsilonFreeCFG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::EpsilonFreeCFG < > > ( First::first );
-auto FirstGNF2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::GNF < > > ( First::first );
-auto FirstCNF2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::CNF < > > ( First::first );
-auto FirstLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LG < > > ( First::first );
-auto FirstLeftLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LeftLG < > > ( First::first );
-auto FirstLeftRG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::LeftRG < > > ( First::first );
-auto FirstRightLG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightLG < > > ( First::first );
-auto FirstRightRG2 = FirstBase2::RegistratorWrapper < FirstResult2, grammar::RightRG < > > ( First::first );
+auto FirstCFG2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::CFG < > > ( First::first );
+auto FirstEpsilonFreeCFG2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::EpsilonFreeCFG < > > ( First::first );
+auto FirstGNF2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::GNF < > > ( First::first );
+auto FirstCNF2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::CNF < > > ( First::first );
+auto FirstLG2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::LG < > > ( First::first );
+auto FirstLeftLG2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::LeftLG < > > ( First::first );
+auto FirstLeftRG2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::LeftRG < > > ( First::first );
+auto FirstRightLG2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::RightLG < > > ( First::first );
+auto FirstRightRG2 = registration::OverloadRegister < FirstBase2, FirstResult2, grammar::RightRG < > > ( First::first );
 
 std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > First::first ( const grammar::Grammar & grammar, const std::vector < DefaultSymbolType > & rhs ) {
 	return FirstBase2::dispatch ( grammar.getData ( ), rhs );
diff --git a/alib2algo_experimental/src/grammar/parsing/Follow.cpp b/alib2algo_experimental/src/grammar/parsing/Follow.cpp
index a75ecc831e..05e63a8b97 100644
--- a/alib2algo_experimental/src/grammar/parsing/Follow.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/Follow.cpp
@@ -21,6 +21,7 @@
 #include <grammar/Regular/RightLG.h>
 #include <grammar/Regular/RightRG.h>
 #include <exception/CommonException.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -92,29 +93,29 @@ std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > Follow::fol
 	return follow ( grammar )[nt];
 }
 
-auto FollowCFG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::CFG < > > ( Follow::follow );
-auto FollowEpsilonFreeCFG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::EpsilonFreeCFG < > > ( Follow::follow );
-auto FollowGNF = FollowBase1::RegistratorWrapper < FollowResult1, grammar::GNF < > > ( Follow::follow );
-auto FollowCNF = FollowBase1::RegistratorWrapper < FollowResult1, grammar::CNF < > > ( Follow::follow );
-auto FollowLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LG < > > ( Follow::follow );
-auto FollowLeftLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LeftLG < > > ( Follow::follow );
-auto FollowLeftRG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::LeftRG < > > ( Follow::follow );
-auto FollowRightLG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightLG < > > ( Follow::follow );
-auto FollowRightRG = FollowBase1::RegistratorWrapper < FollowResult1, grammar::RightRG < > > ( Follow::follow );
+auto FollowCFG = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::CFG < > > ( Follow::follow );
+auto FollowEpsilonFreeCFG = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::EpsilonFreeCFG < > > ( Follow::follow );
+auto FollowGNF = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::GNF < > > ( Follow::follow );
+auto FollowCNF = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::CNF < > > ( Follow::follow );
+auto FollowLG = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::LG < > > ( Follow::follow );
+auto FollowLeftLG = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::LeftLG < > > ( Follow::follow );
+auto FollowLeftRG = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::LeftRG < > > ( Follow::follow );
+auto FollowRightLG = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::RightLG < > > ( Follow::follow );
+auto FollowRightRG = registration::OverloadRegister < FollowBase1, FollowResult1, grammar::RightRG < > > ( Follow::follow );
 
 std::map < DefaultSymbolType, std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > > Follow::follow ( const grammar::Grammar & grammar ) {
 	return FollowBase1::dispatch ( grammar.getData ( ) );
 }
 
-auto FollowCFG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::CFG < > > ( Follow::follow );
-auto FollowEpsilonFreeCFG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::EpsilonFreeCFG < > > ( Follow::follow );
-auto FollowGNF2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::GNF < > > ( Follow::follow );
-auto FollowCNF2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::CNF < > > ( Follow::follow );
-auto FollowLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LG < > > ( Follow::follow );
-auto FollowLeftLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LeftLG < > > ( Follow::follow );
-auto FollowLeftRG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::LeftRG < > > ( Follow::follow );
-auto FollowRightLG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightLG < > > ( Follow::follow );
-auto FollowRightRG2 = FollowBase2::RegistratorWrapper < FollowResult2, grammar::RightRG < > > ( Follow::follow );
+auto FollowCFG2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::CFG < > > ( Follow::follow );
+auto FollowEpsilonFreeCFG2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::EpsilonFreeCFG < > > ( Follow::follow );
+auto FollowGNF2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::GNF < > > ( Follow::follow );
+auto FollowCNF2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::CNF < > > ( Follow::follow );
+auto FollowLG2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::LG < > > ( Follow::follow );
+auto FollowLeftLG2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::LeftLG < > > ( Follow::follow );
+auto FollowLeftRG2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::LeftRG < > > ( Follow::follow );
+auto FollowRightLG2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::RightLG < > > ( Follow::follow );
+auto FollowRightRG2 = registration::OverloadRegister < FollowBase2, FollowResult2, grammar::RightRG < > > ( Follow::follow );
 
 std::set < std::variant < DefaultSymbolType, string::Epsilon < > > > Follow::follow ( const grammar::Grammar & grammar, const DefaultSymbolType & nt ) {
 	return FollowBase2::dispatch ( grammar.getData ( ), nt );
diff --git a/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.cpp b/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.cpp
index 6d3e45f867..2af69eb5be 100644
--- a/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/LL1ParseTable.cpp
@@ -18,6 +18,7 @@
 #include <grammar/Regular/LeftRG.h>
 #include <grammar/Regular/RightLG.h>
 #include <grammar/Regular/RightRG.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -50,15 +51,15 @@ std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >,
 	return res;
 }
 
-auto LL1ParseTableCFG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::CFG < > > ( LL1ParseTable::parseTable );
-auto LL1ParseTableEpsilonFreeCFG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::EpsilonFreeCFG < > > ( LL1ParseTable::parseTable );
-auto LL1ParseTableGNF = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::GNF < > > ( LL1ParseTable::parseTable );
-auto LL1ParseTableCNF = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::CNF < > > ( LL1ParseTable::parseTable );
-auto LL1ParseTableLG  = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LG < > > ( LL1ParseTable::parseTable );
-auto LL1ParseTableLeftLG  = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LeftLG < > > ( LL1ParseTable::parseTable );
-auto LL1ParseTableLeftRG  = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LeftRG < > > ( LL1ParseTable::parseTable );
-auto LL1ParseTableRightLG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::RightLG < > > ( LL1ParseTable::parseTable );
-auto LL1ParseTableRightRG = LL1ParseTable::RegistratorWrapper < std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::RightRG < > > ( LL1ParseTable::parseTable );
+auto LL1ParseTableCFG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::CFG < > > ( LL1ParseTable::parseTable );
+auto LL1ParseTableEpsilonFreeCFG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::EpsilonFreeCFG < > > ( LL1ParseTable::parseTable );
+auto LL1ParseTableGNF = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::GNF < > > ( LL1ParseTable::parseTable );
+auto LL1ParseTableCNF = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::CNF < > > ( LL1ParseTable::parseTable );
+auto LL1ParseTableLG  = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LG < > > ( LL1ParseTable::parseTable );
+auto LL1ParseTableLeftLG  = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LeftLG < > > ( LL1ParseTable::parseTable );
+auto LL1ParseTableLeftRG  = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::LeftRG < > > ( LL1ParseTable::parseTable );
+auto LL1ParseTableRightLG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::RightLG < > > ( LL1ParseTable::parseTable );
+auto LL1ParseTableRightRG = registration::OverloadRegister < LL1ParseTable, std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > >, grammar::RightRG < > > ( LL1ParseTable::parseTable );
 
 std::map < std::pair < std::variant < DefaultSymbolType, string::Epsilon < > >, DefaultSymbolType >, std::set < std::vector < DefaultSymbolType > > > LL1ParseTable::parseTable ( const grammar::Grammar & grammar ) {
 	return dispatch ( grammar.getData ( ) );
diff --git a/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.cpp b/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.cpp
index 6788e0af26..495d8c9c19 100644
--- a/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.cpp
+++ b/alib2algo_experimental/src/graph/maximumflow/FordFulkerson.cpp
@@ -15,6 +15,7 @@
 #include <stdexcept>
 
 #include <exception/CommonException.h>
+#include <registration/AlgoRegistration.hpp>
 
 
 // the flow needs to be assigned to pair of nodes, not edge
@@ -239,7 +240,7 @@ Flow FordFulkerson::fordfulkerson( const UndirectedGraph & graph, Node source, N
 	return fordfulkerson_impl_undir( graph, source, sink );
 }
 
-//auto FordFulkersonUndirectedGraph = FordFulkerson::RegistratorWrapper< graph::UndirectedGraph, graph::UndirectedGraph >( FordFulkerson::getInstance(), FordFulkerson::fordfulkerson );
+//auto FordFulkersonUndirectedGraph = registration::OverloadRegister < FordFulkerson,  graph::UndirectedGraph, graph::UndirectedGraph > ( FordFulkerson::fordfulkerson );
 
 }
 
diff --git a/alib2algo_experimental/src/graph/minimumcut/FordFulkerson.cpp b/alib2algo_experimental/src/graph/minimumcut/FordFulkerson.cpp
index 892dd1fe41..de46f367b4 100644
--- a/alib2algo_experimental/src/graph/minimumcut/FordFulkerson.cpp
+++ b/alib2algo_experimental/src/graph/minimumcut/FordFulkerson.cpp
@@ -17,6 +17,7 @@
 #include <exception/CommonException.h>
 
 #include "../maximumflow/FordFulkerson.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace graph {
 
@@ -169,7 +170,7 @@ Cut FordFulkerson::fordfulkerson( const UndirectedGraph & graph, Node source, No
 	return fordfulkerson_impl_undir( graph, source, sink );
 }
 
-//auto BasicAlgorithmUndirectedGraph = FordFulkerson::RegistratorWrapper< graph::UndirectedGraph, graph::UndirectedGraph >( FordFulkerson::getInstance(), FordFulkerson::fordfulkerson );
+//auto BasicAlgorithmUndirectedGraph = registration::OverloadRegister < FordFulkerson, graph::UndirectedGraph, graph::UndirectedGraph > ( FordFulkerson::fordfulkerson );
 
 } // namespace minimumcut
 
diff --git a/alib2algo_experimental/src/graph/shortestpath/BellmanFord.cpp b/alib2algo_experimental/src/graph/shortestpath/BellmanFord.cpp
index 6bb132e1d1..c1544ba951 100644
--- a/alib2algo_experimental/src/graph/shortestpath/BellmanFord.cpp
+++ b/alib2algo_experimental/src/graph/shortestpath/BellmanFord.cpp
@@ -8,6 +8,7 @@
 #include "BellmanFord.h"
 
 #include <exception/CommonException.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace graph
 {
@@ -119,14 +120,14 @@ BellmanFord::Result BellmanFord::bellmanford(const DirectedGraph &graph, const N
 	return bellmanford_impl(graph, start);
 }
 
-auto BellmanFordDirectedGraph = BellmanFord::RegistratorWrapper<BellmanFord::Result, graph::DirectedGraph>(BellmanFord::bellmanford);
+auto BellmanFordDirectedGraph = registration::OverloadRegister < BellmanFord, BellmanFord::Result, graph::DirectedGraph> ( BellmanFord::bellmanford );
 
 BellmanFord::Result BellmanFord::bellmanford(const UndirectedGraph &graph, const Node &start)
 {
 	return bellmanford_impl(graph, start);
 }
 
-auto BellmanFordUndirectedGraph = BellmanFord::RegistratorWrapper<BellmanFord::Result, graph::UndirectedGraph>(BellmanFord::bellmanford);
+auto BellmanFordUndirectedGraph = registration::OverloadRegister < BellmanFord, BellmanFord::Result, graph::UndirectedGraph> ( BellmanFord::bellmanford );
 
 } // namespace shortestpath
 
diff --git a/alib2algo_experimental/src/graph/shortestpath/Dijkstra.cpp b/alib2algo_experimental/src/graph/shortestpath/Dijkstra.cpp
index bfcef0813a..fc6a2d1e05 100644
--- a/alib2algo_experimental/src/graph/shortestpath/Dijkstra.cpp
+++ b/alib2algo_experimental/src/graph/shortestpath/Dijkstra.cpp
@@ -8,6 +8,7 @@
 #include "Dijkstra.h"
 
 #include <exception/CommonException.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace graph
 {
@@ -135,14 +136,14 @@ Dijkstra::Result Dijkstra::dijkstra(const DirectedGraph &graph, const Node &star
 	return dijkstra_impl(graph, start);
 }
 
-auto DijkstraDirectedGraph = Dijkstra::RegistratorWrapper<Dijkstra::Result, graph::DirectedGraph>(Dijkstra::dijkstra);
+auto DijkstraDirectedGraph = registration::OverloadRegister < Dijkstra, Dijkstra::Result, graph::DirectedGraph> ( Dijkstra::dijkstra );
 
 Dijkstra::Result Dijkstra::dijkstra(const UndirectedGraph &graph, const Node &start)
 {
 	return dijkstra_impl(graph, start);
 }
 
-auto DijkstraUndirectedGraph = Dijkstra::RegistratorWrapper<Dijkstra::Result, graph::UndirectedGraph>(Dijkstra::dijkstra);
+auto DijkstraUndirectedGraph = registration::OverloadRegister < Dijkstra, Dijkstra::Result, graph::UndirectedGraph> ( Dijkstra::dijkstra );
 
 } // namespace shortestpath
 
diff --git a/alib2algo_experimental/src/graph/shortestpath/FloydWarshall.cpp b/alib2algo_experimental/src/graph/shortestpath/FloydWarshall.cpp
index d471b3efb5..b1a0235aa6 100644
--- a/alib2algo_experimental/src/graph/shortestpath/FloydWarshall.cpp
+++ b/alib2algo_experimental/src/graph/shortestpath/FloydWarshall.cpp
@@ -10,6 +10,7 @@
 #include <exception/CommonException.h>
 
 #include <limits>
+#include <registration/AlgoRegistration.hpp>
 
 namespace graph
 {
@@ -74,14 +75,14 @@ FloydWarshall::Result FloydWarshall::floydwarshall(const DirectedGraph &graph)
 	return floydwarshall_impl(graph);
 }
 
-auto FloydWarshallDirectedGraph = FloydWarshall::RegistratorWrapper<FloydWarshall::Result, graph::DirectedGraph>(FloydWarshall::floydwarshall);
+auto FloydWarshallDirectedGraph = registration::OverloadRegister < FloydWarshall, FloydWarshall::Result, graph::DirectedGraph> ( FloydWarshall::floydwarshall );
 
 FloydWarshall::Result FloydWarshall::floydwarshall(const UndirectedGraph &graph)
 {
 	return floydwarshall_impl(graph);
 }
 
-auto FloydWarshallUndirectedGraph = FloydWarshall::RegistratorWrapper<FloydWarshall::Result, graph::UndirectedGraph>(FloydWarshall::floydwarshall);
+auto FloydWarshallUndirectedGraph = registration::OverloadRegister < FloydWarshall, FloydWarshall::Result, graph::UndirectedGraph> ( FloydWarshall::floydwarshall );
 
 } // namespace shortestpath
 
diff --git a/alib2algo_experimental/src/graph/sort/TopologicalSort.cpp b/alib2algo_experimental/src/graph/sort/TopologicalSort.cpp
index e0e4e07eab..99c053b635 100644
--- a/alib2algo_experimental/src/graph/sort/TopologicalSort.cpp
+++ b/alib2algo_experimental/src/graph/sort/TopologicalSort.cpp
@@ -7,6 +7,7 @@
 
 #include "TopologicalSort.h"
 #include "../traverse/Dfs.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace graph {
 
@@ -38,7 +39,7 @@ TopologicalSort::Result TopologicalSort::topologicalsort(const DirectedGraph &gr
 	return topsort_impl(graph);
 }
 
-auto TopologicalSortDirectedGraph = TopologicalSort::RegistratorWrapper<TopologicalSort::Result, graph::DirectedGraph>(TopologicalSort::topologicalsort);
+auto TopologicalSortDirectedGraph = registration::OverloadRegister < TopologicalSort, TopologicalSort::Result, graph::DirectedGraph> ( TopologicalSort::topologicalsort );
 
 } // namespace sort
 
diff --git a/alib2algo_experimental/src/graph/spanningtree/Edmonds.cpp b/alib2algo_experimental/src/graph/spanningtree/Edmonds.cpp
index 1172cbfc17..0d59a65fb0 100644
--- a/alib2algo_experimental/src/graph/spanningtree/Edmonds.cpp
+++ b/alib2algo_experimental/src/graph/spanningtree/Edmonds.cpp
@@ -20,6 +20,7 @@
 #include "../datastructs/Array.h"
 
 #include <exception/CommonException.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace graph {
 
@@ -245,7 +246,7 @@ AdjacencyListDirectedGraph Edmonds::edmonds( const DirectedGraph & graph )
 	return edmonds_impl( graph );
 }
 
-auto EdmondsDirectedGraph = Edmonds::RegistratorWrapper< graph::AdjacencyListDirectedGraph, graph::DirectedGraph >( Edmonds::edmonds );
+auto EdmondsDirectedGraph = registration::OverloadRegister < Edmonds,  graph::AdjacencyListDirectedGraph, graph::DirectedGraph > ( Edmonds::edmonds );
 
 } // spanningtree
 
diff --git a/alib2algo_experimental/src/graph/spanningtree/JarnikPrim.cpp b/alib2algo_experimental/src/graph/spanningtree/JarnikPrim.cpp
index 5749136b8e..b3dfebeb5d 100644
--- a/alib2algo_experimental/src/graph/spanningtree/JarnikPrim.cpp
+++ b/alib2algo_experimental/src/graph/spanningtree/JarnikPrim.cpp
@@ -8,6 +8,7 @@
 #include "JarnikPrim.h"
 
 #include <limits>
+#include <registration/AlgoRegistration.hpp>
 
 namespace graph {
 
@@ -108,7 +109,7 @@ AdjacencyListUndirectedGraph JarnikPrim::jarnikprim(const UndirectedGraph &graph
 	return jarnikprim_impl(graph, start);
 }
 
-auto JarnikPrimUndirectedGraph = JarnikPrim::RegistratorWrapper<graph::AdjacencyListUndirectedGraph, graph::UndirectedGraph>(JarnikPrim::jarnikprim);
+auto JarnikPrimUndirectedGraph = registration::OverloadRegister < JarnikPrim, graph::AdjacencyListUndirectedGraph, graph::UndirectedGraph> ( JarnikPrim::jarnikprim );
 
 } // namespace spanningtree
 
diff --git a/alib2algo_experimental/src/graph/spanningtree/Kruskal.cpp b/alib2algo_experimental/src/graph/spanningtree/Kruskal.cpp
index be551c6ca4..b37037a9c2 100644
--- a/alib2algo_experimental/src/graph/spanningtree/Kruskal.cpp
+++ b/alib2algo_experimental/src/graph/spanningtree/Kruskal.cpp
@@ -14,6 +14,7 @@
 
 #include "../datastructs/Components.h"
 #include <exception/CommonException.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace graph {
 
@@ -84,7 +85,7 @@ AdjacencyListUndirectedGraph Kruskal::kruskal( const UndirectedGraph & graph )
 	return kruskal_impl( graph );
 }
 
-auto KruskalUndirectedGraph = Kruskal::RegistratorWrapper< graph::AdjacencyListUndirectedGraph, graph::UndirectedGraph >( Kruskal::kruskal );
+auto KruskalUndirectedGraph = registration::OverloadRegister < Kruskal,  graph::AdjacencyListUndirectedGraph, graph::UndirectedGraph > ( Kruskal::kruskal );
 
 } // namespace spanningtree
 
diff --git a/alib2algo_experimental/src/graph/traverse/Bfs.cpp b/alib2algo_experimental/src/graph/traverse/Bfs.cpp
index 974e0c7024..b7820afa0b 100644
--- a/alib2algo_experimental/src/graph/traverse/Bfs.cpp
+++ b/alib2algo_experimental/src/graph/traverse/Bfs.cpp
@@ -9,6 +9,7 @@
 
 #include <queue>
 #include <unordered_map>
+#include <registration/AlgoRegistration.hpp>
 
 namespace graph {
 
@@ -77,25 +78,25 @@ void Bfs::bfs(const DirectedGraph &graph, const Node &start, Bfs::Function func)
 	bfs_impl(graph, start, func);
 }
 
-auto BfsDirectedGraph1 = std::SingleDispatch<Bfs, void, const graph::GraphBase &, const Node&, Bfs::Function>::RegistratorWrapper<void, graph::DirectedGraph>(Bfs::bfs);
+auto BfsDirectedGraph1 = registration::OverloadRegister < std::SingleDispatch<Bfs, void, const graph::GraphBase &, const Node&, Bfs::Function>, void, graph::DirectedGraph> ( Bfs::bfs );
 
 void Bfs::bfs(const DirectedGraph &graph, const Node &start, Bfs::FunctionExt func) {
 	bfs2_impl(graph, start, func);
 }
 
-auto BfsDirectedGraph2 = std::SingleDispatch<Bfs, void, const graph::GraphBase &, const Node&, Bfs::FunctionExt>::RegistratorWrapper<void, graph::DirectedGraph>(Bfs::bfs);
+auto BfsDirectedGraph2 = registration::OverloadRegister < std::SingleDispatch<Bfs, void, const graph::GraphBase &, const Node&, Bfs::FunctionExt>, void, graph::DirectedGraph> ( Bfs::bfs );
 
 void Bfs::bfs(const UndirectedGraph &graph, const Node &start, Bfs::Function func) {
 	bfs_impl(graph, start, func);
 }
 
-auto BfsUndirectedGraph1 = std::SingleDispatch<Bfs, void, const graph::GraphBase &, const Node&, Bfs::Function>::RegistratorWrapper<void, graph::UndirectedGraph>(Bfs::bfs);
+auto BfsUndirectedGraph1 = registration::OverloadRegister < std::SingleDispatch<Bfs, void, const graph::GraphBase &, const Node&, Bfs::Function>, void, graph::UndirectedGraph> ( Bfs::bfs );
 
 void Bfs::bfs(const UndirectedGraph &graph, const Node &start, Bfs::FunctionExt func) {
 	bfs2_impl(graph, start, func);
 }
 
-auto BfsUndirectedGraph2 = std::SingleDispatch<Bfs, void, const graph::GraphBase &, const Node&, Bfs::FunctionExt>::RegistratorWrapper<void, graph::UndirectedGraph>(Bfs::bfs);
+auto BfsUndirectedGraph2 = registration::OverloadRegister < std::SingleDispatch<Bfs, void, const graph::GraphBase &, const Node&, Bfs::FunctionExt>, void, graph::UndirectedGraph> ( Bfs::bfs );
 
 } // namespace traverse
 
diff --git a/alib2algo_experimental/src/graph/traverse/Dfs.cpp b/alib2algo_experimental/src/graph/traverse/Dfs.cpp
index 50dcfea7a7..554c070728 100644
--- a/alib2algo_experimental/src/graph/traverse/Dfs.cpp
+++ b/alib2algo_experimental/src/graph/traverse/Dfs.cpp
@@ -9,6 +9,7 @@
 
 #include <stack>
 #include <unordered_map>
+#include <registration/AlgoRegistration.hpp>
 
 namespace graph {
 
@@ -66,7 +67,7 @@ void Dfs::dfs(const DirectedGraph &graph, const Node &start, Dfs::Function func)
 	dfs_impl(graph, start, func);
 }
 
-auto DfsDirectedGraph1 = std::SingleDispatch<Dfs, void, const graph::GraphBase &, const Node&, Dfs::Function>::RegistratorWrapper<void, graph::DirectedGraph>(Dfs::dfs);
+auto DfsDirectedGraph1 = registration::OverloadRegister < std::SingleDispatch<Dfs, void, const graph::GraphBase &, const Node&, Dfs::Function>, void, graph::DirectedGraph> ( Dfs::dfs );
 
 void Dfs::dfs(const DirectedGraph &graph, const Node &start, Dfs::FunctionExt func) {
 	int time = 0;
@@ -74,13 +75,13 @@ void Dfs::dfs(const DirectedGraph &graph, const Node &start, Dfs::FunctionExt fu
 	dfs2_impl(graph, start, start, visited, time, func);
 }
 
-auto DfsDirectedGraph2 = std::SingleDispatch<Dfs, void, const graph::GraphBase &, const Node&, Dfs::FunctionExt>::RegistratorWrapper<void, graph::DirectedGraph>(Dfs::dfs);
+auto DfsDirectedGraph2 = registration::OverloadRegister < std::SingleDispatch<Dfs, void, const graph::GraphBase &, const Node&, Dfs::FunctionExt>, void, graph::DirectedGraph> ( Dfs::dfs );
 
 void Dfs::dfs(const UndirectedGraph &graph, const Node &start, Dfs::Function func) {
 	dfs_impl(graph, start, func);
 }
 
-auto DfsUndirectedGraph1 = std::SingleDispatch<Dfs, void, const graph::GraphBase &, const Node&, Dfs::Function>::RegistratorWrapper<void, graph::UndirectedGraph>(Dfs::dfs);
+auto DfsUndirectedGraph1 = registration::OverloadRegister < std::SingleDispatch<Dfs, void, const graph::GraphBase &, const Node&, Dfs::Function>, void, graph::UndirectedGraph> ( Dfs::dfs );
 
 void Dfs::dfs(const UndirectedGraph &graph, const Node &start, Dfs::FunctionExt func) {
 	int time = 0;
@@ -88,7 +89,7 @@ void Dfs::dfs(const UndirectedGraph &graph, const Node &start, Dfs::FunctionExt
 	dfs2_impl(graph, start, start, visited, time, func);
 }
 
-auto DfsUndirectedGraph2 = std::SingleDispatch<Dfs, void, const graph::GraphBase &, const Node&, Dfs::FunctionExt>::RegistratorWrapper<void, graph::UndirectedGraph>(Dfs::dfs);
+auto DfsUndirectedGraph2 = registration::OverloadRegister < std::SingleDispatch<Dfs, void, const graph::GraphBase &, const Node&, Dfs::FunctionExt>, void, graph::UndirectedGraph> ( Dfs::dfs );
 
 } // namespace traverse
 
diff --git a/alib2algo_experimental/src/stringology/indexing/ExperimentalSuffixTrie.cpp b/alib2algo_experimental/src/stringology/indexing/ExperimentalSuffixTrie.cpp
index 6f796848d5..e7c38aa404 100644
--- a/alib2algo_experimental/src/stringology/indexing/ExperimentalSuffixTrie.cpp
+++ b/alib2algo_experimental/src/stringology/indexing/ExperimentalSuffixTrie.cpp
@@ -8,6 +8,7 @@
 #include "ExperimentalSuffixTrie.h"
 
 #include <string/LinearStringTerminatingSymbol.h>
+#include <registration/AlgoRegistration.hpp>
 
 namespace stringology {
 
@@ -35,7 +36,7 @@ indexes::SuffixTrieTerminatingSymbol ExperimentalSuffixTrie::construct ( const s
 	return res;
 }
 
-auto SuffixTrieTerminatingSymbolLinearStringTerminatingSymbol = ExperimentalSuffixTrie::RegistratorWrapper < indexes::SuffixTrieTerminatingSymbol, string::LinearStringTerminatingSymbol > ( ExperimentalSuffixTrie::construct );
+auto SuffixTrieTerminatingSymbolLinearStringTerminatingSymbol = registration::OverloadRegister < ExperimentalSuffixTrie, indexes::SuffixTrieTerminatingSymbol, string::LinearStringTerminatingSymbol > ( ExperimentalSuffixTrie::construct );
 
 } /* namespace indexing */
 
diff --git a/alib2common/src/core/multipleDispatch.hpp b/alib2common/src/core/multipleDispatch.hpp
index c0c3127e3c..a4005b2653 100644
--- a/alib2common/src/core/multipleDispatch.hpp
+++ b/alib2common/src/core/multipleDispatch.hpp
@@ -14,10 +14,10 @@
 #include <iostream>
 #include <type_traits>
 #include <sstream>
+#include <tuple>
 
-#include "castApi.hpp"
-#include "../exception/CommonException.h"
-#include <introspection/Algorithms.hpp>
+#include <core/castApi.hpp>
+#include <exception/CommonException.h>
 
 namespace std {
 
@@ -27,12 +27,37 @@ class MultipleDispatch;
 template < class Algorithm, class ReturnType, class ... FrontStaticParamTypes, class ... DispatchedParameterTypes, class ... BackStaticParamTypes >
 class MultipleDispatch < Algorithm, ReturnType, std::tuple < FrontStaticParamTypes ... >, std::tuple < DispatchedParameterTypes ... >, std::tuple < BackStaticParamTypes ... > > {
 public:
+	template < class RealReturnType, class ... RealParameterTypeBases >
+	using overload = std::function < RealReturnType ( FrontStaticParamTypes ..., typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type && ..., BackStaticParamTypes ... ) >;
+
+	template < class RealReturnType, class ... RealParameterTypeBases >
+	using rawOverload = RealReturnType ( * ) ( FrontStaticParamTypes ..., typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type && ..., BackStaticParamTypes ... );
+
+	typedef std::tuple < FrontStaticParamTypes ... > frontParams;
+	typedef std::tuple < DispatchedParameterTypes ... > dispatchedParams;
+	typedef std::tuple < BackStaticParamTypes ... > backParams;
+	typedef ReturnType returnType;
+
+private:
 	class RegistratorWrapperBase {
 	public:
 		virtual ReturnType eval ( FrontStaticParamTypes ..., DispatchedParameterTypes && ..., BackStaticParamTypes ... ) = 0;
 	};
 
-private:
+	template < class RealReturnType, class ... RealParameterTypeBases >
+	class RegistratorWrapper : public RegistratorWrapperBase {
+		overload < RealReturnType, RealParameterTypeBases ... > m_callback;
+
+	public:
+		ReturnType eval ( FrontStaticParamTypes ... front, DispatchedParameterTypes && ... dispatched, BackStaticParamTypes ... back ) {
+			return ReturnType ( m_callback ( front ..., std::forward < typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type > ( static_cast < typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type && > ( dispatched ) ) ..., back ... ) );
+		}
+
+		RegistratorWrapper ( overload < RealReturnType, RealParameterTypeBases ... > callback ) : m_callback ( callback ) {
+		}
+
+	};
+
 	std::map < typename std::TupleBuilder < std::type_index, sizeof ... ( DispatchedParameterTypes ) >::type, RegistratorWrapperBase * > registeredFunctions;
 
 	static MultipleDispatch < Algorithm, ReturnType, std::tuple < FrontStaticParamTypes ... >, std::tuple < DispatchedParameterTypes ... >, std::tuple < BackStaticParamTypes ... > > & getInstance ( ) {
@@ -43,34 +68,26 @@ private:
 
 public:
 	template < class RealReturnType, class ... RealParameterTypeBases >
-	class RegistratorWrapper : public RegistratorWrapperBase {
-		std::function < RealReturnType ( FrontStaticParamTypes ..., typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type && ..., BackStaticParamTypes ... ) > m_callback;
-
-	public:
-		ReturnType eval ( FrontStaticParamTypes ... front, DispatchedParameterTypes && ... dispatched, BackStaticParamTypes ... back ) {
-			return ReturnType ( m_callback ( front ..., std::forward < typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type > ( static_cast < typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type && > ( dispatched ) ) ..., back ... ) );
-		}
+//	static void registerOverload ( overload < RealReturnType, RealParameterTypeBases ... > callback ) { causes clang 4.0.0 to crash...
+//	static void registerOverload ( rawOverload < RealReturnType, RealParameterTypeBases ... > callback ) { causes clang 4.0.0 to crash...
+	static void registerOverload ( RealReturnType ( * callback ) ( FrontStaticParamTypes ..., typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type && ..., BackStaticParamTypes ... ) ) {
+		auto key = std::make_tuple ( std::type_index ( typeid ( typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type ) ) ... );
+		RegistratorWrapper < RealReturnType, RealParameterTypeBases ... > * value = new RegistratorWrapper < RealReturnType, RealParameterTypeBases ... > ( callback );
 
-		RegistratorWrapper ( RealReturnType ( * callback ) ( FrontStaticParamTypes ..., typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type && ..., BackStaticParamTypes ... ) ) : m_callback ( callback ) {
-			bool res = getInstance ( ).registeredFunctions.insert ( std::make_pair ( std::make_tuple ( std::type_index ( typeid ( typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type ) ) ... ), this ) ).second;
-			if ( ! res ) {
-				std::stringstream ss;
-				( void ) initializer_list < int > { ( ss << std::type_name < typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type > ( ), 0 ) ... };
+		bool res = getInstance ( ).registeredFunctions.insert ( std::make_pair ( std::move ( key ), value ) ).second;
 
-				std::string classType = std::type_name < Algorithm > ( );
+		if ( ! res ) {
+			std::stringstream ss;
+			( void ) initializer_list < int > { ( ss << std::type_name < typename std::match_cv_ref < DispatchedParameterTypes, RealParameterTypeBases >::type > ( ), 0 ) ... };
 
-				throw::exception::CommonException ( "Callback for " + ss.str ( ) + " already registered on " + classType + "." );
-			}
+			std::string classType = std::type_name < Algorithm > ( );
 
-			introspection::Algorithms::registerDispatchInAlgorithm < std::tuple < RealParameterTypeBases ... >, Algorithm, RealReturnType > ( );
-			introspection::Algorithms::registerAlgorithmInterface < Algorithm, ReturnType, std::tuple < FrontStaticParamTypes ... >, std::tuple < DispatchedParameterTypes ... >, std::tuple < BackStaticParamTypes ... > > ( );
-			introspection::Algorithms::registerAlgorithm < Algorithm > ( );
+			throw::exception::CommonException ( "Callback for " + ss.str ( ) + " already registered on " + classType + "." );
 		}
-
-	};
+	}
 
 	static ReturnType dispatch ( FrontStaticParamTypes ... front, DispatchedParameterTypes && ... dispatched, BackStaticParamTypes ... back ) {
-		typename std::map < typename std::TupleBuilder < std::type_index, sizeof ... ( DispatchedParameterTypes ) >::type, RegistratorWrapperBase * >::iterator callback = getInstance ( ).registeredFunctions.find ( std::make_tuple ( std::type_index ( typeid ( dispatched ) ) ... ) );
+		auto callback = getInstance ( ).registeredFunctions.find ( std::make_tuple ( std::type_index ( typeid ( dispatched ) ) ... ) );
 
 		if ( callback == getInstance ( ).registeredFunctions.end ( ) ) {
 			std::stringstream ss;
@@ -105,22 +122,24 @@ using DoubleDispatchFirstStaticParam = MultipleDispatch < Algorithm, ReturnType,
 template < class Algorithm, class ReturnType, class ParametersType >
 class PromotingDoubleDispatch {
 public:
+	template < class RealReturnType, class RealParametersTypeBase >
+	using overload = std::function < RealReturnType ( typename std::match_cv_ref < ParametersType, RealParametersTypeBase >::type &&, typename std::match_cv_ref < ParametersType, RealParametersTypeBase >::type && ) >;
+
+	template < class RealReturnType, class RealParametersTypeBase >
+	using rawOverload = RealReturnType ( * ) ( typename std::match_cv_ref < ParametersType, RealParametersTypeBase >::type &&, typename std::match_cv_ref < ParametersType, RealParametersTypeBase >::type && );
+
+	typedef std::tuple < > frontParams;
+	typedef std::tuple < ParametersType, ParametersType > dispatchedParams;
+	typedef std::tuple < > backParams;
+	typedef ReturnType returnType;
+
+private:
 	class RegistratorWrapperBase {
 	public:
 		virtual ReturnType eval ( bool firstAttempt, ParametersType &&, ParametersType && ) = 0;
 		virtual bool available ( bool firstAttempt, std::type_index first, std::type_index second ) = 0;
 	};
 
-private:
-	std::map < std::type_index, RegistratorWrapperBase * > registeredFunctions;
-
-	static PromotingDoubleDispatch < Algorithm, ReturnType, ParametersType > & getInstance ( ) {
-		static PromotingDoubleDispatch < Algorithm, ReturnType, ParametersType > res;
-
-		return res;
-	}
-
-public:
 	template < class RealReturnType, class RealParametersTypeBase >
 	class RegistratorWrapper : public RegistratorWrapperBase {
 		typedef typename std::match_cv_ref < ParametersType, RealParametersTypeBase >::type RealParametersType;
@@ -151,21 +170,32 @@ public:
 		}
 
 		RegistratorWrapper ( RealReturnType ( * callback ) ( RealParametersType &&, RealParametersType && ) ) : m_callback ( callback ) {
-			bool res = getInstance ( ).registeredFunctions.insert ( std::make_pair ( std::type_index ( typeid ( RealParametersType ) ), this ) ).second;
-			if ( ! res ) {
-				std::string paramsType = std::type_name < RealParametersType > ( );
+		}
 
-				std::string classType = std::type_name < Algorithm > ( );
+	};
 
-				throw::exception::CommonException ( "Callback for " + paramsType + " already registered on " + classType + "." );
-			}
+	std::map < std::type_index, RegistratorWrapperBase * > registeredFunctions;
 
-			introspection::Algorithms::registerDispatchInAlgorithm < std::tuple < RealParametersTypeBase >, Algorithm, RealReturnType > ( );
-			introspection::Algorithms::registerAlgorithmInterface < Algorithm, ReturnType, std::tuple < >, std::tuple < ParametersType >, std::tuple < > > ( );
-			introspection::Algorithms::registerAlgorithm < Algorithm > ( );
-		}
+	static PromotingDoubleDispatch < Algorithm, ReturnType, ParametersType > & getInstance ( ) {
+		static PromotingDoubleDispatch < Algorithm, ReturnType, ParametersType > res;
 
-	};
+		return res;
+	}
+
+public:
+	template < class RealReturnType, class RealParametersTypeBase >
+	static void registerOverload ( RealReturnType ( * callback ) ( typename std::match_cv_ref < ParametersType, RealParametersTypeBase >::type &&, typename std::match_cv_ref < ParametersType, RealParametersTypeBase >::type && ) ) {
+		RegistratorWrapper < RealReturnType, RealParametersTypeBase > * value = new RegistratorWrapper < RealReturnType, RealParametersTypeBase > ( callback );
+
+		bool res = getInstance ( ).registeredFunctions.insert ( std::make_pair ( std::type_index ( typeid ( typename std::match_cv_ref < ParametersType, RealParametersTypeBase >::type ) ), value ) ).second;
+		if ( ! res ) {
+			std::string paramsType = std::type_name < typename std::match_cv_ref < ParametersType, RealParametersTypeBase >::type > ( );
+
+			std::string classType = std::type_name < Algorithm > ( );
+
+			throw::exception::CommonException ( "Callback for " + paramsType + " already registered on " + classType + "." );
+		}
+	}
 
 	static ReturnType dispatch ( ParametersType && first, ParametersType && second ) {
 		typename std::map < std::type_index, RegistratorWrapperBase * >::iterator callback = getInstance ( ).registeredFunctions.find ( std::type_index ( typeid ( first ) ) );
diff --git a/alib2common/src/introspection/Algorithms.hpp b/alib2common/src/introspection/Algorithms.hpp
index 00c87da115..f504724741 100644
--- a/alib2common/src/introspection/Algorithms.hpp
+++ b/alib2common/src/introspection/Algorithms.hpp
@@ -59,7 +59,7 @@ public:
 		return algorithms ( );
 	}
 
-	template < class RealParameterTypes, class Algorithm, class RealReturnType >
+	template < class Algorithm, class RealReturnType, class RealParameterTypes >
 	static void registerDispatchInAlgorithm ( ) {
 		std::vector < std::string > realParameterTypeNames = TypesToString < RealParameterTypes >::getTypes ( );
 		std::string algorithm = std::type_name < Algorithm > ( );
diff --git a/alib2common/src/registration/AlgoRegistration.hpp b/alib2common/src/registration/AlgoRegistration.hpp
new file mode 100644
index 0000000000..096394ce44
--- /dev/null
+++ b/alib2common/src/registration/AlgoRegistration.hpp
@@ -0,0 +1,23 @@
+#ifndef _ALGO_REGISTRATION_HPP_
+#define _ALGO_REGISTRATION_HPP_
+
+#include <introspection/Algorithms.hpp>
+#include <core/multipleDispatch.hpp>
+
+namespace registration {
+
+template < class Algorithm, class RealReturnType, class ... RealParameterTypeBases >
+class OverloadRegister {
+public:
+	OverloadRegister ( typename Algorithm::template rawOverload < RealReturnType, RealParameterTypeBases ... > callback ) {
+		Algorithm::template registerOverload < RealReturnType, RealParameterTypeBases ... > ( callback );
+
+		introspection::Algorithms::registerDispatchInAlgorithm < Algorithm, RealReturnType, std::tuple < RealParameterTypeBases ... > > ( );
+		introspection::Algorithms::registerAlgorithmInterface < Algorithm, typename Algorithm::returnType, typename Algorithm::frontParams, typename Algorithm::dispatchedParams, typename Algorithm::backParams > ( );
+		introspection::Algorithms::registerAlgorithm < Algorithm > ( );
+	}
+};
+
+} /* namespace registration */
+
+#endif // _ALGO_REGISTRATION_HPP_
diff --git a/alib2common/test-src/core/DispatchTest.cpp b/alib2common/test-src/core/DispatchTest.cpp
index 1b12172eb1..8a622727b9 100644
--- a/alib2common/test-src/core/DispatchTest.cpp
+++ b/alib2common/test-src/core/DispatchTest.cpp
@@ -1,5 +1,5 @@
 #include "DispatchTest.h"
-#include "core/multipleDispatch.hpp"
+#include <registration/AlgoRegistration.hpp>
 #include "base/CommonBase.hpp"
 #include <set>
 #include <string>
@@ -222,9 +222,9 @@ int TmpVisitorExtensionTmp1 ( const Tmp1 & first ) {
 	return 1;
 }
 
-auto TmpVisitorTmp1 = TmpVisitor::RegistratorWrapper < int, Tmp1 > ( TmpVisitorExtensionTmp1 );
-auto TmpVisitorTmp2 = TmpVisitor::RegistratorWrapper < int, Tmp2 > ( TmpVisitor::eval );
-auto TmpVisitorTmp3 = TmpVisitor::RegistratorWrapper < int, Tmp3 > ( TmpVisitor::eval );
+auto TmpVisitorTmp1 = registration::OverloadRegister < TmpVisitor, int, Tmp1 > ( TmpVisitorExtensionTmp1 );
+auto TmpVisitorTmp2 = registration::OverloadRegister < TmpVisitor, int, Tmp2 > ( TmpVisitor::eval );
+auto TmpVisitorTmp3 = registration::OverloadRegister < TmpVisitor, int, Tmp3 > ( TmpVisitor::eval );
 
 } /* namespace dispatch */
 
@@ -286,9 +286,9 @@ void TmpVisitor2ExtensionTmp1 ( int & res, const Tmp1 & first ) {
 	res = 1;
 }
 
-auto TmpVisitor2Tmp1 = TmpVisitor2::RegistratorWrapper < void, Tmp1 > ( TmpVisitor2ExtensionTmp1 );
-auto TmpVisitor2Tmp2 = TmpVisitor2::RegistratorWrapper < void, Tmp2 > ( TmpVisitor2::eval );
-auto TmpVisitor2Tmp3 = TmpVisitor2::RegistratorWrapper < void, Tmp3 > ( TmpVisitor2::eval );
+auto TmpVisitor2Tmp1 = registration::OverloadRegister < TmpVisitor2, void, Tmp1 > ( TmpVisitor2ExtensionTmp1 );
+auto TmpVisitor2Tmp2 = registration::OverloadRegister < TmpVisitor2, void, Tmp2 > ( TmpVisitor2::eval );
+auto TmpVisitor2Tmp3 = registration::OverloadRegister < TmpVisitor2, void, Tmp3 > ( TmpVisitor2::eval );
 
 } /* namespace dispatch */
 
@@ -351,9 +351,9 @@ int TmpVisitor3ExtensionTmp1 ( Tmp1 && first ) {
 	return 1;
 }
 
-auto TmpVisitor3Tmp1 = TmpVisitor3::RegistratorWrapper < int, Tmp1 > ( TmpVisitor3ExtensionTmp1 );
-auto TmpVisitor3Tmp2 = TmpVisitor3::RegistratorWrapper < int, Tmp2 > ( TmpVisitor3::eval );
-auto TmpVisitor3Tmp3 = TmpVisitor3::RegistratorWrapper < int, Tmp3 > ( TmpVisitor3::eval );
+auto TmpVisitor3Tmp1 = registration::OverloadRegister < TmpVisitor3, int, Tmp1 > ( TmpVisitor3ExtensionTmp1 );
+auto TmpVisitor3Tmp2 = registration::OverloadRegister < TmpVisitor3, int, Tmp2 > ( TmpVisitor3::eval );
+auto TmpVisitor3Tmp3 = registration::OverloadRegister < TmpVisitor3, int, Tmp3 > ( TmpVisitor3::eval );
 
 } /* namespace dispatch */
 
diff --git a/alib2elgo/src/automaton/properties/efficient/AllEpsilonClosure.cpp b/alib2elgo/src/automaton/properties/efficient/AllEpsilonClosure.cpp
index 0966da9435..47020b1ccd 100644
--- a/alib2elgo/src/automaton/properties/efficient/AllEpsilonClosure.cpp
+++ b/alib2elgo/src/automaton/properties/efficient/AllEpsilonClosure.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "AllEpsilonClosure.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -13,12 +14,12 @@ namespace properties {
 
 namespace efficient {
 
-auto AllEpsilonClosureEpsilonNFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::EpsilonNFA < > >(AllEpsilonClosure::allEpsilonClosure);
-auto AllEpsilonClosureMultiInitialStateNFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::MultiInitialStateNFA < >>(AllEpsilonClosure::allEpsilonClosure);
-auto AllEpsilonClosureNFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::NFA < > >(AllEpsilonClosure::allEpsilonClosure);
-auto AllEpsilonClosureDFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::DFA<>>(AllEpsilonClosure::allEpsilonClosure);
-auto AllEpsilonClosureExtendedNFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::ExtendedNFA < > >(AllEpsilonClosure::allEpsilonClosure);
-auto AllEpsilonClosureCompactNFA = AllEpsilonClosure::RegistratorWrapper<std::map<DefaultStateType, std::set<DefaultStateType>>, automaton::CompactNFA < > >(AllEpsilonClosure::allEpsilonClosure);
+auto AllEpsilonClosureEpsilonNFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set < DefaultStateType > >, automaton::EpsilonNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureMultiInitialStateNFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set < DefaultStateType > >, automaton::MultiInitialStateNFA < >> ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureNFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set<DefaultStateType > >, automaton::NFA < > > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureDFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set<DefaultStateType > >, automaton::DFA < > > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureExtendedNFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set<DefaultStateType > >, automaton::ExtendedNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureCompactNFA = registration::OverloadRegister < AllEpsilonClosure, std::map < DefaultStateType, std::set<DefaultStateType > >, automaton::CompactNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
 
 std::map<DefaultStateType, std::set<DefaultStateType>> AllEpsilonClosure::allEpsilonClosure(const Automaton& automaton) {
 	return dispatch(automaton.getData());
diff --git a/alib2elgo/src/automaton/properties/efficient/ReachableStates.cpp b/alib2elgo/src/automaton/properties/efficient/ReachableStates.cpp
index b634efafda..4ec4d300a0 100644
--- a/alib2elgo/src/automaton/properties/efficient/ReachableStates.cpp
+++ b/alib2elgo/src/automaton/properties/efficient/ReachableStates.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ReachableStates.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -17,12 +18,12 @@ std::set<DefaultStateType> ReachableStates::reachableStates(const Automaton& aut
 	return dispatch(automaton.getData());
 }
 
-auto ReachableStatesEpsilonNFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::EpsilonNFA < > >(ReachableStates::reachableStates);
-auto ReachableStatesNFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::NFA < > >(ReachableStates::reachableStates);
-auto ReachableStatesCompactNFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::CompactNFA < > >(ReachableStates::reachableStates);
-auto ReachableStatesExtendedNFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::ExtendedNFA < > >(ReachableStates::reachableStates);
-auto ReachableStatesMultiInitialStateNFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::MultiInitialStateNFA < >>(ReachableStates::reachableStates);
-auto ReachableStatesDFA = ReachableStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::DFA < > >(ReachableStates::reachableStates);
+auto ReachableStatesEpsilonNFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::EpsilonNFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesNFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::NFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesCompactNFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::CompactNFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesExtendedNFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::ExtendedNFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesMultiInitialStateNFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesDFA = registration::OverloadRegister < ReachableStates, std::set < DefaultStateType >, automaton::DFA < > > ( ReachableStates::reachableStates );
 
 } /* namespace efficient */
 
diff --git a/alib2elgo/src/automaton/properties/efficient/UsefullStates.cpp b/alib2elgo/src/automaton/properties/efficient/UsefullStates.cpp
index 5c5db127c9..6bb9a556ac 100644
--- a/alib2elgo/src/automaton/properties/efficient/UsefullStates.cpp
+++ b/alib2elgo/src/automaton/properties/efficient/UsefullStates.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "UsefullStates.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -17,12 +18,12 @@ std::set<DefaultStateType> UsefullStates::usefullStates(const Automaton& automat
 	return dispatch(automaton.getData());
 }
 
-auto UsefullStatesEpsilonNFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::EpsilonNFA < > >(UsefullStates::usefullStates);
-auto UsefullStatesNFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::NFA < > >(UsefullStates::usefullStates);
-auto UsefullStatesCompactNFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::CompactNFA < > >(UsefullStates::usefullStates);
-auto UsefullStatesExtendedNFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::ExtendedNFA < > >(UsefullStates::usefullStates);
-auto UsefullStatesMultiInitialStateNFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::MultiInitialStateNFA < >>(UsefullStates::usefullStates);
-auto UsefullStatesDFA = UsefullStates::RegistratorWrapper<std::set<DefaultStateType>, automaton::DFA < > >(UsefullStates::usefullStates);
+auto UsefullStatesEpsilonNFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::EpsilonNFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesNFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::NFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesCompactNFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::CompactNFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesExtendedNFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::ExtendedNFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesMultiInitialStateNFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesDFA = registration::OverloadRegister < UsefullStates, std::set < DefaultStateType >, automaton::DFA < > > ( UsefullStates::usefullStates );
 
 } /* namespace efficient */
 
diff --git a/alib2elgo/src/automaton/simplify/efficient/EpsilonRemoverIncoming.cpp b/alib2elgo/src/automaton/simplify/efficient/EpsilonRemoverIncoming.cpp
index cd8be26793..9122e84228 100644
--- a/alib2elgo/src/automaton/simplify/efficient/EpsilonRemoverIncoming.cpp
+++ b/alib2elgo/src/automaton/simplify/efficient/EpsilonRemoverIncoming.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "EpsilonRemoverIncoming.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -13,10 +14,10 @@ namespace simplify {
 
 namespace efficient {
 
-auto EpsilonRemoverIncomingDFA = EpsilonRemoverIncoming::RegistratorWrapper < automaton::DFA < >, automaton::DFA < > > ( EpsilonRemoverIncoming::remove );
-auto EpsilonRemoverIncomingMultiInitialStateNFA = EpsilonRemoverIncoming::RegistratorWrapper < automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( EpsilonRemoverIncoming::remove );
-auto EpsilonRemoverIncomingNFA = EpsilonRemoverIncoming::RegistratorWrapper < automaton::NFA < > , automaton::NFA < > > ( EpsilonRemoverIncoming::remove );
-auto EpsilonRemoverIncomingEpsilonNFA = EpsilonRemoverIncoming::RegistratorWrapper < automaton::NFA < > , automaton::EpsilonNFA < > > ( EpsilonRemoverIncoming::remove );
+auto EpsilonRemoverIncomingDFA = registration::OverloadRegister < EpsilonRemoverIncoming, automaton::DFA < >, automaton::DFA < > > ( EpsilonRemoverIncoming::remove );
+auto EpsilonRemoverIncomingMultiInitialStateNFA = registration::OverloadRegister < EpsilonRemoverIncoming, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( EpsilonRemoverIncoming::remove );
+auto EpsilonRemoverIncomingNFA = registration::OverloadRegister < EpsilonRemoverIncoming, automaton::NFA < > , automaton::NFA < > > ( EpsilonRemoverIncoming::remove );
+auto EpsilonRemoverIncomingEpsilonNFA = registration::OverloadRegister < EpsilonRemoverIncoming, automaton::NFA < > , automaton::EpsilonNFA < > > ( EpsilonRemoverIncoming::remove );
 
 automaton::Automaton EpsilonRemoverIncoming::remove ( const automaton::Automaton& automaton ) {
 	return dispatch ( automaton.getData ( ) );
diff --git a/alib2elgo/src/automaton/simplify/efficient/EpsilonRemoverOutgoing.cpp b/alib2elgo/src/automaton/simplify/efficient/EpsilonRemoverOutgoing.cpp
index 92186055a2..4d9c9d9081 100644
--- a/alib2elgo/src/automaton/simplify/efficient/EpsilonRemoverOutgoing.cpp
+++ b/alib2elgo/src/automaton/simplify/efficient/EpsilonRemoverOutgoing.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "EpsilonRemoverOutgoing.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -13,10 +14,10 @@ namespace simplify {
 
 namespace efficient {
 
-auto EpsilonRemoverOutgoingDFA = EpsilonRemoverOutgoing::RegistratorWrapper < automaton::DFA < >, automaton::DFA < > > ( EpsilonRemoverOutgoing::remove );
-auto EpsilonRemoverOutgoingMultiInitialStateNFA = EpsilonRemoverOutgoing::RegistratorWrapper < automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( EpsilonRemoverOutgoing::remove );
-auto EpsilonRemoverOutgoingNFA = EpsilonRemoverOutgoing::RegistratorWrapper < automaton::NFA < >, automaton::NFA < > > ( EpsilonRemoverOutgoing::remove );
-auto EpsilonRemoverOutgoingEpsilonNFA = EpsilonRemoverOutgoing::RegistratorWrapper < automaton::MultiInitialStateNFA < >, automaton::EpsilonNFA < > > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingDFA = registration::OverloadRegister < EpsilonRemoverOutgoing, automaton::DFA < >, automaton::DFA < > > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingMultiInitialStateNFA = registration::OverloadRegister < EpsilonRemoverOutgoing, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingNFA = registration::OverloadRegister < EpsilonRemoverOutgoing, automaton::NFA < >, automaton::NFA < > > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingEpsilonNFA = registration::OverloadRegister < EpsilonRemoverOutgoing, automaton::MultiInitialStateNFA < >, automaton::EpsilonNFA < > > ( EpsilonRemoverOutgoing::remove );
 
 automaton::Automaton EpsilonRemoverOutgoing::remove ( const automaton::Automaton& automaton ) {
 	return dispatch ( automaton.getData ( ) );
diff --git a/alib2elgo/src/automaton/simplify/efficient/Trim.cpp b/alib2elgo/src/automaton/simplify/efficient/Trim.cpp
index 8ea90a1caf..6e1b96135d 100644
--- a/alib2elgo/src/automaton/simplify/efficient/Trim.cpp
+++ b/alib2elgo/src/automaton/simplify/efficient/Trim.cpp
@@ -14,6 +14,7 @@
 #include <automaton/FSM/DFA.h>
 
 #include "automaton/Automaton.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -21,12 +22,12 @@ namespace simplify {
 
 namespace efficient {
 
-auto TrimDFA = Trim::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(Trim::trim);
-auto TrimNFA = Trim::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(Trim::trim);
-auto TrimMultiInitialStateNFA = Trim::RegistratorWrapper<automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < >>(Trim::trim);
-auto TrimEpsilonNFA = Trim::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(Trim::trim);
-auto TrimCompactNFA = Trim::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(Trim::trim);
-auto TrimExtendedNFA = Trim::RegistratorWrapper<automaton::ExtendedNFA < >, automaton::ExtendedNFA < > >(Trim::trim);
+auto TrimDFA = registration::OverloadRegister < Trim, automaton::DFA < >, automaton::DFA < > > ( Trim::trim );
+auto TrimNFA = registration::OverloadRegister < Trim, automaton::NFA < > , automaton::NFA < > > ( Trim::trim );
+auto TrimMultiInitialStateNFA = registration::OverloadRegister < Trim, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( Trim::trim );
+auto TrimEpsilonNFA = registration::OverloadRegister < Trim, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( Trim::trim );
+auto TrimCompactNFA = registration::OverloadRegister < Trim, automaton::CompactNFA < >, automaton::CompactNFA < > > ( Trim::trim );
+auto TrimExtendedNFA = registration::OverloadRegister < Trim, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > > ( Trim::trim );
 
 automaton::Automaton Trim::trim(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
diff --git a/alib2elgo/src/automaton/simplify/efficient/UnreachableStatesRemover.cpp b/alib2elgo/src/automaton/simplify/efficient/UnreachableStatesRemover.cpp
index fbef81238a..1bd3fdce8c 100644
--- a/alib2elgo/src/automaton/simplify/efficient/UnreachableStatesRemover.cpp
+++ b/alib2elgo/src/automaton/simplify/efficient/UnreachableStatesRemover.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "UnreachableStatesRemover.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -13,12 +14,12 @@ namespace simplify {
 
 namespace efficient {
 
-auto UnreachableStatesRemoverEpsilonNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverCompactNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverExtendedNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::ExtendedNFA < >, automaton::ExtendedNFA < > >(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverDFA = UnreachableStatesRemover::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(UnreachableStatesRemover::remove);
-auto UnreachableStatesRemoverMultiInitialStateNFA = UnreachableStatesRemover::RegistratorWrapper<automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < >>(UnreachableStatesRemover::remove);
+auto UnreachableStatesRemoverEpsilonNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::NFA < > , automaton::NFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverCompactNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::CompactNFA < >, automaton::CompactNFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverExtendedNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverDFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::DFA < >, automaton::DFA < > > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverMultiInitialStateNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( UnreachableStatesRemover::remove );
 
 automaton::Automaton UnreachableStatesRemover::remove(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
diff --git a/alib2elgo/src/automaton/simplify/efficient/UselessStatesRemover.cpp b/alib2elgo/src/automaton/simplify/efficient/UselessStatesRemover.cpp
index 34dbc772af..628f64a9a6 100644
--- a/alib2elgo/src/automaton/simplify/efficient/UselessStatesRemover.cpp
+++ b/alib2elgo/src/automaton/simplify/efficient/UselessStatesRemover.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "UselessStatesRemover.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -13,12 +14,12 @@ namespace simplify {
 
 namespace efficient {
 
-auto UselessStatesRemoverEpsilonNFA = UselessStatesRemover::RegistratorWrapper<automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(UselessStatesRemover::remove);
-auto UselessStatesRemoverNFA = UselessStatesRemover::RegistratorWrapper<automaton::NFA < > , automaton::NFA < > >(UselessStatesRemover::remove);
-auto UselessStatesRemoverCompactNFA = UselessStatesRemover::RegistratorWrapper<automaton::CompactNFA < >, automaton::CompactNFA < > >(UselessStatesRemover::remove);
-auto UselessStatesRemoverExtendedNFA = UselessStatesRemover::RegistratorWrapper<automaton::ExtendedNFA < >, automaton::ExtendedNFA < > >(UselessStatesRemover::remove);
-auto UselessStatesRemoverDFA = UselessStatesRemover::RegistratorWrapper<automaton::DFA<>, automaton::DFA<>>(UselessStatesRemover::remove);
-auto UselessStatesRemoverMultiInitialStateNFA = UselessStatesRemover::RegistratorWrapper<automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < >>(UselessStatesRemover::remove);
+auto UselessStatesRemoverEpsilonNFA = registration::OverloadRegister < UselessStatesRemover, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverNFA = registration::OverloadRegister < UselessStatesRemover, automaton::NFA < > , automaton::NFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverCompactNFA = registration::OverloadRegister < UselessStatesRemover, automaton::CompactNFA < >, automaton::CompactNFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverExtendedNFA = registration::OverloadRegister < UselessStatesRemover, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverDFA = registration::OverloadRegister < UselessStatesRemover, automaton::DFA < >, automaton::DFA < > > ( UselessStatesRemover::remove );
+auto UselessStatesRemoverMultiInitialStateNFA = registration::OverloadRegister < UselessStatesRemover, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( UselessStatesRemover::remove );
 
 automaton::Automaton UselessStatesRemover::remove(const automaton::Automaton& automaton) {
 	return dispatch(automaton.getData());
diff --git a/alib2raw/src/string/StringToRawComposer.cpp b/alib2raw/src/string/StringToRawComposer.cpp
index adc50e1320..14b1b3c8ee 100644
--- a/alib2raw/src/string/StringToRawComposer.cpp
+++ b/alib2raw/src/string/StringToRawComposer.cpp
@@ -8,6 +8,8 @@
 #include <string/StringClasses.h>
 #include "StringToRawComposer.h"
 
+#include <registration/AlgoRegistration.hpp>
+
 namespace string {
 
 void StringToRawComposer::compose(std::ostream& out, const String& string) {
@@ -21,7 +23,7 @@ void StringToRawComposer::compose(std::ostream& out, const LinearString < Symbol
 	}
 }
 
-auto StringToRawComposerLinearString = StringToRawComposer::RegistratorWrapper<void, LinearString < > >(StringToRawComposer::compose);
+auto StringToRawComposerLinearString = registration::OverloadRegister < StringToRawComposer, void, LinearString < > >(StringToRawComposer::compose);
 
 } /* namespace automaton */
 
diff --git a/alib2raw/src/tree/TreeToRawComposer.cpp b/alib2raw/src/tree/TreeToRawComposer.cpp
index 4da3676850..1e7fd0c194 100644
--- a/alib2raw/src/tree/TreeToRawComposer.cpp
+++ b/alib2raw/src/tree/TreeToRawComposer.cpp
@@ -9,6 +9,8 @@
 #include <tree/TreeClasses.h>
 #include "TreeToRawComposer.h"
 
+#include <registration/AlgoRegistration.hpp>
+
 namespace tree {
 
 void TreeToRawComposer::compose(std::deque<sax::Token>& out, const Tree& tree) {
@@ -20,7 +22,7 @@ void TreeToRawComposer::compose(std::deque<sax::Token>& out, const RankedTree <
 	composeNode(out, tree.getContent());
 }
 
-auto TreeToRawComposerRankedTree = TreeToRawComposer::RegistratorWrapper<void, RankedTree < > >(TreeToRawComposer::compose);
+auto TreeToRawComposerRankedTree = registration::OverloadRegister < TreeToRawComposer, void, RankedTree < > >(TreeToRawComposer::compose);
 
 template < class SymbolType, class RankType >
 void TreeToRawComposer::compose(std::deque<sax::Token>& out, const PrefixRankedTree < SymbolType, RankType > & tree) {
@@ -28,7 +30,7 @@ void TreeToRawComposer::compose(std::deque<sax::Token>& out, const PrefixRankedT
 	composePrefixRankedNotation(out, i, tree.getContent());
 }
 
-auto TreeToRawComposerPrefixRankedTree = TreeToRawComposer::RegistratorWrapper<void, PrefixRankedTree < > >(TreeToRawComposer::compose);
+auto TreeToRawComposerPrefixRankedTree = registration::OverloadRegister < TreeToRawComposer, void, PrefixRankedTree < > >(TreeToRawComposer::compose);
 
 template < class SymbolType >
 void TreeToRawComposer::compose(std::deque<sax::Token>& out, const PrefixRankedBarTree < SymbolType > & tree) {
@@ -36,14 +38,14 @@ void TreeToRawComposer::compose(std::deque<sax::Token>& out, const PrefixRankedB
 	composePrefixRankedBarNotation(out, i, tree.getContent());
 }
 
-auto TreeToRawComposerPrefixRankedBarTree = TreeToRawComposer::RegistratorWrapper<void, PrefixRankedBarTree < > >(TreeToRawComposer::compose);
+auto TreeToRawComposerPrefixRankedBarTree = registration::OverloadRegister < TreeToRawComposer, void, PrefixRankedBarTree < > >(TreeToRawComposer::compose);
 
 template < class SymbolType >
 void TreeToRawComposer::compose(std::deque<sax::Token>& out, const UnrankedTree < SymbolType > & tree) {
 	composeNode(out, tree.getContent());
 }
 
-auto TreeToRawComposerUnrankedTree = TreeToRawComposer::RegistratorWrapper<void, UnrankedTree < > >(TreeToRawComposer::compose);
+auto TreeToRawComposerUnrankedTree = registration::OverloadRegister < TreeToRawComposer, void, UnrankedTree < > >(TreeToRawComposer::compose);
 
 } /* namespace automaton */
 
diff --git a/alib2str/src/automaton/AutomatonToStringComposer.cpp b/alib2str/src/automaton/AutomatonToStringComposer.cpp
index f0839dc9b3..ed609149b9 100644
--- a/alib2str/src/automaton/AutomatonToStringComposer.cpp
+++ b/alib2str/src/automaton/AutomatonToStringComposer.cpp
@@ -11,6 +11,7 @@
 #include "automaton/FSM/NFA.h"
 #include "automaton/FSM/MultiInitialStateNFA.h"
 #include "automaton/FSM/EpsilonNFA.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace automaton {
 
@@ -39,8 +40,8 @@ void AutomatonToStringComposer::compose(std::ostream& out, const DFA < SymbolTyp
 	}
 }
 
-auto AutomatonToStringComposerDFA = AutomatonToStringComposer::RegistratorWrapper<void, DFA < > >(AutomatonToStringComposer::compose);
-auto ObjectToStringComposerDFA = alib::ObjectBaseDispatcher::RegistratorWrapper<void, DFA < > >( AutomatonToStringComposer::compose);
+auto AutomatonToStringComposerDFA = registration::OverloadRegister < AutomatonToStringComposer, void, DFA < > >(AutomatonToStringComposer::compose);
+auto ObjectToStringComposerDFA = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, DFA < > >( AutomatonToStringComposer::compose);
 
 template < class SymbolType, class StateType >
 void AutomatonToStringComposer::compose(std::ostream& out, const NFA < SymbolType, StateType > & automaton) {
@@ -67,8 +68,8 @@ void AutomatonToStringComposer::compose(std::ostream& out, const NFA < SymbolTyp
 	}
 }
 
-auto AutomatonToStringComposerNFA = AutomatonToStringComposer::RegistratorWrapper<void, NFA < > >(AutomatonToStringComposer::compose);
-auto ObjectToStringComposerNFA = alib::ObjectBaseDispatcher::RegistratorWrapper<void, NFA < > >( AutomatonToStringComposer::compose);
+auto AutomatonToStringComposerNFA = registration::OverloadRegister < AutomatonToStringComposer, void, NFA < > >(AutomatonToStringComposer::compose);
+auto ObjectToStringComposerNFA = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, NFA < > >( AutomatonToStringComposer::compose);
 
 template < class SymbolType, class StateType >
 void AutomatonToStringComposer::compose(std::ostream& out, const MultiInitialStateNFA < SymbolType, StateType > & automaton) {
@@ -95,8 +96,8 @@ void AutomatonToStringComposer::compose(std::ostream& out, const MultiInitialSta
 	}
 }
 
-auto AutomatonToStringComposerMultiInitialStateNFA = AutomatonToStringComposer::RegistratorWrapper<void, MultiInitialStateNFA < > >(AutomatonToStringComposer::compose);
-auto ObjectToStringComposerMultiInitialStateNFA = alib::ObjectBaseDispatcher::RegistratorWrapper<void, MultiInitialStateNFA < > >( AutomatonToStringComposer::compose);
+auto AutomatonToStringComposerMultiInitialStateNFA = registration::OverloadRegister < AutomatonToStringComposer, void, MultiInitialStateNFA < > >(AutomatonToStringComposer::compose);
+auto ObjectToStringComposerMultiInitialStateNFA = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, MultiInitialStateNFA < > >( AutomatonToStringComposer::compose);
 
 template < class SymbolType, class EpsilonType, class StateType >
 void AutomatonToStringComposer::compose(std::ostream& out, const EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton) {
@@ -124,13 +125,13 @@ void AutomatonToStringComposer::compose(std::ostream& out, const EpsilonNFA < Sy
 	}
 }
 
-auto AutomatonToStringComposerEpsilonNFA = AutomatonToStringComposer::RegistratorWrapper<void, EpsilonNFA < > >(AutomatonToStringComposer::compose);
-auto ObjectToStringComposerEpsilonNFA = alib::ObjectBaseDispatcher::RegistratorWrapper<void, EpsilonNFA < > >( AutomatonToStringComposer::compose);
+auto AutomatonToStringComposerEpsilonNFA = registration::OverloadRegister < AutomatonToStringComposer, void, EpsilonNFA < > >(AutomatonToStringComposer::compose);
+auto ObjectToStringComposerEpsilonNFA = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, EpsilonNFA < > >( AutomatonToStringComposer::compose);
 
 void AutomatonToStringComposer::compose(std::ostream& output, const Automaton& automaton) {
 	dispatch(output, automaton.getData());
 }
 
-auto ObjectToStringComposerAutomaton = alib::WrapperBaseDispatcher::RegistratorWrapper<void, Automaton>(AutomatonToStringComposer::compose);
+auto ObjectToStringComposerAutomaton = registration::OverloadRegister < alib::WrapperBaseDispatcher, void, Automaton>(AutomatonToStringComposer::compose);
 
 } /* namespace automaton */
diff --git a/alib2str/src/grammar/GrammarToStringComposer.cpp b/alib2str/src/grammar/GrammarToStringComposer.cpp
index 1bfbf55ba3..89f3b8fc73 100644
--- a/alib2str/src/grammar/GrammarToStringComposer.cpp
+++ b/alib2str/src/grammar/GrammarToStringComposer.cpp
@@ -7,6 +7,7 @@
 
 #include "GrammarToStringComposer.h"
 #include "grammar/GrammarClasses.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace grammar {
 
@@ -14,7 +15,7 @@ void GrammarToStringComposer::compose(std::ostream& output, const Grammar& gramm
 	dispatch(output, grammar.getData());
 }
 
-auto ObjectToStringComposerGrammar = alib::WrapperBaseDispatcher::RegistratorWrapper<void, Grammar>(GrammarToStringComposer::compose);
+auto ObjectToStringComposerGrammar = registration::OverloadRegister < alib::WrapperBaseDispatcher, void, Grammar>(GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const LeftLG < SymbolType > & grammar) {
@@ -22,8 +23,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const LeftLG < Symbo
 	composeCFLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerLeftLG = GrammarToStringComposer::RegistratorWrapper<void, LeftLG < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerLeftLG = alib::ObjectBaseDispatcher::RegistratorWrapper<void, LeftLG < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerLeftLG = registration::OverloadRegister < GrammarToStringComposer, void, LeftLG < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerLeftLG = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, LeftLG < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const LeftRG < SymbolType > & grammar) {
@@ -31,8 +32,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const LeftRG < Symbo
 	composeCFLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerLeftRG = GrammarToStringComposer::RegistratorWrapper<void, LeftRG < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerLeftRG = alib::ObjectBaseDispatcher::RegistratorWrapper<void, LeftRG < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerLeftRG = registration::OverloadRegister < GrammarToStringComposer, void, LeftRG < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerLeftRG = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, LeftRG < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const RightLG < SymbolType > & grammar) {
@@ -40,8 +41,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const RightLG < Symb
 	composeCFLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerRightLG = GrammarToStringComposer::RegistratorWrapper<void, RightLG < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerRightLG = alib::ObjectBaseDispatcher::RegistratorWrapper<void, RightLG < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerRightLG = registration::OverloadRegister < GrammarToStringComposer, void, RightLG < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerRightLG = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, RightLG < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const RightRG < SymbolType > & grammar) {
@@ -49,8 +50,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const RightRG < Symb
 	composeCFLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerRightRG = GrammarToStringComposer::RegistratorWrapper<void, RightRG < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerRightRG = alib::ObjectBaseDispatcher::RegistratorWrapper<void, RightRG < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerRightRG = registration::OverloadRegister < GrammarToStringComposer, void, RightRG < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerRightRG = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, RightRG < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const LG < SymbolType > & grammar) {
@@ -58,8 +59,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const LG < SymbolTyp
 	composeCFLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerLG = GrammarToStringComposer::RegistratorWrapper<void, LG < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerLG = alib::ObjectBaseDispatcher::RegistratorWrapper<void, LG < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerLG = registration::OverloadRegister < GrammarToStringComposer, void, LG < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerLG = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, LG < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const CFG < SymbolType > & grammar) {
@@ -67,8 +68,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const CFG < SymbolTy
 	composeCFLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerCFG = GrammarToStringComposer::RegistratorWrapper<void, CFG < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerCFG = alib::ObjectBaseDispatcher::RegistratorWrapper<void, CFG < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerCFG = registration::OverloadRegister < GrammarToStringComposer, void, CFG < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerCFG = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, CFG < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const EpsilonFreeCFG < SymbolType > & grammar) {
@@ -76,8 +77,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const EpsilonFreeCFG
 	composeCFLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerEpsilonFreeCFG = GrammarToStringComposer::RegistratorWrapper<void, EpsilonFreeCFG < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerEpsilonFreeCFG = alib::ObjectBaseDispatcher::RegistratorWrapper<void, EpsilonFreeCFG < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerEpsilonFreeCFG = registration::OverloadRegister < GrammarToStringComposer, void, EpsilonFreeCFG < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerEpsilonFreeCFG = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, EpsilonFreeCFG < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const CNF < SymbolType > & grammar) {
@@ -85,8 +86,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const CNF < SymbolTy
 	composeCFLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerCNF = GrammarToStringComposer::RegistratorWrapper<void, CNF < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerCNF = alib::ObjectBaseDispatcher::RegistratorWrapper<void, CNF < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerCNF = registration::OverloadRegister < GrammarToStringComposer, void, CNF < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerCNF = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, CNF < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const GNF < SymbolType > & grammar) {
@@ -94,8 +95,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const GNF < SymbolTy
 	composeCFLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerGNF = GrammarToStringComposer::RegistratorWrapper<void, GNF < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerGNF = alib::ObjectBaseDispatcher::RegistratorWrapper<void, GNF < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerGNF = registration::OverloadRegister < GrammarToStringComposer, void, GNF < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerGNF = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, GNF < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const CSG < SymbolType > & grammar) {
@@ -103,8 +104,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const CSG < SymbolTy
 	composePreservingCSLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerCSG = GrammarToStringComposer::RegistratorWrapper<void, CSG < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerCSG = alib::ObjectBaseDispatcher::RegistratorWrapper<void, CSG < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerCSG = registration::OverloadRegister < GrammarToStringComposer, void, CSG < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerCSG = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, CSG < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const NonContractingGrammar < SymbolType > & grammar) {
@@ -112,8 +113,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const NonContracting
 	composeCSLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerNonContractingGrammar = GrammarToStringComposer::RegistratorWrapper<void, NonContractingGrammar < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerNonContractingGrammar = alib::ObjectBaseDispatcher::RegistratorWrapper<void, NonContractingGrammar < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerNonContractingGrammar = registration::OverloadRegister < GrammarToStringComposer, void, NonContractingGrammar < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerNonContractingGrammar = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, NonContractingGrammar < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const ContextPreservingUnrestrictedGrammar < SymbolType > & grammar) {
@@ -121,8 +122,8 @@ void GrammarToStringComposer::compose(std::ostream& output, const ContextPreserv
 	composePreservingCSLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerContextPreservingUnrestructedGrammar = GrammarToStringComposer::RegistratorWrapper<void, ContextPreservingUnrestrictedGrammar < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerContextPreservingUnrestrictedGrammar = alib::ObjectBaseDispatcher::RegistratorWrapper<void, ContextPreservingUnrestrictedGrammar < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerContextPreservingUnrestructedGrammar = registration::OverloadRegister < GrammarToStringComposer, void, ContextPreservingUnrestrictedGrammar < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerContextPreservingUnrestrictedGrammar = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, ContextPreservingUnrestrictedGrammar < > >( GrammarToStringComposer::compose);
 
 template<class SymbolType>
 void GrammarToStringComposer::compose(std::ostream& output, const UnrestrictedGrammar < SymbolType > & grammar) {
@@ -130,7 +131,7 @@ void GrammarToStringComposer::compose(std::ostream& output, const UnrestrictedGr
 	composeCSLikeGrammar(output, grammar);
 }
 
-auto GrammarToStringComposerUnrestructedGrammar = GrammarToStringComposer::RegistratorWrapper<void, UnrestrictedGrammar < > >(GrammarToStringComposer::compose);
-auto ObjectToStringComposerUnrestrictedGrammar = alib::ObjectBaseDispatcher::RegistratorWrapper<void, UnrestrictedGrammar < > >( GrammarToStringComposer::compose);
+auto GrammarToStringComposerUnrestructedGrammar = registration::OverloadRegister < GrammarToStringComposer, void, UnrestrictedGrammar < > >(GrammarToStringComposer::compose);
+auto ObjectToStringComposerUnrestrictedGrammar = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, UnrestrictedGrammar < > >( GrammarToStringComposer::compose);
 
 }
diff --git a/alib2str/src/object/ObjectToStringComposer.cpp b/alib2str/src/object/ObjectToStringComposer.cpp
index 410bbbbc63..e899b43ce1 100644
--- a/alib2str/src/object/ObjectToStringComposer.cpp
+++ b/alib2str/src/object/ObjectToStringComposer.cpp
@@ -7,6 +7,7 @@
 
 #include "ObjectToStringComposer.h"
 #include "../StringApi.hpp"
+#include <registration/AlgoRegistration.hpp>
 
 namespace alib {
 
@@ -24,25 +25,25 @@ void ObjectToStringComposer::compose(std::ostream& out, const Object& object) {
 	compose( out, object.getData ( ) );
 }
 
-auto ObjectToStringComposerObject = WrapperBaseDispatcher::RegistratorWrapper<void, Object>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerObject = registration::OverloadRegister < WrapperBaseDispatcher, void, Object>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const primitive::Primitive& primitive) {
 	compose(out, primitive.getData());
 }
 
-auto ObjectToStringComposerPrimitive = WrapperBaseDispatcher::RegistratorWrapper<void, primitive::Primitive>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerPrimitive = registration::OverloadRegister < WrapperBaseDispatcher, void, primitive::Primitive>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& output, const label::Label& label) {
 	compose(output, label.getData());
 }
 
-auto ObjectToStringComposerLabel = WrapperBaseDispatcher::RegistratorWrapper<void, label::Label>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerLabel = registration::OverloadRegister < WrapperBaseDispatcher, void, label::Label>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::Symbol& symbol) {
 	compose(out, symbol.getData());
 }
 
-auto ObjectToStringComposerSymbol = WrapperBaseDispatcher::RegistratorWrapper<void, alphabet::Symbol>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerSymbol = registration::OverloadRegister < WrapperBaseDispatcher, void, alphabet::Symbol>(ObjectToStringComposer::compose);
 
 // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
@@ -50,19 +51,19 @@ void ObjectToStringComposer::compose(std::ostream& out, const Void&) {
 	out << "Void";
 }
 
-auto ObjectToStringComposerVoid = ObjectBaseDispatcher::RegistratorWrapper<void, Void>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerVoid = registration::OverloadRegister < ObjectBaseDispatcher, void, Void>(ObjectToStringComposer::compose);
 
-auto ObjectToStringComposerAnyObjectSet = ObjectBaseDispatcher::RegistratorWrapper<void, AnyObject < std::set < Object > > >(ObjectToStringComposer::compose);
+auto ObjectToStringComposerAnyObjectSet = registration::OverloadRegister < ObjectBaseDispatcher, void, AnyObject < std::set < Object > > >(ObjectToStringComposer::compose);
 
-auto ObjectToStringComposerAnyObjectPair = ObjectBaseDispatcher::RegistratorWrapper<void, AnyObject < std::pair < Object, Object > > >(ObjectToStringComposer::compose);
+auto ObjectToStringComposerAnyObjectPair = registration::OverloadRegister < ObjectBaseDispatcher, void, AnyObject < std::pair < Object, Object > > >(ObjectToStringComposer::compose);
 
-auto ObjectToStringComposerAnyObjectUnsigned = ObjectBaseDispatcher::RegistratorWrapper<void, AnyObject < unsigned > >(ObjectToStringComposer::compose);
+auto ObjectToStringComposerAnyObjectUnsigned = registration::OverloadRegister < ObjectBaseDispatcher, void, AnyObject < unsigned > >(ObjectToStringComposer::compose);
 
-auto ObjectToStringComposerObjectsPair = ObjectBaseDispatcher::RegistratorWrapper<void, container::ObjectsPair < Object, Object > >(ObjectToStringComposer::compose);
+auto ObjectToStringComposerObjectsPair = registration::OverloadRegister < ObjectBaseDispatcher, void, container::ObjectsPair < Object, Object > >(ObjectToStringComposer::compose);
 
-auto ObjectToStringComposerObjectsSet = ObjectBaseDispatcher::RegistratorWrapper<void, container::ObjectsSet < Object > >(ObjectToStringComposer::compose);
+auto ObjectToStringComposerObjectsSet = registration::OverloadRegister < ObjectBaseDispatcher, void, container::ObjectsSet < Object > >(ObjectToStringComposer::compose);
 
-auto ObjectToStringComposerObjectsVector = ObjectBaseDispatcher::RegistratorWrapper<void, container::ObjectsVector < Object > >(ObjectToStringComposer::compose);
+auto ObjectToStringComposerObjectsVector = registration::OverloadRegister < ObjectBaseDispatcher, void, container::ObjectsVector < Object > >(ObjectToStringComposer::compose);
 
 // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
@@ -70,25 +71,25 @@ void ObjectToStringComposer::compose(std::ostream& out, const primitive::String&
 	out << primitive.getData();
 }
 
-auto ObjectToStringComposerString = ObjectBaseDispatcher::RegistratorWrapper<void, primitive::String>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerString = registration::OverloadRegister < ObjectBaseDispatcher, void, primitive::String>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const primitive::Character& primitive) {
 	out << primitive.getData();
 }
 
-auto ObjectToStringComposerCharacter = ObjectBaseDispatcher::RegistratorWrapper<void, primitive::Character>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerCharacter = registration::OverloadRegister < ObjectBaseDispatcher, void, primitive::Character>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const primitive::Integer& primitive) {
 	out << primitive.getData();
 }
 
-auto ObjectToStringComposerInteger = ObjectBaseDispatcher::RegistratorWrapper<void, primitive::Integer>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerInteger = registration::OverloadRegister < ObjectBaseDispatcher, void, primitive::Integer>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const primitive::Unsigned& primitive) {
 	out << primitive.getData();
 }
 
-auto ObjectToStringComposerUnsigned = ObjectBaseDispatcher::RegistratorWrapper<void, primitive::Unsigned>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerUnsigned = registration::OverloadRegister < ObjectBaseDispatcher, void, primitive::Unsigned>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, unsigned primitive) {
 	out << primitive;
@@ -98,7 +99,7 @@ void ObjectToStringComposer::compose(std::ostream& out, const primitive::Bool& p
 	out << (primitive.getData() ? "true" : "false");
 }
 
-auto ObjectToStringComposerBool = ObjectBaseDispatcher::RegistratorWrapper<void, primitive::Bool>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerBool = registration::OverloadRegister < ObjectBaseDispatcher, void, primitive::Bool>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::LabeledSymbol& symbol) {
 	compose(out, symbol.getLabel());
@@ -110,19 +111,19 @@ void ObjectToStringComposer::compose(std::ostream& out, const label::PrimitiveLa
 	compose(out, label.getData());
 }
 
-auto ObjectToStringComposerPrimitiveLabel = ObjectBaseDispatcher::RegistratorWrapper<void, label::PrimitiveLabel>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerPrimitiveLabel = registration::OverloadRegister < ObjectBaseDispatcher, void, label::PrimitiveLabel>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const label::HexavigesimalLabel& label) {
 	out << (std::string) label;
 }
 
-auto ObjectToStringComposerHexavigesimalLabel = ObjectBaseDispatcher::RegistratorWrapper<void, label::HexavigesimalLabel>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerHexavigesimalLabel = registration::OverloadRegister < ObjectBaseDispatcher, void, label::HexavigesimalLabel>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const label::ObjectLabel& label) {
 	out << (std::string) label;
 }
 
-auto ObjectToStringComposerObjectLabel = ObjectBaseDispatcher::RegistratorWrapper<void, label::ObjectLabel>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerObjectLabel = registration::OverloadRegister < ObjectBaseDispatcher, void, label::ObjectLabel>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const label::UniqueLabel& label) {
 	out << '<';
@@ -132,75 +133,75 @@ void ObjectToStringComposer::compose(std::ostream& out, const label::UniqueLabel
 	out << '>';
 }
 
-auto ObjectToStringComposerUniqueLabel = ObjectBaseDispatcher::RegistratorWrapper<void, label::UniqueLabel>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerUniqueLabel = registration::OverloadRegister < ObjectBaseDispatcher, void, label::UniqueLabel>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const label::FailStateLabel& label) {
 	out << (std::string) label;
 }
 
-auto ObjectToStringComposerFailStateLabel = ObjectBaseDispatcher::RegistratorWrapper<void, label::FailStateLabel>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerFailStateLabel = registration::OverloadRegister < ObjectBaseDispatcher, void, label::FailStateLabel>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const label::InitialStateLabel& label) {
 	out << (std::string) label;
 }
 
-auto ObjectToStringComposerInitialStateLabel = ObjectBaseDispatcher::RegistratorWrapper<void, label::InitialStateLabel>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerInitialStateLabel = registration::OverloadRegister < ObjectBaseDispatcher, void, label::InitialStateLabel>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const label::FinalStateLabel& label) {
 	out << (std::string) label;
 }
 
-auto ObjectToStringComposerFinalStateLabel = ObjectBaseDispatcher::RegistratorWrapper<void, label::FinalStateLabel>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerFinalStateLabel = registration::OverloadRegister < ObjectBaseDispatcher, void, label::FinalStateLabel>(ObjectToStringComposer::compose);
 
 // ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
-auto ObjectToStringComposerLabeledSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::LabeledSymbol>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerLabeledSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::LabeledSymbol>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::BlankSymbol&) {
 	out << "#B";
 }
 
-auto ObjectToStringComposerBlankSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::BlankSymbol>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerBlankSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::BlankSymbol>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::BottomOfTheStackSymbol&) {
 	out << "#T";
 }
 
-auto ObjectToStringComposerBottomOfTheStackSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::BottomOfTheStackSymbol>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerBottomOfTheStackSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::BottomOfTheStackSymbol>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::EndSymbol&) {
 	out << "#$";
 }
 
-auto ObjectToStringComposerEndSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::EndSymbol>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerEndSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::EndSymbol>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::StartSymbol&) {
 	out << "#^";
 }
 
-auto ObjectToStringComposerStartSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::StartSymbol>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerStartSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::StartSymbol>(ObjectToStringComposer::compose);
 
-auto ObjectToStringComposerRankedSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::RankedSymbol < > >(ObjectToStringComposer::compose);
+auto ObjectToStringComposerRankedSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::RankedSymbol < > >(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::BarSymbol&) {
 	out << "#|";
 }
 
-auto ObjectToStringComposerBarSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::BarSymbol>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerBarSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::BarSymbol>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::VariablesBarSymbol&) {
 	out << "#/";
 }
 
-auto ObjectToStringComposerVariablesBarSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::VariablesBarSymbol>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerVariablesBarSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::VariablesBarSymbol>(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::SubtreeWildcardSymbol&) {
 	out << "#S";
 }
 
-auto ObjectToStringComposerSubtreeWildcardSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::SubtreeWildcardSymbol>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerSubtreeWildcardSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::SubtreeWildcardSymbol>(ObjectToStringComposer::compose);
 
-auto ObjectToStringComposerNonlinearVariableSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::NonlinearVariableSymbol < > >(ObjectToStringComposer::compose);
+auto ObjectToStringComposerNonlinearVariableSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::NonlinearVariableSymbol < > >(ObjectToStringComposer::compose);
 
 void ObjectToStringComposer::compose(std::ostream& out, const alphabet::UniqueSymbol& symbol) {
 	out << '<';
@@ -210,6 +211,6 @@ void ObjectToStringComposer::compose(std::ostream& out, const alphabet::UniqueSy
 	out << '>';
 }
 
-auto ObjectToStringComposerUniqueSymbol = ObjectBaseDispatcher::RegistratorWrapper<void, alphabet::UniqueSymbol>(ObjectToStringComposer::compose);
+auto ObjectToStringComposerUniqueSymbol = registration::OverloadRegister < ObjectBaseDispatcher, void, alphabet::UniqueSymbol>(ObjectToStringComposer::compose);
 
 } /* namespace alib */
diff --git a/alib2str/src/regexp/RegExpToStringComposer.cpp b/alib2str/src/regexp/RegExpToStringComposer.cpp
index de9c182b7e..6a5d08dc3e 100644
--- a/alib2str/src/regexp/RegExpToStringComposer.cpp
+++ b/alib2str/src/regexp/RegExpToStringComposer.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "RegExpToStringComposer.h"
+#include <registration/AlgoRegistration.hpp>
 
 namespace regexp {
 
@@ -14,21 +15,21 @@ void RegExpToStringComposer::compose(std::ostream& output, const UnboundedRegExp
 	RegExpToStringComposer::compose ( output, regexp.getRegExp ( ) );
 }
 
-auto RegExpToStringComposerUnboundedRegExp = RegExpToStringComposer::RegistratorWrapper<void, UnboundedRegExp < > >(RegExpToStringComposer::compose);
-auto ObjectToStringComposerUnboundedRegExp = alib::ObjectBaseDispatcher::RegistratorWrapper<void, UnboundedRegExp < > >( RegExpToStringComposer::compose);
+auto RegExpToStringComposerUnboundedRegExp = registration::OverloadRegister < RegExpToStringComposer, void, UnboundedRegExp < > >(RegExpToStringComposer::compose);
+auto ObjectToStringComposerUnboundedRegExp = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, UnboundedRegExp < > >( RegExpToStringComposer::compose);
 
 template < class SymbolType >
 void RegExpToStringComposer::compose(std::ostream& output, const FormalRegExp < SymbolType > & regexp) {
 	RegExpToStringComposer::compose ( output, regexp.getRegExp ( ) );
 }
 
-auto RegExpToStringComposerFormalRegExp = RegExpToStringComposer::RegistratorWrapper<void, FormalRegExp < > >(RegExpToStringComposer::compose);
-auto ObjectToStringComposerFormalRegExp = alib::ObjectBaseDispatcher::RegistratorWrapper<void, FormalRegExp < > >( RegExpToStringComposer::compose);
+auto RegExpToStringComposerFormalRegExp = registration::OverloadRegister < RegExpToStringComposer, void, FormalRegExp < > >(RegExpToStringComposer::compose);
+auto ObjectToStringComposerFormalRegExp = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, FormalRegExp < > >( RegExpToStringComposer::compose);
 
 void RegExpToStringComposer::compose(std::ostream& output, const RegExp& regexp) {
 	dispatch(output, regexp.getData());
 }
 
-auto ObjectToStringComposerRegExp = alib::WrapperBaseDispatcher::RegistratorWrapper<void, RegExp>(RegExpToStringComposer::compose);
+auto ObjectToStringComposerRegExp = registration::OverloadRegister < alib::WrapperBaseDispatcher, void, RegExp>(RegExpToStringComposer::compose);
 
 } /* namespace regexp */
diff --git a/alib2str/src/string/StringToStringComposer.cpp b/alib2str/src/string/StringToStringComposer.cpp
index 8bc76c2faa..7b09f744d2 100644
--- a/alib2str/src/string/StringToStringComposer.cpp
+++ b/alib2str/src/string/StringToStringComposer.cpp
@@ -12,6 +12,8 @@
 #include "string/LinearString.h"
 #include "string/Epsilon.h"
 
+#include <registration/AlgoRegistration.hpp>
+
 namespace string {
 
 template < class SymbolType >
@@ -30,8 +32,8 @@ void StringToStringComposer::compose ( std::ostream & out, const CyclicString <
 	out << ">";
 }
 
-auto StringToStringComposerCyclicString = StringToStringComposer::RegistratorWrapper < void, CyclicString < > > ( StringToStringComposer::compose );
-auto ObjectToStringComposerCyclicString = alib::ObjectBaseDispatcher::RegistratorWrapper<void, CyclicString < > >( StringToStringComposer::compose);
+auto StringToStringComposerCyclicString = registration::OverloadRegister < StringToStringComposer, void, CyclicString < > > ( StringToStringComposer::compose );
+auto ObjectToStringComposerCyclicString = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, CyclicString < > >( StringToStringComposer::compose);
 
 template < class SymbolType >
 void StringToStringComposer::compose ( std::ostream & out, const LinearString < SymbolType > & string ) {
@@ -49,21 +51,21 @@ void StringToStringComposer::compose ( std::ostream & out, const LinearString <
 	out << "\"";
 }
 
-auto StringToStringComposerLinearString = StringToStringComposer::RegistratorWrapper < void, LinearString < > > ( StringToStringComposer::compose );
-auto ObjectToStringComposerLinearString = alib::ObjectBaseDispatcher::RegistratorWrapper<void, LinearString < > >( StringToStringComposer::compose);
+auto StringToStringComposerLinearString = registration::OverloadRegister < StringToStringComposer, void, LinearString < > > ( StringToStringComposer::compose );
+auto ObjectToStringComposerLinearString = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, LinearString < > >( StringToStringComposer::compose);
 
 template < class SymbolType >
 void StringToStringComposer::compose ( std::ostream & out, const Epsilon < SymbolType > & ) {
 	out << "#E";
 }
 
-auto StringToStringComposerEpsilon = StringToStringComposer::RegistratorWrapper < void, Epsilon < > > ( StringToStringComposer::compose );
-auto ObjectToStringComposerEpsilon = alib::ObjectBaseDispatcher::RegistratorWrapper<void, Epsilon < > >( StringToStringComposer::compose);
+auto StringToStringComposerEpsilon = registration::OverloadRegister < StringToStringComposer, void, Epsilon < > > ( StringToStringComposer::compose );
+auto ObjectToStringComposerEpsilon = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, Epsilon < > >( StringToStringComposer::compose);
 
 void StringToStringComposer::compose ( std::ostream & out, const String & string ) {
 	dispatch ( out, string.getData ( ) );
 }
 
-auto ObjectToStringComposerString = alib::WrapperBaseDispatcher::RegistratorWrapper<void, String>(StringToStringComposer::compose);
+auto ObjectToStringComposerString = registration::OverloadRegister < alib::WrapperBaseDispatcher, void, String>(StringToStringComposer::compose);
 
 } /* namespace string */
diff --git a/alib2str/src/tree/TreeToStringComposer.cpp b/alib2str/src/tree/TreeToStringComposer.cpp
index 4c0b79d471..cff19603f7 100644
--- a/alib2str/src/tree/TreeToStringComposer.cpp
+++ b/alib2str/src/tree/TreeToStringComposer.cpp
@@ -11,6 +11,8 @@
 #include <tree/unranked/UnrankedTree.h>
 #include <tree/unranked/UnrankedPattern.h>
 
+#include <registration/AlgoRegistration.hpp>
+
 namespace tree {
 
 template < class SymbolType, class RankType >
@@ -18,37 +20,37 @@ void TreeToStringComposer::compose ( std::ostream & out, const RankedTree < Symb
 	compose ( out, tree.getContent ( ) );
 }
 
-auto StringToStringComposerRankedTree = TreeToStringComposer::RegistratorWrapper < void, RankedTree < > > ( TreeToStringComposer::compose );
-auto ObjectToStringComposerRankedTree = alib::ObjectBaseDispatcher::RegistratorWrapper<void, RankedTree < > >(TreeToStringComposer::compose);
+auto StringToStringComposerRankedTree = registration::OverloadRegister < TreeToStringComposer, void, RankedTree < > > ( TreeToStringComposer::compose );
+auto ObjectToStringComposerRankedTree = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, RankedTree < > >(TreeToStringComposer::compose);
 
 template < class SymbolType, class RankType >
 void TreeToStringComposer::compose ( std::ostream & out, const RankedPattern < SymbolType, RankType > & tree ) {
 	compose ( out, tree.getSubtreeWildcard ( ), tree.getContent ( ) );
 }
 
-auto StringToStringComposerRankedPattern = TreeToStringComposer::RegistratorWrapper < void, RankedPattern < > > ( TreeToStringComposer::compose );
-auto ObjectToStringComposerRankedPattern = alib::ObjectBaseDispatcher::RegistratorWrapper<void, RankedPattern < > >(TreeToStringComposer::compose);
+auto StringToStringComposerRankedPattern = registration::OverloadRegister < TreeToStringComposer, void, RankedPattern < > > ( TreeToStringComposer::compose );
+auto ObjectToStringComposerRankedPattern = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, RankedPattern < > >(TreeToStringComposer::compose);
 
 template < class SymbolType >
 void TreeToStringComposer::compose ( std::ostream & out, const UnrankedTree < SymbolType > & tree ) {
 	compose ( out, tree.getContent ( ) );
 }
 
-auto StringToStringComposerUnrankedTree = TreeToStringComposer::RegistratorWrapper < void, UnrankedTree < > > ( TreeToStringComposer::compose );
-auto ObjectToStringComposerUnrankedTree = alib::ObjectBaseDispatcher::RegistratorWrapper<void, UnrankedTree < > >(TreeToStringComposer::compose);
+auto StringToStringComposerUnrankedTree = registration::OverloadRegister < TreeToStringComposer, void, UnrankedTree < > > ( TreeToStringComposer::compose );
+auto ObjectToStringComposerUnrankedTree = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, UnrankedTree < > >(TreeToStringComposer::compose);
 
 template < class SymbolType >
 void TreeToStringComposer::compose ( std::ostream & out, const UnrankedPattern < SymbolType > & tree ) {
 	compose ( out, tree.getSubtreeWildcard ( ), tree.getContent ( ) );
 }
 
-auto StringToStringComposerUnrankedPattern = TreeToStringComposer::RegistratorWrapper < void, UnrankedPattern < > > ( TreeToStringComposer::compose );
-auto ObjectToStringComposerUnrankedPattern = alib::ObjectBaseDispatcher::RegistratorWrapper<void, UnrankedPattern < > >(TreeToStringComposer::compose);
+auto StringToStringComposerUnrankedPattern = registration::OverloadRegister < TreeToStringComposer, void, UnrankedPattern < > > ( TreeToStringComposer::compose );
+auto ObjectToStringComposerUnrankedPattern = registration::OverloadRegister < alib::ObjectBaseDispatcher, void, UnrankedPattern < > >(TreeToStringComposer::compose);
 
 void TreeToStringComposer::compose ( std::ostream & out, const Tree & tree ) {
 	dispatch ( out, tree.getData ( ) );
 }
 
-auto ObjectToStringComposerTree = alib::WrapperBaseDispatcher::RegistratorWrapper<void, Tree>(TreeToStringComposer::compose);
+auto ObjectToStringComposerTree = registration::OverloadRegister < alib::WrapperBaseDispatcher, void, Tree>(TreeToStringComposer::compose);
 
 } /* namespace tree */
diff --git a/alib2str_experimental/src/graph/GraphToStringComposer.cpp b/alib2str_experimental/src/graph/GraphToStringComposer.cpp
index c8f3c23aeb..a74ccf1fa5 100644
--- a/alib2str_experimental/src/graph/GraphToStringComposer.cpp
+++ b/alib2str_experimental/src/graph/GraphToStringComposer.cpp
@@ -11,6 +11,8 @@
 #include <StringApi.hpp>
 #include <label/LabelStringApi.hpp>
 
+#include <registration/AlgoRegistration.hpp>
+
 namespace graph {
 
 void GraphToStringComposer::compose(std::ostream &out, const Graph &graph)
@@ -34,7 +36,7 @@ void GraphToStringComposer::compose(std::ostream& out, const DirectedGraph &grap
 	composeEdgeValues(out, graph);
 }
 
-//auto GraphToStringComposerDirectedGraph = GraphToStringComposer::RegistratorWrapper<void, DirectedGraph>(GraphToStringComposer::compose);
+//auto GraphToStringComposerDirectedGraph = registration::OverloadRegister < GraphToStringComposer, void, DirectedGraph>(GraphToStringComposer::compose);
 
 void GraphToStringComposer::compose(std::ostream& out, const UndirectedGraph &graph)
 {
@@ -50,7 +52,7 @@ void GraphToStringComposer::compose(std::ostream& out, const UndirectedGraph &gr
 	composeEdgeValues(out, graph);
 }
 
-//auto> GraphToStringComposerUndirectedGraph = GraphToStringComposer::RegistratorWrapper<void, UndirectedGraph>(GraphToStringComposer::compose);
+//auto> GraphToStringComposerUndirectedGraph = registration::OverloadRegister < GraphToStringComposer, void, UndirectedGraph>(GraphToStringComposer::compose);
 
 
 // !! add graph types/representations
@@ -58,25 +60,25 @@ void composeALDG(std::ostream & out, const AdjacencyListDirectedGraph & graph) {
 	GraphToStringComposer::compose(out, graph);
 }
 
-auto GraphToStringComposerALDG = GraphToStringComposer::RegistratorWrapper<void, AdjacencyListDirectedGraph>(composeALDG);
+auto GraphToStringComposerALDG = registration::OverloadRegister < GraphToStringComposer, void, AdjacencyListDirectedGraph>(composeALDG);
 
 void composeAMDG(std::ostream & out, const AdjacencyMatrixDirectedGraph & graph) {
 	GraphToStringComposer::compose(out, graph);
 }
 
-auto GraphToStringComposerAMDG = GraphToStringComposer::RegistratorWrapper<void, AdjacencyMatrixDirectedGraph>(composeAMDG);
+auto GraphToStringComposerAMDG = registration::OverloadRegister < GraphToStringComposer, void, AdjacencyMatrixDirectedGraph>(composeAMDG);
 
 void composeALUG(std::ostream & out, const AdjacencyListUndirectedGraph & graph) {
 	GraphToStringComposer::compose(out, graph);
 }
 
-auto GraphToStringComposerALUG = GraphToStringComposer::RegistratorWrapper<void, AdjacencyListUndirectedGraph>(composeALUG);
+auto GraphToStringComposerALUG = registration::OverloadRegister < GraphToStringComposer, void, AdjacencyListUndirectedGraph>(composeALUG);
 
 void composeAMUG(std::ostream & out, const AdjacencyMatrixUndirectedGraph & graph) {
 	GraphToStringComposer::compose(out, graph);
 }
 
-auto GraphToStringComposerAMUG = GraphToStringComposer::RegistratorWrapper<void, AdjacencyMatrixUndirectedGraph>(composeAMUG);
+auto GraphToStringComposerAMUG = registration::OverloadRegister < GraphToStringComposer, void, AdjacencyMatrixUndirectedGraph>(composeAMUG);
 
 
 
diff --git a/alib2str_experimental/src/label/LabelToStringComposer.cpp b/alib2str_experimental/src/label/LabelToStringComposer.cpp
index aaccebc5e3..8445aabaa7 100644
--- a/alib2str_experimental/src/label/LabelToStringComposer.cpp
+++ b/alib2str_experimental/src/label/LabelToStringComposer.cpp
@@ -18,25 +18,27 @@
 
 #include <StringApi.hpp>
 
+#include <registration/AlgoRegistration.hpp>
+
 namespace label {
 
 void LabelToStringComposer::compose(std::ostream& out, const PrimitiveLabel& label) {
 	alib::stringApi<primitive::Primitive>::compose(out, label.getData());
 }
 
-auto LabelToStringComposerPrimitiveLabel = LabelToStringComposer::RegistratorWrapper<void, PrimitiveLabel>(LabelToStringComposer::compose);
+auto LabelToStringComposerPrimitiveLabel = registration::OverloadRegister < LabelToStringComposer, void, PrimitiveLabel>(LabelToStringComposer::compose);
 
 void LabelToStringComposer::compose(std::ostream& out, const HexavigesimalLabel& label) {
 	out << (std::string) label;
 }
 
-auto LabelToStringComposerHexavigesimalLabel = LabelToStringComposer::RegistratorWrapper<void, HexavigesimalLabel>(LabelToStringComposer::compose);
+auto LabelToStringComposerHexavigesimalLabel = registration::OverloadRegister < LabelToStringComposer, void, HexavigesimalLabel>(LabelToStringComposer::compose);
 
 void LabelToStringComposer::compose(std::ostream& out, const ObjectLabel& label) {
 	out << (std::string) label;
 }
 
-auto LabelToStringComposerObjectLabel = LabelToStringComposer::RegistratorWrapper<void, ObjectLabel>(LabelToStringComposer::compose);
+auto LabelToStringComposerObjectLabel = registration::OverloadRegister < LabelToStringComposer, void, ObjectLabel>(LabelToStringComposer::compose);
 
 void LabelToStringComposer::compose(std::ostream& out, const UniqueLabel& label) {
 	out << '<';
@@ -46,25 +48,25 @@ void LabelToStringComposer::compose(std::ostream& out, const UniqueLabel& label)
 	out << '>';
 }
 
-auto LabelToStringComposerUniqueLabel = LabelToStringComposer::RegistratorWrapper<void, UniqueLabel>(LabelToStringComposer::compose);
+auto LabelToStringComposerUniqueLabel = registration::OverloadRegister < LabelToStringComposer, void, UniqueLabel>(LabelToStringComposer::compose);
 
 void LabelToStringComposer::compose(std::ostream& out, const FailStateLabel& label) {
 	out << (std::string) label;
 }
 
-auto LabelToStringComposerFailStateLabel = LabelToStringComposer::RegistratorWrapper<void, FailStateLabel>(LabelToStringComposer::compose);
+auto LabelToStringComposerFailStateLabel = registration::OverloadRegister < LabelToStringComposer, void, FailStateLabel>(LabelToStringComposer::compose);
 
 void LabelToStringComposer::compose(std::ostream& out, const InitialStateLabel& label) {
 	out << (std::string) label;
 }
 
-auto LabelToStringComposerInitialStateLabel = LabelToStringComposer::RegistratorWrapper<void, InitialStateLabel>(LabelToStringComposer::compose);
+auto LabelToStringComposerInitialStateLabel = registration::OverloadRegister < LabelToStringComposer, void, InitialStateLabel>(LabelToStringComposer::compose);
 
 void LabelToStringComposer::compose(std::ostream& out, const FinalStateLabel& label) {
 	out << (std::string) label;
 }
 
-auto LabelToStringComposerFinalStateLabel = LabelToStringComposer::RegistratorWrapper<void, FinalStateLabel>(LabelToStringComposer::compose);
+auto LabelToStringComposerFinalStateLabel = registration::OverloadRegister < LabelToStringComposer, void, FinalStateLabel>(LabelToStringComposer::compose);
 
 void LabelToStringComposer::compose(std::ostream& output, const Label& label) {
 	dispatch(output, label.getData());
diff --git a/alib2str_experimental/src/primitive/PrimitiveToStringComposer.cpp b/alib2str_experimental/src/primitive/PrimitiveToStringComposer.cpp
index c6fee77ab0..8985c268a1 100644
--- a/alib2str_experimental/src/primitive/PrimitiveToStringComposer.cpp
+++ b/alib2str_experimental/src/primitive/PrimitiveToStringComposer.cpp
@@ -14,6 +14,8 @@
 #include "primitive/Unsigned.h"
 #include "primitive/Bool.h"
 
+#include <registration/AlgoRegistration.hpp>
+
 namespace primitive {
 
 void PrimitiveToStringComposer::compose(std::ostream& out, const String& primitive) {
@@ -30,31 +32,31 @@ void PrimitiveToStringComposer::compose(std::ostream& out, const String& primiti
 	out << '\'' << tmp << '\'';
 }
 
-auto PrimitiveToStringComposerString = PrimitiveToStringComposer::RegistratorWrapper<void, String>(PrimitiveToStringComposer::compose);
+auto PrimitiveToStringComposerString = registration::OverloadRegister < PrimitiveToStringComposer, void, String>(PrimitiveToStringComposer::compose);
 
 void PrimitiveToStringComposer::compose(std::ostream& out, const Character& primitive) {
 	out << primitive.getData();
 }
 
-auto PrimitiveToStringComposerCharacter = PrimitiveToStringComposer::RegistratorWrapper<void, Character>(PrimitiveToStringComposer::compose);
+auto PrimitiveToStringComposerCharacter = registration::OverloadRegister < PrimitiveToStringComposer, void, Character>(PrimitiveToStringComposer::compose);
 
 void PrimitiveToStringComposer::compose(std::ostream& out, const Integer& primitive) {
 	out << primitive.getData();
 }
 
-auto PrimitiveToStringComposerInteger = PrimitiveToStringComposer::RegistratorWrapper<void, Integer>(PrimitiveToStringComposer::compose);
+auto PrimitiveToStringComposerInteger = registration::OverloadRegister < PrimitiveToStringComposer, void, Integer>(PrimitiveToStringComposer::compose);
 
 void PrimitiveToStringComposer::compose(std::ostream& out, const Unsigned& primitive) {
 	out << primitive.getData();
 }
 
-auto PrimitiveToStringComposerUnsigned = PrimitiveToStringComposer::RegistratorWrapper<void, Unsigned>(PrimitiveToStringComposer::compose);
+auto PrimitiveToStringComposerUnsigned = registration::OverloadRegister < PrimitiveToStringComposer, void, Unsigned>(PrimitiveToStringComposer::compose);
 
 void PrimitiveToStringComposer::compose(std::ostream& out, const Bool& primitive) {
 	out << (primitive.getData() ? "true" : "false");
 }
 
-auto PrimitiveToStringComposerBool = PrimitiveToStringComposer::RegistratorWrapper<void, Bool>(PrimitiveToStringComposer::compose);
+auto PrimitiveToStringComposerBool = registration::OverloadRegister < PrimitiveToStringComposer, void, Bool>(PrimitiveToStringComposer::compose);
 
 void PrimitiveToStringComposer::compose(std::ostream& out, const Primitive& primitive) {
 	dispatch(out, primitive.getData());
diff --git a/astat2/src/SizeStat.cpp b/astat2/src/SizeStat.cpp
index 72684d1981..1c8166680d 100644
--- a/astat2/src/SizeStat.cpp
+++ b/astat2/src/SizeStat.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "SizeStat.h"
+#include <registration/AlgoRegistration.hpp>
 
 void SizeStat::stat ( const container::Container & container ) {
 	dispatch ( container.getData ( ) );
@@ -15,4 +16,4 @@ void SizeStat::stat ( const container::ObjectsSet < > & set ) {
 	std::cout << set.size ( ) << std::endl;
 }
 
-auto SizeStatObjectsSet = SizeStat::RegistratorWrapper < void, container::ObjectsSet < > > ( SizeStat::stat );
+auto SizeStatObjectsSet = registration::OverloadRegister < SizeStat, void, container::ObjectsSet < > > ( SizeStat::stat );
-- 
GitLab