diff --git a/aconversions/src/aconversion/ConversionHandler.cpp b/aconversions/src/aconversion/ConversionHandler.cpp
index b18f150a4adaafc5cc2217087d6742cec7a15846..c7f8637b50b559c74cce895c0bb7c2e11ad5430e 100644
--- a/aconversions/src/aconversion/ConversionHandler.cpp
+++ b/aconversions/src/aconversion/ConversionHandler.cpp
@@ -17,204 +17,338 @@ using namespace std;
 namespace conversions
 {
 
-ConversionHandler::ConversionHandler( list<Token> & tokens, const string & target, const string & algorithm ) : m_tokens( tokens )
+ConversionHandler::ConversionHandler( list<Token> & tokens, const string & target, const string & algorithm, ostream & out ) :
+    m_tokens( tokens ),
+    m_source( parseFormalismFromTokens( ) ),
+    m_target( parseFormalismFromString( target ) ),
+    m_algorithm( parseAlgorithmFromString( algorithm ) ),
+    m_out( out )
 {
-    m_source = parseFormalismFromString( m_tokens.front( ).getData( ) );
-    m_target = parseFormalismFromString( target );
 
-    if( m_source == m_target && m_source != REGULAR_GRAMMAR )
-        throw AlibException( "Cannot convert between same formalisms." );
-
-    m_algorithm = parseAlgorithmFromString( algorithm );
-    if( m_algorithm == DEFAULT )
-        m_algorithm = getDefaultAlgorithm( );
-
-    if( ! checkAlgorithm( ) )
-        throw AlibException( "Invalid conversion. See help." );
 }
 
-void ConversionHandler::convert( ostream & out )
+void ConversionHandler::convert( void )
 {
     if( m_source == FINITE_AUTOMATA )
-        convertAutomata( out );
-    if( m_source == REGULAR_EXPRESSION )
-        convertRegExp( out );
-    if( m_source == REGULAR_GRAMMAR )
-        convertGrammar( out );
+        convertFSM( );
+    else if( m_source == REGULAR_EXPRESSION )
+        convertRE( );
+    else if( isGrammar( m_source ) )
+        convertRG( );
+    else
+        throw AlibException( "ConversionHandler: Unknown source formalism." );
 }
 
-void ConversionHandler::convertGrammar( ostream & out )
+// ----------------------------------------------------------------------------
+
+void ConversionHandler::convertFSM( void )
 {
-    const UnknownGrammar ug = GrammarParser::parse( m_tokens );
+    if( m_target == FINITE_AUTOMATA )
+        throw AlibException( "ConversionHandler: No valid conversion from FSM to FSM." );
+    else if( m_target == REGULAR_EXPRESSION )
+        convertFSMtoRE( );
+    else if( isGrammar( m_target ) )
+        convertFSMtoRG( );
+    else
+        throw AlibException( "ConversionHandler: Unknown target formalism." );
+}
 
+void ConversionHandler::convertRE( void )
+{
     if( m_target == FINITE_AUTOMATA )
-    {
-        AbstractRGtoFAConverter* conv;
-        RightRegularGrammar rrg;
-        LeftRegularGrammar lrg;
-        bool rightGrammar = true;
+        convertREtoFSM( );
+    else if( m_target == REGULAR_EXPRESSION )
+        throw AlibException( "ConversionHandler: No valid conversion from RE to RE." );
+    else if( isGrammar( m_target ) )
+        convertREtoRG( );
+    else
+        throw AlibException( "ConversionHandler: Unknown target formalism." );
+}
 
-        try
-        {
-            GrammarFactory::buildRightRegularGrammar( ug );
-        }
-        catch( AlibException & e )
-        {
-            rightGrammar = false;
-        }
+void ConversionHandler::convertRG( void )
+{
+    if( m_target == FINITE_AUTOMATA )
+        convertRGtoFSM( );
+    else if( m_target == REGULAR_EXPRESSION )
+        convertRGtoRE( );
+    else if( isGrammar( m_target ) )
+        convertRGtoRG( );
+    else
+        throw AlibException( "ConversionHandler: Unknown target formalism." );
+}
 
-        if( rightGrammar )
-        {
-            rrg = GrammarFactory::buildRightRegularGrammar( ug );
-            conv = new RRGtoFAConverter( rrg );
-        }
-        else
-        {
-            lrg = GrammarFactory::buildLeftRegularGrammar( ug );
-            conv = new LRGtoFAConverter( lrg );
-        }
+// ----------------------------------------------------------------------------
+
+void ConversionHandler::convertFSMtoRE( void )
+{
+    const FSM fsm = AutomatonFactory::buildFSM( AutomatonParser::parse( m_tokens ) );
 
-        conv->convert( ).toXML( out );
-        delete conv;
+    AbstractFAtoREConverter* conv;
 
-    }
-    else if( m_target == REGULAR_EXPRESSION )
+    switch( m_algorithm )
     {
-        AbstractRGtoREConverter* conv;
-        RightRegularGrammar rrg;
-        LeftRegularGrammar lrg;
-        bool rightGrammar = true;
+    case BRZOZOWSKI_ALGEBRAIC:
+        conv = new BrzozowskiAlgebraic( fsm );
+        break;
+
+    case STATE_ELIMINATION:
+    default:
+        conv = new StateElimination( fsm );
+        break;
+    }
 
-        try
-        {
-            GrammarFactory::buildRightRegularGrammar( ug );
-        }
-        catch( AlibException & e )
-        {
-            rightGrammar = false;
-        }
+    conv->convert( ).toXML( m_out );
+    delete conv;
+}
 
-        if( m_algorithm == BRZOZOWSKI_ALGEBRAIC && rightGrammar )
-        {
-            rrg = GrammarFactory::buildRightRegularGrammar( ug );
-            conv = new RRGAlgebraic( rrg );
-        }
-        else if( m_algorithm == BRZOZOWSKI_ALGEBRAIC && ! rightGrammar )
-        {
-            lrg = GrammarFactory::buildLeftRegularGrammar( ug );
-            conv = new LRGAlgebraic( lrg );
-        }
-        else throw AlibException( "wtf?" );
+void ConversionHandler::convertFSMtoRG( void )
+{
+    if( m_target == RIGHT_REGULAR_GRAMMAR || REGULAR_GRAMMAR )
+        convertFSMtoRRG( );
+    else if( m_target == LEFT_REGULAR_GRAMMAR )
+        convertFSMtoLRG( );
+    else
+        throw AlibException( "ConversionHandler::Unknown target formalism" );
+}
+
+void ConversionHandler::convertFSMtoRRG( void )
+{
+    const FSM fsm = AutomatonFactory::buildFSM( AutomatonParser::parse( m_tokens ) );
 
-        conv->convert( ).toXML( out );
-        delete conv;
+    AbstractFAtoRRGConverter* conv;
+
+    switch( m_algorithm )
+    {
+    default:
+        conv = new FAtoRRGConverter( fsm );
+        break;
     }
-    else if( m_target == REGULAR_GRAMMAR )
+
+    conv->convert( ).toXML( m_out );
+    delete conv;
+}
+
+void ConversionHandler::convertFSMtoLRG( void )
+{
+    const FSM fsm = AutomatonFactory::buildFSM( AutomatonParser::parse( m_tokens ) );
+
+    AbstractFAtoLRGConverter* conv;
+
+    switch( m_algorithm )
     {
-        RightRegularGrammar rrg;
-        LeftRegularGrammar lrg;
-        bool rightGrammar = true;
+    default:
+        conv = new FAtoLRGConverter( fsm );
+        break;
+    }
 
-        try
-        {
-            GrammarFactory::buildRightRegularGrammar( ug );
-        }
-        catch( AlibException & e )
-        {
-            rightGrammar = false;
-        }
+    conv->convert( ).toXML( m_out );
+    delete conv;
+}
 
-        if( rightGrammar )
-        {
-            AbstractRRGtoLRGConverter* conv;
-            rrg = GrammarFactory::buildRightRegularGrammar( ug );
-            conv = new RightToLeftRegularGrammar( rrg );
-            conv->convert( ).toXML( out );
-            delete conv;
-        }
-        else
-        {
-            AbstractLRGtoRRGConverter* conv;
-            lrg = GrammarFactory::buildLeftRegularGrammar( ug );
-            conv = new LeftToRightRegularGrammar( lrg );
-            conv->convert( ).toXML( out );
-            delete conv;
-        }
+// ----------------------------------------------------------------------------
+
+void ConversionHandler::convertREtoFSM( void )
+{
+    const RegExp regexp = RegExpParser::parse( m_tokens );
+    AbstractREtoFAConverter* conv;
+
+    switch( m_algorithm )
+    {
+    case BRZOZOWSKI_DERIVATION:
+        conv = new Brzozowski( regexp );
+        break;
+    case THOMPSON_NFA:
+        conv = new Thompson( regexp );
+        break;
+    case GLUSHKOV_NFA:
+    default:
+        conv = new Glushkov( regexp );
+        break;
     }
+
+    conv->convert( ).toXML( m_out );
+    delete conv;
+}
+
+void ConversionHandler::convertREtoRG( void )
+{
+    if( m_target == RIGHT_REGULAR_GRAMMAR || REGULAR_GRAMMAR )
+        convertREtoRRG( );
+    else if( m_target == LEFT_REGULAR_GRAMMAR )
+        throw AlibException( "ConversionHandler:: RE to LRG is not implemented. Please convert to RRG and then to LRG." );
+    else
+        throw AlibException( "ConversionHandler::Unknown target formalism" );
 }
 
-void ConversionHandler::convertRegExp( ostream & out )
+void ConversionHandler::convertREtoRRG( void )
 {
     const RegExp regexp = RegExpParser::parse( m_tokens );
+    AbstractREtoRRGConverter* conv;
 
-    if( m_target == FINITE_AUTOMATA )
+    switch( m_algorithm )
     {
-        AbstractREtoFAConverter* conv;
-        if( m_algorithm == THOMPSON )
-            conv = new Thompson( regexp );
-        else if( m_algorithm == BRZOZOWSKI_DERIVATION )
-            conv = new Brzozowski( regexp );
-        else
-            conv = new Glushkov( regexp );
+    case BRZOZOWSKI_DERIVATION:
+        conv = new BrzozowskiDerivationRRG( regexp );
+        break;
+    default:
+        conv = new GlushkovRRG( regexp );
+        break;
+    }
+
+    conv->convert( ).toXML( m_out );
+    delete conv;
+}
+
+// ----------------------------------------------------------------------------
+
+void ConversionHandler::convertRGtoFSM( void )
+{
+    if( m_source == LEFT_REGULAR_GRAMMAR )
+        convertLRGtoFSM( );
+    else if( m_source == RIGHT_REGULAR_GRAMMAR )
+        convertRRGtoFSM( );
+    else if( m_source == LEFT_LINEAR_GRAMMAR )
+        throw AlibException( "ConversionHandler: Conversions from linear grammars are not yet implemented." );
+    else if( m_source == RIGHT_LINEAR_GRAMMAR )
+        throw AlibException( "ConversionHandler: Conversions from linear grammars are not yet implemented." );
+    else
+        throw AlibException( "ConversionHandler: Unknown target formalism." );
+}
+
+void ConversionHandler::convertRGtoRG( void )
+{
+    if( m_source == LEFT_REGULAR_GRAMMAR )
+        convertLRGtoRRG( );
+    else if( m_source == RIGHT_REGULAR_GRAMMAR )
+        convertRRGtoLRG( );
+    else if( m_source == LEFT_LINEAR_GRAMMAR )
+        throw AlibException( "ConversionHandler: Conversions from linear grammars are not yet implemented." );
+    else if( m_source == RIGHT_LINEAR_GRAMMAR )
+        throw AlibException( "ConversionHandler: Conversions from linear grammars are not yet implemented." );
+    else
+        throw AlibException( "ConversionHandler: Unknown target formalism." );
+}
+
+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 AlibException( "ConversionHandler: Conversions from linear grammars are not yet implemented." );
+    else if( m_source == RIGHT_LINEAR_GRAMMAR )
+        throw AlibException( "ConversionHandler: Conversions from linear grammars are not yet implemented." );
+    else
+        throw AlibException( "ConversionHandler: Unknown target formalism." );
+}
+
+void ConversionHandler::convertLRGtoFSM( void )
+{
+    const LeftRegularGrammar lrg = GrammarFactory::buildLeftRegularGrammar( GrammarParser::parse( m_tokens ) );
 
-        conv->convert( ).toXML( out );
-        delete conv;
+    AbstractLRGtoFAConverter* conv;
 
+    switch( m_algorithm )
+    {
+    default:
+        conv = new LRGtoFAConverter( lrg );
+        break;
     }
-    else if( m_target == REGULAR_GRAMMAR )
+
+    conv->convert( ).toXML( m_out );
+    delete conv;
+}
+
+void ConversionHandler::convertRRGtoFSM( void )
+{
+    const RightRegularGrammar rrg = GrammarFactory::buildRightRegularGrammar( GrammarParser::parse( m_tokens ) );
+
+    AbstractRRGtoFAConverter* conv;
+
+    switch( m_algorithm )
     {
-        if( m_algorithm == BRZOZOWSKI_RRG )
-        {
-            AbstractREtoRRGConverter* conv;
+    default:
+        conv = new RRGtoFAConverter( rrg );
+        break;
+    }
 
-            conv = new BrzozowskiDerivationRRG( regexp );
-            conv->convert( ).toXML( out );
-            delete conv;
-        }
-        else if ( m_algorithm == GLUSHKOV_RRG )
-        {
-            AbstractREtoRRGConverter* conv;
+    conv->convert( ).toXML( m_out );
+    delete conv;
+}
 
-            conv = new GlushkovRRG( regexp );
-            conv->convert( ).toXML( out );
-            delete conv;
-        }
+void ConversionHandler::convertLRGtoRE( void )
+{
+    const LeftRegularGrammar lrg = GrammarFactory::buildLeftRegularGrammar( GrammarParser::parse( m_tokens ) );
+
+    AbstractLRGtoREConverter* conv;
+
+    switch( m_algorithm )
+    {
+    case BRZOZOWSKI_ALGEBRAIC:
+    default:
+        conv = new LRGAlgebraic( lrg );
+        break;
     }
+
+    conv->convert( ).toXML( m_out );
+    delete conv;
 }
 
