diff --git a/alib2algo/src/conversions/rg2re/Algebraic.cpp b/alib2algo/src/conversions/rg2re/Algebraic.cpp
index 36bca86b616deb5cafb4b7365e4d31bc06aa9247..509e463059548b6c1f12cde6a86ff266e7345bf5 100644
--- a/alib2algo/src/conversions/rg2re/Algebraic.cpp
+++ b/alib2algo/src/conversions/rg2re/Algebraic.cpp
@@ -10,6 +10,7 @@
 #include "../../equations/LeftRegularEquationSolver.h"
 #include "../../equations/RightRegularEquationSolver.h"
 
+#include <exception/AlibException.h>
 #include <regexp/unbounded/UnboundedRegExpElements.h>
 
 namespace conversions
diff --git a/alib2algo/src/equations/LeftRegularEquationSolver.cpp b/alib2algo/src/equations/LeftRegularEquationSolver.cpp
index cc9fed801761292214289595d2801af941658e28..80051cc993ccc1645d214d9b621c5006fd108103 100644
--- a/alib2algo/src/equations/LeftRegularEquationSolver.cpp
+++ b/alib2algo/src/equations/LeftRegularEquationSolver.cpp
@@ -12,71 +12,71 @@
 
 namespace equations {
 
-regexp::UnboundedRegExp LeftRegularEquationSolver::eliminate( void ) {
+regexp::UnboundedRegExp LeftRegularEquationSolver::eliminate(void) {
 	regexp::RegExpOptimize opt;
 
-	for( auto itA = m_symbolsByDepth.rbegin( ); itA != m_symbolsByDepth.rend( ); itA ++ ) {
-		const alphabet::Symbol & a = * itA;
+	for(auto itA = nonterminalSymbolsByDepth.rbegin(); itA != nonterminalSymbolsByDepth.rend(); itA ++) {
+		const alphabet::Symbol& a = * itA;
 
 		/*
 		 * Apply Arden's Lemma
 		 * A = A0 + B1 + C2
 		 * => A = 10*B + 20*C
 		 */
-		regexp::UnboundedRegExpIteration loop( std::move( m_eqTransition[ a ][ a ] ) );
-		opt.optimize( loop );
+		regexp::UnboundedRegExpIteration loop(std::move(equationTransition.find(std::make_pair(a, a))->second));
+		opt.optimize(loop);
 
 		// for all transitions from A apply Arden's Lemma
-		for( auto itB = std::next( itA ) ; itB != m_symbolsByDepth.rend( ); itB ++ ) {
-			const alphabet::Symbol & b = * itB;
+		for(auto itB = std::next(itA) ; itB != nonterminalSymbolsByDepth.rend(); itB ++) {
+			const alphabet::Symbol& b = * itB;
 			regexp::UnboundedRegExpConcatenation concat;
-			concat.appendElement( std::move( m_eqTransition[ a ][ b ] ) );
-			concat.appendElement( loop );
+			concat.appendElement(std::move(equationTransition.find(std::make_pair(a, b))->second));
+			concat.appendElement(loop);
 			regexp::UnboundedRegExpAlternation alt;
-			alt.appendElement( std::move( concat ) );
-			m_eqTransition[ a ][ b ] = std::move( alt );
-			opt.optimize( m_eqTransition[ a ][ b ] );
+			alt.appendElement(std::move(concat));
+			equationTransition.find(std::make_pair(a, b))->second = std::move(alt);
+			opt.optimize(equationTransition.find(std::make_pair(a, b))->second);
 		}
 		regexp::UnboundedRegExpConcatenation concat;
-		concat.appendElement( std::move( m_eqFinal[ a ] ) );
-		concat.appendElement( std::move( loop ) );
+		concat.appendElement(std::move(equationFinal.find(a)->second));
+		concat.appendElement(std::move(loop));
 		regexp::UnboundedRegExpAlternation alt;
-		alt.appendElement( std::move( concat ) );
-		m_eqFinal[ a ] = std::move( alt );
-		opt.optimize( m_eqFinal[ a ] );
+		alt.appendElement(std::move(concat));
+		equationFinal.find(a)->second = std::move(alt);
+		opt.optimize(equationFinal.find(a)->second);
 
 		/*
 		 * eliminate A from rest of the equations using this pattern:
-		 * B->C = B->C + concatenate( B->A, A->C )
+		 * B->C = B->C + concatenate(B->A, A->C)
 		 */
-		for( auto itB = std::next( itA ); itB != m_symbolsByDepth.rend( ); itB ++ ) {
-			const alphabet::Symbol & b = * itB;
+		for(auto itB = std::next(itA); itB != nonterminalSymbolsByDepth.rend(); itB ++) {
+			const alphabet::Symbol& b = * itB;
 
-			for( auto itC = std::next( itA ); itC != m_symbolsByDepth.rend( ); itC ++ ) {
-				const alphabet::Symbol & c = * itC;
+			for(auto itC = std::next(itA); itC != nonterminalSymbolsByDepth.rend(); itC ++) {
+				const alphabet::Symbol& c = * itC;
 
 				regexp::UnboundedRegExpConcatenation concat;
-				concat.appendElement( m_eqTransition[ a ][ c ] );
-				concat.appendElement( m_eqTransition[ b ][ a ] );
+				concat.appendElement(equationTransition.find(std::make_pair(a, c))->second);
+				concat.appendElement(equationTransition.find(std::make_pair(b, a))->second);
 				regexp::UnboundedRegExpAlternation alt;
-				alt.appendElement( std::move( m_eqTransition[ b ][ c ] ) );
-				alt.appendElement( std::move( concat ) );
-				m_eqTransition[ b ][ c ] = std::move( alt );
-				opt.optimize( m_eqTransition[ b ][ c ] );
+				alt.appendElement(std::move(equationTransition.find(std::make_pair(b, c))->second));
+				alt.appendElement(std::move(concat));
+				equationTransition.find(std::make_pair(b, c))->second = std::move(alt);
+				opt.optimize(equationTransition.find(std::make_pair(b, c))->second);
 			}
 
 			regexp::UnboundedRegExpConcatenation concat;
-			concat.appendElement( m_eqFinal[ a ] );
-			concat.appendElement( std::move( m_eqTransition[ b ][ a ] ) );
+			concat.appendElement(equationFinal.find(a)->second);
+			concat.appendElement(std::move(equationTransition.find(std::make_pair(b, a))->second));
 			regexp::UnboundedRegExpAlternation alt;
-			alt.appendElement( std::move( m_eqFinal[ b ] ) );
-			alt.appendElement( std::move( concat ) );
-			m_eqFinal[ b ] = std::move( alt );
-			opt.optimize( m_eqFinal[ b ] );
+			alt.appendElement(std::move(equationFinal.find(b)->second));
+			alt.appendElement(std::move(concat));
+			equationFinal.find(b)->second = std::move(alt);
+			opt.optimize(equationFinal.find(b)->second);
 		}
 	}
 
-	return opt.optimize( regexp::UnboundedRegExp( std::move ( m_eqFinal[ * m_symbolsByDepth.begin( ) ] ) ) );
+	return opt.optimize(regexp::UnboundedRegExp(std::move( equationFinal.find(*nonterminalSymbolsByDepth.begin())->second)));
 }
 
 } /* namespace equations */
diff --git a/alib2algo/src/equations/RegularEquationSolver.cpp b/alib2algo/src/equations/RegularEquationSolver.cpp
index 74f8484fc9732b9d5051ee1ca8a349aa38c3ffe1..9ed3e952891a897861ab1ddfda3c5ddb23552c99 100644
--- a/alib2algo/src/equations/RegularEquationSolver.cpp
+++ b/alib2algo/src/equations/RegularEquationSolver.cpp
@@ -7,80 +7,127 @@
 
 #include "RegularEquationSolver.h"
 
-#include "regexp/unbounded/UnboundedRegExpElements.h"
+#include <exception/AlibException.h>
+#include <algorithm>
 
 namespace equations {
 
-regexp::UnboundedRegExp RegularEquationSolver::solve( const alphabet::Symbol & solveFor ) {
-	if( ! isInSet( solveFor, m_symbols ) )
-		throw exception::AlibException( "Trying to solve for symbol not present in equation system" );
+void RegularEquationSolver::setSymbols(const std::set<alphabet::Symbol>& newSymbols) {
+	std::set<alphabet::Symbol> removed, added;
+	
+	std::set_difference(nonterminalSymbols.begin(), nonterminalSymbols.end(), newSymbols.begin(), newSymbols.end(), std::inserter(removed, removed.end()));
+	std::set_difference(newSymbols.begin(), newSymbols.end(), nonterminalSymbols.begin(), nonterminalSymbols.end(), std::inserter(added, added.end()));
 
-	/*
-	 * Firstly, organize states by depth so we can output better looking
-	 * expressions. We need to solve equation system for automaton initial state,
-	 * so lets start with the deepest ones and walk towards initial one.
-	 */
-	symbolsByDepth( solveFor );
+	for(const auto& symb : removed) {
+		removeSymbol(symb);
+	}
 
-	return eliminate( );
+	for(const auto& symb : added) {
+		addSymbol(symb);
+	}
 }
 
-void RegularEquationSolver::addSymbol( const alphabet::Symbol & symb ) {
-	m_symbols.insert( symb );
+void RegularEquationSolver::removeSymbol(const alphabet::Symbol& symb) {
+	for(const auto& kv : equationTransition) {
+		const alphabet::Symbol& from = kv.first.first;
+		const alphabet::Symbol& to = kv.first.second;
+		const regexp::UnboundedRegExpAlternation& alt = kv.second;
+
+		if((from == symb || to == symb) && alt.getElements().size() != 0) {
+			throw exception::AlibException("Symbol '" + (std::string) symb + "' is in use.");
+		}
+	}
+
+	for(const auto& kv : equationFinal) {
+		const alphabet::Symbol& from = kv.first;
+		const regexp::UnboundedRegExpAlternation& alt = kv.second;
+
+		if(from == symb && alt.getElements().size() != 0) {
+			throw exception::AlibException("Symbol '" + (std::string) from + "' is in use.");
+		}
+	}
+
+
+	nonterminalSymbols.erase(nonterminalSymbols.find(symb));
+	equationFinal.erase(equationFinal.find(symb));
 
-	for( const auto & s1 : m_symbols )
-	{
-		m_eqTransition[ symb ][ s1 ] = regexp::UnboundedRegExpAlternation { };
-		if( s1 != symb )
-			m_eqTransition[ s1 ][ symb ] = regexp::UnboundedRegExpAlternation { };
+	for(const auto& s : nonterminalSymbols) {
+		equationTransition.erase(equationTransition.find(std::make_pair(s, symb)));
+		equationTransition.erase(equationTransition.find(std::make_pair(symb, s)));
 	}
+	equationTransition.erase(equationTransition.find(std::make_pair(symb, symb)));
+}
+
+void RegularEquationSolver::addSymbol(const alphabet::Symbol& symb) {
+	for(const auto& s : nonterminalSymbols) {
+		equationTransition.insert(std::make_pair(std::make_pair(symb, s), regexp::UnboundedRegExpAlternation { }));
+		equationTransition.insert(std::make_pair(std::make_pair(s, symb), regexp::UnboundedRegExpAlternation { }));
+	}
+	equationTransition.insert(std::make_pair(std::make_pair(symb, symb), regexp::UnboundedRegExpAlternation { }));
 
-	m_eqFinal[ symb ] = regexp::UnboundedRegExpAlternation { };
+	nonterminalSymbols.insert(symb);
+	equationFinal.insert(std::make_pair(symb, regexp::UnboundedRegExpAlternation { }));
 }
 
-void RegularEquationSolver::addEquation( const alphabet::Symbol & from, const alphabet::Symbol & to, const regexp::UnboundedRegExpElement& eq ) {
-	if( ! isInSet( from, m_symbols ) )
-		throw exception::AlibException( "Symbol '" + (std::string) from + "' not in equation system." );
+void RegularEquationSolver::addEquation(const alphabet::Symbol& from, const alphabet::Symbol& to, const regexp::UnboundedRegExpElement& eq) {
+	if(nonterminalSymbols.count(from) == 0) {
+		throw exception::AlibException("Symbol from ('" + (std::string) from + "') is not in equation system.");
+	}
 
-	if( ! isInSet( to, m_symbols ) )
-		throw exception::AlibException( "Symbol '" + (std::string) to + "' not in equation system." );
+	if(nonterminalSymbols.count(to) == 0) {
+		throw exception::AlibException("Symbol to ('" + (std::string) to + "') is not in equation system.");
+	}
 
-	m_eqTransition[ from ][ to ].appendElement( eq );
+	equationTransition.find(std::make_pair(from, to))->second.appendElement(eq);
 }
 
-void RegularEquationSolver::addEquation( const alphabet::Symbol & from, const regexp::UnboundedRegExpElement& eq ) {
-	if( ! isInSet( from, m_symbols ) )
-		throw exception::AlibException( "Symbol '" + (std::string) from + "' not in equation system." );
+void RegularEquationSolver::addEquation(const alphabet::Symbol& from, const regexp::UnboundedRegExpElement& eq) {
+	if(nonterminalSymbols.count(from) == 0) {
+		throw exception::AlibException("Symbol from ('" + (std::string) from + "') is not in equation system.");
+	}
 
-	m_eqFinal[ from ].appendElement( eq );
+	equationFinal.find(from)->second.appendElement(eq);
 }
 
-void RegularEquationSolver::symbolsByDepth( const alphabet::Symbol & solveFor ) {
+void RegularEquationSolver::sortSymbolsByDepth(const alphabet::Symbol& solveFor) {
 	std::map<alphabet::Symbol, bool> visited;
 	std::queue<alphabet::Symbol> queue;
 
-	for( const auto & symbol : m_symbols )
-		visited[ symbol ] = false;
+	for(const auto& symbol : nonterminalSymbols) {
+		visited[symbol] = false;
+	}
 
-	visited[ solveFor ] = true;
-	queue.push( solveFor );
+	visited[solveFor] = true;
+	queue.push(solveFor);
 
-	while( ! queue.empty( ) )
-	{
-		alphabet::Symbol s = queue.front( );
-		queue.pop( );
+	while(! queue.empty()) {
+		alphabet::Symbol s = queue.front();
+		queue.pop();
 
-		m_symbolsByDepth.push_back( s );
+		nonterminalSymbolsByDepth.push_back(s);
 
-		auto map_s = m_eqTransition.find( s );
-		for( auto it = map_s->second.begin( ); it != map_s->second.end( ); it ++ )
-		{
-			if( it->second.getElements().size() > 0 && visited[ it->first ] == false ) {
-				visited[ it->first ] = true;
-				queue.push( it->first );
+		for(const auto& kv : equationTransition) {
+			// find all transitions from current symbol that are non-empty, enqueue transition's target symbol
+			if(kv.first.first == s && visited[ kv.first.second ] == false && kv.second.getElements().size() > 0) {
+				visited[kv.first.second] = true;
+				queue.push(kv.first.second);
 			}
 		}
 	}
 }
 
+regexp::UnboundedRegExp RegularEquationSolver::solve(const alphabet::Symbol& solveFor) {
+	if(nonterminalSymbols.count(solveFor) == 0) {
+		throw exception::AlibException("Symbol solveFor ('" + (std::string) solveFor + "') is not in equation system.");
+	}
+
+	/*
+	 * Firstly, organize states by depth so we can output better looking
+	 * expressions. We need to solve equation system for automaton's initial state,
+	 * so lets start with the deepest ones and walk towards the initial one.
+	 */
+	sortSymbolsByDepth(solveFor);
+	return eliminate();
+}
+
 } /* namespace equations */
diff --git a/alib2algo/src/equations/RegularEquationSolver.h b/alib2algo/src/equations/RegularEquationSolver.h
index 9911783a3dee5af4ae796ed80193aed112118e91..1136d232e0d073c9c399fcf9e2571508e1c47ad7 100644
--- a/alib2algo/src/equations/RegularEquationSolver.h
+++ b/alib2algo/src/equations/RegularEquationSolver.h
@@ -8,19 +8,13 @@
 #ifndef REGULAREQUATIONSOLVER_H_
 #define REGULAREQUATIONSOLVER_H_
 
+#include <regexp/unbounded/UnboundedRegExpElements.h>
+#include <alphabet/Symbol.h>
+
 #include <map>
 #include <deque>
 #include <queue>
 
-#include <alphabet/Symbol.h>
-#include <exception/AlibException.h>
-#include <regexp/unbounded/UnboundedRegExpElement.h>
-#include <regexp/unbounded/UnboundedRegExpAlternation.h>
-
-#include "common/macros.h"
-
-// #include "RegExpOptimize.h" //TODO uncomment when implemented
-
 namespace equations {
 
 /**
@@ -32,8 +26,24 @@ public:
 	 * Adds nonterminal symbol into system.
 	 *
 	 * @param symb given symbol
+	 * @
+	 */
+	void addSymbol(const alphabet::Symbol& symbol);
+
+	/**
+	 * Removes nonterminal symbol from equation system.
+	 *
+	 * @param symb given symbol
+	 * @throws AlibException when symbol is in use
+	 */
+	void removeSymbol(const alphabet::Symbol& symbol);
+
+	/**
+	 * Sets nonterminal symbols of the equation system.
+	 * @param symbol Symbols to set
+	 * @throws AlibException
 	 */
-	void addSymbol( const alphabet::Symbol & symb );
+	void setSymbols(const std::set<alphabet::Symbol>& symbols);
 
 	/**
 	 * Adds equation in form FROM = eq TO
@@ -42,7 +52,7 @@ public:
 	 * @param to symbol
 	 * @param eq equation
 	 */
-	void addEquation( const alphabet::Symbol & from, const alphabet::Symbol & to, const regexp::UnboundedRegExpElement& eq );
+	void addEquation(const alphabet::Symbol& from, const alphabet::Symbol& to, const regexp::UnboundedRegExpElement& eq);
 
 	/**
 	 * Adds equation in form: FROM = eq
@@ -50,7 +60,7 @@ public:
 	 * @param from
 	 * @param eq
 	 */
-	void addEquation( const alphabet::Symbol & from, const regexp::UnboundedRegExpElement& eq );
+	void addEquation(const alphabet::Symbol& from, const regexp::UnboundedRegExpElement& eq);
 
 	/**
 	 * Solve expression system
@@ -58,40 +68,40 @@ public:
 	 * @param solveFor will solve equation system for given symbol
 	 * @return regexp
 	 */
-	regexp::UnboundedRegExp solve( const alphabet::Symbol & solveFor );
+	regexp::UnboundedRegExp solve(const alphabet::Symbol& solveFor);
 
 protected:
 	/**
 	 * actual equations elimination
 	 * @return pointer to solutions RegExp tree root
 	 */
-	virtual regexp::UnboundedRegExp eliminate( void ) = 0;
+	virtual regexp::UnboundedRegExp eliminate(void) = 0;
 
 	/**
-	 * Runs BFS to determine depth of symbols in equation system and stores it in m_symbolsByDepth;
-	 * @see m_symbolsByDepth
+	 * Runs BFS to determine depth of symbols in equation system and stores it in nonterminalSymbolsByDepth;
+	 * @see nonterminalSymbolsByDepth
 	 */
-	void symbolsByDepth( const alphabet::Symbol & solveFor );
+	void sortSymbolsByDepth(const alphabet::Symbol& solveFor);
 
 	/**
 	 * @see symbolsByDepth
 	 */
-	std::deque<alphabet::Symbol> m_symbolsByDepth;
+	std::deque<alphabet::Symbol> nonterminalSymbolsByDepth;
 
 	/**
 	 * Stores transitions from nonterminal to nonterminal, eg A = 2A + 2B + 1C
 	 */
-	std::map<alphabet::Symbol, std::map<alphabet::Symbol, regexp::UnboundedRegExpAlternation>> m_eqTransition;
+	std::map<std::pair<alphabet::Symbol, alphabet::Symbol>, regexp::UnboundedRegExpAlternation> equationTransition;
 
 	/**
 	 * Stores equation not going to particular nonterminal, eg A = 01*
 	 */
-	std::map<alphabet::Symbol, regexp::UnboundedRegExpAlternation> m_eqFinal;
+	std::map<alphabet::Symbol, regexp::UnboundedRegExpAlternation> equationFinal;
 
 	/**
 	 * Set of symbols
 	 */
-	std::set<alphabet::Symbol> m_symbols;
+	std::set<alphabet::Symbol> nonterminalSymbols;
 };
 
 } /* namespace equations */
diff --git a/alib2algo/src/equations/RightRegularEquationSolver.cpp b/alib2algo/src/equations/RightRegularEquationSolver.cpp
index b9d1dac2ea680a800396236f035b452b9d541d50..63b14225b7e5440ae3e7aff9ff78781872f25c7c 100644
--- a/alib2algo/src/equations/RightRegularEquationSolver.cpp
+++ b/alib2algo/src/equations/RightRegularEquationSolver.cpp
@@ -12,71 +12,71 @@
 
 namespace equations {
 
-regexp::UnboundedRegExp RightRegularEquationSolver::eliminate( void ) {
+regexp::UnboundedRegExp RightRegularEquationSolver::eliminate(void) {
 	regexp::RegExpOptimize opt;
 
-	for( auto itA = m_symbolsByDepth.rbegin( ); itA != m_symbolsByDepth.rend( ); itA ++ ) {
-		const alphabet::Symbol & a = * itA;
+	for(auto itA = nonterminalSymbolsByDepth.rbegin(); itA != nonterminalSymbolsByDepth.rend(); itA ++) {
+		const alphabet::Symbol& a = * itA;
 
 		/*
 		 * Apply Arden's Lemma
 		 * A = 0A + 1B + 2C
 		 * => A = 0*1B + 0*2C
 		 */
-		regexp::UnboundedRegExpIteration loop( std::move( m_eqTransition[ a ][ a ] ) );
-		opt.optimize( loop );
+		regexp::UnboundedRegExpIteration loop(std::move(equationTransition.find(std::make_pair(a, a))->second));
+		opt.optimize(loop);
 
 		// for all transitions from A apply Arden's Lemma
-		for( auto itB = std::next( itA ) ; itB != m_symbolsByDepth.rend( ); itB ++ ) {
-			const alphabet::Symbol & b = * itB;
+		for(auto itB = std::next(itA) ; itB != nonterminalSymbolsByDepth.rend(); itB ++) {
+			const alphabet::Symbol& b = * itB;
 			regexp::UnboundedRegExpConcatenation concat;
-			concat.appendElement( loop );
-			concat.appendElement( std::move( m_eqTransition[ a ][ b ] ) );
+			concat.appendElement(loop);
+			concat.appendElement(std::move(equationTransition.find(std::make_pair(a,b))->second));
 			regexp::UnboundedRegExpAlternation alt;
-			alt.appendElement( std::move( concat ) );
-			m_eqTransition[ a ][ b ] = std::move( alt );
-			opt.optimize( m_eqTransition[ a ][ b ] );
+			alt.appendElement(std::move(concat));
+			equationTransition.find(std::make_pair(a, b))->second = std::move(alt);
+			opt.optimize(equationTransition.find(std::make_pair(a, b))->second);
 		}
 		regexp::UnboundedRegExpConcatenation concat;
-		concat.appendElement( std::move( loop ) );
-		concat.appendElement( std::move( m_eqFinal[ a ] ) );
+		concat.appendElement(std::move(loop));
+		concat.appendElement(std::move(equationFinal.find(a)->second));
 		regexp::UnboundedRegExpAlternation alt;
-		alt.appendElement( std::move( concat ) );
-		m_eqFinal[ a ] = std::move( alt );
-		opt.optimize( m_eqFinal[ a ] );
+		alt.appendElement(std::move(concat));
+		equationFinal.find(a)->second = std::move(alt);
+		opt.optimize(equationFinal.find(a)->second);
 
 		/*
 		 * eliminate A from rest of the equations using this pattern:
-		 * B->C = B->C + concatenate( B->A, A->C )
+		 * B->C = B->C + concatenate(B->A, A->C)
 		 */
-		for( auto itB = std::next( itA ); itB != m_symbolsByDepth.rend( ); itB ++ ) {
-			const alphabet::Symbol & b = * itB;
+		for(auto itB = std::next(itA); itB != nonterminalSymbolsByDepth.rend(); itB ++) {
+			const alphabet::Symbol& b = * itB;
 
-			for( auto itC = std::next( itA ); itC != m_symbolsByDepth.rend( ); itC ++ ) {
-				const alphabet::Symbol & c = * itC;
+			for(auto itC = std::next(itA); itC != nonterminalSymbolsByDepth.rend(); itC ++) {
+				const alphabet::Symbol& c = * itC;
 
 				regexp::UnboundedRegExpConcatenation concat;
-				concat.appendElement( m_eqTransition[ b ][ a ] );
-				concat.appendElement( m_eqTransition[ a ][ c ] );
+				concat.appendElement(equationTransition.find(std::make_pair(b, a))->second);
+				concat.appendElement(equationTransition.find(std::make_pair(a, c))->second);
 				regexp::UnboundedRegExpAlternation alt;
-				alt.appendElement( std::move( m_eqTransition[ b ][ c ] ) );
-				alt.appendElement( std::move( concat ) );
-				m_eqTransition[ b ][ c ] = std::move( alt );
-				opt.optimize( m_eqTransition[ b ][ c ] );
+				alt.appendElement(std::move(equationTransition.find(std::make_pair(b, c))->second));
+				alt.appendElement(std::move(concat));
+				equationTransition.find(std::make_pair(b, c))->second = std::move(alt);
+				opt.optimize(equationTransition.find(std::make_pair(b, c))->second);
 			}
 
 			regexp::UnboundedRegExpConcatenation concat;
-			concat.appendElement( std::move( m_eqTransition[ b ][ a ] ) );
-			concat.appendElement( m_eqFinal[ a ] );
+			concat.appendElement(std::move(equationTransition.find(std::make_pair(b, a))->second));
+			concat.appendElement(equationFinal.find(a)->second);
 			regexp::UnboundedRegExpAlternation alt;
-			alt.appendElement( std::move( m_eqFinal[ b ] ) );
-			alt.appendElement( std::move( concat ) );
-			m_eqFinal[ b ] = std::move( alt );
-			opt.optimize( m_eqFinal[ b ] );
+			alt.appendElement(std::move(equationFinal.find(b)->second));
+			alt.appendElement(std::move(concat));
+			equationFinal.find(b)->second = std::move(alt);
+			opt.optimize(equationFinal.find(b)->second);
 		}
 	}
 
-	return opt.optimize( regexp::UnboundedRegExp( std::move ( m_eqFinal[ * m_symbolsByDepth.begin( ) ] ) ) );
+	return opt.optimize(regexp::UnboundedRegExp(std::move( equationFinal.find(*nonterminalSymbolsByDepth.begin())->second)));
 }
 
 } /* namespace equations */
diff --git a/alib2algo/test-src/conversions/re2fa/re2faTest.cpp b/alib2algo/test-src/conversions/re2fa/re2faTest.cpp
index 3e0a368f99de1bd821eb792cb5321d02529733a9..4806de5eb3591f0f92beeb2f5de3ff19ed3767c4 100644
--- a/alib2algo/test-src/conversions/re2fa/re2faTest.cpp
+++ b/alib2algo/test-src/conversions/re2fa/re2faTest.cpp
@@ -83,10 +83,8 @@ void re2faTest::testBrzozowski() {
 	regexp::RegExp regexp1( parser.parseValue() );
 
 	automaton::Automaton nfa1 = conversions::re2fa::BrzozowskiDerivation::convert(regexp1);
-	alib::DataFactory::toStdout(nfa1);
 
 	regexp::RegExp regexp2( conversions::fa2re::Algebraic::convert(static_cast<const automaton::NFA&>(nfa1.getData())) );
-	alib::DataFactory::toStdout(regexp2);
 
 	automaton::Automaton nfa2 = conversions::re2fa::BrzozowskiDerivation::convert(regexp2);
 
@@ -98,8 +96,5 @@ void re2faTest::testBrzozowski() {
 	automaton::DFA mdfa2_2 = minimize::MinimizeDFA::minimize(mdfa2_1);
 	automaton::DFA mdfa2_3 = normalize::NormalizeDFA::normalize(mdfa2_2);
 
-	alib::DataFactory::toStdout(mdfa1_3);
-	alib::DataFactory::toStdout(mdfa2_3);
-
 	CPPUNIT_ASSERT( mdfa1_3 == mdfa2_3);
 }