diff --git a/alib2algo/src/automaton/simplify/EpsilonRemoverIncoming.cpp b/alib2algo/src/automaton/simplify/EpsilonRemoverIncoming.cpp
index 93f04298f8c083c3d74f069211434e66ad80f307..ded7655027923e7be60b2497a0c7610e3ca98690 100644
--- a/alib2algo/src/automaton/simplify/EpsilonRemoverIncoming.cpp
+++ b/alib2algo/src/automaton/simplify/EpsilonRemoverIncoming.cpp
@@ -17,6 +17,11 @@ auto EpsilonRemoverIncomingMultiInitialStateNFA = registration::OverloadRegister
 auto EpsilonRemoverIncomingNFA = registration::OverloadRegister < EpsilonRemoverIncoming, automaton::NFA < > , automaton::NFA < > > ( EpsilonRemoverIncoming::remove );
 auto EpsilonRemoverIncomingEpsilonNFA = registration::OverloadRegister < EpsilonRemoverIncoming, automaton::NFA < > , automaton::EpsilonNFA < > > ( EpsilonRemoverIncoming::remove );
 
+auto EpsilonRemoverIncomingDFA2 = registration::AbstractRegister < EpsilonRemoverIncoming, automaton::DFA < >, const automaton::DFA < > & > ( EpsilonRemoverIncoming::remove );
+auto EpsilonRemoverIncomingMultiInitialStateNFA2 = registration::AbstractRegister < EpsilonRemoverIncoming, automaton::MultiInitialStateNFA < > , const automaton::MultiInitialStateNFA < > & > ( EpsilonRemoverIncoming::remove );
+auto EpsilonRemoverIncomingNFA2 = registration::AbstractRegister < EpsilonRemoverIncoming, automaton::NFA < > , const automaton::NFA < > & > ( EpsilonRemoverIncoming::remove );
+auto EpsilonRemoverIncomingEpsilonNFA2 = registration::AbstractRegister < EpsilonRemoverIncoming, automaton::NFA < > , const 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 0bcb7fc4898dc4021c00992f4551d1cfe7ff06e9..58e40cafbbac547a895903f7e36b05d2d1baa387 100644
--- a/alib2algo/src/automaton/simplify/EpsilonRemoverOutgoing.cpp
+++ b/alib2algo/src/automaton/simplify/EpsilonRemoverOutgoing.cpp
@@ -14,8 +14,13 @@ namespace simplify {
 
 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 );
+auto EpsilonRemoverOutgoingNFA = registration::OverloadRegister < EpsilonRemoverOutgoing, automaton::NFA < >, automaton::NFA < > > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingEpsilonNFA = registration::OverloadRegister < EpsilonRemoverOutgoing, automaton::MultiInitialStateNFA < >, automaton::EpsilonNFA < > > ( EpsilonRemoverOutgoing::remove );
+
+auto EpsilonRemoverOutgoingDFA2 = registration::AbstractRegister < EpsilonRemoverOutgoing, automaton::DFA < >, const automaton::DFA < > & > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingMultiInitialStateNFA2 = registration::AbstractRegister < EpsilonRemoverOutgoing, automaton::MultiInitialStateNFA < > , const automaton::MultiInitialStateNFA < > & > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingNFA2 = registration::AbstractRegister < EpsilonRemoverOutgoing, automaton::NFA < >, const automaton::NFA < > & > ( EpsilonRemoverOutgoing::remove );
+auto EpsilonRemoverOutgoingEpsilonNFA2 = registration::AbstractRegister < EpsilonRemoverOutgoing, automaton::MultiInitialStateNFA < >, const 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 e0152798c3c2f68eec4b335dd217fc42f641725b..d730b03701d7bcc7b98b3a65ec1bb885974c55ec 100644
--- a/alib2algo/src/automaton/simplify/Minimize.cpp
+++ b/alib2algo/src/automaton/simplify/Minimize.cpp
@@ -17,9 +17,11 @@ automaton::Automaton Minimize::minimize(const automaton::Automaton& automaton) {
 }
 
 auto MinimizeNFA = registration::OverloadRegister < Minimize, automaton::DFA < >, automaton::DFA < > >( Minimize::minimize );