-void ConversionHandler::convertAutomata( ostream & out )
+void ConversionHandler::convertRRGtoRE( void )
 {
-    const FSM fsm = AutomatonFactory::buildFSM( AutomatonParser::parse( m_tokens ) );
+    const RightRegularGrammar rrg = GrammarFactory::buildRightRegularGrammar( GrammarParser::parse( m_tokens ) );
+
+    AbstractRRGtoREConverter* conv;
 
-    if( m_target == REGULAR_EXPRESSION )
+    switch( m_algorithm )
     {
-        AbstractFAtoREConverter* conv;
+    case BRZOZOWSKI_ALGEBRAIC:
+    default:
+        conv = new RRGAlgebraic( rrg );
+        break;
+    }
+
+    conv->convert( ).toXML( m_out );
+    delete conv;
+}
 
-        if( m_algorithm == BRZOZOWSKI_ALGEBRAIC )
-            conv = new BrzozowskiAlgebraic( fsm );
-        else
-            conv = new StateElimination( fsm );
+void ConversionHandler::convertLRGtoRRG( void )
+{
+    const LeftRegularGrammar lrg = GrammarFactory::buildLeftRegularGrammar( GrammarParser::parse( m_tokens ) );
+
+    AbstractLRGtoRRGConverter* conv;
 
-        conv->convert( ).toXML( out );
-        delete conv;
+    switch( m_algorithm )
+    {
+    default:
+        conv = new LeftToRightRegularGrammar( lrg );
+        break;
     }
-    else if( m_target == REGULAR_GRAMMAR )
+
+    conv->convert( ).toXML( m_out );
+    delete conv;
+}
+
+void ConversionHandler::convertRRGtoLRG( void )
+{
+    const RightRegularGrammar rrg = GrammarFactory::buildRightRegularGrammar( GrammarParser::parse( m_tokens ) );
+
+    AbstractRRGtoLRGConverter* conv;
+
+    switch( m_algorithm )
     {
-        if( m_algorithm == FA_LRG )
-        {
-            AbstractFAtoLRGConverter* conv = new FAtoLRGConverter( fsm );
-            conv->convert( ).toXML( out );
-            delete conv;
-        }
-        else
-        {
-            AbstractFAtoRRGConverter* conv = new FAtoRRGConverter( fsm );
-            conv->convert( ).toXML( out );
-            delete conv;
-        }
+    default:
+        conv = new RightToLeftRegularGrammar( rrg );
+        break;
     }
+
+    conv->convert( ).toXML( m_out );
+    delete conv;
 }
 
