diff --git a/alib2algo/src/automaton/simplify/Rename.cpp b/alib2algo/src/automaton/simplify/Rename.cpp
index b48c4f1a4e8fee67331583ffd02915ab8a80c176..7ad34298eb809a57648c8bd49f802ab3ac0493b5 100644
--- a/alib2algo/src/automaton/simplify/Rename.cpp
+++ b/alib2algo/src/automaton/simplify/Rename.cpp
@@ -20,10 +20,6 @@ namespace automaton {
 
 namespace simplify {
 
-automaton::Automaton Rename::rename(const automaton::Automaton& automaton) {
-	return dispatch(automaton.getData());
-}
-
 automaton::DFA<> Rename::rename(const automaton::DFA<>& fsm) {
 	int counter = 0;
 	ext::map<DefaultStateType, int > renamingData;
@@ -51,8 +47,7 @@ automaton::DFA<> Rename::rename(const automaton::DFA<>& fsm) {
 	return result;
 }
 
-auto RenameDFA = registration::OverloadRegister < Rename, automaton::DFA < >, automaton::DFA < > > ( Rename::rename );
-auto RenameDFA2 = registration::AbstractRegister < Rename, automaton::DFA < >, const automaton::DFA < > & > ( Rename::rename );
+auto RenameDFA = registration::AbstractRegister < Rename, automaton::DFA < >, const automaton::DFA < > & > ( Rename::rename );
 
 automaton::DPDA < > Rename::rename(const automaton::DPDA < > & pda) {
 	int counterState = 0;
@@ -94,8 +89,7 @@ automaton::DPDA < > Rename::rename(const automaton::DPDA < > & pda) {
 	return result;
 }
 
-auto RenameDPDA = registration::OverloadRegister < Rename, automaton::DPDA < >, automaton::DPDA < > > ( Rename::rename );
-auto RenameDPDA2 = registration::AbstractRegister < Rename, automaton::DPDA < >, const automaton::DPDA < > & > ( Rename::rename );
+auto RenameDPDA = registration::AbstractRegister < Rename, automaton::DPDA < >, const automaton::DPDA < > & > ( Rename::rename );
 
 automaton::SinglePopDPDA < > Rename::rename(const automaton::SinglePopDPDA < > & pda) {
 	int counterState = 0;
@@ -136,8 +130,7 @@ automaton::SinglePopDPDA < > Rename::rename(const automaton::SinglePopDPDA < > &
 	return result;
 }
 
-auto RenameSinglePopDPDA = registration::OverloadRegister < Rename, automaton::SinglePopDPDA < >, automaton::SinglePopDPDA < > > ( Rename::rename );
-auto RenameSinglePopDPDA2 = registration::AbstractRegister < Rename, automaton::SinglePopDPDA < >, const automaton::SinglePopDPDA < > & > ( Rename::rename );
+auto RenameSinglePopDPDA = registration::AbstractRegister < Rename, automaton::SinglePopDPDA < >, const automaton::SinglePopDPDA < > & > ( Rename::rename );
 
 automaton::InputDrivenDPDA < > Rename::rename(const automaton::InputDrivenDPDA < > & pda) {
 	int counter = 0;
@@ -186,8 +179,7 @@ automaton::InputDrivenDPDA < > Rename::rename(const automaton::InputDrivenDPDA <
 	return result;
 }
 
-auto RenameInputDrivenDPDA = registration::OverloadRegister < Rename, automaton::InputDrivenDPDA < >, automaton::InputDrivenDPDA < > > ( Rename::rename );
-auto RenameInputDrivenDPDA2 = registration::AbstractRegister < Rename, automaton::InputDrivenDPDA < >, const automaton::InputDrivenDPDA < > & > ( Rename::rename );
+auto RenameInputDrivenDPDA = registration::AbstractRegister < Rename, automaton::InputDrivenDPDA < >, const automaton::InputDrivenDPDA < > & > ( Rename::rename );
 
 automaton::VisiblyPushdownDPDA < > Rename::rename(const automaton::VisiblyPushdownDPDA < > & pda) {
 	int counterState = 0;
@@ -234,8 +226,7 @@ automaton::VisiblyPushdownDPDA < > Rename::rename(const automaton::VisiblyPushdo
 	return result;
 }
 
-auto RenameVisiblyPushdownDPDA = registration::OverloadRegister < Rename, automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownDPDA < > > ( Rename::rename );
-auto RenameVisiblyPushdownDPDA2 = registration::AbstractRegister < Rename, automaton::VisiblyPushdownDPDA < >, const automaton::VisiblyPushdownDPDA < > & > ( Rename::rename );
+auto RenameVisiblyPushdownDPDA = registration::AbstractRegister < Rename, automaton::VisiblyPushdownDPDA < >, const automaton::VisiblyPushdownDPDA < > & > ( Rename::rename );
 
 automaton::RealTimeHeightDeterministicDPDA < > Rename::rename(const automaton::RealTimeHeightDeterministicDPDA < > & pda) {
 	int counterState = 0;
@@ -280,8 +271,7 @@ automaton::RealTimeHeightDeterministicDPDA < > Rename::rename(const automaton::R
 	return result;
 }
 
-auto RenameRealTimeHeightDeterministicDPDA = registration::OverloadRegister < Rename, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > > ( Rename::rename );
-auto RenameRealTimeHeightDeterministicDPDA2 = registration::AbstractRegister < Rename, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::RealTimeHeightDeterministicDPDA < > & > ( Rename::rename );
+auto RenameRealTimeHeightDeterministicDPDA = registration::AbstractRegister < Rename, automaton::RealTimeHeightDeterministicDPDA < >, const automaton::RealTimeHeightDeterministicDPDA < > & > ( Rename::rename );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/automaton/simplify/Rename.h b/alib2algo/src/automaton/simplify/Rename.h
index 25f281a01423ec699ce94766e67bbad85ca222d7..31d992d5e7880b63209f7c5c455f611865c1d581 100644
--- a/alib2algo/src/automaton/simplify/Rename.h
+++ b/alib2algo/src/automaton/simplify/Rename.h
@@ -8,7 +8,6 @@
 #ifndef RENAME_H_
 #define RENAME_H_
 
-#include <core/multipleDispatch.hpp>
 #include <automaton/FSM/DFA.h>
 #include <automaton/PDA/DPDA.h>
 #include <automaton/PDA/SinglePopDPDA.h>
@@ -21,13 +20,8 @@ namespace automaton {
 
 namespace simplify {
 
-class Rename : public alib::SingleDispatch<Rename, automaton::Automaton, const automaton::AutomatonBase &> {
+class Rename {
 public:
-	/**
-	 * @param dfa automaton to rename
-	 */
-	static automaton::Automaton rename(const automaton::Automaton& dfa);
-
 	static automaton::DFA<> rename(const automaton::DFA<>& dfa);
 	static automaton::DPDA < > rename(const automaton::DPDA < > & pda);
 	static automaton::SinglePopDPDA < > rename(const automaton::SinglePopDPDA < > & pda);
diff --git a/alib2algo/src/grammar/simplify/Rename.cpp b/alib2algo/src/grammar/simplify/Rename.cpp
index 304615439ec4567a7de1ee6c54cc1f2539ff1ddb..4eb38990b62b155b5ae0a3b156b4c12ea29fc6f1 100644
--- a/alib2algo/src/grammar/simplify/Rename.cpp
+++ b/alib2algo/src/grammar/simplify/Rename.cpp
@@ -22,10 +22,6 @@ namespace grammar {
 
 namespace simplify {
 
-grammar::Grammar Rename::rename ( const grammar::Grammar & grammar ) {
-	return dispatch ( grammar.getData ( ) );
-}
-
 grammar::RightRG < > Rename::rename ( const grammar::RightRG < > & rrg ) {
 	int counter = 0;
 
@@ -62,7 +58,7 @@ grammar::RightRG < > Rename::rename ( const grammar::RightRG < > & rrg ) {
 	return result;
 }
 
-auto RenameRightRG = registration::OverloadRegister < Rename, grammar::RightRG < >, grammar::RightRG < > > ( Rename::rename );
+auto RenameRightRG = registration::AbstractRegister < Rename, grammar::RightRG < >, const grammar::RightRG < > & > ( Rename::rename );
 
 grammar::LeftRG < > Rename::rename ( const grammar::LeftRG < > & rrg ) {
 	int counter = 0;
@@ -100,7 +96,7 @@ grammar::LeftRG < > Rename::rename ( const grammar::LeftRG < > & rrg ) {
 	return result;
 }
 
-auto RenameLeftRG = registration::OverloadRegister < Rename, grammar::LeftRG < >, grammar::LeftRG < > > ( Rename::rename );
+auto RenameLeftRG = registration::AbstractRegister < Rename, grammar::LeftRG < >, const grammar::LeftRG < > & > ( Rename::rename );
 
 } /* namespace simplify */
 
diff --git a/alib2algo/src/grammar/simplify/Rename.h b/alib2algo/src/grammar/simplify/Rename.h
index 4f8c71f23345e3029bed3755de9cfc840fb99af1..2578169e02fc0d8e645e7797d72c46d50b1d47f0 100644
--- a/alib2algo/src/grammar/simplify/Rename.h
+++ b/alib2algo/src/grammar/simplify/Rename.h
@@ -8,8 +8,6 @@
 #ifndef RENAME_GRAMMAR_H_
 #define RENAME_GRAMMAR_H_
 
-#include <core/multipleDispatch.hpp>
-#include <grammar/Grammar.h>
 #include <grammar/Regular/LeftRG.h>
 #include <grammar/Regular/RightRG.h>
 
@@ -17,13 +15,8 @@ namespace grammar {
 
 namespace simplify {
 
-class Rename : public alib::SingleDispatch < Rename, grammar::Grammar, const grammar::GrammarBase & > {
+class Rename {
 public:
-	/**
-	 * @param grammar grammar to rename
-	 */
-	static grammar::Grammar rename ( const grammar::Grammar & grammar );
-
 	static grammar::RightRG < > rename ( const grammar::RightRG < > & grammar );
 	static grammar::LeftRG < > rename ( const grammar::LeftRG < > & grammar );
 };
diff --git a/arename2/makefile.conf b/arename2/makefile.conf
index 558ddb218cddd3bd2e6ea8c8c7390b2d9a9a03fa..0007bb7cd6af12f87c5f782387f43869d7c38981 100644
--- a/arename2/makefile.conf
+++ b/arename2/makefile.conf
@@ -1,4 +1,4 @@
 EXECUTABLE:=arename2
-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)/../../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/
diff --git a/arename2/src/arename.cpp b/arename2/src/arename.cpp
index 46622cef91bee0ca36b92d0700207f87cbf6cb78..fb39412c1cb3aafb776dda509e9f5e1c34abd5df 100644
--- a/arename2/src/arename.cpp
+++ b/arename2/src/arename.cpp
@@ -5,15 +5,13 @@
  *      Author: Jan Travnicek
  */
 
+#include <tclap/CmdLine.h>
 #include <global/GlobalData.h>
 #include <measure>
-#include <sax/FromXMLParserHelper.h>
-#include <tclap/CmdLine.h>
 
-#include "automaton/simplify/Rename.h"
-#include "exception/CommonException.h"
-#include "factory/XmlDataFactory.hpp"
-#include "grammar/simplify/Rename.h"
+#include <exception/CommonException.h>
+#include <lexer/Lexer.h>
+#include <parser/Parser.h>
 
 int main ( int argc, char * * argv ) {
 	try {
@@ -39,38 +37,38 @@ int main ( int argc, char * * argv ) {
 		if ( measure.isSet ( ) )
 			common::GlobalData::measure = true;
 
+		cli::Environment environment;
+		environment.setBinding ( "stdin", input.getValue ( ) );
+		environment.setBinding ( "stdout", "-" );
+
 		measurements::start ( "Overal", measurements::Type::OVERALL );
 		measurements::start ( "Input read", measurements::Type::AUXILIARY );
 
-		ext::deque < sax::Token > tokens = sax::FromXMLParserHelper::parseInput ( input );
-
-		if ( alib::XmlDataFactory::first < automaton::Automaton > ( tokens ) ) {
-			automaton::Automaton automaton = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			automaton::Automaton res = automaton::simplify::Rename::rename ( automaton );
-
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
+		cli::Parser parser ( cli::Lexer ( "execute <#stdin > $input" ) );
+		parser.parse ( )->run ( environment );
 
-			alib::XmlDataFactory::toStdout ( res );
-		} else if ( alib::XmlDataFactory::first < grammar::Grammar > ( tokens ) ) {
-			grammar::Grammar grammar = alib::XmlDataFactory::fromTokens ( std::move ( tokens ) );
-
-			measurements::end ( );
-			measurements::start ( "Algorithm", measurements::Type::MAIN );
-
-			grammar::Grammar res = grammar::simplify::Rename::rename ( grammar );
+		measurements::end ( );
+		measurements::start ( "Algorithm", measurements::Type::MAIN );
 
-			measurements::end ( );
-			measurements::start ( "Output write", measurements::Type::AUXILIARY );
+		parser = cli::Parser ( cli::Lexer ( "export type = typename ( $input )" ) );
+		std::string inputType = environment.getVariable ( "input" )->getReturnType ( );
+		bool isAutomaton = inputType.find ( "automaton::" ) == 0;
+		bool isGrammar = inputType.find ( "grammar::" ) == 0;
 
-			alib::XmlDataFactory::toStdout ( res );
+		if( isAutomaton ) {
+			parser = cli::Parser ( cli::Lexer ( "execute automaton::simplify::Rename $input > $output" ) );
+		} else if( isGrammar ) {
+			parser = cli::Parser ( cli::Lexer ( "execute grammar::simplify::Rename $input > $output" ) );
 		} else {
-			throw exception::CommonException ( "Invalid rename command" );
+			throw exception::CommonException("Invalid algorithm");
 		}
+		parser.parse ( )->run ( environment );
+
+		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 ( );