-auto MinimizeNFA2 = registration::AbstractRegister < Minimize, automaton::DFA < >, const automaton::DFA < > & > ( Minimize::minimize );
 auto MinimizeNFTA = registration::OverloadRegister < Minimize, automaton::DFTA < >, automaton::DFTA < > >( Minimize::minimize );
 
+auto MinimizeNFA2 = registration::AbstractRegister < Minimize, automaton::DFA < >, const automaton::DFA < > & > ( Minimize::minimize );
+auto MinimizeNFTA2 = registration::AbstractRegister < Minimize, automaton::DFTA < >, const automaton::DFTA < > & > ( Minimize::minimize );
+
 } /* namespace simplify */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp b/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp
index edffa0072cbd0e66ffb4a0643648ae9a7bc4f16b..b5476bf1419e65c312453a7f4155bb77a5cc7c2d 100644
--- a/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp
+++ b/alib2algo/src/automaton/simplify/MinimizeBrzozowski.cpp
@@ -19,8 +19,9 @@ automaton::Automaton MinimizeBrzozowski::minimize(const automaton::Automaton& au
 }
 
 auto MinimizeBrzozowskiDFA = registration::OverloadRegister < MinimizeBrzozowski, automaton::DFA < DefaultSymbolType, ext::set < ext::set < DefaultStateType > > >, automaton::DFA < > > ( MinimizeBrzozowski::minimize );
-auto MinimizeBrzozowskiDFA2 = registration::AbstractRegister < MinimizeBrzozowski, automaton::DFA < DefaultSymbolType, ext::set < ext::set < DefaultStateType > > >, const automaton::DFA < > & > ( MinimizeBrzozowski::minimize );
 auto MinimizeBrzozowskiNFA = registration::OverloadRegister < MinimizeBrzozowski, automaton::DFA < DefaultSymbolType, ext::set < ext::set < DefaultStateType > > >, automaton::NFA < > > ( MinimizeBrzozowski::minimize );
+
+auto MinimizeBrzozowskiDFA2 = registration::AbstractRegister < MinimizeBrzozowski, automaton::DFA < DefaultSymbolType, ext::set < ext::set < DefaultStateType > > >, const automaton::DFA < > & > ( MinimizeBrzozowski::minimize );
 auto MinimizeBrzozowskiNFA2 = registration::AbstractRegister < MinimizeBrzozowski, automaton::DFA < DefaultSymbolType, ext::set < ext::set < DefaultStateType > > >, const automaton::NFA < > & > ( MinimizeBrzozowski::minimize );
 
 } /* namespace simplify */
diff --git a/alib2algo/src/automaton/simplify/Normalize.cpp b/alib2algo/src/automaton/simplify/Normalize.cpp
index 5fa29e93340f0a196c0a97f40ea06e8cab6110c8..edfed9fb05b8c0d03a4c6ccdb986459485a868b0 100644
--- a/alib2algo/src/automaton/simplify/Normalize.cpp
+++ b/alib2algo/src/automaton/simplify/Normalize.cpp
@@ -19,9 +19,11 @@ automaton::Automaton Normalize::normalize(const automaton::Automaton& automaton)
 }
 
 auto NormalizeDFA = registration::OverloadRegister < Normalize, automaton::DFA < DefaultSymbolType, unsigned >, automaton::DFA < > > ( Normalize::normalize );
-auto NormalizeDFA2 = registration::AbstractRegister < Normalize, automaton::DFA < DefaultSymbolType, unsigned >, const 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 );
+
 } /* namespace simplify */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/simplify/Rename.cpp b/alib2algo/src/automaton/simplify/Rename.cpp
