diff --git a/acast2/src/cast/TreeCastVisitor.cpp b/acast2/src/cast/TreeCastVisitor.cpp
index 07d59c107339b734db12ece23e4b1b42715df553..df1aa8c0ae07bf371dbd4dd97ee8f78483df650c 100644
--- a/acast2/src/cast/TreeCastVisitor.cpp
+++ b/acast2/src/cast/TreeCastVisitor.cpp
@@ -6,6 +6,8 @@
  */
 
 #include "TreeCastVisitor.h"
+#include "tree/TreeClasses.h"
+
 #include "../CastVisitorBase.hpp"
 
 typedef cast_base_helper< tree::VisitableTreeBase::const_visitor_type, tree::TreeBase, alib::TreeTypes, tree::Tree, alib::TreeTypes > TreeCastVisitorType;
diff --git a/acast2/src/cast/TreeToStringCastVisitor.cpp b/acast2/src/cast/TreeToStringCastVisitor.cpp
index e3a1c1c2bd06c7c3667f918850f3e900ebffdc5e..90b45d1f3436fd59ad163e16a71f0e3c16676eda 100644
--- a/acast2/src/cast/TreeToStringCastVisitor.cpp
+++ b/acast2/src/cast/TreeToStringCastVisitor.cpp
@@ -7,6 +7,7 @@
 
 #include "TreeToStringCastVisitor.h"
 #include "string/StringClasses.h"
+#include "tree/TreeClasses.h"
 
 #include "../CastVisitorBase.hpp"
 
diff --git a/alib2data/src/XmlApi.cpp b/alib2data/src/XmlApi.cpp
index a1b1060270977732d1f3020e0909bc57c361530d..c329be3a3e41eca4523f5f0e06ae939bd07d8f33 100644
--- a/alib2data/src/XmlApi.cpp
+++ b/alib2data/src/XmlApi.cpp
@@ -17,6 +17,7 @@
 #include "container/ContainerClasses.h"
 #include "grammar/GrammarClasses.h"
 #include "regexp/RegExpClasses.h"
