diff --git a/src/ast.cpp b/src/ast.cpp
deleted file mode 100644
index 35bf1cb..0000000
--- a/src/ast.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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>
- *
-*/
-#include "ast.hpp"
-
-
-container_::container_(const std::string& name)
-    : m_name(name)
-{
-}
-
-bool container_::operator==(const container_& b) const
-{
-    return this->m_name == b.m_name;
-}
-
-leaf_::leaf_(const std::string& name)
-    : m_name(name)
-{
-}
-
-bool leaf_::operator==(const leaf_& b) const
-{
-    return this->m_name == b.m_name;
-}
-
-listElement_::listElement_(const std::string& listName, const std::map<std::string, std::string>& keys)
-    : m_name(listName)
-    , m_keys(keys)
-{
-}
-
-bool listElement_::operator==(const listElement_& b) const
-{
-    return (this->m_name == b.m_name && this->m_keys == b.m_keys);
-}
-
-bool path_::operator==(const path_& b) const
-{
-    if (this->m_nodes.size() != b.m_nodes.size())
-        return false;
-    return this->m_nodes == b.m_nodes;
-}
-
-bool set_::operator==(const set_& b) const
-{
-    return this->m_path == b.m_path && this->m_data == b.m_data;
-}
-
-bool cd_::operator==(const cd_& b) const
-{
-    return this->m_path == b.m_path;
-}
-
-bool create_::operator==(const create_& b) const
-{
-    return this->m_path == b.m_path;
-}
-
-bool delete_::operator==(const delete_& b) const
-{
-    return this->m_path == b.m_path;
-}
diff --git a/src/ast.hpp b/src/ast.hpp
deleted file mode 100644
index 9638684..0000000
--- a/src/ast.hpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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>
- *
-*/
-#pragma once
-#include <boost/spirit/home/x3.hpp>
-#include <boost/spirit/home/x3/support/ast/position_tagged.hpp>
-#include <boost/spirit/home/x3/support/utility/error_reporting.hpp>
-
-#include <boost/fusion/adapted/struct/adapt_struct.hpp>
-#include <boost/fusion/include/adapt_struct.hpp>
-#include <boost/fusion/include/std_pair.hpp>
-#include <boost/variant.hpp>
-#include <map>
-#include <vector>
-
-#include "utils.hpp"
-namespace x3 = boost::spirit::x3;
-namespace ascii = boost::spirit::x3::ascii;
-
-using ascii::space;
-using x3::_attr;
-using x3::alnum;
-using x3::alpha;
-using x3::char_;
-using x3::expect;
-using x3::lexeme;
-using x3::lit;
-using boost::fusion::operator<<;
-
-
-using keyValue_ = std::pair<std::string, std::string>;
-
-
-struct parser_context_tag;
-
-
-struct nodeup_ {
-    bool operator==(const nodeup_&) const
-    {
-        return true;
-    }
-};
-
-struct container_ {
-    container_() = default;
-    container_(const std::string& name);
-
-    bool operator==(const container_& b) const;
-
-    std::string m_name;
-};
-
-struct leaf_ {
-    leaf_() = default;
-    leaf_(const std::string& name);
-
-    bool operator==(const leaf_& b) const;
-
-    std::string m_name;
-};
-
-
-struct list_ {
-    std::vector<std::string> m_keys;
-};
-
-struct listElement_ {
-    listElement_() {}
-    listElement_(const std::string& listName, const std::map<std::string, std::string>& keys);
-
-    bool operator==(const listElement_& b) const;
-
-    std::string m_name;
-    std::map<std::string, std::string> m_keys;
-};
-
-
-struct path_ {
-    bool operator==(const path_& b) const;
-    std::vector<boost::variant<container_, listElement_, nodeup_, leaf_>> m_nodes;
-};
-
-
-struct cd_ : x3::position_tagged {
-    bool operator==(const cd_& b) const;
-    path_ m_path;
-};
-
-struct create_ : x3::position_tagged {
-    bool operator==(const create_& b) const;
-    path_ m_path;
-};
-
-struct delete_ : x3::position_tagged {
-    bool operator==(const delete_& b) const;
-    path_ m_path;
-};
-
-struct set_ : x3::position_tagged {
-    bool operator==(const set_& b) const;
-    path_ m_path;
-    std::string m_data;
-};
-
-using command_ = boost::variant<cd_, create_, delete_, set_>;
-
-BOOST_FUSION_ADAPT_STRUCT(container_, m_name)
-BOOST_FUSION_ADAPT_STRUCT(listElement_, m_name, m_keys)
-BOOST_FUSION_ADAPT_STRUCT(path_, m_nodes)
-BOOST_FUSION_ADAPT_STRUCT(cd_, m_path)
-BOOST_FUSION_ADAPT_STRUCT(create_, m_path)
-BOOST_FUSION_ADAPT_STRUCT(delete_, m_path)
-BOOST_FUSION_ADAPT_STRUCT(set_, m_path, m_data)
diff --git a/src/ast_commands.cpp b/src/ast_commands.cpp
new file mode 100644
index 0000000..a8b481d
--- /dev/null
+++ b/src/ast_commands.cpp
@@ -0,0 +1,29 @@
+/*
+ * 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>
+ *
+*/
+#include "ast_commands.hpp"
+
+
+bool set_::operator==(const set_& b) const
+{
+    return this->m_path == b.m_path && this->m_data == b.m_data;
+}
+
+bool cd_::operator==(const cd_& b) const
+{
+    return this->m_path == b.m_path;
+}
+
+bool create_::operator==(const create_& b) const
+{
+    return this->m_path == b.m_path;
+}
+
+bool delete_::operator==(const delete_& b) const
+{
+    return this->m_path == b.m_path;
+}
diff --git a/src/ast_commands.hpp b/src/ast_commands.hpp
new file mode 100644
index 0000000..5caeb2e
--- /dev/null
+++ b/src/ast_commands.hpp
@@ -0,0 +1,54 @@
+/*
+ * 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>
+ *
+*/
+#pragma once
+
+#include "ast_path.hpp"
+
+namespace x3 = boost::spirit::x3;
+namespace ascii = boost::spirit::x3::ascii;
+
+using ascii::space;
+using x3::_attr;
+using x3::alnum;
+using x3::alpha;
+using x3::char_;
+using x3::expect;
+using x3::lexeme;
+using x3::lit;
+
+struct parser_context_tag;
+
+using keyValue_ = std::pair<std::string, std::string>;
+
+struct cd_ : x3::position_tagged {
+    bool operator==(const cd_& b) const;
+    path_ m_path;
+};
+
+struct create_ : x3::position_tagged {
+    bool operator==(const create_& b) const;
+    path_ m_path;
+};
+
+struct delete_ : x3::position_tagged {
+    bool operator==(const delete_& b) const;
+    path_ m_path;
+};
+
+struct set_ : x3::position_tagged {
+    bool operator==(const set_& b) const;
+    path_ m_path;
+    std::string m_data;
+};
+
+using command_ = boost::variant<cd_, create_, delete_, set_>;
+
+BOOST_FUSION_ADAPT_STRUCT(cd_, m_path)
+BOOST_FUSION_ADAPT_STRUCT(create_, m_path)
+BOOST_FUSION_ADAPT_STRUCT(delete_, m_path)
+BOOST_FUSION_ADAPT_STRUCT(set_, m_path, m_data)
diff --git a/src/ast_path.cpp b/src/ast_path.cpp
new file mode 100644
index 0000000..2d2c600
--- /dev/null
+++ b/src/ast_path.cpp
@@ -0,0 +1,99 @@
+/*
+ * 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>
+ *
+*/
+
+#include <experimental/iterator>
+#include "ast_path.hpp"
+#include "utils.hpp"
+
+container_::container_(const std::string& name)
+    : m_name(name)
+{
+}
+
+bool container_::operator==(const container_& b) const
+{
+    return this->m_name == b.m_name;
+}
+
+leaf_::leaf_(const std::string& name)
+    : m_name(name)
+{
+}
+
+bool leaf_::operator==(const leaf_& b) const
+{
+    return this->m_name == b.m_name;
+}
+
+listElement_::listElement_(const std::string& listName, const std::map<std::string, std::string>& keys)
+    : m_name(listName)
+    , m_keys(keys)
+{
+}
+
+bool listElement_::operator==(const listElement_& b) const
+{
+    return (this->m_name == b.m_name && this->m_keys == b.m_keys);
+}
+
+bool path_::operator==(const path_& b) const
+{
+    if (this->m_nodes.size() != b.m_nodes.size())
+        return false;
+    return this->m_nodes == b.m_nodes;
+}
+
+
+struct nodeToSchemaString : 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;
+    }
+};
+struct nodeToDataString : public boost::static_visitor<std::string> {
+    std::string operator()(const listElement_& node) const
+    {
+        std::ostringstream res;
+        res << node.m_name + "[";
+        std::transform(node.m_keys.begin(), node.m_keys.end(),
+                std::experimental::make_ostream_joiner(res, ' '),
+                [] (const auto& it) { return it.first + "=" + it.second; });
+        res << "]";
+    return res.str();
+    }
+    std::string operator()(const nodeup_&) const
+    {
+        return "..";
+    }
+    template <class T>
+    std::string operator()(const T& node) const
+    {
+        return node.m_name;
+    }
+};
+
+std::string pathToDataString(const path_& path)
+{
+    std::string res;
+    for (const auto it : path.m_nodes)
+        res = joinPaths(res, boost::apply_visitor(nodeToDataString(), it));
+    return res;
+}
+
+std::string pathToSchemaString(const path_& path)
+{
+    std::string res;
+    for (const auto it : path.m_nodes)
+        res = joinPaths(res, boost::apply_visitor(nodeToSchemaString(), it));
+    return res;
+}
diff --git a/src/ast_path.hpp b/src/ast_path.hpp
new file mode 100644
index 0000000..1a4b282
--- /dev/null
+++ b/src/ast_path.hpp
@@ -0,0 +1,67 @@
+/*
+ * 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>
+ *
+*/
+#pragma once
+
+#include <boost/spirit/home/x3.hpp>
+#include <boost/spirit/home/x3/support/ast/position_tagged.hpp>
+#include <boost/spirit/home/x3/support/utility/error_reporting.hpp>
+
+#include <boost/fusion/adapted/struct/adapt_struct.hpp>
+#include <boost/fusion/include/adapt_struct.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+#include <boost/variant.hpp>
+#include <map>
+#include <vector>
+
+struct nodeup_ {
+    bool operator==(const nodeup_&) const
+    {
+        return true;
+    }
+};
+
+struct container_ {
+    container_() = default;
+    container_(const std::string& name);
+
+    bool operator==(const container_& b) const;
+
+    std::string m_name;
+};
+
+struct leaf_ {
+    leaf_() = default;
+    leaf_(const std::string& name);
+
+    bool operator==(const leaf_& b) const;
+
+    std::string m_name;
+};
+
+struct listElement_ {
+    listElement_() {}
+    listElement_(const std::string& listName, const std::map<std::string, std::string>& keys);
+
+    bool operator==(const listElement_& b) const;
+
+    std::string m_name;
+    std::map<std::string, std::string> m_keys;
+};
+
+struct path_ {
+    bool operator==(const path_& b) const;
+    std::vector<boost::variant<container_, listElement_, nodeup_, leaf_>> m_nodes;
+};
+
+
+std::string pathToDataString(const path_& path);
+std::string pathToSchemaString(const path_& path);
+
+BOOST_FUSION_ADAPT_STRUCT(container_, m_name)
+BOOST_FUSION_ADAPT_STRUCT(listElement_, m_name, m_keys)
+BOOST_FUSION_ADAPT_STRUCT(path_, m_nodes)
diff --git a/src/grammars.hpp b/src/grammars.hpp
index 9e4ea35..937fd3c 100644
--- a/src/grammars.hpp
+++ b/src/grammars.hpp
@@ -8,7 +8,7 @@
 
 #pragma once
 
