diff --git a/alib2data/src/alphabet/BarSymbol.cpp b/alib2data/src/alphabet/BarSymbol.cpp
index bf5aab78a903e436962c401ee4c4db26278ed31a..0034c9926058bd72cc14c0861618305faa5f7c50 100644
--- a/alib2data/src/alphabet/BarSymbol.cpp
+++ b/alib2data/src/alphabet/BarSymbol.cpp
@@ -10,6 +10,7 @@
 #include "Symbol.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
@@ -52,6 +53,14 @@ void BarSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(BarSymbol::XML_TAG_NAME, 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));
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/BarSymbol.h b/alib2data/src/alphabet/BarSymbol.h
index 583e837c8888f0770e284f89be07f5a68936ff29..8c5351e1f0d9d08a907ec8cd22a83556a29cb249 100644
--- a/alib2data/src/alphabet/BarSymbol.h
+++ b/alib2data/src/alphabet/BarSymbol.h
@@ -47,6 +47,9 @@ public:
 	static BarSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/BlankSymbol.cpp b/alib2data/src/alphabet/BlankSymbol.cpp
index 34e4e0f10759f715e326c103c9d28ba7f0cb024f..1cdb3c1caac35574a538c32bc8663c2d7cb4602f 100644
--- a/alib2data/src/alphabet/BlankSymbol.cpp
+++ b/alib2data/src/alphabet/BlankSymbol.cpp
@@ -10,6 +10,7 @@
 #include "Symbol.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
@@ -52,6 +53,14 @@ void BlankSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(BlankSymbol::XML_TAG_NAME, 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));
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/BlankSymbol.h b/alib2data/src/alphabet/BlankSymbol.h
index b6a75a4301367dd5529a3d1a0a34029bf61bbb82..697898b9e6036a9db6deb008dcd22a815b10e295 100644
--- a/alib2data/src/alphabet/BlankSymbol.h
+++ b/alib2data/src/alphabet/BlankSymbol.h
@@ -47,6 +47,9 @@ public:
 	static BlankSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp b/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp
index ba80fc1b08af54146d3e58b3345abcc5c83cf4b2..ac67c6caed265e107d4f29a7904d10fa45d7b319 100644
--- a/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp
+++ b/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp
@@ -10,6 +10,7 @@
 #include "Symbol.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
@@ -52,6 +53,14 @@ void BottomOfTheStackSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(BottomOfTheStackSymbol::XML_TAG_NAME, 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));
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/BottomOfTheStackSymbol.h b/alib2data/src/alphabet/BottomOfTheStackSymbol.h
index 8b468c37758f56f3a8290f5b514cb441adb403a3..f78466c47dac2d9fcae2de07f25f39a2f08f4ae7 100644
--- a/alib2data/src/alphabet/BottomOfTheStackSymbol.h
+++ b/alib2data/src/alphabet/BottomOfTheStackSymbol.h
@@ -47,6 +47,9 @@ public:
 	static BottomOfTheStackSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/EndSymbol.cpp b/alib2data/src/alphabet/EndSymbol.cpp
index 4b3c9949f7390894425b773d0b72a5e9663921cb..33bc477708756c709cde8722078b01c564d1caa8 100644
--- a/alib2data/src/alphabet/EndSymbol.cpp
+++ b/alib2data/src/alphabet/EndSymbol.cpp
@@ -10,6 +10,7 @@
 #include "Symbol.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
@@ -52,6 +53,14 @@ void EndSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(EndSymbol::XML_TAG_NAME, 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));
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/EndSymbol.h b/alib2data/src/alphabet/EndSymbol.h
index 88bd0bca19282cba77894be0204fa8c8a50df042..eff07cbd0e94a1e8e17e4256a1b08ed8ea36c85a 100644
--- a/alib2data/src/alphabet/EndSymbol.h
+++ b/alib2data/src/alphabet/EndSymbol.h
@@ -47,6 +47,9 @@ public:
 	static EndSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/LabeledSymbol.cpp b/alib2data/src/alphabet/LabeledSymbol.cpp
index eef5c9924ca98bd31630898a8230b94741a54238..2c7fba541de55de80289a9cee072c98137777607 100644
--- a/alib2data/src/alphabet/LabeledSymbol.cpp
+++ b/alib2data/src/alphabet/LabeledSymbol.cpp
@@ -72,6 +72,15 @@ void LabeledSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(LabeledSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
 }
 
