diff --git a/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp b/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp
index 87a5f55bfb3ae823f2c356a1bbdf795b81cec2e3..ab9278fd5609e25d1e1917b535e26b7dbff46189 100644
--- a/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp
+++ b/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp
@@ -7,6 +7,7 @@
 
 #include "ToGrammarLeftRG.h"
 #include <map>
+#include <common/createUnique.hpp>
 
 #include <alphabet/LabeledSymbol.h>
 
@@ -27,7 +28,7 @@ grammar::LeftRG < > ToGrammarLeftRG::convert(const automaton::NFA < > & automato
 	grammar.setTerminalAlphabet(automaton.getInputAlphabet());
 
 	for(const auto& state : automaton.getStates()) {
-		alphabet::Symbol nt = alphabet::createUniqueSymbol(alphabet::Symbol(alphabet::LabeledSymbol(state)), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
+		alphabet::Symbol nt = common::createUnique(alphabet::Symbol(alphabet::LabeledSymbol(state)), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
 		grammar.addNonterminalSymbol(nt);
 		nonterminalMap.insert(std::pair<label::Label, alphabet::Symbol>(state, nt));
 	}
@@ -74,7 +75,7 @@ grammar::LeftRG < > ToGrammarLeftRG::convert(const automaton::DFA<>& automaton)
 	grammar.setTerminalAlphabet(automaton.getInputAlphabet());
 
 	for(const auto& state : automaton.getStates()) {
-		alphabet::Symbol nt = alphabet::createUniqueSymbol(alphabet::Symbol(alphabet::LabeledSymbol(state)), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
+		alphabet::Symbol nt = common::createUnique(alphabet::Symbol(alphabet::LabeledSymbol(state)), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
 		grammar.addNonterminalSymbol(nt);
 		nonterminalMap.insert(std::pair<label::Label, alphabet::Symbol>(state, nt));
 	}
diff --git a/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp b/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp
index a8ea9e281eca55d4854aa06edda7cdb563d9106d..5f16e6f98d811e9baec2bd69657eaa9a104b1154 100644
--- a/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp
+++ b/alib2algo/src/automaton/convert/ToGrammarRightRG.cpp
@@ -7,6 +7,7 @@
 
 #include "ToGrammarRightRG.h"
 #include <alphabet/LabeledSymbol.h>
+#include <common/createUnique.hpp>
 
 namespace automaton {
 
@@ -31,7 +32,7 @@ grammar::RightRG < > ToGrammarRightRG::convert(const automaton::NFA < > & automa
 		if(state == initState)
 			continue;
 
-		alphabet::Symbol nt = alphabet::createUniqueSymbol(alphabet::Symbol(alphabet::LabeledSymbol(state)), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
+		alphabet::Symbol nt = common::createUnique(alphabet::Symbol(alphabet::LabeledSymbol(state)), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
 		grammar.addNonterminalSymbol(nt);
 		nonterminalMap.insert(std::make_pair(state, nt));
 	}
@@ -74,7 +75,7 @@ grammar::RightRG < > ToGrammarRightRG::convert(const automaton::DFA<>& automaton
 		if(state == initState)
 			continue;
 
-		alphabet::Symbol nt = alphabet::createUniqueSymbol(alphabet::Symbol(alphabet::LabeledSymbol(state)), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
+		alphabet::Symbol nt = common::createUnique(alphabet::Symbol(alphabet::LabeledSymbol(state)), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
 		grammar.addNonterminalSymbol(nt);
 		nonterminalMap.insert(std::make_pair(state, nt));
 	}
diff --git a/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp b/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp
index 17b6d64bf72738750caf6a576b557d3e8e22c546..240a20ad249a3483bb45dac3e12af20a29b06897 100644
--- a/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp
+++ b/alib2algo/src/automaton/convert/ToRegExpStateElimination.cpp
@@ -12,6 +12,8 @@
 #include "../../regexp/transform/RegExpConcatenate.h"
 #include "../../regexp/transform/RegExpIterate.h"
 
+#include <common/createUnique.hpp>
+
 namespace automaton {
 
 namespace convert {
@@ -86,7 +88,7 @@ const regexp::UnboundedRegExpStructure < alphabet::Symbol > ToRegExpStateElimina
 void ToRegExpStateElimination::extendExtendedNFA(automaton::ExtendedNFA < > & automaton) {
 	const label::Label& initState = automaton.getInitialState();
 	if(automaton.getFinalStates().count(initState) > 0 || automaton.getTransitionsToState(initState).size() > 0 ) {
-		label::Label q0 = label::createUniqueLabel(initState, automaton.getStates());
+		label::Label q0 = common::createUnique(initState, automaton.getStates());
 		automaton.addState(q0);
 
 		regexp::UnboundedRegExpStructure < alphabet::Symbol > regexp { regexp::UnboundedRegExpEpsilon < alphabet::Symbol > () };
@@ -96,7 +98,7 @@ void ToRegExpStateElimination::extendExtendedNFA(automaton::ExtendedNFA < > & au
 	}
 
 	if(automaton.getFinalStates().size() > 1) {
-		label::Label f = label::createUniqueLabel(label::labelFrom("f"), automaton.getStates());
+		label::Label f = common::createUnique(label::labelFrom("f"), automaton.getStates());
 		automaton.addState(f);
 
 		for(const auto &state : automaton.getFinalStates() ) {
diff --git a/alib2algo/src/automaton/simplify/Total.cpp b/alib2algo/src/automaton/simplify/Total.cpp
index a0cf558eea93f3721f3f085d77163f63ef792aa5..99c8ac5fa9cd5f7cfd14bb6a222f09f7382057a4 100644
--- a/alib2algo/src/automaton/simplify/Total.cpp
+++ b/alib2algo/src/automaton/simplify/Total.cpp
@@ -12,6 +12,7 @@
 #include <automaton/FSM/NFA.h>
 #include <automaton/FSM/DFA.h>
 #include <label/FailStateLabel.h>
+#include <common/createUnique.hpp>
 
 namespace automaton {
 
@@ -27,7 +28,7 @@ automaton::NFA < > Total::total(const automaton::NFA < > & automaton) {
 	}
 
 	automaton::NFA < > res(automaton);
-	label::Label nullState = label::createUniqueLabel(label::FailStateLabel::FAIL_STATE_LABEL, automaton.getStates());
+	label::Label nullState = common::createUnique(label::FailStateLabel::FAIL_STATE_LABEL, automaton.getStates());
 	res.addState(nullState);
 
 	for(const auto& q : res.getStates()) {
@@ -45,7 +46,7 @@ auto TotalNFA = Total::RegistratorWrapper<automaton::NFA < > , automaton::NFA <
 
 automaton::DFA < > Total::total(const automaton::DFA < > & automaton) {
 	automaton::DFA < > res(automaton);
-	label::Label nullState = label::createUniqueLabel(label::FailStateLabel::FAIL_STATE_LABEL, automaton.getStates());
+	label::Label nullState = common::createUnique(label::FailStateLabel::FAIL_STATE_LABEL, automaton.getStates());
 	res.addState(nullState);
 
 	for(const auto& q : res.getStates()) {
diff --git a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
index b636b0e4f81a2c3b788ede30f32fd99b3473584f..e4f8c7b6da16238322f25a538234dce468cee98c 100644
--- a/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomataUnionEpsilonTransition.cpp
@@ -8,6 +8,7 @@
 #include "AutomataUnionEpsilonTransition.h"
 #include "common/PairLabel.h"
 #include <label/InitialStateLabel.h>
+#include <common/createUnique.hpp>
 
 #define AUTOMATON_FIRST  1
 #define AUTOMATON_SECOND 2
@@ -27,7 +28,7 @@ automaton::EpsilonNFA < > AutomataUnionEpsilonTransition::unification(const auto
 	for(const auto& q : second.getStates())
 		states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q));
 
-	label::Label q0 = label::createUniqueLabel(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
+	label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
 	automaton::EpsilonNFA < > res(q0);
 
 	for(const auto& a : first.getInputAlphabet())
@@ -66,7 +67,7 @@ automaton::EpsilonNFA < > AutomataUnionEpsilonTransition::unification(const auto
 	for(const auto& q : second.getStates())
 		states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q));
 
-	label::Label q0 = label::createUniqueLabel(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
+	label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
 	automaton::EpsilonNFA < > res(q0);
 
 	for(const auto& a : first.getInputAlphabet())
@@ -105,7 +106,7 @@ automaton::EpsilonNFA < > AutomataUnionEpsilonTransition::unification(const auto
 	for(const auto& q : second.getStates())
 		states.insert(pairLabel(label::labelFrom(AUTOMATON_SECOND), q));
 
-	label::Label q0 = label::createUniqueLabel(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
+	label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
 	automaton::EpsilonNFA < > res(q0);
 
 	for(const auto& a : first.getInputAlphabet())
diff --git a/alib2algo/src/automaton/transform/AutomatonIteration.cpp b/alib2algo/src/automaton/transform/AutomatonIteration.cpp
index 704657ba66f6abfa49e182605af15c4a41212be1..b298142286c9d6eccdaaae4c109f8305aac8e2e3 100644
--- a/alib2algo/src/automaton/transform/AutomatonIteration.cpp
+++ b/alib2algo/src/automaton/transform/AutomatonIteration.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "AutomatonIteration.h"
+#include <common/createUnique.hpp>
 
 namespace automaton {
 
@@ -22,7 +23,7 @@ automaton::NFA < > AutomatonIteration::iteration(const automaton::DFA < > & auto
 		for(const auto& t : res.getTransitionsToState(qf))
 			res.addTransition(t.first.first, t.first.second, res.getInitialState());
 
-	label::Label newInitialState = label::createUniqueLabel(automaton.getInitialState(), automaton.getStates());
+	label::Label newInitialState = common::createUnique(automaton.getInitialState(), automaton.getStates());
 	res.addState(newInitialState);
 	res.setInitialState(newInitialState);
 	res.addFinalState(newInitialState);
@@ -42,7 +43,7 @@ automaton::NFA < > AutomatonIteration::iteration(const automaton::NFA < > & auto
 		for(const auto& t : res.getTransitionsToState(qf))
 			res.addTransition(t.first.first, t.first.second, res.getInitialState());
 
-	label::Label newInitialState = label::createUniqueLabel(automaton.getInitialState(), automaton.getStates());
+	label::Label newInitialState = common::createUnique(automaton.getInitialState(), automaton.getStates());
 	res.addState(newInitialState);
 	res.setInitialState(newInitialState);
 	res.addFinalState(newInitialState);
diff --git a/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp b/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp
index d73327dcce1656dcef66ef8137805d2b3e6c4e87..c0a49d1f1bdd4e06819fa010cf601ef8f22882c9 100644
--- a/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp
+++ b/alib2algo/src/automaton/transform/AutomatonIterationEpsilonTransition.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "AutomatonIterationEpsilonTransition.h"
+#include <common/createUnique.hpp>
 
 namespace automaton {
 
@@ -22,7 +23,7 @@ automaton::EpsilonNFA < > AutomatonIterationEpsilonTransition::iteration(const T
 	for(const auto&q : automaton.getFinalStates())
 		res.addTransition(q, automaton.getInitialState());
 
-	label::Label newInitialState = label::createUniqueLabel(automaton.getInitialState(), automaton.getStates());
+	label::Label newInitialState = common::createUnique(automaton.getInitialState(), automaton.getStates());
 	res.addState(newInitialState);
 	res.setInitialState(newInitialState);
 	res.addFinalState(newInitialState);
diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
index a573c8a76affcb7a54258c00709927c3c5bc233c..008e876c99bd49d51c6feab7b524e924184eb604 100644
--- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
+++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp
@@ -19,6 +19,7 @@
 #include <queue>
 #include <iterator>
 #include <label/InitialStateLabel.h>
+#include <common/createUnique.hpp>
 
 namespace automaton {
 
@@ -35,7 +36,7 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom
 auto PDAToRHPDARealTimeHeightDeterministicNPDA = PDAToRHPDA::RegistratorWrapper < automaton::RealTimeHeightDeterministicNPDA < >, automaton::RealTimeHeightDeterministicNPDA < > > ( PDAToRHPDA::convert );
 
 automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const automaton::DPDA < > & pda ) {
-	label::Label q0 = label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, pda.getStates ( ) );
+	label::Label q0 = common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, pda.getStates ( ) );
 
 	RealTimeHeightDeterministicDPDA < > res ( q0, alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
 
@@ -67,11 +68,11 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom
 			int popPushIndex = 0;
 			int popPushSymbols = std::get < 2 > ( transition.first ).size ( ) + to.second.size ( );
 
-			label::Label lastUS = label::createUniqueLabel ( label::labelFrom ( us + std::to_string ( i ) ), res.getStates ( ) );
+			label::Label lastUS = common::createUnique ( label::labelFrom ( us + std::to_string ( i ) ), res.getStates ( ) );
 			for ( const alphabet::Symbol & pop :std::get < 2 > ( transition.first ) ) {
 				label::Label fromState = ( popPushIndex == 0 ) ? std::get < 0 > ( transition.first ) : lastUS;
 
-				if ( popPushIndex != 0 ) lastUS = label::createUniqueLabel ( label::labelFrom ( us + std::to_string ( ++i ) ), res.getStates ( ) );
+				if ( popPushIndex != 0 ) lastUS = common::createUnique ( label::labelFrom ( us + std::to_string ( ++i ) ), res.getStates ( ) );
 
 				label::Label toState = ( popPushIndex == popPushSymbols - 1 ) ? to.first : lastUS;
 
@@ -88,7 +89,7 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom
 			for ( const alphabet::Symbol & push : std::make_reverse ( to.second ) ) {
 				label::Label fromState = ( popPushIndex == 0 ) ? std::get < 0 > ( transition.first ) : lastUS;
 
-				if ( popPushIndex != 0 ) lastUS = label::createUniqueLabel ( label::labelFrom ( us + std::to_string ( ++i ) ), res.getStates ( ) );
+				if ( popPushIndex != 0 ) lastUS = common::createUnique ( label::labelFrom ( us + std::to_string ( ++i ) ), res.getStates ( ) );
 
 				label::Label toState = ( popPushIndex == popPushSymbols - 1 ) ? to.first : lastUS;
 
@@ -120,7 +121,7 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom
 	pushdownStoreAlphabet.insert ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
 	res.setPushdownStoreAlphabet ( pushdownStoreAlphabet );
 
-	label::Label q0 = label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, res.getStates ( ) );
+	label::Label q0 = common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, res.getStates ( ) );
 	res.addState ( q0 );
 	res.addInitialState ( q0 );
 
@@ -141,11 +142,11 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom
 				int popPushIndex = 0;
 				int popPushSymbols = std::get < 2 > ( transition.first ).size ( ) + to.second.size ( );
 
-				label::Label lastUS = label::createUniqueLabel ( label::labelFrom ( us + std::to_string ( i ) ), res.getStates ( ) );
+				label::Label lastUS = common::createUnique ( label::labelFrom ( us + std::to_string ( i ) ), res.getStates ( ) );
 				std::for_each ( std::get < 2 > ( transition.first ).begin ( ), std::get < 2 > ( transition.first ).end ( ), [&] ( const alphabet::Symbol & pop ) {
 						label::Label fromState = ( popPushIndex == 0 ) ? std::get < 0 > ( transition.first ) : lastUS;
 
-						if ( popPushIndex != 0 ) lastUS = label::createUniqueLabel ( label::labelFrom ( us + std::to_string ( ++i ) ), res.getStates ( ) );
+						if ( popPushIndex != 0 ) lastUS = common::createUnique ( label::labelFrom ( us + std::to_string ( ++i ) ), res.getStates ( ) );
 
 						label::Label toState = ( popPushIndex == popPushSymbols - 1 ) ? to.first : lastUS;
 
@@ -162,7 +163,7 @@ automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const autom
 				std::for_each ( to.second.rbegin ( ), to.second.rend ( ), [&] ( const alphabet::Symbol & push ) {
 						label::Label fromState = ( popPushIndex == 0 ) ? std::get < 0 > ( transition.first ) : lastUS;
 
-						if ( popPushIndex != 0 ) lastUS = label::createUniqueLabel ( label::labelFrom ( us + std::to_string ( ++i ) ), res.getStates ( ) );
+						if ( popPushIndex != 0 ) lastUS = common::createUnique ( label::labelFrom ( us + std::to_string ( ++i ) ), res.getStates ( ) );
 
 						label::Label toState = ( popPushIndex == popPushSymbols - 1 ) ? to.first : lastUS;
 
diff --git a/alib2algo/src/grammar/convert/ToAutomaton.cpp b/alib2algo/src/grammar/convert/ToAutomaton.cpp
index e4e8da96a93341f9ccf47e0e8055441748c59ad3..e1c7aab5beb6076bf9d6334521ad347e163a227a 100644
--- a/alib2algo/src/grammar/convert/ToAutomaton.cpp
+++ b/alib2algo/src/grammar/convert/ToAutomaton.cpp
@@ -6,6 +6,8 @@
  */
 #include "ToAutomaton.h"
 
+#include <common/createUnique.hpp>
+
 #include <label/ObjectLabel.h>
 #include <label/Label.h>
 #include <label/InitialStateLabel.h>
@@ -31,7 +33,7 @@ automaton::NFA < > ToAutomaton::convert(const grammar::LeftRG < > & grammar) {
 	}
 
 	// step 1, 4
-	label::Label q0 = label::createUniqueLabel(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
+	label::Label q0 = common::createUnique(label::InitialStateLabel::INITIAL_STATE_LABEL, states);
 	states.insert(q0);
 	automaton::NFA < > automaton(q0);
 	automaton.setInputAlphabet(grammar.getTerminalAlphabet());
@@ -74,7 +76,7 @@ automaton::NFA < > ToAutomaton::convert(const grammar::RightRG < > & grammar) {
 	}
 
 	// step 1, 4
-	label::Label AState = label::createUniqueLabel(label::FinalStateLabel::FINAL_STATE_LABEL, states);
+	label::Label AState = common::createUnique(label::FinalStateLabel::FINAL_STATE_LABEL, states);
 	states.insert(AState);
 	automaton::NFA < > automaton(stateMap.find(grammar.getInitialSymbol())->second);
 	automaton.setStates(states);
diff --git a/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp b/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp
index ced00f9e09e6f8308f2d6c6574d9e989d4bbb8c6..3b7659b4a2afd0ecba38148d128d0221e331464a 100644
--- a/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp
+++ b/alib2algo/src/grammar/convert/ToGrammarLeftRG.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ToGrammarLeftRG.h"
+#include <common/createUnique.hpp>
 
 namespace grammar {
 
@@ -17,7 +18,7 @@ grammar::LeftRG < > ToGrammarLeftRG::convert(const grammar::Grammar& grammar) {
 
 grammar::LeftRG < > ToGrammarLeftRG::convert(const grammar::RightRG < > & grammar) {
 	// 1.
-	alphabet::Symbol s = alphabet::createUniqueSymbol( grammar.getInitialSymbol( ), grammar.getNonterminalAlphabet(), grammar.getTerminalAlphabet() );
+	alphabet::Symbol s = common::createUnique( grammar.getInitialSymbol( ), grammar.getNonterminalAlphabet(), grammar.getTerminalAlphabet() );
 
 	grammar::LeftRG < > lrg(s);
 
diff --git a/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp b/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp
index 74a132e8d04fc2b786325bb17d234a150ba9163e..d7c9b0e10d04c2408c65f741406d26fceb70d53f 100644
--- a/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp
+++ b/alib2algo/src/grammar/convert/ToGrammarRightRG.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "ToGrammarRightRG.h"
+#include <common/createUnique.hpp>
 
 namespace grammar {
 
@@ -17,7 +18,7 @@ grammar::RightRG < > ToGrammarRightRG::convert(const grammar::Grammar& grammar)
 
 grammar::RightRG < > ToGrammarRightRG::convert(const grammar::LeftRG < > & grammar) {
 	// 1.
-	alphabet::Symbol s = alphabet::createUniqueSymbol( grammar.getInitialSymbol( ), grammar.getNonterminalAlphabet(), grammar.getTerminalAlphabet() );
+	alphabet::Symbol s = common::createUnique( grammar.getInitialSymbol( ), grammar.getNonterminalAlphabet(), grammar.getTerminalAlphabet() );
 
 	grammar::RightRG < > rrg( s );
 
diff --git a/alib2algo/src/grammar/parsing/AbsorbTerminalSymbol.cpp b/alib2algo/src/grammar/parsing/AbsorbTerminalSymbol.cpp
index 85788374b5e9678313930a6ddb9fb9219bcbb7c2..c7449c555a182a528d7afe4a1c9aa0f8c89f2495 100644
--- a/alib2algo/src/grammar/parsing/AbsorbTerminalSymbol.cpp
+++ b/alib2algo/src/grammar/parsing/AbsorbTerminalSymbol.cpp
@@ -9,6 +9,7 @@
 
 #include <grammar/ContextFree/CFG.h>
 #include <alphabet/SymbolPairSymbol.h>
+#include <common/createUnique.hpp>
 
 namespace grammar {
 
@@ -49,7 +50,7 @@ void AbsorbTerminalSymbol::absorbTerminalSymbol ( grammar::CFG < > & grammar, co
 	std::map < alphabet::Symbol, alphabet::Symbol > nonterminalsPrimed; // terminal is fixed in particular calls
 
 	for ( const alphabet::Symbol & nonterminal : nonterminals ) {
-		alphabet::Symbol newSymbol = alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( nonterminal, terminal ) ) ), res.getTerminalAlphabet ( ), res.getNonterminalAlphabet ( ) );
+		alphabet::Symbol newSymbol = common::createUnique ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( nonterminal, terminal ) ) ), res.getTerminalAlphabet ( ), res.getNonterminalAlphabet ( ) );
 		res.addNonterminalSymbol ( newSymbol );
 		nonterminalsPrimed.insert ( std::make_pair ( nonterminal, newSymbol ) );
 	}
diff --git a/alib2algo/src/grammar/parsing/LRParser.cpp b/alib2algo/src/grammar/parsing/LRParser.cpp
index 66a34c7ad6d1764dbbc4705620ba8dda51884196..7f2e02fd945e23b1847b085149875af50d24596c 100644
--- a/alib2algo/src/grammar/parsing/LRParser.cpp
+++ b/alib2algo/src/grammar/parsing/LRParser.cpp
@@ -9,17 +9,18 @@
 #include <alphabet/EndSymbol.h>
 
 #include <stack>
+#include <common/createUnique.hpp>
 
 namespace grammar {
 
 namespace parsing {
 
 alphabet::Symbol LRParser::getEndOfInputSymbol ( grammar::CFG < > originalGrammar ) {
-	return alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::EndSymbol ( ) ), originalGrammar.getTerminalAlphabet ( ), originalGrammar.getNonterminalAlphabet ( ) );
+	return common::createUnique ( alphabet::Symbol ( alphabet::EndSymbol ( ) ), originalGrammar.getTerminalAlphabet ( ), originalGrammar.getNonterminalAlphabet ( ) );
 }
 
 grammar::CFG < > LRParser::getAugmentedGrammar ( grammar::CFG < > originalGrammar ) {
-	alphabet::Symbol initialSymbol = alphabet::createUniqueSymbol ( originalGrammar.getInitialSymbol(), originalGrammar.getTerminalAlphabet ( ), originalGrammar.getNonterminalAlphabet ( ) );
+	alphabet::Symbol initialSymbol = common::createUnique ( originalGrammar.getInitialSymbol(), originalGrammar.getTerminalAlphabet ( ), originalGrammar.getNonterminalAlphabet ( ) );
 
 	originalGrammar.addNonterminalSymbol ( initialSymbol );
 	originalGrammar.addRule ( initialSymbol, { originalGrammar.getInitialSymbol ( ) } );
diff --git a/alib2algo/src/grammar/parsing/LeftFactorize.cpp b/alib2algo/src/grammar/parsing/LeftFactorize.cpp
index a802810ea52fcbd23d3fe0f68b1563d1e50564e9..0016f1a2efa0428177c988847a91fad01a82a59b 100644
--- a/alib2algo/src/grammar/parsing/LeftFactorize.cpp
+++ b/alib2algo/src/grammar/parsing/LeftFactorize.cpp
@@ -8,6 +8,7 @@
 #include "LeftFactorize.h"
 
 #include <grammar/ContextFree/CFG.h>
+#include <common/createUnique.hpp>
 
 namespace grammar {
 
@@ -19,7 +20,7 @@ void LeftFactorize::leftFactorize ( grammar::CFG < > & grammar, const alphabet::
 	res.setNonterminalAlphabet ( grammar.getNonterminalAlphabet ( ) );
 	res.setTerminalAlphabet ( grammar.getTerminalAlphabet ( ) );
 
-	alphabet::Symbol primed = alphabet::createUniqueSymbol ( nonterminal, grammar.getTerminalAlphabet ( ), grammar.getNonterminalAlphabet ( ) );
+	alphabet::Symbol primed = common::createUnique ( nonterminal, grammar.getTerminalAlphabet ( ), grammar.getNonterminalAlphabet ( ) );
 	res.addNonterminalSymbol ( primed );
 
 	for ( const std::pair < const alphabet::Symbol, std::set < std::vector < alphabet::Symbol > > > & rule : grammar.getRules ( ) ) {
diff --git a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
index ce92b6aeae4e92dc61df07e1d5338c2054e236d8..dea34db7fa871b568f2d0ff986ef53bffd543bcc 100644
--- a/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
+++ b/alib2algo/src/grammar/simplify/LeftRecursionRemover.cpp
@@ -11,6 +11,7 @@
 #include <exception/CommonException.h>
 
 #include <vector>
+#include <common/createUnique.hpp>
 
 namespace grammar {
 
@@ -30,7 +31,7 @@ grammar::EpsilonFreeCFG < > directLeftRecursionRemoveAsOrder(const grammar::Epsi
 			} ) && std::all_of(origGrammar.getRules().find(nonterminal)->second.begin(), origGrammar.getRules().find(nonterminal)->second.end(), [&](const std::vector<alphabet::Symbol>& singleRHS) {
 				return origGrammar.getTerminalAlphabet().count(singleRHS[0]) || singleRHS[0] >= nonterminal; // only remove left recursion when all nonterminals are bigger than the left hand side
 			})) {
-			alphabet::Symbol primed = alphabet::createUniqueSymbol(nonterminal, res.getTerminalAlphabet(), res.getNonterminalAlphabet());
+			alphabet::Symbol primed = common::createUnique(nonterminal, res.getTerminalAlphabet(), res.getNonterminalAlphabet());
 			res.addNonterminalSymbol(primed);
 			for(const std::vector<alphabet::Symbol>& singleRHS : origGrammar.getRules().find(nonterminal)->second) { // do the removal
 				if(singleRHS[0] == nonterminal) { // A -> A alpha
diff --git a/alib2algo/src/grammar/simplify/ToCNF.cpp b/alib2algo/src/grammar/simplify/ToCNF.cpp
index c6bc18486ffa755389c50abaea2468718a9b771f..2d88f8c92a24180ab628cd28dc6963f157a69c03 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToCNF.cpp
@@ -12,6 +12,7 @@
 #include "alphabet/LabeledSymbol.h"
 #include "alphabet/SymbolPairSymbol.h"
 #include <exception/CommonException.h>
+#include <common/createUnique.hpp>
 
 namespace grammar {
 
@@ -27,7 +28,7 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
 		auto second = splitToPairs(grammar, rhs, from + 1, 2, createdSymbols);
 		alphabet::Symbol secondProposal{alphabet::SymbolPairSymbol(second)};
 		if(!createdSymbols.count(secondProposal)) {
-			createdSymbols.insert(std::make_pair(secondProposal, alphabet::createUniqueSymbol(secondProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
+			createdSymbols.insert(std::make_pair(secondProposal, common::createUnique(secondProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
 		}
 		grammar.addNonterminalSymbol(createdSymbols.find(secondProposal)->second);
 		grammar.addRawRule(createdSymbols.find(secondProposal)->second, {std::move(second.first), std::move(second.second)});
@@ -37,7 +38,7 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
 		auto first = splitToPairs(grammar, rhs, from, size / 2, createdSymbols);
 		alphabet::Symbol firstProposal{alphabet::SymbolPairSymbol(first)};
 		if(!createdSymbols.count(firstProposal)) {
-			createdSymbols.insert(std::make_pair(firstProposal, alphabet::createUniqueSymbol(firstProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
+			createdSymbols.insert(std::make_pair(firstProposal, common::createUnique(firstProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
 		}
 		grammar.addNonterminalSymbol(createdSymbols.find(firstProposal)->second);
 		grammar.addRawRule(createdSymbols.find(firstProposal)->second, {std::move(first.first), std::move(first.second)});
@@ -45,7 +46,7 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
 		auto second = splitToPairs(grammar, rhs, from + size / 2, size - size / 2, createdSymbols);
 		alphabet::Symbol secondProposal{alphabet::SymbolPairSymbol(second)};
 		if(!createdSymbols.count(secondProposal)) {
-			createdSymbols.insert(std::make_pair(secondProposal, alphabet::createUniqueSymbol(secondProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
+			createdSymbols.insert(std::make_pair(secondProposal, common::createUnique(secondProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
 		}
 		grammar.addNonterminalSymbol(createdSymbols.find(secondProposal)->second);
 		grammar.addRawRule(createdSymbols.find(secondProposal)->second, {std::move(second.first), std::move(second.second)});
@@ -84,7 +85,7 @@ grammar::CNF < > convertInternal( const T & origGrammar ) {
 
 	std::map<alphabet::Symbol, alphabet::Symbol> terminalToShadowNonterminal;
 	for( const auto & symbol : grammarTmp.getTerminalAlphabet() ) {
-		alphabet::Symbol shadowSymbol = alphabet::createUniqueSymbol(symbol, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
+		alphabet::Symbol shadowSymbol = common::createUnique(symbol, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
 		terminalToShadowNonterminal.insert( std::make_pair( symbol, shadowSymbol ));
 		grammar.addNonterminalSymbol( shadowSymbol );
 		grammar.addRule(std::move(shadowSymbol), symbol);
diff --git a/alib2algo/src/grammar/simplify/ToGNF.cpp b/alib2algo/src/grammar/simplify/ToGNF.cpp
index a1d6c5e0278a25c18ea4087cbb36ad6a0ede6fde..2612150f250fac314ae84a8266461c3881f684ee 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToGNF.cpp
@@ -13,6 +13,7 @@
 #include "../convert/ToGrammarRightRG.h"
 #include "alphabet/LabeledSymbol.h"
 #include "alphabet/SymbolPairSymbol.h"
+#include <common/createUnique.hpp>
 
 namespace grammar {
 
@@ -61,7 +62,7 @@ grammar::GNF < > convertInternal( const grammar::EpsilonFreeCFG < > & origGramma
 	res.setGeneratesEpsilon(step.getGeneratesEpsilon());
 	std::map<alphabet::Symbol, alphabet::Symbol> terminalToPrimed;
 	for(const alphabet::Symbol& terminal : step.getTerminalAlphabet()) {
-		alphabet::Symbol primed = alphabet::createUniqueSymbol(terminal, res.getTerminalAlphabet(), res.getNonterminalAlphabet());
+		alphabet::Symbol primed = common::createUnique(terminal, res.getTerminalAlphabet(), res.getNonterminalAlphabet());
 		terminalToPrimed.insert(std::make_pair(terminal, primed));
 		res.addNonterminalSymbol(primed);
 		res.addRule(primed, std::make_pair(terminal, std::vector<alphabet::Symbol> {}));
diff --git a/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp b/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp
index 02c716c4d640428c8663b4d6f5b6c157b00fe4c9..6c771f85f1f6ce0e5e28df9fec6b50c89eca0a7b 100644
--- a/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp
+++ b/alib2algo/src/regexp/convert/ToGrammarRightRGDerivation.cpp
@@ -13,6 +13,7 @@
 #include <vector>
 
 #include <hexavigesimal>
+#include <common/createUnique.hpp>
 
 #include "../simplify/RegExpOptimize.h"
 #include "../transform/RegExpDerivation.h"
@@ -76,7 +77,7 @@ grammar::RightRG < > ToGrammarRightRGDerivation::convert(const T& regexp) {
 	for(const auto & r : N) {
 		if(V == r) continue;
 
-		alphabet::Symbol nt = alphabet::createUniqueSymbol(alphabet::Symbol(alphabet::LabeledSymbol(std::toBase26(nonterminalId++))), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
+		alphabet::Symbol nt = common::createUnique(alphabet::Symbol(alphabet::LabeledSymbol(std::toBase26(nonterminalId++))), grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
 		nonterminalMap.insert(std::make_pair(r, nt));
 		grammar.addNonterminalSymbol(nt);
 	}
diff --git a/alib2algo/test-src/grammar/parsing/AbsorbTerminalSymbol.cpp b/alib2algo/test-src/grammar/parsing/AbsorbTerminalSymbol.cpp
index 5857ccda287cee3af9f02d8b56e36a2fecf264c1..7de89773ec11e4f78ff8e84d2b28ec2a0d210842 100644
--- a/alib2algo/test-src/grammar/parsing/AbsorbTerminalSymbol.cpp
+++ b/alib2algo/test-src/grammar/parsing/AbsorbTerminalSymbol.cpp
@@ -23,7 +23,7 @@ void AbsorbTerminalSymbol::testAbsorbTerminalSymbol ( ) {
 	alphabet::Symbol b = alphabet::symbolFrom ( 'b' );
 	alphabet::Symbol c = alphabet::symbolFrom ( 'c' );
 
-	alphabet::Symbol Ba = alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) ), { }, { } );
+	alphabet::Symbol Ba = alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) );
 
 	grammar::CFG < > grammar ( A );
 
@@ -69,8 +69,8 @@ void AbsorbTerminalSymbol::testAbsorbTerminalSymbol2 ( ) {
 	alphabet::Symbol b = alphabet::symbolFrom ( 'b' );
 	alphabet::Symbol c = alphabet::symbolFrom ( 'c' );
 
-	alphabet::Symbol Ba = alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) ), { }, { } );
-	alphabet::Symbol Xa = alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( X, a ) ) ), { }, { } );
+	alphabet::Symbol Ba = alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) );
+	alphabet::Symbol Xa = alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( X, a ) ) );
 
 	grammar::CFG < > grammar ( A );
 
@@ -118,7 +118,7 @@ void AbsorbTerminalSymbol::testAbsorbTerminalSymbol3 ( ) {
 	alphabet::Symbol b = alphabet::symbolFrom ( 'b' );
 	alphabet::Symbol c = alphabet::symbolFrom ( 'c' );
 
-	alphabet::Symbol Ba = alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) ), { }, { } );
+	alphabet::Symbol Ba = alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) );
 
 	grammar::CFG < > grammar ( A );
 
diff --git a/alib2algo/test-src/grammar/parsing/HandleFirstFollowConflict.cpp b/alib2algo/test-src/grammar/parsing/HandleFirstFollowConflict.cpp
index a5916eb8561a65f1c399b533b187d202fbfdda64..559e16a390927a25f0d648c0a4b5ec2ff2444e8d 100644
--- a/alib2algo/test-src/grammar/parsing/HandleFirstFollowConflict.cpp
+++ b/alib2algo/test-src/grammar/parsing/HandleFirstFollowConflict.cpp
@@ -24,7 +24,7 @@ void HandleFirstFollowConflict::testHandleFirstFollowConflict ( ) {
 	alphabet::Symbol c = alphabet::symbolFrom ( 'c' );
 	alphabet::Symbol d = alphabet::symbolFrom ( 'd' );
 
-	alphabet::Symbol Ba = alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) ), { }, { } );
+	alphabet::Symbol Ba = alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) );
 
 	grammar::CFG < > grammar ( A );
 
@@ -94,8 +94,8 @@ void HandleFirstFollowConflict::testHandleFirstFollowConflict2 ( ) {
 	alphabet::Symbol c = alphabet::symbolFrom ( 'c' );
 	alphabet::Symbol d = alphabet::symbolFrom ( 'd' );
 
-	alphabet::Symbol Ba = alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) ), { }, { } );
-	alphabet::Symbol Xa = alphabet::createUniqueSymbol ( alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( X, a ) ) ), { }, { } );
+	alphabet::Symbol Ba = alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( B, a ) ) );
+	alphabet::Symbol Xa = alphabet::Symbol ( alphabet::SymbolPairSymbol ( std::make_pair ( X, a ) ) );
 
 	grammar::CFG < > grammar ( A );
 
diff --git a/alib2algo/test-src/grammar/simplify/GrammarLeftRecursionRemoverTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarLeftRecursionRemoverTest.cpp
index f2d52b932c309c19893d8e98b84761de62415cfe..445aa9a5c39b0dd130c12a5f1df8ae70445f2749 100644
--- a/alib2algo/test-src/grammar/simplify/GrammarLeftRecursionRemoverTest.cpp
+++ b/alib2algo/test-src/grammar/simplify/GrammarLeftRecursionRemoverTest.cpp
@@ -7,6 +7,7 @@
 #include "grammar/ContextFree/EpsilonFreeCFG.h"
 
 #include <factory/StringDataFactory.hpp>
+#include <common/createUnique.hpp>
 
 #define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
 
@@ -61,7 +62,7 @@ void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion2() {
 	grammar1.addRule(A, {A, b});
 	grammar1.addRule(A, {c});
 
-	alphabet::Symbol Aprimed = createUniqueSymbol(A, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol Aprimed = common::createUnique(A, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
@@ -103,7 +104,7 @@ void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion3() {
 	grammar1.addRule(B, {A, b});
 	grammar1.addRule(A, {c});
 
-	alphabet::Symbol Bprimed = createUniqueSymbol(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol Bprimed = common::createUnique(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
@@ -147,8 +148,8 @@ void GrammarLeftRecursionRemoverTest::testRemoveLefRecursion4() {
 	grammar1.addRule(C, {C, C});
 	grammar1.addRule(C, {a});
 
-	alphabet::Symbol Bprimed = createUniqueSymbol(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol Cprimed = createUniqueSymbol(C, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol Bprimed = common::createUnique(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol Cprimed = common::createUnique(C, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
diff --git a/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp b/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
index 50ef9c98ba105a436783d536947677f9f6076099..9a6a25e903356a9bf5e1b81a7c5736c903002583 100644
--- a/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
+++ b/alib2algo/test-src/grammar/simplify/GrammarToGNFTest.cpp
@@ -7,6 +7,7 @@
 #include "grammar/ContextFree/EpsilonFreeCFG.h"
 
 #include <factory/StringDataFactory.hpp>
+#include <common/createUnique.hpp>
 
 #define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
 
@@ -33,8 +34,8 @@ void GrammarToGNFTest::testRemoveToGNFRules1() {
 	grammar1.setNonterminalAlphabet({S, A, B, C, D});
 	grammar1.setTerminalAlphabet({a, b});
 
-	alphabet::Symbol aprimed = createUniqueSymbol(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol bprimed = createUniqueSymbol(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol aprimed = common::createUnique(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	grammar::GNF < > grammar2 = grammar::simplify::ToGNF::convert(grammar1);
 
@@ -69,10 +70,10 @@ void GrammarToGNFTest::testRemoveToGNFRules2() {
 	grammar1.addRule(A, {A, b});
 	grammar1.addRule(A, {c});
 
-	alphabet::Symbol Aprimed = createUniqueSymbol(A, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol aprimed = createUniqueSymbol(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol bprimed = createUniqueSymbol(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol cprimed = createUniqueSymbol(c, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol Aprimed = common::createUnique(A, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol aprimed = common::createUnique(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol cprimed = common::createUnique(c, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
@@ -117,10 +118,10 @@ void GrammarToGNFTest::testRemoveToGNFRules3() {
 	grammar1.addRule(B, {A, b});
 	grammar1.addRule(A, {c});
 
-	alphabet::Symbol Bprimed = createUniqueSymbol(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol aprimed = createUniqueSymbol(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol bprimed = createUniqueSymbol(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
-	alphabet::Symbol cprimed = createUniqueSymbol(c, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol Bprimed = common::createUnique(B, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol aprimed = common::createUnique(a, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol bprimed = common::createUnique(b, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
+	alphabet::Symbol cprimed = common::createUnique(c, grammar1.getTerminalAlphabet(), grammar1.getNonterminalAlphabet());
 
 	std::cout << alib::StringDataFactory::toString<grammar::Grammar>(grammar::Grammar(grammar1)) << std::endl;
 
diff --git a/alib2common/src/base/WrapperBase.hpp b/alib2common/src/base/WrapperBase.hpp
index af3d469d68e75e97f7c0140262e78a403254c854..538467209419cc873dee677d2a0d253945f147f7 100644
--- a/alib2common/src/base/WrapperBase.hpp
+++ b/alib2common/src/base/WrapperBase.hpp
@@ -106,6 +106,16 @@ public:
 	explicit operator std::string ( ) const {
 		return ( std::string ) * m_data;
 	}
+
+	WrapperBase < T > & operator ++ ( ) {
+		T * res = std::move ( this->getData ( ) ).inc ( );
+
+		if ( res != NULL )
+			this->setData ( res );
+
+		return *this;
+	}
+
 };
 
 } /* namespace alib */
diff --git a/alib2common/src/primitive/Bool.cpp b/alib2common/src/primitive/Bool.cpp
index 7075c1b5b94907a6b80cf55b5b3a5f6ded0a2871..067301de95211aa8a3281dbedc584189082a5db8 100644
--- a/alib2common/src/primitive/Bool.cpp
+++ b/alib2common/src/primitive/Bool.cpp
@@ -76,12 +76,9 @@ void Bool::compose(std::deque<sax::Token>& out, bool primitive) {
 	out.emplace_back(Bool::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-Bool Bool::next() const {
-	return Bool(!m_data);
-}
-
-void Bool::inc() {
+PrimitiveBase * Bool::inc() && {
 	m_data = !m_data;
+	return NULL;
 }
 
 } /* namespace primitive */
diff --git a/alib2common/src/primitive/Bool.h b/alib2common/src/primitive/Bool.h
index eae50fff10ee7a9fac714ff2397634d5f541794e..6b10404bd26f45fbb0f36c18d631a7ef2bfe50a3 100644
--- a/alib2common/src/primitive/Bool.h
+++ b/alib2common/src/primitive/Bool.h
@@ -65,8 +65,7 @@ public:
 	void compose ( std::deque < sax::Token > & out ) const;
 	static void compose ( std::deque < sax::Token > & out, bool primitive );
 
-	Bool next ( ) const;
-	virtual void inc ( );
+	virtual PrimitiveBase * inc ( ) &&;
 };
 
 } /* namespace primitive */
diff --git a/alib2common/src/primitive/Character.cpp b/alib2common/src/primitive/Character.cpp
index dd6cc85cb9044a3e3db865c93acb59f1cf3da74b..3c431432694b5f7e3343b8d06a97391254aa616c 100644
--- a/alib2common/src/primitive/Character.cpp
+++ b/alib2common/src/primitive/Character.cpp
@@ -65,12 +65,9 @@ void Character::compose(std::deque<sax::Token>& out, char primitive) {
 	out.emplace_back(Character::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-Character Character::next() const {
-	return Character(m_data + 1);
-}
-
-void Character::inc() {
+PrimitiveBase * Character::inc() && {
 	m_data++;
+	return NULL;
 }
 
 } /* namespace primitive */
diff --git a/alib2common/src/primitive/Character.h b/alib2common/src/primitive/Character.h
index c80ed46cb215904b6b4e506d7c562141a86d091c..1ff9d4a4511c6daab0fbf5c14cbe22cd5b78af10 100644
--- a/alib2common/src/primitive/Character.h
+++ b/alib2common/src/primitive/Character.h
@@ -65,8 +65,7 @@ public:
 	void compose ( std::deque < sax::Token > & out ) const;
 	static void compose ( std::deque < sax::Token > & out, char primitive );
 
-	Character next ( ) const;
-	virtual void inc ( );
+	virtual PrimitiveBase * inc ( ) &&;
 };
 
 } /* namespace primitive */
diff --git a/alib2common/src/primitive/Integer.cpp b/alib2common/src/primitive/Integer.cpp
index ae9b0013e82839b20d39aa51e05c7d74daf7a501..03dce0f6c5c9f3b65ca7aa8941aaa5d5f2242d38 100644
--- a/alib2common/src/primitive/Integer.cpp
+++ b/alib2common/src/primitive/Integer.cpp
@@ -65,12 +65,9 @@ void Integer::compose(std::deque<sax::Token>& out, int primitive) {
 	out.emplace_back(Integer::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-Integer Integer::next() const {
-	return Integer(m_data + 1);
-}
-
-void Integer::inc() {
+PrimitiveBase * Integer::inc() && {
 	m_data++;
+	return NULL;
 }
 
 } /* namespace primitive */
diff --git a/alib2common/src/primitive/Integer.h b/alib2common/src/primitive/Integer.h
index 6ad4fec405a3e897d46062e46045ed633a6fe669..55a0f641aa6389f3b68e6b34f69c17595791dffa 100644
--- a/alib2common/src/primitive/Integer.h
+++ b/alib2common/src/primitive/Integer.h
@@ -65,8 +65,7 @@ public:
 	void compose ( std::deque < sax::Token > & out ) const;
 	static void compose ( std::deque < sax::Token > & out, int primitive );
 
-	Integer next ( ) const;
-	virtual void inc ( );
+	virtual PrimitiveBase * inc ( ) &&;
 };
 
 } /* namespace primitive */
diff --git a/alib2common/src/primitive/Primitive.cpp b/alib2common/src/primitive/Primitive.cpp
index a87b35dd4d8612b317f8185fb8433951d2441b58..bee63bbfd14435d1b2e1b906517725ebedbdba6a 100644
--- a/alib2common/src/primitive/Primitive.cpp
+++ b/alib2common/src/primitive/Primitive.cpp
@@ -15,15 +15,8 @@
 
 namespace primitive {
 
-Primitive Primitive::next ( ) const {
-	Primitive res = * this;
-
-	res.inc ( );
-	return res;
-}
-
 void Primitive::inc ( ) {
-	this->getData ( ).inc ( );
+	this->operator ++ ( );
 }
 
 Primitive primitiveFrom ( int number ) {
diff --git a/alib2common/src/primitive/Primitive.h b/alib2common/src/primitive/Primitive.h
index 8f3c61d797e18c477c65b06a4223766779b4ce7c..4bb0971e19774fbe84186593b082def8e2f1428a 100644
--- a/alib2common/src/primitive/Primitive.h
+++ b/alib2common/src/primitive/Primitive.h
@@ -20,7 +20,6 @@ class Primitive : public alib::WrapperBase < PrimitiveBase > {
 	using alib::WrapperBase < PrimitiveBase >::WrapperBase;
 
 public:
-	Primitive next ( ) const;
 	void inc ( );
 
 	static const std::string & getXmlTagRefName() {
diff --git a/alib2common/src/primitive/PrimitiveBase.h b/alib2common/src/primitive/PrimitiveBase.h
index ae47adac520375678faa4e410bfdbadf031bfb36..a7bd39c2ec8eea361cea828ce6ce3a73f7c75471 100644
--- a/alib2common/src/primitive/PrimitiveBase.h
+++ b/alib2common/src/primitive/PrimitiveBase.h
@@ -20,7 +20,7 @@ public:
 	virtual PrimitiveBase* clone() const = 0;
 	virtual PrimitiveBase* plunder() && = 0;
 
-	virtual void inc() = 0;
+	virtual PrimitiveBase* inc() && = 0;
 };
 
 } /* namespace primitive */
diff --git a/alib2common/src/primitive/String.cpp b/alib2common/src/primitive/String.cpp
index c70588f88b4c0849cbae46d64a91fa8a9577fe49..38d18e52a8b8ae1c9c55e7be5b6856394c4d7bae 100644
--- a/alib2common/src/primitive/String.cpp
+++ b/alib2common/src/primitive/String.cpp
@@ -72,12 +72,9 @@ void String::compose(std::deque<sax::Token>& out, std::string primitive) {
 	out.emplace_back(primitive::String::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-String String::next() const {
-	return String(m_data + '\'');
-}
-
-void String::inc() {
+PrimitiveBase * String::inc() && {
 	m_data.push_back('\'');
+	return NULL;
 }
 
 } /* namespace primitive */
diff --git a/alib2common/src/primitive/String.h b/alib2common/src/primitive/String.h
index 371fc901e3ddebe7a2ef4875a2f5fb45f4042f5e..6be80b664efd8001e3da66d06a860999df9fbc68 100644
--- a/alib2common/src/primitive/String.h
+++ b/alib2common/src/primitive/String.h
@@ -68,8 +68,7 @@ public:
 	void compose ( std::deque < sax::Token > & out ) const;
 	static void compose ( std::deque < sax::Token > & out, std::string primitive );
 
-	String next ( ) const;
-	virtual void inc ( );
+	virtual PrimitiveBase * inc ( ) &&;
 };
 
 } /* namespace primitive */
diff --git a/alib2common/src/primitive/Unsigned.cpp b/alib2common/src/primitive/Unsigned.cpp
index d4b899c5b06be4572971261ba7469ebdfe01a2c7..487e96fb3170c378c7534ac0fc0d20ac6c565f40 100644
--- a/alib2common/src/primitive/Unsigned.cpp
+++ b/alib2common/src/primitive/Unsigned.cpp
@@ -65,12 +65,9 @@ void Unsigned::compose(std::deque<sax::Token>& out, unsigned primitive) {
 	out.emplace_back(Unsigned::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-Unsigned Unsigned::next() const {
-	return Unsigned(m_data + 1);
-}
-
-void Unsigned::inc() {
+PrimitiveBase * Unsigned::inc() && {
 	m_data++;
+	return NULL;
 }
 
 } /* namespace primitive */
diff --git a/alib2common/src/primitive/Unsigned.h b/alib2common/src/primitive/Unsigned.h
index 627e54cd1762285b8de29fc3a0abeb5419bd8ed1..d8a718007da7a313aff068a778807c7a3a413950 100644
--- a/alib2common/src/primitive/Unsigned.h
+++ b/alib2common/src/primitive/Unsigned.h
@@ -65,8 +65,7 @@ public:
 	void compose ( std::deque < sax::Token > & out ) const;
 	static void compose ( std::deque < sax::Token > & out, unsigned primitive );
 
-	Unsigned next ( ) const;
-	virtual void inc ( );
+	virtual PrimitiveBase * inc ( ) &&;
 };
 
 } /* namespace primitive */
diff --git a/alib2data/src/alphabet/BarSymbol.cpp b/alib2data/src/alphabet/BarSymbol.cpp
index 15752087900008465b1b21a4b0d82db438cac63e..f9d267a09491747c8bb5aa7318d43ee30b12ee47 100644
--- a/alib2data/src/alphabet/BarSymbol.cpp
+++ b/alib2data/src/alphabet/BarSymbol.cpp
@@ -52,10 +52,6 @@ void BarSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(BarSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-SymbolBase* BarSymbol::next() const {
-	return new UniqueSymbol(Symbol(*this), primitive::Integer(0));
-}
-
 SymbolBase* BarSymbol::inc() && {
 	return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/alphabet/BarSymbol.h b/alib2data/src/alphabet/BarSymbol.h
index 684ecd1cc02fc5d636249f79ea0fe2649b633c3e..f01113bc6eb1e8d4b0659a5ec38d990a461364b5 100644
--- a/alib2data/src/alphabet/BarSymbol.h
+++ b/alib2data/src/alphabet/BarSymbol.h
@@ -52,7 +52,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/BlankSymbol.cpp b/alib2data/src/alphabet/BlankSymbol.cpp
index 595820943fb9bdf944f43db7b4df131fbdc5b10b..e250d84a1269c635b19dd7dacbd3f24308671ff5 100644
--- a/alib2data/src/alphabet/BlankSymbol.cpp
+++ b/alib2data/src/alphabet/BlankSymbol.cpp
@@ -52,10 +52,6 @@ void BlankSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(BlankSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-SymbolBase* BlankSymbol::next() const {
-	return new UniqueSymbol(Symbol(*this), primitive::Integer(0));
-}
-
 SymbolBase* BlankSymbol::inc() && {
 	return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/alphabet/BlankSymbol.h b/alib2data/src/alphabet/BlankSymbol.h
index 102eec43e8a06048ed2ce3578d29a1c38ea1f60f..d3e9540b47feae333fd710376b19ac68d5a11635 100644
--- a/alib2data/src/alphabet/BlankSymbol.h
+++ b/alib2data/src/alphabet/BlankSymbol.h
@@ -52,7 +52,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp b/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp
index 761a90eb40c8518f32aa96755e75843cff3ec053..8b54944099f40eef72ea1a86e430609b1db96330 100644
--- a/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp
+++ b/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp
@@ -52,10 +52,6 @@ void BottomOfTheStackSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(BottomOfTheStackSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-SymbolBase* BottomOfTheStackSymbol::next() const {
-	return new UniqueSymbol(Symbol(*this), primitive::Integer(0));
-}
-
 SymbolBase* BottomOfTheStackSymbol::inc() && {
 	return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/alphabet/BottomOfTheStackSymbol.h b/alib2data/src/alphabet/BottomOfTheStackSymbol.h
index a745d7e3669907d2669bb4fe951a38f83d407fce..9eda130ede91d4e8df3f9f2079b589bec43c73d3 100644
--- a/alib2data/src/alphabet/BottomOfTheStackSymbol.h
+++ b/alib2data/src/alphabet/BottomOfTheStackSymbol.h
@@ -52,7 +52,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/EndSymbol.cpp b/alib2data/src/alphabet/EndSymbol.cpp
index db2ccb5ebf0bfc9dfe47ee230f8395d06b61a5b8..9879d7cd59453f3cabc09ab5b3f83e6b7f3c7957 100644
--- a/alib2data/src/alphabet/EndSymbol.cpp
+++ b/alib2data/src/alphabet/EndSymbol.cpp
@@ -52,10 +52,6 @@ void EndSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(EndSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-SymbolBase* EndSymbol::next() const {
-	return new UniqueSymbol(Symbol(*this), primitive::Integer(0));
-}
-
 SymbolBase* EndSymbol::inc() && {
 	return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/alphabet/EndSymbol.h b/alib2data/src/alphabet/EndSymbol.h
index 428628553cfc181aa3d356b9b01ac8937d043c4d..d2b77c40ff2136bc36c3e212d0ec02879c7200a2 100644
--- a/alib2data/src/alphabet/EndSymbol.h
+++ b/alib2data/src/alphabet/EndSymbol.h
@@ -52,7 +52,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/LabeledSymbol.cpp b/alib2data/src/alphabet/LabeledSymbol.cpp
index dde8bf7d7358badd8247633d623553165c8dd22c..121690acd980a31ed4a8037ad08ef6f97fddf4db 100644
--- a/alib2data/src/alphabet/LabeledSymbol.cpp
+++ b/alib2data/src/alphabet/LabeledSymbol.cpp
@@ -70,10 +70,6 @@ void LabeledSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(LabeledSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-SymbolBase* LabeledSymbol::next() const {
-	return new LabeledSymbol(m_label.next());
-}
-
 SymbolBase* LabeledSymbol::inc() && {
 	m_label.inc();
 	return NULL;
diff --git a/alib2data/src/alphabet/LabeledSymbol.h b/alib2data/src/alphabet/LabeledSymbol.h
index bdefe486dd6f80225887789659da4439e8ae44bd..0e209446bba67a34c706de52e47e5d88d356b501 100644
--- a/alib2data/src/alphabet/LabeledSymbol.h
+++ b/alib2data/src/alphabet/LabeledSymbol.h
@@ -63,7 +63,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/NonlinearVariableSymbol.cpp b/alib2data/src/alphabet/NonlinearVariableSymbol.cpp
index 7315b0d96836728d2c985f7d3f402b3550611754..0553135e533da82034183b0f1ada258ddb952df9 100644
--- a/alib2data/src/alphabet/NonlinearVariableSymbol.cpp
+++ b/alib2data/src/alphabet/NonlinearVariableSymbol.cpp
@@ -64,10 +64,6 @@ void NonlinearVariableSymbol::compose ( std::deque < sax::Token > & out ) const
 	out.emplace_back ( NonlinearVariableSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
 }
 
-SymbolBase * NonlinearVariableSymbol::next ( ) const {
-	return new UniqueSymbol ( Symbol ( * this ), primitive::Integer ( 0 ) );
-}
-
 SymbolBase * NonlinearVariableSymbol::inc ( ) && {
 	return new UniqueSymbol ( Symbol ( std::move ( * this ) ), primitive::Integer ( 0 ) );
 }
diff --git a/alib2data/src/alphabet/NonlinearVariableSymbol.h b/alib2data/src/alphabet/NonlinearVariableSymbol.h
index abf2125fc480de06b018a447e1cf14c6278c296d..4a5a35c149859ba3c2419693eb1b3fcb6bacae41 100644
--- a/alib2data/src/alphabet/NonlinearVariableSymbol.h
+++ b/alib2data/src/alphabet/NonlinearVariableSymbol.h
@@ -60,7 +60,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h
index 282234ac407b960d96fcee635b95d79773d716a9..dae75a6675d7b9305d0a12bea57c2851f8478d91 100644
--- a/alib2data/src/alphabet/RankedSymbol.h
+++ b/alib2data/src/alphabet/RankedSymbol.h
@@ -56,7 +56,6 @@ public:
 	void compose ( std::deque < sax::Token > & out ) const;
 	static void compose ( std::deque < sax::Token > & out, const std::ranked_symbol < SymbolType, RankType > & input );
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
@@ -112,11 +111,6 @@ void RankedSymbol < SymbolType, RankType >::compose( std::deque<sax::Token>& out
 	out.emplace_back(RankedSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-template < class SymbolType, class RankType >
-SymbolBase* RankedSymbol < SymbolType, RankType >::next() const {
-	return new RankedSymbol(this->m_symbol.next(), this->m_rank);
-}
-
 template < class SymbolType, class RankType >
 SymbolBase* RankedSymbol < SymbolType, RankType >::inc() && {
 	this->m_symbol.inc();
diff --git a/alib2data/src/alphabet/StartSymbol.cpp b/alib2data/src/alphabet/StartSymbol.cpp
index 0b7a2f0474f51cb55402206bcc1306d8fcfd78a0..28668e3a3fcf37f064fff6c277b2dd8f80f6e8af 100644
--- a/alib2data/src/alphabet/StartSymbol.cpp
+++ b/alib2data/src/alphabet/StartSymbol.cpp
@@ -52,10 +52,6 @@ void StartSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(StartSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-SymbolBase* StartSymbol::next() const {
-	return new UniqueSymbol(Symbol(*this), primitive::Integer(0));
-}
-
 SymbolBase* StartSymbol::inc() && {
 	return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/alphabet/StartSymbol.h b/alib2data/src/alphabet/StartSymbol.h
index 4b1d2b99c12d597d3dabbf86e54f7fd6ecf19cc6..3a322d3c8e61739dec66775273c5f888fd01b5f2 100644
--- a/alib2data/src/alphabet/StartSymbol.h
+++ b/alib2data/src/alphabet/StartSymbol.h
@@ -52,7 +52,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp b/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp
index c624215c6b6d13874bc55d5f4daa93b4bb93fbbd..b374d47678b91bc8d3bd39da970e716a08fbb91a 100644
--- a/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp
+++ b/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp
@@ -53,10 +53,6 @@ void SubtreeWildcardSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(SubtreeWildcardSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-SymbolBase* SubtreeWildcardSymbol::next() const {
-	return new UniqueSymbol(Symbol(*this), primitive::Integer(0));
-}
-
 SymbolBase* SubtreeWildcardSymbol::inc() && {
 	return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/alphabet/SubtreeWildcardSymbol.h b/alib2data/src/alphabet/SubtreeWildcardSymbol.h
index e13bafcab14a8bf3e9c0c46d586bccdf05542a9b..e820c63341df4b542f6f3cde21d02de0b8698bd7 100644
--- a/alib2data/src/alphabet/SubtreeWildcardSymbol.h
+++ b/alib2data/src/alphabet/SubtreeWildcardSymbol.h
@@ -54,7 +54,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/Symbol.cpp b/alib2data/src/alphabet/Symbol.cpp
index 44ef696abce3fa0af985290b64d2171f8bd609f3..a9453bcde036c14a39d7c39ea686f6ecc1ea4564 100644
--- a/alib2data/src/alphabet/Symbol.cpp
+++ b/alib2data/src/alphabet/Symbol.cpp
@@ -7,35 +7,12 @@
 
 #include "Symbol.h"
 #include "LabeledSymbol.h"
-#include <climits>
-#include "SymbolException.h"
 #include <core/xmlApi.hpp>
 
 namespace alphabet {
 
-Symbol Symbol::next ( ) const {
-	return Symbol ( this->getData ( ).next ( ) );
-}
-
 void Symbol::inc ( ) {
-	SymbolBase * res = std::move ( this->getData ( ) ).inc ( );
-
-	if ( res == NULL ) return;
-
-	this->setData ( res );
-}
-
-alphabet::Symbol createUniqueSymbol ( alphabet::Symbol attempt, const std::set < alphabet::Symbol > & terminalAlphabet, const std::set < alphabet::Symbol > & nonterminalAlphabet ) {
-	int i = 0;
-
-	do {
-		if ( ( terminalAlphabet.count ( attempt ) == 0 ) && ( nonterminalAlphabet.count ( attempt ) == 0 ) )
-			return attempt;
-
-		attempt.inc ( );
-	} while ( i++ < INT_MAX );
-
-	throw SymbolException ( "Could not create unique symbol." );
+	this->operator ++ ( );
 }
 
 alphabet::Symbol symbolFrom ( int number ) {
diff --git a/alib2data/src/alphabet/Symbol.h b/alib2data/src/alphabet/Symbol.h
index 50b0fe07218b23ecad81198cba9d4ed6fe3ad7d3..93f1f8555b260d20629ce6be1c763b73e9ce4478 100644
--- a/alib2data/src/alphabet/Symbol.h
+++ b/alib2data/src/alphabet/Symbol.h
@@ -23,7 +23,6 @@ class Symbol : public alib::WrapperBase < SymbolBase > {
 	using alib::WrapperBase < SymbolBase >::WrapperBase;
 
 public:
-	Symbol next ( ) const;
 	void inc ( );
 
 	static const std::string & getXmlTagRefName() {
@@ -33,15 +32,6 @@ public:
 	}
 };
 
-/**
- * Creates and adds unique state to grammar. If given state name is
- * already used, appends apostrophe or integer suffix
- * @param name name of the state
- * @throws AutomatonException if symbol could not be created
- * @return created symbol
- */
-alphabet::Symbol createUniqueSymbol ( alphabet::Symbol base, const std::set < alphabet::Symbol > & terminals, const std::set < alphabet::Symbol > & nonterminals );
-
 alphabet::Symbol symbolFrom ( int number );
 alphabet::Symbol symbolFrom ( char character );
 alphabet::Symbol symbolFrom ( std::string string );
diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h
index 19d3afc794722d86cc845290c6d14e852f92f706..11b11c2f46d67d4ac07725fedbcf4834664bad07 100644
--- a/alib2data/src/alphabet/SymbolBase.h
+++ b/alib2data/src/alphabet/SymbolBase.h
@@ -20,7 +20,6 @@ public:
 	virtual SymbolBase* clone() const = 0;
 	virtual SymbolBase* plunder() && = 0;
 
-	virtual SymbolBase* next() const = 0;
 	virtual SymbolBase* inc() && = 0;
 };
 
diff --git a/alib2data/src/alphabet/SymbolPairSymbol.cpp b/alib2data/src/alphabet/SymbolPairSymbol.cpp
index 9f468814878e373df38bb1250a9ba34851311561..537b321d7b52894a3e3d12071c2e6573a2a2c396 100644
--- a/alib2data/src/alphabet/SymbolPairSymbol.cpp
+++ b/alib2data/src/alphabet/SymbolPairSymbol.cpp
@@ -69,10 +69,6 @@ void SymbolPairSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(SymbolPairSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-SymbolBase* SymbolPairSymbol::next() const {
-	return new UniqueSymbol(Symbol(*this), primitive::Integer(0));
-}
-
 SymbolBase* SymbolPairSymbol::inc() && {
 	return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/alphabet/SymbolPairSymbol.h b/alib2data/src/alphabet/SymbolPairSymbol.h
index af1e8fc494bf273046f3607f7cd61aba2fc9cc75..9b98cdde0f8757b08129d8689abaf62438fdeb21 100644
--- a/alib2data/src/alphabet/SymbolPairSymbol.h
+++ b/alib2data/src/alphabet/SymbolPairSymbol.h
@@ -58,7 +58,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/SymbolSetSymbol.cpp b/alib2data/src/alphabet/SymbolSetSymbol.cpp
index e3d90fc8b112cd74eec13a0243b39182f9b24641..09538a10fef433a8ada10951d83c45a7e07940fa 100644
--- a/alib2data/src/alphabet/SymbolSetSymbol.cpp
+++ b/alib2data/src/alphabet/SymbolSetSymbol.cpp
@@ -73,10 +73,6 @@ void SymbolSetSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(SymbolSetSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-SymbolBase* SymbolSetSymbol::next() const {
-	return new UniqueSymbol(Symbol(*this), primitive::Integer(0));
-}
-
 SymbolBase* SymbolSetSymbol::inc() && {
 	return new UniqueSymbol(Symbol(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/alphabet/SymbolSetSymbol.h b/alib2data/src/alphabet/SymbolSetSymbol.h
index 0cb4005698832792123cc36176bdc3644e24c5b7..cee0ad9fc963d10b9969673de17ad18665005381 100644
--- a/alib2data/src/alphabet/SymbolSetSymbol.h
+++ b/alib2data/src/alphabet/SymbolSetSymbol.h
@@ -58,7 +58,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/UniqueSymbol.cpp b/alib2data/src/alphabet/UniqueSymbol.cpp
index 0286ea525a2fcb455994cfb04cb86e9577dd0dea..85aa4edfd0498293b03d1945ed63760380ef6e02 100644
--- a/alib2data/src/alphabet/UniqueSymbol.cpp
+++ b/alib2data/src/alphabet/UniqueSymbol.cpp
@@ -76,12 +76,8 @@ void UniqueSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(UniqueSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-SymbolBase* UniqueSymbol::next() const {
-	return new UniqueSymbol(m_symbol, m_id.next());
-}
-
 SymbolBase* UniqueSymbol::inc() && {
-	m_id.inc();
+	std::move(m_id).inc();
 	return NULL;
 }
 
diff --git a/alib2data/src/alphabet/UniqueSymbol.h b/alib2data/src/alphabet/UniqueSymbol.h
index 2194b8c3966e4a6bb17172586fa5511fe3c285b4..fbd2ee13fd52247aa8a0bc5b9a72bf49878f6ae0 100644
--- a/alib2data/src/alphabet/UniqueSymbol.h
+++ b/alib2data/src/alphabet/UniqueSymbol.h
@@ -63,7 +63,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/alphabet/VariablesBarSymbol.cpp b/alib2data/src/alphabet/VariablesBarSymbol.cpp
index 4b47037c55cca17bd96b196b8854976d6fe99c1c..f24a09228531aef67c87b88ac009e794b5746b52 100644
--- a/alib2data/src/alphabet/VariablesBarSymbol.cpp
+++ b/alib2data/src/alphabet/VariablesBarSymbol.cpp
@@ -53,10 +53,6 @@ void VariablesBarSymbol::compose ( std::deque < sax::Token > & out ) const {
 	out.emplace_back ( VariablesBarSymbol::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
 }
 
-SymbolBase * VariablesBarSymbol::next ( ) const {
-	return new UniqueSymbol ( Symbol ( * this ), primitive::Integer ( 0 ) );
-}
-
 SymbolBase * VariablesBarSymbol::inc ( ) && {
 	return new UniqueSymbol ( Symbol ( std::move ( * this ) ), primitive::Integer ( 0 ) );
 }
diff --git a/alib2data/src/alphabet/VariablesBarSymbol.h b/alib2data/src/alphabet/VariablesBarSymbol.h
index d09d19b43ccf68b0b9919f2374ec54c44f81b3f5..5f3d3671a2c842a251ca62edec7ff5dba848830f 100644
--- a/alib2data/src/alphabet/VariablesBarSymbol.h
+++ b/alib2data/src/alphabet/VariablesBarSymbol.h
@@ -54,7 +54,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual SymbolBase * next ( ) const;
 	virtual SymbolBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/automaton/FSM/CompactNFA.h b/alib2data/src/automaton/FSM/CompactNFA.h
index 3786afe47d9459100046cd5b151dfdf89be3ba7e..24f460cc6cb0fcc3f4e0b39fe9b1f172e741cb6c 100644
--- a/alib2data/src/automaton/FSM/CompactNFA.h
+++ b/alib2data/src/automaton/FSM/CompactNFA.h
@@ -15,6 +15,7 @@
 
 #include <core/components.hpp>
 #include <sax/FromXMLParserHelper.h>
+#include <common/createUnique.hpp>
 
 #include "../AutomatonBase.h"
 #include "../AutomatonFeatures.h"
@@ -199,7 +200,7 @@ CompactNFA < SymbolType, StateType >::CompactNFA ( const EpsilonNFA < > & other
 }
 
 template < class SymbolType, class StateType >
-CompactNFA < SymbolType, StateType >::CompactNFA ( const MultiInitialStateNFA < > & other ) : CompactNFA ( other.getStates ( ) + std::set < StateType > { label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
+CompactNFA < SymbolType, StateType >::CompactNFA ( const MultiInitialStateNFA < > & other ) : CompactNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
 	for ( const auto & transition : other.getTransitions ( ) ) {
 		std::pair < StateType, std::vector < SymbolType > > key = std::make_pair ( transition.first.first, std::vector < SymbolType > { transition.first.second } );
 		transitions[key] = transition.second;
diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.cpp b/alib2data/src/automaton/FSM/EpsilonNFA.cpp
index e5c35eca426c052609ee00f609903cf35c9dc418..42c130800e7f71b224af63b7ab2d66b41da85598 100644
--- a/alib2data/src/automaton/FSM/EpsilonNFA.cpp
+++ b/alib2data/src/automaton/FSM/EpsilonNFA.cpp
@@ -19,7 +19,7 @@ auto epsilonNFAParserRegister2 = xmlApi < alib::Object >::ParserRegister < autom
 
 auto EpsilonNFAFromDFA = castApi::CastRegister < automaton::EpsilonNFA < >, automaton::DFA < > > ( );
 auto EpsilonNFAFromNFA = castApi::CastRegister < automaton::EpsilonNFA < >, automaton::NFA < > > ( );
-// auto EpsilonNFAFromMultiInitialStateNFA = castApi::CastRegister < automaton::EpsilonNFA < >, automaton::MultiInitialStateNFA < > > ( ); TODO
+auto EpsilonNFAFromMultiInitialStateNFA = castApi::CastRegister < automaton::EpsilonNFA < >, automaton::MultiInitialStateNFA < > > ( );
 auto EpsilonNFACastBinder = castApi::CastPoolStringBinder < automaton::EpsilonNFA < > > ( automaton::EpsilonNFA < >::getXmlTagName() );
 
 } /* namespace alib */
diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.h b/alib2data/src/automaton/FSM/EpsilonNFA.h
index 72a18ea9b3a65ab17b5b2ba32dfdeb91b2f16244..98a82fab026c1d15b1c6aa520efd9337a6c5baf6 100644
--- a/alib2data/src/automaton/FSM/EpsilonNFA.h
+++ b/alib2data/src/automaton/FSM/EpsilonNFA.h
@@ -15,6 +15,7 @@
 
 #include <sax/FromXMLParserHelper.h>
 #include <core/components.hpp>
+#include <common/createUnique.hpp>
 
 #include "../AutomatonException.h"
 #include "../AutomatonBase.h"
@@ -22,6 +23,8 @@
 #include "../common/AutomatonFromXMLParser.h"
 #include "../common/AutomatonToXMLComposer.h"
 
+#include "../../label/InitialStateLabel.h"
+
 namespace automaton {
 
 /**
@@ -41,7 +44,7 @@ protected:
 public:
 	explicit EpsilonNFA ( StateType initialState );
 	explicit EpsilonNFA ( std::set < StateType > states, std::set < SymbolType > inputAlphabet, StateType initialState, std::set < StateType > finalStates );
-//	explicit EpsilonNFA ( const MultiInitialStateNFA < > & other ); TODO
+	explicit EpsilonNFA ( const MultiInitialStateNFA < > & other );
 	explicit EpsilonNFA ( const NFA<> & other );
 	explicit EpsilonNFA ( const DFA<> & other );
 
@@ -259,18 +262,18 @@ template<class SymbolType, class EpsilonType, class StateType >
 EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( StateType initialState ) : EpsilonNFA ( std::set < StateType > { initialState }, std::set < SymbolType > { }, initialState, std::set < StateType > { } ) {
 }
 
-/* TODO
+
 template<class SymbolType, class EpsilonType, class StateType >
-EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const MultiInitialStateNFA < > & other ) : EpsilonNFA ( other.getStates ( ) + std::set < StateType > { label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
+EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const MultiInitialStateNFA < > & other ) : EpsilonNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
 	for ( const auto & transition : other.getTransitions ( ) ) {
 		std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( transition.first.first, std::variant < EpsilonType, SymbolType > ( transition.first.second ) );
 		transitions[key] = transition.second;
 	}
 
-	std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( this->getInitialState ( ), std::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ) );
+	std::pair < StateType, std::variant < EpsilonType, SymbolType > > key = std::make_pair ( getInitialState ( ), std::variant < EpsilonType, SymbolType >::template from < EpsilonType > ( ) );
 	transitions[key] = other.getInitialStates ( );
 }
-*/
+
 
 template<class SymbolType, class EpsilonType, class StateType >
 EpsilonNFA < SymbolType, EpsilonType, StateType >::EpsilonNFA ( const NFA <> & other ) : EpsilonNFA ( other.getStates ( ), other.getInputAlphabet ( ), other.getInitialState ( ), other.getFinalStates ( ) ) {
diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.h b/alib2data/src/automaton/FSM/ExtendedNFA.h
index a99b3a9970a5d38ee8e560acfd12103bae4c19fa..ea66f192aa40026dcaa8bae074db5b74ce010925 100644
--- a/alib2data/src/automaton/FSM/ExtendedNFA.h
+++ b/alib2data/src/automaton/FSM/ExtendedNFA.h
@@ -15,6 +15,7 @@
 
 #include <sax/FromXMLParserHelper.h>
 #include <core/components.hpp>
+#include <common/createUnique.hpp>
 
 #include "../AutomatonException.h"
 #include "../AutomatonBase.h"
@@ -217,7 +218,7 @@ ExtendedNFA < SymbolType, StateType >::ExtendedNFA ( const EpsilonNFA < > & othe
 }
 
 template<class SymbolType, class StateType >
-ExtendedNFA < SymbolType, StateType >::ExtendedNFA ( const MultiInitialStateNFA < > & other ) : ExtendedNFA ( other.getStates ( ) + std::set < StateType > { label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), label::createUniqueLabel ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
+ExtendedNFA < SymbolType, StateType >::ExtendedNFA ( const MultiInitialStateNFA < > & other ) : ExtendedNFA ( other.getStates ( ) + std::set < StateType > { common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ) }, other.getInputAlphabet ( ), common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, other.getStates ( ) ), other.getFinalStates ( ) ) {
 	for ( const auto & transition : other.getTransitions ( ) ) {
 		std::pair < StateType, regexp::UnboundedRegExpStructure < SymbolType > > key = std::make_pair ( transition.first.first, regexp::UnboundedRegExpStructure < SymbolType > ( regexp::UnboundedRegExpSymbol < SymbolType > ( transition.first.second ) ) );
 		transitions[key] = transition.second;
diff --git a/alib2data/src/label/FailStateLabel.cpp b/alib2data/src/label/FailStateLabel.cpp
index 16e9b80be310b13182f900645bb016601103ebf8..50567d717d5fb3594ef03dc844e5c0a46fbb32b0 100644
--- a/alib2data/src/label/FailStateLabel.cpp
+++ b/alib2data/src/label/FailStateLabel.cpp
@@ -52,10 +52,6 @@ void FailStateLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(FailStateLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-LabelBase* FailStateLabel::next() const {
-	return new UniqueLabel(Label(*this), primitive::Integer(0));
-}
-
 LabelBase* FailStateLabel::inc() && {
 	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/label/FailStateLabel.h b/alib2data/src/label/FailStateLabel.h
index a7acb6519d082a9d10bebdd39cc3f5d33d57fc19..e5ec06158c7b32769564eced44397de22999d6ae 100644
--- a/alib2data/src/label/FailStateLabel.h
+++ b/alib2data/src/label/FailStateLabel.h
@@ -53,7 +53,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual LabelBase * next ( ) const;
 	virtual LabelBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/label/FinalStateLabel.cpp b/alib2data/src/label/FinalStateLabel.cpp
index 085bc8e238bb608a224118cca845324a2943d4d3..a7e2b97032e6344045b098768607877d3618977a 100644
--- a/alib2data/src/label/FinalStateLabel.cpp
+++ b/alib2data/src/label/FinalStateLabel.cpp
@@ -52,10 +52,6 @@ void FinalStateLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(FinalStateLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-LabelBase* FinalStateLabel::next() const {
-	return new UniqueLabel(Label(*this), primitive::Integer(0));
-}
-
 LabelBase* FinalStateLabel::inc() && {
 	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/label/FinalStateLabel.h b/alib2data/src/label/FinalStateLabel.h
index cb2b69a17a0b87da1e19a75ec255049001eb81f0..037c26a618f56f76502bf0f62f93c2d12254ade6 100644
--- a/alib2data/src/label/FinalStateLabel.h
+++ b/alib2data/src/label/FinalStateLabel.h
@@ -53,7 +53,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual LabelBase * next ( ) const;
 	virtual LabelBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/label/HexavigesimalLabel.cpp b/alib2data/src/label/HexavigesimalLabel.cpp
index 2ba50c0c02579e2dfeba644429928689a8137e12..106cce5d7a735036e2952799cdd79db599cd8287 100644
--- a/alib2data/src/label/HexavigesimalLabel.cpp
+++ b/alib2data/src/label/HexavigesimalLabel.cpp
@@ -58,10 +58,6 @@ void HexavigesimalLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(HexavigesimalLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-LabelBase* HexavigesimalLabel::next() const {
-	return new HexavigesimalLabel(m_hexavigesimal + 1);
-}
-
 LabelBase* HexavigesimalLabel::inc() && {
 	m_hexavigesimal++;
 	return NULL;
diff --git a/alib2data/src/label/HexavigesimalLabel.h b/alib2data/src/label/HexavigesimalLabel.h
index f3135e7e7ba19569e4556998c826d97ec05325f7..ec2fc9efb6d31aa45506751750a5e37543f54ded 100644
--- a/alib2data/src/label/HexavigesimalLabel.h
+++ b/alib2data/src/label/HexavigesimalLabel.h
@@ -61,7 +61,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual LabelBase * next ( ) const;
 	virtual LabelBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/label/InitialStateLabel.cpp b/alib2data/src/label/InitialStateLabel.cpp
index 0fcf418d933393a1c2be6b011e1c53f2b3ebc568..92a5f7a75d065781836f715621530d3b5acf648e 100644
--- a/alib2data/src/label/InitialStateLabel.cpp
+++ b/alib2data/src/label/InitialStateLabel.cpp
@@ -52,10 +52,6 @@ void InitialStateLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(InitialStateLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-LabelBase* InitialStateLabel::next() const {
-	return new UniqueLabel(Label(*this), primitive::Integer(0));
-}
-
 LabelBase* InitialStateLabel::inc() && {
 	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/label/InitialStateLabel.h b/alib2data/src/label/InitialStateLabel.h
index d5ea7a506838224793f04261ba98fd6e2b9fb534..0db1bc89a7bc9589961caf9559a509077df8cf5c 100644
--- a/alib2data/src/label/InitialStateLabel.h
+++ b/alib2data/src/label/InitialStateLabel.h
@@ -53,7 +53,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual LabelBase * next ( ) const;
 	virtual LabelBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/label/LR0ItemsLabel.cpp b/alib2data/src/label/LR0ItemsLabel.cpp
index aeed4b08a8ae9884ea8b2d39127ee54aafde2c0d..971cf9b92d2d59edd06d4834733e4b8f5edc08e8 100644
--- a/alib2data/src/label/LR0ItemsLabel.cpp
+++ b/alib2data/src/label/LR0ItemsLabel.cpp
@@ -69,10 +69,6 @@ void LR0ItemsLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back ( LR0ItemsLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT );
 }
 
-LabelBase* LR0ItemsLabel::next ( ) const {
-	return new UniqueLabel ( Label ( *this ), primitive::Integer ( 0 ) );
-}
-
 LabelBase* LR0ItemsLabel::inc ( ) && {
 	return new UniqueLabel ( Label ( std::move ( *this ) ), primitive::Integer ( 0 ) );
 }
diff --git a/alib2data/src/label/LR0ItemsLabel.h b/alib2data/src/label/LR0ItemsLabel.h
index 78deb3994603d21b742f58af82dd6c869f639fcc..e04e7116c0e8f3efc7754095c6ab4c452fe5a32b 100644
--- a/alib2data/src/label/LR0ItemsLabel.h
+++ b/alib2data/src/label/LR0ItemsLabel.h
@@ -76,7 +76,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual LabelBase * next ( ) const;
 	virtual LabelBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/label/Label.cpp b/alib2data/src/label/Label.cpp
index 9c4b29bd6c0b96da03db3f6bd7dab01072611966..50a597a393d46b23b792c75ba62ee98e9c113604 100644
--- a/alib2data/src/label/Label.cpp
+++ b/alib2data/src/label/Label.cpp
@@ -10,34 +10,11 @@
 #include "LabelPairLabel.h"
 #include <primitive/Primitive.h>
 #include <core/xmlApi.hpp>
-#include <exception/CommonException.h>
-#include <climits>
 
 namespace label {
 
-Label Label::next ( ) const {
-	return Label ( this->getData ( ).next ( ) );
-}
-
 void Label::inc ( ) {
-	LabelBase * res = std::move ( this->getData ( ) ).inc ( );
-
-	if ( res == NULL ) return;
-
-	this->setData ( res );
-}
-
-label::Label createUniqueLabel ( label::Label nextState, const std::set < label::Label > & other ) {
-	int i = 0;
-
-	do {
-		if ( other.count ( nextState ) == 0 )
-			return nextState;
-
-		nextState.inc ( );
-	} while ( i++ < INT_MAX );
-
-	throw exception::CommonException ( "Could not create unique label." );
+	this->operator ++ ();
 }
 
 label::Label labelFrom ( int number ) {
diff --git a/alib2data/src/label/Label.h b/alib2data/src/label/Label.h
index 7897fa6679feb6453e69c2fc8f232ff97bbd1ef0..65e19cc719d2f5422f5195f1d6afe83aa38e2c9c 100644
--- a/alib2data/src/label/Label.h
+++ b/alib2data/src/label/Label.h
@@ -22,7 +22,6 @@ class Label : public alib::WrapperBase < LabelBase > {
 	using alib::WrapperBase < LabelBase >::WrapperBase;
 
 public:
-	Label next ( ) const;
 	void inc ( );
 
 	static const std::string & getXmlTagRefName() {
@@ -32,8 +31,6 @@ public:
 	}
 };
 
-label::Label createUniqueLabel ( label::Label base, const std::set < label::Label > & other );
-
 label::Label labelFrom ( label::Label label1, label::Label label2 );
 label::Label labelFrom ( int number );
 label::Label labelFrom ( int number1, int number2 );
diff --git a/alib2data/src/label/LabelBase.h b/alib2data/src/label/LabelBase.h
index 4e301f90fe146962ec8a54e2cad17076dcafd5ac..9acd07d6b74f3504ee168360d0f1abe91511ee6a 100644
--- a/alib2data/src/label/LabelBase.h
+++ b/alib2data/src/label/LabelBase.h
@@ -20,7 +20,6 @@ public:
 	virtual LabelBase* clone() const = 0;
 	virtual LabelBase* plunder() && = 0;
 
-	virtual LabelBase* next() const = 0;
 	virtual LabelBase* inc() && = 0;
 };
 
diff --git a/alib2data/src/label/LabelPairLabel.cpp b/alib2data/src/label/LabelPairLabel.cpp
index 21fe6068b983dbff765bb694df500acdc49a0f7f..4b1a0c1a6034295c9f56ca811f5f8aeea96bf41d 100644
--- a/alib2data/src/label/LabelPairLabel.cpp
+++ b/alib2data/src/label/LabelPairLabel.cpp
@@ -69,10 +69,6 @@ void LabelPairLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(LabelPairLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-LabelBase* LabelPairLabel::next() const {
-	return new UniqueLabel(Label(*this), primitive::Integer(0));
-}
-
 LabelBase* LabelPairLabel::inc() && {
 	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/label/LabelPairLabel.h b/alib2data/src/label/LabelPairLabel.h
index e57d94b9ae0cb6f2426ada54322efb0db5d0e0e0..a7eb054078d22260c211522661f6c7a48405e675 100644
--- a/alib2data/src/label/LabelPairLabel.h
+++ b/alib2data/src/label/LabelPairLabel.h
@@ -58,7 +58,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual LabelBase * next ( ) const;
 	virtual LabelBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/label/LabelSetLabel.cpp b/alib2data/src/label/LabelSetLabel.cpp
index b42840dbf4a5300c233f624ae55bf9f09e0b04f4..69976e3708e1017959d4c2652d707b286288dfab 100644
--- a/alib2data/src/label/LabelSetLabel.cpp
+++ b/alib2data/src/label/LabelSetLabel.cpp
@@ -74,10 +74,6 @@ void LabelSetLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(LabelSetLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-LabelBase* LabelSetLabel::next() const {
-	return new UniqueLabel(Label(*this), primitive::Integer(0));
-}
-
 LabelBase* LabelSetLabel::inc() && {
 	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/label/LabelSetLabel.h b/alib2data/src/label/LabelSetLabel.h
index 4fe385513dc1a21f0009aaea814092d754abc210..3f6a3d11096fe36a6f69a2174fa61c4163373345 100644
--- a/alib2data/src/label/LabelSetLabel.h
+++ b/alib2data/src/label/LabelSetLabel.h
@@ -58,7 +58,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual LabelBase * next ( ) const;
 	virtual LabelBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/label/ObjectLabel.cpp b/alib2data/src/label/ObjectLabel.cpp
index bbdfbb518a486e54e62c9f72443f2c0fa1b8d8b8..67de15198dd918d03591aec4dfd64df214311652 100644
--- a/alib2data/src/label/ObjectLabel.cpp
+++ b/alib2data/src/label/ObjectLabel.cpp
@@ -55,10 +55,6 @@ void ObjectLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(ObjectLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-LabelBase* ObjectLabel::next() const {
-	return new UniqueLabel(Label(*this), primitive::Integer(0));
-}
-
 LabelBase* ObjectLabel::inc() && {
 	return new UniqueLabel(Label(std::move(*this)), primitive::Integer(0));
 }
diff --git a/alib2data/src/label/ObjectLabel.h b/alib2data/src/label/ObjectLabel.h
index ffc449de3e59e57bec20b6ef5c45cae7c5c8b7c9..0ef6fe33913b92b696cd3098d010de6e452600d0 100644
--- a/alib2data/src/label/ObjectLabel.h
+++ b/alib2data/src/label/ObjectLabel.h
@@ -59,7 +59,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual LabelBase * next ( ) const;
 	virtual LabelBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/label/PrimitiveLabel.cpp b/alib2data/src/label/PrimitiveLabel.cpp
index da424a14d84bc479b35a65d10db01b2b4cbf5dc9..281e544ee173319acdfaf07677082a423bba6519 100644
--- a/alib2data/src/label/PrimitiveLabel.cpp
+++ b/alib2data/src/label/PrimitiveLabel.cpp
@@ -59,10 +59,6 @@ void PrimitiveLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(PrimitiveLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-LabelBase* PrimitiveLabel::next() const {
-	return new PrimitiveLabel(m_primitive.next());
-}
-
 LabelBase* PrimitiveLabel::inc() && {
 	m_primitive.inc();
 	return NULL;
diff --git a/alib2data/src/label/PrimitiveLabel.h b/alib2data/src/label/PrimitiveLabel.h
index 889abfda31bf064c1c10d08661521336e4f8fdfc..cc84f9b888e63106f793acbb4171379ef37c689d 100644
--- a/alib2data/src/label/PrimitiveLabel.h
+++ b/alib2data/src/label/PrimitiveLabel.h
@@ -61,7 +61,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual LabelBase * next ( ) const;
 	virtual LabelBase * inc ( ) &&;
 };
 
diff --git a/alib2data/src/label/UniqueLabel.cpp b/alib2data/src/label/UniqueLabel.cpp
index 5e5a82834ce2756a381a056de93492e8117808de..6839764cb77ce7a4a92067dbcc178b91400cdf2c 100644
--- a/alib2data/src/label/UniqueLabel.cpp
+++ b/alib2data/src/label/UniqueLabel.cpp
@@ -76,12 +76,8 @@ void UniqueLabel::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(UniqueLabel::getXmlTagName(), sax::Token::TokenType::END_ELEMENT);
 }
 
-LabelBase* UniqueLabel::next() const {
-	return new UniqueLabel(m_label, m_id.next());
-}
-
 LabelBase* UniqueLabel::inc() && {
-	m_id.inc();
+	std::move(m_id).inc();
 	return NULL;
 }
 
diff --git a/alib2data/src/label/UniqueLabel.h b/alib2data/src/label/UniqueLabel.h
index 63cd3e77994d3989e5e12a21aa12b196c6aa0728..b24fd45678f45cd994a874c83d73be638ac4d972 100644
--- a/alib2data/src/label/UniqueLabel.h
+++ b/alib2data/src/label/UniqueLabel.h
@@ -63,7 +63,6 @@ public:
 
 	void compose ( std::deque < sax::Token > & out ) const;
 
-	virtual LabelBase * next ( ) const;
 	virtual LabelBase * inc ( ) &&;
 };