diff --git a/alib2algo/src/common/ContainerConverter.hpp b/alib2algo/src/common/ContainerConverter.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..9cbda24f91fa77a4f526a68d3f3c17ee786fbb20
--- /dev/null
+++ b/alib2algo/src/common/ContainerConverter.hpp
@@ -0,0 +1,43 @@
+/*
+ * StringContainerConverter.h
+ *
+ *  Created on: 7. 4. 2015
+ *      Author: Jan Travnicek
+ */
+
+#ifndef _STRING_CONTAINER_CONVERTER__H_
+#define _STRING_CONTAINER_CONVERTER__H_
+
+#include <exception/AlibException.h>
+#include "CastApi.hpp"
+
+namespace common {
+
+/* R is container<T>
+ * S is container<Wrapper>
+ * T is targetType
+ */
+template<class R, class S, class T>
+class ContainerConverter {
+public:
+	/**
+	 * Performs conversion from contaier<String> to container<T>.
+	 * @return container<T>.
+	 */
+	static R convert(const S& containerOfStrings);
+};
+
+template<class R, class S, class T>
+R ContainerConverter<R, S, T>::convert(const S& container) {
+	R result;
+	auto inserter = std::inserter(result, result.end());
+	for(const auto& elem : container) {
+		alib::Object res = alib::castApi::getCastPool<T>().cast(elem.getData());
+		inserter = std::move((T&) res.getData());
+	}
+	return result;
+}
+
+} /* namespace common */
+
+#endif /* _STRING_CONTAINER_CONVERTER__H_ */
diff --git a/alib2algo/src/common/StringContainerConverter.hpp b/alib2algo/src/common/StringContainerConverter.hpp
deleted file mode 100644
index ec62386e920daeca60e7afb07e666669df26779a..0000000000000000000000000000000000000000
--- a/alib2algo/src/common/StringContainerConverter.hpp
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * StringContainerConverter.h
- *
- *  Created on: 7. 4. 2015
- *      Author: Jan Travnicek
- */
-
-#ifndef _STRING_CONTAINER_CONVERTER__H_
-#define _STRING_CONTAINER_CONVERTER__H_
-
-#include <string/LinearString.h>
-#include <string/CyclicString.h>
-#include <string/Epsilon.h>
-#include <string/String.h>
-#include <exception/AlibException.h>
-
-namespace common {
-
-/* R is container<T>
- * S is container<String>
- * T is Epsilon, LinearString, or CyclicString
- */
-template<class R, class S, class T>
-class StringContainerConverter : public string::VisitableStringBase::const_visitor_type {
-public:
-	StringContainerConverter() {}
-
-	/**
-	 * Performs conversion from contaier<String> to container<T>.
-	 * @return container<T>.
-	 */
-	static R convert(const S& containerOfStrings);
-
-private:
-	void Visit(void*, const string::Epsilon& text) const;
-	void Visit(void*, const string::LinearString& text) const;
-	void Visit(void*, const string::CyclicString& text) const;
-
-	static const StringContainerConverter<R, S, T> STRING_CONTAINER_CONVERTER;
-};
-
-template<class R, class S, class T>
-R StringContainerConverter<R, S, T>::convert(const S& containerOfStrings) {
-	R result;
-	auto inserter = std::inserter(result, result.end());
-	for(const string::String& elem : containerOfStrings) {
-		T* out;
-		elem.getData().Accept((void*) &out, StringContainerConverter<R, S, T>::STRING_CONTAINER_CONVERTER);
-		inserter = std::move(*out);
-		delete out;
-	}
-	return result;
-}
-
-
-
-template<class R, class S, class T,
-	typename std::enable_if< std::is_constructible<T, string::Epsilon>::value >::type* = nullptr >
-inline void VisitHelper(void* data, const string::Epsilon& text) {
-	T* & out = *((T**) data);
-	out = new T(text);
-}
-
-template<class R, class S, class T,
-	typename std::enable_if< ! std::is_constructible<T, string::Epsilon>::value >::type* = nullptr >
-inline void VisitHelper(void*, const string::Epsilon&) {
-	throw exception::AlibException("Unsupported string type Epsilon");
-}
-
-template<class R, class S, class T>
-void StringContainerConverter<R, S, T>::Visit(void* data, const string::Epsilon& text) const {
-	VisitHelper<R, S, T>(data, text);
-}
-
-
-
-template<class R, class S, class T,
-	typename std::enable_if< std::is_constructible<T, string::LinearString>::value >::type* = nullptr >
-inline void VisitHelper(void* data, const string::LinearString& text) {
-	T* & out = *((T**) data);
-	out = new T(text);
-}
-
-template<class R, class S, class T,
-	typename std::enable_if< ! std::is_constructible<T, string::LinearString>::value >::type* = nullptr >
-inline void VisitHelper(void*, const string::LinearString&) {
-	throw exception::AlibException("Unsupported string type LinearString");
-}
-
-template<class R, class S, class T>
-void StringContainerConverter<R, S, T>::Visit(void* data, const string::LinearString& text) const {
-	VisitHelper<R, S, T>(data, text);
-}
-
-
-
-template<class R, class S, class T,
-	typename std::enable_if< std::is_constructible<T, string::CyclicString>::value >::type* = nullptr >
-inline void VisitHelper(void* data, const string::CyclicString& text) {
-	T* & out = *((T**) data);
-	out = new T(text);
-}
-
-template<class R, class S, class T,
-	typename std::enable_if< ! std::is_constructible<T, string::CyclicString>::value >::type* = nullptr >
-inline void VisitHelper(void*, const string::CyclicString&) {
-	throw exception::AlibException("Unsupported string type CyclicString");
-}
-
-template<class R, class S, class T>
-void StringContainerConverter<R, S, T>::Visit(void* data, const string::CyclicString& text) const {
-	VisitHelper<R, S, T>(data, text);
-}
-
-
-
-template<class R, class S, class T>
-const StringContainerConverter<R, S, T> StringContainerConverter<R, S, T>::STRING_CONTAINER_CONVERTER;
-
-} /* namespace common */
-
-#endif /* _STRING_CONTAINER_CONVERTER__H_ */
diff --git a/alib2algo/src/stringology/exact/ExactMultiNondeterministicSubsequenceAutomaton.cpp b/alib2algo/src/stringology/exact/ExactMultiNondeterministicSubsequenceAutomaton.cpp
index c8289accf64957ad7498099cf4ae82133c68b01d..9b902d3b84d3923d1db50191812e54aae89bb9a8 100644
--- a/alib2algo/src/stringology/exact/ExactMultiNondeterministicSubsequenceAutomaton.cpp
+++ b/alib2algo/src/stringology/exact/ExactMultiNondeterministicSubsequenceAutomaton.cpp
@@ -9,14 +9,14 @@
 #include <exception/AlibException.h>
 #include <string/LinearString.h>
 #include <string/Epsilon.h>
