WIP
diff --git a/key-concepts-old.html b/key-concepts-old.html
new file mode 100644
index 0000000..3bd5ed8
--- /dev/null
+++ b/key-concepts-old.html
@@ -0,0 +1,587 @@
+---
+active_crumb: Docs
+layout: documentation
+id: key_concepts
+---
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements.  See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<div class="col-md-8 second-column" xmlns="http://www.w3.org/1999/html">
+    <section id="overview">
+        <h2 class="section-title">Key Concepts<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
+
+        <p>
+            NLPCraft is based on three main concepts:
+        </p>
+        <ul>
+            <li>
+                {% scaladoc NCModel NCModel %} is a user-configured object responsible for input interpretation.
+            </li>
+            <li>
+                {% scaladoc NCPipeline NCPipeline %} is a part of the model configuration that defines
+                specifics of the user input processing.
+            </li>
+            <li>
+                {% scaladoc NCModelClient NCModelClient %} is responsible for interaction with the data model.
+            </li>
+        </ul>
+
+        <p>Here's the typical code structure when working with NLPCraft:</p>
+
+        <pre class="brush: scala, highlight: []">
+              // Init data model.
+              val mdl = new CustomNlpModel()
+
+              // Creates client for given model.
+              val cli = new NCModelClient(mdl)
+
+              // Sends text request to model by user ID "user01".
+              val result = client.ask("Some user command", "user01")
+        </pre>
+    </section>
+
+    <section id="terminology">
+        <h2 class="section-title">Terminology<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
+        <p>
+            Let's start with the nomenclature of the main NLPCraft types:
+        </p>
+
+        <table class="gradient-table">
+            <thead>
+            <tr>
+                <th>Type</th>
+                <th>Description</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr>
+                <td><b>{% scaladoc NCModel NCModel %}</b></td>
+                <td>
+                    <code>Model</code> is the main component in NLPCraft. User-define data model contains its {% scaladoc NCModelConfig NCModelConfig %},
+                    input processing {% scaladoc NCPipeline NCPipeline %} and life-cycle callbacks.
+                    NLPCraft employs model-as-a-code approach where entire data model is an implementation of just
+                    this interface. The instance of this interface is passed to {% scaladoc NCModelClient NCModelClient %} class.
+                    Note that the model-as-a-code approach natively supports any software life cycle tools and frameworks
+                    like various build tools, CI/SCM tools, IDEs, etc. You don't need any additional tools to manage some
+                    aspects of your data models - your entire model and all of its components are part of your project's source code.
+                    Note that in most cases, one would use a convenient {% scaladoc NCModelAdapter NCModelAdapter %} adapter to implement this interface.
+                </td>
+            </tr>
+            <tr>
+                <td><b>{% scaladoc NCToken NCToken %}</b></td>
+                <td>
+                    <code>Token</code> is simple string, part of user input, which is obtained by splitting user input
+                    according to some rules. For example, the user input "<b>Where is it?</b>" contains four tokens:
+                    "<code>Where</code>", "<code>is</code>", "<code>it</code>", "<code>?</code>".
+                    Usually <code>tokens</code> are words and punctuation symbols which also contain additional
+                    information like point of speech tags, relative position in the overall input text, stopword flag,
+                    stem and lemma forms, etc. List of parsed <code>tokens</code> serves as an input for parsing <code>entities</code>.
+                </td>
+            </tr>
+            <tr>
+                <td><b>{% scaladoc NCEntity NCEntity %}</b></td>
+                <td>
+                    <code>Entity</code> typically represents a real-world object, such as a person, location, organization,
+                    or product that can often be denoted with a proper name. It can be abstract or have a physical existence.
+                    Each <code>entity</code> consists of zero or more <code>tokens</code>. Combination of entities form one or more parsing
+                    <code>variants</code>.
+                </td>
+            </tr>
+            <tr>
+                <td><b>{% scaladoc NCVariant NCVariant %}</b></td>
+                <td>
+                    <code>Variant</code> is a unique set of <code>entities</code>. In many cases, a <code>token</code> or a group
+                    of <code>tokens</code> can be recognized as more than one <code>entity</code> - resulting in multiple possible
+                    interpretations of the original sequence of tokens. Each such interpretation is defined as a parsing <code>variant</code>.
+                    For example, user input <b>"Look at this crane."</b> can be interpreted as two <code>variants</code>,
+                    one of them containing <code>entity</code> <b>BIRD<sub>[crane]</sub></b> and another containing <code>entity</code> <b>MACHINE<sub>[crane]</sub></b>.
+                    Set of <code>variants</code> ultimately serves as an input to <a href="intent-matching.html">intent matching</a>.
+                </td>
+            </tr>
+            <tr>
+                <td><b>{% scaladoc NCPipeline NCPipeline %}</b></td>
+                <td>
+                    <code>Pipeline</code> is the main configuration property of the model. Pipeline consists of an ordered sequence
+                    of <a href="/pipeline-components.html">pipeline components</a>. User input starts at the first component of the
+                    pipeline as a simple text and exits the end of the pipeline as a one or more parsing <code>variants</code>.
+                    The output of the pipeline is further passed as an input to <a href="intent-matching.html">intent matching</a>.
+                </td>
+            </tr>
+            <tr>
+                <td><b>{% scaladoc NCModelCofig NCModelConfig %}</b></td>
+                <td>
+                    <code>Pipeline</code> is the main configuration property of the model. Pipeline consists of an ordered sequence
+                    of <a href="/pipeline-components.html">pipeline components</a>. User input starts at the first component of the
+                    pipeline as a simple text and exits the end of the pipeline as a one or more parsing <code>variants</code>.
+                    The output of the pipeline is further passed as an input to <a href="intent-matching.html">intent matching</a>.
+                </td>
+            </tr>
+            <tr>
+                <td><b><a target="scaladoc" href="/apis/latest/">@NCIntent</a></b></td>
+                <td>
+                    <code>Variant</code> is a unique set of <code>entities</code>. In many cases, a <code>token</code> or a group
+                    of <code>tokens</code> can be recognized as more than one <code>entity</code> - resulting in multiple possible
+                    interpretations of the original sequence of tokens. Each such interpretation is defined as a parsing <code>variant</code>.
+                    For example, user input <b>"Look at this crane."</b> can be interpreted as two <code>variants</code>,
+                    one of them containing <code>entity</code> <b>BIRD<sub>[crane]</sub></b> and another containing <code>entity</code> <b>MACHINE<sub>[crane]</sub></b>.
+                </td>
+            </tr>
+
+            </tbody>
+        </table>
+
+        <figure>
+            <img alt="named entities" class="img-fluid" src="/images/text-tokens-entities2.png">
+            <figcaption><b>Fig 1.</b> Text -> Tokens -> Entities -> Parsing Variants.</figcaption>
+        </figure>
+
+        <p>
+            When <code>Variant</code> is prepared, the suitable  <code>Intent</code> is trying to matched with it.
+        </p>
+
+        <table class="gradient-table">
+            <thead>
+            <tr>
+                <th>Term</th>
+                <th>Description</th>
+            </tr>
+            </thead>
+            <tbody>
+
+            <tr>
+                <td><code>Intent</code></td>
+                <td>
+                    <code>Intent</code> is user defined callback method and rule according to which this callback should be called.
+                    Most often rule is some template based on expected set of <code>entities</code> in user input,
+                    but it can be defined more flexible.
+                    Parameters extracted from user text input are passed into callback method.
+                    This method execution result is provided to user as answer on his request.
+                    <code>Intent</code> callbacks are methods defined in <code>Data Model</code> class annotated by
+                    <code>intent</code> rules via <a href="intent-matching.html">IDL</a>.
+                </td>
+            </tr>
+            <tr>
+                <td><code>IDL</code></td>
+                <td>
+                    IDL, Intent Definition Language, is a relatively straightforward declarative language which
+                    defines a match between the parsed user input represented as the collection of tokens,
+                    and the user-define callback method.
+                    IDL intents are bound to their callbacks via Java annotation and can be located
+                    in the same Java annotations or placed in model YAML/JSON file as well as in external *.idl files.
+                </td>
+            </tr>
+            <tr>
+                <td><code>Callback</code></td>
+                <td>
+                    The user defined Scala method which mapped to the <code>intent</code>.
+                    This method receives as its parameters normalized values from user input text according to
+                    IDL matched terms.
+                </td>
+            </tr>
+            </tbody>
+        </table>
+
+        <p>
+            So, <code>Data Model</code> must be able to do tree following things:
+        </p>
+
+        <ul>
+            <li>
+                Parse user input text as the <code>tokens</code>.
+                They are input for searching <code>named entities</code>.
+                <code>Tokens</code> parsing components should be included into <a href="#model-pipeline">Model pipeline</a>.
+            </li>
+            <li>
+                Find <code>named entities</code> based on these parsed <code>tokens</code>.
+                They are input for searching <code>intents</code>.
+                <code>Entity</code> parsing components should be included into <a href="#model-pipeline">Model pipeline</a>.
+            </li>
+            <li>
+                Prepare <code>intents</code> with their callbacks methods which contain business logic.
+                These methods should be defined directly in the model class definition or the model should have references on them.
+                It will be described below. Callback can de defined in model scala class directly or via references.
+                Look at the chapter <a href="intent-matching.html">Intent Matching</a> content for get more details.
+            </li>
+        </ul>
+
+        <p>
+            As example, let's prepare the system which can call persons from your contact list.
+            Typical commands are: "<b>Please call to John Smith</b>" or "<b>Connect me with Barbara Dillan</b>".
+            For solving this task this model should be able to recognize in user text following entities:
+            <code>command</code> and <code>person</code> to apply this command.
+        </p>
+
+        <p>
+            So, when request "<b>Please call to John Smith</b>" received, our model should be able to:
+        </p>
+
+        <ul>
+            <li>
+                Parse tokens splitting user text input:
+                "<code>please</code>", "<code>call</code>", "<code>to</code>", "<code>john</code>", "<code>smith</code>".
+            </li>
+            <li>
+                Find two named entities:
+                <ul>
+                    <li>
+                        <code>command</code> by token "<code>call</code>".
+                    </li>
+                    <li>
+                        <code>person</code> by tokens "<code>john</code>" and "<code>smith</code>".
+                    </li>
+                </ul>
+            </li>
+            <li>
+                Have prepared intent:
+                <pre class="brush: scala, highlight: [1, 2, 5, 6]">
+                    @NCIntent("intent=call term(command)={# == 'command'} term(person)={# == 'person'}")
+                    def onCommand(
+                        ctx: NCContext,
+                        im: NCIntentMatch,
+                        @NCIntentTerm("command") command: NCEntity,
+                        @NCIntentTerm("person") person: NCEntity
+                    ): NCResult = ? // Implement business logic here.
+                </pre>
+
+                <ul>
+                    <li>
+                        <code>Line 1</code> defines intent <code>call</code> with two conditions
+                        which expects two named entities in user input text.
+                    </li>
+                    <li>
+                        <code>Line 2</code> defines related callback method <code>onCommand()</code>.
+                    </li>
+                    <li>
+                        <code>Lines 4 and 5</code> define two callback method's arguments which are corresponded to
+                        <code>call</code> intent terms conditions. You can extract normalized value
+                        <code>john smith</code> from the <code>person</code> parameter and use it in the method body
+                        for getting his phone number etc.
+                    </li>
+                </ul>
+            </li>
+        </ul>
+    </section>
+
+    <section id="model-configuration">
+        <h2 class="section-title">Model Configuration<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
+
+        <p>
+            <code>Data Model</code> configuration represented as
+            {% scaladoc NCModelConfig NCModelConfig %}
+            contains set of parameters which are described below.
+        </p>
+        <table class="gradient-table">
+            <thead>
+            <tr>
+                <th>Name</th>
+                <th>Description</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr>
+                <td><code>id</code>, <code>name</code> and <code>version</code></td>
+                <td>
+                    Mandatory model properties.
+                </td>
+            </tr>
+            <tr>
+                <td><code>description</code>, <code>origin</code></td>
+                <td>
+                    Optional model properties.
+                </td>
+            </tr>
+            <tr>
+                <td><code>conversationTimeout</code></td>
+                <td>
+                    Timeout of the user's conversation.
+                    If user doesn't communicate with the model this time period STM is going to be cleared.
+                    Loot at <a href="short-term-memory.html">Conversation</a> chapter to get more details.
+                    It is the mandatory parameter with default value.
+                </td>
+            </tr>
+            <tr>
+                <td><code>conversationDepth</code></td>
+                <td>
+                    Maximum supported depth the user's conversation.
+                    Loot at <a href="short-term-memory.html">Conversation</a> chapter to get more details.
+                    It is the mandatory parameter with default value.
+                </td>
+            </tr>
+            </tbody>
+        </table>
+    </section>
+
+    <section id="model-pipeline">
+        <h2 class="section-title">Model Pipeline<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
+
+        <p>
+            Model <code>Pipeline</code> is represented as {% scaladoc NCPipeline NCPipeline %} and
+            contains following components:
+        </p>
+
+        <table class="gradient-table">
+            <thead>
+            <tr>
+                <th>Component</th>
+                <th>Mandatory</th>
+                <th>Description</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr>
+                <td>{% scaladoc NCTokenParser NCTokenParser %}</td>
+                <td>Mandatory single</td>
+                <td>
+                    <code>Token parser</code> should be able to parse user input plain text and split this text
+                    into <code>tokens</code> list.
+                    NLPCraft provides two default English language implementations of token parser.
+                    Also, project contains examples for <a href="examples/light_switch_fr.html">French</a> and
+                    <a href="examples/light_switch_ru.html">Russia</a> languages token parser implementations.
+                </td>
+            </tr>
+            <tr>
+                <td> {% scaladoc NCTokenEnricher NCTokenEnricher %}</td>
+                <td>Optional list</td>
+                <td>
+                    <code>Tokens enricher</code> is a component which allow to add additional properties for prepared tokens,
+                    like part of speech, quote, stop-words flags or any other.
+                    NLPCraft provides built-in English language set of token enrichers implementations.
+                    Here is an <a href="custom-components.html#token-enrichers">example</a>.
+                </td>
+            </tr>
+            <tr>
+                <td> {% scaladoc NCTokenValidator NCTokenValidator %}</td>
+                <td>Optional list</td>
+                <td>
+                    <code>Token validator</code> is a component which allow to inspect prepared tokens and
+                    throw an exception to break user input processing.
+                    Here is an <a href="custom-components.html#token-validators">example</a>.
+                </td>
+            </tr>
+            <tr>
+                <td> {% scaladoc NCEntityParser NCEntityParser %}</td>
+                <td>Mandatory list</td>
+                <td>
+                    <code>Entity parser</code> is a component which allow to find user defined named entities
+                    based on prepared tokens as input.
+                    NLPCraft provides wrappers for named-entity recognition components of
+                    <a href="https://opennlp.apache.org/">Apache OpenNLP</a> and
+                    <a href="https://nlp.stanford.edu/">Stanford NLP</a> and its own implementations.
+                    Note that at least one entity parser must be defined.
+                    Here is an <a href="custom-components.html#entity-parsers">example</a>.
+                </td>
+            </tr>
+            <tr>
+                <td> {% scaladoc NCEntityEnricher NCEntityEnricher %}</td>
+                <td>Optional list</td>
+                <td>
+                    <code>Entity enricher</code> is component which allows to add additional properties for prepared entities.
+                    Can be useful for extending existing entity enrichers functionality.
+                    Here is an <a href="custom-components.html#entity-enrichers">example</a>.
+                </td>
+            </tr>
+            <tr>
+                <td> {% scaladoc NCEntityMapper NCEntityMapper %}</td>
+                <td>Optional list</td>
+                <td>
+                    <code>Entity mappers</code> is component which allows to map one set of entities to another after the entities
+                    were parsed and enriched. Can be useful for building complex parsers based on existing.
+                    Here is an <a href="custom-components.html#entity-mappers">example</a>.
+                </td>
+            </tr>
+            <tr>
+                <td> {% scaladoc NCEntityValidator NCEntityValidator %}</td>
+                <td>Optional list</td>
+                <td>
+                    <code>Entity validator</code> is a component which allow to inspect prepared entities and
+                    throw an exception to break user input processing.
+                    Here is an <a href="custom-components.html#entity-validators">example</a>.
+                </td>
+            </tr>
+            <tr>
+                <td> {% scaladoc NCVariantFilter NCVariantFilter %}</td>
+                <td>Optional single</td>
+                <td>
+                    <code>Variant filter</code> is a component which allows filtering detected variants and
+                    rejecting undesirable.
+                    Here is an <a href="custom-components.html#variant-filters">example</a>.
+                </td>
+            </tr>
+            </tbody>
+        </table>
+
+        <figure>
+            <img alt="pipeline" class="img-fluid" src="/images/pipeline.png">
+            <figcaption><b>Fig 2.</b> Pipeline</figcaption>
+        </figure>
+
+        <p>
+            Below {% scaladoc NCModel NCModel %} creation example.
+            {% scaladoc NCPipeline NCPipeline %} is prepared using
+            {% scaladoc NCPipelineBuilder NCPipelineBuilder %} class helper.
+        </p>
+
+        <pre class="brush: scala, highlight: []">
+            val pipeline =
+                new NCPipelineBuilder().
+                    withTokenParser(new NCFrTokenParser()).
+                    withTokenEnricher(new NCFrLemmaPosTokenEnricher()).
+                    withTokenEnricher(new NCFrStopWordsTokenEnricher()).
+                    withEntityParser(new NCFrSemanticEntityParser("lightswitch_model_fr.yaml")).
+                    build
+            val cfg = NCModelConfig("nlpcraft.lightswitch.fr.ex", "LightSwitch Example Model FR", "1.0")
+
+            val mdl = new NCModel(cfg, pipeline):
+                // Add your callbacks definition or references on them here.
+        </pre>
+
+        <p>
+            This flexible system allows to create any pipelines on any language.
+            You can collect NLPCraft predefined components, write your own and easy reuse custom components.
+        </p>
+    </section>
+
+    <section id="model-behavior">
+        <h2 class="section-title">Model Behavior Overriding<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
+
+        <p>
+            There are also several {% scaladoc NCModel NCModel %}
+            callbacks that you can override to affect model behavior during
+            <a href="/intent-matching.html#model_callbacks">intent matching</a>
+            to perform logging, debugging, statistic or usage collection, explicit update or initialization of
+            conversation context, security audit or validation:
+        </p>
+        <table class="gradient-table">
+            <thead>
+            <tr>
+                <th>Method</th>
+                <th>Description</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr>
+                <td>{% scaladoc NCModel#onContext-38d onContext() %}</td>
+                <td>
+                    Overriding this method allows to prepare result before intent matching.
+                </td>
+            </tr>
+            <tr>
+                <td>{% scaladoc NCModel#onMatchedIntent-946 onMatchedIntent() %}</td>
+                <td>
+                    Overriding this method allows to reject matched intent and continue matching process.
+                </td>
+            </tr>
+            <tr>
+                <td>{% scaladoc NCModel#onResult-fffffaf3 onResult() %}</td>
+                <td>
+                    Overriding this method allows to replace callback method execution result.
+                </td>
+            </tr>
+            <tr>
+                <td>{% scaladoc NCModel#onRejection-4fa onRejection() %}</td>
+                <td>
+                    Overriding this method allows to change operation result when rejection occurs.
+                </td>
+            </tr>
+            <tr>
+                <td>{% scaladoc NCModel#onError-fffff759 onError() %}</td>
+                <td>
+                    Overriding this method allows to change operation result when any error occurs.
+                </td>
+            </tr>
+            </tbody>
+        </table>
+    </section>
+
+    <section id="client">
+        <h2 class="section-title">Client Responsibility<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
+
+        <p>
+            <code>Client</code>  represented as {% scaladoc NCModelClient NCModelClient %}
+            is necessary for communication with the <code>Data Model</code>. Base client methods  are described below.
+        </p>
+
+        <table class="gradient-table">
+            <thead>
+            <tr>
+                <th>Method</th>
+                <th>Description</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr>
+                <td>{% scaladoc NCModelClient#ask-fffff9ce ask() %}</td>
+                <td>
+                    Passes user text input to the model and receives back execution
+                    {% scaladoc NCResult NCResult %} or
+                    rejection exception if there isn't any triggered intents.
+                    {% scaladoc NCResult NCResult %} is wrapper on
+                    callback method execution result with additional information.
+                </td>
+            </tr>
+            <tr>
+                <td>{% scaladoc NCModelClient#debugAsk-fffff96c debugAsk() %}</td>
+                <td>
+                    Passes user text input to the model and receives back callback and its parameters or
+                    rejection exception if there isn't any triggered intents.
+                    Main difference from <code>ask</code> that triggered intent callback method is not called.
+                    This method and this parameter can be useful in tests scenarios.
+                </td>
+            </tr>
+            <tr>
+                <td>{% scaladoc NCModelClient#clearStm-571 clearStm() %}</td>
+                <td>
+                    Clears STM state. Memory is cleared wholly or with some predicate.
+                    Loot at <a href="short-term-memory.html">Conversation</a> chapter to get more details.
+                    Second variant of given method with another parameters is here - {% scaladoc NCModelClient#clearStm-1d8 clearStm() %}.
+                </td>
+            </tr>
+            <tr>
+                <td>{% scaladoc NCModelClient#clearDialog-571 clearDialog() %}</td>
+                <td>
+                    Clears dialog state. Dialog is cleared wholly or with some predicate.
+                    Loot at <a href="short-term-memory.html">Conversation</a> chapter to get more details.
+                    Second variant of given method with another parameters is here - {% scaladoc NCModelClient#clearDialog-1d8 clearDialog() %}.
+                </td>
+            </tr>
+            <tr>
+                <td>{% scaladoc NCModelClient#close-94c close() %}</td>
+                <td>
+                    Closes client. You can't call another client's methods after this method was closed.
+                </td>
+            </tr>
+            </tbody>
+        </table>
+    </section>
+</div>
+<div class="col-md-2 third-column">
+    <ul class="side-nav">
+        <li class="side-nav-title">On This Page</li>
+        <li><a href="#overview">Key Concepts</a></li>
+        <li><a href="#terminology">Terminology</a></li>
+<!--         <li><a href="#model-configuration">Model Configuration</a></li> -->
+<!--         <li><a href="#model-pipeline">Model Pipeline</a></li> -->
+<!--         <li><a href="#model-behavior">Model Behavior Overriding</a></li> -->
+<!--         <li><a href="#client">Client Responsibility</a></li> -->
+        {% include quick-links.html %}
+    </ul>
+</div>
+
+
+
+
diff --git a/key-concepts.html b/key-concepts.html
index ec3a5ae..b3b3b18 100644
--- a/key-concepts.html
+++ b/key-concepts.html
@@ -37,7 +37,7 @@
                 specifics of the user input processing.
             </li>
             <li>
-                {% scaladoc NCModelClient NCModelClient %} is responsible for communication with the data model.
+                {% scaladoc NCModelClient NCModelClient %} is responsible for interaction with the data model.
             </li>
         </ul>
 
@@ -56,7 +56,7 @@
     </section>
 
     <section id="terminology">
-        <h2 class="section-title">Terminology<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
+        <h2 class="section-title">Main Types<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
         <p>
             Let's start with the nomenclature of the main NLPCraft types:
         </p>
@@ -98,8 +98,10 @@
                 <td>
                     <code>Entity</code> typically represents a real-world object, such as a person, location, organization,
                     or product that can often be denoted with a proper name. It can be abstract or have a physical existence.
-                    Each <code>entity</code> consists of zero or more <code>tokens</code>. Combination of entities form one or more parsing
-                    <code>variants</code>.
+                    Each <code>entity</code> consists of zero or more <code>tokens</code> and therefore is represented by zero
+                    or more substrings from the original input text. Note that entities may have only a very loose mapping back
+                    to the original text as entities represent a higher-level abstractions compared to tokens. Combination of
+                    entities form one or more parsing <code>variants</code>.
                 </td>
             </tr>
             <tr>
@@ -123,461 +125,33 @@
                 </td>
             </tr>
             <tr>
-                <td><b>{% scaladoc NCModelCofig NCModelConfig %}</b></td>
-                <td>
-                    <code>Pipeline</code> is the main configuration property of the model. Pipeline consists of an ordered sequence
-                    of <a href="/pipeline-components.html">pipeline components</a>. User input starts at the first component of the
-                    pipeline as a simple text and exits the end of the pipeline as a one or more parsing <code>variants</code>.
-                    The output of the pipeline is further passed as an input to <a href="intent-matching.html">intent matching</a>.
-                </td>
-            </tr>
-            <tr>
                 <td><b><a target="scaladoc" href="/apis/latest/">@NCIntent</a></b></td>
                 <td>
-                    <code>Variant</code> is a unique set of <code>entities</code>. In many cases, a <code>token</code> or a group
-                    of <code>tokens</code> can be recognized as more than one <code>entity</code> - resulting in multiple possible
-                    interpretations of the original sequence of tokens. Each such interpretation is defined as a parsing <code>variant</code>.
-                    For example, user input <b>"Look at this crane."</b> can be interpreted as two <code>variants</code>,
-                    one of them containing <code>entity</code> <b>BIRD<sub>[crane]</sub></b> and another containing <code>entity</code> <b>MACHINE<sub>[crane]</sub></b>.
+                    <a target="scaladoc" href="/apis/latest/">@NCIntent</a> annotation binds a declarative intent to its
+                    callback method. The intent generally refers to the goal that the end-user had in mind when speaking
+                    or typing the input utterance. The intent has a <em>declarative part or template</em> written in <a href="/intent-matching.html#idl">IDL - Intent Definition Language</a>
+                    that strictly defines a particular form the user input.
+                    Intent is also bound to a callback method that will be executed
+                    when that intent, i.e. its template, is detected as the best match for a given input.
                 </td>
             </tr>
 
             </tbody>
         </table>
-
+        <p>
+            Here's the illustration on how a user input text transforms into a set of parsing variants:
+        </p>
         <figure>
             <img alt="named entities" class="img-fluid" src="/images/text-tokens-entities2.png">
             <figcaption><b>Fig 1.</b> Text -> Tokens -> Entities -> Parsing Variants.</figcaption>
         </figure>
-
-        <p>
-            When <code>Variant</code> is prepared, the suitable  <code>Intent</code> is trying to matched with it.
-        </p>
-
-        <table class="gradient-table">
-            <thead>
-            <tr>
-                <th>Term</th>
-                <th>Description</th>
-            </tr>
-            </thead>
-            <tbody>
-
-            <tr>
-                <td><code>Intent</code></td>
-                <td>
-                    <code>Intent</code> is user defined callback method and rule according to which this callback should be called.
-                    Most often rule is some template based on expected set of <code>entities</code> in user input,
-                    but it can be defined more flexible.
-                    Parameters extracted from user text input are passed into callback method.
-                    This method execution result is provided to user as answer on his request.
-                    <code>Intent</code> callbacks are methods defined in <code>Data Model</code> class annotated by
-                    <code>intent</code> rules via <a href="intent-matching.html">IDL</a>.
-                </td>
-            </tr>
-            <tr>
-                <td><code>IDL</code></td>
-                <td>
-                    IDL, Intent Definition Language, is a relatively straightforward declarative language which
-                    defines a match between the parsed user input represented as the collection of tokens,
-                    and the user-define callback method.
-                    IDL intents are bound to their callbacks via Java annotation and can be located
-                    in the same Java annotations or placed in model YAML/JSON file as well as in external *.idl files.
-                </td>
-            </tr>
-            <tr>
-                <td><code>Callback</code></td>
-                <td>
-                    The user defined Scala method which mapped to the <code>intent</code>.
-                    This method receives as its parameters normalized values from user input text according to
-                    IDL matched terms.
-                </td>
-            </tr>
-            </tbody>
-        </table>
-
-        <p>
-            So, <code>Data Model</code> must be able to do tree following things:
-        </p>
-
-        <ul>
-            <li>
-                Parse user input text as the <code>tokens</code>.
-                They are input for searching <code>named entities</code>.
-                <code>Tokens</code> parsing components should be included into <a href="#model-pipeline">Model pipeline</a>.
-            </li>
-            <li>
-                Find <code>named entities</code> based on these parsed <code>tokens</code>.
-                They are input for searching <code>intents</code>.
-                <code>Entity</code> parsing components should be included into <a href="#model-pipeline">Model pipeline</a>.
-            </li>
-            <li>
-                Prepare <code>intents</code> with their callbacks methods which contain business logic.
-                These methods should be defined directly in the model class definition or the model should have references on them.
-                It will be described below. Callback can de defined in model scala class directly or via references.
-                Look at the chapter <a href="intent-matching.html">Intent Matching</a> content for get more details.
-            </li>
-        </ul>
-
-        <p>
-            As example, let's prepare the system which can call persons from your contact list.
-            Typical commands are: "<b>Please call to John Smith</b>" or "<b>Connect me with Barbara Dillan</b>".
-            For solving this task this model should be able to recognize in user text following entities:
-            <code>command</code> and <code>person</code> to apply this command.
-        </p>
-
-        <p>
-            So, when request "<b>Please call to John Smith</b>" received, our model should be able to:
-        </p>
-
-        <ul>
-            <li>
-                Parse tokens splitting user text input:
-                "<code>please</code>", "<code>call</code>", "<code>to</code>", "<code>john</code>", "<code>smith</code>".
-            </li>
-            <li>
-                Find two named entities:
-                <ul>
-                    <li>
-                        <code>command</code> by token "<code>call</code>".
-                    </li>
-                    <li>
-                        <code>person</code> by tokens "<code>john</code>" and "<code>smith</code>".
-                    </li>
-                </ul>
-            </li>
-            <li>
-                Have prepared intent:
-                <pre class="brush: scala, highlight: [1, 2, 5, 6]">
-                    @NCIntent("intent=call term(command)={# == 'command'} term(person)={# == 'person'}")
-                    def onCommand(
-                        ctx: NCContext,
-                        im: NCIntentMatch,
-                        @NCIntentTerm("command") command: NCEntity,
-                        @NCIntentTerm("person") person: NCEntity
-                    ): NCResult = ? // Implement business logic here.
-                </pre>
-
-                <ul>
-                    <li>
-                        <code>Line 1</code> defines intent <code>call</code> with two conditions
-                        which expects two named entities in user input text.
-                    </li>
-                    <li>
-                        <code>Line 2</code> defines related callback method <code>onCommand()</code>.
-                    </li>
-                    <li>
-                        <code>Lines 4 and 5</code> define two callback method's arguments which are corresponded to
-                        <code>call</code> intent terms conditions. You can extract normalized value
-                        <code>john smith</code> from the <code>person</code> parameter and use it in the method body
-                        for getting his phone number etc.
-                    </li>
-                </ul>
-            </li>
-        </ul>
-    </section>
-
-    <section id="model-configuration">
-        <h2 class="section-title">Model Configuration<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
-
-        <p>
-            <code>Data Model</code> configuration represented as
-            {% scaladoc NCModelConfig NCModelConfig %}
-            contains set of parameters which are described below.
-        </p>
-        <table class="gradient-table">
-            <thead>
-            <tr>
-                <th>Name</th>
-                <th>Description</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr>
-                <td><code>id</code>, <code>name</code> and <code>version</code></td>
-                <td>
-                    Mandatory model properties.
-                </td>
-            </tr>
-            <tr>
-                <td><code>description</code>, <code>origin</code></td>
-                <td>
-                    Optional model properties.
-                </td>
-            </tr>
-            <tr>
-                <td><code>conversationTimeout</code></td>
-                <td>
-                    Timeout of the user's conversation.
-                    If user doesn't communicate with the model this time period STM is going to be cleared.
-                    Loot at <a href="short-term-memory.html">Conversation</a> chapter to get more details.
-                    It is the mandatory parameter with default value.
-                </td>
-            </tr>
-            <tr>
-                <td><code>conversationDepth</code></td>
-                <td>
-                    Maximum supported depth the user's conversation.
-                    Loot at <a href="short-term-memory.html">Conversation</a> chapter to get more details.
-                    It is the mandatory parameter with default value.
-                </td>
-            </tr>
-            </tbody>
-        </table>
-    </section>
-
-    <section id="model-pipeline">
-        <h2 class="section-title">Model Pipeline<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
-
-        <p>
-            Model <code>Pipeline</code> is represented as {% scaladoc NCPipeline NCPipeline %} and
-            contains following components:
-        </p>
-
-        <table class="gradient-table">
-            <thead>
-            <tr>
-                <th>Component</th>
-                <th>Mandatory</th>
-                <th>Description</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr>
-                <td>{% scaladoc NCTokenParser NCTokenParser %}</td>
-                <td>Mandatory single</td>
-                <td>
-                    <code>Token parser</code> should be able to parse user input plain text and split this text
-                    into <code>tokens</code> list.
-                    NLPCraft provides two default English language implementations of token parser.
-                    Also, project contains examples for <a href="examples/light_switch_fr.html">French</a> and
-                    <a href="examples/light_switch_ru.html">Russia</a> languages token parser implementations.
-                </td>
-            </tr>
-            <tr>
-                <td> {% scaladoc NCTokenEnricher NCTokenEnricher %}</td>
-                <td>Optional list</td>
-                <td>
-                    <code>Tokens enricher</code> is a component which allow to add additional properties for prepared tokens,
-                    like part of speech, quote, stop-words flags or any other.
-                    NLPCraft provides built-in English language set of token enrichers implementations.
-                    Here is an <a href="custom-components.html#token-enrichers">example</a>.
-                </td>
-            </tr>
-            <tr>
-                <td> {% scaladoc NCTokenValidator NCTokenValidator %}</td>
-                <td>Optional list</td>
-                <td>
-                    <code>Token validator</code> is a component which allow to inspect prepared tokens and
-                    throw an exception to break user input processing.
-                    Here is an <a href="custom-components.html#token-validators">example</a>.
-                </td>
-            </tr>
-            <tr>
-                <td> {% scaladoc NCEntityParser NCEntityParser %}</td>
-                <td>Mandatory list</td>
-                <td>
-                    <code>Entity parser</code> is a component which allow to find user defined named entities
-                    based on prepared tokens as input.
-                    NLPCraft provides wrappers for named-entity recognition components of
-                    <a href="https://opennlp.apache.org/">Apache OpenNLP</a> and
-                    <a href="https://nlp.stanford.edu/">Stanford NLP</a> and its own implementations.
-                    Note that at least one entity parser must be defined.
-                    Here is an <a href="custom-components.html#entity-parsers">example</a>.
-                </td>
-            </tr>
-            <tr>
-                <td> {% scaladoc NCEntityEnricher NCEntityEnricher %}</td>
-                <td>Optional list</td>
-                <td>
-                    <code>Entity enricher</code> is component which allows to add additional properties for prepared entities.
-                    Can be useful for extending existing entity enrichers functionality.
-                    Here is an <a href="custom-components.html#entity-enrichers">example</a>.
-                </td>
-            </tr>
-            <tr>
-                <td> {% scaladoc NCEntityMapper NCEntityMapper %}</td>
-                <td>Optional list</td>
-                <td>
-                    <code>Entity mappers</code> is component which allows to map one set of entities to another after the entities
-                    were parsed and enriched. Can be useful for building complex parsers based on existing.
-                    Here is an <a href="custom-components.html#entity-mappers">example</a>.
-                </td>
-            </tr>
-            <tr>
-                <td> {% scaladoc NCEntityValidator NCEntityValidator %}</td>
-                <td>Optional list</td>
-                <td>
-                    <code>Entity validator</code> is a component which allow to inspect prepared entities and
-                    throw an exception to break user input processing.
-                    Here is an <a href="custom-components.html#entity-validators">example</a>.
-                </td>
-            </tr>
-            <tr>
-                <td> {% scaladoc NCVariantFilter NCVariantFilter %}</td>
-                <td>Optional single</td>
-                <td>
-                    <code>Variant filter</code> is a component which allows filtering detected variants and
-                    rejecting undesirable.
-                    Here is an <a href="custom-components.html#variant-filters">example</a>.
-                </td>
-            </tr>
-            </tbody>
-        </table>
-
-        <figure>
-            <img alt="pipeline" class="img-fluid" src="/images/pipeline.png">
-            <figcaption><b>Fig 2.</b> Pipeline</figcaption>
-        </figure>
-
-        <p>
-            Below {% scaladoc NCModel NCModel %} creation example.
-            {% scaladoc NCPipeline NCPipeline %} is prepared using
-            {% scaladoc NCPipelineBuilder NCPipelineBuilder %} class helper.
-        </p>
-
-        <pre class="brush: scala, highlight: []">
-            val pipeline =
-                new NCPipelineBuilder().
-                    withTokenParser(new NCFrTokenParser()).
-                    withTokenEnricher(new NCFrLemmaPosTokenEnricher()).
-                    withTokenEnricher(new NCFrStopWordsTokenEnricher()).
-                    withEntityParser(new NCFrSemanticEntityParser("lightswitch_model_fr.yaml")).
-                    build
-            val cfg = NCModelConfig("nlpcraft.lightswitch.fr.ex", "LightSwitch Example Model FR", "1.0")
-
-            val mdl = new NCModel(cfg, pipeline):
-                // Add your callbacks definition or references on them here.
-        </pre>
-
-        <p>
-            This flexible system allows to create any pipelines on any language.
-            You can collect NLPCraft predefined components, write your own and easy reuse custom components.
-        </p>
-    </section>
-
-    <section id="model-behavior">
-        <h2 class="section-title">Model Behavior Overriding<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
-
-        <p>
-            There are also several {% scaladoc NCModel NCModel %}
-            callbacks that you can override to affect model behavior during
-            <a href="/intent-matching.html#model_callbacks">intent matching</a>
-            to perform logging, debugging, statistic or usage collection, explicit update or initialization of
-            conversation context, security audit or validation:
-        </p>
-        <table class="gradient-table">
-            <thead>
-            <tr>
-                <th>Method</th>
-                <th>Description</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr>
-                <td>{% scaladoc NCModel#onContext-38d onContext() %}</td>
-                <td>
-                    Overriding this method allows to prepare result before intent matching.
-                </td>
-            </tr>
-            <tr>
-                <td>{% scaladoc NCModel#onMatchedIntent-946 onMatchedIntent() %}</td>
-                <td>
-                    Overriding this method allows to reject matched intent and continue matching process.
-                </td>
-            </tr>
-            <tr>
-                <td>{% scaladoc NCModel#onResult-fffffaf3 onResult() %}</td>
-                <td>
-                    Overriding this method allows to replace callback method execution result.
-                </td>
-            </tr>
-            <tr>
-                <td>{% scaladoc NCModel#onRejection-4fa onRejection() %}</td>
-                <td>
-                    Overriding this method allows to change operation result when rejection occurs.
-                </td>
-            </tr>
-            <tr>
-                <td>{% scaladoc NCModel#onError-fffff759 onError() %}</td>
-                <td>
-                    Overriding this method allows to change operation result when any error occurs.
-                </td>
-            </tr>
-            </tbody>
-        </table>
-    </section>
-
-    <section id="client">
-        <h2 class="section-title">Client Responsibility<a href="#"><i class="top-link fas fa-fw fa-angle-double-up"></i></a></h2>
-
-        <p>
-            <code>Client</code>  represented as {% scaladoc NCModelClient NCModelClient %}
-            is necessary for communication with the <code>Data Model</code>. Base client methods  are described below.
-        </p>
-
-        <table class="gradient-table">
-            <thead>
-            <tr>
-                <th>Method</th>
-                <th>Description</th>
-            </tr>
-            </thead>
-            <tbody>
-            <tr>
-                <td>{% scaladoc NCModelClient#ask-fffff9ce ask() %}</td>
-                <td>
-                    Passes user text input to the model and receives back execution
-                    {% scaladoc NCResult NCResult %} or
-                    rejection exception if there isn't any triggered intents.
-                    {% scaladoc NCResult NCResult %} is wrapper on
-                    callback method execution result with additional information.
-                </td>
-            </tr>
-            <tr>
-                <td>{% scaladoc NCModelClient#debugAsk-fffff96c debugAsk() %}</td>
-                <td>
-                    Passes user text input to the model and receives back callback and its parameters or
-                    rejection exception if there isn't any triggered intents.
-                    Main difference from <code>ask</code> that triggered intent callback method is not called.
-                    This method and this parameter can be useful in tests scenarios.
-                </td>
-            </tr>
-            <tr>
-                <td>{% scaladoc NCModelClient#clearStm-571 clearStm() %}</td>
-                <td>
-                    Clears STM state. Memory is cleared wholly or with some predicate.
-                    Loot at <a href="short-term-memory.html">Conversation</a> chapter to get more details.
-                    Second variant of given method with another parameters is here - {% scaladoc NCModelClient#clearStm-1d8 clearStm() %}.
-                </td>
-            </tr>
-            <tr>
-                <td>{% scaladoc NCModelClient#clearDialog-571 clearDialog() %}</td>
-                <td>
-                    Clears dialog state. Dialog is cleared wholly or with some predicate.
-                    Loot at <a href="short-term-memory.html">Conversation</a> chapter to get more details.
-                    Second variant of given method with another parameters is here - {% scaladoc NCModelClient#clearDialog-1d8 clearDialog() %}.
-                </td>
-            </tr>
-            <tr>
-                <td>{% scaladoc NCModelClient#close-94c close() %}</td>
-                <td>
-                    Closes client. You can't call another client's methods after this method was closed.
-                </td>
-            </tr>
-            </tbody>
-        </table>
     </section>
 </div>
 <div class="col-md-2 third-column">
     <ul class="side-nav">
         <li class="side-nav-title">On This Page</li>
         <li><a href="#overview">Key Concepts</a></li>
-        <li><a href="#terminology">Terminology</a></li>
-<!--         <li><a href="#model-configuration">Model Configuration</a></li> -->
-<!--         <li><a href="#model-pipeline">Model Pipeline</a></li> -->
-<!--         <li><a href="#model-behavior">Model Behavior Overriding</a></li> -->
-<!--         <li><a href="#client">Client Responsibility</a></li> -->
+        <li><a href="#terminology">Main Types</a></li>
         {% include quick-links.html %}
     </ul>
 </div>