diff --git a/uhdm-plugin/UhdmAst.cc b/uhdm-plugin/UhdmAst.cc
index 3ba1282..f0412e6 100644
--- a/uhdm-plugin/UhdmAst.cc
+++ b/uhdm-plugin/UhdmAst.cc
@@ -1043,12 +1043,13 @@
 void UhdmAst::process_design()
 {
     current_node = make_ast_node(AST::AST_DESIGN);
-    visit_one_to_many({UHDM::uhdmallInterfaces, UHDM::uhdmallPackages, UHDM::uhdmallModules, UHDM::uhdmtopModules, vpiTypedef}, obj_h,
-                      [&](AST::AstNode *node) {
-                          if (node) {
-                              shared.top_nodes[node->str] = node;
-                          }
-                      });
+    visit_one_to_many(
+      {UHDM::uhdmallInterfaces, UHDM::uhdmallPackages, UHDM::uhdmallModules, UHDM::uhdmtopModules, vpiTypedef, vpiParameter, vpiParamAssign}, obj_h,
+      [&](AST::AstNode *node) {
+          if (node) {
+              shared.top_nodes[node->str] = node;
+          }
+      });
     for (auto pair : shared.top_nodes) {
         if (!pair.second)
             continue;
@@ -1817,7 +1818,7 @@
         }
     });
     visit_one_to_many({vpiTypedef}, obj_h, [&](AST::AstNode *node) {
-        if (node) {
+        if (node && node->str != "") {
             move_type_to_new_typedef(current_node, node);
         }
     });
@@ -2411,6 +2412,9 @@
                 auto key = node->children[0]->str;
                 key = key.substr(key.find('.') + 1);
                 auto param_type = shared.param_types[param_node->str];
+                if (!param_type) {
+                    log_error("Couldn't find parameter type for node: %s\n", param_node->str.c_str());
+                }
                 size_t pos =
                   std::find_if(param_type->children.begin(), param_type->children.end(), [key](AST::AstNode *child) { return child->str == key; }) -
                   param_type->children.begin();
@@ -2511,6 +2515,9 @@
 {
     current_node = make_ast_node(AST::AST_CASE);
     visit_one_to_one({vpiCondition}, obj_h, [&](AST::AstNode *node) {
+        if (!node) {
+            log_error("Couldn't find node in if stmt. This can happend if unsupported '$value$plusargs' function is used inside if.\n");
+        }
         auto reduce_node = new AST::AstNode(AST::AST_REDUCE_BOOL, node);
         current_node->children.push_back(reduce_node);
     });
@@ -2899,7 +2906,11 @@
     visit_one_to_many({vpiRange}, obj_h, [&](AST::AstNode *node) { packed_ranges.push_back(node); });
     add_multirange_wire(current_node, packed_ranges, unpacked_ranges);
     if (!current_node->str.empty()) {
-        move_type_to_new_typedef(find_ancestor({AST::AST_MODULE, AST::AST_PACKAGE}), current_node->clone());
+        auto top_module = find_ancestor({AST::AST_MODULE, AST::AST_PACKAGE, AST::AST_DESIGN});
+        if (!top_module) {
+            log_error("Couldn't find top module for typedef: %s\n", current_node->str.c_str());
+        }
+        move_type_to_new_typedef(top_module, current_node->clone());
     }
 }
 
@@ -2915,7 +2926,11 @@
     add_multirange_wire(current_node, packed_ranges, unpacked_ranges);
     current_node->is_signed = true;
     if (!current_node->str.empty()) {
-        move_type_to_new_typedef(find_ancestor({AST::AST_MODULE, AST::AST_PACKAGE}), current_node);
+        auto top_module = find_ancestor({AST::AST_MODULE, AST::AST_PACKAGE, AST::AST_DESIGN});
+        if (!top_module) {
+            log_error("Couldn't find top module for typedef: %s\n", current_node->str.c_str());
+        }
+        move_type_to_new_typedef(top_module, current_node);
     }
 }
 
@@ -2970,7 +2985,11 @@
         }
     });
     if (!current_node->str.empty()) {
-        move_type_to_new_typedef(find_ancestor({AST::AST_MODULE, AST::AST_PACKAGE}), current_node);
+        auto top_module = find_ancestor({AST::AST_MODULE, AST::AST_PACKAGE, AST::AST_DESIGN});
+        if (!top_module) {
+            log_error("Couldn't find top module for typedef: %s\n", current_node->str.c_str());
+        }
+        move_type_to_new_typedef(top_module, current_node);
     }
 }
 
