diff --git a/src/CTree.cpp b/src/CTree.cpp
index 994515a..7d89cf3 100644
--- a/src/CTree.cpp
+++ b/src/CTree.cpp
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
+ * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
  *
  * Written by Václav Kubernát <kubervac@fit.cvut.cz>
  *
@@ -17,21 +18,47 @@
         return prefix + '/' + suffix;
 }
 
-const std::unordered_set<std::string>& CTree::children(const std::string& node) const
+bool TreeNode::operator<(const TreeNode& b) const
+{
+    return this->m_name < b.m_name;
+}
+
+CTree::CTree()
+{
+    m_nodes.emplace("", std::unordered_map<std::string, NODE_TYPE>());
+}
+
+const std::unordered_map<std::string, NODE_TYPE>& CTree::children(const std::string& node) const
 {
     return m_nodes.at(node);
 }
 
-bool CTree::checkNode(const std::string& location, const std::string& node) const
+bool CTree::nodeExists(const std::string& location, const std::string& node) const
 {
-    if (node == ".." || node.empty())
+    if (node.empty())
         return true;
-    const auto& childrenRef = children(location); //first, get a reference to all children
-    if (childrenRef.find(node) == childrenRef.end()) { //find the desired node, if it isn't present throw an exception
-        throw InvalidNodeException(node);
-    }
-    return true;
+    const auto& childrenRef = children(location);
+
+    return childrenRef.find(node) != childrenRef.end();
 }
+
+bool CTree::isContainer(const std::string& location, const std::string& node) const
+{
+    if (!nodeExists(location, node))
+        return false;
+    return children(location).at(node) == TYPE_CONTAINER;
+}
+
+void CTree::addContainer(const std::string& location, const std::string& name)
+{
+    m_nodes.at(location).emplace(name, TYPE_CONTAINER);
+
+    //create a new set of children for the new node
+    std::string key = joinPaths(location, name);
+    m_nodes.emplace(key, std::unordered_map<std::string, NODE_TYPE>());
+}
+
+
 void CTree::changeNode(const std::string& node)
 {
     if (node.empty()) {
@@ -44,21 +71,3 @@
 {
     return m_curDir;
 }
-
-void CTree::addNode(const std::string& location, const std::string& name)
-{
-    m_nodes.at(location).insert(name);
-
-    //create a new set of children for the new node
-    m_nodes.emplace(joinPaths(location, name), std::unordered_set<std::string>());
-}
-void CTree::initDefault()
-{
-    m_nodes.emplace("", std::unordered_set<std::string>());
-    addNode("", "aaa");
-    addNode("", "bbb");
-    addNode("", "ccc");
-    addNode("aaa", "aaabbb");
-    addNode("aaa", "aaauuu");
-    addNode("bbb", "bbbuuu");
-}