index 5c8c5ecc4cad349235b6e27f46b02843ea638fda..b48c4f1a4e8fee67331583ffd02915ab8a80c176 100644
--- a/alib2algo/src/automaton/simplify/Rename.cpp
+++ b/alib2algo/src/automaton/simplify/Rename.cpp
@@ -52,6 +52,7 @@ automaton::DFA<> Rename::rename(const automaton::DFA<>& fsm) {
 }
 
 auto RenameDFA = registration::OverloadRegister < Rename, automaton::DFA < >, automaton::DFA < > > ( Rename::rename );
+auto RenameDFA2 = registration::AbstractRegister < Rename, automaton::DFA < >, const automaton::DFA < > & > ( Rename::rename );
 
 automaton::DPDA < > Rename::rename(const automaton::DPDA < > & pda) {
 	int counterState = 0;
@@ -94,6 +95,7 @@ automaton::DPDA < > Rename::rename(const automaton::DPDA < > & pda) {
 }
 
 auto RenameDPDA = registration::OverloadRegister < Rename, automaton::DPDA < >, automaton::DPDA < > > ( Rename::rename );
+auto RenameDPDA2 = registration::AbstractRegister < Rename, automaton::DPDA < >, const automaton::DPDA < > & > ( Rename::rename );
 
 automaton::SinglePopDPDA < > Rename::rename(const automaton::SinglePopDPDA < > & pda) {
 	int counterState = 0;
@@ -135,6 +137,7 @@ automaton::SinglePopDPDA < > Rename::rename(const automaton::SinglePopDPDA < > &
 }
 
 auto RenameSinglePopDPDA = registration::OverloadRegister < Rename, automaton::SinglePopDPDA < >, automaton::SinglePopDPDA < > > ( Rename::rename );
+auto RenameSinglePopDPDA2 = registration::AbstractRegister < Rename, automaton::SinglePopDPDA < >, const automaton::SinglePopDPDA < > & > ( Rename::rename );
 
 automaton::InputDrivenDPDA < > Rename::rename(const automaton::InputDrivenDPDA < > & pda) {
 	int counter = 0;
@@ -184,6 +187,7 @@ automaton::InputDrivenDPDA < > Rename::rename(const automaton::InputDrivenDPDA <
 }
 
 auto RenameInputDrivenDPDA = registration::OverloadRegister < Rename, automaton::InputDrivenDPDA < >, automaton::InputDrivenDPDA < > > ( Rename::rename );
+auto RenameInputDrivenDPDA2 = registration::AbstractRegister < Rename, automaton::InputDrivenDPDA < >, const automaton::InputDrivenDPDA < > & > ( Rename::rename );
 
 automaton::VisiblyPushdownDPDA < > Rename::rename(const automaton::VisiblyPushdownDPDA < > & pda) {
 	int counterState = 0;
@@ -231,6 +235,7 @@ automaton::VisiblyPushdownDPDA < > Rename::rename(const automaton::VisiblyPushdo
 }
 
 auto RenameVisiblyPushdownDPDA = registration::OverloadRegister < Rename, automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownDPDA < > > ( Rename::rename );
+auto RenameVisiblyPushdownDPDA2 = registration::AbstractRegister < Rename, automaton::VisiblyPushdownDPDA < >, const automaton::VisiblyPushdownDPDA < > & > ( Rename::rename );
 
 automaton::RealTimeHeightDeterministicDPDA < > Rename::rename(const automaton::RealTimeHeightDeterministicDPDA < > & pda) {
 	int counterState = 0;
@@ -276,6 +281,7 @@ automaton::RealTimeHeightDeterministicDPDA < > Rename::rename(const automaton::R
 }
 
 auto RenameRealTimeHeightDeterministicDPDA = registration::OverloadRegister < Rename, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( Rename::rename );
+auto RenameRealTimeHeightDeterministicDPDA2 = registration::AbstractRegister < Rename, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::RealTimeHeightDeterministicDPDA < > & > ( Rename::rename );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/SingleInitialState.cpp b/alib2algo/src/automaton/simplify/SingleInitialState.cpp
index ae0e27ccfa9ed563ae3a57b896c638e12b569b7f..5e62c59f97b26efb33ac5367c1911deae6d824b2 100644
--- a/alib2algo/src/automaton/simplify/SingleInitialState.cpp
+++ b/alib2algo/src/automaton/simplify/SingleInitialState.cpp
@@ -23,6 +23,13 @@ auto SingleInitialStateNFA = registration::OverloadRegister < SingleInitialState
 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 );
+
 } /* namespace simplify */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/simplify/Total.cpp b/alib2algo/src/automaton/simplify/Total.cpp
index decea974d7439dce0c25d99fd2f32ce18d980e9b..57fe6edaecc746235c64ac1d864793da7dac9b2d 100644
--- a/alib2algo/src/automaton/simplify/Total.cpp
+++ b/alib2algo/src/automaton/simplify/Total.cpp
@@ -19,6 +19,9 @@ automaton::Automaton Total::total(const Automaton& automaton) {
 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 );
+
 } /* namespace simplify */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/simplify/Trim.cpp b/alib2algo/src/automaton/simplify/Trim.cpp
index e52e9e2e00c26a09786591e0898efdbde1a432a9..8d0b165caabd7d58847949fb602a83ef516831b0 100644
--- a/alib2algo/src/automaton/simplify/Trim.cpp
+++ b/alib2algo/src/automaton/simplify/Trim.cpp
@@ -27,6 +27,14 @@ auto TrimCompactNFA = registration::OverloadRegister < Trim, automaton::CompactN
 auto TrimExtendedNFA = registration::OverloadRegister < Trim, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > > ( Trim::trim );
 auto TrimDFTA = registration::OverloadRegister < Trim, automaton::DFTA < >, automaton::DFTA < > > ( Trim::trim );
 
+auto TrimDFA2 = registration::AbstractRegister < Trim, automaton::DFA < >, const automaton::DFA < > & > ( Trim::trim );
+auto TrimNFA2 = registration::AbstractRegister < Trim, automaton::NFA < >, const automaton::NFA < > & > ( Trim::trim );
+auto TrimMultiInitialStateNFA2 = registration::AbstractRegister < Trim, automaton::MultiInitialStateNFA < >, const automaton::MultiInitialStateNFA < > & > ( Trim::trim );
+auto TrimEpsilonNFA2 = registration::AbstractRegister < Trim, automaton::EpsilonNFA < >, const automaton::EpsilonNFA < > & > ( Trim::trim );
+auto TrimCompactNFA2 = registration::AbstractRegister < Trim, automaton::CompactNFA < >, const automaton::CompactNFA < > & > ( Trim::trim );
+auto TrimExtendedNFA2 = registration::AbstractRegister < Trim, automaton::ExtendedNFA < >, const automaton::ExtendedNFA < > & > ( Trim::trim );
+auto TrimDFTA2 = registration::AbstractRegister < Trim, automaton::DFTA < >, const 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 e0050a01e04bfe2b71c88366b6f6fb2dd0c93d90..a23c8ec8113f5465548d7cc90dec404f3361b293 100644
--- a/alib2algo/src/automaton/simplify/UnreachableStatesRemover.cpp
+++ b/alib2algo/src/automaton/simplify/UnreachableStatesRemover.cpp
@@ -20,6 +20,14 @@ auto UnreachableStatesRemoverDFA = registration::OverloadRegister < UnreachableS
 auto UnreachableStatesRemoverMultiInitialStateNFA = registration::OverloadRegister < UnreachableStatesRemover, automaton::MultiInitialStateNFA < > , automaton::MultiInitialStateNFA < > > ( UnreachableStatesRemover::remove );
 auto UnreachableStatesRemoverDFTA = registration::OverloadRegister < UnreachableStatesRemover, automaton::DFTA < >, automaton::DFTA < > > ( UnreachableStatesRemover::remove );
 
+auto UnreachableStatesRemoverEpsilonNFA2 = registration::AbstractRegister < UnreachableStatesRemover, automaton::EpsilonNFA < >, const automaton::EpsilonNFA < > & > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverNFA2 = registration::AbstractRegister < UnreachableStatesRemover, automaton::NFA < >, const automaton::NFA < > & > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverCompactNFA2 = registration::AbstractRegister < UnreachableStatesRemover, automaton::CompactNFA < >, const automaton::CompactNFA < > & > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverExtendedNFA2 = registration::AbstractRegister < UnreachableStatesRemover, automaton::ExtendedNFA < >, const automaton::ExtendedNFA < > & > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverDFA2 = registration::AbstractRegister < UnreachableStatesRemover, automaton::DFA < >, const automaton::DFA < > & > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverMultiInitialStateNFA2 = registration::AbstractRegister < UnreachableStatesRemover, automaton::MultiInitialStateNFA < >, const automaton::MultiInitialStateNFA < > & > ( UnreachableStatesRemover::remove );
+auto UnreachableStatesRemoverDFTA2 = registration::AbstractRegister < UnreachableStatesRemover, automaton::DFTA < >, const automaton::DFTA < > & > ( UnreachableStatesRemover::remove );
+
 automaton::Automaton UnreachableStatesRemover::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 fb3641c2df2711308d792b9cc11631451fcb06dd..717c049033d199c18d535ffe0c43829718aa4748 100644
--- a/alib2algo/src/automaton/transform/AutomataConcatenation.cpp
+++ b/alib2algo/src/automaton/transform/AutomataConcatenation.cpp
@@ -19,6 +19,9 @@ automaton::Automaton AutomataConcatenation::concatenation(const automaton::Autom
 auto AutomataConcatenationNFA = registration::OverloadRegister < AutomataConcatenation, automaton::NFA < >, automaton::NFA < > > ( AutomataConcatenation::concatenation );
 auto AutomataConcatenationDFA = registration::OverloadRegister < AutomataConcatenation, automaton::NFA < >, automaton::DFA < > > ( AutomataConcatenation::concatenation );
 
+auto AutomataConcatenationNFA2 = registration::AbstractRegister < AutomataConcatenation, automaton::NFA < >, const automaton::NFA < > &, const automaton::NFA < > & > ( AutomataConcatenation::concatenation );
+auto AutomataConcatenationDFA2 = registration::AbstractRegister < AutomataConcatenation, automaton::NFA < >, const automaton::DFA < > &, const automaton::DFA < > & > ( AutomataConcatenation::concatenation );
+
 } /* namespace transform */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/transform/AutomataConcatenationEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomataConcatenationEpsilonTransition.cpp
index 989e9821c720c4219491ff0da01850ab6f89831a..9db6deb0386b1b6fe76844aac7bc82c30bae6640 100644
--- a/alib2algo/src/automaton/transform/AutomataConcatenationEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomataConcatenationEpsilonTransition.cpp
@@ -21,6 +21,10 @@ auto AutomataConcatenationEpsilonTransitionDFA = registration::OverloadRegister
 auto AutomataConcatenationEpsilonTransitionNFA = registration::OverloadRegister < AutomataConcatenationEpsilonTransition, automaton::EpsilonNFA < >, automaton::NFA < > > ( AutomataConcatenationEpsilonTransition::concatenation );
 auto AutomataConcatenationEpsilonTransitionEpsilonNFA = registration::OverloadRegister < AutomataConcatenationEpsilonTransition, automaton::EpsilonNFA < > , automaton::EpsilonNFA < > > ( AutomataConcatenationEpsilonTransition::concatenation );
 
+auto AutomataConcatenationEpsilonTransitionDFA2 = registration::AbstractRegister < AutomataConcatenationEpsilonTransition, automaton::EpsilonNFA < >, const automaton::DFA < > &, const automaton::DFA < > & > ( AutomataConcatenationEpsilonTransition::concatenation );
+auto AutomataConcatenationEpsilonTransitionNFA2 = registration::AbstractRegister < AutomataConcatenationEpsilonTransition, automaton::EpsilonNFA < >, const automaton::NFA < > &, const automaton::NFA < > & > ( AutomataConcatenationEpsilonTransition::concatenation );
+auto AutomataConcatenationEpsilonTransitionEpsilonNFA2 = registration::AbstractRegister < AutomataConcatenationEpsilonTransition, automaton::EpsilonNFA < >, const automaton::EpsilonNFA < > &, const automaton::EpsilonNFA < > & > ( AutomataConcatenationEpsilonTransition::concatenation );
+
 } /* namespace transform */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/transform/AutomataIntersectionCartesianProduct.cpp b/alib2algo/src/automaton/transform/AutomataIntersectionCartesianProduct.cpp
index 98dd9c81ab56ec02545fffd3450aecc584197eb7..53f31ce891f7ac4adca96fb22f0496984cbdb445 100644
--- a/alib2algo/src/automaton/transform/AutomataIntersectionCartesianProduct.cpp
+++ b/alib2algo/src/automaton/transform/AutomataIntersectionCartesianProduct.cpp
@@ -20,10 +20,11 @@ automaton::Automaton AutomataIntersectionCartesianProduct::intersection(const au
 }
 
 auto AutomataIntersectionCartesianProductDFA = registration::OverloadRegister < AutomataIntersectionCartesianProduct, automaton::DFA < DefaultSymbolType, ext::pair < DefaultStateType, DefaultStateType > >, automaton::DFA < > > ( AutomataIntersectionCartesianProduct::intersection );
-auto AutomataIntersectionCartesianProductDFA2 = registration::AbstractRegister < AutomataIntersectionCartesianProduct, automaton::DFA < DefaultSymbolType, ext::pair < DefaultStateType, DefaultStateType > >, const automaton::DFA < > &, const automaton::DFA < > & > ( AutomataIntersectionCartesianProduct::intersection );
-
 auto AutomataIntersectionCartesianProductNFA = registration::OverloadRegister < AutomataIntersectionCartesianProduct, automaton::NFA < DefaultSymbolType, ext::pair < DefaultStateType, DefaultStateType > >, automaton::NFA < > > ( AutomataIntersectionCartesianProduct::intersection );
+
 auto AutomataIntersectionCartesianProductNFA2 = registration::AbstractRegister < AutomataIntersectionCartesianProduct, automaton::NFA < DefaultSymbolType, ext::pair < DefaultStateType, DefaultStateType > >, const automaton::NFA < > &, const automaton::NFA < > & > ( AutomataIntersectionCartesianProduct::intersection );
+auto AutomataIntersectionCartesianProductDFA2 = registration::AbstractRegister < AutomataIntersectionCartesianProduct, automaton::DFA < DefaultSymbolType, ext::pair < DefaultStateType, DefaultStateType > >, const automaton::DFA < > &, const automaton::DFA < > & > ( AutomataIntersectionCartesianProduct::intersection );
+
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/transform/AutomataUnionCartesianProduct.cpp b/alib2algo/src/automaton/transform/AutomataUnionCartesianProduct.cpp
index aa04de57db6a282dd397438b0c00e513e63c6140..1fce47fa800c85a7a95166f45f9aa739c0a770b7 100644
--- a/alib2algo/src/automaton/transform/AutomataUnionCartesianProduct.cpp
+++ b/alib2algo/src/automaton/transform/AutomataUnionCartesianProduct.cpp
@@ -23,6 +23,9 @@ automaton::Automaton AutomataUnionCartesianProduct::unification(const automaton:
 auto AutomataUnionCartesianProductDFA = registration::OverloadRegister < AutomataUnionCartesianProduct, automaton::DFA < DefaultSymbolType, ext::pair < DefaultStateType, DefaultStateType > >, automaton::DFA < > > ( AutomataUnionCartesianProduct::unification );
 auto AutomataUnionCartesianProductNFA = registration::OverloadRegister < AutomataUnionCartesianProduct, automaton::NFA < DefaultSymbolType, ext::pair < DefaultStateType, DefaultStateType > >, automaton::NFA < > > ( AutomataUnionCartesianProduct::unification );
 
+auto AutomataUnionCartesianProductDFA2 = registration::AbstractRegister < AutomataUnionCartesianProduct, automaton::DFA < DefaultSymbolType, ext::pair < DefaultStateType, DefaultStateType > >, const automaton::DFA < > &, const automaton::DFA < > & > ( AutomataUnionCartesianProduct::unification );
+auto AutomataUnionCartesianProductNFA2 = registration::AbstractRegister < AutomataUnionCartesianProduct, automaton::NFA < DefaultSymbolType, ext::pair < DefaultStateType, DefaultStateType > >, const automaton::NFA < > &, const automaton::NFA < > & > ( AutomataUnionCartesianProduct::unification );
+
 } /* namespace transform */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
index 77bcccf9a94974caed546779ce545cc2336e0670..fd40de5ac4dfcc7b09b8c2ead3241ef4c73272f1 100644
--- a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
@@ -22,6 +22,10 @@ auto AutomataUnionEpsilonTransitionEpsilonNFA = registration::OverloadRegister <
 auto AutomataUnionEpsilonTransitionNFA = registration::OverloadRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, automaton::NFA < > > ( AutomataUnionEpsilonTransition::unification );
 auto AutomataUnionEpsilonTransitionDFA = registration::OverloadRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, automaton::DFA < > > ( AutomataUnionEpsilonTransition::unification );
 
+auto AutomataUnionEpsilonTransitionEpsilonNFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, const automaton::EpsilonNFA < > &, const automaton::EpsilonNFA < > & > ( AutomataUnionEpsilonTransition::unification );
+auto AutomataUnionEpsilonTransitionNFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, const automaton::NFA < > &, const automaton::NFA < > & > ( AutomataUnionEpsilonTransition::unification );
+auto AutomataUnionEpsilonTransitionDFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < >, const automaton::DFA < > &, const automaton::DFA < > & > ( AutomataUnionEpsilonTransition::unification );
+
 } /* namespace transform */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/transform/AutomatonIteration.cpp b/alib2algo/src/automaton/transform/AutomatonIteration.cpp
