introduce namespaces
diff --git a/libasn1fix/asn1fix_export.c b/libasn1fix/asn1fix_export.c
index b570925..ee39afb 100644
--- a/libasn1fix/asn1fix_export.c
+++ b/libasn1fix/asn1fix_export.c
@@ -3,29 +3,69 @@
 
 extern arg_t a1f_replace_me_with_proper_interface_arg;
 
+static asn1p_t *asn1f_ssn_asn_;
+
+static void
+_add_standard_namespaces(asn1_namespace_t *ns) {
+    asn1p_oid_t *uioc_oid;
+    asn1p_oid_arc_t arcs[] = {{1, "iso"},           {3, "org"},
+                              {6, "dod"},           {1, "internet"},
+                              {4, "private"},       {1, "enterprise"},
+                              {9363, "spelio"},     {1, "software"},
+                              {5, "asn1c"},         {3, "standard-modules"},
+                              {0, "auto-imported"}, {1, 0}};
+
+    uioc_oid = asn1p_oid_construct(arcs, sizeof(arcs) / sizeof(arcs[0]));
+
+    asn1p_module_t *module = asn1f_lookup_module_ex(
+        asn1f_ssn_asn_, "ASN1C-UsefulInformationObjectClasses", uioc_oid);
+    asn1p_oid_free(uioc_oid);
+
+    if(module) {
+        asn1_namespace_add_module(ns, module, 0);
+    }
+}
+
+void
+asn1f_use_standard_namespaces(asn1p_t *asn) {
+    asn1f_ssn_asn_ = asn;
+    asn1_namespace_add_standard_namespaces_callback(_add_standard_namespaces);
+}
+
+asn1p_module_t *
+asn1f_lookup_module_ex(asn1p_t *asn, const char *module_name,
+                       const asn1p_oid_t *oid) {
+    arg_t arg;
+
+    memset(&arg, 0, sizeof(arg));
+
+    arg.asn = asn;
+    arg.eh = a1f_replace_me_with_proper_interface_arg.eh;
+    arg.debug = a1f_replace_me_with_proper_interface_arg.debug;
+    return asn1f_lookup_module(&arg, module_name, oid);
+}
 
 asn1p_expr_t *
-asn1f_lookup_symbol_ex(
-		asn1p_t *asn,
-		asn1p_expr_t *expr,
-		const asn1p_ref_t *ref) {
-	arg_t arg;
+asn1f_lookup_symbol_ex(asn1p_t *asn, asn1_namespace_t *ns, asn1p_expr_t *expr,
+                       const asn1p_ref_t *ref) {
+    arg_t arg;
 
-	memset(&arg, 0, sizeof(arg));
+    memset(&arg, 0, sizeof(arg));
 
-	arg.asn = asn;
-	arg.mod = expr->module;
-	arg.expr = expr;
-	arg.eh = a1f_replace_me_with_proper_interface_arg.eh;
-	arg.debug = a1f_replace_me_with_proper_interface_arg.debug;
+    arg.asn = asn;
+    arg.ns = ns;
+    arg.mod = expr->module;
+    arg.expr = expr;
+    arg.eh = a1f_replace_me_with_proper_interface_arg.eh;
+    arg.debug = a1f_replace_me_with_proper_interface_arg.debug;
 
-
-	return asn1f_lookup_symbol(&arg, expr->module, expr->rhs_pspecs, ref);
+    return asn1f_lookup_symbol(&arg, expr->rhs_pspecs, ref);
 }
 
 asn1p_expr_t *
 asn1f_class_access_ex(asn1p_t *asn,
 		asn1p_module_t *mod,
+		asn1_namespace_t *ns,
 		asn1p_expr_t *expr,
 		asn1p_expr_t *rhs_pspecs,
 		const asn1p_ref_t *ref) {
@@ -35,26 +75,29 @@
 
 	arg.asn = asn;
 	arg.mod = mod;
+	arg.ns = ns;
 	arg.expr = expr;
 	arg.eh = a1f_replace_me_with_proper_interface_arg.eh;
 	arg.debug = a1f_replace_me_with_proper_interface_arg.debug;
 
-	return asn1f_class_access(&arg, mod, rhs_pspecs, ref);
+    return asn1f_class_access(&arg, rhs_pspecs, ref);
 }
 
 asn1p_expr_t *
-asn1f_find_terminal_type_ex(asn1p_t *asn, asn1p_expr_t *expr) {
-	arg_t arg;
+asn1f_find_terminal_type_ex(asn1p_t *asn, asn1_namespace_t *ns,
+                            asn1p_expr_t *expr) {
+    arg_t arg;
 
-	memset(&arg, 0, sizeof(arg));
+    memset(&arg, 0, sizeof(arg));
 
-	arg.asn = asn;
-	arg.mod = expr->module;
-	arg.expr = expr;
-	arg.eh = a1f_replace_me_with_proper_interface_arg.eh;
-	arg.debug = a1f_replace_me_with_proper_interface_arg.debug;
+    arg.asn = asn;
+    arg.ns = ns;
+    arg.mod = expr->module;
+    arg.expr = expr;
+    arg.eh = a1f_replace_me_with_proper_interface_arg.eh;
+    arg.debug = a1f_replace_me_with_proper_interface_arg.debug;
 
-	return asn1f_find_terminal_type(&arg, expr);
+    return asn1f_find_terminal_type(&arg, expr);
 }
 
 asn1p_expr_t *