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/09/09 01:02:09 UTC

[incubator-nlpcraft] 02/02: Refactoring WIP.

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

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

commit 0a43b55e8577bd67931ae335a774a932ba1a47f9
Author: Aaron Radzinski <ar...@datalingvo.com>
AuthorDate: Tue Sep 8 18:01:52 2020 -0700

    Refactoring WIP.
---
 .../org/apache/nlpcraft/common/NCService.scala     |   4 +-
 .../org/apache/nlpcraft/server/NCServer.scala      |   6 +-
 .../server/inspection/NCInspectionManager.scala    | 109 -------
 .../nlpcraft/server/probe/NCProbeManager.scala     |  47 ++-
 .../nlpcraft/server/rest/NCBasicRestApi.scala      | 350 +++++++++------------
 .../NCSuggestSynonymManager.scala}                 | 125 +++++---
 .../server/sugsyn/NCSuggestSynonymResult.scala     |  34 ++
 7 files changed, 294 insertions(+), 381 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
index 3d9211b..8d97b1f 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
@@ -52,7 +52,7 @@ abstract class NCService extends LazyLogging with NCOpenCensusTrace {
 
         val dur = s"[${currentTime - startMs}ms]"
 
-        logger.info(s"$clsName started $dur")
+        logger.info(s"+$clsName started $dur")
         
         addTags(currentSpan(),
             "startDurationMs" → (currentTime - startMs), "state" → started
@@ -74,6 +74,6 @@ abstract class NCService extends LazyLogging with NCOpenCensusTrace {
             "state" → started
         )
 
-        logger.info(s"$clsName stopped.")
+        logger.info(s"-$clsName stopped.")
     }
 }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala
index 81cd5a8..27e5714 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/NCServer.scala
@@ -34,7 +34,6 @@ import org.apache.nlpcraft.server.company.NCCompanyManager
 import org.apache.nlpcraft.server.feedback.NCFeedbackManager
 import org.apache.nlpcraft.server.geo.NCGeoManager
 import org.apache.nlpcraft.server.ignite.{NCIgniteInstance, NCIgniteRunner}
-import org.apache.nlpcraft.server.inspection.NCInspectionManager
 import org.apache.nlpcraft.server.lifecycle.NCServerLifecycleManager
 import org.apache.nlpcraft.server.nlp.core.NCNlpServerManager
 import org.apache.nlpcraft.server.nlp.enrichers.NCServerEnrichmentManager
@@ -46,6 +45,7 @@ import org.apache.nlpcraft.server.proclog.NCProcessLogManager
 import org.apache.nlpcraft.server.query.NCQueryManager
 import org.apache.nlpcraft.server.rest.NCRestManager
 import org.apache.nlpcraft.server.sql.NCSqlManager
+import org.apache.nlpcraft.server.sugsyn.NCSuggestSynonymManager
 import org.apache.nlpcraft.server.tx.NCTxManager
 import org.apache.nlpcraft.server.user.NCUserManager
 
@@ -123,7 +123,7 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
                 },
                 () ⇒ {
                     NCProbeManager.start(span)
-                    NCInspectionManager.start(span)
+                    NCSuggestSynonymManager.start(span)
                 },
                 () ⇒ NCFeedbackManager.start(span)
             )
@@ -148,7 +148,7 @@ object NCServer extends App with NCIgniteInstance with LazyLogging with NCOpenCe
                 NCRestManager,
                 NCQueryManager,
                 NCFeedbackManager,
-                NCInspectionManager,
+                NCSuggestSynonymManager,
                 NCProbeManager,
                 NCCompanyManager,
                 NCUserManager,
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/inspection/NCInspectionManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/inspection/NCInspectionManager.scala
deleted file mode 100644
index cff52c7..0000000
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/inspection/NCInspectionManager.scala
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.nlpcraft.server.inspection
-
-import io.opencensus.trace.Span
-import org.apache.nlpcraft.common.NCService
-import org.apache.nlpcraft.common.inspections.impl.{NCInspectionImpl, NCInspectionParameterImpl}
-import org.apache.nlpcraft.common.inspections.{NCInspection, NCInspectionResult, NCInspectionService}
-import org.apache.nlpcraft.server.inspection.impl.NCSuggestionInspection
-import org.apache.nlpcraft.server.probe.NCProbeManager
-
-import scala.collection.Map
-import scala.concurrent.Future
-
-/**
- * Server-side inspection manager.
- */
-object NCInspectionManager extends NCService {
-    private final val ALL_INSPECTIONS: Seq[NCInspection] = Seq(
-        NCInspectionImpl(
-            name = "macros",
-            synopsis = "macros",
-            parameters = Seq.empty,
-            description = "macros",
-            isServerSide = false
-        ),
-        NCInspectionImpl(
-            name = "intents",
-            synopsis = "intents",
-            parameters = Seq.empty,
-            description = "intents",
-            isServerSide = false
-        ),
-        NCInspectionImpl(
-            name = "synonyms",
-            synopsis = "synonyms",
-            parameters = Seq.empty,
-            description = "synonyms",
-            isServerSide = false
-        ),
-        NCInspectionImpl(
-            name = "suggestions",
-            synopsis = "suggestions",
-            parameters = Seq(
-                NCInspectionParameterImpl(
-                    name = "minScore",
-                    value = "minScore",
-                    valueType = "double",
-                    synopsis = "minScore, range  between 0 and 1",
-                    description = "minScore"
-                )
-            ),
-            description = "suggestions",
-            isServerSide = true
-        )
-    )
-
-    private final val SRV_INSPECTIONS = Map[String, NCInspectionService](
-        "suggestions" → NCSuggestionInspection
-    )
-
-    override def start(parent: Span): NCService = startScopedSpan("start", parent) { _ ⇒
-        SRV_INSPECTIONS.values.foreach(_.start())
-
-        super.start(parent)
-    }
-
-    override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { _ ⇒
-        super.stop()
-
-        SRV_INSPECTIONS.values.foreach(_.stop(parent))
-    }
-
-    /**
-     *
-     * @param mdlId Model ID.
-     * @param inspName Inspection name.
-     * @param args Inspection arguments .
-     * @param parent Optional parent trace span.
-     */
-    def inspect(mdlId: String, inspName: String, args: Option[String], parent: Span = null): Future[NCInspectionResult] =
-        SRV_INSPECTIONS.get(inspName) match {
-            case Some(insp) ⇒ insp.inspect(mdlId, inspName, args, parent)
-            case None ⇒ NCProbeManager.runInspection(mdlId, inspName, args, parent)
-        }
-
-    /**
-     * Gets all supported server and probe inspections.
-     *
-     * @param parent
-     * @return
-     */
-    def allInspections(parent: Span = null): Seq[NCInspection] = ALL_INSPECTIONS
-}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
index 94d2b1f..5f80a05 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/probe/NCProbeManager.scala
@@ -906,23 +906,50 @@ object NCProbeManager extends NCService {
             }
         }
     }
