diff --git a/alib2cli/src/ast/statements/ResultPrintStatement.h b/alib2cli/src/ast/statements/ResultPrintStatement.h
index fe30f6f453323a78b7af5f9b6e8d228c860da630..87f637b5a506ccdb78be827cc9862033dabe3ad6 100644
--- a/alib2cli/src/ast/statements/ResultPrintStatement.h
+++ b/alib2cli/src/ast/statements/ResultPrintStatement.h
@@ -10,8 +10,8 @@ public:
 	ResultPrintStatement ( ) {
 	}
 
-	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & ) const override {
-		std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( prev->getReturnType ( ) );
+	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override {
+		std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( prev->getReturnType ( ), environment.getOutput ( ) );
 
 		if ( res->numberOfParams ( ) == 0 )
 			return res;
diff --git a/alib2cli/src/environment/Environment.h b/alib2cli/src/environment/Environment.h
index 6edac91dd3008d7f9cabe871479b862f01250634..e72970fc9b9c51e193ef568b00f179d3647c6380 100644
--- a/alib2cli/src/environment/Environment.h
+++ b/alib2cli/src/environment/Environment.h
@@ -11,11 +11,13 @@ class Environment {
 	ext::map < std::string, std::shared_ptr < abstraction::OperationAbstraction > > m_variables;
 
 	std::unique_ptr < Environment > m_upper;
+
+	std::reference_wrapper < std::ostream > m_output;
 public:
-	Environment ( ) {
+	Environment ( ) : m_output ( std::cout ) {
 	}
 
-	Environment ( std::unique_ptr < Environment > upper ) : m_upper ( std::move ( upper ) ) {
+	Environment ( std::unique_ptr < Environment > upper ) : m_upper ( std::move ( upper ) ), m_output ( std::cout ) {
 	}
 
 	std::string getBinding ( const std::string & name ) const {
@@ -58,6 +60,14 @@ public:
 		return m_variables.erase ( name );
 	}
 
+	void setOutput ( std::ostream & output ) {
+		m_output = output;
+	}
+
+	std::ostream & getOutput ( ) const {
+		return m_output;
+	}
+
 };
 
 } /* namespace cli */
diff --git a/alib2cli/src/parser/Parser.cpp b/alib2cli/src/parser/Parser.cpp
index e2be02264aa300b8e2b89169da7caa9976b6b2f0..237703f813bf5758f372991b2444ae55ddd77905 100644
--- a/alib2cli/src/parser/Parser.cpp
+++ b/alib2cli/src/parser/Parser.cpp
@@ -200,6 +200,7 @@ std::shared_ptr < Statement > Parser::single_statement ( ) {
 		bool move = move_arg ( );
 		std::shared_ptr < Statement > casted_statement = single_statement ( );
 		return std::make_shared < CastStatement > ( std::move ( type ), casted_statement, move );
+	// 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 ( ) );
 		std::unique_ptr < CategoryOption > category = category_option ( );
diff --git a/alib2common/src/abstraction/Registry.cpp b/alib2common/src/abstraction/Registry.cpp
index 5d58e1886c5ed3ff15a078e5fd2a9178252e0d27..500a7e06c3df381779dcd7519b134d4a0e01309d 100644
--- a/alib2common/src/abstraction/Registry.cpp
+++ b/alib2common/src/abstraction/Registry.cpp
@@ -94,8 +94,8 @@ std::shared_ptr < abstraction::OperationAbstraction > Registry::getDowncastAbstr
 	return DowncastRegistry::getAbstraction ( concrete, base );
 }
 
-std::shared_ptr < abstraction::OperationAbstraction > Registry::getValuePrinterAbstraction ( const std::string & param ) {
-	return ValuePrinterRegistry::getAbstraction ( param );
+std::shared_ptr < abstraction::OperationAbstraction > Registry::getValuePrinterAbstraction ( const std::string & param, std::ostream & os ) {
+	return ValuePrinterRegistry::getAbstraction ( param, os );
 }
 
 std::shared_ptr < abstraction::OperationAbstraction > Registry::getXmlFileWriterAbstraction ( const std::string & param, std::string filename ) {
diff --git a/alib2common/src/abstraction/Registry.h b/alib2common/src/abstraction/Registry.h
index 2a30239892764e828c35d3082ff658d2e75f27c7..8da6504e69f743812a80a85cb0b60db2a93271c9 100644
--- a/alib2common/src/abstraction/Registry.h
+++ b/alib2common/src/abstraction/Registry.h
@@ -39,7 +39,7 @@ public:
 	static std::shared_ptr < abstraction::OperationAbstraction > getImmediateAbstraction ( const std::string & result, std::string value );
 	static std::shared_ptr < abstraction::OperationAbstraction > getNormalizeAbstraction ( const std::string & param );
 	static std::shared_ptr < abstraction::OperationAbstraction > getDowncastAbstraction ( const std::string & concrete, const std::string & base );
-	static std::shared_ptr < abstraction::OperationAbstraction > getValuePrinterAbstraction ( const std::string & param );
+	static std::shared_ptr < abstraction::OperationAbstraction > getValuePrinterAbstraction ( const std::string & param, std::ostream & os );
 	static std::shared_ptr < abstraction::OperationAbstraction > getXmlFileWriterAbstraction ( const std::string & param, std::string filename );
 	static std::shared_ptr < abstraction::OperationAbstraction > getXmlComposerAbstraction ( const std::string & param );
 	static std::shared_ptr < abstraction::OperationAbstraction > getXmlParserAbstraction ( const std::string & typeName, ext::deque < sax::Token > tokens );
diff --git a/alib2common/src/abstraction/ValuePrinterAbstraction.hpp b/alib2common/src/abstraction/ValuePrinterAbstraction.hpp
index 24c0c28300f2a6c6aa3d1ff6850923329736c3c2..553c98167edda0a89faf15c3ba681cddeef04e1c 100644
--- a/alib2common/src/abstraction/ValuePrinterAbstraction.hpp
+++ b/alib2common/src/abstraction/ValuePrinterAbstraction.hpp
@@ -16,12 +16,17 @@ namespace abstraction {
 
 template < class ParamType >
 class ValuePrinterAbstraction : public UnaryOperationAbstraction < void, ParamType > {
+	std::ostream & m_ostream;
+
 public:
+	ValuePrinterAbstraction ( std::ostream & os ) : m_ostream ( os ) {
+	}
+
 	virtual bool run ( ) override {
 		if ( ! this->inputsReady ( ) )
 			return false;
 
-		std::cout << std::get < 0 > ( this->m_params )->getConstValueReference ( ) << std::endl;
+		m_ostream << std::get < 0 > ( this->m_params )->getConstValueReference ( ) << std::endl;
 		return true;
 	}
 };
@@ -29,6 +34,9 @@ public:
 template < >
 class ValuePrinterAbstraction < void > : public NullaryOperationAbstraction < void > {
 public:
+	ValuePrinterAbstraction ( std::ostream & ) {
+	}
+
 	virtual bool run ( ) override {
 		return true;
 	}
diff --git a/alib2common/src/abstraction/ValuePrinterRegistry.cpp b/alib2common/src/abstraction/ValuePrinterRegistry.cpp
index 89c5198a72266cc7ac9fcb4998923fe3fc43948d..b4c085df005e10bc8a7ebc359c6c3c3098f4542d 100644
--- a/alib2common/src/abstraction/ValuePrinterRegistry.cpp
+++ b/alib2common/src/abstraction/ValuePrinterRegistry.cpp
@@ -9,17 +9,17 @@
 
 namespace abstraction {
 
-std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::getAbstraction ( const std::string & param ) {
+std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::getAbstraction ( const std::string & param, std::ostream & os ) {
 	auto res = getEntries ( ).find ( param );
 	if ( res == getEntries ( ).end ( ) )
 		throw exception::CommonException ( "Entry " + param + " not available." );
 
-	return res->second->getAbstraction ( );
+	return res->second->getAbstraction ( os );
 }
 
 template < >
-std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( ) const {
-	return std::make_shared < abstraction::ValuePrinterAbstraction < void > > ( );
+std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( std::ostream & os ) const {
+	return std::make_shared < abstraction::ValuePrinterAbstraction < void > > ( os );
 }
 
 } /* namespace abstraction */
diff --git a/alib2common/src/abstraction/ValuePrinterRegistry.hpp b/alib2common/src/abstraction/ValuePrinterRegistry.hpp
index ccf6d3694a17915214c9f270995444ee97177293..8d797d1ec74337ec0386f11ec4315fe6e226e0a6 100644
--- a/alib2common/src/abstraction/ValuePrinterRegistry.hpp
+++ b/alib2common/src/abstraction/ValuePrinterRegistry.hpp
@@ -19,7 +19,7 @@ namespace abstraction {
 class ValuePrinterRegistry {
 	class Entry {
 	public:
-		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const = 0;
+		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::ostream & os ) const = 0;
 
 	};
 
@@ -29,7 +29,7 @@ class ValuePrinterRegistry {
 		EntryImpl ( ) {
 		}
 
-		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
+		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::ostream & os ) const override;
 	};
 
 	static ext::map < std::string, std::unique_ptr < Entry > > & getEntries ( ) {
@@ -49,7 +49,7 @@ public:
 		registerValuePrinter < ParamType > ( std::move ( param ) );
 	}
 
-	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & param );
+	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( const std::string & param, std::ostream & os );
 };
 
 } /* namespace abstraction */
@@ -59,12 +59,12 @@ public:
 namespace abstraction {
 
 template < class Param >
-std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < Param >::getAbstraction ( ) const {
-	return std::make_shared < abstraction::ValuePrinterAbstraction < const Param & > > ( );
+std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < Param >::getAbstraction ( std::ostream & os ) const {
+	return std::make_shared < abstraction::ValuePrinterAbstraction < const Param & > > ( os );
 }
 
 template < >
-std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( ) const;
+std::shared_ptr < abstraction::OperationAbstraction > ValuePrinterRegistry::EntryImpl < void >::getAbstraction ( std::ostream & ) const;
 
 } /* namespace abstraction */