diff --git a/aconversions/makefile b/aconversions/makefile
deleted file mode 100644
index fe10f923049b7f5191f9a408e8acca9a591d1fa5..0000000000000000000000000000000000000000
--- a/aconversions/makefile
+++ /dev/null
@@ -1,20 +0,0 @@
-CC=g++
-EXECUTABLE=aconversion
-CCFLAGS= -std=c++11 -O2 -c -Wall -I../alib/src -I/usr/include/libxml2/ -I../libaregexptree/src
-LDFLAGS= -L../alib/lib -L../libaregexptree/lib -lxml2 -laregexptree -lalib -Wl,-rpath,.
-
-SOURCES=$(shell find src/ -name *cpp)
-OBJECTS=$(patsubst src/%.cpp, obj/%.o, $(SOURCES))
-
-all: $(SOURCES) bin/$(EXECUTABLE)
-
-bin/$(EXECUTABLE): $(OBJECTS)
-	mkdir -p bin
-	$(CC) $(OBJECTS) -o $@ $(LDFLAGS)
-
-obj/%.o: src/%.cpp
-	mkdir -p $(dir $@)
-	$(CC) $(CCFLAGS) $< -o $@
-
-clean:
-	$(RM) -r *.o *.d bin obj
diff --git a/aconversions/src/include/macros.h b/aconversions/src/include/macros.h
deleted file mode 100644
index 735e2299484b0c9ff8d72ec4e4910c95c740d83e..0000000000000000000000000000000000000000
--- a/aconversions/src/include/macros.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef MACROS_H_
-#define MACROS_H_
-
-#include <algorithm>
-#include <set>
-#include <list>
-
-namespace conversions
-{
-
-#define isInSet(x,set) ( (set).find((x)) != (set).end() )
-#define isInList(x,list) ( find((list).begin(), (list).end(), (x)) != (list).end() )
-#define isKeyInMap(key,map) ( (map).find((key)) != (map).end() )
-
-} /* namespace conversions */
-
-#endif /* MACROS_H_ */
diff --git a/aconversions/src/interface/Conversion.cpp b/aconversions/src/interface/Conversion.cpp
deleted file mode 100644
index dcd2a5b53884c4d41f7a6ba16d6bc5d69203cb6c..0000000000000000000000000000000000000000
--- a/aconversions/src/interface/Conversion.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Conversion.cpp
- *
- *  Created on: 23. 2. 2014
- *      Author: tomas
- */
-
-#include "Conversion.h"
-
-namespace conversions
-{
-
-Conversion::Conversion()
-{
-
-}
-
-} /* namespace conversions */
diff --git a/aconversions/src/interface/Conversion.h b/aconversions/src/interface/Conversion.h
deleted file mode 100644
index 3d8036596167e1018fe160f01703563afa7aa5f0..0000000000000000000000000000000000000000
--- a/aconversions/src/interface/Conversion.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Conversion.h
- *
- *  Created on: 23. 2. 2014
- *      Author: tomas
- */
-
-#ifndef CONVERSION_H_
-#define CONVERSION_H_
-
-namespace conversions
-{
-
-/**
- * Base conversion class for all the conversions.
- * Although this class brings order into chaos, feel free to remove it.
- */
-class Conversion
-{
-public:
-    Conversion( void );
-};
-
-} /* namespace conversions */
-
-#endif /* CONVERSION_H_ */
diff --git a/aconversions/src/interface/IConversionFSM.cpp b/aconversions/src/interface/IConversionFSM.cpp
deleted file mode 100644
index 261d6827327e181201f014ffddaaaba708f9ec6d..0000000000000000000000000000000000000000
--- a/aconversions/src/interface/IConversionFSM.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * IConversionFSM.cpp
- *
- *  Created on: 19. 4. 2014
- *      Author: tomas
- */
-
-#include "IConversionFSM.h"
-
-namespace conversions
-{
-
-IConversionFSM::~IConversionFSM( void )
-{
-
-}
-
-} /* namespace conversions */
diff --git a/aconversions/src/interface/IConversionFSM.h b/aconversions/src/interface/IConversionFSM.h
deleted file mode 100644
index 62ac23c4046530c45ded7dfab67121d761fc79bc..0000000000000000000000000000000000000000
--- a/aconversions/src/interface/IConversionFSM.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * IConversionFSM.h
- *
- *  Created on: 19. 4. 2014
- *      Author: tomas
- */
-
-#ifndef __ICONVERSIONFSM_H__
-#define __ICONVERSIONFSM_H__
-
-#include "Conversion.h"
-
-#include <automaton/FSM/FSM.h>
-
-namespace conversions
-{
-
-/**
- * Interface for conversion to finite automaton.
- */
-class IConversionFSM : public Conversion
-{
-public:
-    /**
-     * @return fsm equivalent to input.
-     */
-    virtual automaton::FSM convert( void ) = 0;
-
-    virtual ~IConversionFSM( void );
-
-};
-
-} /* namespace conversions */
-
-#endif /* __ICONVERSIONFSM_H__ */
diff --git a/aconversions/src/interface/IConversionLRG.cpp b/aconversions/src/interface/IConversionLRG.cpp
deleted file mode 100644
index 47f03aec8887c3661a28c6e0a0af05d0d45bbf16..0000000000000000000000000000000000000000
--- a/aconversions/src/interface/IConversionLRG.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * IConversionLRG.cpp
- *
- *  Created on: 19. 4. 2014
- *      Author: tomas
- */
-
-#include "IConversionLRG.h"
-
-namespace conversions
-{
-
-IConversionLRG::~IConversionLRG( void )
-{
-
-}
-
-} /* namespace conversions */
diff --git a/aconversions/src/interface/IConversionLRG.h b/aconversions/src/interface/IConversionLRG.h
deleted file mode 100644
index f3e56bbe87f86d92833c9d5f2f8c17cfcb8c764e..0000000000000000000000000000000000000000
--- a/aconversions/src/interface/IConversionLRG.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * IConversionLRG.h
- *
- *  Created on: 19. 4. 2014
- *      Author: tomas
- */
-
-#ifndef __ICONVERSIONLRG_H__
-#define __ICONVERSIONLRG_H__
-
-#include "Conversion.h"
-
-#include <grammar/Regular/LeftRegularGrammar.h>
-
-namespace conversions
-{
-
-/**
- * Interface for conversion to left regular grammar.
- */
-class IConversionLRG : public Conversion
-{
-public:
-    /**
-     * @return rrg equivalent to input.
-     */
-    virtual grammar::LeftRegularGrammar convert( void ) = 0;
-
-    virtual ~IConversionLRG( void );
-
-};
-
-} /* namespace conversions */
-
-#endif /* __ICONVERSIONLRG_H__ */
diff --git a/aconversions/src/interface/IConversionRE.cpp b/aconversions/src/interface/IConversionRE.cpp
deleted file mode 100644
index 03c3c4c1ec2de89ad9b07c8294a712f5a099602d..0000000000000000000000000000000000000000
--- a/aconversions/src/interface/IConversionRE.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * IConversionRE.cpp
- *
- *  Created on: 19. 4. 2014
- *      Author: tomas
- */
-
-#include "IConversionRE.h"
-
-namespace conversions
-{
-
-IConversionRE::~IConversionRE( void )
-{
-
-}
-
-} /* namespace conversions */
diff --git a/aconversions/src/interface/IConversionRE.h b/aconversions/src/interface/IConversionRE.h
deleted file mode 100644
index 70658fa3f5a83b982290a405584b7d0f8ce85cb6..0000000000000000000000000000000000000000
--- a/aconversions/src/interface/IConversionRE.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * IConversionRE.h
- *
- *  Created on: 19. 4. 2014
- *      Author: tomas
- */
-
-#ifndef __ICONVERSIONRE_H__
-#define __ICONVERSIONRE_H__
-
-#include "Conversion.h"
-
-#include <regexp/RegExp.h>
-
-namespace conversions
-{
-
-/**
- * Interface for conversion to regexp.
- */
-class IConversionRE : public Conversion
-{
-public:
-    /**
-     * @return regexp equivalent to input.
-     */
-    virtual regexp::RegExp convert( void ) = 0;
-
-    virtual ~IConversionRE( void );
-
-};
-
-} /* namespace conversions */
-
-#endif /* __ICONVERSIONRE_H__ */
diff --git a/aconversions/src/interface/IConversionRRG.cpp b/aconversions/src/interface/IConversionRRG.cpp
deleted file mode 100644
index b358409101151b2a696b0084aab822bd018d47d5..0000000000000000000000000000000000000000
--- a/aconversions/src/interface/IConversionRRG.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * IConversionRRG.cpp
- *
- *  Created on: 19. 4. 2014
- *      Author: tomas
- */
-
-#include "IConversionRRG.h"
-
-namespace conversions
-{
-
-IConversionRRG::~IConversionRRG( void )
-{
-
-}
-
-} /* namespace conversions */
diff --git a/aconversions/src/interface/IConversionRRG.h b/aconversions/src/interface/IConversionRRG.h
deleted file mode 100644
index 40a5382747979938b1886c75ae9cd8f0648c2f5f..0000000000000000000000000000000000000000
--- a/aconversions/src/interface/IConversionRRG.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * IConversionRRG.h
- *
- *  Created on: 19. 4. 2014
- *      Author: tomas
- */
-
-#ifndef __ICONVERSIONRRG_H__
-#define __ICONVERSIONRRG_H__
-
-#include "Conversion.h"
-
-#include <grammar/Regular/RightRegularGrammar.h>
-
-namespace conversions
-{
-
-/**
- * Interface for conversion to right regular grammar.
- */
-class IConversionRRG : public Conversion
-{
-public:
-    /**
-     * @return rrg equivalent to input.
-     */
-    virtual grammar::RightRegularGrammar convert( void ) = 0;
-
-    virtual ~IConversionRRG( void );
-
-};
-
-} /* namespace conversions */
-
-#endif /* __ICONVERSIONRRG_H__ */
diff --git a/aconversions/src/rg2re/lrg2re/LRGAlgebraic.cpp b/aconversions/src/rg2re/lrg2re/LRGAlgebraic.cpp
deleted file mode 100644
index b4fed3c3e3d470493fed1207a60442eb1a84e501..0000000000000000000000000000000000000000
--- a/aconversions/src/rg2re/lrg2re/LRGAlgebraic.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * LRGAlgebraic.cpp
- *
- *  Created on: 4. 3. 2014
- *      Author: tomas
- */
-
-#include "LRGAlgebraic.h"
-
-using namespace alphabet;
-using namespace grammar;
-using namespace regexp;
-
-namespace conversions
-{
-
-LRGAlgebraic::LRGAlgebraic( const LeftRegularGrammar & lrg ) : m_grammar( lrg )
-{
-
-}
-
-LRGAlgebraic::~LRGAlgebraic( void )
-{
-
-}
-
-RegExp LRGAlgebraic::convert( void )
-{
-    LeftRegularEquationSolver solver;
-
-    for( const auto & symb : m_grammar.getNonTerminalSymbols( ) )
-        solver.addSymbol( symb );
-
-    for( const auto & rule : m_grammar.getRules( ) )
-    {
-        const Symbol & leftSide = rule.getLeftSide( ).front( );
-        if( rule.getRightSide( ).size( ) == 0 )
-        {
-            solver.addEquation( leftSide, new RegExpEpsilon( ) );
-        }
-        else if( rule.getRightSide( ).size( ) == 1 )
-        {
-            const Symbol & input = rule.getRightSide( ).front( );
-            solver.addEquation( leftSide, new RegExpSymbol( input.getSymbol( ) ) );
-        }
-        else
-        {
-            const Symbol nt = rule.getRightSide( ).front( );
-            const Symbol input = rule.getRightSide( ).back( );
-            solver.addEquation( leftSide, nt, new RegExpSymbol( input.getSymbol( ) ) );
-        }
-    }
-
-    return solver.solve( m_grammar.getStartSymbol( ) );
-}
-
-} /* namespace conversions */
diff --git a/aconversions/src/rg2re/lrg2re/LRGAlgebraic.h b/aconversions/src/rg2re/lrg2re/LRGAlgebraic.h
deleted file mode 100644
index dcd36c4425ecf42eeb0efe6ac85540c10fe7edc1..0000000000000000000000000000000000000000
--- a/aconversions/src/rg2re/lrg2re/LRGAlgebraic.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * LRGAlgebraic.h
- *
- *  Created on: 4. 3. 2014
- *      Author: tomas
- */
-
-#ifndef LRGALGEBRAIC_H_
-#define LRGALGEBRAIC_H_
-
-#include <grammar/Regular/LeftRegularGrammar.h>
-#include <regexp/RegExp.h>
-
-#include "../../shared/equations/LeftRegularEquationSolver.h"
-#include "../../interface/IConversionRE.h"
-
-namespace conversions
-{
-
-class LRGAlgebraic: public IConversionRE
-{
-public:
-    /**
-     * @param rg Source left regular grammar.
-     */
-    LRGAlgebraic( const grammar::LeftRegularGrammar & rg );
-
-    ~LRGAlgebraic( void );
-
-    /**
-     * @return regexp equivalent to source left regular grammar.
-     */
-    regexp::RegExp convert( void );
-
-protected:
-    /**
-     * input grammar
-     */
-    const grammar::LeftRegularGrammar & m_grammar;
-};
-
-} /* namespace conversions */
-
-#endif /* LRGALGEBRAIC_H_ */
diff --git a/aconversions/src/rg2re/rrg2re/RRGAlgebraic.cpp b/aconversions/src/rg2re/rrg2re/RRGAlgebraic.cpp
deleted file mode 100644
index a1060197ca78d77d7cbf1ac78b2ea62b15f6a0c4..0000000000000000000000000000000000000000
--- a/aconversions/src/rg2re/rrg2re/RRGAlgebraic.cpp
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * RRGAlgebraic.cpp
- *
- *  Created on: 4. 3. 2014
- *      Author: tomas
- */
-
-#include "RRGAlgebraic.h"
-
-using namespace alphabet;
-using namespace grammar;
-using namespace regexp;
-
-namespace conversions
-{
-
-RRGAlgebraic::RRGAlgebraic( const RightRegularGrammar & rrg ) : m_grammar( rrg )
-{
-
-}
-
-RRGAlgebraic::~RRGAlgebraic( void )
-{
-
-}
-
-RegExp RRGAlgebraic::convert( void )
-{
-    RightRegularEquationSolver solver;
-
-    for( const auto & symb : m_grammar.getNonTerminalSymbols( ) )
-        solver.addSymbol( symb );
-
-    for( const auto & rule : m_grammar.getRules( ) )
-    {
-        const Symbol & leftSide = rule.getLeftSide( ).front( );
-        if( rule.getRightSide( ).size( ) == 0 )
-        {
-            solver.addEquation( leftSide, new RegExpEpsilon( ) );
-        }
-        else if( rule.getRightSide( ).size( ) == 1 )
-        {
-            const Symbol & input = rule.getRightSide( ).front( );
-            solver.addEquation( leftSide, new RegExpSymbol( input.getSymbol( ) ) );
-        }
-        else
-        {
-            const Symbol input = rule.getRightSide( ).front( );
-            const Symbol nt = rule.getRightSide( ).back( );
-            solver.addEquation( leftSide, nt, new RegExpSymbol( input.getSymbol( ) ) );
-        }
-    }
-
-    return solver.solve( m_grammar.getStartSymbol( ) );
-}
-
-} /* namespace conversions */
diff --git a/aconversions/src/rg2re/rrg2re/RRGAlgebraic.h b/aconversions/src/rg2re/rrg2re/RRGAlgebraic.h
deleted file mode 100644
index 3b6f663a468bf739628472ca84ea5e4ac07fcfaa..0000000000000000000000000000000000000000
--- a/aconversions/src/rg2re/rrg2re/RRGAlgebraic.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * RRGAlgebraic.h
- *
- *  Created on: 4. 3. 2014
- *      Author: tomas
- */
-
-#ifndef RRGALGEBRAIC_H_
-#define RRGALGEBRAIC_H_
-
-#include <grammar/Regular/RightRegularGrammar.h>
-#include <regexp/RegExp.h>
-
-#include "../../shared/equations/RightRegularEquationSolver.h"
-#include "../../interface/IConversionRE.h"
-
-namespace conversions
-{
-
-class RRGAlgebraic: public IConversionRE
-{
-public:
-    /**
-     * @param rg Source right regular grammar.
-     */
-    RRGAlgebraic( const grammar::RightRegularGrammar & rg );
-
-    ~RRGAlgebraic( void );
-
-    /**
-     * @return regexp equivalent to source right regular grammar.
-     */
-    regexp::RegExp convert( void );
-
-protected:
-    /**
-     * input grammar
-     */
-    const grammar::RightRegularGrammar & m_grammar;
-};
-
-} /* namespace conversions */
-
-#endif /* RRGALGEBRAIC_H_ */
diff --git a/aconversions2/src/ConversionHandler.cpp b/aconversions2/src/ConversionHandler.cpp
index 654200e390c5e53e9131353d60bdcead9e980ddc..09075ac94351bd3b8ed7c39f808f2acff3e9cfb9 100644
--- a/aconversions2/src/ConversionHandler.cpp
+++ b/aconversions2/src/ConversionHandler.cpp
@@ -21,8 +21,7 @@
 #include "conversions/rg2fa/lrg2fa/LRGtoFAConverter.h"
 #include "conversions/rg2fa/rrg2fa/RRGtoFAConverter.h"
 
