diff --git a/alib2/src/regexp/Alternation.cpp b/alib2/src/regexp/Alternation.cpp
index 4c9fa359f101299e963c28123714bce1e9353726..1e37e3544600d96874fbec007ed0240be70aff49 100644
--- a/alib2/src/regexp/Alternation.cpp
+++ b/alib2/src/regexp/Alternation.cpp
@@ -15,7 +15,7 @@ Alternation::Alternation() {
 
 Alternation::Alternation(const Alternation& other) {
 	for (const auto& element : other.elements) {
-		elements.push_back(element->clone());
+		elements.insert(element->clone());
 	}
 }
 
@@ -46,11 +46,11 @@ Alternation::~Alternation() noexcept {
 	elements.clear();
 }
 
-std::vector<RegExpElement*>& Alternation::getElements() {
+std::set<RegExpElement*, RegExpElement::PointerLess>& Alternation::getElements() {
 	return elements;
 }
 
-const std::vector<RegExpElement*>& Alternation::getElements() const {
+const std::set<RegExpElement*, RegExpElement::PointerLess>& Alternation::getElements() const {
 	return elements;
 }
 
diff --git a/alib2/src/regexp/Alternation.h b/alib2/src/regexp/Alternation.h
index f26963cab25f4e08853f87253f16d6f2894f0817..f417d3ad9eab91ab0fac33a29366dfadc9fffc27 100644
--- a/alib2/src/regexp/Alternation.h
+++ b/alib2/src/regexp/Alternation.h
@@ -8,7 +8,7 @@
 #ifndef ALTERNATION_H_
 #define ALTERNATION_H_
 
-#include <vector>
+#include <set>
 #include "RegExpElement.h"
 
 namespace regexp {
@@ -24,7 +24,7 @@ protected:
 	 */
 	virtual RegExpElement* clone() const;
 
-	std::vector<RegExpElement*> elements;
+	std::set<RegExpElement*, RegExpElement::PointerLess> elements;
 public:
 	Alternation();
 	Alternation(const Alternation& other);
@@ -36,12 +36,12 @@ public:
 	/**
 	 * @return list of operands
 	 */
-	std::vector<RegExpElement*>& getElements();
+	std::set<RegExpElement*, RegExpElement::PointerLess>& getElements();
 
 	/**
 	 * @return list of operands
 	 */
-	const std::vector<RegExpElement*>& getElements() const;
+	const std::set<RegExpElement*, RegExpElement::PointerLess>& getElements() const;
 
 	virtual bool operator<(const RegExpElement&) const;
 	virtual bool operator==(const RegExpElement&) const;
diff --git a/alib2/src/regexp/Concatenation.cpp b/alib2/src/regexp/Concatenation.cpp
index bc0db201f3db261677fbb4b801380c50bd73b159..b7a1e29bb48d77950aa82746786774fd9589fdd3 100644
--- a/alib2/src/regexp/Concatenation.cpp
+++ b/alib2/src/regexp/Concatenation.cpp
@@ -49,7 +49,7 @@ std::vector<RegExpElement*>& Concatenation::getElements() {
 	return elements;
 }
 
-const std::vector<const RegExpElement*>& Concatenation::getElements() const {
+const std::vector<RegExpElement*>& Concatenation::getElements() const {
 	return elements;
 }
 
diff --git a/alib2/src/regexp/Concatenation.h b/alib2/src/regexp/Concatenation.h
index de3b3c086bbbfba725f75993f2cce608d6f17493..648e45b1f871e9a78f6d3257aed634e3a17a8c20 100644
--- a/alib2/src/regexp/Concatenation.h
+++ b/alib2/src/regexp/Concatenation.h
@@ -41,7 +41,7 @@ public:
 	/**
 	 * @return list of operands
 	 */
-	const std::vector<const RegExpElement*>& getElements() const;
+	const std::vector<RegExpElement*>& getElements() const;
 
 	virtual bool operator<(const RegExpElement&) const;
 	virtual bool operator==(const RegExpElement&) const;
diff --git a/alib2/src/regexp/RegExpElement.h b/alib2/src/regexp/RegExpElement.h
index 57207bf229c808e5e443a1be9ae4d58c6a26defe..2cea01515bb32547dc617602301eca14ff3982d1 100644
--- a/alib2/src/regexp/RegExpElement.h
+++ b/alib2/src/regexp/RegExpElement.h
@@ -25,6 +25,13 @@ 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> > {
+protected:
+	class PointerLess {
+	public:
+		bool operator()(const RegExpElement* a, const RegExpElement* b) {
+			return *a < *b;
+		}
+	};
 public:
 	/**
 	 * Creates copy of the element.
diff --git a/alib2/src/regexp/RegExpFromXMLParser.cpp b/alib2/src/regexp/RegExpFromXMLParser.cpp
index a7a55400b7a21cb80830278ca8854ffea3686bff..d811fb692ab0f4137e356cbbf42dad7c7b481e5d 100644
--- a/alib2/src/regexp/RegExpFromXMLParser.cpp
+++ b/alib2/src/regexp/RegExpFromXMLParser.cpp
@@ -41,7 +41,11 @@ Alternation* RegExpFromXMLParser::parseAlternation(std::list<sax::Token>& input)
 	popToken(input, sax::Token::START_ELEMENT, "alternation");
 
 	Alternation* alternation = new Alternation;
-	parseContent(input, alternation->getElements());
+	while (true) {
+		RegExpElement* element = parseElement(input);
+		if(!element) break;
+		alternation->getElements().insert(element);
+	}
 
 	popToken(input, sax::Token::END_ELEMENT, "alternation");
 	return alternation;
@@ -51,7 +55,11 @@ Concatenation* RegExpFromXMLParser::parseConcatenation(std::list<sax::Token>& in
 	popToken(input, sax::Token::START_ELEMENT, "concatenation");
 
 	Concatenation* concatenation = new Concatenation();
-	parseContent(input, concatenation->getElements());
+	while (true) {
+		RegExpElement* element = parseElement(input);
+		if(!element) break;
+		concatenation->getElements().push_back(element);
+	}
 
 	popToken(input, sax::Token::END_ELEMENT, "concatenation");
 	return concatenation;
@@ -70,14 +78,6 @@ Iteration* RegExpFromXMLParser::parseIteration(std::list<sax::Token>& input) {
 	return iteration;
 }
 
-void RegExpFromXMLParser::parseContent(std::list<sax::Token>& input, std::list<RegExpElement*>& elements) {
-	while (true) {
-		RegExpElement* element = parseElement(input);
-		if(!element) return;
-		elements.push_back(element);
-	}
-}
-
 RegExpEpsilon* RegExpFromXMLParser::parseEpsilon(std::list<sax::Token>& input) {
 	popToken(input, sax::Token::START_ELEMENT, "epsilon");
 
diff --git a/alib2/src/regexp/RegExpFromXMLParser.h b/alib2/src/regexp/RegExpFromXMLParser.h
index a6cbac18d6b3af9398267bc0404e35deff8e547f..7fa76433981735c508936a468dee5b2ced3d361d 100644
--- a/alib2/src/regexp/RegExpFromXMLParser.h
+++ b/alib2/src/regexp/RegExpFromXMLParser.h
@@ -18,7 +18,6 @@ namespace regexp {
  * Parser used to get RegExp from XML parsed into list of tokens.
  */
 class RegExpFromXMLParser {
-	void parseContent(std::list<sax::Token>& input, std::list<RegExpElement*>& elements);
 	RegExpElement* parseElement(std::list<sax::Token>& input);
 
 	RegExpEpsilon* parseEpsilon(std::list<sax::Token>& input);