diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
index 938321c6830855b834e73fbde6d650ad753d6485..33d7d6bdac8ce48c5f82728fe621466abd7713a1 100644
--- a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
+++ b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
@@ -40,21 +40,21 @@ std::set<string::LinearString> GenerateUpToLength::generate( const T & grammar,
 		if(rules.find(nonterminal) == rules.end()) continue;
 
 		for(const std::vector<alphabet::Symbol>& rhs : rules.find(nonterminal)->second) {
+			if(item.first.size() + item.second.size() + rhs.size() > length) continue;
+
 			std::vector<alphabet::Symbol> newStack(item.second);
 			std::vector<alphabet::Symbol> newString(item.first);
 			newStack.insert(newStack.end(), rhs.rbegin(), rhs.rend());
 
-			if(newString.size() + newStack.size() > length) continue;
-
 			while(!newStack.empty() && grammar.getTerminalAlphabet().count(newStack.back())) {
-				newString.push_back(newStack.back());
+				newString.push_back(std::move(newStack.back()));
 				newStack.pop_back();
 			}
 
 			if(newStack.empty()) {
 				res.insert(string::LinearString(newString));
 			} else {
-				data.push_back(std::make_pair(newString, newStack));
+				data.push_back(std::make_pair(std::move(newString), std::move(newStack)));
 			}
 		}
 	}
