diff --git a/alib2data/src/alphabet/LabeledSymbol.cpp b/alib2data/src/alphabet/LabeledSymbol.cpp
index ddc46cc9e93555b2b625832650e9f386fcbc0d08..2c3617488d2fc8a04692c5a618b32ebcd101c166 100644
--- a/alib2data/src/alphabet/LabeledSymbol.cpp
+++ b/alib2data/src/alphabet/LabeledSymbol.cpp
@@ -17,15 +17,11 @@ LabeledSymbol::LabeledSymbol(char character) : label(label::labelFrom(character)
 
 }
 
-LabeledSymbol::LabeledSymbol(const std::string& label) : label(label::labelFrom(label)) {
+LabeledSymbol::LabeledSymbol(std::string label) : label(label::labelFrom(std::move(label))) {
 
 }
 
-LabeledSymbol::LabeledSymbol(const label::Label& label) : label(label) {
-
-}
-
-LabeledSymbol::LabeledSymbol(label::Label&& label) : label(std::move(label)) {
+LabeledSymbol::LabeledSymbol(label::Label label) : label(std::move(label)) {
 
 }
 
diff --git a/alib2data/src/alphabet/LabeledSymbol.h b/alib2data/src/alphabet/LabeledSymbol.h
index a7bd502ed9259c14ab12ff9aa2b731bd6dc7030b..7a60729ea4b0e0b38f9496f9edb6f3ebb9310b2b 100644
--- a/alib2data/src/alphabet/LabeledSymbol.h
+++ b/alib2data/src/alphabet/LabeledSymbol.h
@@ -20,18 +20,17 @@ namespace alphabet {
 class LabeledSymbol : public std::acceptor<LabeledSymbol, VisitableSymbolBase, std::acceptor<LabeledSymbol, alib::VisitableObjectBase, SymbolBase> > {
 protected:
 	label::Label label;
-	
+
 public:
 	explicit LabeledSymbol(int number);
 	explicit LabeledSymbol(char character);
-	explicit LabeledSymbol(const std::string& label);
+	explicit LabeledSymbol(std::string label);
 
 	/**
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit LabeledSymbol(const label::Label& label);
-	explicit LabeledSymbol(label::Label&& label);
+	explicit LabeledSymbol(label::Label label);
 
 	virtual SymbolBase* clone() const;
 	virtual SymbolBase* plunder() &&;
diff --git a/alib2data/src/alphabet/RankedBarSymbol.cpp b/alib2data/src/alphabet/RankedBarSymbol.cpp
index b9ad90876bed298506c8273a5b557c3bc6595505..cc8554e7694ea8ba6110a63188d80f375c2e594e 100644
--- a/alib2data/src/alphabet/RankedBarSymbol.cpp
+++ b/alib2data/src/alphabet/RankedBarSymbol.cpp
@@ -13,7 +13,7 @@ RankedBarSymbol::RankedBarSymbol(int rank) : rank(primitive::Integer(rank)) {
 
 }
 
-RankedBarSymbol::RankedBarSymbol(const primitive::Integer& rank) : rank(rank) {
+RankedBarSymbol::RankedBarSymbol(primitive::Integer rank) : rank(std::move(rank)) {
 
 }
 
diff --git a/alib2data/src/alphabet/RankedBarSymbol.h b/alib2data/src/alphabet/RankedBarSymbol.h
index 4c6479bb3db378f64453d5b306570304fa1833cd..82a5360125a73fda66e42929a332090bca9e5b08 100644
--- a/alib2data/src/alphabet/RankedBarSymbol.h
+++ b/alib2data/src/alphabet/RankedBarSymbol.h
@@ -24,7 +24,7 @@ public:
 	 * @param symbol name of the symbol
 	 */
 	explicit RankedBarSymbol(int rank);
-	explicit RankedBarSymbol(const primitive::Integer& rank);
+	explicit RankedBarSymbol(primitive::Integer rank);
 
 	virtual SymbolBase* clone() const;
 	virtual SymbolBase* plunder() &&;
diff --git a/alib2data/src/alphabet/RankedSymbol.cpp b/alib2data/src/alphabet/RankedSymbol.cpp
index 32eee892522e03fe076dcae7fbe8bae1e2861896..a0a14968e2be4e10ef6dd8bead780876ed1231a0 100644
--- a/alib2data/src/alphabet/RankedSymbol.cpp
+++ b/alib2data/src/alphabet/RankedSymbol.cpp
@@ -17,15 +17,11 @@ RankedSymbol::RankedSymbol(char character, int rank) : label(label::labelFrom(ch
 
 }
 
-RankedSymbol::RankedSymbol(const std::string& label, int rank) : label(label::labelFrom(label)), rank(primitive::Integer(rank)) {
+RankedSymbol::RankedSymbol(std::string label, int rank) : label(label::labelFrom(std::move(label))), rank(primitive::Integer(rank)) {
 
 }
 
-RankedSymbol::RankedSymbol(const label::Label& label, const primitive::Integer& rank) : label(label), rank(rank) {
-
-}
-
-RankedSymbol::RankedSymbol(label::Label&& label, primitive::Integer&& rank) : label(std::move(label)), rank(std::move(rank)) {
+RankedSymbol::RankedSymbol(label::Label label, primitive::Integer rank) : label(std::move(label)), rank(std::move(rank)) {
 
 }
 
diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h
index aab04969a5d30d7d4135761e9f3090f2e7c8a8dd..96ab7921a6a2dd6018e22e4620be4ddeba2c89cd 100644
--- a/alib2data/src/alphabet/RankedSymbol.h
+++ b/alib2data/src/alphabet/RankedSymbol.h
@@ -26,15 +26,14 @@ protected:
 public:
 	explicit RankedSymbol(int number, int rank);
 	explicit RankedSymbol(char character, int rank);
-	explicit RankedSymbol(const std::string& label, int rank);
+	explicit RankedSymbol(std::string label, int rank);
 
 	/**
 	 * Creates new symbol with given name and rank.
 	 * @param symbol name of the symbol
 	 * @param rank of the symbol
 	 */
-	explicit RankedSymbol(const label::Label& label, const primitive::Integer& rank);
-	explicit RankedSymbol(label::Label&& label, primitive::Integer&& rank);
+	explicit RankedSymbol(label::Label label, primitive::Integer rank);
 
 	virtual SymbolBase* clone() const;
 	virtual SymbolBase* plunder() &&;
diff --git a/alib2data/src/alphabet/Symbol.cpp b/alib2data/src/alphabet/Symbol.cpp
index 9fd53443cc3609d7fcbf9f25418c1541517c9692..53cc40ceffb5e9be90e6af41c2d7f8279498ba2a 100644
--- a/alib2data/src/alphabet/Symbol.cpp
+++ b/alib2data/src/alphabet/Symbol.cpp
@@ -36,8 +36,8 @@ alphabet::Symbol symbolFrom( char character ) {
 	return alphabet::Symbol { alphabet::LabeledSymbol { label::labelFrom ( character ) } };
 }
 
-alphabet::Symbol symbolFrom( const std::string& string ) {
-	return alphabet::Symbol { alphabet::LabeledSymbol { label::labelFrom ( string ) } };
+alphabet::Symbol symbolFrom( std::string string ) {
+	return alphabet::Symbol { alphabet::LabeledSymbol { label::labelFrom ( std::move( string ) ) } };
 }
 
 alphabet::Symbol symbolFrom( const char* string ) {
diff --git a/alib2data/src/alphabet/Symbol.h b/alib2data/src/alphabet/Symbol.h
index ec8fddcfd9fb448b7a5249275168be01538cd39c..7ed432233d51056790b6d4b34eec2f5ad0bfb9fb 100644
--- a/alib2data/src/alphabet/Symbol.h
+++ b/alib2data/src/alphabet/Symbol.h
@@ -34,7 +34,7 @@ alphabet::Symbol createUniqueSymbol(const alphabet::Symbol& base, const std::set
 
 alphabet::Symbol symbolFrom(int number);
 alphabet::Symbol symbolFrom(char character);
-alphabet::Symbol symbolFrom(const std::string& string);
+alphabet::Symbol symbolFrom(std::string string);
 alphabet::Symbol symbolFrom(const char* string);
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolPairSymbol.cpp b/alib2data/src/alphabet/SymbolPairSymbol.cpp
index 2b920d7052d2643b5b49398add290f971b3c7442..247598e259b369ec33a0b541a81a8e7dbee2f0f5 100644
--- a/alib2data/src/alphabet/SymbolPairSymbol.cpp
+++ b/alib2data/src/alphabet/SymbolPairSymbol.cpp
@@ -11,11 +11,7 @@
 
 namespace alphabet {
 
-SymbolPairSymbol::SymbolPairSymbol(const std::pair<Symbol, Symbol>& symbol) : symbol(std::move(symbol)) {
-
-}
-
-SymbolPairSymbol::SymbolPairSymbol(std::pair<Symbol, Symbol>&& symbol) : symbol(std::move(symbol)) {
+SymbolPairSymbol::SymbolPairSymbol(std::pair<Symbol, Symbol> symbol) : symbol(std::move(symbol)) {
 
 }
 
diff --git a/alib2data/src/alphabet/SymbolPairSymbol.h b/alib2data/src/alphabet/SymbolPairSymbol.h
index eea27dc43b44fc564c3ae30e49682e15d1773af2..66d0b15bf1ce8197da6d7db3365664a4bce6f99c 100644
--- a/alib2data/src/alphabet/SymbolPairSymbol.h
+++ b/alib2data/src/alphabet/SymbolPairSymbol.h
@@ -29,9 +29,7 @@ public:
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit SymbolPairSymbol(const std::pair<Symbol, Symbol>& symbol);
-
-	explicit SymbolPairSymbol(std::pair<Symbol, Symbol>&& symbol);
+	explicit SymbolPairSymbol(std::pair<Symbol, Symbol> symbol);
 
 	virtual SymbolBase* clone() const;
 
diff --git a/alib2data/src/alphabet/SymbolSetSymbol.cpp b/alib2data/src/alphabet/SymbolSetSymbol.cpp
index 179bb9d6befe3251c8177303107dc37a44c4b584..ebc35d6eb9e8d0de2085cbbb09fb49b02da50ee4 100644
--- a/alib2data/src/alphabet/SymbolSetSymbol.cpp
+++ b/alib2data/src/alphabet/SymbolSetSymbol.cpp
@@ -11,11 +11,7 @@
 
 namespace alphabet {
 
-SymbolSetSymbol::SymbolSetSymbol(const std::set<Symbol>& symbol) : symbol(symbol) {
-
-}
-
-SymbolSetSymbol::SymbolSetSymbol(std::set<Symbol>&& symbol) : symbol(std::move(symbol)) {
+SymbolSetSymbol::SymbolSetSymbol(std::set<Symbol> symbol) : symbol(std::move(symbol)) {
 
 }
 
diff --git a/alib2data/src/alphabet/SymbolSetSymbol.h b/alib2data/src/alphabet/SymbolSetSymbol.h
index 99596f2254874a1166757abef18d934cf121fb6d..bf13997816fb64c88f116e0bd5539c8c330d1c26 100644
--- a/alib2data/src/alphabet/SymbolSetSymbol.h
+++ b/alib2data/src/alphabet/SymbolSetSymbol.h
@@ -29,9 +29,7 @@ public:
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit SymbolSetSymbol(const std::set<Symbol>& symbol);
-
-	explicit SymbolSetSymbol(std::set<Symbol>&& symbol);
+	explicit SymbolSetSymbol(std::set<Symbol> symbol);
 
 	virtual SymbolBase* clone() const;
 
diff --git a/alib2data/src/alphabet/UniqueSymbol.cpp b/alib2data/src/alphabet/UniqueSymbol.cpp
index 50a6c04da3278ca9535ef8c73358bf28cbff50a3..c5ef63b65fa04fb696d8a0e8b6a9a5f1b6414091 100644
--- a/alib2data/src/alphabet/UniqueSymbol.cpp
+++ b/alib2data/src/alphabet/UniqueSymbol.cpp
@@ -11,7 +11,7 @@
 
 namespace alphabet {
 
-UniqueSymbol::UniqueSymbol(const Symbol& symbol, const primitive::Integer& id) : symbol(symbol), id(id) {
+UniqueSymbol::UniqueSymbol(Symbol symbol, primitive::Integer id) : symbol(std::move(symbol)), id(std::move(id)) {
 
 }
 
diff --git a/alib2data/src/alphabet/UniqueSymbol.h b/alib2data/src/alphabet/UniqueSymbol.h
index e8d75a7887e136e6da6b33a4972ff5531c016ac6..6c33af0d474d27c3a514a256c46e4c639fc29291 100644
--- a/alib2data/src/alphabet/UniqueSymbol.h
+++ b/alib2data/src/alphabet/UniqueSymbol.h
@@ -31,7 +31,7 @@ public:
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit UniqueSymbol(const Symbol& symbol, const primitive::Integer& id);
+	explicit UniqueSymbol(Symbol symbol, primitive::Integer id);
 
 	virtual SymbolBase* clone() const;
 
diff --git a/alib2data/src/automaton/FSM/CompactNFA.cpp b/alib2data/src/automaton/FSM/CompactNFA.cpp
index 7de169a84e2ae9c7b6ad8fcc522a70e4f2291cd0..377b2322fa3b0283c2c66e2c54befd9926f079fa 100644
--- a/alib2data/src/automaton/FSM/CompactNFA.cpp
+++ b/alib2data/src/automaton/FSM/CompactNFA.cpp
@@ -20,7 +20,7 @@
 
 namespace automaton {
 
-CompactNFA::CompactNFA(const State& initialState) : SingleInitialState(initialState) {
+CompactNFA::CompactNFA(State initialState) : SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -105,11 +105,11 @@ bool CompactNFA::removeInputSymbol(const alphabet::Symbol& symbol) {
 	return inputAlphabet.erase(symbol);
 }
 
-bool CompactNFA::addTransition(const State& from, const string::LinearString& input, const State& to) {
+bool CompactNFA::addTransition(State from, string::LinearString input, State to) {
 	if (states.find(from) == states.end())
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 
-	std::set<alphabet::Symbol> inputStringAlphabet = input.getAlphabet();
+	const std::set<alphabet::Symbol>& inputStringAlphabet = input.getAlphabet();
 
 	// Transition regexp's alphabet must be subset of automaton's alphabet
 	if (inputStringAlphabet.size() > 0 && ! std::includes(inputAlphabet.begin(), inputAlphabet.end(), inputStringAlphabet.begin(), inputStringAlphabet.end()))
@@ -118,9 +118,9 @@ bool CompactNFA::addTransition(const State& from, const string::LinearString& in
 	if (states.find(to) == states.end())
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 
-	std::pair<State, string::LinearString> key = std::make_pair(from, input);
+	std::pair<State, string::LinearString> key = std::make_pair(std::move(from), std::move(input));
 
-	return transitions[key].insert(to).second;
+	return transitions[std::move(key)].insert(std::move(to)).second;
 }
 
 bool CompactNFA::removeTransition(const State& from, const string::LinearString& input, const State& to) {
diff --git a/alib2data/src/automaton/FSM/CompactNFA.h b/alib2data/src/automaton/FSM/CompactNFA.h
index 0650bf0423b4c74ec1896042f41595d97c7ece4c..bd7560526125ef53897c0bec1c43634914f58f90 100644
--- a/alib2data/src/automaton/FSM/CompactNFA.h
+++ b/alib2data/src/automaton/FSM/CompactNFA.h
@@ -28,14 +28,14 @@ class CompactNFA : public std::acceptor<CompactNFA, VisitableAutomatonBase, std:
 protected:
 	std::map<std::pair<State, string::LinearString>, std::set<State> > transitions;
 public:
-	explicit CompactNFA(const State& initialState);
+	explicit CompactNFA(State initialState);
 	explicit CompactNFA(const EpsilonNFA& other);
 	explicit CompactNFA(const MultiInitialStateNFA& other);
 	explicit CompactNFA(const NFA& other);
 	explicit CompactNFA(const DFA& other);
-	
+
 	virtual AutomatonBase* clone() const;
-	
+
 	virtual AutomatonBase* plunder() &&;
 
 	/**
@@ -47,7 +47,7 @@ public:
 	 * @copydoc Automaton::removeInputSymbol(const Symbol&)
 	 */
 	virtual bool removeInputSymbol(const alphabet::Symbol& symbol);
-	
+
 	/**
 	 * Adds transition defined by parameters to the automaton.
 	 * @param current current state
@@ -55,7 +55,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addTransition(const State& current, const string::LinearString& input, const State& next);
+	bool addTransition(State current, string::LinearString input, State next);
 
 	/**
 	 * Removes transition from the automaton.
@@ -73,7 +73,7 @@ public:
 	 * @return automaton transitions from state
 	 */
 	std::map<std::pair<State, string::LinearString>, std::set<State>> getTransitionsFromState(const State& from) const;
-	
+
 	/**
 	 * @return automaton transitions to state
 	 */
diff --git a/alib2data/src/automaton/FSM/DFA.cpp b/alib2data/src/automaton/FSM/DFA.cpp
index cffffdd7b994d1a08d98f9875aa9541a8b46c761..469d7fbd6e4c8976a642bf2693f42d1b43b3865c 100644
--- a/alib2data/src/automaton/FSM/DFA.cpp
+++ b/alib2data/src/automaton/FSM/DFA.cpp
@@ -14,7 +14,7 @@
 
 namespace automaton {
 
-DFA::DFA(const State& initialState) : SingleInitialState(initialState) {
+DFA::DFA(State initialState) : SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -53,7 +53,7 @@ bool DFA::removeInputSymbol(const alphabet::Symbol& symbol) {
 
 }
 
-bool DFA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) {
+bool DFA::addTransition(State from, alphabet::Symbol input, State to) {
 	if (states.find(from) == states.end())
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 
@@ -63,18 +63,18 @@ bool DFA::addTransition(const State& from, const alphabet::Symbol& input, const
 	if (states.find(to) == states.end())
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 
-	std::pair<State, alphabet::Symbol> key = std::make_pair(from, input);
+	std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input));
 
 	if (transitions.find(key) != transitions.end()) {
 		if(transitions.find(key)->second == to)
 			return false;
 		else
 			throw AutomatonException(
-				"Transition from this state and symbol already exists (\"" + (std::string) from.getName() + "\", \"" + (std::string) input + "\") -> \"" + (std::string) to.getName()
+				"Transition from this state and symbol already exists (\"" + (std::string) key.first.getName() + "\", \"" + (std::string) key.second + "\") -> \"" + (std::string) to.getName()
 						+ "\".");
 	}
 
-	transitions.insert(std::make_pair(key, to));
+	transitions.insert(std::make_pair(std::move(key), std::move(to)));
 	return true;
 }
 
diff --git a/alib2data/src/automaton/FSM/DFA.h b/alib2data/src/automaton/FSM/DFA.h
index 3264fd3c7bf1460039bd0690bc4dbd16bd8f4412..b50399469b8ddefcc45e687213c6010037a11611 100644
--- a/alib2data/src/automaton/FSM/DFA.h
+++ b/alib2data/src/automaton/FSM/DFA.h
@@ -24,7 +24,7 @@ class DFA : public std::acceptor<DFA, VisitableAutomatonBase, std::acceptor<DFA,
 protected:
 	std::map<std::pair<State, alphabet::Symbol>, State> transitions;
 public:
-	explicit DFA(const State& initialState);
+	explicit DFA(State initialState);
 
 	virtual AutomatonBase* clone() const;
 
@@ -47,7 +47,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addTransition(const State& current, const alphabet::Symbol& input, const State& next);
+	bool addTransition(State current, alphabet::Symbol input, const State next);
 
 	/**
 	 * Removes transition from the automaton.
diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.cpp b/alib2data/src/automaton/FSM/EpsilonNFA.cpp
index 284910659e921d813b2084fad4eabbe786f8a607..7f8f4c2153f52468314c8c14ed894e01020b5763 100644
--- a/alib2data/src/automaton/FSM/EpsilonNFA.cpp
+++ b/alib2data/src/automaton/FSM/EpsilonNFA.cpp
@@ -17,7 +17,7 @@
 
 namespace automaton {
 
-EpsilonNFA::EpsilonNFA(const State& initialState) : SingleInitialState(initialState) {
+EpsilonNFA::EpsilonNFA(State initialState) : SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -89,7 +89,7 @@ bool EpsilonNFA::removeInputSymbol(const alphabet::Symbol& symbol) {
 	return inputAlphabet.erase(symbol);
 }
 
-bool EpsilonNFA::addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to) {
+bool EpsilonNFA::addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to) {
 	if (states.find(from) == states.end())
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 
@@ -99,32 +99,32 @@ bool EpsilonNFA::addTransition(const State& from, const std::variant<string::Eps
 	if (states.find(to) == states.end())
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 
-	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> > key = std::make_pair(from, input);
+	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> > key = std::make_pair(std::move(from), std::move(input));
 
-	return transitions[key].insert(to).second;
+	return transitions[std::move(key)].insert(std::move(to)).second;
 }
 
-bool EpsilonNFA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) {
-	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addTransition(from, inputVariant, to);
+bool EpsilonNFA::addTransition(State from, alphabet::Symbol input, State to) {
+	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input));
+	return addTransition(std::move(from), std::move(inputVariant), std::move(to));
 }
 
-bool EpsilonNFA::addTransition(const State& from, const State& to) {
+bool EpsilonNFA::addTransition(State from, State to) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addTransition(from, inputVariant, to);
+	return addTransition(std::move(from), std::move(inputVariant), std::move(to));
 }
 
 bool EpsilonNFA::removeTransition(const State& from, const alphabet::Symbol& input, const State& to) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
 	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> > key = std::make_pair(from, inputVariant);
-	
+
 	return transitions[key].erase(to);
 }
 
 bool EpsilonNFA::removeTransition(const State& from, const State& to) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
 	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> > key = std::make_pair(from, inputVariant);
-	
+
 	return transitions[key].erase(to);
 }
 
diff --git a/alib2data/src/automaton/FSM/EpsilonNFA.h b/alib2data/src/automaton/FSM/EpsilonNFA.h
index 807727492d54eeb6650192a2715768bd572080b1..b81c21ca578551bbb1d9cbc26e5d185ec69d0520 100644
--- a/alib2data/src/automaton/FSM/EpsilonNFA.h
+++ b/alib2data/src/automaton/FSM/EpsilonNFA.h
@@ -29,13 +29,13 @@ class EpsilonNFA : public std::acceptor<EpsilonNFA, VisitableAutomatonBase, std:
 protected:
 	std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> >, std::set<State> > transitions;
 public:
-	explicit EpsilonNFA(const State& initialState);
+	explicit EpsilonNFA(State initialState);
 	explicit EpsilonNFA(const MultiInitialStateNFA& other);
 	explicit EpsilonNFA(const NFA& other);
 	explicit EpsilonNFA(const DFA& other);
 
 	virtual AutomatonBase* clone() const;
-	
+
 	virtual AutomatonBase* plunder() &&;
 
 	/**
@@ -47,7 +47,7 @@ public:
 	 * @copydoc Automaton::removeInputSymbol(const Symbol&)
 	 */
 	virtual bool removeInputSymbol(const alphabet::Symbol& symbol);
-	
+
 	/**
 	 * Adds transition defined by parameters to the automaton.
 	 * @param current current state
@@ -55,7 +55,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to);
+	bool addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to);
 
 	/**
 	 * Adds transition defined by parameters to the automaton.
@@ -64,7 +64,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addTransition(const State& from, const alphabet::Symbol& input, const State& to);
+	bool addTransition(State from, alphabet::Symbol input, State to);
 
 	/**
 	 * Adds transition defined by parameters to the automaton.
@@ -72,7 +72,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addTransition(const State& from, const State& to);
+	bool addTransition(State from, State to);
 
 	/**
 	 * Removes transition from the automaton.
@@ -92,7 +92,7 @@ public:
 	 * @return automaton transitions
 	 */
 	const std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> >, std::set<State> >& getTransitions() const;
-	
+
 	/**
 	 * @return automaton epsilon transitions
 	 */
@@ -108,7 +108,7 @@ public:
 	 * @return automaton transitions from state
 	 */
 	std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> >, std::set<State> > getTransitionsFromState(const State& from) const;
-	
+
 	/**
 	 * @return automaton epsilon transitions from state
 	 */
@@ -118,12 +118,12 @@ public:
 	 * @return automaton transitions from state reading some symbols
 	 */
 	std::map<std::pair<State, alphabet::Symbol>, std::set<State> > getSymbolTransitionsFromState(const State& from) const;
-	
+
 	/**
 	 * @return automaton transitions to state
 	 */
 	std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> >, std::set<State> > getTransitionsToState(const State& from) const;
-	
+
 	/**
 	 * @return automaton epsilon transitions to state
 	 */
@@ -139,7 +139,7 @@ public:
 	 * @return true when automaton doesn't contain epsilon transitions, false otherwise
 	 */
 	bool isEpsilonFree() const;
-	
+
 	/**
 	 * Determines whether NFA is deterministic.
 	 * FA is deterministic if and only if:
diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.cpp b/alib2data/src/automaton/FSM/ExtendedNFA.cpp
index 8f64c22153ef1f1cbfea6ed7e3ce881fc62930fa..cd47758857d83ff96e7ee2ff8dd5bacaeff89a44 100644
--- a/alib2data/src/automaton/FSM/ExtendedNFA.cpp
+++ b/alib2data/src/automaton/FSM/ExtendedNFA.cpp
@@ -22,7 +22,7 @@
 
 namespace automaton {
 
-ExtendedNFA::ExtendedNFA(const State& initialState) : SingleInitialState(initialState) {
+ExtendedNFA::ExtendedNFA(State initialState) : SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -117,11 +117,11 @@ bool ExtendedNFA::removeInputSymbol(const alphabet::Symbol& symbol) {
 	return inputAlphabet.erase(symbol);
 }
 
-bool ExtendedNFA::addTransition(const State& from, const regexp::RegExp& input, const State& to) {
+bool ExtendedNFA::addTransition(State from, regexp::RegExp input, State to) {
 	if (states.find(from) == states.end())
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 
-	std::set<alphabet::Symbol> inputRegExpAlphabet = regexp::RegExpAlphabetGetter::REG_EXP_ALPHABET_GETTER.getAlphabet(input);
+	const std::set<alphabet::Symbol>& inputRegExpAlphabet = regexp::RegExpAlphabetGetter::REG_EXP_ALPHABET_GETTER.getAlphabet(input);
 
 	// Transition regexp's alphabet must be subset of automaton's alphabet
 	if (inputRegExpAlphabet.size() > 0 && ! std::includes(inputAlphabet.begin(), inputAlphabet.end(), inputRegExpAlphabet.begin(), inputRegExpAlphabet.end()))
@@ -130,14 +130,14 @@ bool ExtendedNFA::addTransition(const State& from, const regexp::RegExp& input,
 	if (states.find(to) == states.end())
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 
-	std::pair<State, regexp::RegExp> key = std::make_pair(from, input);
-	
-	return transitions[key].insert(to).second;
+	std::pair<State, regexp::RegExp> key = std::make_pair(std::move(from), std::move(input));
+
+	return transitions[std::move(key)].insert(std::move(to)).second;
 }
 
 bool ExtendedNFA::removeTransition(const State& from, const regexp::RegExp& input, const State& to) {
 	std::pair<State, regexp::RegExp> key = std::make_pair(from, input);
-	
+
 	return transitions[key].erase(to);
 }
 
diff --git a/alib2data/src/automaton/FSM/ExtendedNFA.h b/alib2data/src/automaton/FSM/ExtendedNFA.h
index 4bd083357319af6e7cf23982c6b3479e491d7f2b..4ef3b58657daf316f384f76390de9da9eac4cdbe 100644
--- a/alib2data/src/automaton/FSM/ExtendedNFA.h
+++ b/alib2data/src/automaton/FSM/ExtendedNFA.h
@@ -29,7 +29,7 @@ class ExtendedNFA : public std::acceptor<ExtendedNFA, VisitableAutomatonBase, st
 protected:
 	std::map<std::pair<State, regexp::RegExp>, std::set<State> > transitions;
 public:
-	explicit ExtendedNFA(const State& initialState);
+	explicit ExtendedNFA(State initialState);
 	explicit ExtendedNFA(const CompactNFA& other);
 	explicit ExtendedNFA(const EpsilonNFA& other);
 	explicit ExtendedNFA(const MultiInitialStateNFA& other);
@@ -37,7 +37,7 @@ public:
 	explicit ExtendedNFA(const DFA& other);
 
 	virtual AutomatonBase* clone() const;
-	
+
 	virtual AutomatonBase* plunder() &&;
 
 	/**
@@ -49,7 +49,7 @@ public:
 	 * @copydoc Automaton::removeInputSymbol(const Symbol&)
 	 */
 	virtual bool removeInputSymbol(const alphabet::Symbol& symbol);
-	
+
 	/**
 	 * Adds transition defined by parameters to the automaton.
 	 * @param current current state
@@ -57,7 +57,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addTransition(const State& current, const regexp::RegExp& input, const State& next);
+	bool addTransition(State current, regexp::RegExp input, State next);
 
 	/**
 	 * Removes transition from the automaton.
@@ -75,7 +75,7 @@ public:
 	 * @return automaton transitions from state
 	 */
 	std::map<std::pair<State, regexp::RegExp>, std::set<State> > getTransitionsFromState(const State& from) const;
-	
+
 	/**
 	 * @return automaton transitions to state
 	 */
diff --git a/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp b/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp
index 8c13cce3ab0a928fa9f0b232249338b9126b3131..cf76337dfccd8fbe5b92133775a7c5f509021365 100644
--- a/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp
+++ b/alib2data/src/automaton/FSM/MultiInitialStateNFA.cpp
@@ -72,7 +72,7 @@ bool MultiInitialStateNFA::removeInputSymbol(const alphabet::Symbol& symbol) {
 	return inputAlphabet.erase(symbol);
 }
 
-bool MultiInitialStateNFA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) {
+bool MultiInitialStateNFA::addTransition(State from, alphabet::Symbol input, State to) {
 	if (states.find(from) == states.end())
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 
@@ -82,14 +82,14 @@ bool MultiInitialStateNFA::addTransition(const State& from, const alphabet::Symb
 	if (states.find(to) == states.end())
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 
-	std::pair<State, alphabet::Symbol> key = std::make_pair(from, input);
-	
-	return transitions[key].insert(to).second;
+	std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input));
+
+	return transitions[std::move(key)].insert(std::move(to)).second;
 }
 
 bool MultiInitialStateNFA::removeTransition(const State& from, const alphabet::Symbol& input, const State& to) {
 	std::pair<State, alphabet::Symbol> key = std::make_pair(from, input);
-	
+
 	return transitions[key].erase(to);
 }
 
diff --git a/alib2data/src/automaton/FSM/MultiInitialStateNFA.h b/alib2data/src/automaton/FSM/MultiInitialStateNFA.h
index 1bb49a341e5b448959a5090985ae470d94c15d2b..225934266449f7c5e7aac86d72b700b1440023bc 100644
--- a/alib2data/src/automaton/FSM/MultiInitialStateNFA.h
+++ b/alib2data/src/automaton/FSM/MultiInitialStateNFA.h
@@ -32,7 +32,7 @@ public:
 	explicit MultiInitialStateNFA(const DFA& other);
 
 	virtual AutomatonBase* clone() const;
-	
+
 	virtual AutomatonBase* plunder() &&;
 
 	/**
@@ -44,7 +44,7 @@ public:
 	 * @copydoc Automaton::removeInputSymbol(const Symbol&)
 	 */
 	virtual bool removeInputSymbol(const alphabet::Symbol& symbol);
-	
+
 	/**
 	 * Adds transition defined by parameters to the automaton.
 	 * @param current current state
@@ -52,7 +52,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addTransition(const State& current, const alphabet::Symbol& input, const State& next);
+	bool addTransition(State current, alphabet::Symbol input, State next);
 
 	/**
 	 * Removes transition from the automaton.
@@ -70,12 +70,12 @@ public:
 	 * @return automaton transitions from state
 	 */
 	std::map<std::pair<State, alphabet::Symbol>, std::set<State> > getTransitionsFromState(const State& from) const;
-	
+
 	/**
 	 * @return automaton transitions to state
 	 */
 	std::map<std::pair<State, alphabet::Symbol>, std::set<State> > getTransitionsToState(const State& from) const;
-	
+
 	/**
 	 * Determines whether MultiInitialStateNFA is deterministic.
 	 * FA is deterministic if and only if:
diff --git a/alib2data/src/automaton/FSM/NFA.cpp b/alib2data/src/automaton/FSM/NFA.cpp
index 215aa83490ce9da18eb1a8976e3f15f16b5ef542..5fd342ffe30610fa2455df8cb128fa624f282a65 100644
--- a/alib2data/src/automaton/FSM/NFA.cpp
+++ b/alib2data/src/automaton/FSM/NFA.cpp
@@ -12,7 +12,7 @@
 
 namespace automaton {
 
-NFA::NFA(const State& initialState) : SingleInitialState(initialState) {
+NFA::NFA(State initialState) : SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -59,7 +59,7 @@ bool NFA::removeInputSymbol(const alphabet::Symbol& symbol) {
 	return inputAlphabet.erase(symbol);
 }
 
-bool NFA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) {
+bool NFA::addTransition(State from, alphabet::Symbol input, State to) {
 	if (states.find(from) == states.end())
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 
@@ -69,14 +69,14 @@ bool NFA::addTransition(const State& from, const alphabet::Symbol& input, const
 	if (states.find(to) == states.end())
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 
-	std::pair<State, alphabet::Symbol> key = std::make_pair(from, input);
-	
-	return transitions[key].insert(to).second;
+	std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input));
+
+	return transitions[std::move(key)].insert(std::move(to)).second;
 }
 
 bool NFA::removeTransition(const State& from, const alphabet::Symbol& input, const State& to) {
 	std::pair<State, alphabet::Symbol> key = std::make_pair(from, input);
-	
+
 	return transitions[key].erase(to);
 }
 
diff --git a/alib2data/src/automaton/FSM/NFA.h b/alib2data/src/automaton/FSM/NFA.h
index 50c88650e18b891f35edfdff8df2732e44181cd6..29f83698ebd43791253a7c584b07f826170a2162 100644
--- a/alib2data/src/automaton/FSM/NFA.h
+++ b/alib2data/src/automaton/FSM/NFA.h
@@ -27,11 +27,11 @@ class NFA : public std::acceptor<NFA, VisitableAutomatonBase, std::acceptor<NFA,
 protected:
 	std::map<std::pair<State, alphabet::Symbol>, std::set<State> > transitions;
 public:
-	explicit NFA(const State& initialState);
+	explicit NFA(State initialState);
 	explicit NFA(const DFA& other);
 
 	virtual AutomatonBase* clone() const;
-	
+
 	virtual AutomatonBase* plunder() &&;
 
 	/**
@@ -43,7 +43,7 @@ public:
 	 * @copydoc Automaton::removeInputSymbol(const Symbol&)
 	 */
 	virtual bool removeInputSymbol(const alphabet::Symbol& symbol);
-	
+
 	/**
 	 * Adds transition defined by parameters to the automaton.
 	 * @param current current state
@@ -51,7 +51,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addTransition(const State& current, const alphabet::Symbol& input, const State& next);
+	bool addTransition(State current, alphabet::Symbol input, State next);
 
 	/**
 	 * Removes transition from the automaton.
@@ -69,12 +69,12 @@ public:
 	 * @return automaton transitions from state
 	 */
 	std::map<std::pair<State, alphabet::Symbol>, std::set<State> > getTransitionsFromState(const State& from) const;
-	
+
 	/**
 	 * @return automaton transitions to state
 	 */
 	std::map<std::pair<State, alphabet::Symbol>, std::set<State> > getTransitionsToState(const State& from) const;
-	
+
 	/**
 	 * Determines whether NFA is deterministic.
 	 * FA is deterministic if and only if:
diff --git a/alib2data/src/automaton/PDA/DPDA.cpp b/alib2data/src/automaton/PDA/DPDA.cpp
index e6d3ad8543e256099ab6c986ed9cb83e05a2acbb..c68924fe3fc8d04975d939704b184b5ef0bd2910 100644
--- a/alib2data/src/automaton/PDA/DPDA.cpp
+++ b/alib2data/src/automaton/PDA/DPDA.cpp
@@ -13,7 +13,7 @@
 
 namespace automaton {
 
-DPDA::DPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) {
+DPDA::DPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -70,7 +70,7 @@ bool DPDA::removeStackSymbol(const alphabet::Symbol& symbol) {
 	return stackAlphabet.erase(symbol);
 }
 
-bool DPDA::addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
+bool DPDA::addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -95,25 +95,25 @@ bool DPDA::addTransition(const State& from, const std::variant<string::Epsilon,
 		}
 	}
 
-	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> > key(from, input, pop);
-	std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push);
+	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> > key(std::move(from), std::move(input), std::move(pop));
+	std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(std::move(to), std::move(push));
 
 	if (transitions.find(key) != transitions.end()) {
 		if(transitions.find(key)->second == value)
 			return false;
-		else if (input.is<alphabet::Symbol>())
+		else if (std::get<1>(key).is<alphabet::Symbol>())
 			throw AutomatonException(
-				"Transition (\"" + (std::string) from.getName() + "\", \"" + (std::string) input.get<alphabet::Symbol>() + "\", \"pop\") -> ?? already exists.");
+				"Transition (\"" + (std::string) std::get<0>(key).getName() + "\", \"" + (std::string) std::get<1>(key).get<alphabet::Symbol>() + "\", \"pop\") -> ?? already exists.");
 		else
 			throw AutomatonException(
-				"Transition (\"" + (std::string) from.getName() + "\", \"" + (std::string) input.get<string::Epsilon>() + "\", \"pop\") -> ?? already exists.");
+				"Transition (\"" + (std::string) std::get<0>(key).getName() + "\", \"" + (std::string) std::get<1>(key).get<string::Epsilon>() + "\", \"pop\") -> ?? already exists.");
 	}
 
-	if(input.is<string::Epsilon>()) {
+	if(std::get<1>(key).is<string::Epsilon>()) {
 		if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::pair<automaton::State, std::vector<alphabet::Symbol> > > & transition) {
-				if(std::get<0>(transition.first) == from) {
+				if(std::get<0>(transition.first) == std::get<0>(key)) {
 					const std::vector<alphabet::Symbol>& alpha = std::get<2>(transition.first);
-					const std::vector<alphabet::Symbol>& beta = pop;
+					const std::vector<alphabet::Symbol>& beta = std::get<2>(key);
 
 					const std::vector<alphabet::Symbol>& shorter = (alpha.size() < beta.size()) ? alpha : beta;
 					const std::vector<alphabet::Symbol>& longer = (alpha.size() < beta.size()) ? beta : alpha;
@@ -128,9 +128,9 @@ bool DPDA::addTransition(const State& from, const std::variant<string::Epsilon,
 				throw exception::AlibException("Conflicting transition");
 	} else {
 		if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::pair<automaton::State, std::vector<alphabet::Symbol> > > & transition) {
-				if(std::get<0>(transition.first) == from && ( std::get<1>(transition.first) == input || std::get<1>(transition.first).is<string::Epsilon>() )) {
+				if(std::get<0>(transition.first) == std::get<0>(key) && ( std::get<1>(transition.first) == std::get<1>(key) || std::get<1>(transition.first).is<string::Epsilon>() )) {
 					const std::vector<alphabet::Symbol>& alpha = std::get<2>(transition.first);
-					const std::vector<alphabet::Symbol>& beta = pop;
+					const std::vector<alphabet::Symbol>& beta = std::get<2>(key);
 
 					const std::vector<alphabet::Symbol>& shorter = (alpha.size() < beta.size()) ? alpha : beta;
 					const std::vector<alphabet::Symbol>& longer = (alpha.size() < beta.size()) ? beta : alpha;
@@ -145,18 +145,18 @@ bool DPDA::addTransition(const State& from, const std::variant<string::Epsilon,
 				throw exception::AlibException("Conflicting transition");
 	}
 
-	transitions.insert(std::make_pair(key, value) );
+	transitions.insert(std::make_pair(std::move(key), std::move(value)) );
 	return true;
 }
 
-bool DPDA::addTransition(const State& from, const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
-	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addTransition(from, inputVariant, pop, to, push);
+bool DPDA::addTransition(State from, alphabet::Symbol input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) {
+	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input));
+	return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push));
 }
 
-bool DPDA::addTransition(const State& from, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
+bool DPDA::addTransition(State from, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addTransition(from, inputVariant, pop, to, push);
+	return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push));
 }
 
 bool DPDA::removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
diff --git a/alib2data/src/automaton/PDA/DPDA.h b/alib2data/src/automaton/PDA/DPDA.h
index 534252094a5cfa538e321ac41bca862c1a581243..9c51d6e5dd75bdd27d182d1ec1e408e0c46d5f5f 100644
--- a/alib2data/src/automaton/PDA/DPDA.h
+++ b/alib2data/src/automaton/PDA/DPDA.h
@@ -32,10 +32,10 @@ class DPDA : public std::acceptor<DPDA, VisitableAutomatonBase, std::acceptor<DP
 protected:
 	std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::pair<State, std::vector<alphabet::Symbol> > > transitions;
 public:
-	explicit DPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol);
+	explicit DPDA(State initialState, alphabet::Symbol initialPushdownSymbol);
 
 	virtual AutomatonBase* clone() const;
-	
+
 	virtual AutomatonBase* plunder() &&;
 
 	/**
@@ -59,11 +59,11 @@ public:
 	 * @throws AutomatonException when some part of the transition is not present
 	 * in the DPDA (state, input symbol, stack symbol) or when transition already exists
 	 */
-	bool addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push);
+	bool addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push);
 
-	bool addTransition(const State& from, const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push);
+	bool addTransition(State from, alphabet::Symbol input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push);
 
-	bool addTransition(const State& from, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push);
+	bool addTransition(State from, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push);
 
 	/**
 	 * Removes the transition from the DPDA.
diff --git a/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp b/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp
index 989adab4394dc9867cc7014ac0ff153d542069f8..5590aca49e354ce4e5c8789f6e6ac58bc0c23cf5 100644
--- a/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp
+++ b/alib2data/src/automaton/PDA/InputDrivenDPDA.cpp
@@ -13,7 +13,7 @@
 
 namespace automaton {
 
-InputDrivenDPDA::InputDrivenDPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) {
+InputDrivenDPDA::InputDrivenDPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -66,7 +66,7 @@ bool InputDrivenDPDA::removeStackSymbol(const alphabet::Symbol& symbol) {
 	return stackAlphabet.erase(symbol);
 }
 
-bool InputDrivenDPDA::setPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push) {
+void InputDrivenDPDA::checkPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push) {
 	if (inputAlphabet.find(input) == inputAlphabet.end()) {
 		throw AutomatonException("Input symbol \"" + (std::string) input + "\" doesn't exist.");
 	}
@@ -82,11 +82,14 @@ bool InputDrivenDPDA::setPushdownStoreOperation(const alphabet::Symbol& input, c
 			throw AutomatonException("Stack symbol \"" + (std::string) pushSymbol + "\" doesn't exist.");
 		}
 	}
+}
 
-	return inputSymbolToPushdownStoreOperation.insert(std::make_pair(input, std::make_pair(pop, push))).second;
+bool InputDrivenDPDA::setPushdownStoreOperation(alphabet::Symbol input, std::vector<alphabet::Symbol> pop, std::vector<alphabet::Symbol> push) {
+	checkPushdownStoreOperation(input, pop, push);
+	return inputSymbolToPushdownStoreOperation.insert(std::make_pair(std::move(input), std::make_pair(std::move(pop), std::move(push)))).second;
 }
 
-void InputDrivenDPDA::setPushdownStoreOperations(const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>>& operations) {
+void InputDrivenDPDA::setPushdownStoreOperations(std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> operations) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), key_begin(operations), key_end(operations), std::inserter(removed, removed.end()));
 
@@ -95,8 +98,10 @@ void InputDrivenDPDA::setPushdownStoreOperations(const std::map<alphabet::Symbol
 	}
 
 	for(const auto& added : operations) {
-		setPushdownStoreOperation(added.first, added.second.first, added.second.second);
+		checkPushdownStoreOperation(added.first, added.second.first, added.second.second);
 	}
+
+	inputSymbolToPushdownStoreOperation = std::move(operations);
 }
 
 bool InputDrivenDPDA::clearPushdownStoreOperation(const alphabet::Symbol& input) {
@@ -112,7 +117,7 @@ const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::v
 	return inputSymbolToPushdownStoreOperation;
 }
 
-bool InputDrivenDPDA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) {
+bool InputDrivenDPDA::addTransition(State from, alphabet::Symbol input, State to) {
 	if (states.find(from) == states.end())
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 
@@ -125,18 +130,18 @@ bool InputDrivenDPDA::addTransition(const State& from, const alphabet::Symbol& i
 	if (states.find(to) == states.end())
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 
-	std::pair<State, alphabet::Symbol> key = std::make_pair(from, input);
+	std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input));
 
 	if (transitions.find(key) != transitions.end()) {
 		if(transitions.find(key)->second == to)
 			return false;
 		else
 			throw AutomatonException(
-				"Transition from this state and symbol already exists (\"" + (std::string) from.getName() + "\", \"" + (std::string) input + "\") -> \"" + (std::string) to.getName()
+				"Transition from this state and symbol already exists (\"" + (std::string) key.first.getName() + "\", \"" + (std::string) key.second + "\") -> \"" + (std::string) to.getName()
 						+ "\".");
 	}
 
-	transitions.insert(std::make_pair(key, to));
+	transitions.insert(std::make_pair(std::move(key), std::move(to)));
 	return true;
 }
 
diff --git a/alib2data/src/automaton/PDA/InputDrivenDPDA.h b/alib2data/src/automaton/PDA/InputDrivenDPDA.h
index 085931f95e353c587a7116b829663770b4ef7880..97b6d2fceb7d3b4904ae899b2ef0bfc36904dd8e 100644
--- a/alib2data/src/automaton/PDA/InputDrivenDPDA.h
+++ b/alib2data/src/automaton/PDA/InputDrivenDPDA.h
@@ -25,8 +25,10 @@ class InputDrivenDPDA : public std::acceptor<InputDrivenDPDA, VisitableAutomaton
 protected:
 	std::map<std::pair<State, alphabet::Symbol>, State> transitions;
 	std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> inputSymbolToPushdownStoreOperation;
+
+	void checkPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push);
 public:
-	explicit InputDrivenDPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol);
+	explicit InputDrivenDPDA(State initialState, alphabet::Symbol initialPushdownSymbol);
 
 	virtual AutomatonBase* clone() const;
 
@@ -47,9 +49,9 @@ public:
 	 */
 	virtual bool removeStackSymbol(const alphabet::Symbol& symbol);
 
-	bool setPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push);
+	bool setPushdownStoreOperation(alphabet::Symbol input, std::vector<alphabet::Symbol> pop, std::vector<alphabet::Symbol> push);
 
-	void setPushdownStoreOperations(const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>>& operations);
+	void setPushdownStoreOperations(std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> operations);
 
 	bool clearPushdownStoreOperation(const alphabet::Symbol& input);
 
@@ -62,7 +64,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addTransition(const State& current, const alphabet::Symbol& input, const State& next);
+	bool addTransition(State current, alphabet::Symbol input, State next);
 
 	/**
 	 * Removes transition from the automaton.
diff --git a/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp b/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp
index d0fbcfac96b5e9094ab20037fbaa78150c40fc79..5d8754aadb617c3355375e22e2dd432b5c73026b 100644
--- a/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp
+++ b/alib2data/src/automaton/PDA/InputDrivenNPDA.cpp
@@ -13,7 +13,7 @@
 
 namespace automaton {
 
-InputDrivenNPDA::InputDrivenNPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) {
+InputDrivenNPDA::InputDrivenNPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -66,7 +66,7 @@ bool InputDrivenNPDA::removeStackSymbol(const alphabet::Symbol& symbol) {
 	return stackAlphabet.erase(symbol);
 }
 
-bool InputDrivenNPDA::setPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push) {
+void InputDrivenNPDA::checkPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push) {
 	if (inputAlphabet.find(input) == inputAlphabet.end()) {
 		throw AutomatonException("Input symbol \"" + (std::string) input + "\" doesn't exist.");
 	}
@@ -82,11 +82,14 @@ bool InputDrivenNPDA::setPushdownStoreOperation(const alphabet::Symbol& input, c
 			throw AutomatonException("Stack symbol \"" + (std::string) pushSymbol + "\" doesn't exist.");
 		}
 	}
+}
 
+bool InputDrivenNPDA::setPushdownStoreOperation(alphabet::Symbol input, std::vector<alphabet::Symbol> pop, std::vector<alphabet::Symbol> push) {
+	checkPushdownStoreOperation(input, pop, push);
 	return inputSymbolToPushdownStoreOperation.insert(std::make_pair(input, std::make_pair(pop, push))).second;
 }
 
-void InputDrivenNPDA::setPushdownStoreOperations(const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>>& operations) {
+void InputDrivenNPDA::setPushdownStoreOperations(std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> operations) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), key_begin(operations), key_end(operations), std::inserter(removed, removed.end()));
 
@@ -95,8 +98,10 @@ void InputDrivenNPDA::setPushdownStoreOperations(const std::map<alphabet::Symbol
 	}
 
 	for(const auto& added : operations) {
-		setPushdownStoreOperation(added.first, added.second.first, added.second.second);
+		checkPushdownStoreOperation(added.first, added.second.first, added.second.second);
 	}
+
+	inputSymbolToPushdownStoreOperation = std::move(operations);
 }
 
 bool InputDrivenNPDA::clearPushdownStoreOperation(const alphabet::Symbol& input) {
@@ -112,7 +117,7 @@ const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::v
 	return inputSymbolToPushdownStoreOperation;
 }
 
-bool InputDrivenNPDA::addTransition(const State& from, const alphabet::Symbol& input, const State& to) {
+bool InputDrivenNPDA::addTransition(State from, alphabet::Symbol input, State to) {
 	if (states.find(from) == states.end())
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 
@@ -125,9 +130,9 @@ bool InputDrivenNPDA::addTransition(const State& from, const alphabet::Symbol& i
 	if (states.find(to) == states.end())
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 
-	std::pair<State, alphabet::Symbol> key = std::make_pair(from, input);
+	std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input));
 
-	return transitions[key].insert(to).second;
+	return transitions[std::move(key)].insert(std::move(to)).second;
 }
 
 bool InputDrivenNPDA::removeTransition(const State& from, const alphabet::Symbol& input, const State& to) {
diff --git a/alib2data/src/automaton/PDA/InputDrivenNPDA.h b/alib2data/src/automaton/PDA/InputDrivenNPDA.h
index 2ba69787a79c478afe16dc1053b9b3975eefff9c..1835d1cb1a1f7f54fcc246bd9e607e187501794a 100644
--- a/alib2data/src/automaton/PDA/InputDrivenNPDA.h
+++ b/alib2data/src/automaton/PDA/InputDrivenNPDA.h
@@ -25,8 +25,10 @@ class InputDrivenNPDA : public std::acceptor<InputDrivenNPDA, VisitableAutomaton
 protected:
 	std::map<std::pair<State, alphabet::Symbol>, std::set<State> > transitions;
 	std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> inputSymbolToPushdownStoreOperation;
+
+	void checkPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push);
 public:
-	explicit InputDrivenNPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol);
+	explicit InputDrivenNPDA(State initialState, alphabet::Symbol initialPushdownSymbol);
 
 	virtual AutomatonBase* clone() const;
 
@@ -47,9 +49,9 @@ public:
 	 */
 	virtual bool removeStackSymbol(const alphabet::Symbol& symbol);
 
-	bool setPushdownStoreOperation(const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const std::vector<alphabet::Symbol>& push);
+	bool setPushdownStoreOperation(alphabet::Symbol input, std::vector<alphabet::Symbol> pop, std::vector<alphabet::Symbol> push);
 
-	void setPushdownStoreOperations(const std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>>& operations);
+	void setPushdownStoreOperations(std::map<alphabet::Symbol, std::pair<std::vector<alphabet::Symbol>, std::vector<alphabet::Symbol>>> operations);
 
 	bool clearPushdownStoreOperation(const alphabet::Symbol& input);
 
@@ -62,7 +64,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addTransition(const State& current, const alphabet::Symbol& input, const State& next);
+	bool addTransition(State current, alphabet::Symbol input, State next);
 
 	/**
 	 * Removes transition from the automaton.
diff --git a/alib2data/src/automaton/PDA/NPDA.cpp b/alib2data/src/automaton/PDA/NPDA.cpp
index 52a6a26c83847b2819f19ba74e4f5745bce5f8a3..6c63d114334b22a1d8d3b4226bea365e3eb0e216 100644
--- a/alib2data/src/automaton/PDA/NPDA.cpp
+++ b/alib2data/src/automaton/PDA/NPDA.cpp
@@ -13,7 +13,7 @@
 
 namespace automaton {
 
-NPDA::NPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) {
+NPDA::NPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -34,11 +34,11 @@ bool NPDA::removeState(const State& state) {
 		throw AutomatonException("State \"" + (std::string) state.getName() + "\" is final state.");
 	}
 
-	for (std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >::const_iterator transition = transitions.begin(); transition != transitions.end(); transition++) {
-		if (state == std::get<0>(transition->first))
+	for (const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >& transition : transitions) {
+		if (state == std::get<0>(transition.first))
 			throw AutomatonException("State \"" + (std::string) state.getName() + "\" is used in transition.");
-		for(std::set<std::pair<State, std::vector<alphabet::Symbol> > >::iterator target = transition->second.begin(); target != transition->second.end(); target++) {
-			if(target->first == state)
+		for(const std::pair<State, std::vector<alphabet::Symbol> >& target : transition.second) {
+			if(target.first == state)
 				throw AutomatonException("State \"" + (std::string) state.getName() + "\" is used in transition.");
 		}
 	}
@@ -47,8 +47,8 @@ bool NPDA::removeState(const State& state) {
 }
 
 bool NPDA::removeInputSymbol(const alphabet::Symbol& symbol) {
-	for (std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >::const_iterator transition = transitions.begin(); transition != transitions.end(); transition++) {
-		if (std::get<1>(transition->first).is<alphabet::Symbol>() && symbol == std::get<1>(transition->first).get<alphabet::Symbol>())
+	for (const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >& transition : transitions) {
+		if (std::get<1>(transition.first).is<alphabet::Symbol>() && symbol == std::get<1>(transition.first).get<alphabet::Symbol>())
 			throw AutomatonException("Symbol \"" + (std::string) symbol + "\" is used in transition.");
 	}
 
@@ -60,14 +60,13 @@ bool NPDA::removeStackSymbol(const alphabet::Symbol& symbol) {
 		throw AutomatonException("Stack symbol \"" + (std::string) symbol + "\" is start symbol.");
 	}
 
-	for (std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >::const_iterator transition = transitions.begin(); transition != transitions.end(); transition++) {
-		for (std::vector<alphabet::Symbol>::const_iterator popSymbol = std::get<2>(transition->first).begin(); popSymbol != std::get<2>(transition->first).end();
-				popSymbol++) {
-			if (symbol == *popSymbol)
+	for (const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > >& transition : transitions) {
+		for (const alphabet::Symbol& popSymbol : std::get<2>(transition.first)) {
+			if (symbol == popSymbol)
 				throw AutomatonException("Stack symbol \"" + (std::string) symbol + "\" is used in transition.");
 		}
-		for (std::set<std::pair<State, std::vector<alphabet::Symbol> > >::const_iterator target = transition->second.begin(); target != transition->second.end(); target++) {
-			if (std::find(target->second.begin(), target->second.end(), symbol) != target->second.end())
+		for (const std::pair<State, std::vector<alphabet::Symbol> >& target : transition.second) {
+			if (std::find(target.second.begin(), target.second.end(), symbol) != target.second.end())
 				throw AutomatonException("Stack symbol \"" + (std::string) symbol + "\" is used in transition.");
 		}
 	}
@@ -75,7 +74,7 @@ bool NPDA::removeStackSymbol(const alphabet::Symbol& symbol) {
 	return stackAlphabet.erase(symbol);
 }
 
-bool NPDA::addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
+bool NPDA::addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -88,38 +87,38 @@ bool NPDA::addTransition(const State& from, const std::variant<string::Epsilon,
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 	}
 
-	for(std::vector<alphabet::Symbol>::const_iterator popSymbol = pop.begin(); popSymbol != pop.end(); popSymbol++) {
-		if (stackAlphabet.find(*popSymbol) == stackAlphabet.end()) {
-			throw AutomatonException("Stack symbol \"" + (std::string) *popSymbol + "\" doesn't exist.");
+	for(const alphabet::Symbol& popSymbol : pop) {
+		if (stackAlphabet.find(popSymbol) == stackAlphabet.end()) {
+			throw AutomatonException("Stack symbol \"" + (std::string) popSymbol + "\" doesn't exist.");
 		}
 	}
 
-	for(std::vector<alphabet::Symbol>::const_iterator pushSymbol = push.begin(); pushSymbol != push.end(); pushSymbol++) {
-		if (stackAlphabet.find(*pushSymbol) == stackAlphabet.end()) {
-			throw AutomatonException("Stack symbol \"" + (std::string) *pushSymbol + "\" doesn't exist.");
+	for(const alphabet::Symbol& pushSymbol : push) {
+		if (stackAlphabet.find(pushSymbol) == stackAlphabet.end()) {
+			throw AutomatonException("Stack symbol \"" + (std::string) pushSymbol + "\" doesn't exist.");
 		}
 	}
 
-	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> > key(from, input, pop);
-	std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push);
-	
-	return transitions[key].insert(value).second;
+	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> > key(std::move(from), std::move(input), std::move(pop));
+	std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(std::move(to), std::move(push));
+
+	return transitions[std::move(key)].insert(std::move(value)).second;
 }
 
-bool NPDA::addTransition(const State& from, const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
-	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addTransition(from, inputVariant, pop, to, push);
+bool NPDA::addTransition(State from, alphabet::Symbol input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) {
+	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input));
+	return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push));
 }
 
-bool NPDA::addTransition(const State& from, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
+bool NPDA::addTransition(State from, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addTransition(from, inputVariant, pop, to, push);
+	return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push));
 }
 
 bool NPDA::removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
 	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> > key(from, input, pop);
 	std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push);
-	
+
 	return transitions[key].erase(value);
 }
 
diff --git a/alib2data/src/automaton/PDA/NPDA.h b/alib2data/src/automaton/PDA/NPDA.h
index da6e75e17f06aa2b66dc8721099483be2044f3ea..97108702192b33a8090feb043ef462c0482fbe8b 100644
--- a/alib2data/src/automaton/PDA/NPDA.h
+++ b/alib2data/src/automaton/PDA/NPDA.h
@@ -28,7 +28,7 @@ class NPDA : public std::acceptor<NPDA, VisitableAutomatonBase, std::acceptor<NP
 protected:
 	std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > > transitions;
 public:
-	explicit NPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol);
+	explicit NPDA(State initialState, alphabet::Symbol initialPushdownSymbol);
 
 	virtual AutomatonBase* clone() const;
 
@@ -55,11 +55,11 @@ public:
 	 * @throws AutomatonException when some part of the transition is not present
 	 * in the NPDA (state, input symbol, stack symbol) or when transition already exists
 	 */
-	bool addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push);
+	bool addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push);
 
-	bool addTransition(const State& from, const alphabet::Symbol& input, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push);
+	bool addTransition(State from, alphabet::Symbol input, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push);
 
-	bool addTransition(const State& from, const std::vector<alphabet::Symbol>& pop, const State& to, const std::vector<alphabet::Symbol>& push);
+	bool addTransition(State from, std::vector<alphabet::Symbol> pop, State to, std::vector<alphabet::Symbol> push);
 
 	/**
 	 * Removes the transition from the NPDA.
diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp
index 969ba37a261acc0c4333bcfc6fc3366603d4843a..62131674432bc5fc2b4e4e1924c1683120b918f0 100644
--- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp
+++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.cpp
@@ -13,7 +13,7 @@
 
 namespace automaton {
 
-RealTimeHeightDeterministicDPDA::RealTimeHeightDeterministicDPDA(const State& initialState, const alphabet::Symbol& bottomOfTheStackSymbol) : SingleInitialState(initialState), BottomOfTheStackSymbolPushdownStoreAlphabet(bottomOfTheStackSymbol) {
+RealTimeHeightDeterministicDPDA::RealTimeHeightDeterministicDPDA(State initialState, alphabet::Symbol bottomOfTheStackSymbol) : SingleInitialState(std::move(initialState)), BottomOfTheStackSymbolPushdownStoreAlphabet(std::move(bottomOfTheStackSymbol)) {
 
 }
 
@@ -95,7 +95,7 @@ bool RealTimeHeightDeterministicDPDA::removeStackSymbol(const alphabet::Symbol&
 	return stackAlphabet.erase(symbol);
 }
 
-bool RealTimeHeightDeterministicDPDA::addCallTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to, const alphabet::Symbol& push) {
+bool RealTimeHeightDeterministicDPDA::addCallTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to, alphabet::Symbol push) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -112,53 +112,53 @@ bool RealTimeHeightDeterministicDPDA::addCallTransition(const State& from, const
 		throw AutomatonException("Stack symbol \"" + (std::string) push + "\" doesn't exist.");
 	}
 
-	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(from, input);
-	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push);
+	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(std::move(from), std::move(input));
+	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(std::move(to), std::move(push));
 
 	if(callTransitions.find(key) != callTransitions.end() && callTransitions.find(key)->second == value)
 		return false;
 
-	if(input.is<string::Epsilon>()) {
+	if(key.second.is<string::Epsilon>()) {
 		for(const auto& transition : callTransitions)
-			if(transition.first.first == from )
-				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present.");
+			if(transition.first.first == key.first )
+				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) key.first + "\" when other transitions are present.");
 
 		for(const auto& transition : returnTransitions)
-			if(std::get<0>(transition.first) == from)
-				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present.");
+			if(std::get<0>(transition.first) == key.first)
+				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) key.first + "\" when other transitions are present.");
 
 		for(const auto& transition : localTransitions)
-			if(transition.first.first == from)
+			if(transition.first.first == key.first)
 				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present.");
 	} else {
 		for(const auto& transition : callTransitions)
-			if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input))
-				throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+			if(transition.first.first == key.first && (transition.first.second.is<string::Epsilon>() || transition.first.second == key.second))
+				throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 
 		for(const auto& transition : returnTransitions)
-			if(std::get<0>(transition.first) == from && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == input))
-				throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+			if(std::get<0>(transition.first) == key.first && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == key.second))
+				throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 
 		for(const auto& transition : localTransitions)
-			if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input))
-				throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+			if(transition.first.first == key.first && (transition.first.second.is<string::Epsilon>() || transition.first.second == key.second))
+				throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 	}
 
-	callTransitions.insert(std::make_pair(key, value));
+	callTransitions.insert(std::make_pair(std::move(key), std::move(value)));
 	return true;
 }
 
-bool RealTimeHeightDeterministicDPDA::addCallTransition(const State& from, const State& to, const alphabet::Symbol& push) {
+bool RealTimeHeightDeterministicDPDA::addCallTransition(State from, State to, alphabet::Symbol push) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addCallTransition(from, inputVariant, to, push);
+	return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push));
 }
 
-bool RealTimeHeightDeterministicDPDA::addCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) {
-	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addCallTransition(from, inputVariant, to, push);
+bool RealTimeHeightDeterministicDPDA::addCallTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol push) {
+	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input));
+	return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push));
 }
 
-bool RealTimeHeightDeterministicDPDA::addReturnTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to) {
+bool RealTimeHeightDeterministicDPDA::addReturnTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -175,52 +175,52 @@ bool RealTimeHeightDeterministicDPDA::addReturnTransition(const State& from, con
 		throw AutomatonException("Stack symbol \"" + (std::string) pop + "\" doesn't exist.");
 	}
 
-	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, input, pop);
+	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop));
 
 	if(returnTransitions.find(key) != returnTransitions.end() && returnTransitions.find(key)->second == to)
 		return false;
 
-	if(input.is<string::Epsilon>()) {
+	if(std::get<1>(key).is<string::Epsilon>()) {
 		for(const auto& transition : callTransitions)
-			if(transition.first.first == from )
-				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present.");
+			if(transition.first.first == std::get<0>(key) )
+				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) std::get<0>(key) + "\" when other transitions are present.");
 
 		for(const auto& transition : returnTransitions)
-			if(std::get<0>(transition.first) == from && std::get<2>(transition.first) == pop)
-				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present.");
+			if(std::get<0>(transition.first) == std::get<0>(key) && std::get<2>(transition.first) == std::get<2>(key))
+				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) std::get<0>(key) + "\" when other transitions are present.");
 
 		for(const auto& transition : localTransitions)
-			if(transition.first.first == from)
-				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present.");
+			if(transition.first.first == std::get<0>(key))
+				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) std::get<0>(key) + "\" when other transitions are present.");
 	} else {
 		for(const auto& transition : callTransitions)
-			if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input))
-				throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+			if(transition.first.first == std::get<0>(key) && (transition.first.second.is<string::Epsilon>() || transition.first.second == std::get<1>(key)))
+				throw AutomatonException("Can't add transition from state \"" + (std::string) std::get<0>(key) + "\" when transition reading \"" + (std::string) std::get<1>(key) + "\" is present.");
 
 		for(const auto& transition : returnTransitions)
-			if(std::get<0>(transition.first) == from && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == input) && std::get<2>(transition.first) == pop)
-				throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+			if(std::get<0>(transition.first) == std::get<0>(key) && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == std::get<1>(key)) && std::get<2>(transition.first) == std::get<2>(key))
+				throw AutomatonException("Can't add transition from state \"" + (std::string) std::get<0>(key) + "\" when transition reading \"" + (std::string) std::get<1>(key) + "\" is present.");
 
 		for(const auto& transition : localTransitions)
-			if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input))
-				throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+			if(transition.first.first == std::get<0>(key) && (transition.first.second.is<string::Epsilon>() || transition.first.second == std::get<1>(key)))
+				throw AutomatonException("Can't add transition from state \"" + (std::string) std::get<0>(key) + "\" when transition reading \"" + (std::string) std::get<1>(key) + "\" is present.");
 	}
 
-	returnTransitions.insert(std::make_pair(key, to));
+	returnTransitions.insert(std::make_pair(std::move(key), std::move(to)));
 	return true;
 }
 
-bool RealTimeHeightDeterministicDPDA::addReturnTransition(const State& from, const alphabet::Symbol& pop, const State& to) {
+bool RealTimeHeightDeterministicDPDA::addReturnTransition(State from, alphabet::Symbol pop, State to) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addReturnTransition(from, inputVariant, pop, to);
+	return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to));
 }
 
-bool RealTimeHeightDeterministicDPDA::addReturnTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to) {
-	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addReturnTransition(from, inputVariant, pop, to);
+bool RealTimeHeightDeterministicDPDA::addReturnTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to) {
+	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input));
+	return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to));
 }
 
-bool RealTimeHeightDeterministicDPDA::addLocalTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to) {
+bool RealTimeHeightDeterministicDPDA::addLocalTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -233,49 +233,49 @@ bool RealTimeHeightDeterministicDPDA::addLocalTransition(const State& from, cons
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 	}
 
-	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(from, input);
-	
+	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(std::move(from), std::move(input));
+
 	if(localTransitions.find(key) != localTransitions.end() && localTransitions.find(key)->second == to)
 		return false;
 
-	if(input.is<string::Epsilon>()) {
+	if(key.second.is<string::Epsilon>()) {
 		for(const auto& transition : callTransitions)
-			if(transition.first.first == from )
-				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present.");
+			if(transition.first.first == key.first )
+				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) key.first + "\" when other transitions are present.");
 
 		for(const auto& transition : returnTransitions)
-			if(std::get<0>(transition.first) == from)
-				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present.");
+			if(std::get<0>(transition.first) == key.first)
+				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) key.first + "\" when other transitions are present.");
 
 		for(const auto& transition : localTransitions)
-			if(transition.first.first == from)
-				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) from + "\" when other transitions are present.");
+			if(transition.first.first == key.first)
+				throw AutomatonException("Can't add epsilon transition from state \"" + (std::string) key.first + "\" when other transitions are present.");
 	} else {
 		for(const auto& transition : callTransitions)
-			if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input))
-				throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+			if(transition.first.first == key.first && (transition.first.second.is<string::Epsilon>() || transition.first.second == key.second))
+				throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 
 		for(const auto& transition : returnTransitions)
-			if(std::get<0>(transition.first) == from && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == input))
-				throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+			if(std::get<0>(transition.first) == key.first && (std::get<1>(transition.first).is<string::Epsilon>() || std::get<1>(transition.first) == key.second))
+				throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 
 		for(const auto& transition : localTransitions)
-			if(transition.first.first == from && (transition.first.second.is<string::Epsilon>() || transition.first.second == input))
-				throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+			if(transition.first.first == key.first && (transition.first.second.is<string::Epsilon>() || transition.first.second == key.second))
+				throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 	}
 
-	localTransitions.insert(std::make_pair(key, to));
+	localTransitions.insert(std::make_pair(std::move(key), std::move(to)));
 	return true;
 }
 
-bool RealTimeHeightDeterministicDPDA::addLocalTransition(const State& from, const State& to) {
+bool RealTimeHeightDeterministicDPDA::addLocalTransition(State from, State to) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addLocalTransition(from, inputVariant, to);
+	return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to));
 }
 
-bool RealTimeHeightDeterministicDPDA::addLocalTransition(const State& from, const alphabet::Symbol& input, const State& to) {
-	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addLocalTransition(from, inputVariant, to);
+bool RealTimeHeightDeterministicDPDA::addLocalTransition(State from, alphabet::Symbol input, State to) {
+	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input));
+	return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to));
 }
 
 bool RealTimeHeightDeterministicDPDA::removeCallTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to, const alphabet::Symbol& push) {
@@ -355,15 +355,15 @@ bool RealTimeHeightDeterministicDPDA::removeLocalTransition(const State& from, c
 }
 
 const std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>>, std::pair<State, alphabet::Symbol> >& RealTimeHeightDeterministicDPDA::getCallTransitions() const {
-		return callTransitions;
+	return callTransitions;
 }
 
 const std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, State>& RealTimeHeightDeterministicDPDA::getReturnTransitions() const {
-		return returnTransitions;
+	return returnTransitions;
 }
 
 const std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>>, State>& RealTimeHeightDeterministicDPDA::getLocalTransitions() const {
-		return localTransitions;
+	return localTransitions;
 }
 
 int RealTimeHeightDeterministicDPDA::compare(const RealTimeHeightDeterministicDPDA& other) const {
diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h
index 37156ecf5dee8e82880412c749dc38b521a8a4b9..fffde3d5bffafc7e81d6a83d4e0a5e24d790f687 100644
--- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h
+++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicDPDA.h
@@ -31,7 +31,7 @@ protected:
 	std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, State> returnTransitions;
 	std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>>, State> localTransitions;
 public:
-	explicit RealTimeHeightDeterministicDPDA(const State& initialState, const alphabet::Symbol& bottomOfTheStackSymbol);
+	explicit RealTimeHeightDeterministicDPDA(State initialState, alphabet::Symbol bottomOfTheStackSymbol);
 
 	virtual AutomatonBase* clone() const;
 	
@@ -59,9 +59,9 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addCallTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& next, const alphabet::Symbol& push);
-	bool addCallTransition(const State& current, const State& next, const alphabet::Symbol& push);
-	bool addCallTransition(const State& current, const alphabet::Symbol& input, const State& next, const alphabet::Symbol& push);
+	bool addCallTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, State next, alphabet::Symbol push);
+	bool addCallTransition(State current, State next, alphabet::Symbol push);
+	bool addCallTransition(State current, alphabet::Symbol input, State next, alphabet::Symbol push);
 
 	/**
 	 * Adds return transition defined by parameters to the automaton.
@@ -70,9 +70,9 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addReturnTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& next);
-	bool addReturnTransition(const State& current, const alphabet::Symbol& pop, const State& next);
-	bool addReturnTransition(const State& current, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& next);
+	bool addReturnTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State next);
+	bool addReturnTransition(State current, alphabet::Symbol pop, State next);
+	bool addReturnTransition(State current, alphabet::Symbol input, alphabet::Symbol pop, State next);
 
 	/**
 	 * Adds local transition defined by parameters to the automaton.
@@ -81,9 +81,9 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addLocalTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& next);
-	bool addLocalTransition(const State& current, const State& next);
-	bool addLocalTransition(const State& current, const alphabet::Symbol& input, const State& next);
+	bool addLocalTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, State next);
+	bool addLocalTransition(State current, State next);
+	bool addLocalTransition(State current, alphabet::Symbol input, State next);
 
 	/**
 	 * Removes call transition from the automaton.
diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp
index c07360133533ae61237b5d9f4a5aba43cae07f01..b4724843e03454c569a664d7cf60f6b653b6da20 100644
--- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp
+++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.cpp
@@ -13,7 +13,7 @@
 
 namespace automaton {
 
-RealTimeHeightDeterministicNPDA::RealTimeHeightDeterministicNPDA(const alphabet::Symbol& bottomOfTheStackSymbol) : BottomOfTheStackSymbolPushdownStoreAlphabet(bottomOfTheStackSymbol) {
+RealTimeHeightDeterministicNPDA::RealTimeHeightDeterministicNPDA(alphabet::Symbol bottomOfTheStackSymbol) : BottomOfTheStackSymbolPushdownStoreAlphabet(std::move(bottomOfTheStackSymbol)) {
 
 }
 
@@ -103,7 +103,7 @@ bool RealTimeHeightDeterministicNPDA::removeStackSymbol(const alphabet::Symbol&
 	return stackAlphabet.erase(symbol);
 }
 
-bool RealTimeHeightDeterministicNPDA::addCallTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to, const alphabet::Symbol& push) {
+bool RealTimeHeightDeterministicNPDA::addCallTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to, alphabet::Symbol push) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -120,23 +120,23 @@ bool RealTimeHeightDeterministicNPDA::addCallTransition(const State& from, const
 		throw AutomatonException("Stack symbol \"" + (std::string) push + "\" doesn't exist.");
 	}
 
-	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(from, input);
-	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push);
-	
-	return callTransitions[key].insert(value).second;
+	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(std::move(from), std::move(input));
+	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(std::move(to), std::move(push));
+
+	return callTransitions[std::move(key)].insert(std::move(value)).second;
 }
 
-bool RealTimeHeightDeterministicNPDA::addCallTransition(const State& from, const State& to, const alphabet::Symbol& push) {
+bool RealTimeHeightDeterministicNPDA::addCallTransition(State from, State to, alphabet::Symbol push) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addCallTransition(from, inputVariant, to, push);
+	return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push));
 }
 
-bool RealTimeHeightDeterministicNPDA::addCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) {
+bool RealTimeHeightDeterministicNPDA::addCallTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol push) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addCallTransition(from, inputVariant, to, push);
+	return addCallTransition(std::move(from), std::move(inputVariant), std::move(to), std::move(push));
 }
 
-bool RealTimeHeightDeterministicNPDA::addReturnTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to) {
+bool RealTimeHeightDeterministicNPDA::addReturnTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -153,22 +153,22 @@ bool RealTimeHeightDeterministicNPDA::addReturnTransition(const State& from, con
 		throw AutomatonException("Stack symbol \"" + (std::string) pop + "\" doesn't exist.");
 	}
 
-	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, input, pop);
+	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop));
 
-	return returnTransitions[key].insert(to).second;
+	return returnTransitions[std::move(key)].insert(std::move(to)).second;
 }
 
-bool RealTimeHeightDeterministicNPDA::addReturnTransition(const State& from, const alphabet::Symbol& pop, const State& to) {
+bool RealTimeHeightDeterministicNPDA::addReturnTransition(State from, alphabet::Symbol pop, State to) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addReturnTransition(from, inputVariant, pop, to);
+	return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to));
 }
 
-bool RealTimeHeightDeterministicNPDA::addReturnTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to) {
-	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addReturnTransition(from, inputVariant, pop, to);
+bool RealTimeHeightDeterministicNPDA::addReturnTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to) {
+	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input));
+	return addReturnTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to));
 }
 
-bool RealTimeHeightDeterministicNPDA::addLocalTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to) {
+bool RealTimeHeightDeterministicNPDA::addLocalTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, State to) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -181,25 +181,25 @@ bool RealTimeHeightDeterministicNPDA::addLocalTransition(const State& from, cons
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 	}
 
-	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(from, input);
+	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(std::move(from), std::move(input));
 
-	return localTransitions[key].insert(to).second;
+	return localTransitions[std::move(key)].insert(std::move(to)).second;
 }
 
-bool RealTimeHeightDeterministicNPDA::addLocalTransition(const State& from, const State& to) {
+bool RealTimeHeightDeterministicNPDA::addLocalTransition(State from, State to) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addLocalTransition(from, inputVariant, to);
+	return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to));
 }
 
-bool RealTimeHeightDeterministicNPDA::addLocalTransition(const State& from, const alphabet::Symbol& input, const State& to) {
-	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addLocalTransition(from, inputVariant, to);
+bool RealTimeHeightDeterministicNPDA::addLocalTransition(State from, alphabet::Symbol input, State to) {
+	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input));
+	return addLocalTransition(std::move(from), std::move(inputVariant), std::move(to));
 }
 
 bool RealTimeHeightDeterministicNPDA::removeCallTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& to, const alphabet::Symbol& push) {
 	std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>> key(from, input);
 	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push);
-	
+
 	return callTransitions[key].erase(value);
 }
 
diff --git a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h
index 4f81eba7af9bfa6c33e7c6f772a558d734768c81..b3b6911b20b013f253020c084ba05fd3ba6edb19 100644
--- a/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h
+++ b/alib2data/src/automaton/PDA/RealTimeHeightDeterministicNPDA.h
@@ -31,7 +31,7 @@ protected:
 	std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, std::set<State> > returnTransitions;
 	std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol>>, std::set<State> > localTransitions;
 public:
-	explicit RealTimeHeightDeterministicNPDA(const alphabet::Symbol& bottomOfTheStackSymbol);
+	explicit RealTimeHeightDeterministicNPDA(alphabet::Symbol bottomOfTheStackSymbol);
 
 	virtual AutomatonBase* clone() const;
 	
@@ -59,9 +59,9 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addCallTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& next, const alphabet::Symbol& push);
-	bool addCallTransition(const State& current, const State& next, const alphabet::Symbol& push);
-	bool addCallTransition(const State& current, const alphabet::Symbol& input, const State& next, const alphabet::Symbol& push);
+	bool addCallTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, State next, alphabet::Symbol push);
+	bool addCallTransition(State current, State next, alphabet::Symbol push);
+	bool addCallTransition(State current, alphabet::Symbol input, State next, alphabet::Symbol push);
 
 	/**
 	 * Adds return transition defined by parameters to the automaton.
@@ -70,9 +70,9 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addReturnTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& next);
-	bool addReturnTransition(const State& current, const alphabet::Symbol& pop, const State& next);
-	bool addReturnTransition(const State& current, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& next);
+	bool addReturnTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State next);
+	bool addReturnTransition(State current, alphabet::Symbol pop, State next);
+	bool addReturnTransition(State current, alphabet::Symbol input, alphabet::Symbol pop, State next);
 
 	/**
 	 * Adds local transition defined by parameters to the automaton.
@@ -81,9 +81,9 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addLocalTransition(const State& current, const std::variant<string::Epsilon, alphabet::Symbol>& input, const State& next);
-	bool addLocalTransition(const State& current, const State& next);
-	bool addLocalTransition(const State& current, const alphabet::Symbol& input, const State& next);
+	bool addLocalTransition(State current, std::variant<string::Epsilon, alphabet::Symbol> input, State next);
+	bool addLocalTransition(State current, State next);
+	bool addLocalTransition(State current, alphabet::Symbol input, State next);
 
 	/**
 	 * Removes call transition from the automaton.
diff --git a/alib2data/src/automaton/PDA/SinglePopDPDA.cpp b/alib2data/src/automaton/PDA/SinglePopDPDA.cpp
index b8e1a85633d0fba4b56fe1aa2ad8e07ca33c02f2..ba7a558be4636df8298d5f0a36e78c119fa368f5 100644
--- a/alib2data/src/automaton/PDA/SinglePopDPDA.cpp
+++ b/alib2data/src/automaton/PDA/SinglePopDPDA.cpp
@@ -14,7 +14,7 @@
 
 namespace automaton {
 
-SinglePopDPDA::SinglePopDPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) {
+SinglePopDPDA::SinglePopDPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -40,7 +40,7 @@ bool SinglePopDPDA::removeState(const State& state) {
 			throw AutomatonException("State \"" + (std::string) state.getName() + "\" is used in transition.");
 		if(transition->second.first == state)
 			throw AutomatonException("State \"" + (std::string) state.getName() + "\" is used in transition.");
-		
+
 	}
 
 	return states.erase(state);
@@ -71,7 +71,7 @@ bool SinglePopDPDA::removeStackSymbol(const alphabet::Symbol& symbol) {
 	return stackAlphabet.erase(symbol);
 }
 
-bool SinglePopDPDA::addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
+bool SinglePopDPDA::addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -94,50 +94,50 @@ bool SinglePopDPDA::addTransition(const State& from, const std::variant<string::
 		}
 	}
 
-	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, input, pop);
-	std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push);
+	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop));
+	std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(std::move(to), std::move(push));
 
 	if (transitions.find(key) != transitions.end()) {
 		if(transitions.find(key)->second == value)
 			return false;
 		else if (input.is<alphabet::Symbol>())
 			throw AutomatonException(
-				"Transition (\"" + (std::string) from.getName() + "\", \"" + (std::string) input.get<alphabet::Symbol>() + "\", \"" + (std::string) pop + "\") -> ?? already exists.");
+				"Transition (\"" + (std::string) std::get<0>(key).getName() + "\", \"" + (std::string) std::get<1>(key).get<alphabet::Symbol>() + "\", \"" + (std::string) std::get<2>(key) + "\") -> ?? already exists.");
 		else
 			throw AutomatonException(
-				"Transition (\"" + (std::string) from.getName() + "\", \"" + (std::string) input.get<string::Epsilon>() + "\", \"" + (std::string) pop + "\") -> ?? already exists.");
+				"Transition (\"" + (std::string) std::get<0>(key).getName() + "\", \"" + (std::string) std::get<1>(key).get<string::Epsilon>() + "\", \"" + (std::string) std::get<2>(key) + "\") -> ?? already exists.");
 	}
 
 	if(input.is<string::Epsilon>()) {
 		if(std::any_of(transitions.begin(), transitions.end(), [&](const std::pair<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, std::pair<automaton::State, std::vector<alphabet::Symbol> > > & transition) {
-				if(std::get<0>(transition.first) == from && std::get<2>(transition.first) == pop) return true;
+				if(std::get<0>(transition.first) == std::get<0>(key) && std::get<2>(transition.first) == std::get<2>(key)) return true;
 				return false;
 			}))
 				throw exception::AlibException("Conflicting transition");
 	} else {
-		std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, std::variant<string::Epsilon, alphabet::Symbol>{ string::Epsilon { } }, pop);
-		if(transitions.find(key) != transitions.end())
+		std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key2(std::get<0>(key), std::variant<string::Epsilon, alphabet::Symbol>{ string::Epsilon::EPSILON }, std::get<2>(key));
+		if(transitions.find(key2) != transitions.end())
 			throw exception::AlibException("Conflicting transition");
 	}
 
-	transitions.insert(std::make_pair(key, value) );
+	transitions.insert(std::make_pair(std::move(key), std::move(value)) );
 	return true;
 }
 
-bool SinglePopDPDA::addTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
-	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addTransition(from, inputVariant, pop, to, push);
+bool SinglePopDPDA::addTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) {
+	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input));
+	return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push));
 }
 
-bool SinglePopDPDA::addTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
+bool SinglePopDPDA::addTransition(State from, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addTransition(from, inputVariant, pop, to, push);
+	return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push));
 }
 
 bool SinglePopDPDA::removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
 	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, input, pop);
 	std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push);
-	
+
 	if (transitions.find(key) == transitions.end())
 		return false;
 
diff --git a/alib2data/src/automaton/PDA/SinglePopDPDA.h b/alib2data/src/automaton/PDA/SinglePopDPDA.h
index f79eb5fdfd43b3cf5c3ae29c1c09bbda9ed164ae..dd9a248a14bd6801a462b61b60c10ac534a6daca 100644
--- a/alib2data/src/automaton/PDA/SinglePopDPDA.h
+++ b/alib2data/src/automaton/PDA/SinglePopDPDA.h
@@ -32,10 +32,10 @@ class SinglePopDPDA: public std::acceptor<SinglePopDPDA, VisitableAutomatonBase,
 protected:
 	std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, std::pair<State, std::vector<alphabet::Symbol> > > transitions;
 public:
-	explicit SinglePopDPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol);
+	explicit SinglePopDPDA(State initialState, alphabet::Symbol initialPushdownSymbol);
 
 	virtual AutomatonBase* clone() const;
-	
+
 	virtual AutomatonBase* plunder() &&;
 
 	/**
@@ -59,11 +59,11 @@ public:
 	 * @throws AutomatonException when some part of the transition is not present
 	 * in the SinglePopDPDA (state, input symbol, stack symbol) or when transition already exists
 	 */
-	bool addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
+	bool addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push);
+
+	bool addTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push);
 
-	bool addTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
-	
-	bool addTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
+	bool addTransition(State from, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push);
 
 	/**
 	 * Removes the transition from the SinglePopDPDA.
@@ -73,7 +73,7 @@ public:
 	bool removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
 
 	bool removeTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
-	
+
 	bool removeTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
 
 	/**
diff --git a/alib2data/src/automaton/PDA/SinglePopNPDA.cpp b/alib2data/src/automaton/PDA/SinglePopNPDA.cpp
index 10bfabf086c859919d8b5234b3b0702adc80de11..2a14234aafa7cebfe6c1c6c56489d7fa7390cbef 100644
--- a/alib2data/src/automaton/PDA/SinglePopNPDA.cpp
+++ b/alib2data/src/automaton/PDA/SinglePopNPDA.cpp
@@ -13,7 +13,7 @@
 
 namespace automaton {
 
-SinglePopNPDA::SinglePopNPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(initialPushdownSymbol), SingleInitialState(initialState) {
+SinglePopNPDA::SinglePopNPDA(State initialState, alphabet::Symbol initialPushdownSymbol) : SingleInitialSymbolPushdownStoreAlphabet(std::move(initialPushdownSymbol)), SingleInitialState(std::move(initialState)) {
 
 }
 
@@ -73,7 +73,7 @@ bool SinglePopNPDA::removeStackSymbol(const alphabet::Symbol& symbol) {
 	return stackAlphabet.erase(symbol);
 }
 
-bool SinglePopNPDA::addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
+bool SinglePopNPDA::addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -96,20 +96,20 @@ bool SinglePopNPDA::addTransition(const State& from, const std::variant<string::
 		}
 	}
 
-	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(from, input, pop);
-	std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(to, push);
+	std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop));
+	std::pair<automaton::State, std::vector<alphabet::Symbol> > value = std::make_pair(std::move(to), std::move(push));
 
-	return transitions[key].insert(value).second;
+	return transitions[std::move(key)].insert(std::move(value)).second;
 }
 
-bool SinglePopNPDA::addTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
-	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(input);
-	return addTransition(from, inputVariant, pop, to, push);
+bool SinglePopNPDA::addTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) {
+	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(std::move(input));
+	return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push));
 }
 
-bool SinglePopNPDA::addTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
+bool SinglePopNPDA::addTransition(State from, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push) {
 	std::variant<string::Epsilon, alphabet::Symbol> inputVariant(string::Epsilon::EPSILON);
-	return addTransition(from, inputVariant, pop, to, push);
+	return addTransition(std::move(from), std::move(inputVariant), std::move(pop), std::move(to), std::move(push));
 }
 
 bool SinglePopNPDA::removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push) {
diff --git a/alib2data/src/automaton/PDA/SinglePopNPDA.h b/alib2data/src/automaton/PDA/SinglePopNPDA.h
index 4c5b5d386470d6b930f19d633f62bd02d071372d..cb3e381a99efa98fbbe94c152661b23ca4d42f12 100644
--- a/alib2data/src/automaton/PDA/SinglePopNPDA.h
+++ b/alib2data/src/automaton/PDA/SinglePopNPDA.h
@@ -28,10 +28,10 @@ class SinglePopNPDA: public std::acceptor<SinglePopNPDA, VisitableAutomatonBase,
 protected:
 	std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, alphabet::Symbol>, std::set<std::pair<State, std::vector<alphabet::Symbol> > > > transitions;
 public:
-	explicit SinglePopNPDA(const State& initialState, const alphabet::Symbol& initialPushdownSymbol);
+	explicit SinglePopNPDA(State initialState, alphabet::Symbol initialPushdownSymbol);
 
 	virtual AutomatonBase* clone() const;
-	
+
 	virtual AutomatonBase* plunder() &&;
 
 	/**
@@ -55,11 +55,11 @@ public:
 	 * @throws AutomatonException when some part of the transition is not present
 	 * in the SinglePopNPDA (state, input symbol, stack symbol) or when transition already exists
 	 */
-	bool addTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
+	bool addTransition(State from, std::variant<string::Epsilon, alphabet::Symbol> input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push);
+
+	bool addTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push);
 
-	bool addTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
-	
-	bool addTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
+	bool addTransition(State from, alphabet::Symbol pop, State to, std::vector<alphabet::Symbol> push);
 
 	/**
 	 * Removes the transition from the SinglePopNPDA.
@@ -69,7 +69,7 @@ public:
 	bool removeTransition(const State& from, const std::variant<string::Epsilon, alphabet::Symbol>& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
 
 	bool removeTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
-	
+
 	bool removeTransition(const State& from, const alphabet::Symbol& pop, const State& to, const std::vector<alphabet::Symbol>& push);
 
 	/**
diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp
index 77bd069f36563e1cf14c65e3329d16cbfca7366c..c4447ac516248598e90d31671a61a34cff50da47 100644
--- a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp
+++ b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.cpp
@@ -13,7 +13,7 @@
 
 namespace automaton {
 
-VisiblyPushdownDPDA::VisiblyPushdownDPDA(const State& initialState, const alphabet::Symbol& bottomOfTheStackSymbol) : SingleInitialState(initialState), BottomOfTheStackSymbolPushdownStoreAlphabet(bottomOfTheStackSymbol) {
+VisiblyPushdownDPDA::VisiblyPushdownDPDA(State initialState, alphabet::Symbol bottomOfTheStackSymbol) : SingleInitialState(std::move(initialState)), BottomOfTheStackSymbolPushdownStoreAlphabet(std::move(bottomOfTheStackSymbol)) {
 
 }
 
@@ -95,7 +95,7 @@ bool VisiblyPushdownDPDA::removeStackSymbol(const alphabet::Symbol& symbol) {
 	return stackAlphabet.erase(symbol);
 }
 
-bool VisiblyPushdownDPDA::addCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) {
+bool VisiblyPushdownDPDA::addCallTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol push) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -112,29 +112,29 @@ bool VisiblyPushdownDPDA::addCallTransition(const State& from, const alphabet::S
 		throw AutomatonException("Stack symbol \"" + (std::string) push + "\" doesn't exist.");
 	}
 
-	std::pair<State, alphabet::Symbol> key(from, input);
-	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push);
+	std::pair<State, alphabet::Symbol> key(std::move(from), std::move(input));
+	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(std::move(to), std::move(push));
 
 	if(callTransitions.find(key) != callTransitions.end() && callTransitions.find(key)->second == value)
 		return false;
 
 	for(const auto& transition : callTransitions)
-		if(transition.first.first == from && transition.first.second == input)
-			throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+		if(transition.first.first == key.first && transition.first.second == key.second)
+			throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 
 	for(const auto& transition : returnTransitions)
-		if(std::get<0>(transition.first) == from && std::get<1>(transition.first) == input)
-			throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+		if(std::get<0>(transition.first) == key.first && std::get<1>(transition.first) == key.second)
+			throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 
 	for(const auto& transition : localTransitions)
-		if(transition.first.first == from && transition.first.second == input)
-			throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+		if(transition.first.first == key.first && transition.first.second == key.second)
+			throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 
-	callTransitions.insert(std::make_pair(key, value));
+	callTransitions.insert(std::make_pair(std::move(key), std::move(value)));
 	return true;
 }
 
-bool VisiblyPushdownDPDA::addReturnTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to) {
+bool VisiblyPushdownDPDA::addReturnTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -151,28 +151,28 @@ bool VisiblyPushdownDPDA::addReturnTransition(const State& from, const alphabet:
 		throw AutomatonException("Stack symbol \"" + (std::string) pop + "\" doesn't exist.");
 	}
 
-	std::tuple<State, alphabet::Symbol, alphabet::Symbol> key(from, input, pop);
+	std::tuple<State, alphabet::Symbol, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop));
 
 	if(returnTransitions.find(key) != returnTransitions.end() && returnTransitions.find(key)->second == to)
 		return false;
 
 	for(const auto& transition : callTransitions)
-		if(transition.first.first == from && transition.first.second == input)
-			throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+		if(transition.first.first == std::get<0>(key) && transition.first.second == std::get<1>(key))
+			throw AutomatonException("Can't add transition from state \"" + (std::string) std::get<0>(key) + "\" when transition reading \"" + (std::string) std::get<1>(key) + "\" is present.");
 
 	for(const auto& transition : returnTransitions)
-		if(std::get<0>(transition.first) == from && std::get<1>(transition.first) == input && std::get<2>(transition.first) == pop)
+		if(std::get<0>(transition.first) == std::get<0>(key) && std::get<1>(transition.first) == std::get<1>(key) && std::get<2>(transition.first) == std::get<2>(key))
 			throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
 
 	for(const auto& transition : localTransitions)
-		if(transition.first.first == from && transition.first.second == input)
-			throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+		if(transition.first.first == std::get<0>(key) && transition.first.second == std::get<1>(key))
+			throw AutomatonException("Can't add transition from state \"" + (std::string) std::get<0>(key) + "\" when transition reading \"" + (std::string) std::get<1>(key) + "\" is present.");
 
-	returnTransitions.insert(std::make_pair(key, to));
+	returnTransitions.insert(std::make_pair(std::move(key), std::move(to)));
 	return true;
 }
 
-bool VisiblyPushdownDPDA::addLocalTransition(const State& from, const alphabet::Symbol& input, const State& to) {
+bool VisiblyPushdownDPDA::addLocalTransition(State from, alphabet::Symbol input, State to) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -185,31 +185,31 @@ bool VisiblyPushdownDPDA::addLocalTransition(const State& from, const alphabet::
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 	}
 
-	std::pair<State, alphabet::Symbol> key(from, input);
-	
+	std::pair<State, alphabet::Symbol> key(std::move(from), std::move(input));
+
 	if(localTransitions.find(key) != localTransitions.end() && localTransitions.find(key)->second == to)
 		return false;
 
 	for(const auto& transition : callTransitions)
-		if(transition.first.first == from && transition.first.second == input)
-			throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+		if(transition.first.first == key.first && transition.first.second == key.second)
+			throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 
 	for(const auto& transition : returnTransitions)
-		if(std::get<0>(transition.first) == from && std::get<1>(transition.first) == input)
-			throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+		if(std::get<0>(transition.first) == key.first && std::get<1>(transition.first) == key.second)
+			throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 
 	for(const auto& transition : localTransitions)
-		if(transition.first.first == from && transition.first.second == input)
-			throw AutomatonException("Can't add transition from state \"" + (std::string) from + "\" when transition reading \"" + (std::string) input + "\" is present.");
+		if(transition.first.first == key.first && transition.first.second == key.second)
+			throw AutomatonException("Can't add transition from state \"" + (std::string) key.first + "\" when transition reading \"" + (std::string) key.second + "\" is present.");
 
-	localTransitions.insert(std::make_pair(key, to));
+	localTransitions.insert(std::make_pair(std::move(key), std::move(to)));
 	return true;
 }
 
 bool VisiblyPushdownDPDA::removeCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) {
 	std::pair<State, alphabet::Symbol> key(from, input);
 	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push);
-	
+
 	if (callTransitions.find(key) == callTransitions.end())
 		return false;
 
diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h
index cda77c82af94a7c8067467e6a67d5ea51b0490eb..2331ef5caab93a2289f1ffc9bcc154d2ddeb66ec 100644
--- a/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h
+++ b/alib2data/src/automaton/PDA/VisiblyPushdownDPDA.h
@@ -29,10 +29,10 @@ protected:
 	std::map<std::tuple<State, alphabet::Symbol, alphabet::Symbol>, State > returnTransitions;
 	std::map<std::pair<State, alphabet::Symbol>, State > localTransitions;
 public:
-	explicit VisiblyPushdownDPDA(const State& initialSymbol, const alphabet::Symbol& bottomOfTheStackSymbol);
+	explicit VisiblyPushdownDPDA(State initialSymbol, alphabet::Symbol bottomOfTheStackSymbol);
 
 	virtual AutomatonBase* clone() const;
-	
+
 	virtual AutomatonBase* plunder() &&;
 
 	/**
@@ -57,7 +57,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addCallTransition(const State& current, const alphabet::Symbol& input, const State& next, const alphabet::Symbol& push);
+	bool addCallTransition(State current, alphabet::Symbol input, State next, alphabet::Symbol push);
 
 	/**
 	 * Adds return transition defined by parameters to the automaton.
@@ -66,7 +66,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addReturnTransition(const State& current, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& next);
+	bool addReturnTransition(State current, alphabet::Symbol input, alphabet::Symbol pop, State next);
 
 	/**
 	 * Adds local transition defined by parameters to the automaton.
@@ -75,7 +75,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addLocalTransition(const State& current, const alphabet::Symbol& input, const State& next);
+	bool addLocalTransition(State current, alphabet::Symbol input, State next);
 
 	/**
 	 * Removes call transition from the automaton.
diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp
index 746d4922db02ce67d98d933da3643af4cef6b1db..d332756b877b947ea51d71dd81ba4d96a875a9cd 100644
--- a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp
+++ b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.cpp
@@ -13,7 +13,7 @@
 
 namespace automaton {
 
-VisiblyPushdownNPDA::VisiblyPushdownNPDA(const alphabet::Symbol& bottomOfTheStackSymbol) : BottomOfTheStackSymbolPushdownStoreAlphabet(bottomOfTheStackSymbol) {
+VisiblyPushdownNPDA::VisiblyPushdownNPDA(alphabet::Symbol bottomOfTheStackSymbol) : BottomOfTheStackSymbolPushdownStoreAlphabet(std::move(bottomOfTheStackSymbol)) {
 
 }
 
@@ -103,7 +103,7 @@ bool VisiblyPushdownNPDA::removeStackSymbol(const alphabet::Symbol& symbol) {
 	return stackAlphabet.erase(symbol);
 }
 
-bool VisiblyPushdownNPDA::addCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) {
+bool VisiblyPushdownNPDA::addCallTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol push) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -120,13 +120,13 @@ bool VisiblyPushdownNPDA::addCallTransition(const State& from, const alphabet::S
 		throw AutomatonException("Stack symbol \"" + (std::string) push + "\" doesn't exist.");
 	}
 
-	std::pair<State, alphabet::Symbol> key(from, input);
-	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push);
-	
-	return callTransitions[key].insert(value).second;
+	std::pair<State, alphabet::Symbol> key(std::move(from), std::move(input));
+	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(std::move(to), std::move(push));
+
+	return callTransitions[std::move(key)].insert(std::move(value)).second;
 }
 
-bool VisiblyPushdownNPDA::addReturnTransition(const State& from, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& to) {
+bool VisiblyPushdownNPDA::addReturnTransition(State from, alphabet::Symbol input, alphabet::Symbol pop, State to) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -143,12 +143,12 @@ bool VisiblyPushdownNPDA::addReturnTransition(const State& from, const alphabet:
 		throw AutomatonException("Stack symbol \"" + (std::string) pop + "\" doesn't exist.");
 	}
 
-	std::tuple<State, alphabet::Symbol, alphabet::Symbol> key(from, input, pop);
+	std::tuple<State, alphabet::Symbol, alphabet::Symbol> key(std::move(from), std::move(input), std::move(pop));
 
-	return returnTransitions[key].insert(to).second;
+	return returnTransitions[std::move(key)].insert(std::move(to)).second;
 }
 
-bool VisiblyPushdownNPDA::addLocalTransition(const State& from, const alphabet::Symbol& input, const State& to) {
+bool VisiblyPushdownNPDA::addLocalTransition(State from, alphabet::Symbol input, State to) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -161,15 +161,15 @@ bool VisiblyPushdownNPDA::addLocalTransition(const State& from, const alphabet::
 		throw AutomatonException("State \"" + (std::string) to.getName() + "\" doesn't exist.");
 	}
 
-	std::pair<State, alphabet::Symbol> key(from, input);
+	std::pair<State, alphabet::Symbol> key(std::move(from), std::move(input));
 
-	return localTransitions[key].insert(to).second;
+	return localTransitions[std::move(key)].insert(std::move(to)).second;
 }
 
 bool VisiblyPushdownNPDA::removeCallTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& push) {
 	std::pair<State, alphabet::Symbol> key(from, input);
 	std::pair<automaton::State, alphabet::Symbol> value = std::make_pair(to, push);
-	
+
 	return callTransitions[key].erase(value);
 }
 
diff --git a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h
index d6faa402c3924f73a855a776591e8b76d0aec76c..721e31babcd11dab6d1171f5a523022959d84fad 100644
--- a/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h
+++ b/alib2data/src/automaton/PDA/VisiblyPushdownNPDA.h
@@ -29,10 +29,10 @@ protected:
 	std::map<std::tuple<State, alphabet::Symbol, alphabet::Symbol>, std::set<State> > returnTransitions;
 	std::map<std::pair<State, alphabet::Symbol>, std::set<State> > localTransitions;
 public:
-	explicit VisiblyPushdownNPDA(const alphabet::Symbol& bottomOfTheStackSymbol);
+	explicit VisiblyPushdownNPDA(alphabet::Symbol bottomOfTheStackSymbol);
 
 	virtual AutomatonBase* clone() const;
-	
+
 	virtual AutomatonBase* plunder() &&;
 
 	/**
@@ -57,7 +57,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addCallTransition(const State& current, const alphabet::Symbol& input, const State& next, const alphabet::Symbol& push);
+	bool addCallTransition(State current, alphabet::Symbol input, State next, alphabet::Symbol push);
 
 	/**
 	 * Adds return transition defined by parameters to the automaton.
@@ -66,7 +66,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addReturnTransition(const State& current, const alphabet::Symbol& input, const alphabet::Symbol& pop, const State& next);
+	bool addReturnTransition(State current, alphabet::Symbol input, alphabet::Symbol pop, State next);
 
 	/**
 	 * Adds local transition defined by parameters to the automaton.
@@ -75,7 +75,7 @@ public:
 	 * @param next next state
 	 * @throws AutomatonException when transition already exists or when transition contains state or symbol not present in the automaton
 	 */
-	bool addLocalTransition(const State& current, const alphabet::Symbol& input, const State& next);
+	bool addLocalTransition(State current, alphabet::Symbol input, State next);
 
 	/**
 	 * Removes call transition from the automaton.
diff --git a/alib2data/src/automaton/TM/OneTapeDTM.cpp b/alib2data/src/automaton/TM/OneTapeDTM.cpp
index d10917dea2ee3fe2ab6db5b4724215529731c740..f4043e36fa3e6fd33c58e0abd4dc0cc4118c31a4 100644
--- a/alib2data/src/automaton/TM/OneTapeDTM.cpp
+++ b/alib2data/src/automaton/TM/OneTapeDTM.cpp
@@ -12,7 +12,8 @@
 
 namespace automaton {
 
-OneTapeDTM::OneTapeDTM(const State& initialState, const alphabet::Symbol& blank) : SingleInitialState(initialState), BlankSymbolInputTapeAlphabet(blank) {
+OneTapeDTM::OneTapeDTM(State initialState, alphabet::Symbol blank) : SingleInitialState(std::move(initialState)), BlankSymbolInputTapeAlphabet(std::move(blank)) {
+
 }
 
 AutomatonBase* OneTapeDTM::clone() const {
@@ -57,7 +58,7 @@ bool OneTapeDTM::removeTapeSymbol(const alphabet::Symbol& symbol) {
 	return inputAlphabet.erase(symbol);
 }
 
-bool OneTapeDTM::addTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& output, const Shift& shift) {
+bool OneTapeDTM::addTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol output, Shift shift) {
 	if (states.find(from) == states.end()) {
 		throw AutomatonException("State \"" + (std::string) from.getName() + "\" doesn't exist.");
 	}
@@ -79,19 +80,19 @@ bool OneTapeDTM::addTransition(const State& from, const alphabet::Symbol& input,
 	if(shift == Shift::NOT_SET)
 		throw AutomatonException("Invalid shift.");
 
-	std::pair<State, alphabet::Symbol> key = std::make_pair(from, input);
-	
-	std::tuple<State, alphabet::Symbol, Shift > value(to, output, shift);
+	std::pair<State, alphabet::Symbol> key = std::make_pair(std::move(from), std::move(input));
+
+	std::tuple<State, alphabet::Symbol, Shift > value(std::move(to), std::move(output), shift);
 
 	if (transitions.find(key) != transitions.end()) {
 		if(transitions.find(key)->second == value)
 			return false;
 		else
 			throw AutomatonException(
-				"Transition (\"" + (std::string) from.getName() + "\", \"" + (std::string) input + "\") -> ? already exists.");
+				"Transition (\"" + (std::string) key.first.getName() + "\", \"" + (std::string) key.second + "\") -> ? already exists.");
 	}
 
-	transitions.insert(std::make_pair(key, value));
+	transitions.insert(std::make_pair(std::move(key), std::move(value)));
 	return true;
 }
 
diff --git a/alib2data/src/automaton/TM/OneTapeDTM.h b/alib2data/src/automaton/TM/OneTapeDTM.h
index 9ee3d33169c3fdd2fcf8d7589be82ce3995edc6c..b140ccb17dcca07ebaa86223f19cbcf31dd94435 100644
--- a/alib2data/src/automaton/TM/OneTapeDTM.h
+++ b/alib2data/src/automaton/TM/OneTapeDTM.h
@@ -27,7 +27,7 @@ protected:
 	std::map<std::pair<State, alphabet::Symbol>, std::tuple<State, alphabet::Symbol, Shift> > transitions;
 
 public:
-	explicit OneTapeDTM(const State& initialState, const alphabet::Symbol& blank);
+	explicit OneTapeDTM(State initialState, alphabet::Symbol blank);
 
 	virtual AutomatonBase* clone() const;
 
@@ -59,7 +59,7 @@ public:
 	 * @throws AutomatonException when some part of the transition is not present
 	 * in the TM (state, tape symbol) or when transition already exists
 	 */
-	bool addTransition(const State& from, const alphabet::Symbol& input, const State& to, const alphabet::Symbol& output, const Shift& shift);
+	bool addTransition(State from, alphabet::Symbol input, State to, alphabet::Symbol output, Shift shift);
 
 	/**
 	 * Removes the transition from the TM.
diff --git a/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.cpp b/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.cpp
index b47b87b2475aec0d7989e20b5c28d0c654d566cc..e3dcf86e6b27a140b435188e51ad88fe3582e9f0 100644
--- a/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.cpp
+++ b/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.cpp
@@ -12,16 +12,16 @@
 
 namespace automaton {
 
-BlankSymbolInputTapeAlphabet::BlankSymbolInputTapeAlphabet(const alphabet::Symbol& blank) : blankSymbol(blank) {
-	tapeAlphabet.insert(blank);
+BlankSymbolInputTapeAlphabet::BlankSymbolInputTapeAlphabet(alphabet::Symbol blank) : blankSymbol(blank) {
+	tapeAlphabet.insert(std::move(blank));
 }
 
 const std::set<alphabet::Symbol>& BlankSymbolInputTapeAlphabet::getInputAlphabet() const {
 	return inputAlphabet;
 }
 
-bool BlankSymbolInputTapeAlphabet::addInputSymbol(const alphabet::Symbol& symbol) {
-	if (tapeAlphabet.find(symbol) == tapeAlphabet.end()) {
+bool BlankSymbolInputTapeAlphabet::addInputSymbol(alphabet::Symbol symbol) {
+	if (!tapeAlphabet.count(symbol)) {
 		throw AutomatonException("Input symbol \"" + (std::string) symbol + "\" is not in tape alphabet.");
 	}
 
@@ -29,57 +29,55 @@ bool BlankSymbolInputTapeAlphabet::addInputSymbol(const alphabet::Symbol& symbol
 		throw AutomatonException("Input symbol \"" + (std::string) symbol + "\" cannot be blank symbol.");
 	}
 
-	return inputAlphabet.insert(symbol).second;
+	return inputAlphabet.insert(std::move(symbol)).second;
 }
 
-void BlankSymbolInputTapeAlphabet::setInputAlphabet(const std::set<alphabet::Symbol>& newSymbols) {
+void BlankSymbolInputTapeAlphabet::setInputAlphabet(std::set<alphabet::Symbol> newSymbols) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(newSymbols.begin(), newSymbols.end(), inputAlphabet.begin(), inputAlphabet.end(), std::inserter(added, added.end()));
-	
+	if(!std::includes(tapeAlphabet.begin(), tapeAlphabet.end(), newSymbols.begin(), newSymbols.end())) {
+		throw AutomatonException("Input symbol ? is not in tape alphabet.");
+	}
+
+	if(newSymbols.count(blankSymbol)) {
+		throw AutomatonException("Input symbol ? cannot be blank symbol.");
+	}
+
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeInputSymbol(removedSymbol);
 	}
 
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addInputSymbol(addedSymbol);
-	}
+	inputAlphabet = std::move(newSymbols);
 }
 
-bool BlankSymbolInputTapeAlphabet::addTapeSymbol(const alphabet::Symbol& symbol) {
-	return tapeAlphabet.insert(symbol).second;
+bool BlankSymbolInputTapeAlphabet::addTapeSymbol(alphabet::Symbol symbol) {
+	return tapeAlphabet.insert(std::move(symbol)).second;
 }
 
-void BlankSymbolInputTapeAlphabet::setTapeAlphabet(const std::set<alphabet::Symbol>& newSymbols) {
+void BlankSymbolInputTapeAlphabet::setTapeAlphabet(std::set<alphabet::Symbol> newSymbols) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(tapeAlphabet.begin(), tapeAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(newSymbols.begin(), newSymbols.end(), tapeAlphabet.begin(), tapeAlphabet.end(), std::inserter(added, added.end()));
-	
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeTapeSymbol(removedSymbol);
 	}
 
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addTapeSymbol(addedSymbol);
-	}
+	tapeAlphabet = std::move(newSymbols);
 }
 
 const std::set<alphabet::Symbol>& BlankSymbolInputTapeAlphabet::getTapeAlphabet() const {
 	return tapeAlphabet;
 }
 
-void BlankSymbolInputTapeAlphabet::setBlankSymbol(const alphabet::Symbol& symbol) {
-	if (inputAlphabet.find(symbol) != inputAlphabet.end())
+void BlankSymbolInputTapeAlphabet::setBlankSymbol(alphabet::Symbol symbol) {
+	if (inputAlphabet.count(symbol))
 		throw AutomatonException("Blank symbol \"" + (std::string) symbol + "\" is in input alphabet.");
 
-	if (tapeAlphabet.find(symbol) == tapeAlphabet.end())
+	if (!tapeAlphabet.count(symbol))
 		throw AutomatonException("Blank symbol \"" + (std::string) symbol + "\" is not in tape alphabet.");
 
-	blankSymbol = symbol;
+	blankSymbol = std::move(symbol);
 
 }
 
diff --git a/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.h b/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.h
index 968457aea47015733a16c39b52bf636db9f09219..a6468ab47d3aa9ab1bf42ed95b6b46a99cffbc2c 100644
--- a/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.h
+++ b/alib2data/src/automaton/common/BlankSymbolInputTapeAlphabet.h
@@ -19,21 +19,21 @@ protected:
 	std::set<alphabet::Symbol> inputAlphabet;
 	alphabet::Symbol blankSymbol;
 public:
-	BlankSymbolInputTapeAlphabet(const alphabet::Symbol& blank);
+	BlankSymbolInputTapeAlphabet(alphabet::Symbol blank);
 
 	/**
 	 * Adds input symbol to input alphabet.
 	 * @param symbol Symbol to add
 	 * @throws AutomatonException when symbol already exists
 	 */
-	bool addInputSymbol(const alphabet::Symbol& symbol);
+	bool addInputSymbol(alphabet::Symbol symbol);
 
 	/**
 	 * Sets input symbols of the automaton.
 	 * @param symbols Symbols to set
 	 * @throws AutomatonException when symbol already exists
 	 */
-	void setInputAlphabet(const std::set<alphabet::Symbol>& symbol);
+	void setInputAlphabet(std::set<alphabet::Symbol> symbol);
 
 	/**
 	 * Removes input symbol from the input alphabet.
@@ -53,14 +53,14 @@ public:
 	 * @param symbol Symbol to add
 	 * @throw AutomatonException when Symbol is already present in tape alphabet
 	 */
-	bool addTapeSymbol(const alphabet::Symbol& symbol);
+	bool addTapeSymbol(alphabet::Symbol symbol);
 
 	/**
 	 * Sets tape symbols of the automaton.
 	 * @param symbols Symbols to set
 	 * @throw AutomatonException when Symbol is already present in tape alphabet
 	 */
-	void setTapeAlphabet(const std::set<alphabet::Symbol>& symbols);
+	void setTapeAlphabet(std::set<alphabet::Symbol> symbols);
 
 	/**
 	 * Removes symbol from the tape alphabet.
@@ -79,7 +79,7 @@ public:
 	 * Sets the blank symbol = symbol representing empty cell of the tape
 	 * @param symbol Symbol to set
 	 */
-	void setBlankSymbol(const alphabet::Symbol& symbol);
+	void setBlankSymbol(alphabet::Symbol symbol);
 
 	/**
 	 * @return symbol representing empty cell of the tape
diff --git a/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.cpp b/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.cpp
index 564e0e33f73795b37bfb3745d93325fd16aca967..35d9a8d950a71dbc216c76276bff632095b5587f 100644
--- a/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.cpp
+++ b/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.cpp
@@ -11,16 +11,16 @@
 
 namespace automaton {
 
-BottomOfTheStackSymbolPushdownStoreAlphabet::BottomOfTheStackSymbolPushdownStoreAlphabet(const alphabet::Symbol& bottomOfTheStackSymbol) : bottomOfTheStackSymbol(bottomOfTheStackSymbol) {
-	addStackSymbol(bottomOfTheStackSymbol);
+BottomOfTheStackSymbolPushdownStoreAlphabet::BottomOfTheStackSymbolPushdownStoreAlphabet(alphabet::Symbol bottomOfTheStackSymbol) : bottomOfTheStackSymbol(bottomOfTheStackSymbol) {
+	addStackSymbol(std::move(bottomOfTheStackSymbol));
 }
 
-void BottomOfTheStackSymbolPushdownStoreAlphabet::setBottomOfTheStackSymbol(const alphabet::Symbol& start) {
-	if (stackAlphabet.find(start) == stackAlphabet.end()) {
+void BottomOfTheStackSymbolPushdownStoreAlphabet::setBottomOfTheStackSymbol(alphabet::Symbol start) {
+	if (!stackAlphabet.count(start)) {
 		throw AutomatonException("Stack symbol \"" + (std::string) start + "\" doesn't exist.");
 	}
-	
-	bottomOfTheStackSymbol = start;
+
+	bottomOfTheStackSymbol = std::move(start);
 }
 
 const alphabet::Symbol& BottomOfTheStackSymbolPushdownStoreAlphabet::getBottomOfTheStackSymbol() const {
diff --git a/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.h b/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.h
index e177cd142148d319eb4a205141c4be6dfc80091b..67c2317e27b9ec33f14ee8eb5b0b01cb8cc8ad79 100644
--- a/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.h
+++ b/alib2data/src/automaton/common/BottomOfTheStackSymbolPushdownStoreAlphabet.h
@@ -21,7 +21,7 @@ class BottomOfTheStackSymbolPushdownStoreAlphabet : public PushdownStoreAlphabet
 protected:
 	alphabet::Symbol bottomOfTheStackSymbol;
 public:
-	BottomOfTheStackSymbolPushdownStoreAlphabet(const alphabet::Symbol& bottomOfTheStackSymbol);
+	BottomOfTheStackSymbolPushdownStoreAlphabet(alphabet::Symbol bottomOfTheStackSymbol);
 
 	/**
 	 * Set bottomOfTheStack symbol. BottomOfTheStack symbol is symbol that is pushed
@@ -29,9 +29,8 @@ public:
 	 * @param start new bottomOfTheStack symbol
 	 * @throws AutomatonException when symbol is not present in the stack alphabet
 	 */
-	void setBottomOfTheStackSymbol(const alphabet::Symbol& start);
-	
-	
+	void setBottomOfTheStackSymbol(alphabet::Symbol start);
+
 	/**
 	 * @return list of start symbols
 	 */
diff --git a/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.cpp b/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.cpp
index 45c35195c41bd6d36fce52852b0b6acaff2bd19d..7916625e6c595521cb5e861c78775a15470b47d8 100644
--- a/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.cpp
+++ b/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.cpp
@@ -16,84 +16,69 @@ const std::set<alphabet::Symbol>& CallReturnLocalInputAlphabet::getCallInputAlph
 	return callInputAlphabet;
 }
 
-bool CallReturnLocalInputAlphabet::addCallInputSymbol(const alphabet::Symbol& symbol) {
+bool CallReturnLocalInputAlphabet::addCallInputSymbol(alphabet::Symbol symbol) {
 	if(returnInputAlphabet.count(symbol))
 		throw exception::AlibException("Input symbol " + (std::string) symbol + " already in return alphabet");
 	if(localInputAlphabet.count(symbol))
 		throw exception::AlibException("Input symbol " + (std::string) symbol + " already in local alphabet");
-	return callInputAlphabet.insert(symbol).second;
+	return callInputAlphabet.insert(std::move(symbol)).second;
 }
 
-void CallReturnLocalInputAlphabet::setCallInputAlphabet(const std::set<alphabet::Symbol>& newSymbols) {
+void CallReturnLocalInputAlphabet::setCallInputAlphabet(std::set<alphabet::Symbol> newSymbols) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(callInputAlphabet.begin(), callInputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(newSymbols.begin(), newSymbols.end(), callInputAlphabet.begin(), callInputAlphabet.end(), std::inserter(added, added.end()));
-	
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeInputSymbol(removedSymbol);
 	}
 
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addCallInputSymbol(addedSymbol);
-	}
+	callInputAlphabet = std::move(newSymbols);
 }
 
 const std::set<alphabet::Symbol>& CallReturnLocalInputAlphabet::getReturnInputAlphabet() const {
 	return returnInputAlphabet;
 }
 
-bool CallReturnLocalInputAlphabet::addReturnInputSymbol(const alphabet::Symbol& symbol) {
+bool CallReturnLocalInputAlphabet::addReturnInputSymbol(alphabet::Symbol symbol) {
 	if(localInputAlphabet.count(symbol))
 		throw exception::AlibException("Input symbol " + (std::string) symbol + " already in local alphabet");
 	if(callInputAlphabet.count(symbol))
 		throw exception::AlibException("Input symbol " + (std::string) symbol + " already in call alphabet");
-	return returnInputAlphabet.insert(symbol).second;
+	return returnInputAlphabet.insert(std::move(symbol)).second;
 }
 
-void CallReturnLocalInputAlphabet::setReturnInputAlphabet(const std::set<alphabet::Symbol>& newSymbols) {
+void CallReturnLocalInputAlphabet::setReturnInputAlphabet(std::set<alphabet::Symbol> newSymbols) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(returnInputAlphabet.begin(), returnInputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(newSymbols.begin(), newSymbols.end(), returnInputAlphabet.begin(), returnInputAlphabet.end(), std::inserter(added, added.end()));
-	
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeInputSymbol(removedSymbol);
 	}
 
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addReturnInputSymbol(addedSymbol);
-	}
+	returnInputAlphabet = std::move(newSymbols);
 }
 
 const std::set<alphabet::Symbol>& CallReturnLocalInputAlphabet::getLocalInputAlphabet() const {
 	return localInputAlphabet;
 }
 
-bool CallReturnLocalInputAlphabet::addLocalInputSymbol(const alphabet::Symbol& symbol) {
+bool CallReturnLocalInputAlphabet::addLocalInputSymbol(alphabet::Symbol symbol) {
 	if(callInputAlphabet.count(symbol))
 		throw exception::AlibException("Input symbol " + (std::string) symbol + " already in call alphabet");
 	if(returnInputAlphabet.count(symbol))
 		throw exception::AlibException("Input symbol " + (std::string) symbol + " already in return alphabet");
-	return localInputAlphabet.insert(symbol).second;
+	return localInputAlphabet.insert(std::move(symbol)).second;
 }
 
-void CallReturnLocalInputAlphabet::setLocalInputAlphabet(const std::set<alphabet::Symbol>& newSymbols) {
+void CallReturnLocalInputAlphabet::setLocalInputAlphabet(std::set<alphabet::Symbol> newSymbols) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(localInputAlphabet.begin(), localInputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(newSymbols.begin(), newSymbols.end(), localInputAlphabet.begin(), localInputAlphabet.end(), std::inserter(added, added.end()));
-	
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeInputSymbol(removedSymbol);
 	}
 
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addLocalInputSymbol(addedSymbol);
-	}
+	localInputAlphabet = std::move(newSymbols);
 }
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.h b/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.h
index 87339acbe611a2929bab910efa68cd293de73487..66e045e959aaa9fef72e087bb55b5a4348d6a752 100644
--- a/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.h
+++ b/alib2data/src/automaton/common/CallReturnLocalInputAlphabet.h
@@ -28,42 +28,42 @@ public:
 	 * @param symbol Symbol to add
 	 * @throws AutomatonException when symbol already exists
 	 */
-	bool addCallInputSymbol(const alphabet::Symbol& symbol);
+	bool addCallInputSymbol(alphabet::Symbol symbol);
 
 	/**
 	 * Sets input symbols of the automaton.
 	 * @param symbols Symbols to set
 	 * @throws AutomatonException when symbol already exists
 	 */
-	void setCallInputAlphabet(const std::set<alphabet::Symbol>& symbols);
+	void setCallInputAlphabet(std::set<alphabet::Symbol> symbols);
 
 	/**
 	 * Adds input symbol to input alphabet.
 	 * @param symbol Symbol to add
 	 * @throws AutomatonException when symbol already exists
 	 */
-	bool addReturnInputSymbol(const alphabet::Symbol& symbol);
+	bool addReturnInputSymbol(alphabet::Symbol symbol);
 
 	/**
 	 * Sets input symbols of the automaton.
 	 * @param symbols Symbols to set
 	 * @throws AutomatonException when symbol already exists
 	 */
-	void setReturnInputAlphabet(const std::set<alphabet::Symbol>& symbols);
+	void setReturnInputAlphabet(std::set<alphabet::Symbol> symbols);
 
 	/**
 	 * Adds input symbol to input alphabet.
 	 * @param symbol Symbol to add
 	 * @throws AutomatonException when symbol already exists
 	 */
-	bool addLocalInputSymbol(const alphabet::Symbol& symbol);
+	bool addLocalInputSymbol(alphabet::Symbol symbol);
 
 	/**
 	 * Sets input symbols of the automaton.
 	 * @param symbols Symbols to set
 	 * @throws AutomatonException when symbol already exists
 	 */
-	void setLocalInputAlphabet(const std::set<alphabet::Symbol>& symbols);
+	void setLocalInputAlphabet(std::set<alphabet::Symbol> symbols);
 
 	/**
 	 * Removes input symbol from the input alphabet.
diff --git a/alib2data/src/automaton/common/InputAlphabet.cpp b/alib2data/src/automaton/common/InputAlphabet.cpp
index 0947174e75d0336852d05d390810e9cd2257fc38..8485d9485bdef170e1b20e5f2884bded44dca21a 100644
--- a/alib2data/src/automaton/common/InputAlphabet.cpp
+++ b/alib2data/src/automaton/common/InputAlphabet.cpp
@@ -9,6 +9,7 @@
 
 #include <algorithm>
 #include "../AutomatonException.h"
+#include "../../std/set.hpp"
 
 namespace automaton {
 
@@ -16,28 +17,23 @@ const std::set<alphabet::Symbol>& InputAlphabet::getInputAlphabet() const {
 	return inputAlphabet;
 }
 
-bool InputAlphabet::addInputSymbol(const alphabet::Symbol& symbol) {
-	return inputAlphabet.insert(symbol).second;
+bool InputAlphabet::addInputSymbol(alphabet::Symbol symbol) {
+	return inputAlphabet.insert(std::move(symbol)).second;
 }
 
-void InputAlphabet::addInputSymbols(const std::set<alphabet::Symbol>& symbols) {
-	return inputAlphabet.insert(symbols.begin(), symbols.end());
+void InputAlphabet::addInputSymbols(std::set<alphabet::Symbol> symbols) {
+	return inputAlphabet.insert(std::make_set_move_iterator(symbols.begin()), std::make_set_move_iterator(symbols.end()));
 }
 
-void InputAlphabet::setInputAlphabet(const std::set<alphabet::Symbol>& newSymbols) {
+void InputAlphabet::setInputAlphabet(std::set<alphabet::Symbol> newSymbols) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(inputAlphabet.begin(), inputAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(newSymbols.begin(), newSymbols.end(), inputAlphabet.begin(), inputAlphabet.end(), std::inserter(added, added.end()));
-	
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeInputSymbol(removedSymbol);
 	}
 
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addInputSymbol(addedSymbol);
-	}
+	inputAlphabet = std::move(newSymbols);
 }
 
 } /* namespace automaton */
diff --git a/alib2data/src/automaton/common/InputAlphabet.h b/alib2data/src/automaton/common/InputAlphabet.h
index d1ecfd288b02494cba0ea052ec8bf354784d1742..fa331185772392322c614a5621c13ecb81db4ad9 100644
--- a/alib2data/src/automaton/common/InputAlphabet.h
+++ b/alib2data/src/automaton/common/InputAlphabet.h
@@ -26,21 +26,21 @@ public:
 	 * @param symbol Symbol to add
 	 * @throws AutomatonException when symbol already exists
 	 */
-	bool addInputSymbol(const alphabet::Symbol& symbol);
+	bool addInputSymbol(alphabet::Symbol symbol);
 
 	/**
 	 * Adds input symbols to input alphabet.
 	 * @param symbol Symbol to add
 	 * @throws AutomatonException when symbol already exists
 	 */
-	void addInputSymbols(const std::set<alphabet::Symbol>& symbols);
+	void addInputSymbols(std::set<alphabet::Symbol> symbols);
 
 	/**
 	 * Sets input symbols of the automaton.
 	 * @param symbols Symbols to set
 	 * @throws AutomatonException when symbol already exists
 	 */
-	void setInputAlphabet(const std::set<alphabet::Symbol>& symbols);
+	void setInputAlphabet(std::set<alphabet::Symbol> symbols);
 
 	/**
 	 * Removes input symbol from the input alphabet.
diff --git a/alib2data/src/automaton/common/MultiInitialStates.cpp b/alib2data/src/automaton/common/MultiInitialStates.cpp
index 4eb92235e79e77d7251621aaa9688ee2051c34e9..01503c271a435c9826606584d6e52b8eccf67adf 100644
--- a/alib2data/src/automaton/common/MultiInitialStates.cpp
+++ b/alib2data/src/automaton/common/MultiInitialStates.cpp
@@ -13,28 +13,27 @@
 
 namespace automaton {
 
-bool MultiInitialStates::addInitialState(const State& state) {
-	if (states.find(state) == states.end()) {
+bool MultiInitialStates::addInitialState(State state) {
+	if (!states.count(state)) {
 		throw AutomatonException("State " + (std::string) state.getName() + " cannot be set as initial state. It is not present in the automaton.");
 	}
 
-	return initialStates.insert(state).second;
+	return initialStates.insert(std::move(state)).second;
 }
 
-void MultiInitialStates::setInitialStates(const std::set<State>& newStates) {
+void MultiInitialStates::setInitialStates(std::set<State> newStates) {
 	std::set<State> removed;
 	std::set_difference(initialStates.begin(), initialStates.end(), newStates.begin(), newStates.end(), std::inserter(removed, removed.end()));
 
-	std::set<State> added;
-	std::set_difference(newStates.begin(), newStates.end(), initialStates.begin(), initialStates.end(), std::inserter(added, added.end()));
-	
 	for(const State& removedState : removed) {
 		removeInitialState(removedState);
 	}
 
-	for(const State& addedState : added) {
-		addInitialState(addedState);
+	if(!std::includes(states.begin(), states.end(), newStates.begin(), newStates.end())) {
+		throw AutomatonException("State ? cannot be set as initial state. It is not present in the automaton.");
 	}
+
+	initialStates = std::move(newStates);
 }
 
 bool MultiInitialStates::removeInitialState(const State& state) {
diff --git a/alib2data/src/automaton/common/MultiInitialStates.h b/alib2data/src/automaton/common/MultiInitialStates.h
index 0d362d297638c23c8eeca9770ac48d508bdf0847..ddc4b843ead898ffab00744e299c9e931e256a6a 100644
--- a/alib2data/src/automaton/common/MultiInitialStates.h
+++ b/alib2data/src/automaton/common/MultiInitialStates.h
@@ -27,7 +27,7 @@ public:
 	 * @throws AutomatonException when state is not present
 	 * in the automaton or when it's already initial state
 	 */
-	bool addInitialState(const State& state);
+	bool addInitialState(State state);
 
 	/**
 	 * Sets the initial state of the automaton.
@@ -35,7 +35,7 @@ public:
 	 * @throws AutomatonException when state is not present
 	 * in the automaton or when it's already initial state
 	 */
-	void setInitialStates(const std::set<State>& states);
+	void setInitialStates(std::set<State> states);
 
 	/**
 	 * Removes the state from the initial states.
diff --git a/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.cpp b/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.cpp
index 69b57ac5e0656558afcd61275d33060723030eac..f153c5d2720175695a5e55e52ba625402897fc27 100644
--- a/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.cpp
+++ b/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.cpp
@@ -11,25 +11,24 @@
 
 namespace automaton {
 
-bool MultiInitialSymbolsPushdownStoreAlphabet::addInitialSymbol(const alphabet::Symbol& start) {
-	if (stackAlphabet.find(start) == stackAlphabet.end()) {
-		throw AutomatonException("Stack symbol \"" + (std::string) start + "\" doesn't exist.");
+bool MultiInitialSymbolsPushdownStoreAlphabet::addInitialSymbol(alphabet::Symbol start) {
+	if (!stackAlphabet.count(start)) {
+		throw AutomatonException("Initial symbol \"" + (std::string) start + "\" not in a pushdown store alphabet.");
 	}
-	
-	return this->initialSymbols.insert(start).second;
+
+	return this->initialSymbols.insert(std::move(start)).second;
 }
 
 bool MultiInitialSymbolsPushdownStoreAlphabet::removeInitialSymbol(const alphabet::Symbol& start) {
 	return this->initialSymbols.erase(start);
 }
 
-void MultiInitialSymbolsPushdownStoreAlphabet::setInitialSymbols(const std::set<alphabet::Symbol>& symbols) {
-	std::set<alphabet::Symbol> tmp;
-	std::set_difference(symbols.begin(), symbols.end(), this->stackAlphabet.begin(), this->stackAlphabet.end(), std::inserter(tmp, tmp.end()));
-	if(tmp.size() != 0)
-		throw AutomatonException("Initial symbols not in stack alphabet");
-	
-	this->initialSymbols = symbols;
+void MultiInitialSymbolsPushdownStoreAlphabet::setInitialSymbols(std::set<alphabet::Symbol> symbols) {
+	if(!std::includes(stackAlphabet.begin(), stackAlphabet.end(), symbols.begin(), symbols.end())) {
+		throw AutomatonException("Initial symbol ? not in a pushdown store alphabet.");
+	}
+
+	this->initialSymbols = std::move(symbols);
 }
 
 const std::set<alphabet::Symbol>& MultiInitialSymbolsPushdownStoreAlphabet::getInitialSymbols() const {
diff --git a/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.h b/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.h
index e9b42c858c3b1af4ad5f9630eefc4d63976152ed..d229236c12fd2040307f1bd2ebb3492ec88ec166 100644
--- a/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.h
+++ b/alib2data/src/automaton/common/MultiInitialSymbolsPushdownStoreAlphabet.h
@@ -27,9 +27,8 @@ public:
 	 * @param start new initial symbol
 	 * @throws AutomatonException when symbol is not present in the stack alphabet or it is already in the set
 	 */
-	bool addInitialSymbol(const alphabet::Symbol& start);
-	
-	
+	bool addInitialSymbol(alphabet::Symbol start);
+
 	/**
 	 * Adds initial symbol. Initial symbols are symbols that are pushed
 	 * to the stack when MultiInitialSymbols is created.
@@ -37,14 +36,14 @@ public:
 	 * @throws AutomatonException when symbol is not present in the set of initial symbols
 	 */
 	bool removeInitialSymbol(const alphabet::Symbol& start);
-	
+
 	/**
 	 * Sets initial symbols. Initial symbols are symbols that are pushed
 	 * to the stack when MultiInitialSymbols is created.
 	 * @param symbols new initial symbols
 	 * @throws AutomatonException when any of symbols is not present in the stack alphabet
 	 */
-	void setInitialSymbols(const std::set<alphabet::Symbol>& symbols);
+	void setInitialSymbols(std::set<alphabet::Symbol> symbols);
 
 	/**
 	 * @return list of start symbols
diff --git a/alib2data/src/automaton/common/PushdownStoreAlphabet.cpp b/alib2data/src/automaton/common/PushdownStoreAlphabet.cpp
index fcaf225f3b1f2102ac1f5c074a329ffc64576654..cbf73b370445a45d3fe0686e5c4e53cd5788f005 100644
--- a/alib2data/src/automaton/common/PushdownStoreAlphabet.cpp
+++ b/alib2data/src/automaton/common/PushdownStoreAlphabet.cpp
@@ -11,24 +11,19 @@
 
 namespace automaton {
 
-bool PushdownStoreAlphabet::addStackSymbol(const alphabet::Symbol& symbol) {
+bool PushdownStoreAlphabet::addStackSymbol(alphabet::Symbol symbol) {
 	return stackAlphabet.insert(symbol).second;
 }
 
-void PushdownStoreAlphabet::setStackAlphabet(const std::set<alphabet::Symbol>& newSymbols) {
+void PushdownStoreAlphabet::setStackAlphabet(std::set<alphabet::Symbol> newSymbols) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(stackAlphabet.begin(), stackAlphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(newSymbols.begin(), newSymbols.end(), stackAlphabet.begin(), stackAlphabet.end(), std::inserter(added, added.end()));
-	
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeStackSymbol(removedSymbol);
 	}
 
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addStackSymbol(addedSymbol);
-	}
+	stackAlphabet = std::move(newSymbols);
 }
 
 const std::set<alphabet::Symbol>& PushdownStoreAlphabet::getStackAlphabet() const {
diff --git a/alib2data/src/automaton/common/PushdownStoreAlphabet.h b/alib2data/src/automaton/common/PushdownStoreAlphabet.h
index 3207df3d457ccf83fa097704870ab7d4e779d5a4..98536964be351be7e49cccbef453712dfba97f32 100644
--- a/alib2data/src/automaton/common/PushdownStoreAlphabet.h
+++ b/alib2data/src/automaton/common/PushdownStoreAlphabet.h
@@ -25,14 +25,14 @@ public:
 	 * @param symbol Symbol to add
 	 * @throws AutomatonException when symbol is already present in stack alphabet
 	 */
-	bool addStackSymbol(const alphabet::Symbol& symbol);
+	bool addStackSymbol(alphabet::Symbol symbol);
 
 	/**
 	 * Sets stack symbols of the automaton.
 	 * @param symbols Symbols to set
 	 * @throws AutomatonException when symbol is already present in stack alphabet
 	 */
-	void setStackAlphabet(const std::set<alphabet::Symbol>& symbols);
+	void setStackAlphabet(std::set<alphabet::Symbol> symbols);
 
 	/**
 	 * Removes symbol from the stack alphabet.
diff --git a/alib2data/src/automaton/common/SingleInitialState.cpp b/alib2data/src/automaton/common/SingleInitialState.cpp
index 2c8ec4997d7c19fcfc080560cee43279688e70a4..670d0bfceb0e91c540807281e07c44ce5a3a82f3 100644
--- a/alib2data/src/automaton/common/SingleInitialState.cpp
+++ b/alib2data/src/automaton/common/SingleInitialState.cpp
@@ -11,16 +11,16 @@
 
 namespace automaton {
 
-SingleInitialState::SingleInitialState(const State& initialState) : initialState(initialState) {
-	addState(initialState);
+SingleInitialState::SingleInitialState(State initialState) : initialState(initialState) {
+	addState(std::move(initialState));
 }
 
-void SingleInitialState::setInitialState(const State& state) {
-	if (states.find(state) == states.end()) {
+void SingleInitialState::setInitialState(State state) {
+	if (!states.count(state)) {
 		throw AutomatonException("State " + (std::string) state.getName() + " cannot be set as initial state. It is not present in the automaton.");
 	}
 
-	initialState = state;
+	initialState = std::move(state);
 }
 
 const State& SingleInitialState::getInitialState() const {
diff --git a/alib2data/src/automaton/common/SingleInitialState.h b/alib2data/src/automaton/common/SingleInitialState.h
index 27a63e87b2a491f6e94503ab55764bc0b307306f..c4d80262c0f11705a4d4fffd09a2e9f8102db912 100644
--- a/alib2data/src/automaton/common/SingleInitialState.h
+++ b/alib2data/src/automaton/common/SingleInitialState.h
@@ -20,7 +20,7 @@ class SingleInitialState : public States {
 protected:
 	State initialState;
 public:
-	SingleInitialState(const State& initialState);
+	SingleInitialState(State initialState);
 
 	/**
 	 * Set the initial state.
@@ -28,7 +28,7 @@ public:
 	 * @throws AutomatonException when state is not present
 	 * in the automaton
 	 */
-	void setInitialState(const State& state);
+	void setInitialState(State state);
 
 	/**
 	 * @return initial state
diff --git a/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.cpp b/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.cpp
index 8bc55e1ec8c72cdc3c00406e76fafb030e902521..0b4a0275458eb9cf3e36612f2e92f29fd2ddd975 100644
--- a/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.cpp
+++ b/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.cpp
@@ -11,16 +11,16 @@
 
 namespace automaton {
 
-SingleInitialSymbolPushdownStoreAlphabet::SingleInitialSymbolPushdownStoreAlphabet(const alphabet::Symbol& initialSymbol) : initialSymbol(initialSymbol) {
-	addStackSymbol(initialSymbol);
+SingleInitialSymbolPushdownStoreAlphabet::SingleInitialSymbolPushdownStoreAlphabet(alphabet::Symbol initialSymbol) : initialSymbol(initialSymbol) {
+	addStackSymbol(std::move(initialSymbol));
 }
 
-void SingleInitialSymbolPushdownStoreAlphabet::setInitialSymbol(const alphabet::Symbol& start) {
-	if (stackAlphabet.find(start) == stackAlphabet.end()) {
+void SingleInitialSymbolPushdownStoreAlphabet::setInitialSymbol(alphabet::Symbol start) {
+	if (!stackAlphabet.count(start)) {
 		throw AutomatonException("Stack symbol \"" + (std::string) start + "\" doesn't exist.");
 	}
-	
-	initialSymbol = start;
+
+	initialSymbol = std::move(start);
 }
 
 const alphabet::Symbol& SingleInitialSymbolPushdownStoreAlphabet::getInitialSymbol() const {
diff --git a/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.h b/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.h
index 4f3afc748095dcbe77ab94aecf50c65294a8f737..ddb005243849b057461cf094be3fad84e75f2484 100644
--- a/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.h
+++ b/alib2data/src/automaton/common/SingleInitialSymbolPushdownStoreAlphabet.h
@@ -21,7 +21,7 @@ class SingleInitialSymbolPushdownStoreAlphabet : public PushdownStoreAlphabet {
 protected:
 	alphabet::Symbol initialSymbol;
 public:
-	SingleInitialSymbolPushdownStoreAlphabet(const alphabet::Symbol& initialSymbol);
+	SingleInitialSymbolPushdownStoreAlphabet(alphabet::Symbol initialSymbol);
 
 	/**
 	 * Set initial symbol. Initial symbol is symbol that is pushed
@@ -29,9 +29,8 @@ public:
 	 * @param start new initial symbol
 	 * @throws AutomatonException when symbol is not present in the stack alphabet
 	 */
-	void setInitialSymbol(const alphabet::Symbol& start);
-	
-	
+	void setInitialSymbol(alphabet::Symbol start);
+
 	/**
 	 * @return list of start symbols
 	 */
diff --git a/alib2data/src/automaton/common/State.cpp b/alib2data/src/automaton/common/State.cpp
index cb8eeee944e850fbf50b317b977c739fd273a2ca..08252325e1d0e1a89f69c03b3d2ee534fb84220e 100644
--- a/alib2data/src/automaton/common/State.cpp
+++ b/alib2data/src/automaton/common/State.cpp
@@ -10,10 +10,7 @@
 
 namespace automaton {
 
-State::State(const label::Label& name) : name(name) {
-}
-
-State::State(label::Label&& name) : name(std::move(name)) {
+State::State(label::Label name) : name(std::move(name)) {
 }
 
 State::State(int number) : name(label::labelFrom(number)) {
@@ -25,7 +22,7 @@ State::State(int number1, int number2) : name(label::labelFrom(number1, number2)
 State::State(char character) : name(label::labelFrom(character)) {
 }
 
-State::State(const std::string& name) : name(label::labelFrom(name)) {
+State::State(std::string name) : name(label::labelFrom(std::move(name))) {
 }
 
 State::State(const char* name) : State((std::string) name) {
diff --git a/alib2data/src/automaton/common/State.h b/alib2data/src/automaton/common/State.h
index c2fc2c8c95e5546ce0dd03c435e3ce3b28792d47..078060ce4aaf4645fdf711da644d527d46084f87 100644
--- a/alib2data/src/automaton/common/State.h
+++ b/alib2data/src/automaton/common/State.h
@@ -22,12 +22,11 @@ class State {
 private:
 	label::Label name;
 public:
-	explicit State(const label::Label& name);
-	explicit State(label::Label&& name);
+	explicit State(label::Label name);
 	explicit State(int number);
 	explicit State(int number1, int number2);
 	explicit State(char character);
-	explicit State(const std::string& name);
+	explicit State(std::string name);
 	explicit State(const char* name);
 
 	const label::Label& getName() const;
diff --git a/alib2data/src/automaton/common/States.cpp b/alib2data/src/automaton/common/States.cpp
index 7b2a25845841a19a2987907bfaa8f685430177eb..94c3d9d9fd3f1ca5984fbfc6c7c14d4e286fa891 100644
--- a/alib2data/src/automaton/common/States.cpp
+++ b/alib2data/src/automaton/common/States.cpp
@@ -12,56 +12,46 @@
 
 namespace automaton {
 
-States::~States() {
-
-}
-
-bool States::addState(const State& state) {
-	return states.insert(state).second;
+bool States::addState(State state) {
+	return states.insert(std::move(state)).second;
 }
 
-void States::setStates(const std::set<State>& newStates) {
+void States::setStates(std::set<State> newStates) {
 	std::set<State> removed;
 	std::set_difference(states.begin(), states.end(), newStates.begin(), newStates.end(), std::inserter(removed, removed.end()));
 
-	std::set<State> added;
-	std::set_difference(newStates.begin(), newStates.end(), states.begin(), states.end(), std::inserter(added, added.end()));
-	
 	for(const State& removedState : removed) {
 		removeState(removedState);
 	}
 
-	for(const State& addedState : added) {
-		addState(addedState);
-	}
+	states = std::move(newStates);
 }
 
 const std::set<State>& States::getStates() const {
 	return states;
 }
 
-bool States::addFinalState(const State& state) {
-	if (states.find(state) == states.end()) {
+bool States::addFinalState(State state) {
+	if (!states.count(state)) {
 		throw AutomatonException("State " + (std::string) state.getName() + " cannot be set as final state. It is not present in the automaton.");
 	}
 
-	return finalStates.insert(state).second;
+	return finalStates.insert(std::move(state)).second;
 }
 
-void States::setFinalStates(const std::set<State>& newFinalStates) {
+void States::setFinalStates(std::set<State> newStates) {
 	std::set<State> removed;
-	std::set_difference(finalStates.begin(), finalStates.end(), newFinalStates.begin(), newFinalStates.end(), std::inserter(removed, removed.end()));
+	std::set_difference(finalStates.begin(), finalStates.end(), newStates.begin(), newStates.end(), std::inserter(removed, removed.end()));
 
-	std::set<State> added;
-	std::set_difference(newFinalStates.begin(), newFinalStates.end(), finalStates.begin(), finalStates.end(), std::inserter(added, added.end()));
-	
 	for(const State& removedState : removed) {
 		removeFinalState(removedState);
 	}
 
-	for(const State& addedState : added) {
-		addFinalState(addedState);
+	if(!std::includes(states.begin(), states.end(), newStates.begin(), newStates.end())) {
+		throw AutomatonException("State ? cannot be set as final state. It is not present in the automaton.");
 	}
+
+	finalStates = std::move(newStates);
 }
 
 bool States::removeFinalState(const State& state) {
diff --git a/alib2data/src/automaton/common/States.h b/alib2data/src/automaton/common/States.h
index 57c1572dada2dfded94c1e615ae67c3986d19bd7..f5a2ad872297b9901c945a189a3f4341e84b8ff9 100644
--- a/alib2data/src/automaton/common/States.h
+++ b/alib2data/src/automaton/common/States.h
@@ -24,21 +24,19 @@ protected:
 	std::set<State> states;
 	std::set<State> finalStates;
 public:
-	virtual ~States() noexcept;
-
 	/**
 	 * Adds new state to the automaton.
 	 * @param state State to add
 	 * @throws AutomatonException when state already exist in the automaton
 	 */
-	bool addState(const State& state);
+	bool addState(State state);
 
 	/**
 	 * Sets new states of the automaton.
 	 * @param states States to set
 	 * @throws AutomatonException when state already exist in the automaton
 	 */
-	void setStates(const std::set<State>& states);
+	void setStates(std::set<State> states);
 
 	/**
 	 * Removes the state from the automaton.
@@ -59,7 +57,7 @@ public:
 	 * @throws AutomatonException when state is not present
 	 * in the automaton or when it's already final state
 	 */
-	bool addFinalState(const State& state);
+	bool addFinalState(State state);
 
 	/**
 	 * sets the final states of the automaton.
@@ -67,7 +65,7 @@ public:
 	 * @throws AutomatonException when state is not present
 	 * in the automaton or when it's already final state
 	 */
-	void setFinalStates(const std::set<State>& state);
+	void setFinalStates(std::set<State> state);
 
 	/**
 	 * Removes the state from the final states.
diff --git a/alib2data/src/container/ObjectsPair.cpp b/alib2data/src/container/ObjectsPair.cpp
index 71dbd5b95f6ca2740198db453d9638fa3da8f07b..0fa960ff2d300d693bcae055ca1a83fca8e8a36f 100644
--- a/alib2data/src/container/ObjectsPair.cpp
+++ b/alib2data/src/container/ObjectsPair.cpp
@@ -14,7 +14,7 @@
 
 namespace container {
 
-ObjectsPair::ObjectsPair(const alib::Object& first, const alib::Object& second) : std::pair<alib::Object, alib::Object>(first, second) {
+ObjectsPair::ObjectsPair(alib::Object first, alib::Object second) : std::pair<alib::Object, alib::Object>(std::move(first), std::move(second)) {
 
 }
 
diff --git a/alib2data/src/container/ObjectsPair.h b/alib2data/src/container/ObjectsPair.h
index e6a0dbb77c08671366dca81480615530152ed476..6fbfa24c82bdd5ba065ba259311279318e6cca72 100644
--- a/alib2data/src/container/ObjectsPair.h
+++ b/alib2data/src/container/ObjectsPair.h
@@ -22,10 +22,10 @@ namespace container {
  */
 class ObjectsPair : public std::pair<alib::Object, alib::Object>, public std::acceptor<ObjectsPair, VisitableContainerBase, std::acceptor<ObjectsPair, alib::VisitableObjectBase, ContainerBase> > {
 public:
-	explicit ObjectsPair(const alib::Object& first, const alib::Object& second);
+	explicit ObjectsPair(alib::Object first, alib::Object second);
 
 	virtual ContainerBase* clone() const;
-	
+
 	virtual ContainerBase* plunder() &&;
 
 	virtual int compare(const ObjectBase& other) const {
diff --git a/alib2data/src/grammar/ContextFree/CFG.cpp b/alib2data/src/grammar/ContextFree/CFG.cpp
index 2117024e3e00e88787b0e85c2d32fdd559277a9b..d29574b51499da1806ed94240a8f7aacfe9bdef1 100644
--- a/alib2data/src/grammar/ContextFree/CFG.cpp
+++ b/alib2data/src/grammar/ContextFree/CFG.cpp
@@ -14,13 +14,13 @@
 
 namespace grammar {
 
-CFG::CFG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
+CFG::CFG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
 
 }
 
-CFG::CFG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+CFG::CFG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* CFG::clone() const {
@@ -58,23 +58,23 @@ bool CFG::removeNonterminalSymbol(const alphabet::Symbol& symbol) {
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool CFG::addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool CFG::addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	if(!nonterminalAlphabet.count(leftHandSide))
 		throw GrammarException("Rule must rewrite nonterminal symbol");
 
 	for(const alphabet::Symbol& symbol : rightHandSide)
-		if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+		if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 			throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 
-	return rules[leftHandSide].insert(rightHandSide).second;
+	return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 }
 
 const std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> & CFG::getRules() const {
 	return rules;
 }
 
-bool CFG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
-	return addRule(leftHandSide, rightHandSide);
+bool CFG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
+	return addRule(std::move(leftHandSide), std::move(rightHandSide));
 }
 
 std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> CFG::getRawRules() const {
diff --git a/alib2data/src/grammar/ContextFree/CFG.h b/alib2data/src/grammar/ContextFree/CFG.h
index a9611d56f50683a510cd190ca373446ee4d7d27a..a974c1b2f99634fd6c545bbb29103a9c905a7bd3 100644
--- a/alib2data/src/grammar/ContextFree/CFG.h
+++ b/alib2data/src/grammar/ContextFree/CFG.h
@@ -23,21 +23,21 @@ class CFG : public std::acceptor<CFG, VisitableGrammarBase, std::acceptor<CFG, a
 	std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> rules;
 
 public:
-	explicit CFG(const alphabet::Symbol& initialSymbol);
+	explicit CFG(alphabet::Symbol initialSymbol);
 
-	explicit CFG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit CFG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	const std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> & getRules() const;
 
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
 
-	bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const;
 
diff --git a/alib2data/src/grammar/ContextFree/CNF.cpp b/alib2data/src/grammar/ContextFree/CNF.cpp
index 81327a8d846d6347a8aae1dddeb3a094e75972ec..a25118884c67900d0f6f13097f2e20dfb392d25c 100644
--- a/alib2data/src/grammar/ContextFree/CNF.cpp
+++ b/alib2data/src/grammar/ContextFree/CNF.cpp
@@ -14,13 +14,13 @@
 
 namespace grammar {
 
-CNF::CNF(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
+CNF::CNF(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) {
 
 }
 
-CNF::CNF(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+CNF::CNF(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* CNF::clone() const {
@@ -58,7 +58,7 @@ bool CNF::removeNonterminalSymbol(const alphabet::Symbol& symbol) {
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool CNF::addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide) {
+bool CNF::addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide) {
 	if(rightHandSide.is<alphabet::Symbol>()) {
 		if(!nonterminalAlphabet.count(leftHandSide))
 			throw GrammarException("Rule must rewrite nonterminal symbol");
@@ -66,7 +66,7 @@ bool CNF::addRule(const alphabet::Symbol& leftHandSide, const std::variant<alpha
 		if(!terminalAlphabet.count(rightHandSide.get<alphabet::Symbol>()))
 			throw GrammarException("Rule must rewrite to terminal symbol");
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	} else {
 		const std::pair<alphabet::Symbol, alphabet::Symbol> rhs = rightHandSide.get<std::pair<alphabet::Symbol, alphabet::Symbol>>();
 
@@ -79,18 +79,18 @@ bool CNF::addRule(const alphabet::Symbol& leftHandSide, const std::variant<alpha
 		if(nonterminalAlphabet.find(rhs.second) == nonterminalAlphabet.end())
 			throw GrammarException("Symbol \"" + (std::string) rhs.second + "\" is not a nonterminal symbol");
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	}
 }
 
-bool CNF::addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide) {
-	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool CNF::addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide) {
+	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
-bool CNF::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide) {
-	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool CNF::addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide) {
+	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
 const std::map<alphabet::Symbol, std::set<std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>>> & CNF::getRules() const {
@@ -111,16 +111,16 @@ bool CNF::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alpha
 	return removeRule(leftHandSide, rhs);
 }
 
-bool CNF::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool CNF::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	if(rightHandSide.size() == 0) {
 		if(leftHandSide != initialSymbol) throw exception::AlibException("Illegal left hand side of epsilon rule");
 		bool res = getGeneratesEpsilon();
 		setGeneratesEpsilon(true);
 		return !res;
 	} else if(rightHandSide.size() == 1) {
-		return addRule(leftHandSide, rightHandSide[0]);
+		return addRule(std::move(leftHandSide), std::move(rightHandSide[0]));
 	} else if(rightHandSide.size() == 2) {
-		return addRule(leftHandSide, std::make_pair(rightHandSide[0], rightHandSide[1]));
+		return addRule(std::move(leftHandSide), std::make_pair(std::move(rightHandSide[0]), std::move(rightHandSide[1])));
 	} else {
 		throw exception::AlibException("Invalid right hand side");
 	}
diff --git a/alib2data/src/grammar/ContextFree/CNF.h b/alib2data/src/grammar/ContextFree/CNF.h
index 2f807a66590a295d459c2f8f4d5217436426b9d0..8f0ac76232716aec188d344cead8a4369431620d 100644
--- a/alib2data/src/grammar/ContextFree/CNF.h
+++ b/alib2data/src/grammar/ContextFree/CNF.h
@@ -25,17 +25,17 @@ class CNF : public std::acceptor<CNF, VisitableGrammarBase, std::acceptor<CNF, a
 	bool generatesEpsilon;
 
 public:
-	explicit CNF(const alphabet::Symbol& initialSymbol);
+	explicit CNF(alphabet::Symbol initialSymbol);
 
-	explicit CNF(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit CNF(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide);
-	bool addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide);
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide);
 
 	const std::map<alphabet::Symbol, std::set<std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>>> & getRules() const;
 
@@ -43,7 +43,7 @@ public:
 	bool removeRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide);
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide);
 
-	bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const;
 
diff --git a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp
index 3c725e87b1304fb1c5f924b84a144de9dedb4ebc..bcebe12a7e87eb1d01ef1e6fc554407185e0be5a 100644
--- a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp
+++ b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.cpp
@@ -14,13 +14,13 @@
 
 namespace grammar {
 
-EpsilonFreeCFG::EpsilonFreeCFG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
+EpsilonFreeCFG::EpsilonFreeCFG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
 
 }
 
-EpsilonFreeCFG::EpsilonFreeCFG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+EpsilonFreeCFG::EpsilonFreeCFG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* EpsilonFreeCFG::clone() const {
@@ -58,7 +58,7 @@ bool EpsilonFreeCFG::removeNonterminalSymbol(const alphabet::Symbol& symbol) {
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool EpsilonFreeCFG::addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool EpsilonFreeCFG::addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	int rSize = rightHandSide.size();
 
 	if(rSize == 0) {
@@ -68,11 +68,11 @@ bool EpsilonFreeCFG::addRule(const alphabet::Symbol& leftHandSide, const std::ve
 			throw GrammarException("Rule must rewrite nonterminal symbol");
 
 		for(const alphabet::Symbol& symbol : rightHandSide) {
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 				throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 		}
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	}
 }
 
@@ -84,14 +84,14 @@ bool EpsilonFreeCFG::removeRule(const alphabet::Symbol& leftHandSide, const std:
 	return rules[leftHandSide].erase(rightHandSide);
 }
 
-bool EpsilonFreeCFG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool EpsilonFreeCFG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	if(rightHandSide.size() == 0) {
 		if(leftHandSide != initialSymbol) throw exception::AlibException("Illegal left hand side of epsilon rule");
 		bool res = getGeneratesEpsilon();
 		setGeneratesEpsilon(true);
 		return !res;
 	} else {
-		return addRule(leftHandSide, rightHandSide);
+		return addRule(std::move(leftHandSide), std::move(rightHandSide));
 	}
 }
 
diff --git a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h
index 6166994faa7ba5cd5273edbc773cd4158eb2202a..9fafdb50e2e910c72da5f1bc16d506fe162f33ee 100644
--- a/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h
+++ b/alib2data/src/grammar/ContextFree/EpsilonFreeCFG.h
@@ -24,21 +24,21 @@ class EpsilonFreeCFG : public std::acceptor<EpsilonFreeCFG, VisitableGrammarBase
 	bool generatesEpsilon;
 
 public:
-	explicit EpsilonFreeCFG(const alphabet::Symbol& initialSymbol);
+	explicit EpsilonFreeCFG(alphabet::Symbol initialSymbol);
 
-	explicit EpsilonFreeCFG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit EpsilonFreeCFG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	const std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> & getRules() const;
 
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
 
-	bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const;
 
diff --git a/alib2data/src/grammar/ContextFree/GNF.cpp b/alib2data/src/grammar/ContextFree/GNF.cpp
index 3b6a9390dd03517ea689ce0d6666b6ed53990035..bbda9516ff9ce7305b37fc0ce5be45974f9e1483 100644
--- a/alib2data/src/grammar/ContextFree/GNF.cpp
+++ b/alib2data/src/grammar/ContextFree/GNF.cpp
@@ -14,13 +14,13 @@
 
 namespace grammar {
 
-GNF::GNF(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
+GNF::GNF(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
 
 }
 
-GNF::GNF(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+GNF::GNF(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* GNF::clone() const {
@@ -58,7 +58,7 @@ bool GNF::removeNonterminalSymbol(const alphabet::Symbol& symbol) {
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool GNF::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >& rightHandSide) {
+bool GNF::addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> > rightHandSide) {
 	if(!nonterminalAlphabet.count(leftHandSide))
 		throw GrammarException("Rule must rewrite nonterminal symbol");
 
@@ -66,10 +66,10 @@ bool GNF::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet
 		throw GrammarException("Rule must rewrite to terminal symbol");
 
 	for(const alphabet::Symbol& rhsNTs : rightHandSide.second)
-		if(nonterminalAlphabet.find(rhsNTs) == nonterminalAlphabet.end())
+		if(!nonterminalAlphabet.count(rhsNTs))
 			throw GrammarException("Symbol \"" + (std::string) rhsNTs + "\" is not a nonterminal symbol");
 
-	return rules[leftHandSide].insert(rightHandSide).second;
+	return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 }
 
 const std::map<alphabet::Symbol, std::set<std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >> > & GNF::getRules() const {
@@ -80,16 +80,16 @@ bool GNF::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alpha
 	return rules[leftHandSide].erase(rightHandSide);
 }
 
-bool GNF::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool GNF::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	if(rightHandSide.size() == 0) {
 		if(leftHandSide != initialSymbol) throw exception::AlibException("Illegal left hand side of epsilon rule");
 		bool res = getGeneratesEpsilon();
 		setGeneratesEpsilon(true);
 		return !res;
 	} else {
-		alphabet::Symbol first = rightHandSide[0];
-		std::vector<alphabet::Symbol> rest(rightHandSide.begin() + 1, rightHandSide.end());
-		return addRule(leftHandSide, std::make_pair(first, rest));
+		alphabet::Symbol first = std::move(rightHandSide[0]);
+		std::vector<alphabet::Symbol> rest(std::make_move_iterator(rightHandSide.begin()) + 1, std::make_move_iterator(rightHandSide.end()));
+		return addRule(std::move(leftHandSide), std::make_pair(std::move(first), std::move(rest)));
 	}
 }
 
diff --git a/alib2data/src/grammar/ContextFree/GNF.h b/alib2data/src/grammar/ContextFree/GNF.h
index 6806ea3c985d8833affb61d56b95124c09e135d0..56d14b47f2f5c5f6856ff4309af8674646e78b09 100644
--- a/alib2data/src/grammar/ContextFree/GNF.h
+++ b/alib2data/src/grammar/ContextFree/GNF.h
@@ -23,21 +23,21 @@ class GNF : public std::acceptor<GNF, VisitableGrammarBase, std::acceptor<GNF, a
 	std::map<alphabet::Symbol, std::set<std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >> > rules;
 	bool generatesEpsilon;
 public:
-	explicit GNF(const alphabet::Symbol& initialSymbol);
+	explicit GNF(alphabet::Symbol initialSymbol);
 
-	explicit GNF(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit GNF(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> > rightHandSide);
 
 	const std::map<alphabet::Symbol, std::set<std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >> > & getRules() const;
 
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol> >& rightHandSide);
 
-	bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const;
 
diff --git a/alib2data/src/grammar/ContextFree/LG.cpp b/alib2data/src/grammar/ContextFree/LG.cpp
index 37b54205fede2dee02948619ae67b2a7206eb53c..57f77675b0951988c3e11900889952e8904d7602 100644
--- a/alib2data/src/grammar/ContextFree/LG.cpp
+++ b/alib2data/src/grammar/ContextFree/LG.cpp
@@ -14,13 +14,13 @@
 
 namespace grammar {
 
-LG::LG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
+LG::LG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
 
 }
 
-LG::LG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+LG::LG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* LG::clone() const {
@@ -76,45 +76,45 @@ bool LG::removeNonterminalSymbol(const alphabet::Symbol& symbol) {
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool LG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> >& rightHandSide) {
+bool LG::addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rightHandSide) {
 	if(!nonterminalAlphabet.count(leftHandSide))
 		throw GrammarException("Rule must rewrite nonterminal symbol");
 
 	if(rightHandSide.is<std::vector<alphabet::Symbol>>()) {
 		const std::vector<alphabet::Symbol>& rhs = rightHandSide.get<std::vector<alphabet::Symbol>>();
 		for(const auto & symbol : rhs ) {
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol))
 				throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol");
 		}
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	} else {
 		const std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>& rhs = rightHandSide.get<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>>();
 
 		for(const auto & symbol : std::get<0>(rhs) )
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol))
 				throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol");
 
-		if(nonterminalAlphabet.find(std::get<1>(rhs)) == nonterminalAlphabet.end())
+		if(!nonterminalAlphabet.count(std::get<1>(rhs)))
 			throw GrammarException("Symbol " + (std::string) std::get<1>(rhs) + " is not a nonterminal symbol");
 
 		for(const auto & symbol : std::get<2>(rhs) ) {
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol))
 				throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol");
 		}
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	}
 }
 
-bool LG::addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
-	std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool LG::addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
+	std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
-bool LG::addRule(const alphabet::Symbol& leftHandSide, const std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide) {
-	std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool LG::addRule(alphabet::Symbol leftHandSide, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> rightHandSide) {
+	std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
 const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> >> > & LG::getRules() const {
@@ -135,8 +135,8 @@ bool LG::removeRule(const alphabet::Symbol& leftHandSide, const std::tuple<std::
 	return removeRule(leftHandSide, rhs);
 }
 
-bool LG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
-	std::vector<alphabet::Symbol>::const_iterator nonterminalPosition = rightHandSide.begin();
+bool LG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
+	std::vector<alphabet::Symbol>::iterator nonterminalPosition = rightHandSide.begin();
 	for(; nonterminalPosition != rightHandSide.end(); nonterminalPosition++) {
 		if(nonterminalAlphabet.count(*nonterminalPosition)) break;
 	}
@@ -144,7 +144,7 @@ bool LG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alph
 	if(nonterminalPosition == rightHandSide.end()) {
 		return addRule(leftHandSide, rightHandSide);
 	} else {
-		return addRule(leftHandSide, std::make_tuple(std::vector<alphabet::Symbol>(rightHandSide.begin(), nonterminalPosition), *nonterminalPosition, std::vector<alphabet::Symbol>(nonterminalPosition + 1, rightHandSide.end())));
+		return addRule(leftHandSide, std::make_tuple(std::vector<alphabet::Symbol>(std::make_move_iterator(rightHandSide.begin()), std::make_move_iterator(nonterminalPosition)), std::move(*nonterminalPosition), std::vector<alphabet::Symbol>(std::make_move_iterator(nonterminalPosition) + 1, std::make_move_iterator(rightHandSide.end()))));
 	}
 }
 
diff --git a/alib2data/src/grammar/ContextFree/LG.h b/alib2data/src/grammar/ContextFree/LG.h
index 0f5fd6fd39e9759cb1d378b7dcd41926af43e3af..e8300c5b67fb557055d5d8e8a06a046752bdf1e7 100644
--- a/alib2data/src/grammar/ContextFree/LG.h
+++ b/alib2data/src/grammar/ContextFree/LG.h
@@ -24,17 +24,17 @@ namespace grammar {
 class LG : public std::acceptor<LG, VisitableGrammarBase, std::acceptor<LG, alib::VisitableObjectBase, GrammarBase> >, public TerminalNonterminalAlphabetInitialSymbol {
 	std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> >> > rules;
 public:
-	explicit LG(const alphabet::Symbol& initialSymbol);
+	explicit LG(alphabet::Symbol initialSymbol);
 
-	explicit LG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit LG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> >& rightHandSide);
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> > rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> rightHandSide);
 
 	const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>> >> > & getRules() const;
 
@@ -42,7 +42,7 @@ public:
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide);
 
-	bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const;
 
diff --git a/alib2data/src/grammar/ContextSensitive/CSG.cpp b/alib2data/src/grammar/ContextSensitive/CSG.cpp
index fac3fd86daadd13a41fc6a7589fb80377cbf27cc..f036943d62026205a08df64f9a19a9bc3d4806b9 100644
--- a/alib2data/src/grammar/ContextSensitive/CSG.cpp
+++ b/alib2data/src/grammar/ContextSensitive/CSG.cpp
@@ -15,13 +15,13 @@
 
 namespace grammar {
 
-CSG::CSG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
+CSG::CSG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) {
 
 }
 
-CSG::CSG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+CSG::CSG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* CSG::clone() const {
@@ -75,14 +75,14 @@ bool CSG::removeNonterminalSymbol(const alphabet::Symbol& symbol) {
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool CSG::addRule(const std::vector<alphabet::Symbol>& lContext, const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rContext, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool CSG::addRule(std::vector<alphabet::Symbol> lContext, alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rContext, std::vector<alphabet::Symbol> rightHandSide) {
 	int rSize = rightHandSide.size();
 
 	if(rSize == 0) {
 		throw GrammarException("Epsilon rule is not allowed");
 	} else {
 		for(const alphabet::Symbol& symbol : lContext) {
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 				throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 		}
 
@@ -90,16 +90,16 @@ bool CSG::addRule(const std::vector<alphabet::Symbol>& lContext, const alphabet:
 			throw GrammarException("Rule must rewrite nonterminal symbol");
 
 		for(const alphabet::Symbol& symbol : rContext) {
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 				throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 		}
 
 		for(const alphabet::Symbol& symbol : rightHandSide) {
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 				throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 		}
 
-		return rules[make_tuple(lContext, leftHandSide, rContext)].insert(rightHandSide).second;
+		return rules[make_tuple(std::move(lContext), std::move(leftHandSide), std::move(rContext))].insert(std::move(rightHandSide)).second;
 	}
 }
 
diff --git a/alib2data/src/grammar/ContextSensitive/CSG.h b/alib2data/src/grammar/ContextSensitive/CSG.h
index 52b5b20735fec6cffb6fad2a6a8653e5d0656542..733b96d7ceea06d673f20972d822565c24d77d55 100644
--- a/alib2data/src/grammar/ContextSensitive/CSG.h
+++ b/alib2data/src/grammar/ContextSensitive/CSG.h
@@ -23,15 +23,15 @@ class CSG : public std::acceptor<CSG, VisitableGrammarBase, std::acceptor<CSG, a
 	bool generatesEpsilon;
 
 public:
-	explicit CSG(const alphabet::Symbol& initialSymbol);
+	explicit CSG(alphabet::Symbol initialSymbol);
 
-	explicit CSG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit CSG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const std::vector<alphabet::Symbol>& lContext, const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rContext, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRule(std::vector<alphabet::Symbol> lContext, alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rContext, std::vector<alphabet::Symbol> rightHandSide);
 
 	const std::map<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>, std::set<std::vector<alphabet::Symbol>>> & getRules() const;
 
diff --git a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp
index e7859f562db36804b9b04d5bd05c7c49001abd2f..143a423ba0bccdf9019b387c5a0c8b81cb892899 100644
--- a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp
+++ b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.cpp
@@ -15,13 +15,13 @@
 
 namespace grammar {
 
-NonContractingGrammar::NonContractingGrammar(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
+NonContractingGrammar::NonContractingGrammar(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
 
 }
 
-NonContractingGrammar::NonContractingGrammar(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+NonContractingGrammar::NonContractingGrammar(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* NonContractingGrammar::clone() const {
@@ -62,7 +62,7 @@ bool NonContractingGrammar::removeNonterminalSymbol(const alphabet::Symbol& symb
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool NonContractingGrammar::addRule(const std::vector<alphabet::Symbol>& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool NonContractingGrammar::addRule(std::vector<alphabet::Symbol> leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	int lSize = leftHandSide.size();
 	int rSize = rightHandSide.size();
 
@@ -73,15 +73,15 @@ bool NonContractingGrammar::addRule(const std::vector<alphabet::Symbol>& leftHan
 		throw GrammarException("Rule must rewrite nonterminal symbol");
 
 	for(const alphabet::Symbol& symbol : leftHandSide)
-		if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+		if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 			throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 
 	for(const alphabet::Symbol& symbol : rightHandSide) {
-		if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+		if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 			throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 	}
 
-	return rules[leftHandSide].insert(rightHandSide).second;
+	return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 }
 
 const std::map<std::vector<alphabet::Symbol>, std::set<std::vector<alphabet::Symbol>>> & NonContractingGrammar::getRules() const {
diff --git a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h
index 66f957e5f4a3729571daf4dbc0f75c7f752b0a6e..c51da8e2cd5a42535705962ddff9b6484b80153a 100644
--- a/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h
+++ b/alib2data/src/grammar/ContextSensitive/NonContractingGrammar.h
@@ -23,15 +23,15 @@ class NonContractingGrammar : public std::acceptor<NonContractingGrammar, Visita
 	bool generatesEpsilon;
 
 public:
-	explicit NonContractingGrammar(const alphabet::Symbol& initialSymbol);
+	explicit NonContractingGrammar(alphabet::Symbol initialSymbol);
 
-	explicit NonContractingGrammar(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit NonContractingGrammar(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const std::vector<alphabet::Symbol>& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRule(std::vector<alphabet::Symbol> leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	const std::map<std::vector<alphabet::Symbol>, std::set<std::vector<alphabet::Symbol>>> & getRules() const;
 
diff --git a/alib2data/src/grammar/Regular/LeftLG.cpp b/alib2data/src/grammar/Regular/LeftLG.cpp
index 7ba497ebfc5b195f088dd4bddde46689f2c9f0ee..34f3ea41cca5923a691935edc30fb07b7aaa3120 100644
--- a/alib2data/src/grammar/Regular/LeftLG.cpp
+++ b/alib2data/src/grammar/Regular/LeftLG.cpp
@@ -15,13 +15,13 @@
 
 namespace grammar {
 
-LeftLG::LeftLG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
+LeftLG::LeftLG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
 
 }
 
-LeftLG::LeftLG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+LeftLG::LeftLG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* LeftLG::clone() const {
@@ -72,41 +72,41 @@ bool LeftLG::removeNonterminalSymbol(const alphabet::Symbol& symbol) {
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool LeftLG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> >& rightHandSide) {
+bool LeftLG::addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rightHandSide) {
 	if(!nonterminalAlphabet.count(leftHandSide))
 		throw GrammarException("Rule must rewrite nonterminal symbol");
 
 	if(rightHandSide.is<std::vector<alphabet::Symbol>>()) {
 		const std::vector<alphabet::Symbol>& rhs = rightHandSide.get<std::vector<alphabet::Symbol>>();
 		for(const auto & symbol : rhs ) {
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol))
 				throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol");
 		}
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	} else {
 		const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>& rhs = rightHandSide.get<std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>>();
 
-		if(nonterminalAlphabet.find(rhs.first) == nonterminalAlphabet.end())
+		if(!nonterminalAlphabet.count(rhs.first))
 			throw GrammarException("Symbol " + (std::string) rhs.first + " is not a nonterminal symbol");
 
 		for(const auto & symbol : rhs.second ) {
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol))
 				throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol");
 		}
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	}
 }
 
-bool LeftLG::addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
-	std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool LeftLG::addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
+	std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
-bool LeftLG::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide) {
-	std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool LeftLG::addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> rightHandSide) {
+	std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
 const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> >> > & LeftLG::getRules() const {
@@ -127,13 +127,13 @@ bool LeftLG::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<al
 	return removeRule(leftHandSide, rhs);
 }
 
-bool LeftLG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool LeftLG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	if(rightHandSide.size() == 0) {
-		return addRule(leftHandSide, rightHandSide);
+		return addRule(std::move(leftHandSide), std::move(rightHandSide));
 	} else if(nonterminalAlphabet.count(rightHandSide[0])) {
-		return addRule(leftHandSide, std::make_pair(rightHandSide[0], std::vector<alphabet::Symbol>(rightHandSide.begin() + 1, rightHandSide.end())));
+		return addRule(std::move(leftHandSide), std::make_pair(std::move(rightHandSide[0]), std::vector<alphabet::Symbol>(std::make_move_iterator(rightHandSide.begin()), std::make_move_iterator(rightHandSide.end()))));
 	} else {
-		return addRule(leftHandSide, rightHandSide);
+		return addRule(std::move(leftHandSide), std::move(rightHandSide));
 	}
 }
 
diff --git a/alib2data/src/grammar/Regular/LeftLG.h b/alib2data/src/grammar/Regular/LeftLG.h
index 6998aca04c5807b95e7fa4843766ebc70d944697..187228f9b06b81486b2282a6e96b296061257b3d 100644
--- a/alib2data/src/grammar/Regular/LeftLG.h
+++ b/alib2data/src/grammar/Regular/LeftLG.h
@@ -23,17 +23,17 @@ class LeftLG : public std::acceptor<LeftLG, VisitableGrammarBase, std::acceptor<
 	std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> >> > rules;
 
 public:
-	explicit LeftLG(const alphabet::Symbol& initialSymbol);
+	explicit LeftLG(alphabet::Symbol initialSymbol);
 
-	explicit LeftLG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit LeftLG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> >& rightHandSide);
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> > rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> rightHandSide);
 
 	const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>> >> > & getRules() const;
 
@@ -41,7 +41,7 @@ public:
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, std::vector<alphabet::Symbol>>& rightHandSide);
 
-	bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const;
 
diff --git a/alib2data/src/grammar/Regular/LeftRG.cpp b/alib2data/src/grammar/Regular/LeftRG.cpp
index e2d812c9cbcca3be14a2c6961480599c88bc2180..d0b7c723f0ec93fde44518596b418af7885675c8 100644
--- a/alib2data/src/grammar/Regular/LeftRG.cpp
+++ b/alib2data/src/grammar/Regular/LeftRG.cpp
@@ -15,13 +15,13 @@
 
 namespace grammar {
 
-LeftRG::LeftRG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
+LeftRG::LeftRG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) {
 
 }
 
-LeftRG::LeftRG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+LeftRG::LeftRG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* LeftRG::clone() const {
@@ -59,7 +59,7 @@ bool LeftRG::removeNonterminalSymbol(const alphabet::Symbol& symbol) {
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool LeftRG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide) {
+bool LeftRG::addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide) {
 	if(!nonterminalAlphabet.count(leftHandSide))
 		throw GrammarException("Rule must rewrite nonterminal symbol");
 
@@ -69,25 +69,25 @@ bool LeftRG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<al
 		if(!terminalAlphabet.count(rhs))
 			throw GrammarException("Rule must rewrite to terminal symbol");
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	} else {
 		const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = rightHandSide.get<std::pair<alphabet::Symbol, alphabet::Symbol>>();
 
 		if(!nonterminalAlphabet.count(rhs.first) || !terminalAlphabet.count(rhs.second))
 			throw GrammarException("Rule must rewrite to terminal symbol followed by nonterminal symbol");
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	}
 }
 
-bool LeftRG::addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide) {
-	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool LeftRG::addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide) {
+	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
-bool LeftRG::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide) {
-	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool LeftRG::addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide) {
+	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
 const std::map<alphabet::Symbol, std::set<std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>>> & LeftRG::getRules() const {
@@ -108,16 +108,16 @@ bool LeftRG::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<al
 	return removeRule(leftHandSide, rhs);
 }
 
-bool LeftRG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool LeftRG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	if(rightHandSide.size() == 0) {
 		if(leftHandSide != initialSymbol) throw exception::AlibException("Illegal left hand side of epsilon rule");
 		bool res = getGeneratesEpsilon();
 		setGeneratesEpsilon(true);
 		return res;
 	} else if(rightHandSide.size() == 1) {
-		return addRule(leftHandSide, rightHandSide[0]);
+		return addRule(std::move(leftHandSide), std::move(rightHandSide[0]));
 	} else if(rightHandSide.size() == 2) {
-		return addRule(leftHandSide, std::make_pair(rightHandSide[0], rightHandSide[1]));
+		return addRule(std::move(leftHandSide), std::make_pair(std::move(rightHandSide[0]), std::move(rightHandSide[1])));
 	} else {
 		throw exception::AlibException("Invalid right hand side");
 	}
diff --git a/alib2data/src/grammar/Regular/LeftRG.h b/alib2data/src/grammar/Regular/LeftRG.h
index 12d46b2b2c92935d625e1b34f52adb59edac9f84..16da0c4e13ff77d9cf284d5b643e24f722fb5411 100644
--- a/alib2data/src/grammar/Regular/LeftRG.h
+++ b/alib2data/src/grammar/Regular/LeftRG.h
@@ -43,12 +43,12 @@ public:
 	/**
 	 * Creates a new instance of Left regular grammar with concrete initial symbol
 	 */
-	explicit LeftRG(const alphabet::Symbol& initialSymbol);
+	explicit LeftRG(alphabet::Symbol initialSymbol);
 
 	/**
 	 * Creates a new instance of Left regular grammar with concrete nonterminal, terminal alphabet and initial symbol
 	 */
-	explicit LeftRG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit LeftRG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	/**
 	 * @copydoc alib::base::clone()
@@ -63,17 +63,17 @@ public:
 	/**
 	 * Add a new rule of a grammar in form of A -> aB or A -> a, where A, B \in N and a \in T
 	 */
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide);
 
 	/**
 	 * Add a new rule of a grammar in form of A -> a, where A \in N and a \in T
 	 */
-	bool addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide);
 
 	/**
 	 * Add a new rule of a grammar in form of A -> aB, where A, B \in N and a \in T
 	 */
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide);
 
 	/**
 	 * Get rules of the grammar
@@ -95,7 +95,7 @@ public:
 	 */
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide);
 
-	bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const;
 
diff --git a/alib2data/src/grammar/Regular/RightLG.cpp b/alib2data/src/grammar/Regular/RightLG.cpp
index 6956dcaff7d352c76380c9d41492b8f13d699e9c..2adadf07fb003a29a6c0b481c4524b47110c2108 100644
--- a/alib2data/src/grammar/Regular/RightLG.cpp
+++ b/alib2data/src/grammar/Regular/RightLG.cpp
@@ -15,13 +15,13 @@
 
 namespace grammar {
 
-RightLG::RightLG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
+RightLG::RightLG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
 
 }
 
-RightLG::RightLG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+RightLG::RightLG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* RightLG::clone() const {
@@ -72,41 +72,41 @@ bool RightLG::removeNonterminalSymbol(const alphabet::Symbol& symbol) {
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool RightLG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> >& rightHandSide) {
+bool RightLG::addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rightHandSide) {
 	if(!nonterminalAlphabet.count(leftHandSide))
 		throw GrammarException("Rule must rewrite nonterminal symbol");
 
 	if(rightHandSide.is<std::vector<alphabet::Symbol>>()) {
 		const std::vector<alphabet::Symbol>& rhs = rightHandSide.get<std::vector<alphabet::Symbol>>();
 		for(const auto & symbol : rhs ) {
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol))
 				throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol");
 		}
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	} else {
 		const std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>& rhs = rightHandSide.get<std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>>();
 
-		if(nonterminalAlphabet.find(rhs.second) == nonterminalAlphabet.end())
+		if(!nonterminalAlphabet.count(rhs.second))
 			throw GrammarException("Symbol " + (std::string) rhs.second + " is not a nonterminal symbol");
 
 		for(const auto & symbol : rhs.first ) {
-			if(terminalAlphabet.find(symbol) == terminalAlphabet.end())
+			if(!terminalAlphabet.count(symbol))
 				throw GrammarException("Symbol " + (std::string) symbol + " is not a terminal symbol");
 		}
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	}
 }
 
-bool RightLG::addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
-	std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool RightLG::addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
+	std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
-bool RightLG::addRule(const alphabet::Symbol& leftHandSide, const std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>& rightHandSide) {
-	std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool RightLG::addRule(alphabet::Symbol leftHandSide, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> rightHandSide) {
+	std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
 const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> >> > & RightLG::getRules() const {
@@ -127,13 +127,13 @@ bool RightLG::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<s
 	return removeRule(leftHandSide, rhs);
 }
 
-bool RightLG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool RightLG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	if(rightHandSide.size() == 0) {
-		return addRule(leftHandSide, rightHandSide);
+		return addRule(std::move(leftHandSide), std::move(rightHandSide));
 	} else if(nonterminalAlphabet.count(rightHandSide[rightHandSide.size() - 1])) {
-		return addRule(leftHandSide, std::make_pair(std::vector<alphabet::Symbol>(rightHandSide.begin(), rightHandSide.end() - 1), rightHandSide[rightHandSide.size() - 1]));
+		return addRule(std::move(leftHandSide), std::make_pair(std::vector<alphabet::Symbol>(std::make_move_iterator(rightHandSide.begin()), std::make_move_iterator(rightHandSide.end()) - 1), std::move(rightHandSide[rightHandSide.size() - 1])));
 	} else {
-		return addRule(leftHandSide, rightHandSide);
+		return addRule(std::move(leftHandSide), std::move(rightHandSide));
 	}
 }
 
diff --git a/alib2data/src/grammar/Regular/RightLG.h b/alib2data/src/grammar/Regular/RightLG.h
index 35ca0cdca0e44045d1b4b862f3425382f1464ded..e3b5275ffbbca077a4de11e45d97a423353ccc19 100644
--- a/alib2data/src/grammar/Regular/RightLG.h
+++ b/alib2data/src/grammar/Regular/RightLG.h
@@ -23,17 +23,17 @@ class RightLG : public std::acceptor<RightLG, VisitableGrammarBase, std::accepto
 	std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> >> > rules;
 
 public:
-	explicit RightLG(const alphabet::Symbol& initialSymbol);
+	explicit RightLG(alphabet::Symbol initialSymbol);
 
-	explicit RightLG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit RightLG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> >& rightHandSide);
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> > rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> rightHandSide);
 
 	const std::map<alphabet::Symbol, std::set<std::variant<std::vector<alphabet::Symbol>, std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol> >> > & getRules() const;
 
@@ -41,7 +41,7 @@ public:
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<std::vector<alphabet::Symbol>, alphabet::Symbol>& rightHandSide);
 
-	bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const;
 
diff --git a/alib2data/src/grammar/Regular/RightRG.cpp b/alib2data/src/grammar/Regular/RightRG.cpp
index b248343f50df42560e26ecda1d3e1746067dc9bf..59da54bc99f9a17963f925ccc16830fa54e202e5 100644
--- a/alib2data/src/grammar/Regular/RightRG.cpp
+++ b/alib2data/src/grammar/Regular/RightRG.cpp
@@ -15,13 +15,13 @@
 
 namespace grammar {
 
-RightRG::RightRG(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
+RightRG::RightRG(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) {
 
 }
 
-RightRG::RightRG(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol), generatesEpsilon(false) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+RightRG::RightRG(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)), generatesEpsilon(false) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* RightRG::clone() const {
@@ -59,7 +59,7 @@ bool RightRG::removeNonterminalSymbol(const alphabet::Symbol& symbol) {
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool RightRG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide) {
+bool RightRG::addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide) {
 	if(!nonterminalAlphabet.count(leftHandSide))
 		throw GrammarException("Rule must rewrite nonterminal symbol");
 
@@ -69,25 +69,25 @@ bool RightRG::addRule(const alphabet::Symbol& leftHandSide, const std::variant<a
 		if(!terminalAlphabet.count(rhs))
 			throw GrammarException("Rule must rewrite to terminal symbol");
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	} else {
 		const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = rightHandSide.get<std::pair<alphabet::Symbol, alphabet::Symbol>>();
 
 		if(!terminalAlphabet.count(rhs.first) || !nonterminalAlphabet.count(rhs.second))
 			throw GrammarException("Rule must rewrite to terminal symbol followed by nonterminal symbol");
 
-		return rules[leftHandSide].insert(rightHandSide).second;
+		return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 	}
 }
 
-bool RightRG::addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide) {
-	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool RightRG::addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide) {
+	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
-bool RightRG::addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide) {
-	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(rightHandSide);
-	return addRule(leftHandSide, rhs);
+bool RightRG::addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide) {
+	std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rhs(std::move(rightHandSide));
+	return addRule(std::move(leftHandSide), std::move(rhs));
 }
 
 const std::map<alphabet::Symbol, std::set<std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>>> & RightRG::getRules() const {
@@ -108,16 +108,16 @@ bool RightRG::removeRule(const alphabet::Symbol& leftHandSide, const std::pair<a
 	return removeRule(leftHandSide, rhs);
 }
 
-bool RightRG::addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool RightRG::addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	if(rightHandSide.size() == 0) {
 		if(leftHandSide != initialSymbol) throw exception::AlibException("Illegal left hand side of epsilon rule");
 		bool res = getGeneratesEpsilon();
 		setGeneratesEpsilon(true);
 		return res;
 	} else if(rightHandSide.size() == 1) {
-		return addRule(leftHandSide, rightHandSide[0]);
+		return addRule(std::move(leftHandSide), std::move(rightHandSide[0]));
 	} else if(rightHandSide.size() == 2) {
-		return addRule(leftHandSide, std::make_pair(rightHandSide[0], rightHandSide[1]));
+		return addRule(std::move(leftHandSide), std::make_pair(std::move(rightHandSide[0]), std::move(rightHandSide[1])));
 	} else {
 		throw exception::AlibException("Invalid right hand side");
 	}
diff --git a/alib2data/src/grammar/Regular/RightRG.h b/alib2data/src/grammar/Regular/RightRG.h
index de21f7c2d79226002fcc9069dfb6862f4f3a0bd4..9431d9e4fbfed326d4dc23982cb41860450fbd81 100644
--- a/alib2data/src/grammar/Regular/RightRG.h
+++ b/alib2data/src/grammar/Regular/RightRG.h
@@ -40,17 +40,17 @@ class RightRG : public std::acceptor<RightRG, VisitableGrammarBase, std::accepto
 	bool generatesEpsilon;
 
 public:
-	explicit RightRG(const alphabet::Symbol& initialSymbol);
+	explicit RightRG(alphabet::Symbol initialSymbol);
 
-	explicit RightRG(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit RightRG(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>& rightHandSide);
-	bool addRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide);
-	bool addRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>> rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, alphabet::Symbol rightHandSide);
+	bool addRule(alphabet::Symbol leftHandSide, std::pair<alphabet::Symbol, alphabet::Symbol> rightHandSide);
 
 	const std::map<alphabet::Symbol, std::set<std::variant<alphabet::Symbol, std::pair<alphabet::Symbol, alphabet::Symbol>>>> & getRules() const;
 
@@ -58,7 +58,7 @@ public:
 	bool removeRule(const alphabet::Symbol& leftHandSide, const alphabet::Symbol& rightHandSide);
 	bool removeRule(const alphabet::Symbol& leftHandSide, const std::pair<alphabet::Symbol, alphabet::Symbol>& rightHandSide);
 
-	bool addRawRule(const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRawRule(alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	std::map<alphabet::Symbol, std::set<std::vector<alphabet::Symbol>>> getRawRules() const;
 
diff --git a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
index 1f24c3ccf1e17792d7e51a9b90e80366a440525b..04f10d30e2bebe437878999cb9346885be3a9106 100644
--- a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
+++ b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.cpp
@@ -15,13 +15,13 @@
 
 namespace grammar {
 
-ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
+ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
 
 }
 
-ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+ContextPreservingUnrestrictedGrammar::ContextPreservingUnrestrictedGrammar(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* ContextPreservingUnrestrictedGrammar::clone() const {
@@ -75,9 +75,9 @@ bool ContextPreservingUnrestrictedGrammar::removeNonterminalSymbol(const alphabe
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool ContextPreservingUnrestrictedGrammar::addRule(const std::vector<alphabet::Symbol>& lContext, const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rContext, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool ContextPreservingUnrestrictedGrammar::addRule(std::vector<alphabet::Symbol> lContext, alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rContext, std::vector<alphabet::Symbol> rightHandSide) {
 	for(const alphabet::Symbol& symbol : lContext) {
-		if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+		if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 			throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 	}
 
@@ -85,16 +85,16 @@ bool ContextPreservingUnrestrictedGrammar::addRule(const std::vector<alphabet::S
 		throw GrammarException("Rule must rewrite nonterminal symbol");
 
 	for(const alphabet::Symbol& symbol : rContext) {
-		if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+		if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 			throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 	}
 
 	for(const alphabet::Symbol& symbol : rightHandSide) {
-		if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+		if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 			throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 	}
 
-	return rules[make_tuple(lContext, leftHandSide, rContext)].insert(rightHandSide).second;
+	return rules[make_tuple(std::move(lContext), std::move(leftHandSide), std::move(rContext))].insert(std::move(rightHandSide)).second;
 }
 
 const std::map<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>, std::set<std::vector<alphabet::Symbol>>> & ContextPreservingUnrestrictedGrammar::getRules() const {
diff --git a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
index 2668aa83de037cc3413ea731d710ad7e58e535aa..7cd0666b55e2569a64b57cdf89b02a29600b33b4 100644
--- a/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
+++ b/alib2data/src/grammar/Unrestricted/ContextPreservingUnrestrictedGrammar.h
@@ -22,15 +22,15 @@ class ContextPreservingUnrestrictedGrammar : public std::acceptor<ContextPreserv
 	std::map<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>, std::set<std::vector<alphabet::Symbol>>> rules;
 
 public:
-	explicit ContextPreservingUnrestrictedGrammar(const alphabet::Symbol& initialSymbol);
+	explicit ContextPreservingUnrestrictedGrammar(alphabet::Symbol initialSymbol);
 
-	explicit ContextPreservingUnrestrictedGrammar(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit ContextPreservingUnrestrictedGrammar(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const std::vector<alphabet::Symbol>& lContext, const alphabet::Symbol& leftHandSide, const std::vector<alphabet::Symbol>& rContext, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRule(std::vector<alphabet::Symbol> lContext, alphabet::Symbol leftHandSide, std::vector<alphabet::Symbol> rContext, std::vector<alphabet::Symbol> rightHandSide);
 
 	const std::map<std::tuple<std::vector<alphabet::Symbol>, alphabet::Symbol, std::vector<alphabet::Symbol>>, std::set<std::vector<alphabet::Symbol>>> & getRules() const;
 
diff --git a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
index 6c243e742cb432db7f8a4a201ab8d210e906016b..19186121a556343d00e74e99c22a4b85e0d94de3 100644
--- a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
+++ b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.cpp
@@ -15,13 +15,13 @@
 
 namespace grammar {
 
-UnrestrictedGrammar::UnrestrictedGrammar(const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
+UnrestrictedGrammar::UnrestrictedGrammar(alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
 
 }
 
-UnrestrictedGrammar::UnrestrictedGrammar(const std::set<alphabet::Symbol>& nonterminalAlphabet, const std::set<alphabet::Symbol>& terminalAlphabet, const alphabet::Symbol& initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(initialSymbol) {
-	setNonterminalAlphabet(nonterminalAlphabet);
-	setTerminalAlphabet(terminalAlphabet);
+UnrestrictedGrammar::UnrestrictedGrammar(std::set<alphabet::Symbol> nonterminalAlphabet, std::set<alphabet::Symbol> terminalAlphabet, alphabet::Symbol initialSymbol) : TerminalNonterminalAlphabetInitialSymbol(std::move(initialSymbol)) {
+	setNonterminalAlphabet(std::move(nonterminalAlphabet));
+	setTerminalAlphabet(std::move(terminalAlphabet));
 }
 
 GrammarBase* UnrestrictedGrammar::clone() const {
@@ -62,20 +62,20 @@ bool UnrestrictedGrammar::removeNonterminalSymbol(const alphabet::Symbol& symbol
 	return nonterminalAlphabet.erase(symbol);
 }
 
-bool UnrestrictedGrammar::addRule(const std::vector<alphabet::Symbol>& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide) {
+bool UnrestrictedGrammar::addRule(std::vector<alphabet::Symbol> leftHandSide, std::vector<alphabet::Symbol> rightHandSide) {
 	if(std::all_of(leftHandSide.begin(), leftHandSide.end(), [&](const alphabet::Symbol symbol) {return !nonterminalAlphabet.count(symbol);}))
 		throw GrammarException("Rule must rewrite nonterminal symbol");
 
 
 	for(const alphabet::Symbol& symbol : leftHandSide)
-		if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+		if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 			throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 
 	for(const alphabet::Symbol& symbol : rightHandSide)
-		if(terminalAlphabet.find(symbol) == terminalAlphabet.end() && nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end())
+		if(!terminalAlphabet.count(symbol) && !nonterminalAlphabet.count(symbol))
 			throw GrammarException("Symbol \"" + (std::string) symbol + "\" is not neither terminal nor nonterminal symbol");
 
-	return rules[leftHandSide].insert(rightHandSide).second;
+	return rules[std::move(leftHandSide)].insert(std::move(rightHandSide)).second;
 }
 
 const std::map<std::vector<alphabet::Symbol>, std::set<std::vector<alphabet::Symbol>>> & UnrestrictedGrammar::getRules() const {
diff --git a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
index 55761fd07e117c478060aa026922b7845b563620..e2fe2d64cd84ae886018fac3155413746204e328 100644
--- a/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
+++ b/alib2data/src/grammar/Unrestricted/UnrestrictedGrammar.h
@@ -22,15 +22,15 @@ class UnrestrictedGrammar : public std::acceptor<UnrestrictedGrammar, VisitableG
 	std::map<std::vector<alphabet::Symbol>, std::set<std::vector<alphabet::Symbol>>> rules;
 
 public:
-	explicit UnrestrictedGrammar(const alphabet::Symbol& initialSymbol);
+	explicit UnrestrictedGrammar(alphabet::Symbol initialSymbol);
 
-	explicit UnrestrictedGrammar(const std::set<alphabet::Symbol>& nonTerminalSymbols, const std::set<alphabet::Symbol>& terminalSymbols, const alphabet::Symbol& initialSymbol);
+	explicit UnrestrictedGrammar(std::set<alphabet::Symbol> nonTerminalSymbols, std::set<alphabet::Symbol> terminalSymbols, alphabet::Symbol initialSymbol);
 
 	virtual GrammarBase* clone() const;
 
 	virtual GrammarBase* plunder() &&;
 
-	bool addRule(const std::vector<alphabet::Symbol>& leftHandSide, const std::vector<alphabet::Symbol>& rightHandSide);
+	bool addRule(std::vector<alphabet::Symbol> leftHandSide, std::vector<alphabet::Symbol> rightHandSide);
 
 	const std::map<std::vector<alphabet::Symbol>, std::set<std::vector<alphabet::Symbol>>> & getRules() const;
 
diff --git a/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp b/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp
index b2ec4a5a656a773e54fdbbf475cfbddda283d540..b201de1dd3f26126f63a82cdf3b371b41bf4f742 100644
--- a/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp
+++ b/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.cpp
@@ -19,76 +19,66 @@
 
 namespace grammar {
 
-TerminalNonterminalAlphabetInitialSymbol::TerminalNonterminalAlphabetInitialSymbol(const alphabet::Symbol& initialSymbol) : initialSymbol(initialSymbol) {
-	addNonterminalSymbol(initialSymbol);
+TerminalNonterminalAlphabetInitialSymbol::TerminalNonterminalAlphabetInitialSymbol(alphabet::Symbol initialSymbol) : initialSymbol(initialSymbol) {
+	addNonterminalSymbol(std::move(initialSymbol));
 }
 
-bool TerminalNonterminalAlphabetInitialSymbol::addTerminalSymbol(const alphabet::Symbol& symbol) {
+bool TerminalNonterminalAlphabetInitialSymbol::addTerminalSymbol(alphabet::Symbol symbol) {
 	if(nonterminalAlphabet.find(symbol) != nonterminalAlphabet.end()){
 		throw GrammarException("Symbol \"" + (std::string) symbol + "\" is nonterminal symbol.");
 	}
 
-	return terminalAlphabet.insert(symbol).second;
+	return terminalAlphabet.insert(std::move(symbol)).second;
 }
 
 const std::set<alphabet::Symbol>& TerminalNonterminalAlphabetInitialSymbol::getTerminalAlphabet() const {
 	return terminalAlphabet;
 }
 
-void TerminalNonterminalAlphabetInitialSymbol::setTerminalAlphabet(const std::set<alphabet::Symbol>& alphabet) {
+void TerminalNonterminalAlphabetInitialSymbol::setTerminalAlphabet(std::set<alphabet::Symbol> alphabet) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(terminalAlphabet.begin(), terminalAlphabet.end(), alphabet.begin(), alphabet.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(alphabet.begin(), alphabet.end(), terminalAlphabet.begin(), terminalAlphabet.end(), std::inserter(added, added.end()));
-
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeTerminalSymbol(removedSymbol);
 	}
-
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addTerminalSymbol(addedSymbol);
-	}
+	// TODO check intersection with nonterminal alphabet
+	terminalAlphabet = std::move(alphabet);
 }
 
-bool TerminalNonterminalAlphabetInitialSymbol::addNonterminalSymbol(const alphabet::Symbol& symbol) {
+bool TerminalNonterminalAlphabetInitialSymbol::addNonterminalSymbol(alphabet::Symbol symbol) {
 	if(terminalAlphabet.find(symbol) != terminalAlphabet.end()){
 		throw GrammarException("Symbol \"" + (std::string) symbol + "\" is terminal symbol.");
 	}
 
-	return nonterminalAlphabet.insert(symbol).second;
+	return nonterminalAlphabet.insert(std::move(symbol)).second;
 }
 
 const std::set<alphabet::Symbol>& TerminalNonterminalAlphabetInitialSymbol::getNonterminalAlphabet() const {
 	return nonterminalAlphabet;
 }
 
-void TerminalNonterminalAlphabetInitialSymbol::setNonterminalAlphabet(const std::set<alphabet::Symbol>& alphabet) {
+void TerminalNonterminalAlphabetInitialSymbol::setNonterminalAlphabet(std::set<alphabet::Symbol> alphabet) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(nonterminalAlphabet.begin(), nonterminalAlphabet.end(), alphabet.begin(), alphabet.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(alphabet.begin(), alphabet.end(), nonterminalAlphabet.begin(), nonterminalAlphabet.end(), std::inserter(added, added.end()));
-
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeNonterminalSymbol(removedSymbol);
 	}
-
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addNonterminalSymbol(addedSymbol);
-	}
+	// TODO check intersection with nonterminal alphabet
+	nonterminalAlphabet = std::move(alphabet);
 }
 
 const alphabet::Symbol& TerminalNonterminalAlphabetInitialSymbol::getInitialSymbol() const{
 	return initialSymbol;
 }
 
-void TerminalNonterminalAlphabetInitialSymbol::setInitialSymbol(const alphabet::Symbol& symbol) {
+void TerminalNonterminalAlphabetInitialSymbol::setInitialSymbol(alphabet::Symbol symbol) {
 	if(nonterminalAlphabet.find(symbol) == nonterminalAlphabet.end()) {
 		throw GrammarException("Symbol \"" + (std::string) symbol + "\" isn't nonterminal symbol.");
 	}
 
-	initialSymbol = symbol;
+	initialSymbol = std::move(symbol);
 }
 
 } /* namespace grammar */
diff --git a/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.h b/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.h
index 7c7a3ccaebc9591f9afd7821d80e49b92cf7dd7d..fd0dc355ac6b36ca77c5fde0a43eafddbf67e0ee 100644
--- a/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.h
+++ b/alib2data/src/grammar/common/TerminalNonterminalAlphabetInitialSymbol.h
@@ -41,14 +41,14 @@ public:
 	 * Creates a new instance, initial symbol is included in the nonterminal alphabet
 	 * @param initialSymbol
 	 */
-	explicit TerminalNonterminalAlphabetInitialSymbol(const alphabet::Symbol& initialSymbol);
+	explicit TerminalNonterminalAlphabetInitialSymbol(alphabet::Symbol initialSymbol);
 
 	/**
 	 * Adds terminal symbol to the terminal alphabet.
 	 * @param symbol Symbol to add
 	 * @throws GrammarException when symbol is already a nonterminal symbol
 	 */
-	bool addTerminalSymbol(const alphabet::Symbol& symbol);
+	bool addTerminalSymbol(alphabet::Symbol symbol);
 
 	/**
 	 * Removes terminal symbol from the terminal alphabet.
@@ -65,14 +65,14 @@ public:
 	/**
 	 * Sets the terminal alphabet
 	 */
-	void setTerminalAlphabet(const std::set<alphabet::Symbol>& alphabet);
+	void setTerminalAlphabet(std::set<alphabet::Symbol> alphabet);
 
 	/**
 	 * Adds nonterminal symbol to the alphabet of nonterminals.
 	 * @param symbol Symbol to add
 	 * @throws GrammarException when symbol is already a terminal
 	 */
-	bool addNonterminalSymbol(const alphabet::Symbol& symbol);
+	bool addNonterminalSymbol(alphabet::Symbol symbol);
 
 	/**
 	 * Removes nonterminal symbol from the grammar.
@@ -89,7 +89,7 @@ public:
 	/**
 	 * Sets the terminal alphabet
 	 */
-	void setNonterminalAlphabet(const std::set<alphabet::Symbol>& alphabet);
+	void setNonterminalAlphabet(std::set<alphabet::Symbol> alphabet);
 
 	/**
 	 * @return start symbol
@@ -101,7 +101,7 @@ public:
 	 * @param symbol nonterminal Symbol
 	 * @throws GrammarException when symbol isn't a nonterminal symbol
 	 */
-	void setInitialSymbol(const alphabet::Symbol& symbol);
+	void setInitialSymbol(alphabet::Symbol symbol);
 
 };
 
diff --git a/alib2data/src/label/HexavigesimalLabel.h b/alib2data/src/label/HexavigesimalLabel.h
index 4f805ba06256442fd2bf0e3312356931f17f00ac..65aa7a6e7e018b92352eae48186a8a06d977f5bb 100644
--- a/alib2data/src/label/HexavigesimalLabel.h
+++ b/alib2data/src/label/HexavigesimalLabel.h
@@ -27,7 +27,7 @@ public:
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit HexavigesimalLabel(int  hexavigesimal);
+	explicit HexavigesimalLabel(int hexavigesimal);
 
 	virtual LabelBase* clone() const;
 
diff --git a/alib2data/src/label/Label.cpp b/alib2data/src/label/Label.cpp
index 8b56fd9975629f516721baf8ad8cb09210810d2c..e1e82ab841ebda02b5cce9669522c84183153216 100644
--- a/alib2data/src/label/Label.cpp
+++ b/alib2data/src/label/Label.cpp
@@ -24,8 +24,8 @@ label::Label labelFrom(char character) {
 	return label::Label { label::PrimitiveLabel { primitive::primitiveFrom ( character ) } };
 }
 
-label::Label labelFrom(const std::string& string) {
-	return label::Label { label::PrimitiveLabel { primitive::primitiveFrom ( string ) } };
+label::Label labelFrom(std::string string) {
+	return label::Label { label::PrimitiveLabel { primitive::primitiveFrom ( std::move ( string ) ) } };
 }
 
 label::Label labelFrom(const char* string) {
diff --git a/alib2data/src/label/Label.h b/alib2data/src/label/Label.h
index 5861898f53d86c9fd0a3be1b3ec16c907540f626..40c8719d708be58891bec3f56f35f7341b154c90 100644
--- a/alib2data/src/label/Label.h
+++ b/alib2data/src/label/Label.h
@@ -23,7 +23,7 @@ typedef alib::wrapper<LabelBase> Label;
 label::Label labelFrom(int number);
 label::Label labelFrom(int number1, int number2);
 label::Label labelFrom(char character);
-label::Label labelFrom(const std::string& string);
+label::Label labelFrom(std::string string);
 label::Label labelFrom(const char* string);
 
 } /* namespace label */
diff --git a/alib2data/src/label/LabelPairLabel.cpp b/alib2data/src/label/LabelPairLabel.cpp
index 55f8d2d78efd9ad41108210779c939fd427f8a2a..508464828fb8cb0fe93ee2249bf3a2bb48131ac7 100644
--- a/alib2data/src/label/LabelPairLabel.cpp
+++ b/alib2data/src/label/LabelPairLabel.cpp
@@ -11,11 +11,7 @@
 
 namespace label {
 
-LabelPairLabel::LabelPairLabel(const std::pair<Label, Label>& label) : label(std::move(label)) {
-
-}
-
-LabelPairLabel::LabelPairLabel(std::pair<Label, Label>&& label) : label(std::move(label)) {
+LabelPairLabel::LabelPairLabel(std::pair<Label, Label> label) : label(std::move(label)) {
 
 }
 
diff --git a/alib2data/src/label/LabelPairLabel.h b/alib2data/src/label/LabelPairLabel.h
index bc72f9194676561b9e7db3b3d93a19819d7eb9a9..ca517cb5c38aa1e50718d5bf3b10bf9097091222 100644
--- a/alib2data/src/label/LabelPairLabel.h
+++ b/alib2data/src/label/LabelPairLabel.h
@@ -29,9 +29,7 @@ public:
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit LabelPairLabel(const std::pair<Label, Label>& label);
-
-	explicit LabelPairLabel(std::pair<Label, Label>&& label);
+	explicit LabelPairLabel(std::pair<Label, Label> label);
 
 	virtual LabelBase* clone() const;
 
diff --git a/alib2data/src/label/LabelSetLabel.cpp b/alib2data/src/label/LabelSetLabel.cpp
index abfdde0ba0e2d9ae8ceb4429bca6dae82ed57bcb..b82adeafdbaa3b712284907c3a59625ba55e0f17 100644
--- a/alib2data/src/label/LabelSetLabel.cpp
+++ b/alib2data/src/label/LabelSetLabel.cpp
@@ -11,11 +11,7 @@
 
 namespace label {
 
-LabelSetLabel::LabelSetLabel(const std::set<Label>& label) : label(label) {
-
-}
-
-LabelSetLabel::LabelSetLabel(std::set<Label>&& label) : label(std::move(label)) {
+LabelSetLabel::LabelSetLabel(std::set<Label> label) : label(std::move(label)) {
 
 }
 
diff --git a/alib2data/src/label/LabelSetLabel.h b/alib2data/src/label/LabelSetLabel.h
index 2741e2dd803657b364cd862337f28e3700195e3c..0976572171055e6cab1440e7e8b585811d905bfd 100644
--- a/alib2data/src/label/LabelSetLabel.h
+++ b/alib2data/src/label/LabelSetLabel.h
@@ -29,9 +29,7 @@ public:
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit LabelSetLabel(const std::set<Label>& label);
-
-	explicit LabelSetLabel(std::set<Label>&& label);
+	explicit LabelSetLabel(std::set<Label> label);
 
 	virtual LabelBase* clone() const;
 
diff --git a/alib2data/src/label/NextLabel.cpp b/alib2data/src/label/NextLabel.cpp
index 47c14b822f6175e63dfcde27a232471876300514..f7642b5db00be85cb6ce84fb5664b28e01ff7f80 100644
--- a/alib2data/src/label/NextLabel.cpp
+++ b/alib2data/src/label/NextLabel.cpp
@@ -35,21 +35,21 @@ void NextLabel::Visit(void* userData, const ObjectLabel& label) {
 	Label* &out = *((Label**) userData);
 
 	primitive::Integer newId(0);
-	out = new Label(UniqueLabel(Label(label), newId));
+	out = new Label(UniqueLabel(Label(label), std::move(newId)));
 }
 
 void NextLabel::Visit(void* userData, const LabelSetLabel& label) {
 	Label* &out = *((Label**) userData);
 
 	primitive::Integer newId(0);
-	out = new Label(UniqueLabel(Label(label), newId));
+	out = new Label(UniqueLabel(Label(label), std::move(newId)));
 }
 
 void NextLabel::Visit(void* userData, const LabelPairLabel& label) {
 	Label* &out = *((Label**) userData);
 
 	primitive::Integer newId(0);
-	out = new Label(UniqueLabel(Label(label), newId));
+	out = new Label(UniqueLabel(Label(label), std::move(newId)));
 }
 
 void NextLabel::Visit(void* userData, const UniqueLabel& label) {
@@ -57,7 +57,7 @@ void NextLabel::Visit(void* userData, const UniqueLabel& label) {
 
 	primitive::NextPrimitive next;
 	primitive::Integer newId(label.getId().getData() + 1);
-	out = new Label(UniqueLabel(label.getLabel(), newId));
+	out = new Label(UniqueLabel(label.getLabel(), std::move(newId)));
 }
 
 Label NextLabel::nextLabel(const Label& label) {
diff --git a/alib2data/src/label/ObjectLabel.cpp b/alib2data/src/label/ObjectLabel.cpp
index e07535061ed2cb864065336b3804eb904b64431b..7b27bf348402e4a5d39eb4134704c95492edfa50 100644
--- a/alib2data/src/label/ObjectLabel.cpp
+++ b/alib2data/src/label/ObjectLabel.cpp
@@ -9,11 +9,7 @@
 
 namespace label {
 
-ObjectLabel::ObjectLabel(const alib::Object& label) : label(label) {
-
-}
-
-ObjectLabel::ObjectLabel(alib::Object&& label) : label(std::move(label)) {
+ObjectLabel::ObjectLabel(alib::Object label) : label(std::move(label)) {
 
 }
 
diff --git a/alib2data/src/label/ObjectLabel.h b/alib2data/src/label/ObjectLabel.h
index 37d27086f0e13b8bd1132118e1de86cb314a6d0c..e467f30e9517205641e6a114f11cf18374c90669 100644
--- a/alib2data/src/label/ObjectLabel.h
+++ b/alib2data/src/label/ObjectLabel.h
@@ -27,9 +27,7 @@ public:
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit ObjectLabel(const alib::Object& label);
-
-	explicit ObjectLabel(alib::Object&& label);
+	explicit ObjectLabel(alib::Object label);
 
 	virtual LabelBase* clone() const;
 
diff --git a/alib2data/src/label/PrimitiveLabel.cpp b/alib2data/src/label/PrimitiveLabel.cpp
index cabddfc85671aed58430896ab7503667b7f6756f..656b723388fc949abcff81c3c5e5ac424f353372 100644
--- a/alib2data/src/label/PrimitiveLabel.cpp
+++ b/alib2data/src/label/PrimitiveLabel.cpp
@@ -9,11 +9,7 @@
 
 namespace label {
 
-PrimitiveLabel::PrimitiveLabel(const primitive::Primitive& primitive) : primitive(primitive) {
-
-}
-
-PrimitiveLabel::PrimitiveLabel(primitive::Primitive&& primitive) : primitive(std::move(primitive)) {
+PrimitiveLabel::PrimitiveLabel(primitive::Primitive primitive) : primitive(std::move(primitive)) {
 
 }
 
diff --git a/alib2data/src/label/PrimitiveLabel.h b/alib2data/src/label/PrimitiveLabel.h
index f8f572a2699d8f0626a22fdde61502289413b79e..3cff7b163760b64c7d2de2c8cb62feb84cf0b0f8 100644
--- a/alib2data/src/label/PrimitiveLabel.h
+++ b/alib2data/src/label/PrimitiveLabel.h
@@ -27,9 +27,7 @@ public:
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit PrimitiveLabel(const primitive::Primitive& primitive);
-
-	explicit PrimitiveLabel(primitive::Primitive&& primitive);
+	explicit PrimitiveLabel(primitive::Primitive primitive);
 
 	virtual LabelBase* clone() const;
 
diff --git a/alib2data/src/label/UniqueLabel.cpp b/alib2data/src/label/UniqueLabel.cpp
index c2c72ed7d3900efec301ecb348ac1474223c66b6..ff4364899e506eb40586e0d14c6c86ba2e90ae20 100644
--- a/alib2data/src/label/UniqueLabel.cpp
+++ b/alib2data/src/label/UniqueLabel.cpp
@@ -11,11 +11,7 @@
 
 namespace label {
 
-UniqueLabel::UniqueLabel(const Label& label, const primitive::Integer& id) : label(label), id(id) {
-
-}
-
-UniqueLabel::UniqueLabel(Label&& label, primitive::Integer&& id) : label(std::move(label)), id(std::move(id)) {
+UniqueLabel::UniqueLabel(Label label, primitive::Integer id) : label(std::move(label)), id(std::move(id)) {
 
 }
 
diff --git a/alib2data/src/label/UniqueLabel.h b/alib2data/src/label/UniqueLabel.h
index bdd9305b3346aa3bfaff7620b44669e62831ba7e..4073a89912e0985c146a60e1a696d92fb1ecd025 100644
--- a/alib2data/src/label/UniqueLabel.h
+++ b/alib2data/src/label/UniqueLabel.h
@@ -31,9 +31,7 @@ public:
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit UniqueLabel(const Label& label, const primitive::Integer& id);
-
-	explicit UniqueLabel(Label&& label, primitive::Integer&& id);
+	explicit UniqueLabel(Label label, primitive::Integer id);
 
 	virtual LabelBase* clone() const;
 
diff --git a/alib2data/src/primitive/Primitive.cpp b/alib2data/src/primitive/Primitive.cpp
index b6695aecbc977aad7ca98ca12f95006228a25eee..88b8b4bde9f7026a78bda883a2757e8a09ba18bc 100644
--- a/alib2data/src/primitive/Primitive.cpp
+++ b/alib2data/src/primitive/Primitive.cpp
@@ -26,8 +26,8 @@ Primitive primitiveFrom(const char* string) {
 	return primitiveFrom((std::string) string);
 }
 
-Primitive primitiveFrom(const std::string& string) {
-	return Primitive { String { string } };
+Primitive primitiveFrom(std::string string) {
+	return Primitive { String { std::move ( string ) } };
 }
 
 Primitive primitiveFrom(unsigned number) {
diff --git a/alib2data/src/primitive/Primitive.h b/alib2data/src/primitive/Primitive.h
index 731b106825933049087b82917069cdea227f72fc..a6a8521e608e2f4145302c8969edd5983fdbd455 100644
--- a/alib2data/src/primitive/Primitive.h
+++ b/alib2data/src/primitive/Primitive.h
@@ -22,7 +22,7 @@ typedef alib::wrapper<PrimitiveBase> Primitive;
 
 Primitive primitiveFrom(int number);
 Primitive primitiveFrom(char character);
-Primitive primitiveFrom(const std::string& string);
+Primitive primitiveFrom(std::string string);
 Primitive primitiveFrom(const char* string);
 Primitive primitiveFrom(unsigned number);
 Primitive primitiveFrom(bool value);
diff --git a/alib2data/src/primitive/String.cpp b/alib2data/src/primitive/String.cpp
index b9bbb6f58fc4c823aa8209e24073950b9ac4baa7..753d58a5fb42203a1e95876578aeca737c66d57d 100644
--- a/alib2data/src/primitive/String.cpp
+++ b/alib2data/src/primitive/String.cpp
@@ -9,11 +9,7 @@
 
 namespace primitive {
 
-String::String(const std::string& data) : data(data) {
-
-}
-
-String::String(std::string&& data) : data(std::move(data)) {
+String::String(std::string data) : data(std::move(data)) {
 
 }
 
diff --git a/alib2data/src/primitive/String.h b/alib2data/src/primitive/String.h
index 48358e88f764a20a1f1e8cefd3b1d6ed14eda15c..fe84241bc5824772d209fc71045935b770f88072 100644
--- a/alib2data/src/primitive/String.h
+++ b/alib2data/src/primitive/String.h
@@ -27,9 +27,7 @@ public:
 	 * Creates new symbol with given name.
 	 * @param symbol name of the symbol
 	 */
-	explicit String(const std::string& data);
-
-	explicit String(std::string&& data);
+	explicit String(std::string data);
 
 	explicit String(const char* data);
 
diff --git a/alib2data/src/regexp/RegExp.cpp b/alib2data/src/regexp/RegExp.cpp
index b0081b93d851eb1a24ae952c799ea6ab73eb0fe5..9f9ef9fda2f467241bede02f977f72990425e8a7 100644
--- a/alib2data/src/regexp/RegExp.cpp
+++ b/alib2data/src/regexp/RegExp.cpp
@@ -13,28 +13,28 @@
 
 namespace regexp {
 
-regexp::RegExp regexpFrom( const std::string& string ) {
+regexp::RegExp regexpFrom( const std::string & string ) {
 	regexp::UnboundedRegExpConcatenation con;
-	for(const auto& symbol : string) {
-		con.appendElement( regexp::UnboundedRegExpSymbol( alphabet::symbolFrom(symbol)));
+	for(const char& symbol : string) {
+		con.appendElement( regexp::UnboundedRegExpSymbol( alphabet::symbolFrom( symbol ) ) );
 	}
-	return regexp::RegExp { regexp::UnboundedRegExp ( con ) };
+	return regexp::RegExp { regexp::UnboundedRegExp ( std::move ( con ) ) };
 }
 
 regexp::RegExp regexpFrom( const char* string ) {
 	return regexpFrom( (std::string) string );
 }
 
-regexp::RegExp regexpFrom( const string::LinearString& string ) {
+regexp::RegExp regexpFrom( string::LinearString string ) {
 	regexp::UnboundedRegExpConcatenation con;
-	for(const auto& symbol : string.getContent()) {
-		con.appendElement( regexp::UnboundedRegExpSymbol(symbol));
+	for(auto& symbol : string.getContent()) {
+		con.appendElement( regexp::UnboundedRegExpSymbol( std::move ( symbol ) ) );
 	}
-	return regexp::RegExp { regexp::UnboundedRegExp ( con ) };
+	return regexp::RegExp { regexp::UnboundedRegExp ( std::move( con ) ) };
 }
 
-regexp::RegExp regexpFrom( const alphabet::Symbol& symbol ) {
-	return regexp::RegExp { regexp::UnboundedRegExp( regexp::UnboundedRegExpSymbol(symbol) ) };
+regexp::RegExp regexpFrom( alphabet::Symbol symbol ) {
+	return regexp::RegExp { regexp::UnboundedRegExp( regexp::UnboundedRegExpSymbol( std::move ( symbol ) ) ) };
 }
 
 regexp::RegExp regexpFrom( ) {
diff --git a/alib2data/src/regexp/RegExp.h b/alib2data/src/regexp/RegExp.h
index 7f031301219f0e476836dea140cdcd166a0e115b..b989f65b92c122afcc876af6abb6ecb37b5b0387 100644
--- a/alib2data/src/regexp/RegExp.h
+++ b/alib2data/src/regexp/RegExp.h
@@ -27,9 +27,9 @@ regexp::RegExp regexpFrom( const std::string& string );
 
 regexp::RegExp regexpFrom( const char* string );
 
-regexp::RegExp regexpFrom( const string::LinearString& string );
+regexp::RegExp regexpFrom( string::LinearString string );
 
-regexp::RegExp regexpFrom( const alphabet::Symbol& symbol );
+regexp::RegExp regexpFrom( alphabet::Symbol symbol );
 
 regexp::RegExp regexpFrom( );
 
diff --git a/alib2data/src/regexp/common/RegExpAlphabet.cpp b/alib2data/src/regexp/common/RegExpAlphabet.cpp
index cc2ef9333f361b53f17c30bab5aa0a93e383f12c..eb6ea9544a1d3e60d14db3c7848014507510ad49 100644
--- a/alib2data/src/regexp/common/RegExpAlphabet.cpp
+++ b/alib2data/src/regexp/common/RegExpAlphabet.cpp
@@ -15,8 +15,8 @@ const std::set<alphabet::Symbol>& RegExpAlphabet::getAlphabet() const {
 	return alphabet;
 }
 
-bool RegExpAlphabet::addSymbolToAlphabet(const alphabet::Symbol& symbol) {
-	return alphabet.insert(symbol).second;
+bool RegExpAlphabet::addSymbolToAlphabet(alphabet::Symbol symbol) {
+	return alphabet.insert(std::move(symbol)).second;
 }
 
 void RegExpAlphabet::addSymbolsToAlphabet(const std::set<alphabet::Symbol>& symbols) {
@@ -25,20 +25,15 @@ void RegExpAlphabet::addSymbolsToAlphabet(const std::set<alphabet::Symbol>& symb
 	}
 }
 
-void RegExpAlphabet::setAlphabet(const std::set<alphabet::Symbol>& newSymbols) {
+void RegExpAlphabet::setAlphabet(std::set<alphabet::Symbol> newSymbols) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(alphabet.begin(), alphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(newSymbols.begin(), newSymbols.end(), alphabet.begin(), alphabet.end(), std::inserter(added, added.end()));
-	
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeSymbolFromAlphabet(removedSymbol);
 	}
 
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addSymbolToAlphabet(addedSymbol);
-	}
+	alphabet = std::move(newSymbols);
 }
 
 } /* namespace regexp */
diff --git a/alib2data/src/regexp/common/RegExpAlphabet.h b/alib2data/src/regexp/common/RegExpAlphabet.h
index 6c87ae3eaf4e0207908c5a5c802392875f63e261..ebc1ec2d9b2d94cce4589330f4d2c6eb3d587266 100644
--- a/alib2data/src/regexp/common/RegExpAlphabet.h
+++ b/alib2data/src/regexp/common/RegExpAlphabet.h
@@ -26,7 +26,7 @@ public:
 	 * Adds input symbol to input alphabet.
 	 * @param symbol Symbol to add
 	 */
-	bool addSymbolToAlphabet(const alphabet::Symbol& symbol);
+	bool addSymbolToAlphabet(alphabet::Symbol symbol);
 
 	/**
 	 * Adds input symbols to input alphabet.
@@ -38,7 +38,7 @@ public:
 	 * Sets input symbols of the regexp.
 	 * @param symbols Symbols to set
 	 */
-	void setAlphabet(const std::set<alphabet::Symbol>& symbols);
+	void setAlphabet(std::set<alphabet::Symbol> symbols);
 
 	/**
 	 * Removes input symbol from the input alphabet.
diff --git a/alib2data/src/std/set.hpp b/alib2data/src/std/set.hpp
index 968c901515a909705a0364cceac54428ec7d1876..a3f2c611b8743f749aa540b2d6303076bfd1d588 100644
--- a/alib2data/src/std/set.hpp
+++ b/alib2data/src/std/set.hpp
@@ -50,6 +50,80 @@ bool empty_intersection(const set<T>& x, const set<T>& y) {
 	return true;
 }
 
+template <class Iterator>
+class set_move_iterator {
+	Iterator current;
+
+public:
+	typedef Iterator iterator_type;
+	typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
+	typedef typename iterator_traits<Iterator>::value_type        value_type;
+	typedef typename iterator_traits<Iterator>::difference_type   difference_type;
+	typedef Iterator pointer;
+	typedef value_type&& reference;
+
+	explicit set_move_iterator() {
+	}
+
+	explicit set_move_iterator (Iterator it) : current(it) {
+	}
+
+	template <class Iter> set_move_iterator (const set_move_iterator<Iter>& it) : current(it.current) {
+	}
+
+	template <class Iter> set_move_iterator& operator= (const set_move_iterator<Iter>& it) {
+		current = it.current;
+	}
+
+	iterator_type base() const {
+		return current;
+	}
+
+	pointer operator->() const {
+		return current;
+	}
+
+	reference operator*() const {
+		return std::move(const_cast<value_type&>(*current));
+	}
+
+	set_move_iterator& operator++() {
+		++current;
+		return *this;
+	}
+
+	set_move_iterator& operator--() {
+		--current;
+		return *this;
+	}
+
+	set_move_iterator& operator++(int) {
+		set_move_iterator temp = *this;
+		++current;
+		return temp;
+	}
+
+	set_move_iterator& operator--(int) {
+		set_move_iterator temp = *this;
+		--current;
+		return temp;
+	}
+
+	bool operator== (const set_move_iterator<Iterator>& other) {
+		return this->current == other.current;
+	}
+
+	bool operator!= (const set_move_iterator<Iterator>& other) {
+		return ! ( *this == other );
+	}
+
+};
+
+template<class Iterator>
+set_move_iterator<Iterator> make_set_move_iterator (Iterator it) {
+	return set_move_iterator<Iterator>(it);
+}
+
 } /* namespace std */
 
 #endif /* __SET_HPP_ */
diff --git a/alib2data/src/string/CyclicString.cpp b/alib2data/src/string/CyclicString.cpp
index 443be9b159f095d44cfe4990093567b78cc70d08..5161be34bcd5a8dbfadaf47776f32b8d0420fcc1 100644
--- a/alib2data/src/string/CyclicString.cpp
+++ b/alib2data/src/string/CyclicString.cpp
@@ -43,14 +43,14 @@ CyclicString::CyclicString(std::vector<alphabet::Symbol>&& data) {
 	setContent(std::move(data));
 }
 
-CyclicString::CyclicString(const std::string& str) {
-	for (unsigned i = 0; i < str.length(); ++i) {
-		m_Data.push_back(alphabet::symbolFrom(str[i]));
+CyclicString::CyclicString(const std::string& string) {
+	for(const char& symbol : string) {
+		m_Data.push_back( alphabet::symbolFrom( symbol ) );
 	}
 	alphabet = std::set<alphabet::Symbol>(m_Data.begin(), m_Data.end());
 }
 
-CyclicString::CyclicString(const char* str) : CyclicString((std::string) str) {
+CyclicString::CyclicString(const char* string) : CyclicString((std::string) string) {
 }
 
 CyclicString::CyclicString(const Epsilon& epsilon) {
@@ -68,7 +68,7 @@ StringBase* CyclicString::plunder() && {
 bool CyclicString::removeSymbolFromAlphabet(const alphabet::Symbol & symbol) {
 	if(std::any_of(m_Data.begin(), m_Data.end(), [&](const alphabet::Symbol & s) { return s == symbol; } ) )
 		throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is used.");
-	
+
 	return alphabet.erase(symbol);
 }
 
@@ -97,7 +97,7 @@ int CyclicString::compare(const LinearString& other) const {
 		std::compare<std::set<alphabet::Symbol>> comp;
 		return comp(alphabet, other.getAlphabet());
 	}
-	
+
 	if(this->selfTypeId() < typeId<LinearString>())
 		return -1;
 	else
diff --git a/alib2data/src/string/CyclicString.h b/alib2data/src/string/CyclicString.h
index c97a433e259e5c39113eb53cecd35529c7e31fa6..18a63a7f47a5397b67d0f44a3bc609ba25df5ce8 100644
--- a/alib2data/src/string/CyclicString.h
+++ b/alib2data/src/string/CyclicString.h
@@ -32,8 +32,8 @@ public:
 	explicit CyclicString(std::set<alphabet::Symbol>&& alphabet, std::vector<alphabet::Symbol>&& data);
 	explicit CyclicString(const std::vector<alphabet::Symbol>& data);
 	explicit CyclicString(std::vector<alphabet::Symbol>&& data);
-	explicit CyclicString(const std::string& str);
-	explicit CyclicString(const char* str);
+	explicit CyclicString(const std::string& string);
+	explicit CyclicString(const char* string);
 	explicit CyclicString(const Epsilon& epsilon);
 
 	virtual StringBase* clone() const;
diff --git a/alib2data/src/string/LinearString.cpp b/alib2data/src/string/LinearString.cpp
index 856cfd2a7afda8623125d6f5b9d5ac6181397bed..85d8d5bd19e8ab19c59a35011e694e1f0c87288e 100644
--- a/alib2data/src/string/LinearString.cpp
+++ b/alib2data/src/string/LinearString.cpp
@@ -43,14 +43,14 @@ LinearString::LinearString(std::vector<alphabet::Symbol>&& data) {
 	m_Data = std::move(data);
 }
 
-LinearString::LinearString(const std::string& str) {
-	for (unsigned i = 0; i < str.length(); ++i) {
-		m_Data.push_back(alphabet::symbolFrom(str[i]));
+LinearString::LinearString(const std::string& string) {
+	for(const char& symbol : string) {
+		m_Data.push_back( alphabet::symbolFrom( symbol ) );
 	}
 	alphabet = std::set<alphabet::Symbol>(m_Data.begin(), m_Data.end());
 }
 
-LinearString::LinearString(const char* str) : LinearString((std::string) str) {
+LinearString::LinearString(const char* string) : LinearString((std::string) string) {
 }
 
 LinearString::LinearString(const Epsilon& epsilon) {
@@ -68,7 +68,7 @@ StringBase* LinearString::plunder() && {
 bool LinearString::removeSymbolFromAlphabet(const alphabet::Symbol & symbol) {
 	if(std::any_of(m_Data.begin(), m_Data.end(), [&](const alphabet::Symbol & s) { return s == symbol; } ) )
 		throw exception::AlibException("Input symbol \"" + (std::string) symbol + "\" is used.");
-	
+
 	return alphabet.erase(symbol);
 }
 
@@ -128,7 +128,7 @@ int LinearString::compare(const Epsilon& other) const {
 		std::compare<std::set<alphabet::Symbol>> comp;
 		return comp(alphabet, other.getAlphabet());
 	}
-	
+
 	if(this->selfTypeId() < typeId<Epsilon>())
 		return -1;
 	else
diff --git a/alib2data/src/string/LinearString.h b/alib2data/src/string/LinearString.h
index 13675e888728e22eb2dfc5ba94f916aa30cd259f..5138e70158b86f64fc1a0cdd3fddf079cc826975 100644
--- a/alib2data/src/string/LinearString.h
+++ b/alib2data/src/string/LinearString.h
@@ -33,8 +33,8 @@ public:
 	explicit LinearString(std::set<alphabet::Symbol>&& alphabet, std::vector<alphabet::Symbol>&& data);
 	explicit LinearString(const std::vector<alphabet::Symbol>& data);
 	explicit LinearString(std::vector<alphabet::Symbol>&& data);
-	explicit LinearString(const std::string& str);
-	explicit LinearString(const char* str);
+	explicit LinearString(const std::string& string);
+	explicit LinearString(const char* string);
 	explicit LinearString(const Epsilon& epsilon);
 
 	virtual StringBase* clone() const;
@@ -46,7 +46,7 @@ public:
 	 * @param element to append
 	 */
 	void appendSymbol(const alphabet::Symbol& symbol);
-	
+
 	void appendSymbol(alphabet::Symbol&& symbol);
 
 	/**
diff --git a/alib2data/src/string/common/StringAlphabet.cpp b/alib2data/src/string/common/StringAlphabet.cpp
index 9fb8e517412e3c54f166c270630f94b823397767..0ceff53de0315855bfc0674c1ada6b7284f96cd8 100644
--- a/alib2data/src/string/common/StringAlphabet.cpp
+++ b/alib2data/src/string/common/StringAlphabet.cpp
@@ -15,8 +15,8 @@ const std::set<alphabet::Symbol>& StringAlphabet::getAlphabet() const {
 	return alphabet;
 }
 
-bool StringAlphabet::addSymbolToAlphabet(const alphabet::Symbol& symbol) {
-	return alphabet.insert(symbol).second;
+bool StringAlphabet::addSymbolToAlphabet(alphabet::Symbol symbol) {
+	return alphabet.insert(std::move(symbol)).second;
 }
 
 void StringAlphabet::addSymbolsToAlphabet(const std::set<alphabet::Symbol>& symbols) {
@@ -25,20 +25,15 @@ void StringAlphabet::addSymbolsToAlphabet(const std::set<alphabet::Symbol>& symb
 	}
 }
 
-void StringAlphabet::setAlphabet(const std::set<alphabet::Symbol>& newSymbols) {
+void StringAlphabet::setAlphabet(std::set<alphabet::Symbol> newSymbols) {
 	std::set<alphabet::Symbol> removed;
 	std::set_difference(alphabet.begin(), alphabet.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
 
-	std::set<alphabet::Symbol> added;
-	std::set_difference(newSymbols.begin(), newSymbols.end(), alphabet.begin(), alphabet.end(), std::inserter(added, added.end()));
-	
 	for(const alphabet::Symbol& removedSymbol : removed) {
 		removeSymbolFromAlphabet(removedSymbol);
 	}
 
-	for(const alphabet::Symbol& addedSymbol : added) {
-		addSymbolToAlphabet(addedSymbol);
-	}
+	alphabet = std::move(newSymbols);
 }
 
 } /* namespace string */
diff --git a/alib2data/src/string/common/StringAlphabet.h b/alib2data/src/string/common/StringAlphabet.h
index d8807428441cc4ea0d88aa78088005146ae21319..d1dbe948f73992b798668b9be1f7989a70a63e75 100644
--- a/alib2data/src/string/common/StringAlphabet.h
+++ b/alib2data/src/string/common/StringAlphabet.h
@@ -25,7 +25,7 @@ public:
 	 * Adds input symbol to input alphabet.
 	 * @param symbol Symbol to add
 	 */
-	bool addSymbolToAlphabet(const alphabet::Symbol& symbol);
+	bool addSymbolToAlphabet(alphabet::Symbol symbol);
 
 	/**
 	 * Adds input symbols to input alphabet.
@@ -37,7 +37,7 @@ public:
 	 * Sets input symbols of the string.
 	 * @param symbols Symbols to set
 	 */
-	void setAlphabet(const std::set<alphabet::Symbol>& symbols);
+	void setAlphabet(std::set<alphabet::Symbol> symbols);
 
 	/**
 	 * Removes input symbol from the input alphabet.