diff --git a/alib2cli/src/ast/params/CastParam.h b/alib2cli/src/ast/params/CastParam.h
index 6f1b9e6b21690213b01f6dd70d6e33231f57bea9..0f7c0876dd08dc271fc0d059ccf2227f56994e59 100644
--- a/alib2cli/src/ast/params/CastParam.h
+++ b/alib2cli/src/ast/params/CastParam.h
@@ -16,10 +16,20 @@ public:
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override {
 		std::shared_ptr < abstraction::OperationAbstraction > translatedParam = m_param->translateAndEval ( prev, environment  );
 
-		std::shared_ptr < abstraction::OperationAbstraction > res = translatedParam->getCastFromResult ( m_type );
+		bool normalize;
+
+		std::shared_ptr < abstraction::OperationAbstraction > res = translatedParam->getCastFromResult ( m_type, normalize );
 		res->attachInput ( translatedParam, 0 );
 		res->eval ( );
 
+		if ( normalize ) {
+			std::shared_ptr < abstraction::OperationAbstraction > normalized = res->getNormalizeResult ( );
+			normalized->attachInput ( res, 0 );
+			normalized->eval ( );
+
+			res = normalized;
+		}
+
 		return res;
 	}
 
diff --git a/alib2cli/src/ast/statements/CastStatement.h b/alib2cli/src/ast/statements/CastStatement.h
index 3829b6cc4e7c4a82f6a772fc0180e7795142d65a..864a901c1d122c4b9a8bbdc5ecac73faef02df22 100644
--- a/alib2cli/src/ast/statements/CastStatement.h
+++ b/alib2cli/src/ast/statements/CastStatement.h
@@ -16,9 +16,20 @@ public:
 	virtual std::shared_ptr < abstraction::OperationAbstraction > translateAndEval ( const std::shared_ptr < abstraction::OperationAbstraction > & prev, Environment & environment ) const override {
 		std::shared_ptr < abstraction::OperationAbstraction > translatedStatement = m_statement->translateAndEval ( prev, environment );
 
-		std::shared_ptr < abstraction::OperationAbstraction > res = translatedStatement->getCastFromResult ( m_type );
+		bool normalize = false;
+
+		std::shared_ptr < abstraction::OperationAbstraction > res = translatedStatement->getCastFromResult ( m_type, normalize );
 		res->attachInput ( translatedStatement, 0 );
 		res->eval ( );
+
+		if ( normalize ) {
+			std::shared_ptr < abstraction::OperationAbstraction > normalized = res->getNormalizeResult ( );
+			normalized->attachInput ( res, 0 );
+			normalized->eval ( );
+
+			res = normalized;
+		}
+
 		return res;
 	}
 
