diff --git a/alib2abstraction/src/abstraction/CastAbstraction.hpp b/alib2abstraction/src/abstraction/CastAbstraction.hpp
index 028efa7b67f4135639ecca521af6ed7d2e26a118..f15e5b9d2bc3a545abe41f247ce4d8894b97caea 100644
--- a/alib2abstraction/src/abstraction/CastAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/CastAbstraction.hpp
@@ -19,7 +19,7 @@ public:
 	std::shared_ptr < abstraction::Value > run ( ) override {
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) );
 
-		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), ReturnType ( retrieveValue < const ParamType & > ( param.first, param.second ) ), true );
+		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( ReturnType ( retrieveValue < const ParamType & > ( param.first, param.second ) ), true );
 	}
 
 };
diff --git a/alib2abstraction/src/abstraction/NormalizeAbstraction.hpp b/alib2abstraction/src/abstraction/NormalizeAbstraction.hpp
index ee8b9ab5d33c38891978d9ec2104e2b4143059a7..d5ff9f4bf123a781357b322816d9446b34fc79f6 100644
--- a/alib2abstraction/src/abstraction/NormalizeAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/NormalizeAbstraction.hpp
@@ -22,7 +22,7 @@ public:
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & rawParam = std::get < 0 > ( this->getParams ( ) );
 		ParamType && param = retrieveValue < ParamType && > ( rawParam.first, rawParam.second );
 
-		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), factory::NormalizeFactory::normalize ( std::move ( param ) ), true );
+		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( factory::NormalizeFactory::normalize ( std::move ( param ) ), true );
 	}
 
 };
diff --git a/alib2abstraction/src/abstraction/ReferenceAbstraction.hpp b/alib2abstraction/src/abstraction/ReferenceAbstraction.hpp
index 51cb51ffb9327493d00dde1fa7ee82cb7e02def2..04677ad5651d6d8a17d773747e26c46137a475a2 100644
--- a/alib2abstraction/src/abstraction/ReferenceAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/ReferenceAbstraction.hpp
@@ -21,7 +21,7 @@ public:
 	std::shared_ptr < abstraction::Value > run ( ) override {
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) );
 
-		return std::make_shared < abstraction::ValueHolder < Type * > > ( this->getProxyAbstraction ( ), & retrieveValue < Type & > ( param.first, param.second ), true );
+		return std::make_shared < abstraction::ValueHolder < Type * > > ( & retrieveValue < Type & > ( param.first, param.second ), true );
 	}
 
 };
diff --git a/alib2abstraction/src/abstraction/SetAbstraction.hpp b/alib2abstraction/src/abstraction/SetAbstraction.hpp
index e304ec94823e63de519d2f54abd35acbd94aa16e..854e17d9f872fe8a4b42259c5fb6afc7cb6413bf 100644
--- a/alib2abstraction/src/abstraction/SetAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/SetAbstraction.hpp
@@ -24,7 +24,7 @@ public:
 			theSet.insert ( abstraction::retrieveValue < ParamType > ( param.first, param.second ) );
 		}
 
-		return std::make_shared < abstraction::ValueHolder < ext::set < ParamType > > > ( this->getProxyAbstraction ( ), std::move ( theSet ), true );
+		return std::make_shared < abstraction::ValueHolder < ext::set < ParamType > > > ( std::move ( theSet ), true );
 	}
 
 };
