diff --git a/aconversions/.cproject b/aconversions/.cproject
index 73f91e809013fa33a703b459fa11166e20990fc9..2234d0ce3bb06130e69f82b9cb518011f701ce95 100644
--- a/aconversions/.cproject
+++ b/aconversions/.cproject
@@ -106,120 +106,6 @@
 			</storageModule>
 			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
 		</cconfiguration>
-		<cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502" moduleId="org.eclipse.cdt.core.settings" name="Debug.fa2rg">
-				<externalSettings/>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="${ProjName}.fa2rg" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502" name="Debug.fa2rg" parent="cdt.managedbuild.config.gnu.exe.debug">
-					<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502." name="/" resourcePath="">
-						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.604421374" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug">
-							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.171217329" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/>
-							<builder buildPath="${workspace_loc:/aconversions}/Debug" id="cdt.managedbuild.target.gnu.builder.exe.debug.911360895" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.base.1147345420" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.697878346" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
-								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.1741428562" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.1335381260" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.option.include.paths.496289937" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/alib/src}&quot;"/>
-								</option>
-								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.2039472493" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.680760064" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug">
-								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.1351058005" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/>
-								<option id="gnu.c.compiler.exe.debug.option.debugging.level.1785101381" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1511241353" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.485379647" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.1697144078" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug">
-								<option id="gnu.cpp.link.option.libs.1211237825" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
-									<listOptionValue builtIn="false" value="alib"/>
-								</option>
-								<option id="gnu.cpp.link.option.paths.886643827" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/alib/Debug}&quot;"/>
-								</option>
-								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1604949990" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
-									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-								</inputType>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.75667575" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug">
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.46006703" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-						</toolChain>
-					</folderInfo>
-					<sourceEntries>
-						<entry excluding="src/arg2fa.cpp" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
-					</sourceEntries>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-		</cconfiguration>
-		<cconfiguration id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502.51455777">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502.51455777" moduleId="org.eclipse.cdt.core.settings" name="Debug.rg2fa">
-				<externalSettings/>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="${ProjName}.rg2fa" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="rm -rf" description="" id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502.51455777" name="Debug.rg2fa" parent="cdt.managedbuild.config.gnu.exe.debug">
-					<folderInfo id="cdt.managedbuild.config.gnu.exe.debug.923996745.1323144502.51455777." name="/" resourcePath="">
-						<toolChain id="cdt.managedbuild.toolchain.gnu.exe.debug.1133348873" name="Linux GCC" superClass="cdt.managedbuild.toolchain.gnu.exe.debug">
-							<targetPlatform id="cdt.managedbuild.target.gnu.platform.exe.debug.1196604066" name="Debug Platform" superClass="cdt.managedbuild.target.gnu.platform.exe.debug"/>
-							<builder buildPath="${workspace_loc:/aconversions}/Debug" id="cdt.managedbuild.target.gnu.builder.exe.debug.439014923" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.exe.debug"/>
-							<tool id="cdt.managedbuild.tool.gnu.archiver.base.756579878" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug.713036044" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.exe.debug">
-								<option id="gnu.cpp.compiler.exe.debug.option.optimization.level.1350961549" name="Optimization Level" superClass="gnu.cpp.compiler.exe.debug.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.exe.debug.option.debugging.level.1494984597" name="Debug Level" superClass="gnu.cpp.compiler.exe.debug.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
-								<option id="gnu.cpp.compiler.option.include.paths.206435288" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/alib/src}&quot;"/>
-								</option>
-								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1867628733" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.compiler.exe.debug.1967537471" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.exe.debug">
-								<option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.exe.debug.option.optimization.level.828706130" name="Optimization Level" superClass="gnu.c.compiler.exe.debug.option.optimization.level" valueType="enumerated"/>
-								<option id="gnu.c.compiler.exe.debug.option.debugging.level.1020112809" name="Debug Level" superClass="gnu.c.compiler.exe.debug.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
-								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1626369872" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.c.linker.exe.debug.722161002" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.exe.debug"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug.63113387" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.exe.debug">
-								<option id="gnu.cpp.link.option.libs.937989636" name="Libraries (-l)" superClass="gnu.cpp.link.option.libs" valueType="libs">
-									<listOptionValue builtIn="false" value="alib"/>
-								</option>
-								<option id="gnu.cpp.link.option.paths.1969989980" name="Library search path (-L)" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
-									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/alib/Debug}&quot;"/>
-								</option>
-								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1981097053" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
-									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
-									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
-								</inputType>
-							</tool>
-							<tool id="cdt.managedbuild.tool.gnu.assembler.exe.debug.1320459224" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.exe.debug">
-								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.611263798" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
-							</tool>
-						</toolChain>
-					</folderInfo>
-					<sourceEntries>
-						<entry excluding="src/afa2rg.cpp" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
-					</sourceEntries>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-		</cconfiguration>
 	</storageModule>
 	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 		<project id="aconversions.cdt.managedbuild.target.gnu.exe.752321215" name="Executable" projectType="cdt.managedbuild.target.gnu.exe"/>
@@ -244,6 +130,8 @@
 		<configuration configurationName="Release">
 			<resource resourceType="PROJECT" workspacePath="/aconversions"/>
 		</configuration>
+		<configuration configurationName="Debug.rg2fa"/>
+		<configuration configurationName="Debug.fa2rg"/>
 		<configuration configurationName="Debug">
 			<resource resourceType="PROJECT" workspacePath="/aconversions"/>
 		</configuration>
