diff --git a/src/CParser.cpp b/src/CParser.cpp
index c6a42a6..357970f 100644
--- a/src/CParser.cpp
+++ b/src/CParser.cpp
@@ -12,16 +12,27 @@
 
 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)
 {
 }
 
-
 cd_ CParser::parseCommand(const std::string& line, std::ostream& errorStream)
 {
     cd_ parsedCommand;
-    ParserContext ctx(m_tree);
+    ParserContext ctx(m_tree, m_curDir);
     auto it = line.begin();
 
     boost::spirit::x3::error_handler<std::string::const_iterator> errorHandler(it, line.end(), errorStream);
@@ -38,3 +49,25 @@
 
     return parsedCommand;
 }
+
+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));
+        }
+
+    }
+}
+std::string CParser::currentNode() const
+{
+    return m_curDir;
+}
+
diff --git a/src/CParser.hpp b/src/CParser.hpp
index 4b3e1c4..a7d5790 100644
--- a/src/CParser.hpp
+++ b/src/CParser.hpp
@@ -36,7 +36,10 @@
 public:
     CParser(const CTree& tree);
     cd_ parseCommand(const std::string& line, std::ostream& errorStream);
+    void changeNode(const path_& name);
+    std::string currentNode() const;
 
 private:
     const CTree& m_tree;
+    std::string m_curDir;
 };
diff --git a/src/CTree.cpp b/src/CTree.cpp
index 69afb58..e68a2bc 100644
--- a/src/CTree.cpp
+++ b/src/CTree.cpp
@@ -12,17 +12,6 @@
 
 InvalidNodeException::~InvalidNodeException() = 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;
-    }
-};
 
 
 CTree::CTree()
@@ -98,23 +87,3 @@
     m_nodes.emplace(name, std::unordered_map<std::string, NodeType>());
 }
 
-void CTree::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));
-        }
-
-    }
-}
-std::string CTree::currentNode() const
-{
-    return m_curDir;
-}
diff --git a/src/CTree.hpp b/src/CTree.hpp
index 6fe54d8..6093ee1 100644
--- a/src/CTree.hpp
+++ b/src/CTree.hpp
@@ -49,12 +49,9 @@
     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;
     void addList(const std::string& location, const std::string& name, const std::set<std::string>& keys);
-    void changeNode(const path_& name);
-    std::string currentNode() const;
 
 private:
     const std::unordered_map<std::string, NodeType>& children(const std::string& name) const;
 
     std::unordered_map<std::string, std::unordered_map<std::string, NodeType>> m_nodes;
-    std::string m_curDir;
 };
diff --git a/src/main.cpp b/src/main.cpp
index 68ddbef..607115e 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -35,7 +35,7 @@
 using x3::lexeme;
 using ascii::space;
 
-void interpret(cd_ command, CTree& tree)
+void interpret(cd_ command, CParser& tree)
 {
     tree.changeNode(command.m_path);
 }
@@ -62,7 +62,7 @@
     CParser parser(tree);
 
     while (true) {
-        std::cout << tree.currentNode() << ">";
+        std::cout << parser.currentNode() << ">";
         std::string input;
         std::getline(std::cin, input);
         if (std::cin.eof())
@@ -70,7 +70,7 @@
 
         try {
             cd_ command = parser.parseCommand(input, std::cout);
-            interpret(command, tree);
+            interpret(command, parser);
         } catch (InvalidCommandException& ex) {
             std::cerr << ex.what() << std::endl;
         }
diff --git a/src/parser_context.cpp b/src/parser_context.cpp
index c3b31c9..5766c2f 100644
--- a/src/parser_context.cpp
+++ b/src/parser_context.cpp
@@ -7,8 +7,8 @@
 */
 
 #include "parser_context.hpp"
-ParserContext::ParserContext(const CTree& tree)
+ParserContext::ParserContext(const CTree& tree, const std::string curDir)
         : m_tree(tree)
 {
-    m_curPath = m_tree.currentNode();
+    m_curPath = curDir;
 }
diff --git a/src/parser_context.hpp b/src/parser_context.hpp
index 64b293a..4d6cf99 100644
--- a/src/parser_context.hpp
+++ b/src/parser_context.hpp
@@ -8,7 +8,7 @@
 
 #include "CTree.hpp"
 struct ParserContext {
-    ParserContext(const CTree& tree);
+    ParserContext(const CTree& tree, const std::string curDir);
     const CTree& m_tree;
     std::string m_curPath;
     std::string m_errorMsg;
