yin parser ADD parsing of import element
diff --git a/src/parser_yin.c b/src/parser_yin.c
index a9cb8c9..2fe6ed7 100644
--- a/src/parser_yin.c
+++ b/src/parser_yin.c
@@ -280,16 +280,16 @@
  *
  * @param[in] xml_ctx xml context.
  * @param[in, out] data Data to read from.
- * @param[in, out] mod_p Module to write to.
+ * @param[in, out] namespace Where namespace value should be stored.
  *
  * @return LY_ERR values.
  */
 LY_ERR
-parse_namespace(struct lyxml_context *xml_ctx, const char **data, struct lysp_module **mod)
+parse_namespace(struct lyxml_context *xml_ctx, const char **data, const char **namespace)
 {
     LY_ERR ret = LY_SUCCESS;
 
-    ret = yin_parse_attribute(xml_ctx, data, YIN_ARG_URI, &((*mod)->mod->ns), "namespace");
+    ret = yin_parse_attribute(xml_ctx, data, YIN_ARG_URI, namespace, "namespace");
     LY_CHECK_RET(ret != LY_SUCCESS, ret);
 
     /* remove local xmlns definitions */
@@ -302,32 +302,43 @@
  *
  * @param[in] xml_ctx Xml context.
  * @param[in, out] data Data to reda from.
- * @param[out] mod Module to write to.
+ * @param[out] prefix Where to store prefix value.
  *
  * @return LY_ERR values.
  */
 LY_ERR
-parse_prefix(struct lyxml_context *xml_ctx, const char **data, struct lysp_module **mod)
+parse_prefix(struct lyxml_context *xml_ctx, const char **data, const char **prefix)
 {
     LY_ERR ret = LY_SUCCESS;
 
     /* parse attributes */
-    ret = yin_parse_attribute(xml_ctx, data, YIN_ARG_VALUE, &(*mod)->mod->prefix, "prefix");
+    ret = yin_parse_attribute(xml_ctx, data, YIN_ARG_VALUE, prefix, "prefix");
     LY_CHECK_RET(ret != LY_SUCCESS, ret);
     /* remove local xmlns definitions */
     ret = lyxml_ns_rm(xml_ctx, "prefix");
     return ret;
 }
 
-// static LY_ERR
-// yin_parse_revision_date(struct lyxml_context *xml_ctx, const char **data, struct lysp_module **mod)
-// {
+static LY_ERR
+yin_parse_revision_date(struct lyxml_context *xml_ctx, const char **data, char *rev, struct lysp_ext_instance **exts)
+{
+    LY_ERR ret = LY_SUCCESS;
 
-//     return LY_SUCCESS;
-// }
+    if (rev[0]) {
+        LOGVAL_YANG(xml_ctx, LY_VCODE_DUPSTMT, "revision-date");
+        return LY_EVALID;
+    }
+
+    ret = yin_parse_attribute(xml_ctx, data, YIN_ARG_DATE, (const char **)&rev, "revision-date");
+    LY_CHECK_RET(ret != LY_SUCCESS, ret);
+    LY_CHECK_RET(lysp_check_date((struct ly_parser_ctx *)xml_ctx, rev, strlen(rev), "revision-date") != LY_SUCCESS, LY_EVALID);
+
+    ret = lyxml_ns_rm(xml_ctx, "import");
+    return ret;
+}
 
 static LY_ERR
-yin_parse_import(struct lyxml_context *xml_ctx, const char *module_prefix, const char **data, struct lysp_module **mod)
+yin_parse_import(struct lyxml_context *xml_ctx, const char *module_prefix, const char **data, struct lysp_import **imports)
 {
     LY_ERR ret = LY_SUCCESS;
     enum yang_keyword kw;
@@ -335,43 +346,28 @@
     const char *prefix, *name;
     size_t prefix_len, name_len;
 
-    char *buf = NULL, *out = NULL;
-    size_t buf_len = 0, out_len = 0;
-    int dynamic;
+    /* allocate sized array for imports */
+    LY_ARRAY_NEW_RET(xml_ctx->ctx, *imports, imp, LY_EVALID);
 
     /* parse import attributes  */
-    ret = yin_parse_attribute(xml_ctx, data, YIN_ARG_MODULE, &(*mod)->mod->prefix, "import");
-
-    /* valid subelements description, prefix, reference, revision-data */
-    /* allocate sized array for imports */
-    LY_ARRAY_NEW_RET(xml_ctx->ctx, (*mod)->imports, imp, LY_EVALID);
-
-    /* get value */
-    ret = lyxml_get_attribute(xml_ctx, data, &prefix, &prefix_len, &name, &name_len);
-    LY_CHECK_RET(ret);
-    if (match_argument_name(name, name_len) != YIN_ARG_MODULE) {
-        LOGVAL(xml_ctx->ctx, LY_VLOG_LINE, &xml_ctx->line, LYVE_SYNTAX, "Invalid argument name \"%s\", expected \"module\".", name);
-        return LY_EVALID;
-    }
-    ret = lyxml_get_string(xml_ctx, data, &buf, &buf_len, &out, &out_len, &dynamic);
-    LY_CHECK_RET(ret);
-    imp->name = lydict_insert(xml_ctx->ctx, out, out_len);
-    LY_CHECK_ERR_RET(!imp->name, LOGMEM(xml_ctx->ctx), LY_EMEM);
-
+    ret = yin_parse_attribute(xml_ctx, data, YIN_ARG_MODULE, &imp->name, "import");
     while ((ret = lyxml_get_element(xml_ctx, data, &prefix, &prefix_len, &name, &name_len) == LY_SUCCESS && name != NULL)) {
         kw = match_keyword(name, name_len, prefix_len);
         switch (kw) {
         case YANG_PREFIX:
-            parse_prefix(xml_ctx, data, mod);
+            LY_CHECK_ERR_RET(imp->prefix, LOGVAL_YANG(xml_ctx, LY_VCODE_DUPSTMT, "prefix"), LY_EVALID);
+            parse_prefix(xml_ctx, data, &imp->prefix);
             break;
         case YANG_DESCRIPTION:
-            parse_text_element(xml_ctx, "description", data, &((*mod)->mod->dsc));
+            LY_CHECK_ERR_RET(imp->dsc, LOGVAL_YANG(xml_ctx, LY_VCODE_DUPSTMT, "description"), LY_EVALID);
+            parse_text_element(xml_ctx, "description", data, &imp->dsc);
             break;
         case YANG_REFERENCE:
-            parse_text_element(xml_ctx, "reference", data, &((*mod)->imports->ref));
+            LY_CHECK_ERR_RET(imp->ref, LOGVAL_YANG(xml_ctx, LY_VCODE_DUPSTMT, "reference"), LY_EVALID);
+            parse_text_element(xml_ctx, "reference", data, &imp->ref);
             break;
         case YANG_REVISION_DATE:
-            /* this is attribute of import element */
+            yin_parse_revision_date(xml_ctx, data, &imp->rev, &imp->exts);
         case YANG_CUSTOM:
             /* TODO parse extension */
         default:
@@ -520,15 +516,15 @@
 
             /* module header */
             case YANG_NAMESPACE:
-                LY_CHECK_RET(parse_namespace(xml_ctx, data, mod));
+                LY_CHECK_RET(parse_namespace(xml_ctx, data, &(*mod)->mod->ns));
                 break;
             case YANG_PREFIX:
-                LY_CHECK_RET(parse_prefix(xml_ctx, data, mod));
+                LY_CHECK_RET(parse_prefix(xml_ctx, data, &(*mod)->mod->prefix));
                 break;
 
             /* linkage */
             case YANG_IMPORT:
-                yin_parse_import(xml_ctx, (*mod)->mod->prefix, data, mod);
+                yin_parse_import(xml_ctx, (*mod)->mod->prefix, data, &(*mod)->imports);
                 break;
 
             /* meta */