diff --git a/alib2algo/src/string/naive/ExactCompare.cpp b/alib2algo/src/string/naive/ExactCompare.cpp
index 02999dd3f0920bb37497d97b0eeeb3e132055839..b72770486cfc80f60f17c33208b7a60c776ab4fe 100644
--- a/alib2algo/src/string/naive/ExactCompare.cpp
+++ b/alib2algo/src/string/naive/ExactCompare.cpp
@@ -14,15 +14,15 @@ namespace string {
 namespace naive {
 
 int ExactCompare::compare(const string::String& u, const string::String& v) {
-	int data;
-	Accept((void*) &data, u.getData(), v.getData(), ExactCompare::EXACT_COMPARE);
-	return data;
+	return getInstance().dispatch(u.getData(), v.getData());
 }
 
 int ExactCompare::compare(const string::Epsilon&, const string::Epsilon&) {
 	return 0;
 }
 
+auto ExactCompareEpsilon = ExactCompare::RegistratorWrapper<int, string::Epsilon>(ExactCompare::getInstance(), ExactCompare::compare);
+
 int ExactCompare::compare(const string::LinearString& u, const string::LinearString& v) {
 	int n = (int) u.getContent().size(), m = (int)v.getContent().size();
 	int k = 0;
@@ -41,6 +41,8 @@ int ExactCompare::compare(const string::LinearString& u, const string::LinearStr
 	}
 }
 
+auto ExactCompareLinearString = ExactCompare::RegistratorWrapper<int, string::LinearString>(ExactCompare::getInstance(), ExactCompare::compare);
+
 int ExactCompare::compare(const string::CyclicString& u, const string::CyclicString& v) {
 	int n = (int) u.getContent().size(), m = (int)v.getContent().size();
 	int i = -1, j = -1, k;
@@ -57,22 +59,7 @@ int ExactCompare::compare(const string::CyclicString& u, const string::CyclicStr
 	return last ? 1 : - 1;
 }
 
-void ExactCompare::Visit(void* data, const string::Epsilon& u, const string::Epsilon& v) const {
-	int & res = *((int*) data);
-	res = this->compare(u, v);
-}
-
-void ExactCompare::Visit(void* data, const string::LinearString& u, const string::LinearString& v) const {
-	int & res = *((int*) data);
-	res = this->compare(u, v);
-}
-
-void ExactCompare::Visit(void* data, const string::CyclicString& u, const string::CyclicString& v) const {
-	int & res = *((int*) data);
-	res = this->compare(u, v);
-}
-
-const ExactCompare ExactCompare::EXACT_COMPARE;
+auto ExactCompareCyclicString = ExactCompare::RegistratorWrapper<int, string::CyclicString>(ExactCompare::getInstance(), ExactCompare::compare);
 
 } /* namespace naive */
 
diff --git a/alib2algo/src/string/naive/ExactCompare.h b/alib2algo/src/string/naive/ExactCompare.h
index ada478f2daf6b3358691d5ff969ee35c8aa1accd..fc4825128a9fb5940a91a700d25505f25b218afc 100644
--- a/alib2algo/src/string/naive/ExactCompare.h
+++ b/alib2algo/src/string/naive/ExactCompare.h
@@ -8,28 +8,25 @@
 #ifndef EXACT_COMPARE_H_
 #define EXACT_COMPARE_H_
 
+#include <common/multipleDispatch.hpp>
 #include <string/String.h>
 
 namespace string {
 
 namespace naive {
 
-class ExactCompare : public string::VisitableStringBase::const_promoting_visitor_type {
+class ExactCompare : public std::PromotingDoubleDispatch<int, string::StringBase> {
 public:
-	ExactCompare() {}
-
 	static int compare(const string::String& u, const string::String& v);
 
 	static int compare(const string::Epsilon& u, const string::Epsilon& v);
 	static int compare(const string::LinearString& u, const string::LinearString& v);
 	static int compare(const string::CyclicString& u, const string::CyclicString& v);
 
-private:
-	void Visit(void*, const Epsilon& u, const Epsilon& v) const;
-	void Visit(void*, const LinearString& u, const LinearString& v) const;
-	void Visit(void*, const CyclicString& u, const CyclicString& v) const;
-
-	static const ExactCompare EXACT_COMPARE;
+	static ExactCompare& getInstance() {
+		static ExactCompare res;
+		return res;
+	}
 };
 
 } /* namespace naive */
diff --git a/alib2algo/src/string/naive/ExactEqual.cpp b/alib2algo/src/string/naive/ExactEqual.cpp
index 746bb375c4d3419ecf5352da31841a2ce83637db..412b4abf0393157d0dc7ba638369ce87721c66a7 100644
--- a/alib2algo/src/string/naive/ExactEqual.cpp
+++ b/alib2algo/src/string/naive/ExactEqual.cpp
@@ -14,15 +14,15 @@ namespace string {
 namespace naive {
 
 bool ExactEqual::equals(const string::String& u, const string::String& v) {
-	bool data;
-	Accept((void*) &data, u.getData(), v.getData(), ExactEqual::EXACT_EQUAL);
-	return data;
+	return getInstance().dispatch(u.getData(), v.getData());
 }
 
 bool ExactEqual::equals(const string::Epsilon&, const string::Epsilon&) {
 	return true;
 }
 
+auto ExactEqualEpsilon = ExactEqual::RegistratorWrapper<bool, string::Epsilon>(ExactEqual::getInstance(), ExactEqual::equals);
+
 bool ExactEqual::equals(const string::LinearString& u, const string::LinearString& v) {
 	int n = (int) u.getContent().size(), m = (int)v.getContent().size();
 	int k = 0;
@@ -35,6 +35,8 @@ bool ExactEqual::equals(const string::LinearString& u, const string::LinearStrin
 	}
 }
 
+auto ExactEqualLinearString = ExactEqual::RegistratorWrapper<bool, string::LinearString>(ExactEqual::getInstance(), ExactEqual::equals);
+
 bool ExactEqual::equals(const string::CyclicString& u, const string::CyclicString& v) {
 	int n = (int)u.getContent().size();
 	int i = -1, j = -1, k;
@@ -50,22 +52,7 @@ bool ExactEqual::equals(const string::CyclicString& u, const string::CyclicStrin
 	return false;
 }
 
-void ExactEqual::Visit(void* data, const string::Epsilon& u, const string::Epsilon& v) const {
-	bool & res = *((bool*) data);
-	res = this->equals(u, v);
-}
-
-void ExactEqual::Visit(void* data, const string::LinearString& u, const string::LinearString& v) const {
-	bool & res = *((bool*) data);
-	res = this->equals(u, v);
-}
-
-void ExactEqual::Visit(void* data, const string::CyclicString& u, const string::CyclicString& v) const {
-	bool & res = *((bool*) data);
-	res = this->equals(u, v);
-}
-
-const ExactEqual ExactEqual::EXACT_EQUAL;
+auto ExactEqualCyclicString = ExactEqual::RegistratorWrapper<bool, string::CyclicString>(ExactEqual::getInstance(), ExactEqual::equals);
 
 } /* namespace naive */
 
diff --git a/alib2algo/src/string/naive/ExactEqual.h b/alib2algo/src/string/naive/ExactEqual.h
index e0490504fd0ac9f330d59a5544eaba3daaafc168..991b94dbcf079c653d13c1018b4fc75309e150b2 100644
--- a/alib2algo/src/string/naive/ExactEqual.h
+++ b/alib2algo/src/string/naive/ExactEqual.h
@@ -8,28 +8,25 @@
 #ifndef EXACT_EQUAL_H_
 #define EXACT_EQUAL_H_
 
+#include <common/multipleDispatch.hpp>
 #include <string/String.h>
 
 namespace string {
 
 namespace naive {
 
-class ExactEqual : public string::VisitableStringBase::const_promoting_visitor_type {
+class ExactEqual : public std::PromotingDoubleDispatch<bool, string::StringBase> {
 public:
-	ExactEqual() {}
-
 	static bool equals(const string::String& u, const string::String& v);
-	
+
 	static bool equals(const string::Epsilon& u, const string::Epsilon& v);
 	static bool equals(const string::LinearString& u, const string::LinearString& v);
 	static bool equals(const string::CyclicString& u, const string::CyclicString& v);
 
-private:
-	void Visit(void*, const Epsilon& u, const Epsilon& v) const;
-	void Visit(void*, const LinearString& u, const LinearString& v) const;
-	void Visit(void*, const CyclicString& u, const CyclicString& v) const;
-
-	static const ExactEqual EXACT_EQUAL;
+	static ExactEqual& getInstance() {
+		static ExactEqual res;
+		return res;
+	}
 };
 
 } /* namespace naive */