diff --git a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
index 2949b9f3d45bc1b94bbb900da4ac63b2961cd69b..75286026260aa442e94a9f8d651771a32bea8be9 100644
--- a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
@@ -14,9 +14,9 @@ namespace automaton {
 
 namespace transform {
 
-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 );
+auto AutomataUnionEpsilonTransitionEpsilonNFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, ext::pair < DefaultStateType, unsigned > >, const automaton::EpsilonNFA < > &, const automaton::EpsilonNFA < > & > ( AutomataUnionEpsilonTransition::unification );
+auto AutomataUnionEpsilonTransitionNFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, ext::pair < DefaultStateType, unsigned > >, const automaton::NFA < > &, const automaton::NFA < > & > ( AutomataUnionEpsilonTransition::unification );
+auto AutomataUnionEpsilonTransitionDFA2 = registration::AbstractRegister < AutomataUnionEpsilonTransition, automaton::EpsilonNFA < DefaultSymbolType, DefaultEpsilonType, ext::pair < DefaultStateType, unsigned > >, const automaton::DFA < > &, const automaton::DFA < > & > ( AutomataUnionEpsilonTransition::unification );
 
 } /* namespace transform */
 
diff --git a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.h b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.h
index 0592e51cb18a2acf54661080baeaacc785dd5656..fc9c144f09f7909107522f1babda92f62abef738 100644
--- a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.h
+++ b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.h
@@ -47,139 +47,127 @@ public:
 	 * @return epsilon nondeterministic FA representing the union of two automata
 	 */
 	template < class SymbolType, class EpsilonType, class StateType >
-	static automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > unification(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & first, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & second);
+	static automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > unification(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & first, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & second);
 
 	/**
 	 * @overload
 	 */
 	template < class SymbolType, class EpsilonType = DefaultEpsilonType, class StateType >
-	static automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > unification(const automaton::NFA < SymbolType, StateType > & first, const automaton::NFA < SymbolType, StateType > & second);
+	static automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > unification(const automaton::NFA < SymbolType, StateType > & first, const automaton::NFA < SymbolType, StateType > & second);
 
 	/**
 	 * @overload
 	 */
 	template < class SymbolType, class EpsilonType = DefaultEpsilonType, class StateType >
-	static automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > unification(const automaton::DFA < SymbolType, StateType > & first, const automaton::DFA < SymbolType, StateType > & second);
+	static automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > unification(const automaton::DFA < SymbolType, StateType > & first, const automaton::DFA < SymbolType, StateType > & second);
 
 };
 
 template < class SymbolType, class EpsilonType, class StateType >
-automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > AutomataUnionEpsilonTransition::unification(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & first, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & second) {
-	static StateType firstDefault ( 1 );
-	static StateType secondDefault ( 2 );
+automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > AutomataUnionEpsilonTransition::unification(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & first, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & second) {
+	unsigned firstDefault = 1;
+	unsigned secondDefault = 2;
 
-	ext::set<StateType> states;
-	for(const auto& q : first.getStates())
-		states.insert(StateType(firstDefault, q));
-	for(const auto& q : second.getStates())
-		states.insert(StateType(secondDefault, q));
-
-	StateType q0 = common::createUnique(label::InitialStateLabel::instance < StateType > ( ), states);
-	automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > res(q0);
+	ext::pair < StateType, unsigned > q0 = ext::make_pair ( label::InitialStateLabel::instance < StateType > ( ), 0 );
+	automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > res ( q0 );
 
 	for(const auto& a : first.getInputAlphabet())
 		res.addInputSymbol(a);
 	for(const auto& a : second.getInputAlphabet())
 		res.addInputSymbol(a);
 
-	for(const auto& q : states)
-		res.addState(q);
+	for ( const auto & q : first.getStates ( ) )
+		res.addState ( ext::make_pair ( q, firstDefault ) );
+	for ( const auto & q : second.getStates ( ) )
+		res.addState ( ext::make_pair ( q, secondDefault ) );
 
 	for(const auto& q : first.getFinalStates())
-		res.addFinalState(StateType(firstDefault, q));
+		res.addFinalState ( ext::make_pair ( q, firstDefault ) );
 	for(const auto& q : second.getFinalStates())
-		res.addFinalState(StateType(secondDefault, q));
+		res.addFinalState ( ext::make_pair ( q, secondDefault ) );
 
-	res.addTransition(q0, StateType(firstDefault, first.getInitialState()));
-	res.addTransition(q0, StateType(secondDefault, second.getInitialState()));
+	res.addTransition ( q0, ext::make_pair ( first.getInitialState ( ), firstDefault ) );
+	res.addTransition ( q0, ext::make_pair ( second.getInitialState ( ), secondDefault ) );
 
 	for(const auto& t : first.getTransitions())
 		for(const auto& q : t.second)
-			res.addTransition(StateType(firstDefault, t.first.first), t.first.second, StateType(firstDefault, q));
+			res.addTransition ( ext::make_pair ( t.first.first, firstDefault ), t.first.second, ext::make_pair ( q, firstDefault ) );
 
 	for(const auto& t : second.getTransitions())
 		for(const auto& q : t.second)
-			res.addTransition(StateType(secondDefault, t.first.first), t.first.second, StateType(secondDefault, q));
+			res.addTransition ( ext::make_pair ( t.first.first, secondDefault ), t.first.second, ext::make_pair ( q, secondDefault ) );
 
 	return res;
 }
 
 template < class SymbolType, class EpsilonType, class StateType >
-automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > AutomataUnionEpsilonTransition::unification(const automaton::NFA < SymbolType, StateType > & first, const automaton::NFA < SymbolType, StateType > & second) {
-	static StateType firstDefault ( 1 );
-	static StateType secondDefault ( 2 );
-
-	ext::set<StateType> states;
-	for(const auto& q : first.getStates())
-		states.insert(StateType(firstDefault, q));
-	for(const auto& q : second.getStates())
-		states.insert(StateType(secondDefault, q));
+automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > AutomataUnionEpsilonTransition::unification(const automaton::NFA < SymbolType, StateType > & first, const automaton::NFA < SymbolType, StateType > & second) {
+	unsigned firstDefault = 1;
+	unsigned secondDefault = 2;
 
-	StateType q0 = common::createUnique(label::InitialStateLabel::instance < StateType > ( ), states);
-	automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > res(q0);
+	ext::pair < StateType, unsigned > q0 = ext::make_pair ( label::InitialStateLabel::instance < StateType > ( ), 0 );
+	automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > res ( q0 );
 
 	for(const auto& a : first.getInputAlphabet())
 		res.addInputSymbol(a);
 	for(const auto& a : second.getInputAlphabet())
 		res.addInputSymbol(a);
 
-	for(const auto& q : states)
-		res.addState(q);
+	for ( const auto & q : first.getStates ( ) )
+		res.addState ( ext::make_pair ( q, firstDefault ) );
+	for ( const auto & q : second.getStates ( ) )
+		res.addState ( ext::make_pair ( q, secondDefault ) );
 
 	for(const auto& q : first.getFinalStates())
-		res.addFinalState(StateType(firstDefault, q));
+		res.addFinalState ( ext::make_pair ( q, firstDefault ) );
 	for(const auto& q : second.getFinalStates())
-		res.addFinalState(StateType(secondDefault, q));
+		res.addFinalState ( ext::make_pair ( q, secondDefault ) );
 
-	res.addTransition(q0, StateType(firstDefault, first.getInitialState()));
-	res.addTransition(q0, StateType(secondDefault, second.getInitialState()));
+	res.addTransition ( q0, ext::make_pair ( first.getInitialState ( ), firstDefault ) );
+	res.addTransition ( q0, ext::make_pair ( second.getInitialState ( ), secondDefault ) );
 
 	for(const auto& t : first.getTransitions())
 		for(const auto& q : t.second)
-			res.addTransition(StateType(firstDefault, t.first.first), t.first.second, StateType(firstDefault, q));
+			res.addTransition ( ext::make_pair ( t.first.first, firstDefault ), t.first.second, ext::make_pair ( q, firstDefault ) );
 
 	for(const auto& t : second.getTransitions())
 		for(const auto& q : t.second)
-			res.addTransition(StateType(secondDefault, t.first.first), t.first.second, StateType(secondDefault, q));
+			res.addTransition ( ext::make_pair ( t.first.first, secondDefault ), t.first.second, ext::make_pair ( q, secondDefault ) );
 
 	return res;
 }
 
 template < class SymbolType, class EpsilonType, class StateType >
-automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > AutomataUnionEpsilonTransition::unification(const automaton::DFA< SymbolType, StateType > & first, const automaton::DFA < SymbolType, StateType > & second) {
-	static StateType firstDefault ( 1 );
-	static StateType secondDefault ( 2 );
-
-	ext::set<StateType> states;
-	for(const auto& q : first.getStates())
-		states.insert(StateType(firstDefault, q));
-	for(const auto& q : second.getStates())
-		states.insert(StateType(secondDefault, q));
+automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > AutomataUnionEpsilonTransition::unification(const automaton::DFA< SymbolType, StateType > & first, const automaton::DFA < SymbolType, StateType > & second) {
+	unsigned firstDefault = 1;
+	unsigned secondDefault = 2;
 
-	StateType q0 = common::createUnique(label::InitialStateLabel::instance < StateType > ( ), states);
-	automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > res(q0);
+	ext::pair < StateType, unsigned > q0 = ext::make_pair ( label::InitialStateLabel::instance < StateType > ( ), 0 );
+	automaton::EpsilonNFA < SymbolType, EpsilonType, ext::pair < StateType, unsigned > > res ( q0 );
 
 	for(const auto& a : first.getInputAlphabet())
 		res.addInputSymbol(a);
 	for(const auto& a : second.getInputAlphabet())
 		res.addInputSymbol(a);
 
-	for(const auto& q : states)
-		res.addState(q);
+	for ( const auto & q : first.getStates ( ) )
+		res.addState ( ext::make_pair ( q, firstDefault ) );
+	for ( const auto & q : second.getStates ( ) )
+		res.addState ( ext::make_pair ( q, secondDefault ) );
 
 	for(const auto& q : first.getFinalStates())
-		res.addFinalState(StateType(firstDefault, q));
+		res.addFinalState ( ext::make_pair ( q, firstDefault ) );
 	for(const auto& q : second.getFinalStates())
-		res.addFinalState(StateType(secondDefault, q));
+		res.addFinalState ( ext::make_pair ( q, secondDefault ) );
 
-	res.addTransition(q0, StateType(firstDefault, first.getInitialState()));
-	res.addTransition(q0, StateType(secondDefault, second.getInitialState()));
+	res.addTransition ( q0, ext::make_pair ( first.getInitialState ( ), firstDefault ) );
+	res.addTransition ( q0, ext::make_pair ( second.getInitialState ( ), secondDefault ) );
 
 	for(const auto& t : first.getTransitions())
-		res.addTransition(StateType(firstDefault, t.first.first), t.first.second, StateType(firstDefault, t.second));
+		res.addTransition ( ext::make_pair ( t.first.first, firstDefault ), t.first.second, ext::make_pair ( t.second, firstDefault ) );
 
 	for(const auto& t : second.getTransitions())
-		res.addTransition(StateType(secondDefault, t.first.first), t.first.second, StateType(secondDefault, t.second));
+		res.addTransition ( ext::make_pair ( t.first.first, secondDefault ), t.first.second, ext::make_pair ( t.second, secondDefault ) );
 
 	return res;
 }