diff --git a/aconversions2/src/ConversionHandler.cpp b/aconversions2/src/ConversionHandler.cpp
index 2ad49e893a4de2037ce4149cd15811645163ba1f..187f9b04d7426b8d9760378fc72cd999a3c7ab62 100644
--- a/aconversions2/src/ConversionHandler.cpp
+++ b/aconversions2/src/ConversionHandler.cpp
@@ -338,9 +338,8 @@ void ConversionHandler::convertLRGtoRRG( void )
 	switch( m_algorithm )
 	{
 	default:
-			rg2rg::LeftToRightRegularGrammar conv( lrg );
-			grammar::RightRG rrg = conv.convert();
-			alib::DataFactory::toStdout(rrg);
+			rg2rg::LeftToRightRegularGrammar conv;
+			alib::DataFactory::toStdout(conv.convert(lrg));
 		break;
 	}
 }
@@ -352,9 +351,8 @@ void ConversionHandler::convertRRGtoLRG( void )
 	switch( m_algorithm )
 	{
 	default:
-		rg2rg::RightToLeftRegularGrammar conv( rrg );
-		grammar::LeftRG lrg = conv.convert();
-		alib::DataFactory::toStdout(lrg);
+		rg2rg::RightToLeftRegularGrammar conv;
+		alib::DataFactory::toStdout(conv.convert(rrg));
 		break;
 	}
 }
