diff --git a/alib2abstraction/src/abstraction/PackingAbstraction.hpp b/alib2abstraction/src/abstraction/PackingAbstraction.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..684ccf91a301e94e64ff3ef3bf50f79c9151a1cb
--- /dev/null
+++ b/alib2abstraction/src/abstraction/PackingAbstraction.hpp
@@ -0,0 +1,128 @@
+/*
+ * PackingAbstraction.hpp
+ *
+ *  Created on: 29. 5. 2018
+ *	  Author: Jan Travnicek
+ */
+
+#ifndef _PACKING_ABSTRACTION_HPP_
+#define _PACKING_ABSTRACTION_HPP_
+
+#include <abstraction/ValueOperationAbstraction.hpp>
+#include <alib/memory>
+#include <alib/array>
+#include <registry/Registry.h>
+
+namespace abstraction {
+
+template < class ... ParamTypes >
+class PackingAbstraction : public OperationAbstraction {
+	struct ConnectionTarget {
+		unsigned targetId;
+		unsigned paramPosition;
+	};
+
+	ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > m_abstractions;
+	ext::array < ext::vector < ConnectionTarget >, sizeof ... ( ParamTypes ) > m_connections;
+	unsigned m_resultId;
+
+public:
+	PackingAbstraction ( ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions, unsigned resultId ) : m_abstractions ( std::move ( abstractions ) ), m_resultId ( resultId ) {
+	}
+
+	bool setInnerConnection ( unsigned sourceId, unsigned targetId, unsigned paramPosition, bool move ) {
+		return m_abstractions [ targetId ]->attachInput ( m_abstractions [ sourceId ], paramPosition, move );
+	}
+
+	bool clearInnerConnection ( unsigned targetId, unsigned paramPosition ) {
+		return m_abstractions [ targetId ]->detachInput ( paramPosition );
+	}
+
+	void setOuterConnection ( unsigned sourceId, unsigned targetId, unsigned paramPosition ) {
+		m_connections [ sourceId ].push_back ( ConnectionTarget { targetId, paramPosition } );
+	}
+
+private:
+	virtual bool attachInput ( const std::shared_ptr < OperationAbstraction > & input, unsigned index, bool move ) override {
+		for ( const ConnectionTarget & target : m_connections [ index ] )
+			m_abstractions [ target.targetId ]->attachInput ( input, target.paramPosition, move );
+
+		return true;
+	}
+
+	virtual bool detachInput ( unsigned index ) override {
+		for ( const ConnectionTarget & target : m_connections [ index ] )
+			m_abstractions [ target.targetId ]->detachInput ( target.paramPosition );
+
+		return true;
+	}
+public:
+	virtual bool inputsReady ( ) const override {
+		for ( const std::shared_ptr < abstraction::OperationAbstraction > & operation : m_abstractions )
+			if ( operation->inputsReady ( ) == false )
+				return false;
+
+		return true;
+	}
+
+	virtual bool inputsAttached ( ) const override {
+		for ( const std::shared_ptr < abstraction::OperationAbstraction > & operation : m_abstractions )
+			if ( operation->inputsAttached ( ) == false )
+				return false;
+
+		return true;
+	}
+
+	virtual bool run ( ) override {
+		if ( ! this->inputsReady ( ) )
+			return false;
+
+		if ( this->cached ( ) )
+			return true;
+
+		return m_abstractions [ m_resultId ]->run ( );
+	}
+
+	virtual bool eval ( ) override {
+		if ( ! inputsAttached ( ) )
+			return false;
+
+		if ( this->cached ( ) )
+			return true;
+
+		return m_abstractions [ m_resultId ]->eval ( );
+	}
+
+	virtual unsigned numberOfParams ( ) const override {
+		return sizeof ... ( ParamTypes );
+	}
+
+	virtual bool isReady ( ) const override {
+		return m_abstractions [ m_resultId ]->isReady ( );
+	}
+
+	virtual bool cached ( ) const override {
+		return isReady ( );
+	}
+
+	virtual ext::type_index getParamTypeIndex ( unsigned index ) const override {
+		return m_abstractions [ m_connections.at ( index ) [ 0 ].targetId ]->getParamTypeIndex ( m_connections.at ( index ) [ 0 ].paramPosition );
+	}
+
+	virtual ext::type_index getReturnTypeIndex ( ) const override {
+		return m_abstractions [ m_resultId ]->getReturnTypeIndex ( );
+	}
+
+	virtual ext::type_index getRuntimeReturnTypeIndex ( ) const override {
+		return m_abstractions [ m_resultId ]->getRuntimeReturnTypeIndex ( );
+	}
+
+	virtual std::shared_ptr < abstraction::OperationAbstraction > getProxyAbstraction ( ) override {
+		return m_abstractions [ m_resultId ]->getProxyAbstraction ( );
+	}
+
+};
+
+} /* namespace abstraction */
+
+#endif /* _PACKING_ABSTRACTION_HPP_ */
diff --git a/alib2abstraction/src/abstraction/WrapperAbstraction.hpp b/alib2abstraction/src/abstraction/WrapperAbstraction.hpp
index a6ba12ec297b93a771e9188f86743e68c3719dd5..3fe76613c054ecc05b7cb05417eebf9113281db0 100644
--- a/alib2abstraction/src/abstraction/WrapperAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/WrapperAbstraction.hpp
@@ -104,7 +104,7 @@ public:
 		for ( unsigned index = 0; index < sizeof ... ( ParamTypes ); ++ index )
 			abstraction->attachInput ( ext::call_on_nth < std::shared_ptr < abstraction::OperationAbstraction > > ( m_params, index, getParam ), index, m_moves [ index ] );
 
