diff --git a/alib2data/src/Api.cpp b/alib2data/src/Api.cpp
index 9e003959d91a5fcde33e3b4fc84b91e5ef8b784e..741bf71c585bc1901f2dac0ae8d979af357cdb8c 100644
--- a/alib2data/src/Api.cpp
+++ b/alib2data/src/Api.cpp
@@ -63,6 +63,14 @@ std::list<sax::Token> api<container::ObjectsPair>::compose(const container::Obje
 	return ToXMLComposers::containerComposer.compose(data);
 }
 
+container::ObjectsMap api<container::ObjectsMap>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::containerParser.parseObjectsMap(input);
+}
+
+std::list<sax::Token> api<container::ObjectsMap>::compose(const container::ObjectsMap& data) {
+	return ToXMLComposers::containerComposer.compose(data);
+}
+
 alib::Object api<alib::Object>::parse(std::list<sax::Token>& input) {
 	return FromXMLParsers::objectParser.parseObject(input);
 }
@@ -472,6 +480,10 @@ void ToXMLComposers::Visit(void* data, const container::ObjectsPair& container)
 	*((std::list<sax::Token>*) data) = std::move(api<container::ObjectsPair>::compose(container));
 }
 
+void ToXMLComposers::Visit(void* data, const container::ObjectsMap& container) const {
+	*((std::list<sax::Token>*) data) = std::move(api<container::ObjectsMap>::compose(container));
+}
+
 void ToXMLComposers::Visit(void* data, const exception::AlibException& symbol) const {
 	*((std::list<sax::Token>*) data) = std::move(api<exception::AlibException>::compose(symbol));
 }
diff --git a/alib2data/src/Api.hpp b/alib2data/src/Api.hpp
index ba9731cca67a6f1076622d4ab127711f3aada11d..e4dea103711dc0fc24c7cc7e58effb3b2e180a15 100644
--- a/alib2data/src/Api.hpp
+++ b/alib2data/src/Api.hpp
@@ -72,6 +72,18 @@ struct api<container::ObjectsPair> {
 	static std::list<sax::Token> compose(const container::ObjectsPair& data);
 };
 