+SymbolBase* LabeledSymbol::next() const {
+	return new LabeledSymbol(label.next());
+}
+
+SymbolBase* LabeledSymbol::inc() && {
+	label.inc();
+	return NULL;
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/LabeledSymbol.h b/alib2data/src/alphabet/LabeledSymbol.h
index 59a1f623623f2bac360fe040337e145345756e6b..0f3b5e30b3693289fdc9ed59122e22263667cb9d 100644
--- a/alib2data/src/alphabet/LabeledSymbol.h
+++ b/alib2data/src/alphabet/LabeledSymbol.h
@@ -60,6 +60,9 @@ public:
 	static LabeledSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/NextSymbol.cpp b/alib2data/src/alphabet/NextSymbol.cpp
deleted file mode 100644
index 6b371c4b876dab81d1f72ecbbcfcdc4090edc183..0000000000000000000000000000000000000000
--- a/alib2data/src/alphabet/NextSymbol.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * NextSymbol.cpp
- *
- *  Created on: Nov 23, 2013
- *      Author: Jan Travnicek
- */
-
-#include "NextSymbol.h"
-#include "LabeledSymbol.h"
-#include "RankedSymbol.h"
-#include "SymbolPairSymbol.h"
-#include "SymbolSetSymbol.h"
-#include "UniqueSymbol.h"
-#include "BlankSymbol.h"
-#include "BottomOfTheStackSymbol.h"
-#include "EndSymbol.h"
-#include "StartSymbol.h"
-#include "BarSymbol.h"
-#include "VariablesBarSymbol.h"
-#include "SubtreeWildcardSymbol.h"
-
-namespace alphabet {
-
-void NextSymbol::Visit(void* userData, const LabeledSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(LabeledSymbol(symbol.getLabel().next()));
-}
-
-void NextSymbol::Visit(void*, LabeledSymbol& symbol) const {
-	symbol.getLabel().inc();
-}
-
-void NextSymbol::Visit(void* userData, const BlankSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, BlankSymbol&) const {
-	Symbol &out = *((Symbol*) userData);
-
-	out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, const BottomOfTheStackSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, BottomOfTheStackSymbol&) const {
-	Symbol &out = *((Symbol*) userData);
-
-	out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, const EndSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, EndSymbol&) const {
-	Symbol &out = *((Symbol*) userData);
-
-	out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, const StartSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, StartSymbol&) const {
-	Symbol &out = *((Symbol*) userData);
-
-	out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, const RankedSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, RankedSymbol&) const {
-	Symbol &out = *((Symbol*) userData);
-
-	out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, const BarSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, BarSymbol&) const {
-	Symbol &out = *((Symbol*) userData);
-
-	out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, const VariablesBarSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, VariablesBarSymbol&) const {
-	Symbol &out = *((Symbol*) userData);
-
-	out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, const SubtreeWildcardSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, SubtreeWildcardSymbol&) const {
-	Symbol &out = *((Symbol*) userData);
-
-	out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, const SymbolPairSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, SymbolPairSymbol&) const {
-	Symbol &out = *((Symbol*) userData);
-
-	out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, const SymbolSetSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(Symbol(symbol), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, SymbolSetSymbol&) const {
-	Symbol &out = *((Symbol*) userData);
-
-	out = Symbol(UniqueSymbol(std::move(out), primitive::Integer(0)));
-}
-
-void NextSymbol::Visit(void* userData, const UniqueSymbol& symbol) const {
-	Symbol* &out = *((Symbol**) userData);
-
-	out = new Symbol(UniqueSymbol(symbol.getSymbol(), symbol.getId().next()));
-}
-
-void NextSymbol::Visit(void*, UniqueSymbol& symbol) const {
-	symbol.getId().setData(symbol.getId().getData() + 1);
-}
-
-Symbol NextSymbol::nextSymbol(const Symbol& symbol) {
-	Symbol* out;
-	symbol.getData().Accept((void*) &out, NextSymbol::NEXT_SYMBOL);
-
-	Symbol nextSymbol(std::move(*out));
-	delete out;
-	return std::move(nextSymbol);
-}
-
-void NextSymbol::nextSymbol(Symbol& symbol) {
-	symbol.getData().Accept((void*) &symbol, NextSymbol::NEXT_SYMBOL);
-}
-
-const NextSymbol NextSymbol::NEXT_SYMBOL;
-
-} /* namespace alphabet */
diff --git a/alib2data/src/alphabet/NextSymbol.h b/alib2data/src/alphabet/NextSymbol.h
deleted file mode 100644
index b9170192704e1b7ac974dfecc3a960047ff17bfe..0000000000000000000000000000000000000000
--- a/alib2data/src/alphabet/NextSymbol.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * NextSymbol.h
- *
- *  Created on: Nov 23, 2013
- *      Author: Jan Travnciek
- */
-
-#ifndef NEXT_SYMBOL_H_
-#define NEXT_SYMBOL_H_
-
-#include "SymbolFeatures.h"
-#include "SymbolBase.h"
-
-namespace alphabet {
-
-/**
- * This class contains methods to print XML representation of string to the output stream.
- */
-class NextSymbol : public VisitableSymbolBase::const_visitor_type, public VisitableSymbolBase::visitor_type {
-	void Visit(void*, const LabeledSymbol& symbol) const;
-	void Visit(void*, LabeledSymbol& symbol) const;
-
-	void Visit(void*, const BlankSymbol& symbol) const;
-	void Visit(void*, BlankSymbol& symbol) const;
-
-	void Visit(void*, const BottomOfTheStackSymbol& symbol) const;
-	void Visit(void*, BottomOfTheStackSymbol& symbol) const;
-
-	void Visit(void*, const EndSymbol& symbol) const;
-	void Visit(void*, EndSymbol& symbol) const;
-
-	void Visit(void*, const StartSymbol& symbol) const;
-	void Visit(void*, StartSymbol& symbol) const;
-
-	void Visit(void*, const RankedSymbol& symbol) const;
-	void Visit(void*, RankedSymbol& symbol) const;
-
-	void Visit(void*, const BarSymbol& symbol) const;
-	void Visit(void*, BarSymbol& symbol) const;
-
-	void Visit(void*, const VariablesBarSymbol& symbol) const;
-	void Visit(void*, VariablesBarSymbol& symbol) const;
-
-	void Visit(void*, const SubtreeWildcardSymbol& symbol) const;
-	void Visit(void*, SubtreeWildcardSymbol& symbol) const;
-
-	void Visit(void*, const SymbolPairSymbol& symbol) const;
-	void Visit(void*, SymbolPairSymbol& symbol) const;
-
-	void Visit(void*, const SymbolSetSymbol& symbol) const;
-	void Visit(void*, SymbolSetSymbol& symbol) const;
-
-	void Visit(void*, const UniqueSymbol& symbol) const;
-	void Visit(void*, UniqueSymbol& symbol) const;
-
-public:
-	NextSymbol() {}
-
-	/**
-	 * Prints XML representation of String to the output stream.
-	 * @param string String to print
-	 * @param out output stream to which print the String
-	 */
-	static Symbol nextSymbol(const Symbol& symbol);
-	static void nextSymbol(Symbol& symbol);
-
-	static const NextSymbol NEXT_SYMBOL;
-};
-
-} /* namespace alphabet */
-
-#endif /* NEXT_SYMBOL_H_ */
diff --git a/alib2data/src/alphabet/RankedSymbol.cpp b/alib2data/src/alphabet/RankedSymbol.cpp
index 5388b2776de3e76dd74582e82c6b19a0c9cc00db..b01754fa706a0ccf5c1127813a85bd1b364e69f1 100644
--- a/alib2data/src/alphabet/RankedSymbol.cpp
+++ b/alib2data/src/alphabet/RankedSymbol.cpp
@@ -80,6 +80,15 @@ void RankedSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(RankedSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
 }
 
+SymbolBase* RankedSymbol::next() const {
+	return new RankedSymbol(symbol.next(), rank);
+}
+
+SymbolBase* RankedSymbol::inc() && {
+	symbol.inc();
+	return NULL;
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h
index ba973d7a5d130b3aa4bf4af951f5ccd268fe409d..570e62804005a2ea8d7e953fd8b2b85e78f258b9 100644
--- a/alib2data/src/alphabet/RankedSymbol.h
+++ b/alib2data/src/alphabet/RankedSymbol.h
@@ -66,6 +66,9 @@ public:
 	static RankedSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/StartSymbol.cpp b/alib2data/src/alphabet/StartSymbol.cpp
index 12a0555bb3c56ed9a65fcb3fa835d31f2c0331f6..2809d1d671d9723ea0b37744824cc8494396d5c4 100644
--- a/alib2data/src/alphabet/StartSymbol.cpp
+++ b/alib2data/src/alphabet/StartSymbol.cpp
@@ -10,6 +10,7 @@
 #include "Symbol.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
@@ -52,6 +53,14 @@ void StartSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(StartSymbol::XML_TAG_NAME, 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));
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/StartSymbol.h b/alib2data/src/alphabet/StartSymbol.h
index 284cebe1fb263d52d107c9cdc4decbb0024f5801..6b953c67662bbd125e8123fd3b67897c01bbbc09 100644
--- a/alib2data/src/alphabet/StartSymbol.h
+++ b/alib2data/src/alphabet/StartSymbol.h
@@ -47,6 +47,9 @@ public:
 	static StartSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp b/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp
index 0b39fd401d5436154edaea636d1a32d2698a47fc..48066a997fc037b069646b747812d1ed989cb986 100644
--- a/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp
+++ b/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp
@@ -10,6 +10,7 @@
 #include "Symbol.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
@@ -52,6 +53,14 @@ void SubtreeWildcardSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(SubtreeWildcardSymbol::XML_TAG_NAME, 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));
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/SubtreeWildcardSymbol.h b/alib2data/src/alphabet/SubtreeWildcardSymbol.h
index b3a218a8f632e58b1acdda8d7d00210f39d1697c..8a171f25cfe43b0b6b9f39e513b5f27c02da5eaa 100644
--- a/alib2data/src/alphabet/SubtreeWildcardSymbol.h
+++ b/alib2data/src/alphabet/SubtreeWildcardSymbol.h
@@ -47,6 +47,9 @@ public:
 	static SubtreeWildcardSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/Symbol.cpp b/alib2data/src/alphabet/Symbol.cpp
index 6a8377d69da48b654285549c48615f55f899a079..aa807a8540c84ec6a47ed96714b3327cfebe4da9 100644
--- a/alib2data/src/alphabet/Symbol.cpp
+++ b/alib2data/src/alphabet/Symbol.cpp
@@ -6,17 +6,26 @@
  */
 
 #include "Symbol.h"
-#include "NextSymbol.h"
 #include "LabeledSymbol.h"
 #include <climits>
 #include "../exception/AlibException.h"
 
 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 {
-		NextSymbol::nextSymbol(attempt);
+		attempt.inc();
 		if(terminalAlphabet.count(attempt) == 0 && nonterminalAlphabet.count(attempt) == 0)
 			return attempt;
 	} while(++i < INT_MAX);
diff --git a/alib2data/src/alphabet/Symbol.h b/alib2data/src/alphabet/Symbol.h
index a2bee2e591b03e38131ac8fadad60ed3abf26113..0d6dc592561d9d2a8c13df8621ea766503145d5b 100644
--- a/alib2data/src/alphabet/Symbol.h
+++ b/alib2data/src/alphabet/Symbol.h
@@ -22,6 +22,10 @@ namespace alphabet {
  */
 class Symbol : public alib::wrapper<SymbolBase>, public alib::WrapperBase {
 	using alib::wrapper<SymbolBase>::wrapper;
+
+public:
+	Symbol next() const;
+	void inc();
 };
 
 /**
diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h
index 3847a3aef9805a2d5c0f9c9230b7cbfec53082cb..6678117536c00729cebfc26d4a1393f6a1426954 100644
--- a/alib2data/src/alphabet/SymbolBase.h
+++ b/alib2data/src/alphabet/SymbolBase.h
@@ -41,6 +41,9 @@ public:
 
 	virtual SymbolBase* clone() const = 0;
 	virtual SymbolBase* plunder() && = 0;
+
+	virtual SymbolBase* next() const = 0;
+	virtual SymbolBase* inc() && = 0;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolPairSymbol.cpp b/alib2data/src/alphabet/SymbolPairSymbol.cpp
index beee6b3120515013e74e93e3442da42658bf01ee..7115f47487ff0ee10cd54a3e92197f9472e5ecc1 100644
--- a/alib2data/src/alphabet/SymbolPairSymbol.cpp
+++ b/alib2data/src/alphabet/SymbolPairSymbol.cpp
@@ -11,6 +11,7 @@
 #include "Symbol.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
@@ -70,6 +71,14 @@ void SymbolPairSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(SymbolPairSymbol::XML_TAG_NAME, 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));
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/SymbolPairSymbol.h b/alib2data/src/alphabet/SymbolPairSymbol.h
index 64324ef1615d2a8bb9196073c6fe87804da28a50..45de96964f8f9e8b7f7cb38d069d72e77d0da05d 100644
--- a/alib2data/src/alphabet/SymbolPairSymbol.h
+++ b/alib2data/src/alphabet/SymbolPairSymbol.h
@@ -55,6 +55,9 @@ public:
 	static SymbolPairSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolSetSymbol.cpp b/alib2data/src/alphabet/SymbolSetSymbol.cpp
index a3cbdb5a8d82aed8db5d8afab806d46525ff3084..14ce18816c00120f99248143425f9f438e9deb2c 100644
--- a/alib2data/src/alphabet/SymbolSetSymbol.cpp
+++ b/alib2data/src/alphabet/SymbolSetSymbol.cpp
@@ -10,6 +10,7 @@
 #include "../sax/FromXMLParserHelper.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
@@ -74,6 +75,14 @@ void SymbolSetSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(SymbolSetSymbol::XML_TAG_NAME, 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));
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/SymbolSetSymbol.h b/alib2data/src/alphabet/SymbolSetSymbol.h
index 201871b8ea3b072a8457403162fd42f603f8faa7..b5a59ef07587e3af4b44dac0c0b1a97adae92980 100644
--- a/alib2data/src/alphabet/SymbolSetSymbol.h
+++ b/alib2data/src/alphabet/SymbolSetSymbol.h
@@ -55,6 +55,9 @@ public:
 	static SymbolSetSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/UniqueSymbol.cpp b/alib2data/src/alphabet/UniqueSymbol.cpp
index 3d2ab7c31429a8b563d83af59badb4487cf02aed..9c2917a8db909a1ff4b8f5fa5ca49fbddede5e75 100644
--- a/alib2data/src/alphabet/UniqueSymbol.cpp
+++ b/alib2data/src/alphabet/UniqueSymbol.cpp
@@ -78,6 +78,15 @@ void UniqueSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(UniqueSymbol::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT);
 }
 
+SymbolBase* UniqueSymbol::next() const {
+	return new UniqueSymbol(symbol, id.next());
+}
+
+SymbolBase* UniqueSymbol::inc() && {
+	id.inc();
+	return NULL;
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/UniqueSymbol.h b/alib2data/src/alphabet/UniqueSymbol.h
index c7b66ceb1aa2489ce23b66cdd67453ee480ad4fc..ebf2b294342923fc4d241c8f94089b9a704b9741 100644
--- a/alib2data/src/alphabet/UniqueSymbol.h
+++ b/alib2data/src/alphabet/UniqueSymbol.h
@@ -60,6 +60,9 @@ public:
 	static UniqueSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/VariablesBarSymbol.cpp b/alib2data/src/alphabet/VariablesBarSymbol.cpp
index 0d36d3a2df4f844b6cd36552174938f3d68ca4bb..53318373a285cd6c203afd315db9ee85bdcc21db 100644
--- a/alib2data/src/alphabet/VariablesBarSymbol.cpp
+++ b/alib2data/src/alphabet/VariablesBarSymbol.cpp
@@ -10,6 +10,7 @@
 #include "Symbol.h"
 #include "../object/Object.h"
 #include "../XmlApi.hpp"
+#include "UniqueSymbol.h"
 
 namespace alphabet {
 
@@ -52,6 +53,14 @@ void VariablesBarSymbol::compose(std::deque<sax::Token>& out) const {
 	out.emplace_back(VariablesBarSymbol::XML_TAG_NAME, 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));
+}
+
 } /* namespace alphabet */
 
 namespace alib {
diff --git a/alib2data/src/alphabet/VariablesBarSymbol.h b/alib2data/src/alphabet/VariablesBarSymbol.h
index 9baccc7789c40b520e039ea29a78b6d7dd6dff82..c8c639f882c0341b4b7f55565adb65aaf4e18998 100644
--- a/alib2data/src/alphabet/VariablesBarSymbol.h
+++ b/alib2data/src/alphabet/VariablesBarSymbol.h
@@ -47,6 +47,9 @@ public:
 	static VariablesBarSymbol parse(std::deque<sax::Token>::iterator& input);
 
 	void compose(std::deque<sax::Token>& out) const;
+
+	virtual SymbolBase* next() const;
+	virtual SymbolBase* inc() &&;
 };
 
 } /* namespace alphabet */