diff --git a/alib2data/src/string/CyclicString.h b/alib2data/src/string/CyclicString.h
index 83131a9a1d4ac8038aa7246af0432fdf88f835c4..6b473cc2d59a8541d2f6bd19ba89228985aad854 100644
--- a/alib2data/src/string/CyclicString.h
+++ b/alib2data/src/string/CyclicString.h
@@ -41,6 +41,10 @@ public:
 		return StringAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::Symbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	virtual bool removeSymbolFromAlphabet ( const alphabet::Symbol & symbol );
 
 	/**
diff --git a/alib2data/src/string/Epsilon.h b/alib2data/src/string/Epsilon.h
index a850cfbc7f63f6814830ef28f0ceb6b719c72a37..cdf4a5e733da62ad94f344cc6bbdbc4dc09f180b 100644
--- a/alib2data/src/string/Epsilon.h
+++ b/alib2data/src/string/Epsilon.h
@@ -35,6 +35,10 @@ public:
 		return StringAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::Symbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	virtual bool removeSymbolFromAlphabet ( const alphabet::Symbol & symbol );
 
 	/**
diff --git a/alib2data/src/string/LinearString.h b/alib2data/src/string/LinearString.h
index b959f58d212182ca65dbb0f3b15c1428695cf7f3..f8066f15a42a5ba14966d68a4664a392dcba4a43 100644
--- a/alib2data/src/string/LinearString.h
+++ b/alib2data/src/string/LinearString.h
@@ -50,6 +50,10 @@ public:
 		return StringAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::Symbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	virtual bool removeSymbolFromAlphabet ( const alphabet::Symbol & symbol );
 
 	/**
diff --git a/alib2data/src/string/LinearStringTerminatingSymbol.h b/alib2data/src/string/LinearStringTerminatingSymbol.h
index 5dcb3172e5cff0c42c588815e825769570cb0edb..d055def8ae2e2993bffb1086e70921392d90a7c0 100644
--- a/alib2data/src/string/LinearStringTerminatingSymbol.h
+++ b/alib2data/src/string/LinearStringTerminatingSymbol.h
@@ -40,6 +40,10 @@ public:
 		return TerminatingSymbolStringAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::Symbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	virtual bool removeSymbolFromAlphabet ( const alphabet::Symbol & symbol );
 
 	/**
diff --git a/alib2data/src/string/String.cpp b/alib2data/src/string/String.cpp
index 56c50b0605741dd1db8cceba8b4ce46d8f2ee334..6830d20cb73fc25df85cad373f628277ef85cbfc 100644
--- a/alib2data/src/string/String.cpp
+++ b/alib2data/src/string/String.cpp
@@ -16,6 +16,10 @@ const std::set<alphabet::Symbol>& String::getAlphabet() const {
 	return this->getData().getAlphabet();
 }
 
+void String::extendAlphabet(const std::set < alphabet::Symbol > & symbols ) {
+	this->getData().extendAlphabet(symbols);
+}
+
 string::String stringFrom( const alphabet::Symbol& symbol ) {
 	return string::String { string::LinearString { std::vector<alphabet::Symbol> { symbol } } };
 }
diff --git a/alib2data/src/string/String.h b/alib2data/src/string/String.h
index 15eaa427329b665504023fdb149cc909391884f9..f6c2802b97afef494b3431fd840e35ca514b1a3a 100644
--- a/alib2data/src/string/String.h
+++ b/alib2data/src/string/String.h
@@ -23,6 +23,7 @@ class String : public alib::wrapper<StringBase>, public alib::WrapperBase {
 	using alib::wrapper<StringBase>::wrapper;
 public:
 	const std::set<alphabet::Symbol>& getAlphabet() const;
+	void extendAlphabet(const std::set < alphabet::Symbol > & symbols );
 };
 
 string::String stringFrom(const alphabet::Symbol& symbol);
diff --git a/alib2data/src/string/StringBase.h b/alib2data/src/string/StringBase.h
index 861f2f82d11059b6d623b3f936262c4489815d07..f0ba7c10d840354ef86cd2444b1235172e2223b1 100644
--- a/alib2data/src/string/StringBase.h
+++ b/alib2data/src/string/StringBase.h
@@ -23,6 +23,7 @@ public:
 	virtual StringBase* plunder() && = 0;
 
 	virtual const std::set<alphabet::Symbol>& getAlphabet() const = 0;
+	virtual void extendAlphabet(const std::set<alphabet::Symbol>& symbols) = 0;
 };
 
 } /* namespace string */