index f3646df4b1124e2c793a184dc6b7192f0363be6c..9302a6ebeb9657a43df7f12f650d9282f669d260 100644
--- a/alib2algo/src/automaton/transform/AutomatonIteration.cpp
+++ b/alib2algo/src/automaton/transform/AutomatonIteration.cpp
@@ -20,6 +20,9 @@ automaton::Automaton AutomatonIteration::iteration(const automaton::Automaton& a
 auto AutomatonIterationDFA = registration::OverloadRegister < AutomatonIteration, automaton::NFA < >, automaton::DFA < > > ( AutomatonIteration::iteration );
 auto AutomatonIterationNFA = registration::OverloadRegister < AutomatonIteration, automaton::NFA < >, automaton::NFA < > > ( AutomatonIteration::iteration );
 
+auto AutomatonIterationDFA2 = registration::AbstractRegister < AutomatonIteration, automaton::NFA < >, const automaton::DFA < > & > ( AutomatonIteration::iteration );
+auto AutomatonIterationNFA2 = registration::AbstractRegister < AutomatonIteration, automaton::NFA < >, const automaton::NFA < > & > ( AutomatonIteration::iteration );
+
 } /* namespace transform */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp
index fea903fdb9771aedd2701a5298f3d5ce8d0c671e..e93114f260022087348c4efc7bc3fd151ce2eff2 100644
--- a/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp
@@ -21,6 +21,10 @@ auto AutomatonIterationEpsilonTransitionDFA = registration::OverloadRegister < A
 auto AutomatonIterationEpsilonTransitionNFA = registration::OverloadRegister < AutomatonIterationEpsilonTransition, automaton::EpsilonNFA < >, automaton::NFA < > > ( AutomatonIterationEpsilonTransition::iteration );
 auto AutomatonIterationEpsilonTransitionEpsilonNFA = registration::OverloadRegister < AutomatonIterationEpsilonTransition, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > > ( AutomatonIterationEpsilonTransition::iteration );
 
