diff --git a/src/CParser.cpp b/src/CParser.cpp
index 357970f..cb81de0 100644
--- a/src/CParser.cpp
+++ b/src/CParser.cpp
@@ -12,17 +12,6 @@
 
 InvalidCommandException::~InvalidCommandException() = default;
 
-struct nodeToString : public boost::static_visitor<std::string> {
-    std::string operator()(const nodeup_&) const
-    {
-        return "..";
-    }
-    template <class T>
-    std::string operator()(const T& node) const
-    {
-        return node.m_name;
-    }
-};
 
 CParser::CParser(const CTree& tree)
     : m_tree(tree)
@@ -52,22 +41,21 @@
 
 void CParser::changeNode(const path_& name)
 {
-    if (name.m_nodes.empty()) {
-        m_curDir = "";
-        return;
-    }
     for (const auto& it : name.m_nodes) {
-        const std::string node = boost::apply_visitor(nodeToString(), it);
-        if (node == "..") {
-            m_curDir = stripLastNodeFromPath(m_curDir);
-        } else {
-            m_curDir = joinPaths(m_curDir, boost::apply_visitor(nodeToString(), it));
-        }
-
+        if (it.type() == typeid(nodeup_))
+            m_curDir.m_nodes.pop_back();
+        else
+            m_curDir.m_nodes.push_back(it);
     }
 }
+
 std::string CParser::currentNode() const
 {
-    return m_curDir;
+    std::string res;
+    for (const auto& it : m_curDir.m_nodes) {
+        res = joinPaths(res, boost::apply_visitor(nodeToString(), it));
+    }
+
+    return res;
 }
 
diff --git a/src/CParser.hpp b/src/CParser.hpp
index a7d5790..bf21300 100644
--- a/src/CParser.hpp
+++ b/src/CParser.hpp
@@ -41,5 +41,5 @@
 
 private:
     const CTree& m_tree;
-    std::string m_curDir;
+    path_ m_curDir;
 };
diff --git a/src/CTree.cpp b/src/CTree.cpp
index e68a2bc..6840697 100644
--- a/src/CTree.cpp
+++ b/src/CTree.cpp
@@ -13,6 +13,13 @@
 InvalidNodeException::~InvalidNodeException() = default;
 
 
+std::string pathToString(const path_& path)
+{
+   std::string res;
+   for (const auto it : path.m_nodes)
+       res = joinPaths(res, boost::apply_visitor(nodeToString(), it));
+   return res;
+}
 
 CTree::CTree()
 {
@@ -33,12 +40,13 @@
     return childrenRef.find(name) != childrenRef.end();
 }
 
-bool CTree::isContainer(const std::string& location, const std::string& name) const
+bool CTree::isContainer(const path_& location, const std::string& name) const
 {
-    if (!nodeExists(location, name))
+    std::string locationString = pathToString(location);
+    if (!nodeExists(locationString, name))
         return false;
 
-    return children(location).at(name).type() == typeid(schema::container);
+    return children(locationString).at(name).type() == typeid(schema::container);
 }
 
 void CTree::addContainer(const std::string& location, const std::string& name)
@@ -51,29 +59,32 @@
 }
 
 
-bool CTree::listHasKey(const std::string& location, const std::string& name, const std::string& key) const
+bool CTree::listHasKey(const path_& location, const std::string& name, const std::string& key) const
 {
+    std::string locationString = pathToString(location);
     assert(isList(location, name));
 
-    const auto& child = children(location).at(name);
+    const auto& child = children(locationString).at(name);
     const auto& list = boost::get<schema::list>(child);
     return list.m_keys.find(key) != list.m_keys.end();
 }
 
-const std::set<std::string>& CTree::listKeys(const std::string& location, const std::string& name) const
+const std::set<std::string>& CTree::listKeys(const path_& location, const std::string& name) const
 {
+    std::string locationString = pathToString(location);
     assert(isList(location, name));
 
-    const auto& child = children(location).at(name);
+    const auto& child = children(locationString).at(name);
     const auto& list = boost::get<schema::list>(child);
     return list.m_keys;
 }
 