diff --git a/alib2data/src/tree/RankedTreeBase.h b/alib2data/src/tree/RankedTreeBase.h
index 783522d83aaacf53945513a352f88e8d318b937c..06ca1615ccd54145a43cce29f8fe17f9a2204e52 100644
--- a/alib2data/src/tree/RankedTreeBase.h
+++ b/alib2data/src/tree/RankedTreeBase.h
@@ -23,6 +23,7 @@ public:
 	virtual RankedTreeBase * plunder ( ) &&	 = 0;
 
 	virtual const std::set < alphabet::RankedSymbol > & getAlphabet ( ) const = 0;
+	virtual void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) = 0;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/RankedTreeWrapper.cpp b/alib2data/src/tree/RankedTreeWrapper.cpp
index 5ac4882a9e2dfafbb829595668786b00c3d776b7..d253eecb5ccef2b50e244c744309a6e85ab60495 100644
--- a/alib2data/src/tree/RankedTreeWrapper.cpp
+++ b/alib2data/src/tree/RankedTreeWrapper.cpp
@@ -13,4 +13,8 @@ const std::set < alphabet::RankedSymbol > & RankedTreeWrapper::getAlphabet ( ) c
 	return this->getData ( ).getAlphabet ( );
 }
 
+void RankedTreeWrapper::extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) {
+	this->getData ( ).extendAlphabet ( symbols );
+}
+
 } /* namespace tree */
diff --git a/alib2data/src/tree/RankedTreeWrapper.h b/alib2data/src/tree/RankedTreeWrapper.h
index 393c16f9690524b87549c678595dd56cef7cfbe7..7de1acfff6af798e39f3035cb78a518e8bf8c44c 100644
--- a/alib2data/src/tree/RankedTreeWrapper.h
+++ b/alib2data/src/tree/RankedTreeWrapper.h
@@ -22,6 +22,7 @@ class RankedTreeWrapper : public alib::wrapper < RankedTreeBase >, public alib::
 
 public:
 	const std::set < alphabet::RankedSymbol > & getAlphabet ( ) const;
+	void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols );
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/UnrankedTreeBase.h b/alib2data/src/tree/UnrankedTreeBase.h
index 42f1586b805b6c933c6a049949b8f47613ca429a..b3a2cbd403547245d8898690a36853443e2aeab0 100644
--- a/alib2data/src/tree/UnrankedTreeBase.h
+++ b/alib2data/src/tree/UnrankedTreeBase.h
@@ -23,6 +23,7 @@ public:
 	virtual UnrankedTreeBase * plunder ( ) &&  = 0;
 
 	virtual const std::set < alphabet::Symbol > & getAlphabet ( ) const = 0;
+	virtual void extendAlphabet ( const std::set < alphabet::Symbol > & symbols ) = 0;
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/UnrankedTreeWrapper.cpp b/alib2data/src/tree/UnrankedTreeWrapper.cpp
index 842d46018684bb5c4e6d0210532e7b101d4183db..aa15d7db9172c3832905dee9a706172689c36b96 100644
--- a/alib2data/src/tree/UnrankedTreeWrapper.cpp
+++ b/alib2data/src/tree/UnrankedTreeWrapper.cpp
@@ -13,4 +13,8 @@ const std::set < alphabet::Symbol > & UnrankedTreeWrapper::getAlphabet ( ) const
 	return this->getData ( ).getAlphabet ( );
 }
 
+void UnrankedTreeWrapper::extendAlphabet ( const std::set < alphabet::Symbol > & symbols ) {
+	this->getData ( ).extendAlphabet ( symbols );
+}
+
 } /* namespace tree */
diff --git a/alib2data/src/tree/UnrankedTreeWrapper.h b/alib2data/src/tree/UnrankedTreeWrapper.h
index 4b22c56a253abe4d533fea2e194eef1213f38b3a..cbe856aa19a7bd73f5f6c786a9fe107acdd056e0 100644
--- a/alib2data/src/tree/UnrankedTreeWrapper.h
+++ b/alib2data/src/tree/UnrankedTreeWrapper.h
@@ -22,6 +22,7 @@ class UnrankedTreeWrapper : public alib::wrapper < UnrankedTreeBase >, public al
 
 public:
 	const std::set < alphabet::Symbol > & getAlphabet ( ) const;