-//#include "conversions/rg2re/rrg2re/RRGAlgebraic.h"
-//#include "conversions/rg2re/lrg2re/LRGAlgebraic.h"
+#include "conversions/rg2re/RGtoREAlgebraic.h"
 
 #include "conversions/re2rg/re2rrg/GlushkovRRG.h"
 #include "conversions/re2rg/re2rrg/BrzozowskiDerivationRRG.h"
@@ -287,16 +286,15 @@ void ConversionHandler::convertRGtoRG( void )
 
 void ConversionHandler::convertRGtoRE( void )
 {
-	if( m_source == LEFT_REGULAR_GRAMMAR )
-		convertLRGtoRE( );
-	else if( m_source == RIGHT_REGULAR_GRAMMAR )
-		convertRRGtoRE( );
-	else if( m_source == LEFT_LINEAR_GRAMMAR )
-		throw exception::AlibException( "ConversionHandler: Conversions from linear grammars are not yet implemented." );
-	else if( m_source == RIGHT_LINEAR_GRAMMAR )
-		throw exception::AlibException( "ConversionHandler: Conversions from linear grammars are not yet implemented." );
-	else
-		throw exception::AlibException( "ConversionHandler: Unknown target formalism." );
+	const grammar::Grammar grammar = alib::DataFactory::fromTokens<grammar::Grammar>(m_tokens);
+
+	switch( m_algorithm )
+	{
+	case BRZOZOWSKI_ALGEBRAIC:
+	default:
+		alib::DataFactory::toStdout(rg2re::RGtoREAlgebraic::convert(grammar));
+        break;
+	}
 }
 
 void ConversionHandler::convertLRGtoFSM( void )
