diff --git a/src/ast_handlers.hpp b/src/ast_handlers.hpp
index 65d8405..b58613c 100644
--- a/src/ast_handlers.hpp
+++ b/src/ast_handlers.hpp
@@ -22,7 +22,7 @@
         if (parserContext.m_tmpListKeys.find(ast.first) != parserContext.m_tmpListKeys.end()) {
             _pass(context) = false;
             parserContext.m_errorMsg = "Key \"" + ast.first + "\" was entered more than once.";
-        } else if (!schema.listHasKey(parserContext.m_curPath, parserContext.m_tmpListName, ast.first)) {
+        } else if (!schema.listHasKey(parserContext.m_curPath, {parserContext.m_curModule, parserContext.m_tmpListName}, ast.first)) {
             _pass(context) = false;
             parserContext.m_errorMsg = parserContext.m_tmpListName + " is not indexed by \"" + ast.first + "\".";
         } else {
@@ -39,7 +39,21 @@
     }
 };
 
-struct identifier_class;
+struct node_identifier_class {
+    template <typename T, typename Iterator, typename Context>
+    void on_success(Iterator const&, Iterator const&, T&, Context const& context)
+    {
+        auto& parserContext = x3::get<parser_context_tag>(context);
+
+        if (!parserContext.m_topLevelModulePresent) {
+            if (parserContext.m_errorMsg.empty())
+                parserContext.m_errorMsg = "You have to specify a top level module.";
+            _pass(context) = false;
+        }
+    }
+};
+
+struct module_identifier_class;
 
 struct listPrefix_class {
     template <typename T, typename Iterator, typename Context>
@@ -48,7 +62,7 @@
         auto& parserContext = x3::get<parser_context_tag>(context);
         const Schema& schema = parserContext.m_schema;
 
-        if (schema.isList(parserContext.m_curPath, ast)) {
+        if (schema.isList(parserContext.m_curPath, {parserContext.m_curModule, ast})) {
             parserContext.m_tmpListName = ast;
         } else {
             _pass(context) = false;
@@ -63,7 +77,7 @@
         auto& parserContext = x3::get<parser_context_tag>(context);
         const Schema& schema = parserContext.m_schema;
 
-        const auto& keysNeeded = schema.listKeys(parserContext.m_curPath, parserContext.m_tmpListName);
+        const auto& keysNeeded = schema.listKeys(parserContext.m_curPath, {parserContext.m_curModule, parserContext.m_tmpListName});
         std::set<std::string> keysSupplied;
         for (const auto& it : ast)
             keysSupplied.insert(it.first);
@@ -94,13 +108,6 @@
     }
 };
 struct listElement_class {
-    template <typename T, typename Iterator, typename Context>
-    void on_success(Iterator const&, Iterator const&, T& ast, Context const& context)
-    {
-        auto& parserContext = x3::get<parser_context_tag>(context);
-        parserContext.m_curPath.m_nodes.push_back(ast);
-    }
-
     template <typename Iterator, typename Exception, typename Context>
     x3::error_handler_result on_error(Iterator&, Iterator const&, Exception const&, Context const& context)
     {
@@ -119,11 +126,8 @@
     {
         auto& parserContext = x3::get<parser_context_tag>(context);
 
-        if (!parserContext.m_curPath.m_nodes.empty()) {
-            parserContext.m_curPath.m_nodes.pop_back();
-        } else {
+        if (parserContext.m_curPath.m_nodes.empty())
             _pass(context) = false;
-        }
     }
 };
 
@@ -134,11 +138,8 @@
         auto& parserContext = x3::get<parser_context_tag>(context);
         const auto& schema = parserContext.m_schema;
 
-        if (schema.isContainer(parserContext.m_curPath, ast.m_name)) {
-            parserContext.m_curPath.m_nodes.push_back(ast);
-        } else {
+        if (!schema.isContainer(parserContext.m_curPath, {parserContext.m_curModule, ast.m_name}))
             _pass(context) = false;
-        }
     }
 };
 
@@ -149,20 +150,46 @@
         auto& parserContext = x3::get<parser_context_tag>(context);
         const auto& schema = parserContext.m_schema;
 
-        if (schema.isLeaf(parserContext.m_curPath, ast.m_name)) {
-            parserContext.m_curPath.m_nodes.push_back(ast);
+        if (!schema.isLeaf(parserContext.m_curPath, {parserContext.m_curModule, ast.m_name}))
+            _pass(context) = false;
+    }
+};
+
+
+struct module_class {
+    template <typename T, typename Iterator, typename Context>
+    void on_success(Iterator const&, Iterator const&, T& ast, Context const& context)
+    {
+        auto& parserContext = x3::get<parser_context_tag>(context);
+        const auto& schema = parserContext.m_schema;
+
+        if (schema.isModule(parserContext.m_curPath, ast.m_name)) {
+            parserContext.m_curModule = ast.m_name;
+            parserContext.m_topLevelModulePresent = true;
         } else {
+            parserContext.m_errorMsg = "Invalid module name.";
             _pass(context) = false;
         }
     }
 };
 