+auto AutomatonIterationEpsilonTransitionDFA2 = registration::AbstractRegister < AutomatonIterationEpsilonTransition, automaton::EpsilonNFA < >, const automaton::DFA < > & > ( AutomatonIterationEpsilonTransition::iteration );
+auto AutomatonIterationEpsilonTransitionNFA2 = registration::AbstractRegister < AutomatonIterationEpsilonTransition, automaton::EpsilonNFA < >, const automaton::NFA < > & > ( AutomatonIterationEpsilonTransition::iteration );
+auto AutomatonIterationEpsilonTransitionEpsilonNFA2 = registration::AbstractRegister < AutomatonIterationEpsilonTransition, automaton::EpsilonNFA < >, const automaton::EpsilonNFA < > & > ( AutomatonIterationEpsilonTransition::iteration );
+
 } /* namespace transform */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/transform/Compaction.cpp b/alib2algo/src/automaton/transform/Compaction.cpp
index a0ece872585510df08312646db00136da2ee471d..abca9417efb5f47e09fcec79fbbf0c0eb32b0107 100644
--- a/alib2algo/src/automaton/transform/Compaction.cpp
+++ b/alib2algo/src/automaton/transform/Compaction.cpp
@@ -20,6 +20,10 @@ auto CompactionCompactNFA = registration::OverloadRegister < Compaction, automat
 auto CompactionDFA = registration::OverloadRegister < Compaction, automaton::CompactNFA < >, automaton::DFA < > > ( Compaction::convert );
 auto CompactionNFA = registration::OverloadRegister < Compaction, automaton::CompactNFA < >, automaton::NFA < > > ( Compaction::convert );
 