+template<typename T, typename R>
+struct api<std::map<T, R>> {
+	static std::map<T, R> parse(std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const std::map<T, R>& data);
+};
+
+template<>
+struct api<container::ObjectsMap> {
+	static container::ObjectsMap parse(std::list<sax::Token>& input);
+	static std::list<sax::Token> compose(const container::ObjectsMap& data);
+};
+
 
 template<>
 struct api<Object> {
@@ -459,6 +471,7 @@ class ToXMLComposers : public VisitableObjectBase::const_visitor_type {
 	void Visit(void*, const container::ObjectsSet& set) const;
 	void Visit(void*, const container::ObjectsVector& set) const;
 	void Visit(void*, const container::ObjectsPair& set) const;
+	void Visit(void*, const container::ObjectsMap& set) const;
 
 public:
 	static const label::LabelToXMLComposer labelComposer;
@@ -504,6 +517,16 @@ std::list<sax::Token> api<std::pair<T, R>>::compose(const std::pair<T, R>& input
 	return ToXMLComposers::containerComposer.compose<T, R>(input);
 }
 
+template<typename T, typename R>
+std::map<T, R> api<std::map<T, R>>::parse(std::list<sax::Token>& input) {
+	return FromXMLParsers::containerParser.parseMap<T, R>(input);
+}
+
+template<typename T, typename R>
+std::list<sax::Token> api<std::map<T, R>>::compose(const std::map<T, R>& input) {
+	return ToXMLComposers::containerComposer.compose<T, R>(input);
+}
+
 } /* namespace alib */
 
 #endif /* FROM_XML_PARSERS_HPP_ */
diff --git a/alib2data/src/container/ContainerBase.h b/alib2data/src/container/ContainerBase.h
index 82577ea329f42351d641c7dab091a19e1c14753b..c9eb75c43d47ca37c466162ab1e515a571e60912 100644
--- a/alib2data/src/container/ContainerBase.h
+++ b/alib2data/src/container/ContainerBase.h
@@ -16,7 +16,8 @@ namespace container {
 typedef std::acceptor_base<
 			container::ObjectsSet,
 			container::ObjectsVector,
-			container::ObjectsPair
+			container::ObjectsPair,
+			container::ObjectsMap
 	> VisitableContainerBase;
 
 /**
diff --git a/alib2data/src/container/ContainerFeatures.h b/alib2data/src/container/ContainerFeatures.h
index c91809af68c34cc7172bd5d791dd2654e3c47cda..f8c5a29c3421682ccf9f3aff712da3ab52bd1a79 100644
--- a/alib2data/src/container/ContainerFeatures.h
+++ b/alib2data/src/container/ContainerFeatures.h
@@ -13,7 +13,8 @@ namespace container {
 enum class FEATURES {
 	SET,
 	VECTOR,
-	PAIR
+	PAIR,
+	MAP
 };
 
 } /* namespace container */
diff --git a/alib2data/src/container/ContainerFromXMLParser.cpp b/alib2data/src/container/ContainerFromXMLParser.cpp
index 0fe6d6cd1ab761319579d1711381b57cef7d20ad..29ff8913abd6f78d96f06ec4be086a06ccbb39fe 100644
--- a/alib2data/src/container/ContainerFromXMLParser.cpp
+++ b/alib2data/src/container/ContainerFromXMLParser.cpp
@@ -11,7 +11,7 @@
 namespace container {
 
 bool ContainerFromXMLParser::first(std::list<sax::Token>& input) const {
-	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "set") || isToken(input, sax::Token::TokenType::START_ELEMENT, "vector") || isToken(input, sax::Token::TokenType::START_ELEMENT, "pair")) {
+	if(isToken(input, sax::Token::TokenType::START_ELEMENT, "set") || isToken(input, sax::Token::TokenType::START_ELEMENT, "vector") || isToken(input, sax::Token::TokenType::START_ELEMENT, "pair") || isToken(input, sax::Token::TokenType::START_ELEMENT, "map")) {
 		return true;
 	} else {
 		return false;
@@ -19,7 +19,7 @@ bool ContainerFromXMLParser::first(std::list<sax::Token>& input) const {
 }
 
 Container ContainerFromXMLParser::parseContainer(std::list<sax::Token>& input) const {
-	return parseContainer(input, std::set<FEATURES>({FEATURES::SET, FEATURES::VECTOR, FEATURES::PAIR}));
+	return parseContainer(input, std::set<FEATURES>({FEATURES::SET, FEATURES::VECTOR, FEATURES::PAIR, FEATURES::MAP}));
 }
 
 Container ContainerFromXMLParser::parseContainer(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
@@ -32,8 +32,11 @@ Container ContainerFromXMLParser::parseContainer(std::list<sax::Token>& input, c
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "pair")) {
 		if(!features.count(FEATURES::PAIR)) throw exception::AlibException();
 		return Container(parseObjectsPair(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "map")) {
+		if(!features.count(FEATURES::MAP)) throw exception::AlibException();
+		return Container(parseObjectsMap(input));
 	} else {
-		throw sax::ParserException(sax::Token("set / vector", sax::Token::TokenType::START_ELEMENT), input.front());
+		throw sax::ParserException(sax::Token("set / vector / pair / map", sax::Token::TokenType::START_ELEMENT), input.front());
 	}
 }
 
@@ -75,5 +78,17 @@ ObjectsPair ContainerFromXMLParser::parseObjectsPair(std::list<sax::Token>& inpu
 	return pair;
 }
 
+ObjectsMap ContainerFromXMLParser::parseObjectsMap(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "map");
+
+	ObjectsMap map;
+	while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		map.insert(alib::api<std::pair<alib::Object, alib::Object>>::parse(input));
+	}
+
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "map");
+	return map;
+}
+
 } /* namespace container */
 
diff --git a/alib2data/src/container/ContainerFromXMLParser.hpp b/alib2data/src/container/ContainerFromXMLParser.hpp
index dba7e1b8d6c5e0e2304651036f13f00bf39151e5..ab4d4248cbccc63ae926513c57599cbf665769e1 100644
--- a/alib2data/src/container/ContainerFromXMLParser.hpp
+++ b/alib2data/src/container/ContainerFromXMLParser.hpp
@@ -13,6 +13,8 @@
 
 #include "ObjectsSet.h"
 #include "ObjectsVector.h"
+#include "ObjectsPair.h"
+#include "ObjectsMap.h"
 
 #include "Container.h"
 
