diff --git a/alib2/src/automaton/AutomatonFromXMLParser.cpp b/alib2/src/automaton/AutomatonFromXMLParser.cpp
index 0c2c1055b9dbd1f798b0219234973388bc001dc5..1909162229c7a4f095a0bafcb85f383e07c124df 100644
--- a/alib2/src/automaton/AutomatonFromXMLParser.cpp
+++ b/alib2/src/automaton/AutomatonFromXMLParser.cpp
@@ -8,6 +8,7 @@
 #include "AutomatonFromXMLParser.h"
 
 #include "../sax/ParserException.h"
+#include "../alphabet/Blank.h"
 
 namespace automaton {
 
@@ -16,10 +17,8 @@ UnknownAutomaton AutomatonFromXMLParser::parse(std::list<sax::Token> &input) {
 
 	popToken(input, sax::Token::START_ELEMENT, "automaton");
 
-	while (true) {
-		if (isToken(input, sax::Token::END_ELEMENT, "automaton")) {
-			break;
-		} else if (isToken(input, sax::Token::START_ELEMENT, "states")) {
+	while (isTokenType(input, sax::Token::START_ELEMENT)) {
+		if (isToken(input, sax::Token::START_ELEMENT, "states")) {
 			parseStates(input, automaton);
 		} else if (isToken(input, sax::Token::START_ELEMENT, "inputAlphabet")) {
 			parseInputAlphabet(input, automaton);
@@ -105,12 +104,7 @@ void AutomatonFromXMLParser::parseTapeAlphabet(std::list<sax::Token>& input, Unk
 
 void AutomatonFromXMLParser::parseBlankSymbol(std::list<sax::Token>& input, UnknownAutomaton& automaton) {
 	popToken(input, sax::Token::START_ELEMENT, "blankSymbol");
-	if (input.front().getType() == sax::Token::CHARACTER) {
-		automaton.setBlankSymbol(alphabet::Symbol(input.front().getData()));
-		input.pop_front();
-	} else {
-		throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front());
-	}
+	automaton.setBlankSymbol(parseSymbol(input, "symbol"));
 	popToken(input, sax::Token::END_ELEMENT, "blankSymbol");
 }
 
@@ -141,48 +135,44 @@ void AutomatonFromXMLParser::parsePush(std::list<sax::Token>& input, UnknownTran
 State AutomatonFromXMLParser::parseState(std::list<sax::Token> &input, std::string tagName) {
 	popToken(input, sax::Token::START_ELEMENT, tagName);
 
-	if (input.front().getType() == sax::Token::CHARACTER) {
-		State state(input.front().getData());
-		input.pop_front();
-		popToken(input, sax::Token::END_ELEMENT, tagName);
-		return state;
-	} else {
-		throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front());
-	}
+	State state(popTokenData(input, sax::Token::CHARACTER));
+	popToken(input, sax::Token::END_ELEMENT, tagName);
+	return state;
 }
 
 alphabet::Symbol AutomatonFromXMLParser::parseSymbol(std::list<sax::Token>& input, std::string tagName) {
 	popToken(input, sax::Token::START_ELEMENT, tagName);
 
-	if (input.front().getType() == sax::Token::CHARACTER) {
-		alphabet::Symbol symbol(input.front().getData());
-		input.pop_front();
-		popToken(input, sax::Token::END_ELEMENT, tagName);
-		return symbol;
-	} else if(isToken(input, sax::Token::END_ELEMENT, tagName)){
+	alphabet::Symbol result("");
+	if (isTokenType(input, sax::Token::CHARACTER)) {
+		result = alphabet::Symbol(popTokenData(input, sax::Token::CHARACTER));
+	} else if(isToken(input, sax::Token::START_ELEMENT, "epsilon")) {
+		result = alphabet::Symbol(""); //TODO predelat na opravdovy epsilon
 		input.pop_front();
-		return alphabet::Symbol("");
-	} else if(isToken(input, sax::Token::START_ELEMENT, "eps")) {
+		popToken(input, sax::Token::END_ELEMENT,"epsilon");
+	} else if (isToken(input, sax::Token::START_ELEMENT, "blank")) {
+		result = alphabet::Blank();
 		input.pop_front();
-		popToken(input, sax::Token::END_ELEMENT,"eps");
-		popToken(input, sax::Token::END_ELEMENT, tagName);
-		return alphabet::Symbol("");
+		popToken(input, sax::Token::END_ELEMENT,"blank");
 	} else {
 		throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front());
 	}
+	popToken(input, sax::Token::END_ELEMENT, tagName);
+	return result;
 }
 
 Shift AutomatonFromXMLParser::parseShift(std::list<sax::Token>& input) {
 	Shift shift;
 
 	popToken(input, sax::Token::START_ELEMENT, "shift");
-	if (input.front().getType() == sax::Token::CHARACTER) {
-		if (input.front().getData() == "left")
-			shift = LEFT;
-		if (input.front().getData() == "right")
-			shift = RIGHT;
-		if (input.front().getData() == "none")
-			shift = NONE;
+	if (isToken(input, sax::Token::CHARACTER, "left")) {
+		shift = LEFT;
+		input.pop_front();
+	} else if (isToken(input, sax::Token::CHARACTER, "right")) {
+		shift = RIGHT;
+		input.pop_front();
+	} else if (isToken(input, sax::Token::CHARACTER, "none")) {
+		shift = NONE;
 		input.pop_front();
 	} else {
 		throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front());
@@ -190,17 +180,14 @@ Shift AutomatonFromXMLParser::parseShift(std::list<sax::Token>& input) {
 	popToken(input, sax::Token::END_ELEMENT, "shift");
 
 	return shift;
-
 }
 
 UnknownTransition AutomatonFromXMLParser::parseTransition(std::list<sax::Token>& input) {
 	UnknownTransition transition;
 
 	popToken(input, sax::Token::START_ELEMENT, "transition");
-	while (true) {
-		if (isToken(input, sax::Token::END_ELEMENT, "transition")) {
-			break;
-		} else if (isToken(input, sax::Token::START_ELEMENT, "from")) {
+	while (isTokenType(input, sax::Token::START_ELEMENT)) {
+		if (isToken(input, sax::Token::START_ELEMENT, "from")) {
 			transition.setFrom(parseState(input, "from"));
 		} else if (isToken(input, sax::Token::START_ELEMENT, "input")) {
 			transition.setInput(parseSymbol(input, "input"));
@@ -224,3 +211,4 @@ UnknownTransition AutomatonFromXMLParser::parseTransition(std::list<sax::Token>&
 }
 
 } /* namespace automaton */
+
diff --git a/alib2/src/regexp/RegExpFromXMLParser.cpp b/alib2/src/regexp/RegExpFromXMLParser.cpp
index bd22da901c80d37b85a4c7c14537723c8f7a6262..3769fe004e1324bd30ec74ebec1a38fe6009e0bd 100644
--- a/alib2/src/regexp/RegExpFromXMLParser.cpp
+++ b/alib2/src/regexp/RegExpFromXMLParser.cpp
@@ -16,10 +16,11 @@ RegExp RegExpFromXMLParser::parse(std::list<sax::Token>& input) {
 	RegExp regexp;
 	parseAlphabet(input, regexp);
 	
-	RegExpElement* element = parseElement(input);
-	if(!element) throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front());
-	regexp.setRegExp(std::move(*element));
-	delete element;
+	if(isTokenType(input, sax::Token::START_ELEMENT)) {
+		RegExpElement* element = parseElement(input);
+		regexp.setRegExp(std::move(*element));
+		delete element;
+	}
 	
 	popToken(input, sax::Token::END_ELEMENT, "regexp");
 
@@ -66,9 +67,8 @@ Alternation* RegExpFromXMLParser::parseAlternation(std::list<sax::Token>& input)
 	delete element1;
 	delete element2;
 	
-	while (true) {
+	while (isTokenType(input, sax::Token::START_ELEMENT)) {
 		RegExpElement* element = parseElement(input);
-		if(!element) break;
 		alternation->appendElement(std::move(*element));
 		delete element;
 	}
@@ -89,9 +89,8 @@ Concatenation* RegExpFromXMLParser::parseConcatenation(std::list<sax::Token>& in
 	delete element1;
 	delete element2;
 	
-	while (true) {
+	while (isTokenType(input, sax::Token::START_ELEMENT)) {
 		RegExpElement* element = parseElement(input);
-		if(!element) break;
 		concatenation->appendElement(std::move(*element));
 		delete element;
 	}
@@ -135,26 +134,9 @@ template <class T>
 T* RegExpFromXMLParser::parseSymbol(std::list<sax::Token>& input) {
 	popToken(input, sax::Token::START_ELEMENT, "symbol");
 
-	if (input.front().getType() == sax::Token::CHARACTER) {
-		T* symbol = new T(input.front().getData());
-		input.pop_front();
-		popToken(input, sax::Token::END_ELEMENT, "symbol");
-		return symbol;
-	} else {
-		throw sax::ParserException(sax::Token("", sax::Token::CHARACTER), input.front());
-	}
-}
-
-bool RegExpFromXMLParser::isToken(std::list<sax::Token>& input, sax::Token::TokenType type, std::string data) {
-	return input.front().getType() == type && input.front().getData() == data;
-}
-
-void RegExpFromXMLParser::popToken(std::list<sax::Token>& input, sax::Token::TokenType type, std::string data) {
-	if (isToken(input, type, data)) {
-		input.pop_front();
-	} else {
-		throw sax::ParserException(sax::Token(data, type), input.front());
-	}
+	T* symbol = new T(popTokenData(input, sax::Token::CHARACTER));
+	popToken(input, sax::Token::END_ELEMENT, "symbol");
+	return symbol;
 }
 
 } /* namespace regexp */
diff --git a/alib2/src/regexp/RegExpFromXMLParser.h b/alib2/src/regexp/RegExpFromXMLParser.h
index 2a45f1ace8c55da13c8f5272a8294796b41eebe2..f1d29032034747163afc8241545d62a1065a8dc8 100644
--- a/alib2/src/regexp/RegExpFromXMLParser.h
+++ b/alib2/src/regexp/RegExpFromXMLParser.h
@@ -8,6 +8,7 @@
 #ifndef REG_EXP_FROM_XML_PARSER_H_
 #define REG_EXP_FROM_XML_PARSER_H_
 
+#include "../sax/FromXMLParser.h"
 #include "RegExp.h"
 #include "RegExpElements.h"
 #include "../sax/Token.h"
@@ -18,7 +19,7 @@ namespace regexp {
 /**
  * Parser used to get RegExp from XML parsed into list of tokens.
  */
-class RegExpFromXMLParser {
+class RegExpFromXMLParser : public sax::FromXMLParser {
 	void parseAlphabet(std::list<sax::Token>& input, RegExp& regexp);
   
 	RegExpElement* parseElement(std::list<sax::Token>& input);
@@ -29,8 +30,6 @@ class RegExpFromXMLParser {
 	Iteration* parseIteration(std::list<sax::Token> &input);
 	Alternation* parseAlternation(std::list<sax::Token> &input);
 	Concatenation* parseConcatenation(std::list<sax::Token> &input);
-	bool isToken(std::list<sax::Token> &input, sax::Token::TokenType type, std::string data);
-	void popToken(std::list<sax::Token> &input, sax::Token::TokenType type, std::string data);
 
 public:
 	/**
diff --git a/alib2/src/sax/FromXMLParser.cpp b/alib2/src/sax/FromXMLParser.cpp
index 782b395a94a84dcb15680ddbeed76f2e32fd0c26..0f6c6e76b6a7810f5ef3d496ee32eb53cb4c4d98 100644
--- a/alib2/src/sax/FromXMLParser.cpp
+++ b/alib2/src/sax/FromXMLParser.cpp
@@ -26,7 +26,7 @@ void FromXMLParser::popToken(std::list<Token>& input, Token::TokenType type, std
 	}
 }
 
-std::string FromXMLParser::popTokenType(std::list<Token>& input, Token::TokenType type) {
+std::string FromXMLParser::popTokenData(std::list<Token>& input, Token::TokenType type) {
 	if(isTokenType(input, type)) {
 		std::string result = input.front().getData();
 		input.pop_front();
diff --git a/alib2/src/sax/FromXMLParser.h b/alib2/src/sax/FromXMLParser.h
index d6d55b0b4db577af570926f630eaedb9dd21fd02..c6f3c6c20ad1625d077c8c667aff437a81f1aca4 100644
--- a/alib2/src/sax/FromXMLParser.h
+++ b/alib2/src/sax/FromXMLParser.h
@@ -21,7 +21,7 @@ protected:
 	bool isToken(std::list<Token> &input, Token::TokenType type, std::string data);
 	bool isTokenType(std::list<Token>& input, Token::TokenType type);
 	void popToken(std::list<Token> &input, Token::TokenType type, std::string data);
-	std::string popTokenType(std::list<Token>& input, Token::TokenType type);
+	std::string popTokenData(std::list<Token>& input, Token::TokenType type);
 
 };
 
diff --git a/alib2/src/string/StringFromXMLParser.cpp b/alib2/src/string/StringFromXMLParser.cpp
index a879a16ca4c5ebdd17546d0431b81bb248843986..487f6267d9a595283e05468c2db92b24ab88536a 100644
--- a/alib2/src/string/StringFromXMLParser.cpp
+++ b/alib2/src/string/StringFromXMLParser.cpp
@@ -45,16 +45,4 @@ alphabet::Symbol StringFromXMLParser::parseSymbol(std::list<sax::Token>& input)
 	}
 }
 
-bool StringFromXMLParser::isToken(std::list<sax::Token>& input, sax::Token::TokenType type, std::string data) {
-	return input.front().getType() == type && input.front().getData() == data;
-}
-
-void StringFromXMLParser::popToken(std::list<sax::Token>& input, sax::Token::TokenType type, std::string data) {
-	if (isToken(input, type, data)) {
-		input.pop_front();
-	} else {
-		throw sax::ParserException(sax::Token(data, type), input.front());
-	}
-}
-
 } /* namespace string */
diff --git a/alib2/src/string/StringFromXMLParser.h b/alib2/src/string/StringFromXMLParser.h
index 03fe0e47d4dd12d4298db438834718f8a18a4d28..e5de9cb324e9b0e9c3049b23628dbf9c19515307 100644
--- a/alib2/src/string/StringFromXMLParser.h
+++ b/alib2/src/string/StringFromXMLParser.h
@@ -8,6 +8,7 @@
 #ifndef STRING_FROM_XML_PARSER_H_
 #define STRING_FROM_XML_PARSER_H_
 
+#include "../sax/FromXMLParser.h"
 #include <list>
 #include "String.h"
 #include "../sax/Token.h"
@@ -17,11 +18,9 @@ namespace string {
 /**
  * Parser used to get String from XML parsed into list of tokens.
  */
-class StringFromXMLParser {
+class StringFromXMLParser : public sax::FromXMLParser {
 	std::vector<alphabet::Symbol> parseContent(std::list<sax::Token>& input);
 	alphabet::Symbol parseSymbol(std::list<sax::Token>& input);
-	bool isToken(std::list<sax::Token> &input, sax::Token::TokenType type, std::string data);
-	void popToken(std::list<sax::Token> &input, sax::Token::TokenType type, std::string data);
 
 public:
 	/**