diff --git a/adeterminize/src/Determinizer.h b/adeterminize/src/Determinizer.h
new file mode 100644
index 0000000000000000000000000000000000000000..84b61b2a71a04b96e0f8fdd737726fb5b392cdcc
--- /dev/null
+++ b/adeterminize/src/Determinizer.h
@@ -0,0 +1,29 @@
+#ifndef DETERMINIZER_H_
+#define DETERMINIZER_H_
+
+#include "automaton/Automaton.h"
+
+using namespace std;
+using namespace automaton;
+
+namespace determinization {
+
+/**
+ * Base class for all classes with determinization algorithms.
+ */
+class Determinizer
+{
+
+    public:
+        
+        virtual ~Determinizer();
+
+        /**
+         * Runs determinization algorithm.
+         */
+        virtual Automaton* determinize() = 0;
+
+};
+
+}
+#endif
diff --git a/adeterminize/src/adeterminize.cpp b/adeterminize/src/adeterminize.cpp
index 6e016dff33c72e3a68b9465e9cc828b28e07bbbe..be71c90a47e937c3b23450fb4f67be2dee46c62a 100644
--- a/adeterminize/src/adeterminize.cpp
+++ b/adeterminize/src/adeterminize.cpp
@@ -38,45 +38,28 @@ void printHelp() {
 }
 
 
