SNMP_MODULE_IDENT,     /* Mib MODULE-IDENTITY       */
         SNMP_TEXTUAL_CONV,     /* Mib TEXTUAL-CONVENTION    */
         SNMP_OBJECT_TYPE,      /* Mib OBJECT-TYPE           */
+        SNMP_NOTIFICATION_TYPE,
+        SNMP_OBJECT_IDENTITY,
+        SNMP_TRAP_TYPE,
+        SNMP_OBJECT_GROUP,
+        SNMP_NOTIFICATION_GROUP,
+        SNMP_MODULE_COMPLIANCE,
+        SNMP_AGENT_COMPTABILITIES,
         MAX
       } id;
       inline meta(meta::id id = INVALID) : m_id(id) {};
 
 ASSIGNMENT(OBJECTSET,objectset,assignment)
 ASSIGNMENT(OBJECTFIELD,objectfield,assignment)
 
-ASSIGNMENT(SNMP_MODULE_IDENT,snmp_mib_identity,assignment)
-ASSIGNMENT(SNMP_TEXTUAL_CONV,snmp_mib_tc,assignment)
-ASSIGNMENT(SNMP_OBJECT_TYPE,snmp_mib_object_type,assignment)
+ASSIGNMENT(SNMP_MODULE_IDENT,mib_module_identity,assignment)
+ASSIGNMENT(SNMP_TEXTUAL_CONV,mib_tc,assignment)
+ASSIGNMENT(SNMP_OBJECT_TYPE,mib_object_type,assignment)
+ASSIGNMENT(SNMP_NOTIFICATION_TYPE,mib_notification_type,assignment)
+ASSIGNMENT(SNMP_OBJECT_IDENTITY,mib_object_identity,assignment)
+ASSIGNMENT(SNMP_TRAP_TYPE,mib_trap_type,assignment)
+ASSIGNMENT(SNMP_OBJECT_GROUP,mib_object_group,assignment)
+ASSIGNMENT(SNMP_NOTIFICATION_GROUP,mib_notification_group,assignment)
+ASSIGNMENT(SNMP_MODULE_COMPLIANCE,mib_module_compliance,assignment)
+ASSIGNMENT(SNMP_AGENT_COMPTABILITIES,mib_agent_compatibilities,assignment)
+
+
+
 #undef ASSIGNMENT
 
       return !m_s.compare(n->name());
     };
 
-}
+/**
+ * @brief mib_module is a module that defines mib objects.
+ * As is very different compared to an asn1 module
+ *
+ */
+class mib : public module
+{
+  private:
+    
+  public:
+    /// Default mib module constructor
+    mib(const char *_name);
+    /// Default mib module desctructor
+    virtual ~mib();
+};
+
+} /* end of asn1 namespace */
+
+
+
 
 /**
 vim:et:sw=2:ts=2
 
--- /dev/null
+#ifndef ASN1_NODE_MIB_LEAF_H__
+#define ASN1_NODE_MIB_LEAF_H__
+
+
+/**
+ * TODO: Not sur if the type is appropriate. 
+ * I'm more thinking of mib_object which is not 
+ * 100% true either
+ *
+ */
+class mib_leaf : public constructed
+{
+  public:
+    typedef std::string                         syntax_type;
+    typedef std::string                         oid_type;
+  public:
+    /// Default constructor
+    mib_leaf();  
+    /// Default destructor
+    virtual ~mib_leaf() ;
+
+   syntax_type get_syntax() { return m_syntax; } const;
+  protected:
+    oid_type     m_oid;
+    syntax_type  m_syntax; // There is a syntax
+};
+
+
+
+#endif
 
 })
 DEF_TRAVERSE_ASSIGN(objectfield,{})
 
-DEF_TRAVERSE_ASSIGN(snmp_mib_identity,{})
-DEF_TRAVERSE_ASSIGN(snmp_mib_tc,{})
-DEF_TRAVERSE_ASSIGN(snmp_mib_object_type,{})
+DEF_TRAVERSE_ASSIGN(mib_module_identity,{})
+DEF_TRAVERSE_ASSIGN(mib_tc,{})
+DEF_TRAVERSE_ASSIGN(mib_object_type,{})
+DEF_TRAVERSE_ASSIGN(mib_notification_type,{})
+DEF_TRAVERSE_ASSIGN(mib_object_identity,{})
+DEF_TRAVERSE_ASSIGN(mib_trap_type,{})
+DEF_TRAVERSE_ASSIGN(mib_object_group,{})
+DEF_TRAVERSE_ASSIGN(mib_notification_group,{})
+DEF_TRAVERSE_ASSIGN(mib_module_compliance,{})
+DEF_TRAVERSE_ASSIGN(mib_agent_compatibilities,{})
+
 
 /* Implementation Traverse type */
 
 
 <INITIAL>APPLICATION     TOK(T_APPLICATION)
 <INITIAL>AUTOMATIC       TOK(T_AUTOMATIC)
 <INITIAL>BEGIN           TOK(T_BEGIN)