-    
+
     /**
-      * Gets all active probes.
-      *
-      * @param compId
-      * @param parent Optional parent span.
-      */
+     *
+     * @param compId
+     * @return
+     */
+    private def getCompany(compId: Long): NCCompanyMdo =
+        NCCompanyManager.getCompany(compId).getOrElse(throw new NCE(s"Company mot found: $compId"))
+
+    /**
+     * Gets all active probes.
+     *
+     * @param compId Company ID for authentication purpose.
+     * @param parent Optional parent span.
+     */
     @throws[NCE]
     def getAllProbes(compId: Long, parent: Span = null): Seq[NCProbeMdo] =
         startScopedSpan("getAllProbes", parent, "compId" → compId) { _ ⇒
-            val comp = NCCompanyManager.getCompany(compId).getOrElse(throw new NCE(s"Company mot found: $compId"))
+            val authTok = getCompany(compId).authToken
          
             probes.synchronized {
-                probes.filter(_._1.probeToken == comp.authToken).values
-            }.map(_.probe).toSeq
+                probes.filter(_._1.probeToken == authTok).values
+            }
+            .map(_.probe)
+            .toSeq
         }
-    
+
+    /**
+     * Checks whether or not a data probe exists for given model.
+     *
+     * @param compId Company ID for authentication purpose.
+     * @param mdlId Model ID.
+     * @param parent Optional parent span.
+     * @return
+     */
+    def existsForModel(compId: Long, mdlId: String, parent: Span = null): Boolean =
+        startScopedSpan("existsForModel", parent, "compId" → compId, "mdlId" -> mdlId) { _ ⇒
+            val authTok = getCompany(compId).authToken
+
+            probes.synchronized {
+                probes.filter(_._1.probeToken == authTok).values.exists(_.probe.models.exists(_.id == mdlId))
+            }
+        }
+
     /**
       *
       * @param usrId User ID.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
index af39112..d4c3cbe 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/rest/NCBasicRestApi.scala
@@ -34,11 +34,11 @@ import org.apache.nlpcraft.common.{NCE, NCException, U}
 import org.apache.nlpcraft.server.apicodes.NCApiStatusCode.{API_OK, _}
 import org.apache.nlpcraft.server.company.NCCompanyManager
 import org.apache.nlpcraft.server.feedback.NCFeedbackManager
-import org.apache.nlpcraft.server.inspection.NCInspectionManager
 import org.apache.nlpcraft.server.mdo.{NCQueryStateMdo, NCUserMdo}
 import org.apache.nlpcraft.server.opencensus.NCOpenCensusServerStats
 import org.apache.nlpcraft.server.probe.NCProbeManager
 import org.apache.nlpcraft.server.query.NCQueryManager
+import org.apache.nlpcraft.server.sugsyn.NCSuggestSynonymManager
 import org.apache.nlpcraft.server.user.NCUserManager
 import spray.json.DefaultJsonProtocol._
 import spray.json.{JsObject, JsValue, RootJsonFormat}
@@ -88,7 +88,6 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
     private final val STD_FIELD_LENGTHS = Map[String, Int](
         "acsTok" -> 256,
         "mdlId" -> 32,
-        "inspName" -> 32,
         "userExtId" -> 64,
         "extId" -> 64,
         "name" -> 64,
@@ -408,19 +407,19 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def signin$(): Route = {
-        case class Req_Signin$(
+        case class Req$Signin$(
             email: String,
             passwd: String
         )
-        case class Res_Signin$(
+        case class Res$Signin$(
             status: String,
             acsTok: String
         )
-        implicit val reqFmt: RootJsonFormat[Req_Signin$] = jsonFormat2(Req_Signin$)
-        implicit val resFmt: RootJsonFormat[Res_Signin$] = jsonFormat2(Res_Signin$)
+        implicit val reqFmt: RootJsonFormat[Req$Signin$] = jsonFormat2(Req$Signin$)
+        implicit val resFmt: RootJsonFormat[Res$Signin$] = jsonFormat2(Res$Signin$)
 
         // NOTE: no authentication requires on signin.
-        entity(as[Req_Signin$]) { req ⇒
+        entity(as[Req$Signin$]) { req ⇒
             startScopedSpan("signin$", "email" → req.email) { span ⇒
                 checkLength("email" -> req.email, "passwd" -> req.passwd)
 
@@ -431,7 +430,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 ) match {
                     case None ⇒ throw SignInFailure(req.email) // Email is unknown (user hasn't signed up).
                     case Some(acsTkn) ⇒ complete {
-                        Res_Signin$(API_OK, acsTkn)
+                        Res$Signin$(API_OK, acsTkn)
                     }
                 }
             }
@@ -443,12 +442,12 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
      * @return
      */
     protected def health$(): Route = {
-        case class Res_Health$(status: String)
+        case class Res$Health$(status: String)
 
-        implicit val resFmt: RootJsonFormat[Res_Health$] = jsonFormat1(Res_Health$)
+        implicit val resFmt: RootJsonFormat[Res$Health$] = jsonFormat1(Res$Health$)
 
         complete {
-            Res_Health$(API_OK)
+            Res$Health$(API_OK)
         }
     }
 
