diff --git a/alib2cli/src/ast/Param.h b/alib2cli/src/ast/Param.h
index 50c16c24c3bf99befa52458145311fd1c6ca55ac..ca5b323e6cf975e9fb1486ffcec341c08b413579 100644
--- a/alib2cli/src/ast/Param.h
+++ b/alib2cli/src/ast/Param.h
@@ -8,20 +8,13 @@
 namespace cli {
 
 class Param {
-	bool m_move;
-
 public:
-	Param ( bool move ) : m_move ( move ) {
-	}
-
 	virtual ~Param ( ) noexcept {
 	}
 
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const = 0;
 
-	bool getMove ( ) const {
-		return m_move;
-	}
+	virtual bool getImplicitMove ( ) const = 0;
 };
 
 } /* namespace cli */
diff --git a/alib2cli/src/ast/params/CastParam.h b/alib2cli/src/ast/params/CastParam.h
index 19bdd3d1fba336898ea64f29f7c022da188e2cb1..bd3d2d92440f5dacc7e2c22e55f1534fe37d465b 100644
--- a/alib2cli/src/ast/params/CastParam.h
+++ b/alib2cli/src/ast/params/CastParam.h
@@ -9,9 +9,10 @@ namespace cli {
 class CastParam final : public Param {
 	std::unique_ptr < cli::Arg > m_type;
 	std::unique_ptr < Param > m_param;
+	bool m_move;
 
 public:
-	CastParam ( std::unique_ptr < cli::Arg > type, std::unique_ptr < Param > param ) : Param ( true ), m_type ( std::move ( type ) ), m_param ( std::move ( param ) ) {
+	CastParam ( std::unique_ptr < cli::Arg > type, std::unique_ptr < Param > param, bool move ) : m_type ( std::move ( type ) ), m_param ( std::move ( param ) ), m_move ( move ) {
 	}
 
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override {
@@ -19,7 +20,11 @@ public:
 
 		std::shared_ptr < abstraction::OperationAbstraction > translatedParam = m_param->translateAndEval ( prev, environment );
 
-		return abstraction::CastHelper::eval ( translatedParam, type, getMove ( ) );
+		return abstraction::CastHelper::eval ( translatedParam, type, m_move );
+	}
+
+	virtual bool getImplicitMove ( ) const override {
+		return true;
 	}
 };
 
diff --git a/alib2cli/src/ast/params/FileParam.h b/alib2cli/src/ast/params/FileParam.h
index 8ffb5b39b7713123ab416ffa813b92c462dd5462..f4c09c29784312a4c091cc427053ba8136a8cea3 100644
--- a/alib2cli/src/ast/params/FileParam.h
+++ b/alib2cli/src/ast/params/FileParam.h
@@ -11,7 +11,7 @@ class FileParam final : public Param {
 	std::unique_ptr < cli::Arg > m_arg;
 
 public:
-	FileParam ( std::unique_ptr < cli::Arg > arg ) : Param ( true ), m_arg ( std::move ( arg ) ) {
+	FileParam ( std::unique_ptr < cli::Arg > arg ) : m_arg ( std::move ( arg ) ) {
 	}
 
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override {
@@ -19,6 +19,10 @@ public:
 
 		return abstraction::XmlParserHelper::eval ( "", file );
 	}
+
+	virtual bool getImplicitMove ( ) const override {
+		return true;
+	}
 };
 
 } /* namespace cli */
diff --git a/alib2cli/src/ast/params/ImmediateParam.h b/alib2cli/src/ast/params/ImmediateParam.h
index b7c4325960ac80b4a93c6b509a567ea23a76874a..8d866083e70613b6902e3c061d33e82ddd407d0a 100644
--- a/alib2cli/src/ast/params/ImmediateParam.h
+++ b/alib2cli/src/ast/params/ImmediateParam.h
@@ -11,12 +11,16 @@ class ImmediateParam final : public Param {
 	Type m_data;
 
 public:
-	ImmediateParam ( Type value ) : Param ( true ), m_data ( std::move ( value ) ) {
+	ImmediateParam ( Type value ) : m_data ( std::move ( value ) ) {
 	}
 
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & ) const override {
 		return std::make_shared < abstraction::ImmediateValueAbstraction < Type > > ( m_data );
 	}
+
+	virtual bool getImplicitMove ( ) const override {
+		return true;
+	}
 };
 
 } /* namespace cli */
diff --git a/alib2cli/src/ast/params/PreviousResultParam.h b/alib2cli/src/ast/params/PreviousResultParam.h
index c26480b8efebb8a241bd971805180dc0ea28bb57..0b5ec93c738dbdcc8af5446754750fb7a6eb308a 100644
--- a/alib2cli/src/ast/params/PreviousResultParam.h
+++ b/alib2cli/src/ast/params/PreviousResultParam.h
@@ -8,12 +8,13 @@ namespace cli {
 class PreviousResultParam final : public Param {
 
 public:
-	PreviousResultParam ( bool move ) : Param ( move ) {
-	}
-
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & ) const override {
 		return prev;
 	}
+
+	virtual bool getImplicitMove ( ) const override {
+		return false;
+	}
 };
 
 } /* namespace cli */
