diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp
index 59cfca49313a6a92cfb72223fac081ce507010b4..bb2d9c18d421aab260f674ac8eab153f793301f1 100644
--- a/alib2data/src/Api.cpp
+++ b/alib2data/src/Api.cpp
@@ -47,6 +47,8 @@ const std::string Names::ALPHABET_RANKED_SYMBOL = "RankedSymbol";
 const std::string Names::ALPHABET_BAR_SYMBOL = "BarSymbol";
 const std::string Names::ALPHABET_RANKED_BAR_SYMBOL = "RankedBarSymbol";
 const std::string Names::ALPHABET_SUBTREE_WILDCARD_SYMBOL = "SubtreeWildcardSymbol";
+const std::string Names::ALPHABET_SYMBOL_SET_SYMBOL = "SymbolSetSymbol";
+const std::string Names::ALPHABET_SYMBOL_PAIR_SYMBOL = "SymbolPairSymbol";
 const std::string Names::AUTOMATON_EPSILON_NFA = "EpsilonNFA";
 const std::string Names::AUTOMATON_MULTI_INITIAL_STATE_NFA = "MultiInitialStateNFA";
 const std::string Names::AUTOMATON_NFA = "NFA";
@@ -299,6 +301,30 @@ std::list<sax::Token> api<alphabet::SubtreeWildcardSymbol>::compose(const alphab
 	return ToXMLComposers::symbolComposer.compose(data);
 }
 
+alphabet::SymbolSetSymbol api<alphabet::SymbolSetSymbol>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::symbolParser.parseSymbolSetSymbol(input);
+}
+
+bool api<alphabet::SymbolSetSymbol>::first(const std::list<sax::Token>& input) {
+	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::ALPHABET_SYMBOL_SET_SYMBOL);
+}
+
+std::list<sax::Token> api<alphabet::SymbolSetSymbol>::compose(const alphabet::SymbolSetSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
+alphabet::SymbolPairSymbol api<alphabet::SymbolPairSymbol>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::symbolParser.parseSymbolPairSymbol(input);
+}
+
+bool api<alphabet::SymbolPairSymbol>::first(const std::list<sax::Token>& input) {
+	return sax::FromXMLParserHelper::isToken(input, sax::Token::TokenType::START_ELEMENT, Names::ALPHABET_SYMBOL_PAIR_SYMBOL);
+}
+
+std::list<sax::Token> api<alphabet::SymbolPairSymbol>::compose(const alphabet::SymbolPairSymbol& data) {
+	return ToXMLComposers::symbolComposer.compose(data);
+}
+
 
 automaton::Automaton api<automaton::Automaton>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::automatonParser.parseAutomaton(input);
@@ -1021,6 +1047,14 @@ void ToXMLComposers::Visit(void* data, const alphabet::LabeledSymbol& symbol) co
 	*((std::list<sax::Token>*) data) = std::move(api<alphabet::LabeledSymbol>::compose(symbol));
 }
 