-bool CTree::isList(const std::string& location, const std::string& name) const
+bool CTree::isList(const path_& location, const std::string& name) const
 {
-    if (!nodeExists(location, name))
+    std::string locationString = pathToString(location);
+    if (!nodeExists(locationString, name))
         return false;
-    const auto& child = children(location).at(name);
+    const auto& child = children(locationString).at(name);
     if (child.type() != typeid(schema::list))
         return false;
 
diff --git a/src/CTree.hpp b/src/CTree.hpp
index 6093ee1..8b42371 100644
--- a/src/CTree.hpp
+++ b/src/CTree.hpp
@@ -22,6 +22,17 @@
     };
 }
 
+struct nodeToString : public boost::static_visitor<std::string> {
+    std::string operator()(const nodeup_&) const
+    {
+        return "..";
+    }
+    template <class T>
+    std::string operator()(const T& node) const
+    {
+        return node.m_name;
+    }
+};
 
 using NodeType = boost::variant<schema::container, schema::list>;
 
@@ -43,11 +54,11 @@
     CTree();
     bool nodeExists(const std::string& location, const std::string& name) const;
 
-    bool isContainer(const std::string& location, const std::string& name) const;
+    bool isContainer(const path_& location, const std::string& name) const;
     void addContainer(const std::string& location, const std::string& name);
-    const std::set<std::string>& listKeys(const std::string& location, const std::string& name) const;
-    bool listHasKey(const std::string& location, const std::string& name, const std::string& key) const;
-    bool isList(const std::string& location, const std::string& name) const;
+    const std::set<std::string>& listKeys(const path_& location, const std::string& name) const;
+    bool listHasKey(const path_& location, const std::string& name, const std::string& key) const;
+    bool isList(const path_& location, const std::string& name) const;
     void addList(const std::string& location, const std::string& name, const std::set<std::string>& keys);
 
 private:
diff --git a/src/ast_handlers.hpp b/src/ast_handlers.hpp
index 9ab4738..ce8a196 100644
--- a/src/ast_handlers.hpp
+++ b/src/ast_handlers.hpp
@@ -79,7 +79,7 @@
     void on_success(Iterator const&, Iterator const&, T& ast, Context const& context)
     {
         auto& parserContext = x3::get<parser_context_tag>(context);
-        parserContext.m_curPath = joinPaths(parserContext.m_curPath, ast.m_name);
+        parserContext.m_curPath.m_nodes.push_back(ast);
     }
 
     template <typename Iterator, typename Exception, typename Context>
@@ -105,8 +105,8 @@
     {
         auto& parserContext = x3::get<parser_context_tag>(context);
 
-        if (!parserContext.m_curPath.empty()) {
-            parserContext.m_curPath = stripLastNodeFromPath(parserContext.m_curPath);
+        if (!parserContext.m_curPath.m_nodes.empty()) {
+            parserContext.m_curPath.m_nodes.pop_back();
         } else {
             _pass(context) = false;
         }
@@ -122,7 +122,7 @@
         const auto& tree = parserContext.m_tree;
 
         if (tree.isContainer(parserContext.m_curPath, ast.m_name)) {
-            parserContext.m_curPath = joinPaths(parserContext.m_curPath, ast.m_name);
+            parserContext.m_curPath.m_nodes.push_back(ast);
         } else {
             _pass(context) = false;
         }
diff --git a/src/parser_context.cpp b/src/parser_context.cpp
index 5766c2f..db2bb43 100644
--- a/src/parser_context.cpp
+++ b/src/parser_context.cpp
@@ -7,7 +7,7 @@
 */
 
 #include "parser_context.hpp"
-ParserContext::ParserContext(const CTree& tree, const std::string curDir)
+ParserContext::ParserContext(const CTree& tree, const path_ curDir)
         : m_tree(tree)
 {
     m_curPath = curDir;
diff --git a/src/parser_context.hpp b/src/parser_context.hpp
index 4d6cf99..2c90120 100644
--- a/src/parser_context.hpp
+++ b/src/parser_context.hpp
@@ -8,9 +8,9 @@
 
 #include "CTree.hpp"
 struct ParserContext {
-    ParserContext(const CTree& tree, const std::string curDir);
+    ParserContext(const CTree& tree, const path_ curDir);
     const CTree& m_tree;
-    std::string m_curPath;
+    path_ m_curPath;
     std::string m_errorMsg;
     std::string m_tmpListName;
     std::set<std::string> m_tmpListKeys;