-<snmp>BITS      TOK(T_BIT)
+<snmp>BITS               TOK(T_BITS)
 <INITIAL,snmp>BIT             TOK(T_BIT)
 
 <INITIAL,snmp>BMPString       TOK(T_BMPString)
 <snmp>AGENT-COMPABILITIES SNMP_TOK(T_MACRO_NAME)
 
 <snmp_imports>{
-       {Identifier}           NODE_TOK(T_IDENTIFIER)
-       {String_Literal}       NODE_TOK(T_IDENTIFIER)
-       {CapitalReference}     NODE_TOK(T_CAPITALREFERENCE)
+        {Identifier}           NODE_TOK(T_IDENTIFIER)
+        {String_Literal}       NODE_TOK(T_IDENTIFIER)
+        {CapitalReference}     NODE_TOK(T_CAPITALREFERENCE)
         {TypeReference}        NODE_TOK(T_TYPEREFERENCE)
-       "{"                    TOK(T_LBRACET)
-       "}"                    TOK(T_RBRACET)
+        "{"                    TOK(T_LBRACET)
+        "}"                    TOK(T_RBRACET)
         ","                    TOK(T_COMMA)
         ";"                    {
                                  yy_pop_state(); 
         UNITS                  TOK(T_UNITS)
         VARIABLES              TOK(T_VARIABLES)
         WRITE-SYNTAX           TOK(T_WRITE_SYNTAX)
-       {Identifier}           NODE_TOK(T_IDENTIFIER)
-       {CapitalReference}     NODE_TOK(T_CAPITALREFERENCE)
+        {Identifier}           NODE_TOK(T_IDENTIFIER)
+        {CapitalReference}     NODE_TOK(T_CAPITALREFERENCE)
         {TypeReference}        NODE_TOK(T_TYPEREFERENCE)
         \"[^\"]*\"             { /* QUOTED STRING */
                                  yylval->node = new asn1::node(yytext);
 
 \r
 %}\r
 \r
+%right T_ASSIGN\r
+\r
 %token T_ABSENT\r
 %token T_ABSTRACT\r
 %token T_ABSTRACT_SYNTAX\r
        $<node>3->identifier($5);\r
        $<node>3->name($5->name());\r
        m->enter_symbol($<node>3,$<node>3->type_id()());\r
+       if (asn1::parser::instance()->is_mode_mib())\r
+       { // New attempt to add files direcly for paring\r
+         asn1::parser *p = asn1::parser::instance();\r
+         p->add_file($<node>5->name());\r
+       }\r
     }\r
 ;\r
 \r
         $$->as_typenode()->constraint($3);\r
         $$->tag($1);\r
   }\r
