diff --git a/alib2data/src/tree/TreeFromXMLParser.cpp b/alib2data/src/tree/TreeFromXMLParser.cpp
index 3337f077fd23a191702b6e748070ad0d31dbc74d..76442f1fa7e2fe18a343e43282aeaa4699d2bea0 100644
--- a/alib2data/src/tree/TreeFromXMLParser.cpp
+++ b/alib2data/src/tree/TreeFromXMLParser.cpp
@@ -33,7 +33,8 @@ RankedTree TreeFromXMLParser::parseRankedTree(std::deque<sax::Token>& input) con
 
 	std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input);
 	RankedNode * root = parseRankedNode(input);
-	RankedTree tree(rankedAlphabet, std::move(*root));
+	RankedTree tree(std::move(rankedAlphabet), std::move(*root));
+	delete root;
 	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_RANKED_TREE);
 	return tree;
 }
@@ -43,7 +44,7 @@ PrefixRankedNotation TreeFromXMLParser::parsePrefixRankedNotation(std::deque<sax
 
 	std::set<alphabet::RankedSymbol> rankedAlphabet = parseRankedAlphabet(input);
 	std::vector<alphabet::RankedSymbol> data = parseContentData(input);
-	PrefixRankedNotation tree(rankedAlphabet, std::move(data));
+	PrefixRankedNotation tree(std::move(rankedAlphabet), std::move(data));
 
 	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_PREFIX_RANKED_NOTATION);
 	return tree;
@@ -54,7 +55,8 @@ UnrankedTree TreeFromXMLParser::parseUnrankedTree(std::deque<sax::Token>& input)
 
 	std::set<alphabet::LabeledSymbol> alphabet = parseAlphabet(input);
 	UnrankedNode * root = parseUnrankedNode(input);
-	UnrankedTree tree(alphabet, std::move(*root));
+	UnrankedTree tree(std::move(alphabet), std::move(*root));
+	delete root;
 	popToken(input, sax::Token::TokenType::END_ELEMENT, alib::Names::TREE_UNRANKED_TREE);
 	return tree;
 }