@@ -47,6 +49,11 @@ class ContainerFromXMLParser : public sax::FromXMLParserHelper {
 
 	ObjectsPair parseObjectsPair(std::list<sax::Token>& input) const;
 
+	template<typename T, typename R>
+	std::map<T, R> parseMap(std::list<sax::Token>& input) const;
+
+	ObjectsMap parseObjectsMap(std::list<sax::Token>& input) const;
+
 	template<typename T> friend class alib::api;
 
 public:
@@ -98,6 +105,20 @@ std::pair<T, R> ContainerFromXMLParser::parsePair(std::list<sax::Token>& input)
 	return std::make_pair(first, second);
 }
 
+template<typename T, typename R>
+std::map<T, R> ContainerFromXMLParser::parseMap(std::list<sax::Token>& input) const {
+	popToken(input, sax::Token::TokenType::START_ELEMENT, "map");
+
+	std::map<T, R> map;
+
+	while(isTokenType(input, sax::Token::TokenType::START_ELEMENT)) {
+		map.insert(alib::api<std::pair<T, R>>::parse(input));
+	}
+
+	popToken(input, sax::Token::TokenType::END_ELEMENT, "map");
+	return map;
+}
+
 } /* namespace container */
 
 #endif /* CONTAINER_FROM_XML_PARSER_H_ */
diff --git a/alib2data/src/container/ContainerToXMLComposer.cpp b/alib2data/src/container/ContainerToXMLComposer.cpp
index edbdbe9d1ec0d30f10bbe2c70297811ef499ba50..ecfad0e3c7948f59c69e019b3d0c6fcce82768a7 100644
--- a/alib2data/src/container/ContainerToXMLComposer.cpp
+++ b/alib2data/src/container/ContainerToXMLComposer.cpp
@@ -56,5 +56,17 @@ std::list<sax::Token> ContainerToXMLComposer::compose(const ObjectsPair& contain
 	return out;
 }
 
+std::list<sax::Token> ContainerToXMLComposer::compose(const ObjectsMap& container) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token("map", sax::Token::TokenType::START_ELEMENT));
+
+	for(const std::pair<alib::Object, alib::Object>& item : container) {
+		out.splice(out.end(), alib::api<std::pair<alib::Object, alib::Object>>::compose(item));
+	}
+
+	out.push_back(sax::Token("map", sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
 } /* namespace container */
 
diff --git a/alib2data/src/container/ContainerToXMLComposer.hpp b/alib2data/src/container/ContainerToXMLComposer.hpp
index 4d9581e8a79d36849307bcf6384e83b0637dae13..7e6f4fa0c379b9f0ca33495f79f7781684937a4e 100644
--- a/alib2data/src/container/ContainerToXMLComposer.hpp
+++ b/alib2data/src/container/ContainerToXMLComposer.hpp
@@ -58,6 +58,11 @@ class ContainerToXMLComposer {
 
 	std::list<sax::Token> compose(const ObjectsPair& container) const;
 
+	template<typename T, typename R>
+	std::list<sax::Token> compose(const std::map<T, R>& container) const;
+
+	std::list<sax::Token> compose(const ObjectsMap& container) const;
+
 	template<typename T> friend class alib::api;
 };
 
@@ -105,6 +110,19 @@ std::list<sax::Token> ContainerToXMLComposer::compose(const std::pair<T, R>& con
 	return out;
 }
 
+template<typename T, typename R>
+std::list<sax::Token> ContainerToXMLComposer::compose(const std::map<T, R>& container) const {
+	std::list<sax::Token> out;
+	out.push_back(sax::Token("map", sax::Token::TokenType::START_ELEMENT));
+
+	for(const std::pair<T, R>& item : container) {
+		out.splice(out.end(), alib::api<std::pair<T, R>>::compose(item));
+	}
+
+	out.push_back(sax::Token("map", sax::Token::TokenType::END_ELEMENT));
+	return out;
+}
+
 } /* namespace container */
 
 #endif /* CONTAINER_TO_XML_COMPOSER_H_ */