+	void extendAlphabet ( const std::set < alphabet::Symbol > & symbols );
 };
 
 } /* namespace tree */
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
index 155cefb21290c5ffcd4eb12e513faa8685e131b8..aa06c60caa9b52513fcd35fd18380b91e55e4f69 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h
@@ -54,6 +54,10 @@ public:
 		return RankedPatternAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	void setContent ( std::vector < alphabet::RankedSymbol > data );
 
 	const alphabet::Symbol & getBarSymbol ( ) const;
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.h b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
index 54b7ae7d3391bfaaa923078e8717444c3b18cc21..a0118e9c54d31bc820678b458d0a5f84bd2466a7 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.h
@@ -51,6 +51,10 @@ public:
 		return RankedAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	const alphabet::Symbol & getBarSymbol ( ) const;
 
 	void setContent ( std::vector < alphabet::RankedSymbol > data );
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.h b/alib2data/src/tree/ranked/PrefixRankedPattern.h
index 02b9e56e595047e62ad6bef3ab220988244c32e1..c1f14402d0953ff4b273498a42d0f1756a8aa637 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.h
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.h
@@ -45,6 +45,10 @@ public:
 		return RankedPatternAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	void setContent ( std::vector < alphabet::RankedSymbol > data );
 
 	void arityChecksum ( const std::vector < alphabet::RankedSymbol > & data );
diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.h b/alib2data/src/tree/ranked/PrefixRankedTree.h
index cbdcb93a5863c866ae9d77889dcec4858e1a5b9c..63dc05218deb3fde1ba12820a1b1a79b834b23a0 100644
--- a/alib2data/src/tree/ranked/PrefixRankedTree.h
+++ b/alib2data/src/tree/ranked/PrefixRankedTree.h
@@ -45,6 +45,10 @@ public:
 		return RankedAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	void setContent ( std::vector < alphabet::RankedSymbol > data );
 
 	void arityChecksum ( const std::vector < alphabet::RankedSymbol > & data );
diff --git a/alib2data/src/tree/ranked/RankedPattern.h b/alib2data/src/tree/ranked/RankedPattern.h
index 63cb4bce6b280cb5f9978dff5227d2dbd04ef912..0b13a5fd273822a5be791d80195cd224f0c3cc0e 100644
--- a/alib2data/src/tree/ranked/RankedPattern.h
+++ b/alib2data/src/tree/ranked/RankedPattern.h
@@ -63,6 +63,10 @@ public:
 		return RankedPatternAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	/**
 	 * @return Root node of the regular expression pattern
 	 */
diff --git a/alib2data/src/tree/ranked/RankedTree.h b/alib2data/src/tree/ranked/RankedTree.h
index 3ae18846732f6b0e98bd8b07539e85e06fe50541..88c2b772781f13611826872f53d603163a3d8571 100644
--- a/alib2data/src/tree/ranked/RankedTree.h
+++ b/alib2data/src/tree/ranked/RankedTree.h
@@ -63,6 +63,10 @@ public:
 		return RankedAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::RankedSymbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	/**
 	 * @return Root node of the regular expression tree
 	 */
diff --git a/alib2data/src/tree/unranked/UnrankedPattern.h b/alib2data/src/tree/unranked/UnrankedPattern.h
index 2e003e1b0fd920f9447c3dc55e916dc38678b69f..71e0f4d1acc1418f363f6acc7071e0cfbbd27e1f 100644
--- a/alib2data/src/tree/unranked/UnrankedPattern.h
+++ b/alib2data/src/tree/unranked/UnrankedPattern.h
@@ -63,6 +63,10 @@ public:
 		return UnrankedPatternAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::Symbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	/**
 	 * @return Root node of the regular expression pattern
 	 */
diff --git a/alib2data/src/tree/unranked/UnrankedTree.h b/alib2data/src/tree/unranked/UnrankedTree.h
index 811a0c1610fa09b134e51ba88a9da9ea3d78ab7a..1020ab2c00bb29cc9e139bc15d3528168fe078da 100644
--- a/alib2data/src/tree/unranked/UnrankedTree.h
+++ b/alib2data/src/tree/unranked/UnrankedTree.h
@@ -63,6 +63,10 @@ public:
 		return UnrankedAlphabet::getAlphabet ( );
 	}
 