-		return m_data.template get < std::shared_ptr < OperationAbstraction > > ( )->run ( );
+		return abstraction->run ( );
 	}
 
 	virtual bool eval ( ) override {
diff --git a/alib2cli/src/registration/InputFileTypeRegistration.cpp b/alib2cli/src/registration/InputFileTypeRegistration.cpp
index 099a3009333993ffa21be3365517d7c93f376a3f..4657c86e55da2f8addf7a0598bee33c94b2ad7cc 100644
--- a/alib2cli/src/registration/InputFileTypeRegistration.cpp
+++ b/alib2cli/src/registration/InputFileTypeRegistration.cpp
@@ -1,24 +1,64 @@
 #include "InputFileTypeRegistration.hpp"
 
-#include <common/XmlParserHelper.h>
 #include <registry/XmlRegistry.h>
 
+#include <abstraction/ImmediateValueAbstraction.hpp>
+#include <abstraction/XmlTokensParserAbstraction.hpp>
+#include <abstraction/WrapperAbstraction.hpp>
+#include <abstraction/PackingAbstraction.hpp>
+
 namespace {
 
-	std::shared_ptr < abstraction::OperationAbstraction > dummy ( const std::string & file, const std::string & type, const ext::vector < std::string > & templateParams ) {
-		if ( type == "set" || type == "Set" ) {
-			std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > tokens = abstraction::XmlRegistry::fileToTokensAbstraction ( file );
-			tokens->eval ( );
+	std::shared_ptr < abstraction::OperationAbstraction > dummy ( const std::string & filename, const std::string & typehint, const ext::vector < std::string > & templateParams ) {
+		if ( typehint == "set" || typehint == "Set" ) {
+			ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions;
+
+			abstractions.push_back ( std::make_shared < abstraction::XmlTokensParserAbstraction > ( ) );
+			abstractions.push_back ( abstraction::XmlRegistry::getXmlContainerParserAbstraction ( "Set", templateParams [ 0 ] ) );
+
+			std::shared_ptr < abstraction::PackingAbstraction < std::string > > res = std::make_shared < abstraction::PackingAbstraction < std::string > > ( std::move ( abstractions ), 1 );
+			res->setInnerConnection ( 0, 1, 0, true );
+			res->setOuterConnection ( 0, 0, 0 );
 
-			std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlContainerParserAbstraction ( "Set", templateParams [ 0 ] );
-			res->attachInput ( tokens, 0, true );
-			res->eval ( );
-			return res;
+			std::shared_ptr < abstraction::OperationAbstraction > tmp = res;
+			std::shared_ptr < abstraction::ImmediateValueAbstraction < std::string > > file = std::make_shared < abstraction::ImmediateValueAbstraction < std::string > > ( filename );
+			tmp->attachInput ( file, 0, false );
+			tmp->eval ( );
+			return tmp;
 		} else {
-			return abstraction::XmlParserHelper::eval ( std::move ( type ), file );
+			ext::vector < std::shared_ptr < abstraction::OperationAbstraction > > abstractions;
+
+			abstractions.push_back ( std::make_shared < abstraction::XmlTokensParserAbstraction > ( ) );
+
+			auto xmlParserAbstractionFinder = [ = ] ( const ext::deque < sax::Token > & tokens ) {
+				std::string type;
+				if ( typehint == "" )
+					type = tokens [ 0 ].getData ( );
+				else
+					type = typehint;
+
+				return abstraction::XmlRegistry::getXmlParserAbstraction ( type );
+			};
+
+			abstractions.push_back ( std::make_shared < abstraction::WrapperAbstraction < const ext::deque < sax::Token > & > > ( xmlParserAbstractionFinder ) );
+
+			std::shared_ptr < abstraction::PackingAbstraction < std::string > > res = std::make_shared < abstraction::PackingAbstraction < std::string > > ( std::move ( abstractions ), 1 );
+			res->setInnerConnection ( 0, 1, 0, true );
+			res->setOuterConnection ( 0, 0, 0 );
+
+			std::shared_ptr < abstraction::OperationAbstraction > tmp = res;
+			std::shared_ptr < abstraction::ImmediateValueAbstraction < std::string > > file = std::make_shared < abstraction::ImmediateValueAbstraction < std::string > > ( filename );
+			tmp->attachInput ( file, 0, false );
+			tmp->eval ( );
+			return tmp;
 		}
 	}
 
+	std::shared_ptr < abstraction::OperationAbstraction > dummy2 ( const std::string & /*filename*/, const std::string & /*typehint*/, const ext::vector < std::string > & /*templateParams*/ ) {
+		return nullptr;
+	}
+
 auto xmlInputFileHandler = registration::InputFileRegister ( "xml", dummy );
+auto stringInputFileHandler = registration::InputFileRegister ( "", dummy2 );
 
 }
diff --git a/alib2cli/src/registration/OutputFileTypeRegistration.cpp b/alib2cli/src/registration/OutputFileTypeRegistration.cpp
index af4be6da61240c1b0d27f35c138004dbcc2ddc6c..729aeb3658c03c63758b41dddcecb00f5463496f 100644
--- a/alib2cli/src/registration/OutputFileTypeRegistration.cpp
+++ b/alib2cli/src/registration/OutputFileTypeRegistration.cpp
@@ -1,11 +1,29 @@
 #include "OutputFileTypeRegistration.hpp"
 
-#include <common/XmlComposerHelper.h>
+#include <exception/CommonException.h>
+
+#include <registry/XmlRegistry.h>
+#include <abstraction/ImmediateValueAbstraction.hpp>
+#include <abstraction/XmlTokensComposerAbstraction.hpp>
 
 namespace {
 
-	std::shared_ptr < abstraction::OperationAbstraction > dummy ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file ) {
-		return abstraction::XmlComposerHelper::eval ( param, file );
+	std::shared_ptr < abstraction::OperationAbstraction > dummy ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & filename ) {
+		std::shared_ptr < abstraction::OperationAbstraction > tokens = abstraction::XmlRegistry::getXmlComposerAbstraction ( param->getReturnType ( ) );
+		if ( ! tokens->attachInput ( param, 0, false ) )
+			throw exception::CommonException ( "Can't connect param at 0 of result file statement with result of type " + param->getReturnType ( ) + "." );
+		if ( ! tokens->eval ( ) )
+			throw exception::CommonException ( "Eval of result file statement failed." );
+
+		std::shared_ptr < abstraction::ImmediateValueAbstraction < std::string > > file = std::make_shared < abstraction::ImmediateValueAbstraction < std::string > > ( filename );
+
+		std::shared_ptr < abstraction::OperationAbstraction > res = std::make_shared < abstraction::XmlTokensComposerAbstraction > ( );
+
+		res->attachInput ( file, 1, false );
+		res->attachInput ( tokens, 0, true );
+		res->eval ( );
+
+		return res;
 	}
 
 auto xmlOutputFileHandler = registration::OutputFileRegister ( "xml", dummy );
diff --git a/alib2cli/src/registry/InputFileRegistry.cpp b/alib2cli/src/registry/InputFileRegistry.cpp
index 43e97d1d5860023bb160a2a33a318e9245b9deaa..52861955113e9c9745495176a6dbe4a5ba9b0b63 100644
--- a/alib2cli/src/registry/InputFileRegistry.cpp
+++ b/alib2cli/src/registry/InputFileRegistry.cpp
@@ -10,12 +10,12 @@
 
 namespace abstraction {
 
-std::shared_ptr < abstraction::OperationAbstraction > InputFileRegistry::getAbstraction ( const std::string & file, const std::string & fileType, const std::string & type, const ext::vector < std::string > & templateParams ) {
+std::shared_ptr < abstraction::OperationAbstraction > InputFileRegistry::getAbstraction ( const std::string & filename, const std::string & fileType, const std::string & type, const ext::vector < std::string > & templateParams ) {
 	auto res = getEntries ( ).find ( fileType );
 	if ( res == getEntries ( ).end ( ) )
 		throw exception::CommonException ( "Entry " + fileType + " not available." );
 
-	return res->second->getAbstraction ( file, type, templateParams );
+	return res->second->getAbstraction ( filename, type, templateParams );
 }
 
 std::shared_ptr < abstraction::OperationAbstraction > InputFileRegistry::EntryImpl::getAbstraction ( const std::string & file, const std::string & type, const ext::vector < std::string > & templateParams ) const {
diff --git a/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp b/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp
index 01e882adedecd980385251d43460fb05f4e82a15..91fb2d65fa3e97ab9994d314a75fe830c73a0976 100644
--- a/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp
+++ b/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp
@@ -9,6 +9,7 @@
 #define _XML_TOKENS_COMPOSER_ABSTRACTION_HPP_
 
 #include <abstraction/BinaryOperationAbstraction.hpp>
+#include <sax/SaxComposeInterface.h>
 
 namespace abstraction {
 
diff --git a/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp b/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp
index b8dab71dbcde9f9d3330b1da27c5a4c1943927ea..b2ed62c6a241408f94053effc869ee8b6a51db1d 100644
--- a/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp
+++ b/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp
@@ -9,6 +9,7 @@
 #define _XML_TOKENS_PARSER_ABSTRACTION_HPP_
 
 #include <abstraction/UnaryOperationAbstraction.hpp>
+#include <sax/SaxParseInterface.h>
 
 namespace abstraction {
 
diff --git a/alib2xml/src/common/XmlComposerHelper.cpp b/alib2xml/src/common/XmlComposerHelper.cpp
deleted file mode 100644
index e8c940e546e499dd07f5ae8400d54725b81ced74..0000000000000000000000000000000000000000
--- a/alib2xml/src/common/XmlComposerHelper.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * XmlComposerHelper.cpp
- *
- *  Created on: 25. 8. 2017
- *	  Author: Jan Travnicek
- */
-
-#include <exception/CommonException.h>
-
-#include <common/XmlComposerHelper.h>
-
-#include <registry/XmlRegistry.h>
-#include <abstraction/ImmediateValueAbstraction.hpp>
-
-namespace abstraction {
-
-std::shared_ptr < abstraction::OperationAbstraction > XmlComposerHelper::eval ( std::shared_ptr < abstraction::OperationAbstraction > param, const std::string & file ) {
-	std::shared_ptr < abstraction::OperationAbstraction > tokens = abstraction::XmlRegistry::getXmlComposerAbstraction ( param->getReturnType ( ) );
-	if ( ! tokens->attachInput ( param, 0, false ) )
-		throw exception::CommonException ( "Can't connect param at 0 of result file statement with result of type " + param->getReturnType ( ) + "." );
-	if ( ! tokens->eval ( ) )
-		throw exception::CommonException ( "Eval of result file statement failed." );
-
-	std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::tokensToFileAbstraction ( file );
-	res->attachInput ( tokens, 0, true );
-	res->eval ( );
-
-	return res;
-}
-
-
-} /* namespace abstraction */
diff --git a/alib2xml/src/common/XmlComposerHelper.h b/alib2xml/src/common/XmlComposerHelper.h
deleted file mode 100644
index 8575ed854b6db9c1ad56f134c40db8f1bf67567f..0000000000000000000000000000000000000000
--- a/alib2xml/src/common/XmlComposerHelper.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * AbstractionHelper.hpp
- *
- *  Created on: 25. 8. 2017
- *	  Author: Jan Travnicek
- */
-
-#ifndef _XML_COMPOSER_HELPER_HPP_
-#define _XML_COMPOSER_HELPER_HPP_
-
-#include <alib/string>
-#include <alib/memory>
-#include <abstraction/OperationAbstraction.hpp>
-
-namespace abstraction {
-
-class XmlComposerHelper {
-public:
-	static std::shared_ptr < abstraction::OperationAbstraction > eval ( std::shared_ptr < abstraction::OperationAbstraction > type, const std::string & file );
-
-};
-
-} /* namespace abstraction */
-
-#endif /* _XML_COMPOSER_HELPER_HPP_ */
diff --git a/alib2xml/src/common/XmlParserHelper.cpp b/alib2xml/src/common/XmlParserHelper.cpp
deleted file mode 100644
index 3ad2e1b17cc7dfb7392c70117a58c37339f894a8..0000000000000000000000000000000000000000
--- a/alib2xml/src/common/XmlParserHelper.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * XmlParserHelper.cpp
- *
- *  Created on: 25. 8. 2017
- *	  Author: Jan Travnicek
- */
-
-#include <common/XmlParserHelper.h>
-
-#include <registry/XmlRegistry.h>
-#include <abstraction/ImmediateValueAbstraction.hpp>
-
-namespace abstraction {
-
-std::shared_ptr < abstraction::OperationAbstraction > XmlParserHelper::eval ( std::string type, const std::string & file ) {
-	std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > tokens = abstraction::XmlRegistry::fileToTokensAbstraction ( file );
-	tokens->eval ( );
-
-	if ( type == "" )
-		type = std::dynamic_pointer_cast < abstraction::ValueProvider < const ext::deque < sax::Token > & > > ( tokens )->getValue ( false ) [ 0 ].getData ( );
-
-	std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::XmlRegistry::getXmlParserAbstraction ( type );
-	res->attachInput ( tokens, 0, true );
-	res->eval ( );
-	return res;
-}
-
-
-} /* namespace abstraction */
diff --git a/alib2xml/src/common/XmlParserHelper.h b/alib2xml/src/common/XmlParserHelper.h
deleted file mode 100644
index ab52575ebaaddad34596ed043d7558df26dc0ec3..0000000000000000000000000000000000000000
--- a/alib2xml/src/common/XmlParserHelper.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * AbstractionHelper.hpp
- *
- *  Created on: 25. 8. 2017
- *	  Author: Jan Travnicek
- */
-
-#ifndef _XML_PARSER_HELPER_HPP_
-#define _XML_PARSER_HELPER_HPP_
-
-#include <alib/string>
-#include <alib/memory>
-#include <abstraction/OperationAbstraction.hpp>
-
-namespace abstraction {
-
-class XmlParserHelper {
-public:
-	static std::shared_ptr < abstraction::OperationAbstraction > eval ( std::string type, const std::string & file );
-
-};
-
-} /* namespace abstraction */
-
-#endif /* _XML_PARSER_HELPER_HPP_ */
diff --git a/alib2xml/src/registry/XmlRegistry.cpp b/alib2xml/src/registry/XmlRegistry.cpp
index b6861bfd16c174e7d8b2134db7e80b56b66fdb79..974688936ed25973b9a113a8125eebe50bfab003 100644
--- a/alib2xml/src/registry/XmlRegistry.cpp
+++ b/alib2xml/src/registry/XmlRegistry.cpp
@@ -12,8 +12,6 @@
 #include <registry/XmlContainerParserRegistry.hpp>
 
 #include <abstraction/ImmediateValueAbstraction.hpp>
-#include <abstraction/XmlTokensComposerAbstraction.hpp>
-#include <abstraction/XmlTokensParserAbstraction.hpp>
 
 namespace abstraction {
 
@@ -37,27 +35,4 @@ std::shared_ptr < abstraction::OperationAbstraction > XmlRegistry::getXmlContain
 	return XmlContainerParserRegistry::getAbstraction ( container, type );
 }
 
-std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > XmlRegistry::fileToTokensAbstraction ( const std::string & filename ) {
-	std::shared_ptr < abstraction::ImmediateValueAbstraction < std::string > > file = std::make_shared < abstraction::ImmediateValueAbstraction < std::string > > ( filename );
-
-	std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > res = std::make_shared < abstraction::XmlTokensParserAbstraction > ( );
-	std::shared_ptr < abstraction::OperationAbstraction > tmp = res;
-
-	tmp->attachInput ( file, 0, false );
-
-	return res;
-}
-
-std::shared_ptr < abstraction::BinaryOperationAbstraction < void, const ext::deque < sax::Token > &, const std::string & > > XmlRegistry::tokensToFileAbstraction ( const std::string & filename ) {
-	std::shared_ptr < abstraction::ImmediateValueAbstraction < std::string > > file = std::make_shared < abstraction::ImmediateValueAbstraction < std::string > > ( filename );
-
-	std::shared_ptr < abstraction::BinaryOperationAbstraction < void, const ext::deque < sax::Token > &, const std::string & > > res = std::make_shared < abstraction::XmlTokensComposerAbstraction > ( );
-	std::shared_ptr < abstraction::OperationAbstraction > tmp = res;
-
-	tmp->attachInput ( file, 1, false );
-
-	return res;
-
-}
-
 } /* namespace abstraction */
diff --git a/alib2xml/src/registry/XmlRegistry.h b/alib2xml/src/registry/XmlRegistry.h
index 391753507b0493e5a59f8dd0977d68902af4fc89..7fc56ef229c96910262f47ebe075a8735fae8cf8 100644
--- a/alib2xml/src/registry/XmlRegistry.h
+++ b/alib2xml/src/registry/XmlRegistry.h
@@ -29,9 +29,6 @@ public:
 	static std::shared_ptr < abstraction::OperationAbstraction > getXmlParserAbstraction ( const std::string & type );
 
 	static std::shared_ptr < abstraction::OperationAbstraction > getXmlContainerParserAbstraction ( const std::string & container, const std::string & type );
-
-	static std::shared_ptr < abstraction::UnaryOperationAbstraction < ext::deque < sax::Token >, const std::string & > > fileToTokensAbstraction ( const std::string & filename );
-	static std::shared_ptr < abstraction::BinaryOperationAbstraction < void, const ext::deque < sax::Token > &, const std::string & > > tokensToFileAbstraction ( const std::string & filename );
 };
 
 } /* namespace abstraction */