diff --git a/alib2/src/alphabet/BlankSymbol.h b/alib2/src/alphabet/BlankSymbol.h
index dca5215d6478a0f010be3fbd920d1b007f4be454..671e7a887d723d274dcc686194f3e4fef3db3e88 100644
--- a/alib2/src/alphabet/BlankSymbol.h
+++ b/alib2/src/alphabet/BlankSymbol.h
@@ -15,7 +15,7 @@ namespace alphabet {
 /**
  * Represents blank symbol in an alphabet.
  */
-class BlankSymbol : public SymbolBase, public std::element<BlankSymbol, SymbolBase::visitor_type> {
+class BlankSymbol : virtual public SymbolBase, public std::element<BlankSymbol, SymbolBase> {
 public:
 	/**
 	 * Creates a blank symbol.
diff --git a/alib2/src/alphabet/LabeledSymbol.h b/alib2/src/alphabet/LabeledSymbol.h
index 16c0954febcda012c88db7a32393f36a48e7f981..4e8b236ccb1d24a9e8c886b7b905eafcf4933db8 100644
--- a/alib2/src/alphabet/LabeledSymbol.h
+++ b/alib2/src/alphabet/LabeledSymbol.h
@@ -17,7 +17,7 @@ namespace alphabet {
 /**
  * Represents symbol in an alphabet.
  */
-class LabeledSymbol : public SymbolBase, public std::element<LabeledSymbol, SymbolBase::visitor_type> {
+class LabeledSymbol : virtual public SymbolBase, public std::element<LabeledSymbol, SymbolBase> {
 protected:
 	label::Label label;
 	
diff --git a/alib2/src/alphabet/Symbol.h b/alib2/src/alphabet/Symbol.h
index 6500eedbac95f9569bd29888579828bc7257df5f..c69839ab0ec2cf8064af6c31a8980a307e647e7f 100644
--- a/alib2/src/alphabet/Symbol.h
+++ b/alib2/src/alphabet/Symbol.h
@@ -16,7 +16,7 @@ namespace alphabet {
 /**
  * Wrapper around automata.
  */
-class Symbol : public std::element<Symbol, std::visitor<Symbol> > { //TODO toto udělat v std templatované
+class Symbol { //TODO toto udělat v std templatované
 protected:
 	SymbolBase* symbol;
 public:
diff --git a/alib2/src/alphabet/SymbolBase.h b/alib2/src/alphabet/SymbolBase.h
index 98de64cf0178dae84a0d07134ea8878c9cd46f5f..717d2e80f626a109312bc07f736ade51594d882c 100644
--- a/alib2/src/alphabet/SymbolBase.h
+++ b/alib2/src/alphabet/SymbolBase.h
@@ -19,7 +19,7 @@ class BlankSymbol;
 /**
  * Represents symbol in an alphabet.
  */
-class SymbolBase : virtual public std::elementBase<std::visitor<LabeledSymbol, BlankSymbol> > {
+class SymbolBase : virtual public std::elementBase<LabeledSymbol, BlankSymbol> {
 public:
 	virtual ~SymbolBase() noexcept;
 
diff --git a/alib2/src/alphabet/SymbolToStringComposer.h b/alib2/src/alphabet/SymbolToStringComposer.h
index 1488a4436270cf1c8480a109065666c100d7ceb2..56acb49b26f015b619ee38259aab0064c72d638a 100644
--- a/alib2/src/alphabet/SymbolToStringComposer.h
+++ b/alib2/src/alphabet/SymbolToStringComposer.h
@@ -18,7 +18,7 @@ namespace alphabet {
 /**
  * This class contains methods to print XML representation of string to the output stream.
  */
-class SymbolToStringComposer : public Symbol::visitor_type, public SymbolBase::visitor_type {
+class SymbolToStringComposer : public SymbolBase::visitor_type {
 	void Visit(void*, const label::Label& label);
 	void Visit(void*, const Symbol& symbol);
 	void Visit(void*, const LabeledSymbol& symbol);
diff --git a/alib2/src/alphabet/SymbolToXMLComposer.cpp b/alib2/src/alphabet/SymbolToXMLComposer.cpp
index 3eabc5243ef13c2eaae686f73a33b0442da44693..13ec4c900da216522ec3f74a785e46107664e390 100644
--- a/alib2/src/alphabet/SymbolToXMLComposer.cpp
+++ b/alib2/src/alphabet/SymbolToXMLComposer.cpp
@@ -10,20 +10,20 @@
 
 namespace alphabet {
 
-void SymbolToXMLComposer::Visit(void* userData, const label::Label& label) {
+void SymbolToXMLComposer::Visit(void* userData, const label::Label& label) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token((std::string) label, sax::Token::CHARACTER));
 }
 
-void SymbolToXMLComposer::Visit(void* userData, const BlankSymbol&) {
+void SymbolToXMLComposer::Visit(void* userData, const BlankSymbol&) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("BlankSymbol", sax::Token::START_ELEMENT));
 	out.push_back(sax::Token("BlankSymbol", sax::Token::END_ELEMENT));
 }
 
-void SymbolToXMLComposer::Visit(void* userData, const LabeledSymbol& symbol) {
+void SymbolToXMLComposer::Visit(void* userData, const LabeledSymbol& symbol) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("LabeledSymbol", sax::Token::START_ELEMENT));
@@ -31,12 +31,12 @@ void SymbolToXMLComposer::Visit(void* userData, const LabeledSymbol& symbol) {
 	out.push_back(sax::Token("LabeledSymbol", sax::Token::END_ELEMENT));
 }
 
-void SymbolToXMLComposer::Visit(void* userData, const Symbol& symbol) {
+void SymbolToXMLComposer::Visit(void* userData, const Symbol& symbol) const {
 	symbol.getSymbol().Accept(userData, *this);
 
 }
 
-std::list<sax::Token> SymbolToXMLComposer::compose(const Symbol& symbol) {
+std::list<sax::Token> SymbolToXMLComposer::compose(const Symbol& symbol) const {
 	std::list<sax::Token> out;
 	Visit((void*) &out, symbol);
 	return out;
diff --git a/alib2/src/alphabet/SymbolToXMLComposer.h b/alib2/src/alphabet/SymbolToXMLComposer.h
index df5019e2ada08030b7d62107bd09f98f363f39d9..75829d68c256f1b250d17364fa4d3c9f8fbb6e83 100644
--- a/alib2/src/alphabet/SymbolToXMLComposer.h
+++ b/alib2/src/alphabet/SymbolToXMLComposer.h
@@ -18,11 +18,11 @@ namespace alphabet {
 /**
  * This class contains methods to print XML representation of string to the output stream.
  */
-class SymbolToXMLComposer : public Symbol::visitor_type, public SymbolBase::visitor_type {
-	void Visit(void*, const label::Label& slabel);
-	void Visit(void*, const Symbol& symbol);
-	void Visit(void*, const LabeledSymbol& symbol);
-	void Visit(void*, const BlankSymbol& symbol);
+class SymbolToXMLComposer : public SymbolBase::const_visitor_type {
+	void Visit(void*, const label::Label& slabel) const;
+	void Visit(void*, const Symbol& symbol) const;
+	void Visit(void*, const LabeledSymbol& symbol) const;
+	void Visit(void*, const BlankSymbol& symbol) const;
 
 public:
 	/**
@@ -30,7 +30,7 @@ public:
 	 * @param string String to print
 	 * @param out output stream to which print the String
 	 */
-	std::list<sax::Token> compose(const Symbol& symbol);
+	std::list<sax::Token> compose(const Symbol& symbol) const;
 };
 
 } /* namespace alphabet */
diff --git a/alib2/src/automaton/Automaton.h b/alib2/src/automaton/Automaton.h
index cdcfd09db4e7b6231e98c58324dc2800396080b3..4c9e0b8d0142010195c2bee4efff7cde2f8e16cc 100644
--- a/alib2/src/automaton/Automaton.h
+++ b/alib2/src/automaton/Automaton.h
@@ -16,7 +16,7 @@ namespace automaton {
 /**
  * Wrapper around automata.
  */
-class Automaton : public std::element<Automaton, std::visitor<Automaton> > {
+class Automaton {
 protected:
 	AutomatonBase* automaton;
 public:
diff --git a/alib2/src/automaton/AutomatonBase.h b/alib2/src/automaton/AutomatonBase.h
index aac5328d60572e5aeeba06598bee839baf7887f5..bc669805ea060e066e02b2cfa80f3d90b7b012c7 100644
--- a/alib2/src/automaton/AutomatonBase.h
+++ b/alib2/src/automaton/AutomatonBase.h
@@ -9,6 +9,7 @@
 #define AUTOMATON_BASE_H_
 
 #include "../std/visitor.hpp"
+#include <iostream>
 
 namespace automaton {
 
@@ -24,7 +25,7 @@ class OneTapeDTM;
 /**
  * Abstract base class for all automata.
  */
-class AutomatonBase : virtual public std::elementBase<std::visitor<UnknownAutomaton, DFA, NFA, EpsilonNFA, CompactNFA, ExtendedNFA, PDA, OneTapeDTM> > {
+class AutomatonBase : virtual public std::elementBase<UnknownAutomaton, DFA, NFA, EpsilonNFA, CompactNFA, ExtendedNFA, PDA, OneTapeDTM> {
 public:
 	virtual AutomatonBase* clone() const = 0;
 
diff --git a/alib2/src/automaton/AutomatonToXMLComposer.cpp b/alib2/src/automaton/AutomatonToXMLComposer.cpp
index f90fdfbbb76611c93155cc39a3a41e3916393972..5fff45b7c9f078fdecd771b2e872dee2798d4be1 100644
--- a/alib2/src/automaton/AutomatonToXMLComposer.cpp
+++ b/alib2/src/automaton/AutomatonToXMLComposer.cpp
@@ -10,7 +10,7 @@
 
 namespace automaton {
 
-void AutomatonToXMLComposer::printStates(std::list<sax::Token>& out, const std::set<State>& states, std::string tagName) {
+void AutomatonToXMLComposer::printStates(std::list<sax::Token>& out, const std::set<State>& states, std::string tagName) const {
 	out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT));
 	for (auto& state : states) {
 		printState(out, state, "state");
@@ -18,7 +18,7 @@ void AutomatonToXMLComposer::printStates(std::list<sax::Token>& out, const std::
 	out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std::set<alphabet::Symbol>& symbols, std::string tagName) {
+void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std::set<alphabet::Symbol>& symbols, std::string tagName) const {
 	out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT));
 	for (auto& symbol : symbols) {
 		printSymbol(out, symbol, "symbol");
@@ -26,7 +26,7 @@ void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std:
 	out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols, std::string tagName) {
+void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std::vector<alphabet::Symbol>& symbols, std::string tagName) const {
 	out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT));
 	for (auto& symbol : symbols) {
 		printSymbol(out, symbol, "symbol");
@@ -34,13 +34,13 @@ void AutomatonToXMLComposer::printSymbols(std::list<sax::Token>& out, const std:
 	out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::printShift(std::list<sax::Token>& out, const Shift shift, std::string tagName) {
+void AutomatonToXMLComposer::printShift(std::list<sax::Token>& out, const Shift shift, std::string tagName) const {
 	out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT));
 	out.push_back(sax::Token(SHIFT_NAMES [shift], sax::Token::CHARACTER));
 	out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const UnknownAutomaton& automaton) {
+void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const UnknownAutomaton& automaton) const {
 	out.push_back(sax::Token("transitions", sax::Token::START_ELEMENT));
 	for (auto& transition : automaton.getTransitions()) {
 		out.push_back(sax::Token("transition", sax::Token::START_ELEMENT));
@@ -73,7 +73,7 @@ void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const
 }
 
 
-void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const DFA& automaton) {
+void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const DFA& automaton) const {
 	out.push_back(sax::Token("transitions", sax::Token::START_ELEMENT));
 	for(auto& transition : automaton.getTransitions()) {
 		out.push_back(sax::Token("transition", sax::Token::START_ELEMENT));
@@ -88,7 +88,7 @@ void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const
 	out.push_back(sax::Token("transitions", sax::Token::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const NFA& automaton) {
+void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const NFA& automaton) const {
 	out.push_back(sax::Token("transitions", sax::Token::START_ELEMENT));
 	for(auto& transition : automaton.getTransitions()) {
 		for(auto& targetState: transition.second) {
@@ -105,7 +105,7 @@ void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const
 	out.push_back(sax::Token("transitions", sax::Token::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const EpsilonNFA& automaton) {
+void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const EpsilonNFA& automaton) const {
 	out.push_back(sax::Token("transitions", sax::Token::START_ELEMENT));
 	for(auto& transition : automaton.getTransitions()) {
 		for(auto& targetState: transition.second) {
@@ -122,19 +122,19 @@ void AutomatonToXMLComposer::printTransitions(std::list<sax::Token>& out, const
 	out.push_back(sax::Token("transitions", sax::Token::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::printState(std::list<sax::Token>& out, const State& state, std::string tagName) {
+void AutomatonToXMLComposer::printState(std::list<sax::Token>& out, const State& state, std::string tagName) const {
 	out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT));
 	out.push_back(sax::Token(state.getName(), sax::Token::CHARACTER));
 	out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::printInput(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName) {
+void AutomatonToXMLComposer::printInput(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName) const {
 	out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT));
 	out.push_back(sax::Token((std::string) symbol, sax::Token::CHARACTER));
 	out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::printInput(std::list<sax::Token>& out, const std::variant<string::Epsilon, alphabet::Symbol>& symbol, std::string tagName) {
+void AutomatonToXMLComposer::printInput(std::list<sax::Token>& out, const std::variant<string::Epsilon, alphabet::Symbol>& symbol, std::string tagName) const {
 	out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT));
 	if(symbol.is<string::Epsilon>()) {
 		out.push_back(sax::Token("epsilon", sax::Token::START_ELEMENT));
@@ -148,7 +148,7 @@ void AutomatonToXMLComposer::printInput(std::list<sax::Token>& out, const std::v
 	out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT));
 }
 
-void AutomatonToXMLComposer::printSymbol(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName) {
+void AutomatonToXMLComposer::printSymbol(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName) const {
 	out.push_back(sax::Token(tagName, sax::Token::START_ELEMENT));
 	if(symbol.getSymbol() == alphabet::BlankSymbol::BLANK) {
 		out.push_back(sax::Token("blank", sax::Token::START_ELEMENT));
@@ -159,13 +159,13 @@ void AutomatonToXMLComposer::printSymbol(std::list<sax::Token>& out, const alpha
 	out.push_back(sax::Token(tagName, sax::Token::END_ELEMENT));
 }
 
-std::list<sax::Token> AutomatonToXMLComposer::compose(const AutomatonBase& automaton) {
+std::list<sax::Token> AutomatonToXMLComposer::compose(const AutomatonBase& automaton) const {
 	std::list<sax::Token> out;
 	automaton.Accept((void*) &out, *this);
 	return out;
 }
 
-std::list<sax::Token> AutomatonToXMLComposer::compose(const UnknownAutomaton& automaton) {
+std::list<sax::Token> AutomatonToXMLComposer::compose(const UnknownAutomaton& automaton) const {
 	std::list<sax::Token> out;
 	out.push_back(sax::Token("automaton", sax::Token::START_ELEMENT));
 	
@@ -200,7 +200,7 @@ std::list<sax::Token> AutomatonToXMLComposer::compose(const UnknownAutomaton& au
 	return out;
 }
 
-std::list<sax::Token> AutomatonToXMLComposer::compose(const DFA& automaton) {
+std::list<sax::Token> AutomatonToXMLComposer::compose(const DFA& automaton) const {
 	std::list<sax::Token> out;
 	out.push_back(sax::Token("DFA", sax::Token::START_ELEMENT));
 
@@ -214,7 +214,7 @@ std::list<sax::Token> AutomatonToXMLComposer::compose(const DFA& automaton) {
 	return out;
 }
 
-std::list<sax::Token> AutomatonToXMLComposer::compose(const NFA& automaton) {
+std::list<sax::Token> AutomatonToXMLComposer::compose(const NFA& automaton) const {
 	std::list<sax::Token> out;
 	out.push_back(sax::Token("NFA", sax::Token::START_ELEMENT));
 
@@ -228,7 +228,7 @@ std::list<sax::Token> AutomatonToXMLComposer::compose(const NFA& automaton) {
 	return out;
 }
 
-std::list<sax::Token> AutomatonToXMLComposer::compose(const EpsilonNFA& automaton) {
+std::list<sax::Token> AutomatonToXMLComposer::compose(const EpsilonNFA& automaton) const {
 	std::list<sax::Token> out;
 	out.push_back(sax::Token("EpsilonNFA", sax::Token::START_ELEMENT));
 
@@ -242,67 +242,67 @@ std::list<sax::Token> AutomatonToXMLComposer::compose(const EpsilonNFA& automato
 	return out;
 }
 
-std::list<sax::Token> AutomatonToXMLComposer::compose(const ExtendedNFA& automaton) {
+std::list<sax::Token> AutomatonToXMLComposer::compose(const ExtendedNFA& automaton) const {
 	std::list<sax::Token> out;
 	return out;
 }
 
-std::list<sax::Token> AutomatonToXMLComposer::compose(const CompactNFA& automaton) {
+std::list<sax::Token> AutomatonToXMLComposer::compose(const CompactNFA& automaton) const {
 	std::list<sax::Token> out;
 	return out;
 }
 
-std::list<sax::Token> AutomatonToXMLComposer::compose(const PDA& automaton) {
+std::list<sax::Token> AutomatonToXMLComposer::compose(const PDA& automaton) const {
 	std::list<sax::Token> out;
 	return out;
 }
 
-std::list<sax::Token> AutomatonToXMLComposer::compose(const OneTapeDTM& automaton) {
+std::list<sax::Token> AutomatonToXMLComposer::compose(const OneTapeDTM& automaton) const {
 	std::list<sax::Token> out;
 	return out;
 }
 
 
-std::list<sax::Token> AutomatonToXMLComposer::compose(const Automaton& automaton) {
+std::list<sax::Token> AutomatonToXMLComposer::compose(const Automaton& automaton) const {
 	std::list<sax::Token> out;
-	automaton.Accept((void*) &out, *this);
+	automaton.getAutomaton().Accept((void*) &out, *this);
 	return out;
 }
 
-void AutomatonToXMLComposer::Visit(void* data, const Automaton& automaton) {
+void AutomatonToXMLComposer::Visit(void* data, const Automaton& automaton) const {
 	*((std::list<sax::Token>*) data) = this->compose(automaton);
 }
 
-void AutomatonToXMLComposer::Visit(void* data, const UnknownAutomaton& automaton) {
+void AutomatonToXMLComposer::Visit(void* data, const UnknownAutomaton& automaton) const {
 	*((std::list<sax::Token>*) data) = this->compose(automaton);
 }
 
-void AutomatonToXMLComposer::Visit(void* data, const EpsilonNFA& automaton) {
+void AutomatonToXMLComposer::Visit(void* data, const EpsilonNFA& automaton) const {
 	*((std::list<sax::Token>*) data) = this->compose(automaton);
 }
 
-void AutomatonToXMLComposer::Visit(void* data, const NFA& automaton) {
+void AutomatonToXMLComposer::Visit(void* data, const NFA& automaton) const {
 	*((std::list<sax::Token>*) data) = this->compose(automaton);
 }
 
-void AutomatonToXMLComposer::Visit(void* data, const DFA& automaton) {
+void AutomatonToXMLComposer::Visit(void* data, const DFA& automaton) const {
 	*((std::list<sax::Token>*) data) = this->compose(automaton);
 }
 
-void AutomatonToXMLComposer::Visit(void* data, const ExtendedNFA& automaton) {
+void AutomatonToXMLComposer::Visit(void* data, const ExtendedNFA& automaton) const {
 	*((std::list<sax::Token>*) data) = this->compose(automaton);
 }
 
-void AutomatonToXMLComposer::Visit(void* data, const CompactNFA& automaton) {
-	*((std::list<sax::Token>*) data) = this->compose(automaton);;
+void AutomatonToXMLComposer::Visit(void* data, const CompactNFA& automaton) const {
+	*((std::list<sax::Token>*) data) = this->compose(automaton);
 }
 
-void AutomatonToXMLComposer::Visit(void* data, const PDA& automaton) {
-	*((std::list<sax::Token>*) data) = this->compose(automaton);;
+void AutomatonToXMLComposer::Visit(void* data, const PDA& automaton) const {
+	*((std::list<sax::Token>*) data) = this->compose(automaton);
 }
 
-void AutomatonToXMLComposer::Visit(void* data, const OneTapeDTM& automaton) {
-	*((std::list<sax::Token>*) data) = this->compose(automaton);;
+void AutomatonToXMLComposer::Visit(void* data, const OneTapeDTM& automaton) const {
+	*((std::list<sax::Token>*) data) = this->compose(automaton);
 }
 
 } /* namespace automaton */
diff --git a/alib2/src/automaton/AutomatonToXMLComposer.h b/alib2/src/automaton/AutomatonToXMLComposer.h
index 06e3430bdd470db833d19e3eac78e441f540c864..6ccaf9ea4f571ef4190b9613f7d851559a6b40b2 100644
--- a/alib2/src/automaton/AutomatonToXMLComposer.h
+++ b/alib2/src/automaton/AutomatonToXMLComposer.h
@@ -22,32 +22,32 @@ namespace automaton {
 /**
  * This class contains methods to print XML representation of automata to the output stream.
  */
-class AutomatonToXMLComposer : public Automaton::visitor_type, public AutomatonBase::visitor_type {
-	void Visit(void*, const Automaton& automaton);
-	void Visit(void*, const UnknownAutomaton& automaton);
-	void Visit(void*, const EpsilonNFA& automaton);
-	void Visit(void*, const NFA& automaton);
-	void Visit(void*, const DFA& automaton);
-	void Visit(void*, const ExtendedNFA& automaton);
-	void Visit(void*, const CompactNFA& automaton);
-	void Visit(void*, const PDA& automaton);
-	void Visit(void*, const OneTapeDTM& automaton);
+class AutomatonToXMLComposer : public AutomatonBase::const_visitor_type {
+	void Visit(void*, const Automaton& automaton) const;
+	void Visit(void*, const UnknownAutomaton& automaton) const;
+	void Visit(void*, const EpsilonNFA& automaton) const;
+	void Visit(void*, const NFA& automaton) const;
+	void Visit(void*, const DFA& automaton) const;
+	void Visit(void*, const ExtendedNFA& automaton) const;
+	void Visit(void*, const CompactNFA& automaton) const;
+	void Visit(void*, const PDA& automaton) const;
+	void Visit(void*, const OneTapeDTM& automaton) const;
 
 protected:
-	static void printStates(std::list<sax::Token>&, const std::set<State>& states, std::string tagName);
-	static void printSymbols(std::list<sax::Token>&, const std::set<alphabet::Symbol>& symbols, std::string tagName);
-	static void printSymbols(std::list<sax::Token>&, const std::vector<alphabet::Symbol>& symbols, std::string tagName);
-	static void printShift(std::list<sax::Token>&, const Shift shift, std::string tagName);
+	void printStates(std::list<sax::Token>&, const std::set<State>& states, std::string tagName) const;
+	void printSymbols(std::list<sax::Token>&, const std::set<alphabet::Symbol>& symbols, std::string tagName) const;
+	void printSymbols(std::list<sax::Token>&, const std::vector<alphabet::Symbol>& symbols, std::string tagName) const;
+	void printShift(std::list<sax::Token>&, const Shift shift, std::string tagName) const;
 
-	static void printTransitions(std::list<sax::Token>&, const UnknownAutomaton& automaton);
-	static void printTransitions(std::list<sax::Token>&, const EpsilonNFA& automaton);
-	static void printTransitions(std::list<sax::Token>&, const NFA& automaton);
-	static void printTransitions(std::list<sax::Token>&, const DFA& automaton);
+	void printTransitions(std::list<sax::Token>&, const UnknownAutomaton& automaton) const;
+	void printTransitions(std::list<sax::Token>&, const EpsilonNFA& automaton) const;
+	void printTransitions(std::list<sax::Token>&, const NFA& automaton) const;
+	void printTransitions(std::list<sax::Token>&, const DFA& automaton) const;
 
-	static void printState(std::list<sax::Token>&, const State& state, std::string tagName);
-	static void printSymbol(std::list<sax::Token>&, const alphabet::Symbol& symbol, std::string tagName);
-	static void printInput(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName);
-	static void printInput(std::list<sax::Token>&, const std::variant<string::Epsilon, alphabet::Symbol>&, std::string);
+	void printState(std::list<sax::Token>&, const State& state, std::string tagName) const;
+	void printSymbol(std::list<sax::Token>&, const alphabet::Symbol& symbol, std::string tagName) const;
+	void printInput(std::list<sax::Token>& out, const alphabet::Symbol& symbol, std::string tagName) const;
+	void printInput(std::list<sax::Token>&, const std::variant<string::Epsilon, alphabet::Symbol>&, std::string) const;
 
 public:
 	/**
@@ -55,18 +55,18 @@ public:
 	 * @param automaton automaton to print
 	 * @return list of xml tokens representing the automaton
 	 */
-	std::list<sax::Token> compose(const AutomatonBase& automaton);
+	std::list<sax::Token> compose(const AutomatonBase& automaton) const;
 
-	std::list<sax::Token> compose(const Automaton& automaton);
+	std::list<sax::Token> compose(const Automaton& automaton) const;
 	
-	std::list<sax::Token> compose(const UnknownAutomaton& automaton);
-	std::list<sax::Token> compose(const DFA& automaton);
-	std::list<sax::Token> compose(const NFA& automaton);
-	std::list<sax::Token> compose(const EpsilonNFA& automaton);
-	std::list<sax::Token> compose(const ExtendedNFA& automaton);
-	std::list<sax::Token> compose(const CompactNFA& automaton);
-	std::list<sax::Token> compose(const PDA& automaton);
-	std::list<sax::Token> compose(const OneTapeDTM& automaton);
+	std::list<sax::Token> compose(const UnknownAutomaton& automaton) const;
+	std::list<sax::Token> compose(const DFA& automaton) const;
+	std::list<sax::Token> compose(const NFA& automaton) const;
+	std::list<sax::Token> compose(const EpsilonNFA& automaton) const;
+	std::list<sax::Token> compose(const ExtendedNFA& automaton) const;
+	std::list<sax::Token> compose(const CompactNFA& automaton) const;
+	std::list<sax::Token> compose(const PDA& automaton) const;
+	std::list<sax::Token> compose(const OneTapeDTM& automaton) const;
 };
 
 } /* namespace automaton */
diff --git a/alib2/src/automaton/FSM/CompactNFA.cpp b/alib2/src/automaton/FSM/CompactNFA.cpp
index f9fe803140a222fc2a3aebd90be274497890a8dc..e415f46bed89234ec6a8912d7fea502a4bfbeb2a 100644
--- a/alib2/src/automaton/FSM/CompactNFA.cpp
+++ b/alib2/src/automaton/FSM/CompactNFA.cpp
@@ -60,13 +60,13 @@ bool CompactNFA::addTransition(const State& from, const string::String& input, c
 	if (states.find(to) == states.end())
 		throw AutomatonException("State \"" + to.getName() + "\" doesn't exist.");
 
-	std::pair<State, string::String> key = make_pair(from, input);
+	std::pair<State, string::String> key = std::make_pair(from, input);
 	
 	return transitions[key].insert(to).second;
 }
 
 bool CompactNFA::removeTransition(const State& from, const string::String& input, const State& to) {
-	std::pair<State, string::String> key = make_pair(from, input);
+	std::pair<State, string::String> key = std::make_pair(from, input);
 	
 	return transitions[key].erase(to);
 }
diff --git a/alib2/src/automaton/FSM/CompactNFA.h b/alib2/src/automaton/FSM/CompactNFA.h
index 6e6b498a242806fe180ab888588a93bbbc83c085..9c257058818a0ffc74c1a1f8323c31792942c370 100644
--- a/alib2/src/automaton/FSM/CompactNFA.h
+++ b/alib2/src/automaton/FSM/CompactNFA.h
@@ -20,7 +20,7 @@ namespace automaton {
  * Represents Finite Automaton.
  * Can store nondeterministic finite automaton without epsilon transitions.
  */
-class CompactNFA : public AutomatonBase, public std::element<CompactNFA, AutomatonBase::visitor_type>, public MultiInitialStates, public InputAlphabet {
+class CompactNFA : virtual public AutomatonBase, public std::element<CompactNFA, AutomatonBase>, public MultiInitialStates, public InputAlphabet {
 protected:
 	std::map<std::pair<State, string::String>, std::set<State> > transitions;
 public:
diff --git a/alib2/src/automaton/FSM/DFA.h b/alib2/src/automaton/FSM/DFA.h
index 59952216a0604124ece32a250e1fdef86d3acf25..03a2a203da2deddf750f477c2561494ae04993f3 100644
--- a/alib2/src/automaton/FSM/DFA.h
+++ b/alib2/src/automaton/FSM/DFA.h
@@ -20,7 +20,7 @@ namespace automaton {
  * Represents Finite Automaton.
  * Can store nondeterministic finite automaton without epsilon transitions.
  */
-class DFA : public AutomatonBase, public std::element<DFA, AutomatonBase::visitor_type>, public SingleInitialState, public InputAlphabet {
+class DFA : virtual public AutomatonBase, public std::element<DFA, AutomatonBase>, public SingleInitialState, public InputAlphabet {
 protected:
 	std::map<std::pair<State, alphabet::Symbol>, State> transitions;
 public:
diff --git a/alib2/src/automaton/FSM/EpsilonNFA.h b/alib2/src/automaton/FSM/EpsilonNFA.h
index 09398a52d91ff4823a402cf3547b9f7bf412f86e..61fa4c44fc7df0dc725c4517dfc1aa0db04a8fe3 100644
--- a/alib2/src/automaton/FSM/EpsilonNFA.h
+++ b/alib2/src/automaton/FSM/EpsilonNFA.h
@@ -22,7 +22,7 @@ namespace automaton {
  * Represents Finite Automaton.
  * Can store nondeterministic finite automaton with epsilon transitions.
  */
-class EpsilonNFA : public AutomatonBase, public std::element<EpsilonNFA, AutomatonBase::visitor_type>, public MultiInitialStates, public InputAlphabet {
+class EpsilonNFA : virtual public AutomatonBase, public std::element<EpsilonNFA, AutomatonBase>, public MultiInitialStates, public InputAlphabet {
 protected:
 	std::map<std::pair<State, std::variant<string::Epsilon, alphabet::Symbol> >, std::set<State> > transitions;
 public:
diff --git a/alib2/src/automaton/FSM/ExtendedNFA.cpp b/alib2/src/automaton/FSM/ExtendedNFA.cpp
index 315a312c1229f5fe14e018e4b8671fe060ad2446..92cfd5f787f48b5cbb0e09bb6d72d3fd7294ec9e 100644
--- a/alib2/src/automaton/FSM/ExtendedNFA.cpp
+++ b/alib2/src/automaton/FSM/ExtendedNFA.cpp
@@ -60,13 +60,13 @@ bool ExtendedNFA::addTransition(const State& from, const regexp::RegExp& input,
 	if (states.find(to) == states.end())
 		throw AutomatonException("State \"" + to.getName() + "\" doesn't exist.");
 
-	std::pair<State, regexp::RegExp> key = make_pair(from, input);
+	std::pair<State, regexp::RegExp> key = std::make_pair(from, input);
 	
 	return transitions[key].insert(to).second;
 }
 
 bool ExtendedNFA::removeTransition(const State& from, const regexp::RegExp& input, const State& to) {
-	std::pair<State, regexp::RegExp> key = make_pair(from, input);
+	std::pair<State, regexp::RegExp> key = std::make_pair(from, input);
 	
 	return transitions[key].erase(to);
 }
diff --git a/alib2/src/automaton/FSM/ExtendedNFA.h b/alib2/src/automaton/FSM/ExtendedNFA.h
index dfcb73fd9b04344342772027add41171118e4694..b3715bd4f858cfd903f68efcb66687d55cc17284 100644
--- a/alib2/src/automaton/FSM/ExtendedNFA.h
+++ b/alib2/src/automaton/FSM/ExtendedNFA.h
@@ -20,7 +20,7 @@ namespace automaton {
  * Represents Finite Automaton.
  * Can store nondeterministic finite automaton without epsilon transitions.
  */
-class ExtendedNFA : public AutomatonBase, public std::element<ExtendedNFA, AutomatonBase::visitor_type>, public MultiInitialStates, public InputAlphabet {
+class ExtendedNFA : virtual public AutomatonBase, public std::element<ExtendedNFA, AutomatonBase>, public MultiInitialStates, public InputAlphabet {
 protected:
 	std::map<std::pair<State, regexp::RegExp>, std::set<State> > transitions;
 public:
diff --git a/alib2/src/automaton/FSM/NFA.h b/alib2/src/automaton/FSM/NFA.h
index 11a0acb2e1232c65ddba527c34f7c2181b7d6d12..6ac9bca3afc4c0a97e181b63775eaf0c788bf126 100644
--- a/alib2/src/automaton/FSM/NFA.h
+++ b/alib2/src/automaton/FSM/NFA.h
@@ -21,7 +21,7 @@ namespace automaton {
  * Represents Finite Automaton.
  * Can store nondeterministic finite automaton without epsilon transitions.
  */
-class NFA : public AutomatonBase, public std::element<NFA, AutomatonBase::visitor_type>, public MultiInitialStates, public InputAlphabet {
+class NFA : virtual public AutomatonBase, public std::element<NFA, AutomatonBase>, public MultiInitialStates, public InputAlphabet {
 protected:
 	std::map<std::pair<State, alphabet::Symbol>, std::set<State> > transitions;
 public:
diff --git a/alib2/src/automaton/PDA/PDA.h b/alib2/src/automaton/PDA/PDA.h
index 2594295d00b3ec9e4151071846147f6ad89f09c2..125097599decf844a25be9c26ced46f9575033e1 100644
--- a/alib2/src/automaton/PDA/PDA.h
+++ b/alib2/src/automaton/PDA/PDA.h
@@ -23,7 +23,7 @@ namespace automaton {
 /**
  * Push Down Automaton
  */
-class PDA: public AutomatonBase, public std::element<PDA, AutomatonBase::visitor_type>, public MultiInitialStates, public InputAlphabet {
+class PDA: virtual public AutomatonBase, public std::element<PDA, AutomatonBase>, public MultiInitialStates, public InputAlphabet {
 protected:
 	std::set<alphabet::Symbol> stackAlphabet;
 	std::map<std::tuple<State, std::variant<string::Epsilon, alphabet::Symbol>, std::vector<alphabet::Symbol> >, std::set<std::pair<State, std::vector<alphabet::Symbol> > > > transitions;
diff --git a/alib2/src/automaton/TM/OneTapeDTM.h b/alib2/src/automaton/TM/OneTapeDTM.h
index b6963eb07ebf0ab954f9a0169aa0e83ba29809c5..ae9b995a0aa7ec92c48ba0b49aadfae27e7ac3f8 100644
--- a/alib2/src/automaton/TM/OneTapeDTM.h
+++ b/alib2/src/automaton/TM/OneTapeDTM.h
@@ -22,7 +22,7 @@ namespace automaton {
 /**
  * One tape turing machine
  */
-class OneTapeDTM : public AutomatonBase, public std::element<OneTapeDTM, AutomatonBase::visitor_type>, public SingleInitialState, public BlankSymbolInputTapeAlphabet {
+class OneTapeDTM : virtual public AutomatonBase, public std::element<OneTapeDTM, AutomatonBase>, public SingleInitialState, public BlankSymbolInputTapeAlphabet {
 protected:
 	std::map<std::pair<State, alphabet::Symbol>, std::tuple<State, alphabet::Symbol, Shift> > transitions;
 
diff --git a/alib2/src/automaton/UnknownAutomaton.h b/alib2/src/automaton/UnknownAutomaton.h
index e6a2304f4b629388a6dc65f65eff808c1ca15ea1..63ddcc95bc5a91efccb937280cf3b9a58cdc7919 100644
--- a/alib2/src/automaton/UnknownAutomaton.h
+++ b/alib2/src/automaton/UnknownAutomaton.h
@@ -21,7 +21,7 @@ namespace automaton {
 /**
  * Class representing unknown automaton parsed from XML.
  */
-class UnknownAutomaton : public AutomatonBase, public std::element<UnknownAutomaton, AutomatonBase::visitor_type> {
+class UnknownAutomaton : virtual public AutomatonBase, public std::element<UnknownAutomaton, AutomatonBase> {
 protected:
 	std::set<State> states;
 	std::set<State> initialStates;
diff --git a/alib2/src/factory/AutomatonFactory.cpp b/alib2/src/factory/AutomatonFactory.cpp
index 0a2c5b53641a351ee596c9a77b2fc876ae73aca5..62b8136a46a1641a1eb94bc350dcf14e4c213a7a 100644
--- a/alib2/src/factory/AutomatonFactory.cpp
+++ b/alib2/src/factory/AutomatonFactory.cpp
@@ -79,8 +79,7 @@ void AutomatonFactory::toStream(const AutomatonBase& automaton, std::ostream& ou
 }
 
 std::list<sax::Token> AutomatonFactory::compose(const AutomatonBase& automaton) {
-	AutomatonToXMLComposer composer;
-	return composer.compose(automaton);
+	return alib::ToXMLComposers::automatonComposer.compose(automaton);
 }
 
 } /* namespace automaton */
diff --git a/alib2/src/label/IntegerLabel.h b/alib2/src/label/IntegerLabel.h
index 6e41d55b81f1467d20ea61e5eb0d3107b43bf3f2..e18da16d5c40154479cfda6f221ac3e3ffbcd755 100644
--- a/alib2/src/label/IntegerLabel.h
+++ b/alib2/src/label/IntegerLabel.h
@@ -17,7 +17,7 @@ namespace label {
 /**
  * Represents symbol in an alphabet.
  */
-class IntegerLabel : public LabelBase, public std::element<IntegerLabel, LabelBase::visitor_type>{
+class IntegerLabel : virtual public LabelBase, public std::element<IntegerLabel, LabelBase>{
 protected:
 	int label;
 public:
diff --git a/alib2/src/label/Label.h b/alib2/src/label/Label.h
index 8ad0a161282413c40d4139295909d44f6a4e3cfc..608c44043320d0fccc48fa4b67baafee51aa05f5 100644
--- a/alib2/src/label/Label.h
+++ b/alib2/src/label/Label.h
@@ -16,7 +16,7 @@ namespace label {
 /**
  * Wrapper around automata.
  */
-class Label : public std::element<Label, std::visitor<Label> > {
+class Label {
 protected:
 	LabelBase* label;
 public:
diff --git a/alib2/src/label/LabelBase.h b/alib2/src/label/LabelBase.h
index 0e7a04b15f1c3511d7d168ca577b63067f905c71..09441357075eb81bb97088a74660dc483a8acd14 100644
--- a/alib2/src/label/LabelBase.h
+++ b/alib2/src/label/LabelBase.h
@@ -9,6 +9,7 @@
 #define LABEL_BASE_H_
 
 #include "../std/visitor.hpp"
+#include <iostream>
 
 namespace label {
 
@@ -18,7 +19,7 @@ class IntegerLabel;
 /**
  * Abstract base class for all automata.
  */
-class LabelBase : virtual public std::elementBase<std::visitor<StringLabel, IntegerLabel> > {
+class LabelBase : public std::elementBase<StringLabel, IntegerLabel> {
 public:
 	virtual LabelBase* clone() const = 0;
 
diff --git a/alib2/src/label/LabelToStringComposer.h b/alib2/src/label/LabelToStringComposer.h
index 414885ee9d6ad93857f378a77a4fe6eb296b5e37..4ca9954035a3d060568c914410211d22f934a263 100644
--- a/alib2/src/label/LabelToStringComposer.h
+++ b/alib2/src/label/LabelToStringComposer.h
@@ -18,7 +18,7 @@ namespace label {
 /**
  * This class contains methods to print XML representation of string to the output stream.
  */
-class LabelToStringComposer : public Label::visitor_type, public LabelBase::visitor_type {
+class LabelToStringComposer : public LabelBase::visitor_type {
 	void Visit(void*, const Label& label);
 	void Visit(void*, const IntegerLabel& label);
 	void Visit(void*, const StringLabel& label);
diff --git a/alib2/src/label/LabelToXMLComposer.cpp b/alib2/src/label/LabelToXMLComposer.cpp
index be4d4bd141666115ad2e2ed05abd56fbf5b95a66..229737171d1780d74ebdaa5e1afb3594f376f850 100644
--- a/alib2/src/label/LabelToXMLComposer.cpp
+++ b/alib2/src/label/LabelToXMLComposer.cpp
@@ -12,7 +12,7 @@
 
 namespace label {
 
-void LabelToXMLComposer::Visit(void* userData, const IntegerLabel& label) {
+void LabelToXMLComposer::Visit(void* userData, const IntegerLabel& label) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("IntegerLabel", sax::Token::START_ELEMENT));
@@ -20,7 +20,7 @@ void LabelToXMLComposer::Visit(void* userData, const IntegerLabel& label) {
 	out.push_back(sax::Token("IntegerLabel", sax::Token::END_ELEMENT));
 }
 
-void LabelToXMLComposer::Visit(void* userData, const StringLabel& label) {
+void LabelToXMLComposer::Visit(void* userData, const StringLabel& label) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("StringLabel", sax::Token::START_ELEMENT));
@@ -28,12 +28,12 @@ void LabelToXMLComposer::Visit(void* userData, const StringLabel& label) {
 	out.push_back(sax::Token("StringLabel", sax::Token::END_ELEMENT));
 }
 
-void LabelToXMLComposer::Visit(void* userData, const Label& label) {
+void LabelToXMLComposer::Visit(void* userData, const Label& label) const {
 	label.getLabel().Accept(userData, *this);
 
 }
 
-std::list<sax::Token> LabelToXMLComposer::compose(const Label& label) {
+std::list<sax::Token> LabelToXMLComposer::compose(const Label& label) const {
 	std::list<sax::Token> out;
 	Visit((void*) &out, label);
 	return out;
diff --git a/alib2/src/label/LabelToXMLComposer.h b/alib2/src/label/LabelToXMLComposer.h
index 4c86edeadb73cabb3135f9ac9f3d9cc1940614c9..740ce6910813da12b91fe58836a7cce750d5a3b0 100644
--- a/alib2/src/label/LabelToXMLComposer.h
+++ b/alib2/src/label/LabelToXMLComposer.h
@@ -17,10 +17,10 @@ namespace label {
 /**
  * This class contains methods to print XML representation of string to the output stream.
  */
-class LabelToXMLComposer : public Label::visitor_type, public LabelBase::visitor_type {
-	void Visit(void*, const Label& label);
-	void Visit(void*, const StringLabel& label);
-	void Visit(void*, const IntegerLabel& label);
+class LabelToXMLComposer : public LabelBase::const_visitor_type {
+	void Visit(void*, const Label& label) const;
+	void Visit(void*, const StringLabel& label) const;
+	void Visit(void*, const IntegerLabel& label) const;
 
 public:
 	/**
@@ -28,7 +28,7 @@ public:
 	 * @param string String to print
 	 * @param out output stream to which print the String
 	 */
-	std::list<sax::Token> compose(const Label& label);
+	std::list<sax::Token> compose(const Label& label) const;
 };
 
 } /* namespace label */
diff --git a/alib2/src/label/StringLabel.h b/alib2/src/label/StringLabel.h
index e1d14f17a1201cffe540898c3665dd59a676a369..925a79781fda3928c71f4e69e104c1f4f7353579 100644
--- a/alib2/src/label/StringLabel.h
+++ b/alib2/src/label/StringLabel.h
@@ -18,7 +18,7 @@ namespace label {
 /**
  * Represents symbol in an alphabet.
  */
-class StringLabel : public LabelBase, public std::element<StringLabel, LabelBase::visitor_type>{
+class StringLabel : virtual public LabelBase, public std::element<StringLabel, LabelBase>{
 protected:
 	std::string label;
 public:
diff --git a/alib2/src/regexp/Alternation.h b/alib2/src/regexp/Alternation.h
index 8d6b1498c25edfa5f17b64759e7ab97363d5a71c..26fb5df53860cac7d3c8c54b64a382c11b9fc968 100644
--- a/alib2/src/regexp/Alternation.h
+++ b/alib2/src/regexp/Alternation.h
@@ -17,7 +17,7 @@ namespace regexp {
  * Represents alternation operator in the regular expression. Contains list of RegExpElement
  * as operands of the operator.
  */
-class Alternation: public RegExpElement, public std::element<Alternation, RegExpElement::visitor_type> {
+class Alternation: virtual public RegExpElement, public std::element<Alternation, RegExpElement> {
 protected:
 	/**
 	 * @copydoc RegExpElement::clone() const
diff --git a/alib2/src/regexp/Concatenation.h b/alib2/src/regexp/Concatenation.h
index de3430d129ab9671f804fb0cd5f0a10571669335..7aad061167a961c7f0134355842b9f25cdbf474e 100644
--- a/alib2/src/regexp/Concatenation.h
+++ b/alib2/src/regexp/Concatenation.h
@@ -17,7 +17,7 @@ namespace regexp {
  * Represents concatenation operator in the regular expression. Contains list of RegExpElement
  * as operands of the operator.
  */
-class Concatenation: public RegExpElement, public std::element<Concatenation, RegExpElement::visitor_type> {
+class Concatenation: virtual public RegExpElement, public std::element<Concatenation, RegExpElement> {
 protected:
 	/**
 	 * @copydoc RegExpElement::clone() const
diff --git a/alib2/src/regexp/Iteration.h b/alib2/src/regexp/Iteration.h
index 18d226158c1d5cddb8ca4f55e236cc7809f8ea32..fb3ef21d3f14e68a80018bef5b7be32535873820 100644
--- a/alib2/src/regexp/Iteration.h
+++ b/alib2/src/regexp/Iteration.h
@@ -17,7 +17,7 @@ namespace regexp {
  * Represents iteration operator in the regular expression. Contains one RegExpElement
  * as operand.
  */
-class Iteration: public RegExpElement, public std::element<Iteration, RegExpElement::visitor_type> {
+class Iteration: virtual public RegExpElement, public std::element<Iteration, RegExpElement> {
 protected:
 	RegExpElement* element;
 
diff --git a/alib2/src/regexp/RegExp.h b/alib2/src/regexp/RegExp.h
index f213e33c20f49a4e00b0b0f154a31ef64a5c8594..32b55891cc6bd0fa980bccd342a3bfea4f3b87b0 100644
--- a/alib2/src/regexp/RegExp.h
+++ b/alib2/src/regexp/RegExp.h
@@ -23,7 +23,7 @@ class RegExpElement;
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of RegExpElement.
  */
-class RegExp : public std::element<RegExp, std::visitor<RegExp> > {
+class RegExp {
 protected:
 	RegExpElement* regExp;
 	
diff --git a/alib2/src/regexp/RegExpElement.h b/alib2/src/regexp/RegExpElement.h
index 604e546e2542b2f89533eab6d777383e56cf4ba1..7aca59838f6a28e5272773dc5e4a714fbf53cc93 100644
--- a/alib2/src/regexp/RegExpElement.h
+++ b/alib2/src/regexp/RegExpElement.h
@@ -27,7 +27,7 @@ class RegExpEpsilon;
 /**
  * Abstract class representing element in the regular expression. Can be operator or symbol.
  */
-class RegExpElement : virtual public std::elementBase<std::visitor<Alternation, Concatenation, Iteration, RegExpSymbol, RegExpEmpty, RegExpEpsilon> > {
+class RegExpElement : virtual public std::elementBase<Alternation, Concatenation, Iteration, RegExpSymbol, RegExpEmpty, RegExpEpsilon> {
 protected:
 	/* 
 	 * Parent regexp contanining this instance of RegExpElement
diff --git a/alib2/src/regexp/RegExpEmpty.h b/alib2/src/regexp/RegExpEmpty.h
index 64b28a08aadad7ee7e8f92ab6ee600277392b381..bd5466f445f832c92470ce967ca826772ff97d47 100644
--- a/alib2/src/regexp/RegExpEmpty.h
+++ b/alib2/src/regexp/RegExpEmpty.h
@@ -15,7 +15,7 @@ namespace regexp {
 /**
  * Represents empty regular expression in the regular expression.
  */
-class RegExpEmpty: public RegExpElement, public std::element<RegExpEmpty, RegExpElement::visitor_type> {
+class RegExpEmpty: virtual public RegExpElement, public std::element<RegExpEmpty, RegExpElement> {
 protected:
 	/**
 	 * @copydoc RegExpElement::clone() const
diff --git a/alib2/src/regexp/RegExpEpsilon.h b/alib2/src/regexp/RegExpEpsilon.h
index f36f3f25e48a7fa3380f2a65c3310950b7b61c4d..bb4b7406a30c49a1bf8fec920576c4e1fdb3c33f 100644
--- a/alib2/src/regexp/RegExpEpsilon.h
+++ b/alib2/src/regexp/RegExpEpsilon.h
@@ -15,7 +15,7 @@ namespace regexp {
 /**
  * Represents epsilon in the regular expression.
  */
-class RegExpEpsilon: public RegExpElement, public std::element<RegExpEpsilon, RegExpElement::visitor_type> {
+class RegExpEpsilon: virtual public RegExpElement, public std::element<RegExpEpsilon, RegExpElement> {
 protected:
 	/**
 	 * @copydoc RegExpElement::clone() const
diff --git a/alib2/src/regexp/RegExpSymbol.h b/alib2/src/regexp/RegExpSymbol.h
index 8f8d25e8a7423eee023ff208ac6ed55a80fe9ab3..b4c9e00d1fe5108339fd1bf2dae439f080b6fc2a 100644
--- a/alib2/src/regexp/RegExpSymbol.h
+++ b/alib2/src/regexp/RegExpSymbol.h
@@ -17,7 +17,7 @@ namespace regexp {
 /**
  * Represents symbol in the regular expression. Contains name of the symbol.
  */
-class RegExpSymbol : public RegExpElement, public std::element<RegExpSymbol, RegExpElement::visitor_type> {
+class RegExpSymbol : virtual public RegExpElement, public std::element<RegExpSymbol, RegExpElement> {
 protected:
 	alphabet::Symbol symbol;
 
diff --git a/alib2/src/regexp/RegExpToStringComposer.cpp b/alib2/src/regexp/RegExpToStringComposer.cpp
index ac09f0a0627c0d5674e8b141e769d93baaa1ec3c..0e610d7548ea30e51f4edfbc02f2637bbe1c8f1a 100644
--- a/alib2/src/regexp/RegExpToStringComposer.cpp
+++ b/alib2/src/regexp/RegExpToStringComposer.cpp
@@ -12,11 +12,7 @@
 namespace regexp {
 
 void RegExpToStringComposer::Visit(void* userData, const RegExp& regexp) {
-	regexp.Accept(userData, *this);
-}
-
-void RegExpToStringComposer::Visit(void* userData, const RegExp::element_type& regexp) {
-	regexp.Accept(userData, *this);
+	regexp.getRegExp().Accept(userData, *this);
 }
 
 void RegExpToStringComposer::Visit(void* userData, const RegExpElement::element_type& element) {
diff --git a/alib2/src/regexp/RegExpToStringComposer.h b/alib2/src/regexp/RegExpToStringComposer.h
index e7e2ce39ada64bc1d7804d4c5a1d9082b05b59ce..4eba2a2d49a62d4b3995eaef35f3652e6ce56520 100644
--- a/alib2/src/regexp/RegExpToStringComposer.h
+++ b/alib2/src/regexp/RegExpToStringComposer.h
@@ -14,7 +14,7 @@
 
 namespace regexp {
 
-class RegExpToStringComposer : public RegExp::visitor_type, public RegExpElement::visitor_type {
+class RegExpToStringComposer : public RegExpElement::visitor_type {
 	void Visit(void*, const Alternation& alternation);
 	void Visit(void*, const Concatenation& concatenation);
 	void Visit(void*, const Iteration& iteration);
@@ -27,7 +27,6 @@ class RegExpToStringComposer : public RegExp::visitor_type, public RegExpElement
 	
 	void Visit(void*, const RegExp& empty);
 	
-	void Visit(void*, const RegExp::element_type& regexp);
 public:
 	/**
 	 * Composes string representation of RegExp.
diff --git a/alib2/src/regexp/RegExpToXMLComposer.cpp b/alib2/src/regexp/RegExpToXMLComposer.cpp
index adb9e5314633cf588f18bca8a9d244eff4203030..3f5245d364e3ef58f7503be36e48156ca79b5860 100644
--- a/alib2/src/regexp/RegExpToXMLComposer.cpp
+++ b/alib2/src/regexp/RegExpToXMLComposer.cpp
@@ -9,7 +9,7 @@
 
 namespace regexp {
 
-void RegExpToXMLComposer::Visit(void* userData, const RegExp& regexp) {
+void RegExpToXMLComposer::Visit(void* userData, const RegExp& regexp) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("regexp", sax::Token::START_ELEMENT));
@@ -26,15 +26,11 @@ void RegExpToXMLComposer::Visit(void* userData, const RegExp& regexp) {
 	out.push_back(sax::Token("regexp", sax::Token::END_ELEMENT));
 }
 
-void RegExpToXMLComposer::Visit(void* userData, const RegExp::element_type& regexp) {
-	regexp.Accept(userData, *this);
-}
-
-void RegExpToXMLComposer::Visit(void* userData, const RegExpElement::element_type& element) {
+void RegExpToXMLComposer::Visit(void* userData, const RegExpElement::element_type& element) const {
 	element.Accept(userData, *this);
 }
 
-void RegExpToXMLComposer::Visit(void* userData, const Alternation& alternation) {
+void RegExpToXMLComposer::Visit(void* userData, const Alternation& alternation) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("alternation", sax::Token::START_ELEMENT));
@@ -45,7 +41,7 @@ void RegExpToXMLComposer::Visit(void* userData, const Alternation& alternation)
 	out.push_back(sax::Token("alternation", sax::Token::END_ELEMENT));
 }
 
-void RegExpToXMLComposer::Visit(void* userData, const Concatenation& concatenation) {
+void RegExpToXMLComposer::Visit(void* userData, const Concatenation& concatenation) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("concatenation", sax::Token::START_ELEMENT));
@@ -57,7 +53,7 @@ void RegExpToXMLComposer::Visit(void* userData, const Concatenation& concatenati
 
 }
 
-void RegExpToXMLComposer::Visit(void* userData, const Iteration& iteration) {
+void RegExpToXMLComposer::Visit(void* userData, const Iteration& iteration) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("iteration", sax::Token::START_ELEMENT));
@@ -66,7 +62,7 @@ void RegExpToXMLComposer::Visit(void* userData, const Iteration& iteration) {
 	out.push_back(sax::Token("iteration", sax::Token::END_ELEMENT));
 }
 
-void RegExpToXMLComposer::Visit(void* userData, const RegExpSymbol& symbol) {
+void RegExpToXMLComposer::Visit(void* userData, const RegExpSymbol& symbol) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("symbol", sax::Token::START_ELEMENT));
@@ -74,23 +70,23 @@ void RegExpToXMLComposer::Visit(void* userData, const RegExpSymbol& symbol) {
 	out.push_back(sax::Token("symbol", sax::Token::END_ELEMENT));
 }
 
-void RegExpToXMLComposer::Visit(void* userData, const RegExpEpsilon&) {
+void RegExpToXMLComposer::Visit(void* userData, const RegExpEpsilon&) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("epsilon", sax::Token::START_ELEMENT));
 	out.push_back(sax::Token("epsilon", sax::Token::END_ELEMENT));
 }
 
-void RegExpToXMLComposer::Visit(void* userData, const RegExpEmpty&) {
+void RegExpToXMLComposer::Visit(void* userData, const RegExpEmpty&) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("empty", sax::Token::START_ELEMENT));
 	out.push_back(sax::Token("empty", sax::Token::END_ELEMENT));
 }
 
-std::list<sax::Token> RegExpToXMLComposer::compose(const RegExp& regexp) {
+std::list<sax::Token> RegExpToXMLComposer::compose(const RegExp& regexp) const {
 	std::list<sax::Token> out;
-	regexp.Accept((void*) &out, *this);
+	Visit((void*) &out, regexp);
 	return out;
 }
 
diff --git a/alib2/src/regexp/RegExpToXMLComposer.h b/alib2/src/regexp/RegExpToXMLComposer.h
index b6ed8cdc011f74c3c04e03659f037cc1a96d59f8..4a8de9cb3f67989172d7d527e69b43f485cba804 100644
--- a/alib2/src/regexp/RegExpToXMLComposer.h
+++ b/alib2/src/regexp/RegExpToXMLComposer.h
@@ -18,20 +18,18 @@ namespace regexp {
 /**
  * This class contains methods to print XML representation of regular expression to the output stream.
  */
-class RegExpToXMLComposer : public RegExp::visitor_type, public RegExpElement::visitor_type {
-	void Visit(void*, const Alternation& alternation);
-	void Visit(void*, const Concatenation& concatenation);
-	void Visit(void*, const Iteration& iteration);
-	void Visit(void*, const RegExpSymbol& symbol);
-	void Visit(void*, const RegExpEpsilon& epsilon);
-	void Visit(void*, const RegExpEmpty& empty);
+class RegExpToXMLComposer : public RegExpElement::const_visitor_type {
+	void Visit(void*, const Alternation& alternation) const;
+	void Visit(void*, const Concatenation& concatenation) const;
+	void Visit(void*, const Iteration& iteration) const;
+	void Visit(void*, const RegExpSymbol& symbol) const;
+	void Visit(void*, const RegExpEpsilon& epsilon) const;
+	void Visit(void*, const RegExpEmpty& empty) const;
 	
-	void Visit(void*, const RegExpElement::element_type& element);
+	void Visit(void*, const RegExpElement::element_type& element) const;
 	
 	
-	void Visit(void*, const RegExp& empty);
-	
-	void Visit(void*, const RegExp::element_type& regexp);
+	void Visit(void*, const RegExp& empty) const;
 
 public:
 	/**
@@ -39,7 +37,7 @@ public:
 	 * @param regexp RegExp to print
 	 * @returns list of xml tokens.
 	 */
-	std::list<sax::Token> compose(const RegExp& regexp);
+	std::list<sax::Token> compose(const RegExp& regexp) const;
 };
 
 } /* namespace regexp */
diff --git a/alib2/src/std/visitor.hpp b/alib2/src/std/visitor.hpp
index e2efd9813af445554c50860b5e17784d8242b3bb..ded39b2bdc052c4216aa71fcee5d11450be5d88a 100644
--- a/alib2/src/std/visitor.hpp
+++ b/alib2/src/std/visitor.hpp
@@ -9,15 +9,13 @@
 #ifndef VISITOR_H_
 #define VISITOR_H_
 
-#include <tuple>
-
 namespace std {
 
 // Visitor template declaration
 template<typename... Types>
 class visitor;
 
-// specialization for single type    
+// specialization for single type
 template<typename T>
 class visitor<T> {
 public:
@@ -34,23 +32,49 @@ public:
     virtual void Visit(void* userData, const T & visitable) = 0;
 };
 
-template<typename VisitorType>
+// Visitor template declaration
+template<typename... Types>
+class const_visitor;
+
+// specialization for single type
+template<typename T>
+class const_visitor<T> {
+public:
+    virtual void Visit(void* userData, const T & visitable) const = 0;
+};
+
+// specialization for multiple types
+template<typename T, typename... Types>
+class const_visitor<T, Types...> : public const_visitor<Types...> {
+public:
+    // promote the function(s) from the base class
+    using const_visitor<Types...>::Visit;
+
+    virtual void Visit(void* userData, const T & visitable) const = 0;
+};
+
+template<typename... Types>
 class elementBase {
 public:
-    typedef VisitorType visitor_type;
+    typedef visitor<Types...> visitor_type;
+    typedef const_visitor<Types...> const_visitor_type;
     typedef elementBase element_type;
 
-    virtual void Accept(void* userData, VisitorType& visitor) const = 0;
+    virtual void Accept(void* userData, visitor<Types...>& visitor) const = 0;
+    virtual void Accept(void* userData, const const_visitor<Types...>& visitor) const = 0;
 };
 
-template<typename Derived, typename VisitorType>
-class element : virtual public elementBase<VisitorType> {
+template<typename Derived, typename Base>
+class element : virtual public Base {
 public:
-    virtual void Accept(void* userData, VisitorType& visitor) const {
+    virtual void Accept(void* userData, typename Base::visitor_type& visitor) const {
+        visitor.Visit(userData, static_cast<const Derived&>(*this));
+    }
+    virtual void Accept(void* userData, const typename Base::const_visitor_type& visitor) const {
         visitor.Visit(userData, static_cast<const Derived&>(*this));
     }
 };
 
 } /* namespace std */
 
-#endif /* VISITOR_H_ */
\ No newline at end of file
+#endif /* VISITOR_H_ */
diff --git a/alib2/src/string/CyclicString.h b/alib2/src/string/CyclicString.h
index 2137aaaf76812b39177622fac57e0aa2342966d8..2444eaa70e5b3acad22785214594a2f573725cf4 100644
--- a/alib2/src/string/CyclicString.h
+++ b/alib2/src/string/CyclicString.h
@@ -22,7 +22,7 @@ namespace string {
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of CyclicStringElement.
  */
-class CyclicString : public StringBase, public std::element<CyclicString, StringBase::visitor_type> {
+class CyclicString : virtual public StringBase, public std::element<CyclicString, StringBase> {
 protected:
 	std::vector<alphabet::Symbol> m_Data;
 
diff --git a/alib2/src/string/Epsilon.h b/alib2/src/string/Epsilon.h
index 7fba33014fff6cb47f14e5a1c295f04374770611..2d42d13dbb6f5faf4db7b3078b0f3b2d45d69f0a 100644
--- a/alib2/src/string/Epsilon.h
+++ b/alib2/src/string/Epsilon.h
@@ -22,7 +22,7 @@ namespace string {
  * Represents epsilon. Regular expression is stored
  * as a tree of EpsilonElement.
  */
-class Epsilon : public StringBase, public std::element<Epsilon, StringBase::visitor_type> {
+class Epsilon : virtual public StringBase, public std::element<Epsilon, StringBase> {
 protected:
 
 	virtual bool testSymbol( const alphabet::Symbol & symbol ) const;
diff --git a/alib2/src/string/LinearString.h b/alib2/src/string/LinearString.h
index a3969c2d35f178311201c6b709b70cec8622d92b..4fb4b0ffdce78cf9da8a0fd2ceedcbd90ac96f7e 100644
--- a/alib2/src/string/LinearString.h
+++ b/alib2/src/string/LinearString.h
@@ -22,7 +22,7 @@ namespace string {
  * Represents regular expression parsed from the XML. Regular expression is stored
  * as a tree of LinearStringElement.
  */
-class LinearString : public StringBase, public std::element<LinearString, StringBase::visitor_type> {
+class LinearString : virtual public StringBase, public std::element<LinearString, StringBase> {
 protected:
 	std::vector<alphabet::Symbol> m_Data;
 
diff --git a/alib2/src/string/String.h b/alib2/src/string/String.h
index b50a54acddc6a722f7b1761414c1a2033570e1d1..668f1994f6379b0b835a9590f3e6f4eee64d2ccc 100644
--- a/alib2/src/string/String.h
+++ b/alib2/src/string/String.h
@@ -20,7 +20,7 @@ class StringBase;
 /**
  * Wrapper around strings.
  */
-class String : public std::element<String, std::visitor<String> > {
+class String {
 protected:
 	StringBase* string;
 	std::set<alphabet::Symbol> alphabet;
diff --git a/alib2/src/string/StringBase.h b/alib2/src/string/StringBase.h
index 5d299f5a36c5afaed8407bfb99e307b97236e9aa..45885a3891034601fed1a4772067be872208704c 100644
--- a/alib2/src/string/StringBase.h
+++ b/alib2/src/string/StringBase.h
@@ -25,7 +25,7 @@ class Epsilon;
 /**
  * Represents string in an alphabet.
  */
-class StringBase : virtual public std::elementBase<std::visitor<Epsilon, LinearString, CyclicString> > {
+class StringBase : virtual public std::elementBase<Epsilon, LinearString, CyclicString> {
 protected:
 	const String* parentString;
 
diff --git a/alib2/src/string/StringToStringComposer.h b/alib2/src/string/StringToStringComposer.h
index c2375c125fe98d769df0dcade8d070732ebe13a8..223b221d1118a61cd69ceb8e0e8043b55375f877 100644
--- a/alib2/src/string/StringToStringComposer.h
+++ b/alib2/src/string/StringToStringComposer.h
@@ -18,7 +18,7 @@ namespace string {
 /**
  * This class contains methods to print XML representation of string to the output stream.
  */
-class StringToStringComposer : public String::visitor_type, public StringBase::visitor_type {
+class StringToStringComposer : public StringBase::visitor_type {
 	void Visit(void*, const alphabet::Symbol& symbol);
 	void Visit(void*, const String& string);
 	void Visit(void*, const LinearString& string);
diff --git a/alib2/src/string/StringToXMLComposer.cpp b/alib2/src/string/StringToXMLComposer.cpp
index e37cebd0f25a6bc91eebc687311a3cd660f5a343..480825fb05724657462090527e3051e31c17a6e1 100644
--- a/alib2/src/string/StringToXMLComposer.cpp
+++ b/alib2/src/string/StringToXMLComposer.cpp
@@ -12,7 +12,7 @@
 
 namespace string {
 
-void StringToXMLComposer::Visit(void* userData, const alphabet::Symbol& symbol) {
+void StringToXMLComposer::Visit(void* userData, const alphabet::Symbol& symbol) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("symbol", sax::Token::START_ELEMENT));
@@ -20,14 +20,14 @@ void StringToXMLComposer::Visit(void* userData, const alphabet::Symbol& symbol)
 	out.push_back(sax::Token("symbol", sax::Token::END_ELEMENT));
 }
 
-void StringToXMLComposer::Visit(void* userData, const Epsilon&) {
+void StringToXMLComposer::Visit(void* userData, const Epsilon&) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("Epsilon", sax::Token::START_ELEMENT));
 	out.push_back(sax::Token("Epsilon", sax::Token::END_ELEMENT));
 }
 
-void StringToXMLComposer::Visit(void* userData, const CyclicString& string) {
+void StringToXMLComposer::Visit(void* userData, const CyclicString& string) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("CyclicString", sax::Token::START_ELEMENT));
@@ -37,7 +37,7 @@ void StringToXMLComposer::Visit(void* userData, const CyclicString& string) {
 	out.push_back(sax::Token("CyclicString", sax::Token::END_ELEMENT));
 }
 
-void StringToXMLComposer::Visit(void* userData, const LinearString& string) {
+void StringToXMLComposer::Visit(void* userData, const LinearString& string) const {
 	std::list<sax::Token> &out = *((std::list<sax::Token>*) userData);
 
 	out.push_back(sax::Token("LinearString", sax::Token::START_ELEMENT));
@@ -47,12 +47,12 @@ void StringToXMLComposer::Visit(void* userData, const LinearString& string) {
 	out.push_back(sax::Token("LinearString", sax::Token::END_ELEMENT));
 }
 
-void StringToXMLComposer::Visit(void* userData, const String& string) {
+void StringToXMLComposer::Visit(void* userData, const String& string) const {
 	string.getString().Accept(userData, *this);
 
 }
 
-std::list<sax::Token> StringToXMLComposer::compose(const String& string) {
+std::list<sax::Token> StringToXMLComposer::compose(const String& string) const {
 	std::list<sax::Token> out;
 	Visit((void*) &out, string);
 	return out;
diff --git a/alib2/src/string/StringToXMLComposer.h b/alib2/src/string/StringToXMLComposer.h
index e8b245c4cdf14fd1ae69dd23efbd2b280307be87..548c3467e8d7ba3627bca4a70a4839d4b302f16b 100644
--- a/alib2/src/string/StringToXMLComposer.h
+++ b/alib2/src/string/StringToXMLComposer.h
@@ -18,12 +18,12 @@ namespace string {
 /**
  * This class contains methods to print XML representation of string to the output stream.
  */
-class StringToXMLComposer : public String::visitor_type, public StringBase::visitor_type {
-	void Visit(void*, const alphabet::Symbol& symbol);
-	void Visit(void*, const String& string);
-	void Visit(void*, const LinearString& string);
-	void Visit(void*, const CyclicString& string);
-	void Visit(void*, const Epsilon& string);
+class StringToXMLComposer : public StringBase::const_visitor_type {
+	void Visit(void*, const alphabet::Symbol& symbol) const;
+	void Visit(void*, const String& string) const;
+	void Visit(void*, const LinearString& string) const;
+	void Visit(void*, const CyclicString& string) const;
+	void Visit(void*, const Epsilon& string) const;
 
 public:
 	/**
@@ -31,7 +31,7 @@ public:
 	 * @param string String to print
 	 * @param out output stream to which print the String
 	 */
-	std::list<sax::Token> compose(const String& string);
+	std::list<sax::Token> compose(const String& string) const;
 };
 
 } /* namespace string */