You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by se...@apache.org on 2021/04/22 15:16:51 UTC

[incubator-nlpcraft] branch NLPCRAFT-91-MODULES updated: WIP.

This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a commit to branch NLPCRAFT-91-MODULES
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


The following commit(s) were added to refs/heads/NLPCRAFT-91-MODULES by this push:
     new fc5979e  WIP.
fc5979e is described below

commit fc5979e42dd5f37ca8f75e69d5f1e5b841494490
Author: Sergey Kamov <sk...@gmail.com>
AuthorDate: Thu Apr 22 18:16:34 2021 +0300

    WIP.
---
 nlpcraft-examples/alarm/pom.xml                    |   4 +-
 nlpcraft-examples/{alarm => echo}/pom.xml          |   4 +-
 .../echo/src/main/resources}/README.md             |   0
 .../echo/src/main/resources/nlpcraft.conf          | 148 +++++++++++++++++++++
 nlpcraft-examples/{alarm => helloworld}/pom.xml    |   4 +-
 .../examples/helloworld/HelloWorldModel.java       |   0
 .../helloworld/src/main/resources}/README.md       |   0
 .../helloworld/src/main/resources/nlpcraft.conf    | 148 +++++++++++++++++++++
 nlpcraft-examples/{alarm => lightswitch}/pom.xml   |   4 +-
 .../lightswitch/LightSwitchGroovyModel.groovy      |   0
 .../examples/lightswitch/LightSwitchJavaModel.java |   0
 .../examples/lightswitch/LightSwitchKotlinModel.kt |   0
 .../examples/lightswitch/LightSwitchModel.scala    |   0
 .../lightswitch/src/main/resources}/README.md      |   0
 .../src/main/resources}/lightswitch_model.yaml     |   0
 .../lightswitch/src/main/resources/nlpcraft.conf   | 148 +++++++++++++++++++++
 nlpcraft-examples/{alarm => phone}/pom.xml         |   4 +-
 .../apache/nlpcraft/examples/phone/PhoneModel.java |   2 +-
 .../phone/src/main/resources}/README.md            |   0
 .../phone/src/main/resources/nlpcraft.conf         | 148 +++++++++++++++++++++
 .../phone/src/main/resources}/phone_model.json     |   0
 nlpcraft-examples/{alarm => sql}/pom.xml           |  19 ++-
 .../apache/nlpcraft/examples/sql/SqlModel.scala    |   0
 .../nlpcraft/examples/sql/db/SqlAccess.scala       |   0
 .../apache/nlpcraft/examples/sql/db/SqlBeans.scala |   0
 .../nlpcraft/examples/sql/db/SqlBuilder.scala      |   0
 .../nlpcraft/examples/sql/db/SqlServer.scala       |   0
 .../nlpcraft/examples/sql/db/SqlValueLoader.scala  |   0
 .../org/apache/nlpcraft/examples/sql/db/model.png  | Bin
 .../apache/nlpcraft/examples/sql/db/northwind.sql  |   0
 .../sql/src/main/resources}/README.md              |   0
 .../sql/src/main/resources/nlpcraft.conf           | 148 +++++++++++++++++++++
 .../sql/src/main/resources}/sql_model.yaml         |   0
 .../sql/src/main/resources}/sql_model_init.yaml    |   0
 .../nlpcraft/examples/sql/NCSqlExampleSpec.scala   |   2 +-
 .../nlpcraft/examples/sql/NCSqlGeneratorSpec.scala |   0
 nlpcraft-examples/{alarm => time}/pom.xml          |  19 ++-
 .../apache/nlpcraft/examples/time/TimeModel.java   |   0
 .../nlpcraft/examples/time/TimeModelApp.java       |   0
 .../time/src/main/resources}/README.md             |   0
 .../time/src/main/resources/nlpcraft.conf          | 148 +++++++++++++++++++++
 .../time/src/main/resources}/time_model.yaml       |   0
 .../nlpcraft/examples/time/NCTimeModelSpec.scala   |   2 +-
 nlpcraft-examples/{alarm => weather}/pom.xml       |   4 +-
 .../nlpcraft/examples/weather/WeatherModel.java    |   0
 .../weather/src/main/resources}/README.md          |   0
 .../weather/src/main/resources/nlpcraft.conf       | 148 +++++++++++++++++++++
 .../weather/src/main/resources}/weather_model.json |   0
 .../nlpcraft/server/rest/NCRestAskSpec.scala       |   4 +-
 .../nlpcraft/server/rest/NCRestClearSpec.scala     |   3 +-
 .../nlpcraft/server/rest/NCRestModelSpec.scala     |  62 +++++----
 .../nlpcraft/server/rest/NCRestProbeSpec.scala     |   3 +-
 .../{NCRestProbeSpec.scala => RestTestModel.scala} |  16 +--
 pom.xml                                            |   7 +
 54 files changed, 1129 insertions(+), 70 deletions(-)

diff --git a/nlpcraft-examples/alarm/pom.xml b/nlpcraft-examples/alarm/pom.xml
index 7dc4a15..3a82fd4 100644
--- a/nlpcraft-examples/alarm/pom.xml
+++ b/nlpcraft-examples/alarm/pom.xml
@@ -21,8 +21,8 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <name>NLPCraft example - Alarm</name>
-    <artifactId>nlpcraft-example-alarm</artifactId>
+    <name>NLPCraft example Alarm</name>
+    <artifactId>alarm</artifactId>
 
     <parent>
         <artifactId>nlpcraft-parent</artifactId>
