diff --git a/alib2data/src/common/wrapper.hpp b/alib2data/src/common/wrapper.hpp
index f1ba7aff7f7b6e6cb6aa7902f9e47b57e291e9a9..3b674f9bb2b5d3a65a9208f9e10497ee6614aafc 100644
--- a/alib2data/src/common/wrapper.hpp
+++ b/alib2data/src/common/wrapper.hpp
@@ -82,6 +82,10 @@ public:
 		os << *(instance.data);
 		return os;
 	}
+
+	operator std::string () const {
+		return (std::string) *data;
+	}
 };
 
 } /* namespace alib */
diff --git a/alib2data/src/label/Label.cpp b/alib2data/src/label/Label.cpp
deleted file mode 100644
index c54a821e439f8ee363f31773d520a0e9a782c9a0..0000000000000000000000000000000000000000
--- a/alib2data/src/label/Label.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Label.cpp
- *
- *  Created on: Apr 16, 2013
- *      Author: Jan Travnicek
- */
-
-#include "Label.h"
-
-namespace label {
-
-Label::Label(const LabelBase& label) : label(label.clone()) {
-
-}
-
-Label::Label(LabelBase&& label) : label(std::move(label).plunder()) {
-
-}
-
-Label::Label(const Label& other) : label(other.getLabel().clone()) {
-
-}
-
-Label::Label(Label&& other) noexcept : label(other.label) {
-	other.label = NULL;
-}
-
-Label& Label::operator=(const Label& other) {
-	if(this == &other) return *this;
-
-	delete label;
-	label = other.getLabel().clone();
-
-	return *this;
-}
-
-Label& Label::operator=(Label&& other) noexcept {
-	std::swap(this->label, other.label);
-	return *this;
-}
-
-Label::~Label() {
-	delete label;
-}
-
-const LabelBase& Label::getLabel() const {
-	return *label;
-}
-
-LabelBase& Label::getLabel() {
-	return *label;
-}
-
-void Label::setLabel(const LabelBase& label) {
-	delete this->label;
-	this->label = label.clone();
-}
-
-void Label::setLabel(LabelBase&& label) {
-	delete this->label;
-	this->label = std::move(label).plunder();
-}
-
-bool Label::operator!=(const Label& other) const {
-	return !(*this == other);
-}
-
-bool Label::operator<(const Label& other) const {
-	return *label < *other.label;
-}
-
-bool Label::operator==(const Label& other) const {
-	return *label == *other.label;
-}
-
-std::ostream& operator<<(std::ostream& os, const Label& label) {
-	os << label.getLabel();
-	return os;
-}
-
-Label::operator std::string () const {
-	return (std::string) *label;
-}
-
-} /* namespace label */
-
diff --git a/alib2data/src/label/Label.h b/alib2data/src/label/Label.h
index 608c44043320d0fccc48fa4b67baafee51aa05f5..7ed6d1e12e82337bddd570f13f1b6db540aa91a4 100644
--- a/alib2data/src/label/Label.h
+++ b/alib2data/src/label/Label.h
@@ -9,6 +9,7 @@
 #define LABEL_H_
 
 #include "../std/visitor.hpp"
+#include "../common/wrapper.hpp"
 #include "LabelBase.h"
 
 namespace label {
@@ -16,34 +17,7 @@ namespace label {
 /**
  * Wrapper around automata.
  */
-class Label {
-protected:
-	LabelBase* label;
-public:
-	explicit Label(const LabelBase& label);
-	explicit Label(LabelBase&& label);
-	Label(const Label& other);
-	Label(Label&&) noexcept;
-	Label& operator=(const Label& other);
-	Label& operator=(Label&& other) noexcept;
-	virtual ~Label() noexcept;
-
-	const LabelBase& getLabel() const;
-	LabelBase& getLabel();
-
-	void setLabel(const LabelBase& label);
-	void setLabel(LabelBase&& label);
-
-	bool operator<(const Label& other) const;
-	
-	bool operator!=(const Label& other) const;
-
-	bool operator==(const Label& other) const;
-
-	friend std::ostream& operator<<(std::ostream& os, const Label& label);
-
-	operator std::string () const;
-};
+typedef alib::wrapper<LabelBase> Label;
 
 } /* namespace label */
 
diff --git a/alib2data/src/label/LabelToStringComposer.cpp b/alib2data/src/label/LabelToStringComposer.cpp
index 0480d50a2ff8f0e610f1b24336b34b65798b0c3d..722bf0a182c46365b5198e585758f717393811fe 100644
--- a/alib2data/src/label/LabelToStringComposer.cpp
+++ b/alib2data/src/label/LabelToStringComposer.cpp
@@ -42,7 +42,7 @@ void LabelToStringComposer::Visit(void* userData, const IntegerLabel& symbol) {
 }
 
 void LabelToStringComposer::Visit(void* userData, const Label& symbol) {
-	symbol.getLabel().Accept(userData, *this);
+	symbol.getData().Accept(userData, *this);
 
 }
 
diff --git a/alib2data/src/label/LabelToXMLComposer.cpp b/alib2data/src/label/LabelToXMLComposer.cpp
index f87828ea666776ea42885cff65382dee11ddef06..74d5efc2eccffeeda93c3ad99e74f22bff837d13 100644
--- a/alib2data/src/label/LabelToXMLComposer.cpp
+++ b/alib2data/src/label/LabelToXMLComposer.cpp
@@ -38,7 +38,7 @@ void LabelToXMLComposer::Visit(void* userData, const StringLabel& label) const {
 }
 
 void LabelToXMLComposer::Visit(void* userData, const Label& label) const {
-	label.getLabel().Accept(userData, *this);
+	label.getData().Accept(userData, *this);
 
 }
 
diff --git a/alib2data/src/label/NextLabel.cpp b/alib2data/src/label/NextLabel.cpp
index c08ae9ff5f5c12849e2048431620ba568959631c..51e60c336379ef45cd14560218e97a4c3fd59ae6 100644
--- a/alib2data/src/label/NextLabel.cpp
+++ b/alib2data/src/label/NextLabel.cpp
@@ -32,7 +32,7 @@ void NextLabel::Visit(void* userData, const StringLabel& label) {
 }
 
 void NextLabel::Visit(void* userData, const Label& label) {
-	label.getLabel().Accept(userData, *this);
+	label.getData().Accept(userData, *this);
 
 }