-Automaton* runFsmDeterminization(Automaton* automaton) {
-    fsm::FsmDeterminizer determinizer((FSM*) automaton);
-    return determinizer.determinize();
-}
-
-
-Automaton* runIdpdaDeterminization(Automaton* automaton) {
-    idpda::IdpdaDeterminizer determinizer((PDA*) automaton);
-    return determinizer.determinize();
-}
-
-
-Automaton* runVpaDeterminization(Automaton* automaton, string version) {
+Determinizer* getVpaDeterminizer(Automaton* automaton, string version) {
     if (version == "3") {
-        vpa::VpaDeterminizer3 determinizer((PDA*) automaton);
-        return determinizer.determinize();
+        return new vpa::VpaDeterminizer3((PDA*) automaton);
 
     } else if (version == "2") {
-        vpa::VpaDeterminizer2 determinizer((PDA*) automaton);
-        return determinizer.determinize();
+        return new vpa::VpaDeterminizer2((PDA*) automaton);
     }
 
-    vpa::VpaDeterminizer determinizer((PDA*) automaton);
-    return determinizer.determinize();
+    return new vpa::VpaDeterminizer((PDA*) automaton);
 }
 
 
-Automaton* runRhdpdaDeterminization(Automaton* automaton, string version) {
+Determinizer* getRhdpdaDeterminizer(Automaton* automaton, string version) {
     if (version == "2") {
-        rhdpda::RhdpdaDeterminizer2 determinizer((PDA*) automaton);
-        return determinizer.determinize();
+        return new rhdpda::RhdpdaDeterminizer2((PDA*) automaton);
     }
 
-    rhdpda::RhdpdaDeterminizer determinizer((PDA*) automaton);
-    return determinizer.determinize();
+    return new rhdpda::RhdpdaDeterminizer((PDA*) automaton);
 }
 
 
-Automaton* runDeterminization(Automaton* automaton, string type, string version) {
+Determinizer* getDeterminizer(Automaton* automaton, string type, string version) {
     string _type;
     for (const auto& c : type) {
         _type.append(1, tolower(c));
@@ -84,16 +67,16 @@ Automaton* runDeterminization(Automaton* automaton, string type, string version)
     type = _type;
 
     if (type == "fsm") {
-        return runFsmDeterminization(automaton);
+        return new fsm::FsmDeterminizer((FSM*) automaton);
 
     } else if (type == "idpda") {
-        return runIdpdaDeterminization(automaton);
+        return new idpda::IdpdaDeterminizer((PDA*) automaton);
 
     } else if (type == "vpa") {
-        return runVpaDeterminization(automaton, version);
+        return getVpaDeterminizer(automaton, version);
 
     } else if (type == "rhdpda") {
-        return runRhdpdaDeterminization(automaton, version);
+        return getRhdpdaDeterminizer(automaton, version);
     }
 
     throw AlibException("Unknown type of input automaton. See help.");
@@ -134,11 +117,13 @@ int main(int argc, char** argv) {
         string input(istreambuf_iterator<char>(cin), (istreambuf_iterator<char>()));
         UnknownAutomaton unknownAutomaton = AutomatonFactory::fromString(input);
         Automaton* automaton = AutomatonFactory::buildAutomaton(unknownAutomaton);
-        Automaton* deterministicAutomaton = runDeterminization(automaton, type, version);
+        Determinizer* determinizer = getDeterminizer(automaton, type, version);
+        Automaton* deterministicAutomaton = determinizer->determinize();
         deterministicAutomaton->toXML(cout);
         
         delete automaton;
         delete deterministicAutomaton;
+        delete determinizer;
         
     } catch (AlibException& e) {
         cout << e.what() << endl;
diff --git a/adeterminize/src/fsm/FsmDeterminizer.cpp b/adeterminize/src/fsm/FsmDeterminizer.cpp
index bc3bd5cf43c0c7c5abad406b219a82f1025c5255..fbb12e787337ae1b649a9d4ebc304f5fe288cb77 100644
--- a/adeterminize/src/fsm/FsmDeterminizer.cpp
+++ b/adeterminize/src/fsm/FsmDeterminizer.cpp
@@ -37,7 +37,7 @@ FsmDeterminizer::FsmDeterminizer(FSM* nfsm)
 }
 
 
-FSM* FsmDeterminizer::determinize()
+Automaton* FsmDeterminizer::determinize()
 {
     this->dfsm = new FSM();
     this->initDeterminization();
diff --git a/adeterminize/src/fsm/FsmDeterminizer.h b/adeterminize/src/fsm/FsmDeterminizer.h
index f40374aeca4107cc39a40bc9488d818ff9cbb3ca..81750bb6af0275d68503ff10cacfb943f6264a9b 100644
--- a/adeterminize/src/fsm/FsmDeterminizer.h
+++ b/adeterminize/src/fsm/FsmDeterminizer.h
@@ -10,6 +10,7 @@
 #include "automaton/FSM/TransitionFSM.h"
 
 #include "../common/Utils.h"
+#include "../Determinizer.h"
 #include "FsmStructs.h"
 #include "FsmUtils.h"
 
@@ -23,7 +24,7 @@ namespace fsm {
 /**
  * Class for running determinization algorithm on fsm.
  */
-class FsmDeterminizer
+class FsmDeterminizer : public Determinizer
 {
 
     private:
@@ -73,7 +74,7 @@ class FsmDeterminizer
          *
          * @return deterministic final-state machine
          */
-        FSM* determinize();
+        Automaton* determinize();
 
 };
 
diff --git a/adeterminize/src/idpda/IdpdaDeterminizer.cpp b/adeterminize/src/idpda/IdpdaDeterminizer.cpp
index 965d0241c5939a8786b67a0926eb0381c909cbda..a5cc5a6437eb846f49337fb0b6d2a78fd49975f9 100644
--- a/adeterminize/src/idpda/IdpdaDeterminizer.cpp
+++ b/adeterminize/src/idpda/IdpdaDeterminizer.cpp
@@ -41,7 +41,7 @@ IdpdaDeterminizer::IdpdaDeterminizer(PDA* automaton)
 }
 
 
-PDA* IdpdaDeterminizer::determinize()
+Automaton* IdpdaDeterminizer::determinize()
 {
     this->didpda = new PDA();
     this->initDeterminization();
diff --git a/adeterminize/src/idpda/IdpdaDeterminizer.h b/adeterminize/src/idpda/IdpdaDeterminizer.h
index e32d6fa0a0e59c9a6e5db61f1446e0770e74670d..de7a0c1a4d11edab5af7b07f334f1b8d0c444b79 100644
--- a/adeterminize/src/idpda/IdpdaDeterminizer.h
+++ b/adeterminize/src/idpda/IdpdaDeterminizer.h
@@ -11,6 +11,7 @@
 #include "automaton/PDA/TransitionPDA.h"
 
 #include "../common/Utils.h"
+#include "../Determinizer.h"
 #include "../fsm/FsmUtils.h"
 #include "../fsm/FsmStructs.h"
 
@@ -22,7 +23,7 @@ using namespace determinization::fsm;
 namespace determinization {
 namespace idpda {
 
-class IdpdaDeterminizer
+class IdpdaDeterminizer : public Determinizer
 {
     private:
         PDA* nidpda;
@@ -36,7 +37,7 @@ class IdpdaDeterminizer
         
     public:
         IdpdaDeterminizer(PDA* automaton);
-        PDA* determinize();
+        Automaton* determinize();
 };
 
 }
diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer.cpp b/adeterminize/src/rhdpda/RhdpdaDeterminizer.cpp
index 8b94bef76d6ab6e7e2db8d9b18d3f2c579d2ea96..462a6c0e4d25b0c8f30e0a35f9e538e18bf919ad 100644
--- a/adeterminize/src/rhdpda/RhdpdaDeterminizer.cpp
+++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer.cpp
@@ -87,7 +87,7 @@ RhdpdaDeterminizer::RhdpdaDeterminizer(PDA* rhdpda)
 }
 
 
-PDA* RhdpdaDeterminizer::determinize()
+Automaton* RhdpdaDeterminizer::determinize()
 {
     const Symbol& BOTTOM_OF_STACK_SYMBOL = RhdpdaUtils::BOTTOM_OF_STACK_SYMBOL;
 
diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer.h b/adeterminize/src/rhdpda/RhdpdaDeterminizer.h
index 437f5cef95436f854ba57acd881a92608eef3f26..45fe8707e11b193afa600f7676641941603e5786 100644
--- a/adeterminize/src/rhdpda/RhdpdaDeterminizer.h
+++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer.h
@@ -12,6 +12,7 @@
 #include "alphabet/Symbol.h"
 
 #include "../common/Utils.h"
+#include "../Determinizer.h"
 #include "RhdpdaUtils.h"
 #include "RhdpdaStructs.h"
 
@@ -22,7 +23,7 @@ using namespace alphabet;
 namespace determinization {
 namespace rhdpda {
 
-class RhdpdaDeterminizer
+class RhdpdaDeterminizer : public Determinizer
 {
     private:
         PDA* rhdpda;
@@ -45,7 +46,7 @@ class RhdpdaDeterminizer
 
     public:
         RhdpdaDeterminizer(PDA* rhdpda);
-        PDA* determinize();
+        Automaton* determinize();
 };
 
 }
diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp b/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp
index 0e87dc3fee35fe9c67dd6022ef84ab5cb5e50475..f9202550399f84ecf236814e52297e739bbd39db 100644
--- a/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp
+++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer2.cpp
@@ -64,7 +64,7 @@ RhdpdaDeterminizer2::RhdpdaDeterminizer2(PDA* rhdpda)
 }
 
 
-PDA* RhdpdaDeterminizer2::determinize()
+Automaton* RhdpdaDeterminizer2::determinize()
 {
     const Symbol& BOTTOM_OF_STACK_SYMBOL = RhdpdaUtils::BOTTOM_OF_STACK_SYMBOL;
 
diff --git a/adeterminize/src/rhdpda/RhdpdaDeterminizer2.h b/adeterminize/src/rhdpda/RhdpdaDeterminizer2.h
index 875bd94f2ed1662cad0a8b6aca16fdaec15b0e67..399c8bf806a15849f47b1f75333f35e03d57ef3d 100644
--- a/adeterminize/src/rhdpda/RhdpdaDeterminizer2.h
+++ b/adeterminize/src/rhdpda/RhdpdaDeterminizer2.h
@@ -12,6 +12,7 @@
 #include "alphabet/Symbol.h"
 
 #include "../common/Utils.h"
+#include "../Determinizer.h"
 #include "RhdpdaUtils.h"
 #include "RhdpdaStructs.h"
 
@@ -23,7 +24,7 @@ using namespace determinization;
 namespace determinization {
 namespace rhdpda {
 
-class RhdpdaDeterminizer2
+class RhdpdaDeterminizer2 : public Determinizer
 {
     private:
         PDA* rhdpda;
@@ -45,7 +46,7 @@ class RhdpdaDeterminizer2
 
     public:
         RhdpdaDeterminizer2(PDA* rhdpda);
-        PDA* determinize();
+        Automaton* determinize();
 };
 
 }
diff --git a/adeterminize/src/vpa/VpaDeterminizer.cpp b/adeterminize/src/vpa/VpaDeterminizer.cpp
index 4259e91abeb14e79446ccbde85b13d785ab6db5d..fc32224df0ccc4b4f73b522cf427258995795ccd 100644
--- a/adeterminize/src/vpa/VpaDeterminizer.cpp
+++ b/adeterminize/src/vpa/VpaDeterminizer.cpp
@@ -40,7 +40,7 @@ VpaDeterminizer::VpaDeterminizer(PDA* nvpa)
 }
 
 
-PDA* VpaDeterminizer::determinize()
+Automaton* VpaDeterminizer::determinize()
 {
     this->dvpa = new PDA();
     this->initDeterminization();
diff --git a/adeterminize/src/vpa/VpaDeterminizer.h b/adeterminize/src/vpa/VpaDeterminizer.h
index 8a81a783049ddf90bb0e93825233d46e3fe13bc9..c2fa82ec00fc7b64f0c4f000db4a5ec0d1754dad 100644
--- a/adeterminize/src/vpa/VpaDeterminizer.h
+++ b/adeterminize/src/vpa/VpaDeterminizer.h
@@ -11,6 +11,7 @@
 #include "alphabet/Symbol.h"
 
 #include "../common/Utils.h"
+#include "../Determinizer.h"
 #include "VpaUtils.h"
 #include "VpaStructs.h"
 
@@ -22,7 +23,7 @@ using namespace determinization;
 namespace determinization {
 namespace vpa {
 
-class VpaDeterminizer
+class VpaDeterminizer : public Determinizer
 {
     private:
         PDA* nvpa;
@@ -40,7 +41,7 @@ class VpaDeterminizer
 
     public:
         VpaDeterminizer(PDA* nvpa);
-        PDA* determinize();
+        Automaton* determinize();
 };
 
 }
diff --git a/adeterminize/src/vpa/VpaDeterminizer2.cpp b/adeterminize/src/vpa/VpaDeterminizer2.cpp
index 2d0bbb3d1c4486c0e4d7e9ee5843acc739fdc3d3..368c7aa708413f50ef734ed18f8f129db9e83b96 100644
--- a/adeterminize/src/vpa/VpaDeterminizer2.cpp
+++ b/adeterminize/src/vpa/VpaDeterminizer2.cpp
@@ -40,7 +40,7 @@ VpaDeterminizer2::VpaDeterminizer2(PDA* nvpa)
 }
 
 
-PDA* VpaDeterminizer2::determinize()
+Automaton* VpaDeterminizer2::determinize()
 {
     this->dvpa = new PDA();
     this->initDeterminization();
diff --git a/adeterminize/src/vpa/VpaDeterminizer2.h b/adeterminize/src/vpa/VpaDeterminizer2.h
index b22d499884dc2fe24e1e74f6d26bf124c916e5a5..b1ccab3e4d5d9a545bcba1c5badc4086d4780bf8 100644
--- a/adeterminize/src/vpa/VpaDeterminizer2.h
+++ b/adeterminize/src/vpa/VpaDeterminizer2.h
@@ -11,6 +11,7 @@
 #include "alphabet/Symbol.h"
 
 #include "../common/Utils.h"
+#include "../Determinizer.h"
 #include "VpaUtils.h"
 #include "VpaStructs.h"
 
@@ -22,7 +23,7 @@ using namespace determinization;
 namespace determinization {
 namespace vpa {
 
-class VpaDeterminizer2
+class VpaDeterminizer2 : public Determinizer
 {
     private:
         PDA* nvpa;
@@ -40,7 +41,7 @@ class VpaDeterminizer2
 
     public:
         VpaDeterminizer2(PDA* nvpa);
-        PDA* determinize();
+        Automaton* determinize();
 };
 
 }
diff --git a/adeterminize/src/vpa/VpaDeterminizer3.cpp b/adeterminize/src/vpa/VpaDeterminizer3.cpp
index 711b0f414ab669bc59542a442c82d271d31f335a..c069e659980a4ea9db2fad1e335e9ba2c5fc9292 100644
--- a/adeterminize/src/vpa/VpaDeterminizer3.cpp
+++ b/adeterminize/src/vpa/VpaDeterminizer3.cpp
@@ -106,7 +106,7 @@ VpaDeterminizer3::VpaDeterminizer3(PDA* nvpa)
 }
 
 
-PDA* VpaDeterminizer3::determinize()
+Automaton* VpaDeterminizer3::determinize()
 {
     this->dvpa = new PDA();
     this->initDeterminization();
diff --git a/adeterminize/src/vpa/VpaDeterminizer3.h b/adeterminize/src/vpa/VpaDeterminizer3.h
index ead10b7d191bfbe89be09f0ac27c62dc576ab5d7..4c5574ef284058ce62f4722dd046a437c5a2e337 100644
--- a/adeterminize/src/vpa/VpaDeterminizer3.h
+++ b/adeterminize/src/vpa/VpaDeterminizer3.h
@@ -11,6 +11,7 @@
 #include "alphabet/Symbol.h"
 
 #include "../common/Utils.h"
+#include "../Determinizer.h"
 #include "VpaUtils.h"
 #include "VpaStructs.h"
 
@@ -21,7 +22,7 @@ using namespace alphabet;
 namespace determinization {
 namespace vpa {
 
-class VpaDeterminizer3
+class VpaDeterminizer3 : public Determinizer
 {
     private:
         PDA* nvpa;
@@ -41,7 +42,7 @@ class VpaDeterminizer3
 
     public:
         VpaDeterminizer3(PDA* nvpa);
-        PDA* determinize();
+        Automaton* determinize();
 };
 
 }