diff --git a/nlpcraft-examples/alarm/pom.xml b/nlpcraft-examples/echo/pom.xml
similarity index 94%
copy from nlpcraft-examples/alarm/pom.xml
copy to nlpcraft-examples/echo/pom.xml
index 7dc4a15..bcd846d 100644
--- a/nlpcraft-examples/alarm/pom.xml
+++ b/nlpcraft-examples/echo/pom.xml
@@ -21,8 +21,8 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <name>NLPCraft example - Alarm</name>
-    <artifactId>nlpcraft-example-alarm</artifactId>
+    <name>NLPCraft example Echo</name>
+    <artifactId>echo</artifactId>
 
     <parent>
         <artifactId>nlpcraft-parent</artifactId>
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/echo/README.md b/nlpcraft-examples/echo/src/main/resources/README.md
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/echo/README.md
rename to nlpcraft-examples/echo/src/main/resources/README.md
diff --git a/nlpcraft-examples/echo/src/main/resources/nlpcraft.conf b/nlpcraft-examples/echo/src/main/resources/nlpcraft.conf
new file mode 100644
index 0000000..128880a
--- /dev/null
+++ b/nlpcraft-examples/echo/src/main/resources/nlpcraft.conf
@@ -0,0 +1,148 @@
+#
+# 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.
+#
+
+#
+# This is joint configuration file for both the server and the data probes. Note that
+# server and probe configuration can be placed into separate files - each file containing only
+# 'nlpcraft.server' or 'nlpcraft.probe' sub-sections.
+#
+# You can also provide configuration properties or override the default ones via environment variables.
+# To use environment variables override:
+# 1. Set probe or server JVM system property -Dconfig.override_with_env_vars=true
+# 2. For each configuration 'x.y.z' set the environment variable CONFIG_FORCE_x_y_z=some_value
+#
+# Examples of environment variables:
+#   -- Overrides 'nlpcraft.sever.host' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_rest_host="localhost"
+#
+#   -- Overrides 'nlpcraft.sever.models' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_models="com.models.MyModel"
+#
+# See https://nlpcraft.apache.org/server-and-probe.html for more details.
+#
+
+# Common server/probe configuration root.
+nlpcraft {
+    # Basic NLP toolkit to use on both server and probes. Possible values:
+    # - 'opennlp'
+    # - 'stanford'
+    #
+    # NOTE: Stanford CoreNLP requires special installation due to its licensing.
+    # See https://nlpcraft.apache.org/integrations.html#stanford for more details.
+    nlpEngine = "opennlp"
+
+    # External configuration resources.
+    #
+    # NOTE:
+    # ----
+    # Due to licensing restrictions of the official ASF release policy some of the
+    # configuration for NLPCraft cannot be shipped with the official Apache release.
+    # Instead, NLPCraft will attempt to download these configuration files from the
+    # external URL upon the first start.
+    #
+    # NLPCraft will attempt to download the missing configuration files from URL defined
+    # in 'nlpcraft.extConfig.extUrl' property and place them into 'nlpcraft.extConfig.locDir'
+    # folder on the local file system. On subsequent starts, NLPCraft will check if the required
+    # file is already present locally and skip the download in such case. If 'nlpcraft.extConfig.checkMd5'
+    # property is set to 'true' then on each start NLPCraft will check the checksum of each file
+    # locally and remote and will re-download such file if the MD5 checksums don't match.
+    #
+    # By default, the external configuration is stored in the main Git repository for NLPCraft
+    # project from where it will be downloaded ('/external' folder). See this folder in the Git
+    # repository for more information: https://github.com/apache/incubator-nlpcraft/tree/master/external
+    extConfig {
+        # Mandatory.
+        extUrl = "https://github.com/apache/incubator-nlpcraft/raw/master/external"
+
+        # Optional.
+        # Default value is $USER_HOME/.nlpcraft/extcfg
+        # locDir = ...
+
+        # If 'true', on each start NLPCraft will check the MD5 checksum of the each local and remote
+        # external configuration file and will re-download such file if the checksum doesn't match.
+        # Set it to 'false' to speed up the bootstrap of the NLPCraft server and the data probe if you
+        # are certain that all external configuration files are properly downloaded and available
+        # in 'nlpcraft.extConfig.locDir' local folder.
+        checkMd5 = true
+    }
+
+    # +---------------------+
+    # | Probe configuration. |
+    # +---------------------+
+    probe {
+        # Any arbitrary descriptive name.
+        id = "echo"
+
+        # This is the default token (as in default company).
+        # Note that this token must match the probe token for the company this probe
+        # associated with. If changed from default, this token must be kept secure.
+        token = "3141592653589793"
+
+        # These are default up-link and down-link endpoints that the probe will connect to.
+        # If changed - they need to be changed on both server and probe.
+        upLink = "0.0.0.0:8201"   # Server to probe data pipe.
+        downLink = "0.0.0.0:8202" # Probe to server data pipe.
+
+        # All JARs in this folder will be scanned for models.
+        # Safely ignored if 'null' - but then 'models' should have at least one element.
+        jarsFolder = null
+
+        # Specifies fully qualifies model class names for the probe to start with.
+        #
+        # Note that following models require 'google' on the server side.
+        # See https://nlpcraft.apache.org/integrations.html#nlp for more details
+        # on how to configure 3rd party token providers:
+        models = org.apache.nlpcraft.examples.echo.EchoModel
+
+        # Specify class names for probe life cycle components.
+        # Each class should extend 'NCProbeLifecycle' interface and provide a no-arg constructor.
+        #
+        # The following built-in OpenCensus exporters are supported as lifecycle components:
+        # - org.apache.nlpcraft.model.opencensus.NCJaegerExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCZipkinExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCPrometheusExporter (stats)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverTraceExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverStatsExporter (stats)
+        lifecycle = ""
+
+        # Properties for built-in OpenCensus exporters.
+        # All configuration properties are optional unless otherwise specified.
+        # opencensus {
+        #     jaeger {
+        #         thriftUrl = "http://127.0.0.1:14268/api/traces"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        #     prometheus {
+        #         hostPort = "localhost:8889"
+        #         namespace = "nlpcraft-probe"
+        #     }
+        #     stackdriver {
+        #         # Mandatory Google project ID.
+        #         googleProjectId = "your_google_project_id"
+        #         metricsPrefix = "custom.googleapis.com/nlpcraft/probe"
+        #     }
+        #     zipkin {
+        #         v2Url = "http://127.0.0.1:9411/api/v2/spans"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        # }
+
+        # Maximum execution result size in bytes. Default value is 1M.
+        # When exceeded the request will be automatically rejected.
+        resultMaxSizeBytes = 1048576
+    }
+}
diff --git a/nlpcraft-examples/alarm/pom.xml b/nlpcraft-examples/helloworld/pom.xml
similarity index 94%
copy from nlpcraft-examples/alarm/pom.xml
copy to nlpcraft-examples/helloworld/pom.xml
index 7dc4a15..9fbdc4b 100644
--- a/nlpcraft-examples/alarm/pom.xml
+++ b/nlpcraft-examples/helloworld/pom.xml
@@ -21,8 +21,8 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <name>NLPCraft example - Alarm</name>
-    <artifactId>nlpcraft-example-alarm</artifactId>
+    <name>NLPCraft example Hello World</name>
+    <artifactId>helloworld</artifactId>
 
     <parent>
         <artifactId>nlpcraft-parent</artifactId>
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/helloworld/HelloWorldModel.java b/nlpcraft-examples/helloworld/src/main/java/org/apache/nlpcraft/examples/helloworld/HelloWorldModel.java
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/helloworld/HelloWorldModel.java
rename to nlpcraft-examples/helloworld/src/main/java/org/apache/nlpcraft/examples/helloworld/HelloWorldModel.java
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/helloworld/README.md b/nlpcraft-examples/helloworld/src/main/resources/README.md
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/helloworld/README.md
rename to nlpcraft-examples/helloworld/src/main/resources/README.md
diff --git a/nlpcraft-examples/helloworld/src/main/resources/nlpcraft.conf b/nlpcraft-examples/helloworld/src/main/resources/nlpcraft.conf
new file mode 100644
index 0000000..f4430b0
--- /dev/null
+++ b/nlpcraft-examples/helloworld/src/main/resources/nlpcraft.conf
@@ -0,0 +1,148 @@
+#
+# 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.
+#
+
+#
+# This is joint configuration file for both the server and the data probes. Note that
+# server and probe configuration can be placed into separate files - each file containing only
+# 'nlpcraft.server' or 'nlpcraft.probe' sub-sections.
+#
+# You can also provide configuration properties or override the default ones via environment variables.
+# To use environment variables override:
+# 1. Set probe or server JVM system property -Dconfig.override_with_env_vars=true
+# 2. For each configuration 'x.y.z' set the environment variable CONFIG_FORCE_x_y_z=some_value
+#
+# Examples of environment variables:
+#   -- Overrides 'nlpcraft.sever.host' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_rest_host="localhost"
+#
+#   -- Overrides 'nlpcraft.sever.models' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_models="com.models.MyModel"
+#
+# See https://nlpcraft.apache.org/server-and-probe.html for more details.
+#
+
+# Common server/probe configuration root.
+nlpcraft {
+    # Basic NLP toolkit to use on both server and probes. Possible values:
+    # - 'opennlp'
+    # - 'stanford'
+    #
+    # NOTE: Stanford CoreNLP requires special installation due to its licensing.
+    # See https://nlpcraft.apache.org/integrations.html#stanford for more details.
+    nlpEngine = "opennlp"
+
+    # External configuration resources.
+    #
+    # NOTE:
+    # ----
+    # Due to licensing restrictions of the official ASF release policy some of the
+    # configuration for NLPCraft cannot be shipped with the official Apache release.
+    # Instead, NLPCraft will attempt to download these configuration files from the
+    # external URL upon the first start.
+    #
+    # NLPCraft will attempt to download the missing configuration files from URL defined
+    # in 'nlpcraft.extConfig.extUrl' property and place them into 'nlpcraft.extConfig.locDir'
+    # folder on the local file system. On subsequent starts, NLPCraft will check if the required
+    # file is already present locally and skip the download in such case. If 'nlpcraft.extConfig.checkMd5'
+    # property is set to 'true' then on each start NLPCraft will check the checksum of each file
+    # locally and remote and will re-download such file if the MD5 checksums don't match.
+    #
+    # By default, the external configuration is stored in the main Git repository for NLPCraft
+    # project from where it will be downloaded ('/external' folder). See this folder in the Git
+    # repository for more information: https://github.com/apache/incubator-nlpcraft/tree/master/external
+    extConfig {
+        # Mandatory.
+        extUrl = "https://github.com/apache/incubator-nlpcraft/raw/master/external"
+
+        # Optional.
+        # Default value is $USER_HOME/.nlpcraft/extcfg
+        # locDir = ...
+
+        # If 'true', on each start NLPCraft will check the MD5 checksum of the each local and remote
+        # external configuration file and will re-download such file if the checksum doesn't match.
+        # Set it to 'false' to speed up the bootstrap of the NLPCraft server and the data probe if you
+        # are certain that all external configuration files are properly downloaded and available
+        # in 'nlpcraft.extConfig.locDir' local folder.
+        checkMd5 = true
+    }
+
+    # +---------------------+
+    # | Probe configuration. |
+    # +---------------------+
+    probe {
+        # Any arbitrary descriptive name.
+        id = "helloworld"
+
+        # This is the default token (as in default company).
+        # Note that this token must match the probe token for the company this probe
+        # associated with. If changed from default, this token must be kept secure.
+        token = "3141592653589793"
+
+        # These are default up-link and down-link endpoints that the probe will connect to.
+        # If changed - they need to be changed on both server and probe.
+        upLink = "0.0.0.0:8201"   # Server to probe data pipe.
+        downLink = "0.0.0.0:8202" # Probe to server data pipe.
+
+        # All JARs in this folder will be scanned for models.
+        # Safely ignored if 'null' - but then 'models' should have at least one element.
+        jarsFolder = null
+
+        # Specifies fully qualifies model class names for the probe to start with.
+        #
+        # Note that following models require 'google' on the server side.
+        # See https://nlpcraft.apache.org/integrations.html#nlp for more details
+        # on how to configure 3rd party token providers:
+        models = org.apache.nlpcraft.examples.helloworld.HelloWorldModel
+
+        # Specify class names for probe life cycle components.
+        # Each class should extend 'NCProbeLifecycle' interface and provide a no-arg constructor.
+        #
+        # The following built-in OpenCensus exporters are supported as lifecycle components:
+        # - org.apache.nlpcraft.model.opencensus.NCJaegerExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCZipkinExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCPrometheusExporter (stats)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverTraceExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverStatsExporter (stats)
+        lifecycle = ""
+
+        # Properties for built-in OpenCensus exporters.
+        # All configuration properties are optional unless otherwise specified.
+        # opencensus {
+        #     jaeger {
+        #         thriftUrl = "http://127.0.0.1:14268/api/traces"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        #     prometheus {
+        #         hostPort = "localhost:8889"
+        #         namespace = "nlpcraft-probe"
+        #     }
+        #     stackdriver {
+        #         # Mandatory Google project ID.
+        #         googleProjectId = "your_google_project_id"
+        #         metricsPrefix = "custom.googleapis.com/nlpcraft/probe"
+        #     }
+        #     zipkin {
+        #         v2Url = "http://127.0.0.1:9411/api/v2/spans"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        # }
+
+        # Maximum execution result size in bytes. Default value is 1M.
+        # When exceeded the request will be automatically rejected.
+        resultMaxSizeBytes = 1048576
+    }
+}
diff --git a/nlpcraft-examples/alarm/pom.xml b/nlpcraft-examples/lightswitch/pom.xml
similarity index 94%
copy from nlpcraft-examples/alarm/pom.xml
copy to nlpcraft-examples/lightswitch/pom.xml
index 7dc4a15..63379d3 100644
--- a/nlpcraft-examples/alarm/pom.xml
+++ b/nlpcraft-examples/lightswitch/pom.xml
@@ -21,8 +21,8 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <name>NLPCraft example - Alarm</name>
-    <artifactId>nlpcraft-example-alarm</artifactId>
+    <name>NLPCraft example Light Switch</name>
+    <artifactId>lightswitch</artifactId>
 
     <parent>
         <artifactId>nlpcraft-parent</artifactId>
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchGroovyModel.groovy b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchGroovyModel.groovy
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchGroovyModel.groovy
rename to nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchGroovyModel.groovy
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchJavaModel.java b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchJavaModel.java
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchJavaModel.java
rename to nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchJavaModel.java
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchKotlinModel.kt b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchKotlinModel.kt
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchKotlinModel.kt
rename to nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchKotlinModel.kt
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchModel.scala b/nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchModel.scala
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchModel.scala
rename to nlpcraft-examples/lightswitch/src/main/java/org/apache/nlpcraft/examples/lightswitch/LightSwitchModel.scala
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/README.md b/nlpcraft-examples/lightswitch/src/main/resources/README.md
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/README.md
rename to nlpcraft-examples/lightswitch/src/main/resources/README.md
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml b/nlpcraft-examples/lightswitch/src/main/resources/lightswitch_model.yaml
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/lightswitch/lightswitch_model.yaml
rename to nlpcraft-examples/lightswitch/src/main/resources/lightswitch_model.yaml
diff --git a/nlpcraft-examples/lightswitch/src/main/resources/nlpcraft.conf b/nlpcraft-examples/lightswitch/src/main/resources/nlpcraft.conf
new file mode 100644
index 0000000..f43a4dd
--- /dev/null
+++ b/nlpcraft-examples/lightswitch/src/main/resources/nlpcraft.conf
@@ -0,0 +1,148 @@
+#
+# 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.
+#
+
+#
+# This is joint configuration file for both the server and the data probes. Note that
+# server and probe configuration can be placed into separate files - each file containing only
+# 'nlpcraft.server' or 'nlpcraft.probe' sub-sections.
+#
+# You can also provide configuration properties or override the default ones via environment variables.
+# To use environment variables override:
+# 1. Set probe or server JVM system property -Dconfig.override_with_env_vars=true
+# 2. For each configuration 'x.y.z' set the environment variable CONFIG_FORCE_x_y_z=some_value
+#
+# Examples of environment variables:
+#   -- Overrides 'nlpcraft.sever.host' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_rest_host="localhost"
+#
+#   -- Overrides 'nlpcraft.sever.models' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_models="com.models.MyModel"
+#
+# See https://nlpcraft.apache.org/server-and-probe.html for more details.
+#
+
+# Common server/probe configuration root.
+nlpcraft {
+    # Basic NLP toolkit to use on both server and probes. Possible values:
+    # - 'opennlp'
+    # - 'stanford'
+    #
+    # NOTE: Stanford CoreNLP requires special installation due to its licensing.
+    # See https://nlpcraft.apache.org/integrations.html#stanford for more details.
+    nlpEngine = "opennlp"
+
+    # External configuration resources.
+    #
+    # NOTE:
+    # ----
+    # Due to licensing restrictions of the official ASF release policy some of the
+    # configuration for NLPCraft cannot be shipped with the official Apache release.
+    # Instead, NLPCraft will attempt to download these configuration files from the
+    # external URL upon the first start.
+    #
+    # NLPCraft will attempt to download the missing configuration files from URL defined
+    # in 'nlpcraft.extConfig.extUrl' property and place them into 'nlpcraft.extConfig.locDir'
+    # folder on the local file system. On subsequent starts, NLPCraft will check if the required
+    # file is already present locally and skip the download in such case. If 'nlpcraft.extConfig.checkMd5'
+    # property is set to 'true' then on each start NLPCraft will check the checksum of each file
+    # locally and remote and will re-download such file if the MD5 checksums don't match.
+    #
+    # By default, the external configuration is stored in the main Git repository for NLPCraft
+    # project from where it will be downloaded ('/external' folder). See this folder in the Git
+    # repository for more information: https://github.com/apache/incubator-nlpcraft/tree/master/external
+    extConfig {
+        # Mandatory.
+        extUrl = "https://github.com/apache/incubator-nlpcraft/raw/master/external"
+
+        # Optional.
+        # Default value is $USER_HOME/.nlpcraft/extcfg
+        # locDir = ...
+
+        # If 'true', on each start NLPCraft will check the MD5 checksum of the each local and remote
+        # external configuration file and will re-download such file if the checksum doesn't match.
+        # Set it to 'false' to speed up the bootstrap of the NLPCraft server and the data probe if you
+        # are certain that all external configuration files are properly downloaded and available
+        # in 'nlpcraft.extConfig.locDir' local folder.
+        checkMd5 = true
+    }
+
+    # +---------------------+
+    # | Probe configuration. |
+    # +---------------------+
+    probe {
+        # Any arbitrary descriptive name.
+        id = "lightswitch"
+
+        # This is the default token (as in default company).
+        # Note that this token must match the probe token for the company this probe
+        # associated with. If changed from default, this token must be kept secure.
+        token = "3141592653589793"
+
+        # These are default up-link and down-link endpoints that the probe will connect to.
+        # If changed - they need to be changed on both server and probe.
+        upLink = "0.0.0.0:8201"   # Server to probe data pipe.
+        downLink = "0.0.0.0:8202" # Probe to server data pipe.
+
+        # All JARs in this folder will be scanned for models.
+        # Safely ignored if 'null' - but then 'models' should have at least one element.
+        jarsFolder = null
+
+        # Specifies fully qualifies model class names for the probe to start with.
+        #
+        # Note that following models require 'google' on the server side.
+        # See https://nlpcraft.apache.org/integrations.html#nlp for more details
+        # on how to configure 3rd party token providers:
+        models = org.apache.nlpcraft.examples.lightswitch.LightSwitchKotlinModel
+
+        # Specify class names for probe life cycle components.
+        # Each class should extend 'NCProbeLifecycle' interface and provide a no-arg constructor.
+        #
+        # The following built-in OpenCensus exporters are supported as lifecycle components:
+        # - org.apache.nlpcraft.model.opencensus.NCJaegerExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCZipkinExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCPrometheusExporter (stats)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverTraceExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverStatsExporter (stats)
+        lifecycle = ""
+
+        # Properties for built-in OpenCensus exporters.
+        # All configuration properties are optional unless otherwise specified.
+        # opencensus {
+        #     jaeger {
+        #         thriftUrl = "http://127.0.0.1:14268/api/traces"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        #     prometheus {
+        #         hostPort = "localhost:8889"
+        #         namespace = "nlpcraft-probe"
+        #     }
+        #     stackdriver {
+        #         # Mandatory Google project ID.
+        #         googleProjectId = "your_google_project_id"
+        #         metricsPrefix = "custom.googleapis.com/nlpcraft/probe"
+        #     }
+        #     zipkin {
+        #         v2Url = "http://127.0.0.1:9411/api/v2/spans"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        # }
+
+        # Maximum execution result size in bytes. Default value is 1M.
+        # When exceeded the request will be automatically rejected.
+        resultMaxSizeBytes = 1048576
+    }
+}
diff --git a/nlpcraft-examples/alarm/pom.xml b/nlpcraft-examples/phone/pom.xml
similarity index 94%
copy from nlpcraft-examples/alarm/pom.xml
copy to nlpcraft-examples/phone/pom.xml
index 7dc4a15..7d3dea6 100644
--- a/nlpcraft-examples/alarm/pom.xml
+++ b/nlpcraft-examples/phone/pom.xml
@@ -21,8 +21,8 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <name>NLPCraft example - Alarm</name>
-    <artifactId>nlpcraft-example-alarm</artifactId>
+    <name>NLPCraft example Phone</name>
+    <artifactId>phone</artifactId>
 
     <parent>
         <artifactId>nlpcraft-parent</artifactId>
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java b/nlpcraft-examples/phone/src/main/java/org/apache/nlpcraft/examples/phone/PhoneModel.java
similarity index 97%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
rename to nlpcraft-examples/phone/src/main/java/org/apache/nlpcraft/examples/phone/PhoneModel.java
index c083e3c..fe19f09 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
+++ b/nlpcraft-examples/phone/src/main/java/org/apache/nlpcraft/examples/phone/PhoneModel.java
@@ -38,7 +38,7 @@ public class PhoneModel extends NCModelFileAdapter {
      */
     public PhoneModel() {
         // Load model from JSON file on the classpath.
-        super("org/apache/nlpcraft/examples/phone/phone_model.json");
+        super("phone_model.json");
     }
 
     /**
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/README.md b/nlpcraft-examples/phone/src/main/resources/README.md
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/README.md
rename to nlpcraft-examples/phone/src/main/resources/README.md
diff --git a/nlpcraft-examples/phone/src/main/resources/nlpcraft.conf b/nlpcraft-examples/phone/src/main/resources/nlpcraft.conf
new file mode 100644
index 0000000..bc63ce8
--- /dev/null
+++ b/nlpcraft-examples/phone/src/main/resources/nlpcraft.conf
@@ -0,0 +1,148 @@
+#
+# 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.
+#
+
+#
+# This is joint configuration file for both the server and the data probes. Note that
+# server and probe configuration can be placed into separate files - each file containing only
+# 'nlpcraft.server' or 'nlpcraft.probe' sub-sections.
+#
+# You can also provide configuration properties or override the default ones via environment variables.
+# To use environment variables override:
+# 1. Set probe or server JVM system property -Dconfig.override_with_env_vars=true
+# 2. For each configuration 'x.y.z' set the environment variable CONFIG_FORCE_x_y_z=some_value
+#
+# Examples of environment variables:
+#   -- Overrides 'nlpcraft.sever.host' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_rest_host="localhost"
+#
+#   -- Overrides 'nlpcraft.sever.models' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_models="com.models.MyModel"
+#
+# See https://nlpcraft.apache.org/server-and-probe.html for more details.
+#
+
+# Common server/probe configuration root.
+nlpcraft {
+    # Basic NLP toolkit to use on both server and probes. Possible values:
+    # - 'opennlp'
+    # - 'stanford'
+    #
+    # NOTE: Stanford CoreNLP requires special installation due to its licensing.
+    # See https://nlpcraft.apache.org/integrations.html#stanford for more details.
+    nlpEngine = "opennlp"
+
+    # External configuration resources.
+    #
+    # NOTE:
+    # ----
+    # Due to licensing restrictions of the official ASF release policy some of the
+    # configuration for NLPCraft cannot be shipped with the official Apache release.
+    # Instead, NLPCraft will attempt to download these configuration files from the
+    # external URL upon the first start.
+    #
+    # NLPCraft will attempt to download the missing configuration files from URL defined
+    # in 'nlpcraft.extConfig.extUrl' property and place them into 'nlpcraft.extConfig.locDir'
+    # folder on the local file system. On subsequent starts, NLPCraft will check if the required
+    # file is already present locally and skip the download in such case. If 'nlpcraft.extConfig.checkMd5'
+    # property is set to 'true' then on each start NLPCraft will check the checksum of each file
+    # locally and remote and will re-download such file if the MD5 checksums don't match.
+    #
+    # By default, the external configuration is stored in the main Git repository for NLPCraft
+    # project from where it will be downloaded ('/external' folder). See this folder in the Git
+    # repository for more information: https://github.com/apache/incubator-nlpcraft/tree/master/external
+    extConfig {
+        # Mandatory.
+        extUrl = "https://github.com/apache/incubator-nlpcraft/raw/master/external"
+
+        # Optional.
+        # Default value is $USER_HOME/.nlpcraft/extcfg
+        # locDir = ...
+
+        # If 'true', on each start NLPCraft will check the MD5 checksum of the each local and remote
+        # external configuration file and will re-download such file if the checksum doesn't match.
+        # Set it to 'false' to speed up the bootstrap of the NLPCraft server and the data probe if you
+        # are certain that all external configuration files are properly downloaded and available
+        # in 'nlpcraft.extConfig.locDir' local folder.
+        checkMd5 = true
+    }
+
+    # +---------------------+
+    # | Probe configuration. |
+    # +---------------------+
+    probe {
+        # Any arbitrary descriptive name.
+        id = "phone"
+
+        # This is the default token (as in default company).
+        # Note that this token must match the probe token for the company this probe
+        # associated with. If changed from default, this token must be kept secure.
+        token = "3141592653589793"
+
+        # These are default up-link and down-link endpoints that the probe will connect to.
+        # If changed - they need to be changed on both server and probe.
+        upLink = "0.0.0.0:8201"   # Server to probe data pipe.
+        downLink = "0.0.0.0:8202" # Probe to server data pipe.
+
+        # All JARs in this folder will be scanned for models.
+        # Safely ignored if 'null' - but then 'models' should have at least one element.
+        jarsFolder = null
+
+        # Specifies fully qualifies model class names for the probe to start with.
+        #
+        # Note that following models require 'google' on the server side.
+        # See https://nlpcraft.apache.org/integrations.html#nlp for more details
+        # on how to configure 3rd party token providers:
+        models = org.apache.nlpcraft.examples.phone.PhoneModel
+
+        # Specify class names for probe life cycle components.
+        # Each class should extend 'NCProbeLifecycle' interface and provide a no-arg constructor.
+        #
+        # The following built-in OpenCensus exporters are supported as lifecycle components:
+        # - org.apache.nlpcraft.model.opencensus.NCJaegerExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCZipkinExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCPrometheusExporter (stats)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverTraceExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverStatsExporter (stats)
+        lifecycle = ""
+
+        # Properties for built-in OpenCensus exporters.
+        # All configuration properties are optional unless otherwise specified.
+        # opencensus {
+        #     jaeger {
+        #         thriftUrl = "http://127.0.0.1:14268/api/traces"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        #     prometheus {
+        #         hostPort = "localhost:8889"
+        #         namespace = "nlpcraft-probe"
+        #     }
+        #     stackdriver {
+        #         # Mandatory Google project ID.
+        #         googleProjectId = "your_google_project_id"
+        #         metricsPrefix = "custom.googleapis.com/nlpcraft/probe"
+        #     }
+        #     zipkin {
+        #         v2Url = "http://127.0.0.1:9411/api/v2/spans"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        # }
+
+        # Maximum execution result size in bytes. Default value is 1M.
+        # When exceeded the request will be automatically rejected.
+        resultMaxSizeBytes = 1048576
+    }
+}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/phone_model.json b/nlpcraft-examples/phone/src/main/resources/phone_model.json
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/phone/phone_model.json
rename to nlpcraft-examples/phone/src/main/resources/phone_model.json
diff --git a/nlpcraft-examples/alarm/pom.xml b/nlpcraft-examples/sql/pom.xml
similarity index 77%
copy from nlpcraft-examples/alarm/pom.xml
copy to nlpcraft-examples/sql/pom.xml
index 7dc4a15..f41609f 100644
--- a/nlpcraft-examples/alarm/pom.xml
+++ b/nlpcraft-examples/sql/pom.xml
@@ -21,8 +21,8 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <name>NLPCraft example - Alarm</name>
-    <artifactId>nlpcraft-example-alarm</artifactId>
+    <name>NLPCraft example SQL</name>
+    <artifactId>sql</artifactId>
 
     <parent>
         <artifactId>nlpcraft-parent</artifactId>
@@ -37,6 +37,21 @@
             <artifactId>nlpcraft</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <!-- Test dependencies. -->
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>nlpcraft</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala b/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/SqlModel.scala
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModel.scala
rename to nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/SqlModel.scala
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala b/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala
rename to nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBeans.scala b/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/SqlBeans.scala
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBeans.scala
rename to nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/SqlBeans.scala
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala b/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala
rename to nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlServer.scala b/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/SqlServer.scala
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlServer.scala
rename to nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/SqlServer.scala
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlValueLoader.scala b/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/SqlValueLoader.scala
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlValueLoader.scala
rename to nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/SqlValueLoader.scala
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/model.png b/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/model.png
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/model.png
rename to nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/model.png
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/northwind.sql b/nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/northwind.sql
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/db/northwind.sql
rename to nlpcraft-examples/sql/src/main/java/org/apache/nlpcraft/examples/sql/db/northwind.sql
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/README.md b/nlpcraft-examples/sql/src/main/resources/README.md
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/README.md
rename to nlpcraft-examples/sql/src/main/resources/README.md
diff --git a/nlpcraft-examples/sql/src/main/resources/nlpcraft.conf b/nlpcraft-examples/sql/src/main/resources/nlpcraft.conf
new file mode 100644
index 0000000..e8a71bf
--- /dev/null
+++ b/nlpcraft-examples/sql/src/main/resources/nlpcraft.conf
@@ -0,0 +1,148 @@
+#
+# 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.
+#
+
+#
+# This is joint configuration file for both the server and the data probes. Note that
+# server and probe configuration can be placed into separate files - each file containing only
+# 'nlpcraft.server' or 'nlpcraft.probe' sub-sections.
+#
+# You can also provide configuration properties or override the default ones via environment variables.
+# To use environment variables override:
+# 1. Set probe or server JVM system property -Dconfig.override_with_env_vars=true
+# 2. For each configuration 'x.y.z' set the environment variable CONFIG_FORCE_x_y_z=some_value
+#
+# Examples of environment variables:
+#   -- Overrides 'nlpcraft.sever.host' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_rest_host="localhost"
+#
+#   -- Overrides 'nlpcraft.sever.models' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_models="com.models.MyModel"
+#
+# See https://nlpcraft.apache.org/server-and-probe.html for more details.
+#
+
+# Common server/probe configuration root.
+nlpcraft {
+    # Basic NLP toolkit to use on both server and probes. Possible values:
+    # - 'opennlp'
+    # - 'stanford'
+    #
+    # NOTE: Stanford CoreNLP requires special installation due to its licensing.
+    # See https://nlpcraft.apache.org/integrations.html#stanford for more details.
+    nlpEngine = "opennlp"
+
+    # External configuration resources.
+    #
+    # NOTE:
+    # ----
+    # Due to licensing restrictions of the official ASF release policy some of the
+    # configuration for NLPCraft cannot be shipped with the official Apache release.
+    # Instead, NLPCraft will attempt to download these configuration files from the
+    # external URL upon the first start.
+    #
+    # NLPCraft will attempt to download the missing configuration files from URL defined
+    # in 'nlpcraft.extConfig.extUrl' property and place them into 'nlpcraft.extConfig.locDir'
+    # folder on the local file system. On subsequent starts, NLPCraft will check if the required
+    # file is already present locally and skip the download in such case. If 'nlpcraft.extConfig.checkMd5'
+    # property is set to 'true' then on each start NLPCraft will check the checksum of each file
+    # locally and remote and will re-download such file if the MD5 checksums don't match.
+    #
+    # By default, the external configuration is stored in the main Git repository for NLPCraft
+    # project from where it will be downloaded ('/external' folder). See this folder in the Git
+    # repository for more information: https://github.com/apache/incubator-nlpcraft/tree/master/external
+    extConfig {
+        # Mandatory.
+        extUrl = "https://github.com/apache/incubator-nlpcraft/raw/master/external"
+
+        # Optional.
+        # Default value is $USER_HOME/.nlpcraft/extcfg
+        # locDir = ...
+
+        # If 'true', on each start NLPCraft will check the MD5 checksum of the each local and remote
+        # external configuration file and will re-download such file if the checksum doesn't match.
+        # Set it to 'false' to speed up the bootstrap of the NLPCraft server and the data probe if you
+        # are certain that all external configuration files are properly downloaded and available
+        # in 'nlpcraft.extConfig.locDir' local folder.
+        checkMd5 = true
+    }
+
+    # +---------------------+
+    # | Probe configuration. |
+    # +---------------------+
+    probe {
+        # Any arbitrary descriptive name.
+        id = "sql"
+
+        # This is the default token (as in default company).
+        # Note that this token must match the probe token for the company this probe
+        # associated with. If changed from default, this token must be kept secure.
+        token = "3141592653589793"
+
+        # These are default up-link and down-link endpoints that the probe will connect to.
+        # If changed - they need to be changed on both server and probe.
+        upLink = "0.0.0.0:8201"   # Server to probe data pipe.
+        downLink = "0.0.0.0:8202" # Probe to server data pipe.
+
+        # All JARs in this folder will be scanned for models.
+        # Safely ignored if 'null' - but then 'models' should have at least one element.
+        jarsFolder = null
+
+        # Specifies fully qualifies model class names for the probe to start with.
+        #
+        # Note that following models require 'google' on the server side.
+        # See https://nlpcraft.apache.org/integrations.html#nlp for more details
+        # on how to configure 3rd party token providers:
+        models = org.apache.nlpcraft.examples.sql.SqlModel
+
+        # Specify class names for probe life cycle components.
+        # Each class should extend 'NCProbeLifecycle' interface and provide a no-arg constructor.
+        #
+        # The following built-in OpenCensus exporters are supported as lifecycle components:
+        # - org.apache.nlpcraft.model.opencensus.NCJaegerExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCZipkinExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCPrometheusExporter (stats)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverTraceExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverStatsExporter (stats)
+        lifecycle = ""
+
+        # Properties for built-in OpenCensus exporters.
+        # All configuration properties are optional unless otherwise specified.
+        # opencensus {
+        #     jaeger {
+        #         thriftUrl = "http://127.0.0.1:14268/api/traces"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        #     prometheus {
+        #         hostPort = "localhost:8889"
+        #         namespace = "nlpcraft-probe"
+        #     }
+        #     stackdriver {
+        #         # Mandatory Google project ID.
+        #         googleProjectId = "your_google_project_id"
+        #         metricsPrefix = "custom.googleapis.com/nlpcraft/probe"
+        #     }
+        #     zipkin {
+        #         v2Url = "http://127.0.0.1:9411/api/v2/spans"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        # }
+
+        # Maximum execution result size in bytes. Default value is 1M.
+        # When exceeded the request will be automatically rejected.
+        resultMaxSizeBytes = 1048576
+    }
+}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/sql_model.yaml b/nlpcraft-examples/sql/src/main/resources/sql_model.yaml
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/sql_model.yaml
rename to nlpcraft-examples/sql/src/main/resources/sql_model.yaml
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/sql_model_init.yaml b/nlpcraft-examples/sql/src/main/resources/sql_model_init.yaml
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/sql/sql_model_init.yaml
rename to nlpcraft-examples/sql/src/main/resources/sql_model_init.yaml
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/examples/sql/NCSqlExampleSpec.scala b/nlpcraft-examples/sql/src/test/java/org/apache/nlpcraft/examples/sql/NCSqlExampleSpec.scala
similarity index 100%
rename from nlpcraft/src/test/scala/org/apache/nlpcraft/examples/sql/NCSqlExampleSpec.scala
rename to nlpcraft-examples/sql/src/test/java/org/apache/nlpcraft/examples/sql/NCSqlExampleSpec.scala
index fc95d1b..a2df2e8 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/examples/sql/NCSqlExampleSpec.scala
+++ b/nlpcraft-examples/sql/src/test/java/org/apache/nlpcraft/examples/sql/NCSqlExampleSpec.scala
@@ -21,9 +21,9 @@ import com.github.difflib.text.DiffRowGenerator
 import com.github.vertical_blank.sqlformatter.SqlFormatter
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
+import org.apache.nlpcraft.{NCTestContext, NCTestEnvironment}
 import org.apache.nlpcraft.common.ascii.NCAsciiTable
 import org.apache.nlpcraft.examples.sql.db.SqlServer
-import org.apache.nlpcraft.{NCTestContext, NCTestEnvironment}
 import org.junit.jupiter.api.Test
 
 import java.util
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/examples/sql/NCSqlGeneratorSpec.scala b/nlpcraft-examples/sql/src/test/java/org/apache/nlpcraft/examples/sql/NCSqlGeneratorSpec.scala
similarity index 100%
rename from nlpcraft/src/test/scala/org/apache/nlpcraft/examples/sql/NCSqlGeneratorSpec.scala
rename to nlpcraft-examples/sql/src/test/java/org/apache/nlpcraft/examples/sql/NCSqlGeneratorSpec.scala
diff --git a/nlpcraft-examples/alarm/pom.xml b/nlpcraft-examples/time/pom.xml
similarity index 77%
copy from nlpcraft-examples/alarm/pom.xml
copy to nlpcraft-examples/time/pom.xml
index 7dc4a15..926785e 100644
--- a/nlpcraft-examples/alarm/pom.xml
+++ b/nlpcraft-examples/time/pom.xml
@@ -21,8 +21,8 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <name>NLPCraft example - Alarm</name>
-    <artifactId>nlpcraft-example-alarm</artifactId>
+    <name>NLPCraft example Time</name>
+    <artifactId>time</artifactId>
 
     <parent>
         <artifactId>nlpcraft-parent</artifactId>
@@ -37,6 +37,21 @@
             <artifactId>nlpcraft</artifactId>
             <version>${project.version}</version>
         </dependency>
+
+        <!-- Test dependencies. -->
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>${project.groupId}</groupId>
+            <artifactId>nlpcraft</artifactId>
+            <version>${project.version}</version>
+            <classifier>tests</classifier>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java b/nlpcraft-examples/time/src/main/java/org/apache/nlpcraft/examples/time/TimeModel.java
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java
rename to nlpcraft-examples/time/src/main/java/org/apache/nlpcraft/examples/time/TimeModel.java
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModelApp.java b/nlpcraft-examples/time/src/main/java/org/apache/nlpcraft/examples/time/TimeModelApp.java
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/TimeModelApp.java
rename to nlpcraft-examples/time/src/main/java/org/apache/nlpcraft/examples/time/TimeModelApp.java
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/README.md b/nlpcraft-examples/time/src/main/resources/README.md
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/README.md
rename to nlpcraft-examples/time/src/main/resources/README.md
diff --git a/nlpcraft-examples/time/src/main/resources/nlpcraft.conf b/nlpcraft-examples/time/src/main/resources/nlpcraft.conf
new file mode 100644
index 0000000..b641437
--- /dev/null
+++ b/nlpcraft-examples/time/src/main/resources/nlpcraft.conf
@@ -0,0 +1,148 @@
+#
+# 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.
+#
+
+#
+# This is joint configuration file for both the server and the data probes. Note that
+# server and probe configuration can be placed into separate files - each file containing only
+# 'nlpcraft.server' or 'nlpcraft.probe' sub-sections.
+#
+# You can also provide configuration properties or override the default ones via environment variables.
+# To use environment variables override:
+# 1. Set probe or server JVM system property -Dconfig.override_with_env_vars=true
+# 2. For each configuration 'x.y.z' set the environment variable CONFIG_FORCE_x_y_z=some_value
+#
+# Examples of environment variables:
+#   -- Overrides 'nlpcraft.sever.host' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_rest_host="localhost"
+#
+#   -- Overrides 'nlpcraft.sever.models' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_models="com.models.MyModel"
+#
+# See https://nlpcraft.apache.org/server-and-probe.html for more details.
+#
+
+# Common server/probe configuration root.
+nlpcraft {
+    # Basic NLP toolkit to use on both server and probes. Possible values:
+    # - 'opennlp'
+    # - 'stanford'
+    #
+    # NOTE: Stanford CoreNLP requires special installation due to its licensing.
+    # See https://nlpcraft.apache.org/integrations.html#stanford for more details.
+    nlpEngine = "opennlp"
+
+    # External configuration resources.
+    #
+    # NOTE:
+    # ----
+    # Due to licensing restrictions of the official ASF release policy some of the
+    # configuration for NLPCraft cannot be shipped with the official Apache release.
+    # Instead, NLPCraft will attempt to download these configuration files from the
+    # external URL upon the first start.
+    #
+    # NLPCraft will attempt to download the missing configuration files from URL defined
+    # in 'nlpcraft.extConfig.extUrl' property and place them into 'nlpcraft.extConfig.locDir'
+    # folder on the local file system. On subsequent starts, NLPCraft will check if the required
+    # file is already present locally and skip the download in such case. If 'nlpcraft.extConfig.checkMd5'
+    # property is set to 'true' then on each start NLPCraft will check the checksum of each file
+    # locally and remote and will re-download such file if the MD5 checksums don't match.
+    #
+    # By default, the external configuration is stored in the main Git repository for NLPCraft
+    # project from where it will be downloaded ('/external' folder). See this folder in the Git
+    # repository for more information: https://github.com/apache/incubator-nlpcraft/tree/master/external
+    extConfig {
+        # Mandatory.
+        extUrl = "https://github.com/apache/incubator-nlpcraft/raw/master/external"
+
+        # Optional.
+        # Default value is $USER_HOME/.nlpcraft/extcfg
+        # locDir = ...
+
+        # If 'true', on each start NLPCraft will check the MD5 checksum of the each local and remote
+        # external configuration file and will re-download such file if the checksum doesn't match.
+        # Set it to 'false' to speed up the bootstrap of the NLPCraft server and the data probe if you
+        # are certain that all external configuration files are properly downloaded and available
+        # in 'nlpcraft.extConfig.locDir' local folder.
+        checkMd5 = true
+    }
+
+    # +---------------------+
+    # | Probe configuration. |
+    # +---------------------+
+    probe {
+        # Any arbitrary descriptive name.
+        id = "time"
+
+        # This is the default token (as in default company).
+        # Note that this token must match the probe token for the company this probe
+        # associated with. If changed from default, this token must be kept secure.
+        token = "3141592653589793"
+
+        # These are default up-link and down-link endpoints that the probe will connect to.
+        # If changed - they need to be changed on both server and probe.
+        upLink = "0.0.0.0:8201"   # Server to probe data pipe.
+        downLink = "0.0.0.0:8202" # Probe to server data pipe.
+
+        # All JARs in this folder will be scanned for models.
+        # Safely ignored if 'null' - but then 'models' should have at least one element.
+        jarsFolder = null
+
+        # Specifies fully qualifies model class names for the probe to start with.
+        #
+        # Note that following models require 'google' on the server side.
+        # See https://nlpcraft.apache.org/integrations.html#nlp for more details
+        # on how to configure 3rd party token providers:
+        models = org.apache.nlpcraft.examples.time.TimeModel
+
+        # Specify class names for probe life cycle components.
+        # Each class should extend 'NCProbeLifecycle' interface and provide a no-arg constructor.
+        #
+        # The following built-in OpenCensus exporters are supported as lifecycle components:
+        # - org.apache.nlpcraft.model.opencensus.NCJaegerExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCZipkinExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCPrometheusExporter (stats)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverTraceExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverStatsExporter (stats)
+        lifecycle = ""
+
+        # Properties for built-in OpenCensus exporters.
+        # All configuration properties are optional unless otherwise specified.
+        # opencensus {
+        #     jaeger {
+        #         thriftUrl = "http://127.0.0.1:14268/api/traces"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        #     prometheus {
+        #         hostPort = "localhost:8889"
+        #         namespace = "nlpcraft-probe"
+        #     }
+        #     stackdriver {
+        #         # Mandatory Google project ID.
+        #         googleProjectId = "your_google_project_id"
+        #         metricsPrefix = "custom.googleapis.com/nlpcraft/probe"
+        #     }
+        #     zipkin {
+        #         v2Url = "http://127.0.0.1:9411/api/v2/spans"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        # }
+
+        # Maximum execution result size in bytes. Default value is 1M.
+        # When exceeded the request will be automatically rejected.
+        resultMaxSizeBytes = 1048576
+    }
+}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/time_model.yaml b/nlpcraft-examples/time/src/main/resources/time_model.yaml
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/time/time_model.yaml
rename to nlpcraft-examples/time/src/main/resources/time_model.yaml
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/examples/time/NCTimeModelSpec.scala b/nlpcraft-examples/time/src/test/java/org/apache/nlpcraft/examples/time/NCTimeModelSpec.scala
similarity index 100%
rename from nlpcraft/src/test/scala/org/apache/nlpcraft/examples/time/NCTimeModelSpec.scala
rename to nlpcraft-examples/time/src/test/java/org/apache/nlpcraft/examples/time/NCTimeModelSpec.scala
index c1bc764..ccc5e31 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/examples/time/NCTimeModelSpec.scala
+++ b/nlpcraft-examples/time/src/test/java/org/apache/nlpcraft/examples/time/NCTimeModelSpec.scala
@@ -17,8 +17,8 @@
 
 package org.apache.nlpcraft.examples.time
 
-import org.apache.nlpcraft.common.NCException
 import org.apache.nlpcraft.{NCTestContext, NCTestEnvironment}
+import org.apache.nlpcraft.common.NCException
 import org.junit.jupiter.api.Test
 
 import java.io.IOException
diff --git a/nlpcraft-examples/alarm/pom.xml b/nlpcraft-examples/weather/pom.xml
similarity index 94%
copy from nlpcraft-examples/alarm/pom.xml
copy to nlpcraft-examples/weather/pom.xml
index 7dc4a15..9468d03 100644
--- a/nlpcraft-examples/alarm/pom.xml
+++ b/nlpcraft-examples/weather/pom.xml
@@ -21,8 +21,8 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
-    <name>NLPCraft example - Alarm</name>
-    <artifactId>nlpcraft-example-alarm</artifactId>
+    <name>NLPCraft example Weather</name>
+    <artifactId>weather</artifactId>
 
     <parent>
         <artifactId>nlpcraft-parent</artifactId>
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java b/nlpcraft-examples/weather/src/main/java/org/apache/nlpcraft/examples/weather/WeatherModel.java
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherModel.java
rename to nlpcraft-examples/weather/src/main/java/org/apache/nlpcraft/examples/weather/WeatherModel.java
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/README.md b/nlpcraft-examples/weather/src/main/resources/README.md
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/README.md
rename to nlpcraft-examples/weather/src/main/resources/README.md
diff --git a/nlpcraft-examples/weather/src/main/resources/nlpcraft.conf b/nlpcraft-examples/weather/src/main/resources/nlpcraft.conf
new file mode 100644
index 0000000..e7e2b8b
--- /dev/null
+++ b/nlpcraft-examples/weather/src/main/resources/nlpcraft.conf
@@ -0,0 +1,148 @@
+#
+# 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.
+#
+
+#
+# This is joint configuration file for both the server and the data probes. Note that
+# server and probe configuration can be placed into separate files - each file containing only
+# 'nlpcraft.server' or 'nlpcraft.probe' sub-sections.
+#
+# You can also provide configuration properties or override the default ones via environment variables.
+# To use environment variables override:
+# 1. Set probe or server JVM system property -Dconfig.override_with_env_vars=true
+# 2. For each configuration 'x.y.z' set the environment variable CONFIG_FORCE_x_y_z=some_value
+#
+# Examples of environment variables:
+#   -- Overrides 'nlpcraft.sever.host' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_rest_host="localhost"
+#
+#   -- Overrides 'nlpcraft.sever.models' configuration property.
+#   CONFIG_FORCE_nlpcraft_server_models="com.models.MyModel"
+#
+# See https://nlpcraft.apache.org/server-and-probe.html for more details.
+#
+
+# Common server/probe configuration root.
+nlpcraft {
+    # Basic NLP toolkit to use on both server and probes. Possible values:
+    # - 'opennlp'
+    # - 'stanford'
+    #
+    # NOTE: Stanford CoreNLP requires special installation due to its licensing.
+    # See https://nlpcraft.apache.org/integrations.html#stanford for more details.
+    nlpEngine = "opennlp"
+
+    # External configuration resources.
+    #
+    # NOTE:
+    # ----
+    # Due to licensing restrictions of the official ASF release policy some of the
+    # configuration for NLPCraft cannot be shipped with the official Apache release.
+    # Instead, NLPCraft will attempt to download these configuration files from the
+    # external URL upon the first start.
+    #
+    # NLPCraft will attempt to download the missing configuration files from URL defined
+    # in 'nlpcraft.extConfig.extUrl' property and place them into 'nlpcraft.extConfig.locDir'
+    # folder on the local file system. On subsequent starts, NLPCraft will check if the required
+    # file is already present locally and skip the download in such case. If 'nlpcraft.extConfig.checkMd5'
+    # property is set to 'true' then on each start NLPCraft will check the checksum of each file
+    # locally and remote and will re-download such file if the MD5 checksums don't match.
+    #
+    # By default, the external configuration is stored in the main Git repository for NLPCraft
+    # project from where it will be downloaded ('/external' folder). See this folder in the Git
+    # repository for more information: https://github.com/apache/incubator-nlpcraft/tree/master/external
+    extConfig {
+        # Mandatory.
+        extUrl = "https://github.com/apache/incubator-nlpcraft/raw/master/external"
+
+        # Optional.
+        # Default value is $USER_HOME/.nlpcraft/extcfg
+        # locDir = ...
+
+        # If 'true', on each start NLPCraft will check the MD5 checksum of the each local and remote
+        # external configuration file and will re-download such file if the checksum doesn't match.
+        # Set it to 'false' to speed up the bootstrap of the NLPCraft server and the data probe if you
+        # are certain that all external configuration files are properly downloaded and available
+        # in 'nlpcraft.extConfig.locDir' local folder.
+        checkMd5 = true
+    }
+
+    # +---------------------+
+    # | Probe configuration. |
+    # +---------------------+
+    probe {
+        # Any arbitrary descriptive name.
+        id = "weather"
+
+        # This is the default token (as in default company).
+        # Note that this token must match the probe token for the company this probe
+        # associated with. If changed from default, this token must be kept secure.
+        token = "3141592653589793"
+
+        # These are default up-link and down-link endpoints that the probe will connect to.
+        # If changed - they need to be changed on both server and probe.
+        upLink = "0.0.0.0:8201"   # Server to probe data pipe.
+        downLink = "0.0.0.0:8202" # Probe to server data pipe.
+
+        # All JARs in this folder will be scanned for models.
+        # Safely ignored if 'null' - but then 'models' should have at least one element.
+        jarsFolder = null
+
+        # Specifies fully qualifies model class names for the probe to start with.
+        #
+        # Note that following models require 'google' on the server side.
+        # See https://nlpcraft.apache.org/integrations.html#nlp for more details
+        # on how to configure 3rd party token providers:
+        models = org.apache.nlpcraft.examples.weather.WeatherModel
+
+        # Specify class names for probe life cycle components.
+        # Each class should extend 'NCProbeLifecycle' interface and provide a no-arg constructor.
+        #
+        # The following built-in OpenCensus exporters are supported as lifecycle components:
+        # - org.apache.nlpcraft.model.opencensus.NCJaegerExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCZipkinExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCPrometheusExporter (stats)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverTraceExporter (traces)
+        # - org.apache.nlpcraft.model.opencensus.NCStackdriverStatsExporter (stats)
+        lifecycle = ""
+
+        # Properties for built-in OpenCensus exporters.
+        # All configuration properties are optional unless otherwise specified.
+        # opencensus {
+        #     jaeger {
+        #         thriftUrl = "http://127.0.0.1:14268/api/traces"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        #     prometheus {
+        #         hostPort = "localhost:8889"
+        #         namespace = "nlpcraft-probe"
+        #     }
+        #     stackdriver {
+        #         # Mandatory Google project ID.
+        #         googleProjectId = "your_google_project_id"
+        #         metricsPrefix = "custom.googleapis.com/nlpcraft/probe"
+        #     }
+        #     zipkin {
+        #         v2Url = "http://127.0.0.1:9411/api/v2/spans"
+        #         serviceName = "nlpcraft-probe"
+        #     }
+        # }
+
+        # Maximum execution result size in bytes. Default value is 1M.
+        # When exceeded the request will be automatically rejected.
+        resultMaxSizeBytes = 1048576
+    }
+}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/weather_model.json b/nlpcraft-examples/weather/src/main/resources/weather_model.json
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/examples/weather/weather_model.json
rename to nlpcraft-examples/weather/src/main/resources/weather_model.json
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestAskSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestAskSpec.scala
index 3a9e856..8939111 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestAskSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestAskSpec.scala
@@ -18,13 +18,12 @@
 package org.apache.nlpcraft.server.rest
 
 import org.apache.nlpcraft.NCTestEnvironment
-import org.apache.nlpcraft.examples.time.TimeModel
 import org.junit.jupiter.api.Assertions._
 import org.junit.jupiter.api.{BeforeEach, Test}
 
 import scala.collection.JavaConverters._
 
-@NCTestEnvironment(model = classOf[TimeModel], startClient = false)
+@NCTestEnvironment(model = classOf[RestTestModel], startClient = false)
 class NCRestAskSpec extends NCRestSpec {
     private var usrId: Long = 0
 
@@ -94,7 +93,6 @@ class NCRestAskSpec extends NCRestSpec {
         // Checks empty states.
         post("check")(("$.states", (states: ResponseList) ⇒ assertTrue(states.isEmpty)))
     }
-
     /**
       *
       */
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestClearSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestClearSpec.scala
index 989045f..e1581ff 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestClearSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestClearSpec.scala
@@ -18,11 +18,10 @@
 package org.apache.nlpcraft.server.rest
 
 import org.apache.nlpcraft.NCTestEnvironment
-import org.apache.nlpcraft.examples.time.TimeModel
 import org.junit.jupiter.api.Assertions.assertTrue
 import org.junit.jupiter.api.{BeforeEach, Test}
 
-@NCTestEnvironment(model = classOf[TimeModel], startClient = false)
+@NCTestEnvironment(model = classOf[RestTestModel], startClient = false)
 class NCRestClearSpec extends NCRestSpec {
     private var usrId: Long = 0
 
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestModelSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestModelSpec.scala
index 6e5f075..37036e6 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestModelSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestModelSpec.scala
@@ -26,35 +26,33 @@ import scala.collection.JavaConverters._
 /**
   * Note that context word server should be started.
   */
-// TODO: fix it - use some test model (not alarm)
-class NCRestModelSpec{}
-//@NCTestEnvironment(model = classOf[AlarmModel], startClient = false)
-//class NCRestModelSpec extends NCRestSpec {
-//    @Test
-//    def test(): Unit = {
-//        def extract(data: java.util.List[java.util.Map[String, Object]]): Seq[Double] =
-//            data.asScala.map(_.get("score").asInstanceOf[Number].doubleValue())
-//
-//        // Note that checked values are valid for current configuration of `nlpcraft.alarm.ex` model.
-//        post("model/sugsyn", "mdlId" → "nlpcraft.alarm.ex")(
-//            ("$.status", (status: String) ⇒ assertEquals("API_OK", status)),
-//            ("$.result.suggestions[:1].x:alarm.*", (data: java.util.List[java.util.Map[String, Object]]) ⇒ {
-//                val scores = extract(data)
-//
-//                assertTrue(scores.nonEmpty)
-//                assertTrue(scores.forall(s ⇒ s >= 0 && s <= 1))
-//                assertTrue(scores.exists(_ >= 0.5))
-//                assertTrue(scores.exists(_ <= 0.5))
-//            })
-//        )
-//        post("model/sugsyn", "mdlId" → "nlpcraft.alarm.ex", "minScore" → 0.5)(
-//            ("$.status", (status: String) ⇒ assertEquals("API_OK", status)),
-//            ("$.result.suggestions[:1].x:alarm.*", (data: java.util.List[java.util.Map[String, Object]]) ⇒ {
-//                val scores = extract(data)
-//
-//                assertTrue(scores.nonEmpty)
-//                assertTrue(scores.forall(s ⇒ s >= 0.5 && s <= 1))
-//            })
-//        )
-//    }
-//}
+@NCTestEnvironment(model = classOf[RestTestModel], startClient = false)
+class NCRestModelSpec extends NCRestSpec {
+    @Test
+    def test(): Unit = {
+        def extract(data: java.util.List[java.util.Map[String, Object]]): Seq[Double] =
+            data.asScala.map(_.get("score").asInstanceOf[Number].doubleValue())
+
+        // Note that checked values are valid for current configuration of `nlpcraft.alarm.ex` model.
+        post("model/sugsyn", "mdlId" → "nlpcraft.alarm.ex")(
+            ("$.status", (status: String) ⇒ assertEquals("API_OK", status)),
+            ("$.result.suggestions[:1].x:alarm.*", (data: java.util.List[java.util.Map[String, Object]]) ⇒ {
+                val scores = extract(data)
+
+                assertTrue(scores.nonEmpty)
+                assertTrue(scores.forall(s ⇒ s >= 0 && s <= 1))
+                assertTrue(scores.exists(_ >= 0.5))
+                assertTrue(scores.exists(_ <= 0.5))
+            })
+        )
+        post("model/sugsyn", "mdlId" → "nlpcraft.alarm.ex", "minScore" → 0.5)(
+            ("$.status", (status: String) ⇒ assertEquals("API_OK", status)),
+            ("$.result.suggestions[:1].x:alarm.*", (data: java.util.List[java.util.Map[String, Object]]) ⇒ {
+                val scores = extract(data)
+
+                assertTrue(scores.nonEmpty)
+                assertTrue(scores.forall(s ⇒ s >= 0.5 && s <= 1))
+            })
+        )
+    }
+}
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestProbeSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestProbeSpec.scala
index 0de88a5..1400a95 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestProbeSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestProbeSpec.scala
@@ -18,11 +18,10 @@
 package org.apache.nlpcraft.server.rest
 
 import org.apache.nlpcraft.NCTestEnvironment
-import org.apache.nlpcraft.examples.time.TimeModel
 import org.junit.jupiter.api.Assertions._
 import org.junit.jupiter.api.Test
 
-@NCTestEnvironment(model = classOf[TimeModel], startClient = false)
+@NCTestEnvironment(model = classOf[RestTestModel], startClient = false)
 class NCRestProbeSpec extends NCRestSpec {
     @Test
     def test(): Unit =
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestProbeSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/RestTestModel.scala
similarity index 61%
copy from nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestProbeSpec.scala
copy to nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/RestTestModel.scala
index 0de88a5..c054f53 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/NCRestProbeSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/server/rest/RestTestModel.scala
@@ -17,17 +17,9 @@
 
 package org.apache.nlpcraft.server.rest
 
-import org.apache.nlpcraft.NCTestEnvironment
-import org.apache.nlpcraft.examples.time.TimeModel
-import org.junit.jupiter.api.Assertions._
-import org.junit.jupiter.api.Test
+import org.apache.nlpcraft.model.NCModelAdapter
+
+// TODO:
+class RestTestModel extends NCModelAdapter("", "", "") {
 
-@NCTestEnvironment(model = classOf[TimeModel], startClient = false)
-class NCRestProbeSpec extends NCRestSpec {
-    @Test
-    def test(): Unit =
-        post("probe/all")(
-            ("$.probes", (probes: ResponseList) ⇒ assertFalse(probes.isEmpty)),
-            ("$.probes[:1].hostName", (names: JList[String]) ⇒ assertNotNull(names.get(0)))
-        )
 }
diff --git a/pom.xml b/pom.xml
index 22a537f..a441862 100644
--- a/pom.xml
+++ b/pom.xml
@@ -731,7 +731,14 @@
             <id>examples</id>
             <modules>
                 <module>nlpcraft-examples/alarm</module>
+                <module>nlpcraft-examples/echo</module>
+                <module>nlpcraft-examples/helloworld</module>
+                <module>nlpcraft-examples/lightswitch</module>
                 <module>nlpcraft-examples/minecraft</module>
+                <module>nlpcraft-examples/phone</module>
+                <module>nlpcraft-examples/time</module>
+                <module>nlpcraft-examples/weather</module>
+                <module>nlpcraft-examples/sql</module>
             </modules>
         </profile>