+// ----------------------------------------------------------------------------
+
 ConversionHandler::TFormalism ConversionHandler::parseFormalismFromString( const std::string & _target ) const
 {
     string target;
@@ -223,94 +357,100 @@ ConversionHandler::TFormalism ConversionHandler::parseFormalismFromString( const
 
     if( target == "fa" || target == "automaton" || target == "fsm" )
         return FINITE_AUTOMATA;
-    if( target == "re" || target == "regexp" )
+
+    if( target == "re" || target == "regexp" || target == "regex" )
         return REGULAR_EXPRESSION;
+
     if( target == "rg" || target == "grammar" )
         return REGULAR_GRAMMAR;
 
-    throw AlibException( "Unknown target type" );
+    if( target == "rrg" )
+        return RIGHT_REGULAR_GRAMMAR;
+
+    if( target == "lrg" )
+        return LEFT_REGULAR_GRAMMAR;
+
+    throw AlibException( "ConversionHandler::Unknown target type" );
 }
 
-ConversionHandler::TAlgorithm ConversionHandler::parseAlgorithmFromString( const std::string & _algorithm ) const
+ConversionHandler::TFormalism ConversionHandler::parseFormalismFromTokens( void ) const
 {
-    string algorithm;
-    for( const auto & c : _algorithm )
-        algorithm.append( 1, tolower( c ) );
+    string xmlMark = m_tokens.front( ).getData( );
 
-    if( algorithm == "" ) return DEFAULT;
+    if( xmlMark == "automaton" )
+        return FINITE_AUTOMATA;
 
-    /* FA to RE */
-    /* RG to RE */
-    if( algorithm == "elimination" ) return STATE_ELIMINATION;
-    if( algorithm == "algebraic" ) return BRZOZOWSKI_ALGEBRAIC;
+    if( xmlMark == "regexp" )
+        return REGULAR_EXPRESSION;
 
-    /* FA to RG */
-    if( algorithm == "left" ) return FA_LRG;
-    if( algorithm == "right" ) return FA_RRG;
+    if( xmlMark == "grammar" )
+    {
+        bool ll, rl, lr, rr;
+        ll = rl = lr = rr = true;
 
-    /* RE to FA */
-    if( algorithm == "brzozowski" ) return BRZOZOWSKI_DERIVATION;
-    if( algorithm == "glushkov" ) return GLUSHKOV;
-    if( algorithm == "thompson" ) return THOMPSON;
+        list<Token> tokens_copy = m_tokens;
+        UnknownGrammar grammar = GrammarParser::parse( tokens_copy );
 
-    /* RE to RG */
-    if( algorithm == "brzozowskirrg") return BRZOZOWSKI_RRG;
-    if( algorithm == "glushkovrrg") return GLUSHKOV_RRG;
+        try
+        {
+            GrammarFactory::buildRightRegularGrammar( grammar );
+        }
+        catch( AlibException & e )
+        {
+            rr = false;
+        }
+        if( rr ) return RIGHT_REGULAR_GRAMMAR;
 
-    /* RG to FA */
-    if( algorithm == "rg" ) return RG_FA;
+        try
+        {
+            GrammarFactory::buildLeftRegularGrammar( grammar );
+        }
+        catch( AlibException & e )
+        {
+            lr = false;
+        }
+        if( lr ) return LEFT_REGULAR_GRAMMAR;
 
-    /* RG to RG */
-    if( algorithm == "rg" ) return LRG_RRG;
+        try
+        {
+            GrammarFactory::buildRightLinearGrammar( grammar );
+        }
+        catch( AlibException & e )
+        {
+            rl = false;
+        }
+        if( rl ) return RIGHT_LINEAR_GRAMMAR;
 
-    throw AlibException( "Invalid conversion. See help." );
-}
+        try
+        {
+            GrammarFactory::buildLeftLinearGrammar( grammar );
+        }
+        catch( AlibException & e )
+        {
+            ll = false;
+        }
+        if( ll ) return LEFT_LINEAR_GRAMMAR;
+    }
 
-ConversionHandler::TAlgorithm ConversionHandler::getDefaultAlgorithm( void ) const
-{
-    if( m_source == FINITE_AUTOMATA && m_target == REGULAR_EXPRESSION ) return STATE_ELIMINATION;
-    if( m_source == FINITE_AUTOMATA && m_target == REGULAR_GRAMMAR )    return FA_RRG;
-    if( m_source == REGULAR_EXPRESSION && m_target == FINITE_AUTOMATA ) return GLUSHKOV;
-    if( m_source == REGULAR_EXPRESSION && m_target == REGULAR_GRAMMAR ) return GLUSHKOV_RRG;
-    if( m_source == REGULAR_GRAMMAR && m_target == FINITE_AUTOMATA )    return RG_FA;
-    if( m_source == REGULAR_GRAMMAR && m_target == REGULAR_EXPRESSION ) return BRZOZOWSKI_ALGEBRAIC;
-    if( m_source == REGULAR_GRAMMAR && m_target == REGULAR_GRAMMAR )    return LRG_RRG;
-
-    throw AlibException( "ConversionHandler::getDefaultAlgorithm - unreachable code" );
+    throw AlibException( "ConversionHandler: Invalid input formalism." );
+    // return UNKNOWN;
 }
 
-bool ConversionHandler::checkAlgorithm( void ) const
+ConversionHandler::TAlgorithm ConversionHandler::parseAlgorithmFromString( const std::string & _algorithm ) const
 {
-    if( m_algorithm == DEFAULT ) return true;
+    string algorithm;
+    for( const auto & c : _algorithm )
+        algorithm.append( 1, tolower( c ) );
 
-    /* FA to RE */
-    /* FA to RG */
-    if( m_source == FINITE_AUTOMATA )
-        return ( m_target == REGULAR_EXPRESSION &&
-                    ( m_algorithm == BRZOZOWSKI_ALGEBRAIC || m_algorithm == STATE_ELIMINATION ) ) ||
-               ( m_target == REGULAR_GRAMMAR &&
-                    ( m_algorithm == FA_LRG || m_algorithm == FA_RRG ) );
-
-    /* RE to FA */
-    /* RE to RG */
-    if( m_source == REGULAR_EXPRESSION )
-        return ( m_target == FINITE_AUTOMATA &&
-                    ( m_algorithm == BRZOZOWSKI_DERIVATION || m_algorithm == GLUSHKOV || m_algorithm == THOMPSON ) ) ||
-               ( m_target == REGULAR_GRAMMAR &&
-                    ( m_algorithm == BRZOZOWSKI_RRG || m_algorithm == GLUSHKOV_RRG ) );
-
-    /* RG to FA */
-    /* RG to RE */
-    /* RG to RG */
-    if( m_source == REGULAR_GRAMMAR )
-        return ( m_target == FINITE_AUTOMATA &&
-                    ( m_algorithm == RG_FA ) ) ||
-               ( m_target == REGULAR_EXPRESSION &&
-                    ( m_algorithm == BRZOZOWSKI_ALGEBRAIC ) ) ||
-               ( m_target == REGULAR_GRAMMAR &&
-                    ( m_algorithm == LRG_RRG ) );
-
-    return false;
+    if( algorithm == "elimination" ) return STATE_ELIMINATION;
+    if( algorithm == "algebraic" ) return BRZOZOWSKI_ALGEBRAIC;
+    if( algorithm == "brzozowski" ) return BRZOZOWSKI_DERIVATION;
+    if( algorithm == "glushkov" ) return GLUSHKOV_NFA;
+    if( algorithm == "thompson" ) return THOMPSON_NFA;
+
+    if( algorithm == "" ) return DEFAULT;
+
+    throw AlibException( "ConversionHandler:: Invalid algorithm. See help." );
 }
 
 } /* namespace conversions */
diff --git a/aconversions/src/aconversion/ConversionHandler.h b/aconversions/src/aconversion/ConversionHandler.h
index 28f911930a29df642ce9e36823cdbe89aff6ec5f..0b273043a3d974f5873d3e6cf8d217ffdf8da40b 100644
--- a/aconversions/src/aconversion/ConversionHandler.h
+++ b/aconversions/src/aconversion/ConversionHandler.h
@@ -19,19 +19,26 @@
 
 #include "../fa2re/StateElimination.h"
 #include "../fa2re/BrzozowskiAlgebraic.h"
+
 #include "../re2fa/Glushkov.h"
 #include "../re2fa/Thompson.h"
 #include "../re2fa/Brzozowski.h"
+
 #include "../fa2rg/fa2lrg/FAtoLRGConverter.h"
 #include "../fa2rg/fa2rrg/FAtoRRGConverter.h"
-#include "../rg2fa/LRGtoFAConverter.h"
-#include "../rg2fa/RRGtoFAConverter.h"
-#include "../rg2re/RRGAlgebraic.h"
-#include "../rg2re/LRGAlgebraic.h"
-#include "../re2rg/re2rrg/BrzozowskiDerivationRRG.h"
-#include "../lrg2rrg/LeftToRightRegularGrammar.h"
-#include "../rrg2lrg/RightToLeftRegularGrammar.h"
+
+#include "../rg2fa/lrg2fa/LRGtoFAConverter.h"
+#include "../rg2fa/rrg2fa/RRGtoFAConverter.h"
+
+#include "../rg2re/rrg2re/RRGAlgebraic.h"
+#include "../rg2re/lrg2re/LRGAlgebraic.h"
+
 #include "../re2rg/re2rrg/GlushkovRRG.h"