diff --git a/alib2abstraction/src/abstraction/TemporariesHolder.cpp b/alib2abstraction/src/abstraction/TemporariesHolder.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..5852e26918e4d76a6a95a85e0ce32ef45d68d2d7
--- /dev/null
+++ b/alib2abstraction/src/abstraction/TemporariesHolder.cpp
@@ -0,0 +1,17 @@
+#include <abstraction/TemporariesHolder.h>
+
+namespace abstraction {
+
+void TemporariesHolder::holdTemporary ( std::shared_ptr < abstraction::Value > temporary ) {
+	temporary->increaseTemporaryReference ( );
+	m_temporaries.push_back ( std::move ( temporary ) );
+}
+
+void TemporariesHolder::clearTemporaries ( ) {
+	for ( std::shared_ptr < abstraction::Value > & temporary : m_temporaries ) {
+		temporary->decreaseTemporaryReference ( );
+	}
+	m_temporaries.clear ( );
+}
+
+} /* namespace abstraction */
diff --git a/alib2abstraction/src/abstraction/TemporariesHolder.h b/alib2abstraction/src/abstraction/TemporariesHolder.h
new file mode 100644
index 0000000000000000000000000000000000000000..509fc5d86ca419ab87ece7d0ebbaa1300f6dde98
--- /dev/null
+++ b/alib2abstraction/src/abstraction/TemporariesHolder.h
@@ -0,0 +1,32 @@
+#ifndef _TEMPORARIES_HOLDER_H_
+#define _TEMPORARIES_HOLDER_H_
+
+#include <alib/vector>
+#include <abstraction/Value.hpp>
+
+namespace abstraction {
+
+class TemporariesHolder {
+	std::vector < std::shared_ptr < abstraction::Value > > m_temporaries;
+
+public:
+	TemporariesHolder ( ) = default;
+
+	TemporariesHolder ( const TemporariesHolder & ) = delete;
+
+	TemporariesHolder ( TemporariesHolder && ) = default;
+
+	TemporariesHolder & operator = ( const TemporariesHolder & ) = delete;
+
+	TemporariesHolder & operator = ( TemporariesHolder && ) = default;
+
+	virtual ~TemporariesHolder ( ) = default;
+
+	void holdTemporary ( std::shared_ptr < abstraction::Value > temporary );
+
+	void clearTemporaries ( );
+};
+
+} /* namespace abstraction */
+
+#endif /* _TEMPORARIES_HOLDER_H_ */
diff --git a/alib2abstraction/src/abstraction/Value.cpp b/alib2abstraction/src/abstraction/Value.cpp
index 80de81380b462359941b486a4048f81f251fa626..548fac02fa7649d1da5e024602a964eba043a115 100644
--- a/alib2abstraction/src/abstraction/Value.cpp
+++ b/alib2abstraction/src/abstraction/Value.cpp
@@ -10,9 +10,6 @@
 
 namespace abstraction {
 
-Value::Value ( const std::shared_ptr < abstraction::OperationAbstraction > & ref ) : m_lifeReference ( ref ) {
-}
-
 std::shared_ptr < abstraction::Value > Value::getProxyAbstraction ( ) {
 	return shared_from_this ( );
 }
@@ -21,12 +18,8 @@ std::string Value::getType ( ) const {
 	return ext::to_string ( getTypeIndex ( ) );
 }
 
-const std::shared_ptr < abstraction::OperationAbstraction > & Value::getLifeReference ( ) const {
-	return m_lifeReference;
-}
-
 
-std::shared_ptr < abstraction::Value > Void::clone ( const std::shared_ptr < abstraction::OperationAbstraction > &, abstraction::ParamQualifiers::ParamQualifierSet, bool, bool ) {
+std::shared_ptr < abstraction::Value > Void::clone ( abstraction::ParamQualifiers::ParamQualifierSet, bool, bool ) {
 	throw std::domain_error ( "Void variables are not allowed" );
 }
 
@@ -39,10 +32,10 @@ abstraction::ParamQualifiers::ParamQualifierSet Void::getTypeQualifiers ( ) cons
 }
 
 
-LazyValue::LazyValue ( const std::shared_ptr < abstraction::OperationAbstraction > & ref ) : Value ( std::move ( ref ) ) {
+LazyValue::LazyValue ( const std::shared_ptr < abstraction::OperationAbstraction > & ref ) : m_lifeReference ( std::move ( ref ) ) {
 }
 
-std::shared_ptr < abstraction::Value > LazyValue::clone ( const std::shared_ptr < abstraction::OperationAbstraction > &, abstraction::ParamQualifiers::ParamQualifierSet, bool, bool ) {
+std::shared_ptr < abstraction::Value > LazyValue::clone ( abstraction::ParamQualifiers::ParamQualifierSet, bool, bool ) {
 	throw std::domain_error ( "Feature not available on lazy value" );
 }
 
@@ -60,4 +53,8 @@ std::shared_ptr < abstraction::Value > LazyValue::getProxyAbstraction ( ) {
 	return cache->getProxyAbstraction ( );
 }
 
+const std::shared_ptr < abstraction::OperationAbstraction > & LazyValue::getLifeReference ( ) const {
+	return m_lifeReference;
+}
+
 } /* namespace abstraction */
diff --git a/alib2abstraction/src/abstraction/Value.hpp b/alib2abstraction/src/abstraction/Value.hpp
index 3ae3de118da46b633f89589cf074e879dea7b4a6..df351ba59dc20c428b393f54127bff06f8dc4dae 100644
--- a/alib2abstraction/src/abstraction/Value.hpp
+++ b/alib2abstraction/src/abstraction/Value.hpp
@@ -19,14 +19,12 @@ namespace abstraction {
 class OperationAbstraction;
 
 class Value : public std::enable_shared_from_this < Value > {
-	std::shared_ptr < abstraction::OperationAbstraction > m_lifeReference;
+	size_t m_temporaryReferences = 0;
 
 public:
-	Value ( const std::shared_ptr < abstraction::OperationAbstraction > & ref );
-
 	virtual ~Value ( ) noexcept = default;
 
-	virtual std::shared_ptr < abstraction::Value > clone ( const std::shared_ptr < abstraction::OperationAbstraction > & lifeReference, abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move = false ) = 0;
+	virtual std::shared_ptr < abstraction::Value > clone ( abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move = false ) = 0;
 
 	virtual std::shared_ptr < abstraction::Value > getProxyAbstraction ( );
 
@@ -36,14 +34,25 @@ public:
 
 	virtual abstraction::ParamQualifiers::ParamQualifierSet getTypeQualifiers ( ) const = 0;
 
-	const std::shared_ptr < abstraction::OperationAbstraction > & getLifeReference ( ) const;
+	void increaseTemporaryReference ( ) {
+		m_temporaryReferences += 1;
+	}
+
+	void decreaseTemporaryReference ( ) {
+		if ( m_temporaryReferences == 0 )
+			throw std::domain_error ( "Attempted to decrease temporary reference count bellow zerp" );
+
+		m_temporaryReferences -= 1;
+	}
+
+	size_t getTemporaryReferences ( ) const {
+		return m_temporaryReferences;
+	}
 };
 
 class Void : public Value {
 public:
-	using Value::Value;
-
-	std::shared_ptr < abstraction::Value > clone ( const std::shared_ptr < abstraction::OperationAbstraction > & lifeReference, abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override;
+	std::shared_ptr < abstraction::Value > clone ( abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override;
 
 	ext::type_index getTypeIndex ( ) const override;
 
@@ -53,17 +62,20 @@ public:
 
 class LazyValue : public Value {
 	std::shared_ptr < Value > cache;
+	std::shared_ptr < abstraction::OperationAbstraction > m_lifeReference;
 
 public:
 	LazyValue ( const std::shared_ptr < abstraction::OperationAbstraction > & ref );
 
-	std::shared_ptr < abstraction::Value > clone ( const std::shared_ptr < abstraction::OperationAbstraction > & lifeReference, abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override;
+	std::shared_ptr < abstraction::Value > clone ( abstraction::ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override;
 
 	ext::type_index getTypeIndex ( ) const override;
 
 	abstraction::ParamQualifiers::ParamQualifierSet getTypeQualifiers ( ) const override;
 
 	std::shared_ptr < abstraction::Value > getProxyAbstraction ( ) override;
+
+	const std::shared_ptr < abstraction::OperationAbstraction > & getLifeReference ( ) const;
 };
 
 } /* namespace abstraction */
diff --git a/alib2abstraction/src/abstraction/ValueHolder.hpp b/alib2abstraction/src/abstraction/ValueHolder.hpp
index 77cafbd5af375adc34ad620058e8d4b193e5ea7e..88cb61a23d066958feeb5cbc961c1a23a78b0712 100644
--- a/alib2abstraction/src/abstraction/ValueHolder.hpp
+++ b/alib2abstraction/src/abstraction/ValueHolder.hpp
@@ -114,30 +114,30 @@ public:
 template < class Type >
 class ValueHolder : public ValueHolderImpl < Type > {
 public:
-	ValueHolder ( const std::shared_ptr < abstraction::OperationAbstraction > & ref, Type && value, bool temporary ) : ValueHolderImpl < Type > ( ref, ParamQualifiers::paramQualifiers < Type > ( ), temporary ) {
+	ValueHolder ( Type && value, bool temporary ) : ValueHolderImpl < Type > ( ParamQualifiers::paramQualifiers < Type > ( ), temporary ) {
 		this->setData ( std::forward < Type > ( value ) );
 	}
 
-	std::shared_ptr < abstraction::Value > clone ( const std::shared_ptr < abstraction::OperationAbstraction > & lifeReference, ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override {
-		if ( ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::LREF || paramQualifierSet && ParamQualifiers::ParamQualifierSet::RREF ) && this->isTemporary ( ) && ! this->isRef ( ) && lifeReference == nullptr )
-			throw std::domain_error ( "Taking reference to a temporary" );
+	std::shared_ptr < abstraction::Value > clone ( ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary, bool move ) override {
+/*		if ( ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::LREF || paramQualifierSet && ParamQualifiers::ParamQualifierSet::RREF ) && this->isTemporary ( ) && ! this->isRef ( ) && this->getTemporaryReferences ( ) == 0 )
+			throw std::domain_error ( "Taking reference to a temporary" );*/
 
 		if ( ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::CONST ) && ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::LREF ) )
-			return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > & > > ( lifeReference, retrieveValue < const std::decay_t < Type > & > ( this->getProxyAbstraction ( ), move ), isTemporary );
+			return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > & > > ( retrieveValue < const std::decay_t < Type > & > ( this->getProxyAbstraction ( ), move ), isTemporary );
 		else if ( ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::CONST ) && ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::RREF ) )
-			return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > && > > ( lifeReference, retrieveValue < const std::decay_t < Type > && > ( this->getProxyAbstraction ( ), move ), isTemporary );
+			return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > && > > ( retrieveValue < const std::decay_t < Type > && > ( this->getProxyAbstraction ( ), move ), isTemporary );
 		else if ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::LREF )
-			return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > & > > ( lifeReference, retrieveValue < std::decay_t < Type > & > ( this->getProxyAbstraction ( ), move ), isTemporary );
+			return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > & > > ( retrieveValue < std::decay_t < Type > & > ( this->getProxyAbstraction ( ), move ), isTemporary );
 		else if ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::RREF )
-			return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > && > > ( lifeReference, retrieveValue < std::decay_t < Type > && > ( this->getProxyAbstraction ( ), move ), isTemporary );
+			return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > && > > ( retrieveValue < std::decay_t < Type > && > ( this->getProxyAbstraction ( ), move ), isTemporary );
 		else if constexpr ( std::is_abstract_v < std::decay_t < Type > > )
 			throw std::domain_error ( "Cannot declare value of abstract class." );
 		else if constexpr ( ! std::is_assignable_v < std::decay_t < Type > &, std::decay_t < Type > > )
 			throw std::domain_error ( "Cannot assign value." );
 		else if ( paramQualifierSet && ParamQualifiers::ParamQualifierSet::CONST )
-			return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > > > ( lifeReference, retrieveValue < const std::decay_t < Type > > ( this->getProxyAbstraction ( ), move ), isTemporary );
+			return std::make_shared < abstraction::ValueHolder < const std::decay_t < Type > > > ( retrieveValue < const std::decay_t < Type > > ( this->getProxyAbstraction ( ), move ), isTemporary );
 		else
-			return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > > > ( lifeReference, retrieveValue < std::decay_t < Type > > ( this->getProxyAbstraction ( ), move ), isTemporary );
+			return std::make_shared < abstraction::ValueHolder < std::decay_t < Type > > > ( retrieveValue < std::decay_t < Type > > ( this->getProxyAbstraction ( ), move ), isTemporary );
 	}
 
 	abstraction::ParamQualifiers::ParamQualifierSet getTypeQualifiers ( ) const override {
diff --git a/alib2abstraction/src/abstraction/ValueHolderInterface.hpp b/alib2abstraction/src/abstraction/ValueHolderInterface.hpp
index b0a0a82500af199361ff08c788ad4e295b7bd3b3..5e9999b81a9e26edf4ba03968994d4ab38949fd9 100644
--- a/alib2abstraction/src/abstraction/ValueHolderInterface.hpp
+++ b/alib2abstraction/src/abstraction/ValueHolderInterface.hpp
@@ -18,7 +18,7 @@ class ValueHolderInterface : public Value {
 	bool m_isTemporary;
 
 protected:
-	ValueHolderInterface ( const std::shared_ptr < abstraction::OperationAbstraction > & ref, ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary ) : Value ( ref ), m_paramQualifierSet ( paramQualifierSet ), m_isTemporary ( isTemporary ) {
+	ValueHolderInterface ( ParamQualifiers::ParamQualifierSet paramQualifierSet, bool isTemporary ) : m_paramQualifierSet ( paramQualifierSet ), m_isTemporary ( isTemporary ) {
 		if ( this->isLvalueRef ( ) && this->isTemporary ( ) )
 			throw std::domain_error ( "Lvalue references cannot be a temporarie." );
 		if ( this->isLvalueRef ( ) && this->isRvalueRef ( ) )
@@ -63,6 +63,11 @@ ParamType retrieveValue ( const std::shared_ptr < abstraction::Value > & param,
 	if ( ! interface )
 		throw std::invalid_argument ( "Abstraction does not provide value of type " + ext::to_string < ParamType > ( ) + " but " + param->getType ( ) + "." );
 
+/*	if constexpr ( std::is_reference_v < ParamType > ) {
+		if ( interface->isTemporary ( ) && ! interface->isRef ( ) && interface->getTemporaryReferences ( ) == 0 )
+			throw std::domain_error ( "Taking reference to a temporary." );
+	}*/
+
 	if constexpr ( std::is_rvalue_reference_v < ParamType > ) {
 		if ( move || interface->isTemporary ( ) )
 			return std::move ( interface->getValue ( ) );
diff --git a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp
index 347d08a7b391ac680c2b7eaa8f85b01ac4821c90..a6be5bdce48867aee4de185504bd78e93e74858f 100644
--- a/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/ValueOperationAbstraction.hpp
@@ -23,7 +23,7 @@ class ValueOperationAbstraction : virtual public OperationAbstraction {
 public:
 	template < typename ... ParamTypes, typename Callable >
 	inline std::shared_ptr < abstraction::Value > run_helper ( Callable callback, const ext::array < std::pair < std::shared_ptr < abstraction::Value >, bool >, sizeof ... ( ParamTypes ) > & inputs ) {
-		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), abstraction::apply < ParamTypes ... > ( callback, inputs ), std::is_lvalue_reference_v < ReturnType > ? false : true );
+		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( abstraction::apply < ParamTypes ... > ( callback, inputs ), std::is_lvalue_reference_v < ReturnType > ? false : true );
 	}
 
 	abstraction::ParamQualifiers::ParamQualifierSet getReturnTypeQualifiers ( ) const override {
@@ -42,7 +42,7 @@ public:
 	template < typename ... ParamTypes, typename Callable >
 	inline std::shared_ptr < abstraction::Value > run_helper ( Callable callback, const ext::array < std::pair < std::shared_ptr < abstraction::Value >, bool >, sizeof ... ( ParamTypes ) > & inputs ) {
 		abstraction::apply < ParamTypes ... > ( callback, inputs );
-		return std::make_shared < abstraction::Void > ( this->getProxyAbstraction ( ) );
+		return std::make_shared < abstraction::Void > ( );
 	}
 
 	ext::type_index getReturnTypeIndex ( ) const override;
diff --git a/alib2abstraction/src/abstraction/ValuePrinterAbstraction.hpp b/alib2abstraction/src/abstraction/ValuePrinterAbstraction.hpp
index 7e60291a788a177cd925517566f09f9c04926246..54ae6be2af5693e46a98c6198cd5dcf144cfc092 100644
--- a/alib2abstraction/src/abstraction/ValuePrinterAbstraction.hpp
+++ b/alib2abstraction/src/abstraction/ValuePrinterAbstraction.hpp
@@ -26,7 +26,7 @@ public:
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & secondParam = std::get < 1 > ( this->getParams ( ) );
 
 		retrieveValue < std::ostream & > ( secondParam.first, secondParam.second ) << retrieveValue < const ParamType & > ( firstParam.first, firstParam.second ) << std::endl;
-		return std::make_shared < abstraction::Void > ( this->getProxyAbstraction ( ) );
+		return std::make_shared < abstraction::Void > ( );
 	}
 };
 
@@ -37,7 +37,7 @@ public:
 	}
 
 	std::shared_ptr < abstraction::Value > run ( ) override {
-		return std::make_shared < abstraction::Void > ( this->getProxyAbstraction ( ) );
+		return std::make_shared < abstraction::Void > ( );
 	}
 };
 
diff --git a/alib2abstraction/src/common/CastHelper.cpp b/alib2abstraction/src/common/CastHelper.cpp
index f7d5ead893270879cd484836401d8f9c17784817..5b9134f0cc983fcad91def69177d54227422b4df 100644
--- a/alib2abstraction/src/common/CastHelper.cpp
+++ b/alib2abstraction/src/common/CastHelper.cpp
@@ -1,11 +1,11 @@
-#include <registry/Registry.h>
 #include <common/CastHelper.h>
+
+#include <registry/Registry.h>
 #include <exception>
-#include <abstraction/Value.hpp>
 
 namespace abstraction {
 
-std::shared_ptr < abstraction::Value > CastHelper::eval ( const std::shared_ptr < abstraction::Value > & param, const std::string & type, bool move ) {
+std::shared_ptr < abstraction::Value > CastHelper::eval ( abstraction::TemporariesHolder &, const std::shared_ptr < abstraction::Value > & param, const std::string & type, bool move ) {
 	if ( abstraction::Registry::isCastNoOp ( type, param->getType ( ) ) ) {
 		return param;
 	}
@@ -13,7 +13,7 @@ std::shared_ptr < abstraction::Value > CastHelper::eval ( const std::shared_ptr
 	std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getCastAbstraction ( type, param->getType ( ) );
 	res->attachInput ( param, 0, move );
 
-	std::shared_ptr < Value > result = res->eval ( );
+	std::shared_ptr < abstraction::Value > result = res->eval ( );
 	if ( ! result )
 		throw std::invalid_argument ( "Eval of cast to " + type + " failed." );
 
diff --git a/alib2abstraction/src/common/CastHelper.h b/alib2abstraction/src/common/CastHelper.h
index 4b70eac1e0b867ce407a96bc8a214662c2e2dd99..99b8c6291ad535b6fd4a439617785c8bbcbf4377 100644
--- a/alib2abstraction/src/common/CastHelper.h
+++ b/alib2abstraction/src/common/CastHelper.h
@@ -1,13 +1,16 @@
 #ifndef _CAST_HELPER_H_
 #define _CAST_HELPER_H_
 
-#include <registry/Registry.h>
+#include <string>
+#include <memory>
+#include <abstraction/Value.hpp>
+#include <abstraction/TemporariesHolder.h>
 
 namespace abstraction {
 
 class CastHelper {
 public:
-	static std::shared_ptr < abstraction::Value > eval ( const std::shared_ptr < abstraction::Value > & param, const std::string & type, bool move );
+	static std::shared_ptr < abstraction::Value > eval ( abstraction::TemporariesHolder & environment, const std::shared_ptr < abstraction::Value > & param, const std::string & type, bool move );
 
 };
 
diff --git a/alib2abstraction/src/common/EvalHelper.cpp b/alib2abstraction/src/common/EvalHelper.cpp
index 7edb58f8058e72176b46c7560de9c6c91a983a44..d1a51409813c685e11aeb0b8b26a1e563d265669 100644
--- a/alib2abstraction/src/common/EvalHelper.cpp
+++ b/alib2abstraction/src/common/EvalHelper.cpp
@@ -5,14 +5,15 @@
  *	  Author: Jan Travnicek
  */
 
+#include <common/EvalHelper.h>
+
 #include <registry/Registry.h>
 #include <exception>
-#include <common/EvalHelper.h>
 #include <common/CastHelper.h>
 
 namespace abstraction {
 
-std::shared_ptr < abstraction::Value > EvalHelper::evalAlgorithm ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ) {
+std::shared_ptr < abstraction::Value > EvalHelper::evalAlgorithm ( abstraction::TemporariesHolder & environment, const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ) {
 	ext::vector < std::string > paramTypes;
 	ext::vector < abstraction::ParamQualifiers::ParamQualifierSet > paramTypeQualifiers;
 	for ( const std::shared_ptr < abstraction::Value > & param : params ) {
@@ -21,13 +22,13 @@ std::shared_ptr < abstraction::Value > EvalHelper::evalAlgorithm ( const std::st
 	}
 
 	try {
-		return evalAbstraction ( abstraction::Registry::getAlgorithmAbstraction ( name, templateParams, paramTypes, paramTypeQualifiers, category ), params, moves );
+		return evalAbstraction ( environment, abstraction::Registry::getAlgorithmAbstraction ( name, templateParams, paramTypes, paramTypeQualifiers, category ), params, moves );
 	} catch ( const std::exception & executionException ) {
 		std::throw_with_nested ( std::runtime_error ( "Evaluation of algorithm " + name + " failed." ) );
 	}
 }
 
-std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::BinaryOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ) {
+std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::BinaryOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ) {
 	ext::vector < std::string > paramTypes;
 	ext::vector < abstraction::ParamQualifiers::ParamQualifierSet > paramTypeQualifiers;
 	for ( const std::shared_ptr < abstraction::Value > & param : params ) {
@@ -36,13 +37,13 @@ std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::Bin
 	}
 
 	try {
-		return evalAbstraction ( Registry::getBinaryOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves );
+		return evalAbstraction ( environment, abstraction::Registry::getBinaryOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves );
 	} catch ( ... ) {
-		std::throw_with_nested ( std::runtime_error ( "Evaluation of binary operator " + Operators::toString ( type ) + " failed." ) );
+		std::throw_with_nested ( std::runtime_error ( "Evaluation of binary operator " + abstraction::Operators::toString ( type ) + " failed." ) );
 	}
 }
 
-std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::PrefixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ) {
+std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::PrefixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ) {
 	ext::vector < std::string > paramTypes;
 	ext::vector < abstraction::ParamQualifiers::ParamQualifierSet > paramTypeQualifiers;
 	for ( const std::shared_ptr < abstraction::Value > & param : params ) {
@@ -51,13 +52,13 @@ std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::Pre
 	}
 
 	try {
-		return evalAbstraction ( Registry::getPrefixOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves );
+		return evalAbstraction ( environment, abstraction::Registry::getPrefixOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves );
 	} catch ( ... ) {
-		std::throw_with_nested ( std::runtime_error ( "Evaluation of prefix operator " + Operators::toString ( type ) + " failed." ) );
+		std::throw_with_nested ( std::runtime_error ( "Evaluation of prefix operator " + abstraction::Operators::toString ( type ) + " failed." ) );
 	}
 }
 
-std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::PostfixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category ) {
+std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::PostfixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category ) {
 	ext::vector < std::string > paramTypes;
 	ext::vector < abstraction::ParamQualifiers::ParamQualifierSet > paramTypeQualifiers;
 	for ( const std::shared_ptr < abstraction::Value > & param : params ) {
@@ -66,20 +67,21 @@ std::shared_ptr < abstraction::Value > EvalHelper::evalOperator ( Operators::Pos
 	}
 
 	try {
-		return evalAbstraction ( Registry::getPostfixOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves );
+		return evalAbstraction ( environment, abstraction::Registry::getPostfixOperatorAbstraction ( type, paramTypes, paramTypeQualifiers, category ), params, moves );
 	} catch ( ... ) {
-		std::throw_with_nested ( std::runtime_error ( "Evaluation of postfix operator " + Operators::toString ( type ) + " failed." ) );
+		std::throw_with_nested ( std::runtime_error ( "Evaluation of postfix operator " + abstraction::Operators::toString ( type ) + " failed." ) );
 	}
 }
 
-std::shared_ptr < abstraction::Value > EvalHelper::evalAbstraction ( std::shared_ptr < abstraction::OperationAbstraction > abstraction, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves ) {
+std::shared_ptr < abstraction::Value > EvalHelper::evalAbstraction ( abstraction::TemporariesHolder & environment, std::shared_ptr < abstraction::OperationAbstraction > abstraction, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves ) {
 	unsigned i = 0;
 	ext::vector < std::shared_ptr < abstraction::Value > > casted_params;
 	for ( const std::shared_ptr < abstraction::Value > & param : params ) {
 		if ( abstraction::Registry::isCastNoOp ( abstraction->getParamType ( i ), param->getType ( ) ) ) {
 			casted_params.push_back ( param );
 		} else {
-			casted_params.push_back ( abstraction::CastHelper::eval ( param, abstraction->getParamType ( i ), moves [ i ] ) );
+			casted_params.push_back ( abstraction::CastHelper::eval ( environment, param, abstraction->getParamType ( i ), moves [ i ] ) );
+			environment.holdTemporary ( casted_params.back ( ) );
 		}
 		++ i;
 	}
diff --git a/alib2abstraction/src/common/EvalHelper.h b/alib2abstraction/src/common/EvalHelper.h
index ab8a1ea8710ee0610ab4e550436e6fe20497e604..4de53909659cf2e0aaaf5afbf927ce3a707b8e89 100644
--- a/alib2abstraction/src/common/EvalHelper.h
+++ b/alib2abstraction/src/common/EvalHelper.h
@@ -14,20 +14,21 @@
 #include <common/AlgorithmCategories.hpp>
 #include <common/Operators.hpp>
 #include <abstraction/Value.hpp>
+#include <abstraction/TemporariesHolder.h>
 
 namespace abstraction {
 
 class EvalHelper {
-	static std::shared_ptr < abstraction::Value > evalAbstraction ( std::shared_ptr < abstraction::OperationAbstraction > abstraction, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves );
+	static std::shared_ptr < abstraction::Value > evalAbstraction ( abstraction::TemporariesHolder & environment, std::shared_ptr < abstraction::OperationAbstraction > abstraction, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves );
 
 public:
-	static std::shared_ptr < abstraction::Value > evalAlgorithm ( const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category );
+	static std::shared_ptr < abstraction::Value > evalAlgorithm ( abstraction::TemporariesHolder & environment, const std::string & name, const ext::vector < std::string > & templateParams, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category );
 
-	static std::shared_ptr < abstraction::Value > evalOperator ( Operators::BinaryOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category );
+	static std::shared_ptr < abstraction::Value > evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::BinaryOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category );
 
-	static std::shared_ptr < abstraction::Value > evalOperator ( Operators::PrefixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category );
+	static std::shared_ptr < abstraction::Value > evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::PrefixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category );
 
-	static std::shared_ptr < abstraction::Value > evalOperator ( Operators::PostfixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, AlgorithmCategories::AlgorithmCategory category );
+	static std::shared_ptr < abstraction::Value > evalOperator ( abstraction::TemporariesHolder & environment, abstraction::Operators::PostfixOperators type, const ext::vector < std::shared_ptr < abstraction::Value > > & params, const std::vector < bool > & moves, abstraction::AlgorithmCategories::AlgorithmCategory category );
 };
 
 } /* namespace abstraction */
diff --git a/alib2cli/src/ast/command/CommandList.h b/alib2cli/src/ast/command/CommandList.h
index 3b6719608e7f4ae38f6e192b5922cb73af948b32..3bbf5fbbd40e9ae6ab490da0201f9c0126930ac5 100644
--- a/alib2cli/src/ast/command/CommandList.h
+++ b/alib2cli/src/ast/command/CommandList.h
@@ -17,8 +17,10 @@ public:
 			throw std::invalid_argument ( "Command list can't be empty" );
 
 		CommandResult res = CommandResult::OK;
-		for ( size_t i = 0; i < m_commands.size ( ) && res == CommandResult::OK; ++ i )
+		for ( size_t i = 0; i < m_commands.size ( ) && res == CommandResult::OK; ++ i ) {
 			res = m_commands [ i ]->run ( environment );
+			environment.clearTemporaries ( );
+		}
 
 		return res;
 	}
diff --git a/alib2cli/src/ast/command/PrintCommand.h b/alib2cli/src/ast/command/PrintCommand.h
index 07deead9d68578985ea8a0018f872612b892588e..be5213bea963a6c58784aa94078644e1fba80cd6 100644
--- a/alib2cli/src/ast/command/PrintCommand.h
+++ b/alib2cli/src/ast/command/PrintCommand.h
@@ -23,7 +23,7 @@ public:
 		std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::Registry::getValuePrinterAbstraction ( value->getType ( ) );
 
 		res->attachInput ( value, 0, false );
-		res->attachInput ( std::make_shared < abstraction::ValueHolder < std::ostream & > > ( nullptr, common::Streams::out, false ), 1, false );
+		res->attachInput ( std::make_shared < abstraction::ValueHolder < std::ostream & > > ( common::Streams::out, false ), 1, false );
 		std::shared_ptr < abstraction::Value > result = res->eval ( );
 		if ( ! result )
 			throw std::invalid_argument ( "Eval of result print statement failed." );
diff --git a/alib2cli/src/ast/statements/CastStatement.h b/alib2cli/src/ast/statements/CastStatement.h
index 946ca5d1619aafca13eae092e5c8474d765e5168..fff7f7120993161176ee09d56fc0da568799e18b 100644
--- a/alib2cli/src/ast/statements/CastStatement.h
+++ b/alib2cli/src/ast/statements/CastStatement.h
@@ -20,7 +20,9 @@ public:
 
 		std::shared_ptr < abstraction::Value > translatedStatement = m_statement->translateAndEval ( prev, environment );
 
-		return abstraction::CastHelper::eval ( translatedStatement, type, m_move );
+		environment.holdTemporary ( translatedStatement );
+
+		return abstraction::CastHelper::eval ( environment, translatedStatement, type, m_move );
 	}
 
 };
diff --git a/alib2cli/src/ast/statements/ContainerStatement.cpp b/alib2cli/src/ast/statements/ContainerStatement.cpp
index b1579c9fece48fe91c4acb25f073ba0b833b3603..e1ce0d084181c300f4dea468a8dbdcd9f5ba625d 100644
--- a/alib2cli/src/ast/statements/ContainerStatement.cpp
+++ b/alib2cli/src/ast/statements/ContainerStatement.cpp
@@ -4,6 +4,7 @@
 #include <common/CastHelper.h>
 #include <exception>
 #include <alib/iostream>
+#include <registry/Registry.h>
 
 namespace cli {
 
@@ -24,7 +25,7 @@ std::shared_ptr < abstraction::Value > ContainerStatement::translateAndEval ( co
 		if ( abstraction::Registry::isCastNoOp ( algo->getParamType ( i ), param->getType ( ) ) ) {
 			casted_params.push_back ( param );
 		} else {
-			casted_params.push_back ( abstraction::CastHelper::eval ( param, algo->getParamType ( i ), m_moves [ i ] ) );
+			casted_params.push_back ( abstraction::CastHelper::eval ( environment, param, algo->getParamType ( i ), m_moves [ i ] ) );
 		}
 		++ i;
 	}
diff --git a/alib2cli/src/ast/statements/FileStatement.cpp b/alib2cli/src/ast/statements/FileStatement.cpp
index 3762be2f92a194f02802444088380ce9108564a3..6d5fb83564f47e08b5d4f9ed3c4f6b5b40d90dc1 100644
--- a/alib2cli/src/ast/statements/FileStatement.cpp
+++ b/alib2cli/src/ast/statements/FileStatement.cpp
@@ -26,7 +26,7 @@ std::shared_ptr < abstraction::Value > FileStatement::translateAndEval ( const s
 
 	std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::InputFileRegistry::getAbstraction ( filetype, type, templateParams );
 
-	std::shared_ptr < abstraction::ValueHolder < std::string > > file = std::make_shared < abstraction::ValueHolder < std::string > > ( nullptr, m_file->eval ( environment ), true );
+	std::shared_ptr < abstraction::ValueHolder < std::string > > file = std::make_shared < abstraction::ValueHolder < std::string > > ( m_file->eval ( environment ), true );
 	res->attachInput ( file, 0, false );
 
 	return res->eval ( );
diff --git a/alib2cli/src/ast/statements/ImmediateStatement.h b/alib2cli/src/ast/statements/ImmediateStatement.h
index 6f0fc664eb3097784044390cdac29c8499d3c158..b7038fa23ca34c7dbc4e25e881e883bf0c388585 100644
--- a/alib2cli/src/ast/statements/ImmediateStatement.h
+++ b/alib2cli/src/ast/statements/ImmediateStatement.h
@@ -10,7 +10,7 @@ class ImmediateStatement final : public Statement {
 	std::shared_ptr < abstraction::ValueHolder < Type > > m_value;
 
 public:
-	ImmediateStatement ( Type value ) : m_value ( std::make_shared < abstraction::ValueHolder < Type > > ( nullptr, std::move ( value ), true ) ) {
+	ImmediateStatement ( Type value ) : m_value ( std::make_shared < abstraction::ValueHolder < Type > > ( std::move ( value ), true ) ) {
 	}
 
 	std::shared_ptr < abstraction::Value > translateAndEval ( const std::shared_ptr < abstraction::Value > &, Environment & ) const override {
diff --git a/alib2cli/src/ast/statements/ResultFileStatement.h b/alib2cli/src/ast/statements/ResultFileStatement.h
index b7c462f06ebd1574689b56023157275915da5063..8f5255a00cd006465de6a29552381ad167d2b6f9 100644
--- a/alib2cli/src/ast/statements/ResultFileStatement.h
+++ b/alib2cli/src/ast/statements/ResultFileStatement.h
@@ -22,7 +22,7 @@ public:
 
 		std::shared_ptr < abstraction::OperationAbstraction > res = abstraction::OutputFileRegistry::getAbstraction ( filetype, prev->getType ( ) );
 
-		std::shared_ptr < abstraction::ValueHolder < std::string > > file = std::make_shared < abstraction::ValueHolder < std::string > > ( nullptr, m_file->eval ( environment ), true );
+		std::shared_ptr < abstraction::ValueHolder < std::string > > file = std::make_shared < abstraction::ValueHolder < std::string > > ( m_file->eval ( environment ), true );
 		res->attachInput ( file, 0, false );
 		res->attachInput ( prev, 1, false );
 		return res->eval ( );
diff --git a/alib2cli/src/ast/statements/ResultVariableStatement.h b/alib2cli/src/ast/statements/ResultVariableStatement.h
index 461662bd871225f1571c95ab6beab5314a7fa2c7..286799e99794e8d303a7831a47c9ac60cadb85a5 100644
--- a/alib2cli/src/ast/statements/ResultVariableStatement.h
+++ b/alib2cli/src/ast/statements/ResultVariableStatement.h
@@ -13,7 +13,7 @@ public:
 	}
 
 	std::shared_ptr < abstraction::Value > translateAndEval ( const std::shared_ptr < abstraction::Value > & prev, Environment & environment ) const override {
-		std::shared_ptr < abstraction::Value > res = prev->clone ( nullptr, abstraction::ParamQualifiers::ParamQualifierSet::NONE, false, false );
+		std::shared_ptr < abstraction::Value > res = prev->clone ( abstraction::ParamQualifiers::ParamQualifierSet::NONE, false, false );
 		environment.setVariable ( m_name->eval ( environment ), res );
 		return res;
 	}
diff --git a/alib2cli/src/ast/statements/SingleStatement.cpp b/alib2cli/src/ast/statements/SingleStatement.cpp
index 47d53413a4fde5988624b55df20683faf56668c8..a63dae472dbcb8fd03be1662d750731a6f334862 100644
--- a/alib2cli/src/ast/statements/SingleStatement.cpp
+++ b/alib2cli/src/ast/statements/SingleStatement.cpp
@@ -11,7 +11,9 @@ SingleStatement::SingleStatement ( std::unique_ptr < Arg > name, ext::vector < s
 std::shared_ptr < abstraction::Value > SingleStatement::translateAndEval ( const std::shared_ptr < abstraction::Value > & prev, Environment & environment ) const {
 	ext::vector < std::shared_ptr < abstraction::Value > > params;
 	for ( const std::shared_ptr < Statement > & param : m_params ) {
-		params.push_back ( param->translateAndEval ( prev, environment ) );
+		std::shared_ptr < abstraction::Value > translatedParam = param->translateAndEval ( prev, environment );
+		environment.holdTemporary ( translatedParam );
+		params.push_back ( translatedParam );
 	}
 
 	std::string name = m_name->eval ( environment );
@@ -24,7 +26,7 @@ std::shared_ptr < abstraction::Value > SingleStatement::translateAndEval ( const
 	if ( m_category )
 		category = m_category->getCategory ( );
 
-	return abstraction::EvalHelper::evalAlgorithm ( name, templateParams, params, m_moves, category );
+	return abstraction::EvalHelper::evalAlgorithm ( environment, name, templateParams, params, m_moves, category );
 }
 
 } /* namespace cli */
diff --git a/alib2cli/src/ast/statements/ValueStatement.h b/alib2cli/src/ast/statements/ValueStatement.h
index 36361fbd14c3e040abbff06f4b3c54800a9356b9..a16508acece95d3efd6e01cc5d4a1678b7e7197d 100644
--- a/alib2cli/src/ast/statements/ValueStatement.h
+++ b/alib2cli/src/ast/statements/ValueStatement.h
@@ -14,7 +14,7 @@ public:
 	}
 
 	std::shared_ptr < abstraction::Value > translateAndEval ( const std::shared_ptr < abstraction::Value > &, Environment & environment ) const override {
-		return std::make_shared < abstraction::ValueHolder < std::string > > ( nullptr, m_arg->eval ( environment ), true );
+		return std::make_shared < abstraction::ValueHolder < std::string > > ( m_arg->eval ( environment ), true );
 	}
 
 };
diff --git a/alib2cli/src/environment/Environment.h b/alib2cli/src/environment/Environment.h
index 2f1aa555433aaf40805078647cd5cdba1431f0be..6ff6ecfa4dee2225a94fed912d8328d106ebe616 100644
--- a/alib2cli/src/environment/Environment.h
+++ b/alib2cli/src/environment/Environment.h
@@ -14,11 +14,13 @@
 #include <ast/command/CommandResult.h>
 #include <lexer/CharSequence.h>
 
+#include <abstraction/TemporariesHolder.h>
+
 namespace cli {
 
 class Command;
 
-class Environment {
+class Environment : public abstraction::TemporariesHolder {
 	ext::map < std::string, std::string > m_bindings;
 	ext::map < std::string, std::shared_ptr < abstraction::Value > > m_variables;
 	std::shared_ptr < abstraction::Value > m_result;
@@ -102,7 +104,7 @@ public:
 
 	template < class T >
 	void setVariable ( std::string name, T value ) {
-		auto variable = std::make_shared < abstraction::ValueHolder < T > > ( nullptr, std::move ( value ), false );
+		auto variable = std::make_shared < abstraction::ValueHolder < T > > ( std::move ( value ), false );
 		setVariableInt ( std::move ( name ), variable );
 	}
 
diff --git a/alib2gui/src/Algorithm/Algorithm.cpp b/alib2gui/src/Algorithm/Algorithm.cpp
index 2e688b75fc08bf22ae3e4052485a27f0592d57b3..8106a3e80c3874c3bf1cca4a5b7a7e7479c4609c 100644
--- a/alib2gui/src/Algorithm/Algorithm.cpp
+++ b/alib2gui/src/Algorithm/Algorithm.cpp
@@ -86,7 +86,9 @@ std::shared_ptr<abstraction::Value>
 Algorithm::execute(const std::vector<std::shared_ptr<abstraction::Value>>& params) const {
     std::vector<bool> moves(params.size(), false);
     ext::vector<std::shared_ptr<abstraction::Value>> extParams(params.begin(), params.end());
-    return abstraction::EvalHelper::evalAlgorithm(this->fullName,
+	abstraction::TemporariesHolder environment;
+
+    return abstraction::EvalHelper::evalAlgorithm(environment, this->fullName,
                                               {},
                                               extParams,
                                               moves,
diff --git a/alib2gui/src/Converter.cpp b/alib2gui/src/Converter.cpp
index d8477a04f7d9dd1182a0f789347a4a6b38e21313..49cb11a852ed4f2d60afd2ae3c484a3268703c5d 100644
--- a/alib2gui/src/Converter.cpp
+++ b/alib2gui/src/Converter.cpp
@@ -37,8 +37,9 @@ namespace Converter {
 
             std::vector<bool> moves;
             moves.push_back(false);
+			abstraction::TemporariesHolder environment;
 
-            auto res = abstraction::EvalHelper::evalAlgorithm("convert::DotConverter",
+            auto res = abstraction::EvalHelper::evalAlgorithm(environment, "convert::DotConverter",
                                                           {},
                                                           params,
                                                           moves,
@@ -98,7 +99,7 @@ namespace Converter {
             std::shared_ptr<abstraction::OperationAbstraction> automaton = abstraction::XmlRegistry::getXmlParserAbstraction(
                     type);
 
-            auto tokensAbstraction = std::make_shared<abstraction::ValueHolder<ext::deque<sax::Token>>>(nullptr, std::move ( tokens ), true);
+            auto tokensAbstraction = std::make_shared<abstraction::ValueHolder<ext::deque<sax::Token>>>(std::move ( tokens ), true);
             automaton->attachInput(tokensAbstraction, 0, true);
             return automaton->eval ( );
         }
@@ -110,13 +111,15 @@ namespace Converter {
 
     std::shared_ptr<abstraction::Value> parseText(const QString& txt) {
         ext::vector<std::shared_ptr<abstraction::Value>> params;
-        params.push_back(std::make_shared<abstraction::ValueHolder<std::string>>(nullptr, txt.toStdString(), true));
+        params.push_back(std::make_shared<abstraction::ValueHolder<std::string>>( txt.toStdString(), true));
 
         std::vector<bool> moves;
         moves.push_back(true);
+		abstraction::TemporariesHolder environment;
+
         for (const auto& type: { "automaton::Automaton", "grammar::Grammar", "regexp::RegExp"}) {
             try {
-                return abstraction::EvalHelper::evalAlgorithm("string::Parse",
+                return abstraction::EvalHelper::evalAlgorithm(environment, "string::Parse",
                                                           {type},
                                                           params,
                                                           moves,
diff --git a/alib2gui/src/Utils.cpp b/alib2gui/src/Utils.cpp
index 36c3ffa20d8c4a09a65e6a273b0f710c459438fe..b47b6d4da49bf2c82e6d1f83a64dc62570dbbe0d 100644
--- a/alib2gui/src/Utils.cpp
+++ b/alib2gui/src/Utils.cpp
@@ -14,14 +14,16 @@ namespace Utils
 
     std::shared_ptr<abstraction::Value> generateRandomAutomaton() {
         ext::vector<std::shared_ptr<abstraction::Value>> params;
-        params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>(nullptr, 5, true));
-        params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>(nullptr, 3, true));
-        params.push_back(std::make_shared<abstraction::ValueHolder<bool>>(nullptr, true, true));
-        params.push_back(std::make_shared<abstraction::ValueHolder<double>>(nullptr, 10.0, true));
+        params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>( 5, true));
+        params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>( 3, true));
+        params.push_back(std::make_shared<abstraction::ValueHolder<bool>>( true, true));
+        params.push_back(std::make_shared<abstraction::ValueHolder<double>>( 10.0, true));
 
         std::vector<bool> moves(params.size(), true);
 
-        return abstraction::EvalHelper::evalAlgorithm("automaton::generate::RandomAutomatonFactory",
+
+		abstraction::TemporariesHolder environment;
+        return abstraction::EvalHelper::evalAlgorithm(environment, "automaton::generate::RandomAutomatonFactory",
                                                   {},
                                                   params,
                                                   moves,
@@ -30,14 +32,15 @@ namespace Utils
 
     std::shared_ptr<abstraction::Value> generateRandomGrammar() {
         ext::vector<std::shared_ptr<abstraction::Value>> params;
-        params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>(nullptr, 5, true));
-        params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>(nullptr, 3, true));
-        params.push_back(std::make_shared<abstraction::ValueHolder<bool>>(nullptr, true, true));
-        params.push_back(std::make_shared<abstraction::ValueHolder<double>>(nullptr, 30.0, true));
+        params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>( 5, true));
+        params.push_back(std::make_shared<abstraction::ValueHolder<size_t>>( 3, true));
+        params.push_back(std::make_shared<abstraction::ValueHolder<bool>>( true, true));
+        params.push_back(std::make_shared<abstraction::ValueHolder<double>>( 30.0, true));
 
         std::vector<bool> moves(params.size(), true);
 
-        return abstraction::EvalHelper::evalAlgorithm("grammar::generate::RandomGrammarFactory",
+		abstraction::TemporariesHolder environment;
+        return abstraction::EvalHelper::evalAlgorithm(environment, "grammar::generate::RandomGrammarFactory",
                                                   {},
                                                   params,
                                                   moves,
diff --git a/alib2raw/src/abstraction/RawReaderAbstraction.hpp b/alib2raw/src/abstraction/RawReaderAbstraction.hpp
index e34a2a2c8f4d05661a4e9520a1d9ca3ece590c2b..74ad14c73393202a509cd42b0c77ec522ef010fd 100644
--- a/alib2raw/src/abstraction/RawReaderAbstraction.hpp
+++ b/alib2raw/src/abstraction/RawReaderAbstraction.hpp
@@ -20,7 +20,7 @@ class RawReaderAbstraction : virtual public NaryOperationAbstraction < std::stri
 public:
 	std::shared_ptr < abstraction::Value > run ( ) override {
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) );
-		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), factory::RawDataFactory::fromString ( abstraction::retrieveValue < std::string && > ( param.first, param.second ) ), true );
+		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( factory::RawDataFactory::fromString ( abstraction::retrieveValue < std::string && > ( param.first, param.second ) ), true );
 	}
 
 };
diff --git a/alib2raw/src/abstraction/RawWriterAbstraction.hpp b/alib2raw/src/abstraction/RawWriterAbstraction.hpp
index fa27ede68c30293e0de0e469c6d90dda9d795565..5fba83baee255abcf491d814cb3fd6067ab19ca2 100644
--- a/alib2raw/src/abstraction/RawWriterAbstraction.hpp
+++ b/alib2raw/src/abstraction/RawWriterAbstraction.hpp
@@ -20,7 +20,7 @@ class RawWriterAbstraction : virtual public NaryOperationAbstraction < const Par
 public:
 	std::shared_ptr < abstraction::Value > run ( ) override {
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) );
-		return std::make_shared < abstraction::ValueHolder < std::string > > ( this->getProxyAbstraction ( ), factory::RawDataFactory::toString ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true );
+		return std::make_shared < abstraction::ValueHolder < std::string > > ( factory::RawDataFactory::toString ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true );
 	}
 
 };
diff --git a/alib2str/src/abstraction/StringReaderAbstraction.hpp b/alib2str/src/abstraction/StringReaderAbstraction.hpp
index 8d9152a99c4051fcbace04db855e50f986e4b642..942d2a1c14d1928f4c007d203fe0a3d6d912cf29 100644
--- a/alib2str/src/abstraction/StringReaderAbstraction.hpp
+++ b/alib2str/src/abstraction/StringReaderAbstraction.hpp
@@ -20,7 +20,7 @@ class StringReaderAbstraction : virtual public NaryOperationAbstraction < std::s
 public:
 	std::shared_ptr < abstraction::Value > run ( ) override {
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) );
-		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), factory::StringDataFactory::fromString ( abstraction::retrieveValue < std::string && > ( param.first, param.second ) ), true );
+		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( factory::StringDataFactory::fromString ( abstraction::retrieveValue < std::string && > ( param.first, param.second ) ), true );
 	}
 
 };
diff --git a/alib2str/src/abstraction/StringWriterAbstraction.hpp b/alib2str/src/abstraction/StringWriterAbstraction.hpp
index 5c1f7c1c78b98ec7254923b7a0848c0d4326023c..6769fe5baa56085984f40c75ff58fcad64b76866 100644
--- a/alib2str/src/abstraction/StringWriterAbstraction.hpp
+++ b/alib2str/src/abstraction/StringWriterAbstraction.hpp
@@ -20,7 +20,7 @@ class StringWriterAbstraction : virtual public NaryOperationAbstraction < const
 public:
 	std::shared_ptr < abstraction::Value > run ( ) override {
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) );
-		return std::make_shared < abstraction::ValueHolder < std::string > > ( this->getProxyAbstraction ( ), factory::StringDataFactory::toString ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true );
+		return std::make_shared < abstraction::ValueHolder < std::string > > ( factory::StringDataFactory::toString ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true );
 	}
 
 };
diff --git a/alib2xml/src/abstraction/XmlComposerAbstraction.hpp b/alib2xml/src/abstraction/XmlComposerAbstraction.hpp
index 641351e9832daedfad5c00c446184c48910cd184..4f8c478a77ff484f1924c8e15a5d66d8e40347b2 100644
--- a/alib2xml/src/abstraction/XmlComposerAbstraction.hpp
+++ b/alib2xml/src/abstraction/XmlComposerAbstraction.hpp
@@ -20,7 +20,7 @@ class XmlComposerAbstraction : virtual public NaryOperationAbstraction < const P
 public:
 	std::shared_ptr < abstraction::Value > run ( ) override {
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) );
-		return std::make_shared < abstraction::ValueHolder < ext::deque < sax::Token > > > ( this->getProxyAbstraction ( ), factory::XmlDataFactory::toTokens ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true );
+		return std::make_shared < abstraction::ValueHolder < ext::deque < sax::Token > > > ( factory::XmlDataFactory::toTokens ( abstraction::retrieveValue < const ParamType & > ( param.first, param.second ) ), true );
 	}
 
 };
diff --git a/alib2xml/src/abstraction/XmlParserAbstraction.hpp b/alib2xml/src/abstraction/XmlParserAbstraction.hpp
index 98c85dc0d132e7b32b2d7c42a92dc2c7b5a100ed..4e732229ce525815eed16ee3ea41180eb24214b0 100644
--- a/alib2xml/src/abstraction/XmlParserAbstraction.hpp
+++ b/alib2xml/src/abstraction/XmlParserAbstraction.hpp
@@ -20,7 +20,7 @@ class XmlParserAbstraction : virtual public NaryOperationAbstraction < ext::dequ
 public:
 	std::shared_ptr < abstraction::Value > run ( ) override {
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) );
-		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( this->getProxyAbstraction ( ), factory::XmlDataFactory::fromTokens ( abstraction::retrieveValue < ext::deque < sax::Token > && > ( param.first, param.second ) ), true );
+		return std::make_shared < abstraction::ValueHolder < ReturnType > > ( factory::XmlDataFactory::fromTokens ( abstraction::retrieveValue < ext::deque < sax::Token > && > ( param.first, param.second ) ), true );
 	}
 
 };
diff --git a/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp b/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp
index 0003fc3c9037755667e5fa8d8a84eee23cff0494..ddd01c9fd342837d93ec515bbc7d454b34df619d 100644
--- a/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp
+++ b/alib2xml/src/abstraction/XmlTokensComposerAbstraction.hpp
@@ -21,7 +21,7 @@ public:
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param2 = std::get < 0 > ( this->getParams ( ) );
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param1 = std::get < 1 > ( this->getParams ( ) );
 		sax::SaxComposeInterface::composeFile ( abstraction::retrieveValue < const std::string & > ( param1.first, param1.second ), abstraction::retrieveValue < const ext::deque < sax::Token > & > ( param2.first, param2.second ) );
-		return std::make_shared < abstraction::Void > ( this->getProxyAbstraction ( ) );
+		return std::make_shared < abstraction::Void > ( );
 	}
 
 };
diff --git a/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp b/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp
index 75a1f5337197e9ec06cb17acaf8cc995bd0037af..027bbb81eb4ccc26ffd6dcf7ba7371ef55cdff90 100644
--- a/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp
+++ b/alib2xml/src/abstraction/XmlTokensParserAbstraction.hpp
@@ -19,7 +19,7 @@ class XmlTokensParserAbstraction : virtual public NaryOperationAbstraction < con
 public:
 	std::shared_ptr < abstraction::Value > run ( ) override {
 		std::pair < std::shared_ptr < abstraction::Value >, bool > & param = std::get < 0 > ( this->getParams ( ) );
-		return std::make_shared < abstraction::ValueHolder < ext::deque < sax::Token > > > ( this->getProxyAbstraction ( ), sax::SaxParseInterface::parseFile ( abstraction::retrieveValue < const std::string & > ( param.first, param.second ) ), true );
+		return std::make_shared < abstraction::ValueHolder < ext::deque < sax::Token > > > ( sax::SaxParseInterface::parseFile ( abstraction::retrieveValue < const std::string & > ( param.first, param.second ) ), true );
 	}
 
 };