+	void extendAlphabet ( const std::set < alphabet::Symbol > & symbols ) {
+		addSymbolsToAlphabet ( symbols );
+	}
+
 	/**
 	 * @return Root node of the regular expression tree
 	 */
diff --git a/alphabetManip2/makefile b/alphabetManip2/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..f19c977454b02b96a4b7f81bfdb2e4dcaab19f6e
--- /dev/null
+++ b/alphabetManip2/makefile
@@ -0,0 +1,160 @@
+SHELL:=/bin/bash
+USE_RAMDISK ?= 0
+-include makefile.conf
+
+define NEW_LINE
+
+
+endef
+
+export NEW_LINE
+
+LDFLAGS_DEBUG:=$(addprefix -L, $(addsuffix lib-debug, $(LINK_PATHS))) -rdynamic $(addprefix -l, $(LINK_LIBRARIES)) -Wl,-rpath,.
+
+LDFLAGS_RELEASE:=$(addprefix -L, $(addsuffix lib-release, $(LINK_PATHS))) -rdynamic $(addprefix -l, $(LINK_LIBRARIES)) -Wl,-rpath,.
+
+OBJECTS_DEBUG:=$(patsubst src/%.cpp, obj-debug/%.o, $(shell find src/ -name *cpp))
+
+OBJECTS_RELEASE:=$(patsubst src/%.cpp, obj-release/%.o, $(shell find src/ -name *cpp))
+
+.PHONY: all build-debug clean-debug doc
+
+all:
+	@echo "What to do master?"
+
+obj%/makefile: makefile makefile.conf
+	if [ ! -w $(dir $@) ] && [ $(USE_RAMDISK) -eq 1 ]; then\
+		ln -s /tmp/`date +'%s%N'`-$(dir $@) $(subst /, , $(dir $@)) 2>/dev/null;\
+	fi;\
+	if [ -L $(subst /, , $(dir $@)) ]; then\
+		mkdir -p `readlink $(subst /, , $(dir $@))`;\
+	else\
+		mkdir -p $(dir $@);\
+	fi
+	echo "\
+	SHELL:=/bin/bash$${NEW_LINE}\
+	SRCDIR:=$${NEW_LINE}\
+	$${NEW_LINE}\
+	define NEW_LINE$${NEW_LINE}\
+	$${NEW_LINE}\
+	$${NEW_LINE}\
+	endef$${NEW_LINE}\
+	$${NEW_LINE}\
+	export NEW_LINE$${NEW_LINE}\
+	$${NEW_LINE}\
+	CXXFLAGS:= -pipe -std=c++11 \$$(CXX_OTHER_FLAGS) -c -Wall -pedantic -Wextra -Werror -fPIC $(addprefix -I, $(INCLUDE_PATHS))$${NEW_LINE}\
+	$${NEW_LINE}\
+	SOURCES:= \$$(shell find \$$(SOURCES_BASE_DIR)/\$$(SRCDIR) -maxdepth 1 -type f -name \"*.cpp\")$${NEW_LINE}\
+	DEPENDENCIES:= \$$(patsubst \$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, \$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d, \$$(SOURCES))$${NEW_LINE}\
+	OBJECTS:= \$$(patsubst %.d, %.o, \$$(DEPENDENCIES))$${NEW_LINE}\
+	SOURCES_DIRS:= \$$(shell find \$$(SOURCES_BASE_DIR)/\$$(SRCDIR) -maxdepth 1 -mindepth 1 -type d)$${NEW_LINE}\
+	OBJECTS_DIRS:= \$$(patsubst \$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%, %/, \$$(SOURCES_DIRS))$${NEW_LINE}\
+	OBJECTS_DIRS_MAKEFILES:= \$$(patsubst %, %makefile, \$$(OBJECTS_DIRS))$${NEW_LINE}\
+	$${NEW_LINE}\
+	.PHONY: all$${NEW_LINE}\
+	.PRECIOUS: \$$(DEPENDECIES) \$$(OBJECTS_DIRS_MAKEFILES)$${NEW_LINE}\
+	$${NEW_LINE}\
+	all: \$$(OBJECTS_DIRS) \$$(OBJECTS)$${NEW_LINE}\
+	$${NEW_LINE}\
+	%.d: makefile$${NEW_LINE}\
+		@echo \"\\$${NEW_LINE}\
+		\$$(shell sha1sum <<< \"\$$@\" | sed \"s/  -//g\") = \\$$\$$(shell (\\$$\$$(CXX) -M \\$$\$$(CXXFLAGS) \$$(patsubst \$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d,\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, \$$@) 2>/dev/null || echo \\\"\$$(patsubst \$$(OBJECTS_BASE_DIR)/\$$(SRCDIR)%.d,\$$(SOURCES_BASE_DIR)/\$$(SRCDIR)%.cpp, \$$@) FORCE\\\") | sed \\\"s/.*://g;s/\\\\\\\\\\\\\\\\//g\\\")\$$\$${NEW_LINE}\\$${NEW_LINE}\
+		\$$(patsubst %.d,%.o, \$$@): \\$$\$$(\$$(shell sha1sum <<< \"\$$@\" | sed \"s/  -//g\")) makefile\$$\$${NEW_LINE}\\$${NEW_LINE}\
+			\\$$\$$(CXX) \\$$\$$(CXXFLAGS) \\$$\$$< -o \$$(patsubst %.d,%.o, \$$@)\$$\$${NEW_LINE}\\$${NEW_LINE}\
+		\" > \$$@$${NEW_LINE}\
+	$${NEW_LINE}\
+	%/makefile: makefile$${NEW_LINE}\
+		mkdir -p \$$(dir \$$@)$${NEW_LINE}\
+		cp makefile \$$@$${NEW_LINE}\
+	$${NEW_LINE}\
+	%/: FORCE | %/makefile$${NEW_LINE}\
+		@accesstime=\`stat -c %Y \$$@\` && \\$${NEW_LINE}\
+		\$$(MAKE) -C \$$@ SRCDIR=\$$(SRCDIR)\$$(notdir \$$(patsubst %/, %, \$$@))/ OBJECTS_BASE_DIR=\$$(OBJECTS_BASE_DIR) SOURCES_BASE_DIR=\$$(SOURCES_BASE_DIR) CXX_OTHER_FLAGS=\"\$$(CXX_OTHER_FLAGS)\" && \\$${NEW_LINE}\
+		accesstime2=\`stat -c %Y \$$@\` && \\$${NEW_LINE}\
+		if [ "\$$\$$accesstime" -ne "\$$\$$accesstime2" ]; then \\$${NEW_LINE}\
+			touch .; \\$${NEW_LINE}\
+		fi$${NEW_LINE}\
+	$${NEW_LINE}\
+	FORCE:$${NEW_LINE}\
+	$${NEW_LINE}\
+	-include \$$(DEPENDENCIES)" > $@
+
+debug: build-debug
+
+release: build-release
+
+clean: clean-debug clean-release
+	$(RM) -r doc
+
+
+
+bin-debug/$(EXECUTABLE): obj-debug/ $(OBJECTS_DEBUG)
+	if [ ! -w $(dir $@) ] && [ $(USE_RAMDISK) -eq 1 ]; then\
+		ln -s /tmp/`date +'%s%N'`-$(dir $@) $(subst /, , $(dir $@)) 2>/dev/null;\
+	fi;\
+	if [ -L $(subst /, , $(dir $@)) ]; then\
+		mkdir -p `readlink $(subst /, , $(dir $@))`;\
+	else\
+		mkdir -p $(dir $@);\
+	fi
+	$(CXX) $(OBJECTS_DEBUG) -o $@ $(LDFLAGS_DEBUG)
+
+bin-release/$(EXECUTABLE): obj-release/ $(OBJECTS_RELEASE)
+	if [ ! -w $(dir $@) ] && [ $(USE_RAMDISK) -eq 1 ]; then\
+		ln -s /tmp/`date +'%s%N'`-$(dir $@) $(subst /, , $(dir $@)) 2>/dev/null;\
+	fi;\
+	if [ -L $(subst /, , $(dir $@)) ]; then\
+		mkdir -p `readlink $(subst /, , $(dir $@))`;\
+	else\
+		mkdir -p $(dir $@);\
+	fi
+	$(CXX) $(OBJECTS_RELEASE) -o $@ $(LDFLAGS_RELEASE)
+
+
+
+obj-debug/: FORCE | obj-debug/makefile 
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=$(realpath obj-debug) SOURCES_BASE_DIR=$(realpath src) CXX_OTHER_FLAGS="-g -O0"
+
+obj-release/: FORCE | obj-release/makefile
+	$(MAKE) -C $@ OBJECTS_BASE_DIR=$(realpath obj-release) SOURCES_BASE_DIR=$(realpath src) CXX_OTHER_FLAGS="-O3"
+
+
+
+$(OBJECTS_DEBUG): obj-debug/
+
+$(OBJECTS_RELEASE): obj-release/
+
+
+build-debug: bin-debug/$(EXECUTABLE)
+
+build-release: bin-release/$(EXECUTABLE)
+
+
+
+clean-debug:
+	if [ -L obj-debug ]; then\
+		rm -r `readlink obj-debug`;\
+	fi
+	if [ -L bin-debug ]; then\
+		rm -r `readlink bin-debug`;\
+	fi
+	$(RM) -r *.o *.d bin-debug obj-debug
+
+clean-release:
+	if [ -L obj-release ]; then\
+		rm -r `readlink obj-release`;\
+	fi
+	if [ -L lib-release ]; then\
+		rm -r `readlink lib-release`;\
+	fi
+	$(RM) -r *.o *.d bin-release obj-release
+
+
+
+FORCE:
+
+
+
+doc:
+	doxygen
+
diff --git a/alphabetManip2/makefile.conf b/alphabetManip2/makefile.conf
new file mode 100644
index 0000000000000000000000000000000000000000..0ff668d6c2389aa4d856d33cfda140e7f2556c5e
--- /dev/null
+++ b/alphabetManip2/makefile.conf
@@ -0,0 +1,4 @@
+EXECUTABLE:=alphabetManip2
+LINK_PATHS=../alib2elgo/ ../alib2algo/ ../alib2data/ ../alib2std/
+LINK_LIBRARIES=alib2elgo alib2algo alib2data alib2std xml2
+INCLUDE_PATHS=\$$(SOURCES_BASE_DIR)/../../alib2elgo/src/ \$$(SOURCES_BASE_DIR)/../../alib2algo/src/ \$$(SOURCES_BASE_DIR)/../../alib2data/src/ \$$(SOURCES_BASE_DIR)/../../alib2std/src/ /usr/include/libxml2/
diff --git a/alphabetManip2/src/alphabetManip.cpp b/alphabetManip2/src/alphabetManip.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7bc7f265a33a587e18832d2e5ed0ef96a3e81530
--- /dev/null
+++ b/alphabetManip2/src/alphabetManip.cpp
@@ -0,0 +1,136 @@
+/*
+ * alphabetManip.cpp
+ *
+ *  Created on: 26. 3. 2014
+ *	  Author: Jan Travnicek
+ */
+
+#include <tclap/CmdLine.h>
+#include <vector>
+
+#include <factory/XmlDataFactory.hpp>
+#include <exception/AlibException.h>
+#include <tree/RankedTreeWrapper.h>
+#include <tree/UnrankedTreeWrapper.h>
+#include <string/String.h>
+#include <container/ObjectsSet.h>
+
+#include <iostream>
+
+template < class T >
+void process ( T & data, TCLAP::ValueArg < std::string > & operation, std::deque < sax::Token > & argumentTokens ) {
+	typedef typename std::remove_const < typename std::remove_reference < decltype ( data.getAlphabet ( ) ) >::type >::type alphabetType;
+
+	if ( operation.getValue ( ) == "get" ) {
+		std::chrono::measurements::end ( );
+		std::chrono::measurements::start ( "Algorithm", std::chrono::measurements::Type::MAIN );
+
+		const alphabetType & res = data.getAlphabet ( );
+
+		std::chrono::measurements::end ( );
+		std::chrono::measurements::start ( "Output write", std::chrono::measurements::Type::AUXILARY );
+
+		alib::XmlDataFactory::toStdout ( res );
+	} else if ( operation.getValue ( ) == "add" ) {
+		alphabetType symbols = alib::XmlDataFactory::fromTokens < alphabetType > ( argumentTokens );
+
+		std::chrono::measurements::end ( );
+		std::chrono::measurements::start ( "Algorithm", std::chrono::measurements::Type::MAIN );
+
+		data.extendAlphabet ( symbols );
+
+		std::chrono::measurements::end ( );
+		std::chrono::measurements::start ( "Output write", std::chrono::measurements::Type::AUXILARY );
+
+		alib::XmlDataFactory::toStdout ( data );
+	} else if ( operation.getValue ( ) == "set" ) {
+	} else if ( operation.getValue ( ) == "remove" ) {
+	} else {
+		throw exception::AlibException ( "Invalid operation" );
+	}
+}
+
+int main ( int argc, char * argv[] ) {
+	try {
+		TCLAP::CmdLine cmd ( "Alphabet manipulation binary", ' ', "0.01" );
+
+		std::vector < std::string > allowed;
+		allowed.push_back ( "get" );
+		allowed.push_back ( "set" );
+		allowed.push_back ( "add" );
+		allowed.push_back ( "remove" );
+		TCLAP::ValuesConstraint < std::string > allowedVals ( allowed );
+
+		TCLAP::ValueArg < std::string > operation ( "o", "operation", "Operation type", false, "", & allowedVals );
+		cmd.add ( operation );
+
+		TCLAP::ValueArg < std::string > input ( "i", "input", "Input from file", false, "-", "file" );
+		cmd.add ( input );
+
+		TCLAP::ValueArg < std::string > argument ( "a", "argument", "Operation argument", false, "", "file" );
+		cmd.add ( argument );
+
+		TCLAP::SwitchArg measure ( "m", "measure", "Measure times", false );
+		cmd.add ( measure );
+
+		TCLAP::SwitchArg verbose ( "v", "verbose", "Be verbose", false );
+		cmd.add ( verbose );
+
+		cmd.parse ( argc, argv );
+
+		std::chrono::measurements::start ( "Overal", std::chrono::measurements::Type::OVERALL );
+		std::chrono::measurements::start ( "Input read", std::chrono::measurements::Type::AUXILARY );
+
+		std::deque < sax::Token > inputTokens;
+
+		if ( input.isSet ( ) ) {
+			if ( input.getValue ( ) == "-" )
+				sax::SaxParseInterface::parseStdin ( inputTokens );
+			else
+				sax::SaxParseInterface::parseFile ( input.getValue ( ), inputTokens );
+		} else {
+			sax::SaxParseInterface::parseStdin ( inputTokens );
+		}
+
+		std::deque < sax::Token > argumentTokens;
+
+		if ( argument.isSet ( ) ) {
+			if ( argument.getValue ( ) == "-" )
+				sax::SaxParseInterface::parseStdin ( argumentTokens );
+			else
+				sax::SaxParseInterface::parseFile ( argument.getValue ( ), argumentTokens );
+		}
+
+		if ( alib::XmlDataFactory::first < tree::RankedTreeWrapper > ( inputTokens ) ) {
+			tree::RankedTreeWrapper data = alib::XmlDataFactory::fromTokens < tree::RankedTreeWrapper > ( inputTokens );
+			process ( data, operation, argumentTokens );
+		} else if ( alib::XmlDataFactory::first < tree::UnrankedTreeWrapper > ( inputTokens ) ) {
+			tree::UnrankedTreeWrapper data = alib::XmlDataFactory::fromTokens < tree::UnrankedTreeWrapper > ( inputTokens );
+			process ( data, operation, argumentTokens );
+		} else if ( alib::XmlDataFactory::first < string::String > ( inputTokens ) ) {
+			string::String data = alib::XmlDataFactory::fromTokens < string::String > ( inputTokens );
+			process ( data, operation, argumentTokens );
+		} else {
+			throw exception::AlibException ( "Invalid data type" );
+		}
+
+		std::chrono::measurements::end ( );
+		std::chrono::measurements::end ( );
+
+		if ( measure.getValue ( ) ) std::clog << std::chrono::measurements::results ( ) << std::endl;
+
+		return 0;
+	} catch ( const exception::AlibException & exception ) {
+		alib::XmlDataFactory::toStdout ( exception );
+		return 1;
+	} catch ( const TCLAP::ArgException & exception ) {
+		std::cout << exception.error ( ) << std::endl;
+		return 2;
+	} catch ( const std::exception & exception ) {
+		std::cerr << "Exception caught: " << exception.what ( ) << std::endl;
+		return 3;
+	} catch ( ... ) {
+		std::cerr << "Unknown exception caught." << std::endl;
+		return 127;
+	}
+}
diff --git a/makefile b/makefile
index c181e3ef3c0bc68f94ef734f869d2c6ac3072c7b..c88824b4a32c33ecf3f2719715713208c939b0c4 100644
--- a/makefile
+++ b/makefile
@@ -34,6 +34,7 @@ SUBDIRS_BINS = aecho2 \
 		astringology2 \
 		atrim2 \
 		tniceprint \
+		alphabetManip2 \
 
 define NEW_LINE