diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index d4f2b4a..a66047e 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -24,7 +24,7 @@
     strategy:
       matrix:
         os: [ubuntu-latest]
-        java: [8, 11]
+        java: [11]
 
     runs-on: ${{matrix.os}}
 
diff --git a/KEYS b/KEYS
deleted file mode 100644
index 4b3afaf..0000000
--- a/KEYS
+++ /dev/null
@@ -1,116 +0,0 @@
-pub   rsa4096 2020-04-11 [SC]
-      4793 17FA 7AFD 44AC A4CC  0778 C7C4 3555 607F E2EF
-uid           [ultimate] Nikita Ivanov <nivanov30@gmail.com>
-sub   rsa4096 2020-04-11 [E]
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-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
-=5XS0
------END PGP PUBLIC KEY BLOCK-----
-
-pub   rsa4096 2020-03-31 [SC] [expires: 2024-03-31]
-      223A2AADD175994F4450467491D161EDD8405C82
-uid           [ultimate] Aaron Radzinski <aradzinski@datalingvo.com>
-sig 3        91D161EDD8405C82 2020-03-31  Aaron Radzinski <aradzinski@datalingvo.com>
-sub   rsa4096 2020-03-31 [E] [expires: 2024-03-31]
-sig          91D161EDD8405C82 2020-03-31  Aaron Radzinski <aradzinski@datalingvo.com>
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-
-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
-U1vaIvVhIXD6xZ6ug/RDsFUJSQ==
-=O7in
------END PGP PUBLIC KEY BLOCK-----
\ No newline at end of file
diff --git a/README.md b/README.md
index f897e57..9a0fe81 100644
--- a/README.md
+++ b/README.md
@@ -25,8 +25,7 @@
 
 ## What is Apache NLPCraft?
 [Apache NLPCraft](https://nlpcraft.apache.org/) is an open source library for adding a natural language interface to any applications. 
-NLPCraft is free and developer friendly, it securely works with any private data source, and has no hardware or software 
-lock-in.
+Based on semantic modelling it allows rapid implementation and requires no model training or pre-existing text corpora.
 
 ## Java Client
 Native Java client provide easy-to-use Java-based API that wraps standard NLPCraft [REST APIs](https://nlpcraft.apache.org/using-rest.html). 
@@ -42,7 +41,6 @@
  
 ## Other Projects
 - [Apache NLPCraft](https://github.com/apache/incubator-nlpcraft) - Main NLPCraft project.
-- [Apache NLPCraft UI](https://github.com/apache/incubator-nlpcraft-ui) - Web UI for testing and debugging.
 
 ## Usage
 From any JVM-based application code:
diff --git a/bin/prepare.sh b/bin/prepare.sh
index 64f23ac..956010e 100755
--- a/bin/prepare.sh
+++ b/bin/prepare.sh
@@ -18,13 +18,13 @@
 
 if [[ $1 = "" ]] ; then
     echo "Version must be set as input parameter."
-    exit -1
+    exit 1
 fi
 
 #
 # Change this for your local GPG fingerprint:
 # ===========================================
-localUser=223A2AADD175994F4450467491D161EDD8405C82
+localUser=79BB50129889A04C68BD7A4ABCD48C7B6C94ED02
 
 zipDir=zips
 tmpDir=apache-nlpcraft-java-client
@@ -35,7 +35,7 @@
 
 cd ../
 
-mvn clean package -Prelease
+mvn clean package -P release
 
 rm -R ${zipDir} 2> /dev/null
 
@@ -50,7 +50,7 @@
 cp DISCLAIMER ${zipDir}/${tmpDir}
 cp src/main/resources/log4j2.xml ${zipDir}/${tmpDir}/build
 
-cp target/*all-deps.jar ${zipDir}/${tmpDir}/build
+cp target/*$1.jar ${zipDir}/${tmpDir}/build
 rsync -avzq target/apidocs/** ${zipDir}/${tmpDir}/javadoc --exclude '**/.DS_Store'
 
 # Prepares bin zip.
@@ -68,6 +68,8 @@
 cp pom.xml ${zipDir}/${tmpDir}
 cp assembly.xml ${zipDir}/${tmpDir}
 cp README.md ${zipDir}/${tmpDir}
+mkdir ${zipDir}/${tmpDir}/javadoc
+cp javadoc/stylesheet.css ${zipDir}/${tmpDir}/javadoc
 
 # Prepares src zip.
 cd ${zipDir}
@@ -86,4 +88,4 @@
 cd ${curDir}
 
 echo
-echo "Files prepared in folder: ${zipDir}"
\ No newline at end of file
+echo "ZIPs are prepared in folder: ${zipDir}"
\ No newline at end of file
diff --git a/javadoc/stylesheet.css b/javadoc/stylesheet.css
index 30779e5..5d48c84 100644
--- a/javadoc/stylesheet.css
+++ b/javadoc/stylesheet.css
@@ -15,36 +15,52 @@
  * limitations under the License.
  */
 
+/*
+ * Styles for individual HTML elements.
+ *
+ * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular
+ * HTML element throughout the page.
+ */
+
 body {
     background-color:#ffffff;
     color:#353833;
-    font-family:Helvetica, sans-serif;
-    font-size:15px;
+    font-family: Verdana, Helvetica, Arial, sans-serif;
+    font-size:14px;
     margin:0;
+    padding:0;
+    height:100%;
+    width:100%;
+}
+iframe {
+    margin:0;
+    padding:0;
+    height:100%;
+    width:100%;
+    overflow-y:scroll;
+    border:none;
 }
 a:link, a:visited {
+    text-decoration: none;
     color:#4A6782;
-    text-decoration:none;
 }
-a:hover, a:focus {
+a[href]:hover, a[href]:focus {
+    text-decoration:none;
     color:#bb7a2a;
-    text-decoration:none;
-}
-a:active {
-    color:#4A6782;
-    text-decoration:none;
 }
 a[name] {
     color:#353833;
-    text-decoration:none;
 }
-a[name]:hover {
-    color:#353833;
-    text-decoration:none;
+a[name]:before, a[name]:target, a[id]:before, a[id]:target {
+    content:"";
+    display:inline-block;
+    position:relative;
+    padding-top:129px;
+    margin-top:-129px;
 }
 pre {
-    font-family: monospace;
-    font-size: 90%;
+    font-family:"Roboto Mono", monospace;
+    font-size:14px;
 }
 h1 {
     font-size:20px;
@@ -57,7 +73,7 @@
     font-style:italic;
 }
 h4 {
-    font-size:14px;
+    font-size:13px;
 }
 h5 {
     font-size:12px;
@@ -69,33 +85,36 @@
     list-style-type:disc;
 }
 code, tt {
-    font-family: monospace;
+    font-family:"Roboto Mono", monospace;
+    font-size:14px;
     padding-top:4px;
     margin-top:8px;
     line-height:1.4em;
-    color: #4A6782;
 }
 dt code {
-    font-family: monospace;
+    font-family:"Roboto Mono", monospace;
+    font-size:14px;
     padding-top:4px;
-    color: #4A6782;
 }
 table tr td dt code {
-    font-family: monospace;
+    font-family:"Roboto Mono", monospace;
+    font-size:14px;
     vertical-align:top;
     padding-top:4px;
-    color: #4A6782;
-}
-a code {
-    color: inherit !important;
-    text-decoration: underline;
 }
 sup {
     font-size:8px;
 }
+
 /*
-Document title and Copyright styles
-*/
+ * Styles for HTML generated by javadoc.
+ *
+ * These are style classes that are used by the standard doclet to generate HTML documentation.
+ */
+
+/*
+ * Styles for document title and copyright.
+ */
 .clear {
     clear:both;
     height:0;
@@ -126,25 +145,33 @@
     font-weight:bold;
 }
 /*
-Navigation bar styles
-*/
+ * Styles for navigation bar.
+ */
 .bar {
     background-color:#4D7A97;
     color:#FFFFFF;
-    padding: .6em .5em .6em .8em;
+    padding:.8em .5em .4em .8em;
     height:auto;/*height:1.8em;*/
     font-size:11px;
     margin:0;
 }
+.navPadding {
+    padding-top: 107px;
+}
+.fixedNav {
+    position:fixed;
+    width:100%;
+    z-index:999;
+    background-color:#ffffff;
+}
 .topNav {
     background-color:#4D7A97;
     color:#FFFFFF;
     float:left;
-    padding:0;
     width:100%;
     clear:right;
     height:2.8em;
-    padding-top:10px;
+    padding: 10px 0 0;
     overflow:hidden;
     font-size:12px;
 }
@@ -153,11 +180,10 @@
     background-color:#4D7A97;
     color:#FFFFFF;
     float:left;
-    padding:0;
     width:100%;
     clear:right;
     height:2.8em;
-    padding-top:10px;
+    padding: 10px 0 0;
     overflow:hidden;
     font-size:12px;
 }
@@ -185,7 +211,22 @@
     padding: 5px 6px;
     text-transform:uppercase;
 }
-ul.subNavList li{
+ul.navListSearch {
+    float:right;
+    margin:0 0 0 0;
+    padding:0;
+}
+ul.navListSearch li {
+    list-style:none;
+    float:right;
+    padding: 5px 6px;
+    text-transform:uppercase;
+}
+ul.navListSearch li label {
+    position:relative;
+    right:-16px;
+}
+ul.subNavList li {
     list-style:none;
     float:left;
 }
@@ -211,22 +252,30 @@
     overflow:hidden;
 }
 /*
-Page header and footer styles
-*/
+ * Styles for page header and footer.
+ */
 .header, .footer {
     clear:both;
     margin:0 20px;
     padding:5px 0 0 0;
 }
-.indexHeader {
-    margin:10px;
+.indexNav {
     position:relative;
+    font-size:12px;
+    background-color:#dee3e9;
 }
-.indexHeader span{
-    margin-right:15px;
+.indexNav ul {
+    margin-top:0;
+    padding:5px;
 }
-.indexHeader h1 {
-    font-size:14px;
+.indexNav ul li {
+    display:inline;
+    list-style-type:none;
+    padding-right:10px;
+    text-transform:uppercase;
+}
+.indexNav h1 {
+    font-size:13px;
 }
 .title {
     color:#2c4557;
@@ -244,11 +293,11 @@
 }
 .header ul li, .footer ul li {
     list-style:none;
-    font-size:14px;
+    font-size:13px;
 }
 /*
-Heading styles
-*/
+ * Styles for headings.
+ */
 div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
     background-color:#dee3e9;
     border:1px solid #d0d9e0;
@@ -269,9 +318,10 @@
     padding:0 0 20px 0;
 }
 /*
-Page layout container styles
-*/
-.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer {
+ * Styles for page layout containers.
+ */
+.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer,
+.allClassesContainer, .allPackagesContainer {
     clear:both;
     padding:10px 20px;
     position:relative;
@@ -279,10 +329,10 @@
 .indexContainer {
     margin:10px;
     position:relative;
-    font-size:14px;
+    font-size:12px;
 }
 .indexContainer h2 {
-    font-size:14px;
+    font-size:13px;
     padding:0 0 3px 0;
 }
 .indexContainer ul {
@@ -301,7 +351,8 @@
 }
 .contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd {
     margin:5px 0 10px 0;
-    font-size:15px;
+    font-size:14px;
+    font-family: Verdana, Georgia, "Times New Roman", Times, serif;
 }
 .serializedFormContainer dl.nameValue dt {
     margin-left:1px;
@@ -315,8 +366,11 @@
     display:inline;
 }
 /*
-List styles
-*/
+ * Styles for lists.
+ */
+li.circle {
+    list-style:circle;
+}
 ul.horizontal li {
     display:inline;
     font-size:0.9em;
@@ -369,19 +423,22 @@
     margin-bottom:1px;
 }
 /*
-Table styles
-*/
-.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary {
+ * Styles for tables.
+ */
+.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary,
+.requiresSummary, .packagesSummary, .providesSummary, .usesSummary {
     width:100%;
+    border-spacing:0;
     border-left:1px solid #EEE;
     border-right:1px solid #EEE;
     border-bottom:1px solid #EEE;
 }
-.overviewSummary, .memberSummary  {
+.overviewSummary, .memberSummary, .requiresSummary, .packagesSummary, .providesSummary, .usesSummary  {
     padding:0;
 }
 .overviewSummary caption, .memberSummary caption, .typeSummary caption,
-.useSummary caption, .constantsSummary caption, .deprecatedSummary caption {
+.useSummary caption, .constantsSummary caption, .deprecatedSummary caption,
+.requiresSummary caption, .packagesSummary caption, .providesSummary caption, .usesSummary caption {
     position:relative;
     text-align:left;
     background-repeat:no-repeat;
@@ -389,36 +446,46 @@
     font-weight:bold;
     clear:none;
     overflow:hidden;
-    padding:0;
-    padding-top:10px;
-    padding-left:1px;
+    padding: 10px 0 0 1px;
     margin:0;
     white-space:pre;
 }
 .overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link,
-.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link,
+.constantsSummary caption a:link, .deprecatedSummary caption a:link,
+.requiresSummary caption a:link, .packagesSummary caption a:link, .providesSummary caption a:link,
+.usesSummary caption a:link,
 .overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover,
-.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover,
+.constantsSummary caption a:hover, .deprecatedSummary caption a:hover,
+.requiresSummary caption a:hover, .packagesSummary caption a:hover, .providesSummary caption a:hover,
+.usesSummary caption a:hover,
 .overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active,
-.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active,
+.constantsSummary caption a:active, .deprecatedSummary caption a:active,
+.requiresSummary caption a:active, .packagesSummary caption a:active, .providesSummary caption a:active,
+.usesSummary caption a:active,
 .overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited,
-.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited {
+.constantsSummary caption a:visited, .deprecatedSummary caption a:visited,
+.requiresSummary caption a:visited, .packagesSummary caption a:visited, .providesSummary caption a:visited,
+.usesSummary caption a:visited {
     color:#FFFFFF;
 }
+.useSummary caption a:link, .useSummary caption a:hover, .useSummary caption a:active,
+.useSummary caption a:visited {
+    color:#1f389c;
+}
 .overviewSummary caption span, .memberSummary caption span, .typeSummary caption span,
-.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span {
+.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span,
+.requiresSummary caption span, .packagesSummary caption span, .providesSummary caption span,
+.usesSummary caption span {
     white-space:nowrap;
-    padding-top:5px;
-    padding-left:12px;
-    padding-right:12px;
-    padding-bottom:7px;
+    padding: 5px 12px 7px;
     display:inline-block;
     float:left;
     background-color:#F8981D;
     border: none;
     height:16px;
 }
-.memberSummary caption span.activeTableTab span {
+.memberSummary caption span.activeTableTab span, .packagesSummary caption span.activeTableTab span,
+.overviewSummary caption span.activeTableTab span, .typeSummary caption span.activeTableTab span {
     white-space:nowrap;
     padding-top:5px;
     padding-left:12px;
@@ -429,7 +496,8 @@
     background-color:#F8981D;
     height:16px;
 }
-.memberSummary caption span.tableTab span {
+.memberSummary caption span.tableTab span, .packagesSummary caption span.tableTab span,
+.overviewSummary caption span.tableTab span, .typeSummary caption span.tableTab span {
     white-space:nowrap;
     padding-top:5px;
     padding-left:12px;
@@ -440,7 +508,10 @@
     background-color:#4D7A97;
     height:16px;
 }
-.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab {
+.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab,
+.packagesSummary caption span.tableTab, .packagesSummary caption span.activeTableTab,
+.overviewSummary caption span.tableTab, .overviewSummary caption span.activeTableTab,
+.typeSummary caption span.tableTab, .typeSummary caption span.activeTableTab {
     padding-top:0;
     padding-left:0;
     padding-right:0;
@@ -449,14 +520,16 @@
     display:inline;
 }
 .overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd,
-.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd {
+.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd,
+.requiresSummary .tabEnd, .packagesSummary .tabEnd, .providesSummary .tabEnd, .usesSummary .tabEnd {
     display:none;
     width:5px;
     position:relative;
     float:left;
     background-color:#F8981D;
 }
-.memberSummary .activeTableTab .tabEnd {
+.memberSummary .activeTableTab .tabEnd, .packagesSummary .activeTableTab .tabEnd,
+.overviewSummary .activeTableTab .tabEnd, .typeSummary .activeTableTab .tabEnd {
     display:none;
     width:5px;
     margin-right:3px;
@@ -464,66 +537,88 @@
     float:left;
     background-color:#F8981D;
 }
-.memberSummary .tableTab .tabEnd {
+.memberSummary .tableTab .tabEnd, .packagesSummary .tableTab .tabEnd,
+.overviewSummary .tableTab .tabEnd, .typeSummary .tableTab .tabEnd {
     display:none;
     width:5px;
     margin-right:3px;
     position:relative;
     background-color:#4D7A97;
     float:left;
-
+}
+.rowColor th, .altColor th {
+    font-weight:normal;
 }
 .overviewSummary td, .memberSummary td, .typeSummary td,
-.useSummary td, .constantsSummary td, .deprecatedSummary td {
+.useSummary td, .constantsSummary td, .deprecatedSummary td,
+.requiresSummary td, .packagesSummary td, .providesSummary td, .usesSummary td {
     text-align:left;
     padding:0 0 12px 10px;
 }
-th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th,
-td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{
+th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .useSummary th,
+.constantsSummary th, .packagesSummary th, td.colFirst, td.colSecond, td.colLast, .useSummary td,
+.constantsSummary td {
     vertical-align:top;
     padding-right:0;
     padding-top:8px;
     padding-bottom:3px;
 }
-th.colFirst, th.colLast, th.colOne, .constantsSummary th {
+th.colFirst, th.colSecond, th.colLast, th.colConstructorName, th.colDeprecatedItemName, .constantsSummary th,
+.packagesSummary th {
     background:#dee3e9;
     text-align:left;
     padding:8px 3px 3px 7px;
 }
 td.colFirst, th.colFirst {
-    white-space:nowrap;
-    font-size:14px;
+    font-size:13px;
 }
-td.colLast, th.colLast {
-    font-size:14px;
+td.colSecond, th.colSecond, td.colLast, th.colConstructorName, th.colDeprecatedItemName, th.colLast {
+    font-size:13px;
 }
-td.colOne, th.colOne {
-    font-size:14px;
+.constantsSummary th, .packagesSummary th {
+    font-size:13px;
+}
+.providesSummary th.colFirst, .providesSummary th.colLast, .providesSummary td.colFirst,
+.providesSummary td.colLast {
+    white-space:normal;
+    font-size:13px;
 }
 .overviewSummary td.colFirst, .overviewSummary th.colFirst,
-.useSummary td.colFirst, .useSummary th.colFirst,
-.overviewSummary td.colOne, .overviewSummary th.colOne,
+.requiresSummary td.colFirst, .requiresSummary th.colFirst,
+.packagesSummary td.colFirst, .packagesSummary td.colSecond, .packagesSummary th.colFirst, .packagesSummary th,
+.usesSummary td.colFirst, .usesSummary th.colFirst,
+.providesSummary td.colFirst, .providesSummary th.colFirst,
 .memberSummary td.colFirst, .memberSummary th.colFirst,
-.memberSummary td.colOne, .memberSummary th.colOne,
-.typeSummary td.colFirst{
-    width:25%;
+.memberSummary td.colSecond, .memberSummary th.colSecond, .memberSummary th.colConstructorName,
+.typeSummary td.colFirst, .typeSummary th.colFirst {
     vertical-align:top;
 }
-td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover {
+.packagesSummary th.colLast, .packagesSummary td.colLast {
+    white-space:normal;
+}
+td.colFirst a:link, td.colFirst a:visited,
+td.colSecond a:link, td.colSecond a:visited,
+th.colFirst a:link, th.colFirst a:visited,
+th.colSecond a:link, th.colSecond a:visited,
+th.colConstructorName a:link, th.colConstructorName a:visited,
+th.colDeprecatedItemName a:link, th.colDeprecatedItemName a:visited,
+.constantValuesContainer td a:link, .constantValuesContainer td a:visited,
+.allClassesContainer td a:link, .allClassesContainer td a:visited,
+.allPackagesContainer td a:link, .allPackagesContainer td a:visited {
     font-weight:bold;
 }
 .tableSubHeadingColor {
     background-color:#EEEEFF;
 }
-.altColor {
+.altColor, .altColor th {
     background-color:#FFFFFF;
 }
-.rowColor {
+.rowColor, .rowColor th {
     background-color:#EEEEEF;
 }
 /*
-Content styles
-*/
+ * Styles for contents.
+ */
 .description pre {
     margin-top:0;
 }
@@ -534,27 +629,22 @@
 .docSummary {
     padding:0;
 }
-
 ul.blockList ul.blockList ul.blockList li.blockList h3 {
     font-style:normal;
 }
-
 div.block {
-    font-size:15px;
-    font-family: Helvetica, "Times New Roman", Times, serif;
+    font-size:14px;
+    font-family: Verdana, Georgia, "Times New Roman", Times, serif;
 }
-
 td.colLast div {
     padding-top:0;
 }
-
-
 td.colLast a {
     padding-bottom:3px;
 }
 /*
-Formatting effect styles
-*/
+ * Styles for formatting effect.
+ */
 .sourceLineNo {
     color:green;
     padding:0 30px 0 0;
@@ -569,23 +659,257 @@
     margin:3px 10px 2px 0;
     color:#474747;
 }
-.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink,
-.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel,
-.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink {
+.deprecatedLabel, .descfrmTypeLabel, .implementationLabel, .memberNameLabel, .memberNameLink,
+.moduleLabelInPackage, .moduleLabelInType, .overrideSpecifyLabel, .packageLabelInType,
+.packageHierarchyLabel, .paramLabel, .returnLabel, .seeLabel, .simpleTagLabel,
+.throwsLabel, .typeNameLabel, .typeNameLink, .searchTagLink {
     font-weight:bold;
 }
 .deprecationComment, .emphasizedPhrase, .interfaceName {
     font-style:italic;
 }
-
-div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase,
+.deprecationBlock {
+    font-size:14px;
+    font-family: Verdana, Georgia, "Times New Roman", Times, serif;
+    border-style:solid;
+    border-width:thin;
+    border-radius:10px;
+    padding:10px;
+    margin-bottom:10px;
+    margin-right:10px;
+    display:inline-block;
+}
+div.block div.deprecationComment, div.block div.block span.emphasizedPhrase,
 div.block div.block span.interfaceName {
     font-style:normal;
 }
-
-div.contentContainer ul.blockList li.blockList h2{
+div.contentContainer ul.blockList li.blockList h2 {
     padding-bottom:0;
 }
+/*
+ * Styles for IFRAME.
+ */
+.mainContainer {
+    margin:0 auto;
+    padding:0;
+    height:100%;
+    width:100%;
+    position:fixed;
+    top:0;
+    left:0;
+}
+.leftContainer {
+    height:100%;
+    position:fixed;
+    width:320px;
+}
+.leftTop {
+    position:relative;
+    float:left;
+    width:315px;
+    top:0;
+    left:0;
+    height:30%;
+    border-right:6px solid #ccc;
+    border-bottom:6px solid #ccc;
+}
+.leftBottom {
+    position:relative;
+    float:left;
+    width:315px;
+    bottom:0;
+    left:0;
+    height:70%;
+    border-right:6px solid #ccc;
+    border-top:1px solid #000;
+}
+.rightContainer {
+    position:absolute;
+    left:320px;
+    top:0;
+    bottom:0;
+    height:100%;
+    right:0;
+    border-left:1px solid #000;
+}
+.rightIframe {
+    padding:0;
+    height:100%;
+    right:30px;
+    width:100%;
+    overflow:visible;
+    margin: 0 0 30px;
+}
+/*
+ * Styles specific to HTML5 elements.
+ */
+main, nav, header, footer, section {
+    display:block;
+}
+/*
+ * Styles for javadoc search.
+ */
+.ui-autocomplete-category {
+    font-weight:bold;
+    font-size:15px;
+    padding:7px 0 7px 3px;
+    background-color:#4D7A97;
+    color:#FFFFFF;
+}
+.resultItem {
+    font-size:13px;
+}
+.ui-autocomplete {
+    max-height:85%;
+    max-width:65%;
+    overflow-y:scroll;
+    overflow-x:scroll;
+    white-space:nowrap;
+    box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23);
+}
+ul.ui-autocomplete {
+    position:fixed;
+    z-index:999999;
+}
+ul.ui-autocomplete  li {
+    float:left;
+    clear:both;
+    width:100%;
+}
+.resultHighlight {
+    font-weight:bold;
+}
+#search {
+    background-image:url('resources/glass.png');
+    background-size:13px;
+    background-repeat:no-repeat;
+    background-position:2px 3px;
+    padding-left:20px;
+    position:relative;
+    right:-18px;
+}
+#reset {
+    background-color: rgb(255,255,255);
+    background-image:url('resources/x.png');
+    background-position:center;
+    background-repeat:no-repeat;
+    background-size:12px;
+    border:0 none;
+    width:16px;
+    height:17px;
+    position:relative;
+    left:-4px;
+    top:-4px;
+    font-size:0;
+}
+.watermark {
+    color:#545454;
+}
+.searchTagDescResult {
+    font-style:italic;
+    font-size:11px;
+}
+.searchTagHolderResult {
+    font-style:italic;
+    font-size:12px;
+}
+.searchTagResult:before, .searchTagResult:target {
+    color:red;
+}
+.moduleGraph span {
+    display:none;
+    position:absolute;
+}
+.moduleGraph:hover span {
+    display:block;
+    margin: -100px 0 0 100px;
+    z-index: 1;
+}
+.methodSignature {
+    white-space:normal;
+    color: #4d7a97;
+    font-weight: 700;
+}
+
+/*
+ * Styles for user-provided tables.
+ *
+ * borderless:
+ *      No borders, vertical margins, styled caption.
+ *      This style is provided for use with existing doc comments.
+ *      In general, borderless tables should not be used for layout purposes.
+ *
+ * plain:
+ *      Plain borders around table and cells, vertical margins, styled caption.
+ *      Best for small tables or for complex tables for tables with cells that span
+ *      rows and columns, when the "striped" style does not work well.
+ *
+ * striped:
+ *      Borders around the table and vertical borders between cells, striped rows,
+ *      vertical margins, styled caption.
+ *      Best for tables that have a header row, and a body containing a series of simple rows.
+ */
+
+table.borderless,
+table.plain,
+table.striped {
+    margin-top: 10px;
+    margin-bottom: 10px;
+}
+table.borderless > caption,
+table.plain > caption,
+table.striped > caption {
+    font-weight: bold;
+    font-size: smaller;
+}
+table.borderless th, table.borderless td,
+table.plain th, table.plain td,
+table.striped th, table.striped td {
+    padding: 2px 5px;
+}
+table.borderless,
+table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th,
+table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td {
+    border: none;
+}
+table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr {
+    background-color: transparent;
+}
+table.plain {
+    border-collapse: collapse;
+    border: 1px solid black;
+}
+table.plain > thead > tr, table.plain > tbody tr, table.plain > tr {
+    background-color: transparent;
+}
+table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th,
+table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td {
+    border: 1px solid black;
+}
+table.striped {
+    border-collapse: collapse;
+    border: 1px solid black;
+}
+table.striped > thead {
+    background-color: #E3E3E3;
+}
+table.striped > thead > tr > th, table.striped > thead > tr > td {
+    border: 1px solid black;
+}
+table.striped > tbody > tr:nth-child(even) {
+    background-color: #EEE
+}
+table.striped > tbody > tr:nth-child(odd) {
+    background-color: #FFF
+}
+table.striped > tbody > tr > th, table.striped > tbody > tr > td {
+    border-left: 1px solid black;
+    border-right: 1px solid black;
+}
+table.striped > tbody > tr > th {
+    font-weight: normal;
+}
+
 
 /* ================================================================= */
 
diff --git a/pom.xml b/pom.xml
index 9336402..30ac327 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,30 +24,30 @@
     
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <apache.httpcomponents.ver>4.5.7</apache.httpcomponents.ver>
-        <apache.common.lang.ver>3.8.1</apache.common.lang.ver>
-        <commons.validator.ver>1.6</commons.validator.ver>
-        <gson.ver>2.8.5</gson.ver>
-        <log4j.ver>2.11.2</log4j.ver>
-        <nlpcraft.ver>0.5.0</nlpcraft.ver>
-        <junit.ver>5.4.0</junit.ver>
-        <maven.compiler.version>3.7.0</maven.compiler.version>
-        <maven.exec.version>1.6.0</maven.exec.version>
-        <maven.shade.plugin.ver>3.1.0</maven.shade.plugin.ver>
+        <apache.httpcomponents.ver>4.5.13</apache.httpcomponents.ver>
+        <apache.common.lang.ver>3.11</apache.common.lang.ver>
+        <commons.validator.ver>1.7</commons.validator.ver>
+        <gson.ver>2.8.6</gson.ver>
+        <log4j.ver>2.14.0</log4j.ver>
+        <nlpcraft.ver>0.7.2</nlpcraft.ver>
+        <junit.ver>5.7.0</junit.ver>
+        <maven.compiler.version>3.8.0</maven.compiler.version>
+        <maven.shade.plugin.ver>3.2.4</maven.shade.plugin.ver>
         <maven.source.plugin.ver>3.0.1</maven.source.plugin.ver>
         <maven.gpg.plugin.ver>1.6</maven.gpg.plugin.ver>
         <maven.enforcer.plugin.ver>1.4.1</maven.enforcer.plugin.ver>
-        <maven.surefire.plugin.ver>2.22.1</maven.surefire.plugin.ver>
+        <maven.surefire.plugin.ver>2.22.2</maven.surefire.plugin.ver>
         <maven.javadoc.plugin.ver>3.2.0</maven.javadoc.plugin.ver>
-        <maven.jar.plugin.ver>3.1.1</maven.jar.plugin.ver>
+        <maven.jar.plugin.ver>3.2.0</maven.jar.plugin.ver>
         <apache.rat.plugin.ver>0.13</apache.rat.plugin.ver>
         <maven.bazaarvoice.plugin.ver>0.9</maven.bazaarvoice.plugin.ver>
+        <maven.clean.plugin.ver>3.1.0</maven.clean.plugin.ver>
     </properties>
 
     <name>NLPCraft - Java Client</name>
     <groupId>org.apache.nlpcraft</groupId>
     <artifactId>java-client</artifactId>
-    <version>0.5.0</version>
+    <version>0.7.2</version>
     <url>https://nlpcraft.apache.org</url>
     <description>An open source API to convert natural language into actions.</description>
 
@@ -84,7 +84,7 @@
         <connection>scm:git:ssh://git@github.com/apache/incubator-nlpcraft.git</connection>
         <developerConnection>scm:git:ssh://git@github.com/apache/incubator-nlpcraft.git</developerConnection>
         <!-- Set actual tag name here -->
-        <tag>v0.5.0</tag>
+        <tag>v0.7.2</tag>
     </scm>
 
     <dependencies>
@@ -139,8 +139,8 @@
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>${maven.compiler.version}</version>
                 <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
+                    <source>11</source>
+                    <target>11</target>
                 </configuration>
             </plugin>
             <plugin>
@@ -151,12 +151,15 @@
                     <rules>
                         <requireJavaVersion>
                             <message>
-                                [INFO] ------------------------------------------------------------------------
-                                [ERROR] You are trying to compile NLPCraft with inappropriate JDK version!
-                                [ERROR] Detected JDK Version: ${java.runtime.version}
-                                [ERROR] JDK version should be &gt;= 1.8.0_1.
+
+                                ------------------------------------------------------------------------
+                                You are trying to compile NLPCraft with inappropriate JDK version!
+                                Detected JDK Version: ${java.runtime.version}
+                                JDK version should be 11 or later
+                                ------------------------------------------------------------------------
+
                             </message>
-                            <version>1.8,11</version>
+                            <version>11</version>
                         </requireJavaVersion>
                     </rules>
                 </configuration>
@@ -173,8 +176,6 @@
                 <artifactId>maven-javadoc-plugin</artifactId>
                 <version>${maven.javadoc.plugin.ver}</version>
                 <configuration>
-                    <source>1.8</source>
-                    <!-- Required as of JDK 8u121 -->
                     <additionalOptions>--allow-script-in-comments, -Xdoclint:none</additionalOptions>
                     <javadocDirectory>${project.basedir}/javadoc</javadocDirectory>
                     <docfilessubdirs>true</docfilessubdirs>
@@ -202,13 +203,14 @@
                             <link href="{@docRoot}/resources/sh/styles/shCoreNlpCraft.css" rel="stylesheet" type="text/css" title="Style">
                             <link href="{@docRoot}/resources/sh/styles/shThemeNlpCraft.css" rel="stylesheet" type="text/css" title="Style">
                             <link href="https://fonts.googleapis.com/css?family=Roboto+Mono" rel="stylesheet">
+                            <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
                             <script async defer src="https://buttons.github.io/buttons.js"></script>
                         ]]>
                     </top>
                     <!-- Disabled because of https://bugs.openjdk.java.net/browse/JDK-8193030 -->
                     <!-- <subpackages>org.apache.nlpcraft.client</subpackages> -->
                     <excludePackageNames>
-                        org.apache.nlpcraft.client.impl
+                        org.apache.nlpcraft.client.impl:org.apache.nlpcraft.client.impl.beans
                     </excludePackageNames>
                     <groups>
                         <group>
@@ -250,7 +252,7 @@
                     </footer>
                     <doctitle>
                         <![CDATA[
-                            Apache NLPCraft - Java Client API <span style="font-size: 80%">${project.version}</span>
+                            <img style="margin-top: 15px" src="https://nlpcraft.apache.org/images/nlpcraft_logo_darkblue.png" height="54px">
                         ]]>
                     </doctitle>
                     <windowtitle>Apache NLPCraft - Java Client ${project.version}</windowtitle>
@@ -324,13 +326,27 @@
                             <goal>start</goal>
                         </goals>
                         <configuration>
+                            <!--
+                                Depending on the console config and how maven is run this will produce the output with ANSI colors.
+                                To strip out ANSI escape sequences from the log file, see the following:
+                                https://stackoverflow.com/questions/17998978/removing-colors-from-output
+                            -->
                             <name>server</name>
                             <healthcheckUrl>http://localhost:8081/api/v1/health</healthcheckUrl>
-                            <waitAfterLaunch>180</waitAfterLaunch>
+                            <waitAfterLaunch>600</waitAfterLaunch>
                             <arguments>
                                 <argument>java</argument>
                                 <argument>-Xmx4G</argument>
                                 <argument>-Xms4G</argument>
+                                <argument>--add-exports=java.base/jdk.internal.misc=ALL-UNNAMED</argument>
+                                <argument>--add-exports=java.base/sun.nio.ch=ALL-UNNAMED</argument>
+                                <argument>--add-exports=java.management/com.sun.jmx.mbeanserver=ALL-UNNAMED</argument>
+                                <argument>--add-exports=jdk.internal.jvmstat/sun.jvmstat.monitor=ALL-UNNAMED</argument>
+                                <argument>--add-exports=java.base/sun.reflect.generics.reflectiveObjects=ALL-UNNAMED</argument>
+                                <argument>--add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED</argument>
+                                <argument>--illegal-access=permit</argument>
+                                <argument>-DNLPCRAFT_ANSI_COLOR_DISABLED=true</argument> <!-- Remove ANSI at least from NLPCraft output. -->
+                                <argument>-Djdk.tls.client.protocols=TLSv1.2</argument>
                                 <argument>-cp</argument>
                                 <argument>${project.build.directory}/server-lib/*</argument>
                                 <argument>org.apache.nlpcraft.server.NCServer</argument>
@@ -371,6 +387,15 @@
                             <includes>
                                 <include>**/*.*</include>
                             </includes>
+                            <excludes>
+                                <!--
+                                    Some tests skipped on maven `verify` phase.
+                                    ===========================================
+                                -->
+                                <!-- Reason: 'contextWordServer' should be started. -->
+                                <exclude>**/NCModelTest.*</exclude>
+                            </excludes>
+
                         </configuration>
                     </execution>
                 </executions>
diff --git a/src/main/java/org/apache/nlpcraft/client/NCClient.java b/src/main/java/org/apache/nlpcraft/client/NCClient.java
index ed25952..283d913 100644
--- a/src/main/java/org/apache/nlpcraft/client/NCClient.java
+++ b/src/main/java/org/apache/nlpcraft/client/NCClient.java
@@ -21,9 +21,9 @@
 import java.util.*;
 
 /**
- * Java client API. Java REST client provides native and easy-to-use wrapper for NLPCraft
- * <a target=_ href="https://nlpcraft.apache.org/using-rest.html">REST APIs</a> for any JVM-based languages
- * like Java, Scala, Kotlin or Groovy. Note that NLPCraft REST APIs allow to submit the request to existing
+ * <b>Java client API</b> provides native JVM wrapper for NLPCraft
+ * <a target=_ href="https://nlpcraft.apache.org/using-rest.html">REST APIs</a>. Note that NLPCraft REST APIs allow to
+ * submit the request to existing
  * deployed data model and perform other related, auxiliary operations. To create data models you need to
  * use main <a target=_ href="https://nlpcraft.apache.org/apis/latest/index.html">NLPCraft APIs</a>.
  * <p>
@@ -542,6 +542,21 @@
      * @throws IOException Thrown in case of generic I/O errors.
      */
     void deleteCompany() throws NCClientException, IOException;
+
+    /**
+     * Runs <a href="https://nlpcraft.apache.org/tools/syn_tool.html">synonym suggestion tool</a> for given model
+     * ID and minimal score.
+     *
+     * @param mdlId ID Of the model to run the tool for.
+     * @param minScore Minimum score to include into the result, ranging from 0 to 1, default is 0.
+     *      Score of 0 will include all results, and score of 1 will include only results with the absolutely highest
+     *      confidence score. Values between 0.5 and 0.7 is generally suggested.
+     * @return Suggestion data container.
+     * @throws NCClientException Thrown in case of client-specific errors.
+     * @throws IOException Thrown in case of generic I/O errors.
+     * @see <a href="https://nlpcraft.apache.org/tools/syn_tool.html">Synonym suggestion tool</a>.
+     */
+    NCSuggestionData suggestSynonyms(String mdlId, Double minScore)  throws NCClientException, IOException;
     
     /**
      * Closes the client and signs out from the REST server. Any further calls to this client will result in
diff --git a/src/main/java/org/apache/nlpcraft/client/NCSuggestion.java b/src/main/java/org/apache/nlpcraft/client/NCSuggestion.java
new file mode 100644
index 0000000..cb90f1c
--- /dev/null
+++ b/src/main/java/org/apache/nlpcraft/client/NCSuggestion.java
@@ -0,0 +1,39 @@
+/*
+ * 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.client;
+
+/**
+ * Individual synonym suggestion returned from {@link NCSuggestionData#getSynonyms()} method.
+ *
+ * @see <a href="https://nlpcraft.apache.org/tools/syn_tool.html">Synonym suggestion tool</a>.
+ */
+public interface NCSuggestion {
+    /**
+     * Gets score of the suggested synonym.
+     *
+     * @return Score of the suggested synonym.
+     */
+    double getScore();
+
+    /**
+     * Gets synonym.
+     *
+     * @return A synonym.
+     */
+    String getSynonym();
+}
diff --git a/src/main/java/org/apache/nlpcraft/client/NCSuggestionData.java b/src/main/java/org/apache/nlpcraft/client/NCSuggestionData.java
new file mode 100644
index 0000000..967b7f0
--- /dev/null
+++ b/src/main/java/org/apache/nlpcraft/client/NCSuggestionData.java
@@ -0,0 +1,77 @@
+/*
+ * 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.client;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Result container returned by {@link NCClient#suggestSynonyms(String, Double)} method.
+ *
+ * @see <a href="https://nlpcraft.apache.org/tools/syn_tool.html">Synonym suggestion tool</a>.
+ */
+public interface NCSuggestionData {
+    /**
+     * Gets model ID.
+     *
+     * @return model ID.
+     */
+    String getModelId();
+
+    /**
+     * Gets minimal score used.
+     *
+     * @return Minimal score used.
+     */
+    double getMinScore();
+
+    /**
+     * Gets duration of the operation in milliseconds.
+     *
+     * @return Duration of the operation in milliseconds.
+     */
+    long getDurationMs();
+
+    /**
+     * Gets timestamp of the operation.
+     *
+     * @return Timestamp of the operation.
+     */
+    long getTimestamp();
+
+    /**
+     * Gets optional error message.
+     *
+     * @return Error message or {@code null} if there was no error.
+     */
+    String getError();
+
+    /**
+     * Gets list of synonym suggestions for each model element ID.
+     *
+     * @return List of synonym suggestions for each model element ID.
+     */
+    List<Map<String, List<NCSuggestion>>> getSynonyms();
+
+    /**
+     * Optional list of warnings.
+     *
+     * @return List of warnings or {@code null} if there's no warnings.
+     */
+    List<String> getWarnings();
+}
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/NCClientImpl.java b/src/main/java/org/apache/nlpcraft/client/impl/NCClientImpl.java
index 6a5c55b..e2957c9 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/NCClientImpl.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/NCClientImpl.java
@@ -39,6 +39,7 @@
 import org.apache.nlpcraft.client.NCNewCompany;
 import org.apache.nlpcraft.client.NCProbe;
 import org.apache.nlpcraft.client.NCResult;
+import org.apache.nlpcraft.client.NCSuggestionData;
 import org.apache.nlpcraft.client.NCUser;
 import org.apache.nlpcraft.client.impl.beans.NCAskBean;
 import org.apache.nlpcraft.client.impl.beans.NCAskSyncBean;
@@ -52,12 +53,13 @@
 import org.apache.nlpcraft.client.impl.beans.NCRequestStateBean;
 import org.apache.nlpcraft.client.impl.beans.NCSigninBean;
 import org.apache.nlpcraft.client.impl.beans.NCStatusResponseBean;
+import org.apache.nlpcraft.client.impl.beans.NCSuggestionResultBean;
 import org.apache.nlpcraft.client.impl.beans.NCTokenCreationBean;
 import org.apache.nlpcraft.client.impl.beans.NCUserAddBean;
 import org.apache.nlpcraft.client.impl.beans.NCUserBean;
 import org.apache.nlpcraft.client.impl.beans.NCUsersAllBean;
-import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
-import org.apache.nlpcraft.probe.embedded.NCEmbeddedResult;
+import org.apache.nlpcraft.model.tools.embedded.NCEmbeddedProbe;
+import org.apache.nlpcraft.model.tools.embedded.NCEmbeddedResult;
 
 import java.io.IOException;
 import java.lang.reflect.Type;
@@ -324,7 +326,7 @@
      */
     private <T extends NCStatusResponseBean> T checkAndExtract(String js, Type type) throws NCClientException {
         T t = gson.fromJson(js, type);
-        
+
         checkStatus(t.getStatus());
         
         return t;
@@ -340,7 +342,7 @@
      * @throws IllegalStateException
      */
     @SafeVarargs
-    private final String post(String url, Pair<String, Object>... ps) throws NCClientException, IOException {
+    private String post(String url, Pair<String, Object>... ps) throws NCClientException, IOException {
         if (!started)
             throw new IllegalStateException("Client is not initialized.");
         
@@ -403,7 +405,7 @@
     
                 if (js == null)
                     throw new NCClientException(String.format("Unexpected empty response [code=%d]", code));
-    
+
                 if (code == 200)
                     return js;
     
@@ -437,16 +439,6 @@
     }
     
     /**
-     * @param v
-     * @param name
-     * @throws IllegalArgumentException
-     */
-    private void notNull(Object v, String name) throws IllegalArgumentException {
-        if (v == null)
-            throw new IllegalArgumentException(String.format("Parameter cannot be null: '%s'", name));
-    }
-    
-    /**
      *
      * @return
      * @throws IOException
@@ -566,7 +558,7 @@
                     "user/get",
                     Pair.of("acsTok", acsTok),
                     Pair.of("id", id),
-                    Pair.of("extId", extId)
+                    Pair.of("usrExtId", extId)
                 ),
                 NCUserBean.class
             );
@@ -990,4 +982,19 @@
             )
         );
     }
+
+    @Override
+    public NCSuggestionData suggestSynonyms(String mdlId, Double minScore) throws NCClientException, IOException {
+        NCSuggestionResultBean res = checkAndExtract(
+            post(
+                "model/sugsyn",
+                Pair.of("acsTok", acsTok),
+                Pair.of("mdlId", mdlId),
+                Pair.of("minScore", minScore)
+            ),
+            NCSuggestionResultBean.class
+        );
+
+        return res.getResult();
+    }
 }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCAskBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCAskBean.java
index 774a781..4423647 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCAskBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCAskBean.java
@@ -25,9 +25,6 @@
 public class NCAskBean extends NCStatusResponseBean  {
     @SerializedName("srvReqId") private String srvReqId;
 
-    /**
-     * Gets server request ID.
-     */
     public String getServerRequestId() {
         return srvReqId;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCAskSyncBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCAskSyncBean.java
index 53c436b..aac9c33 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCAskSyncBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCAskSyncBean.java
@@ -25,9 +25,6 @@
 public class NCAskSyncBean extends NCStatusResponseBean  {
     @SerializedName("state") private NCRequestStateBean state;
 
-    /**
-     * Gets request state.
-     */
     public NCRequestStateBean getState() {
         return state;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCheckBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCheckBean.java
index 40828d5..93a3a99 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCheckBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCheckBean.java
@@ -27,9 +27,6 @@
 public class NCCheckBean extends NCStatusResponseBean  {
     @SerializedName("states") private List<NCRequestStateBean> states;
 
-    /**
-     * Gets the list of request states.
-     */
     public List<NCRequestStateBean> getStates() {
         return states;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCompanyBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCompanyBean.java
index 287428b..5b522f8 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCompanyBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCompanyBean.java
@@ -33,43 +33,28 @@
     @SerializedName("address") private String address;
     @SerializedName("postalCode") private String postalCode;
     
-    @Override
-    public long getId() {
+    @Override public long getId() {
         return id;
     }
-    
-    @Override
-    public String getName() {
+    @Override public String getName() {
         return name;
     }
-    
-    @Override
-    public String getWebsite() {
+    @Override public String getWebsite() {
         return website;
     }
-    
-    @Override
-    public String getCountry() {
+    @Override public String getCountry() {
         return country;
     }
-    
-    @Override
-    public String getRegion() {
+    @Override public String getRegion() {
         return region;
     }
-    
-    @Override
-    public String getCity() {
+    @Override public String getCity() {
         return city;
     }
-    
-    @Override
-    public String getAddress() {
+    @Override public String getAddress() {
         return address;
     }
-    
-    @Override
-    public String getPostalCode() {
+    @Override public String getPostalCode() {
         return postalCode;
     }
 }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCompanyTokenResetBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCompanyTokenResetBean.java
index db419f7..5fed10d 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCompanyTokenResetBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCCompanyTokenResetBean.java
@@ -25,9 +25,6 @@
 public class NCCompanyTokenResetBean extends NCStatusResponseBean  {
     @SerializedName("token") private String token;
 
-    /**
-     * Gets new company token.
-     */
     public String getToken() {
         return token;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCErrorMessageBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCErrorMessageBean.java
index 05cc30d..73c0d79 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCErrorMessageBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCErrorMessageBean.java
@@ -26,16 +26,9 @@
     @SerializedName("code") private String code;
     @SerializedName("msg") private String msg;
 
-    /**
-     * Gets error code.
-     */
     public String getCode() {
         return code;
     }
-
-    /**
-     * Gets error message.
-     */
     public String getMessage() {
         return msg;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackAddBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackAddBean.java
index b55f0d6..d94d03b 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackAddBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackAddBean.java
@@ -25,9 +25,6 @@
 public class NCFeedbackAddBean extends NCStatusResponseBean  {
     @SerializedName("id") private Long id;
 
-    /**
-     * ID of the newly added feedback record.
-     */
     public Long getId() {
         return id;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackAllBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackAllBean.java
index 8464432..91f753a 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackAllBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackAllBean.java
@@ -27,9 +27,6 @@
 public class NCFeedbackAllBean extends NCStatusResponseBean  {
     @SerializedName("feedback") private List<NCFeedbackBean> feedback;
 
-    /**
-     * Gets the list of all feedback records.
-     */
     public List<NCFeedbackBean> getFeedback() {
         return feedback;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackBean.java
index c40b2a4..119ab65 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCFeedbackBean.java
@@ -29,75 +29,41 @@
     private double score;
     private String comment;
     private long createTstamp;
-    
-    @Override
-    public long getId() {
+
+    @Override public String getServerRequestId() {
+        return srvReqId;
+    }
+    @Override public long getCreateTimestamp() {
+        return createTstamp;
+    }
+    @Override public long getUserId() {
+        return usrId;
+    }
+    @Override public double getScore() {
+        return score;
+    }
+    @Override public String getComment() {
+        return comment;
+    }
+    @Override public long getId() {
         return id;
     }
 
-    /**
-     * Sets feedback record ID.
-     */
     public void setId(long id) {
         this.id = id;
     }
-
-    @Override
-    public String getServerRequestId() {
-        return srvReqId;
-    }
-
-    /**
-     * Sets server request ID.
-     */
     public void setServerRequestId(String srvReqId) {
         this.srvReqId = srvReqId;
     }
-    
-    @Override
-    public long getUserId() {
-        return usrId;
-    }
-
-    /**
-     * Sets user ID.
-     */
     public void setUsrId(long usrId) {
         this.usrId = usrId;
     }
-    
-    @Override
-    public double getScore() {
-        return score;
-    }
-
-    /**
-     * Sets feedback score.
-     */
     public void setScore(double score) {
         this.score = score;
     }
-    
-    @Override
-    public String getComment() {
-        return comment;
-    }
-
-    /**
-     * Sets feedback comment.
-     */
     public void setComment(String comment) {
         this.comment = comment;
     }
-    
-    @Override
-    public long getCreateTimestamp() {
-        return createTstamp;
-    }
-
-    /**
-     * Sets create timestamp.
-     */
     public void setCreateTstamp(long createTstamp) {
         this.createTstamp = createTstamp;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCModelBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCModelBean.java
index fa6a293..1fcf975 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCModelBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCModelBean.java
@@ -28,18 +28,13 @@
     @SerializedName("name") private String name;
     @SerializedName("version") private String version;
     
-    @Override
-    public String getId() {
+    @Override public String getId() {
         return id;
     }
-    
-    @Override
-    public String getName() {
+    @Override public String getName() {
         return name;
     }
-    
-    @Override
-    public String getVersion() {
+    @Override public String getVersion() {
         return version;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCProbeBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCProbeBean.java
index 635a03c..86f9dda 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCProbeBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCProbeBean.java
@@ -21,6 +21,7 @@
 import org.apache.nlpcraft.client.NCModel;
 import org.apache.nlpcraft.client.NCProbe;
 
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -48,98 +49,23 @@
     @SerializedName("macAddr") private String macAddr;
     @SerializedName("models") private Set<NCModelBean> models;
     
-    @Override
-    public String getProbeToken() {
-        return probeToken;
-    }
-    
-    @Override
-    public String getId() {
-        return id;
-    }
-    
-    @Override
-    public String getProbeGuid() {
-        return probeGuid;
-    }
-    
-    @Override
-    public String getProbeApiVersion() {
-        return probeApiVersion;
-    }
-    
-    @Override
-    public String getProbeApiDate() {
-        return probeApiDate;
-    }
-    
-    @Override
-    public String getOsVersion() {
-        return osVersion;
-    }
-    
-    @Override
-    public String getOsName() {
-        return osName;
-    }
-    
-    @Override
-    public String getOsArchitecture() {
-        return osArch;
-    }
-    
-    @Override
-    public long getStartTimestamp() {
-        return startTstamp;
-    }
-    
-    @Override
-    public String getTimezoneId() {
-        return tmzId;
-    }
-    
-    @Override
-    public String getTimezoneAbbreviation() {
-        return tmzAbbr;
-    }
-    
-    @Override
-    public String getTimezoneName() {
-        return tmzName;
-    }
-    
-    @Override
-    public String getUserName() {
-        return userName;
-    }
-    
-    @Override
-    public String getJavaVersion() {
-        return javaVersion;
-    }
-    
-    @Override
-    public String getJavaVendor() {
-        return javaVendor;
-    }
-    
-    @Override
-    public String getHostName() {
-        return hostName;
-    }
-    
-    @Override
-    public String getHostAddress() {
-        return hostAddr;
-    }
-    
-    @Override
-    public String getMacAddress() {
-        return macAddr;
-    }
-    
-    @Override
-    public Set<NCModel> getModels() {
-        return new HashSet<>(models);
-    }
+    @Override public String getProbeToken() { return probeToken; }
+    @Override public String getId() { return id; }
+    @Override public String getProbeGuid() { return probeGuid; }
+    @Override public String getProbeApiVersion() { return probeApiVersion; }
+    @Override public String getProbeApiDate() { return probeApiDate; }
+    @Override public String getOsVersion() { return osVersion; }
+    @Override public String getOsName() { return osName; }
+    @Override public String getOsArchitecture() { return osArch; }
+    @Override public long getStartTimestamp() { return startTstamp; }
+    @Override public String getTimezoneId() { return tmzId; }
+    @Override public String getTimezoneAbbreviation() { return tmzAbbr; }
+    @Override public String getTimezoneName() { return tmzName; }
+    @Override public String getUserName() { return userName; }
+    @Override public String getJavaVersion() { return javaVersion; }
+    @Override public String getJavaVendor() { return javaVendor; }
+    @Override public String getHostName() { return hostName; }
+    @Override public String getHostAddress() { return hostAddr; }
+    @Override public String getMacAddress() { return macAddr; }
+    @Override public Set<NCModel> getModels() { return models != null ? new HashSet<>(models) : Collections.emptySet(); }
 }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCProbesAllBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCProbesAllBean.java
index 9434003..e9a9f64 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCProbesAllBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCProbesAllBean.java
@@ -27,9 +27,6 @@
 public class NCProbesAllBean extends NCStatusResponseBean  {
     @SerializedName("probes") private List<NCProbeBean> probes;
 
-    /**
-     * Gets all probes.
-     */
     public List<NCProbeBean> getProbes() {
         return probes;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCRequestStateBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCRequestStateBean.java
index 544e390..f50f9cf 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCRequestStateBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCRequestStateBean.java
@@ -21,7 +21,6 @@
 
 /**
  * REST bean.
- * TODO: doc
  */
 public class NCRequestStateBean implements NCResult {
     private String srvReqId;
@@ -36,101 +35,70 @@
     private String error;
     private String logHolder;
     
-    @Override
-    public String getServerRequestId() {
+    @Override public String getServerRequestId() {
         return srvReqId;
     }
-    
-    @Override
-    public String getText() {
-        return txt;
-    }
-    
-    @Override
-    public long getUserId() {
-        return usrId;
-    }
-    
-    @Override
-    public String getModelId() {
-        return mdlId;
-    }
-    
-    @Override
-    public String getProbeId() {
-        return probeId;
-    }
-    
-    @Override
-    public String getResultType() {
-        return resType;
-    }
-    
-    @Override
-    public String getResultBody() {
-        return resBody;
-    }
-    
-    @Override
-    public boolean isReady() {
-        return "QRY_READY".equals(status);
-    }
-    
-    @Override
-    public Integer getErrorCode() {
-        return errorCode;
-    }
-    
-    @Override
-    public String getErrorMessage() {
-        return error;
-    }
-    
-    @Override
-    public String getLogHolder() {
+    @Override public String getText() {
+    return txt;
+}
+    @Override public long getUserId() {
+    return usrId;
+}
+    @Override public String getModelId() {
+    return mdlId;
+}
+    @Override public String getProbeId() {
+    return probeId;
+}
+    @Override public String getResultType() {
+    return resType;
+}
+    @Override public String getResultBody() {
+    return resBody;
+}
+    @Override public boolean isReady() {
+    return "QRY_READY".equals(status);
+}
+    @Override public Integer getErrorCode() {
+    return errorCode;
+}
+    @Override public String getErrorMessage() {
+    return error;
+}
+    @Override public String getLogHolder() {
         return logHolder;
     }
     
     public void setSrvReqId(String srvReqId) {
         this.srvReqId = srvReqId;
     }
-    
     public void setTxt(String txt) {
         this.txt = txt;
     }
-    
     public void setUsrId(long usrId) {
         this.usrId = usrId;
     }
-    
     public void setMdlId(String mdlId) {
         this.mdlId = mdlId;
     }
-    
     public void setProbeId(String probeId) {
         this.probeId = probeId;
     }
-    
     public void setResType(String resType) {
         this.resType = resType;
     }
-    
     public void setResBody(String resBody) {
         this.resBody = resBody;
     }
-    
     public void setStatus(String status) {
         this.status = status;
     }
-    
     public void setErrorCode(Integer errorCode) {
         this.errorCode = errorCode;
     }
-    
     public void setError(String error) {
         this.error = error;
     }
-    
     public void setLogHolder(String logHolder) {
         this.logHolder = logHolder;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSigninBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSigninBean.java
index 1e69237..1051b85 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSigninBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSigninBean.java
@@ -25,9 +25,6 @@
 public class NCSigninBean extends NCStatusResponseBean  {
     @SerializedName("acsTok") private String acsTok;
 
-    /**
-     * Gets newly acquired access token.
-     */
     public String getAccessToken() {
         return acsTok;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCStatusResponseBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCStatusResponseBean.java
index 4a101e9..c3ac263 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCStatusResponseBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCStatusResponseBean.java
@@ -25,9 +25,6 @@
 public class NCStatusResponseBean {
     @SerializedName("status") private String status;
 
-    /**
-     * Gets response status.
-     */
     public String getStatus() {
         return status;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSuggestionBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSuggestionBean.java
new file mode 100644
index 0000000..943bfde
--- /dev/null
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSuggestionBean.java
@@ -0,0 +1,36 @@
+/*
+ * 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.client.impl.beans;
+
+import com.google.gson.annotations.SerializedName;
+import org.apache.nlpcraft.client.NCSuggestion;
+
+/**
+ * REST bean.
+ */
+public class NCSuggestionBean implements NCSuggestion {
+    @SerializedName("score") private double score;
+    @SerializedName("synonym") private String synonym;
+
+    @Override public double getScore() {
+        return score;
+    }
+    @Override public String getSynonym() {
+        return synonym;
+    }
+}
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSuggestionDataBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSuggestionDataBean.java
new file mode 100644
index 0000000..d1e7d75
--- /dev/null
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSuggestionDataBean.java
@@ -0,0 +1,67 @@
+/*
+ * 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.client.impl.beans;
+
+import com.google.gson.annotations.SerializedName;
+import org.apache.nlpcraft.client.NCSuggestionData;
+import org.apache.nlpcraft.client.NCSuggestion;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * REST bean.
+ */
+public class NCSuggestionDataBean implements NCSuggestionData {
+    @SerializedName("modelId") private String modelId;
+    @SerializedName("minScore") private double minScore;
+    @SerializedName("durationMs") private long durationMs;
+    @SerializedName("timestamp") private long timestamp;
+    @SerializedName("error") private String error;
+    @SerializedName("suggestions") private List<Map<String, List<NCSuggestionBean>>> suggestions;
+    @SerializedName("warnings") private java.util.List<String> warnings;
+
+    @Override public List<String> getWarnings() { return warnings; }
+    @Override public String getModelId() {
+        return modelId;
+    }
+    @Override public double getMinScore() {
+        return minScore;
+    }
+    @Override public long getDurationMs() {
+        return durationMs;
+    }
+    @Override public long getTimestamp() { return timestamp; }
+    @Override public String getError() { return error; }
+
+    @Override
+    public List<Map<String, List<NCSuggestion>>> getSynonyms() {
+        return suggestions == null ?
+            null :
+            suggestions.stream().map(
+                p -> p.entrySet().stream().collect(
+                    Collectors.toMap(
+                        Map.Entry::getKey,
+                        x -> (List<NCSuggestion>) new ArrayList<NCSuggestion>(x.getValue())
+                    )
+                )
+            ).collect(Collectors.toList());
+    }
+}
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSuggestionResultBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSuggestionResultBean.java
new file mode 100644
index 0000000..304bb39
--- /dev/null
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCSuggestionResultBean.java
@@ -0,0 +1,31 @@
+/*
+ * 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.client.impl.beans;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * REST bean.
+ */
+public class NCSuggestionResultBean extends NCStatusResponseBean  {
+    @SerializedName("result") private NCSuggestionDataBean result;
+
+    public NCSuggestionDataBean getResult() {
+        return result;
+    }
+}
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCTokenCreationBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCTokenCreationBean.java
index 65aa440..fb1dc78 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCTokenCreationBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCTokenCreationBean.java
@@ -27,13 +27,10 @@
     @SerializedName("token") private String token;
     @SerializedName("adminId") private long adminId;
     
-    @Override
-    public String getToken() {
+    @Override public String getToken() {
         return token;
     }
-    
-    @Override
-    public long getAdminUserId() {
+    @Override public long getAdminUserId() {
         return adminId;
     }
 }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUserAddBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUserAddBean.java
index 0077791..e6086e3 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUserAddBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUserAddBean.java
@@ -25,9 +25,6 @@
 public class NCUserAddBean extends NCStatusResponseBean  {
     @SerializedName("id") private long id;
 
-    /**
-     * Gets ID of the newly created user.
-     */
     public long getId() {
         return id;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUserBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUserBean.java
index 84cad39..4f9b5df 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUserBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUserBean.java
@@ -27,7 +27,7 @@
  */
 public class NCUserBean extends NCStatusResponseBean implements NCUser {
     @SerializedName("id") private long id;
-    @SerializedName("extId") private String extId;
+    @SerializedName("usrExtId") private String usrExtId;
     @SerializedName("email") private String email;
     @SerializedName("firstName") private String firstName;
     @SerializedName("lastName") private String lastName;
@@ -35,43 +35,28 @@
     @SerializedName("isAdmin") private boolean isAdmin;
     @SerializedName("properties") private Map<String, String> properties;
     
-    @Override
-    public long getId() {
+    @Override public long getId() {
         return id;
     }
-    
-    @Override
-    public String getEmail() {
+    @Override public String getEmail() {
         return email;
     }
-    
-    @Override
-    public String getFirstName() {
-        return firstName;
-    }
-    
-    @Override
-    public String getLastName() {
-        return lastName;
-    }
-    
-    @Override
-    public String getAvatarUrl() {
-        return avatarUrl;
-    }
-    
-    @Override
-    public boolean isAdmin() {
-        return isAdmin;
-    }
-    
-    @Override
-    public String getExternalId() {
-        return extId;
-    }
-    
-    @Override
-    public Map<String, String> getProperties() {
+    @Override public String getFirstName() {
+    return firstName;
+}
+    @Override public String getLastName() {
+    return lastName;
+}
+    @Override public String getAvatarUrl() {
+    return avatarUrl;
+}
+    @Override public boolean isAdmin() {
+    return isAdmin;
+}
+    @Override public String getExternalId() {
+    return usrExtId;
+}
+    @Override public Map<String, String> getProperties() {
         return properties;
     }
 }
diff --git a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUsersAllBean.java b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUsersAllBean.java
index c35bac1..3808dd3 100644
--- a/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUsersAllBean.java
+++ b/src/main/java/org/apache/nlpcraft/client/impl/beans/NCUsersAllBean.java
@@ -27,9 +27,6 @@
 public class NCUsersAllBean extends NCStatusResponseBean  {
     @SerializedName("users") private List<NCUserBean> users;
 
-    /**
-     * Gets the list of users.
-     */
     public List<NCUserBean> getUsers() {
         return users;
     }
diff --git a/src/main/java/org/apache/nlpcraft/client/package-info.java b/src/main/java/org/apache/nlpcraft/client/package-info.java
index 08c01cc..84eb8d9 100644
--- a/src/main/java/org/apache/nlpcraft/client/package-info.java
+++ b/src/main/java/org/apache/nlpcraft/client/package-info.java
@@ -19,5 +19,19 @@
  * NLPCraft Java Client API - provides native wrapper for
  * <a target=_ href="https://nlpcraft.apache.org/using-rest.html">REST APIs</a> for any JVM-based languages
  * like Java, Scala, Kotlin or Groovy.
+ * <p>
+ * <b>Usage</b><br>
+ * Java client usage is straightforward - create client instance using {@link org.apache.nlpcraft.client.NCClientBuilder} and use the
+ * client instance for all API calls:
+ * <pre class="brush: java">
+ *     // Get client instance with all defaults.
+ *     NCClient cli = new NCClientBuilder().build();
+ *
+ *     // Perform any necessary calls...
+ *     NCResult res = cli.askSync("my.model.id", txt);
+ *
+ *     // Close client &amp; sign out at the end.
+ *     cli.close();
+ * </pre>
  */
 package org.apache.nlpcraft.client;
\ No newline at end of file
diff --git a/src/test/java/org/apache/nlpcraft/client/NCAskSyncTest.java b/src/test/java/org/apache/nlpcraft/client/NCAskSyncTest.java
index 102deb7..4a0c80a 100644
--- a/src/test/java/org/apache/nlpcraft/client/NCAskSyncTest.java
+++ b/src/test/java/org/apache/nlpcraft/client/NCAskSyncTest.java
@@ -17,23 +17,22 @@
 
 package org.apache.nlpcraft.client;
 
-import org.apache.nlpcraft.examples.alarm.AlarmModel;
+import org.apache.nlpcraft.client.models.NCCommonSpecModel;
 import org.apache.nlpcraft.model.NCModel;
 import org.junit.jupiter.api.Test;
 
 import java.util.Optional;
 import java.util.function.Consumer;
 
+import static org.apache.nlpcraft.client.models.NCCommonSpecModel.MDL_ID;
+
 /**
  * REST client test. Method `ask/sync`.
  */
 class NCAskSyncTest extends NCTestAdapter {
-    //
-    private static final String MDL_ID = "nlpcraft.alarm.ex";
-
     @Override
     Optional<Class<? extends NCModel>> getModelClass() {
-        return Optional.of(AlarmModel.class);
+        return Optional.of(NCCommonSpecModel.class);
     }
 
     /**
@@ -66,8 +65,6 @@
         // Only latin charset is supported.
         check("El tiempo en España", this::checkError);
     
-        check("Ping me in 3 minutes", this::checkOk);
-        check("Buzz me in an hour and 15mins", this::checkOk);
-        check("Set my alarm for 30s", this::checkOk);
+        check("test", this::checkOk);
     }
 }
diff --git a/src/test/java/org/apache/nlpcraft/client/NCAskTest.java b/src/test/java/org/apache/nlpcraft/client/NCAskTest.java
index dcefb9c..78e0d1a 100644
--- a/src/test/java/org/apache/nlpcraft/client/NCAskTest.java
+++ b/src/test/java/org/apache/nlpcraft/client/NCAskTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.nlpcraft.client;
 
-import org.apache.nlpcraft.examples.alarm.AlarmModel;
+import org.apache.nlpcraft.client.models.NCCommonSpecModel;
 import org.apache.nlpcraft.model.NCModel;
 import org.junit.jupiter.api.Test;
 
@@ -25,6 +25,7 @@
 import java.util.Optional;
 import java.util.function.Consumer;
 
+import static org.apache.nlpcraft.client.models.NCCommonSpecModel.MDL_ID;
 import static org.junit.jupiter.api.Assertions.fail;
 
 /**
@@ -32,14 +33,11 @@
  */
 class NCAskTest extends NCTestAdapter {
     /** */
-    private static final String MDL_ID = "nlpcraft.alarm.ex";
-    
-    /** */
     private static final int MAX_TEST_TIME = 20000;
 
     @Override
     Optional<Class<? extends NCModel>> getModelClass() {
-        return Optional.of(AlarmModel.class);
+        return Optional.of(NCCommonSpecModel.class);
     }
 
     /**
@@ -85,7 +83,7 @@
      */
     @Test
     void test() throws Exception {
-        test0("Ping me in 3 minutes", this::checkOk);
+        test0("test", this::checkOk);
         test0("El tiempo en España", this::checkError);
     }
 }
diff --git a/src/test/java/org/apache/nlpcraft/client/NCClearConversationTest.java b/src/test/java/org/apache/nlpcraft/client/NCClearConversationTest.java
new file mode 100644
index 0000000..7dc0e49
--- /dev/null
+++ b/src/test/java/org/apache/nlpcraft/client/NCClearConversationTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.client;
+
+import org.apache.nlpcraft.client.models.NCConversationSpecModel;
+import org.apache.nlpcraft.model.NCModel;
+import org.junit.jupiter.api.Test;
+
+import java.util.Optional;
+import java.util.function.Consumer;
+
+/**
+ * REST client test. Methods `clear/conversation`.
+ */
+class NCClearConversationTest extends NCTestAdapter {
+    @Override
+    Optional<Class<? extends NCModel>> getModelClass() {
+        return Optional.of(NCConversationSpecModel.class);
+    }
+
+    /**
+     * @param txt
+     * @param resConsumer
+     * @throws Exception
+     */
+    private void check(String txt, Consumer<NCResult> resConsumer) throws Exception {
+        resConsumer.accept(admCli.askSync(NCConversationSpecModel.MDL_ID, txt, null, true, null, null));
+    }
+
+    private void flow() throws Exception {
+        // missed 'test1'
+        check("test2", this::checkError);
+
+        check("test1 test2", this::checkOk);
+
+        // 'test1' received from conversation.
+        check("test2", this::checkOk);
+    }
+
+    /**
+     * @throws Exception
+     */
+    @Test
+    void test() throws Exception {
+        flow();
+
+        admCli.clearConversation(
+            NCConversationSpecModel.MDL_ID,
+            // Finds its own ID.
+            get(admCli.getAllUsers(), (u) -> NCClientBuilder.DFLT_EMAIL.equals(u.getEmail())).getId(),
+            null
+        );
+
+        flow();
+
+        admCli.clearConversation(NCConversationSpecModel.MDL_ID, null, null);
+
+        flow();
+    }
+}
diff --git a/src/test/java/org/apache/nlpcraft/client/NCClearDialogTest.java b/src/test/java/org/apache/nlpcraft/client/NCClearDialogTest.java
new file mode 100644
index 0000000..92a871d
--- /dev/null
+++ b/src/test/java/org/apache/nlpcraft/client/NCClearDialogTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.client;
+
+import org.apache.nlpcraft.client.models.NCDialogSpecModel;
+import org.apache.nlpcraft.model.NCModel;
+import org.junit.jupiter.api.Test;
+
+import java.util.Optional;
+import java.util.function.Consumer;
+
+/**
+ * REST client test. Methods `clear/dialog`.
+ */
+class NCClearDialogTest extends NCTestAdapter {
+    @Override
+    Optional<Class<? extends NCModel>> getModelClass() {
+        return Optional.of(NCDialogSpecModel.class);
+    }
+
+    /**
+     * @param txt
+     * @param resConsumer
+     * @throws Exception
+     */
+    private void check(String txt, Consumer<NCResult> resConsumer) throws Exception {
+        resConsumer.accept(admCli.askSync(NCDialogSpecModel.MDL_ID, txt, null, true, null, null));
+    }
+
+    /**
+     *
+     * @throws Exception
+     */
+    private void flow() throws Exception {
+        // There isn't `test1` before.
+        check("test2", this::checkError);
+
+        // `test1` is always ok.
+        check("test1", this::checkOk);
+
+        // There is one `test1` before.
+        check("test2", this::checkOk);
+
+        // `test1` is always ok.
+        check("test1", this::checkOk);
+        check("test1", this::checkOk);
+
+        // There are too much `test1` before.
+        // TODO:
+        //check("test2", this::checkError);
+    }
+
+    /**
+     *
+     * @throws Exception
+     */
+    @Test
+    void test() throws Exception {
+        flow();
+
+        admCli.clearDialog(NCDialogSpecModel.MDL_ID, null, null);
+        admCli.clearConversation(NCDialogSpecModel.MDL_ID, null, null);
+
+        flow();
+    }
+}
diff --git a/src/test/java/org/apache/nlpcraft/client/NCConversationTest.java b/src/test/java/org/apache/nlpcraft/client/NCConversationTest.java
deleted file mode 100644
index 7dcc5d0..0000000
--- a/src/test/java/org/apache/nlpcraft/client/NCConversationTest.java
+++ /dev/null
@@ -1,83 +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.client;
-
-import org.apache.nlpcraft.examples.weather.WeatherModel;
-import org.apache.nlpcraft.model.NCModel;
-import org.junit.jupiter.api.Test;
-
-import java.util.Optional;
-import java.util.function.Consumer;
-
-/**
- * REST client test. Methods `clear/conversation`.
- */
-class NCConversationTest extends NCTestAdapter {
-    /**
-     *
-     */
-    private static final String MDL_ID = "nlpcraft.weather.ex";
-
-    @Override
-    Optional<Class<? extends NCModel>> getModelClass() {
-        return Optional.of(WeatherModel.class);
-    }
-
-    /**
-     * @param txt
-     * @param resConsumer
-     * @throws Exception
-     */
-    private void check(String txt, Consumer<NCResult> resConsumer) throws Exception {
-        resConsumer.accept(admCli.askSync(MDL_ID, txt, null, true, null, null));
-    }
-
-    /**
-     * @throws Exception
-     */
-    @Test
-    void test1() throws Exception {
-        check("What's the weather in Moscow?", this::checkOk);
-
-        // Should be answered with conversation.
-        check("Moscow", this::checkOk);
-
-        admCli.clearConversation(MDL_ID, null, null);
-
-        // Cannot be answered without conversation.
-        check("Moscow", this::checkError);
-    }
-
-    /**
-     * @throws Exception
-     */
-    @Test
-    void test2() throws Exception {
-        check("What's the weather in Moscow?", this::checkOk);
-
-        // Should be answered with conversation.
-        check("Moscow", this::checkOk);
-
-        admCli.clearConversation(MDL_ID,
-            // Finds its own ID.
-            get(admCli.getAllUsers(), (u) -> NCClientBuilder.DFLT_EMAIL.equals(u.getEmail())).getId(), null);
-
-        // Cannot be answered without conversation.
-        check("Moscow", this::checkError);
-    }
-}
diff --git a/src/test/java/org/apache/nlpcraft/client/NCFeedbackTest.java b/src/test/java/org/apache/nlpcraft/client/NCFeedbackTest.java
index 572afe7..7d2fb71 100644
--- a/src/test/java/org/apache/nlpcraft/client/NCFeedbackTest.java
+++ b/src/test/java/org/apache/nlpcraft/client/NCFeedbackTest.java
@@ -17,24 +17,22 @@
 
 package org.apache.nlpcraft.client;
 
-import org.apache.nlpcraft.examples.alarm.AlarmModel;
+import org.apache.nlpcraft.client.models.NCCommonSpecModel;
 import org.apache.nlpcraft.model.NCModel;
 import org.junit.jupiter.api.Test;
 
 import java.util.Optional;
 
+import static org.apache.nlpcraft.client.models.NCCommonSpecModel.MDL_ID;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 /**
  * REST client test. Methods `ask`.
  */
 class NCFeedbackTest extends NCTestAdapter {
-    /** */
-    private static final String MDL_ID = "nlpcraft.alarm.ex";
-
     @Override
     Optional<Class<? extends NCModel>> getModelClass() {
-        return Optional.of(AlarmModel.class);
+        return Optional.of(NCCommonSpecModel.class);
     }
 
     /**
@@ -45,7 +43,7 @@
      */
     private void test0(Long usrId, String usrExtId) throws Exception {
         // Adds request.
-        String srvReqId = admCli.ask(MDL_ID, "Ping me in 3 minutes", null, false, usrId, usrExtId);
+        String srvReqId = admCli.ask(MDL_ID, "test", null, false, usrId, usrExtId);
     
         // Creates 2 feedback.
         long fId1 = admCli.addFeedback(srvReqId, 0.5, null, usrId, usrExtId);
@@ -64,7 +62,7 @@
     
         // Creates 2 feedback.
         admCli.addFeedback(srvReqId, 0.5, null, usrId, usrExtId);
-        admCli.addFeedback(srvReqId, 0.1, "Somme comment", usrId, usrExtId);
+        admCli.addFeedback(srvReqId, 0.1, "Some comment", usrId, usrExtId);
     
         // Checks their existing.
         assertEquals(2, admCli.getAllFeedback(null, usrId, usrExtId).size());
diff --git a/src/test/java/org/apache/nlpcraft/client/NCModelTest.java b/src/test/java/org/apache/nlpcraft/client/NCModelTest.java
new file mode 100644
index 0000000..de94337
--- /dev/null
+++ b/src/test/java/org/apache/nlpcraft/client/NCModelTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.client;
+
+import org.apache.nlpcraft.client.models.NCSuggestionSpecModel;
+import org.apache.nlpcraft.model.NCModel;
+import org.junit.jupiter.api.Test;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static org.apache.nlpcraft.client.models.NCSuggestionSpecModel.MDL_ID;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * REST client test. Methods `model/sugsyn`.
+ */
+class NCModelTest extends NCTestAdapter {
+    @Override
+    Optional<Class<? extends NCModel>> getModelClass() {
+        return Optional.of(NCSuggestionSpecModel.class);
+    }
+
+    /**
+     *
+     * @param s
+     * @param minScore
+     * @throws Exception
+     */
+    private static void check(NCSuggestionData s, double minScore) {
+        assertNotNull(s);
+
+        assertNull(s.getError());
+        assertNotNull(s.getModelId());
+        assertNotNull(s.getSynonyms());
+        assertFalse(s.getSynonyms().isEmpty());
+        assertFalse(s.getSynonyms().isEmpty());
+        assertEquals(minScore, s.getMinScore());
+
+        List<NCSuggestion> allSugs =
+            s.getSynonyms().
+                stream().
+                flatMap(p -> p.values().stream().flatMap(Collection::stream)).
+                collect(Collectors.toList());
+
+        assertFalse(allSugs.isEmpty());
+
+        allSugs.forEach(sugg -> {
+            assertNotNull(sugg.getSynonym());
+            assertTrue(sugg.getScore() >= minScore);
+        });
+    }
+
+    /**
+     * @throws Exception
+     */
+    @Test
+    void testSuggestionSynonym() throws Exception {
+        check(admCli.suggestSynonyms(MDL_ID, null), 0);
+        check(admCli.suggestSynonyms(MDL_ID, 0.5), 0.5);
+    }
+}
diff --git a/src/test/java/org/apache/nlpcraft/client/NCMultiClientsTest.java b/src/test/java/org/apache/nlpcraft/client/NCMultiClientsTest.java
index 099e182..6dbd361 100644
--- a/src/test/java/org/apache/nlpcraft/client/NCMultiClientsTest.java
+++ b/src/test/java/org/apache/nlpcraft/client/NCMultiClientsTest.java
@@ -18,8 +18,9 @@
 package org.apache.nlpcraft.client;
 
 import org.apache.http.client.config.RequestConfig;
-import org.apache.nlpcraft.examples.alarm.AlarmModel;
+import org.apache.nlpcraft.client.models.NCCommonSpecModel;
 import org.apache.nlpcraft.model.NCModel;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
 import java.util.Optional;
@@ -31,17 +32,15 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.nlpcraft.client.models.NCCommonSpecModel.MDL_ID;
 
 /**
  * REST client test. Methods `ask`.
  */
 class NCMultiClientsTest extends NCTestAdapter {
-    /** */
-    private static final String MDL_ID = "nlpcraft.alarm.ex";
-
     @Override
     Optional<Class<? extends NCModel>> getModelClass() {
-        return Optional.of(AlarmModel.class);
+        return Optional.of(NCCommonSpecModel.class);
     }
 
     /**
@@ -63,7 +62,7 @@
         long maxTime = System.currentTimeMillis() + testTimeMs;
     
         CountDownLatch cdl = new CountDownLatch(clientsCnt);
-        
+
         for (int i = 0; i < clientsCnt; i++) {
             int fi = i;
             
@@ -84,7 +83,7 @@
                         while (System.currentTimeMillis() < maxTime && err.get() == null) {
                             client.ask(
                                 MDL_ID,
-                                "Ping me in 3 minutes",
+                                "test",
                                 null,
                                 false,
                                 null,
@@ -93,7 +92,7 @@
     
                             System.out.println("Request sent [reqNum=" + cnt.incrementAndGet() + ", clientNum=" + fi + ']');
     
-                            Thread.sleep(rnd.nextInt(500) + 1);
+                            Thread.sleep(rnd.nextInt(400) + 100);
                         }
                     }
                     finally {
@@ -113,10 +112,15 @@
         }
         
         cdl.await(timeoutMs * 2, MILLISECONDS);
-    
-        if (err.get() != null)
-            throw err.get();
-    
+
+        Throwable t = err.get();
+
+        if (t != null) {
+            t.printStackTrace();
+
+            Assertions.fail(t.getMessage());
+        }
+
         System.out.println("Clients count: " + clientsCnt);
         System.out.println("Processed requests: " + cnt.get());
     }
diff --git a/src/test/java/org/apache/nlpcraft/client/NCPermissionsTest.java b/src/test/java/org/apache/nlpcraft/client/NCPermissionsTest.java
index 9e9cad5..1242f77 100644
--- a/src/test/java/org/apache/nlpcraft/client/NCPermissionsTest.java
+++ b/src/test/java/org/apache/nlpcraft/client/NCPermissionsTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.nlpcraft.client;
 
-import org.apache.nlpcraft.examples.alarm.AlarmModel;
+import org.apache.nlpcraft.client.models.NCCommonSpecModel;
 import org.apache.nlpcraft.model.NCModel;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -25,19 +25,18 @@
 
 import java.util.Optional;
 
+import static org.apache.nlpcraft.client.models.NCCommonSpecModel.MDL_ID;
+
 /**
  * REST client test. Checks user permissions.
  */
 class NCPermissionsTest extends NCTestAdapter {
     /** */
-    private static final String MDL_ID = "nlpcraft.alarm.ex";
-    
-    /** */
     private NCClient client;
 
     @Override
     Optional<Class<? extends NCModel>> getModelClass() {
-        return Optional.of(AlarmModel.class);
+        return Optional.of(NCCommonSpecModel.class);
     }
 
     /**
diff --git a/src/test/java/org/apache/nlpcraft/client/NCProbesTest.java b/src/test/java/org/apache/nlpcraft/client/NCProbesTest.java
index 0285558..5d6fb80 100644
--- a/src/test/java/org/apache/nlpcraft/client/NCProbesTest.java
+++ b/src/test/java/org/apache/nlpcraft/client/NCProbesTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.nlpcraft.client;
 
-import org.apache.nlpcraft.examples.alarm.AlarmModel;
+import org.apache.nlpcraft.client.models.NCCommonSpecModel;
 import org.apache.nlpcraft.model.NCModel;
 import org.junit.jupiter.api.Test;
 
@@ -31,7 +31,7 @@
 class NCProbesTest extends NCTestAdapter {
     @Override
     Optional<Class<? extends NCModel>> getModelClass() {
-        return Optional.of(AlarmModel.class);
+        return Optional.of(NCCommonSpecModel.class);
     }
 
     /**
diff --git a/src/test/java/org/apache/nlpcraft/client/NCTestAdapter.java b/src/test/java/org/apache/nlpcraft/client/NCTestAdapter.java
index d8a329d..bdd7a9c 100644
--- a/src/test/java/org/apache/nlpcraft/client/NCTestAdapter.java
+++ b/src/test/java/org/apache/nlpcraft/client/NCTestAdapter.java
@@ -18,7 +18,7 @@
 package org.apache.nlpcraft.client;
 
 import org.apache.nlpcraft.model.NCModel;
-import org.apache.nlpcraft.probe.embedded.NCEmbeddedProbe;
+import org.apache.nlpcraft.model.tools.embedded.NCEmbeddedProbe;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 
@@ -54,7 +54,7 @@
     protected long admUsrId;
 
     /** */
-    private final Optional<Class<? extends NCModel>> mdlOpt = getModelClass();
+    private Class<? extends NCModel> mdlClass;
 
     /**
      *
@@ -70,7 +70,10 @@
      */
     @BeforeEach
     void setUp() throws Exception {
-        mdlOpt.ifPresent(NCEmbeddedProbe::start);
+        mdlClass = getModelClass().orElse(null);
+
+        if (mdlClass != null)
+            NCEmbeddedProbe.start(mdlClass);
 
         admCli = new NCClientBuilder().build();
         
@@ -92,7 +95,7 @@
             admCli.close();
         }
 
-        if (mdlOpt.isPresent())
+        if (mdlClass != null)
             NCEmbeddedProbe.stop();
     }
     
@@ -163,8 +166,8 @@
     protected<T> T get(List<T> list, Predicate<T> p) {
         Optional<T> opt = getOpt(list, p);
     
-        if (!opt.isPresent())
-            fail("Object not found");
+        if (opt.isEmpty())
+            fail("Object not found in list: " + list);
     
         return opt.get();
     }
@@ -174,13 +177,11 @@
      * @param state
      */
     protected void checkOk(NCResult state) {
-        System.out.println(
-            String.format(
-                "Text: %s \ntype: %s\nresult: %s",
-                state.getText(),
-                state.getResultType(),
-                state.getResultBody()
-            )
+        System.out.printf(
+            "Text: %s \ntype: %s\nresult: %s%n",
+            state.getText(),
+            state.getResultType(),
+            state.getResultBody()
         );
     
         if (state.getLogHolder() != null)
@@ -199,13 +200,11 @@
     protected void checkError(NCResult state) {
         assert state != null;
         
-        System.out.println(
-            String.format(
-                "Text: %s \nerror: %s\ncode: %d",
-                state.getText(),
-                state.getErrorMessage(),
-                state.getErrorCode()
-            )
+        System.out.printf(
+            "Text: %s \nerror: %s\ncode: %d%n",
+            state.getText(),
+            state.getErrorMessage(),
+            state.getErrorCode()
         );
     
         if (state.getLogHolder() != null)
diff --git a/src/test/java/org/apache/nlpcraft/client/NCUserTest.java b/src/test/java/org/apache/nlpcraft/client/NCUserTest.java
index ff0fa15..61151de 100644
--- a/src/test/java/org/apache/nlpcraft/client/NCUserTest.java
+++ b/src/test/java/org/apache/nlpcraft/client/NCUserTest.java
@@ -17,13 +17,14 @@
 
 package org.apache.nlpcraft.client;
 
-import org.apache.nlpcraft.examples.alarm.AlarmModel;
+import org.apache.nlpcraft.client.models.NCCommonSpecModel;
 import org.apache.nlpcraft.model.NCModel;
 import org.junit.jupiter.api.Test;
 
 import java.util.List;
 import java.util.Optional;
 
+import static org.apache.nlpcraft.client.models.NCCommonSpecModel.MDL_ID;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 
@@ -31,12 +32,9 @@
  * REST client test. Methods `user/*`.
  */
 class NCUserTest extends NCTestAdapter {
-    /** */
-    private static final String MDL_ID = "nlpcraft.alarm.ex";
-
     @Override
     Optional<Class<? extends NCModel>> getModelClass() {
-        return Optional.of(AlarmModel.class);
+        return Optional.of(NCCommonSpecModel.class);
     }
 
     /**
@@ -172,7 +170,7 @@
         String extId = "extId";
     
         // Implicitly creates user with external ID.
-        admCli.askSync(MDL_ID, "Ping me in 3 minutes", null, false, null, extId);
+        admCli.askSync(MDL_ID, "test", null, false, null, extId);
     
         NCUser newUser = get(admCli.getAllUsers(), (u) -> extId.equals(u.getExternalId()));
     
@@ -195,7 +193,7 @@
         String extId = "extId";
     
         // Implicitly creates user with external ID.
-        admCli.askSync(MDL_ID, "Ping me in 3 minutes", null, false, null, extId);
+        admCli.askSync(MDL_ID, "test", null, false, null, extId);
     
         // Updates existing user with given external ID.
         admCli.addUser(
diff --git a/src/test/java/org/apache/nlpcraft/client/models/NCCommonSpecModel.java b/src/test/java/org/apache/nlpcraft/client/models/NCCommonSpecModel.java
new file mode 100644
index 0000000..03b20af
--- /dev/null
+++ b/src/test/java/org/apache/nlpcraft/client/models/NCCommonSpecModel.java
@@ -0,0 +1,46 @@
+/*
+ * 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.client.models;
+
+import org.apache.nlpcraft.model.NCElement;
+import org.apache.nlpcraft.model.NCIntent;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * Test model.
+ */
+public class NCCommonSpecModel extends NCSpecModelAdapter {
+    public static final String MDL_ID = NCCommonSpecModel.class.getSimpleName();
+
+    @Override
+    public String getId() {
+        return MDL_ID;
+    }
+
+    @Override
+    public Set<NCElement> getElements() {
+        return Collections.singleton(mkElement("test"));
+    }
+
+    @NCIntent("intent=intentId term~{id == 'test'}")
+    public org.apache.nlpcraft.model.NCResult onTest() {
+        return org.apache.nlpcraft.model.NCResult.text("OK");
+    }
+}
diff --git a/src/test/java/org/apache/nlpcraft/client/models/NCConversationSpecModel.java b/src/test/java/org/apache/nlpcraft/client/models/NCConversationSpecModel.java
new file mode 100644
index 0000000..2050631
--- /dev/null
+++ b/src/test/java/org/apache/nlpcraft/client/models/NCConversationSpecModel.java
@@ -0,0 +1,48 @@
+/*
+ * 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.client.models;
+
+import org.apache.nlpcraft.model.NCElement;
+import org.apache.nlpcraft.model.NCIntent;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * Test model.
+ */
+public class NCConversationSpecModel extends NCSpecModelAdapter {
+    public static final String MDL_ID = NCConversationSpecModel.class.getSimpleName();
+
+    @Override
+    public String getId() {
+        return MDL_ID;
+    }
+    @Override
+    public Set<NCElement> getElements() {
+        return Stream.of(mkElement("test1"), mkElement("test2")).collect(Collectors.toCollection(HashSet::new));
+    }
+
+    // 'test1' is mandatory, 'test2' is optional.
+    @NCIntent("intent=intentId term~{id == 'test1'} term~{id == 'test2'}?")
+    public org.apache.nlpcraft.model.NCResult onTest() {
+        return org.apache.nlpcraft.model.NCResult.text("OK");
+    }
+}
diff --git a/src/test/java/org/apache/nlpcraft/client/models/NCDialogSpecModel.java b/src/test/java/org/apache/nlpcraft/client/models/NCDialogSpecModel.java
new file mode 100644
index 0000000..1176259
--- /dev/null
+++ b/src/test/java/org/apache/nlpcraft/client/models/NCDialogSpecModel.java
@@ -0,0 +1,53 @@
+/*
+ * 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.client.models;
+
+import org.apache.nlpcraft.model.NCElement;
+import org.apache.nlpcraft.model.NCIntent;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * Test model.
+ */
+public class NCDialogSpecModel extends NCSpecModelAdapter {
+    public static final String MDL_ID = NCDialogSpecModel.class.getSimpleName();
+
+    @Override
+    public String getId() {
+        return MDL_ID;
+    }
+
+    @Override
+    public Set<NCElement> getElements() {
+        return Stream.of(mkElement("test1"), mkElement("test2")).collect(Collectors.toCollection(HashSet::new));
+    }
+
+    @NCIntent("intent=intentId1 term~{id == 'test1'}")
+    public org.apache.nlpcraft.model.NCResult onTest1() {
+        return org.apache.nlpcraft.model.NCResult.text("OK");
+    }
+
+    @NCIntent("intent=intentId2 flow='intentId1[1,1]' term~{id == 'test2'}")
+    public org.apache.nlpcraft.model.NCResult onTest2() {
+        return org.apache.nlpcraft.model.NCResult.text("OK");
+    }
+}
diff --git a/src/test/java/org/apache/nlpcraft/client/models/NCSpecModelAdapter.java b/src/test/java/org/apache/nlpcraft/client/models/NCSpecModelAdapter.java
new file mode 100644
index 0000000..8816a9b
--- /dev/null
+++ b/src/test/java/org/apache/nlpcraft/client/models/NCSpecModelAdapter.java
@@ -0,0 +1,59 @@
+/*
+ * 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.client.models;
+
+import org.apache.nlpcraft.model.NCElement;
+import org.apache.nlpcraft.model.NCModel;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Test model adapter.
+ */
+abstract class NCSpecModelAdapter implements NCModel {
+    @Override
+    public String getName() {
+        return getId();
+    }
+
+    @Override
+    public String getVersion() {
+        return "1.0.0";
+    }
+
+    protected NCElement mkElement(String id, String... syns) {
+        return new NCElement() {
+            @Override
+            public String getId() {
+                return id;
+            }
+
+            @Override
+            public List<String> getSynonyms() {
+                List<String> l = new ArrayList<>();
+
+                l.add(id);
+                l.addAll(Arrays.asList(syns));
+
+                return l;
+            }
+        };
+    }
+}
diff --git a/src/test/java/org/apache/nlpcraft/client/models/NCSuggestionSpecModel.java b/src/test/java/org/apache/nlpcraft/client/models/NCSuggestionSpecModel.java
new file mode 100644
index 0000000..c4875f9
--- /dev/null
+++ b/src/test/java/org/apache/nlpcraft/client/models/NCSuggestionSpecModel.java
@@ -0,0 +1,48 @@
+/*
+ * 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.client.models;
+
+import org.apache.nlpcraft.model.NCElement;
+import org.apache.nlpcraft.model.NCIntent;
+import org.apache.nlpcraft.model.NCIntentSample;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * Test model.
+ */
+public class NCSuggestionSpecModel extends NCSpecModelAdapter {
+    public static final String MDL_ID = NCSuggestionSpecModel.class.getSimpleName();
+
+    @Override
+    public String getId() {
+        return MDL_ID;
+    }
+
+    @Override
+    public Set<NCElement> getElements() {
+        return Collections.singleton(mkElement( "test"));
+    }
+
+    @NCIntentSample({"Tests passed well"})
+    @NCIntent("intent=intentId term~{id == 'test'}")
+    public org.apache.nlpcraft.model.NCResult onTest() {
+        return org.apache.nlpcraft.model.NCResult.text("OK");
+    }
+}
