diff --git a/acompare2/src/AutomatonCompare.cpp b/acompare2/src/AutomatonCompare.cpp
index 90d24082990d8215df64bd111ff946b262f214ae..f8e49fc265f83bb37f1567d8d21627045efe6141 100644
--- a/acompare2/src/AutomatonCompare.cpp
+++ b/acompare2/src/AutomatonCompare.cpp
@@ -7,1379 +7,28 @@
 
 #include "AutomatonCompare.h"
 
-#include "automaton/Automaton.h"
-
-#include <set>
-#include <map>
-#include <list>
-#include <utility>
-#include <vector>
-#include <typeinfo>
-#include <iostream>
-#include <algorithm>
-
-#include "automaton/FSM/DFA.h"
-#include "automaton/FSM/NFA.h"
-#include "automaton/FSM/MultiInitialStateNFA.h"
-#include "automaton/FSM/EpsilonNFA.h"
-#include "automaton/FSM/ExtendedNFA.h"
-#include "automaton/FSM/CompactNFA.h"
-#include "automaton/TA/DFTA.h"
-#include "automaton/TA/NFTA.h"
-#include "automaton/PDA/NPDA.h"
-#include "automaton/PDA/DPDA.h"
-#include "automaton/PDA/InputDrivenNPDA.h"
-#include "automaton/PDA/InputDrivenDPDA.h"
-#include "automaton/PDA/VisiblyPushdownNPDA.h"
-#include "automaton/PDA/VisiblyPushdownDPDA.h"
-#include "automaton/PDA/RealTimeHeightDeterministicNPDA.h"
-#include "automaton/PDA/RealTimeHeightDeterministicDPDA.h"
-#include "automaton/PDA/SinglePopNPDA.h"
-#include "automaton/PDA/SinglePopDPDA.h"
-#include "automaton/TM/OneTapeDTM.h"
-
-bool AutomatonCompare::testCompare(const automaton::DFA<>& a, const automaton::DFA<>& b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialState()   == b.getInitialState()   &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::MultiInitialStateNFA < >& a, const automaton::MultiInitialStateNFA < >& b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialStates()  == b.getInitialStates()  &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::NFA < > & a, const automaton::NFA < > & b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialState()   == b.getInitialState()   &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::EpsilonNFA < > & a, const automaton::EpsilonNFA < > & b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialState()   == b.getInitialState()   &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::ExtendedNFA < > & a, const automaton::ExtendedNFA < > & b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialState()   == b.getInitialState()   &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::CompactNFA < > & a, const automaton::CompactNFA < > & b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialState()   == b.getInitialState()   &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::DFTA < > & a, const automaton::DFTA < > & b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::NFTA < > & a, const automaton::NFTA < > & b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::DPDA < > & a, const automaton::DPDA < > & b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialState()   == b.getInitialState()   &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()  &&
-			a.getInitialSymbol()  == b.getInitialSymbol()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::NPDA < > & a, const automaton::NPDA < > & b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialState()   == b.getInitialState()   &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()  &&
-			a.getInitialSymbol()  == b.getInitialSymbol()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::InputDrivenDPDA < > & a, const automaton::InputDrivenDPDA < > & b) {
-	return  	a.getFinalStates()             == b.getFinalStates()             &&
-			a.getInitialState()            == b.getInitialState()            &&
-//			a.getInputAlphabet()           == b.getInputAlphabet()           &&
-//			a.getPushdownStoreAlphabet()   == b.getPushdownStoreAlphabet()           &&
-			a.getInitialSymbol()           == b.getInitialSymbol()           &&
-			a.getStates()                  == b.getStates()                  &&
-			a.getPushdownStoreOperations() == b.getPushdownStoreOperations() &&
-			a.getTransitions()             == b.getTransitions()             ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::InputDrivenNPDA < > & a, const automaton::InputDrivenNPDA < > & b) {
-	return  	a.getFinalStates()             == b.getFinalStates()             &&
-			a.getInitialState()            == b.getInitialState()            &&
-//			a.getInputAlphabet()           == b.getInputAlphabet()           &&
-//			a.getPushdownStoreAlphabet()   == b.getPushdownStoreAlphabet()           &&
-			a.getInitialSymbol()           == b.getInitialSymbol()           &&
-			a.getStates()                  == b.getStates()                  &&
-			a.getPushdownStoreOperations() == b.getPushdownStoreOperations() &&
-			a.getTransitions()             == b.getTransitions()             ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::VisiblyPushdownDPDA < > & a, const automaton::VisiblyPushdownDPDA < > & b) {
-	return  	a.getFinalStates()            == b.getFinalStates()            &&
-			a.getInitialState()           == b.getInitialState()           &&
-//			a.getCallInputAlphabet()      == b.getCallInputAlphabet()      &&
-//			a.getReturnnputAlphabet()     == b.getReturnInputAlphabet()    &&
-//			a.getLocalInputAlphabet()     == b.getLocalInputAlphabet()     &&
-//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()          &&
-			a.getBottomOfTheStackSymbol() == b.getBottomOfTheStackSymbol() &&
-			a.getStates()                 == b.getStates()                 &&
-			a.getCallTransitions()        == b.getCallTransitions()        &&
-			a.getReturnTransitions()      == b.getReturnTransitions()      &&
-			a.getLocalTransitions()       == b.getLocalTransitions()       ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::VisiblyPushdownNPDA < > & a, const automaton::VisiblyPushdownNPDA < > & b) {
-	return  	a.getFinalStates()            == b.getFinalStates()            &&
-			a.getInitialStates()          == b.getInitialStates()          &&
-//			a.getCallInputAlphabet()      == b.getCallInputAlphabet()      &&
-//			a.getReturnnputAlphabet()     == b.getReturnInputAlphabet()    &&
-//			a.getLocalInputAlphabet()     == b.getLocalInputAlphabet()     &&
-//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()          &&
-			a.getBottomOfTheStackSymbol() == b.getBottomOfTheStackSymbol() &&
-			a.getStates()                 == b.getStates()                 &&
-			a.getCallTransitions()        == b.getCallTransitions()        &&
-			a.getReturnTransitions()      == b.getReturnTransitions()      &&
-			a.getLocalTransitions()       == b.getLocalTransitions()       ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::RealTimeHeightDeterministicDPDA < > & a, const automaton::RealTimeHeightDeterministicDPDA < > & b) {
-	return  	a.getFinalStates()            == b.getFinalStates()            &&
-			a.getInitialState()           == b.getInitialState()           &&
-//			a.getInputAlphabet()          == b.getInputAlphabet()          &&
-//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()          &&
-			a.getBottomOfTheStackSymbol() == b.getBottomOfTheStackSymbol() &&
-			a.getStates()                 == b.getStates()                 &&
-			a.getCallTransitions()        == b.getCallTransitions()        &&
-			a.getReturnTransitions()      == b.getReturnTransitions()      &&
-			a.getLocalTransitions()       == b.getLocalTransitions()       ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::RealTimeHeightDeterministicNPDA < > & a, const automaton::RealTimeHeightDeterministicNPDA < > & b) {
-	return  	a.getFinalStates()            == b.getFinalStates()            &&
-			a.getInitialStates()          == b.getInitialStates()          &&
-//			a.getInputAlphabet()          == b.getInputAlphabet()          &&
-//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()          &&
-			a.getBottomOfTheStackSymbol() == b.getBottomOfTheStackSymbol() &&
-			a.getStates()                 == b.getStates()                 &&
-			a.getCallTransitions()        == b.getCallTransitions()        &&
-			a.getReturnTransitions()      == b.getReturnTransitions()      &&
-			a.getLocalTransitions()       == b.getLocalTransitions()       ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::SinglePopDPDA < > & a, const automaton::SinglePopDPDA < > & b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialState()   == b.getInitialState()   &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()  &&
-			a.getInitialSymbol()  == b.getInitialSymbol()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::SinglePopNPDA < > & a, const automaton::SinglePopNPDA < > & b) {
-	return  	a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialState()   == b.getInitialState()   &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()  &&
-			a.getInitialSymbol()  == b.getInitialSymbol()  &&
-			a.getStates()         == b.getStates()         &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-bool AutomatonCompare::testCompare(const automaton::OneTapeDTM<>& a, const automaton::OneTapeDTM<>& b) {
-	return  	a.getBlankSymbol()    == b.getBlankSymbol()    &&
-			a.getFinalStates()    == b.getFinalStates()    &&
-			a.getInitialState()   == b.getInitialState()   &&
-//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
-			a.getStates()         == b.getStates()         &&
-//			a.getTapeAlphabet()   == b.getTapeAlphabet()   &&
-			a.getTransitions()    == b.getTransitions()    ;
-}
-
-template <class T> void AutomatonCompare::setCompare(const std::set<T> a, const std::set<T> b) {
-	std::set<T> aMinusB;
-	std::set_difference(a.begin(), a.end(), b.begin(), b.end(), std::inserter(aMinusB, aMinusB.begin()));
-
-	std::set<T> bMinusA;
-	std::set_difference(b.begin(), b.end(), a.begin(), a.end(), std::inserter(bMinusA, bMinusA.begin()));
-
-	for(typename std::set<T>::const_iterator iter = aMinusB.begin(); iter != aMinusB.end(); iter++) {
-		std::cout << "< " << *iter << std::endl;
-	}
-	std::cout << "---" << std::endl;
-	for(typename std::set<T>::const_iterator iter = bMinusA.begin(); iter != bMinusA.end(); iter++) {
-		std::cout << "> " << *iter << std::endl;
-	}
-}
-
-template <class T> void AutomatonCompare::listCompare(const std::list<T> a, const std::list<T> b) {
-	std::list<T> aMinusB;
-	std::set_difference(a.begin(), a.end(), b.begin(), b.end(), std::inserter(aMinusB, aMinusB.begin()));
-
-	std::list<T> bMinusA;
-	std::set_difference(b.begin(), b.end(), a.begin(), a.end(), std::inserter(bMinusA, bMinusA.begin()));
-
-	for(typename std::list<T>::const_iterator iter = aMinusB.begin(); iter != aMinusB.end(); iter++) {
-		std::cout << "< " << *iter << std::endl;
-	}
-	std::cout << "---" << std::endl;
-	for(typename std::list<T>::const_iterator iter = bMinusA.begin(); iter != bMinusA.end(); iter++) {
-		std::cout << "> " << *iter << std::endl;
-	}
-}
-
-template <class T, class R> void AutomatonCompare::mapCompare(const std::map<T, R> a, const std::map<T, R> b) {
-	std::map<T, R> aMinusB;
-	std::set_difference(a.begin(), a.end(), b.begin(), b.end(), std::inserter(aMinusB, aMinusB.begin()));
-
-	std::map<T, R> bMinusA;
-	std::set_difference(b.begin(), b.end(), a.begin(), a.end(), std::inserter(bMinusA, bMinusA.begin()));
-
-	for(typename std::map<T, R>::const_iterator iter = aMinusB.begin(); iter != aMinusB.end(); iter++) {
-		std::cout << "< " << iter->first << ", " << iter->second << std::endl;
-	}
-	std::cout << "---" << std::endl;
-	for(typename std::map<T, R>::const_iterator iter = bMinusA.begin(); iter != bMinusA.end(); iter++) {
-		std::cout << "> " << iter->first << ", " << iter->second << std::endl;
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::DFA<>& a, const automaton::DFA<>& b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::MultiInitialStateNFA < >& a, const automaton::MultiInitialStateNFA < >& b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialStates() != b.getInitialStates()) {
-		std::cout << "InitialStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInitialStates(), b.getInitialStates());
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::NFA < > & a, const automaton::NFA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::EpsilonNFA < > & a, const automaton::EpsilonNFA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::ExtendedNFA < > & a, const automaton::ExtendedNFA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::CompactNFA < > & a, const automaton::CompactNFA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::DFTA < > & a, const automaton::DFTA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::NFTA < > & a, const automaton::NFTA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::DPDA < > & a, const automaton::DPDA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
-		std::cout << "StackAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
-	}
-
-	if(a.getInitialSymbol() != b.getInitialSymbol()) {
-		std::cout << "InitialSymbol" << std::endl;
-
-		std::cout << "< " << a.getInitialSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialSymbol() << std::endl;
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::NPDA < > & a, const automaton::NPDA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
-		std::cout << "StackAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
-	}
-
-	if(a.getInitialSymbol() != b.getInitialSymbol()) {
-		std::cout << "InitialSymbol" << std::endl;
-
-		std::cout << "< " << a.getInitialSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialSymbol() << std::endl;
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::InputDrivenDPDA < > & a, const automaton::InputDrivenDPDA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
-		std::cout << "StackAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
-	}
-
-	if(a.getInitialSymbol() != b.getInitialSymbol()) {
-		std::cout << "InitialSymbol" << std::endl;
-
-		std::cout << "< " << a.getInitialSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialSymbol() << std::endl;
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getPushdownStoreOperations() != b.getPushdownStoreOperations()) {
-		std::cout << "PushdownStoreOperations" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getPushdownStoreOperations(), b.getPushdownStoreOperations());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::InputDrivenNPDA < > & a, const automaton::InputDrivenNPDA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
-		std::cout << "StackAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
-	}
-
-	if(a.getInitialSymbol() != b.getInitialSymbol()) {
-		std::cout << "InitialSymbol" << std::endl;
-
-		std::cout << "< " << a.getInitialSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialSymbol() << std::endl;
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getPushdownStoreOperations() != b.getPushdownStoreOperations()) {
-		std::cout << "PushdownStoreOperations" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getPushdownStoreOperations(), b.getPushdownStoreOperations());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::VisiblyPushdownDPDA < > & a, const automaton::VisiblyPushdownDPDA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getCallInputAlphabet() != b.getCallInputAlphabet()) {
-		std::cout << "CallInputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getCallInputAlphabet(), b.getCallInputAlphabet());
-	}
-
-	if(a.getReturnInputAlphabet() != b.getReturnInputAlphabet()) {
-		std::cout << "ReturnInputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getReturnInputAlphabet(), b.getReturnInputAlphabet());
-	}
-
-	if(a.getLocalInputAlphabet() != b.getLocalInputAlphabet()) {
-		std::cout << "LocalInputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getLocalInputAlphabet(), b.getLocalInputAlphabet());
-	}
-
-	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
-		std::cout << "StackAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
-	}
-
-	if(a.getBottomOfTheStackSymbol() != b.getBottomOfTheStackSymbol()) {
-		std::cout << "BottomOfTheStackSymbol" << std::endl;
-
-		std::cout << "< " << a.getBottomOfTheStackSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getBottomOfTheStackSymbol() << std::endl;
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getCallTransitions() != b.getCallTransitions()) {
-		std::cout << "CallTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getCallTransitions(), b.getCallTransitions());
-	}
-
-	if(a.getReturnTransitions() != b.getReturnTransitions()) {
-		std::cout << "ReturnTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getReturnTransitions(), b.getReturnTransitions());
-	}
-
-	if(a.getLocalTransitions() != b.getLocalTransitions()) {
-		std::cout << "LocalTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getLocalTransitions(), b.getLocalTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::VisiblyPushdownNPDA < > & a, const automaton::VisiblyPushdownNPDA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialStates() != b.getInitialStates()) {
-		std::cout << "Initial states" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInitialStates(), b.getInitialStates());
-	}
-
-	if(a.getCallInputAlphabet() != b.getCallInputAlphabet()) {
-		std::cout << "CallInputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getCallInputAlphabet(), b.getCallInputAlphabet());
-	}
-
-	if(a.getReturnInputAlphabet() != b.getReturnInputAlphabet()) {
-		std::cout << "ReturnInputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getReturnInputAlphabet(), b.getReturnInputAlphabet());
-	}
-
-	if(a.getLocalInputAlphabet() != b.getLocalInputAlphabet()) {
-		std::cout << "LocalInputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getLocalInputAlphabet(), b.getLocalInputAlphabet());
-	}
-
-	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
-		std::cout << "StackAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
-	}
-
-	if(a.getBottomOfTheStackSymbol() != b.getBottomOfTheStackSymbol()) {
-		std::cout << "BottomOfTheStackSymbol" << std::endl;
-
-		std::cout << "< " << a.getBottomOfTheStackSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getBottomOfTheStackSymbol() << std::endl;
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getCallTransitions() != b.getCallTransitions()) {
-		std::cout << "CallTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getCallTransitions(), b.getCallTransitions());
-	}
-
-	if(a.getReturnTransitions() != b.getReturnTransitions()) {
-		std::cout << "ReturnTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getReturnTransitions(), b.getReturnTransitions());
-	}
-
-	if(a.getLocalTransitions() != b.getLocalTransitions()) {
-		std::cout << "LocalTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getLocalTransitions(), b.getLocalTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::RealTimeHeightDeterministicDPDA < > & a, const automaton::RealTimeHeightDeterministicDPDA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
-		std::cout << "StackAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
-	}
-
-	if(a.getBottomOfTheStackSymbol() != b.getBottomOfTheStackSymbol()) {
-		std::cout << "BottomOfTheStackSymbol" << std::endl;
-
-		std::cout << "< " << a.getBottomOfTheStackSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getBottomOfTheStackSymbol() << std::endl;
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getCallTransitions() != b.getCallTransitions()) {
-		std::cout << "CallTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getCallTransitions(), b.getCallTransitions());
-	}
-
-	if(a.getReturnTransitions() != b.getReturnTransitions()) {
-		std::cout << "ReturnTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getReturnTransitions(), b.getReturnTransitions());
-	}
-
-	if(a.getLocalTransitions() != b.getLocalTransitions()) {
-		std::cout << "LocalTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getLocalTransitions(), b.getLocalTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::RealTimeHeightDeterministicNPDA < > & a, const automaton::RealTimeHeightDeterministicNPDA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialStates() != b.getInitialStates()) {
-		std::cout << "Initial states" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInitialStates(), b.getInitialStates());
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
-		std::cout << "StackAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
-	}
-
-	if(a.getBottomOfTheStackSymbol() != b.getBottomOfTheStackSymbol()) {
-		std::cout << "BottomOfTheStackSymbol" << std::endl;
-
-		std::cout << "< " << a.getBottomOfTheStackSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getBottomOfTheStackSymbol() << std::endl;
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getCallTransitions() != b.getCallTransitions()) {
-		std::cout << "CallTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getCallTransitions(), b.getCallTransitions());
-	}
-
-	if(a.getReturnTransitions() != b.getReturnTransitions()) {
-		std::cout << "ReturnTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getReturnTransitions(), b.getReturnTransitions());
-	}
-
-	if(a.getLocalTransitions() != b.getLocalTransitions()) {
-		std::cout << "LocalTransitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getLocalTransitions(), b.getLocalTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::SinglePopDPDA < > & a, const automaton::SinglePopDPDA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
-		std::cout << "StackAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
-	}
-
-	if(a.getInitialSymbol() != b.getInitialSymbol()) {
-		std::cout << "InitialSymbol" << std::endl;
-
-		std::cout << "< " << a.getInitialSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialSymbol() << std::endl;
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::SinglePopNPDA < > & a, const automaton::SinglePopNPDA < > & b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
-		std::cout << "StackAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
-	}
-
-	if(a.getInitialSymbol() != b.getInitialSymbol()) {
-		std::cout << "InitialSymbol" << std::endl;
-
-		std::cout << "< " << a.getInitialSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialSymbol() << std::endl;
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-void AutomatonCompare::printCompare(const automaton::OneTapeDTM<>& a, const automaton::OneTapeDTM<>& b) {
-	std::cout << "AutomatonCompareer" << std::endl;
-
-	if(a.getBlankSymbol() != b.getBlankSymbol()) {
-		std::cout << "Blank symbol" << std::endl;
-
-		std::cout << "< " << a.getBlankSymbol() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getBlankSymbol() << std::endl;
-	}
-
-	if(a.getFinalStates() != b.getFinalStates()){
-		std::cout << "FinalStates" << std::endl;
-
-		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
-	}
-
-	if(a.getInitialState() != b.getInitialState()) {
-		std::cout << "Initial state" << std::endl;
-
-		std::cout << "< " << a.getInitialState() << std::endl;
-		std::cout << "---" << std::endl;
-		std::cout << "> " << b.getInitialState() << std::endl;
-	}
-
-	if(a.getInputAlphabet() != b.getInputAlphabet()) {
-		std::cout << "InputAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
-	}
-
-	if(a.getStates() != b.getStates()) {
-		std::cout << "States" << std::endl;
-
-		AutomatonCompare::setCompare(a.getStates(), b.getStates());
-	}
-
-	if(a.getTapeAlphabet() != b.getTapeAlphabet()) {
-		std::cout << "TapeAlphabet" << std::endl;
-
-		AutomatonCompare::setCompare(a.getTapeAlphabet(), b.getTapeAlphabet());
-	}
-
-	if(a.getTransitions() != b.getTransitions()) {
-		std::cout << "Transitions" << std::endl;
-
-		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
-	}
-}
-
-int AutomatonCompare::compare(const automaton::DFA<>& a, const automaton::DFA<>& b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
-auto AutomatonCompareDFA = AutomatonCompare::RegistratorWrapper<int, automaton::DFA<>, automaton::DFA<>>(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::NFA < > & a, const automaton::NFA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
+auto AutomatonCompareDFA = AutomatonCompare::RegistratorWrapper<int, automaton::DFA < >, automaton::DFA < > >(AutomatonCompare::compare);
 auto AutomatonCompareNFA = AutomatonCompare::RegistratorWrapper<int, automaton::NFA < > , automaton::NFA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::MultiInitialStateNFA < >& a, const automaton::MultiInitialStateNFA < >& b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
-auto AutomatonCompareMultiInitialStateNFA = AutomatonCompare::RegistratorWrapper<int, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < >>(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::EpsilonNFA < > & a, const automaton::EpsilonNFA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
+auto AutomatonCompareMultiInitialStateNFA = AutomatonCompare::RegistratorWrapper<int, automaton::MultiInitialStateNFA < >, automaton::MultiInitialStateNFA < > >(AutomatonCompare::compare);
 auto AutomatonCompareEpsilonNFA = AutomatonCompare::RegistratorWrapper<int, automaton::EpsilonNFA < >, automaton::EpsilonNFA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::ExtendedNFA < > & a, const automaton::ExtendedNFA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareExtendedNFA = AutomatonCompare::RegistratorWrapper<int, automaton::ExtendedNFA < >, automaton::ExtendedNFA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::CompactNFA < > & a, const automaton::CompactNFA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareCompactNFA = AutomatonCompare::RegistratorWrapper<int, automaton::CompactNFA < >, automaton::CompactNFA < > >(AutomatonCompare::compare);
 
-int AutomatonCompare::compare(const automaton::DFTA < > & a, const automaton::DFTA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareDFTA = AutomatonCompare::RegistratorWrapper<int, automaton::DFTA < >, automaton::DFTA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::NFTA < > & a, const automaton::NFTA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareNFTA = AutomatonCompare::RegistratorWrapper<int, automaton::NFTA < >, automaton::NFTA < > >(AutomatonCompare::compare);
 
-int AutomatonCompare::compare(const automaton::DPDA < > & a, const automaton::DPDA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareDPDA = AutomatonCompare::RegistratorWrapper<int, automaton::DPDA < >, automaton::DPDA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::NPDA < > & a, const automaton::NPDA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareNPDA = AutomatonCompare::RegistratorWrapper<int, automaton::NPDA < >, automaton::NPDA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::InputDrivenDPDA < > & a, const automaton::InputDrivenDPDA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareInputDrivenDPDA = AutomatonCompare::RegistratorWrapper<int, automaton::InputDrivenDPDA < >, automaton::InputDrivenDPDA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::InputDrivenNPDA < > & a, const automaton::InputDrivenNPDA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareInputDrivenNPDA = AutomatonCompare::RegistratorWrapper<int, automaton::InputDrivenNPDA < >, automaton::InputDrivenNPDA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::VisiblyPushdownDPDA < > & a, const automaton::VisiblyPushdownDPDA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareVisiblyPushdownDPDA = AutomatonCompare::RegistratorWrapper<int, automaton::VisiblyPushdownDPDA < >, automaton::VisiblyPushdownDPDA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::VisiblyPushdownNPDA < > & a, const automaton::VisiblyPushdownNPDA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareVisiblyPushdownNPDA = AutomatonCompare::RegistratorWrapper<int, automaton::VisiblyPushdownNPDA < >, automaton::VisiblyPushdownNPDA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::RealTimeHeightDeterministicDPDA < > & a, const automaton::RealTimeHeightDeterministicDPDA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareRealTimeHeightDeterministicDPDA = AutomatonCompare::RegistratorWrapper<int, automaton::RealTimeHeightDeterministicDPDA < >, automaton::RealTimeHeightDeterministicDPDA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::RealTimeHeightDeterministicNPDA < > & a, const automaton::RealTimeHeightDeterministicNPDA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareRealTimeHeightDeterministicNPDA = AutomatonCompare::RegistratorWrapper<int, automaton::RealTimeHeightDeterministicNPDA < >, automaton::RealTimeHeightDeterministicNPDA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::SinglePopDPDA < > & a, const automaton::SinglePopDPDA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareSinglePopDPDA = AutomatonCompare::RegistratorWrapper<int, automaton::SinglePopDPDA < >, automaton::SinglePopDPDA < > >(AutomatonCompare::compare);
-
-int AutomatonCompare::compare(const automaton::SinglePopNPDA < > & a, const automaton::SinglePopNPDA < > & b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
 auto AutomatonCompareSinglePopNPDA = AutomatonCompare::RegistratorWrapper<int, automaton::SinglePopNPDA < >, automaton::SinglePopNPDA < > >(AutomatonCompare::compare);
 
-int AutomatonCompare::compare(const automaton::OneTapeDTM<>& a, const automaton::OneTapeDTM<>& b) {
-	if(!AutomatonCompare::testCompare(a, b)) {
-	  AutomatonCompare::printCompare(a, b);
-	  return 1;
-	} else {
-	  return 0;
-	}
-}
-
-auto AutomatonCompareOneTapeDTM = AutomatonCompare::RegistratorWrapper<int, automaton::OneTapeDTM<>, automaton::OneTapeDTM<>>(AutomatonCompare::compare);
+auto AutomatonCompareOneTapeDTM = AutomatonCompare::RegistratorWrapper<int, automaton::OneTapeDTM < >, automaton::OneTapeDTM < > >(AutomatonCompare::compare);
 
 int AutomatonCompare::compare(const automaton::Automaton& a, const automaton::Automaton& b) {
 	return dispatch(a.getData(), b.getData());
diff --git a/acompare2/src/AutomatonCompare.h b/acompare2/src/AutomatonCompare.h
index d1870b3a26ad7573ca5d0238eca8d1a7d4501dfc..0919e8d6ca5248a9a70b29bbac46aefceef434ba 100644
--- a/acompare2/src/AutomatonCompare.h
+++ b/acompare2/src/AutomatonCompare.h
@@ -9,7 +9,6 @@
 #define AUTOMATON_COMPARE_H_
 
 #include <core/multipleDispatch.hpp>
-#include <ostream>
 
 #include <automaton/Automaton.h>
 #include <automaton/AutomatonFeatures.h>
@@ -17,94 +16,1537 @@
 #include <list>
 #include <map>
 #include <utility>
+#include <vector>
+#include <iostream>
+#include <ostream>
+#include <algorithm>
+
+#include "automaton/FSM/DFA.h"
+#include "automaton/FSM/NFA.h"
+#include "automaton/FSM/MultiInitialStateNFA.h"
+#include "automaton/FSM/EpsilonNFA.h"
+#include "automaton/FSM/ExtendedNFA.h"
+#include "automaton/FSM/CompactNFA.h"
+#include "automaton/TA/DFTA.h"
+#include "automaton/TA/NFTA.h"
+#include "automaton/PDA/NPDA.h"
+#include "automaton/PDA/DPDA.h"
+#include "automaton/PDA/InputDrivenNPDA.h"
+#include "automaton/PDA/InputDrivenDPDA.h"
+#include "automaton/PDA/VisiblyPushdownNPDA.h"
+#include "automaton/PDA/VisiblyPushdownDPDA.h"
+#include "automaton/PDA/RealTimeHeightDeterministicNPDA.h"
+#include "automaton/PDA/RealTimeHeightDeterministicDPDA.h"
+#include "automaton/PDA/SinglePopNPDA.h"
+#include "automaton/PDA/SinglePopDPDA.h"
+#include "automaton/TM/OneTapeDTM.h"
 
 class AutomatonCompare : public std::DoubleDispatch<AutomatonCompare, int, const automaton::AutomatonBase &, const automaton::AutomatonBase &> {
 private:
-	static bool testCompare(const automaton::DFA<>& a, const automaton::DFA<>& b);
-	static void printCompare(const automaton::DFA<>& a, const automaton::DFA<>& b);
+	template<class SymbolType, class StateType>
+	static bool testCompare(const automaton::DFA < SymbolType, StateType > & a, const automaton::DFA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static void printCompare(const automaton::DFA < SymbolType, StateType > & a, const automaton::DFA < SymbolType, StateType > & b);
 
-	static bool testCompare(const automaton::NFA < > & a, const automaton::NFA < > & b);
-	static void printCompare(const automaton::NFA < > & a, const automaton::NFA < > & b);
+	template<class SymbolType, class StateType>
+	static bool testCompare(const automaton::NFA < SymbolType, StateType > & a, const automaton::NFA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static void printCompare(const automaton::NFA < SymbolType, StateType > & a, const automaton::NFA < SymbolType, StateType > & b);
 
-	static bool testCompare(const automaton::MultiInitialStateNFA < >& a, const automaton::MultiInitialStateNFA < >& b);
-	static void printCompare(const automaton::MultiInitialStateNFA < >& a, const automaton::MultiInitialStateNFA < >& b);
+	template<class SymbolType, class StateType>
+	static bool testCompare(const automaton::MultiInitialStateNFA < SymbolType, StateType > & a, const automaton::MultiInitialStateNFA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static void printCompare(const automaton::MultiInitialStateNFA < SymbolType, StateType > & a, const automaton::MultiInitialStateNFA < SymbolType, StateType > & b);
 
-	static bool testCompare(const automaton::EpsilonNFA < > & a, const automaton::EpsilonNFA < > & b);
-	static void printCompare(const automaton::EpsilonNFA < > & a, const automaton::EpsilonNFA < > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static bool testCompare(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & a, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static void printCompare(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & a, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & b);
 
-	static bool testCompare(const automaton::ExtendedNFA < > & a, const automaton::ExtendedNFA < > & b);
-	static void printCompare(const automaton::ExtendedNFA < > & a, const automaton::ExtendedNFA < > & b);
+	template<class SymbolType, class StateType>
+	static bool testCompare(const automaton::ExtendedNFA < SymbolType, StateType > & a, const automaton::ExtendedNFA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static void printCompare(const automaton::ExtendedNFA < SymbolType, StateType > & a, const automaton::ExtendedNFA < SymbolType, StateType > & b);
 
-	static bool testCompare(const automaton::CompactNFA < > & a, const automaton::CompactNFA < > & b);
-	static void printCompare(const automaton::CompactNFA < > & a, const automaton::CompactNFA < > & b);
+	template<class SymbolType, class StateType>
+	static bool testCompare(const automaton::CompactNFA < SymbolType, StateType > & a, const automaton::CompactNFA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static void printCompare(const automaton::CompactNFA < SymbolType, StateType > & a, const automaton::CompactNFA < SymbolType, StateType > & b);
 
-	static bool testCompare(const automaton::DPDA < > & a, const automaton::DPDA < > & b);
-	static void printCompare(const automaton::DPDA < > & a, const automaton::DPDA < > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static bool testCompare(const automaton::DPDA < SymbolType, EpsilonType, StateType > & a, const automaton::DPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static void printCompare(const automaton::DPDA < SymbolType, EpsilonType, StateType > & a, const automaton::DPDA < SymbolType, EpsilonType, StateType > & b);
 
-	static bool testCompare(const automaton::NPDA < > & a, const automaton::NPDA < > & b);
-	static void printCompare(const automaton::NPDA < > & a, const automaton::NPDA < > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static bool testCompare(const automaton::NPDA < SymbolType, EpsilonType, StateType > & a, const automaton::NPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static void printCompare(const automaton::NPDA < SymbolType, EpsilonType, StateType > & a, const automaton::NPDA < SymbolType, EpsilonType, StateType > & b);
 
-	static bool testCompare(const automaton::DFTA < > & a, const automaton::DFTA < > & b);
-	static void printCompare(const automaton::DFTA < > & a, const automaton::DFTA < > & b);
+	template<class SymbolType, class RankType, class StateType>
+	static bool testCompare(const automaton::DFTA < SymbolType, RankType, StateType > & a, const automaton::DFTA < SymbolType, RankType, StateType > & b);
+	template<class SymbolType, class RankType, class StateType>
+	static void printCompare(const automaton::DFTA < SymbolType, RankType, StateType > & a, const automaton::DFTA < SymbolType, RankType, StateType > & b);
 
-	static bool testCompare(const automaton::NFTA < > & a, const automaton::NFTA < > & b);
-	static void printCompare(const automaton::NFTA < > & a, const automaton::NFTA < > & b);
+	template<class SymbolType, class RankType, class StateType>
+	static bool testCompare(const automaton::NFTA < SymbolType, RankType, StateType > & a, const automaton::NFTA < SymbolType, RankType, StateType > & b);
+	template<class SymbolType, class RankType, class StateType>
+	static void printCompare(const automaton::NFTA < SymbolType, RankType, StateType > & a, const automaton::NFTA < SymbolType, RankType, StateType > & b);
 
-	static bool testCompare(const automaton::InputDrivenDPDA < > & a, const automaton::InputDrivenDPDA < > & b);
-	static void printCompare(const automaton::InputDrivenDPDA < > & a, const automaton::InputDrivenDPDA < > & b);
+	template<class SymbolType, class StateType>
+	static bool testCompare(const automaton::InputDrivenDPDA < SymbolType, StateType > & a, const automaton::InputDrivenDPDA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static void printCompare(const automaton::InputDrivenDPDA < SymbolType, StateType > & a, const automaton::InputDrivenDPDA < SymbolType, StateType > & b);
 
-	static bool testCompare(const automaton::InputDrivenNPDA < > & a, const automaton::InputDrivenNPDA < > & b);
-	static void printCompare(const automaton::InputDrivenNPDA < > & a, const automaton::InputDrivenNPDA < > & b);
+	template<class SymbolType, class StateType>
+	static bool testCompare(const automaton::InputDrivenNPDA < SymbolType, StateType > & a, const automaton::InputDrivenNPDA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static void printCompare(const automaton::InputDrivenNPDA < SymbolType, StateType > & a, const automaton::InputDrivenNPDA < SymbolType, StateType > & b);
 
-	static bool testCompare(const automaton::VisiblyPushdownDPDA < > & a, const automaton::VisiblyPushdownDPDA < > & b);
-	static void printCompare(const automaton::VisiblyPushdownDPDA < > & a, const automaton::VisiblyPushdownDPDA < > & b);
+	template<class SymbolType, class StateType>
+	static bool testCompare(const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static void printCompare(const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & b);
 
-	static bool testCompare(const automaton::VisiblyPushdownNPDA < > & a, const automaton::VisiblyPushdownNPDA < > & b);
-	static void printCompare(const automaton::VisiblyPushdownNPDA < > & a, const automaton::VisiblyPushdownNPDA < > & b);
+	template<class SymbolType, class StateType>
+	static bool testCompare(const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static void printCompare(const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & b);
 
-	static bool testCompare(const automaton::RealTimeHeightDeterministicDPDA < > & a, const automaton::RealTimeHeightDeterministicDPDA < > & b);
-	static void printCompare(const automaton::RealTimeHeightDeterministicDPDA < > & a, const automaton::RealTimeHeightDeterministicDPDA < > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static bool testCompare(const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static void printCompare(const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & b);
 
-	static bool testCompare(const automaton::RealTimeHeightDeterministicNPDA < > & a, const automaton::RealTimeHeightDeterministicNPDA < > & b);
-	static void printCompare(const automaton::RealTimeHeightDeterministicNPDA < > & a, const automaton::RealTimeHeightDeterministicNPDA < > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static bool testCompare(const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static void printCompare(const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & b);
 
-	static bool testCompare(const automaton::SinglePopDPDA < > & a, const automaton::SinglePopDPDA < > & b);
-	static void printCompare(const automaton::SinglePopDPDA < > & a, const automaton::SinglePopDPDA < > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static bool testCompare(const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static void printCompare(const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & b);
 
-	static bool testCompare(const automaton::SinglePopNPDA < > & a, const automaton::SinglePopNPDA < > & b);
-	static void printCompare(const automaton::SinglePopNPDA < > & a, const automaton::SinglePopNPDA < > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static bool testCompare(const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static void printCompare(const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & b);
 
-	static bool testCompare(const automaton::OneTapeDTM<>& a, const automaton::OneTapeDTM<>& b);
-	static void printCompare(const automaton::OneTapeDTM<>& a, const automaton::OneTapeDTM<>& b);
+	template<class SymbolType, class StateType>
+	static bool testCompare(const automaton::OneTapeDTM < SymbolType, StateType > & a, const automaton::OneTapeDTM < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static void printCompare(const automaton::OneTapeDTM < SymbolType, StateType > & a, const automaton::OneTapeDTM < SymbolType, StateType > & b);
 
 	template <class T> static void setCompare(const std::set<T> a, const std::set<T> b);
 	template <class T> static void listCompare(const std::list<T> a, const std::list<T> b);
 	template <class T, class R> static void mapCompare(const std::map<T, R> a, const std::map<T, R> b);
 public:
-	static int compare(const automaton::DFA<>& a, const automaton::DFA<>& b);
-	static int compare(const automaton::NFA < > & a, const automaton::NFA < > & b);
-	static int compare(const automaton::MultiInitialStateNFA < >& a, const automaton::MultiInitialStateNFA < >& b);
-	static int compare(const automaton::EpsilonNFA < > & a, const automaton::EpsilonNFA < > & b);
-	static int compare(const automaton::ExtendedNFA < > & a, const automaton::ExtendedNFA < > & b);
-	static int compare(const automaton::CompactNFA < > & a, const automaton::CompactNFA < > & b);
-
-	static int compare(const automaton::DFTA < > & a, const automaton::DFTA < > & b);
-	static int compare(const automaton::NFTA < > & a, const automaton::NFTA < > & b);
-
-	static int compare(const automaton::DPDA < > & a, const automaton::DPDA < > & b);
-	static int compare(const automaton::NPDA < > & a, const automaton::NPDA < > & b);
-	static int compare(const automaton::InputDrivenDPDA < > & a, const automaton::InputDrivenDPDA < > & b);
-	static int compare(const automaton::InputDrivenNPDA < > & a, const automaton::InputDrivenNPDA < > & b);
-	static int compare(const automaton::RealTimeHeightDeterministicDPDA < > & a, const automaton::RealTimeHeightDeterministicDPDA < > & b);
-	static int compare(const automaton::RealTimeHeightDeterministicNPDA < > & a, const automaton::RealTimeHeightDeterministicNPDA < > & b);
-	static int compare(const automaton::SinglePopDPDA < > & a, const automaton::SinglePopDPDA < > & b);
-	static int compare(const automaton::SinglePopNPDA < > & a, const automaton::SinglePopNPDA < > & b);
-	static int compare(const automaton::VisiblyPushdownDPDA < > & a, const automaton::VisiblyPushdownDPDA < > & b);
-	static int compare(const automaton::VisiblyPushdownNPDA < > & a, const automaton::VisiblyPushdownNPDA < > & b);
-
-	static int compare(const automaton::OneTapeDTM<>& a, const automaton::OneTapeDTM<>& b);
+	template<class SymbolType, class StateType>
+	static int compare(const automaton::DFA < SymbolType, StateType > & a, const automaton::DFA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static int compare(const automaton::NFA < SymbolType, StateType > & a, const automaton::NFA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static int compare(const automaton::MultiInitialStateNFA < SymbolType, StateType > & a, const automaton::MultiInitialStateNFA < SymbolType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static int compare(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & a, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static int compare(const automaton::ExtendedNFA < SymbolType, StateType > & a, const automaton::ExtendedNFA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static int compare(const automaton::CompactNFA < SymbolType, StateType > & a, const automaton::CompactNFA < SymbolType, StateType > & b);
+
+	template<class SymbolType, class RankType, class StateType>
+	static int compare(const automaton::DFTA < SymbolType, RankType, StateType > & a, const automaton::DFTA < SymbolType, RankType, StateType > & b);
+	template<class SymbolType, class RankType, class StateType>
+	static int compare(const automaton::NFTA < SymbolType, RankType, StateType > & a, const automaton::NFTA < SymbolType, RankType, StateType > & b);
+
+	template<class SymbolType, class EpsilonType, class StateType>
+	static int compare(const automaton::DPDA < SymbolType, EpsilonType, StateType > & a, const automaton::DPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static int compare(const automaton::NPDA < SymbolType, EpsilonType, StateType > & a, const automaton::NPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static int compare(const automaton::InputDrivenDPDA < SymbolType, StateType > & a, const automaton::InputDrivenDPDA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static int compare(const automaton::InputDrivenNPDA < SymbolType, StateType > & a, const automaton::InputDrivenNPDA < SymbolType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static int compare(const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static int compare(const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static int compare(const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class EpsilonType, class StateType>
+	static int compare(const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static int compare(const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & b);
+	template<class SymbolType, class StateType>
+	static int compare(const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & b);
+
+	template<class SymbolType, class StateType>
+	static int compare(const automaton::OneTapeDTM < SymbolType, StateType > & a, const automaton::OneTapeDTM < SymbolType, StateType > & b);
 
 	static int compare(const automaton::Automaton& a, const automaton::Automaton& b);
 };
 
+template<class SymbolType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::DFA < SymbolType, StateType > & a, const automaton::DFA < SymbolType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::MultiInitialStateNFA < SymbolType, StateType > & a, const automaton::MultiInitialStateNFA < SymbolType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialStates()  == b.getInitialStates()  &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::NFA < SymbolType, StateType > & a, const automaton::NFA < SymbolType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & a, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::ExtendedNFA < SymbolType, StateType > & a, const automaton::ExtendedNFA < SymbolType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::CompactNFA < SymbolType, StateType > & a, const automaton::CompactNFA < SymbolType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class RankType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::DFTA < SymbolType, RankType, StateType > & a, const automaton::DFTA < SymbolType, RankType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class RankType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::NFTA < SymbolType, RankType, StateType > & a, const automaton::NFTA < SymbolType, RankType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::DPDA < SymbolType, EpsilonType, StateType > & a, const automaton::DPDA < SymbolType, EpsilonType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()  &&
+			a.getInitialSymbol()  == b.getInitialSymbol()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::NPDA < SymbolType, EpsilonType, StateType > & a, const automaton::NPDA < SymbolType, EpsilonType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()  &&
+			a.getInitialSymbol()  == b.getInitialSymbol()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::InputDrivenDPDA < SymbolType, StateType > & a, const automaton::InputDrivenDPDA < SymbolType, StateType > & b) {
+	return  	a.getFinalStates()             == b.getFinalStates()             &&
+			a.getInitialState()            == b.getInitialState()            &&
+//			a.getInputAlphabet()           == b.getInputAlphabet()           &&
+//			a.getPushdownStoreAlphabet()   == b.getPushdownStoreAlphabet()           &&
+			a.getInitialSymbol()           == b.getInitialSymbol()           &&
+			a.getStates()                  == b.getStates()                  &&
+			a.getPushdownStoreOperations() == b.getPushdownStoreOperations() &&
+			a.getTransitions()             == b.getTransitions()             ;
+}
+
+template<class SymbolType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::InputDrivenNPDA < SymbolType, StateType > & a, const automaton::InputDrivenNPDA < SymbolType, StateType > & b) {
+	return  	a.getFinalStates()             == b.getFinalStates()             &&
+			a.getInitialState()            == b.getInitialState()            &&
+//			a.getInputAlphabet()           == b.getInputAlphabet()           &&
+//			a.getPushdownStoreAlphabet()   == b.getPushdownStoreAlphabet()           &&
+			a.getInitialSymbol()           == b.getInitialSymbol()           &&
+			a.getStates()                  == b.getStates()                  &&
+			a.getPushdownStoreOperations() == b.getPushdownStoreOperations() &&
+			a.getTransitions()             == b.getTransitions()             ;
+}
+
+template<class SymbolType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & b) {
+	return  	a.getFinalStates()            == b.getFinalStates()            &&
+			a.getInitialState()           == b.getInitialState()           &&
+//			a.getCallInputAlphabet()      == b.getCallInputAlphabet()      &&
+//			a.getReturnnputAlphabet()     == b.getReturnInputAlphabet()    &&
+//			a.getLocalInputAlphabet()     == b.getLocalInputAlphabet()     &&
+//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()          &&
+			a.getBottomOfTheStackSymbol() == b.getBottomOfTheStackSymbol() &&
+			a.getStates()                 == b.getStates()                 &&
+			a.getCallTransitions()        == b.getCallTransitions()        &&
+			a.getReturnTransitions()      == b.getReturnTransitions()      &&
+			a.getLocalTransitions()       == b.getLocalTransitions()       ;
+}
+
+template<class SymbolType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & b) {
+	return  	a.getFinalStates()            == b.getFinalStates()            &&
+			a.getInitialStates()          == b.getInitialStates()          &&
+//			a.getCallInputAlphabet()      == b.getCallInputAlphabet()      &&
+//			a.getReturnnputAlphabet()     == b.getReturnInputAlphabet()    &&
+//			a.getLocalInputAlphabet()     == b.getLocalInputAlphabet()     &&
+//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()          &&
+			a.getBottomOfTheStackSymbol() == b.getBottomOfTheStackSymbol() &&
+			a.getStates()                 == b.getStates()                 &&
+			a.getCallTransitions()        == b.getCallTransitions()        &&
+			a.getReturnTransitions()      == b.getReturnTransitions()      &&
+			a.getLocalTransitions()       == b.getLocalTransitions()       ;
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & b) {
+	return  	a.getFinalStates()            == b.getFinalStates()            &&
+			a.getInitialState()           == b.getInitialState()           &&
+//			a.getInputAlphabet()          == b.getInputAlphabet()          &&
+//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()          &&
+			a.getBottomOfTheStackSymbol() == b.getBottomOfTheStackSymbol() &&
+			a.getStates()                 == b.getStates()                 &&
+			a.getCallTransitions()        == b.getCallTransitions()        &&
+			a.getReturnTransitions()      == b.getReturnTransitions()      &&
+			a.getLocalTransitions()       == b.getLocalTransitions()       ;
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & b) {
+	return  	a.getFinalStates()            == b.getFinalStates()            &&
+			a.getInitialStates()          == b.getInitialStates()          &&
+//			a.getInputAlphabet()          == b.getInputAlphabet()          &&
+//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()          &&
+			a.getBottomOfTheStackSymbol() == b.getBottomOfTheStackSymbol() &&
+			a.getStates()                 == b.getStates()                 &&
+			a.getCallTransitions()        == b.getCallTransitions()        &&
+			a.getReturnTransitions()      == b.getReturnTransitions()      &&
+			a.getLocalTransitions()       == b.getLocalTransitions()       ;
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()  &&
+			a.getInitialSymbol()  == b.getInitialSymbol()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & b) {
+	return  	a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+//			a.getPushdownStoreAlphabet()  == b.getPushdownStoreAlphabet()  &&
+			a.getInitialSymbol()  == b.getInitialSymbol()  &&
+			a.getStates()         == b.getStates()         &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template<class SymbolType, class StateType>
+bool AutomatonCompare::testCompare(const automaton::OneTapeDTM < SymbolType, StateType > & a, const automaton::OneTapeDTM < SymbolType, StateType > & b) {
+	return  	a.getBlankSymbol()    == b.getBlankSymbol()    &&
+			a.getFinalStates()    == b.getFinalStates()    &&
+			a.getInitialState()   == b.getInitialState()   &&
+//			a.getInputAlphabet()  == b.getInputAlphabet()  &&
+			a.getStates()         == b.getStates()         &&
+//			a.getTapeAlphabet()   == b.getTapeAlphabet()   &&
+			a.getTransitions()    == b.getTransitions()    ;
+}
+
+template <class T> void AutomatonCompare::setCompare(const std::set<T> a, const std::set<T> b) {
+	std::set<T> aMinusB;
+	std::set_difference(a.begin(), a.end(), b.begin(), b.end(), std::inserter(aMinusB, aMinusB.begin()));
+
+	std::set<T> bMinusA;
+	std::set_difference(b.begin(), b.end(), a.begin(), a.end(), std::inserter(bMinusA, bMinusA.begin()));
+
+	for(typename std::set<T>::const_iterator iter = aMinusB.begin(); iter != aMinusB.end(); iter++) {
+		std::cout << "< " << *iter << std::endl;
+	}
+	std::cout << "---" << std::endl;
+	for(typename std::set<T>::const_iterator iter = bMinusA.begin(); iter != bMinusA.end(); iter++) {
+		std::cout << "> " << *iter << std::endl;
+	}
+}
+
+template <class T> void AutomatonCompare::listCompare(const std::list<T> a, const std::list<T> b) {
+	std::list<T> aMinusB;
+	std::set_difference(a.begin(), a.end(), b.begin(), b.end(), std::inserter(aMinusB, aMinusB.begin()));
+
+	std::list<T> bMinusA;
+	std::set_difference(b.begin(), b.end(), a.begin(), a.end(), std::inserter(bMinusA, bMinusA.begin()));
+
+	for(typename std::list<T>::const_iterator iter = aMinusB.begin(); iter != aMinusB.end(); iter++) {
+		std::cout << "< " << *iter << std::endl;
+	}
+	std::cout << "---" << std::endl;
+	for(typename std::list<T>::const_iterator iter = bMinusA.begin(); iter != bMinusA.end(); iter++) {
+		std::cout << "> " << *iter << std::endl;
+	}
+}
+
+template <class T, class R> void AutomatonCompare::mapCompare(const std::map<T, R> a, const std::map<T, R> b) {
+	std::map<T, R> aMinusB;
+	std::set_difference(a.begin(), a.end(), b.begin(), b.end(), std::inserter(aMinusB, aMinusB.begin()));
+
+	std::map<T, R> bMinusA;
+	std::set_difference(b.begin(), b.end(), a.begin(), a.end(), std::inserter(bMinusA, bMinusA.begin()));
+
+	for(typename std::map<T, R>::const_iterator iter = aMinusB.begin(); iter != aMinusB.end(); iter++) {
+		std::cout << "< " << iter->first << ", " << iter->second << std::endl;
+	}
+	std::cout << "---" << std::endl;
+	for(typename std::map<T, R>::const_iterator iter = bMinusA.begin(); iter != bMinusA.end(); iter++) {
+		std::cout << "> " << iter->first << ", " << iter->second << std::endl;
+	}
+}
+
+template<class SymbolType, class StateType>
+void AutomatonCompare::printCompare(const automaton::DFA < SymbolType, StateType > & a, const automaton::DFA < SymbolType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class StateType>
+void AutomatonCompare::printCompare(const automaton::MultiInitialStateNFA < SymbolType, StateType > & a, const automaton::MultiInitialStateNFA < SymbolType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialStates() != b.getInitialStates()) {
+		std::cout << "InitialStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInitialStates(), b.getInitialStates());
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class StateType>
+void AutomatonCompare::printCompare(const automaton::NFA < SymbolType, StateType > & a, const automaton::NFA < SymbolType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+void AutomatonCompare::printCompare(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & a, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class StateType>
+void AutomatonCompare::printCompare(const automaton::ExtendedNFA < SymbolType, StateType > & a, const automaton::ExtendedNFA < SymbolType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class StateType>
+void AutomatonCompare::printCompare(const automaton::CompactNFA < SymbolType, StateType > & a, const automaton::CompactNFA < SymbolType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class RankType, class StateType>
+void AutomatonCompare::printCompare(const automaton::DFTA < SymbolType, RankType, StateType > & a, const automaton::DFTA < SymbolType, RankType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class RankType, class StateType>
+void AutomatonCompare::printCompare(const automaton::NFTA < SymbolType, RankType, StateType > & a, const automaton::NFTA < SymbolType, RankType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+void AutomatonCompare::printCompare(const automaton::DPDA < SymbolType, EpsilonType, StateType > & a, const automaton::DPDA < SymbolType, EpsilonType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
+		std::cout << "StackAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
+	}
+
+	if(a.getInitialSymbol() != b.getInitialSymbol()) {
+		std::cout << "InitialSymbol" << std::endl;
+
+		std::cout << "< " << a.getInitialSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialSymbol() << std::endl;
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+void AutomatonCompare::printCompare(const automaton::NPDA < SymbolType, EpsilonType, StateType > & a, const automaton::NPDA < SymbolType, EpsilonType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
+		std::cout << "StackAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
+	}
+
+	if(a.getInitialSymbol() != b.getInitialSymbol()) {
+		std::cout << "InitialSymbol" << std::endl;
+
+		std::cout << "< " << a.getInitialSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialSymbol() << std::endl;
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class StateType>
+void AutomatonCompare::printCompare(const automaton::InputDrivenDPDA < SymbolType, StateType > & a, const automaton::InputDrivenDPDA < SymbolType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
+		std::cout << "StackAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
+	}
+
+	if(a.getInitialSymbol() != b.getInitialSymbol()) {
+		std::cout << "InitialSymbol" << std::endl;
+
+		std::cout << "< " << a.getInitialSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialSymbol() << std::endl;
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getPushdownStoreOperations() != b.getPushdownStoreOperations()) {
+		std::cout << "PushdownStoreOperations" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getPushdownStoreOperations(), b.getPushdownStoreOperations());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class StateType>
+void AutomatonCompare::printCompare(const automaton::InputDrivenNPDA < SymbolType, StateType > & a, const automaton::InputDrivenNPDA < SymbolType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
+		std::cout << "StackAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
+	}
+
+	if(a.getInitialSymbol() != b.getInitialSymbol()) {
+		std::cout << "InitialSymbol" << std::endl;
+
+		std::cout << "< " << a.getInitialSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialSymbol() << std::endl;
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getPushdownStoreOperations() != b.getPushdownStoreOperations()) {
+		std::cout << "PushdownStoreOperations" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getPushdownStoreOperations(), b.getPushdownStoreOperations());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class StateType>
+void AutomatonCompare::printCompare(const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getCallInputAlphabet() != b.getCallInputAlphabet()) {
+		std::cout << "CallInputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getCallInputAlphabet(), b.getCallInputAlphabet());
+	}
+
+	if(a.getReturnInputAlphabet() != b.getReturnInputAlphabet()) {
+		std::cout << "ReturnInputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getReturnInputAlphabet(), b.getReturnInputAlphabet());
+	}
+
+	if(a.getLocalInputAlphabet() != b.getLocalInputAlphabet()) {
+		std::cout << "LocalInputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getLocalInputAlphabet(), b.getLocalInputAlphabet());
+	}
+
+	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
+		std::cout << "StackAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
+	}
+
+	if(a.getBottomOfTheStackSymbol() != b.getBottomOfTheStackSymbol()) {
+		std::cout << "BottomOfTheStackSymbol" << std::endl;
+
+		std::cout << "< " << a.getBottomOfTheStackSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getBottomOfTheStackSymbol() << std::endl;
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getCallTransitions() != b.getCallTransitions()) {
+		std::cout << "CallTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getCallTransitions(), b.getCallTransitions());
+	}
+
+	if(a.getReturnTransitions() != b.getReturnTransitions()) {
+		std::cout << "ReturnTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getReturnTransitions(), b.getReturnTransitions());
+	}
+
+	if(a.getLocalTransitions() != b.getLocalTransitions()) {
+		std::cout << "LocalTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getLocalTransitions(), b.getLocalTransitions());
+	}
+}
+
+template<class SymbolType, class StateType>
+void AutomatonCompare::printCompare(const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialStates() != b.getInitialStates()) {
+		std::cout << "Initial states" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInitialStates(), b.getInitialStates());
+	}
+
+	if(a.getCallInputAlphabet() != b.getCallInputAlphabet()) {
+		std::cout << "CallInputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getCallInputAlphabet(), b.getCallInputAlphabet());
+	}
+
+	if(a.getReturnInputAlphabet() != b.getReturnInputAlphabet()) {
+		std::cout << "ReturnInputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getReturnInputAlphabet(), b.getReturnInputAlphabet());
+	}
+
+	if(a.getLocalInputAlphabet() != b.getLocalInputAlphabet()) {
+		std::cout << "LocalInputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getLocalInputAlphabet(), b.getLocalInputAlphabet());
+	}
+
+	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
+		std::cout << "StackAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
+	}
+
+	if(a.getBottomOfTheStackSymbol() != b.getBottomOfTheStackSymbol()) {
+		std::cout << "BottomOfTheStackSymbol" << std::endl;
+
+		std::cout << "< " << a.getBottomOfTheStackSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getBottomOfTheStackSymbol() << std::endl;
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getCallTransitions() != b.getCallTransitions()) {
+		std::cout << "CallTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getCallTransitions(), b.getCallTransitions());
+	}
+
+	if(a.getReturnTransitions() != b.getReturnTransitions()) {
+		std::cout << "ReturnTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getReturnTransitions(), b.getReturnTransitions());
+	}
+
+	if(a.getLocalTransitions() != b.getLocalTransitions()) {
+		std::cout << "LocalTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getLocalTransitions(), b.getLocalTransitions());
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+void AutomatonCompare::printCompare(const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
+		std::cout << "StackAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
+	}
+
+	if(a.getBottomOfTheStackSymbol() != b.getBottomOfTheStackSymbol()) {
+		std::cout << "BottomOfTheStackSymbol" << std::endl;
+
+		std::cout << "< " << a.getBottomOfTheStackSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getBottomOfTheStackSymbol() << std::endl;
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getCallTransitions() != b.getCallTransitions()) {
+		std::cout << "CallTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getCallTransitions(), b.getCallTransitions());
+	}
+
+	if(a.getReturnTransitions() != b.getReturnTransitions()) {
+		std::cout << "ReturnTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getReturnTransitions(), b.getReturnTransitions());
+	}
+
+	if(a.getLocalTransitions() != b.getLocalTransitions()) {
+		std::cout << "LocalTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getLocalTransitions(), b.getLocalTransitions());
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+void AutomatonCompare::printCompare(const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialStates() != b.getInitialStates()) {
+		std::cout << "Initial states" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInitialStates(), b.getInitialStates());
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
+		std::cout << "StackAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
+	}
+
+	if(a.getBottomOfTheStackSymbol() != b.getBottomOfTheStackSymbol()) {
+		std::cout << "BottomOfTheStackSymbol" << std::endl;
+
+		std::cout << "< " << a.getBottomOfTheStackSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getBottomOfTheStackSymbol() << std::endl;
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getCallTransitions() != b.getCallTransitions()) {
+		std::cout << "CallTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getCallTransitions(), b.getCallTransitions());
+	}
+
+	if(a.getReturnTransitions() != b.getReturnTransitions()) {
+		std::cout << "ReturnTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getReturnTransitions(), b.getReturnTransitions());
+	}
+
+	if(a.getLocalTransitions() != b.getLocalTransitions()) {
+		std::cout << "LocalTransitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getLocalTransitions(), b.getLocalTransitions());
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+void AutomatonCompare::printCompare(const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
+		std::cout << "StackAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
+	}
+
+	if(a.getInitialSymbol() != b.getInitialSymbol()) {
+		std::cout << "InitialSymbol" << std::endl;
+
+		std::cout << "< " << a.getInitialSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialSymbol() << std::endl;
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+void AutomatonCompare::printCompare(const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getPushdownStoreAlphabet() != b.getPushdownStoreAlphabet()) {
+		std::cout << "StackAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getPushdownStoreAlphabet(), b.getPushdownStoreAlphabet());
+	}
+
+	if(a.getInitialSymbol() != b.getInitialSymbol()) {
+		std::cout << "InitialSymbol" << std::endl;
+
+		std::cout << "< " << a.getInitialSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialSymbol() << std::endl;
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class StateType>
+void AutomatonCompare::printCompare(const automaton::OneTapeDTM < SymbolType, StateType > & a, const automaton::OneTapeDTM < SymbolType, StateType > & b) {
+	std::cout << "AutomatonCompareer" << std::endl;
+
+	if(a.getBlankSymbol() != b.getBlankSymbol()) {
+		std::cout << "Blank symbol" << std::endl;
+
+		std::cout << "< " << a.getBlankSymbol() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getBlankSymbol() << std::endl;
+	}
+
+	if(a.getFinalStates() != b.getFinalStates()){
+		std::cout << "FinalStates" << std::endl;
+
+		AutomatonCompare::setCompare(a.getFinalStates(), b.getFinalStates());
+	}
+
+	if(a.getInitialState() != b.getInitialState()) {
+		std::cout << "Initial state" << std::endl;
+
+		std::cout << "< " << a.getInitialState() << std::endl;
+		std::cout << "---" << std::endl;
+		std::cout << "> " << b.getInitialState() << std::endl;
+	}
+
+	if(a.getInputAlphabet() != b.getInputAlphabet()) {
+		std::cout << "InputAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getInputAlphabet(), b.getInputAlphabet());
+	}
+
+	if(a.getStates() != b.getStates()) {
+		std::cout << "States" << std::endl;
+
+		AutomatonCompare::setCompare(a.getStates(), b.getStates());
+	}
+
+	if(a.getTapeAlphabet() != b.getTapeAlphabet()) {
+		std::cout << "TapeAlphabet" << std::endl;
+
+		AutomatonCompare::setCompare(a.getTapeAlphabet(), b.getTapeAlphabet());
+	}
+
+	if(a.getTransitions() != b.getTransitions()) {
+		std::cout << "Transitions" << std::endl;
+
+		AutomatonCompare::mapCompare(a.getTransitions(), b.getTransitions());
+	}
+}
+
+template<class SymbolType, class StateType>
+int AutomatonCompare::compare(const automaton::DFA < SymbolType, StateType > & a, const automaton::DFA < SymbolType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class StateType>
+int AutomatonCompare::compare(const automaton::NFA < SymbolType, StateType > & a, const automaton::NFA < SymbolType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class StateType>
+int AutomatonCompare::compare(const automaton::MultiInitialStateNFA < SymbolType, StateType > & a, const automaton::MultiInitialStateNFA < SymbolType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+int AutomatonCompare::compare(const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & a, const automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class StateType>
+int AutomatonCompare::compare(const automaton::ExtendedNFA < SymbolType, StateType > & a, const automaton::ExtendedNFA < SymbolType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class StateType>
+int AutomatonCompare::compare(const automaton::CompactNFA < SymbolType, StateType > & a, const automaton::CompactNFA < SymbolType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class RankType, class StateType>
+int AutomatonCompare::compare(const automaton::DFTA < SymbolType, RankType, StateType > & a, const automaton::DFTA < SymbolType, RankType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class RankType, class StateType>
+int AutomatonCompare::compare(const automaton::NFTA < SymbolType, RankType, StateType > & a, const automaton::NFTA < SymbolType, RankType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+int AutomatonCompare::compare(const automaton::DPDA < SymbolType, EpsilonType, StateType > & a, const automaton::DPDA < SymbolType, EpsilonType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+int AutomatonCompare::compare(const automaton::NPDA < SymbolType, EpsilonType, StateType > & a, const automaton::NPDA < SymbolType, EpsilonType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class StateType>
+int AutomatonCompare::compare(const automaton::InputDrivenDPDA < SymbolType, StateType > & a, const automaton::InputDrivenDPDA < SymbolType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class StateType>
+int AutomatonCompare::compare(const automaton::InputDrivenNPDA < SymbolType, StateType > & a, const automaton::InputDrivenNPDA < SymbolType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class StateType>
+int AutomatonCompare::compare(const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownDPDA < SymbolType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class StateType>
+int AutomatonCompare::compare(const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & a, const automaton::VisiblyPushdownNPDA < SymbolType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+int AutomatonCompare::compare(const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicDPDA < SymbolType, EpsilonType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+int AutomatonCompare::compare(const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::RealTimeHeightDeterministicNPDA < SymbolType, EpsilonType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+int AutomatonCompare::compare(const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopDPDA < SymbolType, EpsilonType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class EpsilonType, class StateType>
+int AutomatonCompare::compare(const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & a, const automaton::SinglePopNPDA < SymbolType, EpsilonType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
+template<class SymbolType, class StateType>
+int AutomatonCompare::compare(const automaton::OneTapeDTM < SymbolType, StateType > & a, const automaton::OneTapeDTM < SymbolType, StateType > & b) {
+	if(!AutomatonCompare::testCompare(a, b)) {
+	  AutomatonCompare::printCompare(a, b);
+	  return 1;
+	} else {
+	  return 0;
+	}
+}
+
 #endif /* AUTOMATON_COMPARE_H_ */