+auto CompactionCompactNFA2 = registration::AbstractRegister < Compaction, automaton::CompactNFA < >, const automaton::CompactNFA < > & > ( Compaction::convert );
+auto CompactionDFA2 = registration::AbstractRegister < Compaction, automaton::CompactNFA < >, const automaton::DFA < > & > ( Compaction::convert );
+auto CompactionNFA2 = registration::AbstractRegister < Compaction, automaton::CompactNFA < >, const automaton::NFA < > & > ( Compaction::convert );
+
 } /* namespace transform */
 
 } /* namespace automaton */
diff --git a/alib2algo/src/automaton/transform/Reverse.cpp b/alib2algo/src/automaton/transform/Reverse.cpp
index de1af487f4b3c12d3c0ca148818c121d89d17111..1c64a2bfb81913b7bda5236e5c7cc8a7b52e5841 100644
--- a/alib2algo/src/automaton/transform/Reverse.cpp
+++ b/alib2algo/src/automaton/transform/Reverse.cpp
@@ -20,6 +20,10 @@ auto ReverseDFA = registration::OverloadRegister < Reverse, automaton::MultiInit
 auto ReverseNFA = registration::OverloadRegister < Reverse, automaton::MultiInitialStateNFA < >, automaton::NFA < > > ( Reverse::convert );
 auto ReverseMultiInitialStateNFA = registration::OverloadRegister < Reverse, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > > ( Reverse::convert );
 
+auto ReverseDFA2 = registration::AbstractRegister < Reverse, automaton::MultiInitialStateNFA < >, const automaton::DFA < > & > ( Reverse::convert );
+auto ReverseNFA2 = registration::AbstractRegister < Reverse, automaton::MultiInitialStateNFA < >, const automaton::NFA < > & > ( Reverse::convert );
+auto ReverseMultiInitialStateNFA2 = registration::AbstractRegister < Reverse, automaton::MultiInitialStateNFA < >, const automaton::MultiInitialStateNFA < > & > ( Reverse::convert );
+
 } /* namespace transform */
 
 } /* namespace automaton */