diff --git a/aconversions/Makefile b/aconversions/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..e914767b00fd005fb0244ed3003643a5ce694864
--- /dev/null
+++ b/aconversions/Makefile
@@ -0,0 +1,16 @@
+OUT_DIR = bin
+export ALIB_SRC = $(realpath ../alib/src)
+export ALIB_LIB = $(realpath ../alib/Debug)
+export BIN_DIR = $(addsuffix /$(OUT_DIR), $(realpath .))
+
+.PHONY: clean
+
+all:
+	@mkdir -p $(OUT_DIR)
+	@$(MAKE) -C src/conversions
+
+clean:
+	@echo "[Clean] Cleaning up"
+	@$(MAKE) -C src/conversions clean
+	@rm -f $(OUT_DIR)/*
+	@rm -rf $(OUT_DIR)
\ No newline at end of file
diff --git a/aconversions/src/afa2rg.cpp b/aconversions/src/afa2rg.cpp
deleted file mode 100644
index e47f394408daf90d11d40eb893d0c1d9a4834a70..0000000000000000000000000000000000000000
--- a/aconversions/src/afa2rg.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-//============================================================================
-// Name        : afsm2rg.cpp
-// Author      : Tomas Pecka
-// Version     :
-// Copyright   :
-// Description :
-//============================================================================
-
-#include <iostream>
-
-#include <AlibException.h>
-#include <AutomatonFactory.h>
-#include <grammar/GrammarPrinter.h>
-#include <grammar/RightRegularGrammar.h>
-
-#include "conversions/fa2rg/fa2rg.h"
-
-using namespace std;
-using namespace automaton;
-using namespace grammar;
-using namespace alib;
-
-int main(int argc, char** argv)
-{
-    try
-    {
-        string input( istreambuf_iterator<char>(cin), ( istreambuf_iterator<char>( ) ) );
-
-        FSM fsm = AutomatonFactory::buildFSM( AutomatonFactory::fromString( input ) );
-
-        if( ! fsm.isEpsilonFree() )
-        {
-            cout << "FSM has epsilon transitions" << endl;
-            return 1;
-        }
-
-        RightRegularGrammar rg = FA2RGconvert::convert( fsm );
-        GrammarPrinter::toXML( rg, cout );
-    }
-    catch (AlibException& e)
-    {
-        cout << e.what() << endl;
-        return 1;
-    }
-
-    return 0;
-}
diff --git a/aconversions/src/conversions/Makefile b/aconversions/src/conversions/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..0b61d66a9b40dbfc35d42a01b00f651a500d21eb
--- /dev/null
+++ b/aconversions/src/conversions/Makefile
@@ -0,0 +1,23 @@
+export CXX=g++
+export CXXFLAGS=-O3 -std=c++11 -c -Wall -pedantic -I/usr/include/libxml2 -I$(ALIB_SRC)
+export LD=g++
+export LDFLAGS=-L$(ALIB_LIB) -lalib
+EXECUTABLE=
+
+CONVERSIONS_DIRS = fa2re fa2rg re2fa re2rg rg2fa rg2re
+
+.PHONY: clean $(CONVERSIONS_DIRS)
+
+
+all: $(CONVERSIONS_DIRS) 
+
+$(CONVERSIONS_DIRS):
+	@$(MAKE) -C $@
+
+clean:
+	@$(MAKE) -C fa2rg/ clean
+	@$(MAKE) -C fa2re/ clean
+	@$(MAKE) -C re2fa/ clean
+	@$(MAKE) -C re2rg/ clean
+	@$(MAKE) -C rg2fa/ clean
+	@$(MAKE) -C rg2re/ clean
\ No newline at end of file
diff --git a/aconversions/src/conversions/fa2re/Makefile b/aconversions/src/conversions/fa2re/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..dcec28795b214f7e77bc9fbfced74e615176aaa0
--- /dev/null
+++ b/aconversions/src/conversions/fa2re/Makefile
@@ -0,0 +1,5 @@
+all:
+
+.PHONY: clean
+clean:
+	rm -f *.o
diff --git a/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.cpp b/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..59bbe64dc3f28c7729d5516f3f187ff38b485221
--- /dev/null
+++ b/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.cpp
@@ -0,0 +1,32 @@
+#include "AbstractFAtoRGConverter.h"
+
+using namespace automaton;
+using namespace grammar;
+
+namespace conversions
+{
+
+AbstractFAtoRGConverter::AbstractFAtoRGConverter( const FSM & automaton, RegularGrammar * grammar) : m_automaton( automaton ), m_g( grammar )
+{
+    if( ! m_automaton.isEpsilonFree( ) )
+        throw ConversionException( "FSM has epsilon transitions" );
+}
+
+AbstractFAtoRGConverter::~AbstractFAtoRGConverter( void )
+{
+
+}
+
+void AbstractFAtoRGConverter::createTerminalSymbols( void )
+{
+    for( std::set<Symbol>::const_iterator i = m_automaton.getInputAlphabet( ).begin( ); i != m_automaton.getInputAlphabet( ).end( ); i++ )
+        m_g->addTerminalSymbol( *i );
+}
+
+void AbstractFAtoRGConverter::createNonTerminalSymbols( void )
+{
+    for( std::set<automaton::State>::const_iterator i = m_automaton.getStates( ).begin( ); i != m_automaton.getStates( ).end( ); i++ )
+        m_g->addNonTerminalSymbol( alphabet::Symbol( i->getName( ) ) );
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.h b/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..66e6e95e6d6be798e4370e58a88155ee62e272d1
--- /dev/null
+++ b/aconversions/src/conversions/fa2rg/AbstractFAtoRGConverter.h
@@ -0,0 +1,30 @@
+#ifndef __ABSTRACTFATORGCONVERTER_H__
+#define __ABSTRACTFATORGCONVERTER_H__
+
+#include <automaton/FSM/FSM.h>
+#include <grammar/RegularGrammar.h>
+#include <memory>
+
+#include "../../utils/ConversionException.h"
+
+namespace conversions
+{
+
+class AbstractFAtoRGConverter
+{
+public:
+    virtual const grammar::RegularGrammar & convert( ) = 0;
+
+protected:
+    AbstractFAtoRGConverter( const automaton::FSM & automaton, grammar::RegularGrammar * grammar );
+    virtual ~AbstractFAtoRGConverter( void );
+    void createNonTerminalSymbols( void );
+    void createTerminalSymbols( void );
+
+    const automaton::FSM & m_automaton;
+    grammar::RegularGrammar * m_g;
+};
+
+} /* namespace conversions */
+
+#endif /* __ABSTRACTFATORGCONVERTER_H__ */
diff --git a/aconversions/src/conversions/fa2rg/FAtoLRGConverter.cpp b/aconversions/src/conversions/fa2rg/FAtoLRGConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ca30840962a50b3dea015d571b23f6fe5fe6e466
--- /dev/null
+++ b/aconversions/src/conversions/fa2rg/FAtoLRGConverter.cpp
@@ -0,0 +1,45 @@
+#include "FAtoLRGConverter.h"
+
+using namespace std;
+using namespace automaton;
+using namespace grammar;
+
+namespace conversions
+{
+
+FAtoLRGConverter::FAtoLRGConverter( const FSM & automaton ) : AbstractFAtoRGConverter( automaton, new LeftRegularGrammar() ), m_grammar(* dynamic_cast<LeftRegularGrammar*>( m_g ))
+{
+}
+
+const LeftRegularGrammar & FAtoLRGConverter::convert( void )
+{
+    createTerminalSymbols( );
+    createNonTerminalSymbols( );
+
+    // step 2 - create set of P in G
+    for( set<TransitionFSM>::const_iterator i = m_automaton.getTransitions( ).begin( ); i != m_automaton.getTransitions( ).end( ); i++ )
+    {
+        // 2a
+        list<Symbol> leftSide, rightSide;
+        leftSide.push_back( Symbol( i->getTo( ).getName( ) ) );
+        rightSide.push_back( Symbol( i->getFrom( ).getName( ) ) );
+        rightSide.push_back( Symbol( i->getInput( ).getSymbol( ) ) );
+        m_grammar.addRule( Rule( leftSide, rightSide ) );
+
+        // 2b
+        if( isInSet( i->getTo( ), m_automaton.getFinalStates( ) ) )
+        {
+            list<Symbol> leftSide, rightSide;
+            leftSide.push_back( Symbol( i->getFrom( ).getName( ) ) );
+            rightSide.push_back( Symbol( i->getInput( ).getSymbol( ) ) );
+            Rule r( leftSide, rightSide );
+            m_grammar.addRule( r );
+        }
+    }
+
+    // step 3
+    m_grammar.setStartSymbol( Symbol( m_automaton.getInitialStates( ).begin( )->getName( ) ) );
+
+    return m_grammar;
+}
+} /* namespace conversions */
diff --git a/aconversions/src/conversions/fa2rg/FAtoLRGConverter.h b/aconversions/src/conversions/fa2rg/FAtoLRGConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..2cbcc479a835f995b7f7bad4425d11b81da6cfa3
--- /dev/null
+++ b/aconversions/src/conversions/fa2rg/FAtoLRGConverter.h
@@ -0,0 +1,25 @@
+#ifndef __FATOLRGCONVERTER_H__
+#define __FATOLRGCONVERTER_H__
+
+#include "AbstractFAtoRGConverter.h"
+#include <grammar/LeftRegularGrammar.h>
+#include <automaton/FSM/FSM.h>
+
+#include "../../utils/GrammarUtils.h"
+
+namespace conversions
+{
+
+class FAtoLRGConverter: public AbstractFAtoRGConverter
+{
+public:
+    FAtoLRGConverter( const automaton::FSM & automaton );
+    const grammar::LeftRegularGrammar & convert( );
+
+protected:
+    grammar::LeftRegularGrammar& m_grammar;
+};
+
+} /* namespace conversions */
+
+#endif /* __FATOLRGCONVERTER_H__ */
diff --git a/aconversions/src/conversions/fa2rg/FAtoRRGConverter.cpp b/aconversions/src/conversions/fa2rg/FAtoRRGConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..22f4ac7198a88693e26901e943df71d27bbf2558
--- /dev/null
+++ b/aconversions/src/conversions/fa2rg/FAtoRRGConverter.cpp
@@ -0,0 +1,78 @@
+#include "FAtoRRGConverter.h"
+
+using namespace std;
+using namespace automaton;
+using namespace grammar;
+
+namespace conversions
+{
+
+FAtoRRGConverter::FAtoRRGConverter( const FSM & automaton ) : AbstractFAtoRGConverter( automaton, new RightRegularGrammar() ), m_grammar(* dynamic_cast<RightRegularGrammar*>( m_g ))
+{
+}
+
+const grammar::RightRegularGrammar & FAtoRRGConverter::convert( void )
+{
+    createTerminalSymbols( );
+    createNonTerminalSymbols( );
+
+    // step 2 - create set of P in G
+    for( set<TransitionFSM>::const_iterator i = m_automaton.getTransitions( ).begin( ); i != m_automaton.getTransitions( ).end( ); i++ )
+    {
+        // 2a
+        list<Symbol> leftSide, rightSide;
+        leftSide.push_back( Symbol( i->getFrom( ).getName( ) ) );
+        rightSide.push_back( Symbol( i->getInput( ).getSymbol( ) ) );
+        rightSide.push_back( Symbol( i->getTo( ).getName( ) ) );
+        m_grammar.addRule( Rule( leftSide, rightSide ) );
+
+        // 2b
+        if( isInSet( i->getTo( ), m_automaton.getFinalStates( ) ) )
+        {
+            list<Symbol> leftSide, rightSide;
+            leftSide.push_back( Symbol( i->getFrom( ).getName( ) ) );
+            rightSide.push_back( Symbol( i->getInput( ).getSymbol( ) ) );
+            m_grammar.addRule( Rule( leftSide, rightSide ) );
+        }
+    }
+
+    // step 3 - set start symbol of G
+    m_grammar.setStartSymbol( Symbol( m_automaton.getInitialStates( ).begin( )->getName( ) ) );
+
+    // step 4
+    if( isInSet( State( m_grammar.getStartSymbol( ).getSymbol( ) ), m_automaton.getFinalStates( ) ) )
+    {
+        // 4a
+        if( !GrammarUtils::isNonterminalOnRightSide( m_grammar.getStartSymbol( ), m_grammar.getRules( ) ) )
+        {
+            list<Symbol> leftSide, rightSide;
+            leftSide.push_back( m_grammar.getStartSymbol( ) );
+            m_grammar.addRule( Rule( leftSide, rightSide ) );
+        }
+        else // 4b
+        {
+            Symbol newStart = GrammarUtils::createUniqueSymbol( m_grammar.getStartSymbol( ).getSymbol( ), m_grammar, APOSTROPHE );
+            m_grammar.addNonTerminalSymbol( newStart );
+
+            for( set<Rule>::const_iterator i = m_grammar.getRules( ).begin( ); i != m_grammar.getRules( ).end( ); i++ )
+            {
+                if( *( i->getLeftSide( ).begin( ) ) == m_grammar.getStartSymbol( ) )
+                {
+                    list<Symbol> leftSide, rightSide( i->getRightSide( ) );
+                    leftSide.push_back( newStart );
+                    m_grammar.addRule( Rule( leftSide, rightSide ) );
+                }
+            }
+            m_grammar.setStartSymbol( newStart );
+
+            list<Symbol> leftSide, rightSide;
+            leftSide.push_back( newStart );
+            Rule rr( leftSide, rightSide );
+            m_grammar.addRule( Rule( leftSide, rightSide ) );
+        }
+    }
+
+    return m_grammar;
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/conversions/fa2rg/FAtoRRGConverter.h b/aconversions/src/conversions/fa2rg/FAtoRRGConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..519166d13483f1ec579a6841fd6ce5a4b8650b00
--- /dev/null
+++ b/aconversions/src/conversions/fa2rg/FAtoRRGConverter.h
@@ -0,0 +1,25 @@
+#ifndef __FATORRGCONVERTER_H__
+#define __FATORRGCONVERTER_H__
+
+#include "AbstractFAtoRGConverter.h"
+#include <grammar/RightRegularGrammar.h>
+#include <automaton/FSM/FSM.h>
+
+#include "../../utils/GrammarUtils.h"
+
+namespace conversions
+{
+
+class FAtoRRGConverter : public AbstractFAtoRGConverter
+{
+public:
+    FAtoRRGConverter( const automaton::FSM & automaton );
+    const grammar::RightRegularGrammar & convert ( );
+
+protected:
+    grammar::RightRegularGrammar& m_grammar;
+};
+
+} /* namespace conversions */
+
+#endif /* __FATORRGCONVERTER_H__ */
diff --git a/aconversions/src/conversions/fa2rg/Makefile b/aconversions/src/conversions/fa2rg/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..e98afebdea58f91af5786ea729d3e893e7bc3dc2
--- /dev/null
+++ b/aconversions/src/conversions/fa2rg/Makefile
@@ -0,0 +1,47 @@
+all: afa2rg afa2lrg afa2rrg
+	cp afa2rg $(BIN_DIR)
+	cp afa2lrg $(BIN_DIR)
+	cp afa2rrg $(BIN_DIR)
+
+afa2rg: afa2rg.o
+	$(LD) $(LDFLAGS) $^ -o afa2rg
+
+afa2lrg: afa2lrg.o AbstractFAtoRGConverter.o FAtoLRGConverter.o ConversionException.o
+	$(LD) $(LDFLAGS) $^ -o afa2lrg
+	
+afa2rrg: afa2rrg.o AbstractFAtoRGConverter.o FAtoRRGConverter.o ConversionException.o GrammarUtils.o
+	$(LD) $(LDFLAGS) $^ -o afa2rrg
+
+
+afa2rg.o: afa2rg.cpp
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+afa2lrg.o: afa2lrg.cpp FAtoLRGConverter.h AbstractFAtoRGConverter.h ../../utils/ConversionException.h ../../utils/GrammarUtils.h ../../utils/utils.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+afa2rrg.o: afa2rrg.cpp FAtoRRGConverter.h AbstractFAtoRGConverter.h ../../utils/ConversionException.h ../../utils/GrammarUtils.h ../../utils/utils.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+AbstractFAtoRGConverter.o: AbstractFAtoRGConverter.cpp AbstractFAtoRGConverter.h ../../utils/ConversionException.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+FAtoLRGConverter.o: FAtoLRGConverter.cpp FAtoLRGConverter.h AbstractFAtoRGConverter.h ../../utils/ConversionException.h ../../utils/GrammarUtils.h ../../utils/utils.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+FAtoRRGConverter.o: FAtoRRGConverter.cpp FAtoRRGConverter.h AbstractFAtoRGConverter.h ../../utils/ConversionException.h ../../utils/GrammarUtils.h ../../utils/utils.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+
+AutomatonUtils.o: ../../utils/AutomatonUtils.cpp ../../utils/AutomatonUtils.h ../../utils/utils.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+ConversionException.o: ../../utils/ConversionException.cpp ../../utils/ConversionException.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+GrammarUtils.o: ../../utils/GrammarUtils.cpp ../../utils/GrammarUtils.h ../../utils/utils.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+.PHONY: clean
+clean:
+	rm -f *.o
+	rm -f afa2rg afa2lrg afa2rrg
\ No newline at end of file
diff --git a/aconversions/src/conversions/fa2rg/afa2lrg.cpp b/aconversions/src/conversions/fa2rg/afa2lrg.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..59cc82fcc9fbb545a4ede64cf59f92267ede8ee6
--- /dev/null
+++ b/aconversions/src/conversions/fa2rg/afa2lrg.cpp
@@ -0,0 +1,34 @@
+#include <iostream>
+
+#include <AlibException.h>
+#include <AutomatonFactory.h>
+#include <grammar/GrammarPrinter.h>
+#include <grammar/RightRegularGrammar.h>
+
+#include "FAtoLRGConverter.h"
+
+using namespace std;
+using namespace automaton;
+using namespace grammar;
+using namespace alib;
+using namespace conversions;
+
+int main(int argc, char** argv)
+{
+    try
+    {
+        string input( istreambuf_iterator<char>(cin), ( istreambuf_iterator<char>( ) ) );
+
+        FSM fsm = AutomatonFactory::buildFSM( AutomatonFactory::fromString( input ) );
+
+        FAtoLRGConverter conv( fsm );
+        GrammarPrinter::toXML( conv.convert(), cout );
+    }
+    catch( AlibException & e )
+    {
+        cout << e.what() << endl;
+        return 1;
+    }
+
+    return 0;
+}
diff --git a/aconversions/src/conversions/fa2rg/afa2rg.cpp b/aconversions/src/conversions/fa2rg/afa2rg.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8d8c3ad38b4e508c782c06cb8c858a9d46bb5ff9
--- /dev/null
+++ b/aconversions/src/conversions/fa2rg/afa2rg.cpp
@@ -0,0 +1,46 @@
+#include <cstdio>
+#include <cstdlib>
+#include <getopt.h>
+#include <unistd.h>
+
+int main( int argc, char *argv [ ] )
+{
+    int i, option_index = 0;
+    int left = 0, right = 0;
+
+    static struct option long_options [ ] =
+    {
+        { "left", no_argument, NULL, 'l' },
+        { "right", no_argument, NULL, 'r' },
+        { 0, 0, 0, 0 }
+    };
+
+    while( ( i = getopt_long( argc, argv, "lr", long_options, &option_index ) ) != -1 )
+    {
+        switch( i )
+        {
+            case 'l':
+                left = 1;
+                break;
+            case 'r':
+                right = 1;
+                break;
+        }
+    }
+
+    if( optind != argc - 1 || ( left == 1 && right == 1 ) )
+    {
+        fprintf( stderr, "Usage: afa2rg [--left XOR --right] input\n" );
+        return EXIT_FAILURE;
+    }
+    else if( left == 1 )
+    {
+        execvp( "afa2lrg", argv + optind );
+        return EXIT_SUCCESS;
+    }
+    else
+    {
+        execvp( "afa2rrg", argv + optind );
+        return EXIT_SUCCESS;
+    }
+}
diff --git a/aconversions/src/conversions/fa2rg/afa2rrg.cpp b/aconversions/src/conversions/fa2rg/afa2rrg.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0dbf6c105865f5e5c5e75a1d6faa61f7bc95e5ab
--- /dev/null
+++ b/aconversions/src/conversions/fa2rg/afa2rrg.cpp
@@ -0,0 +1,35 @@
+#include <iostream>
+#include <memory>
+
+#include <AlibException.h>
+#include <AutomatonFactory.h>
+#include <grammar/GrammarPrinter.h>
+#include <grammar/RegularGrammar.h>
+
+#include "FAtoRRGConverter.h"
+
+using namespace std;
+using namespace automaton;
+using namespace grammar;
+using namespace alib;
+using namespace conversions;
+
+int main(int argc, char** argv)
+{
+    try
+    {
+        string input( istreambuf_iterator<char>(cin), ( istreambuf_iterator<char>( ) ) );
+
+        FSM fsm = AutomatonFactory::buildFSM( AutomatonFactory::fromString( input ) );
+
+        FAtoRRGConverter conv( fsm );
+        GrammarPrinter::toXML( conv.convert(), cout );
+    }
+    catch( AlibException & e )
+    {
+        cout << e.what() << endl;
+        return 1;
+    }
+
+    return 0;
+}
diff --git a/aconversions/src/conversions/fa2rg/fa2rg.cpp b/aconversions/src/conversions/fa2rg/fa2rg.cpp
deleted file mode 100644
index 34da8c2a0f71b21c84b8295a016ab4d10cbc3d30..0000000000000000000000000000000000000000
--- a/aconversions/src/conversions/fa2rg/fa2rg.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#include "fa2rg.h"
-
-/*
- * implements algorithm 2.104 in "[2] Melichar, B. Jazyky a překlady. Praha, Vydavatelství ČVUT 2007."
- */
-
-RightRegularGrammar FA2RGconvert::convert( const FSM & automaton )
-{
-    RightRegularGrammar grammar;
-
-    // step 0
-    for( set<Symbol>::const_iterator i = automaton.getInputAlphabet().begin(); i != automaton.getInputAlphabet().end(); i++ )
-        grammar.addTerminalSymbol( *i );
-
-    // step 1
-    for( set<State>::const_iterator i = automaton.getStates().begin(); i != automaton.getStates().end(); i++)
-        grammar.addNonTerminalSymbol( Symbol( i->getName() ) );
-
-    // step 2 - create set of P in G
-    for( set<TransitionFSM>::const_iterator i = automaton.getTransitions().begin(); i != automaton.getTransitions().end(); i++ )
-    {
-        // 2a
-        list<Symbol> leftSide, rightSide;
-        leftSide.push_back ( Symbol( i->getFrom().getName() ) );
-        rightSide.push_back( Symbol( i->getInput().getSymbol() ) );
-        rightSide.push_back( Symbol( i->getTo().getName() ) );
-        Rule r( leftSide, rightSide );
-        grammar.addRule(r);
-
-        // 2b
-        if ( isInSet( i->getTo(), automaton.getFinalStates() ) )
-        {
-            list<Symbol> leftSide, rightSide;
-            leftSide.push_back( Symbol( i->getFrom().getName() ) );
-            rightSide.push_back( Symbol( i->getInput().getSymbol() ) );
-            Rule r( leftSide, rightSide );
-            grammar.addRule(r);
-        }
-    }
-
-    // step 3 - Set S in G
-    grammar.setStartSymbol( Symbol( automaton.getInitialStates().begin() -> getName() ));
-
-    // step 4
-    if ( isInSet( State( grammar.getStartSymbol().getSymbol() ), automaton.getFinalStates() ) )
-    {
-        // 4a
-        if ( ! GrammarUtils::isNonterminalOnRightSide( grammar.getStartSymbol(), grammar.getRules() ) )
-        {
-            list<Symbol> leftSide, rightSide;
-            leftSide.push_back( grammar.getStartSymbol() );
-            Rule r( leftSide, rightSide );
-            grammar.addRule(r);
-        }
-        else // 4b
-        {
-            Symbol newStart = GrammarUtils::createUniqueSymbol( grammar.getStartSymbol().getSymbol(), grammar, APOSTROPHE );
-            grammar.addNonTerminalSymbol( newStart );
-
-            for( set<Rule>::const_iterator i = grammar.getRules().begin(); i != grammar.getRules().end(); i++ )
-            {
-                if( *(i->getLeftSide().begin()) == grammar.getStartSymbol())
-                {
-                    list<Symbol> leftSide, rightSide( i->getRightSide() );
-                    leftSide.push_back( newStart );
-                    Rule r( leftSide, rightSide );
-                    grammar.addRule(r);
-                }
-            }
-            grammar.setStartSymbol( newStart );
-
-            list<Symbol> leftSide, rightSide;
-            leftSide.push_back( newStart );
-            Rule rr( leftSide, rightSide );
-            grammar.addRule(rr);
-        }
-    }
-
-    return grammar;
-}
-
diff --git a/aconversions/src/conversions/fa2rg/fa2rg.h b/aconversions/src/conversions/fa2rg/fa2rg.h
deleted file mode 100644
index c55fe3eadb818e671a786ad0f33f851df6de968a..0000000000000000000000000000000000000000
--- a/aconversions/src/conversions/fa2rg/fa2rg.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * FSM2RGConvert.h
- *
- *  Created on: 10. 11. 2013
- *      Author: Tomas Pecka
- */
-
-#ifndef FA2RG_CONVERT_H_
-#define FA2RG_CONVERT_H_
-
-#include <automaton/FSM/FSM.h>
-#include <grammar/RightRegularGrammar.h>
-
-#include "../../utils/GrammarUtils.h"
-#include "../../utils/AutomatonUtils.h"
-
-using namespace std;
-using namespace automaton;
-using namespace grammar;
-
-class FA2RGconvert
-{
-public:
-    static RightRegularGrammar convert( const FSM & automaton );
-
-};
-
-#endif /* FA2RG_CONVERT_H_ */
diff --git a/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.cpp b/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..af481d488e637b0c8066bd7fc3173a57a4230c49
--- /dev/null
+++ b/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.cpp
@@ -0,0 +1,18 @@
+#include "AbstractREtoFAConverter.h"
+
+using namespace regexp;
+
+namespace conversions
+{
+
+AbstractREtoFAConverter::AbstractREtoFAConverter(const RegExp & re ) : m_re(re)
+{
+
+}
+
+AbstractREtoFAConverter::~AbstractREtoFAConverter(void)
+{
+
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.h b/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..940f256ad70d9f6c941744679836e309fd0d639d
--- /dev/null
+++ b/aconversions/src/conversions/re2fa/AbstractREtoFAConverter.h
@@ -0,0 +1,25 @@
+#ifndef __ABSTRACTRETOFACONVERTER_H__
+#define __ABSTRACTRETOFACONVERTER_H__
+
+#include <regexp/RegExp.h>
+#include <automaton/FSM/FSM.h>
+
+namespace conversions
+{
+
+class AbstractREtoFAConverter
+{
+public:
+    virtual const automaton::FSM convert( void ) = 0;
+
+protected:
+    AbstractREtoFAConverter(const regexp::RegExp & re );
+    virtual ~AbstractREtoFAConverter( void );
+
+    const regexp::RegExp & m_re;
+    automaton::FSM m_fsm;
+};
+
+} /* namespace conversions */
+
+#endif /* __ABSTRACTRETOFACONVERTER_H__ */
diff --git a/aconversions/src/conversions/re2fa/Brzozowski.cpp b/aconversions/src/conversions/re2fa/Brzozowski.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..479ffb37f1e4ebc07237c37254607769d08d679f
--- /dev/null
+++ b/aconversions/src/conversions/re2fa/Brzozowski.cpp
@@ -0,0 +1,13 @@
+/*
+ * Brzozowski.cpp
+ *
+ *  Created on: 11. 1. 2014
+ *      Author: tomas
+ */
+
+#include "Brzozowski.h"
+
+namespace conversions
+{
+
+} /* namespace conversions */
diff --git a/aconversions/src/conversions/re2fa/Brzozowski.h b/aconversions/src/conversions/re2fa/Brzozowski.h
new file mode 100644
index 0000000000000000000000000000000000000000..cae0c27c9a5ff88d2798256513c16fdc190bcf57
--- /dev/null
+++ b/aconversions/src/conversions/re2fa/Brzozowski.h
@@ -0,0 +1,25 @@
+/*
+ * Brzozowski.h
+ *
+ *  Created on: 11. 1. 2014
+ *      Author: tomas
+ */
+
+#ifndef BRZOZOWSKI_H_
+#define BRZOZOWSKI_H_
+
+#include "AbstractREtoFAConverter.h"
+
+namespace conversions
+{
+
+/**
+ * Converts regular expression to finite automata using Brzozowski algorithm (derivations of regular expressions).
+ */
+class Brzozowski : public AbstractREtoFAConverter
+{
+};
+
+} /* namespace conversions */
+
+#endif /* BRZOZOWSKI_H_ */
diff --git a/aconversions/src/conversions/re2fa/Glushkov.cpp b/aconversions/src/conversions/re2fa/Glushkov.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..be1c514c89b6eaad6f13e348b7810f4e370a726d
--- /dev/null
+++ b/aconversions/src/conversions/re2fa/Glushkov.cpp
@@ -0,0 +1,13 @@
+/*
+ * Glushkov.cpp
+ *
+ *  Created on: 11. 1. 2014
+ *      Author: tomas
+ */
+
+#include "Glushkov.h"
+
+namespace conversions
+{
+
+} /* namespace conversions */
diff --git a/aconversions/src/conversions/re2fa/Glushkov.h b/aconversions/src/conversions/re2fa/Glushkov.h
new file mode 100644
index 0000000000000000000000000000000000000000..44dfee8f4d037f41c0236550ed13a2eecf74c1a0
--- /dev/null
+++ b/aconversions/src/conversions/re2fa/Glushkov.h
@@ -0,0 +1,24 @@
+/*
+ * Glushkov.h
+ *
+ *  Created on: 11. 1. 2014
+ *      Author: tomas
+ */
+
+#ifndef GLUSHKOV_H_
+#define GLUSHKOV_H_
+
+#include "AbstractREtoFAConverter.h"
+
+namespace conversions
+{
+
+/**
+ * Converts regular expression to finite automata using Glushkov's NFA construction algorithm.
+ */
+class Glushkov : public AbstractREtoFAConverter
+{
+
+} /* namespace conversions */
+
+#endif /* GLUSHKOV_H_ */
diff --git a/aconversions/src/conversions/re2fa/Makefile b/aconversions/src/conversions/re2fa/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7f78a561d2e785975d84b529689f5ef53a2edada
--- /dev/null
+++ b/aconversions/src/conversions/re2fa/Makefile
@@ -0,0 +1,34 @@
+EXECUTABLE=are2fa
+
+all: $(EXECUTABLE).o AbstractREtoFAConverter.o Brzozowski.o Glushkov.o Thompson.o AutomatonUtils.o ConversionException.o
+	$(LD) $(LDFLAGS) $^ -o $(EXECUTABLE)
+	cp $(EXECUTABLE) $(BIN_DIR)
+
+$(EXECUTABLE).o: are2fa.cpp Brzozowski.h AbstractREtoFAConverter.h Glushkov.h Thompson.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+AbstractREtoFAConverter.o: AbstractREtoFAConverter.cpp AbstractREtoFAConverter.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+Brzozowski.o: Brzozowski.cpp Brzozowski.h AbstractREtoFAConverter.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+Glushkov.o: Glushkov.cpp Glushkov.h AbstractREtoFAConverter.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+Thompson.o: Thompson.cpp Thompson.h AbstractREtoFAConverter.h ../../utils/AutomatonUtils.h ../../utils/ConversionException.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+
+AutomatonUtils.o: ../../utils/AutomatonUtils.cpp ../../utils/AutomatonUtils.h ../../utils/utils.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+ConversionException.o: ../../utils/ConversionException.cpp ../../utils/ConversionException.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+
+.PHONY: clean
+
+clean:
+	rm -f *.o
+	rm -f $(EXECUTABLE)
\ No newline at end of file
diff --git a/aconversions/src/conversions/re2fa/Thompson.cpp b/aconversions/src/conversions/re2fa/Thompson.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3b606f8b5f836f30f9c93568f6759018299e73b7
--- /dev/null
+++ b/aconversions/src/conversions/re2fa/Thompson.cpp
@@ -0,0 +1,12 @@
+/*
+ * Thompson.cpp
+ *
+ *  Created on: 11. 1. 2014
+ *      Author: tomas
+ */
+#include "Thompson.h"
+
+namespace conversions
+{
+
+} /* namespace conversions */
diff --git a/aconversions/src/conversions/re2fa/Thompson.h b/aconversions/src/conversions/re2fa/Thompson.h
new file mode 100644
index 0000000000000000000000000000000000000000..0311c23f46930856308e6951e4ff262a94ab8974
--- /dev/null
+++ b/aconversions/src/conversions/re2fa/Thompson.h
@@ -0,0 +1,19 @@
+/*
+ * Thompson.h
+ *
+ *  Created on: 11. 1. 2014
+ *      Author: tomas
+ */
+
+#ifndef THOMPSON_H_
+#define THOMPSON_H_
+
+namespace conversions
+{
+
+class Thompson : public AbstractREtoFAConverter
+{
+
+} /* namespace conversions */
+
+#endif /* THOMPSON_H_ */
diff --git a/aconversions/src/arg2fa.cpp b/aconversions/src/conversions/re2fa/are2fa.cpp
similarity index 52%
rename from aconversions/src/arg2fa.cpp
rename to aconversions/src/conversions/re2fa/are2fa.cpp
index 9b4a60f4dcab4d25b7d04fe3810b5d053f032b14..715b5889041b9a72710a02d659684d7960199b9d 100644
--- a/aconversions/src/arg2fa.cpp
+++ b/aconversions/src/conversions/re2fa/are2fa.cpp
@@ -1,5 +1,5 @@
 //============================================================================
-// Name        : afsm2rg.cpp
+// Name        : are2fa.cpp
 // Author      : Tomas Pecka
 // Version     :
 // Copyright   :
@@ -8,32 +8,42 @@
 
 #include <iostream>
 
-#include <GrammarFactory.h>
 #include <AlibException.h>
-
 #include <automaton/AutomatonPrinter.h>
+#include <regexp/RegExp.h>
+#include <regexp/RegExpParser.h>
+#include <sax/SaxInterface.h>
+
+#include "Brzozowski.h"
+#include "Glushkov.h"
+#include "Thompson.h"
 
-#include "conversions/rg2fa/rg2fa.h"
 
 using namespace std;
-using namespace grammar;
 using namespace automaton;
+using namespace regexp;
 using namespace alib;
+using namespace conversions;
 
 int main(int argc, char** argv)
 {
     try
     {
+        list<Token> tokens;
         string input(istreambuf_iterator<char>(cin), (istreambuf_iterator<char>()));
+        SaxInterface::parseMemory(input, tokens);
+        RegExp re = RegExpParser::parse(tokens);
 
-        RightRegularGrammar rg = GrammarFactory::buildRightRegularGrammar( GrammarFactory::fromString( input ) );
-        // LeftRegularGrammar rg = GrammarFactory::buildLeftRegularGrammar( GrammarFactory::fromString( input ) );
-        FSM* fsm = RG2FSMConvert::convert( rg );
-        AutomatonPrinter::toXML(*fsm, cout);
+        Thompson conv( re );
+        FSM fsm = conv.convert( );
+
+        AutomatonPrinter::toXML( fsm, cout );
     }
-    catch (AlibException& e)
+    catch( AlibException & e )
     {
         cout << e.what() << endl;
-        return 0;
+        return 1;
     }
+
+    return 0;
 }
diff --git a/aconversions/src/conversions/re2rg/Makefile b/aconversions/src/conversions/re2rg/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..59f2f1d0f5d8d7212f43bacd1437e590c688e79e
--- /dev/null
+++ b/aconversions/src/conversions/re2rg/Makefile
@@ -0,0 +1,5 @@
+all:
+
+.PHONY: clean
+clean:
+	rm -f *.o
\ No newline at end of file
diff --git a/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.cpp b/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a6b56bdd8a5c1c9c195d6ce331c8cf9eb53f93fd
--- /dev/null
+++ b/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.cpp
@@ -0,0 +1,32 @@
+#include "AbstractRGtoFAConverter.h"
+
+using namespace alphabet;
+using namespace automaton;
+using namespace grammar;
+
+namespace conversions
+{
+
+AbstractRGtoFAConverter::AbstractRGtoFAConverter( const RegularGrammar& grammar ) : m_grammar( grammar )
+{
+
+}
+
+AbstractRGtoFAConverter::~AbstractRGtoFAConverter( void )
+{
+
+}
+
+void AbstractRGtoFAConverter::createInputAlphabet( void )
+{
+    for( set<Symbol>::const_iterator i = m_grammar.getTerminalSymbols().begin(); i != m_grammar.getTerminalSymbols().end(); i++ )
+        m_automaton . addInputSymbol( *i );
+}
+
+void AbstractRGtoFAConverter::createStates( void )
+{
+    for( set<Symbol>::const_iterator i = m_grammar.getNonTerminalSymbols().begin(); i != m_grammar.getNonTerminalSymbols().end(); i++ )
+        m_automaton . addState( State( i-> getSymbol() ) );
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.h b/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..67575b57afdf08583fecc725e3fa78381715eb68
--- /dev/null
+++ b/aconversions/src/conversions/rg2fa/AbstractRGtoFAConverter.h
@@ -0,0 +1,27 @@
+#ifndef __ABSTRACTRGTOFACONVERTER_H__
+#define __ABSTRACTRGTOFACONVERTER_H__
+
+#include <automaton/FSM/FSM.h>
+#include <grammar/RegularGrammar.h>
+
+namespace conversions
+{
+
+class AbstractRGtoFAConverter
+{
+public:
+    virtual const automaton::FSM convert( void ) = 0;
+
+protected:
+    AbstractRGtoFAConverter( const grammar::RegularGrammar& grammar );
+    virtual ~AbstractRGtoFAConverter( void );
+    void createStates( void );
+    void createInputAlphabet( void );
+
+    const grammar::RegularGrammar& m_grammar;
+    automaton::FSM m_automaton;
+};
+
+} /* namespace conversions */
+
+#endif /* __ABSTRACTRGTOFACONVERTER_H__ */
diff --git a/aconversions/src/conversions/rg2fa/LRGtoFAConverter.cpp b/aconversions/src/conversions/rg2fa/LRGtoFAConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7802f3040b610e304f7abdd4e2b97d2ef4b677f2
--- /dev/null
+++ b/aconversions/src/conversions/rg2fa/LRGtoFAConverter.cpp
@@ -0,0 +1,57 @@
+#include "LRGtoFAConverter.h"
+
+using namespace alphabet;
+using namespace automaton;
+using namespace grammar;
+
+namespace conversions
+{
+
+LRGtoFAConverter::LRGtoFAConverter( const LeftRegularGrammar & grammar ) : AbstractRGtoFAConverter( grammar )
+{
+    //TODO: if is not LRG throw Exception
+}
+
+const FSM LRGtoFAConverter::convert( void )
+{
+    createInputAlphabet( );
+    createStates( );
+
+    State startState = AutomatonUtils::createUniqueState( "q0", m_automaton.getStates() );
+    m_automaton.addState( startState );
+
+    // step 3, constructing \delta
+    for( set<Rule>::const_iterator i = m_grammar.getRules().begin(); i != m_grammar.getRules().end(); i++ )
+    {
+        if( GrammarUtils::isEpsilonRule( *i ) )
+            continue;
+
+        State current( GrammarUtils::getFirstSymbolFromSet( i->getLeftSide(), m_grammar.getNonTerminalSymbols() ) -> getSymbol() );
+        Symbol input( GrammarUtils::getFirstSymbolFromSet( i->getRightSide(), m_grammar.getTerminalSymbols() ) -> getSymbol() );
+
+        // if B->a => \delta(B,a)=AState
+        if( i->getRightSide().size() == 1 )
+        {
+            m_automaton.addTransition( startState, input, current );
+        }
+        // if B->aC => \delta(B,a)=C
+        else if( i->getRightSide().size() == 2 )
+        {
+            State next( GrammarUtils::getFirstSymbolFromSet( i -> getRightSide(), m_grammar.getNonTerminalSymbols() ) -> getSymbol() );
+            m_automaton.addTransition( next, input, current );
+        }
+    }
+
+    // step 4
+    m_automaton.addInitialState( startState );
+
+    // step 5
+    m_automaton.addFinalState( State( m_grammar.getStartSymbol().getSymbol() ) );
+    for( set<Rule>::const_iterator i = m_grammar.getRules().begin(); i != m_grammar.getRules().end(); i++ )
+        if( GrammarUtils::isEpsilonRule( *i ) )
+            m_automaton.addFinalState( startState );
+
+    return m_automaton;
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/conversions/rg2fa/LRGtoFAConverter.h b/aconversions/src/conversions/rg2fa/LRGtoFAConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..856a0cbe80018674592b428ffc38a93ab5e8587a
--- /dev/null
+++ b/aconversions/src/conversions/rg2fa/LRGtoFAConverter.h
@@ -0,0 +1,23 @@
+#ifndef __LRGTOFACONVERTER_H__
+#define __LRGTOFACONVERTER_H__
+
+#include <automaton/FSM/FSM.h>
+#include <grammar/LeftRegularGrammar.h>
+
+#include "../../utils/AutomatonUtils.h"
+#include "../../utils/GrammarUtils.h"
+#include "AbstractRGtoFAConverter.h"
+
+namespace conversions
+{
+
+class LRGtoFAConverter : public AbstractRGtoFAConverter
+{
+public:
+    LRGtoFAConverter( const grammar::LeftRegularGrammar & grammar );
+    const automaton::FSM convert( );
+};
+
+} /* namespace conversions */
+
+#endif /* __LRGTOFACONVERTER_H__ */
diff --git a/aconversions/src/conversions/rg2fa/Makefile b/aconversions/src/conversions/rg2fa/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..02b4e2f63eb7ed197d81c70ee5c7249880953b82
--- /dev/null
+++ b/aconversions/src/conversions/rg2fa/Makefile
@@ -0,0 +1,34 @@
+EXECUTABLE=are2fa
+
+all: $(EXECUTABLE).o AbstractRGtoFAConverter.o LRGtoFAConverter.o RRGtoFAConverter.o AutomatonUtils.o GrammarUtils.o ConversionException.o
+	$(LD) $(LDFLAGS) $^ -o $(EXECUTABLE)
+	cp $(EXECUTABLE) $(BIN_DIR)
+
+$(EXECUTABLE).o: arg2fa.cpp LRGtoFAConverter.h ../../utils/AutomatonUtils.h ../../utils/utils.h ../../utils/GrammarUtils.h AbstractRGtoFAConverter.h RRGtoFAConverter.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+AbstractRGtoFAConverter.o: AbstractRGtoFAConverter.cpp AbstractRGtoFAConverter.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+LRGtoFAConverter.o: LRGtoFAConverter.cpp LRGtoFAConverter.h ../../utils/AutomatonUtils.h ../../utils/utils.h ../../utils/GrammarUtils.h AbstractRGtoFAConverter.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+RRGtoFAConverter.o: RRGtoFAConverter.cpp RRGtoFAConverter.h ../../utils/AutomatonUtils.h ../../utils/utils.h  ../../utils/GrammarUtils.h AbstractRGtoFAConverter.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+
+AutomatonUtils.o: ../../utils/AutomatonUtils.cpp ../../utils/AutomatonUtils.h ../../utils/utils.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+ConversionException.o: ../../utils/ConversionException.cpp ../../utils/ConversionException.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+GrammarUtils.o: ../../utils/GrammarUtils.cpp ../../utils/GrammarUtils.h ../../utils/utils.h
+	$(CXX) $(CXXFLAGS) $< -o $@
+
+
+
+.PHONY: clean
+clean:
+	rm -f *.o
+	rm -f $(EXECUTABLE)
\ No newline at end of file
diff --git a/aconversions/src/conversions/rg2fa/RRGtoFAConverter.cpp b/aconversions/src/conversions/rg2fa/RRGtoFAConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..aebb1bd8f7fa56671ae63a13fa6d2be7e095dbd6
--- /dev/null
+++ b/aconversions/src/conversions/rg2fa/RRGtoFAConverter.cpp
@@ -0,0 +1,54 @@
+#include "RRGtoFAConverter.h"
+
+using namespace alphabet;
+using namespace automaton;
+using namespace grammar;
+
+namespace conversions
+{
+
+RRGtoFAConverter::RRGtoFAConverter( const RightRegularGrammar & grammar ) : AbstractRGtoFAConverter( grammar )
+{
+    //TODO: if is not RRG throw Exception
+}
+
+const FSM RRGtoFAConverter::convert( void )
+{
+    createInputAlphabet( );
+    createStates( );
+
+    State AState = AutomatonUtils::createUniqueState( "A", m_automaton.getStates() );
+    m_automaton.addState( AState );
+
+    for( set<Rule>::const_iterator i = m_grammar.getRules().begin(); i != m_grammar.getRules().end(); i++ )
+    {
+        if( GrammarUtils::isEpsilonRule(*i) )
+            continue;
+
+        State current( GrammarUtils::getFirstSymbolFromSet( i->getLeftSide(), m_grammar.getNonTerminalSymbols() ) -> getSymbol() );
+        Symbol input( GrammarUtils::getFirstSymbolFromSet( i->getRightSide(), m_grammar.getTerminalSymbols() ) -> getSymbol() );
+
+        if( i->getRightSide().size() == 1 ) // if B->a => \delta(B,a)=AState
+        {
+            m_automaton.addTransition( current, input, AState );
+        }
+        else if( i->getRightSide().size() == 2 ) // if B->aC => \delta(B,a)=C
+        {
+            State next( GrammarUtils::getFirstSymbolFromSet( i -> getRightSide(), m_grammar.getNonTerminalSymbols() ) -> getSymbol() );
+            m_automaton.addTransition( current, input, next );
+        }
+    }
+
+    // step 4
+    m_automaton.addInitialState( m_grammar.getStartSymbol().getSymbol() );
+
+    // step 5
+    m_automaton.addFinalState( AState );
+    for( set<Rule>::const_iterator i = m_grammar.getRules().begin(); i != m_grammar.getRules().end(); i++ )
+        if( GrammarUtils::isEpsilonRule( *i ) )
+            m_automaton.addFinalState( State( m_grammar.getStartSymbol().getSymbol() ));
+
+    return m_automaton;
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/conversions/rg2fa/RRGtoFAConverter.h b/aconversions/src/conversions/rg2fa/RRGtoFAConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..1d6af194f5556d18b31c9d0d1661cf9d7ddb3604
--- /dev/null
+++ b/aconversions/src/conversions/rg2fa/RRGtoFAConverter.h
@@ -0,0 +1,23 @@
+#ifndef __RRGTOFACONVERTER_H__
+#define __RRGTOFACONVERTER_H__
+
+#include <grammar/RightRegularGrammar.h>
+#include <automaton/FSM/FSM.h>
+
+#include "../../utils/AutomatonUtils.h"
+#include "../../utils/GrammarUtils.h"
+#include "AbstractRGtoFAConverter.h"
+
+namespace conversions
+{
+
+class RRGtoFAConverter : public AbstractRGtoFAConverter
+{
+public:
+    RRGtoFAConverter( const grammar::RightRegularGrammar & grammar );
+    const automaton::FSM convert( );
+};
+
+} /* namespace conversions */
+
+#endif /* __RRGTOFACONVERTER_H__ */
diff --git a/aconversions/src/conversions/rg2fa/arg2fa.cpp b/aconversions/src/conversions/rg2fa/arg2fa.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..83c81929b2278e9935fdd159c5372252dfc6c3af
--- /dev/null
+++ b/aconversions/src/conversions/rg2fa/arg2fa.cpp
@@ -0,0 +1,52 @@
+//============================================================================
+// Name        : afsm2rg.cpp
+// Author      : Tomas Pecka
+// Version     :
+// Copyright   :
+// Description :
+//============================================================================
+
+#include <iostream>
+#include <cstdlib>
+
+#include <GrammarFactory.h>
+#include <AlibException.h>
+
+#include <automaton/AutomatonPrinter.h>
+
+#include "LRGtoFAConverter.h"
+#include "RRGtoFAConverter.h"
+
+using namespace std;
+using namespace grammar;
+using namespace automaton;
+using namespace alib;
+using namespace conversions;
+
+int main(int argc, char** argv)
+{
+    try
+    {
+        string input( istreambuf_iterator<char>( cin ), ( istreambuf_iterator<char>( ) ) );
+
+        UnknownGrammar rg = GrammarFactory::fromString( input );
+        //if( isLeftRegularGrammar( rg ) )
+        //    LRGtoFSMConverter conv( GrammarFactory::buildLeftRegularGrammar( rg ) )
+        //else if( isRightRegularGrammar( rg ) )
+            RightRegularGrammar rrg = GrammarFactory::buildRightRegularGrammar( rg );
+            RRGtoFAConverter conv( rrg );
+        //else
+        //{
+        //    cout << "Unknow regular grammar type. Neither left nor right. WTF?" << endl;
+        //    return EXIT_FAILURE;
+        //}
+
+        FSM fsm = conv.convert( );
+        AutomatonPrinter::toXML( fsm, cout );
+    }
+    catch( AlibException & e )
+    {
+        cout << e.what( ) << endl;
+        return 0;
+    }
+}
diff --git a/aconversions/src/conversions/rg2fa/rg2fa.cpp b/aconversions/src/conversions/rg2fa/rg2fa.cpp
deleted file mode 100644
index 171d3d7b3788a9e7579cc38d7a7369adfa8b2871..0000000000000000000000000000000000000000
--- a/aconversions/src/conversions/rg2fa/rg2fa.cpp
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * FSM2RGConvert.cpp
- *
- *  Created on: 10. 11. 2013
- *      Author: tomas
- */
-
-#include "rg2fa.h"
-
-/*
- * implements 2.98 in "[2] Melichar, B. Jazyky a překlady. Praha, Vydavatelství ČVUT 2007."
- */
-FSM * RG2FSMConvert::convert( const RightRegularGrammar & grammar )
-{
-    FSM* automaton = new FSM();
-
-    // step 1
-    for( set<Symbol>::const_iterator i = grammar.getTerminalSymbols().begin(); i != grammar.getTerminalSymbols().end(); i++ )
-        automaton -> addInputSymbol( *i );
-
-    // step 2
-    for( set<Symbol>::const_iterator i = grammar.getNonTerminalSymbols().begin(); i != grammar.getNonTerminalSymbols().end(); i++ )
-        automaton -> addState( State( i-> getSymbol() ) );
-
-    State AState = AutomatonUtils::createUniqueState( "A", automaton->getStates() );
-    automaton -> addState( AState );
-
-    // step 3, constructing \delta
-    for( set<Rule>::const_iterator i = grammar.getRules().begin(); i != grammar.getRules().end(); i++ )
-    {
-        if( GrammarUtils::isEpsilonRule(*i) )
-            continue;
-
-        State current( GrammarUtils::getFirstSymbolFromSet( i->getLeftSide(), grammar.getNonTerminalSymbols() ) -> getSymbol() );
-        Symbol input( GrammarUtils::getFirstSymbolFromSet( i->getRightSide(), grammar.getTerminalSymbols() ) -> getSymbol() );
-
-        // if B->a => \delta(B,a)=AState
-        if( i->getRightSide().size() == 1 )
-            automaton->addTransition( current, input, AState );
-
-        // if B->aC => \delta(B,a)=C
-        if( i->getRightSide().size() == 2 )
-        {
-            State next( GrammarUtils::getFirstSymbolFromSet( i -> getRightSide(), grammar.getNonTerminalSymbols() ) -> getSymbol() );
-            automaton->addTransition( current, input, next );
-        }
-    }
-
-    // step 4
-    automaton -> addInitialState( grammar.getStartSymbol().getSymbol() );
-
-    // step 5
-    automaton -> addFinalState( AState );
-    for( set<Rule>::const_iterator i = grammar.getRules().begin(); i != grammar.getRules().end(); i++ )
-        if( GrammarUtils::isEpsilonRule( *i ) )
-            automaton -> addFinalState( State( grammar.getStartSymbol().getSymbol() ));
-
-    return automaton;
-}
-
-
-/*
- * implements 2.102 in "[2] Melichar, B. Jazyky a překlady. Praha, Vydavatelství ČVUT 2007."
- */
-FSM * RG2FSMConvert::convert( const LeftRegularGrammar & grammar )
-{
-    FSM* automaton = new FSM();
-
-    // step 1
-    for( set<Symbol>::const_iterator i = grammar.getTerminalSymbols().begin(); i != grammar.getTerminalSymbols().end(); i++ )
-        automaton -> addInputSymbol( *i );
-
-    // step 2
-    for( set<Symbol>::const_iterator i = grammar.getNonTerminalSymbols().begin(); i != grammar.getNonTerminalSymbols().end(); i++ )
-        automaton -> addState( State( i-> getSymbol() ) );
-
-    State startState = AutomatonUtils::createUniqueState( "q0", automaton->getStates() );
-    automaton -> addState( startState );
-
-    // step 3, constructing \delta
-    for( set<Rule>::const_iterator i = grammar.getRules().begin(); i != grammar.getRules().end(); i++ )
-    {
-        if( i->getRightSide().size() == 0 ) continue;
-
-        State current( GrammarUtils::getFirstSymbolFromSet( i->getLeftSide(), grammar.getNonTerminalSymbols() ) -> getSymbol() );
-        Symbol input( GrammarUtils::getFirstSymbolFromSet( i->getRightSide(), grammar.getTerminalSymbols() ) -> getSymbol() );
-
-        // if B->a => \delta(B,a)=AState
-        if( i->getRightSide().size() == 1 )
-            automaton->addTransition( startState, input, current );
-
-        // if B->aC => \delta(B,a)=C
-        if( i->getRightSide().size() == 2 )
-        {
-            State next( GrammarUtils::getFirstSymbolFromSet( i -> getRightSide(), grammar.getNonTerminalSymbols() ) -> getSymbol() );
-            automaton->addTransition( next, input, current );
-        }
-    }
-
-    // step 4
-    automaton -> addInitialState( startState );
-
-    // step 5
-    automaton -> addFinalState( State( grammar.getStartSymbol().getSymbol() ) );
-    for( set<Rule>::const_iterator i = grammar.getRules().begin(); i != grammar.getRules().end(); i++ )
-        if( GrammarUtils::isEpsilonRule( *i ) )
-            automaton -> addFinalState( startState );
-
-
-    return automaton;
-}
diff --git a/aconversions/src/conversions/rg2fa/rg2fa.h b/aconversions/src/conversions/rg2fa/rg2fa.h
deleted file mode 100644
index 69d4c97c3fef1048fc82e71e71176edf02c66039..0000000000000000000000000000000000000000
--- a/aconversions/src/conversions/rg2fa/rg2fa.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * RG2FSMConvert.h
- *
- *  Created on: 10. 11. 2013
- *      Author: Tomas Pecka
- */
-
-#ifndef RG2FA_CONVERT_H_
-#define RG2FA_CONVERT_H_
-
-#include <map>
-
-#include <automaton/FSM/FSM.h>
-#include <grammar/RightRegularGrammar.h>
-#include <grammar/LeftRegularGrammar.h>
-
-#include "../../utils/AutomatonUtils.h"
-#include "../../utils/GrammarUtils.h"
-
-using namespace std;
-using namespace automaton;
-using namespace grammar;
-
-class RG2FSMConvert
-{
-public:
-    static FSM* convert( const RightRegularGrammar & grammar );
-    static FSM* convert( const LeftRegularGrammar & grammar );
-};
-
-#endif /* RG2FA_CONVERT_H_ */
diff --git a/aconversions/src/conversions/rg2re/Makefile b/aconversions/src/conversions/rg2re/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..fc51491dbea8d504dfeb62fcc8bef3dbea8e111f
--- /dev/null
+++ b/aconversions/src/conversions/rg2re/Makefile
@@ -0,0 +1,6 @@
+all:
+
+.PHONY: clean
+clean:
+	rm -f *.o
+	rm -f $(EXECUTABLE)
\ No newline at end of file
diff --git a/aconversions/src/utils/ConversionException.cpp b/aconversions/src/utils/ConversionException.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d7683ec5e617a1c095446d4f5693bc7e54683fdb
--- /dev/null
+++ b/aconversions/src/utils/ConversionException.cpp
@@ -0,0 +1,23 @@
+/*
+ * ConversionException.cpp
+ *
+ *  Created on: 22. 12. 2013
+ *      Author: tomas
+ */
+
+#include "ConversionException.h"
+
+ConversionException::ConversionException( void )
+{
+
+}
+
+ConversionException::ConversionException( const string & cause ) : AlibException( cause )
+{
+
+}
+
+ConversionException::~ConversionException( void ) throw ( )
+{
+
+}
diff --git a/aconversions/src/utils/ConversionException.h b/aconversions/src/utils/ConversionException.h
new file mode 100644
index 0000000000000000000000000000000000000000..c789ca3c30e4c9f73400fdb7e4c70651c2bcdf89
--- /dev/null
+++ b/aconversions/src/utils/ConversionException.h
@@ -0,0 +1,24 @@
+/*
+ * ConversionException.h
+ *
+ *  Created on: 22. 12. 2013
+ *      Author: tomas
+ */
+
+#ifndef CONVERSIONEXCEPTION_H_
+#define CONVERSIONEXCEPTION_H_
+
+#include <AlibException.h>
+
+using namespace std;
+using namespace alib;
+
+class ConversionException : public AlibException
+{
+public:
+    ConversionException( void );
+    ConversionException( const string & cause );
+    virtual ~ConversionException( void ) throw ();
+};
+
+#endif /* CONVERSIONEXCEPTION_H_ */
diff --git a/aconversions/src/utils/GrammarUtils.cpp b/aconversions/src/utils/GrammarUtils.cpp
index 88f5b322bc7af0e72df077f7d5392c3fe7417ff5..b5947046317d1e8908d72be1645ae38bb9ae315c 100644
--- a/aconversions/src/utils/GrammarUtils.cpp
+++ b/aconversions/src/utils/GrammarUtils.cpp
@@ -59,8 +59,11 @@ Symbol GrammarUtils::createUniqueSymbol( const string & name, const RegularGramm
     while( true )
     {
         ostringstream oss;
+
         if( suffix == INTEGER )
+        {
             oss << name << i++;
+        }
         else
         {
             oss << name << str;
diff --git a/aconversions/src/utils/utils.h b/aconversions/src/utils/utils.h
index dea4501b7ae6ca216a4330ced59deca5ad82437c..56c69e78569563b3aaee1de7a43c6f77157633cb 100644
--- a/aconversions/src/utils/utils.h
+++ b/aconversions/src/utils/utils.h
@@ -8,14 +8,13 @@
 #include <set>
 #include <list>
 
-
 #define isInSet(x,set) ( (set).find((x)) != (set).end())
 
 enum SuffixType
 {
     INTEGER,
     APOSTROPHE,
-    UNDEFINED,
+    UNDEFINED
 };
 
 #endif /* UTILS_H_ */