diff --git a/alib2cli/src/ast/params/StatementParam.h b/alib2cli/src/ast/params/StatementParam.h
index 4f465742699277685e22eada8c4d1cf5336589d7..69da76c6f6cc4c83106076362605e51076b52203 100644
--- a/alib2cli/src/ast/params/StatementParam.h
+++ b/alib2cli/src/ast/params/StatementParam.h
@@ -9,12 +9,16 @@ class StatementParam final : public Param {
 	std::shared_ptr < Statement > m_statement;
 
 public:
-	StatementParam ( std::shared_ptr < Statement > statement, bool move ) : Param ( move ), m_statement ( statement ) {
+	StatementParam ( std::shared_ptr < Statement > statement ) : m_statement ( statement ) {
 	}
 
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override {
 		return m_statement->translateAndEval ( nullptr, environment );
 	}
+
+	virtual bool getImplicitMove ( ) const override {
+		return false;
+	}
 };
 
 } /* namespace cli */
diff --git a/alib2cli/src/ast/params/ValueParam.h b/alib2cli/src/ast/params/ValueParam.h
index 3d9672e98491ad5e24c14d9418240f4a790f26f3..f3e3a7173bbccabe3b3579217ab961d9f10ca85b 100644
--- a/alib2cli/src/ast/params/ValueParam.h
+++ b/alib2cli/src/ast/params/ValueParam.h
@@ -10,12 +10,16 @@ class ValueParam final : public Param {
 	std::unique_ptr < cli::Arg > m_arg;
 
 public:
-	ValueParam ( std::unique_ptr < cli::Arg > arg ) : Param ( true ), m_arg ( std::move ( arg ) ) {
+	ValueParam ( std::unique_ptr < cli::Arg > arg ) : m_arg ( std::move ( arg ) ) {
 	}
 
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override {
 		return abstraction::Registry::getImmediateAbstraction ( ext::to_string < std::string > ( ), m_arg->eval ( environment ) );
 	}
+
+	virtual bool getImplicitMove ( ) const override {
+		return true;
+	}
 };
 
 } /* namespace cli */
diff --git a/alib2cli/src/ast/params/VariableParam.h b/alib2cli/src/ast/params/VariableParam.h
index 212a1b16b4e76a162bd8d612b7730d826155ff6f..c296eb6256aa4a21914580a9ffd00f92865ebefa 100644
--- a/alib2cli/src/ast/params/VariableParam.h
+++ b/alib2cli/src/ast/params/VariableParam.h
@@ -10,12 +10,16 @@ class VariableParam final : public Param {
 	std::unique_ptr < cli::Arg > m_name;
 
 public:
-	VariableParam ( std::unique_ptr < cli::Arg > name, bool move ) : Param ( move ), m_name ( std::move ( name ) ) {
+	VariableParam ( std::unique_ptr < cli::Arg > name ) : m_name ( std::move ( name ) ) {
 	}
 
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > &, Environment & environment ) const override {
 		return environment.getVariable ( m_name->eval ( environment ) );
 	}
+
+	virtual bool getImplicitMove ( ) const override {
+		return false;
+	}
 };
 
 } /* namespace cli */