+#include "../re2rg/re2rrg/BrzozowskiDerivationRRG.h"
+
+#include "../rg2rg/lrg2rrg/LeftToRightRegularGrammar.h"
+#include "../rg2rg/rrg2lrg/RightToLeftRegularGrammar.h"
+
 
 namespace conversions
 {
@@ -48,54 +55,86 @@ public:
         STATE_ELIMINATION,
 
         /* FA to RG */
-        FA_LRG,
-        FA_RRG,
+        // FA to LRG,
+        // FA to RRG
 
         /* RE to FA */
         BRZOZOWSKI_DERIVATION,
-        THOMPSON,
-        GLUSHKOV,
+        THOMPSON_NFA,
+        GLUSHKOV_NFA,
 
         /* RE to RG */
-        BRZOZOWSKI_RRG,
-        GLUSHKOV_RRG,
+
 
         /* RG to FA */
-        RG_FA,
+        // LRG to FSM
+        // RRG to FSM
 
         /* RG to RE */
-        // BRZOZOWSKI_ALGEBRAIC,
-        // STATE_ELIMINATION,
+        // BRZOZOWSKI_ALGEBRAIC
 
         /* RG to RG */
-        LRG_RRG,
+        // RRG to LRG
+        // LRG to RRG
+
     };
 
     enum TFormalism
     {
         FINITE_AUTOMATA,
+
         REGULAR_GRAMMAR,
+        LEFT_REGULAR_GRAMMAR,
+        RIGHT_REGULAR_GRAMMAR,
+
+        LINEAR_GRAMMAR,
+        LEFT_LINEAR_GRAMMAR,
+        RIGHT_LINEAR_GRAMMAR,
+
         REGULAR_EXPRESSION,
+
         UNKNOWN,
     };
+    #define isGrammar(x) ( (x) == REGULAR_GRAMMAR || (x) == LEFT_REGULAR_GRAMMAR || (x) == RIGHT_REGULAR_GRAMMAR \
+                        || (x) == LINEAR_GRAMMAR  || (x) == LEFT_LINEAR_GRAMMAR  || (x) == RIGHT_LINEAR_GRAMMAR )
 
-    ConversionHandler( std::list<sax::Token> & tokens, const std::string & target, const std::string & algorithm );
-    void convert( std::ostream & out );
+    ConversionHandler( std::list<sax::Token> & tokens, const std::string & target, const std::string & algorithm, std::ostream & out );
+    void convert( void );
 
 private:
-    TFormalism m_source, m_target;
-    TAlgorithm m_algorithm;
-    std::list<sax::Token> & m_tokens;
-
     TFormalism parseFormalismFromString( const std::string & _target ) const;
+    TFormalism parseFormalismFromTokens( void ) const;
     TAlgorithm parseAlgorithmFromString( const std::string & _algorithm ) const;
-    TAlgorithm getDefaultAlgorithm( void ) const;
-    void convertAutomata( std::ostream & out );
-    void convertGrammar( std::ostream & out );
-    void convertRegExp( std::ostream & out );
-    bool checkAlgorithm( void ) const;
 
+    void convertFSM( void );
+    void convertFSMtoRE( void );
+    void convertFSMtoRG( void );
+    void convertFSMtoLRG( void );
+    void convertFSMtoRRG( void );
+
+    void convertRE( void );
+    void convertREtoFSM( void );
+    void convertREtoRG( void );
+    void convertREtoRRG( void );
+
+    void convertRG( void );
 
+    void convertRGtoFSM( void );
+    void convertLRGtoFSM( void );
+    void convertRRGtoFSM( void );
+
+    void convertRGtoRE( void );
+    void convertLRGtoRE( void );
+    void convertRRGtoRE( void );
+
+    void convertRGtoRG( void );
+    void convertLRGtoRRG( void );
+    void convertRRGtoLRG( void );
+
+    std::list<sax::Token> & m_tokens;
+    TFormalism m_source, m_target;
+    TAlgorithm m_algorithm;
+    std::ostream & m_out;
 };
 
 } /* namespace conversions */
diff --git a/aconversions/src/aconversion/aconversion.cpp b/aconversions/src/aconversion/aconversion.cpp
index 6bcd97c276762bd66e6a9dfa277f273a84a285f8..efc38b7991040294c1e0c014c74d9d7608fd2d82 100644
--- a/aconversions/src/aconversion/aconversion.cpp
+++ b/aconversions/src/aconversion/aconversion.cpp
@@ -25,43 +25,61 @@ void help( void )
     cout << "aconversion 0.01" << endl;
     cout << "Converts between regular expressions, regular grammars and finite automata." << endl;
     cout << "Usage: aconversion -t FORMALISM [SWITCH...]" << endl << endl;
-    cout << "  -t, --target=FORMALISM \t Specifies target formalism, valid values are 'FA', 'FSM' or 'automaton' for finite automata, 'RE' or 'regexp' for regular expression and 'RG' or 'grammar' for regular grammar." << endl;
+    cout << "  -t, --target=FORMALISM \t Specifies target formalism. See --list-algorithms for available formalisms." << endl;
     cout << "  -a, --algorithm=ALGORITHM \t Specifies algorithm to use. See --list-algorithms." << endl;
-    cout << "  -l, --list-algorithms \t Lists algorithms to use." << endl;
+    cout << "  -l, --list-algorithms \t Lists available algorithms." << endl;
 
     cout << endl;
 }
 
 void list_algorithms( void )
 {
+    cout << "List of formalisms:" << endl;
+    cout << "\t For finite automata use 'automata', 'fsm' or 'fa'." << endl;
+    cout << "\t For regular expression use 'regexp', 're' or 'regex'." << endl;
+    cout << "\t For right regular grammar use 'rg', 'rrg' or 'grammar'." << endl;
+    cout << "\t For left regular grammar use 'lrg'." << endl;
+    cout << "This list is case-insensitive." << endl;
+
+    cout << endl;
+
     cout << "List of available algorithms:" << endl;
 
-    cout << " |" << endl;
-    cout << " +- FA to RE:" << endl;
-    cout << " | +- 'algebraic' - Converts to RE using Brzozowski algebraic method." << endl;
-    cout << " | +- 'elimination' [Default] - Performs state elimination algorithm on NFA." << endl;
+    cout << endl;
+    cout << "FA to RE:" << endl;
+    cout << "\t" << "'algebraic' - Uses Brzozowski algebraic method (regular equations)." << endl;
+    cout << "\t" << "'elimination' [Default] - Performs state elimination algorithm on NFA." << endl;
+
+    cout << endl;
+    cout << "FA to RRG:" << endl;
+    cout << "\t" << "[Default] - Converts to right regular grammar." << endl;
 
-    cout << " +- FA to RG:" << endl;
-    cout << " | +- 'left' - Converts to left regular grammar." << endl;
-    cout << " | +- 'right' [Default] - Converts to right regular grammar." << endl;
+    cout << endl;
+    cout << "FA to LRG:" << endl;
+    cout << "\t" << "[Default] - Converts to left regular grammar." << endl;
 
-    cout << " +- RE to FA:" << endl;
-    cout << " | +- 'brzozowski' - Converts to finite automata using Brzozowski's Derivation method." << endl;
-    cout << " | +- 'thompson' - Converts to finite automata using Thompson's NFA Construction algorithm." << endl;
-    cout << " | +- 'glushkov' [Default] - Converts to finite automata using Gluskov's NFA algorithm." << endl;
+    cout << endl;
+    cout << "RE to FA:" << endl;
+    cout << "\t" << "'brzozowski' - Uses Brzozowski's derivation method (WARNING: May get stuck in infinite loop)." << endl;
+    cout << "\t" << "'thompson' - Converts to finite automata using Thompson's NFA Construction algorithm." << endl;
+    cout << "\t" << "'glushkov' [Default] - Converts to finite automata using Gluskov's NFA algorithm." << endl;
 
-    cout << " +- RE to RG:" << endl;
-    cout << " | +- 'brzozowskirrg' - Converts to right regular grammar using Brzozowski's Derivation Method." << endl;
-    cout << " | +- 'glushkovrrg' [Default] - Converts to right regular grammar using Glushkov's algorithm." << endl;
+    cout << endl;
+    cout << "RE to RRG:" << endl;
+    cout << "\t" << "'brzozowski' - Uses Brzozowski's derivation method (WARNING: May get stuck in infinite loop)." << endl;
+    cout << "\t" << "'glushkov' [Default] - Converts to finite automata using Gluskov's NFA algorithm." << endl;
 
-    cout << " +- RG to FA:" << endl;
-    cout << " | +- 'rg' [Default] - Converts right or left regular grammar to finite automata." << endl;
+    cout << endl;
+    cout << "RG to FA:" << endl;
+    cout << "\t" << "[Default] - Converts right or left regular grammar to finite automata." << endl;
 
-    cout << " +- RG to RE:" << endl;
-    cout << " | +- 'algebraic' [Default] - Converts left or right regular grammar to regexp using Brzozowski's Algebraic method." << endl;
+    cout << endl;
+    cout << "RG to RE:" << endl;
+    cout << "\t" << "'algebraic' [Default] - Uses Brzozowski algebraic method (regular equations)." << endl;
 
-    cout << " +- (L/R)RG to (R/L)RG:" << endl;
-    cout << " | +- 'rg' [Default] - Converts right to left regular grammar or vice versa." << endl;
+    cout << endl;
+    cout << "RG to RG:" << endl;
+    cout << "\t" << "[Default] - Converts right to left regular grammar or vice versa." << endl;
 }
 
 int main(int argc, char* argv[])