@@ -457,17 +456,17 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def signout$(): Route = {
-        case class Req_Signout$(
+        case class Req$Signout$(
             acsTok: String
         )
-        case class Res_Signout$(
+        case class Res$Signout$(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Signout$] = jsonFormat1(Req_Signout$)
-        implicit val resFmt: RootJsonFormat[Res_Signout$] = jsonFormat1(Res_Signout$)
+        implicit val reqFmt: RootJsonFormat[Req$Signout$] = jsonFormat1(Req$Signout$)
+        implicit val resFmt: RootJsonFormat[Res$Signout$] = jsonFormat1(Res$Signout$)
 
-        entity(as[Req_Signout$]) { req ⇒
+        entity(as[Req$Signout$]) { req ⇒
             startScopedSpan("signout$", "acsTok" → req.acsTok) { span ⇒
                 checkLength("acsTok" -> req.acsTok)
 
@@ -476,7 +475,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 NCUserManager.signout(req.acsTok, span)
 
                 complete {
-                    Res_Signout$(API_OK)
+                    Res$Signout$(API_OK)
                 }
             }
         }
@@ -587,7 +586,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def ask$(): Route = {
-        case class Req_Ask$(
+        case class Req$Ask$(
             acsTok: String,
             usrId: Option[Long],
             usrExtId: Option[String],
@@ -596,15 +595,15 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             data: Option[spray.json.JsValue],
             enableLog: Option[Boolean]
         )
-        case class Res_Ask$(
+        case class Res$Ask$(
             status: String,
             srvReqId: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Ask$] = jsonFormat7(Req_Ask$)
-        implicit val resFmt: RootJsonFormat[Res_Ask$] = jsonFormat2(Res_Ask$)
+        implicit val reqFmt: RootJsonFormat[Req$Ask$] = jsonFormat7(Req$Ask$)
+        implicit val resFmt: RootJsonFormat[Res$Ask$] = jsonFormat2(Res$Ask$)
 
-        entity(as[Req_Ask$]) { req ⇒
+        entity(as[Req$Ask$]) { req ⇒
             startScopedSpan(
                 "ask$",
                 "usrId" → req.usrId.getOrElse(-1),
@@ -638,7 +637,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                         )
 
                         complete {
-                            Res_Ask$(API_OK, newSrvReqId)
+                            Res$Ask$(API_OK, newSrvReqId)
                         }
                     }
                 }
@@ -651,20 +650,20 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def cancel$(): Route = {
-        case class Req_Cancel$(
+        case class Req$Cancel$(
             acsTok: String,
             usrId: Option[Long],
             usrExtId: Option[String],
             srvReqIds: Option[Set[String]]
         )
-        case class Res_Cancel$(
+        case class Res$Cancel$(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Cancel$] = jsonFormat4(Req_Cancel$)
-        implicit val resFmt: RootJsonFormat[Res_Cancel$] = jsonFormat1(Res_Cancel$)
+        implicit val reqFmt: RootJsonFormat[Req$Cancel$] = jsonFormat4(Req$Cancel$)
+        implicit val resFmt: RootJsonFormat[Res$Cancel$] = jsonFormat1(Res$Cancel$)
 
-        entity(as[Req_Cancel$]) { req ⇒
+        entity(as[Req$Cancel$]) { req ⇒
             startScopedSpan("cancel$",
                 "acsTok" → req.acsTok,
                 "usrId" → req.usrId.getOrElse(-1),
@@ -679,7 +678,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 NCQueryManager.cancelForServerRequestIds(srvReqs.map(_.srvReqId), span)
 
                 complete {
-                    Res_Cancel$(API_OK)
+                    Res$Cancel$(API_OK)
                 }
             }
         }
@@ -690,7 +689,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def check$(): Route = {
-        case class Req_Check$(
+        case class Req$Check$(
             acsTok: String,
             usrId: Option[Long],
             usrExtId: Option[String],
@@ -698,9 +697,9 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             maxRows: Option[Int]
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Check$] = jsonFormat5(Req_Check$)
+        implicit val reqFmt: RootJsonFormat[Req$Check$] = jsonFormat5(Req$Check$)
 
-        entity(as[Req_Check$]) { req ⇒
+        entity(as[Req$Check$]) { req ⇒
             startScopedSpan(
                 "check$",
                 "usrId" → req.usrId.getOrElse(-1),
@@ -746,22 +745,20 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
 
             val acsTok: String = convert(obj, "acsTok", (js: JsValue) ⇒ js.convertTo[String])
             val mdlId: String = convert(obj, "mdlId", (js: JsValue) ⇒ js.convertTo[String])
-            val inspName: String = convert(obj, "inspName", (js: JsValue) ⇒ js.convertTo[String])
             val args: Option[String] = convertOpt(obj, "args", v ⇒ v.compactPrint)
 
-            startScopedSpan("modelEnhance$", "mdlId" → mdlId, "acsTok" → acsTok) { span ⇒
+            startScopedSpan("sugsyn$", "mdlId" → mdlId, "acsTok" → acsTok) { span ⇒
                 checkLength(
                     "acsTok" -> acsTok,
-                    "mdlId" -> mdlId,
-                    "inspName" -> inspName
+                    "mdlId" -> mdlId
                 )
 
                 val admUsr = authenticateAsAdmin(acsTok)
 
-                if (!NCProbeManager.getAllProbes(admUsr.companyId, span).exists(_.models.exists(_.id == mdlId)))
+                if (!NCProbeManager.existsForModel(admUsr.companyId, mdlId, span))
                     throw new NCE(s"Probe not found for model: $mdlId")
 
-                val fut = NCInspectionManager.inspect(mdlId, inspName, args, span)
+                val fut = NCSuggestSynonymManager.suggest(mdlId, args, span)
 
                 fut.failed.collect {
                     case e ⇒ onError(e)
@@ -781,82 +778,21 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       *
       * @return
       */
-    protected def inspection$All(): Route = {
-        case class Req_Inspection$All(
-            acsTok: String
-        )
-        case class Parameter_Inspection$All(
-            name: String,
-            value: String,
-            valueType: String,
-            synopsis: String,
-            description: String
-        )
-        case class Inspection_Inspection$All(
-            name: String,
-            synopsis: String,
-            parameters: Seq[Parameter_Inspection$All],
-            description: String,
-            isServerSide: Boolean
-       )
-        case class Res_Inspection$All(
-            status: String,
-            inspections: Seq[Inspection_Inspection$All]
-        )
-
-        implicit val reqFmt: RootJsonFormat[Req_Inspection$All] = jsonFormat1(Req_Inspection$All)
-        implicit val paramFmt: RootJsonFormat[Parameter_Inspection$All] = jsonFormat5(Parameter_Inspection$All)
-        implicit val inspFmt: RootJsonFormat[Inspection_Inspection$All] = jsonFormat5(Inspection_Inspection$All)
-        implicit val resFmt: RootJsonFormat[Res_Inspection$All] = jsonFormat2(Res_Inspection$All)
-
-        entity(as[Req_Inspection$All]) { req ⇒
-            startScopedSpan("inspections$All", "acsTok" → req.acsTok) { span ⇒
-                checkLength("acsTok" -> req.acsTok)
-
-                authenticateAsAdmin(req.acsTok)
-
-                val inspections = NCInspectionManager.allInspections(span).map(i ⇒ Inspection_Inspection$All(
-                    name = i.name(),
-                    synopsis = i.synopsis(),
-                    parameters = i.parameters().asScala.map(p ⇒
-                        Parameter_Inspection$All(
-                            name = p.name(),
-                            value = p.value(),
-                            valueType = p.valueType(),
-                            synopsis = p.synopsis(),
-                            description = p.description()
-                        )
-                    ),
-                    description = i.description(),
-                    isServerSide = i.isServerSide
-                ))
-
-                complete {
-                    Res_Inspection$All(API_OK, inspections)
-                }
-            }
-        }
-    }
-
-    /**
-      *
-      * @return
-      */
     protected def clear$Conversation(): Route = {
-        case class Req_Clear$Conversation(
+        case class Req$Clear$Conversation(
             acsTok: String,
             mdlId: String,
             usrId: Option[Long],
             usrExtId: Option[String]
         )
-        case class Res_Clear$Conversation(
+        case class Res$Clear$Conversation(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Clear$Conversation] = jsonFormat4(Req_Clear$Conversation)
-        implicit val resFmt: RootJsonFormat[Res_Clear$Conversation] = jsonFormat1(Res_Clear$Conversation)
+        implicit val reqFmt: RootJsonFormat[Req$Clear$Conversation] = jsonFormat4(Req$Clear$Conversation)
+        implicit val resFmt: RootJsonFormat[Res$Clear$Conversation] = jsonFormat1(Res$Clear$Conversation)
 
-        entity(as[Req_Clear$Conversation]) { req ⇒
+        entity(as[Req$Clear$Conversation]) { req ⇒
             startScopedSpan(
                 "clear$Conversation",
                 "acsTok" → req.acsTok,
@@ -870,7 +806,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                     NCProbeManager.clearConversation(getUserId(acsUsr, req.usrId, req.usrExtId), req.mdlId, span)
 
                     complete {
-                        Res_Clear$Conversation(API_OK)
+                        Res$Clear$Conversation(API_OK)
                     }
                 }
         }
@@ -881,20 +817,20 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def clear$Dialog(): Route = {
-        case class Req_Clear$Dialog(
+        case class Req$Clear$Dialog(
             acsTok: String,
             mdlId: String,
             usrId: Option[Long],
             usrExtId: Option[String]
         )
-        case class Res_Clear$Dialog(
+        case class Res$Clear$Dialog(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Clear$Dialog] = jsonFormat4(Req_Clear$Dialog)
-        implicit val resFmt: RootJsonFormat[Res_Clear$Dialog] = jsonFormat1(Res_Clear$Dialog)
+        implicit val reqFmt: RootJsonFormat[Req$Clear$Dialog] = jsonFormat4(Req$Clear$Dialog)
+        implicit val resFmt: RootJsonFormat[Res$Clear$Dialog] = jsonFormat1(Res$Clear$Dialog)
 
-        entity(as[Req_Clear$Dialog]) { req ⇒
+        entity(as[Req$Clear$Dialog]) { req ⇒
             startScopedSpan(
                 "clear$Dialog",
                 "acsTok" → req.acsTok,
@@ -908,7 +844,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                     NCProbeManager.clearDialog(getUserId(acsUsr, req.usrId, req.usrExtId), req.mdlId, span)
 
                     complete {
-                        Res_Clear$Dialog(API_OK)
+                        Res$Clear$Dialog(API_OK)
                     }
                 }
         }
@@ -919,7 +855,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def company$Add(): Route = {
-        case class Req_Company$Add(
+        case class Req$Company$Add(
             acsTok: String,
             // New company.
             name: String,
@@ -936,17 +872,17 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             adminLastName: String,
             adminAvatarUrl: Option[String]
         )
-        case class Res_Company$Add(
+        case class Res$Company$Add(
             status: String,
             token: String,
             adminId: Long
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Company$Add] = jsonFormat13(Req_Company$Add)
-        implicit val resFmt: RootJsonFormat[Res_Company$Add] = jsonFormat3(Res_Company$Add)
+        implicit val reqFmt: RootJsonFormat[Req$Company$Add] = jsonFormat13(Req$Company$Add)
+        implicit val resFmt: RootJsonFormat[Res$Company$Add] = jsonFormat3(Res$Company$Add)
 
         //noinspection DuplicatedCod
-        entity(as[Req_Company$Add]) { req ⇒
+        entity(as[Req$Company$Add]) { req ⇒
             startScopedSpan("company$Add", "name" → req.name) { span ⇒
                 checkLength(
                     "acsTok" -> req.acsTok,
@@ -984,7 +920,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 )
 
                 complete {
-                    Res_Company$Add(API_OK, res.token, res.adminId)
+                    Res$Company$Add(API_OK, res.token, res.adminId)
                 }
             }
         }
@@ -995,10 +931,10 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def company$Get(): Route = {
-        case class Req_Company$Get(
+        case class Req$Company$Get(
             acsTok: String
         )
-        case class Res_Company$Get(
+        case class Res$Company$Get(
             status: String,
             id: Long,
             name: String,
@@ -1010,10 +946,10 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             postalCode: Option[String]
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Company$Get] = jsonFormat1(Req_Company$Get)
-        implicit val resFmt: RootJsonFormat[Res_Company$Get] = jsonFormat9(Res_Company$Get)
+        implicit val reqFmt: RootJsonFormat[Req$Company$Get] = jsonFormat1(Req$Company$Get)
+        implicit val resFmt: RootJsonFormat[Res$Company$Get] = jsonFormat9(Res$Company$Get)
 
-        entity(as[Req_Company$Get]) { req ⇒
+        entity(as[Req$Company$Get]) { req ⇒
             startScopedSpan("company$get", "acsTok" → req.acsTok) { span ⇒
                 checkLength("acsTok" -> req.acsTok)
 
@@ -1025,7 +961,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 }
 
                 complete {
-                    Res_Company$Get(API_OK,
+                    Res$Company$Get(API_OK,
                         company.id,
                         company.name,
                         company.website,
@@ -1045,7 +981,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def company$Update(): Route = {
-        case class Req_Company$Update(
+        case class Req$Company$Update(
             // Caller.
             acsTok: String,
 
@@ -1058,14 +994,14 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             address: Option[String],
             postalCode: Option[String]
         )
-        case class Res_Company$Update(
+        case class Res$Company$Update(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Company$Update] = jsonFormat8(Req_Company$Update)
-        implicit val resFmt: RootJsonFormat[Res_Company$Update] = jsonFormat1(Res_Company$Update)
+        implicit val reqFmt: RootJsonFormat[Req$Company$Update] = jsonFormat8(Req$Company$Update)
+        implicit val resFmt: RootJsonFormat[Res$Company$Update] = jsonFormat1(Res$Company$Update)
 
-        entity(as[Req_Company$Update]) { req ⇒
+        entity(as[Req$Company$Update]) { req ⇒
             startScopedSpan("company$Update", "acsTok" → req.acsTok, "name" → req.name) { span ⇒
                 checkLength("acsTok" -> req.acsTok,
                     "name" -> req.name,
@@ -1092,7 +1028,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 )
 
                 complete {
-                    Res_Company$Update(API_OK)
+                    Res$Company$Update(API_OK)
                 }
             }
         }
@@ -1103,7 +1039,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def feedback$Add(): Route = {
-        case class Req_Feedback$Add(
+        case class Req$Feedback$Add(
             acsTok: String,
             usrId : Option[Long],
             usrExtId: Option[String],
@@ -1111,15 +1047,15 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             score: Double,
             comment: Option[String]
         )
-        case class Res_Feedback$Add(
+        case class Res$Feedback$Add(
             status: String,
             id: Long
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Feedback$Add] = jsonFormat6(Req_Feedback$Add)
-        implicit val resFmt: RootJsonFormat[Res_Feedback$Add] = jsonFormat2(Res_Feedback$Add)
+        implicit val reqFmt: RootJsonFormat[Req$Feedback$Add] = jsonFormat6(Req$Feedback$Add)
+        implicit val resFmt: RootJsonFormat[Res$Feedback$Add] = jsonFormat2(Res$Feedback$Add)
 
-        entity(as[Req_Feedback$Add]) { req ⇒
+        entity(as[Req$Feedback$Add]) { req ⇒
             startScopedSpan(
                 "feedback$Add",
                 "usrId" → req.usrId.getOrElse(-1),
@@ -1147,7 +1083,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 )
 
                 complete {
-                    Res_Feedback$Add(API_OK, id)
+                    Res$Feedback$Add(API_OK, id)
                 }
             }
         }
@@ -1158,19 +1094,19 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def feedback$Delete(): Route = {
-        case class Req_Feedback$Delete(
+        case class Req$Feedback$Delete(
             acsTok: String,
             // Feedback IDs to delete (optional).
             id: Option[Long]
         )
-        case class Res_Feedback$Delete(
+        case class Res$Feedback$Delete(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Feedback$Delete] = jsonFormat2(Req_Feedback$Delete)
-        implicit val resFmt: RootJsonFormat[Res_Feedback$Delete] = jsonFormat1(Res_Feedback$Delete)
+        implicit val reqFmt: RootJsonFormat[Req$Feedback$Delete] = jsonFormat2(Req$Feedback$Delete)
+        implicit val resFmt: RootJsonFormat[Res$Feedback$Delete] = jsonFormat1(Res$Feedback$Delete)
 
-        entity(as[Req_Feedback$Delete]) { req ⇒
+        entity(as[Req$Feedback$Delete]) { req ⇒
             startScopedSpan("feedback$Delete") { span ⇒
                 checkLength("acsTok" -> req.acsTok)
 
@@ -1204,7 +1140,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 }
 
                 complete {
-                    Res_Feedback$Delete(API_OK)
+                    Res$Feedback$Delete(API_OK)
                 }
             }
         }
@@ -1215,7 +1151,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def feedback$All(): Route = {
-        case class Req_Feedback$All(
+        case class Req$Feedback$All(
             acsTok: String,
             usrId: Option[Long],
             usrExtId: Option[String],
@@ -1229,16 +1165,16 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             comment: Option[String],
             createTstamp: Long
         )
-        case class Res_Feedback$All(
+        case class Res$Feedback$All(
             status: String,
             feedback: Seq[Feedback_Feedback$All]
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Feedback$All] = jsonFormat4(Req_Feedback$All)
+        implicit val reqFmt: RootJsonFormat[Req$Feedback$All] = jsonFormat4(Req$Feedback$All)
         implicit val fbFmt: RootJsonFormat[Feedback_Feedback$All] = jsonFormat6(Feedback_Feedback$All)
-        implicit val resFmt: RootJsonFormat[Res_Feedback$All] = jsonFormat2(Res_Feedback$All)
+        implicit val resFmt: RootJsonFormat[Res$Feedback$All] = jsonFormat2(Res$Feedback$All)
 
-        entity(as[Req_Feedback$All]) { req ⇒
+        entity(as[Req$Feedback$All]) { req ⇒
             startScopedSpan(
                 "feedback$All",
                 "usrId" → req.usrId.getOrElse(-1),
@@ -1275,7 +1211,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                     throw AdminRequired(acsUsr.email.get)
 
                 complete {
-                    Res_Feedback$All(API_OK, feedback)
+                    Res$Feedback$All(API_OK, feedback)
                 }
             }
         }
@@ -1286,19 +1222,19 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def company$Token$Reset(): Route = {
-        case class Req_Company$Token$Reset(
+        case class Req$Company$Token$Reset(
             // Caller.
             acsTok: String
         )
-        case class Res_Company$Token$Reset(
+        case class Res$Company$Token$Reset(
             status: String,
             token: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Company$Token$Reset] = jsonFormat1(Req_Company$Token$Reset)
-        implicit val resFmt: RootJsonFormat[Res_Company$Token$Reset] = jsonFormat2(Res_Company$Token$Reset)
+        implicit val reqFmt: RootJsonFormat[Req$Company$Token$Reset] = jsonFormat1(Req$Company$Token$Reset)
+        implicit val resFmt: RootJsonFormat[Res$Company$Token$Reset] = jsonFormat2(Res$Company$Token$Reset)
 
-        entity(as[Req_Company$Token$Reset]) { req ⇒
+        entity(as[Req$Company$Token$Reset]) { req ⇒
             startScopedSpan("company$Token$Reset", "acsTok" → req.acsTok) { span ⇒
                 checkLength("acsTok" -> req.acsTok)
 
@@ -1307,7 +1243,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 val tkn = NCCompanyManager.resetToken(admUsr.companyId, span)
 
                 complete {
-                    Res_Company$Token$Reset(API_OK, tkn)
+                    Res$Company$Token$Reset(API_OK, tkn)
                 }
             }
         }
@@ -1318,18 +1254,18 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def company$Delete(): Route = {
-        case class Req_Company$Delete(
+        case class Req$Company$Delete(
             // Caller.
             acsTok: String
         )
-        case class Res_Company$Delete(
+        case class Res$Company$Delete(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Company$Delete] = jsonFormat1(Req_Company$Delete)
-        implicit val resFmt: RootJsonFormat[Res_Company$Delete] = jsonFormat1(Res_Company$Delete)
+        implicit val reqFmt: RootJsonFormat[Req$Company$Delete] = jsonFormat1(Req$Company$Delete)
+        implicit val resFmt: RootJsonFormat[Res$Company$Delete] = jsonFormat1(Res$Company$Delete)
 
-        entity(as[Req_Company$Delete]) { req ⇒
+        entity(as[Req$Company$Delete]) { req ⇒
             startScopedSpan("company$Delete", "acsTok" → req.acsTok) { span ⇒
                 checkLength("acsTok" -> req.acsTok)
 
@@ -1338,7 +1274,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 NCCompanyManager.deleteCompany(admUSr.companyId, span)
 
                 complete {
-                    Res_Company$Delete(API_OK)
+                    Res$Company$Delete(API_OK)
                 }
             }
         }
@@ -1349,7 +1285,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def user$Add(): Route = {
-        case class Req_User$Add(
+        case class Req$User$Add(
             // Caller.
             acsTok: String,
 
@@ -1363,15 +1299,15 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             properties: Option[Map[String, String]],
             extId: Option[String]
         )
-        case class Res_User$Add(
+        case class Res$User$Add(
             status: String,
             id: Long
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_User$Add] = jsonFormat9(Req_User$Add)
-        implicit val resFmt: RootJsonFormat[Res_User$Add] = jsonFormat2(Res_User$Add)
+        implicit val reqFmt: RootJsonFormat[Req$User$Add] = jsonFormat9(Req$User$Add)
+        implicit val resFmt: RootJsonFormat[Res$User$Add] = jsonFormat2(Res$User$Add)
 
-        entity(as[Req_User$Add]) { req ⇒
+        entity(as[Req$User$Add]) { req ⇒
             startScopedSpan("user$Add", "acsTok" → req.acsTok, "email" → req.email) { span ⇒
                 checkLength(
                     "acsTok" -> req.acsTok,
@@ -1401,7 +1337,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 )
 
                 complete {
-                    Res_User$Add(API_OK, id)
+                    Res$User$Add(API_OK, id)
                 }
             }
         }
@@ -1412,7 +1348,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def user$Update(): Route = {
-        case class Req_User$Update(
+        case class Req$User$Update(
             // Caller.
             acsTok: String,
 
@@ -1423,14 +1359,14 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             avatarUrl: Option[String],
             properties: Option[Map[String, String]]
         )
-        case class Res_User$Update(
+        case class Res$User$Update(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_User$Update] = jsonFormat6(Req_User$Update)
-        implicit val resFmt: RootJsonFormat[Res_User$Update] = jsonFormat1(Res_User$Update)
+        implicit val reqFmt: RootJsonFormat[Req$User$Update] = jsonFormat6(Req$User$Update)
+        implicit val resFmt: RootJsonFormat[Res$User$Update] = jsonFormat1(Res$User$Update)
 
-        entity(as[Req_User$Update]) { req ⇒
+        entity(as[Req$User$Update]) { req ⇒
             startScopedSpan("user$Update", "acsTok" → req.acsTok, "usrId" → req.id.getOrElse(() ⇒ null)) { span ⇒
                 checkLength(
                     "acsTok" -> req.acsTok,
@@ -1453,7 +1389,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 )
 
                 complete {
-                    Res_User$Update(API_OK)
+                    Res$User$Update(API_OK)
                 }
             }
         }
@@ -1464,19 +1400,19 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def user$Delete(): Route = {
-        case class Req_User$Delete(
+        case class Req$User$Delete(
             acsTok: String,
             id: Option[Long],
             extId: Option[String]
         )
-        case class Res_User$Delete(
+        case class Res$User$Delete(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_User$Delete] = jsonFormat3(Req_User$Delete)
-        implicit val resFmt: RootJsonFormat[Res_User$Delete] = jsonFormat1(Res_User$Delete)
+        implicit val reqFmt: RootJsonFormat[Req$User$Delete] = jsonFormat3(Req$User$Delete)
+        implicit val resFmt: RootJsonFormat[Res$User$Delete] = jsonFormat1(Res$User$Delete)
 
-        entity(as[Req_User$Delete]) { req ⇒
+        entity(as[Req$User$Delete]) { req ⇒
             startScopedSpan("user$Delete", "acsTok" → req.acsTok, "usrId" → req.id.getOrElse(() ⇒ null)) { span ⇒
                 checkLength("acsTok", req.acsTok, 256)
                 checkLengthOpt("extId", req.extId, 64)
@@ -1518,7 +1454,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 }
 
                 complete {
-                    Res_User$Delete(API_OK)
+                    Res$User$Delete(API_OK)
                 }
             }
         }
@@ -1529,19 +1465,19 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def user$Admin(): Route = {
-        case class Req_User$Admin(
+        case class Req$User$Admin(
             acsTok: String,
             id: Option[Long],
             admin: Boolean
         )
-        case class Res_User$Admin(
+        case class Res$User$Admin(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_User$Admin] = jsonFormat3(Req_User$Admin)
-        implicit val resFmt: RootJsonFormat[Res_User$Admin] = jsonFormat1(Res_User$Admin)
+        implicit val reqFmt: RootJsonFormat[Req$User$Admin] = jsonFormat3(Req$User$Admin)
+        implicit val resFmt: RootJsonFormat[Res$User$Admin] = jsonFormat1(Res$User$Admin)
 
-        entity(as[Req_User$Admin]) { req ⇒
+        entity(as[Req$User$Admin]) { req ⇒
             startScopedSpan("user$Admin", "acsTok" → req.acsTok, "usrId" → req.id.getOrElse(-1), "admin" → req.admin) { span ⇒
                 checkLength("acsTok", req.acsTok, 256)
 
@@ -1559,7 +1495,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 NCUserManager.updateUserPermissions(usrId, req.admin, span)
 
                 complete {
-                    Res_User$Admin(API_OK)
+                    Res$User$Admin(API_OK)
                 }
             }
         }
@@ -1570,20 +1506,20 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def user$Password$Reset(): Route = {
-        case class Req_User$Password$Reset(
+        case class Req$User$Password$Reset(
             // Caller.
             acsTok: String,
             id: Option[Long],
             newPasswd: String
         )
-        case class Res_User$Password$Reset(
+        case class Res$User$Password$Reset(
             status: String
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_User$Password$Reset] = jsonFormat3(Req_User$Password$Reset)
-        implicit val resFmt: RootJsonFormat[Res_User$Password$Reset] = jsonFormat1(Res_User$Password$Reset)
+        implicit val reqFmt: RootJsonFormat[Req$User$Password$Reset] = jsonFormat3(Req$User$Password$Reset)
+        implicit val resFmt: RootJsonFormat[Res$User$Password$Reset] = jsonFormat1(Res$User$Password$Reset)
 
-        entity(as[Req_User$Password$Reset]) { req ⇒
+        entity(as[Req$User$Password$Reset]) { req ⇒
             startScopedSpan(
                 "user$Password$Reset",
                 "acsTok" → req.acsTok, "usrId" → req.id.getOrElse(-1)) { span ⇒
@@ -1597,7 +1533,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 NCUserManager.resetPassword(getUserId(acsUsr, req.id, None), req.newPasswd, span)
 
                 complete {
-                    Res_User$Password$Reset(API_OK)
+                    Res$User$Password$Reset(API_OK)
                 }
             }
         }
@@ -1608,7 +1544,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def user$All(): Route = {
-        case class Req_User$All(
+        case class Req$User$All(
             // Caller.
             acsTok: String
         )
@@ -1623,16 +1559,16 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             companyId: Long,
             properties: Option[Map[String, String]]
         )
-        case class Res_User$All(
+        case class Res$User$All(
             status: String,
             users: Seq[ResUser_User$All]
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_User$All] = jsonFormat1(Req_User$All)
+        implicit val reqFmt: RootJsonFormat[Req$User$All] = jsonFormat1(Req$User$All)
         implicit val usrFmt: RootJsonFormat[ResUser_User$All] = jsonFormat9(ResUser_User$All)
-        implicit val resFmt: RootJsonFormat[Res_User$All] = jsonFormat2(Res_User$All)
+        implicit val resFmt: RootJsonFormat[Res$User$All] = jsonFormat2(Res$User$All)
 
-        entity(as[Req_User$All]) { req ⇒
+        entity(as[Req$User$All]) { req ⇒
             startScopedSpan("user$All", "acsTok" → req.acsTok) { span ⇒
                 checkLength("acsTok" -> req.acsTok)
 
@@ -1654,7 +1590,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                     }.toSeq
 
                 complete {
-                    Res_User$All(API_OK, usrLst)
+                    Res$User$All(API_OK, usrLst)
                 }
             }
         }
@@ -1665,13 +1601,13 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def user$Get(): Route = {
-        case class Req_User$Get(
+        case class Req$User$Get(
             // Caller.
             acsTok: String,
             id: Option[Long],
             extId: Option[String]
         )
-        case class Res_User$Get(
+        case class Res$User$Get(
             status: String,
             id: Long,
             email: Option[String],
@@ -1683,10 +1619,10 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             properties: Option[Map[String, String]]
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_User$Get] = jsonFormat3(Req_User$Get)
-        implicit val resFmt: RootJsonFormat[Res_User$Get] = jsonFormat9(Res_User$Get)
+        implicit val reqFmt: RootJsonFormat[Req$User$Get] = jsonFormat3(Req$User$Get)
+        implicit val resFmt: RootJsonFormat[Res$User$Get] = jsonFormat9(Res$User$Get)
 
-        entity(as[Req_User$Get]) { req ⇒
+        entity(as[Req$User$Get]) { req ⇒
             startScopedSpan(
                 "user$Get", "acsTok" → req.acsTok, "id" → req.id.orElse(null), "extId" → req.extId.orNull
             ) { span ⇒
@@ -1702,7 +1638,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 val props = NCUserManager.getUserProperties(usrId, span)
 
                 complete {
-                    Res_User$Get(API_OK,
+                    Res$User$Get(API_OK,
                         usr.id,
                         usr.email,
                         usr.extId,
@@ -1722,7 +1658,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
       * @return
       */
     protected def probe$All(): Route = {
-        case class Req_Probe$All(
+        case class Req$Probe$All(
             acsTok: String
         )
         case class Model_Probe$All(
@@ -1752,17 +1688,17 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
             macAddr: String,
             models: Set[Model_Probe$All]
         )
-        case class Res_Probe$All(
+        case class Res$Probe$All(
             status: String,
             probes: Seq[Probe_Probe$All]
         )
 
-        implicit val reqFmt: RootJsonFormat[Req_Probe$All] = jsonFormat1(Req_Probe$All)
+        implicit val reqFmt: RootJsonFormat[Req$Probe$All] = jsonFormat1(Req$Probe$All)
         implicit val mdlFmt: RootJsonFormat[Model_Probe$All] = jsonFormat4(Model_Probe$All)
         implicit val probFmt: RootJsonFormat[Probe_Probe$All] = jsonFormat19(Probe_Probe$All)
-        implicit val resFmt: RootJsonFormat[Res_Probe$All] = jsonFormat2(Res_Probe$All)
+        implicit val resFmt: RootJsonFormat[Res$Probe$All] = jsonFormat2(Res$Probe$All)
 
-        entity(as[Req_Probe$All]) { req ⇒
+        entity(as[Req$Probe$All]) { req ⇒
             startScopedSpan("probe$All", "acsTok" → req.acsTok) { span ⇒
                 checkLength("acsTok", req.acsTok, 256)
 
@@ -1796,7 +1732,7 @@ class NCBasicRestApi extends NCRestApi with LazyLogging with NCOpenCensusTrace w
                 ))
 
                 complete {
-                    Res_Probe$All(API_OK, probeLst)
+                    Res$Probe$All(API_OK, probeLst)
                 }
             }
         }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/inspection/impl/NCSuggestionInspection.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala
similarity index 88%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/server/inspection/impl/NCSuggestionInspection.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala
index 0158140..8777d5c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/inspection/impl/NCSuggestionInspection.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymManager.scala
@@ -15,44 +15,44 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.server.inspection.impl
-
-import java.util
-import java.util.concurrent.atomic.{AtomicInteger, AtomicReference}
-import java.util.concurrent._
+package org.apache.nlpcraft.server.sugsyn
 
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import io.opencensus.trace.Span
 import org.apache.http.HttpResponse
 import org.apache.http.client.ResponseHandler
-import org.apache.http.client.methods.HttpPost
-import org.apache.http.entity.StringEntity
-import org.apache.http.impl.client.HttpClients
 import org.apache.http.util.EntityUtils
-import org.apache.nlpcraft.common.NCE
+import org.apache.nlpcraft.common._
 import org.apache.nlpcraft.common.config.NCConfigurable
-import org.apache.nlpcraft.common.inspections._
-import org.apache.nlpcraft.common.inspections.impl.NCInspectionResultImpl
-import org.apache.nlpcraft.common.makro.NCMacroParser
 import org.apache.nlpcraft.common.nlp.core.NCNlpPorterStemmer
-import org.apache.nlpcraft.common.util.NCUtils
 import org.apache.nlpcraft.server.probe.NCProbeManager
 
 import scala.collection.JavaConverters._
 import scala.collection.{Seq, mutable}
-import scala.concurrent.{Future, Promise}
+import scala.concurrent.{ExecutionContext, ExecutionContextExecutor, Future, Promise}
 import scala.util.{Failure, Success}
+import java.util
+import java.util.concurrent.atomic.{AtomicInteger, AtomicReference}
+import java.util.concurrent._
+
+import org.apache.http.client.methods.HttpPost
+import org.apache.http.entity.StringEntity
+import org.apache.http.impl.client.HttpClients
+import org.apache.nlpcraft.common.makro.NCMacroParser
 
 /**
- * Synonym suggestion inspection.
+ * Synonym suggestion manager.
  */
-object NCSuggestionInspection extends NCInspectionService {
+object NCSuggestSynonymManager extends NCService {
     // For context word server requests.
     private final val MAX_LIMIT: Int = 10000
     private final val BATCH_SIZE = 20
     private final val DFLT_MIN_SCORE = 0.0
 
+    @volatile private var pool: ExecutorService = _
+    @volatile private var executor: ExecutionContextExecutor = _
+
     // For warnings.
     private final val MIN_CNT_INTENT = 5
     private final val MIN_CNT_MODEL = 20
@@ -62,6 +62,15 @@ object NCSuggestionInspection extends NCInspectionService {
     private final val TYPE_ARGS = new TypeToken[util.HashMap[String, AnyRef]]() {}.getType
     private final val SEPARATORS = Seq('?', ',', '.', '-', '!')
 
+    case class NCSuggestSynonymResult(
+        modelId: String,
+        arguments: String,
+        durationMs: Long,
+        timestamp: Long,
+        error: String,
+        suggestions: java.util.List[AnyRef]
+    )
+
     private object Config extends NCConfigurable {
         val urlOpt: Option[String] = getStringOpt("nlpcraft.server.ctxword.url")
     }
@@ -74,7 +83,9 @@ object NCSuggestionInspection extends NCInspectionService {
             val js = if (e != null) EntityUtils.toString(e) else null
 
             if (js == null)
-                throw new RuntimeException(s"Unexpected empty response [code=$code]")
+                throw new RuntimeException(s"Unexpected empty HTTP response from 'ctxword' server [" +
+                    s"code=$code" +
+                s"]")
 
             code match {
                 case 200 ⇒
@@ -83,7 +94,10 @@ object NCSuggestionInspection extends NCInspectionService {
                     data.asScala.map(p ⇒ if (p.isEmpty) Seq.empty else p.asScala.tail)
 
                 case 400 ⇒ throw new RuntimeException(js)
-                case _ ⇒ throw new RuntimeException(s"Unexpected response [code=$code, response=$js]")
+                case _ ⇒ throw new RuntimeException(s"Unexpected HTTP response from 'ctxword' server [" +
+                    s"code=$code, " +
+                    s"response=$js" +
+                s"]")
             }
         }
 
@@ -108,11 +122,27 @@ object NCSuggestionInspection extends NCInspectionService {
     private def toStem(s: String): String = split(s).map(NCNlpPorterStemmer.stem).mkString(" ")
     private def toStemWord(s: String): String = NCNlpPorterStemmer.stem(s)
 
+    override def start(parent: Span): NCService = startScopedSpan("start", parent) { _ ⇒
+        pool = Executors.newCachedThreadPool()
+        executor = ExecutionContext.fromExecutor(pool)
+
+        super.start(parent)
+    }
+
+    override def stop(parent: Span): Unit = startScopedSpan("stop", parent) { _ ⇒
+        super.stop(parent)
+
+        U.shutdownPools(pool)
+
+        pool = null
+        executor = null
+    }
+
     /**
-      *
-      * @param seq1
-      * @param seq2
-      */
+     *
+     * @param seq1
+     * @param seq2
+     */
     private def getAllSlices(seq1: Seq[String], seq2: Seq[String]): Seq[Int] = {
         val seq = mutable.Buffer.empty[Int]
 
@@ -127,18 +157,18 @@ object NCSuggestionInspection extends NCInspectionService {
         seq
     }
 
-
     /**
      *
+     * @param mdlId
+     * @param args
+     * @param parent
      * @return
      */
-    override def getName: String = "suggestions"
-
-    override def inspect(mdlId: String, inspName: String, args: Option[String], parent: Span = null): Future[NCInspectionResult] =
+    def suggest(mdlId: String, args: Option[String], parent: Span = null): Future[NCSuggestSynonymResult] =
         startScopedSpan("inspect", parent, "modelId" → mdlId) { _ ⇒
             val now = System.currentTimeMillis()
 
-            val promise = Promise[NCInspectionResult]()
+            val promise = Promise[NCSuggestSynonymResult]()
 
             NCProbeManager.getModelInfo(mdlId, parent).onComplete {
                 case Success(m) ⇒
@@ -182,15 +212,13 @@ object NCSuggestionInspection extends NCInspectionService {
 
                         def onError(err: String): Unit =
                             promise.success(
-                                NCInspectionResultImpl(
-                                    inspectionId = inspName,
+                                NCSuggestSynonymResult(
                                     modelId = mdlId,
-                                    inspectionArguments = None,
+                                    arguments = args.orNull,
                                     durationMs = System.currentTimeMillis() - now,
                                     timestamp = now,
-                                    errors = Seq(err),
-                                    warnings = Seq.empty,
-                                    suggestions = Seq.empty
+                                    error = err,
+                                    suggestions = Seq.empty.asJava
                                 )
                             )
 
@@ -206,8 +234,8 @@ object NCSuggestionInspection extends NCInspectionService {
                             if (allSamplesCnt < MIN_CNT_MODEL)
                                 warns +=
                                     s"Model '$mdlId' has too few intents samples: $allSamplesCnt. " +
-                                    s"It will negatively affect the quality of suggestions. " +
-                                    s"Try to increase overall sample count to at least $MIN_CNT_MODEL."
+                                        s"It will negatively affect the quality of suggestions. " +
+                                        s"Try to increase overall sample count to at least $MIN_CNT_MODEL."
 
                             else {
                                 val ids =
@@ -218,8 +246,8 @@ object NCSuggestionInspection extends NCInspectionService {
                                 if (ids.nonEmpty)
                                     warns +=
                                         s"Following model intent have too few samples: ${ids.mkString(", ")}. " +
-                                        s"It will negatively affect the quality of suggestions. " +
-                                        s"Try to increase overall sample count to at least $MIN_CNT_INTENT."
+                                            s"It will negatively affect the quality of suggestions. " +
+                                            s"Try to increase overall sample count to at least $MIN_CNT_INTENT."
                             }
 
                             val parser = new NCMacroParser()
@@ -287,13 +315,13 @@ object NCSuggestionInspection extends NCInspectionService {
                             if (noExElems.nonEmpty)
                                 warns +=
                                     "Some elements don't have synonyms in their intent samples, " +
-                                    s"so the service can't suggest any new synonyms for such elements: [${noExElems.mkString(", ")}]"
+                                        s"so the service can't suggest any new synonyms for such elements: [${noExElems.mkString(", ")}]"
 
                             val allReqsCnt = allReqs.map(_._2.size).sum
                             val allSynsCnt = elemSyns.map(_._2.size).sum
 
-                            logger.trace(s"Request is going to execute on 'ctxword' server " +
-                                s"[exs=${exs.size}, " +
+                            logger.trace(s"Request is going to execute on 'ctxword' server [" +
+                                s"exs=${exs.size}, " +
                                 s"syns=$allSynsCnt, " +
                                 s"reqs=$allReqsCnt" +
                             s"]")
@@ -310,7 +338,7 @@ object NCSuggestionInspection extends NCInspectionService {
                                 val err = new AtomicReference[Throwable]()
 
                                 for ((elemId, reqs) ← allReqs; batch ← reqs.sliding(BATCH_SIZE, BATCH_SIZE).map(_.toSeq)) {
-                                    NCUtils.asFuture(
+                                    U.asFuture(
                                         _ ⇒ {
                                             val post = new HttpPost(url)
 
@@ -408,7 +436,7 @@ object NCSuggestionInspection extends NCInspectionService {
 
                                             m.put("synonym", d.synonym)
                                             // ContextWord server range is (0, 2)
-                                            m.put("ctxWorldServerScore", d.ctxWordSrvScore / 2)
+                                            m.put("ctxWordServerScore", d.ctxWordSrvScore / 2)
                                             m.put("suggestedCount", d.sgstCnt)
 
                                             m
@@ -416,15 +444,13 @@ object NCSuggestionInspection extends NCInspectionService {
                                     }.asJava
 
                                 promise.success(
-                                    NCInspectionResultImpl(
-                                        inspectionId = inspName,
+                                    NCSuggestSynonymResult(
                                         modelId = mdlId,
-                                        inspectionArguments = None,
+                                        arguments = args.orNull,
                                         durationMs = System.currentTimeMillis() - now,
                                         timestamp = now,
-                                        errors = Seq.empty,
-                                        warnings = warns,
-                                        suggestions = Seq(resJ)
+                                        error = null,
+                                        suggestions = Seq(resJ.asInstanceOf[AnyRef]).asJava
                                     )
                                 )
                             }
@@ -438,9 +464,8 @@ object NCSuggestionInspection extends NCInspectionService {
                             promise.failure(e)
                     }
                 case Failure(e) ⇒ promise.failure(e)
-            }(getExecutor)
+            }(executor)
 
             promise.future
         }
 }
-
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymResult.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymResult.scala
new file mode 100644
index 0000000..97774eb
--- /dev/null
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/sugsyn/NCSuggestSynonymResult.scala
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+
+package org.apache.nlpcraft.server.sugsyn
+
+/**
+ *
+ * @param modelId
+ * @param arguments
+ * @param durationMs
+ * @param timestamp
+ * @param suggestions
+ */
+case class NCSuggestSynonymResult(
+    modelId: String,
+    arguments: String,
+    durationMs: Long,
+    timestamp: Long,
+    suggestions: java.util.List[AnyRef]
+)