diff --git a/alib2cli/src/ast/statements/ContainerStatement.cpp b/alib2cli/src/ast/statements/ContainerStatement.cpp
index 6ca725f574b250f039eab5fc24a475e59c3df6b0..045a9395be2a318e5af0f7705b454630dc1475ea 100644
--- a/alib2cli/src/ast/statements/ContainerStatement.cpp
+++ b/alib2cli/src/ast/statements/ContainerStatement.cpp
@@ -8,7 +8,7 @@
 
 namespace cli {
 
-ContainerStatement::ContainerStatement ( std::string container, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < TypeOption > type ) : m_container ( std::move ( container ) ), m_params ( std::move ( params ) ), m_type ( std::move ( type ) ) {
+ContainerStatement::ContainerStatement ( std::string container, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < TypeOption > type, ext::vector < bool > moves ) : m_container ( std::move ( container ) ), m_params ( std::move ( params ) ), m_type ( std::move ( type ) ), m_moves ( std::move ( moves ) ) {
 }
 
 std::shared_ptr < abstraction::OperationAbstraction > ContainerStatement::translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const {
@@ -17,14 +17,16 @@ std::shared_ptr < abstraction::OperationAbstraction > ContainerStatement::transl
 		params.push_back ( param->translateAndEval ( prev, environment ) );
 	}
 
-	std::vector < bool > moves;
-	for ( const std::unique_ptr < Param > & param : m_params ) {
-		moves.push_back ( param->getMove ( ) );
-	}
-
 	std::shared_ptr < abstraction::OperationAbstraction > algo = abstraction::Registry::getContainerAbstraction ( m_container, m_type->getType ( ) );
 
+	ext::vector < bool > moves ( m_moves.size ( ) );
 	unsigned i = 0;
+	for ( const std::unique_ptr < Param > & param : m_params ) {
+		moves [ i ] = m_moves [ i ] | param->getImplicitMove ( );
+		++ i;
+	}
+
+	i = 0;
 	ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > casted_params;
 	for ( const std::shared_ptr < abstraction::OperationAbstraction > & param : params ) {
 		if ( abstraction::Registry::isCastNoOp ( algo->getParamType ( i ), param->getReturnType ( ) ) ) {
diff --git a/alib2cli/src/ast/statements/ContainerStatement.h b/alib2cli/src/ast/statements/ContainerStatement.h
index efbcd246f047976e185b8422f39f018048d8bbcb..f1b91ae1268083a96d2b690fdc0209a323ec7b1a 100644
--- a/alib2cli/src/ast/statements/ContainerStatement.h
+++ b/alib2cli/src/ast/statements/ContainerStatement.h
@@ -10,9 +10,10 @@ class ContainerStatement final : public Statement {
 	std::string m_container;
 	ext::vector < std::unique_ptr < Param > > m_params;
 	std::unique_ptr < TypeOption > m_type;
+	ext::vector < bool > m_moves;
 
 public:
-	ContainerStatement ( std::string container, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < TypeOption > type );
+	ContainerStatement ( std::string container, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < TypeOption > type, ext::vector < bool > moves );
 
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override;
 };
diff --git a/alib2cli/src/ast/statements/SingleStatement.cpp b/alib2cli/src/ast/statements/SingleStatement.cpp
index c9289f8c16b4e3819fc73b447bf1bedc40bed964..9ae634a22cefe2f83735a890b18afe3180e000e0 100644
--- a/alib2cli/src/ast/statements/SingleStatement.cpp
+++ b/alib2cli/src/ast/statements/SingleStatement.cpp
@@ -6,7 +6,7 @@
 
 namespace cli {
 
-SingleStatement::SingleStatement ( std::unique_ptr < Arg > name, ext::vector < std::unique_ptr < cli::Arg > > templateParams, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < CategoryOption > category ) : m_name ( std::move ( name ) ), m_templateParams ( std::move ( templateParams ) ), m_params ( std::move ( params ) ), m_category ( std::move ( category ) ) {
+SingleStatement::SingleStatement ( std::unique_ptr < Arg > name, ext::vector < std::unique_ptr < cli::Arg > > templateParams, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < CategoryOption > category, ext::vector < bool > moves ) : m_name ( std::move ( name ) ), m_templateParams ( std::move ( templateParams ) ), m_params ( std::move ( params ) ), m_category ( std::move ( category ) ), m_moves ( std::move ( moves ) ) {
 }
 
 std::shared_ptr < abstraction::OperationAbstraction > SingleStatement::translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const {
@@ -15,9 +15,11 @@ std::shared_ptr < abstraction::OperationAbstraction > SingleStatement::translate
 		params.push_back ( param->translateAndEval ( prev, environment ) );
 	}
 
-	std::vector < bool > moves;
+	ext::vector < bool > moves ( m_moves.size ( ) );
+	unsigned i = 0;
 	for ( const std::unique_ptr < Param > & param : m_params ) {
-		moves.push_back ( param->getMove ( ) );
+		moves [ i ] = m_moves [ i ] | param->getImplicitMove ( );
+		++ i;
 	}
 
 	std::string name = m_name->eval ( environment );
diff --git a/alib2cli/src/ast/statements/SingleStatement.h b/alib2cli/src/ast/statements/SingleStatement.h
index 21da6e6a5d75314585f9474dcfb78a06e5431baa..1d0f6b639ef384ad71407bf3f61b33634b58d0ab 100644
--- a/alib2cli/src/ast/statements/SingleStatement.h
+++ b/alib2cli/src/ast/statements/SingleStatement.h
@@ -12,9 +12,10 @@ class SingleStatement final : public Statement {
 	ext::vector < std::unique_ptr < cli::Arg > > m_templateParams;
 	ext::vector < std::unique_ptr < Param > > m_params;
 	std::unique_ptr < CategoryOption > m_category;
+	ext::vector < bool > m_moves;
 
 public:
-	SingleStatement ( std::unique_ptr < cli::Arg > name, ext::vector < std::unique_ptr < cli::Arg > > templateParams, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < CategoryOption > options );
+	SingleStatement ( std::unique_ptr < cli::Arg > name, ext::vector < std::unique_ptr < cli::Arg > > templateParams, ext::vector < std::unique_ptr < Param > > params, std::unique_ptr < CategoryOption > options, ext::vector < bool > moves );
 
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override;
 };
diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp
index a1da50dfedddfccade4cf72236d1fba71be5612c..0b8950f4f73df81439ccb93dfe2acb5c3af4f36a 100644
--- a/alib2cli/src/parser/Parser.cpp
+++ b/alib2cli/src/parser/Parser.cpp
@@ -95,10 +95,15 @@ bool Parser::move_arg ( ) {
 	}
 }
 
+std::unique_ptr < Arg > Parser::template_arg ( ) {
+	match ( cli::Lexer::TokenType::AT_SIGN );
+	return arg ( );
+}
+
 std::unique_ptr < Param > Parser::in_redirect_param ( ) {
 	if ( check ( cli::Lexer::TokenType::LEFT_PAREN ) ) {
 		match ( cli::Lexer::TokenType::LEFT_PAREN );
-		auto sub_statement = std::make_unique < StatementParam > ( statement_list ( ), false );
+		auto sub_statement = std::make_unique < StatementParam > ( statement_list ( ) );
 		match ( cli::Lexer::TokenType::RIGHT_PAREN );
 		return sub_statement;
 	} else {
@@ -107,79 +112,39 @@ std::unique_ptr < Param > Parser::in_redirect_param ( ) {
 	}
 }
 
-std::unique_ptr < Arg > Parser::template_param ( ) {
-	match ( cli::Lexer::TokenType::AT_SIGN );
-	return arg ( );
-}
-
-std::unique_ptr < Param > Parser::param ( ) {
-	if ( check ( cli::Lexer::TokenType::CARET_SIGN ) ) {
-		match ( cli::Lexer::TokenType::CARET_SIGN );
-		return move_param ( );
-	} else {
-		return value_param ( );
-	}
-}
+ext::pair < bool, std::unique_ptr < Param > > Parser::param ( ) {
+	bool move = move_arg ( );
 
-std::unique_ptr < Param > Parser::move_param ( ) {
 	if ( check ( cli::Lexer::TokenType::DASH_SIGN ) ) {
 		match ( cli::Lexer::TokenType::DASH_SIGN );
-		return std::make_unique < PreviousResultParam > ( true );
+		return ext::make_pair ( move, std::make_unique < PreviousResultParam > ( ) );
 	} else if ( check ( cli::Lexer::TokenType::IN_REDIRECT ) ) {
 		match ( cli::Lexer::TokenType::IN_REDIRECT );
-		match ( cli::Lexer::TokenType::LEFT_PAREN );
-		auto sub_statement = std::make_unique < StatementParam > ( statement_list ( ), true );
-		match ( cli::Lexer::TokenType::RIGHT_PAREN );
-		return sub_statement;
-	} else if ( check ( cli::Lexer::TokenType::DOLAR_SIGN ) ) {
-		match ( cli::Lexer::TokenType::DOLAR_SIGN );
-		std::unique_ptr < Arg > name = arg ( );
-		return std::make_unique < VariableParam > ( std::move ( name ), true );
+		return ext::make_pair ( move, in_redirect_param ( ) );
 	} else if ( check ( cli::Lexer::TokenType::IDENTIFIER ) ) {
 		std::string value = matchIdentifier ( );
-		return std::make_unique < ImmediateParam < std::string > > ( value );
+		return ext::make_pair ( move, std::make_unique < ImmediateParam < std::string > > ( value ) );
 	} else if ( check ( cli::Lexer::TokenType::STRING ) ) {
 		std::string value = matchString ( );
-		return std::make_unique < ImmediateParam < std::string > > ( value );
+		return ext::make_pair ( move, std::make_unique < ImmediateParam < std::string > > ( value ) );
 	} else if ( check ( cli::Lexer::TokenType::INTEGER ) ) {
 		int value = matchInteger ( );
-		return std::make_unique < ImmediateParam < int > > ( value );
-	} else {
-		throw exception::CommonException ( "Mismatched set while expanding move_param rule." );
-	}
-}
-
-std::unique_ptr < Param > Parser::value_param ( ) {
-	if ( check ( cli::Lexer::TokenType::DASH_SIGN ) ) {
-		match ( cli::Lexer::TokenType::DASH_SIGN );
-		return std::make_unique < PreviousResultParam > ( false );
-	} else if ( check ( cli::Lexer::TokenType::IN_REDIRECT ) ) {
-		match ( cli::Lexer::TokenType::IN_REDIRECT );
-		return in_redirect_param ( );
-	} else if ( check ( cli::Lexer::TokenType::IDENTIFIER ) ) {
-		std::string value = matchIdentifier ( );
-		return std::make_unique < ImmediateParam < std::string > > ( value );
-	} else if ( check ( cli::Lexer::TokenType::STRING ) ) {
-		std::string value = matchString ( );
-		return std::make_unique < ImmediateParam < std::string > > ( value );
-	} else if ( check ( cli::Lexer::TokenType::INTEGER ) ) {
-		int value = matchInteger ( );
-		return std::make_unique < ImmediateParam < int > > ( value );
+		return ext::make_pair ( move, std::make_unique < ImmediateParam < int > > ( value ) );
 	} else if ( check ( cli::Lexer::TokenType::LEFT_PAREN ) ) {
 		match ( cli::Lexer::TokenType::LEFT_PAREN );
 		std::unique_ptr < Arg > type = arg ( );
 		match ( cli::Lexer::TokenType::RIGHT_PAREN );
-		std::unique_ptr < Param > castedParam = param ( );
-		return std::make_unique < CastParam > ( std::move ( type ), std::move ( castedParam ) );
+		ext::pair < bool, std::unique_ptr < Param > > castedParam = param ( );
+		return ext::make_pair ( move, std::make_unique < CastParam > ( std::move ( type ), std::move ( castedParam.second ), castedParam.first ) );
 	} else if ( check ( cli::Lexer::TokenType::DOLAR_SIGN ) ) {
 		match ( cli::Lexer::TokenType::DOLAR_SIGN );
 		std::unique_ptr < Arg > name = arg ( );
-		return std::make_unique < VariableParam > ( std::move ( name ), false );
+		return ext::make_pair ( move, std::make_unique < VariableParam > ( std::move ( name ) ) );
 	} else if ( check ( cli::Lexer::TokenType::HASH_SIGN ) ) {
 		match ( cli::Lexer::TokenType::HASH_SIGN );
 		std::string value = getTokenValue ( );
 		match ( cli::Lexer::TokenType::INTEGER, cli::Lexer::TokenType::IDENTIFIER );
-		return std::make_unique < ValueParam > ( std::make_unique < BindedArg > ( std::move ( value ) ) );
+		return ext::make_pair ( move, std::make_unique < ValueParam > ( std::make_unique < BindedArg > ( std::move ( value ) ) ) );
 	} else {
 		throw exception::CommonException ( "Mismatched set while expanding param rule." );
 	}
@@ -218,18 +183,21 @@ std::shared_ptr < Statement > Parser::single_statement ( ) {
 	// TODO builtin statement type to get string type
 	} else if ( check ( cli::Lexer::TokenType::IDENTIFIER ) ) {
 		std::unique_ptr < Arg > name = std::make_unique < ImmediateArg > ( matchIdentifier ( ) );
-		ext::vector < std::unique_ptr < cli::Arg > > templateParams;
+		ext::vector < std::unique_ptr < cli::Arg > > templateArgs;
 		while ( check ( cli::Lexer::TokenType::AT_SIGN ) ) {
-			templateParams.emplace_back ( template_param ( ) );
+			templateArgs.emplace_back ( template_arg ( ) );
 		}
 
 		std::unique_ptr < CategoryOption > category = category_option ( );
 		ext::vector < std::unique_ptr < Param > > params;
+		ext::vector < bool > moves;
 		while ( ! check ( cli::Lexer::TokenType::OUT_REDIRECT ) && ! check ( cli::Lexer::TokenType::PIPE_SIGN ) && ! check ( cli::Lexer::TokenType::END ) && ! check ( cli::Lexer::TokenType::RIGHT_PAREN ) ) {
-			params.emplace_back ( param ( ) );
+			ext::pair < bool, std::unique_ptr < Param > > parameter = param ( );
+			params.emplace_back ( std::move ( parameter.second ) );;
+			moves.push_back ( parameter.first );
 		}
 
-		return std::make_shared < SingleStatement > ( std::move ( name ), std::move ( templateParams ), std::move ( params ), std::move ( category ) );
+		return std::make_shared < SingleStatement > ( std::move ( name ), std::move ( templateArgs ), std::move ( params ), std::move ( category ), std::move ( moves ) );
 	} else if ( check ( cli::Lexer::TokenType::STRING ) ) {
 		std::string value = matchString ( );
 		return std::make_unique < ImmediateStatement < std::string > > ( value );
@@ -241,11 +209,14 @@ std::shared_ptr < Statement > Parser::single_statement ( ) {
 		std::unique_ptr < TypeOption > type = type_option ( );
 
 		ext::vector < std::unique_ptr < Param > > params;
+		ext::vector < bool > moves;
 		while ( ! check ( cli::Lexer::TokenType::RIGHT_BRACE ) ) {
-			params.emplace_back ( param ( ) );
+			ext::pair < bool, std::unique_ptr < Param > > parameter = param ( );
+			params.emplace_back ( std::move ( parameter.second ) );;
+			moves.push_back ( parameter.first );
 		}
 
-		std::shared_ptr < Statement > res = std::make_shared < ContainerStatement > ( "Set", std::move ( params ), std::move ( type ) );
+		std::shared_ptr < Statement > res = std::make_shared < ContainerStatement > ( "Set", std::move ( params ), std::move ( type ), std::move ( moves ) );
 		match ( cli::Lexer::TokenType::RIGHT_BRACE );
 		return res;
 	} else if ( check ( cli::Lexer::TokenType::HASH_SIGN ) ) {
@@ -274,6 +245,11 @@ std::shared_ptr < StatementList > Parser::statement_list_cont ( ) {
 }
 
 void Parser::out_redirect ( std::shared_ptr < StatementList > & list ) {
+	if ( check ( cli::Lexer::TokenType::LEFT_BRACKET ) ) {
+		match ( cli::Lexer::TokenType::LEFT_BRACKET );
+		std::unique_ptr < Arg > name = arg ( );
+		match ( cli::Lexer::TokenType::RIGHT_BRACKET );
+	}
 	if ( check ( cli::Lexer::TokenType::DOLAR_SIGN ) ) {
 		match ( cli::Lexer::TokenType::DOLAR_SIGN );
 		std::unique_ptr < Arg > name = arg ( );
@@ -325,13 +301,13 @@ std::unique_ptr < Command > Parser::introspect_command ( ) {
 		match_nonreserved_kw ( "overloads" );
 		std::unique_ptr < cli::Arg > param = arg ( );
 
-		ext::vector < std::unique_ptr < cli::Arg > > templateParams;
+		ext::vector < std::unique_ptr < cli::Arg > > templateArgs;
 		while ( check ( cli::Lexer::TokenType::AT_SIGN ) ) {
-			templateParams.emplace_back ( template_param ( ) );
+			templateArgs.emplace_back ( template_arg ( ) );
 		}
 
 		match ( cli::Lexer::TokenType::END );
-		return std::make_unique < OverloadsIntrospectionCommand > ( std::move ( param ), std::move ( templateParams ) );
+		return std::make_unique < OverloadsIntrospectionCommand > ( std::move ( param ), std::move ( templateArgs ) );
 	} else if ( check_nonreserved_kw ( "datatypes" ) ) {
 		match_nonreserved_kw ( "datatypes" );
 		std::unique_ptr < cli::Arg > param = optional_arg ( );
diff --git a/alib2cli/src/parser/Parser.h b/alib2cli/src/parser/Parser.h
index 1db21e5e5c24904600e27bf1b4140490353ce153..ce122e4d047fef640f6ae32f3bebbc63aa739f98 100644
--- a/alib2cli/src/parser/Parser.h
+++ b/alib2cli/src/parser/Parser.h
@@ -90,17 +90,13 @@ public:
 
 	std::unique_ptr < Arg > optional_arg ( );
 
+	std::unique_ptr < Arg > template_arg ( );
+
 	bool move_arg ( );
 
 	std::unique_ptr < Param > in_redirect_param ( );
 
-	std::unique_ptr < Param > param ( );
-
-	std::unique_ptr < Arg > template_param ( );
-
-	std::unique_ptr < Param > move_param ( );
-
-	std::unique_ptr < Param > value_param ( );
+	ext::pair < bool, std::unique_ptr < Param > > param ( );
 
 	std::shared_ptr < Statement > in_redirect_statement ( );