diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h
index 2cd5a6e1ea4ace1f11c98e6d3e5f906d1dcb994d..75e98272caca794e5558fcecc903137c0a921b77 100644
--- a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h
+++ b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.h
@@ -8,23 +8,19 @@
 #ifndef _EXACT_PATTERN_MATCHING_AUTOMATON_H__
 #define _EXACT_PATTERN_MATCHING_AUTOMATON_H__
 
-#include <automaton/Automaton.h>
 #include <automaton/AutomatonFeatures.h>
 #include <tree/TreeFeatures.h>
-#include <core/multipleDispatch.hpp>
 
 namespace arbology {
 
 namespace exact {
 
-class ExactPatternMatchingAutomaton : public alib::SingleDispatch < ExactPatternMatchingAutomaton, automaton::Automaton, const tree::TreeBase & > {
+class ExactPatternMatchingAutomaton {
 public:
 	/**
 	 * Performs conversion.
 	 * @return left regular grammar equivalent to source automaton.
 	 */
-	static automaton::Automaton construct ( const tree::Tree & pattern );
-
 	static automaton::NPDA < > construct ( const tree::PrefixRankedPattern < > & pattern );
 	static automaton::InputDrivenNPDA < > construct ( const tree::PrefixRankedTree < > & pattern );
 	static automaton::VisiblyPushdownNPDA < > construct ( const tree::PrefixRankedBarPattern < > & pattern );
diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h
index 1d50753d61ddfe21890cd148c349d2eafc792022..7ca9f9e0370c0b3cb735b9defe0b20c6f335d0d1 100644
--- a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h
+++ b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.h
@@ -10,7 +10,6 @@
 
 #include <automaton/AutomatonFeatures.h>
 #include <tree/TreeFeatures.h>
-#include <core/multipleDispatch.hpp>
 
 namespace arbology {
 
diff --git a/alib2algo/src/automaton/convert/ToGrammar.cpp b/alib2algo/src/automaton/convert/ToGrammar.cpp
index 24f5d08433465d087633a0597ac020c6acb3cf52..9c09db9d51f8a2ad203ea3b9da0319c21ac6cc6a 100644
--- a/alib2algo/src/automaton/convert/ToGrammar.cpp
+++ b/alib2algo/src/automaton/convert/ToGrammar.cpp
@@ -12,13 +12,8 @@ namespace automaton {
 
 namespace convert {
 
-grammar::Grammar ToGrammar::convert(const automaton::Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-auto ToGrammarNFA = registration::OverloadRegister < ToGrammar, grammar::Grammar, automaton::NFA < > >(ToGrammar::convert);
-
-auto ToGrammarDFA = registration::OverloadRegister < ToGrammar, grammar::Grammar, automaton::DFA < > >(ToGrammar::convert);
+auto ToGrammarNFA = registration::AbstractRegister < ToGrammar, grammar::RightRG < >, const automaton::NFA < > & > ( ToGrammar::convert );
+auto ToGrammarDFA = registration::AbstractRegister < ToGrammar, grammar::RightRG < >, const automaton::DFA < > & > ( ToGrammar::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToGrammar.h b/alib2algo/src/automaton/convert/ToGrammar.h
index 3aec97681e9d13716def77a6121d83fcc2b95c3c..eb75a107e131b2cf71672275a3ad38772f6380ad 100644
--- a/alib2algo/src/automaton/convert/ToGrammar.h
+++ b/alib2algo/src/automaton/convert/ToGrammar.h
@@ -8,43 +8,35 @@
 #ifndef _AUTOMATON_TO_GRAMMAR_H__
 #define _AUTOMATON_TO_GRAMMAR_H__
 
-#include <core/multipleDispatch.hpp>
-
 #include <grammar/Regular/LeftRG.h>
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
-
-#include <grammar/Grammar.h>
-#include <automaton/Automaton.h>
-
 #include "ToGrammarRightRG.h"
 
 namespace automaton {
 
 namespace convert {
 
-class ToGrammar : public alib::SingleDispatch<ToGrammar, grammar::Grammar, const automaton::AutomatonBase &> {
+class ToGrammar {
 public:
 	/**
 	 * Performs conversion.
 	 * @return left regular grammar equivalent to source automaton.
 	 */
-	static grammar::Grammar convert(const automaton::Automaton& automaton);
-
 	template < class SymbolType, class StateType >
-	static grammar::Grammar convert(const automaton::NFA < SymbolType, StateType > & automaton);
+	static grammar::RightRG < > convert(const automaton::NFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static grammar::Grammar convert(const automaton::DFA < SymbolType, StateType > & automaton);
+	static grammar::RightRG < > convert(const automaton::DFA < SymbolType, StateType > & automaton);
 };
 
 template < class SymbolType, class StateType >
-grammar::Grammar ToGrammar::convert(const automaton::NFA < SymbolType, StateType > & automaton) {
-	return grammar::Grammar(ToGrammarRightRG::convert(automaton));
+grammar::RightRG < > ToGrammar::convert(const automaton::NFA < SymbolType, StateType > & automaton) {
+	return grammar::RightRG < >(ToGrammarRightRG::convert(automaton));
 }
 
 template < class SymbolType, class StateType >
-grammar::Grammar ToGrammar::convert(const automaton::DFA < SymbolType, StateType > & automaton) {
-	return grammar::Grammar(ToGrammarRightRG::convert(automaton));
+grammar::RightRG < > ToGrammar::convert(const automaton::DFA < SymbolType, StateType > & automaton) {
+	return grammar::RightRG < >(ToGrammarRightRG::convert(automaton));
 }
 
 
diff --git a/alib2algo/src/automaton/convert/ToRegExp.cpp b/alib2algo/src/automaton/convert/ToRegExp.cpp
index 70c4788526f5d0a9d4a83e633b3828825e7a6213..154c9cf3fe435265e7cdfa6746fc4f5c2ed07797 100644
--- a/alib2algo/src/automaton/convert/ToRegExp.cpp
+++ b/alib2algo/src/automaton/convert/ToRegExp.cpp
@@ -12,16 +12,12 @@ namespace automaton {
 
 namespace convert {
 
-regexp::RegExp ToRegExp::convert(const automaton::Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-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 );
+auto ToRegExpEpsilonNFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::EpsilonNFA < > & > ( ToRegExp::convert );
+auto ToRegExpMultiInitialStateNFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::MultiInitialStateNFA < > & > ( ToRegExp::convert );
+auto ToRegExpNFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::NFA < > & > ( ToRegExp::convert );
+auto ToRegExpDFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::DFA < > & > ( ToRegExp::convert );
+auto ToRegExpExtendedNFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::ExtendedNFA < > & > ( ToRegExp::convert );
+auto ToRegExpCompactNFA = registration::AbstractRegister < ToRegExp, regexp::UnboundedRegExp < >, const automaton::CompactNFA < > & > ( ToRegExp::convert );
 
 } /* namespace convert */
 
diff --git a/alib2algo/src/automaton/convert/ToRegExp.h b/alib2algo/src/automaton/convert/ToRegExp.h
index 2744723432feb5113d2e59e08a9543acedaea357..d67198a40a129eb25ddfa8f1e745f01125ed517b 100644
--- a/alib2algo/src/automaton/convert/ToRegExp.h
+++ b/alib2algo/src/automaton/convert/ToRegExp.h
@@ -8,73 +8,66 @@
 #ifndef _AUTOMATON_TO_REGEXP_H__
 #define _AUTOMATON_TO_REGEXP_H__
 
-#include <core/multipleDispatch.hpp>
-
 #include <automaton/FSM/DFA.h>
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/EpsilonNFA.h>
 #include <automaton/FSM/ExtendedNFA.h>
 #include <regexp/unbounded/UnboundedRegExp.h>
 
-#include <automaton/Automaton.h>
-#include <regexp/RegExp.h>
-
 #include "ToRegExpStateElimination.h"
 
 namespace automaton {
 
 namespace convert {
 
-class ToRegExp : public alib::SingleDispatch<ToRegExp, regexp::RegExp, const automaton::AutomatonBase &> {
+class ToRegExp {
 public:
 	/**
 	 * Performs conversion.
 	 * @return left regular grammar equivalent to source automaton.
 	 */
-	static regexp::RegExp convert(const automaton::Automaton& automaton);
-
 	template < class SymbolType, class EpsilonType, class StateType >
-	static regexp::RegExp convert(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static regexp::RegExp convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static regexp::RegExp convert(const automaton::NFA < SymbolType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::NFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static regexp::RegExp convert(const automaton::DFA < SymbolType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::DFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static regexp::RegExp convert(const automaton::ExtendedNFA < SymbolType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::ExtendedNFA < SymbolType, StateType > & automaton);
 	template < class SymbolType, class StateType >
-	static regexp::RegExp convert(const automaton::CompactNFA < SymbolType, StateType > & automaton);
+	static regexp::UnboundedRegExp < > convert(const automaton::CompactNFA < SymbolType, StateType > & automaton);
 };
 
 template < class SymbolType, class EpsilonType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 template < class SymbolType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::MultiInitialStateNFA < SymbolType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 template < class SymbolType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::NFA < SymbolType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::NFA < SymbolType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 template < class SymbolType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::DFA < SymbolType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::DFA < SymbolType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 template < class SymbolType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::ExtendedNFA < SymbolType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::ExtendedNFA < SymbolType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 template < class SymbolType, class StateType >
-regexp::RegExp ToRegExp::convert(const automaton::CompactNFA < SymbolType, StateType > & automaton) {
-	return regexp::RegExp(ToRegExpStateElimination::convert(automaton));
+regexp::UnboundedRegExp < > ToRegExp::convert(const automaton::CompactNFA < SymbolType, StateType > & automaton) {
+	return ToRegExpStateElimination::convert(automaton);
 }
 
 } /* namespace convert */
diff --git a/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp b/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp
index 0b410f1f6496f978715b1baeea8a12824c0d23c9..87f021d7fdca51badafc654bcbc1941912681754 100644
--- a/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp
+++ b/alib2algo/src/automaton/properties/AllEpsilonClosure.cpp
@@ -12,16 +12,12 @@ namespace automaton {
 
 namespace properties {
 
-auto AllEpsilonClosureEpsilonNFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::EpsilonNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-auto AllEpsilonClosureMultiInitialStateNFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::MultiInitialStateNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-auto AllEpsilonClosureNFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::NFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-auto AllEpsilonClosureDFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::DFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-auto AllEpsilonClosureExtendedNFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::ExtendedNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-auto AllEpsilonClosureCompactNFA = registration::OverloadRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, automaton::CompactNFA < > > ( AllEpsilonClosure::allEpsilonClosure );
-
-ext::map < DefaultStateType, ext::set < DefaultStateType > > AllEpsilonClosure::allEpsilonClosure ( const Automaton& automaton ) {
-	return dispatch ( automaton.getData ( ) );
-}
+auto AllEpsilonClosureEpsilonNFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::EpsilonNFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureMultiInitialStateNFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::MultiInitialStateNFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureNFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::NFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureDFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::DFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureExtendedNFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::ExtendedNFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
+auto AllEpsilonClosureCompactNFA = registration::AbstractRegister < AllEpsilonClosure, ext::map < DefaultStateType, ext::set < DefaultStateType > >, const automaton::CompactNFA < > & > ( AllEpsilonClosure::allEpsilonClosure );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/automaton/properties/AllEpsilonClosure.h b/alib2algo/src/automaton/properties/AllEpsilonClosure.h
index 09d7f574f50e77aa9912a93525a95c785c3ffa85..bb9aae4f893f1e44765a1d276497ef1d654dd7df 100644
--- a/alib2algo/src/automaton/properties/AllEpsilonClosure.h
+++ b/alib2algo/src/automaton/properties/AllEpsilonClosure.h
@@ -8,15 +8,11 @@
 #ifndef ALL_EPSILON_CLOSURE_H_
 #define ALL_EPSILON_CLOSURE_H_
 
-#include <core/multipleDispatch.hpp>
 #include <set>
 #include <map>
 #include <deque>
 #include <iostream>
 
-#include "automaton/Automaton.h"
-#include "automaton/AutomatonFeatures.h"
-
 #include <automaton/FSM/ExtendedNFA.h>
 #include <automaton/FSM/CompactNFA.h>
 #include <automaton/FSM/EpsilonNFA.h>
@@ -30,10 +26,8 @@ namespace automaton {
 
 namespace properties {
 
-class AllEpsilonClosure : public alib::SingleDispatch<AllEpsilonClosure, ext::map<DefaultStateType, ext::set<DefaultStateType>>, const automaton::AutomatonBase &> {
+class AllEpsilonClosure {
 public:
-	static ext::map<DefaultStateType, ext::set<DefaultStateType>> allEpsilonClosure( const automaton::Automaton & automaton);
-
 	/**
 	 * Computes allEpsilon closure of a state in allEpsilon nonfree automaton
 	 */
diff --git a/alib2algo/src/automaton/properties/EpsilonClosure.cpp b/alib2algo/src/automaton/properties/EpsilonClosure.cpp
index 9c6dbde56372b36d829a42029d467b9cc9e27f68..43d584169c3f7db743b6bb11f11094e33724d9c4 100644
--- a/alib2algo/src/automaton/properties/EpsilonClosure.cpp
+++ b/alib2algo/src/automaton/properties/EpsilonClosure.cpp
@@ -12,16 +12,12 @@ namespace automaton {
 
 namespace properties {
 
-auto EpsilonClosureEpsilonNFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::EpsilonNFA < > > ( EpsilonClosure::epsilonClosure );
-auto EpsilonClosureMultiInitialStateNFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( EpsilonClosure::epsilonClosure );
-auto EpsilonClosureNFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::NFA < > > ( EpsilonClosure::epsilonClosure );
-auto EpsilonClosureDFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::DFA < > > ( EpsilonClosure::epsilonClosure );
-auto EpsilonClosureExtendedNFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::ExtendedNFA < > > ( EpsilonClosure::epsilonClosure );
-auto EpsilonClosureCompactNFA = registration::OverloadRegister < EpsilonClosure, ext::set < DefaultStateType >, automaton::CompactNFA < > > ( EpsilonClosure::epsilonClosure );
-
-ext::set < DefaultStateType > EpsilonClosure::epsilonClosure(const Automaton& automaton, const DefaultStateType& q) {
-	return dispatch(automaton.getData(), q);
-}
+auto EpsilonClosureEpsilonNFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::EpsilonNFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureMultiInitialStateNFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::MultiInitialStateNFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureNFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::NFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureDFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::DFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureExtendedNFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::ExtendedNFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
+auto EpsilonClosureCompactNFA = registration::AbstractRegister < EpsilonClosure, ext::set < DefaultStateType >, const automaton::CompactNFA < > &, const DefaultStateType & > ( EpsilonClosure::epsilonClosure );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/automaton/properties/EpsilonClosure.h b/alib2algo/src/automaton/properties/EpsilonClosure.h
index 4a4d5c5773269ddd9a470f286d666a406633d636..28326504968c0c9576480b3014a38cad16a4ff38 100644
--- a/alib2algo/src/automaton/properties/EpsilonClosure.h
+++ b/alib2algo/src/automaton/properties/EpsilonClosure.h
@@ -8,16 +8,11 @@
 #ifndef EPSILON_CLOSURE_H_
 #define EPSILON_CLOSURE_H_
 
-#include <core/multipleDispatch.hpp>
 #include <algorithm>
-#include <deque>
 #include <queue>
 #include <set>
 #include <map>
 
-#include "automaton/Automaton.h"
-#include "automaton/AutomatonFeatures.h"
-
 #include <automaton/FSM/ExtendedNFA.h>
 #include <automaton/FSM/CompactNFA.h>
 #include <automaton/FSM/EpsilonNFA.h>
@@ -31,10 +26,8 @@ namespace automaton {
 
 namespace properties {
 
-class EpsilonClosure : public alib::SingleDispatch < EpsilonClosure, ext::set<DefaultStateType>, const automaton::AutomatonBase &, const DefaultStateType&> {
+class EpsilonClosure {
 public:
-	static ext::set<DefaultStateType> epsilonClosure( const automaton::Automaton & automaton, const DefaultStateType & state );
-
 	/**
 	 * Computes epsilon closure of a state in epsilon nonfree automaton
 	 */
diff --git a/alib2algo/src/automaton/properties/ReachableStates.cpp b/alib2algo/src/automaton/properties/ReachableStates.cpp
index c007dd0e0b03f10730c0d8f3bd3c47f0e53bc4d9..bee0e776c11762c5bef4f5152583edec2190029a 100644
--- a/alib2algo/src/automaton/properties/ReachableStates.cpp
+++ b/alib2algo/src/automaton/properties/ReachableStates.cpp
@@ -12,16 +12,12 @@ namespace automaton {
 
 namespace properties {
 
-ext::set<DefaultStateType> ReachableStates::reachableStates(const Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-auto ReachableStatesEpsilonNFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::EpsilonNFA < > > ( ReachableStates::reachableStates );
-auto ReachableStatesNFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::NFA < > > ( ReachableStates::reachableStates );
-auto ReachableStatesCompactNFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::CompactNFA < > > ( ReachableStates::reachableStates );
-auto ReachableStatesExtendedNFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::ExtendedNFA < > > ( ReachableStates::reachableStates );
-auto ReachableStatesMultiInitialStateNFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( ReachableStates::reachableStates );
-auto ReachableStatesDFA = registration::OverloadRegister < ReachableStates, ext::set < DefaultStateType >, automaton::DFA < > > ( ReachableStates::reachableStates );
+auto ReachableStatesEpsilonNFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::EpsilonNFA < > & > ( ReachableStates::reachableStates );
+auto ReachableStatesNFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::NFA < > & > ( ReachableStates::reachableStates );
+auto ReachableStatesCompactNFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::CompactNFA < > & > ( ReachableStates::reachableStates );
+auto ReachableStatesExtendedNFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::ExtendedNFA < > & > ( ReachableStates::reachableStates );
+auto ReachableStatesMultiInitialStateNFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::MultiInitialStateNFA < > &  > ( ReachableStates::reachableStates );
+auto ReachableStatesDFA = registration::AbstractRegister < ReachableStates, ext::set < DefaultStateType >, const automaton::DFA < > & > ( ReachableStates::reachableStates );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/automaton/properties/ReachableStates.h b/alib2algo/src/automaton/properties/ReachableStates.h
index f1e9d8a8ab315a8d7ea27ed868af5c3528e7d373..c41a98f7b2ec9bb4ff0483eee16884d7f709e998 100644
--- a/alib2algo/src/automaton/properties/ReachableStates.h
+++ b/alib2algo/src/automaton/properties/ReachableStates.h
@@ -8,15 +8,10 @@
 #ifndef REACHABLE_STATES_H_
 #define REACHABLE_STATES_H_
 
-#include <core/multipleDispatch.hpp>
 #include <algorithm>
 #include <deque>
 #include <set>
 #include <map>
-#include <queue>
-
-#include <automaton/Automaton.h>
-#include <automaton/AutomatonFeatures.h>
 
 #include <automaton/FSM/ExtendedNFA.h>
 #include <automaton/FSM/CompactNFA.h>
@@ -24,14 +19,14 @@
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
 
+#include <automaton/Automaton.h>
+
 namespace automaton {
 
 namespace properties {
 
-class ReachableStates : public alib::SingleDispatch<ReachableStates, ext::set<DefaultStateType>, const automaton::AutomatonBase &> {
+class ReachableStates {
 public:
-	static ext::set<DefaultStateType> reachableStates( const automaton::Automaton & automaton );
-
 	/**
 	 * Removes dead states from FSM. Melichar 2.29
 	 */
diff --git a/alib2algo/src/automaton/properties/UsefullStates.cpp b/alib2algo/src/automaton/properties/UsefullStates.cpp
index 8ecf7f83ccd2b7daaa1913eaccda2f8815f251d8..e7215bd1ae99ebafa5bf8807fa487327fc3b80c1 100644
--- a/alib2algo/src/automaton/properties/UsefullStates.cpp
+++ b/alib2algo/src/automaton/properties/UsefullStates.cpp
@@ -12,16 +12,12 @@ namespace automaton {
 
 namespace properties {
 
-ext::set < DefaultStateType > UsefullStates::usefullStates(const Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-auto UsefullStatesEpsilonNFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::EpsilonNFA < > > ( UsefullStates::usefullStates );
-auto UsefullStatesNFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::NFA < > > ( UsefullStates::usefullStates );
-auto UsefullStatesCompactNFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::CompactNFA < > > ( UsefullStates::usefullStates );
-auto UsefullStatesExtendedNFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::ExtendedNFA < > > ( UsefullStates::usefullStates );
-auto UsefullStatesMultiInitialStateNFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::MultiInitialStateNFA < > > ( UsefullStates::usefullStates );
-auto UsefullStatesDFA = registration::OverloadRegister < UsefullStates, ext::set < DefaultStateType >, automaton::DFA < > > ( UsefullStates::usefullStates );
+auto UsefullStatesEpsilonNFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::EpsilonNFA < > & > ( UsefullStates::usefullStates );
+auto UsefullStatesNFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::NFA < > & > ( UsefullStates::usefullStates );
+auto UsefullStatesCompactNFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::CompactNFA < > & > ( UsefullStates::usefullStates );
+auto UsefullStatesExtendedNFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::ExtendedNFA < > & > ( UsefullStates::usefullStates );
+auto UsefullStatesMultiInitialStateNFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::MultiInitialStateNFA < > & > ( UsefullStates::usefullStates );
+auto UsefullStatesDFA = registration::AbstractRegister < UsefullStates, ext::set < DefaultStateType >, const automaton::DFA < > & > ( UsefullStates::usefullStates );
 
 } /* namespace properties */
 
diff --git a/alib2algo/src/automaton/properties/UsefullStates.h b/alib2algo/src/automaton/properties/UsefullStates.h
index c755eb0f9b440986fefacfec2ed2a102d1af9096..cadd66bbbfb33a82e486e188ecde5149d60661bd 100644
--- a/alib2algo/src/automaton/properties/UsefullStates.h
+++ b/alib2algo/src/automaton/properties/UsefullStates.h
@@ -8,29 +8,25 @@
 #ifndef USEFULL_STATES_H_
 #define USEFULL_STATES_H_
 
-#include <core/multipleDispatch.hpp>
 #include <algorithm>
 #include <deque>
 #include <set>
 #include <map>
 
-#include <automaton/Automaton.h>
-#include <automaton/AutomatonFeatures.h>
-
 #include <automaton/FSM/ExtendedNFA.h>
 #include <automaton/FSM/CompactNFA.h>
 #include <automaton/FSM/EpsilonNFA.h>
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
 
+#include <automaton/Automaton.h>
+
 namespace automaton {
 
 namespace properties {
 
-class UsefullStates : public alib::SingleDispatch<UsefullStates, ext::set<DefaultStateType>, const automaton::AutomatonBase &> {
+class UsefullStates {
 public:
-	static ext::set<DefaultStateType> usefullStates( const automaton::Automaton & automaton );
-
 	/**
 	 * Removes dead states from FSM. Melichar 2.32
 	 */
diff --git a/alib2algo/src/automaton/simplify/Total.cpp b/alib2algo/src/automaton/simplify/Total.cpp
index 57fe6edaecc746235c64ac1d864793da7dac9b2d..9a1dd622ac9629d9b30536916e8f8ddec7d6aa4f 100644
--- a/alib2algo/src/automaton/simplify/Total.cpp
+++ b/alib2algo/src/automaton/simplify/Total.cpp
@@ -12,15 +12,8 @@ namespace automaton {
 
 namespace simplify {
 
-automaton::Automaton Total::total(const Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
-auto TotalNFA = registration::OverloadRegister < Total, automaton::NFA < >, automaton::NFA < > > ( Total::total );
-auto TotalDFA = registration::OverloadRegister < Total, automaton::DFA < >, automaton::DFA < > > ( Total::total );
-
-auto TotalNFA2 = registration::AbstractRegister < Total, automaton::NFA < >, const automaton::NFA < > & > ( Total::total );
-auto TotalDFA2 = registration::AbstractRegister < Total, automaton::DFA < >, const automaton::DFA < > & > ( Total::total );
+auto TotalNFA = registration::AbstractRegister < Total, automaton::NFA < >, const automaton::NFA < > & > ( Total::total );
+auto TotalDFA = registration::AbstractRegister < Total, automaton::DFA < >, const automaton::DFA < > & > ( Total::total );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/Total.h b/alib2algo/src/automaton/simplify/Total.h
index 3b16f3518314fc528e50d31585473100c9cd8ab4..819f89621e5e44068d61adcee5d69b3d52d73f80 100644
--- a/alib2algo/src/automaton/simplify/Total.h
+++ b/alib2algo/src/automaton/simplify/Total.h
@@ -8,10 +8,6 @@
 #ifndef TOTAL_H_
 #define TOTAL_H_
 
-#include <core/multipleDispatch.hpp>
-#include "automaton/Automaton.h"
-#include "automaton/AutomatonFeatures.h"
-
 #include <exception/CommonException.h>
 
 #include <automaton/FSM/NFA.h>
@@ -27,13 +23,11 @@ namespace simplify {
  * Makes finite automaton's transition function total.
  * Source: Melichar: Algorithm 2.22
  */
-class Total : public alib::SingleDispatch<Total, automaton::Automaton, const automaton::AutomatonBase &> {
+class Total {
 public:
 	/**
 	 * Computes epsilon closure of a state in epsilon nonfree automaton
 	 */
-	static automaton::Automaton total(const automaton::Automaton& automaton);
-
 	template < class SymbolType, class StateType >
 	static automaton::NFA < SymbolType, StateType > total(const automaton::NFA < SymbolType, StateType > & automaton);
 
diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
index adbbd691520edabcf842ded24cfaf1aa6b454068..6f2858ede0b7bc79331edb82c9f493710682e4f4 100644
--- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
+++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
@@ -30,13 +30,13 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom
 	return pda;
 }
 
-auto PDAToRHPDARealTimeHeightDeterministicDPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( PDAToRHPDA::convert );
+auto PDAToRHPDARealTimeHeightDeterministicDPDA = registration::AbstractRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::RealTimeHeightDeterministicDPDA < > & > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const automaton::RealTimeHeightDeterministicNPDA < > & pda ) {
 	return pda;
 }
 
-auto PDAToRHPDARealTimeHeightDeterministicNPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicNPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( PDAToRHPDA::convert );
+auto PDAToRHPDARealTimeHeightDeterministicNPDA = registration::AbstractRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicNPDA < >, const automaton::RealTimeHeightDeterministicNPDA < > & > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const automaton::DPDA < > & pda ) {
 	DefaultStateType q0 = common::createUnique ( label::InitialStateLabel::instance < DefaultStateType > ( ), pda.getStates ( ) );
@@ -112,7 +112,7 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom
 	return res;
 }
 
-auto PDAToRHPDADPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicDPDA < >, automaton::DPDA < > > ( PDAToRHPDA::convert );
+auto PDAToRHPDADPDA = registration::AbstractRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::DPDA < > & > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const automaton::NPDA < > & pda ) {
 	RealTimeHeightDeterministicNPDA < > res ( alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ) );
@@ -186,11 +186,7 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom
 	return res;
 }
 
-auto PDAToRHPDANPDA = registration::OverloadRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicNPDA < >, automaton::NPDA < > > ( PDAToRHPDA::convert );
-
-automaton::Automaton PDAToRHPDA::convert ( const Automaton & automaton ) {
-	return dispatch ( automaton.getData ( ) );
-}
+auto PDAToRHPDANPDA = registration::AbstractRegister < PDAToRHPDA, automaton::RealTimeHeightDeterministicNPDA < >, const automaton::NPDA < > & > ( PDAToRHPDA::convert );
 
 } /* namespace automaton */
 
diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.h b/alib2algo/src/automaton/transform/PDAToRHPDA.h
index b05ed48871528b52ec86eea7cc7a591bc79bfe44..55f96356c060c47f0e044ee1d964f83e6afcd304 100644
--- a/alib2algo/src/automaton/transform/PDAToRHPDA.h
+++ b/alib2algo/src/automaton/transform/PDAToRHPDA.h
@@ -8,27 +8,20 @@
 #ifndef PDA_TO_RHPDA_H_
 #define PDA_TO_RHPDA_H_
 
-#include <core/multipleDispatch.hpp>
 #include <algorithm>
 #include <deque>
 #include <set>
 
-#include "automaton/Automaton.h"
 #include "automaton/AutomatonFeatures.h"
 
 namespace automaton {
 
-class PDAToRHPDA : public alib::SingleDispatch<PDAToRHPDA, automaton::Automaton, const automaton::AutomatonBase &> {
+class PDAToRHPDA {
 public:
 	static automaton::RealTimeHeightDeterministicDPDA < > convert( const automaton::RealTimeHeightDeterministicDPDA < > & pda);
 	static automaton::RealTimeHeightDeterministicDPDA < > convert( const automaton::DPDA < > & pda);
 	static automaton::RealTimeHeightDeterministicNPDA < > convert( const automaton::RealTimeHeightDeterministicNPDA < > & pda);
 	static automaton::RealTimeHeightDeterministicNPDA < > convert( const automaton::NPDA < > & pda);
-
-	/**
-	 * Computes epsilon closure of a state in epsilon nonfree automaton
-	 */
-	static automaton::Automaton convert( const automaton::Automaton & automaton );
 };
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
index db4497764c9a9575a881cf2d01db8b94a637f2ba..32280ad8b2c13f3b9242b6f39d293c9f36d1e30f 100644
--- a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
+++ b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp
@@ -156,7 +156,7 @@ automaton::DPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDetermi
 	return res;
 }
 
-auto RHPDAToPDARealTimeHeightDeterministicDPDA = registration::OverloadRegister < RHPDAToPDA, automaton::DPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( RHPDAToPDA::convert );
+auto RHPDAToPDARealTimeHeightDeterministicDPDA = registration::AbstractRegister < RHPDAToPDA, automaton::DPDA < >, const automaton::RealTimeHeightDeterministicDPDA < > & > ( RHPDAToPDA::convert );
 
  // This may not work correctly -- generation of initial state and initial symbol
 automaton::NPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDeterministicNPDA < > & pda ) {
@@ -272,11 +272,7 @@ automaton::NPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDetermi
 	return res;
 }
 
-auto RHPDAToPDARealTimeHeightDeterministicNPDA = registration::OverloadRegister < RHPDAToPDA, automaton::NPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( RHPDAToPDA::convert );
-
-automaton::Automaton RHPDAToPDA::convert ( const Automaton & automaton ) {
-	return dispatch ( automaton.getData ( ) );
-}
+auto RHPDAToPDARealTimeHeightDeterministicNPDA = registration::AbstractRegister < RHPDAToPDA, automaton::NPDA < >, const automaton::RealTimeHeightDeterministicNPDA < > & > ( RHPDAToPDA::convert );
 
 } /* namespace automaton */
 
diff --git a/alib2algo/src/automaton/transform/RHPDAToPDA.h b/alib2algo/src/automaton/transform/RHPDAToPDA.h
index bdc5bcd6a58c9f1ee39d2c24967aff8bf91609f6..b70158301affec0276e8d4a35bea48fcad5423ec 100644
--- a/alib2algo/src/automaton/transform/RHPDAToPDA.h
+++ b/alib2algo/src/automaton/transform/RHPDAToPDA.h
@@ -8,27 +8,20 @@
 #ifndef RHPDA_TO_PDA_H_
 #define RHPDA_TO_PDA_H_
 
-#include <core/multipleDispatch.hpp>
 #include <algorithm>
 #include <deque>
 #include <set>
 
-#include "automaton/Automaton.h"
 #include "automaton/AutomatonFeatures.h"
 
 namespace automaton {
 
-class RHPDAToPDA : public alib::SingleDispatch<RHPDAToPDA, automaton::Automaton, const automaton::AutomatonBase &> {
+class RHPDAToPDA {
 public:
 	static automaton::DPDA < > convert( const automaton::RealTimeHeightDeterministicDPDA < > & pda);
 	static automaton::DPDA < > convert( const automaton::DPDA < > & pda);
 	static automaton::NPDA < > convert( const automaton::RealTimeHeightDeterministicNPDA < > & pda);
 	static automaton::NPDA < > convert( const automaton::NPDA < > & pda);
-
-	/**
-	 * Computes epsilon closure of a state in epsilon nonfree automaton
-	 */
-	static automaton::Automaton convert( const automaton::Automaton & automaton );
 };
 
 } /* namespace automaton */