diff --git a/alib2data/src/container/ObjectsMap.cpp b/alib2data/src/container/ObjectsMap.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f8b07ca4bbd8a789dfe0a6c16317a20421794518
--- /dev/null
+++ b/alib2data/src/container/ObjectsMap.cpp
@@ -0,0 +1,55 @@
+/*
+ * Map.cpp
+ *
+ * Created on: Apr 1, 2013
+ * Author: Jan Travnicek
+ */
+
+#include "ObjectsMap.h"
+#include "../std/map.hpp"
+
+#include <cstdlib>
+#include <iostream>
+#include <sstream>
+
+namespace container {
+
+ContainerBase* ObjectsMap::clone() const {
+	return new ObjectsMap(*this);
+}
+
+ContainerBase* ObjectsMap::plunder() && {
+	return new ObjectsMap(std::move(*this));
+}
+
+bool ObjectsMap::operator==(const ObjectBase& other) const {
+	return other == *this;
+}
+
+bool ObjectsMap::operator<(const ObjectBase& other) const {
+	return other > *this;
+}
+
+bool ObjectsMap::operator>(const ObjectBase& other) const {
+	return other < *this;
+}
+
+bool ObjectsMap::operator==(const ObjectsMap& other) const {
+	return static_cast<const std::map<alib::Object, alib::Object>>(*this) == static_cast<const std::map<alib::Object, alib::Object>>(other);
+}
+
+bool ObjectsMap::operator<(const ObjectsMap& other) const {
+	return static_cast<const std::map<alib::Object, alib::Object>>(*this) < static_cast<const std::map<alib::Object, alib::Object>>(other);
+}
+
+void ObjectsMap::operator>>(std::ostream& os) const {
+	os << *this;
+}
+
+ObjectsMap::operator std::string() const {
+	std::stringstream ss;
+	ss << *this;
+	return std::move(ss).str();
+}
+
+} /* namespace container */
diff --git a/alib2data/src/container/ObjectsMap.h b/alib2data/src/container/ObjectsMap.h
new file mode 100644
index 0000000000000000000000000000000000000000..71503f3a2f7f87f08af0259cda427a2427f5438c
--- /dev/null
+++ b/alib2data/src/container/ObjectsMap.h
@@ -0,0 +1,47 @@
+/*
+ * Map.h
+ *
+ * Created on: Apr 1, 2013
+ * Author: Jan Travnicek
+ */
+
+#ifndef OBJECTS_MAP_H_
+#define OBJECTS_MAP_H_
+
+#include <map>
+#include <string>
+
+#include "../object/Object.h"
+#include "ContainerBase.h"
+
+namespace container {
+
+/**
+ * Basic container from which are derived all other containers.
+ * Contains reason why the container occured.
+ */
+class ObjectsMap : public std::map<alib::Object, alib::Object>, public std::acceptor<ObjectsMap, VisitableContainerBase, std::acceptor<ObjectsMap, alib::VisitableObjectBase, ContainerBase> > {
+public:
+	virtual ContainerBase* clone() const;
+	
+	virtual ContainerBase* plunder() &&;
+
+	virtual bool operator>(const alib::ObjectBase& other) const;
+	virtual bool operator==(const alib::ObjectBase& other) const;
+	virtual bool operator<(const alib::ObjectBase& other) const;
+
+	virtual bool operator==(const ObjectsMap& other) const;
+	virtual bool operator<(const ObjectsMap& other) const;
+
+	virtual void operator>>(std::ostream& os) const;
+
+	virtual operator std::string() const;
+
+	virtual int selfTypeId() const {
+		return typeId(*this);
+	}
+};
+
+} /* namespace container */
+
+#endif /* OBJECTS_MAP_H_ */
diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h
index 49e82fafc634e221b66b599549aec4ca99db36bf..3257428e4f54412a1b210c395c1b9f9577404826 100644
--- a/alib2data/src/object/ObjectBase.h
+++ b/alib2data/src/object/ObjectBase.h
@@ -93,6 +93,7 @@ namespace container {
 class ObjectsSet;
 class ObjectsVector;
 class ObjectsPair;
+class ObjectsMap;
 
 }
 
@@ -106,7 +107,7 @@ typedef std::acceptor_base<
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
 			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol,
-			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair
+			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap
 	> VisitableObjectBase;
 
 class ObjectBase :
@@ -119,7 +120,7 @@ class ObjectBase :
 			regexp::UnboundedRegExp, regexp::FormalRegExp,
 			string::Epsilon, string::LinearString, string::CyclicString,
 			alphabet::LabeledSymbol, alphabet::BlankSymbol, alphabet::BottomOfTheStackSymbol, alphabet::EndSymbol,
-			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair
+			container::ObjectsSet, container::ObjectsVector, container::ObjectsPair, container::ObjectsMap
 	>, public VisitableObjectBase {
 };