@@ -105,8 +123,8 @@ int main(int argc, char* argv[])
 
   try
   {
-      ConversionHandler conv( tokens, target, algorithm );
-      conv.convert( cout );
+      ConversionHandler conv( tokens, target, algorithm, cout );
+      conv.convert( );
   }
   catch( AlibException & e )
   {
diff --git a/aconversions/src/fa2re/AbstractFAtoREConverter.h b/aconversions/src/fa2re/AbstractFAtoREConverter.h
index 0dee38f1d39f5e318bcbe93e83c9dead556bb3ee..e541a9c4b616cf354a9859aef90a71ccb614ca8e 100644
--- a/aconversions/src/fa2re/AbstractFAtoREConverter.h
+++ b/aconversions/src/fa2re/AbstractFAtoREConverter.h
@@ -20,7 +20,7 @@ public:
 protected:
     AbstractFAtoREConverter( const automaton::FSM & automaton );
 
-    const automaton::FSM & m_automaton;
+    const automaton::FSM m_automaton;
     regexp::RegExp m_re;
 };
 
diff --git a/aconversions/src/fa2rg/AbstractFAtoRGConverter.h b/aconversions/src/fa2rg/AbstractFAtoRGConverter.h
index 796e1fa84cfcc50a260fba08ceb52d6bc23d9fbd..0c0dd826da38209a04b968bafa518f6409562bad 100644
--- a/aconversions/src/fa2rg/AbstractFAtoRGConverter.h
+++ b/aconversions/src/fa2rg/AbstractFAtoRGConverter.h
@@ -25,7 +25,7 @@ public:
     ~AbstractFAtoRGConverter( void );
 
 protected:
-    const automaton::FSM & m_fsm;
+    const automaton::FSM m_fsm;
 };
 
 } /* namespace conversions */
diff --git a/aconversions/src/re2fa/AbstractREtoFAConverter.h b/aconversions/src/re2fa/AbstractREtoFAConverter.h
index e7fd3b85242f2ed5d8bd7bc72da692975fb46742..7d348a0981b03d2693e6f75c2d14c78f7d26cdca 100644
--- a/aconversions/src/re2fa/AbstractREtoFAConverter.h
+++ b/aconversions/src/re2fa/AbstractREtoFAConverter.h
@@ -21,7 +21,7 @@ public:
 protected:
     AbstractREtoFAConverter(const regexp::RegExp & re );
 
-    const regexp::RegExp & m_re;
+    const regexp::RegExp m_re;
     automaton::FSM m_fsm;
 };
 
diff --git a/aconversions/src/re2fa/Glushkov.cpp b/aconversions/src/re2fa/Glushkov.cpp
index ccf00c4b0d2893398e9d54d50d8a2781c7c75593..98fa8e88eafa4aed3cbabba49ef1a26b6a5f4c00 100644
--- a/aconversions/src/re2fa/Glushkov.cpp
+++ b/aconversions/src/re2fa/Glushkov.cpp
@@ -105,7 +105,8 @@ bool Glushkov::NumberedSymbol::operator<( const NumberedSymbol & x ) const
 Glushkov::NumberedSymbol::NumberedSymbol( const RegExpSymbol * symbol, int i ) :
         m_i( i ),
         m_alphabetSymbol( symbol->getSymbol( ) ),
-        m_state( State( "[" + m_alphabetSymbol.getSymbol( ) + "], id " + to_string( m_i ) ) )
+        //m_state( State( "[" + m_alphabetSymbol.getSymbol( ) + "], id " + to_string( m_i ) ) )
+        m_state( State( to_string( m_i ) ) )
 {
 
 }
diff --git a/aconversions/src/re2rg/AbstractREtoRGConverter.h b/aconversions/src/re2rg/AbstractREtoRGConverter.h
index e3a54c2a533d041cc9fdbe6bdd1beaf1f2aaac05..a97b41cce5df8031d37abab633981f9f933d1207 100644
--- a/aconversions/src/re2rg/AbstractREtoRGConverter.h
+++ b/aconversions/src/re2rg/AbstractREtoRGConverter.h
@@ -24,7 +24,7 @@ public:
 protected:
     AbstractREtoRGConverter( const regexp::RegExp & re );
 
-    const regexp::RegExp & m_re;
+    const regexp::RegExp m_re;
 };
 
 } /* namespace conversions */
diff --git a/aconversions/src/re2rg/re2rrg/GlushkovRRG.cpp b/aconversions/src/re2rg/re2rrg/GlushkovRRG.cpp
index 0fb53d9938b96d3f23ed1d0aedf8b88ad686ab67..4416d1fcb63c7107721d7938be4dc5c76583550f 100644
--- a/aconversions/src/re2rg/re2rrg/GlushkovRRG.cpp
+++ b/aconversions/src/re2rg/re2rrg/GlushkovRRG.cpp
@@ -29,11 +29,11 @@ GlushkovRRG::~GlushkovRRG( void )
 RightRegularGrammar GlushkovRRG::convert( void )
 {
     // step 1
-    initNumberSymbols( );
-
     for( const auto & symbol : RegExpAlphabet::getSymbols( m_re ) )
         m_grammar.addTerminalSymbol( symbol.getSymbol( ) );
 
+    initNumberSymbols( );
+
     // steps 2, 3, 4
     constructBeginSymbolSet( );
     constructEndSymbolSet( );
@@ -136,7 +136,8 @@ bool GlushkovRRG::NumberedSymbol::operator<( const NumberedSymbol & x ) const
 GlushkovRRG::NumberedSymbol::NumberedSymbol( const RegExpSymbol * symbol, grammar::RightRegularGrammar & g, int i ) :
         m_i( i ),
         m_alphabetSymbol( symbol->getSymbol( ) ),
-        m_nonTerminal( g.createUniqueNonTerminalSymbol( "["     + m_alphabetSymbol.getSymbol( ) + "], id " + to_string( m_i ), false ) )
+        // m_nonTerminal( g.createUniqueNonTerminalSymbol( "["     + m_alphabetSymbol.getSymbol( ) + "], id " + to_string( m_i ), false ) )
+        m_nonTerminal( g.createUniqueNonTerminalSymbol( to_string( m_i ), false ) )
 {
 
 }
diff --git a/aconversions/src/rg2fa/AbstractRGtoFAConverter.cpp b/aconversions/src/rg2fa/AbstractRGtoFAConverter.cpp
index a6b56bdd8a5c1c9c195d6ce331c8cf9eb53f93fd..c7439b614ea9ffce7cc6765f2dc23f2641dc9011 100644
--- a/aconversions/src/rg2fa/AbstractRGtoFAConverter.cpp
+++ b/aconversions/src/rg2fa/AbstractRGtoFAConverter.cpp
@@ -1,13 +1,9 @@
 #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 )
 {
 
 }
@@ -17,16 +13,4 @@ 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/rg2fa/AbstractRGtoFAConverter.h b/aconversions/src/rg2fa/AbstractRGtoFAConverter.h
index 8555e31f75a7b4c07342fd4990e8fbb66e98ff63..226fff1e31f242660d3493d7f4186ce77daf449f 100644
--- a/aconversions/src/rg2fa/AbstractRGtoFAConverter.h
+++ b/aconversions/src/rg2fa/AbstractRGtoFAConverter.h
@@ -2,8 +2,6 @@
 #define __ABSTRACTRGTOFACONVERTER_H__
 
 #include <automaton/FSM/FSM.h>
-#include <grammar/Regular/RegularGrammar.h>
-
 #include <AlibException.h>
 
 #include "../include/macros.h"
@@ -19,11 +17,8 @@ public:
     virtual ~AbstractRGtoFAConverter( void );
 
 protected:
-    AbstractRGtoFAConverter( const grammar::RegularGrammar& grammar );
-    void createStates( void );
-    void createInputAlphabet( void );
+    AbstractRGtoFAConverter( void );
 
-    const grammar::RegularGrammar& m_grammar;
     automaton::FSM m_automaton;
 };
 