diff --git a/alib2algo/test-src/conversions/playTest.cpp b/alib2algo/test-src/conversions/playTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..03a7af3387c5ee02b60d63767a15f99e83ba8932
--- /dev/null
+++ b/alib2algo/test-src/conversions/playTest.cpp
@@ -0,0 +1,105 @@
+#include "playTest.h"
+
+#include <iostream>
+#include <cstdlib>
+#include <ctime>
+
+#include "determinize/nfa/NFADeterminizer.h"
+#include "minimize/dfa/MinimizeDFA.h"
+
+#include "generator/RandomAutomatonFactory.h"
+#include "normalize/dfa/NormalizeDFA.h"
+#include "trim/automaton/TrimFSM.h"
+#include "epsilon/epsilonNfa/EpsilonNFAEpsilonRemover.h"
+#include "minimize/dfa/MinimizeDFA.h"
+
+//#include "conversions/fa2re/StateElimination.h"
+//#include "conversions/fa2re/BrzozowskiAlgebraic.h"
+//#include "conversions/re2fa/Glushkov.h"
+//#include "conversions/re2fa/Thompson.h"
+//#include "conversions/re2fa/Brzozowski.h"
+#include "conversions/fa2rg/fa2lrg/FAtoLRGConverter.h"
+#include "conversions/fa2rg/fa2rrg/FAtoRRGConverter.h"
+#include "conversions/rg2fa/lrg2fa/LRGtoFAConverter.h"
+#include "conversions/rg2fa/rrg2fa/RRGtoFAConverter.h"
+//#include "conversions/rg2re/rrg2re/RRGAlgebraic.h"
+//#include "conversions/rg2re/lrg2re/LRGAlgebraic.h"
+//#include "conversions/re2rg/re2rrg/GlushkovRRG.h"
+//#include "conversions/re2rg/re2rrg/BrzozowskiDerivationRRG.h"
+#include "conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.h"
+#include "conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.h"
+
+
+#define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
+
+#define TEST_ITERATIONS 100
+#define TEST_AUTOMATON_STATES_MAX 18
+#define TEST_AUTOMATON_DENSITY_MAX 2.5
+#define TEST_AUTOMATON_ALPHABET_MAX 4
+
+CPPUNIT_TEST_SUITE_REGISTRATION( playTest );
+
+void playTest::setUp()
+{
+    srand(time(NULL));
+}
+
+void playTest::tearDown(){}
+
+automaton::NFA playTest::randomNFA(void) const
+{
+    return generator::RandomAutomatonFactory::generateNFA(
+            rand() % TEST_AUTOMATON_STATES_MAX + 1,
+            rand() % TEST_AUTOMATON_ALPHABET_MAX + 1,
+            static_cast<double> (rand()) / (static_cast<double> (RAND_MAX/TEST_AUTOMATON_DENSITY_MAX))
+            );
+}
+
+automaton::DFA playTest::mDFA(const automaton::NFA& automaton) const
+{
+    automaton::NFA nfa = epsilon::EpsilonNFAEpsilonRemover::remove(automaton);
+    nfa = trim::TrimFSM::trim(nfa);
+    automaton::DFA dfa = determinize::NFADeterminizer::determinize(nfa);
+    dfa = trim::TrimFSM::trim(dfa);
+    dfa = minimize::MinimizeDFA::minimize(dfa);
+    dfa = normalize::NormalizeDFA::normalize(dfa);
+    return dfa;
+}
+
+/**
+ * Test case 1:
+ *  - covers: FA -> LRG, FA -> RRG, RRG <-> LRG, RRG -> FA, LRG -> FA
+ *  a. FA -> RRG -> LRG -> FA
+ *  b. FA -> LRG -> RRG -> FA
+ */
+void playTest::testPlay1()
+{
+    for(int i = 0; i < TEST_ITERATIONS; i++)
+        this->case1a();
+    for(int i = 0; i < TEST_ITERATIONS; i++)
+        this->case1b();
+}
+
+void playTest::case1a(void) const
+{
+    fa2rg::FAtoRRGConverter fa2rrg;
+    rg2rg::RightToLeftRegularGrammar rrg2lrg;
+    rg2fa::LRGtoFAConverter lrg2fa;
+
+    automaton::NFA a1 = this->randomNFA();
+    automaton::NFA a2 = lrg2fa.convert(rrg2lrg.convert(fa2rrg.convert(a1)));
+
+    CPPUNIT_ASSERT(this->mDFA(a1) == this->mDFA(a2));
+}
+
+void playTest::case1b(void) const
+{
+    fa2rg::FAtoLRGConverter fa2lrg;
+    rg2rg::LeftToRightRegularGrammar lrg2rrg;
+    rg2fa::RRGtoFAConverter rrg2fa;
+
+    automaton::NFA a1 = this->randomNFA();
+    automaton::NFA a2 = rrg2fa.convert(lrg2rrg.convert(fa2lrg.convert(a1)));
+
+    CPPUNIT_ASSERT(this->mDFA(a1) == this->mDFA(a2));
+}
diff --git a/alib2algo/test-src/conversions/playTest.h b/alib2algo/test-src/conversions/playTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..45d8cdc9c1ff1f16b0c0ebab5ddae0eacfb95fb8
--- /dev/null
+++ b/alib2algo/test-src/conversions/playTest.h
@@ -0,0 +1,29 @@
+#ifndef PLAY_TEST_H_
+#define PLAY_TEST_H_
+
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <automaton/FSM/NFA.h>
+#include <automaton/FSM/DFA.h>
+
+class playTest : public CppUnit::TestFixture
+{
+  CPPUNIT_TEST_SUITE( playTest );
+  CPPUNIT_TEST( testPlay1 );
+  CPPUNIT_TEST_SUITE_END();
+
+public:
+  void setUp();
+  void tearDown();
+
+  void testPlay1();
+
+private:
+    automaton::NFA randomNFA(void) const;
+    automaton::DFA mDFA(const automaton::NFA& automaton) const;
+
+    void case1a(void) const;
+    void case1b(void) const;
+};
+
+#endif  // PLAY_TEST_H_
diff --git a/alib2algo/test-src/play/playTest.cpp b/alib2algo/test-src/play/playTest.cpp
deleted file mode 100644
index 0fcfdacefbb966f06be5723be4d5d4ea3ac0377b..0000000000000000000000000000000000000000
--- a/alib2algo/test-src/play/playTest.cpp
+++ /dev/null
@@ -1,49 +0,0 @@
-#include <list>
-#include "playTest.h"
-
-#include "conversions/re2fa/Glushkov.h"
-#include "conversions/fa2re/BrzozowskiAlgebraic.h"
-#include "determinize/nfa/NFADeterminizer.h"
-#include "minimize/dfa/MinimizeDFA.h"
-
-#include "regexp/unbounded/UnboundedRegExp.h"
-#include "regexp/RegExpFromStringParser.h"
-
-#include "automaton/FSM/NFA.h"
-
-#define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
-
-CPPUNIT_TEST_SUITE_REGISTRATION( playTest );
-
-void playTest::setUp() {
-}
-
-void playTest::tearDown() {
-}
-
-void playTest::testPlay() {
-	{
-		std::string input = "a+a* b*";
-		std::stringstream inputs(input);
-
-		regexp::RegExpFromStringParser parser(inputs);
-		regexp::UnboundedRegExp regexp1( static_cast<const regexp::UnboundedRegExp &>( parser.parseValue().getData() ) );
-
-		re2fa::Glushkov glushkov1(regexp1);
-		automaton::NFA nfa1 = glushkov1.convert();
-
-
-		regexp::UnboundedRegExp regexp2( static_cast<const regexp::UnboundedRegExp &>( fa2re::BrzozowskiAlgebraic::convert(nfa1) ) );
-
-		re2fa::Glushkov glushkov2(regexp2);
-		automaton::NFA nfa2 = glushkov2.convert();
-
-		automaton::DFA dfa1 = determinize::NFADeterminizer::determinize(nfa1);
-		automaton::DFA dfa2 = determinize::NFADeterminizer::determinize(nfa2);
-
-		automaton::DFA mdfa1 = minimize::MinimizeDFA::minimize(dfa1);
-		automaton::DFA mdfa2 = minimize::MinimizeDFA::minimize(dfa2);
-
-		CPPUNIT_ASSERT( mdfa1 == mdfa2);
-	}
-}
diff --git a/alib2algo/test-src/play/playTest.h b/alib2algo/test-src/play/playTest.h
deleted file mode 100644
index b7bc794188284710d3d9d6b4f4f40486a44460da..0000000000000000000000000000000000000000
--- a/alib2algo/test-src/play/playTest.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef PLAY_TEST_H_
-#define PLAY_TEST_H_
-
-#include <cppunit/extensions/HelperMacros.h>
-
-class playTest : public CppUnit::TestFixture
-{
-  CPPUNIT_TEST_SUITE( playTest );
-  CPPUNIT_TEST( testPlay );
-  CPPUNIT_TEST_SUITE_END();
-
-public:
-  void setUp();
-  void tearDown();
-
-  void testPlay();
-};
-
-#endif  // PLAY_TEST_H_