From e908bf1eda9a4a519123307692276cf2a497c7ff Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Sun, 13 Nov 2016 21:23:46 +0100
Subject: [PATCH] use new createUnique approach

---
 .../src/automaton/convert/ToGrammarLeftRG.cpp |  5 ++--
 .../automaton/convert/ToGrammarRightRG.cpp    |  5 ++--
 .../convert/ToRegExpStateElimination.cpp      |  6 +++--
 alib2algo/src/automaton/simplify/Total.cpp    |  5 ++--
 .../AutomataUnionEpsilonTransition.cpp        |  7 +++---
 .../transform/AutomatonIteration.cpp          |  5 ++--
 .../AutomatonIterationEpsilonTransition.cpp   |  3 ++-
 .../src/automaton/transform/PDAToRHPDA.cpp    | 17 +++++++------
 alib2algo/src/grammar/convert/ToAutomaton.cpp |  6 +++--
 .../src/grammar/convert/ToGrammarLeftRG.cpp   |  3 ++-
 .../src/grammar/convert/ToGrammarRightRG.cpp  |  3 ++-
 .../grammar/parsing/AbsorbTerminalSymbol.cpp  |  3 ++-
 alib2algo/src/grammar/parsing/LRParser.cpp    |  5 ++--
 .../src/grammar/parsing/LeftFactorize.cpp     |  3 ++-
 .../grammar/simplify/LeftRecursionRemover.cpp |  3 ++-
 alib2algo/src/grammar/simplify/ToCNF.cpp      |  9 ++++---
 alib2algo/src/grammar/simplify/ToGNF.cpp      |  3 ++-
 .../convert/ToGrammarRightRGDerivation.cpp    |  3 ++-
 .../grammar/parsing/AbsorbTerminalSymbol.cpp  |  8 +++---
 .../parsing/HandleFirstFollowConflict.cpp     |  6 ++---
 .../GrammarLeftRecursionRemoverTest.cpp       |  9 ++++---
 .../grammar/simplify/GrammarToGNFTest.cpp     | 21 ++++++++--------
 alib2common/src/base/WrapperBase.hpp          | 10 ++++++++
 alib2common/src/primitive/Bool.cpp            |  7 ++----
 alib2common/src/primitive/Bool.h              |  3 +--
 alib2common/src/primitive/Character.cpp       |  7 ++----
 alib2common/src/primitive/Character.h         |  3 +--
 alib2common/src/primitive/Integer.cpp         |  7 ++----
 alib2common/src/primitive/Integer.h           |  3 +--
 alib2common/src/primitive/Primitive.cpp       |  9 +------
 alib2common/src/primitive/Primitive.h         |  1 -
 alib2common/src/primitive/PrimitiveBase.h     |  2 +-
 alib2common/src/primitive/String.cpp          |  7 ++----
 alib2common/src/primitive/String.h            |  3 +--
 alib2common/src/primitive/Unsigned.cpp        |  7 ++----
 alib2common/src/primitive/Unsigned.h          |  3 +--
 alib2data/src/alphabet/BarSymbol.cpp          |  4 ---
 alib2data/src/alphabet/BarSymbol.h            |  1 -
 alib2data/src/alphabet/BlankSymbol.cpp        |  4 ---
 alib2data/src/alphabet/BlankSymbol.h          |  1 -
 .../src/alphabet/BottomOfTheStackSymbol.cpp   |  4 ---
 .../src/alphabet/BottomOfTheStackSymbol.h     |  1 -
 alib2data/src/alphabet/EndSymbol.cpp          |  4 ---
 alib2data/src/alphabet/EndSymbol.h            |  1 -
 alib2data/src/alphabet/LabeledSymbol.cpp      |  4 ---
 alib2data/src/alphabet/LabeledSymbol.h        |  1 -
 .../src/alphabet/NonlinearVariableSymbol.cpp  |  4 ---
 .../src/alphabet/NonlinearVariableSymbol.h    |  1 -
 alib2data/src/alphabet/RankedSymbol.h         |  6 -----
 alib2data/src/alphabet/StartSymbol.cpp        |  4 ---
 alib2data/src/alphabet/StartSymbol.h          |  1 -
 .../src/alphabet/SubtreeWildcardSymbol.cpp    |  4 ---
 .../src/alphabet/SubtreeWildcardSymbol.h      |  1 -
 alib2data/src/alphabet/Symbol.cpp             | 25 +------------------
 alib2data/src/alphabet/Symbol.h               | 10 --------
 alib2data/src/alphabet/SymbolBase.h           |  1 -
 alib2data/src/alphabet/SymbolPairSymbol.cpp   |  4 ---
 alib2data/src/alphabet/SymbolPairSymbol.h     |  1 -
 alib2data/src/alphabet/SymbolSetSymbol.cpp    |  4 ---
 alib2data/src/alphabet/SymbolSetSymbol.h      |  1 -
 alib2data/src/alphabet/UniqueSymbol.cpp       |  6 +----
 alib2data/src/alphabet/UniqueSymbol.h         |  1 -
 alib2data/src/alphabet/VariablesBarSymbol.cpp |  4 ---
 alib2data/src/alphabet/VariablesBarSymbol.h   |  1 -
 alib2data/src/automaton/FSM/CompactNFA.h      |  3 ++-
 alib2data/src/automaton/FSM/EpsilonNFA.cpp    |  2 +-
 alib2data/src/automaton/FSM/EpsilonNFA.h      | 13 ++++++----
 alib2data/src/automaton/FSM/ExtendedNFA.h     |  3 ++-
 alib2data/src/label/FailStateLabel.cpp        |  4 ---
 alib2data/src/label/FailStateLabel.h          |  1 -
 alib2data/src/label/FinalStateLabel.cpp       |  4 ---
 alib2data/src/label/FinalStateLabel.h         |  1 -
 alib2data/src/label/HexavigesimalLabel.cpp    |  4 ---
 alib2data/src/label/HexavigesimalLabel.h      |  1 -
 alib2data/src/label/InitialStateLabel.cpp     |  4 ---
 alib2data/src/label/InitialStateLabel.h       |  1 -
 alib2data/src/label/LR0ItemsLabel.cpp         |  4 ---
 alib2data/src/label/LR0ItemsLabel.h           |  1 -
 alib2data/src/label/Label.cpp                 | 25 +------------------
 alib2data/src/label/Label.h                   |  3 ---
 alib2data/src/label/LabelBase.h               |  1 -
 alib2data/src/label/LabelPairLabel.cpp        |  4 ---
 alib2data/src/label/LabelPairLabel.h          |  1 -
 alib2data/src/label/LabelSetLabel.cpp         |  4 ---
 alib2data/src/label/LabelSetLabel.h           |  1 -
 alib2data/src/label/ObjectLabel.cpp           |  4 ---
 alib2data/src/label/ObjectLabel.h             |  1 -
 alib2data/src/label/PrimitiveLabel.cpp        |  4 ---
 alib2data/src/label/PrimitiveLabel.h          |  1 -
 alib2data/src/label/UniqueLabel.cpp           |  6 +----
 alib2data/src/label/UniqueLabel.h             |  1 -
 91 files changed, 124 insertions(+), 292 deletions(-)

