diff --git a/alib2std/src/extensions/clone.hpp b/alib2std/src/extensions/clone.hpp
index ac15a1db52647d8aee8e3f919e5f50b4e7c4c66d..c5d5af8d2dfe9518521dcac20632af7e2eb55532 100644
--- a/alib2std/src/extensions/clone.hpp
+++ b/alib2std/src/extensions/clone.hpp
@@ -12,14 +12,14 @@
 
 namespace ext {
 
-template<class T, typename std::enable_if< ! ext::has_clone<T>::value >::type* = nullptr>
-T* clone(const T * const tmp) {
-	return new T(*tmp);
+template < class T, typename std::enable_if < ! ext::has_clone < T >::value >::type * = nullptr >
+auto clone ( T && tmp ) {
+	return new typename std::decay < T >::type ( std::forward < T > ( tmp ) );
 }
 
-template<class T, typename std::enable_if< ext::has_clone<T>::value >::type* = nullptr>
-T* clone(const T * const tmp) {
-	return tmp->clone();
+template < class T, typename std::enable_if < ext::has_clone < T >::value >::type * = nullptr >
+auto clone ( T && tmp ) {
+	return std::forward < T > ( tmp ).clone ( );
 }
 
 } /* namespace ext */
diff --git a/alib2std/src/extensions/memory.hpp b/alib2std/src/extensions/memory.hpp
index 41ab3e6de408bac9167532d0c49db39b7367938a..2c28df6133dfa40edfcb38fc9a8f626038fe9e97 100644
--- a/alib2std/src/extensions/memory.hpp
+++ b/alib2std/src/extensions/memory.hpp
@@ -130,7 +130,7 @@ private:
 
 		T * tmp = m_Data;
 		detach ( );
-		tmp = ext::clone ( tmp );
+		tmp = ext::clone ( * tmp );
 		tmp->m_UseCount = 0;
 		attach ( tmp );
 	}
@@ -253,7 +253,7 @@ private:
 
 		typename cow_shared_ptr < T >::cow_shared_ptr_data * tmp = m_Data;
 		detach ( );
-		attach ( new cow_shared_ptr_data ( ext::clone ( tmp->m_Data ) ) );
+		attach ( new cow_shared_ptr_data ( ext::clone ( * tmp->m_Data ) ) );
 	}
 
 	cow_shared_ptr_data * m_Data;
@@ -281,7 +281,7 @@ public:
 	smart_ptr ( smart_ptr < R > other ) : m_Data ( other.release ( ) ) {
 	}
 
-	smart_ptr ( const smart_ptr & other ) : m_Data ( ext::clone ( other.m_Data ) ) {
+	smart_ptr ( const smart_ptr & other ) : m_Data ( ext::clone ( * other.m_Data ) ) {
 	}
 
 	smart_ptr ( smart_ptr && other ) noexcept : m_Data ( other.release ( ) ) {
@@ -295,7 +295,7 @@ public:
 		if ( this == & other ) return * this;
 
 		delete m_Data;
-		m_Data = ext::clone ( other.m_Data );
+		m_Data = ext::clone ( * other.m_Data );
 
 		return * this;
 	}