-#include "ast.hpp"
+#include "ast_commands.hpp"
 #include "ast_handlers.hpp"
 
 
diff --git a/src/parser.cpp b/src/parser.cpp
index f26b164..e2d0330 100644
--- a/src/parser.cpp
+++ b/src/parser.cpp
@@ -5,7 +5,6 @@
  * Written by Václav Kubernát <kubervac@fit.cvut.cz>
  *
 */
-#include <experimental/iterator>
 #include <ostream>
 #include "parser.hpp"
 
@@ -19,28 +18,6 @@
 {
 }
 
-struct nodeToDataString : public boost::static_visitor<std::string> {
-    std::string operator()(const listElement_& node) const
-    {
-        std::ostringstream res;
-        res << node.m_name + "[";
-        std::transform(node.m_keys.begin(), node.m_keys.end(),
-                       std::experimental::make_ostream_joiner(res, ' '),
-                       [] (const auto& it) { return it.first + "=" + it.second; });
-        res << "]";
-        return res.str();
-    }
-    std::string operator()(const nodeup_&) const
-    {
-        return "..";
-    }
-    template <class T>
-    std::string operator()(const T& node) const
-    {
-        return node.m_name;
-    }
-};
-
 command_ Parser::parseCommand(const std::string& line, std::ostream& errorStream)
 {
     command_ parsedCommand;
@@ -74,10 +51,5 @@
 
 std::string Parser::currentNode() const
 {
-    std::string res;
-    for (const auto& it : m_curDir.m_nodes) {
-        res = joinPaths(res, boost::apply_visitor(nodeToDataString(), it));
-    }
-
-    return res;
+    return pathToDataString(m_curDir);
 }
diff --git a/src/schema.cpp b/src/schema.cpp
index 9832c45..95cd4ae 100644
--- a/src/schema.cpp
+++ b/src/schema.cpp
@@ -11,26 +11,6 @@
 
 InvalidNodeException::~InvalidNodeException() = default;
 
-struct nodeToSchemaString : 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;
-    }
-};
-
-std::string pathToString(const path_& path)
-{
-    std::string res;
-    for (const auto it : path.m_nodes)
-        res = joinPaths(res, boost::apply_visitor(nodeToSchemaString(), it));
-    return res;
-}
-
 Schema::Schema()
 {
     m_nodes.emplace("", std::unordered_map<std::string, NodeType>());
@@ -52,7 +32,7 @@
 
 bool Schema::isContainer(const path_& location, const std::string& name) const
 {
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     if (!nodeExists(locationString, name))
         return false;
 
@@ -71,7 +51,7 @@
 
 bool Schema::listHasKey(const path_& location, const std::string& name, const std::string& key) const
 {
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     assert(isList(location, name));
 
     const auto& child = children(locationString).at(name);
@@ -81,7 +61,7 @@
 
 const std::set<std::string>& Schema::listKeys(const path_& location, const std::string& name) const
 {
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     assert(isList(location, name));
 
     const auto& child = children(locationString).at(name);
@@ -91,7 +71,7 @@
 
 bool Schema::isList(const path_& location, const std::string& name) const
 {
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     if (!nodeExists(locationString, name))
         return false;
     const auto& child = children(locationString).at(name);
@@ -112,7 +92,7 @@
 {
     if (!isContainer(location, name))
         return false;
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     return boost::get<yang::container>(children(locationString).at(name)).m_presence == yang::ContainerTraits::Presence;
 }
 
@@ -123,7 +103,7 @@
 
 bool Schema::isLeaf(const path_& location, const std::string& name) const
 {
-    std::string locationString = pathToString(location);
+    std::string locationString = pathToSchemaString(location);
     if (!nodeExists(locationString, name))
         return false;
 
diff --git a/src/schema.hpp b/src/schema.hpp
index 487f820..73e89df 100644
--- a/src/schema.hpp
+++ b/src/schema.hpp
@@ -12,7 +12,7 @@
 #include <set>
 #include <stdexcept>
 #include <unordered_map>
-#include "ast.hpp"
+#include "ast_path.hpp"
 
 namespace yang {
 enum class ContainerTraits {