diff --git a/aconversions/src/rg2fa/lrg2fa/AbstractLRGtoFAConverter.cpp b/aconversions/src/rg2fa/lrg2fa/AbstractLRGtoFAConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3fe26c9770e867ad7d3c7714064c194c7c3b428e
--- /dev/null
+++ b/aconversions/src/rg2fa/lrg2fa/AbstractLRGtoFAConverter.cpp
@@ -0,0 +1,25 @@
+/*
+ * AbstractLRGtoFAConverter.cpp
+ *
+ *  Created on: 16. 3. 2014
+ *      Author: tomas
+ */
+
+#include "AbstractLRGtoFAConverter.h"
+
+using namespace grammar;
+
+namespace conversions
+{
+
+AbstractLRGtoFAConverter::AbstractLRGtoFAConverter( const LeftRegularGrammar & lrg ) : m_grammar( lrg )
+{
+
+}
+
+AbstractLRGtoFAConverter::~AbstractLRGtoFAConverter( void )
+{
+
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/rg2fa/lrg2fa/AbstractLRGtoFAConverter.h b/aconversions/src/rg2fa/lrg2fa/AbstractLRGtoFAConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..e88a28f5e1593aeb3ad003f0524dcc7d33b7b0bf
--- /dev/null
+++ b/aconversions/src/rg2fa/lrg2fa/AbstractLRGtoFAConverter.h
@@ -0,0 +1,31 @@
+/*
+ * AbstractLRGtoFAConverter.h
+ *
+ *  Created on: 16. 3. 2014
+ *      Author: tomas
+ */
+
+#ifndef ABSTRACTLRGTOFACONVERTER_H_
+#define ABSTRACTLRGTOFACONVERTER_H_
+
+#include <grammar/Regular/LeftRegularGrammar.h>
+
+#include "../AbstractRGtoFAConverter.h"
+
+namespace conversions
+{
+
+class AbstractLRGtoFAConverter: public AbstractRGtoFAConverter
+{
+public:
+    ~AbstractLRGtoFAConverter( void );
+
+protected:
+    AbstractLRGtoFAConverter( const grammar::LeftRegularGrammar & lrg );
+    const grammar::LeftRegularGrammar m_grammar;
+
+};
+
+} /* namespace conversions */
+
+#endif /* ABSTRACTLRGTOFACONVERTER_H_ */
diff --git a/aconversions/src/rg2fa/LRGtoFAConverter.cpp b/aconversions/src/rg2fa/lrg2fa/LRGtoFAConverter.cpp
similarity index 84%
rename from aconversions/src/rg2fa/LRGtoFAConverter.cpp
rename to aconversions/src/rg2fa/lrg2fa/LRGtoFAConverter.cpp
index fdea21b7a2aea75fffae7c475898b165bdb33d53..53d0c68b11dac2e3fc70d8f54623392629bc407d 100644
--- a/aconversions/src/rg2fa/LRGtoFAConverter.cpp
+++ b/aconversions/src/rg2fa/lrg2fa/LRGtoFAConverter.cpp
@@ -7,7 +7,7 @@ using namespace grammar;
 namespace conversions
 {
 
-LRGtoFAConverter::LRGtoFAConverter( const LeftRegularGrammar & grammar ) : AbstractRGtoFAConverter( grammar )
+LRGtoFAConverter::LRGtoFAConverter( const LeftRegularGrammar & grammar ) : AbstractLRGtoFAConverter( grammar )
 {
     //TODO: if is not LRG throw Exception
 }
@@ -19,8 +19,11 @@ LRGtoFAConverter::~LRGtoFAConverter( void )
 
 FSM LRGtoFAConverter::convert( void )
 {
-    createInputAlphabet( );
-    createStates( );
+    for( const auto & symbol : m_grammar.getTerminalSymbols( ) )
+        m_automaton.addInputSymbol( symbol );
+
+    for( const auto & symbol : m_grammar.getNonTerminalSymbols( ) )
+        m_automaton.addState( State( symbol.getSymbol( ) ) );
 
     const State & startState = m_automaton.createUniqueState( "q0", true );
 
diff --git a/aconversions/src/rg2fa/LRGtoFAConverter.h b/aconversions/src/rg2fa/lrg2fa/LRGtoFAConverter.h
similarity index 63%
rename from aconversions/src/rg2fa/LRGtoFAConverter.h
rename to aconversions/src/rg2fa/lrg2fa/LRGtoFAConverter.h
index f0f9a39b9e687f49f0c3c09b2bc6eb60ae1ea532..f36e9df91808cff28a6038c587dcfa56102a2ad8 100644
--- a/aconversions/src/rg2fa/LRGtoFAConverter.h
+++ b/aconversions/src/rg2fa/lrg2fa/LRGtoFAConverter.h
@@ -1,15 +1,12 @@
 #ifndef __LRGTOFACONVERTER_H__
 #define __LRGTOFACONVERTER_H__
 
-#include <automaton/FSM/FSM.h>
-#include <grammar/Regular/LeftRegularGrammar.h>
-
-#include "AbstractRGtoFAConverter.h"
+#include "AbstractLRGtoFAConverter.h"
 
 namespace conversions
 {
 
-class LRGtoFAConverter : public AbstractRGtoFAConverter
+class LRGtoFAConverter : public AbstractLRGtoFAConverter
 {
 public:
     LRGtoFAConverter( const grammar::LeftRegularGrammar & grammar );
diff --git a/aconversions/src/rg2fa/rrg2fa/AbstractRRGtoFAConverter.cpp b/aconversions/src/rg2fa/rrg2fa/AbstractRRGtoFAConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..c67474eb5058a25a39d01358416d8104ea02621f
--- /dev/null
+++ b/aconversions/src/rg2fa/rrg2fa/AbstractRRGtoFAConverter.cpp
@@ -0,0 +1,25 @@
+/*
+ * AbstractRRGtoFAConverter.cpp
+ *
+ *  Created on: 16. 3. 2014
+ *      Author: tomas
+ */
+
+#include "AbstractRRGtoFAConverter.h"
+
+using namespace grammar;
+
+namespace conversions
+{
+
+AbstractRRGtoFAConverter::AbstractRRGtoFAConverter( const RightRegularGrammar & rrg ) : m_grammar( rrg )
+{
+
+}
+
+AbstractRRGtoFAConverter::~AbstractRRGtoFAConverter()
+{
+
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/rg2fa/rrg2fa/AbstractRRGtoFAConverter.h b/aconversions/src/rg2fa/rrg2fa/AbstractRRGtoFAConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..54347239fa655d8f02c10d88531dd9cded66e554
--- /dev/null
+++ b/aconversions/src/rg2fa/rrg2fa/AbstractRRGtoFAConverter.h
@@ -0,0 +1,30 @@
+/*
+ * AbstractRRGtoFAConverter.h
+ *
+ *  Created on: 16. 3. 2014
+ *      Author: tomas
+ */
+
+#ifndef ABSTRACTRRGTOFACONVERTER_H_
+#define ABSTRACTRRGTOFACONVERTER_H_
+
+#include <grammar/Regular/RightRegularGrammar.h>
+
+#include "../AbstractRGtoFAConverter.h"
+
+namespace conversions
+{
+
+class AbstractRRGtoFAConverter: public conversions::AbstractRGtoFAConverter
+{
+public:
+    virtual ~AbstractRRGtoFAConverter( void );
+
+protected:
+    AbstractRRGtoFAConverter( const grammar::RightRegularGrammar & rrg );
+    const grammar::RightRegularGrammar m_grammar;
+};
+
+} /* namespace conversions */
+
+#endif /* ABSTRACTRRGTOFACONVERTER_H_ */
diff --git a/aconversions/src/rg2fa/RRGtoFAConverter.cpp b/aconversions/src/rg2fa/rrg2fa/RRGtoFAConverter.cpp
similarity index 84%
rename from aconversions/src/rg2fa/RRGtoFAConverter.cpp
rename to aconversions/src/rg2fa/rrg2fa/RRGtoFAConverter.cpp
index ffe18ba402d300560510bf6419b36030e07eac49..9788b5f3e7fc47189c31e6f84dcd60319113c9e7 100644
--- a/aconversions/src/rg2fa/RRGtoFAConverter.cpp
+++ b/aconversions/src/rg2fa/rrg2fa/RRGtoFAConverter.cpp
@@ -7,7 +7,7 @@ using namespace grammar;
 namespace conversions
 {
 
-RRGtoFAConverter::RRGtoFAConverter( const RightRegularGrammar & grammar ) : AbstractRGtoFAConverter( grammar )
+RRGtoFAConverter::RRGtoFAConverter( const RightRegularGrammar & grammar ) : AbstractRRGtoFAConverter( grammar )
 {
     //TODO: if is not RRG throw Exception
 }
@@ -20,8 +20,11 @@ RRGtoFAConverter::~RRGtoFAConverter( void )
 
 FSM RRGtoFAConverter::convert( void )
 {
-    createInputAlphabet( );
-    createStates( );
+    for( const auto & symbol : m_grammar.getTerminalSymbols( ) )
+        m_automaton.addInputSymbol( symbol );
+
+    for( const auto & symbol : m_grammar.getNonTerminalSymbols( ) )
+        m_automaton.addState( State( symbol.getSymbol( ) ) );
 
     const State & AState = m_automaton.createUniqueState( "A", true );
 
diff --git a/aconversions/src/rg2fa/RRGtoFAConverter.h b/aconversions/src/rg2fa/rrg2fa/RRGtoFAConverter.h
similarity index 63%
rename from aconversions/src/rg2fa/RRGtoFAConverter.h
rename to aconversions/src/rg2fa/rrg2fa/RRGtoFAConverter.h
index f8230cbe839f34a00dc337abb60620e70def06db..32d5117e134ed8990c88d3d4a16982f63f0226da 100644
--- a/aconversions/src/rg2fa/RRGtoFAConverter.h
+++ b/aconversions/src/rg2fa/rrg2fa/RRGtoFAConverter.h
@@ -1,15 +1,12 @@
 #ifndef __RRGTOFACONVERTER_H__
 #define __RRGTOFACONVERTER_H__
 
-#include <grammar/Regular/RightRegularGrammar.h>
-#include <automaton/FSM/FSM.h>
-
-#include "AbstractRGtoFAConverter.h"
+#include "AbstractRRGtoFAConverter.h"
 
 namespace conversions
 {
 
-class RRGtoFAConverter : public AbstractRGtoFAConverter
+class RRGtoFAConverter : public AbstractRRGtoFAConverter
 {
 public:
     RRGtoFAConverter( const grammar::RightRegularGrammar & grammar );
diff --git a/aconversions/src/rg2re/AbstractRGtoREConverter.cpp b/aconversions/src/rg2re/AbstractRGtoREConverter.cpp
index 95fb644460a43cbb7ffa6f820411f0b2cf6717e8..60bae347d1021ee6066a20e4afb6eca2dd8f8a15 100644
--- a/aconversions/src/rg2re/AbstractRGtoREConverter.cpp
+++ b/aconversions/src/rg2re/AbstractRGtoREConverter.cpp
@@ -7,12 +7,10 @@
 
 #include "AbstractRGtoREConverter.h"
 
-using namespace grammar;
-
 namespace conversions
 {
 
-AbstractRGtoREConverter::AbstractRGtoREConverter( const RegularGrammar & grammar ) : m_grammar( grammar )
+AbstractRGtoREConverter::AbstractRGtoREConverter( void )
 {
 
 }
diff --git a/aconversions/src/rg2re/AbstractRGtoREConverter.h b/aconversions/src/rg2re/AbstractRGtoREConverter.h
index 7eda2748b1f772c9565264b9f3fb5ffcb3cf320f..a333f37ae2e16844d6181c96485a9ddd366fd3ce 100644
--- a/aconversions/src/rg2re/AbstractRGtoREConverter.h
+++ b/aconversions/src/rg2re/AbstractRGtoREConverter.h
@@ -8,7 +8,6 @@
 #ifndef ABSTRACTRGTORECONVERTER_H_
 #define ABSTRACTRGTORECONVERTER_H_
 
-#include <grammar/Regular/RegularGrammar.h>
 #include <regexp/RegExp.h>
 
 #include "../abstract/Conversion.h"
@@ -23,9 +22,8 @@ public:
     virtual ~AbstractRGtoREConverter( void );
 
 protected:
-    AbstractRGtoREConverter( const grammar::RegularGrammar& grammar );
+    AbstractRGtoREConverter( void );
 
-    const grammar::RegularGrammar& m_grammar;
     regexp::RegExp m_re;
 };
 
diff --git a/aconversions/src/rg2re/lrg2re/AbstractLRGtoREConverter.cpp b/aconversions/src/rg2re/lrg2re/AbstractLRGtoREConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..10e34c2d20eda3f79c716f373a143bf4358660ff
--- /dev/null
+++ b/aconversions/src/rg2re/lrg2re/AbstractLRGtoREConverter.cpp
@@ -0,0 +1,25 @@
+/*
+ * AbstractLRGtoREConverter.cpp
+ *
+ *  Created on: 16. 3. 2014
+ *      Author: tomas
+ */
+
+#include "AbstractLRGtoREConverter.h"
+
+using namespace grammar;
+
+namespace conversions
+{
+
+AbstractLRGtoREConverter::AbstractLRGtoREConverter( const LeftRegularGrammar & lrg ) : m_grammar( lrg )
+{
+
+}
+
+AbstractLRGtoREConverter::~AbstractLRGtoREConverter( void )
+{
+
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/rg2re/lrg2re/AbstractLRGtoREConverter.h b/aconversions/src/rg2re/lrg2re/AbstractLRGtoREConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..f6d406336b86eb6e5374e4b1da896b08dddb8add
--- /dev/null
+++ b/aconversions/src/rg2re/lrg2re/AbstractLRGtoREConverter.h
@@ -0,0 +1,30 @@
+/*
+ * AbstractLRGtoREConverter.h
+ *
+ *  Created on: 16. 3. 2014
+ *      Author: tomas
+ */
+
+#ifndef ABSTRACTLRGTORECONVERTER_H_
+#define ABSTRACTLRGTORECONVERTER_H_
+
+#include <grammar/Regular/LeftRegularGrammar.h>
+
+#include "../AbstractRGtoREConverter.h"
+
+namespace conversions
+{
+
+class AbstractLRGtoREConverter: public AbstractRGtoREConverter
+{
+public:
+    virtual ~AbstractLRGtoREConverter( void );
+
+protected:
+    AbstractLRGtoREConverter( const grammar::LeftRegularGrammar & lrg );
+    const grammar::LeftRegularGrammar m_grammar;
+};
+
+} /* namespace conversions */
+
+#endif /* ABSTRACTLRGTORECONVERTER_H_ */
diff --git a/aconversions/src/rg2re/LRGAlgebraic.cpp b/aconversions/src/rg2re/lrg2re/LRGAlgebraic.cpp
similarity index 97%
rename from aconversions/src/rg2re/LRGAlgebraic.cpp
rename to aconversions/src/rg2re/lrg2re/LRGAlgebraic.cpp
index 909a47320af903155549af01def8b134af181fe4..deb33731f0cf1fcdc59ab89e85bba7951562c887 100644
--- a/aconversions/src/rg2re/LRGAlgebraic.cpp
+++ b/aconversions/src/rg2re/lrg2re/LRGAlgebraic.cpp
@@ -14,7 +14,7 @@ using namespace regexp;
 namespace conversions
 {
 
-LRGAlgebraic::LRGAlgebraic( const LeftRegularGrammar & rg ) : AbstractRGtoREConverter( rg )
+LRGAlgebraic::LRGAlgebraic( const LeftRegularGrammar & rg ) : AbstractLRGtoREConverter( rg )
 {
 
 }
diff --git a/aconversions/src/rg2re/LRGAlgebraic.h b/aconversions/src/rg2re/lrg2re/LRGAlgebraic.h
similarity index 64%
rename from aconversions/src/rg2re/LRGAlgebraic.h
rename to aconversions/src/rg2re/lrg2re/LRGAlgebraic.h
index e1cec275f6373127262f93d59cd6229c5dc7eddf..e0abf34ada5a77b763fd7fd90aed6e1d0fa8ff57 100644
--- a/aconversions/src/rg2re/LRGAlgebraic.h
+++ b/aconversions/src/rg2re/lrg2re/LRGAlgebraic.h
@@ -8,16 +8,13 @@
 #ifndef LRGALGEBRAIC_H_
 #define LRGALGEBRAIC_H_
 
-#include <grammar/Regular/LeftRegularGrammar.h>
-#include <regexp/RegExp.h>
-
-#include "../shared/equations/LeftRegularEquationSolver.h"
-#include "AbstractRGtoREConverter.h"
+#include "../../shared/equations/LeftRegularEquationSolver.h"
+#include "AbstractLRGtoREConverter.h"
 
 namespace conversions
 {
 
-class LRGAlgebraic: public AbstractRGtoREConverter
+class LRGAlgebraic: public AbstractLRGtoREConverter
 {
 public:
     LRGAlgebraic( const grammar::LeftRegularGrammar & rg );
diff --git a/aconversions/src/rg2re/rrg2re/AbstractRRGtoREConverter.cpp b/aconversions/src/rg2re/rrg2re/AbstractRRGtoREConverter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..0a3c41ad1041a5f3772ccdc1e2f0623ff51cf325
--- /dev/null
+++ b/aconversions/src/rg2re/rrg2re/AbstractRRGtoREConverter.cpp
@@ -0,0 +1,25 @@
+/*
+ * AbstractRRGtoREConverter.cpp
+ *
+ *  Created on: 16. 3. 2014
+ *      Author: tomas
+ */
+
+#include "AbstractRRGtoREConverter.h"
+
+using namespace grammar;
+
+namespace conversions
+{
+
+AbstractRRGtoREConverter::AbstractRRGtoREConverter( const RightRegularGrammar & rrg ) : m_grammar( rrg )
+{
+
+}
+
+AbstractRRGtoREConverter::~AbstractRRGtoREConverter( void )
+{
+
+}
+
+} /* namespace conversions */
diff --git a/aconversions/src/rg2re/rrg2re/AbstractRRGtoREConverter.h b/aconversions/src/rg2re/rrg2re/AbstractRRGtoREConverter.h
new file mode 100644
index 0000000000000000000000000000000000000000..83de063ecdaaea294493887c225807247a06148d
--- /dev/null
+++ b/aconversions/src/rg2re/rrg2re/AbstractRRGtoREConverter.h
@@ -0,0 +1,31 @@
+/*
+ * AbstractRRGtoREConverter.h
+ *
+ *  Created on: 16. 3. 2014
+ *      Author: tomas
+ */
+
+#ifndef ABSTRACTRRGTORECONVERTER_H_
+#define ABSTRACTRRGTORECONVERTER_H_
+
+#include <grammar/Regular/RightRegularGrammar.h>
+
+#include "../AbstractRGtoREConverter.h"
+
+namespace conversions
+{
+
+class AbstractRRGtoREConverter: public AbstractRGtoREConverter
+{
+public:
+    virtual ~AbstractRRGtoREConverter( void );
+
+protected:
+    AbstractRRGtoREConverter( const grammar::RightRegularGrammar & rrg );
+
+    const grammar::RightRegularGrammar m_grammar;
+};
+
+} /* namespace conversions */
+
+#endif /* ABSTRACTRRGTORECONVERTER_H_ */
diff --git a/aconversions/src/rg2re/RRGAlgebraic.cpp b/aconversions/src/rg2re/rrg2re/RRGAlgebraic.cpp
similarity index 97%
rename from aconversions/src/rg2re/RRGAlgebraic.cpp
rename to aconversions/src/rg2re/rrg2re/RRGAlgebraic.cpp
index d0f7cbdf4fc328eaa3d1821f623b610cabbdb91b..87a2b7a2d543853b9b4b37353ddba0e208abf7cf 100644
--- a/aconversions/src/rg2re/RRGAlgebraic.cpp
+++ b/aconversions/src/rg2re/rrg2re/RRGAlgebraic.cpp
@@ -14,7 +14,7 @@ using namespace regexp;
 namespace conversions
 {
 
-RRGAlgebraic::RRGAlgebraic( const RightRegularGrammar & rg ) : AbstractRGtoREConverter( rg )
+RRGAlgebraic::RRGAlgebraic( const RightRegularGrammar & rg ) : AbstractRRGtoREConverter( rg )
 {
 
 }
diff --git a/aconversions/src/rg2re/RRGAlgebraic.h b/aconversions/src/rg2re/rrg2re/RRGAlgebraic.h
similarity index 64%
rename from aconversions/src/rg2re/RRGAlgebraic.h
rename to aconversions/src/rg2re/rrg2re/RRGAlgebraic.h
index b1f59bba91ca9da5074fb557e8a0a9a44cc0a1ce..85b907effbd71e9f2f4c0f52f1e1d75d1ff7f1b3 100644
--- a/aconversions/src/rg2re/RRGAlgebraic.h
+++ b/aconversions/src/rg2re/rrg2re/RRGAlgebraic.h
@@ -8,16 +8,13 @@
 #ifndef RRGALGEBRAIC_H_
 #define RRGALGEBRAIC_H_
 
-#include <grammar/Regular/RightRegularGrammar.h>
-#include <regexp/RegExp.h>
-
-#include "../shared/equations/RightRegularEquationSolver.h"
-#include "AbstractRGtoREConverter.h"
+#include "../../shared/equations/RightRegularEquationSolver.h"
+#include "AbstractRRGtoREConverter.h"
 
 namespace conversions
 {
 
-class RRGAlgebraic: public AbstractRGtoREConverter
+class RRGAlgebraic: public AbstractRRGtoREConverter
 {
 public:
     RRGAlgebraic( const grammar::RightRegularGrammar & rg );
diff --git a/aconversions/src/lrg2rrg/AbstractLRGtoRRGConverter.cpp b/aconversions/src/rg2rg/lrg2rrg/AbstractLRGtoRRGConverter.cpp
similarity index 100%
rename from aconversions/src/lrg2rrg/AbstractLRGtoRRGConverter.cpp
rename to aconversions/src/rg2rg/lrg2rrg/AbstractLRGtoRRGConverter.cpp
diff --git a/aconversions/src/lrg2rrg/AbstractLRGtoRRGConverter.h b/aconversions/src/rg2rg/lrg2rrg/AbstractLRGtoRRGConverter.h
similarity index 88%
rename from aconversions/src/lrg2rrg/AbstractLRGtoRRGConverter.h
rename to aconversions/src/rg2rg/lrg2rrg/AbstractLRGtoRRGConverter.h
index eedc24309a9a2d87be797d47a8185d82e60921ae..637f25bedc1a3f8016becb872f015442be642782 100644
--- a/aconversions/src/lrg2rrg/AbstractLRGtoRRGConverter.h
+++ b/aconversions/src/rg2rg/lrg2rrg/AbstractLRGtoRRGConverter.h
@@ -11,7 +11,7 @@
 #include <grammar/Regular/LeftRegularGrammar.h>
 #include <grammar/Regular/RightRegularGrammar.h>
 
-#include "../abstract/Conversion.h"
+#include "../../abstract/Conversion.h"
 
 namespace conversions
 {
@@ -25,7 +25,7 @@ public:
 protected:
     AbstractLRGtoRRGConverter( const grammar::LeftRegularGrammar & lrg );
 
-    const grammar::LeftRegularGrammar & m_lrg;
+    const grammar::LeftRegularGrammar m_lrg;
     grammar::RightRegularGrammar m_rrg;
 };
 
diff --git a/aconversions/src/lrg2rrg/LeftToRightRegularGrammar.cpp b/aconversions/src/rg2rg/lrg2rrg/LeftToRightRegularGrammar.cpp
similarity index 100%
rename from aconversions/src/lrg2rrg/LeftToRightRegularGrammar.cpp
rename to aconversions/src/rg2rg/lrg2rrg/LeftToRightRegularGrammar.cpp
diff --git a/aconversions/src/lrg2rrg/LeftToRightRegularGrammar.h b/aconversions/src/rg2rg/lrg2rrg/LeftToRightRegularGrammar.h
similarity index 100%
rename from aconversions/src/lrg2rrg/LeftToRightRegularGrammar.h
rename to aconversions/src/rg2rg/lrg2rrg/LeftToRightRegularGrammar.h
diff --git a/aconversions/src/rrg2lrg/AbstractRRGtoLRGConverter.cpp b/aconversions/src/rg2rg/rrg2lrg/AbstractRRGtoLRGConverter.cpp
similarity index 100%
rename from aconversions/src/rrg2lrg/AbstractRRGtoLRGConverter.cpp
rename to aconversions/src/rg2rg/rrg2lrg/AbstractRRGtoLRGConverter.cpp
diff --git a/aconversions/src/rrg2lrg/AbstractRRGtoLRGConverter.h b/aconversions/src/rg2rg/rrg2lrg/AbstractRRGtoLRGConverter.h
similarity index 88%
rename from aconversions/src/rrg2lrg/AbstractRRGtoLRGConverter.h
rename to aconversions/src/rg2rg/rrg2lrg/AbstractRRGtoLRGConverter.h
index 54aa96b4483e7d3590797258da1cc35fb3683150..0c2cca11c2cf1c7ef3f5fcdfdcd3c182a98903a0 100644
--- a/aconversions/src/rrg2lrg/AbstractRRGtoLRGConverter.h
+++ b/aconversions/src/rg2rg/rrg2lrg/AbstractRRGtoLRGConverter.h
@@ -8,7 +8,7 @@
 #ifndef ABSTRACTRRGTOLRGCONVERTER_H_
 #define ABSTRACTRRGTOLRGCONVERTER_H_
 
-#include "../abstract/Conversion.h"
+#include "../../abstract/Conversion.h"
 
 #include <grammar/Regular/LeftRegularGrammar.h>
 #include <grammar/Regular/RightRegularGrammar.h>
@@ -24,7 +24,7 @@ public:
     virtual grammar::LeftRegularGrammar convert( void ) = 0;
 
 protected:
-    const grammar::RightRegularGrammar & m_rrg;
+    const grammar::RightRegularGrammar m_rrg;
     grammar::LeftRegularGrammar m_lrg;
 };
 
diff --git a/aconversions/src/rrg2lrg/RightToLeftRegularGrammar.cpp b/aconversions/src/rg2rg/rrg2lrg/RightToLeftRegularGrammar.cpp
similarity index 100%
rename from aconversions/src/rrg2lrg/RightToLeftRegularGrammar.cpp
rename to aconversions/src/rg2rg/rrg2lrg/RightToLeftRegularGrammar.cpp
diff --git a/aconversions/src/rrg2lrg/RightToLeftRegularGrammar.h b/aconversions/src/rg2rg/rrg2lrg/RightToLeftRegularGrammar.h
similarity index 100%
rename from aconversions/src/rrg2lrg/RightToLeftRegularGrammar.h
rename to aconversions/src/rg2rg/rrg2lrg/RightToLeftRegularGrammar.h