You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by ar...@apache.org on 2020/03/25 18:34:14 UTC

[incubator-nlpcraft] branch master updated: Fix for NLPCRAFT-27.

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

aradzinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git


The following commit(s) were added to refs/heads/master by this push:
     new b6138cb  Fix for NLPCRAFT-27.
b6138cb is described below

commit b6138cb61e784e2d70f5e757aad280318be1e54f
Author: Aaron Radzinzski <ar...@datalingvo.com>
AuthorDate: Wed Mar 25 11:34:09 2020 -0700

    Fix for NLPCRAFT-27.
---
 docs/examples/alarm_clock.html                     | 14 ++---
 .../nlpcraft/common/config/NCConfigurable.scala    |  4 +-
 .../common/nlp/core/NCNlpCoreManager.scala         |  2 +-
 .../common/nlp/dict/NCDictionaryManager.scala      |  4 +-
 .../apache/nlpcraft/examples/alarm/AlarmModel.java |  8 +--
 .../apache/nlpcraft/examples/alarm/AlarmTest.java  | 24 +++++---
 .../apache/nlpcraft/examples/echo/EchoTest.java    | 24 +++++---
 .../examples/helloworld/HelloWorldModel.java       |  6 +-
 .../examples/helloworld/HelloWorldTest.java        | 38 +++++++------
 .../examples/lightswitch/LightSwitchModel.scala    |  3 +-
 .../examples/lightswitch/LightSwitchTest.java      | 22 ++++++--
 .../misc/geo/cities/CitiesDataProvider.java        |  6 +-
 .../apache/nlpcraft/examples/phone/PhoneModel.java |  5 +-
 .../apache/nlpcraft/examples/phone/PhoneTest.java  | 37 +++++++-----
 .../nlpcraft/examples/sql/SqlModelTest.scala       | 66 ++++++++++++----------
 .../nlpcraft/examples/sql/db/SqlAccess.scala       |  2 +-
 .../nlpcraft/examples/sql/db/SqlBuilder.scala      |  4 +-
 .../apache/nlpcraft/examples/time/TimeModel.java   |  3 -
 .../nlpcraft/examples/time/TimeModelApp.java       |  2 +-
 .../apache/nlpcraft/examples/time/TimeTest.java    | 44 ++++++++-------
 .../nlpcraft/examples/weather/WeatherTest.java     | 40 +++++++------
 .../nlpcraft/model/tools/test/NCTestClient.java    | 19 ++++---
 .../nlpcraft/model/tools/test/package-info.java    | 23 +++++---
 .../probe/mgrs/conn/NCConnectionManager.scala      | 40 +++++++------
 .../mgrs/conversation/NCConversationManager.scala  |  3 +-
 .../probe/mgrs/deploy/NCDeployManager.scala        | 26 +++++----
 .../mgrs/dialogflow/NCDialogFlowManager.scala      |  5 +-
 .../probe/mgrs/lifecycle/NCLifecycleManager.scala  | 10 ++--
 .../nlpcraft/probe/mgrs/model/NCModelManager.scala |  4 +-
 .../probe/mgrs/nlp/NCProbeEnrichmentManager.scala  | 12 ++--
 .../mgrs/nlp/validate/NCValidateManager.scala      |  2 +-
 .../apache/nlpcraft/server/geo/NCGeoManager.scala  |  4 +-
 .../lifecycle/NCServerLifecycleManager.scala       |  4 +-
 .../lifecycle/opencensus/NCJaegerExporter.scala    |  6 +-
 .../opencensus/NCPrometheusExporter.scala          |  8 +--
 .../opencensus/NCStackdriverStatsExporter.scala    |  4 +-
 .../opencensus/NCStackdriverTraceExporter.scala    |  2 +-
 .../lifecycle/opencensus/NCZipkinExporter.scala    |  8 +--
 .../server/nlp/core/NCNlpServerManager.scala       |  6 +-
 .../server/nlp/core/spacy/NCSpaCyNerEnricher.scala |  2 +-
 .../nlp/core/stanford/NCStanfordCoreManager.scala  |  2 +-
 .../nlp/enrichers/NCServerEnrichmentManager.scala  |  2 +-
 .../server/nlp/enrichers/date/NCDateEnricher.scala |  2 +-
 .../nlpcraft/server/probe/NCProbeManager.scala     | 41 +++++++++-----
 .../nlpcraft/server/query/NCQueryManager.scala     |  4 +-
 .../nlpcraft/server/rest/NCRestManager.scala       |  6 +-
 .../org/apache/nlpcraft/server/sql/NCSql.scala     | 20 +++----
 .../apache/nlpcraft/server/sql/NCSqlManager.scala  |  2 +-
 .../apache/nlpcraft/server/tx/NCTxManager.scala    |  5 +-
 .../nlpcraft/server/user/NCUserManager.scala       | 10 ++--
 .../nlpcraft/model/intent/dsl/NCDslTest.java       |  3 +-
 .../nlpcraft/models/stm/NCStmTestModelSpec.java    | 22 +++++---
 52 files changed, 378 insertions(+), 287 deletions(-)

diff --git a/docs/examples/alarm_clock.html b/docs/examples/alarm_clock.html
index 8736a88..ad42fc4 100644
--- a/docs/examples/alarm_clock.html
+++ b/docs/examples/alarm_clock.html
@@ -361,25 +361,25 @@ import java.io.IOException;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 class AlarmTest {
-    private NCTestClient client;
+    private NCTestClient cli;
 
     @BeforeEach
     void setUp() throws NCException, IOException {
-        client = new NCTestClientBuilder().newBuilder().build();
+        cli = new NCTestClientBuilder().newBuilder().build();
 
-        client.open("nlpcraft.alarm.ex"); // See alarm_model.json
+        cli.open("nlpcraft.alarm.ex"); // See alarm_model.json
     }
 
     @AfterEach
     void tearDown() throws NCException, IOException {
-        client.close();
+        cli.close();
     }
 
     @Test
     void test() throws NCException, IOException {
-        assertTrue(client.ask("Ping me in 3 minutes").isOk());
-        assertTrue(client.ask("Buzz me in an hour and 15mins").isOk());
-        assertTrue(client.ask("Set my alarm for 30s").isOk());
+        assertTrue(cli.ask("Ping me in 3 minutes").isOk());
+        assertTrue(cli.ask("Buzz me in an hour and 15mins").isOk());
+        assertTrue(cli.ask("Set my alarm for 30s").isOk());
     }
 }        </pre>
         <p>
