diff --git a/adeterminize.rhdpda/makefile b/adeterminize.rhdpda/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..43ba50085733582654d168446141891a1659b02b
--- /dev/null
+++ b/adeterminize.rhdpda/makefile
@@ -0,0 +1,20 @@
+CC=g++
+EXECUTIBLE=adeterminize.rhdpda
+CCFLAGS= -std=c++11 -O2 -c -Wall -I../alib/src -I../adeterminize/src
+LDFLAGS= -L../alib/lib -L../adeterminize/lib -lxml2 -lalib -ladeterminize -Wl,-rpath,.
+
+SOURCES=$(shell find src/ -name *cpp)
+OBJECTS=$(patsubst src/%.cpp, obj/%.o, $(SOURCES))
+
+all: $(SOURCES) bin/$(EXECUTIBLE)
+
+bin/$(EXECUTIBLE): $(OBJECTS)
+	mkdir -p bin
+	$(CC) $(OBJECTS) -o $@ $(LDFLAGS)
+
+obj/%.o: src/%.cpp
+	mkdir -p $(dir $@)
+	$(CC) $(CCFLAGS) $< -o $@
+
+clean:
+	$(RM) -r *.o *.d bin obj
diff --git a/adeterminize.rhdpda/src/RHDPDADeterminizationStructs.h b/adeterminize.rhdpda/src/RHDPDADeterminizationStructs.h
new file mode 100644
index 0000000000000000000000000000000000000000..bf5e4b29365e33aed71da02d84f2e2b018b3da93
--- /dev/null
+++ b/adeterminize.rhdpda/src/RHDPDADeterminizationStructs.h
@@ -0,0 +1,93 @@
+#ifndef RHDPDADETERKMINIZATIONSTRUCTS_H_
+#define RHDPDADETERKMINIZATIONSTRUCTS_H_
+
+#include <set>
+
+using namespace automaton;
+
+namespace determinization {
+
+struct StateSymbolPair {
+    State state;
+    Symbol symbol;
+
+    StateSymbolPair(const State& state, const Symbol& symbol)
+            : state(state),
+              symbol(symbol) {}
+
+    bool operator < (const StateSymbolPair& other) const {
+        return (state < other.state) || ((state == other.state) && (symbol < other.symbol));
+    }
+    
+    bool operator == (const StateSymbolPair& other) const {
+        return (state == other.state) && (symbol == other.symbol);
+    }
+    
+    bool operator != (const StateSymbolPair& other) const {
+        return (state != other.state) || (symbol != other.symbol);
+    }
+};
+
+struct PairOfPairs {
+    StateSymbolPair pair1;
+    StateSymbolPair pair2;
+    
+    PairOfPairs(const StateSymbolPair& pair1, const StateSymbolPair& pair2)
+            : pair1(pair1),
+              pair2(pair2) {}
+    
+    bool operator < (const PairOfPairs& other) const {
+        return (pair1 < other.pair1) || ((pair1 == other.pair1) && (pair2 < other.pair2));
+    }
+    
+    bool operator == (const PairOfPairs& other) const {
+        return (pair1 == other.pair1) && (pair2 == other.pair2);
+    }
+    
+    bool operator != (const PairOfPairs& other) const {
+        return (pair1 != other.pair1) || (pair2 != other.pair2);
+    }
+};
+
+
+struct SComponent {
+    set<PairOfPairs> pairsOfPairs;
+    SComponent() {}
+    SComponent(const set<PairOfPairs>& pairsOfPairs)
+            : pairsOfPairs(pairsOfPairs) {}
+};
+
+
+struct RComponent {
+    set<StateSymbolPair> pairs;
+    RComponent() {}
+    RComponent(const set<StateSymbolPair>& pairs)
+            : pairs(pairs) {}
+};
+
+
+struct StateData {
+    State state;
+    SComponent s;
+    RComponent r;
+    bool isMarked;
+    
+    StateData(const State& state, const SComponent& s, const RComponent& r)
+            : state(state),
+              s(s),
+              r(r),
+              isMarked(false) {}
+};
+
+
+struct PartialStackData {
+    SComponent s;
+    RComponent r;
+    
+    PartialStackData(const SComponent& s, const RComponent& r)
+            : s(s),
+              r(r) {}
+};
+
+} /* namespace determinization */
+#endif /* RHDPDADETERKMINIZATIONSTRUCTS_H_ */
\ No newline at end of file
diff --git a/adeterminize.rhdpda/src/RHDPDADeterminizer.cpp b/adeterminize.rhdpda/src/RHDPDADeterminizer.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..bfa72149c2fb0d6fc1e4beb684c1ae8fc99272fb
--- /dev/null
+++ b/adeterminize.rhdpda/src/RHDPDADeterminizer.cpp
@@ -0,0 +1,374 @@
+#include "RHDPDADeterminizer.h"
+
+namespace determinization {
+
+const Symbol RHDPDADeterminizer::BOTTOM_OF_STACK_SYMBOL("_"); // TODO specialni symbol pro dno zasobniku zpusobuje chybu
+
+
+string RHDPDADeterminizer::buildPairName(const StateSymbolPair& pair) {
+    return "('" + pair.state.getName() + "', '" + pair.symbol.getSymbol() + "')";;
+}
+
+
+string RHDPDADeterminizer::buildStateName(const SComponent& s, const RComponent& r) {
+    string name = "{";
+    for (set<PairOfPairs>::const_iterator pairOfPairs = s.pairsOfPairs.begin();
+            pairOfPairs != s.pairsOfPairs.end();
+            pairOfPairs++) {
+        if (pairOfPairs != s.pairsOfPairs.begin()) {
+            name += ", ";
+        }
+        name += "(" + buildPairName(pairOfPairs->pair1) + ", " + buildPairName(pairOfPairs->pair2) + ")";
+    }
+    name += "}, {";
+    for (set<StateSymbolPair>::const_iterator pair = r.pairs.begin();
+            pair != r.pairs.end();
+            pair++) {
+        if (pair != r.pairs.begin()) {
+            name += ", ";
+        }
+        name += buildPairName(*pair);
+    }
+    return name + "}";
+}
+
+
+const State& RHDPDADeterminizer::getOrCreateState(const SComponent& s, const RComponent& r,
+        map<string, StateData>& states, PDA& rdpda) {
+    string stateName = buildStateName(s, r);
+
+    map<string, StateData>::iterator statesIter = states.find(stateName);
+    if (statesIter != states.end()) {
+        return statesIter->second.state;
+    }
+    
+    State state(stateName);
+    StateData stateData(state, s, r);
+    StateData& insertedData = states.insert(pair<string, StateData>(stateName, stateData)).first->second;
+    rdpda.addState(state);
+    return insertedData.state;
+}
+
+
+const SComponent RHDPDADeterminizer::getSComponentWithPairsIdentity(const set<StateSymbolPair>& pairs) {
+    set<PairOfPairs> pairsOfPairs;
+    for (set<StateSymbolPair>::const_iterator pair = pairs.begin(); pair != pairs.end(); pair++) {
+        pairsOfPairs.insert(PairOfPairs(*pair, *pair));
+    }
+    return SComponent(pairsOfPairs);
+}
+
+
+void RHDPDADeterminizer::divideTransitions(const set<TransitionPDA>& transitions, set<TransitionPDA>& internalTransitions,
+        set<TransitionPDA>& pushTransitions, set<TransitionPDA>& popTransitions) {
+    for (set<TransitionPDA>::iterator transition = transitions.begin(); transition != transitions.end(); transition++) {
+        if (transition->getPush().size() == 2) {
+            pushTransitions.insert(*transition);
+        } else if (transition->getPush().size() == 1) {
+            internalTransitions.insert(*transition);
+        } else {
+            popTransitions.insert(*transition);
+        }
+    }
+}
+
+
+string RHDPDADeterminizer::buildStackSymbolName(const SComponent& s, const RComponent& r, const Symbol& input, PDA& rdpda) {
+    string name = "(" + buildStateName(s, r) + ")";
+    name += ", " + input.getSymbol();
+    try {
+        rdpda.addStackSymbol(name);
+    } catch (AutomatonException e) { /* Stack symbol already exists */ }
+    return name;
+}
+
+
+vector<SComponent> RHDPDADeterminizer::generateAllPossibleSComponents(set<StateSymbolPair>& pairs) {
+     // Generate all possible pairs of pairs
+    vector<PairOfPairs> possiblePairsOfPairs;
+    for (set<StateSymbolPair>::iterator pair1 = pairs.begin(); pair1 != pairs.end(); pair1++) {
+        for (set<StateSymbolPair>::iterator pair2 = pairs.begin(); pair2 != pairs.end(); pair2++) {
+            possiblePairsOfPairs.push_back(PairOfPairs(*pair1, *pair2));
+        }
+    }
+    
+    // Generate all possible s components
+    vector<SComponent> possibleS;
+    int possibleSSize = pow(2, possiblePairsOfPairs.size());
+    for (int i = 0; i < possibleSSize; i++) {
+        set<PairOfPairs> pairsOfPairsSet;
+        int mask = 1;
+        for (vector<PairOfPairs>::iterator pairOfPairs = possiblePairsOfPairs.begin();
+                pairOfPairs != possiblePairsOfPairs.end();
+                pairOfPairs++) {
+            if ((i & mask) != 0) {
+                pairsOfPairsSet.insert(*pairOfPairs);
+            }
+            mask <<= 1;
+        }
+        possibleS.push_back(SComponent(pairsOfPairsSet));
+    }
+
+    return possibleS;
+}
+
+
+vector<RComponent> RHDPDADeterminizer::generateAllPossibleRComponents(set<StateSymbolPair>& pairs) {
+    // Generate all possible r components
+    vector<RComponent> possibleR;
+    int possibleRSize = pow(2, pairs.size());
+    for (int i = 0; i < possibleRSize; i++) {
+        set<StateSymbolPair> pairsSet;
+        int mask = 1;
+        for (set<StateSymbolPair>::iterator pair = pairs.begin(); pair != pairs.end(); pair++) {
+            if ((i & mask) != 0) {
+                pairsSet.insert(*pair);
+            }
+            mask <<= 1;
+        }
+        possibleR.push_back(RComponent(pairsSet));
+    }
+
+    return possibleR;
+}
+
+
+StateData* RHDPDADeterminizer::getUnmarkedState(map<string, StateData>& states) {
+    StateData* unmarkedStateData = NULL;
+    for (map<string, StateData>::iterator stateIter = states.begin(); stateIter != states.end(); stateIter++) {
+        if (!stateIter->second.isMarked) {
+            unmarkedStateData = &stateIter->second;
+            unmarkedStateData->isMarked = true;
+            return unmarkedStateData;
+        }
+    }
+    return NULL;
+}
+
+
+set<StateSymbolPair> RHDPDADeterminizer::combineStatesWithSymbol(const set<State>& states, const Symbol& symbol) {
+    set<StateSymbolPair> pairs;
+    for (set<State>::iterator state = states.begin(); state != states.end(); state++) {
+        pairs.insert(StateSymbolPair(*state, symbol));
+    }
+    return pairs;
+}
+
+
+set<StateSymbolPair> RHDPDADeterminizer::buildAllStateSymbolPairs(PDA& rhdpda) {
+    set<StateSymbolPair> allStateSymbolPairs;
+    const set<State>& states = rhdpda.getStates();
+    const set<Symbol>& stackAlphabet = rhdpda.getStackAlphabet();
+    for (set<State>::iterator state = states.begin(); state != states.end(); state++) {
+        for (set<Symbol>::iterator symbol = stackAlphabet.begin(); symbol != stackAlphabet.end(); symbol++) {
+            allStateSymbolPairs.insert(StateSymbolPair(*state, *symbol));
+        }
+    }
+    return allStateSymbolPairs;
+}
+
+
+PDA RHDPDADeterminizer::determinize(PDA& rhdpda) {
+    PDA rdpda;
+    map<string, StateData> states;
+    const set<TransitionPDA>& transitions = rhdpda.getTransitions();
+    set<TransitionPDA> internalTransitions;
+    set<TransitionPDA> pushTransitions;
+    set<TransitionPDA> popTransitions;
+    set<StateSymbolPair> allStateSymbolPairs = buildAllStateSymbolPairs(rhdpda);
+    vector<SComponent> allScomponents = generateAllPossibleSComponents(allStateSymbolPairs);
+    vector<RComponent> allRcomponents = generateAllPossibleRComponents(allStateSymbolPairs);
+    const set<Symbol>& inputAlphabet = rhdpda.getInputAlphabet();
+    
+    DeterminizationUtils::copyInputAlphabet(rhdpda, rdpda);
+    divideTransitions(transitions, internalTransitions, pushTransitions, popTransitions);
+    
+    set<StateSymbolPair> initialSPairs = combineStatesWithSymbol(rhdpda.getStates(), BOTTOM_OF_STACK_SYMBOL);
+    set<StateSymbolPair> initialRPairs = combineStatesWithSymbol(rhdpda.getInitialStates(), BOTTOM_OF_STACK_SYMBOL);
+    const SComponent& initialS = getSComponentWithPairsIdentity(initialSPairs);
+    const RComponent& initialR(initialRPairs);
+    const State& initialState = getOrCreateState(initialS, initialR, states, rdpda);
+    rdpda.addInitialState(initialState);
+
+    while (true) {
+        StateData* unmarkedStateData = getUnmarkedState(states);
+        if (unmarkedStateData == NULL) {
+            break;
+        }
+        
+        // Internal
+        for (set<Symbol>::iterator a = inputAlphabet.begin(); a != inputAlphabet.end(); a++) {
+            SComponent sPrimed;
+            SComponent& s = unmarkedStateData->s;
+            for (set<PairOfPairs>::iterator pairOfPairs = s.pairsOfPairs.begin();
+                    pairOfPairs != s.pairsOfPairs.end();
+                    pairOfPairs++) {
+                const StateSymbolPair& x = pairOfPairs->pair1;
+                const State& r = pairOfPairs->pair2.state;
+                const Symbol& Y = pairOfPairs->pair2.symbol;
+                for (set<TransitionPDA>::iterator transition = internalTransitions.begin();
+                        transition != internalTransitions.end();
+                        transition++) {
+                    if (transition->getFrom() == r && transition->getInput() == *a && transition->getPop().front() == Y) {
+                        const State& q = transition->getTo();
+                        sPrimed.pairsOfPairs.insert(PairOfPairs(x, StateSymbolPair(q, Y)));
+                    }
+                }
+            }
+            RComponent rPrimed;
+            RComponent& r = unmarkedStateData->r;
+            for (set<StateSymbolPair>::iterator pair = r.pairs.begin(); pair != r.pairs.end(); pair++) {
+                const State& p = pair->state;
+                const Symbol& Y = pair->symbol;
+                for (set<TransitionPDA>::iterator transition = internalTransitions.begin();
+                        transition != internalTransitions.end();
+                        transition++) {
+                    if (transition->getFrom() == p && transition->getInput() == *a && transition->getPop().front() == Y) {
+                        const State& q = transition->getTo();
+                        rPrimed.pairs.insert(StateSymbolPair(q, Y));
+                    }
+                }
+            }
+            if (sPrimed.pairsOfPairs.size() > 0 && rPrimed.pairs.size() > 0) {
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = getOrCreateState(sPrimed, rPrimed, states, rdpda);
+                const TransitionPDA transition(fromState, *a, toState);
+                rdpda.addTransition(transition);
+            }
+        }
+        
+        // Push
+        for (set<Symbol>::iterator a = inputAlphabet.begin(); a != inputAlphabet.end(); a++) {
+            SComponent sDoublePrimed = getSComponentWithPairsIdentity(allStateSymbolPairs);
+            SComponent& s = unmarkedStateData->s;
+            RComponent rDoublePrimed;
+            RComponent& r = unmarkedStateData->r;
+            for (set<StateSymbolPair>::iterator pair = r.pairs.begin(); pair != r.pairs.end(); pair++) {
+                const State& p = pair->state;
+                const Symbol& Y = pair->symbol;
+                for (set<TransitionPDA>::iterator transition = pushTransitions.begin();
+                        transition != pushTransitions.end();
+                        transition++) {
+                    if (transition->getFrom() == p && transition->getInput() == *a && transition->getPop().front() == Y) {
+                        const State& q = transition->getTo();
+                        const Symbol& Z = transition->getPush().front();
+                        rDoublePrimed.pairs.insert(StateSymbolPair(q, Z));
+                    }
+                }
+            }
+            if (rDoublePrimed.pairs.size() > 0) {
+                const State& fromState = unmarkedStateData->state;
+                const State& toState = getOrCreateState(sDoublePrimed, rDoublePrimed, states, rdpda);
+                string stackSymbolName = buildStackSymbolName(s, r, *a, rdpda);
+                list<Symbol> pop;
+                list<Symbol> push(1, Symbol(stackSymbolName));
+                const TransitionPDA transition(fromState, *a, toState, pop, push);
+                rdpda.addTransition(transition);
+            }
+        }
+
+        // Pop
+        for (set<Symbol>::iterator a = inputAlphabet.begin(); a != inputAlphabet.end(); a++) {
+            for (set<Symbol>::iterator b = inputAlphabet.begin(); b != inputAlphabet.end(); b++) {
+                SComponent& s = unmarkedStateData->s;
+
+                set<PairOfPairs> update;
+                for (set<PairOfPairs>::iterator pairOfPairs = s.pairsOfPairs.begin();
+                        pairOfPairs != s.pairsOfPairs.end();
+                        pairOfPairs++) {
+                    const State& r = pairOfPairs->pair1.state;
+                    const Symbol& Z = pairOfPairs->pair1.symbol;
+                    const State& rPrimed = pairOfPairs->pair2.state;
+                    if (pairOfPairs->pair2.symbol == Z) {
+                        for (set<TransitionPDA>::iterator pushTransition = pushTransitions.begin();
+                                pushTransition != pushTransitions.end();
+                                pushTransition++) {
+                            for (set<TransitionPDA>::iterator popTransition = popTransitions.begin();
+                                    popTransition != popTransitions.end();
+                                    popTransition++) {
+                                const State& p = pushTransition->getFrom();
+                                const State& q = popTransition->getTo();
+                                if (pushTransition->getInput() == *a && pushTransition->getTo() == r &&
+                                        popTransition->getInput() == *b && popTransition->getFrom() == rPrimed &&
+                                        pushTransition->getPush().front() == Z && popTransition->getPop().front() == Z) {
+                                    const Symbol& Y = pushTransition->getPop().front();
+                                    StateSymbolPair pair1(p, Y);
+                                    StateSymbolPair pair2(q, Y);
+                                    update.insert(PairOfPairs(pair1, pair2));
+                                }
+                            }
+                        }
+                    }
+                }
+                if (update.size() == 0) {
+                    continue;
+                }
+
+                for (vector<SComponent>::iterator sPrimed = allScomponents.begin();
+                        sPrimed != allScomponents.end();
+                        sPrimed++) {
+                    for (vector<RComponent>::iterator rPrimed = allRcomponents.begin();
+                            rPrimed != allRcomponents.end();
+                            rPrimed++) {
+                        RComponent rDoublePrimed;
+                        for (set<PairOfPairs>::iterator updateItem = update.begin();
+                                updateItem != update.end();
+                                updateItem++) {
+                            const StateSymbolPair& y = updateItem->pair1;
+                            const StateSymbolPair& x = updateItem->pair2;
+                            if (rPrimed->pairs.find(y) != rPrimed->pairs.end()) {
+                                rDoublePrimed.pairs.insert(x);
+                            }
+                        }
+                        SComponent sDoublePrimed;
+                        for (set<PairOfPairs>::iterator updateItem = update.begin();
+                                updateItem != update.end();
+                                updateItem++) {
+                            const StateSymbolPair& z = updateItem->pair1;
+                            const StateSymbolPair& y = updateItem->pair2;
+                            for (set<PairOfPairs>::iterator sPrimedPair = sPrimed->pairsOfPairs.begin();
+                                    sPrimedPair != sPrimed->pairsOfPairs.end();
+                                    sPrimedPair++) {
+                                if (sPrimedPair->pair2 == z) {
+                                    const StateSymbolPair& x = sPrimedPair->pair1;
+                                    sDoublePrimed.pairsOfPairs.insert(PairOfPairs(x, y));
+                                }
+                            }
+                        }
+                        if (sDoublePrimed.pairsOfPairs.size() > 0 && rDoublePrimed.pairs.size() > 0) {
+                            const State& fromState = unmarkedStateData->state;
+                            const State& toState = getOrCreateState(sDoublePrimed, rDoublePrimed, states, rdpda);
+                            string stackSymbolName = buildStackSymbolName(*sPrimed, *rPrimed, *a, rdpda);
+                            list<Symbol> pop(1, Symbol(stackSymbolName));
+                            list<Symbol> push;
+                            const TransitionPDA transition(fromState, *b, toState, pop, push);
+                            rdpda.addTransition(transition);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    const set<State>& rhdpdaFinalState = rhdpda.getFinalStates();
+    for (map<string, StateData>::iterator state = states.begin();
+            state != states.end();
+            state++) {
+        bool isFinalState = false;
+        RComponent& r = state->second.r;
+        for (set<StateSymbolPair>::iterator pair = r.pairs.begin();
+                pair != r.pairs.end();
+                pair++) {
+            if (rhdpdaFinalState.find(pair->state) != rhdpdaFinalState.end()) {
+                isFinalState = true;
+            }
+        }
+        if (isFinalState) {
+            rdpda.addFinalState(state->second.state);
+        }
+    }
+
+    return rdpda;
+}
+
+} /* namespace determinization */
diff --git a/adeterminize.rhdpda/src/RHDPDADeterminizer.h b/adeterminize.rhdpda/src/RHDPDADeterminizer.h
new file mode 100644
index 0000000000000000000000000000000000000000..701dbd16e9ad6bdd68cff18a0479a923a30ac509
--- /dev/null
+++ b/adeterminize.rhdpda/src/RHDPDADeterminizer.h
@@ -0,0 +1,45 @@
+#ifndef RHDPDADETERMINZER_H_
+#define RHDPDADETERMINZER_H_
+
+#include <string>
+#include <set>
+#include <map>
+#include <vector>
+
+#include "automaton/PDA/PDA.h"
+#include "automaton/Transition.h"
+#include "automaton/exception/AutomatonException.h"
+#include "alphabet/Symbol.h"
+#include "DeterminizationUtils.h"
+#include "RHDPDADeterminizationStructs.h"
+
+using namespace std;
+using namespace automaton;
+using namespace alphabet;
+
+namespace determinization {
+
+class RHDPDADeterminizer {
+protected:
+    static const Symbol BOTTOM_OF_STACK_SYMBOL;
+
+    static string buildPairName(const StateSymbolPair& pair);
+    static string buildStateName(const SComponent& s, const RComponent& r);
+    static const State& getOrCreateState(const SComponent& s, const RComponent& r, map<string, StateData>& states,
+        PDA& rdpda);
+    static const SComponent getSComponentWithPairsIdentity(const set<StateSymbolPair>& pairs);
+    static void divideTransitions(const set<TransitionPDA>& transitions, set<TransitionPDA>& internalTransitions,
+        set<TransitionPDA>& pushTransitions, set<TransitionPDA>& popTransitions);
+    static string buildStackSymbolName(const SComponent& s, const RComponent& r, const Symbol& input, PDA& rdpda);
+    static vector<SComponent> generateAllPossibleSComponents(set<StateSymbolPair>& pairs);
+    static vector<RComponent> generateAllPossibleRComponents(set<StateSymbolPair>& pairs);
+    static StateData* getUnmarkedState(map<string, StateData>& states);
+    static set<StateSymbolPair> combineStatesWithSymbol(const set<State>& states, const Symbol& symbol);
+    static set<StateSymbolPair> buildAllStateSymbolPairs(PDA& rhdpda);
+
+public:
+    static PDA determinize(PDA& automaton);
+};
+
+} /* namespace determinization */
+#endif /* RHDPDADETERMINZER_H_ */
\ No newline at end of file
diff --git a/adeterminize.rhdpda/src/adeterminize.rhdpda.cpp b/adeterminize.rhdpda/src/adeterminize.rhdpda.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9eceab0f6c3f51c957195dca86fbdde47d1716f9
--- /dev/null
+++ b/adeterminize.rhdpda/src/adeterminize.rhdpda.cpp
@@ -0,0 +1,34 @@
+#include <iostream>
+#include <set>
+
+#include "automaton/UnknownAutomaton.h"
+#include "AutomatonFactory.h"
+#include "AlibException.h"
+#include "RHDPDADeterminizer.h"
+
+
+using namespace std;
+using namespace automaton;
+using namespace determinization;
+using namespace alib;
+
+
+int main(int argc, char** argv) {
+    UnknownAutomaton automaton;
+    
+    try {
+        string input(istreambuf_iterator<char>(cin), (istreambuf_iterator<char>()));
+        automaton = AutomatonFactory::fromString(input);
+        
+        Automaton* knownAutomaton = AutomatonFactory::buildAutomaton(automaton);
+        // TODO check that automaton is RHDPDA
+        PDA deterministicPDA = RHDPDADeterminizer::determinize(*((PDA*) knownAutomaton));
+        deterministicPDA.toXML(cout);
+        
+        delete knownAutomaton;
+        
+    } catch (AlibException& e) {
+        cout << e.what() << endl;
+        return 0;
+    }
+}
diff --git a/examples/RHDPDA2.xml b/examples/RHDPDA2.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b6ee03f349e36ed2ceb39723ece9befd8b101d90
--- /dev/null
+++ b/examples/RHDPDA2.xml
@@ -0,0 +1,226 @@
+<automaton>
+  <states>
+    <state>0</state>
+    <state>1</state>
+    <state>2</state>
+    <state>3</state>
+    <state>ERR</state>
+  </states>
+  <inputAlphabet>
+    <symbol>a</symbol>
+    <symbol>b</symbol>
+  </inputAlphabet>
+  <stackAlphabet>
+    <symbol>a</symbol>
+    <symbol>x</symbol>
+    <symbol>_</symbol>
+  </stackAlphabet>
+  <transitions>
+    <transition>
+      <from>0</from>
+      <input>a</input>
+      <to>1</to>
+      <pop>
+        <symbol>_</symbol>
+      </pop>
+      <push>
+        <symbol>x</symbol>
+        <symbol>_</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>0</from>
+      <input>b</input>
+      <to>3</to>
+      <pop>
+        <symbol>_</symbol>
+      </pop>
+      <push>
+        <symbol>_</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>1</from>
+      <input>a</input>
+      <to>1</to>
+      <pop>
+        <symbol>a</symbol>
+      </pop>
+      <push>
+        <symbol>a</symbol>
+        <symbol>a</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>1</from>
+      <input>a</input>
+      <to>1</to>
+      <pop>
+        <symbol>x</symbol>
+      </pop>
+      <push>
+        <symbol>a</symbol>
+        <symbol>x</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>1</from>
+      <input>b</input>
+      <to>2</to>
+      <pop>
+        <symbol>a</symbol>
+      </pop>
+      <push>
+        <symbol>a</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>1</from>
+      <input>b</input>
+      <to>2</to>
+      <pop>
+        <symbol>x</symbol>
+      </pop>
+      <push>
+        <symbol>x</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>2</from>
+      <input>a</input>
+      <to>2</to>
+      <pop>
+        <symbol>a</symbol>
+      </pop>
+      <push></push>
+    </transition>
+    <transition>
+      <from>2</from>
+      <input>a</input>
+      <to>3</to>
+      <pop>
+        <symbol>x</symbol>
+      </pop>
+      <push></push>
+    </transition>
+    <transition>
+      <from>2</from>
+      <input>b</input>
+      <to>ERR</to>
+      <pop>
+        <symbol>a</symbol>
+      </pop>
+      <push>
+        <symbol>a</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>2</from>
+      <input>b</input>
+      <to>ERR</to>
+      <pop>
+        <symbol>x</symbol>
+      </pop>
+      <push>
+        <symbol>x</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>3</from>
+      <input>a</input>
+      <to>ERR</to>
+      <pop>
+        <symbol>_</symbol>
+      </pop>
+      <push>
+        <symbol>_</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>3</from>
+      <input>b</input>
+      <to>ERR</to>
+      <pop>
+        <symbol>_</symbol>
+      </pop>
+      <push>
+        <symbol>_</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>ERR</from>
+      <input>a</input>
+      <to>ERR</to>
+      <pop>
+        <symbol>_</symbol>
+      </pop>
+      <push>
+        <symbol>_</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>ERR</from>
+      <input>a</input>
+      <to>ERR</to>
+      <pop>
+        <symbol>a</symbol>
+      </pop>
+      <push>
+        <symbol>a</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>ERR</from>
+      <input>a</input>
+      <to>ERR</to>
+      <pop>
+        <symbol>x</symbol>
+      </pop>
+      <push>
+        <symbol>x</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>ERR</from>
+      <input>b</input>
+      <to>ERR</to>
+      <pop>
+        <symbol>_</symbol>
+      </pop>
+      <push>
+        <symbol>_</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>ERR</from>
+      <input>b</input>
+      <to>ERR</to>
+      <pop>
+        <symbol>a</symbol>
+      </pop>
+      <push>
+        <symbol>a</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>ERR</from>
+      <input>b</input>
+      <to>ERR</to>
+      <pop>
+        <symbol>x</symbol>
+      </pop>
+      <push>
+        <symbol>x</symbol>
+      </push>
+    </transition>
+  </transitions>
+  <initialStates>
+    <state>0</state>
+  </initialStates>
+  <startSymbols>
+    <symbol>_</symbol>
+  </startSymbols>
+  <finalStates>
+    <state>3</state>
+  </finalStates>
+</automaton>
diff --git a/examples/RHDPDA4.xml b/examples/RHDPDA4.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8ca65104a14e75ce1cfee6e26b00cfbef215873d
--- /dev/null
+++ b/examples/RHDPDA4.xml
@@ -0,0 +1,45 @@
+<automaton>
+  <states>
+    <state>0</state>
+    <state>1</state>
+  </states>
+  <inputAlphabet>
+    <symbol>a</symbol>
+  </inputAlphabet>
+  <stackAlphabet>
+    <symbol>a</symbol>
+    <symbol>_</symbol>
+  </stackAlphabet>
+  <transitions>
+    <transition>
+      <from>0</from>
+      <input>a</input>
+      <to>1</to>
+      <pop>
+        <symbol>_</symbol>
+      </pop>
+      <push>
+        <symbol>a</symbol>
+        <symbol>_</symbol>
+      </push>
+    </transition>
+    <transition>
+      <from>1</from>
+      <input>a</input>
+      <to>0</to>
+      <pop>
+        <symbol>a</symbol>
+      </pop>
+      <push></push>
+    </transition>
+  </transitions>
+  <initialStates>
+    <state>0</state>
+  </initialStates>
+  <startSymbols>
+    <symbol>_</symbol>
+  </startSymbols>
+  <finalStates>
+    <state>0</state>
+  </finalStates>
+</automaton>
diff --git a/makefile b/makefile
index 9b5fb54ceb16ac2680085f094f5de86d6582fc6e..3958ffa67c0195d0ced76f40241dc8a4ec161665 100644
--- a/makefile
+++ b/makefile
@@ -6,7 +6,7 @@ SUBDIRS_LIBS = alib adeterminize
 SUBDIRS_BINS = acat \
                aconvert aconvert.dot aconvert.gastex aconvert.regexp aconvert.automaton aconvert.grammar \
                aminimize \
-               adeterminize.fsm adeterminize.idpda adeterminize.vpa adeterminize.vpa2 adeterminize.vpa3 \
+               adeterminize.fsm adeterminize.idpda adeterminize.vpa adeterminize.vpa2 adeterminize.vpa3 adeterminize.rhdpda \
                adiff adiff.automaton adiff.grammar \
                aepsilon \
                atrim \