@@ -327,38 +325,6 @@ void ConversionHandler::convertRRGtoFSM( void )
 	}
 }
 
-void ConversionHandler::convertLRGtoRE( void )
-{
-	const grammar::LeftRG lrg = alib::DataFactory::fromTokens<grammar::LeftRG>( m_tokens );
-
-	switch( m_algorithm )
-	{
-	case BRZOZOWSKI_ALGEBRAIC:
-	default: {
-/*			lrg2re::LRGAlgebraic conv( lrg );
-			regexp::UnboundedRegExp regexp = conv.convert();
-			alib::DataFactory::toStdout(regexp);*/
-			break;
-		}
-	}
-}
-
-void ConversionHandler::convertRRGtoRE( void )
-{
-	const grammar::RightRG rrg = alib::DataFactory::fromTokens<grammar::RightRG>( m_tokens );
-
-	switch( m_algorithm )
-	{
-	case BRZOZOWSKI_ALGEBRAIC:
-	default: {
-/*			rrg2re::RRGAlgebraic conv( rrg );
-			regexp::UnboundedRegExp regexp = conv.convert();
-			alib::DataFactory::toStdout(regexp);*/
-			break;
-		}
-	}
-}
-
 void ConversionHandler::convertLRGtoRRG( void )
 {
 	const grammar::LeftRG lrg = alib::DataFactory::fromTokens<grammar::LeftRG>( m_tokens );
diff --git a/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.cpp b/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..041d78ef61d5d9f38478a952c329d8047d2a4dc7
--- /dev/null
+++ b/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.cpp
@@ -0,0 +1,162 @@
+/*
+ * RGtoREAlgebraic.cpp
+ *
+ *  Created on: 4. 3. 2014
+ *      Author: Tomas Pecka
+ */
+
+#include "RGtoREAlgebraic.h"
+
+#include "../../equations/LeftRegularEquationSolver.h"
+#include "../../equations/RightRegularEquationSolver.h"
+
+#include <regexp/unbounded/UnboundedRegExpElements.h>
+
+namespace rg2re
+{
+
+regexp::RegExp RGtoREAlgebraic::convert(const grammar::Grammar& grammar)
+{
+    regexp::RegExp* out = NULL;
+    grammar.getData().Accept((void*) &out, RGtoREAlgebraic::RG_TO_RE_ALGEBRAIC);
+    regexp::RegExp res = std::move(*out);
+    delete out;
+    return res;
+}
+
+regexp::RegExp RGtoREAlgebraic::convert(const grammar::LeftRG& grammar)
+{
+    equations::LeftRegularEquationSolver solver;
+
+    for(const auto& symbol : grammar.getNonterminalAlphabet())
+        solver.addSymbol(symbol);
+
+    for(const auto & rule : grammar.getRules())
+    {
+        const alphabet::Symbol& lhs = rule.first;
+
+        for(const auto& ruleRHS : rule.second)
+        {
+            if(ruleRHS.is<alphabet::Symbol>())
+            {
+                const alphabet::Symbol& rhs = ruleRHS.get<alphabet::Symbol>();
+                solver.addEquation(lhs, regexp::UnboundedRegExpSymbol(rhs));
+            }
+            else
+            {
+                const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = ruleRHS.get<std::pair<alphabet::Symbol, alphabet::Symbol>>();
+                solver.addEquation(lhs, rhs.first, regexp::UnboundedRegExpSymbol(rhs.second));
+            }
+        }
+    }
+    if(grammar.getGeneratesEpsilon())
+        solver.addEquation(grammar.getInitialSymbol(), regexp::UnboundedRegExpEpsilon());
+
+    return regexp::RegExp{solver.solve(grammar.getInitialSymbol())};
+}
+regexp::RegExp RGtoREAlgebraic::convert(const grammar::RightRG& grammar)
+{
+    equations::RightRegularEquationSolver solver;
+
+    for(const auto& symbol : grammar.getNonterminalAlphabet())
+        solver.addSymbol(symbol);
+
+    for(const auto & rule : grammar.getRules())
+    {
+        const alphabet::Symbol& lhs = rule.first;
+
+        for(const auto& ruleRHS : rule.second)
+        {
+            if(ruleRHS.is<alphabet::Symbol>())
+            {
+                const alphabet::Symbol& rhs = ruleRHS.get<alphabet::Symbol>();
+                solver.addEquation(lhs, regexp::UnboundedRegExpSymbol(rhs));
+            }
+            else
+            {
+                const std::pair<alphabet::Symbol, alphabet::Symbol>& rhs = ruleRHS.get<std::pair<alphabet::Symbol, alphabet::Symbol>>();
+                solver.addEquation(lhs, rhs.second, regexp::UnboundedRegExpSymbol(rhs.first));
+            }
+        }
+    }
+    if(grammar.getGeneratesEpsilon())
+        solver.addEquation(grammar.getInitialSymbol(), regexp::UnboundedRegExpEpsilon());
+
+    return regexp::RegExp{solver.solve(grammar.getInitialSymbol())};
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::UnknownGrammar&) const
+{
+    throw exception::AlibException("Unsupported grammar type UnknownGrammar");
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar&) const
+{
+    throw exception::AlibException("Unsupported grammar type ContextPreservingUnrestrictedGrammar");
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::UnrestrictedGrammar&) const
+{
+    throw exception::AlibException("Unsupported grammar type UnrestrictedGrammar");
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::CSG&) const
+{
+    throw exception::AlibException("Unsupported grammar type CSG");
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::NonContractingGrammar&) const
+{
+    throw exception::AlibException("Unsupported grammar type NonContractingGrammar");
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::CNF&) const
+{
+    throw exception::AlibException("Unsupported grammar type CNF");
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::CFG&) const
+{
+    throw exception::AlibException("Unsupported grammar type CFG");
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::EpsilonFreeCFG&) const
+{
+    throw exception::AlibException("Unsupported grammar type EpsilonFreeCFG");
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::GNF&) const
+{
+    throw exception::AlibException("Unsupported grammar type GNF");
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::LG&) const
+{
+    throw exception::AlibException("Unsupported grammar type LG");
+}
+
+void RGtoREAlgebraic::Visit(void* userData, const grammar::RightRG& grammar) const
+{
+    regexp::RegExp* & out = *((regexp::RegExp**) userData);
+    out = new regexp::RegExp(this->convert(grammar));
+}
+
+void RGtoREAlgebraic::Visit(void* userData, const grammar::LeftRG& grammar) const
+{
+    regexp::RegExp* & out = *((regexp::RegExp**) userData);
+    out = new regexp::RegExp(this->convert(grammar));
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::RightLG&) const
+{
+    throw exception::AlibException("Unsupported grammar type RightLG");
+}
+
+void RGtoREAlgebraic::Visit(void*, const grammar::LeftLG&) const
+{
+    throw exception::AlibException("Unsupported grammar type LeftLG");
+}
+
+const RGtoREAlgebraic RGtoREAlgebraic::RG_TO_RE_ALGEBRAIC;
+
+} /* namespace rg2re */
diff --git a/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.h b/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.h
new file mode 100644
index 0000000000000000000000000000000000000000..142749d1b0c9625e45b8c515235b997fdb957b14
--- /dev/null
+++ b/alib2algo/src/conversions/rg2re/RGtoREAlgebraic.h
@@ -0,0 +1,57 @@
+/*
+ * RGtoREAlgebraic.h
+ *
+ *  Created on: 4. 3. 2014
+ *      Author: Tomas Pecka
+ */
+
+#ifndef RGTOREALGEBRAIC_H_
+#define RGTOREALGEBRAIC_H_
+
+#include <grammar/Grammar.h>
+#include <grammar/Regular/RightRG.h>
+#include <grammar/Regular/LeftRG.h>
+
+#include <regexp/RegExp.h>
+
+namespace rg2re
+{
+
+class RGtoREAlgebraic : public grammar::VisitableGrammarBase::const_visitor_type
+{
+public:
+    /**
+     * @return regexp equivalent to source right regular grammar.
+     * @param grammar Grammar to convert
+     */
+    static regexp::RegExp convert(const grammar::Grammar& grammar);
+
+    static regexp::RegExp convert(const grammar::RightRG& grammar);
+    static regexp::RegExp convert(const grammar::LeftRG& grammar);
+
+protected:
+    void Visit(void*, const grammar::UnknownGrammar& grammar) const;
+
+    void Visit(void*, const grammar::ContextPreservingUnrestrictedGrammar& grammar) const;
+    void Visit(void*, const grammar::UnrestrictedGrammar& grammar) const;
+
+    void Visit(void*, const grammar::CSG& grammar) const;
+    void Visit(void*, const grammar::NonContractingGrammar& grammar) const;
+
+    void Visit(void*, const grammar::CNF& grammar) const;
+    void Visit(void*, const grammar::CFG& grammar) const;
+    void Visit(void*, const grammar::EpsilonFreeCFG& grammar) const;
+    void Visit(void*, const grammar::GNF& grammar) const;
+    void Visit(void*, const grammar::LG& grammar) const;
+
+    void Visit(void*, const grammar::RightRG& grammar) const;
+    void Visit(void*, const grammar::LeftRG& grammar) const;
+    void Visit(void*, const grammar::RightLG& grammar) const;
+    void Visit(void*, const grammar::LeftLG& grammar) const;
+
+    static const RGtoREAlgebraic RG_TO_RE_ALGEBRAIC;
+};
+
+} /* namespace rg2re */
+
+#endif /* RGTOREALGEBRAIC_H_ */
diff --git a/tests.aconversion.sh b/tests.aconversion.sh
index 5aa24eda5310056ef9a740cdee8aadeb9bb27afd..f215ef265f05b5aecaba6eb347aa8296abd31703 100755
--- a/tests.aconversion.sh
+++ b/tests.aconversion.sh
@@ -159,30 +159,30 @@ function runTest {
 
 ## FA -> RG -> FA
 ## covers: FA -> LRG, FA -> RRG, RRG <-> LRG, RRG -> FA, LRG -> FA
-runTest "./aconversions2 -t RRG | ./aconversions2 -t LRG | ./aconversions2 -t FA"
-runTest "./aconversions2 -t LRG | ./aconversions2 -t RRG | ./aconversions2 -t FA"
-
-# FA -> RE -> FA
-# covers: FA -> RE (Brzozowski algebraic, elimination), RE -> FA (Brzozowski derivation, Thompson, Glushkov)
-runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a brzozowski"
-runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a thompson"
-runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a glushkov "
-runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a brzozowski"
-runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a thompson"
-runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a glushkov"
-
-# FA -> RE -> RRG -> LRG -> FA
-# covers: FA -> RE (Brz. algebraic, elimination), RE -> RRG ( Brz. derivation, Glushkov), RRG -> LRG, LRG -> FA
-runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA"
-runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA"
-runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA"
-runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA"
+#runTest "./aconversions2 -t RRG | ./aconversions2 -t LRG | ./aconversions2 -t FA"
+#runTest "./aconversions2 -t LRG | ./aconversions2 -t RRG | ./aconversions2 -t FA"
+#
+## FA -> RE -> FA
+## covers: FA -> RE (Brzozowski algebraic, elimination), RE -> FA (Brzozowski derivation, Thompson, Glushkov)
+#runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a brzozowski"
+#runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a thompson"
+#runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t FA -a glushkov "
+#runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a brzozowski"
+#runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a thompson"
+#runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t FA -a glushkov"
+#
+## FA -> RE -> RRG -> LRG -> FA
+## covers: FA -> RE (Brz. algebraic, elimination), RE -> RRG ( Brz. derivation, Glushkov), RRG -> LRG, LRG -> FA
+#runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA"
+#runTest "./aconversions2 -t RE -a algebraic | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA"
+#runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a brzozowski | ./aconversions2 -t LRG | ./aconversions2 -t FA"
+#runTest "./aconversions2 -t RE -a elimination | ./aconversions2 -t RRG -a glushkov | ./aconversions2 -t LRG | ./aconversions2 -t FA"
 
 # FA -> RRG -> RE -> FA
 # covers: FA -> RRG, FA -> LRG, RRG -> RE, LRG -> RE, RE -> FA (Brz. derivation, Thompson, Glushkov)
-# runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a brzozowski"
-# runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a brzozowski"
-# runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a thompson"
-# runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a thompson"
-# runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a glushkov"
-# runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversion2 -t FA -a glushkov"
+runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a brzozowski"
+runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a brzozowski"
+runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a thompson"
+runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a thompson"
+runTest "./aconversions2 -t RRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a glushkov"
+runTest "./aconversions2 -t LRG | ./aconversions2 -t RE | ./aconversions2 -t FA -a glushkov"