context DOC add context usage overview
diff --git a/src/context.h b/src/context.h
index c0fbb92..a3c6366 100644
--- a/src/context.h
+++ b/src/context.h
@@ -25,6 +25,109 @@
 #endif
 
 /**
+ * @page howtocontext Context
+ *
+ * The context concept allows callers to work in environments with different sets of YANG schemas.
+ *
+ * The first step in libyang is to create a new context using ly_ctx_new(). It returns a handler
+ * used in the following work.
+ *
+ * When creating a new context, search dir can be specified (NULL is accepted) to provide directory
+ * where libyang will automatically search for schemas being imported or included. The search path
+ * can be later changed via ly_ctx_set_searchdir() and ly_ctx_unset_searchdir() functions. Before the search dirs,
+ * also the current working directory is (non-recursively) searched. For the case of the explicitly set search
+ * dirs, also all their subdirectories (and symlinks) are taken into account. Searching in the current working
+ * directory can be avoided with the context's #LY_CTX_DISABLE_SEARCHDIR_CWD option (or via ly_ctx_set_options()).
+ * Searching in all the context's search dirs (without removing them) can be avoided with the context's
+ * #LY_CTX_DISABLE_SEARCHDIRS option (or via ly_ctx_set_options()). This automatic searching can be preceded
+ * by a custom  module searching callback (#ly_module_imp_clb) set via ly_ctx_set_module_imp_clb(). The algorithm of
+ * searching in search dirs is also available via API as lys_search_localfile() function.
+ *
+ * Schemas are added into the context using [parser functions](@ref howtoschemasparsers) - \b lys_parse_*().
+ * Alternatively, also ly_ctx_load_module() can be used - in that case the #ly_module_imp_clb or automatic
+ * search in search dir and in the current working directory is used. YANG submodules cannot be loaded or even validated
+ * directly, they are loaded always only as includes of YANG modules.
+ *
+ * YANG schemas are loaded in two steps. First, the input YANG/YIN data are parsed into \b lysp_* structures that reflect
+ * the structure of the input schema. Mostly just syntax checks are done, no reference or type checking is performed in
+ * this step. If the module is supposed to be implemented, not just imported by another module, the second step is to compile
+ * it. The compiled schema may significantly differ in structure from the source schema structure. All the references
+ * are resolved, groupings are instantiated, types are resolved (and compiled by grouping all the relevant restrictions
+ * when derived from another types) and many other syntactical checks are done.
+ *
+ * Similarly, data trees can be parsed by \b lyd_parse_*() functions. Note, that functions for schemas have \b lys_
+ * prefix (or \b lysp_ for the parsed and \b lysc_ for the compiled schema) while functions for instance data have
+ * \b lyd_ prefix. It can happen during data parsing that a schema is required and __not found__ in the context or
+ * the schema is found, but is __only imported__, not implemented (so the data cannot actually be instantiated).
+ * In these cases, a callback is called, which should add this schema into the context or change its conformance
+ * to implemented. You can set the callback using ly_ctx_set_module_data_clb() (more in @ref howtodataparsers
+ * and @ref howtodatavalidation).
+ *
+ * Context can hold multiple revisions of the same schema, but only one of them can be implemented. The schema is not
+ * implemented in case it is automatically loaded as import for another module and it is not referenced in such
+ * a module (and no other) as target of leafref, augment or deviation. All modules with deviation definition are always
+ * marked as implemented. The imported (not implemented) module can be set implemented by lys_set_implemented(). But
+ * the implemented module cannot be changed back to just imported module. The imported modules are used only as a
+ * source of definitions for types and groupings for uses statements. The data in such modules are ignored - caller
+ * is not allowed to create the data (including instantiating identities) defined in the model via data parsers,
+ * the default nodes are not added into any data tree and mandatory nodes are not checked in the data trees. This
+ * can be changed by ly_ctx_new()'s #LY_CTX_ALLIMPLEMENTED option (or via ly_ctx_set_options()), which causes that
+ * all the imported modules are automatically set to be implemented.
+ *
+ * When loading/importing a module without revision, the latest revision of the required module is supposed to load.
+ * For a context, the first time the latest revision of a module is requested, it is properly searched for and loaded.
+ * However, when this module is requested (without revision) the second time, the one found previously is returned.
+ * This has the advantage of not searching for the module repeatedly but the drawback that if a later revision
+ * of the module is later made available, this context will not use it. However, to force libyang to re-search the
+ * latest revision, ly_ctx_reset_latests() can be used (not that it applies to all the schemas in the context).
+ *
+ * Context holds all schema modules internally. To get a specific module, use ly_ctx_get_module() (or ly_ctx_get_module_ns())
+ * The returned structure includes both, parsed and compiled, schema variants. If you need to do something with all the modules
+ * in the context, it is advised to iterate over them using ly_ctx_get_module_iter(), it is the most efficient way.
+ * Alternatively, the ly_ctx_info() function can be used to get complex information about the schemas in the context
+ * in the form of data tree defined by <a href="https://tools.ietf.org/html/rfc7895">ietf-yang-library</a> schema.
+ * To get a specific node defined in a module in the context, ly_ctx_find_path() or ly_ctx_get_node() can be used.
+ *
+ * Modules cannot be removed from their context. If you need to change the set of the schema modules in the context
+ * (use only a subset), a new context must be created. To remove the context, there is ly_ctx_destroy() function.
+ *
+ * - @subpage howtocontextdict
+ *
+ * \note API for this group of functions is available in the [context module](@ref context).
+ *
+ * Functions List
+ * --------------
+ * - ::ly_ctx_new()
+ * - ::ly_ctx_set_searchdir()
+ * - ::ly_ctx_unset_searchdir()
+ * - ::ly_ctx_unset_searchdirs()
+ * - ::ly_ctx_get_searchdirs()
+ * - ::ly_ctx_set_module_imp_clb()
+ * - ::ly_ctx_get_module_imp_clb()
+ * - ::ly_ctx_set_module_data_clb()
+ * - ::ly_ctx_get_module_data_clb()
+ * - ::ly_ctx_set_options()
+ * - ::ly_ctx_unset_options()
+ * - ::ly_ctx_get_options()
+ * - ::ly_ctx_load_module()
+ * - ::ly_ctx_info()
+ * - ::ly_ctx_get_module_iter()
+ * - ::ly_ctx_get_module()
+ * - ::ly_ctx_get_module_ns()
+ * - ::ly_ctx_get_module_implemented()
+ * - ::ly_ctx_get_module_implemented_ns()
+ * - ::ly_ctx_get_module_latest()
+ * - ::ly_ctx_get_module_latest_ns()
+ * - ::ly_ctx_reset_latests()
+ * - ::ly_ctx_get_module_set_id()
+ * - ::ly_ctx_get_node()
+ * - ::ly_ctx_find_path()
+ * - ::ly_ctx_destroy()
+ * - ::lys_set_implemented()
+ * - ::lys_search_localfile()
+ */
+
+/**
  * @defgroup context Context
  * @{
  *
@@ -250,14 +353,6 @@
 struct lys_module *ly_ctx_get_module_implemented(const struct ly_ctx *ctx, const char *name);
 
 /**
- * @brief Get the (only) implemented YANG module specified by its name.
- *
- * @param[in] ctx Context where to search.
- * @param[in] name Name of the YANG module to get.
- * @return The only implemented YANG module revision of the given name in the given context. NULL if there is no
- * implemented module of the given name.
- */
-/**
  * @brief Iterate over all modules in the given context.
  *
  * @param[in] ctx Context with the modules.