diff --git a/agenerate2/makefile.conf b/agenerate2/makefile.conf
index e3b9e66b32af92978cb1aec29c13ab00889eefaf..5cd7072694cc0172331a0abfc023885556892135 100644
--- a/agenerate2/makefile.conf
+++ b/agenerate2/makefile.conf
@@ -1,4 +1,4 @@
 EXECUTABLE:=agenerate2
-LINK_PATHS=../alib2elgo/ ../alib2algo/ ../alib2data/ ../alib2common/ ../alib2std/
-LINK_LIBRARIES=alib2elgo alib2algo alib2data alib2common alib2std xml2
-INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2elgo/src/ \$$(SOURCES_BASE_DIR)/../../alib2algo/src/ \$$(SOURCES_BASE_DIR)/../../alib2data/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/
+LINK_PATHS=../alib2cli/ ../alib2elgo/ ../alib2algo/ ../alib2data/ ../alib2common/ ../alib2std/
+LINK_LIBRARIES=alib2cli alib2elgo alib2algo alib2data alib2common alib2std xml2
+INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2cli/src/ \$$(SOURCES_BASE_DIR)/../../alib2common/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/
diff --git a/agenerate2/src/agenerate.cpp b/agenerate2/src/agenerate.cpp
index bfcbd64d396715cccde102ef2d8c6bfb43caf9db..987e06d50ccfbadb70b26d05379557959bd7bb3e 100644
--- a/agenerate2/src/agenerate.cpp
+++ b/agenerate2/src/agenerate.cpp
@@ -8,17 +8,10 @@
 #include <tclap/CmdLine.h>
 #include <global/GlobalData.h>
 #include <measure>
-#include <vector>
-#include <sax/FromXMLParserHelper.h>
 
-#include <factory/XmlDataFactory.hpp>
 #include <exception/CommonException.h>