-struct path_class {
+struct node_class {
     template <typename T, typename Iterator, typename Context>
-    void on_success(Iterator const&, Iterator const&, T&, Context const&)
+    void on_success(Iterator const&, Iterator const&, T& ast, Context const& context)
     {
+        auto& parserContext = x3::get<parser_context_tag>(context);
+        if (ast.m_suffix.type() == typeid(nodeup_)) {
+            parserContext.m_curPath.m_nodes.pop_back();
+            if (parserContext.m_curPath.m_nodes.empty())
+                parserContext.m_topLevelModulePresent = false;
+        } else {
+            parserContext.m_curPath.m_nodes.push_back(ast);
+            parserContext.m_curModule = boost::none;
+        }
     }
+};
 
+struct path_class {
     template <typename Iterator, typename Exception, typename Context>
     x3::error_handler_result on_error(Iterator&, Iterator const&, Exception const&, Context const& context)
     {
@@ -176,12 +203,8 @@
     }
 };
 
-struct cd_class {
-    template <typename T, typename Iterator, typename Context>
-    void on_success(Iterator const&, Iterator const&, T&, Context const&)
-    {
-    }
 
+struct cd_class {
     template <typename Iterator, typename Exception, typename Context>
     x3::error_handler_result on_error(Iterator&, Iterator const&, Exception const& x, Context const& context)
     {
@@ -199,10 +222,13 @@
         auto& parserContext = x3::get<parser_context_tag>(context);
         const auto& schema = parserContext.m_schema;
         try {
-            container_ cont = boost::get<container_>(ast.m_path.m_nodes.back());
+            boost::optional<std::string> module;
+            if (ast.m_path.m_nodes.back().m_prefix)
+                module = ast.m_path.m_nodes.back().m_prefix.value().m_name;
+            container_ cont = boost::get<container_>(ast.m_path.m_nodes.back().m_suffix);
             path_ location = pathWithoutLastNode(parserContext.m_curPath);
 
-            if (!schema.isPresenceContainer(location, cont.m_name)) {
+            if (!schema.isPresenceContainer(location, {module, cont.m_name})) {
                 parserContext.m_errorMsg = "This container is not a presence container.";
                 _pass(context) = false;
             }
@@ -234,7 +260,7 @@
     {
         auto& parserContext = x3::get<parser_context_tag>(context);
         try {
-            auto leaf = boost::get<leaf_>(ast.m_nodes.back());
+            auto leaf = boost::get<leaf_>(ast.m_nodes.back().m_suffix);
         } catch (boost::bad_get&) {
             parserContext.m_errorMsg = "This is not a path to leaf.";
             _pass(context) = false;
@@ -249,9 +275,9 @@
         auto& parserContext = x3::get<parser_context_tag>(context);
         auto& schema = parserContext.m_schema;
         if (parserContext.m_errorMsg.empty()) {
-            leaf_ leaf = boost::get<leaf_>(parserContext.m_curPath.m_nodes.back());
+            leaf_ leaf = boost::get<leaf_>(parserContext.m_curPath.m_nodes.back().m_suffix);
             path_ location = pathWithoutLastNode(parserContext.m_curPath);
-            parserContext.m_errorMsg = "Expected " + leafDataTypeToString(schema.leafType(location, leaf.m_name)) + " here:";
+            parserContext.m_errorMsg = "Expected " + leafDataTypeToString(schema.leafType(location, {parserContext.m_curModule, leaf.m_name})) + " here:";
             return x3::error_handler_result::fail;
         }
         return x3::error_handler_result::rethrow;
@@ -271,11 +297,14 @@
     {
         auto& parserContext = x3::get<parser_context_tag>(context);
         auto& schema = parserContext.m_schema;
+        boost::optional<std::string> module;
+        if (parserContext.m_curPath.m_nodes.back().m_prefix)
+            module = parserContext.m_curPath.m_nodes.back().m_prefix.value().m_name;
 
-        leaf_ leaf = boost::get<leaf_>(parserContext.m_curPath.m_nodes.back());
+        leaf_ leaf = boost::get<leaf_>(parserContext.m_curPath.m_nodes.back().m_suffix);
         path_ location = pathWithoutLastNode(parserContext.m_curPath);
 
-        if (schema.leafType(location, leaf.m_name) != m_type) {
+        if (schema.leafType(location, {module, leaf.m_name}) != m_type) {
             _pass(context) = false;
         }
     }
@@ -293,11 +322,14 @@
         leaf_data_base_class::on_success(start, end, ast, context);
         auto& parserContext = x3::get<parser_context_tag>(context);
         auto& schema = parserContext.m_schema;
+        boost::optional<std::string> module;
+        if (parserContext.m_curPath.m_nodes.back().m_prefix)
+            module = parserContext.m_curPath.m_nodes.back().m_prefix.value().m_name;
 
-        leaf_ leaf = boost::get<leaf_>(parserContext.m_curPath.m_nodes.back());
+        leaf_ leaf = boost::get<leaf_>(parserContext.m_curPath.m_nodes.back().m_suffix);
         path_ location = pathWithoutLastNode(parserContext.m_curPath);
 
-        if (!schema.leafEnumHasValue(location, leaf.m_name, ast.m_value)) {
+        if (!schema.leafEnumHasValue(location, {module, leaf.m_name}, ast.m_value)) {
             _pass(context) = false;
         }
     }
