diff --git a/src/parser_context.cpp b/src/parser_context.cpp
index c240984..7750301 100644
--- a/src/parser_context.cpp
+++ b/src/parser_context.cpp
@@ -7,11 +7,72 @@
 */
 
 #include "parser_context.hpp"
-ParserContext::ParserContext(const Schema& schema, const schemaPath_& curDir)
+ParserContext::ParserContext(const Schema& schema, const dataPath_& curDir)
     : m_schema(schema)
-    , m_curPath(curDir)
     , m_curPathOrig(curDir)
+    , m_curPath(curDir)
 {
-    if (!m_curPath.m_nodes.empty() && m_curPath.m_nodes.at(0).m_prefix)
+    if (!currentDataPath().m_nodes.empty() && currentDataPath().m_nodes.at(0).m_prefix)
         m_topLevelModulePresent = true;
 }
+
+void ParserContext::clearPath()
+{
+    m_curPath = dataPath_{Scope::Absolute, {}};
+    m_topLevelModulePresent = false;
+}
+
+schemaPath_ ParserContext::currentSchemaPath()
+{
+    if (m_curPath.type() == typeid(dataPath_)) {
+        return dataPathToSchemaPath(boost::get<dataPath_>(m_curPath));
+    } else {
+        return boost::get<schemaPath_>(m_curPath);
+    }
+}
+
+dataPath_ ParserContext::currentDataPath()
+{
+    if (m_curPath.type() != typeid(dataPath_)) {
+        throw std::runtime_error("Tried getting a dataPath_ from ParserContext when only schemaPath_ was available.");
+    }
+    return boost::get<dataPath_>(m_curPath);
+}
+
+void ParserContext::pushPathFragment(const dataNode_& node)
+{
+    auto pushNode = [this] (auto& where, const auto& what) {
+        if (what.m_suffix.type() == typeid(nodeup_)) {
+            where.m_nodes.pop_back();
+            if (where.m_nodes.empty()) {
+                m_topLevelModulePresent = false;
+            }
+        } else {
+            where.m_nodes.push_back(what);
+        }
+    };
+
+    if (m_curPath.type() == typeid(dataPath_)) {
+        pushNode(boost::get<dataPath_>(m_curPath), node);
+    } else {
+        pushNode(boost::get<schemaPath_>(m_curPath), dataNodeToSchemaNode(node));
+    }
+}
+
+void ParserContext::pushPathFragment(const schemaNode_& node)
+{
+    if (m_curPath.type() == typeid(dataPath_)) {
+        m_curPath = dataPathToSchemaPath(boost::get<dataPath_>(m_curPath));
+    }
+
+    boost::get<schemaPath_>(m_curPath).m_nodes.push_back(node);
+    if (currentSchemaPath().m_nodes.empty()) {
+        m_topLevelModulePresent = false;
+    }
+}
+
+void ParserContext::resetPath()
+{
+    m_curPath = m_curPathOrig;
+    m_topLevelModulePresent = !currentDataPath().m_nodes.empty() && currentDataPath().m_nodes.at(0).m_prefix;
+}