diff --git a/src/main/scala/org/apache/nlpcraft/common/config/NCConfigurable.scala b/src/main/scala/org/apache/nlpcraft/common/config/NCConfigurable.scala
index b0cb272..457bb0b 100644
--- a/src/main/scala/org/apache/nlpcraft/common/config/NCConfigurable.scala
+++ b/src/main/scala/org/apache/nlpcraft/common/config/NCConfigurable.scala
@@ -29,8 +29,8 @@ import scala.collection.JavaConverters._
 trait NCConfigurable extends LazyLogging {
     import NCConfigurable._
     
-    // Accessor to the loaded config.
-    private val hocon: Config = cfg
+    // Accessor to the loaded config. It should reload config.
+    private def hocon: Config = cfg
     
     /**
       *
diff --git a/src/main/scala/org/apache/nlpcraft/common/nlp/core/NCNlpCoreManager.scala b/src/main/scala/org/apache/nlpcraft/common/nlp/core/NCNlpCoreManager.scala
index 6dedbbd..d8e431c 100644
--- a/src/main/scala/org/apache/nlpcraft/common/nlp/core/NCNlpCoreManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/common/nlp/core/NCNlpCoreManager.scala
@@ -29,7 +29,7 @@ object NCNlpCoreManager extends NCService {
     private final val SUPPORTED_NLP_ENGINES = Seq("opennlp", "stanford")
     
     private object Config extends NCConfigurable {
-        val engine: String = getString("nlpcraft.nlpEngine")
+        def engine: String = getString("nlpcraft.nlpEngine")
     }
     
     @volatile private var tokenizer: NCNlpTokenizer = _
diff --git a/src/main/scala/org/apache/nlpcraft/common/nlp/dict/NCDictionaryManager.scala b/src/main/scala/org/apache/nlpcraft/common/nlp/dict/NCDictionaryManager.scala
index c5bdcc7..9eafe87 100644
--- a/src/main/scala/org/apache/nlpcraft/common/nlp/dict/NCDictionaryManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/common/nlp/dict/NCDictionaryManager.scala
@@ -40,8 +40,8 @@ object NCDictionaryManager extends NCService {
     require(NCDictionaryType.values.forall(dictFiles.contains))
     
     // Summary dictionary for all types.
-    private var full: Set[String] = _
-    private var dicts: Map[NCDictionaryType, Set[String]] = _
+    @volatile private var full: Set[String] = _
+    @volatile private var dicts: Map[NCDictionaryType, Set[String]] = _
     
     override def start(parent: Span): NCService = startScopedSpan("start", parent, "dictionaries" → dictFiles.values.mkString(",")) { _ ⇒
         dicts = dictFiles.map(p ⇒ {
diff --git a/src/main/scala/org/apache/nlpcraft/examples/alarm/AlarmModel.java b/src/main/scala/org/apache/nlpcraft/examples/alarm/AlarmModel.java
index 4c81dda..2182df7 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/alarm/AlarmModel.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/alarm/AlarmModel.java
@@ -17,13 +17,7 @@
 
 package org.apache.nlpcraft.examples.alarm;
 
-import org.apache.nlpcraft.model.NCModelFileAdapter;
-import org.apache.nlpcraft.model.NCResult;
-import org.apache.nlpcraft.model.NCRejection;
-import org.apache.nlpcraft.model.NCToken;
-import org.apache.nlpcraft.model.NCIntentRef;
-import org.apache.nlpcraft.model.NCIntentMatch;
-import org.apache.nlpcraft.model.NCIntentTerm;
+import org.apache.nlpcraft.model.*;
 
 import java.time.LocalDateTime;
 import java.time.ZoneId;
diff --git a/src/main/scala/org/apache/nlpcraft/examples/alarm/AlarmTest.java b/src/main/scala/org/apache/nlpcraft/examples/alarm/AlarmTest.java
index fe027c9..9dbf835 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/alarm/AlarmTest.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/alarm/AlarmTest.java
@@ -17,10 +17,13 @@
 
 package org.apache.nlpcraft.examples.alarm;
 
-import org.junit.jupiter.api.*;
 import org.apache.nlpcraft.common.NCException;
 import org.apache.nlpcraft.model.tools.test.NCTestClient;
 import org.apache.nlpcraft.model.tools.test.NCTestClientBuilder;
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 
@@ -32,24 +35,29 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  * @see AlarmModel
  */
 class AlarmTest {
-    static private NCTestClient client;
+    static private NCTestClient cli;
     
     @BeforeAll
     static void setUp() throws NCException, IOException {
-        client = new NCTestClientBuilder().newBuilder().build();
+        NCEmbeddedProbe.start(AlarmModel.class);
+
+        cli = new NCTestClientBuilder().newBuilder().build();
         
-        client.open("nlpcraft.alarm.ex"); // See alarm_model.json
+        cli.open("nlpcraft.alarm.ex"); // See alarm_model.json
     }
     
     @AfterAll
     static void tearDown() throws NCException, IOException {
-        client.close();
+        if (cli != null)
+            cli.close();
+
+        NCEmbeddedProbe.stop();
     }
     
     @Test
     void test() throws NCException, IOException {
-        assertTrue(client.ask("Ping me in 3 minutes").isOk());
-        assertTrue(client.ask("Buzz me in an hour and 15mins").isOk());
-        assertTrue(client.ask("Set my alarm for 30s").isOk());
+        assertTrue(cli.ask("Ping me in 3 minutes").isOk());
+        assertTrue(cli.ask("Buzz me in an hour and 15mins").isOk());
+        assertTrue(cli.ask("Set my alarm for 30s").isOk());
     }
 }
diff --git a/src/main/scala/org/apache/nlpcraft/examples/echo/EchoTest.java b/src/main/scala/org/apache/nlpcraft/examples/echo/EchoTest.java
index b10c38c..98a8a0f 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/echo/EchoTest.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/echo/EchoTest.java
@@ -17,12 +17,13 @@
 
 package org.apache.nlpcraft.examples.echo;
 
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
 import org.apache.nlpcraft.common.NCException;
 import org.apache.nlpcraft.model.tools.test.NCTestClient;
 import org.apache.nlpcraft.model.tools.test.NCTestClientBuilder;
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 
@@ -34,23 +35,28 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  * @see EchoModel
  */
 class EchoTest {
-    private NCTestClient client;
+    private NCTestClient cli;
     
     @BeforeEach
     void setUp() throws NCException, IOException {
-        client = new NCTestClientBuilder().newBuilder().build();
+        NCEmbeddedProbe.start(EchoModel.class);
+
+        cli = new NCTestClientBuilder().newBuilder().build();
     
-        client.open("nlpcraft.echo.ex");
+        cli.open("nlpcraft.echo.ex");
     }
     
     @AfterEach
     void tearDown() throws NCException, IOException {
-        client.close();
+        if (cli != null)
+            cli.close();
+
+        NCEmbeddedProbe.stop();
     }
     
     @Test
     void test() throws NCException, IOException {
-        assertTrue(client.ask("LA weather last Friday").isOk());
-        assertTrue(client.ask("Just about any sentence you can imagine!").isOk());
+        assertTrue(cli.ask("LA weather last Friday").isOk());
+        assertTrue(cli.ask("Just about any sentence you can imagine!").isOk());
     }
 }
diff --git a/src/main/scala/org/apache/nlpcraft/examples/helloworld/HelloWorldModel.java b/src/main/scala/org/apache/nlpcraft/examples/helloworld/HelloWorldModel.java
index 8b07e7d..81d8fa6 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/helloworld/HelloWorldModel.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/helloworld/HelloWorldModel.java
@@ -17,8 +17,10 @@
 
 package org.apache.nlpcraft.examples.helloworld;
 
-import org.apache.nlpcraft.common.*;
-import org.apache.nlpcraft.model.*;
+import org.apache.nlpcraft.common.NCException;
+import org.apache.nlpcraft.model.NCContext;
+import org.apache.nlpcraft.model.NCModelAdapter;
+import org.apache.nlpcraft.model.NCResult;
 
 /**
  * Hello World example data model.
diff --git a/src/main/scala/org/apache/nlpcraft/examples/helloworld/HelloWorldTest.java b/src/main/scala/org/apache/nlpcraft/examples/helloworld/HelloWorldTest.java
index 61ba5df..a89a1df 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/helloworld/HelloWorldTest.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/helloworld/HelloWorldTest.java
@@ -17,12 +17,13 @@
 
 package org.apache.nlpcraft.examples.helloworld;
 
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
 import org.apache.nlpcraft.common.NCException;
 import org.apache.nlpcraft.model.tools.test.NCTestClient;
 import org.apache.nlpcraft.model.tools.test.NCTestClientBuilder;
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 
@@ -34,30 +35,35 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  * @see HelloWorldModel
  */
 class HelloWorldTest {
-    private NCTestClient client;
-    
+    private NCTestClient cli;
+
     @BeforeEach
     void setUp() throws NCException, IOException {
+        NCEmbeddedProbe.start(HelloWorldModel.class);
+
         // Use all defaults.
-        client = new NCTestClientBuilder().newBuilder().build();
-        
-        client.open("nlpcraft.helloworld.ex");
+        cli = new NCTestClientBuilder().newBuilder().build();
+
+        cli.open("nlpcraft.helloworld.ex");
     }
-    
+
     @AfterEach
     void tearDown() throws NCException, IOException {
-        client.close();
+        if (cli != null)
+            cli.close();
+
+        NCEmbeddedProbe.stop();
     }
-    
+
     @Test
     void test() throws NCException, IOException {
         // Empty parameter.
-        assertTrue(client.ask("").isFailed());
-    
+        assertTrue(cli.ask("").isFailed());
+
         // Only latin charset is supported.
-        assertTrue(client.ask("El tiempo en España").isFailed());
-    
+        assertTrue(cli.ask("El tiempo en España").isFailed());
+
         // Should be passed.
-        assertTrue(client.ask("Hi!").isOk());
+        assertTrue(cli.ask("Hi!").isOk());
     }
 }
diff --git a/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchModel.scala b/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchModel.scala
index df39329..5f001e3 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchModel.scala
+++ b/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchModel.scala
@@ -17,8 +17,7 @@
 
 package org.apache.nlpcraft.examples.lightswitch
 
-import org.apache.nlpcraft.model._
-import org.apache.nlpcraft.model.NCIntentTerm
+import org.apache.nlpcraft.model.{NCIntentTerm, _}
 
 /**
   * This example provides very simple implementation for NLI-powered light switch.
diff --git a/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchTest.java b/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchTest.java
index a99de80..e411f5a 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchTest.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/lightswitch/LightSwitchTest.java
@@ -17,12 +17,17 @@
 
 package org.apache.nlpcraft.examples.lightswitch;
 
-import org.junit.jupiter.api.*;
-import org.apache.nlpcraft.common.*;
-import org.apache.nlpcraft.model.tools.test.*;
-import java.io.*;
+import org.apache.nlpcraft.common.NCException;
+import org.apache.nlpcraft.model.tools.test.NCTestClient;
+import org.apache.nlpcraft.model.tools.test.NCTestClientBuilder;
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.jupiter.api.Assertions.*;
+import java.io.IOException;
+
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Lightswitch model test.
@@ -34,6 +39,8 @@ class LightSwitchTest {
 
     @BeforeEach
     void setUp() throws NCException, IOException {
+        NCEmbeddedProbe.start(LightSwitchModel.class);
+
         cli = new NCTestClientBuilder().newBuilder().build();
 
         cli.open("nlpcraft.lightswitch.ex");
@@ -41,7 +48,10 @@ class LightSwitchTest {
 
     @AfterEach
     void tearDown() throws NCException, IOException {
-        cli.close();
+        if (cli != null)
+            cli.close();
+
+        NCEmbeddedProbe.stop();
     }
 
     @Test
diff --git a/src/main/scala/org/apache/nlpcraft/examples/misc/geo/cities/CitiesDataProvider.java b/src/main/scala/org/apache/nlpcraft/examples/misc/geo/cities/CitiesDataProvider.java
index 94ab352..15d6dfa 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/misc/geo/cities/CitiesDataProvider.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/misc/geo/cities/CitiesDataProvider.java
@@ -23,11 +23,7 @@ import org.apache.nlpcraft.common.NCException;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
diff --git a/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java b/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
index 64c35e8..6ca8d26 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneModel.java
@@ -18,8 +18,9 @@
 package org.apache.nlpcraft.examples.phone;
 
 import org.apache.nlpcraft.model.*;
-import java.util.*;
-import java.util.stream.*;
+
+import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
diff --git a/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneTest.java b/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneTest.java
index 8170c5f..217c564 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneTest.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/phone/PhoneTest.java
@@ -17,12 +17,14 @@
 
 package org.apache.nlpcraft.examples.phone;
 
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
 import org.apache.nlpcraft.common.NCException;
 import org.apache.nlpcraft.model.tools.test.NCTestClient;
 import org.apache.nlpcraft.model.tools.test.NCTestClientBuilder;
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 
@@ -34,24 +36,31 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  * @see PhoneModel
  */
 class PhoneTest {
-    private NCTestClient client;
-    
+    private NCTestClient cli;
+
     @BeforeEach
     void setUp() throws NCException, IOException {
-        client = new NCTestClientBuilder().newBuilder().build();
-        
-        client.open("nlpcraft.phone.ex"); // See phone_model.json
+        NCEmbeddedProbe.start(PhoneModel.class);
+
+        cli = new NCTestClientBuilder().newBuilder().build();
+
+        cli.open("nlpcraft.phone.ex"); // See phone_model.json
     }
-    
+
     @AfterEach
     void tearDown() throws NCException, IOException {
-        client.close();
+        if (cli != null)
+            cli.close();
+
+        NCEmbeddedProbe.stop();
     }
-    
+
+    // Uncomment if this model is configured.
+    @Disabled
     @Test
     void test() throws NCException, IOException {
-        assertTrue(client.ask("Call to Apple office").isOk());
-        assertTrue(client.ask("Can you please ping John Smith?").isOk());
-        assertTrue(client.ask("Could you dial +7 (931) 188 34 58 and ask Mike?").isOk());
+        assertTrue(cli.ask("Call to Apple office").isOk());
+        assertTrue(cli.ask("Can you please ping John Smith?").isOk());
+        assertTrue(cli.ask("Could you dial +7 (931) 188 34 58 and ask Mike?").isOk());
     }
 }
diff --git a/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModelTest.scala b/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModelTest.scala
index 558a344..1968895 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModelTest.scala
+++ b/src/main/scala/org/apache/nlpcraft/examples/sql/SqlModelTest.scala
@@ -27,14 +27,15 @@ import com.google.gson.reflect.TypeToken
 import com.jakewharton.fliptables.FlipTable
 import org.apache.nlpcraft.model.tools.sqlgen.NCSqlException
 import org.apache.nlpcraft.model.tools.test.{NCTestClient, NCTestClientBuilder}
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe
 import org.scalatest.{BeforeAndAfterAll, FlatSpec}
 
 import scala.collection.JavaConverters._
 import scala.compat.java8.OptionConverters._
 
 /**
-  *
-  */
+ *
+ */
 class SqlModelTest extends FlatSpec with BeforeAndAfterAll {
     private val GSON = new Gson
     private val TYPE_RESP = new TypeToken[util.Map[String, Object]]() {}.getType
@@ -50,8 +51,8 @@ class SqlModelTest extends FlatSpec with BeforeAndAfterAll {
                 override def apply(t: java.lang.Boolean): String = "**"
             }).
             build
-    
-    private var cli: NCTestClient = _
+
+    private var client: NCTestClient = _
 
     case class Case(texts: Seq[String], sql: String)
 
@@ -64,62 +65,67 @@ class SqlModelTest extends FlatSpec with BeforeAndAfterAll {
             mkString(" ")
 
     private def toPretty(s: String): util.List[String] = SqlFormatter.format(s).split("\n").toSeq.asJava
-    
+
     override protected def beforeAll(): Unit = {
-        cli = new NCTestClientBuilder().newBuilder.setResponseLog(false).build
-    
-        cli.open("sql.model.id")
-        
+        NCEmbeddedProbe.start(classOf[SqlModel])
+
+        client = new NCTestClientBuilder().newBuilder.setResponseLog(false).build
+
+        client.open("sql.model.id")
+
     }
-    
-    override protected def afterAll(): Unit =
-        if (cli != null)
-            cli.close()
-    
+
+    override protected def afterAll(): Unit = {
+        if (client != null)
+            client.close()
+
+        NCEmbeddedProbe.stop()
+    }
+
     private def check(multiLineOut: Boolean, cases: Case*): Unit = {
         val errs = collection.mutable.LinkedHashMap.empty[String, String]
-        
+
         cases.
             flatMap(c ⇒ {
                 val sql = normalize(c.sql)
-                
+
                 c.texts.map(t ⇒ t → sql)
             }).
             foreach {
                 case (txt, expSqlNorm) ⇒
-                    val res = cli.ask(txt)
-    
+                    val res = client.ask(txt)
+
                     if (res.isOk) {
                         require(res.getResult.asScala.isDefined)
-    
+
                         val m: util.Map[String, Object] = GSON.fromJson(res.getResult.get, TYPE_RESP)
-    
+
                         val err = m.get("error")
-    
+
                         if (err != null)
                             errs += txt → err.toString
                         else {
                             val resSqlNorm = normalize(m.asScala("sql").asInstanceOf[String])
-    
+
                             if (resSqlNorm != expSqlNorm) {
                                 if (multiLineOut) {
                                     val rows = DIFF.generateDiffRows(toPretty(expSqlNorm), toPretty(resSqlNorm)).asScala
-    
+
                                     val table =
                                         FlipTable.of(
                                             Array("Expected", "Real"),
                                             rows.map(p ⇒ Array(p.getOldLine, p.getNewLine)).toArray
                                         )
-    
+
                                     errs += txt → s"Unexpected SQL:\n$table"
                                 }
                                 else {
                                     val rows = DIFF.generateDiffRows(Seq(expSqlNorm).asJava, Seq(resSqlNorm).asJava).asScala
-    
+
                                     require(rows.size == 1)
-    
+
                                     val row = rows.head
-    
+
                                     errs += txt →
                                         s"""Unexpected SQL (expected vs real)
                                            |${row.getOldLine}
@@ -131,13 +137,13 @@ class SqlModelTest extends FlatSpec with BeforeAndAfterAll {
                     }
                     else {
                         require(res.getResultError.isPresent)
-    
+
                         errs += txt → res.getResultError.get
                     }
             }
 
         if (errs.nonEmpty) {
-            errs.foreach { case (txt, err) ⇒ println(s"Text: $txt\nError: $err\n")}
+            errs.foreach { case (txt, err) ⇒ println(s"Text: $txt\nError: $err\n") }
 
             throw new NCSqlException(s"Test finished with errors [passed=${cases.size - errs.size}, failed=${errs.size}]")
         }
@@ -566,7 +572,7 @@ class SqlModelTest extends FlatSpec with BeforeAndAfterAll {
                   |LIMIT
                   |  1000
                 """.stripMargin
-            ) ,
+            ),
             Case(
                 Seq(
                     "give me the orders sorted by ship date"
diff --git a/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala b/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala
index ef2d0be..cd9ab5d 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala
+++ b/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlAccess.scala
@@ -22,8 +22,8 @@ import java.sql.{Connection, SQLException}
 import com.github.vertical_blank.sqlformatter.SqlFormatter
 import com.jakewharton.fliptables.FlipTable
 import com.typesafe.scalalogging.LazyLogging
-import org.h2.jdbcx.JdbcDataSource
 import org.apache.nlpcraft.model.tools.sqlgen.NCSqlQuery
+import org.h2.jdbcx.JdbcDataSource
 import resource.managed
 
 import scala.collection.JavaConverters._
diff --git a/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala b/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala
index f9435f4..699f495 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala
+++ b/src/main/scala/org/apache/nlpcraft/examples/sql/db/SqlBuilder.scala
@@ -21,10 +21,10 @@ import java.sql.Types
 import java.util
 
 import com.typesafe.scalalogging.LazyLogging
+import org.apache.nlpcraft.model.tools.sqlgen.impl.{NCSqlFunctionImpl, NCSqlSortImpl}
+import org.apache.nlpcraft.model.tools.sqlgen.{NCSqlAggregate, _}
 import org.jgrapht.alg.DijkstraShortestPath
 import org.jgrapht.graph.{DefaultEdge, SimpleGraph}
-import org.apache.nlpcraft.model.tools.sqlgen.{NCSqlAggregate, _}
-import org.apache.nlpcraft.model.tools.sqlgen.impl.{NCSqlFunctionImpl, NCSqlSortImpl}
 
 import scala.collection.JavaConverters._
 import scala.collection.{Seq, mutable}
diff --git a/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java b/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java
index 55d4192..e6d7e2e 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/time/TimeModel.java
@@ -28,9 +28,6 @@ import org.apache.nlpcraft.examples.misc.geo.cities.CityData;
 import org.apache.nlpcraft.examples.misc.geo.keycdn.GeoManager;
 import org.apache.nlpcraft.examples.misc.geo.keycdn.beans.GeoDataBean;
 import org.apache.nlpcraft.model.*;
-import org.apache.nlpcraft.model.NCIntent;
-import org.apache.nlpcraft.model.NCIntentMatch;
-import org.apache.nlpcraft.model.NCIntentTerm;
 
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
diff --git a/src/main/scala/org/apache/nlpcraft/examples/time/TimeModelApp.java b/src/main/scala/org/apache/nlpcraft/examples/time/TimeModelApp.java
index e7f0307..cd8e1ad 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/time/TimeModelApp.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/time/TimeModelApp.java
@@ -17,7 +17,7 @@
 
 package org.apache.nlpcraft.examples.time;
 
-import org.apache.nlpcraft.probe.embedded.*;
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
 
 /**
  * An app that demo the usage of embedded probe. This is an alternative way to
diff --git a/src/main/scala/org/apache/nlpcraft/examples/time/TimeTest.java b/src/main/scala/org/apache/nlpcraft/examples/time/TimeTest.java
index d2e8b40..a801710 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/time/TimeTest.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/time/TimeTest.java
@@ -17,12 +17,13 @@
 
 package org.apache.nlpcraft.examples.time;
 
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
 import org.apache.nlpcraft.common.NCException;
 import org.apache.nlpcraft.model.tools.test.NCTestClient;
 import org.apache.nlpcraft.model.tools.test.NCTestClientBuilder;
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 
@@ -34,33 +35,38 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  * @see TimeModel
  */
 class TimeTest {
-    private NCTestClient client;
-    
+    private NCTestClient cli;
+
     @BeforeEach
     void setUp() throws NCException, IOException {
-        client = new NCTestClientBuilder().newBuilder().build();
-        
-        client.open("nlpcraft.time.ex"); // See time_model.json
+        NCEmbeddedProbe.start(TimeModel.class);
+
+        cli = new NCTestClientBuilder().newBuilder().build();
+
+        cli.open("nlpcraft.time.ex"); // See time_model.json
     }
-    
+
     @AfterEach
     void tearDown() throws NCException, IOException {
-        client.close();
+        if (cli != null)
+            cli.close();
+
+        NCEmbeddedProbe.stop();
     }
-    
+
     @Test
     void test() throws NCException, IOException {
         // Empty parameter.
-        assertTrue(client.ask("").isFailed());
-    
+        assertTrue(cli.ask("").isFailed());
+
         // Only latin charset is supported.
-        assertTrue(client.ask("El tiempo en España").isFailed());
+        assertTrue(cli.ask("El tiempo en España").isFailed());
 
         // Should be passed.
-        assertTrue(client.ask("What time is it now in New York City?").isOk());
-        assertTrue(client.ask("What's the current time in Moscow?").isOk());
-        assertTrue(client.ask("Show me time of the day in London.").isOk());
-        assertTrue(client.ask("Can you please give me the San Francisco's current date and time.").isOk());
-        assertTrue(client.ask("What's the local time?").isOk());
+        assertTrue(cli.ask("What time is it now in New York City?").isOk());
+        assertTrue(cli.ask("What's the current time in Moscow?").isOk());
+        assertTrue(cli.ask("Show me time of the day in London.").isOk());
+        assertTrue(cli.ask("Can you please give me the San Francisco's current date and time.").isOk());
+        assertTrue(cli.ask("What's the local time?").isOk());
     }
 }
diff --git a/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherTest.java b/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherTest.java
index e640c88..6bd0949 100644
--- a/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherTest.java
+++ b/src/main/scala/org/apache/nlpcraft/examples/weather/WeatherTest.java
@@ -19,13 +19,14 @@ package org.apache.nlpcraft.examples.weather;
 
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
 import org.apache.nlpcraft.common.NCException;
 import org.apache.nlpcraft.model.tools.test.NCTestClient;
 import org.apache.nlpcraft.model.tools.test.NCTestClientBuilder;
 import org.apache.nlpcraft.model.tools.test.NCTestResult;
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 import java.lang.reflect.Type;
@@ -43,9 +44,9 @@ import static org.junit.jupiter.api.Assertions.*;
 class WeatherTest {
     private static final Gson GSON = new Gson();
     private static final Type TYPE_MAP_RESP = new TypeToken<HashMap<String, Object>>() {}.getType();
-    
+
     private NCTestClient cli;
-    
+
     /**
      * Checks given intent.
      *
@@ -55,48 +56,53 @@ class WeatherTest {
      */
     private void checkIntent(String txt, String intentId, boolean shouldBeSame) throws NCException, IOException {
         NCTestResult res = cli.ask(txt);
-        
+
         assertTrue(res.isOk(), () -> res.getResultError().get());
 
         assert res.getResult().isPresent();
-        
+
         Map<String, Object> map = GSON.fromJson(res.getResult().get(), TYPE_MAP_RESP);
-        
+
         if (shouldBeSame)
             assertEquals(intentId, map.get("intentId"));
         else
             assertNotEquals(intentId, map.get("intentId"));
     }
-    
+
     @BeforeEach
     void setUp() throws NCException, IOException {
+        NCEmbeddedProbe.start(WeatherModel.class);
+
         cli = new NCTestClientBuilder().newBuilder().build();
-        
+
         cli.open("nlpcraft.weather.ex");  // See weather_model.json
     }
-    
+
     @AfterEach
     void tearDown() throws NCException, IOException {
-        cli.close();
+        if (cli != null)
+            cli.close();
+
+        NCEmbeddedProbe.stop();
     }
-    
+
     @Test
     void test() throws NCException, IOException {
         // Empty parameter.
         assertTrue(cli.ask("").isFailed());
-    
+
         // Only latin charset is supported.
         assertTrue(cli.ask("El tiempo en España").isFailed());
-    
+
         // Should be passed.
         checkIntent("What's the local weather forecast?", "fcast", true);
         checkIntent("What's the weather in Moscow?", "curr", true);
         // Can be answered with conversation.
         checkIntent("Chance of snow?", "curr", true);
         checkIntent("Moscow", "curr", true);
-        
+
         cli.clearConversation();
-    
+
         // Cannot be answered without conversation.
         assertTrue(cli.ask("Moscow").isFailed());
     }
diff --git a/src/main/scala/org/apache/nlpcraft/model/tools/test/NCTestClient.java b/src/main/scala/org/apache/nlpcraft/model/tools/test/NCTestClient.java
index 26890e5..2de6fc0 100644
--- a/src/main/scala/org/apache/nlpcraft/model/tools/test/NCTestClient.java
+++ b/src/main/scala/org/apache/nlpcraft/model/tools/test/NCTestClient.java
@@ -29,26 +29,31 @@ import java.io.IOException;
  * the usage of test framework together with JUnit 5:
  * <pre class="brush: java, highlight: [6, 8, 13, 19, 22, 25, 26, 27]">
  * public class AlarmTest {
- *     private NCTestClient client;
+ *     private NCTestClient cli;
  *
  *     &#64;BeforeEach
  *     void setUp() throws NCException, IOException {
- *         client = new NCTestClientBuilder().newBuilder().build();
+ *         NCEmbeddedProbe.start(AlarmModel.class);
  *
- *         client.open("nlpcraft.alarm.ex");
+ *         cli = new NCTestClientBuilder().newBuilder().build();
+ *
+ *         cli.open("nlpcraft.alarm.ex");
  *     }
  *
  *     &#64;AfterEach
  *     void tearDown() throws NCException, IOException {
- *         client.close();
+ *         if (cli != null)
+ *             cli.close();
+ *
+ *         NCEmbeddedProbe.stop();
  *     }
  *
  *     &#64;Test
  *     public void test() throws NCException, IOException {
  *         // Should be passed.
- *         assertTrue(client.ask("Ping me in 3 minutes").isOk());
- *         assertTrue(client.ask("Buzz me in an hour and 15mins").isOk());
- *         assertTrue(client.ask("Set my alarm for 30s").isOk());
+ *         assertTrue(cli.ask("Ping me in 3 minutes").isOk());
+ *         assertTrue(cli.ask("Buzz me in an hour and 15mins").isOk());
+ *         assertTrue(cli.ask("Set my alarm for 30s").isOk());
  *     }
  * }
  * </pre>
diff --git a/src/main/scala/org/apache/nlpcraft/model/tools/test/package-info.java b/src/main/scala/org/apache/nlpcraft/model/tools/test/package-info.java
index 06e4703..aad453e 100644
--- a/src/main/scala/org/apache/nlpcraft/model/tools/test/package-info.java
+++ b/src/main/scala/org/apache/nlpcraft/model/tools/test/package-info.java
@@ -22,32 +22,37 @@
  * the usage of test framework together with JUnit 5:
  * <pre class="brush: java">
  * public class AlarmTest {
- *     private NCTestClient client;
+ *     private NCTestClient cli;
  *
  *     &#64;BeforeEach
  *     void setUp() throws NCException, IOException {
- *         client = new NCTestClientBuilder().newBuilder().build();
+ *         NCEmbeddedProbe.start(AlarmModel.class);
  *
- *         client.open("nlpcraft.alarm.ex");
+ *         cli = new NCTestClientBuilder().newBuilder().build();
+ *
+ *         cli.open("nlpcraft.alarm.ex");
  *     }
  *
  *     &#64;AfterEach
  *     void tearDown() throws NCException, IOException {
- *         client.close();
+ *         if (cli != null)
+ *             cli.close();
+ *
+ *         NCEmbeddedProbe.stop();
  *     }
  *
  *     &#64;Test
  *     public void test() throws NCException, IOException {
  *         // Empty parameter.
- *         assertTrue(client.ask("").isFailed());
+ *         assertTrue(cli.ask("").isFailed());
  *
  *         // Only latin charset is supported.
- *         assertTrue(client.ask("El tiempo en España").isFailed());
+ *         assertTrue(cli.ask("El tiempo en España").isFailed());
  *
  *         // Should be passed.
- *         assertTrue(client.ask("Ping me in 3 minutes").isOk());
- *         assertTrue(client.ask("Buzz me in an hour and 15mins").isOk());
- *         assertTrue(client.ask("Set my alarm for 30s").isOk());
+ *         assertTrue(cli.ask("Ping me in 3 minutes").isOk());
+ *         assertTrue(cli.ask("Buzz me in an hour and 15mins").isOk());
+ *         assertTrue(cli.ask("Set my alarm for 30s").isOk());
  *     }
  * }
  * </pre>
diff --git a/src/main/scala/org/apache/nlpcraft/probe/mgrs/conn/NCConnectionManager.scala b/src/main/scala/org/apache/nlpcraft/probe/mgrs/conn/NCConnectionManager.scala
index b200b87..1094b16 100644
--- a/src/main/scala/org/apache/nlpcraft/probe/mgrs/conn/NCConnectionManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/probe/mgrs/conn/NCConnectionManager.scala
@@ -49,30 +49,30 @@ object NCConnectionManager extends NCService {
     private final val PING_TIMEOUT = 5 * 1000
     
     // Internal probe GUID.
-    final val PROBE_GUID = U.genGuid()
+    @volatile private var probeGuid: String = _
     
     // Internal semaphores.
-    private val stopSem: AtomicInteger = new AtomicInteger(1)
+    @volatile private var stopSem: AtomicInteger = _
     
     private final val sysProps: Properties = System.getProperties
     private final val localHost: InetAddress = InetAddress.getLocalHost
-    private var hwAddrs: String = _
+    @volatile private var hwAddrs: String = _
     
     // Holding downlink queue.
-    private val dnLinkQueue = mutable.Queue.empty[Serializable]
+    @volatile private var dnLinkQueue: mutable.Queue[Serializable] = _
     
     // Control thread.
-    private var ctrlThread: Thread = _
-    
+    @volatile private var ctrlThread: Thread = _
+
     private object Config extends NCConfigurable {
         private final val pre = "nlpcraft.probe"
-        
-        val id: String = getString(s"$pre.id")
-        val token: String = getString(s"$pre.token")
-        val upLink: (String, Integer) = getHostPort(s"$pre.upLink")
-        val downLink: (String, Integer) = getHostPort(s"$pre.downLink")
-        val upLinkString = s"${upLink._1}:${upLink._2}"
-        val downLinkString = s"${downLink._1}:${downLink._2}"
+
+        def id: String = getString(s"$pre.id")
+        def token: String = getString(s"$pre.token")
+        def upLink: (String, Integer) = getHostPort(s"$pre.upLink")
+        def downLink: (String, Integer) = getHostPort(s"$pre.downLink")
+        def upLinkString = s"${upLink._1}:${upLink._2}"
+        def downLinkString = s"${downLink._1}:${downLink._2}"
     }
 
     /**
@@ -95,7 +95,7 @@ object NCConnectionManager extends NCService {
             span,
             "probeId" → Config.id,
             "token" → Config.token,
-            "probeGuid" → PROBE_GUID,
+            "probeGuid" → probeGuid,
             "msgType" → msg.getType,
             "msgGuid" → msg.getGuid
         )
@@ -103,7 +103,7 @@ object NCConnectionManager extends NCService {
         // Set probe identification for each message, if necessary.
         msg.setProbeToken(Config.token)
         msg.setProbeId(Config.id)
-        msg.setProbeGuid(PROBE_GUID)
+        msg.setProbeGuid(probeGuid)
     
         dnLinkQueue.synchronized {
             if (!isStopping) {
@@ -141,7 +141,7 @@ object NCConnectionManager extends NCService {
             // Probe identification.
             "PROBE_TOKEN" → Config.token,
             "PROBE_ID" → Config.id,
-            "PROBE_GUID" → PROBE_GUID
+            "PROBE_GUID" → probeGuid
         ), cryptoKey)
     
         val resp = sock.read[NCProbeMessage](cryptoKey) // Get handshake response.
@@ -210,7 +210,7 @@ object NCConnectionManager extends NCService {
                     // Probe identification.
                     "PROBE_TOKEN" → Config.token,
                     "PROBE_ID" → Config.id,
-                    "PROBE_GUID" → PROBE_GUID,
+                    "PROBE_GUID" → probeGuid,
         
                     // Handshake data,
                     "PROBE_API_DATE" → ver.date,
@@ -275,6 +275,10 @@ object NCConnectionManager extends NCService {
     override def start(parent: Span = null): NCService = startScopedSpan("start", parent) { _ ⇒
         require(NCCommandManager.isStarted)
         require(NCModelManager.isStarted)
+
+        probeGuid = U.genGuid()
+        dnLinkQueue = mutable.Queue.empty[Serializable]
+        stopSem = new AtomicInteger(1)
         
         val ctrlLatch = new CountDownLatch(1)
      
@@ -364,7 +368,7 @@ object NCConnectionManager extends NCService {
                     
                                             pingMsg.setProbeToken(Config.token)
                                             pingMsg.setProbeId(Config.id)
-                                            pingMsg.setProbeGuid(PROBE_GUID)
+                                            pingMsg.setProbeGuid(probeGuid)
                     
                                             dnSock.write(pingMsg, cryptoKey)
                                         }
diff --git a/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversationManager.scala b/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversationManager.scala
index 8a857bb..52c1fb8 100644
--- a/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversationManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversationManager.scala
@@ -36,12 +36,13 @@ object NCConversationManager extends NCService {
     private final val CHECK_PERIOD = 5.minutes.toMillis
     private final val TIMEOUT = 1.hour.toMillis
 
-    private final val convs = mutable.HashMap.empty[Key, Value]
+    @volatile private var convs: mutable.Map[Key, Value] = _
 
     @volatile private var gc: ScheduledExecutorService = _
 
     override def start(parent: Span = null): NCService = startScopedSpan("start", parent) { _ ⇒
         gc = Executors.newSingleThreadScheduledExecutor
+        convs = mutable.HashMap.empty[Key, Value]
         
         gc.scheduleWithFixedDelay(() ⇒ clearForTimeout(), CHECK_PERIOD, CHECK_PERIOD, TimeUnit.MILLISECONDS)
         
diff --git a/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala b/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
index 050879a..f6a7e1d 100644
--- a/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
@@ -18,7 +18,7 @@
 package org.apache.nlpcraft.probe.mgrs.deploy
 
 import java.io._
-import java.util.jar.{JarInputStream ⇒ JIS}
+import java.util.jar.{JarInputStream => JIS}
 
 import io.opencensus.trace.Span
 import org.apache.nlpcraft.common._
@@ -39,20 +39,21 @@ import scala.util.control.Exception._
   * Model deployment manager.
   */
 object NCDeployManager extends NCService with DecorateAsScala {
-    private val models = ArrayBuffer.empty[NCModel]
-    private var modelFactory: NCModelFactory = new NCBasicModelFactory
+    @volatile private var models: ArrayBuffer[NCModel] = _
+    @volatile private var modelFactory: NCModelFactory = _
     
     private final val ID_REGEX = "^[_a-zA-Z]+[a-zA-Z0-9:-_]*$"
-    
-    private object Config extends NCConfigurable {
+
+    object Config extends NCConfigurable {
         private final val pre = "nlpcraft.probe"
-        
-        val modelFactoryType: Option[String] = getStringOpt(s"$pre.modelFactory.type")
-        val modelFactoryProps: Option[Map[String, String]] = getMapOpt(s"$pre.modelFactory.properties")
-        val models: Seq[String] = getStringList(s"$pre.models")
-        val jarsFolder: Option[String] = getStringOpt(s"$pre.jarsFolder")
+
+        // It should reload config.
+        def modelFactoryType: Option[String] = getStringOpt(s"$pre.modelFactory.type")
+        def modelFactoryProps: Option[Map[String, String]] = getMapOpt(s"$pre.modelFactory.properties")
+        def models: Seq[String] = getStringList(s"$pre.models")
+        def jarsFolder: Option[String] = getStringOpt(s"$pre.jarsFolder")
     }
-    
+
     /**
       * Gives a list of JAR files at given path.
       * 
@@ -194,6 +195,9 @@ object NCDeployManager extends NCService with DecorateAsScala {
     
     @throws[NCE]
     override def start(parent: Span = null): NCService = startScopedSpan("start", parent) { _ ⇒
+        modelFactory = new NCBasicModelFactory
+        models = ArrayBuffer.empty[NCModel]
+
         // Initialize model factory (if configured).
         Config.modelFactoryType match {
             case Some(mft) ⇒
diff --git a/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala b/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala
index 6b1850d..f04cbbe 100644
--- a/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala
@@ -33,8 +33,8 @@ import scala.concurrent.duration._
 object NCDialogFlowManager extends NCService {
     case class Key(usrId: Long, mdlId: String)
     case class Value(intent: String, tstamp: Long)
-    
-    private val flow = mutable.HashMap.empty[Key, ArrayBuffer[Value]]
+
+    @volatile private var flow: mutable.Map[Key, ArrayBuffer[Value]] = _
     
     // Check frequency and timeout.
     private final val CHECK_PERIOD = 5.minutes.toMillis
@@ -43,6 +43,7 @@ object NCDialogFlowManager extends NCService {
     @volatile private var gc: ScheduledExecutorService = _
     
     override def start(parent: Span = null): NCService = startScopedSpan("start", parent) { _ ⇒
+        flow = mutable.HashMap.empty[Key, ArrayBuffer[Value]]
         gc = Executors.newSingleThreadScheduledExecutor
     
         gc.scheduleWithFixedDelay(() ⇒ clearForTimeout(), CHECK_PERIOD, CHECK_PERIOD, TimeUnit.MILLISECONDS)
diff --git a/src/main/scala/org/apache/nlpcraft/probe/mgrs/lifecycle/NCLifecycleManager.scala b/src/main/scala/org/apache/nlpcraft/probe/mgrs/lifecycle/NCLifecycleManager.scala
index 54ca1ff..4bbf8a4 100644
--- a/src/main/scala/org/apache/nlpcraft/probe/mgrs/lifecycle/NCLifecycleManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/probe/mgrs/lifecycle/NCLifecycleManager.scala
@@ -26,12 +26,12 @@ import org.apache.nlpcraft.model._
   * Lifecycle component manager.
   */
 object NCLifecycleManager extends NCService {
-    private var beans = Seq.empty[NCLifecycle]
-    
-    private object Config extends NCConfigurable {
-        val lifecycle: Seq[String] = getStringList("nlpcraft.probe.lifecycle")
+    @volatile private var beans: Seq[NCLifecycle] = _
+
+    object Config extends NCConfigurable {
+        def lifecycle: Seq[String] = getStringList("nlpcraft.probe.lifecycle")
     }
-    
+
     @throws[NCE]
     override def start(parent: Span = null): NCService = {
         beans = Config.lifecycle.map(U.mkObject(_).asInstanceOf[NCLifecycle])
diff --git a/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala b/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
index dc2e225..a7c470a 100644
--- a/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/probe/mgrs/model/NCModelManager.scala
@@ -43,7 +43,7 @@ object NCModelManager extends NCService with DecorateAsScala {
     private final val TOKENS_PROVIDERS_PREFIXES = Set("nlpcraft:", "google:", "stanford:", "opennlp:", "spacy:")
     
     // Deployed models keyed by their IDs.
-    private val models = mutable.HashMap.empty[String, NCModelDecorator]
+    @volatile private var models: mutable.Map[String, NCModelDecorator] = _
 
     // Access mutex.
     private final val mux = new Object()
@@ -81,6 +81,8 @@ object NCModelManager extends NCService with DecorateAsScala {
 
     @throws[NCE]
     override def start(parent: Span = null): NCService = startScopedSpan("start", parent) { span ⇒
+        models = mutable.HashMap.empty[String, NCModelDecorator]
+
         mux.synchronized {
             NCDeployManager.getModels.foreach(addNewModel)
 
diff --git a/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala b/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
index 69eb11a..4a7243d 100644
--- a/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
@@ -68,22 +68,24 @@ object NCProbeEnrichmentManager extends NCService with NCOpenCensusModelStats {
     // Embedded probe Java callback function.
     private type EMBEDDED_CB = java.util.function.Consumer[NCEmbeddedResult]
 
-    private val embeddedCbs = mutable.HashSet.empty[EMBEDDED_CB]
+    @volatile private var embeddedCbs: mutable.Set[EMBEDDED_CB] = _
 
     private object Config extends NCConfigurable {
         final private val pre = "nlpcraft.probe"
 
-        val id: String = getString(s"$pre.id")
-        val resultMaxSize: Int = getInt(s"$pre.resultMaxSizeBytes")
-    
+        def id: String = getString(s"$pre.id")
+        def resultMaxSize: Int = getInt(s"$pre.resultMaxSizeBytes")
+
         def check(): Unit =
             if (resultMaxSize <= 0)
                 abortWith(s"Value of '$pre.resultMaxSizeBytes' must be positive")
     }
-    
+
     Config.check()
 
     override def start(parent: Span = null): NCService = startScopedSpan("start", parent) { _ ⇒
+        embeddedCbs = mutable.HashSet.empty[EMBEDDED_CB]
+
         super.start()
     }
     
diff --git a/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/validate/NCValidateManager.scala b/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/validate/NCValidateManager.scala
index 2d2a68d..76fc21a 100644
--- a/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/validate/NCValidateManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/validate/NCValidateManager.scala
@@ -29,7 +29,7 @@ import org.apache.nlpcraft.probe.mgrs.NCModelDecorator
  */
 object NCValidateManager extends NCService with LazyLogging {
     // Create new language finder singleton.
-    private var langFinder: OptimaizeLangDetector = _
+    @volatile private var langFinder: OptimaizeLangDetector = _
     
     override def start(parent: Span = null): NCService = startScopedSpan("start", parent) { _ ⇒
         langFinder = new OptimaizeLangDetector()
diff --git a/src/main/scala/org/apache/nlpcraft/server/geo/NCGeoManager.scala b/src/main/scala/org/apache/nlpcraft/server/geo/NCGeoManager.scala
index ba3e75a..1116ec2 100644
--- a/src/main/scala/org/apache/nlpcraft/server/geo/NCGeoManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/geo/NCGeoManager.scala
@@ -37,8 +37,8 @@ object NCGeoManager extends NCService {
     
     // Special file, the data of which are not filtered by common dictionary words.
     private final val SYNONYMS_MANUAL_FILES = Seq("manual.json", "states.json")
-    
-    private var model: NCGeoModel = _
+
+    @volatile private var model: NCGeoModel = _
     
     // Auxiliary words for GEO names. Example: CA state, Los Angeles city.
     private final val CITY_AUX = Seq("city", "town", "metropolis")
diff --git a/src/main/scala/org/apache/nlpcraft/server/lifecycle/NCServerLifecycleManager.scala b/src/main/scala/org/apache/nlpcraft/server/lifecycle/NCServerLifecycleManager.scala
index 24d95b8..3f3b3f1 100644
--- a/src/main/scala/org/apache/nlpcraft/server/lifecycle/NCServerLifecycleManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/lifecycle/NCServerLifecycleManager.scala
@@ -28,8 +28,8 @@ import org.apache.nlpcraft.common.config.NCConfigurable
 object NCServerLifecycleManager extends NCService {
     private object Config extends NCConfigurable {
         private final val prop = "nlpcraft.server.lifecycle"
-        
-        val classes: Seq[String] = getStringList(prop)
+
+        def classes: Seq[String] = getStringList(prop)
         var objects = Seq.empty[NCServerLifecycle]
     
         /**
diff --git a/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCJaegerExporter.scala b/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCJaegerExporter.scala
index 085b484..5394b0c 100644
--- a/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCJaegerExporter.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCJaegerExporter.scala
@@ -26,9 +26,9 @@ import org.apache.nlpcraft.common.config.NCConfigurable
 class NCJaegerExporter extends NCBaseTraceExporter("Jaeger") {
     private object Config extends NCConfigurable {
         private val pre = "nlpcraft.server.opencensus.jaeger"
-        
-        val url = getStringOrElse(s"$pre.thriftUrl", "http://127.0.0.1:14268/api/traces")
-        val svcName = getStringOrElse(s"$pre.serviceName", "nlpcraft-server")
+
+        def url = getStringOrElse(s"$pre.thriftUrl", "http://127.0.0.1:14268/api/traces")
+        def svcName = getStringOrElse(s"$pre.serviceName", "nlpcraft-server")
     }
     
     override def beforeStart(): Unit = {
diff --git a/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCPrometheusExporter.scala b/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCPrometheusExporter.scala
index fbad821..e733ee9 100644
--- a/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCPrometheusExporter.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCPrometheusExporter.scala
@@ -30,10 +30,10 @@ class NCPrometheusExporter extends NCServerLifecycle with LazyLogging {
     private object Config extends NCConfigurable {
         private val pre = "nlpcraft.server.opencensus.prometheus"
         private val hostPort = getHostPortOrElse(s"$pre.hostPort", "localhost", 8888)
-        
-        val namespace = getStringOrElse(s"$pre.namespace", "nlpcraft-server")
-        val host = hostPort._1
-        val port = hostPort._2
+
+        def namespace = getStringOrElse(s"$pre.namespace", "nlpcraft-server")
+        def host = hostPort._1
+        def port = hostPort._2
     }
     
     override def beforeStart(): Unit = {
diff --git a/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCStackdriverStatsExporter.scala b/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCStackdriverStatsExporter.scala
index 16fe7b9..4c00a08 100644
--- a/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCStackdriverStatsExporter.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCStackdriverStatsExporter.scala
@@ -32,8 +32,8 @@ class NCStackdriverStatsExporter extends NCServerLifecycle with LazyLogging {
     private val pre = "nlpcraft.server.opencensus.stackdriver"
     
     private object Config extends NCConfigurable {
-        val gpi = getString(s"$pre.googleProjectId")
-        val prefix = getStringOrElse(s"$pre.metricsPrefix", "custom.googleapis.com/nlpcraft/server")
+        def gpi = getString(s"$pre.googleProjectId")
+        def prefix = getStringOrElse(s"$pre.metricsPrefix", "custom.googleapis.com/nlpcraft/server")
     }
     
     override def beforeStart(): Unit = {
diff --git a/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCStackdriverTraceExporter.scala b/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCStackdriverTraceExporter.scala
index d38473e..3e6bf6c 100644
--- a/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCStackdriverTraceExporter.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCStackdriverTraceExporter.scala
@@ -30,7 +30,7 @@ class NCStackdriverTraceExporter extends NCBaseTraceExporter("Stackdriver") {
     private val pre = "nlpcraft.server.opencensus.stackdriver"
     
     private object Config extends NCConfigurable {
-        val gpi = getString(s"$pre.googleProjectId")
+        def gpi = getString(s"$pre.googleProjectId")
     }
     
     override def beforeStart(): Unit = {
diff --git a/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCZipkinExporter.scala b/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCZipkinExporter.scala
index 6104b1b..27c59aa 100644
--- a/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCZipkinExporter.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/lifecycle/opencensus/NCZipkinExporter.scala
@@ -26,11 +26,11 @@ import org.apache.nlpcraft.common.config.NCConfigurable
 class NCZipkinExporter extends NCBaseTraceExporter("Zipkin") {
     private object Config extends NCConfigurable {
         private val pre = "nlpcraft.server.opencensus.zipkin"
-        
-        val url = getStringOrElse(s"$pre.v2Url", "http://127.0.0.1:9411/api/v2/spans")
-        val svcName = getStringOrElse(s"$pre.serviceName", "nlpcraft-server")
+
+        def url = getStringOrElse(s"$pre.v2Url", "http://127.0.0.1:9411/api/v2/spans")
+        def svcName = getStringOrElse(s"$pre.serviceName", "nlpcraft-server")
     }
-    
+
     override def beforeStart(): Unit = {
         ZipkinTraceExporter.createAndRegister(ZipkinExporterConfiguration.
             builder().
diff --git a/src/main/scala/org/apache/nlpcraft/server/nlp/core/NCNlpServerManager.scala b/src/main/scala/org/apache/nlpcraft/server/nlp/core/NCNlpServerManager.scala
index b2ab86b..aad5d8e 100644
--- a/src/main/scala/org/apache/nlpcraft/server/nlp/core/NCNlpServerManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/nlp/core/NCNlpServerManager.scala
@@ -20,7 +20,7 @@ package org.apache.nlpcraft.server.nlp.core
 import io.opencensus.trace.Span
 import org.apache.nlpcraft.common.config.NCConfigurable
 import org.apache.nlpcraft.common.nlp.core.NCNlpCoreManager
-import org.apache.nlpcraft.common.{NCE, NCService, _}
+import org.apache.nlpcraft.common.{NCService, _}
 
 import scala.collection.Seq
 
@@ -34,8 +34,8 @@ object NCNlpServerManager extends NCService {
     private object Config extends NCConfigurable {
         private final val TOKEN_PROVIDERS = Set("nlpcraft", "google", "stanford", "opennlp", "spacy")
         private final val prop = "nlpcraft.server.tokenProviders"
-        
-        val tokenProviders: Seq[String] = getStringList(prop)
+
+        def tokenProviders: Seq[String] = getStringList(prop)
 
         def support(name: String): Boolean = tokenProviders.contains(name)
     
diff --git a/src/main/scala/org/apache/nlpcraft/server/nlp/core/spacy/NCSpaCyNerEnricher.scala b/src/main/scala/org/apache/nlpcraft/server/nlp/core/spacy/NCSpaCyNerEnricher.scala
index b01c596..740e095 100644
--- a/src/main/scala/org/apache/nlpcraft/server/nlp/core/spacy/NCSpaCyNerEnricher.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/nlp/core/spacy/NCSpaCyNerEnricher.scala
@@ -52,7 +52,7 @@ object NCSpaCyNerEnricher extends NCService with NCNlpNerEnricher with NCIgniteI
     private implicit val fmt: RootJsonFormat[SpacySpan] = jsonFormat7(SpacySpan)
     
     private object Config extends NCConfigurable {
-        val proxyUrl = getStringOrElse("nlpcraft.server.spacy.proxy.url", "http://localhost:5002")
+        def proxyUrl = getStringOrElse("nlpcraft.server.spacy.proxy.url", "http://localhost:5002")
     }
 
     // NOTE: property 'vector' represented as string because Python JSON serialization requirements.
diff --git a/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordCoreManager.scala b/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordCoreManager.scala
index 0b8a61a..7dd2581 100644
--- a/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordCoreManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/nlp/core/stanford/NCStanfordCoreManager.scala
@@ -32,7 +32,7 @@ import scala.util.control.Exception.catching
   * Stanford core manager.
   */
 object NCStanfordCoreManager extends NCService with NCIgniteInstance {
-    private var stanford: StanfordCoreNLP = _
+    @volatile private var stanford: StanfordCoreNLP = _
     @volatile private var cache: IgniteCache[String, CoreDocument] = _
 
     /**
diff --git a/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala b/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
index 295a8f2..0fd6bb1 100644
--- a/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/NCServerEnrichmentManager.scala
@@ -43,7 +43,7 @@ import scala.util.control.Exception.catching
   */
 object NCServerEnrichmentManager extends NCService with NCIgniteInstance {
     private object Config extends NCConfigurable {
-        val supportNlpCraft: Boolean = getStringList("nlpcraft.server.tokenProviders").contains("nlpcraft")
+        def supportNlpCraft: Boolean = getStringList("nlpcraft.server.tokenProviders").contains("nlpcraft")
     }
 
     private final val CUSTOM_PREFIXES = Set("google:", "opennlp:", "stanford:", "spacy:")
diff --git a/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala b/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
index 5908f1a..55b2805 100644
--- a/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/nlp/enrichers/date/NCDateEnricher.scala
@@ -38,7 +38,7 @@ import scala.collection.mutable.{LinkedHashMap ⇒ LHM}
   */
 object NCDateEnricher extends NCServerEnricher {
     private object Config extends NCConfigurable {
-        val style: NCDateFormatType = getObject("nlpcraft.server.datesFormatStyle", NCDateFormatType.withName)
+        def style: NCDateFormatType = getObject("nlpcraft.server.datesFormatStyle", NCDateFormatType.withName)
     }
 
     private type LHM_SS = LHM[String, String]
diff --git a/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala b/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
index f50ffb5..28b7407 100644
--- a/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
@@ -54,19 +54,22 @@ object NCProbeManager extends NCService {
     // Type safe and eager configuration container.
     private[probe] object Config extends NCConfigurable {
         final private val pre = "nlpcraft.server.probe"
-        
-        val (dnHost, dnPort) = getHostPort(s"$pre.links.downLink")
-        val (upHost, upPort) = getHostPort(s"$pre.links.upLink")
-        
-        val poolSize: Int = getInt(s"$pre.poolSize")
-        val reconnectTimeoutMs: Long = getLong(s"$pre.reconnectTimeoutMs")
-        val pingTimeoutMs: Long = getLong(s"$pre.pingTimeoutMs")
-        val soTimeoutMs: Int = getInt(s"$pre.soTimeoutMs")
+
+        def getDnHostPort = getHostPort(s"$pre.links.downLink")
+        def getUpHostPort = getHostPort(s"$pre.links.upLink")
+
+        def poolSize: Int = getInt(s"$pre.poolSize")
+        def reconnectTimeoutMs: Long = getLong(s"$pre.reconnectTimeoutMs")
+        def pingTimeoutMs: Long = getLong(s"$pre.pingTimeoutMs")
+        def soTimeoutMs: Int = getInt(s"$pre.soTimeoutMs")
     
         /**
           *
           */
         def check(): Unit = {
+            val (_, dnPort) =  getDnHostPort
+            val (_, upPort) =  getUpHostPort
+
             if (!(dnPort >= 0 && dnPort <= 65535))
                 abortWith(s"Configuration property '$pre.links.upLink' must be >= 0 and <= 65535: $dnPort")
             if (!(upPort >= 0 && upPort <= 65535))
@@ -127,10 +130,10 @@ object NCProbeManager extends NCService {
     private var pingSrv: Thread = _
     
     // All known probes keyed by probe key.
-    private val probes = mutable.HashMap.empty[ProbeKey, ProbeHolder]
-    private val mdls = mutable.HashMap.empty[String, NCProbeModelMdo]
+    private var probes: mutable.Map[ProbeKey, ProbeHolder] = _
+    private var mdls: mutable.Map[String, NCProbeModelMdo] = _
     // All probes pending complete handshake keyed by probe key.
-    private val pending = mutable.HashMap.empty[ProbeKey, ProbeHolder]
+    private var pending: mutable.Map[ProbeKey, ProbeHolder] = _
     
     private var pool: ExecutorService = _
     private var isStopping: AtomicBoolean = _
@@ -140,17 +143,25 @@ object NCProbeManager extends NCService {
       * @return
       */
     override def start(parent: Span = null): NCService = startScopedSpan("start", parent) { span ⇒
+        probes = mutable.HashMap.empty[ProbeKey, ProbeHolder]
+        mdls = mutable.HashMap.empty[String, NCProbeModelMdo]
+        pending = mutable.HashMap.empty[ProbeKey, ProbeHolder]
+
+        val (dnHost, dnPort) = Config.getDnHostPort
+        val (upHost, upPort) =  Config.getUpHostPort
+
+
         addTags(span,
-            "uplink" → s"${Config.upHost}:${Config.upPort}",
-            "downlink" → s"${Config.dnHost}:${Config.dnPort}"
+            "uplink" → s"$upHost:$upPort",
+            "downlink" → s"$dnHost:$dnPort"
         )
     
         isStopping = new AtomicBoolean(false)
         
         pool = Executors.newFixedThreadPool(Config.poolSize)
         
-        dnSrv = startServer("Downlink", Config.dnHost, Config.dnPort, downLinkHandler)
-        upSrv = startServer("Uplink", Config.upHost, Config.upPort, upLinkHandler)
+        dnSrv = startServer("Downlink", dnHost, dnPort, downLinkHandler)
+        upSrv = startServer("Uplink", upHost, upPort, upLinkHandler)
         
         dnSrv.start()
         upSrv.start()
diff --git a/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala b/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
index fa87ec5..298ff8b 100644
--- a/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
@@ -46,11 +46,13 @@ object NCQueryManager extends NCService with NCIgniteInstance with NCOpenCensusS
     @volatile private var cache: IgniteCache[String/*Server request ID*/, NCQueryStateMdo] = _
     
     // Promises cannot be used in cache.
-    private val asyncAsks = new ConcurrentHashMap[String/*Server request ID*/, Promise[NCQueryStateMdo]]()
+    @volatile private var asyncAsks: ConcurrentHashMap[String, Promise[NCQueryStateMdo]] = _
     
     private final val MAX_WORDS = 100
     
     override def start(parent: Span = null): NCService = startScopedSpan("start", parent) { _ ⇒
+        asyncAsks = new ConcurrentHashMap[String/*Server request ID*/, Promise[NCQueryStateMdo]]()
+
         catching(wrapIE) {
             cache = ignite.cache[String/*Server request ID*/, NCQueryStateMdo]("qry-state-cache")
     
diff --git a/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala b/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala
index 140fae0..54c9c67 100644
--- a/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/rest/NCRestManager.scala
@@ -43,9 +43,9 @@ object NCRestManager extends NCService {
     private final object Config extends NCConfigurable {
         final private val pre = "nlpcraft.server.rest"
 
-        val host: String = getString(s"$pre.host")
-        val port: Int = getInt(s"$pre.port")
-        val apiImpl: String = getString(s"$pre.apiImpl")
+        def host: String = getString(s"$pre.host")
+        def port: Int = getInt(s"$pre.port")
+        def apiImpl: String = getString(s"$pre.apiImpl")
     
         /**
           *
diff --git a/src/main/scala/org/apache/nlpcraft/server/sql/NCSql.scala b/src/main/scala/org/apache/nlpcraft/server/sql/NCSql.scala
index 4419bac..9b4444b 100644
--- a/src/main/scala/org/apache/nlpcraft/server/sql/NCSql.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/sql/NCSql.scala
@@ -58,16 +58,16 @@ object NCSql extends LazyLogging {
     // Type safe and eager settings container.
     private object Config extends NCConfigurable {
         final private val pre = "nlpcraft.server.database"
-        
-        val url: String = getString(s"$pre.jdbc.url")
-        val driver: String = getString(s"$pre.jdbc.driver")
-        val username: Option[String] = getStringOpt(s"$pre.jdbc.username")
-        val passwd: Option[String] = getStringOpt(s"$pre.jdbc.password")
-        val maxStmt: Int = getInt(s"$pre.c3p0.maxStatements")
-        val initPoolSize: Int = getInt(s"$pre.c3p0.pool.initSize")
-        val minPoolSize: Int = getInt(s"$pre.c3p0.pool.minSize")
-        val maxPoolSize: Int = getInt(s"$pre.c3p0.pool.maxSize")
-        val acqInc: Int = getInt(s"$pre.c3p0.pool.acquireIncrement")
+
+        def url: String = getString(s"$pre.jdbc.url")
+        def driver: String = getString(s"$pre.jdbc.driver")
+        def username: Option[String] = getStringOpt(s"$pre.jdbc.username")
+        def passwd: Option[String] = getStringOpt(s"$pre.jdbc.password")
+        def maxStmt: Int = getInt(s"$pre.c3p0.maxStatements")
+        def initPoolSize: Int = getInt(s"$pre.c3p0.pool.initSize")
+        def minPoolSize: Int = getInt(s"$pre.c3p0.pool.minSize")
+        def maxPoolSize: Int = getInt(s"$pre.c3p0.pool.maxSize")
+        def acqInc: Int = getInt(s"$pre.c3p0.pool.acquireIncrement")
     
         /**
           *
diff --git a/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala b/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala
index c36800a..029da00 100644
--- a/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/sql/NCSqlManager.scala
@@ -46,7 +46,7 @@ object NCSqlManager extends NCService with NCIgniteInstance {
     )
     
     private object Config extends NCConfigurable {
-        val init: Boolean = getBoolOpt("nlpcraft.server.database.igniteDbInitialize").getOrElse(false)
+        def init: Boolean = getBoolOpt("nlpcraft.server.database.igniteDbInitialize").getOrElse(false)
     }
 
     @volatile private var usersPropsSeq: IgniteAtomicSequence = _
diff --git a/src/main/scala/org/apache/nlpcraft/server/tx/NCTxManager.scala b/src/main/scala/org/apache/nlpcraft/server/tx/NCTxManager.scala
index cc72b90..c368717 100644
--- a/src/main/scala/org/apache/nlpcraft/server/tx/NCTxManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/tx/NCTxManager.scala
@@ -37,8 +37,8 @@ import scala.util.control.Exception.catching
 object NCTxManager extends NCService with NCIgniteInstance {
     // Internal log switch.
     private final val LOG_TX = false
-    
-    private val cons = mutable.HashMap.empty[IgniteUuid, Connection]
+
+    @volatile private var cons: mutable.Map[IgniteUuid, Connection] = _
     
     /**
       * 
@@ -61,6 +61,7 @@ object NCTxManager extends NCService with NCIgniteInstance {
       * Starts this component.
       */
     override def start(parent: Span = null): NCService = startScopedSpan("start", parent) { _ ⇒
+        cons = mutable.HashMap.empty[IgniteUuid, Connection]
         itx = ignite.transactions()
 
         super.start()
diff --git a/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala b/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
index 2af49db..1f9da3a 100644
--- a/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
+++ b/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
@@ -63,12 +63,12 @@ object NCUserManager extends NCService with NCIgniteInstance {
     private object Config extends NCConfigurable {
         final private val pre = "nlpcraft.server.user"
 
-        val pwdPoolBlowup: Int = getInt(s"$pre.pwdPoolBlowup")
-        val timeoutScannerFreqMins: Int = getInt(s"$pre.timeoutScannerFreqMins")
-        val accessTokenExpireTimeoutMins: Int = getInt(s"$pre.accessTokenExpireTimeoutMins")
+        def pwdPoolBlowup: Int = getInt(s"$pre.pwdPoolBlowup")
+        def timeoutScannerFreqMins: Int = getInt(s"$pre.timeoutScannerFreqMins")
+        def accessTokenExpireTimeoutMins: Int = getInt(s"$pre.accessTokenExpireTimeoutMins")
 
-        lazy val scannerMs: Int = timeoutScannerFreqMins * 60 * 1000
-        lazy val expireMs: Int = accessTokenExpireTimeoutMins * 60 * 1000
+        def scannerMs: Int = timeoutScannerFreqMins * 60 * 1000
+        def expireMs: Int = accessTokenExpireTimeoutMins * 60 * 1000
 
         /**
           *
diff --git a/src/test/scala/org/apache/nlpcraft/model/intent/dsl/NCDslTest.java b/src/test/scala/org/apache/nlpcraft/model/intent/dsl/NCDslTest.java
index 8ea9cba..4934ca1 100644
--- a/src/test/scala/org/apache/nlpcraft/model/intent/dsl/NCDslTest.java
+++ b/src/test/scala/org/apache/nlpcraft/model/intent/dsl/NCDslTest.java
@@ -43,7 +43,8 @@ class NCDslTest {
 
     @AfterEach
     void tearDown() throws NCException, IOException {
-        cli.close();
+        if (cli != null)
+            cli.close();
     
         NCEmbeddedProbe.stop();
     }
diff --git a/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModelSpec.java b/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModelSpec.java
index f95ae31..90ba5a2 100644
--- a/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModelSpec.java
+++ b/src/test/scala/org/apache/nlpcraft/models/stm/NCStmTestModelSpec.java
@@ -17,13 +17,14 @@
 
 package org.apache.nlpcraft.models.stm;
 
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
 import org.apache.nlpcraft.common.NCException;
 import org.apache.nlpcraft.model.tools.test.NCTestClient;
 import org.apache.nlpcraft.model.tools.test.NCTestClientBuilder;
 import org.apache.nlpcraft.model.tools.test.NCTestResult;
+import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 import java.io.IOException;
 
@@ -34,18 +35,23 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  * Server and probe with deployed org.apache.nlpcraft.models.stm.NCStmTestModel should be started before.
  */
 class NCStmTestModelSpec {
-    private NCTestClient client;
+    private NCTestClient cli;
     
     @BeforeEach
     void setUp() throws NCException, IOException {
-        client = new NCTestClientBuilder().newBuilder().build();
+        NCEmbeddedProbe.start(NCStmTestModel.class);
+
+        cli = new NCTestClientBuilder().newBuilder().build();
         
-        client.open("nlpcraft.stm.test"); // See phone_model.json
+        cli.open("nlpcraft.stm.test"); // See phone_model.json
     }
     
     @AfterEach
     void tearDown() throws NCException, IOException {
-        client.close();
+        if (cli != null)
+            cli.close();
+
+        NCEmbeddedProbe.stop();
     }
     
     /**
@@ -54,7 +60,7 @@ class NCStmTestModelSpec {
      * @throws IOException
      */
     private void check(String req, String expResp) throws IOException {
-        NCTestResult res = client.ask(req);
+        NCTestResult res = cli.ask(req);
     
         assertTrue(res.isOk());
         assertTrue(res.getResult().isPresent());