diff --git a/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp b/alib2algo/src/automaton/convert/ToGrammarLeftRG.cpp
index 87a5f55bfb..ab9278fd56 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 a8ea9e281e..5f16e6f98d 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 17b6d64bf7..240a20ad24 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 a0cf558eea..99c8ac5fa9 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 b636b0e4f8..e4f8c7b6da 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 704657ba66..b298142286 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 d73327dcce..c0a49d1f1b 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 a573c8a76a..008e876c99 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 e4e8da96a9..e1c7aab5be 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 ced00f9e09..3b7659b4a2 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 74a132e8d0..d7c9b0e10d 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 85788374b5..c7449c555a 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 66a34c7ad6..7f2e02fd94 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 a802810ea5..0016f1a2ef 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 ce92b6aeae..dea34db7fa 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 c6bc18486f..2d88f8c92a 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 a1d6c5e027..2612150f25 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 02c716c4d6..6c771f85f1 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 5857ccda28..7de89773ec 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 a5916eb856..559e16a390 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 f2d52b932c..445aa9a5c3 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 50ef9c98ba..9a6a25e903 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 af3d469d68..5384672094 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 7075c1b5b9..067301de95 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 eae50fff10..6b10404bd2 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 dd6cc85cb9..3c43143269 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 c80ed46cb2..1ff9d4a451 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 ae9b0013e8..03dce0f6c5 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 6ad4fec405..55a0f641aa 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 a87b35dd4d..bee63bbfd1 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 8f3c61d797..4bb0971e19 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 ae47adac52..a7bd39c2ec 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 c70588f88b..38d18e52a8 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 371fc901e3..6be80b664e 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 d4b899c5b0..487e96fb31 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 627e54cd17..d8a718007d 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 1575208790..f9d267a094 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 684ecd1cc0..f01113bc6e 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 595820943f..e250d84a12 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 102eec43e8..d3e9540b47 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 761a90eb40..8b54944099 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 a745d7e366..9eda130ede 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 db2ccb5ebf..9879d7cd59 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 428628553c..d2b77c40ff 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 dde8bf7d73..121690acd9 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 bdefe486dd..0e209446bb 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 7315b0d968..0553135e53 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 abf2125fc4..4a5a35c149 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 282234ac40..dae75a6675 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 0b7a2f0474..28668e3a3f 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 4b1d2b99c1..3a322d3c8e 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 c624215c6b..b374d47678 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 e13bafcab1..e820c63341 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 44ef696abc..a9453bcde0 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 50b0fe0721..93f1f8555b 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 19d3afc794..11b11c2f46 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 9f46881487..537b321d7b 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 af1e8fc494..9b98cdde0f 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 e3d90fc8b1..09538a10fe 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 0cb4005698..cee0ad9fc9 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 0286ea525a..85aa4edfd0 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 2194b8c396..fbd2ee13fd 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 4b47037c55..f24a092285 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 d09d19b43c..5f3d3671a2 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 3786afe47d..24f460cc6c 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 e5c35eca42..42c130800e 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 72a18ea9b3..98a82fab02 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 a99b3a9970..ea66f192aa 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 16e9b80be3..50567d717d 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 a7acb6519d..e5ec06158c 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 085bc8e238..a7e2b97032 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 cb2b69a17a..037c26a618 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 2ba50c0c02..106cce5d7a 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 f3135e7e7b..ec2fc9efb6 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 0fcf418d93..92a5f7a75d 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 d5ea7a5068..0db1bc89a7 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 aeed4b08a8..971cf9b92d 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 78deb39946..e04e7116c0 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 9c4b29bd6c..50a597a393 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 7897fa6679..65e19cc719 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 4e301f90fe..9acd07d6b7 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 21fe6068b9..4b1a0c1a60 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 e57d94b9ae..a7eb054078 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 b42840dbf4..69976e3708 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 4fe385513d..3f6a3d1109 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 bbdfbb518a..67de15198d 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 ffc449de3e..0ef6fe3391 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 da424a14d8..281e544ee1 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 889abfda31..cc84f9b888 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 5e5a82834c..6839764cb7 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 63cd3e7799..b24fd45678 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 ( ) &&;
 };
 
-- 
GitLab