libyang CHANGE module_clb submodule information added
diff --git a/src/context.c b/src/context.c
index 5c2399c..54c23cb 100644
--- a/src/context.c
+++ b/src/context.c
@@ -357,48 +357,68 @@
     return ctx->module_clb;
 }
 
-API const struct lys_module *
-ly_ctx_load_module(struct ly_ctx *ctx, const char *name, const char *revision)
+struct lys_module *
+ly_ctx_load_sub_module(struct ly_ctx *ctx, struct lys_module *module, const char *name, const char *revision,
+                       struct unres_schema *unres)
 {
-    const struct lys_module *module;
+    struct lys_module *mod;
     char *module_data;
     int i;
     void (*module_data_free)(void *module_data) = NULL;
     LYS_INFORMAT format = LYS_IN_UNKNOWN;
 
-    if (!ctx || !name) {
-        ly_errno = LY_EINVAL;
-        return NULL;
-    }
-
     /* exception for internal modules */
-    for (i = 0; i < INTERNAL_MODULES_COUNT; i++) {
-        if (ly_strequal(name, internal_modules[i].name, 0)) {
-            if (!revision || ly_strequal(revision, internal_modules[i].revision, 0)) {
-                /* return internal module */
-                return ly_ctx_get_module(ctx, name, revision);
+    if (!module) {
+        for (i = 0; i < INTERNAL_MODULES_COUNT; i++) {
+            if (ly_strequal(name, internal_modules[i].name, 0)) {
+                if (!revision || ly_strequal(revision, internal_modules[i].revision, 0)) {
+                    /* return internal module */
+                    return (struct lys_module *)ly_ctx_get_module(ctx, name, revision);
+                }
             }
         }
     }
 
     if (ctx->module_clb) {
-        module_data = ctx->module_clb(name, revision, ctx->module_clb_data, &format, &module_data_free);
+        if (module) {
+            mod = lys_main_module(module);
+            module_data = ctx->module_clb(mod->name, (mod->rev_size ? mod->rev[0].date : NULL), name, revision, ctx->module_clb_data, &format, &module_data_free);
+        } else {
+            module_data = ctx->module_clb(name, revision, NULL, NULL, ctx->module_clb_data, &format, &module_data_free);
+        }
         if (!module_data) {
             LOGERR(0, "User module retrieval callback failed!");
             return NULL;
         }
-        module = lys_parse_mem(ctx, module_data, format);
+
+        if (module) {
+            mod = (struct lys_module *)lys_submodule_parse(module, module_data, format, unres);
+        } else {
+            mod = (struct lys_module *)lys_parse_mem(ctx, module_data, format);
+        }
+
         if (module_data_free) {
             module_data_free(module_data);
         }
     } else {
-        module = lyp_search_file(ctx, NULL, name, revision, NULL);
-        if (module) {
-            ((struct lys_module *)module)->implemented = 1;
+        mod = lyp_search_file(ctx, module, name, revision, unres);
+        if (mod) {
+            mod->implemented = 1;
         }
     }
 
-    return module;
+    return mod;
+}
+
+API const struct lys_module *
+ly_ctx_load_module(struct ly_ctx *ctx, const char *name, const char *revision)
+{
+    if (!ctx || !name) {
+        ly_errno = LY_EINVAL;
+        return NULL;
+    }
+
+    return ly_ctx_load_sub_module(ctx, NULL, name, revision, NULL);
 }
 
 API const struct lys_module *