-#include "../../common/StringContainerConverter.hpp"
+#include "../../common/ContainerConverter.hpp"
 
 namespace stringology {
 
 namespace exact {
 
 automaton::Automaton ExactMultiNondeterministicSubsequenceAutomaton::construct(const std::set<string::String>& texts) {
-	return automaton::Automaton(ExactMultiNondeterministicSubsequenceAutomaton::construct(common::StringContainerConverter<std::set<string::LinearString>, std::set<string::String>, string::LinearString>::convert(texts)));
+	return automaton::Automaton(ExactMultiNondeterministicSubsequenceAutomaton::construct(common::ContainerConverter<std::set<string::LinearString>, std::set<string::String>, string::LinearString>::convert(texts)));
 }
 
 automaton::EpsilonNFA ExactMultiNondeterministicSubsequenceAutomaton::construct(const std::set<string::LinearString>& texts) {
diff --git a/alib2data/src/common/base.hpp b/alib2data/src/common/base.hpp
index 1ecacd8aada6338253d89b3217ce77cd0f8893ec..4cc682bab10d373ce305dd243b61b240d23e16df 100644
--- a/alib2data/src/common/base.hpp
+++ b/alib2data/src/common/base.hpp
@@ -51,7 +51,7 @@ public:
 
 	virtual int compare(const T & other) const = 0;
 
-	template<typename R, typename S>
+	template<typename R, typename S> //TODO what if someone want to control the ordering?
 	static int compare(const R& first, const S& second) {
 		if(first.selfTypeId() < second.selfTypeId())
 			return -1;