diff --git a/alib2common/src/abstraction/CastRegistry.hpp b/alib2common/src/abstraction/CastRegistry.hpp
index 0d55ef8ab84c2651fb2d3b124d68e30afbfc462e..2f62000d96c4effb2cbdac539298847d5791dd10 100644
--- a/alib2common/src/abstraction/CastRegistry.hpp
+++ b/alib2common/src/abstraction/CastRegistry.hpp
@@ -21,15 +21,23 @@ namespace abstraction {
 
 class CastRegistry {
 	class Entry {
+		bool m_normalize;
 	public:
+		Entry ( bool normalize ) : m_normalize ( normalize ) {
+		}
+
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const = 0;
 
+		bool getNormalize ( ) const {
+			return m_normalize;
+		}
+
 	};
 
 	template < class Return, class Param >
 	class DefaultEntryImpl : public Entry {
 	public:
-		DefaultEntryImpl ( ) {
+		DefaultEntryImpl ( bool normalize ) : Entry ( normalize ) {
 		}
 
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
@@ -39,7 +47,7 @@ class CastRegistry {
 	class AlgorithmEntryImpl : public Entry {
 		std::function < Return ( Param ) > m_callback;
 	public:
-		AlgorithmEntryImpl ( std::function < Return ( Param ) > callback ) : m_callback ( callback ) {
+		AlgorithmEntryImpl ( std::function < Return ( Param ) > callback, bool normalize ) : Entry ( normalize ), m_callback ( callback ) {
 		}
 
 		virtual std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( ) const override;
@@ -52,34 +60,34 @@ class CastRegistry {
 
 public:
 	template < class TargetType, class ParamType >
-	static void registerCast ( std::string target, std::string param ) {
-		if ( ! getEntries ( ).insert ( std::make_pair ( std::make_pair ( target, param ), std::unique_ptr < Entry > ( new DefaultEntryImpl < TargetType, ParamType > ( ) ) ) ).second )
+	static void registerCast ( std::string target, std::string param, bool normalize ) {
+		if ( ! getEntries ( ).insert ( std::make_pair ( std::make_pair ( target, param ), std::unique_ptr < Entry > ( new DefaultEntryImpl < TargetType, ParamType > ( normalize ) ) ) ).second )
 			throw ::exception::CommonException ( "Entry from " + param + " to " + target + " already registered." );
 	}
 
 	template < class TargetType, class ParamType >
-	static void registerCast ( ) {
+	static void registerCast ( bool normalize ) {
 		std::string target = ext::to_string < TargetType > ( );
 		std::string param = ext::to_string < ParamType > ( );
 
-		registerCast < TargetType, ParamType > ( target, param );
+		registerCast < TargetType, ParamType > ( target, param, normalize );
 	}
 
 	template < class TargetType, class ParamType >
-	static void registerCastAlgorithm ( std::string target, std::string param, TargetType ( * callback ) ( ParamType ) ) {
-		if ( ! getEntries ( ).insert ( std::make_pair ( std::make_pair ( target, param ), std::unique_ptr < Entry > ( new AlgorithmEntryImpl < TargetType, ParamType > ( callback ) ) ) ).second )
+	static void registerCastAlgorithm ( std::string target, std::string param, TargetType ( * callback ) ( ParamType ), bool normalize ) {
+		if ( ! getEntries ( ).insert ( std::make_pair ( std::make_pair ( target, param ), std::unique_ptr < Entry > ( new AlgorithmEntryImpl < TargetType, ParamType > ( callback, normalize ) ) ) ).second )
 			throw ::exception::CommonException ( "Entry from " + param + " to " + target + " already registered." );
 	}
 
 	template < class TargetType, class ParamType >
-	static void registerCastAlgorithm ( TargetType ( * callback ) ( ParamType ) ) {
+	static void registerCastAlgorithm ( TargetType ( * callback ) ( ParamType ), bool normalize ) {
 		std::string target = ext::to_string < TargetType > ( );
 		std::string param = ext::to_string < ParamType > ( );
 
-		registerCastAlgorithm < TargetType, ParamType > ( target, param, callback );
+		registerCastAlgorithm < TargetType, ParamType > ( target, param, callback, normalize );
 	}
 
-	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::string target, std::string param ) {
+	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::string target, std::string param, bool & normalize ) {
 		std::set < std::string > targetTypes;
 		if ( alib::namingApi::hasTypes ( target ) )
 			targetTypes = ext::transform < std::string > ( alib::namingApi::getTypes ( target ), [ ] ( const ext::type_index & type ) { return ext::to_string ( type ); } );
@@ -88,13 +96,20 @@ public:
 
 		for ( const std::string & toType : targetTypes ) {
 			auto cast = getEntries ( ).find ( std::make_pair ( toType, param ) );
-			if ( cast != getEntries ( ).end ( ) )
+			if ( cast != getEntries ( ).end ( ) ) {
+				normalize = cast->second->getNormalize ( );
 				return cast->second->getAbstraction ( );
+			}
 		}
 
 		throw exception::CommonException ( "Entry from " + param + " to " + target + " not available." );
 	}
 
+	static std::shared_ptr < abstraction::OperationAbstraction > getAbstraction ( std::string target, std::string param ) {
+		bool normalize;
+		return getAbstraction ( std::move ( target ), std::move ( param ), normalize );
+	}
+
 };
 
 } /* namespace abstraction */
diff --git a/alib2common/src/abstraction/OperationAbstraction.hpp b/alib2common/src/abstraction/OperationAbstraction.hpp
index 81f702f64d11643e9b176982ba3187b4951f01f1..3f9ad2e667dc76923f1bd2d4c16cc9ec0f0156ce 100644
--- a/alib2common/src/abstraction/OperationAbstraction.hpp
+++ b/alib2common/src/abstraction/OperationAbstraction.hpp
@@ -40,7 +40,7 @@ public:
 
 	virtual std::shared_ptr < OperationAbstraction > getXmlFileWriterFromResult ( const std::string & filename ) const = 0;
 	virtual std::shared_ptr < OperationAbstraction > getValuePrinterFromResult ( ) const = 0;
-	virtual std::shared_ptr < OperationAbstraction > getCastFromResult ( const std::string & type ) const = 0;
+	virtual std::shared_ptr < OperationAbstraction > getCastFromResult ( const std::string & type, bool & normalize ) const = 0;
 	virtual std::shared_ptr < OperationAbstraction > getNormalizeResult ( ) const = 0;
 	virtual std::shared_ptr < OperationAbstraction > getDowncastResult ( ) const = 0;
 
diff --git a/alib2common/src/abstraction/PrimitiveRegistrator.cpp b/alib2common/src/abstraction/PrimitiveRegistrator.cpp
index 370bb4b32d39aeaab66b35764ec8f0a176c3b9cb..97974e243b066f3e6ef2c8e3db69b8cb1149a8d1 100644
--- a/alib2common/src/abstraction/PrimitiveRegistrator.cpp
+++ b/alib2common/src/abstraction/PrimitiveRegistrator.cpp
@@ -22,19 +22,19 @@ namespace abstraction {
 class PrimitiveCasts {
 public:
 	PrimitiveCasts ( ) {
-		abstraction::CastRegistry::registerCast < double, int > ( );
-		abstraction::CastRegistry::registerCast < int, double > ( );
+		abstraction::CastRegistry::registerCast < double, int > ( false );
+		abstraction::CastRegistry::registerCast < int, double > ( false );
 
-		abstraction::CastRegistry::registerCastAlgorithm < std::string, int > ( ext::to_string );
-		abstraction::CastRegistry::registerCastAlgorithm < int, std::string > ( (int(*)(std::string)) ext::from_string < int > );
+		abstraction::CastRegistry::registerCastAlgorithm < std::string, int > ( ext::to_string, false );
+		abstraction::CastRegistry::registerCastAlgorithm < int, std::string > ( (int(*)(std::string)) ext::from_string < int >, false );
 
-		abstraction::CastRegistry::registerCast < bool, int > ( );
+		abstraction::CastRegistry::registerCast < bool, int > ( false );
 
-		abstraction::CastRegistry::registerCast < size_t, int > ( "size_t", ext::to_string < int > ( ) );
-		abstraction::CastRegistry::registerCast < size_t, int > ( );
-		abstraction::CastRegistry::registerCast < int, size_t > ( );
+		abstraction::CastRegistry::registerCast < size_t, int > ( "size_t", ext::to_string < int > ( ), false );
+		abstraction::CastRegistry::registerCast < size_t, int > ( false );
+		abstraction::CastRegistry::registerCast < int, size_t > ( false );
 
-		abstraction::CastRegistry::registerCast < int, primitive::Integer > ( );
+		abstraction::CastRegistry::registerCast < int, primitive::Integer > ( false );
 	
 		abstraction::XmlFileWriterRegistry::registerXmlFileWriter < int > ( );
 		abstraction::XmlFileWriterRegistry::registerXmlFileWriter < double > ( );
diff --git a/alib2common/src/abstraction/Registry.cpp b/alib2common/src/abstraction/Registry.cpp
index 6ae0f879db7cf4841b9fd824850f9a9e5df9d9d5..86410f8b09465aff4ae2796c4abc08a29f7e80f5 100644
--- a/alib2common/src/abstraction/Registry.cpp
+++ b/alib2common/src/abstraction/Registry.cpp
@@ -38,8 +38,8 @@ std::shared_ptr < abstraction::OperationAbstraction > Registry::getAlgorithmAbst
 	return AlgorithmRegistry::getAbstraction ( std::move ( name ), paramTypes, unwrap, normalize );
 }
 
-std::shared_ptr < abstraction::OperationAbstraction > Registry::getCastAbstraction ( std::string target, std::string param ) {
-	return CastRegistry::getAbstraction ( std::move ( target ), std::move ( param ) );
+std::shared_ptr < abstraction::OperationAbstraction > Registry::getCastAbstraction ( std::string target, std::string param, bool & normalize ) {
+	return CastRegistry::getAbstraction ( std::move ( target ), std::move ( param ), normalize );
 }
 
 std::shared_ptr < abstraction::OperationAbstraction > Registry::getImmediateAbstraction ( std::string result, std::string value ) {
diff --git a/alib2common/src/abstraction/Registry.h b/alib2common/src/abstraction/Registry.h
index 5daefbb8cf15111b221316133535428a25acf912..8a7d67cd61031f8f644ae5859beacc0eaf3ee0e6 100644
--- a/alib2common/src/abstraction/Registry.h
+++ b/alib2common/src/abstraction/Registry.h
@@ -20,7 +20,7 @@ public:
 
 	static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( std::string name, const ext::vector < ext::type_index > & paramTypes );
 	static std::shared_ptr < abstraction::OperationAbstraction > getAlgorithmAbstraction ( std::string name, const ext::vector < ext::type_index > & paramTypes, bool & unwrap, bool & normalize );
-	static std::shared_ptr < abstraction::OperationAbstraction > getCastAbstraction ( std::string target, std::string param );
+	static std::shared_ptr < abstraction::OperationAbstraction > getCastAbstraction ( std::string target, std::string param, bool & normalize );
 	static std::shared_ptr < abstraction::OperationAbstraction > getImmediateAbstraction ( std::string result, std::string value );
 	static std::shared_ptr < abstraction::OperationAbstraction > getNormalizeAbstraction ( std::string param );
 	static std::shared_ptr < abstraction::OperationAbstraction > getDowncastAbstraction ( std::string concrete, std::string base );
diff --git a/alib2common/src/abstraction/ValueOperationAbstraction.hpp b/alib2common/src/abstraction/ValueOperationAbstraction.hpp
index ec43b9ad3fb7bd5dfd235d002bb56785ff72f650..5f6c50bf5f575e1a5cac0150df89f5c63bb7cd54 100644
--- a/alib2common/src/abstraction/ValueOperationAbstraction.hpp
+++ b/alib2common/src/abstraction/ValueOperationAbstraction.hpp
@@ -52,11 +52,11 @@ public:
 	virtual std::shared_ptr < OperationAbstraction > getValuePrinterFromResult ( ) const override {
 		std::string param = ext::to_string < ReturnType > ( );
 		return Registry::getValuePrinterAbstraction ( param );
-}
+	}
 
-	virtual std::shared_ptr < OperationAbstraction > getCastFromResult ( const std::string & target ) const override {
+	virtual std::shared_ptr < OperationAbstraction > getCastFromResult ( const std::string & target, bool & normalize ) const override {
 		std::string param = ext::to_string < ReturnType > ( );
-		return Registry::getCastAbstraction ( target, param );
+		return Registry::getCastAbstraction ( target, param, normalize );
 	}
 
 	virtual std::shared_ptr < OperationAbstraction > getNormalizeResult ( ) const override {
diff --git a/alib2common/src/abstraction/VoidOperationAbstraction.hpp b/alib2common/src/abstraction/VoidOperationAbstraction.hpp
index b686c7ee4719537d0e2ce27dfef0b43d25d8fcbf..2df106a3a723fdcbd6b930ed4b695bdd2f303999 100644
--- a/alib2common/src/abstraction/VoidOperationAbstraction.hpp
+++ b/alib2common/src/abstraction/VoidOperationAbstraction.hpp
@@ -33,7 +33,7 @@ public:
 		throw exception::CommonException ( "Void algorithm does not have a result." );
 	}
 
-	virtual std::shared_ptr < OperationAbstraction > getCastFromResult ( const std::string & ) const override {
+	virtual std::shared_ptr < OperationAbstraction > getCastFromResult ( const std::string &, bool & ) const override {
 		throw exception::CommonException ( "Void algorithm does not have a result." );
 	}
 
diff --git a/alib2common/src/registration/CastRegistration.hpp b/alib2common/src/registration/CastRegistration.hpp
index 2dc1e7fa6630686a1a12b73ede430bc0a1fc1dd5..9d9ff52e82cd97716540b712c355a9b07bc407a1 100644
--- a/alib2common/src/registration/CastRegistration.hpp
+++ b/alib2common/src/registration/CastRegistration.hpp
@@ -5,6 +5,8 @@
 #include <introspection/Casts.hpp>
 #include <abstraction/CastRegistry.hpp>
 
+#include <registration/NormalizationRegistration.hpp>
+
 namespace registration {
 
 template < class To, class From >
@@ -15,7 +17,8 @@ public:
 
 		introspection::Casts::registerCast < From, To > ( );
 
-		abstraction::CastRegistry::registerCast < To, From > ( );
+		bool normalize = registration::NormalizationRegister < To > ( ).requireNormalization ( );
+		abstraction::CastRegistry::registerCast < To, From > ( normalize );
 	}
 
 	CastRegister ( To ( * castFunction ) ( const From & ) ) {