-#include <string/LinearString.h>
-#include <grammar/Grammar.h>
-#include <grammar/generate/GenerateUpToLength.h>
-#include <grammar/generate/CockeYoungerKasami.h>
-#include <container/ObjectsSet.h>
-#include <primitive/Bool.h>
+#include <lexer/Lexer.h>
+#include <parser/Parser.h>
 
 int main ( int argc, char * argv[] ) {
 	try {
@@ -58,40 +51,51 @@ int main ( int argc, char * argv[] ) {
 		if ( measure.isSet ( ) )
 			common::GlobalData::measure = true;
 
+		cli::Environment environment;
+		environment.setBinding ( "stringInput", stringInput.getValue ( ) );
+		environment.setBinding ( "grammarInput", grammarInput.getValue ( ) );
+		environment.setBinding ( "upTo", ext::to_string ( upto.getValue ( ) ) );
+		environment.setBinding ( "stdout", "-" );
+
 		measurements::start ( "Overal", measurements::Type::OVERALL );
 		measurements::start ( "Input read", measurements::Type::AUXILIARY );
+	
+		cli::Parser parser ( cli::Lexer ( "execute <#grammarInput > $grammar" ) );
+		parser.parse ( )->run ( environment );
 
-		if ( ( type.getValue ( ) == "upTo" ) && upto.isSet ( ) ) {
-			grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( sax::FromXMLParserHelper::parseInput(grammarInput) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
+		if ( type.getValue ( ) == "CYK" ) {
+			parser = cli::Parser ( cli::Lexer ( "execute <#stringInput > $string" ) );
+			parser.parse ( )->run ( environment );
+		}
 
-			ext::set < string::LinearString < > > res = grammar::generate::GenerateUpToLength::generate ( grammar, upto.getValue ( ) );
+		if ( type.getValue ( ) == "upTo" ) {
+			parser = cli::Parser ( cli::Lexer ( "execute (unsigned) #upTo > $upTo" ) );
+			parser.parse ( )->run ( environment );
+		}
 
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
+		measurements::end ( );
+		measurements::start ( "Algorithm", measurements::Type::MAIN );
 
-			alib::XmlDataFactory::toStdout ( res );
+		std::string cliCommand;
+		if ( ( type.getValue ( ) == "upTo" ) ) {
+			cliCommand = "execute grammar::generate::GenerateUpToLength $grammar $upTo > $output";
 		} else if ( type.getValue ( ) == "CYK" ) {
-			grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( sax::FromXMLParserHelper::parseInput(grammarInput) );
-			string::LinearString < > string = alib::XmlDataFactory::fromTokens ( sax::FromXMLParserHelper::parseInput(stringInput) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			bool res = grammar::generate::CockeYoungerKasami::generate ( grammar, string );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
-
-			alib::XmlDataFactory::toStdout ( res );
+			cliCommand = "execute grammar::generate::CockeYoungerKasami $grammar $string > $output";
 		} else {
 			throw exception::CommonException ( "Invalid run type" );
 		}
 
+		parser = cli::Parser ( cli::Lexer ( cliCommand ) );
+		parser.parse ( )->run ( environment );
+
 		measurements::end ( );
-		measurements::end ( );
+		measurements::start ( "Output write", measurements::Type::AUXILIARY );
+
+		parser = cli::Parser ( cli::Lexer ( "execute $output >#stdout" ) );
+		parser.parse ( )->run ( environment );
+
+		measurements::end();
+		measurements::end();
 
 		if ( measure.getValue ( ) ) ext::cmeasure << measurements::results ( ) << std::endl;
 
diff --git a/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp b/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp
index b1e57761d2a4a68c33cc8df92c67775a7fe6a4d8..d3b4a0383991973c9d5c9b07d132d3c746fba001 100644
--- a/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp
+++ b/alib2algo/src/grammar/generate/CockeYoungerKasami.cpp
@@ -12,11 +12,7 @@ namespace grammar {
 
 namespace generate {
 
-auto CockeYoungerKasamiCNF = registration::OverloadRegister < CockeYoungerKasami, bool, grammar::CNF < > > ( CockeYoungerKasami::generate );
-
-bool CockeYoungerKasami::generate ( const grammar::Grammar & grammar, const string::LinearString < > & string ) {
-	return dispatch ( grammar.getData ( ), string );
-}
+auto CockeYoungerKasamiCNF = registration::AbstractRegister < CockeYoungerKasami, bool, const grammar::CNF < > &, const string::LinearString < > & > ( CockeYoungerKasami::generate );
 
 } /* namespace generate */
 
diff --git a/alib2algo/src/grammar/generate/CockeYoungerKasami.h b/alib2algo/src/grammar/generate/CockeYoungerKasami.h
index dd708881fdbdaf151367d2d4fd93acdc8304c65a..b3bb5eab3437b11bee0910290087441dd8a79821 100644
--- a/alib2algo/src/grammar/generate/CockeYoungerKasami.h
+++ b/alib2algo/src/grammar/generate/CockeYoungerKasami.h
@@ -8,10 +8,8 @@
 #ifndef COCKE_YOUNGER_KASAMI_H_
 #define COCKE_YOUNGER_KASAMI_H_
 
-#include <core/multipleDispatch.hpp>
 #include <global/GlobalData.h>
 
-#include <grammar/Grammar.h>
 #include <grammar/ContextFree/CNF.h>
 #include <string/LinearString.h>
 
@@ -22,10 +20,8 @@ namespace generate {
 /**
  * Implements algorithms from Melichar, chapter 3.3
  */
-class CockeYoungerKasami : public alib::SingleDispatch < CockeYoungerKasami, bool, const grammar::GrammarBase &, const string::LinearString < > & > {
+class CockeYoungerKasami {
 public:
-	static bool generate ( const grammar::Grammar & grammar, const string::LinearString < > & string );
-
 	template < class SymbolType >
 	static bool generate ( const grammar::CNF < SymbolType > & grammar, const string::LinearString < SymbolType > & string );
 
diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
index ad2b120b469d5b93394adbe04e78579d999f01c9..a481ff3ebab31e107e4fae253fc7f6c09737f98c 100644
--- a/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
+++ b/alib2algo/src/grammar/generate/GenerateUpToLength.cpp
@@ -12,15 +12,11 @@ namespace grammar {
 
 namespace generate {
 
-auto GenerateUpToLengthEpsilonFreeCFG = registration::OverloadRegister < GenerateUpToLength, ext::set < string::LinearString < > >, grammar::EpsilonFreeCFG < > > ( GenerateUpToLength::generate );
-auto GenerateUpToLengthGNF = registration::OverloadRegister < GenerateUpToLength, ext::set < string::LinearString < > >, grammar::GNF < > > ( GenerateUpToLength::generate );
-auto GenerateUpToLengthCNF = registration::OverloadRegister < GenerateUpToLength, ext::set < string::LinearString < > >, grammar::CNF < > > ( GenerateUpToLength::generate );
-auto GenerateUpToLengthLeftRG = registration::OverloadRegister < GenerateUpToLength, ext::set < string::LinearString < > >, grammar::LeftRG < > > ( GenerateUpToLength::generate );
-auto GenerateUpToLengthRightRG = registration::OverloadRegister < GenerateUpToLength, ext::set < string::LinearString < > >, grammar::RightRG < > > ( GenerateUpToLength::generate );
-
-ext::set<string::LinearString < >> GenerateUpToLength::generate(const grammar::Grammar& grammar, unsigned length) {
-	return dispatch(grammar.getData(), length);
-}
+auto GenerateUpToLengthEpsilonFreeCFG = registration::AbstractRegister < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::EpsilonFreeCFG < > &, unsigned > ( GenerateUpToLength::generate );
+auto GenerateUpToLengthGNF = registration::AbstractRegister < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::GNF < > &, unsigned > ( GenerateUpToLength::generate );
+auto GenerateUpToLengthCNF = registration::AbstractRegister < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::CNF < > &, unsigned > ( GenerateUpToLength::generate );
+auto GenerateUpToLengthLeftRG = registration::AbstractRegister < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::LeftRG < > &, unsigned > ( GenerateUpToLength::generate );
+auto GenerateUpToLengthRightRG = registration::AbstractRegister < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::RightRG < > &, unsigned > ( GenerateUpToLength::generate );
 
 } /* namespace generate */
 
diff --git a/alib2algo/src/grammar/generate/GenerateUpToLength.h b/alib2algo/src/grammar/generate/GenerateUpToLength.h
index ba1530dba9b2177e5eca453499f4a62718095719..7e50f00fa553e08fda6aaae7c01d85a67f42f28f 100644
--- a/alib2algo/src/grammar/generate/GenerateUpToLength.h
+++ b/alib2algo/src/grammar/generate/GenerateUpToLength.h
@@ -8,8 +8,6 @@
 #ifndef GRAMMAR_GENERATE_UP_TO_LENGTH_H_
 #define GRAMMAR_GENERATE_UP_TO_LENGTH_H_
 
-#include <core/multipleDispatch.hpp>
-
 #include <grammar/Grammar.h>
 #include <string/LinearString.h>
 #include <set>
@@ -28,10 +26,8 @@ namespace generate {
 /**
  * Implements algorithms from Melichar, chapter 3.3
  */
-class GenerateUpToLength : public alib::SingleDispatch < GenerateUpToLength, ext::set < string::LinearString < > >, const grammar::GrammarBase &, unsigned > {
+class GenerateUpToLength {
 public:
-	static ext::set < string::LinearString < > > generate( const grammar::Grammar & grammar, unsigned length );
-
 	template < class T, class SymbolType = typename grammar::SymbolTypeOfGrammar < T > >
 	static ext::set < string::LinearString < SymbolType > > generate ( const T & grammar, unsigned length );
 };
diff --git a/alib2common/src/abstraction/PrimitiveRegistrator.cpp b/alib2common/src/abstraction/PrimitiveRegistrator.cpp
index afc37b19312140b395fd673270a21c57f75c2e10..9fbc139828a6b7e0148ba3e2bc537c024ed35e3f 100644
--- a/alib2common/src/abstraction/PrimitiveRegistrator.cpp
+++ b/alib2common/src/abstraction/PrimitiveRegistrator.cpp
@@ -36,6 +36,7 @@ public:
 
 		abstraction::CastRegistry::registerCast < bool, int > ( false );
 		abstraction::CastRegistry::registerCastAlgorithm < bool, std::string > ( ( bool ( * ) ( std::string ) ) ext::from_string < bool >, false );
+		abstraction::CastRegistry::registerCastAlgorithm < unsigned, std::string > ( "unsigned", ext::to_string < std::string > ( ), ( unsigned ( * ) ( std::string ) ) ext::from_string < unsigned >, false );
 
 		abstraction::CastRegistry::registerCast < size_t, int > ( "size_t", ext::to_string < int > ( ), false );
 		abstraction::CastRegistry::registerCast < size_t, int > ( false );
diff --git a/alib2data/src/common/PrimitiveRegistrator2.cpp b/alib2data/src/common/PrimitiveRegistrator2.cpp
index deeb2a070cf475f02c30764adbb4d240d3908d9a..6b0e988abf0e50a1ed5125ca6a9636fec1142ce3 100644
--- a/alib2data/src/common/PrimitiveRegistrator2.cpp
+++ b/alib2data/src/common/PrimitiveRegistrator2.cpp
@@ -31,6 +31,8 @@
 #include <common/ranked_symbol.hpp>
 #include <alphabet/RankedSymbol.h>
 
+#include <string/LinearString.h>
+
 namespace abstraction {
 
 class PrimitiveRegistrator2 {
@@ -44,6 +46,7 @@ public:
 
 		abstraction::XmlParserRegistry::registerXmlParser < DefaultStateType > ( "DefaultStateType" );
 		abstraction::XmlFileWriterRegistry::registerXmlFileWriter < DefaultStateType > ( );
+		abstraction::XmlFileWriterRegistry::registerXmlFileWriter < ext::set < string::LinearString < > > > ( );
 	}
 };
 
diff --git a/arun2/src/arun.cpp b/arun2/src/arun.cpp
index 57619c5ca19af488d386a45f8be59d5151d12cde..abfc6bc1f1990d5965b5abf51d057bfcd61a8a2c 100644
--- a/arun2/src/arun.cpp
+++ b/arun2/src/arun.cpp
@@ -100,6 +100,7 @@ int main(int argc, char* argv[]) {
 
 		measurements::end();
 		measurements::end();
+
 		if(measure.getValue()) ext::cmeasure << measurements::results() << std::endl;
 
 		return 0;