+#include "tree/TreeClasses.h"
 
 namespace alib {
 
diff --git a/alib2data/src/object/ObjectBase.h b/alib2data/src/object/ObjectBase.h
index 2af6fb36da8ac3742c9e957a22610181c3c9514a..00062148c4a5da8f5914aeb0414613cebce4b34c 100644
--- a/alib2data/src/object/ObjectBase.h
+++ b/alib2data/src/object/ObjectBase.h
@@ -33,19 +33,7 @@ class UndirectedGraph;
 #include "../alphabet/SymbolFeatures.h"
 #include "../container/ContainerFeatures.h"
 #include "../primitive/PrimitiveFeatures.h"
-
-namespace tree {
-
-class RankedTree;
-class RankedPattern;
-class PrefixRankedTree;
-class PrefixRankedBarTree;
-class PrefixRankedPattern;
-class PrefixRankedBarPattern;
-class UnrankedTree;
-class UnrankedPattern;
-
-}
+#include "../tree/TreeFeatures.h"
 
 namespace alib {
 
@@ -83,6 +71,7 @@ typedef std::tuple< automaton::DFA, automaton::NFA, automaton::MultiInitialState
 
 typedef std::tuple< Void, exception::AlibException
 	> OtherTypes;
+
 // --------------------------------------------------------------------------------------------------------------------
 
 template<typename ... Ts>
diff --git a/alib2data/src/tree/Tree.h b/alib2data/src/tree/Tree.h
index 5a9b9981e51c76338994266c4820cc6adb493c7e..7ccac890a129d9100fdb26162fbf90a5653fa337 100644
--- a/alib2data/src/tree/Tree.h
+++ b/alib2data/src/tree/Tree.h
@@ -16,7 +16,18 @@ namespace tree {
 /**
  * Wrapper around tree.
  */
-typedef alib::wrapper<TreeBase> Tree;
+class Tree : public alib::wrapper<TreeBase> {
+public:
+	explicit Tree(TreeBase* data) : alib::wrapper<TreeBase>(data) {
+	}
+
+	explicit Tree(const TreeBase& data) : alib::wrapper<TreeBase>(data.clone()) {
+	}
+
+	explicit Tree(TreeBase&& data) : alib::wrapper<TreeBase>(std::move(data).plunder()) {
+	}
+
+};
 
 } /* namespace tree */
 
diff --git a/alib2data/src/tree/TreeBase.h b/alib2data/src/tree/TreeBase.h
index 85198e5efb2412216ad2afee21ab9abca6033609..5f85a2a53a15850e1e97fa3a5af0549b3a4fb8ea 100644
--- a/alib2data/src/tree/TreeBase.h
+++ b/alib2data/src/tree/TreeBase.h
@@ -8,9 +8,7 @@
 #ifndef TREE_BASE_H_
 #define TREE_BASE_H_
 
-#include "../common/base.hpp"
 #include "../object/ObjectBase.h"
-#include "../exception/AlibException.h"
 
 namespace tree {
 
diff --git a/alib2data/src/tree/TreeClasses.h b/alib2data/src/tree/TreeClasses.h
new file mode 100644
index 0000000000000000000000000000000000000000..213a49d4ed8dfaeee6e3e1ef97a7f0db4d6a9921
--- /dev/null
+++ b/alib2data/src/tree/TreeClasses.h
@@ -0,0 +1,20 @@
+/*
+ * TreeClasses.h
+ *
+ *  Created on: Nov 16, 2014
+ *      Author: Jan Travnicek
+ */
+
+#ifndef TREE_CLASSES_H_
+#define TREE_CLASSES_H_
+
+#include "ranked/RankedTree.h"
+#include "ranked/RankedPattern.h"
+#include "ranked/PrefixRankedTree.h"
+#include "ranked/PrefixRankedBarTree.h"
+#include "ranked/PrefixRankedPattern.h"
+#include "ranked/PrefixRankedBarPattern.h"
+#include "unranked/UnrankedTree.h"
+#include "unranked/UnrankedPattern.h"
+
+#endif /* TREE_CLASSES_H_ */
diff --git a/alib2data/src/tree/TreeFeatures.h b/alib2data/src/tree/TreeFeatures.h
index ce2f78a82b872a26b872c0286d3233d70c72422a..ebc94bef348a1f72903ac1b3412d12055937bfb4 100644
--- a/alib2data/src/tree/TreeFeatures.h
+++ b/alib2data/src/tree/TreeFeatures.h
@@ -11,9 +11,30 @@
 namespace tree {
 
 enum class FEATURES {
-	RANKED_TREE, RANKED_PATTERN, PREFIX_RANKED_TREE, PREFIX_RANKED_BAR_TREE, PREFIX_RANKED_PATTERN, PREFIX_RANKED_BAR_PATTERN, UNRANKED_TREE, UNRANKED_PATTERN
+	RANKED_TREE,
+	RANKED_PATTERN,
+	PREFIX_RANKED_TREE,
+	PREFIX_RANKED_BAR_TREE,
+	PREFIX_RANKED_PATTERN,
+	PREFIX_RANKED_BAR_PATTERN,
+	UNRANKED_TREE,
+	UNRANKED_PATTERN
 };
 
+class Tree;
+
+class RankedTree;
+class RankedPattern;
+class PrefixRankedTree;
+class PrefixRankedBarTree;
+class PrefixRankedPattern;
+class PrefixRankedBarPattern;
+class UnrankedTree;
+class UnrankedPattern;
+
+class RankedNode;
+class UnrankedNode;
+
 } /* namespace tree */
 
 #endif /* TREE_FEATURES_H_ */
diff --git a/alib2data/src/tree/TreeFromRawParser.cpp b/alib2data/src/tree/TreeFromRawParser.cpp
index 94baa2943f0c734cdd8435c531b89c976422641e..ef227f0f4e2a1e25c9232c754642abf222e02ed6 100644
--- a/alib2data/src/tree/TreeFromRawParser.cpp
+++ b/alib2data/src/tree/TreeFromRawParser.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "TreeFromRawParser.h"
+#include "Tree.h"
 #include "TreeException.h"
 #include "ranked/RankedTree.h"
 #include "ranked/PrefixRankedTree.h"
diff --git a/alib2data/src/tree/TreeFromRawParser.h b/alib2data/src/tree/TreeFromRawParser.h
index 67339771944cef668820841726ead700ea84ea32..0e9b335405a4298f6593c8247027caa59da9e7cd 100644
--- a/alib2data/src/tree/TreeFromRawParser.h
+++ b/alib2data/src/tree/TreeFromRawParser.h
@@ -9,9 +9,7 @@
 #define TREE_FROM_RAW_PARSER
 
 #include "../sax/FromXMLParserHelper.h"
-#include "Tree.h"
 #include "TreeFeatures.h"
-#include <deque>
 #include <set>
 #include "unranked/UnrankedNode.h"
 
diff --git a/alib2data/src/tree/TreeFromXMLParser.cpp b/alib2data/src/tree/TreeFromXMLParser.cpp
index 5a0752393e130d9c797b15dc0937a2b2b71d1227..a5e67f91ba56b7cb8fa8be0d150ae113c031e356 100644
--- a/alib2data/src/tree/TreeFromXMLParser.cpp
+++ b/alib2data/src/tree/TreeFromXMLParser.cpp
@@ -6,11 +6,12 @@
  */
 
 #include "TreeFromXMLParser.h"
-
 #include "../sax/ParserException.h"
-
 #include "../XmlApi.hpp"
 
+#include "Tree.h"
+#include "TreeClasses.h"
+
 namespace tree {
 
 Tree TreeFromXMLParser::parseTree(std::deque<sax::Token>::iterator& input) const {
diff --git a/alib2data/src/tree/TreeFromXMLParser.h b/alib2data/src/tree/TreeFromXMLParser.h
index 208f6a764cbf2870cdb21b6026ba60b8a365d47e..5131a5be765f0708ba5fe5566622534e1709b791 100644
--- a/alib2data/src/tree/TreeFromXMLParser.h
+++ b/alib2data/src/tree/TreeFromXMLParser.h
@@ -9,15 +9,13 @@
 #define TREE_FROM_XML_PARSER_H_
 
 #include "../sax/FromXMLParserHelper.h"
-#include "Tree.h"
 #include "TreeFeatures.h"
-#include "ranked/RankedTree.h"
-#include "unranked/UnrankedTree.h"
 
-#include <deque>
 #include <set>
 #include <variant>
-#include "../sax/Token.h"
+#include <vector>
+
+#include "../alphabet/Symbol.h"
 
 namespace alib {
 
diff --git a/alib2data/src/tree/TreeToRawComposer.cpp b/alib2data/src/tree/TreeToRawComposer.cpp
index 56430c335f071547dd435b6ae4cf587c51dd6773..038d89faf5f067b2e1adb98108932b573c8c2982 100644
--- a/alib2data/src/tree/TreeToRawComposer.cpp
+++ b/alib2data/src/tree/TreeToRawComposer.cpp
@@ -7,8 +7,8 @@
 
 #include "TreeToRawComposer.h"
 #include "TreeException.h"
-
 #include "../XmlApi.hpp"
+#include "TreeClasses.h"
 
 namespace tree {
 
diff --git a/alib2data/src/tree/TreeToRawComposer.h b/alib2data/src/tree/TreeToRawComposer.h
index 14c2f3cd7869d65175c5b7273b2ac2c0d476d769..483a36c3392640bb6084aa277dd3f7e020224abb 100644
--- a/alib2data/src/tree/TreeToRawComposer.h
+++ b/alib2data/src/tree/TreeToRawComposer.h
@@ -10,9 +10,8 @@
 
 #include <deque>
 #include "Tree.h"
-#include "ranked/RankedTree.h"
-#include "unranked/UnrankedTree.h"
 #include "../sax/Token.h"
+#include <vector>
 
 namespace alib {
 
diff --git a/alib2data/src/tree/TreeToXMLComposer.cpp b/alib2data/src/tree/TreeToXMLComposer.cpp
index 5cb8455434417bba492cfd8db741726c6d0c6910..340f2d439baa8b5e5088414b59ea07afac883e8d 100644
--- a/alib2data/src/tree/TreeToXMLComposer.cpp
+++ b/alib2data/src/tree/TreeToXMLComposer.cpp
@@ -6,8 +6,8 @@
  */
 
 #include "TreeToXMLComposer.h"
-
 #include "../XmlApi.hpp"
+#include "TreeClasses.h"
 
 namespace tree {
 
diff --git a/alib2data/src/tree/TreeToXMLComposer.h b/alib2data/src/tree/TreeToXMLComposer.h
index b5a978c6414c438ddaebdea146e49c5b624e0a31..c807678c58bdb48ae684c859d5179a31dcc69957 100644
--- a/alib2data/src/tree/TreeToXMLComposer.h
+++ b/alib2data/src/tree/TreeToXMLComposer.h
@@ -8,18 +8,10 @@
 #ifndef TREE_TO_XML_COMPOSER_H_
 #define TREE_TO_XML_COMPOSER_H_
 
-#include <string>
 #include <deque>
 #include "Tree.h"
-#include "ranked/RankedTree.h"
-#include "ranked/RankedPattern.h"
-#include "ranked/PrefixRankedTree.h"
-#include "ranked/PrefixRankedBarTree.h"
-#include "ranked/PrefixRankedPattern.h"
-#include "ranked/PrefixRankedBarPattern.h"
-#include "unranked/UnrankedTree.h"
-#include "unranked/UnrankedPattern.h"
 #include "../sax/Token.h"
+#include <set>
 
 namespace alib {
 
diff --git a/alib2data/test-src/tree/PatternTest.cpp b/alib2data/test-src/tree/PatternTest.cpp
index 4af5a2369212fa97460c8b7d8987b594d1d8f863..9ade84aab4a809f7dba27e281d57f562bc6321ee 100644
--- a/alib2data/test-src/tree/PatternTest.cpp
+++ b/alib2data/test-src/tree/PatternTest.cpp
@@ -3,10 +3,14 @@
 #include "sax/SaxParseInterface.h"
 #include "sax/SaxComposeInterface.h"
 
+#include "tree/unranked/UnrankedPattern.h"
 #include "tree/ranked/RankedPattern.h"
 #include "tree/ranked/PrefixRankedPattern.h"
 #include "tree/ranked/PrefixRankedBarPattern.h"
 
+#include "tree/ranked/RankedNode.h"
+#include "tree/unranked/UnrankedNode.h"
+
 #include "tree/TreeException.h"
 
 #include "factory/XmlDataFactory.hpp"
diff --git a/alib2data/test-src/tree/TreeTest.cpp b/alib2data/test-src/tree/TreeTest.cpp
index 698479fcfd5c34b58a264479ed017ce71bab9dcd..7d1ad8136d7b66e92f4ce5283443eb60c8d45bbf 100644
--- a/alib2data/test-src/tree/TreeTest.cpp
+++ b/alib2data/test-src/tree/TreeTest.cpp
@@ -4,10 +4,14 @@
 #include "sax/SaxComposeInterface.h"
 
 #include "tree/ranked/RankedTree.h"
+#include "tree/unranked/UnrankedTree.h"
 #include "tree/ranked/PrefixRankedTree.h"
 #include "tree/ranked/PrefixRankedBarTree.h"
 #include "tree/ranked/RankedPattern.h"
 
+#include "tree/ranked/RankedNode.h"
+#include "tree/unranked/UnrankedNode.h"
+
 #include "tree/TreeException.h"
 
 #include "factory/XmlDataFactory.hpp"
diff --git a/tniceprint/src/tniceprint.cpp b/tniceprint/src/tniceprint.cpp
index 28d94650a8e78ec896cb2c15f800ef67d8e67669..6055e296d9e3f0dd3a13f98543daef7515e83679 100644
--- a/tniceprint/src/tniceprint.cpp
+++ b/tniceprint/src/tniceprint.cpp
@@ -12,6 +12,8 @@
 #include <sax/SaxParseInterface.h>
 #include <sax/ParserException.h>
 #include <tree/Tree.h>
+#include <tree/ranked/RankedTree.h>
+#include <tree/unranked/UnrankedTree.h>
 
 int main(int argc, char** argv) {
 	try {