diff --git a/alib2algo/src/automaton/simplify/Normalize.cpp b/alib2algo/src/automaton/simplify/Normalize.cpp
index edfed9fb05b8c0d03a4c6ccdb986459485a868b0..43b529f6c4055ca487f62ad1fe739a776f4e12a0 100644
--- a/alib2algo/src/automaton/simplify/Normalize.cpp
+++ b/alib2algo/src/automaton/simplify/Normalize.cpp
@@ -12,17 +12,8 @@ namespace automaton {
 
 namespace simplify {
 
-automaton::Automaton Normalize::normalize(const automaton::Automaton& automaton) {
-	automaton::Automaton res = dispatch(automaton.getData());
-	res.normalize ( );
-	return res;
-}
-
-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 );
-
-auto NormalizeDFA2 = registration::AbstractRegister < Normalize, automaton::DFA < DefaultSymbolType, unsigned >, const automaton::DFA < > & > ( Normalize::normalize );
-auto NormalizeDPDA2 = registration::AbstractRegister < Normalize, automaton::DPDA < DefaultSymbolType, DefaultEpsilonType, unsigned, unsigned >, const automaton::DPDA < > & > ( Normalize::normalize );
+auto NormalizeDFA = registration::AbstractRegister < Normalize, automaton::DFA < DefaultSymbolType, unsigned >, const automaton::DFA < > & > ( Normalize::normalize );
+auto NormalizeDPDA = registration::AbstractRegister < Normalize, automaton::DPDA < DefaultSymbolType, DefaultEpsilonType, unsigned, unsigned >, const automaton::DPDA < > & > ( Normalize::normalize );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/Normalize.h b/alib2algo/src/automaton/simplify/Normalize.h
index e6cfc984efb2fa9d104c1d3a2e98fa6bd764eba8..d5473d7901b4b8a78802c17a31f82d3f3c3a129d 100644
--- a/alib2algo/src/automaton/simplify/Normalize.h
+++ b/alib2algo/src/automaton/simplify/Normalize.h
@@ -8,22 +8,18 @@
 #ifndef NORMALIZE_H_
 #define NORMALIZE_H_
 
-#include <core/multipleDispatch.hpp>
 #include <automaton/FSM/DFA.h>
 #include <automaton/PDA/DPDA.h>
-#include <automaton/Automaton.h>
 
 namespace automaton {
 
 namespace simplify {
 
-class Normalize : public alib::SingleDispatch<Normalize, automaton::Automaton, const automaton::AutomatonBase &> {
+class Normalize {
 public:
 	/**
 	 * @param dfa automaton to normalize
 	 */
-	static automaton::Automaton normalize(const automaton::Automaton& dfa);
-
 	template < class SymbolType, class StateType >
 	static automaton::DFA < SymbolType, unsigned > normalize(const automaton::DFA < SymbolType, StateType > & dfa);
 	template < class InputSymbolType, class EpsilonType, class PushdownStoreSymbolType, class StateType >
diff --git a/alib2algo/src/automaton/simplify/SingleInitialState.cpp b/alib2algo/src/automaton/simplify/SingleInitialState.cpp
index 5e62c59f97b26efb33ac5367c1911deae6d824b2..5cb4ef02e94006ed638772daf95b433a929ceaec 100644
--- a/alib2algo/src/automaton/simplify/SingleInitialState.cpp
+++ b/alib2algo/src/automaton/simplify/SingleInitialState.cpp
@@ -12,23 +12,12 @@ namespace automaton {
 
 namespace simplify {
 
-automaton::Automaton SingleInitialState::convert(const Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-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 );
-
-auto SingleInitialStateMultiInitialStateNFA2 = registration::AbstractRegister < SingleInitialState, automaton::NFA < >, const automaton::MultiInitialStateNFA < > & > ( SingleInitialState::convert );
-auto SingleInitialStateDFA2 = registration::AbstractRegister < SingleInitialState, automaton::DFA < >, const automaton::DFA < > & > ( SingleInitialState::convert );
-auto SingleInitialStateEpsilonNFA2 = registration::AbstractRegister < SingleInitialState, automaton::EpsilonNFA < >, const automaton::EpsilonNFA < > & > ( SingleInitialState::convert );
-auto SingleInitialStateNFA2 = registration::AbstractRegister < SingleInitialState, automaton::NFA < >, const automaton::NFA < > & > ( SingleInitialState::convert );
-auto SingleInitialStateCompactNFA2 = registration::AbstractRegister < SingleInitialState, automaton::CompactNFA < >, const automaton::CompactNFA < > & > ( SingleInitialState::convert );
-auto SingleInitialStateExtendedNFA2 = registration::AbstractRegister < SingleInitialState, automaton::ExtendedNFA < >, const automaton::ExtendedNFA < > & > ( SingleInitialState::convert );
+auto SingleInitialStateMultiInitialStateNFA = registration::AbstractRegister < SingleInitialState, automaton::NFA < >, const automaton::MultiInitialStateNFA < > & > ( SingleInitialState::convert );
+auto SingleInitialStateDFA = registration::AbstractRegister < SingleInitialState, automaton::DFA < >, const automaton::DFA < > & > ( SingleInitialState::convert );
+auto SingleInitialStateEpsilonNFA = registration::AbstractRegister < SingleInitialState, automaton::EpsilonNFA < >, const automaton::EpsilonNFA < > & > ( SingleInitialState::convert );
+auto SingleInitialStateNFA = registration::AbstractRegister < SingleInitialState, automaton::NFA < >, const automaton::NFA < > & > ( SingleInitialState::convert );
+auto SingleInitialStateCompactNFA = registration::AbstractRegister < SingleInitialState, automaton::CompactNFA < >, const automaton::CompactNFA < > & > ( SingleInitialState::convert );
+auto SingleInitialStateExtendedNFA = registration::AbstractRegister < SingleInitialState, automaton::ExtendedNFA < >, const automaton::ExtendedNFA < > & > ( SingleInitialState::convert );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/SingleInitialState.h b/alib2algo/src/automaton/simplify/SingleInitialState.h
index f42a7466474020350e808c8164240c5fab18c0d3..9d6a8cc4e414e6171cb5c91362837d4aa9dac0f1 100644
--- a/alib2algo/src/automaton/simplify/SingleInitialState.h
+++ b/alib2algo/src/automaton/simplify/SingleInitialState.h
@@ -8,10 +8,6 @@
 #ifndef _SINGLE_INITIAL_STATE_H_
 #define _SINGLE_INITIAL_STATE_H_
 
-#include <core/multipleDispatch.hpp>
-#include <automaton/Automaton.h>
-#include <automaton/AutomatonFeatures.h>
-
 #include <algorithm>
 #include <set>
 
@@ -33,13 +29,11 @@ namespace simplify {
  * Makes finite automaton's transition function convert.
  * Source: Melichar: Algorithm 2.22
  */
-class SingleInitialState : public alib::SingleDispatch<SingleInitialState, automaton::Automaton, const automaton::AutomatonBase &> {
+class SingleInitialState {
 public:
 	/**
 	 * Computes epsilon closure of a state in epsilon nonfree automaton
 	 */
-	static automaton::Automaton convert(const automaton::Automaton& automaton);
-
 	template < class SymbolType, class StateType >
 	static automaton::NFA < SymbolType, StateType > convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
diff --git a/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp b/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp
index 33ae387e1d78c9c1602cdf7a88840379341c504f..f91cb42a567eb63ba88be33011cac8817906dcc9 100644
--- a/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp
+++ b/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp
@@ -12,11 +12,7 @@ namespace grammar {
 
 namespace convert {
 
-grammar::Grammar ToGrammarLeftRG::convert(const grammar::Grammar& grammar) {
-	return dispatch(grammar.getData());
-}
-
-auto ToGrammarLeftRGRightRG = registration::OverloadRegister < ToGrammarLeftRG, grammar::LeftRG < >, grammar::RightRG < > > ( ToGrammarLeftRG::convert );
+auto ToGrammarLeftRGRightRG = registration::AbstractRegister < ToGrammarLeftRG, grammar::LeftRG < >, const grammar::RightRG < > & > ( ToGrammarLeftRG::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToGrammarLeftRG.h b/alib2algo/src/grammar/convert/ToGrammarLeftRG.h
index ba052c78f5ad5e3654cf52f45019145d0616f818..fea91f62206cb85b011b060c4c667a554cb05963 100644
--- a/alib2algo/src/grammar/convert/ToGrammarLeftRG.h
+++ b/alib2algo/src/grammar/convert/ToGrammarLeftRG.h
@@ -8,9 +8,6 @@
 #ifndef TO_GRAMMAR_LEFT_RG_H_
 #define TO_GRAMMAR_LEFT_RG_H_
 
-#include <core/multipleDispatch.hpp>
-
-#include <grammar/Grammar.h>
 #include <grammar/Regular/LeftRG.h>
 #include <grammar/Regular/RightRG.h>
 
@@ -23,15 +20,13 @@ namespace convert {
 /**
  * Converts right regular grammar to left regular grammar.
  */
-class ToGrammarLeftRG : public alib::SingleDispatch<ToGrammarLeftRG, grammar::Grammar, const grammar::GrammarBase &> {
+class ToGrammarLeftRG {
 public:
 	/**
 	 * Performs conversion.
 	 * @param grammar Right regular grammar to convert
 	 * @return left regular grammar which is equivalent to source right regular grammar.
 	 */
-	static grammar::Grammar convert(const grammar::Grammar& grammar);
-
 	template < class SymbolType >
 	static grammar::LeftRG < SymbolType > convert(const grammar::RightRG < SymbolType > & grammar);
 };
diff --git a/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp b/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp
index 4a549e929322b640ebdb809f55e8a10f28c9470d..a906b00f7a424219343b2e8fe55ec363be3472d6 100644
--- a/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp
+++ b/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp
@@ -12,11 +12,7 @@ namespace grammar {
 
 namespace convert {
 
-grammar::Grammar ToGrammarRightRG::convert(const grammar::Grammar& grammar) {
-	return dispatch(grammar.getData());
-}
-
-auto ToGrammarRightRGLeftRG = registration::OverloadRegister < ToGrammarRightRG, grammar::RightRG < >, grammar::LeftRG < > > ( ToGrammarRightRG::convert );
+auto ToGrammarRightRGLeftRG = registration::AbstractRegister < ToGrammarRightRG, grammar::RightRG < >, const grammar::LeftRG < > & > ( ToGrammarRightRG::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/grammar/convert/ToGrammarRightRG.h b/alib2algo/src/grammar/convert/ToGrammarRightRG.h
index c6882bb8bd3fc5876a17dacb37e5ad5d0243280d..a0af3bdc5f3017dbd0c91fa87d2cba59ed865ec1 100644
--- a/alib2algo/src/grammar/convert/ToGrammarRightRG.h
+++ b/alib2algo/src/grammar/convert/ToGrammarRightRG.h
@@ -8,9 +8,6 @@
 #ifndef TO_GRAMMAR_RIGHT_RG_H_
 #define TO_GRAMMAR_RIGHT_RG_H_
 
-#include <core/multipleDispatch.hpp>
-
-#include <grammar/Grammar.h>
 #include <grammar/Regular/LeftRG.h>
 #include <grammar/Regular/RightRG.h>
 
@@ -23,15 +20,13 @@ namespace convert {
 /**
  * Converts left regular grammar to right regular grammar.
  */
-class ToGrammarRightRG : public alib::SingleDispatch<ToGrammarRightRG, grammar::Grammar, const grammar::GrammarBase &> {
+class ToGrammarRightRG {
 public:
 	/**
 	 * Performs conversion.
 	 * @param grammar Left regular grammar to convert
 	 * @return right regular grammar which is equivalent to source left regular grammar.
 	 */
-	static grammar::Grammar convert(const grammar::Grammar& grammar);
-
 	template < class SymbolType >
 	static grammar::RightRG < SymbolType > convert(const grammar::LeftRG < SymbolType > & grammar);
 };
diff --git a/alib2algo/src/grammar/simplify/ToCNF.cpp b/alib2algo/src/grammar/simplify/ToCNF.cpp
index 35f4d123dd77fa408defb3c71f11e4452e0d88e5..6120caac84827b392785ca957794d1c0a26aa01a 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToCNF.cpp
@@ -122,59 +122,47 @@ grammar::CNF < > ToCNF::convert(const grammar::CFG < > & origGrammar) {
 	return convertInternal(grammar::simplify::SimpleRulesRemover::remove(grammar::simplify::EpsilonRemover::remove(origGrammar)));
 }
 
-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 = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::EpsilonFreeCFG < > > ( ToCNF::convert );
-
 grammar::CNF < > ToCNF::convert(const grammar::CNF < > & origGrammar) {
 	return origGrammar;
 }
 
-auto ToCNFCNF = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::CNF < > > ( ToCNF::convert );
-
 grammar::CNF < > ToCNF::convert(const grammar::GNF < > & origGrammar) {
 	return convertInternal(origGrammar);
 }
 
-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 = 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 = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::LeftLG < > > ( ToCNF::convert );
-
 grammar::CNF < > ToCNF::convert(const grammar::LeftRG < > & origGrammar) {
 	return convertInternal(origGrammar);
 }
 
-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 = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::RightLG < > > ( ToCNF::convert );
-
 grammar::CNF < > ToCNF::convert(const grammar::RightRG < > & origGrammar) {
 	return convertInternal(origGrammar);
 }
 
-auto ToCNFRightRG = registration::OverloadRegister < ToCNF, grammar::CNF < >, grammar::RightRG < > > ( ToCNF::convert );
-
-grammar::Grammar ToCNF::convert(const grammar::Grammar& grammar) {
-	return dispatch(grammar.getData());
-}
+auto ToCNFCFG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::CFG < > & > ( ToCNF::convert );
+auto ToCNFEpsilonFreeCFG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::EpsilonFreeCFG < > & > ( ToCNF::convert );
+auto ToCNFCNF = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::CNF < > & > ( ToCNF::convert );
+auto ToCNFGNF = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::GNF < > & > ( ToCNF::convert );
+auto ToCNFLG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::LG < > & > ( ToCNF::convert );
+auto ToCNFLeftLG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::LeftLG < > & > ( ToCNF::convert );
+auto ToCNFLeftRG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::LeftRG < > & > ( ToCNF::convert );
+auto ToCNFRightLG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::RightLG < > & > ( ToCNF::convert );
+auto ToCNFRightRG = registration::AbstractRegister < ToCNF, grammar::CNF < >, const grammar::RightRG < > & > ( ToCNF::convert );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/grammar/simplify/ToCNF.h b/alib2algo/src/grammar/simplify/ToCNF.h
index 5ab1a063368b78009d1d6915b46532f4803eaa67..e6b9cc588cd56ee63780c1160f9d8f76b1696722 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.h
+++ b/alib2algo/src/grammar/simplify/ToCNF.h
@@ -8,12 +8,9 @@
 #ifndef TO_CNF_H_
 #define TO_CNF_H_
 
-#include <core/multipleDispatch.hpp>
 #include <map>
 #include <algorithm>
 
-#include <grammar/Grammar.h>
-
 #include <grammar/ContextFree/CFG.h>
 #include <grammar/ContextFree/EpsilonFreeCFG.h>
 #include <grammar/ContextFree/CNF.h>
@@ -28,10 +25,8 @@ namespace grammar {
 
 namespace simplify {
 
-class ToCNF : public alib::SingleDispatch<ToCNF, grammar::Grammar, const grammar::GrammarBase &> {
+class ToCNF {
 public:
-	static grammar::Grammar convert( const grammar::Grammar & grammar );
-
 	static grammar::CNF < > convert( const grammar::CFG < > & grammar );
 	static grammar::CNF < > convert( const grammar::EpsilonFreeCFG < > & grammar );
 	static grammar::CNF < > convert( const grammar::GNF < > & grammar );
diff --git a/alib2algo/src/grammar/simplify/ToGNF.cpp b/alib2algo/src/grammar/simplify/ToGNF.cpp
index 557bc9ca1acdb418cc76d9dbd3d036ff7a59c351..8352b12d070a454bdb6aeb1997beab4ccfed5352 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToGNF.cpp
@@ -12,19 +12,15 @@ namespace grammar {
 
 namespace simplify {
 
-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());
-}
+auto ToGNFCFG = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::CFG < > & > ( ToGNF::convert );
+auto ToGNFEpsilonFreeCFG = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::EpsilonFreeCFG < > & > ( ToGNF::convert );
+auto ToGNFCNF = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::CNF < > & > ( ToGNF::convert );
+auto ToGNFGNF = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::GNF < > & > ( ToGNF::convert );
+auto ToGNFLG = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::LG < > & > ( ToGNF::convert );
+auto ToGNFLeftLG = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::LeftLG < > & > ( ToGNF::convert );
+auto ToGNFLeftRG = registration::AbstractRegister < ToGNF, grammar::RightRG < >, const grammar::LeftRG < > & > ( ToGNF::convert );
+auto ToGNFRightLG = registration::AbstractRegister < ToGNF, grammar::GNF < >, const grammar::RightLG < > & > ( ToGNF::convert );
+auto ToGNFRightRG = registration::AbstractRegister < ToGNF, grammar::RightRG < >, const grammar::RightRG < > & > ( ToGNF::convert );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/grammar/simplify/ToGNF.h b/alib2algo/src/grammar/simplify/ToGNF.h
index 17159b32395a52aced65b424df8438854c87f20d..da220e6438f8d6a05d27a0ccd5375e3d3f462ba3 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.h
+++ b/alib2algo/src/grammar/simplify/ToGNF.h
@@ -8,12 +8,9 @@
 #ifndef TO_GNF_H_
 #define TO_GNF_H_
 
-#include <core/multipleDispatch.hpp>
 #include <map>
 #include <algorithm>
 
-#include <grammar/Grammar.h>
-
 #include <grammar/ContextFree/CFG.h>
 #include <grammar/ContextFree/EpsilonFreeCFG.h>
 #include <grammar/ContextFree/CNF.h>
@@ -34,15 +31,13 @@ namespace grammar {
 
 namespace simplify {
 
-class ToGNF : public alib::SingleDispatch<ToGNF, grammar::Grammar, const grammar::GrammarBase &> {
+class ToGNF {
 	template < class SymbolType >
 	static grammar::EpsilonFreeCFG < SymbolType > assignNonterminals(const grammar::EpsilonFreeCFG < SymbolType > & origGrammar);
 	template < class SymbolType >
 	static grammar::GNF < SymbolType > convertInternal( const grammar::EpsilonFreeCFG < SymbolType > & origGrammar );
 
 public:
-	static grammar::Grammar convert( const grammar::Grammar & grammar );
-
 	template < class SymbolType >
 	static grammar::GNF < SymbolType > convert( const grammar::CFG < SymbolType > & grammar );
 	template < class SymbolType >
diff --git a/alib2algo/src/string/simplify/NormalizeAlphabet.cpp b/alib2algo/src/string/simplify/NormalizeAlphabet.cpp
index 595a4cafc90c5231e759bb75557256e32ae39295..62ed204c5692688a91eeae47cbb4aae07c7f2274 100644
--- a/alib2algo/src/string/simplify/NormalizeAlphabet.cpp
+++ b/alib2algo/src/string/simplify/NormalizeAlphabet.cpp
@@ -12,11 +12,7 @@ namespace string {
 
 namespace simplify {
 
-string::String NormalizeAlphabet::normalize(const string::String& string) {
-	return dispatch(string.getData());
-}
-
-auto NormalizeAlphabetLinearString = registration::OverloadRegister < NormalizeAlphabet, string::LinearString < >, string::LinearString < > > ( NormalizeAlphabet::normalize );
+auto NormalizeAlphabetLinearString = registration::AbstractRegister < NormalizeAlphabet, string::LinearString < >, const string::LinearString < > & > ( NormalizeAlphabet::normalize );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/string/simplify/NormalizeAlphabet.h b/alib2algo/src/string/simplify/NormalizeAlphabet.h
index 3705ad7fa2e2282c1530f52f0fc431e9adc0f458..458d7c99f1537b071cd5bcea64154cd2f5b94776 100644
--- a/alib2algo/src/string/simplify/NormalizeAlphabet.h
+++ b/alib2algo/src/string/simplify/NormalizeAlphabet.h
@@ -8,22 +8,17 @@
 #ifndef NORMALIZE_ALPHABET_H_
 #define NORMALIZE_ALPHABET_H_
 
-#include <core/multipleDispatch.hpp>
-
 #include <string/LinearString.h>
-#include <string/String.h>
 
 namespace string {
 
 namespace simplify {
 
-class NormalizeAlphabet : public alib::SingleDispatch<NormalizeAlphabet, string::String, const string::StringBase &> {
+class NormalizeAlphabet {
 public:
 	/**
 	 * @param dfa automaton to normalize
 	 */
-	static string::String normalize(const string::String& str);
-
 	template < class SymbolType >
 	static string::LinearString < SymbolType > normalize(const string::LinearString < SymbolType > & str);
 };
diff --git a/alib2algo/test-src/grammar/simplify/GrammarToCNFTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarToCNFTest.cpp
index 1b7b509f53b435fea7bf83e39bad5c836a7a36d4..e66a952cc8d6040159ab3706901be0dec2eae5a4 100644
--- a/alib2algo/test-src/grammar/simplify/GrammarToCNFTest.cpp
+++ b/alib2algo/test-src/grammar/simplify/GrammarToCNFTest.cpp
@@ -9,6 +9,8 @@
 
 #include <common/DefaultSymbolsPairType.h>
 
+#include <grammar/Grammar.h>
+
 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( GrammarToCNFTest, "grammar" );
 CPPUNIT_TEST_SUITE_REGISTRATION( GrammarToCNFTest );
 
diff --git a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp
index 349679092c4acd858cc56b13f080c37442449523..7cf3d9faeb1ec455ba9e9b21d7c5dd5fda492e88 100644
--- a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp
+++ b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.cpp
@@ -80,11 +80,7 @@ grammar::CFG < > DeterministicLL1Grammar::convert ( const grammar::CFG < > & par
 	}
 }
 
-auto DeterministicLL1GrammarCFG = registration::OverloadRegister < DeterministicLL1Grammar, grammar::CFG < >, grammar::CFG < > > ( DeterministicLL1Grammar::convert );
-
-grammar::Grammar DeterministicLL1Grammar::convert ( const grammar::Grammar & grammar ) {
-	return dispatch ( grammar.getData ( ) );
-}
+auto DeterministicLL1GrammarCFG = registration::AbstractRegister < DeterministicLL1Grammar, grammar::CFG < >, const grammar::CFG < > & > ( DeterministicLL1Grammar::convert );
 
 } /* namespace parsing */
 
diff --git a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.h b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.h
index 434721fd5996595e4233e8bc52388119aff78231..caf6d9168523eeb483ab241ff407954bb8a9ca23 100644
--- a/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.h
+++ b/alib2algo_experimental/src/grammar/parsing/DeterministicLL1Grammar.h
@@ -8,20 +8,16 @@
 #ifndef DETERMINISTIC_LL_1_GRAMMAR_H_
 #define DETERMINISTIC_LL_1_GRAMMAR_H_
 
-#include <core/multipleDispatch.hpp>
-#include <grammar/Grammar.h>
 #include <grammar/GrammarFeatures.h>
 
 namespace grammar {
 
 namespace parsing {
 
-class DeterministicLL1Grammar : public alib::SingleDispatch < DeterministicLL1Grammar, grammar::Grammar, const grammar::GrammarBase & > {
+class DeterministicLL1Grammar {
 public:
 	static grammar::CFG < > convert ( const grammar::CFG < > & grammar );
 
-	static grammar::Grammar convert ( const grammar::Grammar & grammar );
-
 };
 
 } /* namespace parsing */
diff --git a/anormalize2/makefile.conf b/anormalize2/makefile.conf
index 83077b7cfa04f047e92eec5700a97a3abe75e979..f5f02c777b6172ce12e254f58e05c9ec18a87e12 100644
--- a/anormalize2/makefile.conf
+++ b/anormalize2/makefile.conf
@@ -1,4 +1,4 @@
 EXECUTABLE:=anormalize2
-LINK_PATHS=../alib2elgo/ ../alib2algo_experimental/ ../alib2algo/ ../alib2data_experimental/ ../alib2data/ ../alib2common/ ../alib2std/
-LINK_LIBRARIES=alib2elgo alib2algo_experimental alib2algo alib2data_experimental alib2data alib2common alib2std xml2
-INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2elgo/src/ \$$(SOURCES_BASE_DIR)/../../alib2algo_experimental/src/ \$$(SOURCES_BASE_DIR)/../../alib2algo/src/ \$$(SOURCES_BASE_DIR)/../../alib2data_experimental/src/  \$$(SOURCES_BASE_DIR)/../../alib2data/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/
+LINK_PATHS=../alib2cli/ ../alib2elgo/ ../alib2algo/ ../alib2data/ ../alib2common/ ../alib2std/
+LINK_LIBRARIES=alib2cli alib2elgo alib2algo alib2data alib2common alib2std xml2
+INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2cli/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/
diff --git a/anormalize2/src/anormalize.cpp b/anormalize2/src/anormalize.cpp
index e93abbc04dc52fadb3866355ea9491befccb1b74..d9d269f64421a470a7c92b2a18ce6a081e27da18 100644
--- a/anormalize2/src/anormalize.cpp
+++ b/anormalize2/src/anormalize.cpp
@@ -8,18 +8,10 @@
 #include <tclap/CmdLine.h>
 #include <global/GlobalData.h>
 #include <measure>
-#include <sax/FromXMLParserHelper.h>
-
-#include "exception/CommonException.h"
-#include "factory/XmlDataFactory.hpp"
-#include "string/simplify/NormalizeAlphabet.h"
-#include "automaton/simplify/Normalize.h"
-#include "automaton/simplify/SingleInitialState.h"
-#include "grammar/convert/ToGrammarLeftRG.h"
-#include "grammar/convert/ToGrammarRightRG.h"
-#include "grammar/simplify/ToCNF.h"
-#include "grammar/simplify/ToGNF.h"
-#include "grammar/parsing/DeterministicLL1Grammar.h"
+
+#include <exception/CommonException.h>
+#include <lexer/Lexer.h>
+#include <parser/Parser.h>
 
 int main ( int argc, char * * argv ) {
 	try {
@@ -69,123 +61,48 @@ int main ( int argc, char * * argv ) {
 		if ( measure.isSet ( ) )
 			common::GlobalData::measure = true;
 
+		cli::Environment environment;
+		environment.setBinding ( "stdin", input.getValue ( ) );
+		environment.setBinding ( "stdout", "-" );
+
 		measurements::start ( "Overal", measurements::Type::OVERALL );
 		measurements::start ( "Input read", measurements::Type::AUXILIARY );
 
-		ext::deque < sax::Token > tokens = sax::FromXMLParserHelper::parseInput(input);
+		cli::Parser parser ( cli::Lexer ( "execute <#stdin > $input" ) );
+		parser.parse ( )->run ( environment );
 
+		std::string cliCommand;
 		if ( labels.getValue ( ) == "automaton" ) {
-			automaton::Automaton automaton = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			automaton::Automaton res = automaton::simplify::Normalize::normalize ( automaton );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			alib::XmlDataFactory::toStdout ( res );
+			cliCommand = "execute automaton::simplify::Normalize $input > $output";
 		} else if ( labels.getValue ( ) == "grammar" ) {
-			// grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			// grammar::Grammar res = grammar::simplify::Normalize::normalize(grammar);
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			// alib::XmlDataFactory::toStdout(res);
+			cliCommand = "execute grammar::simplify::Normalize $input > $output";
 		} else if ( alphabet.getValue ( ) == "string" ) {
-			string::String string = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			string::String res = string::simplify::NormalizeAlphabet::normalize ( string );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			alib::XmlDataFactory::toStdout ( res );
+			cliCommand = "execute string::simplify::NormalizeAlphabet $input > $output";
 		} else if ( form.getValue ( ) == "leftRG" ) {
-			grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			grammar::Grammar res = grammar::convert::ToGrammarLeftRG::convert ( grammar );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			alib::XmlDataFactory::toStdout ( res );
+			cliCommand = "execute grammar::convert::ToGrammarLeftRG $input > $output";
 		} else if ( form.getValue ( ) == "rightRG" ) {
-			grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			grammar::Grammar res = grammar::convert::ToGrammarRightRG::convert ( grammar );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			alib::XmlDataFactory::toStdout ( res );
+			cliCommand = "execute grammar::convert::ToGrammarRightRG $input > $output";
 		} else if ( form.getValue ( ) == "singleInitialState" ) {
-			automaton::Automaton automaton = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			automaton::Automaton res = automaton::simplify::SingleInitialState::convert ( automaton );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			alib::XmlDataFactory::toStdout ( res );
+			cliCommand = "execute automaton::simplify::SingleInitialState $input > $output";
 		} else if ( form.getValue ( ) == "CNF" ) {
-			grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			grammar::Grammar res = grammar::simplify::ToCNF::convert ( grammar );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			alib::XmlDataFactory::toStdout ( res );
+			cliCommand = "execute grammar::simplify::ToCNF $input > $output";
 		} else if ( form.getValue ( ) == "GNF" ) {
-			grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			grammar::Grammar res = grammar::simplify::ToGNF::convert ( grammar );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			alib::XmlDataFactory::toStdout ( res );
+			cliCommand = "execute grammar::simplify::ToGNF $input > $output";
 		} else if ( form.getValue ( ) == "LL1" ) {
-			grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			grammar::Grammar res = grammar::parsing::DeterministicLL1Grammar::convert ( grammar );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			alib::XmlDataFactory::toStdout ( res );
+			cliCommand = "execute grammar::parsing::DeterministicLL1Grammar $input > $output";
 		} else {
 			throw exception::CommonException ( "Invalid normalize command" );
 		}
 
+		parser = cli::Parser ( cli::Lexer ( cliCommand ) );
+		parser.parse ( )->run ( environment );
+
+		measurements::end();
+		measurements::start("Output write", measurements::Type::AUXILIARY);
+
+		parser = cli::Parser ( cli::Lexer ( "execute $output >#stdout" ) );
+		parser.parse ( )->run ( environment );
+
 		measurements::end ( );
 		measurements::end ( );