diff --git a/alib2algo/src/grammar/simplify/ToCNF.cpp b/alib2algo/src/grammar/simplify/ToCNF.cpp
index 7c3e60d286d5212fe44922b439c9239bccef652b..b7dfd0aa1ab20589fdd98df5218d2838b744a466 100644
--- a/alib2algo/src/grammar/simplify/ToCNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToCNF.cpp
@@ -29,9 +29,9 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
 			createdSymbols.insert(std::make_pair(secondProposal, alphabet::createUniqueSymbol(secondProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
 		}
 		grammar.addNonterminalSymbol(createdSymbols.find(secondProposal)->second);
-		grammar.addRawRule(createdSymbols.find(secondProposal)->second, {second.first, second.second});
+		grammar.addRawRule(createdSymbols.find(secondProposal)->second, {std::move(second.first), std::move(second.second)});
 
-		return std::make_pair(firstLhs, createdSymbols.find(secondProposal)->second);
+		return std::make_pair(std::move(firstLhs), createdSymbols.find(secondProposal)->second);
 	} else {
 		auto first = splitToPairs(grammar, rhs, from, size / 2, createdSymbols);
 		alphabet::Symbol firstProposal{alphabet::SymbolPairSymbol(first)};
@@ -39,7 +39,7 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
 			createdSymbols.insert(std::make_pair(firstProposal, alphabet::createUniqueSymbol(firstProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
 		}
 		grammar.addNonterminalSymbol(createdSymbols.find(firstProposal)->second);
-		grammar.addRawRule(createdSymbols.find(firstProposal)->second, {first.first, first.second});
+		grammar.addRawRule(createdSymbols.find(firstProposal)->second, {std::move(first.first), std::move(first.second)});
 
 		auto second = splitToPairs(grammar, rhs, from + size / 2, size - size / 2, createdSymbols);
 		alphabet::Symbol secondProposal{alphabet::SymbolPairSymbol(second)};
@@ -47,7 +47,7 @@ std::pair<alphabet::Symbol, alphabet::Symbol> splitToPairs(T& grammar, const std
 			createdSymbols.insert(std::make_pair(secondProposal, alphabet::createUniqueSymbol(secondProposal, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet())));
 		}
 		grammar.addNonterminalSymbol(createdSymbols.find(secondProposal)->second);
-		grammar.addRawRule(createdSymbols.find(secondProposal)->second, {second.first, second.second});
+		grammar.addRawRule(createdSymbols.find(secondProposal)->second, {std::move(second.first), std::move(second.second)});
 
 		return std::make_pair(createdSymbols.find(firstProposal)->second, createdSymbols.find(secondProposal)->second);
 	}
@@ -57,11 +57,8 @@ template<class T>
 grammar::CNF convertInternal( const T & origGrammar ) {
 	T grammarTmp(origGrammar.getInitialSymbol());
 
-	for( const auto & symbol : origGrammar.getNonterminalAlphabet() )
-		grammarTmp.addNonterminalSymbol( symbol );
-
-	for( const auto & symbol : origGrammar.getTerminalAlphabet() )
-		grammarTmp.addTerminalSymbol( symbol );
+	grammarTmp.setNonterminalAlphabet(origGrammar.getNonterminalAlphabet() );
+	grammarTmp.setTerminalAlphabet( origGrammar.getTerminalAlphabet() );
 
 	std::map<alphabet::Symbol, alphabet::Symbol> createdSymbols;
 	auto origRules = origGrammar.getRawRules();
@@ -71,7 +68,7 @@ grammar::CNF convertInternal( const T & origGrammar ) {
 				grammarTmp.addRawRule(origRule.first, origRhs);
 			else if(origRhs.size() > 2) {
 				auto second = splitToPairs(grammarTmp, origRhs, 0, origRhs.size(), createdSymbols);
-				grammarTmp.addRawRule(origRule.first, {second.first, second.second});
+				grammarTmp.addRawRule(origRule.first, {std::move(second.first), std::move(second.second)});
 			} else
 				throw exception::AlibException("Invalid rule in grammar");
 		}
@@ -81,18 +78,15 @@ grammar::CNF convertInternal( const T & origGrammar ) {
 
 	grammar::CNF grammar(grammarTmp.getInitialSymbol());
 
-	for( const auto & symbol : grammarTmp.getNonterminalAlphabet() )
-		grammar.addNonterminalSymbol( symbol );
-
-	for( const auto & symbol : grammarTmp.getTerminalAlphabet() )
-		grammar.addTerminalSymbol( symbol );
+	grammar.setNonterminalAlphabet( grammarTmp.getNonterminalAlphabet() );
+	grammar.setTerminalAlphabet( grammarTmp.getTerminalAlphabet() );
 
 	std::map<alphabet::Symbol, alphabet::Symbol> terminalToShadowNonterminal;
 	for( const auto & symbol : grammarTmp.getTerminalAlphabet() ) {
 		alphabet::Symbol shadowSymbol = alphabet::createUniqueSymbol(symbol, grammar.getTerminalAlphabet(), grammar.getNonterminalAlphabet());
 		terminalToShadowNonterminal.insert( std::make_pair( symbol, shadowSymbol ));
 		grammar.addNonterminalSymbol( shadowSymbol );
-		grammar.addRule(shadowSymbol, symbol);
+		grammar.addRule(std::move(shadowSymbol), symbol);
 	}
 
 	auto tmpRules = grammarTmp.getRawRules();
diff --git a/alib2algo/src/grammar/simplify/ToGNF.cpp b/alib2algo/src/grammar/simplify/ToGNF.cpp
index 6507b2f5e91cb8b71a2d340afbd888f67fd28b3a..89a3be0f0458ecdbaf51691ef554e0b22db5810b 100644
--- a/alib2algo/src/grammar/simplify/ToGNF.cpp
+++ b/alib2algo/src/grammar/simplify/ToGNF.cpp
@@ -81,7 +81,7 @@ grammar::GNF convertInternal( const grammar::EpsilonFreeCFG & origGrammar ) {
 				else
 					convertedNonterminals.push_back(terminalToPrimed.find(rhsSymbol)->second);
 			}
-			res.addRule(rule.first, std::make_pair(rhs[0], convertedNonterminals));
+			res.addRule(rule.first, std::make_pair(rhs[0], std::move(convertedNonterminals)));
 		}
 	}
 	return res;