+void ToXMLComposers::Visit(void* data, const alphabet::SymbolSetSymbol& label) const {
+	*((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolSetSymbol>::compose(label));
+}
+
+void ToXMLComposers::Visit(void* data, const alphabet::SymbolPairSymbol& label) const {
+	*((std::list<sax::Token>*) data) = std::move(api<alphabet::SymbolPairSymbol>::compose(label));
+}
+
 void ToXMLComposers::Visit(void* data, const automaton::EpsilonNFA& automaton) const {
 	*((std::list<sax::Token>*) data) = std::move(api<automaton::EpsilonNFA>::compose(automaton));
 }
diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp
index 20e0a9b0c69d71b25afb8a73ddf17db884e04d9c..1a908f28818984a75bf0b563caf98b7f9ee42690 100644
--- a/alib2data/src/Api.hpp
+++ b/alib2data/src/Api.hpp
@@ -48,6 +48,8 @@ public:
 	const static std::string ALPHABET_BAR_SYMBOL;
 	const static std::string ALPHABET_RANKED_BAR_SYMBOL;
 	const static std::string ALPHABET_SUBTREE_WILDCARD_SYMBOL;
+	const static std::string ALPHABET_SYMBOL_PAIR_SYMBOL;
+	const static std::string ALPHABET_SYMBOL_SET_SYMBOL;
 	const static std::string AUTOMATON_EPSILON_NFA;
 	const static std::string AUTOMATON_MULTI_INITIAL_STATE_NFA;
 	const static std::string AUTOMATON_NFA;
@@ -261,6 +263,21 @@ struct api<alphabet::SubtreeWildcardSymbol> {
 	static std::list<sax::Token> compose(const alphabet::SubtreeWildcardSymbol& data);
 };
 
+template<>
+struct api<alphabet::SymbolSetSymbol> {
+	static alphabet::SymbolSetSymbol parse(std::list<sax::Token>& input);
+	static bool first(const std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const alphabet::SymbolSetSymbol& data);
+};
+
+template<>
+struct api<alphabet::SymbolPairSymbol> {
+	static alphabet::SymbolPairSymbol parse(std::list<sax::Token>& input);
+	static bool first(const std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const alphabet::SymbolPairSymbol& data);
+};
+
+
 template<>
 struct api<automaton::Automaton> {
 	static automaton::Automaton parse(std::list<sax::Token>& input);
@@ -697,6 +714,8 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type {
 	void Visit(void*, const alphabet::BarSymbol& symbol) const;
 	void Visit(void*, const alphabet::RankedBarSymbol& symbol) const;
 	void Visit(void*, const alphabet::SubtreeWildcardSymbol& symbol) const;
+	void Visit(void*, const alphabet::SymbolSetSymbol& label) const;
+	void Visit(void*, const alphabet::SymbolPairSymbol& label) const;
 
 	void Visit(void*, const automaton::EpsilonNFA& automaton) const;
 	void Visit(void*, const automaton::MultiInitialStateNFA& automaton) const;
diff --git a/alib2data/src/alphabet/SymbolBase.h b/alib2data/src/alphabet/SymbolBase.h
index 45dd60bf9dd98bc6e24fc7c08c31cca7007809f4..9c0e18661ccc45e09b0c74e6a224d11cb9fd7992 100644
--- a/alib2data/src/alphabet/SymbolBase.h
+++ b/alib2data/src/alphabet/SymbolBase.h
@@ -16,7 +16,7 @@ namespace alphabet {
 class SymbolBase;
 
 typedef std::acceptor_base<SymbolBase,
-			LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol
+			LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol, SymbolSetSymbol, SymbolPairSymbol
 	> VisitableSymbolBase;
 
 /**
diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h
index 3d6c840d4e01ffd43516d26fbeb1e850f7e50dcc..b1957bbdc8d5d7be75b9e15074136d6c68fb6fd5 100644
--- a/alib2data/src/alphabet/SymbolFeatures.h
+++ b/alib2data/src/alphabet/SymbolFeatures.h
@@ -18,7 +18,9 @@ enum class FEATURES {
 	RANKED,
 	BAR,
 	RANKED_BAR,
-	SUBTREE_WILDCARD
+	SUBTREE_WILDCARD,
+	SYMBOL_SET_SYMBOL,
+	SYMBOL_PAIR_SYMBOL
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolFromStringParser.cpp b/alib2data/src/alphabet/SymbolFromStringParser.cpp
index bf6164b922c65b03c1bfb995119f0f538b82f563..59d7e71f0b053cd5c87781e71283c374109af75e 100644
--- a/alib2data/src/alphabet/SymbolFromStringParser.cpp
+++ b/alib2data/src/alphabet/SymbolFromStringParser.cpp
@@ -19,7 +19,7 @@ SymbolFromStringParser::SymbolFromStringParser(std::istream& input) : m_SymbolLe
 }
 
 Symbol SymbolFromStringParser::parse() {
-	return parse(std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END}));
+	return parse(std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::BAR, FEATURES::SUBTREE_WILDCARD}));
 }
 
 Symbol SymbolFromStringParser::parse(const std::set<FEATURES>& features) {
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
index 2faa352f8754b20bc7416e5a06ef9c0a93694b4a..d054189e5d83d9a9e56903a3fad8ee434d5d08dc 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.cpp
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
@@ -15,7 +15,7 @@
 namespace alphabet {
 
 Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input) const {
-	return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR, FEATURES::RANKED_BAR, FEATURES::SUBTREE_WILDCARD}));
+	return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR, FEATURES::RANKED_BAR, FEATURES::SUBTREE_WILDCARD, FEATURES::SYMBOL_PAIR_SYMBOL, FEATURES::SYMBOL_SET_SYMBOL}));
 }
 
 Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
@@ -43,13 +43,19 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std:
 	} else if(alib::api<SubtreeWildcardSymbol>::first(input)) {
 		if(!features.count(FEATURES::SUBTREE_WILDCARD)) throw exception::AlibException();
 		return Symbol(parseSubtreeWildcardSymbol(input));
+	} else if(alib::api<SymbolPairSymbol>::first(input)) {
+		if(!features.count(FEATURES::SYMBOL_PAIR_SYMBOL)) throw exception::AlibException();
+		return Symbol(parseSymbolPairSymbol(input));
+	} else if(alib::api<SymbolSetSymbol>::first(input)) {
+		if(!features.count(FEATURES::SYMBOL_SET_SYMBOL)) throw exception::AlibException();
+		return Symbol(parseSymbolSetSymbol(input));
 	} else {
-		throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol", sax::Token::TokenType::START_ELEMENT), input.front());
+		throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol, RankedSymbol, BarSymbol, RankedBarSymbol, SubtreeWildcardSymbol, SymbolPairSymbol, SymbolSetSymbol", sax::Token::TokenType::START_ELEMENT), input.front());
 	}
 }
 
 bool SymbolFromXMLParser::first(const std::list<sax::Token>& input) const {
-	if(alib::api<LabeledSymbol>::first(input) || alib::api<BlankSymbol>::first(input) || alib::api<BottomOfTheStackSymbol>::first(input) || alib::api<EndSymbol>::first(input) || alib::api<RankedSymbol>::first(input) || alib::api<BarSymbol>::first(input) || alib::api<RankedBarSymbol>::first(input) || alib::api<SubtreeWildcardSymbol>::first(input)) {
+	if(alib::api<LabeledSymbol>::first(input) || alib::api<BlankSymbol>::first(input) || alib::api<BottomOfTheStackSymbol>::first(input) || alib::api<EndSymbol>::first(input) || alib::api<RankedSymbol>::first(input) || alib::api<BarSymbol>::first(input) || alib::api<RankedBarSymbol>::first(input) || alib::api<SubtreeWildcardSymbol>::first(input) || alib::api<SymbolPairSymbol>::first(input) || alib::api<SymbolSetSymbol>::first(input)) {
 		return true;
 	} else {
 		return false;
@@ -108,4 +114,26 @@ SubtreeWildcardSymbol SymbolFromXMLParser::parseSubtreeWildcardSymbol(std::list<
 	return SubtreeWildcardSymbol();
 }
 
+SymbolSetSymbol SymbolFromXMLParser::parseSymbolSetSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::ALPHABET_SYMBOL_SET_SYMBOL);
+	std::set<Symbol> labels;
+	while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		labels.insert(parseSymbol(input));
+	}
+	SymbolSetSymbol data(labels);
+	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::ALPHABET_SYMBOL_SET_SYMBOL);
+	return data;
+}
+
+SymbolPairSymbol SymbolFromXMLParser::parseSymbolPairSymbol(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, alib::Names::ALPHABET_SYMBOL_PAIR_SYMBOL);
+
+	Symbol firstSymbol = parseSymbol(input);
+	Symbol secondSymbol = parseSymbol(input);
+
+	SymbolPairSymbol data(std::make_pair(firstSymbol, secondSymbol));
+	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::ALPHABET_SYMBOL_PAIR_SYMBOL);
+	return data;
+}
+
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.h b/alib2data/src/alphabet/SymbolFromXMLParser.h
index c0b6d20db13e4a84be82bec31b56102bf0dd1c27..05d260e2e6cea5b2f06e8209ea99339a2e8d2231 100644
--- a/alib2data/src/alphabet/SymbolFromXMLParser.h
+++ b/alib2data/src/alphabet/SymbolFromXMLParser.h
@@ -24,6 +24,8 @@
 #include "BarSymbol.h"
 #include "RankedBarSymbol.h"
 #include "SubtreeWildcardSymbol.h"
+#include "SymbolPairSymbol.h"
+#include "SymbolSetSymbol.h"
 
 namespace alib {
 
@@ -49,6 +51,8 @@ class SymbolFromXMLParser : public sax::FromXMLParserHelper {
 	BarSymbol parseBarSymbol(std::list<sax::Token>& input) const;
 	RankedBarSymbol parseRankedBarSymbol(std::list<sax::Token>& input) const;
 	SubtreeWildcardSymbol parseSubtreeWildcardSymbol(std::list<sax::Token>& input) const;
+	SymbolPairSymbol parseSymbolPairSymbol(std::list<sax::Token>& input) const;
+	SymbolSetSymbol parseSymbolSetSymbol(std::list<sax::Token>& input) const;
 
 	template<typename T> friend class alib::api;
 public:
diff --git a/alib2data/src/alphabet/SymbolPairSymbol.cpp b/alib2data/src/alphabet/SymbolPairSymbol.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..2b920d7052d2643b5b49398add290f971b3c7442
--- /dev/null
+++ b/alib2data/src/alphabet/SymbolPairSymbol.cpp
@@ -0,0 +1,55 @@
+/*
+ * SymbolPairSymbol.cpp
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travicek
+ */
+
+#include "SymbolPairSymbol.h"
+#include "../std/pair.hpp"
+#include <sstream>
+
+namespace alphabet {
+
+SymbolPairSymbol::SymbolPairSymbol(const std::pair<Symbol, Symbol>& symbol) : symbol(std::move(symbol)) {
+
+}
+
+SymbolPairSymbol::SymbolPairSymbol(std::pair<Symbol, Symbol>&& symbol) : symbol(std::move(symbol)) {
+
+}
+
+SymbolBase* SymbolPairSymbol::clone() const {
+	return new SymbolPairSymbol(*this);
+}
+
+SymbolBase* SymbolPairSymbol::plunder() && {
+	return new SymbolPairSymbol(std::move(*this));
+}
+
+const std::pair<Symbol, Symbol>& SymbolPairSymbol::getData() const {
+	return symbol;
+}
+
+int SymbolPairSymbol::compare(const SymbolPairSymbol& other) const {
+	int res = symbol.first.getData().compare(other.symbol.first.getData());
+	if(res == 0) res = symbol.second.getData().compare(other.symbol.second.getData());
+	return res;
+}
+
+void SymbolPairSymbol::operator>>(std::ostream& out) const {
+	out << "(SymbolPairSymbol " << symbol << ")";
+}
+
+SymbolPairSymbol::operator std::string() const {
+	std::stringstream ss;
+	ss << "<";
+	ss << (std::string) symbol.first;
+	ss << ",";
+	ss << (std::string) symbol.second;
+	ss << "}";
+	return std::move(ss).str();
+}
+
+} /* namespace alphabet */
+
diff --git a/alib2data/src/alphabet/SymbolPairSymbol.h b/alib2data/src/alphabet/SymbolPairSymbol.h
new file mode 100644
index 0000000000000000000000000000000000000000..80f435d04f91701ccc8a9a54ea54be5a4b5e3d56
--- /dev/null
+++ b/alib2data/src/alphabet/SymbolPairSymbol.h
@@ -0,0 +1,74 @@
+/*
+ * SymbolPairSymbol.h
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef SYMBOL_PAIR_SYMBOL_H_
+#define SYMBOL_PAIR_SYMBOL_H_
+
+#include <string>
+#include <ostream>
+
+#include "Symbol.h"
+#include "SymbolBase.h"
+#include <set>
+
+namespace alphabet {
+
+/**
+ * Represents symbol in an alphabet.
+ */
+class SymbolPairSymbol : public std::acceptor<SymbolPairSymbol, VisitableSymbolBase, std::acceptor<SymbolPairSymbol, alib::VisitableObjectBase, SymbolBase> > {
+protected:
+	std::pair<Symbol, Symbol> symbol;
+
+public:
+	/**
+	 * Creates new symbol with given name.
+	 * @param symbol name of the symbol
+	 */
+	explicit SymbolPairSymbol(const std::pair<Symbol, Symbol>& symbol);
+
+	explicit SymbolPairSymbol(std::pair<Symbol, Symbol>&& symbol);
+
+	virtual SymbolBase* clone() const;
+
+	virtual SymbolBase* plunder() &&;
+
+	/**
+	 * @return name of the symbol
+	 */
+	const std::pair<Symbol, Symbol>& getData() const;
+
+	virtual int compare(const ObjectBase& other) const {
+		return -other.compare(*this);
+	}
+
+	virtual int compare(const SymbolPairSymbol& other) const;
+
+	virtual void operator>>(std::ostream&) const;
+
+	virtual operator std::string () const;
+
+	virtual int selfTypeId() const {
+		return typeId<SymbolPairSymbol>();
+	}
+};
+
+} /* namespace alphabet */
+
+namespace std {
+
+template<>
+struct compare<alphabet::SymbolPairSymbol> {
+	int operator()(const alphabet::SymbolPairSymbol& first, const alphabet::SymbolPairSymbol& second) const {
+		return first.compare(second);
+	}
+};
+
+} /* namespace std */
+
+#endif /* SYMBOL_PAIR_SYMBOL_H_ */
+
diff --git a/alib2data/src/alphabet/SymbolSetSymbol.cpp b/alib2data/src/alphabet/SymbolSetSymbol.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..179bb9d6befe3251c8177303107dc37a44c4b584
--- /dev/null
+++ b/alib2data/src/alphabet/SymbolSetSymbol.cpp
@@ -0,0 +1,59 @@
+/*
+ * SymbolSetSymbol.cpp
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travicek
+ */
+
+#include "SymbolSetSymbol.h"
+#include "../std/set.hpp"
+#include <sstream>
+
+namespace alphabet {
+
+SymbolSetSymbol::SymbolSetSymbol(const std::set<Symbol>& symbol) : symbol(symbol) {
+
+}
+
+SymbolSetSymbol::SymbolSetSymbol(std::set<Symbol>&& symbol) : symbol(std::move(symbol)) {
+
+}
+
+SymbolBase* SymbolSetSymbol::clone() const {
+	return new SymbolSetSymbol(*this);
+}
+
+SymbolBase* SymbolSetSymbol::plunder() && {
+	return new SymbolSetSymbol(std::move(*this));
+}
+
+const std::set<Symbol>& SymbolSetSymbol::getData() const {
+	return symbol;
+}
+
+int SymbolSetSymbol::compare(const SymbolSetSymbol& other) const {
+	std::compare<std::set<Symbol>> comp;
+	return comp(symbol, other.symbol);
+}
+
+void SymbolSetSymbol::operator>>(std::ostream& out) const {
+	out << "(SymbolSetSymbol " << symbol << ")";
+}
+
+SymbolSetSymbol::operator std::string() const {
+	std::stringstream ss;
+	ss << "{";
+	bool first = true;
+	for(const Symbol& subSymbol : symbol) {
+		if(!first) 
+			ss << ", ";
+		else
+			first = false;
+		ss << (std::string) subSymbol;
+	}
+	ss << "}";
+	return std::move(ss).str();
+}
+
+} /* namespace alphabet */
+
diff --git a/alib2data/src/alphabet/SymbolSetSymbol.h b/alib2data/src/alphabet/SymbolSetSymbol.h
new file mode 100644
index 0000000000000000000000000000000000000000..a07cebf68069e07c59802f0974ee1f94c40a2bad
--- /dev/null
+++ b/alib2data/src/alphabet/SymbolSetSymbol.h
@@ -0,0 +1,74 @@
+/*
+ * SymbolSetSymbol.h
+ *
+ *  Created on: Mar 26, 2013
+ *      Author: Jan Travnicek
+ */
+
+#ifndef SYMBOL_SET_SYMBOL_H_
+#define SYMBOL_SET_SYMBOL_H_
+
+#include <string>
+#include <ostream>
+
+#include "Symbol.h"
+#include "SymbolBase.h"
+#include <set>
+
+namespace alphabet {
+
+/**
+ * Represents symbol in an alphabet.
+ */
+class SymbolSetSymbol : public std::acceptor<SymbolSetSymbol, VisitableSymbolBase, std::acceptor<SymbolSetSymbol, alib::VisitableObjectBase, SymbolBase> > {
+protected:
+	std::set<Symbol> symbol;
+
+public:
+	/**
+	 * Creates new symbol with given name.
+	 * @param symbol name of the symbol
+	 */
+	explicit SymbolSetSymbol(const std::set<Symbol>& symbol);
+
+	explicit SymbolSetSymbol(std::set<Symbol>&& symbol);
+
+	virtual SymbolBase* clone() const;
+
+	virtual SymbolBase* plunder() &&;
+
+	/**
+	 * @return name of the symbol
+	 */
+	const std::set<Symbol>& getData() const;
+
+	virtual int compare(const ObjectBase& other) const {
+		return -other.compare(*this);
+	}
+
+	virtual int compare(const SymbolSetSymbol& other) const;
+
+	virtual void operator>>(std::ostream&) const;
+
+	virtual operator std::string () const;
+
+	virtual int selfTypeId() const {
+		return typeId<SymbolSetSymbol>();
+	}
+};
+
+} /* namespace alphabet */
+
+namespace std {
+
+template<>
+struct compare<alphabet::SymbolSetSymbol> {
+	int operator()(const alphabet::SymbolSetSymbol& first, const alphabet::SymbolSetSymbol& second) const {
+		return first.compare(second);
+	}
+};
+
+} /* namespace std */
+
+#endif /* SYMBOL_SET_SYMBOL_H_ */
+
diff --git a/alib2data/src/alphabet/SymbolToStringComposer.cpp b/alib2data/src/alphabet/SymbolToStringComposer.cpp
index a3edb6a536fe8b38f993222d5a55641e18a80cff..1929dcbc3999900b7632851f220430dfada4cf5f 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp
@@ -12,6 +12,8 @@
 #include "LabeledSymbol.h"
 #include "RankedSymbol.h"
 #include "RankedBarSymbol.h"
+#include "SymbolPairSymbol.h"
+#include "SymbolSetSymbol.h"
 
 namespace alphabet {
 
@@ -69,6 +71,31 @@ void SymbolToStringComposer::Visit(void* userData, const SubtreeWildcardSymbol&)
 	out << "#S";
 }
 
+void SymbolToStringComposer::Visit(void* userData, const SymbolSetSymbol& symbol) {
+	std::stringstream &out = *((std::stringstream*) userData);
+
+	out << '[';
+	bool first = true;
+	for(const Symbol& innerSymbol : symbol.getData()) {
+		if(!first)
+			out << ", ";
+		else
+			first = false;
+		innerSymbol.getData().Accept(userData, *this);
+	}
+	out << ']';
+}
+
+void SymbolToStringComposer::Visit(void* userData, const SymbolPairSymbol& symbol) {
+	std::stringstream &out = *((std::stringstream*) userData);
+
+	out << '<';
+	symbol.getData().first.getData().Accept(userData, *this);
+	out << ", ";
+	symbol.getData().second.getData().Accept(userData, *this);
+	out << '>';
+}
+
 std::string SymbolToStringComposer::compose(const Symbol& symbol) {
 	std::stringstream out;
 	symbol.getData().Accept((void*) &out, *this);
diff --git a/alib2data/src/alphabet/SymbolToStringComposer.h b/alib2data/src/alphabet/SymbolToStringComposer.h
index bd40f2e172b027dd1fffe3de3aa811a19d716952..84cc336fb7195257fd1c3798868a5bc1708cad67 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.h
+++ b/alib2data/src/alphabet/SymbolToStringComposer.h
@@ -27,6 +27,8 @@ class SymbolToStringComposer : public VisitableSymbolBase::visitor_type {
 	void Visit(void*, const BarSymbol& symbol);
 	void Visit(void*, const RankedBarSymbol& symbol);
 	void Visit(void*, const SubtreeWildcardSymbol& symbol);
+	void Visit(void*, const SymbolPairSymbol& symbol);
+	void Visit(void*, const SymbolSetSymbol& symbol);
 
 public:
 	/**
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
index b3ef0a2025e1dab5eb1fe288624b5fe42b00ac1a..7bf62d747fdd7bf4f13ee9144f6fff3f109def0e 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
@@ -83,4 +83,23 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const SubtreeWildcardSymbol&)
 	return out;
 }
 
+std::list<sax::Token> SymbolToXMLComposer::compose(const SymbolSetSymbol& symbol) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token(alib::Names::ALPHABET_SYMBOL_SET_SYMBOL, sax::Token::TokenType::START_ELEMENT));
+	for(const Symbol& innerSymbol : symbol.getData()) {
+		out.splice(out.end(), alib::api<alphabet::Symbol>::compose(innerSymbol));
+	}
+	out.push_back(sax::Token(alib::Names::ALPHABET_SYMBOL_SET_SYMBOL, sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
+std::list<sax::Token> SymbolToXMLComposer::compose(const SymbolPairSymbol& symbol) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token(alib::Names::ALPHABET_SYMBOL_PAIR_SYMBOL, sax::Token::TokenType::START_ELEMENT));
+	out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol.getData().first));
+	out.splice(out.end(), alib::api<alphabet::Symbol>::compose(symbol.getData().second));
+	out.push_back(sax::Token(alib::Names::ALPHABET_SYMBOL_PAIR_SYMBOL, sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.h b/alib2data/src/alphabet/SymbolToXMLComposer.h
index 9403cacac1ddad01954fe04acb276e4315784ed2..6db563aec2f20603e4e2c72bd012a045b4d60268 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.h
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.h
@@ -48,6 +48,8 @@ class SymbolToXMLComposer {
 	std::list<sax::Token> compose(const BarSymbol& symbol) const;
 	std::list<sax::Token> compose(const RankedBarSymbol& symbol) const;
 	std::list<sax::Token> compose(const SubtreeWildcardSymbol& symbol) const;
+	std::list<sax::Token> compose(const SymbolPairSymbol& symbol) const;
+	std::list<sax::Token> compose(const SymbolSetSymbol& symbol) const;
 
 	template<typename T> friend class alib::api;
 };
diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h
index 797e5ae18ab9196d18732a524e78e595fe4a5c45..c4a21b2acc8c49f179852136e231abbbf38e90e0 100644
--- a/alib2data/src/object/ObjectBase.h
+++ b/alib2data/src/object/ObjectBase.h
@@ -99,6 +99,8 @@ class RankedSymbol;
 class BarSymbol;
 class RankedBarSymbol;
 class SubtreeWildcardSymbol;
+class SymbolSetSymbol;
+class SymbolPairSymbol;
 
 }
 
@@ -131,7 +133,7 @@ typedef std::acceptor_base<ObjectBase,
 			label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, label::UniqueLabel,
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
-			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol,
+			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character
 	> VisitableObjectBase;
@@ -146,7 +148,7 @@ class ObjectBase :
 			label::PrimitiveLabel, label::HexavigesimalLabel, label::ObjectLabel, label::LabelSetLabel, label::LabelPairLabel, label::UniqueLabel,
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
-			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol,
+			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol, alphabet::RankedSymbol, alphabet::BarSymbol, alphabet::RankedBarSymbol, alphabet::SubtreeWildcardSymbol, alphabet::SymbolPairSymbol, alphabet::SymbolSetSymbol,
 			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap,
 			primitive::String, primitive::Integer, primitive::Character
 	>, public VisitableObjectBase {