diff --git a/alib2data/src/alphabet/RankedSymbol.cpp b/alib2data/src/alphabet/RankedSymbol.cpp
index a5320a7408bd12c419c1389bd6d27c3c5512d96b..0c300b7f41d4deb9478bb3886b0319b9ac043088 100644
--- a/alib2data/src/alphabet/RankedSymbol.cpp
+++ b/alib2data/src/alphabet/RankedSymbol.cpp
@@ -2,23 +2,23 @@
 
 namespace alphabet {
 
-RankedSymbol::RankedSymbol(int number, int rank) : label(label::labelFrom(number)), rank(rank) {
+RankedSymbol::RankedSymbol(int number, int rank) : label(label::labelFrom(number)), rank(primitive::Integer(rank)) {
 
 }
 
-RankedSymbol::RankedSymbol(char character, int rank) : label(label::labelFrom(character)), rank(rank) {
+RankedSymbol::RankedSymbol(char character, int rank) : label(label::labelFrom(character)), rank(primitive::Integer(rank)) {
 
 }
 
-RankedSymbol::RankedSymbol(const std::string& label, int rank) : label(label::labelFrom(label)), rank(rank) {
+RankedSymbol::RankedSymbol(const std::string& label, int rank) : label(label::labelFrom(label)), rank(primitive::Integer(rank)) {
 
 }
 
-RankedSymbol::RankedSymbol(const label::Label& label, int rank) : label(label), rank(rank) {
+RankedSymbol::RankedSymbol(const label::Label& label, const primitive::Integer& rank) : label(label), rank(rank) {
 
 }
 
-RankedSymbol::RankedSymbol(label::Label&& label, int rank) : label(std::move(label)), rank(rank) {
+RankedSymbol::RankedSymbol(label::Label&& label, primitive::Integer&& rank) : label(std::move(label)), rank(std::move(rank)) {
 
 }
 
@@ -34,7 +34,7 @@ const label::Label& RankedSymbol::getLabel() const {
 	return label;
 }
 
-int RankedSymbol::getRank() const {
+const primitive::Integer& RankedSymbol::getRank() const {
 	return rank;
 }
 
@@ -61,11 +61,11 @@ bool RankedSymbol::operator <(const RankedSymbol& other) const {
 }
 
 void RankedSymbol::operator>>(std::ostream& out) const {
-	out << "(RankedSymbol " << this->label << " #" << rank << ")";
+	out << "(RankedSymbol " << label << " #" << rank << ")";
 }
 
 RankedSymbol::operator std::string () const {
-	return (std::string) label + "_" + std::to_string(rank);
+	return (std::string) label + "_" + (std::string) rank;
 }
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h
index bda49d7815fa323d1b12636f00142cd3d98d0512..c13b2c94ba7965a5776e1735f0ca90b003408908 100644
--- a/alib2data/src/alphabet/RankedSymbol.h
+++ b/alib2data/src/alphabet/RankedSymbol.h
@@ -4,6 +4,7 @@
 #include "../label/Label.h"
 #include "SymbolBase.h"
 #include <ostream>
+#include "../primitive/Integer.h"
 
 namespace alphabet {
 
@@ -13,7 +14,7 @@ namespace alphabet {
 class RankedSymbol : public std::acceptor<RankedSymbol, VisitableSymbolBase, std::acceptor<RankedSymbol, alib::VisitableObjectBase, SymbolBase> > {
 protected:
 	label::Label label;
-	int rank;
+	primitive::Integer rank;
 	
 public:
 	explicit RankedSymbol(int number, int rank);
@@ -25,8 +26,8 @@ public:
 	 * @param symbol name of the symbol
 	 * @param rank of the symbol
 	 */
-	explicit RankedSymbol(const label::Label& label, int rank);
-	explicit RankedSymbol(label::Label&& label, int rank);
+	explicit RankedSymbol(const label::Label& label, const primitive::Integer& rank);
+	explicit RankedSymbol(label::Label&& label, primitive::Integer&& rank);
 
 	virtual SymbolBase* clone() const;
 	virtual SymbolBase* plunder() &&;
@@ -39,7 +40,7 @@ public:
 	/**
 	 * @return rank of the symbol
 	 */
-	int getRank() const;
+	const primitive::Integer& getRank() const;
 
 	virtual bool operator <(const alib::ObjectBase& other) const;
 	virtual bool operator ==(const alib::ObjectBase& other) const;
diff --git a/alib2data/src/alphabet/SymbolFeatures.h b/alib2data/src/alphabet/SymbolFeatures.h
index cce97fbfe676712c965bd43676cbf24e4ab9c95d..23d2f2c799db1dc30bcdecf533b49a38c6a414bf 100644
--- a/alib2data/src/alphabet/SymbolFeatures.h
+++ b/alib2data/src/alphabet/SymbolFeatures.h
@@ -14,7 +14,9 @@ enum class FEATURES {
 	LABELED,
 	BLANK,
 	BOTTOM,
-	END
+	END,
+	RANKED,
+	BAR
 };
 
 } /* namespace alphabet */
diff --git a/alib2data/src/alphabet/SymbolFromXMLParser.cpp b/alib2data/src/alphabet/SymbolFromXMLParser.cpp
index a2769e28962d5d591fccfcb4a1e5959e8e0c2e9d..408d7b1002c4f8379f172f004c0785d63e043067 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}));
+	return parseSymbol(input, std::set<FEATURES>({FEATURES::LABELED, FEATURES::BLANK, FEATURES::BOTTOM, FEATURES::END, FEATURES::RANKED, FEATURES::BAR}));
 }
 
 Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std::set<FEATURES>& features) const {
@@ -31,6 +31,12 @@ Symbol SymbolFromXMLParser::parseSymbol(std::list<sax::Token>& input, const std:
 	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "EndSymbol")) {
 		if(!features.count(FEATURES::END)) throw exception::AlibException();
 		return Symbol(parseEndSymbol(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol")) {
+		if(!features.count(FEATURES::RANKED)) throw exception::AlibException();
+		return Symbol(parseRankedSymbol(input));
+	} else if(isToken(input, sax::Token::TokenType::START_ELEMENT, "BarSymbol")) {
+		if(!features.count(FEATURES::BAR)) throw exception::AlibException();
+		return Symbol(parseBarSymbol(input));
 	} else {
 		throw sax::ParserException(sax::Token("LabeledSymbol, BlankSymbol, BottomOfTheStackSymbol, EndSymbol", sax::Token::TokenType::START_ELEMENT), input.front());
 	}
@@ -72,7 +78,7 @@ EndSymbol SymbolFromXMLParser::parseEndSymbol(std::list<sax::Token>& input) cons
 RankedSymbol SymbolFromXMLParser::parseRankedSymbol(std::list<sax::Token>& input) const {
 	popToken(input, sax::Token::TokenType::START_ELEMENT, "RankedSymbol");
 	label::Label data = alib::api<label::Label>::parse(input);
-	int rank = std::stoi(popTokenData(input, sax::Token::TokenType::CHARACTER));
+	primitive::Integer rank = alib::api<primitive::Integer>::parse(input);
 	popToken(input, sax::Token::TokenType::END_ELEMENT, "RankedSymbol");
 	return RankedSymbol(data, rank);
 }
diff --git a/alib2data/src/alphabet/SymbolToStringComposer.cpp b/alib2data/src/alphabet/SymbolToStringComposer.cpp
index 3b365ce9a6180dfe15b3e242f84de6b031d667cb..f42d3eb9d42db6ff24adea0f8ba1a67295eb9d07 100644
--- a/alib2data/src/alphabet/SymbolToStringComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToStringComposer.cpp
@@ -7,6 +7,7 @@
 
 #include "SymbolToStringComposer.h"
 #include "../label/LabelToStringComposer.h"
+#include "../primitive/PrimitiveToStringComposer.h"
 #include <algorithm>
 #include "LabeledSymbol.h"
 #include "RankedSymbol.h"
@@ -41,9 +42,10 @@ void SymbolToStringComposer::Visit(void* userData, const EndSymbol&) {
 void SymbolToStringComposer::Visit(void* userData, const RankedSymbol& symbol) {
 	std::stringstream &out = *((std::stringstream*) userData);
 
-	label::LabelToStringComposer composer;
-	out << composer.compose(symbol.getLabel());
-	out << std::to_string(symbol.getRank());
+	label::LabelToStringComposer composer1;
+	out << composer1.compose(symbol.getLabel());
+	primitive::PrimitiveToStringComposer composer2;
+	out << composer2.compose(primitive::Primitive(symbol.getRank()));
 }
 
 void SymbolToStringComposer::Visit(void* userData, const BarSymbol&) {
diff --git a/alib2data/src/alphabet/SymbolToXMLComposer.cpp b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
index d3a4e07231beb549e2c4c8a1c06c3bbf9d00063e..263155c543f05248c8826d84b1bef149d088f0be 100644
--- a/alib2data/src/alphabet/SymbolToXMLComposer.cpp
+++ b/alib2data/src/alphabet/SymbolToXMLComposer.cpp
@@ -56,7 +56,7 @@ std::list<sax::Token> SymbolToXMLComposer::compose(const RankedSymbol& symbol) c
 	std::list<sax::Token> out;
 	out.push_back(sax::Token("RankedSymbol", sax::Token::TokenType::START_ELEMENT));
 	out.splice(out.end(), alib::api<label::Label>::compose(symbol.getLabel()));
-	out.push_back(sax::Token(std::to_string(symbol.getRank()), sax::Token::TokenType::CHARACTER));
+	out.splice(out.end(), alib::api<primitive::Integer>::compose(symbol.getRank()));
 	out.push_back(sax::Token("RankedSymbol", sax::Token::TokenType::END_ELEMENT));
 	return out;
 }