diff --git a/alib2data/src/tree/ranked/PrefixRankedNotation.cpp b/alib2data/src/tree/ranked/PrefixRankedNotation.cpp
index cca535d8ca73becd9e99f9ee3a05e42dacd0614a..dac30fdc5b34864c87cbd53757afbac9d3557639 100644
--- a/alib2data/src/tree/ranked/PrefixRankedNotation.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedNotation.cpp
@@ -16,22 +16,19 @@
 
 namespace tree {
 
-PrefixRankedNotation::PrefixRankedNotation(const std::set<alphabet::RankedSymbol>& alphabet, const std::vector<alphabet::RankedSymbol>& data) {
-	this->alphabet = alphabet;
-	setContent(data);
-}
-
-PrefixRankedNotation::PrefixRankedNotation(std::set<alphabet::RankedSymbol>&& alphabet, std::vector<alphabet::RankedSymbol>&& data) {
+PrefixRankedNotation::PrefixRankedNotation(std::set<alphabet::RankedSymbol> alphabet, std::vector<alphabet::RankedSymbol> data) {
 	this->alphabet = std::move(alphabet);
 	setContent(std::move(data));
 }
 
-PrefixRankedNotation::PrefixRankedNotation(const std::vector<alphabet::RankedSymbol>& data) {
-	alphabet = std::set<alphabet::RankedSymbol>(data.begin(), data.end());
-	m_Data = data;
-}
+PrefixRankedNotation::PrefixRankedNotation(std::vector<alphabet::RankedSymbol> data) {
+	int arityChecksum = 1;
+	for(const alphabet::RankedSymbol& symbol : data) {
+		arityChecksum += symbol.getRank().getData() - 1;
+	}
+
+	if(arityChecksum != 0) throw exception::AlibException("The string does not form a tree");
 
-PrefixRankedNotation::PrefixRankedNotation(std::vector<alphabet::RankedSymbol>&& data) {
 	alphabet = std::set<alphabet::RankedSymbol>(data.begin(), data.end());
 	m_Data = std::move(data);
 }
@@ -70,6 +67,13 @@ const std::vector<alphabet::RankedSymbol>& PrefixRankedNotation::getContent() co
 }
 
 void PrefixRankedNotation::setContent(std::vector<alphabet::RankedSymbol> data) {
+	int arityChecksum = 1;
+	for(const alphabet::RankedSymbol& symbol : data) {
+		arityChecksum += symbol.getRank().getData() - 1;
+	}
+
+	if(arityChecksum != 0) throw exception::AlibException("The string does not form a tree");
+
 	std::set<alphabet::RankedSymbol> minimalAlphabet(data.begin(), data.end());
 	std::set<alphabet::RankedSymbol> unknownSymbols;
 	std::set_difference(minimalAlphabet.begin(), minimalAlphabet.end(), alphabet.begin(), alphabet.end(), std::inserter(unknownSymbols, unknownSymbols.end()));
diff --git a/alib2data/src/tree/ranked/PrefixRankedNotation.h b/alib2data/src/tree/ranked/PrefixRankedNotation.h
index 6ad54a8f63388b376b03045095a603dc6c9afd58..6ac8a80b871ccf0483e0f6f75075aec2fe550f01 100644
--- a/alib2data/src/tree/ranked/PrefixRankedNotation.h
+++ b/alib2data/src/tree/ranked/PrefixRankedNotation.h
@@ -25,10 +25,8 @@ class PrefixRankedNotation : public std::acceptor<PrefixRankedNotation, Visitabl
 	std::vector<alphabet::RankedSymbol> m_Data;
 
 public:
-	explicit PrefixRankedNotation(const std::set<alphabet::RankedSymbol>& alphabet, const std::vector<alphabet::RankedSymbol>& data);
-	explicit PrefixRankedNotation(std::set<alphabet::RankedSymbol>&& alphabet, std::vector<alphabet::RankedSymbol>&& data);
-	explicit PrefixRankedNotation(const std::vector<alphabet::RankedSymbol>& data);
-	explicit PrefixRankedNotation(std::vector<alphabet::RankedSymbol>&& data);
+	explicit PrefixRankedNotation(std::set<alphabet::RankedSymbol> alphabet, std::vector<alphabet::RankedSymbol> data);
+	explicit PrefixRankedNotation(std::vector<alphabet::RankedSymbol> data);
 	explicit PrefixRankedNotation(const RankedTree& tree);
 
 	virtual TreeBase* clone() const;
diff --git a/alib2data/src/tree/ranked/RankedNode.cpp b/alib2data/src/tree/ranked/RankedNode.cpp
index 33f631049ba68025dd8da4f80bda6a964cb78e99..12e6c0b739793418fd3b13ecad713c130ecb04ff 100644
--- a/alib2data/src/tree/ranked/RankedNode.cpp
+++ b/alib2data/src/tree/ranked/RankedNode.cpp
@@ -13,20 +13,8 @@
 
 namespace tree {
 
-RankedNode::RankedNode(const alphabet::RankedSymbol& symbol, const std::vector<RankedNode *> & children) : symbol(symbol) {
-	if((int) children.size() != symbol.getRank().getData()) throw TreeException("Number of children doesn't match the rank of the symbol");
-	for (const auto& element : children) {
-		this->children.push_back(element->clone());
-	}
-	for (auto& element : this->children) {
-		element->parent = this;
-	}
-	this->parent = NULL;
-}
-
-RankedNode::RankedNode(alphabet::RankedSymbol&& symbol, std::vector<RankedNode *> && children) noexcept : symbol(std::move(symbol)), children(std::move(children)) {
+RankedNode::RankedNode(alphabet::RankedSymbol symbol, std::vector<RankedNode *> children) : symbol(std::move(symbol)), children(std::move(children)), parentTree(NULL)  {
 	if((int) this->children.size() != this->symbol.getRank().getData()) throw TreeException("Number of children doesn't match the rank of the symbol");
-	children.clear();
 	for (auto& element : this->children) {
 		element->parent = this;
 	}
@@ -34,17 +22,18 @@ RankedNode::RankedNode(alphabet::RankedSymbol&& symbol, std::vector<RankedNode *
 	this->parent = NULL;
 }
 
-RankedNode::RankedNode(const RankedNode& other) : symbol(other.symbol) {
+RankedNode::RankedNode(const RankedNode& other) : symbol(other.symbol), parentTree(NULL)  {
 	for (const auto& element : other.children) {
 		children.push_back(element->clone());
 	}
 	for (auto& element : this->children) {
 		element->parent = this;
 	}
+	this->attachTree(NULL);
 	this->parent = NULL;
 }
 
-RankedNode::RankedNode(RankedNode&& other) noexcept : symbol(std::move(other.symbol)), children(std::move(other.children)) {
+RankedNode::RankedNode(RankedNode&& other) noexcept : symbol(std::move(other.symbol)), children(std::move(other.children)), parentTree(NULL)  {
 	other.children.clear();
 	for (auto& element : this->children) {
 		element->parent = this;
@@ -99,9 +88,9 @@ const RankedNode * RankedNode::getParent() const {
 	return parent;
 }
 
-void RankedNode::setSymbol(const alphabet::RankedSymbol& symbol) {
+void RankedNode::setSymbol(alphabet::RankedSymbol symbol) {
 	if(symbol.getRank() != this->symbol.getRank()) throw TreeException("Number of children doesn't match the rank of the symbol");
-	this->symbol = symbol;
+	this->symbol = std::move(symbol);
 	if(this->parentTree != NULL && this->parentTree->getAlphabet().find(this->symbol) == this->parentTree->getAlphabet().end()) throw TreeException("Symbol is not in the alphabet");
 }
 
diff --git a/alib2data/src/tree/ranked/RankedNode.h b/alib2data/src/tree/ranked/RankedNode.h
index 7fcfd0e19cd29bb23a4cbef0c933507791c50e2e..235d22a29913c767f3694b76dda6e2754fbbe091 100644
--- a/alib2data/src/tree/ranked/RankedNode.h
+++ b/alib2data/src/tree/ranked/RankedNode.h
@@ -53,8 +53,7 @@ protected:
 	 */
 	void computeMinimalAlphabet( std::set<alphabet::RankedSymbol>& alphabet ) const;
 public:
-	explicit RankedNode(const alphabet::RankedSymbol& symbol, const std::vector<RankedNode *> & children);
-	explicit RankedNode(alphabet::RankedSymbol&& symbol, std::vector<RankedNode *> && children) noexcept;
+	explicit RankedNode(alphabet::RankedSymbol symbol, std::vector<RankedNode *> children);
 
 	RankedNode(const RankedNode& other);
 	RankedNode(RankedNode&& other) noexcept;
@@ -86,7 +85,7 @@ public:
 
 	const RankedNode * getParent() const;
 
-	void setSymbol(const alphabet::RankedSymbol& symbol);
+	void setSymbol(alphabet::RankedSymbol symbol);
 
 	void swap(RankedNode& other);
 
diff --git a/alib2data/src/tree/ranked/RankedTree.cpp b/alib2data/src/tree/ranked/RankedTree.cpp
index e096a7c0703f462081ed1ce6555b7c0cc1329c83..f0d69c94b18384bad0cc9a097048d304b4a03d98 100644
--- a/alib2data/src/tree/ranked/RankedTree.cpp
+++ b/alib2data/src/tree/ranked/RankedTree.cpp
@@ -24,25 +24,13 @@ RankedTree::RankedTree(const UnrankedTree& other) {
 	delete element;
 }
 
-RankedTree::RankedTree(const std::set<alphabet::RankedSymbol>& alphabet, const RankedNode& tree) {
-	this->alphabet = alphabet;
-	this->tree = NULL;
-	setTree(tree);
-}
-
-RankedTree::RankedTree(std::set<alphabet::RankedSymbol>&& alphabet, RankedNode&& tree) {
+RankedTree::RankedTree(std::set<alphabet::RankedSymbol> alphabet, RankedNode tree) {
 	this->alphabet = std::move(alphabet);
 	this->tree = NULL;
 	setTree(std::move(tree));
 }
 
-RankedTree::RankedTree(const RankedNode& tree) {
-	tree.computeMinimalAlphabet(alphabet);
-	this->tree = NULL;
-	setTree(tree);
-}
-
-RankedTree::RankedTree(RankedNode&& tree) {
+RankedTree::RankedTree(RankedNode tree) {
 	tree.computeMinimalAlphabet(alphabet);
 	this->tree = NULL;
 	setTree(std::move(tree));
@@ -95,18 +83,13 @@ RankedNode& RankedTree::getRoot() {
 	return *tree;
 }
 
-void RankedTree::setTree(const RankedNode& tree) {
-	delete this->tree;
-	this->tree = tree.clone();
-	if(!this->tree->attachTree(this))
-		throw exception::AlibException("Input symbols not in the alphabet.");
-}
-
-void RankedTree::setTree(RankedNode&& tree) {
+void RankedTree::setTree(RankedNode tree) {
 	delete this->tree;
 	this->tree = std::move(tree).plunder();
-	if(!this->tree->attachTree(this))
+	if(!this->tree->attachTree(this)) {
+		delete this->tree;
 		throw exception::AlibException("Input symbols not in the alphabet.");
+	}
 }
 
 bool RankedTree::removeSymbolFromAlphabet(const alphabet::RankedSymbol & symbol) {
diff --git a/alib2data/src/tree/ranked/RankedTree.h b/alib2data/src/tree/ranked/RankedTree.h
index ae22cbeacb65fd18d287ecb3fc837b37d4746699..f7ec751144ba2cfb4c7d95b62bf7b5d77c943d9c 100644
--- a/alib2data/src/tree/ranked/RankedTree.h
+++ b/alib2data/src/tree/ranked/RankedTree.h
@@ -40,10 +40,8 @@ public:
 	virtual TreeBase* plunder() &&;
 
 	explicit RankedTree(const UnrankedTree& other);
-	explicit RankedTree(const std::set<alphabet::RankedSymbol>& alphabet, const RankedNode& tree);
-	explicit RankedTree(std::set<alphabet::RankedSymbol>&& alphabet, RankedNode&& tree);
-	explicit RankedTree(const RankedNode& tree);
-	explicit RankedTree(RankedNode&& tree);
+	explicit RankedTree(std::set<alphabet::RankedSymbol> alphabet, RankedNode tree);
+	explicit RankedTree(RankedNode tree);
 
 	/**
 	 * Copy constructor.
@@ -65,18 +63,11 @@ public:
 	 */
 	RankedNode& getRoot();
 
-	/**
-	 * Sets the root node of the regular expression tree. Doesn't perform copy of the tree param,
-	 * just stores it!
-	 * @param tree root node to set
-	 */
-	void setTree(const RankedNode& tree);
-
 	/**
 	 * Sets the root node of the regular expression tree
 	 * @param tree root node to set
 	 */
-	void setTree(RankedNode&& tree);
+	void setTree(RankedNode tree);
 
 	/**
 	 * Removes symbol from the alphabet of symbol available in the regular expression
diff --git a/alib2data/src/tree/unranked/UnrankedNode.cpp b/alib2data/src/tree/unranked/UnrankedNode.cpp
index f791b8cb81af8103b941ccbd2dfd0722d7d726ed..19c30cb7678eca2458c8cdf55ef17605893775d1 100644
--- a/alib2data/src/tree/unranked/UnrankedNode.cpp
+++ b/alib2data/src/tree/unranked/UnrankedNode.cpp
@@ -14,33 +14,24 @@
 
 namespace tree {
 
-UnrankedNode::UnrankedNode(const alphabet::LabeledSymbol& symbol, const std::vector<UnrankedNode *> & children) : symbol(symbol) {
-	for (const auto& element : children) {
-		this->children.push_back(element->clone());
-	}
-	for (auto& element : this->children) {
-		element->parent = this;
-	}
-}
-
-UnrankedNode::UnrankedNode(alphabet::LabeledSymbol&& symbol, std::vector<UnrankedNode *> && children) noexcept : symbol(std::move(symbol)), children(std::move(children)) {
-	children.clear();
+UnrankedNode::UnrankedNode(alphabet::LabeledSymbol symbol, std::vector<UnrankedNode *> children) : symbol(std::move(symbol)), children(std::move(children)), parentTree(NULL)  {
 	for (auto& element : this->children) {
 		element->parent = this;
 	}
 	this->attachTree(NULL);
 }
 
-UnrankedNode::UnrankedNode(const UnrankedNode& other) : symbol(other.symbol) {
+UnrankedNode::UnrankedNode(const UnrankedNode& other) : symbol(other.symbol), parentTree(NULL)  {
 	for (const auto& element : other.children) {
 		children.push_back(element->clone());
 	}
 	for (auto& element : this->children) {
 		element->parent = this;
 	}
+	this->attachTree(NULL);
 }
 
-UnrankedNode::UnrankedNode(UnrankedNode&& other) noexcept : symbol(std::move(other.symbol)), children(std::move(other.children)) {
+UnrankedNode::UnrankedNode(UnrankedNode&& other) noexcept : symbol(std::move(other.symbol)), children(std::move(other.children)), parentTree(NULL)  {
 	other.children.clear();
 	for (auto& element : this->children) {
 		element->parent = this;
@@ -94,8 +85,8 @@ const UnrankedNode * UnrankedNode::getParent() const {
 	return parent;
 }
 
-void UnrankedNode::setSymbol(const alphabet::LabeledSymbol& symbol) {
-	this->symbol = symbol;
+void UnrankedNode::setSymbol(alphabet::LabeledSymbol symbol) {
+	this->symbol = std::move(symbol);
 	if(this->parentTree != NULL && this->parentTree->getAlphabet().find(this->symbol) == this->parentTree->getAlphabet().end()) throw TreeException("Symbol is not in the alphabet");
 }
 
diff --git a/alib2data/src/tree/unranked/UnrankedNode.h b/alib2data/src/tree/unranked/UnrankedNode.h
index de6e7c3c5f8474197955182af1696896cd9ca963..e947a0d9858282a127199d4259eb607ffa87df75 100644
--- a/alib2data/src/tree/unranked/UnrankedNode.h
+++ b/alib2data/src/tree/unranked/UnrankedNode.h
@@ -53,8 +53,7 @@ protected:
 	 */
 	void computeMinimalAlphabet( std::set<alphabet::LabeledSymbol>& alphabet ) const;
 public:
-	explicit UnrankedNode(const alphabet::LabeledSymbol& symbol, const std::vector<UnrankedNode *> & children);
-	explicit UnrankedNode(alphabet::LabeledSymbol&& symbol, std::vector<UnrankedNode *> && children) noexcept;
+	explicit UnrankedNode(alphabet::LabeledSymbol symbol, std::vector<UnrankedNode *> children);
 
 	UnrankedNode(const UnrankedNode& other);
 	UnrankedNode(UnrankedNode&& other) noexcept;
@@ -86,7 +85,7 @@ public:
 
 	const UnrankedNode * getParent() const;
 
-	void setSymbol(const alphabet::LabeledSymbol& symbol);
+	void setSymbol(alphabet::LabeledSymbol symbol);
 
 	void pushBackChild(const UnrankedNode & node);
 
diff --git a/alib2data/src/tree/unranked/UnrankedTree.cpp b/alib2data/src/tree/unranked/UnrankedTree.cpp
index 948eb780d573d482d2661b5022ffa0e73491f074..cd3d1ebe768e1096cfaf6057305e025b57c5cf9d 100644
--- a/alib2data/src/tree/unranked/UnrankedTree.cpp
+++ b/alib2data/src/tree/unranked/UnrankedTree.cpp
@@ -24,25 +24,13 @@ UnrankedTree::UnrankedTree(const RankedTree& other) {
 	delete element;
 }
 
-UnrankedTree::UnrankedTree(const std::set<alphabet::LabeledSymbol>& alphabet, const UnrankedNode& tree) {
-	this->alphabet = alphabet;
-	this->tree = NULL;
-	setTree(tree);
-}
-
-UnrankedTree::UnrankedTree(std::set<alphabet::LabeledSymbol>&& alphabet, UnrankedNode&& tree) {
+UnrankedTree::UnrankedTree(std::set<alphabet::LabeledSymbol> alphabet, UnrankedNode tree) {
 	this->alphabet = std::move(alphabet);
 	this->tree = NULL;
 	setTree(std::move(tree));
 }
 
-UnrankedTree::UnrankedTree(const UnrankedNode& tree) {
-	tree.computeMinimalAlphabet(alphabet);
-	this->tree = NULL;
-	setTree(tree);
-}
-
-UnrankedTree::UnrankedTree(UnrankedNode&& tree) {
+UnrankedTree::UnrankedTree(UnrankedNode tree) {
 	tree.computeMinimalAlphabet(alphabet);
 	this->tree = NULL;
 	setTree(std::move(tree));
@@ -95,18 +83,13 @@ UnrankedNode& UnrankedTree::getRoot() {
 	return *tree;
 }
 
-void UnrankedTree::setTree(const UnrankedNode& tree) {
-	delete this->tree;
-	this->tree = tree.clone();
-	if(!this->tree->attachTree(this))
-		throw exception::AlibException("Input symbols not in the alphabet.");
-}
-
-void UnrankedTree::setTree(UnrankedNode&& tree) {
+void UnrankedTree::setTree(UnrankedNode tree) {
 	delete this->tree;
 	this->tree = std::move(tree).plunder();
-	if(!this->tree->attachTree(this))
+	if(!this->tree->attachTree(this)) {
+		delete this->tree;
 		throw exception::AlibException("Input symbols not in the alphabet.");
+	}
 }
 
 bool UnrankedTree::removeSymbolFromAlphabet(const alphabet::LabeledSymbol & symbol) {
diff --git a/alib2data/src/tree/unranked/UnrankedTree.h b/alib2data/src/tree/unranked/UnrankedTree.h
index 6c546473004ee5f3497bd215bfc17854f8c10516..a9a0e84367289e88fc886ed67c268721f1511930 100644
--- a/alib2data/src/tree/unranked/UnrankedTree.h
+++ b/alib2data/src/tree/unranked/UnrankedTree.h
@@ -40,10 +40,8 @@ public:
 	virtual TreeBase* plunder() &&;
 
 	explicit UnrankedTree(const RankedTree& other);
-	explicit UnrankedTree(const std::set<alphabet::LabeledSymbol>& alphabet, const UnrankedNode& tree);
-	explicit UnrankedTree(std::set<alphabet::LabeledSymbol>&& alphabet, UnrankedNode&& tree);
-	explicit UnrankedTree(const UnrankedNode& tree);
-	explicit UnrankedTree(UnrankedNode&& tree);
+	explicit UnrankedTree(std::set<alphabet::LabeledSymbol> alphabet, UnrankedNode tree);
+	explicit UnrankedTree(UnrankedNode tree);
 
 	/**
 	 * Copy constructor.
@@ -65,18 +63,11 @@ public:
 	 */
 	UnrankedNode& getRoot();
 
-	/**
-	 * Sets the root node of the regular expression tree. Doesn't perform copy of the tree param,
-	 * just stores it!
-	 * @param tree root node to set
-	 */
-	void setTree(const UnrankedNode& tree);
-
 	/**
 	 * Sets the root node of the regular expression tree
 	 * @param tree root node to set
 	 */
-	void setTree(UnrankedNode&& tree);
+	void setTree(UnrankedNode tree);
 
 	/**
 	 * Removes symbol from the alphabet of symbol available in the regular expression
diff --git a/alib2data/test-src/tree/TreeTest.cpp b/alib2data/test-src/tree/TreeTest.cpp
index 812d23375f0976f34e64da5ed4dad753b27d1fac..a8ad01f9e9a2e5f09c0eb400c1258d22243112d4 100644
--- a/alib2data/test-src/tree/TreeTest.cpp
+++ b/alib2data/test-src/tree/TreeTest.cpp
@@ -14,6 +14,7 @@
 
 #define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
 
+CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TreeTest, "tree" );
 CPPUNIT_TEST_SUITE_REGISTRATION( TreeTest );
 
 void TreeTest::setUp() {
@@ -54,9 +55,9 @@ void TreeTest::testRankedTreeParser() {
 	tree::RankedNode * node3 = new tree::RankedNode(c, {});
 	tree::RankedNode * node4 = new tree::RankedNode(c, {});
 	tree::RankedNode * node2 = new tree::RankedNode(b, {node3});
-	tree::RankedNode * node1 = new tree::RankedNode(a, {node2, node4});
+	tree::RankedNode node1(a, {node2, node4});
 
-	tree::RankedTree tree(alphabet, std::move(*node1));
+	tree::RankedTree tree(alphabet, std::move(node1));
 
 	CPPUNIT_ASSERT( tree == tree );
 	tree.getRoot().nicePrint(std::cout);
@@ -113,15 +114,15 @@ void TreeTest::testRankedTreeCompare() {
 	tree::RankedNode * node3 = new tree::RankedNode(c, {});
 	tree::RankedNode * node4 = new tree::RankedNode(c, {});
 	tree::RankedNode * node2 = new tree::RankedNode(b, {node3});
-	tree::RankedNode * node1 = new tree::RankedNode(a, {node2, node4});
+	tree::RankedNode node1(a, {node2, node4});
 
 	tree::RankedNode * node6 = new tree::RankedNode(c, {});
 	tree::RankedNode * node8 = new tree::RankedNode(c, {});
 	tree::RankedNode * node7 = new tree::RankedNode(b, {node8});
-	tree::RankedNode * node5 = new tree::RankedNode(a, {node6, node7});
+	tree::RankedNode node5(a, {node6, node7});
 
-	tree::RankedTree tree1(alphabet, std::move(*node1));
-	tree::RankedTree tree2(alphabet, std::move(*node5));
+	tree::RankedTree tree1(alphabet, std::move(node1));
+	tree::RankedTree tree2(alphabet, std::move(node5));
 
 	CPPUNIT_ASSERT( tree1 != tree2 );
 	CPPUNIT_ASSERT( tree1 < tree2 );
@@ -141,17 +142,17 @@ void TreeTest::testRankedTreeSymbolValidityCheck() {
 	tree::RankedNode * node3 = new tree::RankedNode(d, {});
 	tree::RankedNode * node4 = new tree::RankedNode(c, {});
 	tree::RankedNode * node2 = new tree::RankedNode(b, {node3});
-	tree::RankedNode * node1 = new tree::RankedNode(a, {node2, node4});
+	tree::RankedNode node1(a, {node2, node4});
 
-	CPPUNIT_ASSERT_THROW(tree::RankedTree tree1(alphabet, *node1), exception::AlibException);
+	CPPUNIT_ASSERT_THROW(tree::RankedTree(alphabet, std::move(node1)), exception::AlibException);
 
 	tree::RankedNode * node6 = new tree::RankedNode(e, {});
 	tree::RankedNode * node8 = new tree::RankedNode(c, {});
 	tree::RankedNode * node7 = new tree::RankedNode(b, {node8});
-	tree::RankedNode * node5 = new tree::RankedNode(a, {node6, node7});
+	tree::RankedNode node5(a, {node6, node7});
 
 	tree::RankedTree * tree = NULL;
-	CPPUNIT_ASSERT_NO_THROW(tree = new tree::RankedTree(alphabet, std::move(*node5)));
+	CPPUNIT_ASSERT_NO_THROW(tree = new tree::RankedTree(alphabet, std::move(node5)));
 
 	CPPUNIT_ASSERT_NO_THROW(tree -> getRoot().getChildren()[0] -> setSymbol(c));
 	CPPUNIT_ASSERT_THROW(tree -> getRoot().getChildren()[1] -> setSymbol(d), exception::AlibException);
@@ -174,16 +175,16 @@ void TreeTest::testRankedTreeSubtreeSwitch() {
 	tree::RankedNode * node3 = new tree::RankedNode(c, {});
 	tree::RankedNode * node4 = new tree::RankedNode(c, {});
 	tree::RankedNode * node2 = new tree::RankedNode(b, {node3});
-	tree::RankedNode * node1 = new tree::RankedNode(a, {node2, node4});
+	tree::RankedNode node1(a, {node2, node4});
 
 	tree::RankedNode * node6 = new tree::RankedNode(d, {});
 	tree::RankedNode * node8 = new tree::RankedNode(c, {});
 	tree::RankedNode * node7 = new tree::RankedNode(b, {node8});
-	tree::RankedNode * node5 = new tree::RankedNode(a, {node6, node7});
+	tree::RankedNode node5(a, {node6, node7});
 
-	tree::RankedTree tree1(alphabet1, std::move(*node1));
+	tree::RankedTree tree1(alphabet1, std::move(node1));
 	tree::RankedTree tree1Copy (tree1);
-	tree::RankedTree tree2(alphabet2, std::move(*node5));
+	tree::RankedTree tree2(alphabet2, std::move(node5));
 	tree::RankedTree tree2Copy (tree2);
 
 	tree1.getRoot().getChildren()[0] -> getChildren()[0] -> swap(*(tree2.getRoot().getChildren()[1]));
@@ -229,9 +230,9 @@ void TreeTest::testUnrankedTreeParser() {
 	tree::UnrankedNode * node3 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node4 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node2 = new tree::UnrankedNode(b, {node3});
-	tree::UnrankedNode * node1 = new tree::UnrankedNode(a, {node2, node4});
+	tree::UnrankedNode node1(a, {node2, node4});
 
-	tree::UnrankedTree tree(alphabet, std::move(*node1));
+	tree::UnrankedTree tree(alphabet, std::move(node1));
 
 	CPPUNIT_ASSERT( tree == tree );
 	tree.getRoot().nicePrint(std::cout);
@@ -280,15 +281,15 @@ void TreeTest::testUnrankedTreeCompare() {
 	tree::UnrankedNode * node3 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node4 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node2 = new tree::UnrankedNode(b, {node3});
-	tree::UnrankedNode * node1 = new tree::UnrankedNode(a, {node2, node4});
+	tree::UnrankedNode node1(a, {node2, node4});
 
 	tree::UnrankedNode * node6 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node8 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node7 = new tree::UnrankedNode(b, {node8});
-	tree::UnrankedNode * node5 = new tree::UnrankedNode(a, {node6, node7});
+	tree::UnrankedNode node5(a, {node6, node7});
 
-	tree::UnrankedTree tree1(alphabet, std::move(*node1));
-	tree::UnrankedTree tree2(alphabet, std::move(*node5));
+	tree::UnrankedTree tree1(alphabet, std::move(node1));
+	tree::UnrankedTree tree2(alphabet, std::move(node5));
 
 	CPPUNIT_ASSERT( tree1 != tree2 );
 	CPPUNIT_ASSERT( tree1 < tree2 );
@@ -308,17 +309,17 @@ void TreeTest::testUnrankedTreeSymbolValidityCheck() {
 	tree::UnrankedNode * node3 = new tree::UnrankedNode(d, {});
 	tree::UnrankedNode * node4 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node2 = new tree::UnrankedNode(b, {node3});
-	tree::UnrankedNode * node1 = new tree::UnrankedNode(a, {node2, node4});
+	tree::UnrankedNode node1(a, {node2, node4});
 
-	CPPUNIT_ASSERT_THROW(tree::UnrankedTree tree1(alphabet, *node1), exception::AlibException);
+	CPPUNIT_ASSERT_THROW(tree::UnrankedTree(alphabet, std::move(node1)), exception::AlibException);
 
 	tree::UnrankedNode * node6 = new tree::UnrankedNode(e, {});
 	tree::UnrankedNode * node8 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node7 = new tree::UnrankedNode(b, {node8});
-	tree::UnrankedNode * node5 = new tree::UnrankedNode(a, {node6, node7});
+	tree::UnrankedNode node5(a, {node6, node7});
 
 	tree::UnrankedTree * tree = NULL;
-	CPPUNIT_ASSERT_NO_THROW(tree = new tree::UnrankedTree(alphabet, std::move(*node5)));
+	CPPUNIT_ASSERT_NO_THROW(tree = new tree::UnrankedTree(alphabet, std::move(node5)));
 
 	CPPUNIT_ASSERT_NO_THROW((*tree -> getRoot().getChildren().begin()) -> setSymbol(c));
 	CPPUNIT_ASSERT_THROW((*tree -> getRoot().getChildren().begin()) -> setSymbol(d), exception::AlibException);
@@ -340,16 +341,16 @@ void TreeTest::testUnrankedTreeSubtreeSwitch() {
 	tree::UnrankedNode * node3 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node4 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node2 = new tree::UnrankedNode(b, {node3});
-	tree::UnrankedNode * node1 = new tree::UnrankedNode(a, {node2, node4});
+	tree::UnrankedNode node1(a, {node2, node4});
 
 	tree::UnrankedNode * node6 = new tree::UnrankedNode(d, {});
 	tree::UnrankedNode * node8 = new tree::UnrankedNode(c, {});
 	tree::UnrankedNode * node7 = new tree::UnrankedNode(b, {node8});
-	tree::UnrankedNode * node5 = new tree::UnrankedNode(a, {node6, node7});
+	tree::UnrankedNode node5(a, {node6, node7});
 
-	tree::UnrankedTree tree1(alphabet1, std::move(*node1));
+	tree::UnrankedTree tree1(alphabet1, std::move(node1));
 	tree::UnrankedTree tree1Copy (tree1);
-	tree::UnrankedTree tree2(alphabet2, std::move(*node5));
+	tree::UnrankedTree tree2(alphabet2, std::move(node5));
 	tree::UnrankedTree tree2Copy (tree2);
 
 	(*(*tree1.getRoot().getChildren().begin()) -> getChildren().begin()) -> swap(**(++tree2.getRoot().getChildren().begin()));