+ | T_BITS {\r
+        ASN_LOG_DEBUG( "type: T_BITS");\r
+ }\r
 ;\r
 \r
 builtin_type: boolean_def \r
 snmp_assignment: snmp_module_identity\r
  {\r
     ASN_LOG_DEBUG("snmp_assignment :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_module_identity_assignment($<node>1->name()); \r
   }\r
   | snmp_textual_convention  {\r
     ASN_LOG_DEBUG("snmp_textual_convention:");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_tc_assignment($<node>1->name()); \r
   }\r
   | snmp_object_type {\r
     ASN_LOG_DEBUG("snmp_object_type :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_object_type_assignment($<node>1->name()); \r
   }\r
   | snmp_notification_type {\r
     ASN_LOG_DEBUG("snmp_notification_type :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_notification_type_assignment($<node>1->name()); \r
   }\r
   | snmp_trap_type {\r
     ASN_LOG_DEBUG("snmp_notification_type :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_trap_type_assignment($<node>1->name()); \r
   }\r
   | snmp_notification_group {\r
     ASN_LOG_DEBUG("snmp_notification_group :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_notification_group_assignment($<node>1->name()); \r
   }\r
   | snmp_module_compliance {\r
     ASN_LOG_DEBUG("snmp_object_type :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_module_compliance_assignment($<node>1->name()); \r
   }\r
   | snmp_object_group {\r
     ASN_LOG_DEBUG("snmp_object_group :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_object_group_assignment($<node>1->name()); \r
   }\r
   | snmp_object_identity {\r
     ASN_LOG_DEBUG("snmp_object_identity :");\r
-    $$ = new asn1::snmp_mib_identity_assignment($<node>1->name()); \r
+    $$ = new asn1::mib_object_identity_assignment($<node>1->name()); \r
   }\r
 ;\r
 \r
     ASN_LOG_DEBUG("snmp_module_identity: %s end",$1->name().c_str());\r
     asn1::module *m = get_current_module();\r
     asn1::node *ids = m->leave_context();\r
+    ids->set_parent(m->current_context());\r
     $<node>$ = ids;\r
     $<node>$ = $<node>1;\r
 }\r
   snmp_mi_organization\r
   snmp_mi_contact\r
   snmp_description\r
-  snmp_mi_revisions {\r
+  snmp_mi_revision_part {\r
     ASN_LOG_DEBUG("snmp_mi_attributes: end");\r
 }\r
 ;\r
   }\r
 ;\r
 \r
+snmp_mi_revision_part: /*Empty*/ \r
+  | snmp_mi_revisions\r
+;\r
+\r
 snmp_mi_revisions: snmp_mi_revision {\r
   }\r
   | snmp_mi_revision snmp_mi_revisions {\r
 };\r
 \r
 snmp_tc_syntax: /* can be null */\r
-  | T_SYNTAX type_assign_right opt_constraint_def {\r
-};\r
+  | T_SYNTAX snmp_syntax\r
+;\r
 \r
 /** SNMP OBJECT-TYPE  */\r
 snmp_object_type: T_IDENTIFIER T_MACRO_OBJECT_TYPE snmp_ot_attributes \r
   snmp_ot_access\r
   snmp_ot_status\r
   snmp_description\r
-  snmp_ot_index\r
-  snmp_ot_augments\r
   snmp_ot_reference\r
+  snmp_ot_index_part\r
   snmp_ot_defval\r
 ;\r
 \r
   }\r
 ;\r
 \r
-snmp_ot_augments: /**/\r
-  | T_AUGMENTS T_LBRACET snmp_ot_indexes T_RBRACET {\r
-  }\r
-;\r
-snmp_ot_index: /**/\r
+snmp_ot_index_part: /**/\r
   | T_INDEX T_LBRACET snmp_ot_indexes T_RBRACET {\r
   }\r
+  | T_AUGMENTS T_LBRACET snmp_ot_indexes T_RBRACET {\r
+  }\r
 ;\r
 snmp_ot_indexes: T_IDENTIFIER  {\r
   }\r
 \r
 snmp_mc_module_name: /* Empty */\r
   | T_IDENTIFIER\r
+  | T_TYPEREFERENCE\r
+  | T_CAPITALREFERENCE\r
 ;\r
 \r
 snmp_mc_mandatory_groups: T_MANDATORY_GROUPS T_LBRACET snmp_mc_mandatories T_RBRACET\r
 \r
 /* Need to find out what kind of syntax it is about here */\r
 snmp_mc_obj_syntax: /**/\r
-  | T_SYNTAX  type\r
-  | T_SYNTAX  T_BITS T_LBRACET constant_list T_RBRACET\r
+  | T_SYNTAX  snmp_syntax \r
   | T_WRITE_SYNTAX  type_assign_right opt_constraint_def\r
 ; \r
   \r
     $<node>$ = $<node>1;\r
 };\r
 \r
-snmp_nt_attributes: snmp_objects\r
+snmp_nt_attributes: snmp_nt_objects\r
   snmp_status \r
   snmp_description {\r
 };\r
 \r
+snmp_nt_objects: snmp_objects\r
+  | /* empty*/\r
+;\r
+\r
 /** SNMP  NOTIFICATION-GROUP  */\r
 snmp_notification_group: T_IDENTIFIER  T_MACRO_NOTIFICATION_GROUP \r
     snmp_ng_attributes {\r
   snmp_description {\r
 };\r
 \r
+ /* SNMP SYNTAX rule. Based on type assign right without parameters*/\r
+\r
+snmp_syntax: complex_type_reference opt_constraint_def\r
+  | complex_type_reference T_LBRACET constant_list T_RBRACET\r
+  | builtin_type opt_constraint_def\r
+  | T_BITS T_LBRACET constant_list T_RBRACET \r
+;\r
+\r
 /*\r
  *\r
  */\r
 
             asn1p->files().pop_back();
             return  0;
         } else {
+            std::cout<<"Not Found File : "<<fullname<<std::endl;
             return 1;
         }
       } else 
 namespace asn1
 {
 
+#define CALL_LISTENER(event,type)             \
+struct got_##type                               \
+{                                               \
+  got_##type(asn1::##type *c) : m_c(c) {};      \
+  void operator ()(parser_listener *l)          \
+  {                                             \
+    l->##event (m_c);                           \
+  }                                             \
+  asn1::##type *m_c;                            \
+};
+
+#define NOTIFY_LISTENERS(call,arg)    \
+    std::for_each(m_listeners.begin() \
+                 , m_listeners.end()  \
+                 ,call (arg));
+
+
+// Example: CALL_LISTENER(onConstraint,constraint)
+
 //
 struct got_constraint
 {
   pl->add_parameter(c);
 }
 
+
+void 
+parser::add_file(const std::string &_from)
+{
+  // Be sur the file is not already in there
+  if (std::find(m_files.begin(),m_files.end(),_from) == m_files.end())
+  {
+    std::cout<<"ADD_FILE: "<<_from<<std::endl;
+    m_files.push_back(_from);
+  }
+}
+
 int 
 parser::parse()
 {
 
     inline string_list &files()     { return m_files;    }
     inline bool         file_mode() { return m_file_mode;}
     inline void set_file_mode(bool fm)
-    { m_file_mode = fm;}    
+    { m_file_mode = fm;}   
+
+    /// Add file from import
+    void add_file(const std::string &_from);
   private:
     parser() 
       : m_file_mode(false) , m_root(NULL),m_mode("asn1")