You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by ar...@apache.org on 2021/03/09 17:43:50 UTC

[incubator-nlpcraft] 02/02: WIP.

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

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

commit 7ed48e115f6d46bdf8a961355441b84dfdf1bb5e
Author: Aaron Radzinski <ar...@apache.org>
AuthorDate: Tue Mar 9 09:43:37 2021 -0800

    WIP.
---
 .../intent/compiler}/antlr4/NCIntentDsl.interp     |   0
 .../intent/compiler}/antlr4/NCIntentDsl.tokens     |   0
 .../compiler}/antlr4/NCIntentDslBaseListener.java  |   4 +-
 .../compiler/antlr4/NCIntentDslBaseVisitor.java    | 308 ++++++++++++++
 .../compiler}/antlr4/NCIntentDslLexer.interp       |   0
 .../intent/compiler}/antlr4/NCIntentDslLexer.java  |   4 +-
 .../compiler}/antlr4/NCIntentDslLexer.tokens       |   0
 .../compiler}/antlr4/NCIntentDslListener.java      |   4 +-
 .../intent/compiler}/antlr4/NCIntentDslParser.java | 214 +++++++++-
 .../intent/compiler/antlr4/NCIntentDslVisitor.java | 274 ++++++++++++
 .../scala/org/apache/nlpcraft/common/package.scala |   3 -
 .../nlpcraft/model/impl/json/NCModelJson.java      |   8 +-
 .../NCIntentDslBaselCompiler.scala                 | 182 ++++----
 .../{impl => compiler}/NCIntentDslCompiler.scala   |  88 ++--
 .../NCIntentDslFragmentCache.scala                 |  48 +--
 .../{impl => compiler}/antlr4/NCIntentDsl.g4       |   0
 .../{impl => compiler}/antlr4/NCIntentDsl.interp   |   0
 .../{impl => compiler}/antlr4/NCIntentDsl.tokens   |   0
 .../antlr4/NCIntentDslBaseListener.java            |   2 +-
 .../antlr4/NCIntentDslLexer.interp                 |   0
 .../antlr4/NCIntentDslLexer.java                   |   5 +-
 .../antlr4/NCIntentDslLexer.tokens                 |   0
 .../antlr4/NCIntentDslListener.java                |   2 +-
 .../antlr4/NCIntentDslParser.java                  |   5 +-
 .../intent/{impl => solver}/NCIntentSolver.scala   |   7 +-
 .../{impl => solver}/NCIntentSolverEngine.scala    | 189 ++++----
 .../{impl => solver}/NCIntentSolverInput.scala     |   2 +-
 .../{impl => solver}/NCIntentSolverResult.scala    |   4 +-
 .../{impl => solver}/NCIntentSolverVariant.scala   |  35 +-
 .../model/intent/utils/NCDslTokenChecker.scala     |  46 --
 .../model/intent/utils/NCDslTokenPredicate.java    | 473 ---------------------
 .../model/intent/utils/NCDslTokenQualifier.scala   |  62 ---
 .../apache/nlpcraft/probe/mgrs/NCProbeModel.scala  |   2 +-
 .../probe/mgrs/deploy/NCDeployManager.scala        |   4 +-
 .../mgrs/dialogflow/NCDialogFlowManager.scala      |   2 +-
 .../probe/mgrs/nlp/NCProbeEnrichmentManager.scala  |   2 +-
 .../dsl/compiler/NCIntentDslCompilerSpec.scala     |   3 +-
 37 files changed, 1078 insertions(+), 904 deletions(-)

diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDsl.interp
similarity index 100%
copy from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
copy to nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDsl.interp
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDsl.tokens
similarity index 100%
copy from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
copy to nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDsl.tokens
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslBaseListener.java
similarity index 99%
copy from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
copy to nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslBaseListener.java
index 3c6c2cf..93503f4 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
+++ b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslBaseListener.java
@@ -1,5 +1,5 @@
-// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
-package org.apache.nlpcraft.model.intent.impl.antlr4;
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
+package org.apache.nlpcraft.model.intent.compiler.antlr4;
 
 import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.tree.ErrorNode;
diff --git a/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslBaseVisitor.java b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslBaseVisitor.java
new file mode 100644
index 0000000..6944592
--- /dev/null
+++ b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslBaseVisitor.java
@@ -0,0 +1,308 @@
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
+package org.apache.nlpcraft.model.intent.compiler.antlr4;
+import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor;
+
+/**
+ * This class provides an empty implementation of {@link NCIntentDslVisitor},
+ * which can be extended to create a visitor which only needs to handle a subset
+ * of the available methods.
+ *
+ * @param <T> The return type of the visit operation. Use {@link Void} for
+ * operations with no return type.
+ */
+public class NCIntentDslBaseVisitor<T> extends AbstractParseTreeVisitor<T> implements NCIntentDslVisitor<T> {
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitDsl(NCIntentDslParser.DslContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitSynonym(NCIntentDslParser.SynonymContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitAlias(NCIntentDslParser.AliasContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitDslItems(NCIntentDslParser.DslItemsContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitDslItem(NCIntentDslParser.DslItemContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitFrag(NCIntentDslParser.FragContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitFragId(NCIntentDslParser.FragIdContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitFragRef(NCIntentDslParser.FragRefContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitFragMeta(NCIntentDslParser.FragMetaContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitIntent(NCIntentDslParser.IntentContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitIntentId(NCIntentDslParser.IntentIdContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitOrderedDecl(NCIntentDslParser.OrderedDeclContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitMtdDecl(NCIntentDslParser.MtdDeclContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitFlowDecl(NCIntentDslParser.FlowDeclContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitMetaDecl(NCIntentDslParser.MetaDeclContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitJsonObj(NCIntentDslParser.JsonObjContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitJsonPair(NCIntentDslParser.JsonPairContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitJsonVal(NCIntentDslParser.JsonValContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitJsonArr(NCIntentDslParser.JsonArrContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitTerms(NCIntentDslParser.TermsContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitTermItem(NCIntentDslParser.TermItemContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitTermEq(NCIntentDslParser.TermEqContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitTerm(NCIntentDslParser.TermContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitMtdRef(NCIntentDslParser.MtdRefContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitJavaFqn(NCIntentDslParser.JavaFqnContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitTermId(NCIntentDslParser.TermIdContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitParExpr(NCIntentDslParser.ParExprContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitEqExpr(NCIntentDslParser.EqExprContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitUnaryExpr(NCIntentDslParser.UnaryExprContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitCompExpr(NCIntentDslParser.CompExprContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitAtomExpr(NCIntentDslParser.AtomExprContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitCallExpr(NCIntentDslParser.CallExprContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitMultExpr(NCIntentDslParser.MultExprContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitPlusExpr(NCIntentDslParser.PlusExprContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitLogExpr(NCIntentDslParser.LogExprContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitParamList(NCIntentDslParser.ParamListContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitAtom(NCIntentDslParser.AtomContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitQstring(NCIntentDslParser.QstringContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitMinMax(NCIntentDslParser.MinMaxContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitMinMaxShortcut(NCIntentDslParser.MinMaxShortcutContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitMinMaxRange(NCIntentDslParser.MinMaxRangeContext ctx) { return visitChildren(ctx); }
+	/**
+	 * {@inheritDoc}
+	 *
+	 * <p>The default implementation returns the result of calling
+	 * {@link #visitChildren} on {@code ctx}.</p>
+	 */
+	@Override public T visitId(NCIntentDslParser.IdContext ctx) { return visitChildren(ctx); }
+}
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.interp
similarity index 100%
copy from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
copy to nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.interp
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.java
similarity index 99%
copy from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
copy to nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.java
index aeb35e2..eb4a726 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
+++ b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.java
@@ -1,5 +1,5 @@
-// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
-package org.apache.nlpcraft.model.intent.impl.antlr4;
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
+package org.apache.nlpcraft.model.intent.compiler.antlr4;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.CharStream;
 import org.antlr.v4.runtime.Token;
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.tokens
similarity index 100%
copy from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
copy to nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.tokens
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslListener.java
similarity index 99%
copy from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
copy to nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslListener.java
index 904069b..e220659 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
+++ b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslListener.java
@@ -1,5 +1,5 @@
-// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
-package org.apache.nlpcraft.model.intent.impl.antlr4;
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
+package org.apache.nlpcraft.model.intent.compiler.antlr4;
 import org.antlr.v4.runtime.tree.ParseTreeListener;
 
 /**
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslParser.java
similarity index 89%
copy from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
copy to nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslParser.java
index 976d4c3..e77bf57 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
+++ b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslParser.java
@@ -1,5 +1,5 @@
-// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
-package org.apache.nlpcraft.model.intent.impl.antlr4;
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
+package org.apache.nlpcraft.model.intent.compiler.antlr4;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
 import org.antlr.v4.runtime.*;
@@ -132,6 +132,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitDsl(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitDsl(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final DslContext dsl() throws RecognitionException {
@@ -179,6 +184,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitSynonym(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitSynonym(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final SynonymContext synonym() throws RecognitionException {
@@ -237,6 +247,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitAlias(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitAlias(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final AliasContext alias() throws RecognitionException {
@@ -283,6 +298,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitDslItems(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitDslItems(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final DslItemsContext dslItems() throws RecognitionException {
@@ -359,6 +379,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitDslItem(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitDslItem(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final DslItemContext dslItem() throws RecognitionException {
@@ -416,6 +441,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitFrag(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitFrag(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final FragContext frag() throws RecognitionException {
@@ -459,6 +489,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitFragId(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitFragId(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final FragIdContext fragId() throws RecognitionException {
@@ -508,6 +543,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitFragRef(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitFragRef(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final FragRefContext fragRef() throws RecognitionException {
@@ -565,6 +605,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitFragMeta(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitFragMeta(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final FragMetaContext fragMeta() throws RecognitionException {
@@ -618,6 +663,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitIntent(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitIntent(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final IntentContext intent() throws RecognitionException {
@@ -691,6 +741,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitIntentId(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitIntentId(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final IntentIdContext intentId() throws RecognitionException {
@@ -733,6 +788,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitOrderedDecl(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitOrderedDecl(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final OrderedDeclContext orderedDecl() throws RecognitionException {
@@ -780,6 +840,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMtdDecl(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMtdDecl(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final MtdDeclContext mtdDecl() throws RecognitionException {
@@ -827,6 +892,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitFlowDecl(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitFlowDecl(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final FlowDeclContext flowDecl() throws RecognitionException {
@@ -888,6 +958,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMetaDecl(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMetaDecl(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final MetaDeclContext metaDecl() throws RecognitionException {
@@ -940,6 +1015,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitJsonObj(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitJsonObj(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final JsonObjContext jsonObj() throws RecognitionException {
@@ -1019,6 +1099,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitJsonPair(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitJsonPair(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final JsonPairContext jsonPair() throws RecognitionException {
@@ -1074,6 +1159,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitJsonVal(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitJsonVal(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final JsonValContext jsonVal() throws RecognitionException {
@@ -1198,6 +1288,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitJsonArr(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitJsonArr(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final JsonArrContext jsonArr() throws RecognitionException {
@@ -1276,6 +1371,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTerms(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitTerms(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final TermsContext terms() throws RecognitionException {
@@ -1352,6 +1452,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTermItem(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitTermItem(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final TermItemContext termItem() throws RecognitionException {
@@ -1405,6 +1510,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTermEq(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitTermEq(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final TermEqContext termEq() throws RecognitionException {
@@ -1467,6 +1577,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTerm(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitTerm(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final TermContext term() throws RecognitionException {
@@ -1557,6 +1672,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMtdRef(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMtdRef(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final MtdRefContext mtdRef() throws RecognitionException {
@@ -1613,6 +1733,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitJavaFqn(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitJavaFqn(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final JavaFqnContext javaFqn() throws RecognitionException {
@@ -1690,6 +1815,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitTermId(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitTermId(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final TermIdContext termId() throws RecognitionException {
@@ -1743,6 +1873,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitParExpr(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitParExpr(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 	public static class EqExprContext extends ExprContext {
 		public Token op;
@@ -1763,6 +1898,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitEqExpr(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitEqExpr(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 	public static class UnaryExprContext extends ExprContext {
 		public Token op;
@@ -1780,6 +1920,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitUnaryExpr(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitUnaryExpr(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 	public static class CompExprContext extends ExprContext {
 		public Token op;
@@ -1802,6 +1947,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitCompExpr(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitCompExpr(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 	public static class AtomExprContext extends ExprContext {
 		public AtomContext atom() {
@@ -1816,6 +1966,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitAtomExpr(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitAtomExpr(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 	public static class CallExprContext extends ExprContext {
 		public TerminalNode FUN_NAME() { return getToken(NCIntentDslParser.FUN_NAME, 0); }
@@ -1833,6 +1988,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitCallExpr(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitCallExpr(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 	public static class MultExprContext extends ExprContext {
 		public Token op;
@@ -1854,6 +2014,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMultExpr(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMultExpr(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 	public static class PlusExprContext extends ExprContext {
 		public Token op;
@@ -1874,6 +2039,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitPlusExpr(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitPlusExpr(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 	public static class LogExprContext extends ExprContext {
 		public Token op;
@@ -1894,6 +2064,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitLogExpr(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitLogExpr(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final ExprContext expr() throws RecognitionException {
@@ -2146,6 +2321,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitParamList(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitParamList(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final ParamListContext paramList() throws RecognitionException {
@@ -2226,6 +2406,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitAtom(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitAtom(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final AtomContext atom() throws RecognitionException {
@@ -2314,6 +2499,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitQstring(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitQstring(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final QstringContext qstring() throws RecognitionException {
@@ -2365,6 +2555,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMinMax(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMinMax(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final MinMaxContext minMax() throws RecognitionException {
@@ -2421,6 +2616,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMinMaxShortcut(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMinMaxShortcut(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final MinMaxShortcutContext minMaxShortcut() throws RecognitionException {
@@ -2473,6 +2673,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitMinMaxRange(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitMinMaxRange(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final MinMaxRangeContext minMaxRange() throws RecognitionException {
@@ -2519,6 +2724,11 @@ public class NCIntentDslParser extends Parser {
 		public void exitRule(ParseTreeListener listener) {
 			if ( listener instanceof NCIntentDslListener ) ((NCIntentDslListener)listener).exitId(this);
 		}
+		@Override
+		public <T> T accept(ParseTreeVisitor<? extends T> visitor) {
+			if ( visitor instanceof NCIntentDslVisitor ) return ((NCIntentDslVisitor<? extends T>)visitor).visitId(this);
+			else return visitor.visitChildren(this);
+		}
 	}
 
 	public final IdContext id() throws RecognitionException {
diff --git a/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslVisitor.java b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslVisitor.java
new file mode 100644
index 0000000..5e1f310
--- /dev/null
+++ b/nlpcraft/gen/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslVisitor.java
@@ -0,0 +1,274 @@
+// Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
+package org.apache.nlpcraft.model.intent.compiler.antlr4;
+import org.antlr.v4.runtime.tree.ParseTreeVisitor;
+
+/**
+ * This interface defines a complete generic visitor for a parse tree produced
+ * by {@link NCIntentDslParser}.
+ *
+ * @param <T> The return type of the visit operation. Use {@link Void} for
+ * operations with no return type.
+ */
+public interface NCIntentDslVisitor<T> extends ParseTreeVisitor<T> {
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#dsl}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitDsl(NCIntentDslParser.DslContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#synonym}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitSynonym(NCIntentDslParser.SynonymContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#alias}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitAlias(NCIntentDslParser.AliasContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#dslItems}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitDslItems(NCIntentDslParser.DslItemsContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#dslItem}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitDslItem(NCIntentDslParser.DslItemContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#frag}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitFrag(NCIntentDslParser.FragContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#fragId}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitFragId(NCIntentDslParser.FragIdContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#fragRef}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitFragRef(NCIntentDslParser.FragRefContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#fragMeta}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitFragMeta(NCIntentDslParser.FragMetaContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#intent}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitIntent(NCIntentDslParser.IntentContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#intentId}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitIntentId(NCIntentDslParser.IntentIdContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#orderedDecl}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitOrderedDecl(NCIntentDslParser.OrderedDeclContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#mtdDecl}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitMtdDecl(NCIntentDslParser.MtdDeclContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#flowDecl}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitFlowDecl(NCIntentDslParser.FlowDeclContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#metaDecl}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitMetaDecl(NCIntentDslParser.MetaDeclContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#jsonObj}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitJsonObj(NCIntentDslParser.JsonObjContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#jsonPair}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitJsonPair(NCIntentDslParser.JsonPairContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#jsonVal}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitJsonVal(NCIntentDslParser.JsonValContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#jsonArr}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitJsonArr(NCIntentDslParser.JsonArrContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#terms}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitTerms(NCIntentDslParser.TermsContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#termItem}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitTermItem(NCIntentDslParser.TermItemContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#termEq}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitTermEq(NCIntentDslParser.TermEqContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#term}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitTerm(NCIntentDslParser.TermContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#mtdRef}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitMtdRef(NCIntentDslParser.MtdRefContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#javaFqn}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitJavaFqn(NCIntentDslParser.JavaFqnContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#termId}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitTermId(NCIntentDslParser.TermIdContext ctx);
+	/**
+	 * Visit a parse tree produced by the {@code parExpr}
+	 * labeled alternative in {@link NCIntentDslParser#expr}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitParExpr(NCIntentDslParser.ParExprContext ctx);
+	/**
+	 * Visit a parse tree produced by the {@code eqExpr}
+	 * labeled alternative in {@link NCIntentDslParser#expr}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitEqExpr(NCIntentDslParser.EqExprContext ctx);
+	/**
+	 * Visit a parse tree produced by the {@code unaryExpr}
+	 * labeled alternative in {@link NCIntentDslParser#expr}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitUnaryExpr(NCIntentDslParser.UnaryExprContext ctx);
+	/**
+	 * Visit a parse tree produced by the {@code compExpr}
+	 * labeled alternative in {@link NCIntentDslParser#expr}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitCompExpr(NCIntentDslParser.CompExprContext ctx);
+	/**
+	 * Visit a parse tree produced by the {@code atomExpr}
+	 * labeled alternative in {@link NCIntentDslParser#expr}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitAtomExpr(NCIntentDslParser.AtomExprContext ctx);
+	/**
+	 * Visit a parse tree produced by the {@code callExpr}
+	 * labeled alternative in {@link NCIntentDslParser#expr}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitCallExpr(NCIntentDslParser.CallExprContext ctx);
+	/**
+	 * Visit a parse tree produced by the {@code multExpr}
+	 * labeled alternative in {@link NCIntentDslParser#expr}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitMultExpr(NCIntentDslParser.MultExprContext ctx);
+	/**
+	 * Visit a parse tree produced by the {@code plusExpr}
+	 * labeled alternative in {@link NCIntentDslParser#expr}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitPlusExpr(NCIntentDslParser.PlusExprContext ctx);
+	/**
+	 * Visit a parse tree produced by the {@code logExpr}
+	 * labeled alternative in {@link NCIntentDslParser#expr}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitLogExpr(NCIntentDslParser.LogExprContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#paramList}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitParamList(NCIntentDslParser.ParamListContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#atom}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitAtom(NCIntentDslParser.AtomContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#qstring}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitQstring(NCIntentDslParser.QstringContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#minMax}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitMinMax(NCIntentDslParser.MinMaxContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#minMaxShortcut}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitMinMaxShortcut(NCIntentDslParser.MinMaxShortcutContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#minMaxRange}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitMinMaxRange(NCIntentDslParser.MinMaxRangeContext ctx);
+	/**
+	 * Visit a parse tree produced by {@link NCIntentDslParser#id}.
+	 * @param ctx the parse tree
+	 * @return the visitor result
+	 */
+	T visitId(NCIntentDslParser.IdContext ctx);
+}
\ No newline at end of file
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala
index 29b2a92..ca87d7e 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/package.scala
@@ -39,9 +39,6 @@ package object common {
     final val DEEP_DEBUG = false
     
     // Model and token **internal** metadata keys.
-    final val MDL_META_ALL_ELM_IDS_KEY = "__NLPCRAFT_MDL_META_ALL_ELM_IDS"
-    final val MDL_META_ALL_GRP_IDS_KEY = "__NLPCRAFT_MDL_META_ALL_GRP_IDS"
-    final val MDL_META_ALL_ALIASES_KEY = "__NLPCRAFT_MDL_META_ALL_ALIASES"
     final val TOK_META_ALIASES_KEY = "__NLPCRAFT_TOK_META_ALIASES"
     final val MDL_META_MODEL_CLASS_KEY = "__NLPCRAFT_MDL_CLASS_NAME"
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/json/NCModelJson.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/json/NCModelJson.java
index 660a7af..3040c60 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/json/NCModelJson.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/impl/json/NCModelJson.java
@@ -254,9 +254,7 @@ public class NCModelJson {
     public boolean isMaxSynonymsThresholdError() {
         return maxSynonymsThresholdError;
     }
-    public void setMaxSynonymsThresholdError(boolean maxSynonymsThresholdError) {
-        this.maxSynonymsThresholdError = maxSynonymsThresholdError;
-    }
+    public void setMaxSynonymsThresholdError(boolean maxSynonymsThresholdError) { this.maxSynonymsThresholdError = maxSynonymsThresholdError; }
     public long getConversationTimeout() {
         return conversationTimeout;
     }
@@ -272,7 +270,5 @@ public class NCModelJson {
     public Map<String, String[]> getRestrictedCombinations() {
         return restrictedCombinations;
     }
-    public void setRestrictedCombinations(Map<String, String[]> restrictedCombinations) {
-        this.restrictedCombinations = restrictedCombinations;
-    }
+    public void setRestrictedCombinations(Map<String, String[]> restrictedCombinations) { this.restrictedCombinations = restrictedCombinations;}
 }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslBaselCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIntentDslBaselCompiler.scala
similarity index 87%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslBaselCompiler.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIntentDslBaselCompiler.scala
index f31286e..44d9a2a 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslBaselCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIntentDslBaselCompiler.scala
@@ -15,21 +15,20 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.model.intent.impl
+package org.apache.nlpcraft.model.intent.compiler
 
-import org.antlr.v4.runtime.tree.{TerminalNode ⇒ TN}
-import org.antlr.v4.runtime.{ParserRuleContext ⇒ PRC}
 import org.apache.commons.lang3.StringUtils
-import org.apache.nlpcraft.common._
+import org.apache.nlpcraft.common.{NCE, U}
 import org.apache.nlpcraft.model.NCToken
 import org.apache.nlpcraft.model.intent.utils.{NCDslTermContext, NCDslTermRetVal}
+import org.antlr.v4.runtime.{ParserRuleContext ⇒ PRC}
+import org.antlr.v4.runtime.tree.{TerminalNode ⇒ TN}
 
-import java.lang.{Double ⇒ JDouble, Long ⇒ JLong}
+import java.lang.{Long ⇒ JLong, Double ⇒ JDouble}
 import java.time.LocalDate
 import java.util.{Collections, ArrayList ⇒ JArrayList, HashMap ⇒ JHashMap}
 import scala.collection.mutable
 
-//noinspection DuplicatedCode
 trait NCIntentDslBaselCompiler {
     def syntaxError(errMsg: String, srcName: String, line: Int, pos: Int): NCE
     def runtimeError(errMsg: String, srcName: String, line: Int, pos: Int, cause: Exception = null): NCE
@@ -45,12 +44,13 @@ trait NCIntentDslBaselCompiler {
 
         syntaxError(errMsg, tok.getTokenSource.getSourceName, tok.getLine, tok.getCharPositionInLine)
     }
+
     /**
-      *
-      * @param errMsg
-      * @param ctx
-      * @return
-      */
+     *
+     * @param errMsg
+     * @param ctx
+     * @return
+     */
     def newRuntimeError(errMsg: String, cause: Exception = null)(implicit ctx: PRC): NCE = {
         val tok = ctx.start
 
@@ -58,29 +58,26 @@ trait NCIntentDslBaselCompiler {
     }
 
     type StackType = mutable.ArrayStack[NCDslTermRetVal]
-    type Instr = (NCToken, StackType,  NCDslTermContext) ⇒ Unit
+    type Instr = (NCToken, StackType, NCDslTermContext) ⇒ Unit
 
     //noinspection ComparingUnrelatedTypes
     def isJLong(v: Object): Boolean = v.isInstanceOf[JLong]
     //noinspection ComparingUnrelatedTypes
     def isJDouble(v: Object): Boolean = v.isInstanceOf[JDouble]
     //noinspection ComparingUnrelatedTypes
-    def isBoolean(v: Object): Boolean = v.isInstanceOf[Boolean]
-    def isString(v: Object): Boolean = v.isInstanceOf[String]
+    def isBool(v: Object): Boolean = v.isInstanceOf[Boolean]
+    def isStr(v: Object): Boolean = v.isInstanceOf[String]
     def isToken(v: Object): Boolean = v.isInstanceOf[NCToken]
     def asJLong(v: Object): Long = v.asInstanceOf[JLong].longValue()
     def asJDouble(v: Object): Double = v.asInstanceOf[JDouble].doubleValue()
-    def asString(v: Object): String = v.asInstanceOf[String]
+    def asStr(v: Object): String = v.asInstanceOf[String]
+    def asToken(v: Object): NCToken = v.asInstanceOf[NCToken]
     def asBool(v: Object): Boolean = v.asInstanceOf[Boolean]
 
-    def pushAny(any: Object, usedTok: Boolean)(implicit stack: StackType): Unit =
-        stack.push(NCDslTermRetVal(any, usedTok))
-    def pushLong(any: Long, usedTok: Boolean)(implicit stack: StackType): Unit =
-        stack.push(NCDslTermRetVal(Long.box(any), usedTok))
-    def pushDouble(any: Double, usedTok: Boolean)(implicit stack: StackType): Unit =
-        stack.push(NCDslTermRetVal(Double.box(any), usedTok))
-    def pushBool(any: Boolean, usedTok: Boolean)(implicit stack: StackType): Unit =
-        stack.push(NCDslTermRetVal(Boolean.box(any), usedTok))
+    def pushAny(any: Object, usedTok: Boolean)(implicit stack: StackType): Unit = stack.push(NCDslTermRetVal(any, usedTok))
+    def pushLong(any: Long, usedTok: Boolean)(implicit stack: StackType): Unit = stack.push(NCDslTermRetVal(Long.box(any), usedTok))
+    def pushDouble(any: Double, usedTok: Boolean)(implicit stack: StackType): Unit = stack.push(NCDslTermRetVal(Double.box(any), usedTok))
+    def pushBool(any: Boolean, usedTok: Boolean)(implicit stack: StackType): Unit = stack.push(NCDslTermRetVal(Boolean.box(any), usedTok))
 
     // Runtime errors.
     def rtUnaryOpError(op: String, v: Object)(implicit ctx: PRC): NCE =
@@ -110,6 +107,7 @@ trait NCIntentDslBaselCompiler {
 
         (val1, val2, f1, f2)
     }
+
     /**
      *
      * @param stack
@@ -231,12 +229,12 @@ trait NCIntentDslBaselCompiler {
      * @param or
      * @return
      */
-    def parseLogExpr(and: TN, or : TN)(implicit ctx: PRC): Instr = (_, stack: StackType, _) ⇒ {
+    def parseLogExpr(and: TN, or: TN)(implicit ctx: PRC): Instr = (_, stack: StackType, _) ⇒ {
         implicit val s: StackType = stack
 
         val (v1, v2, f1, f2) = pop2()
 
-        if (!isBoolean(v1) || !isBoolean(v2))
+        if (!isBool(v1) || !isBool(v2))
             throw rtBinaryOpError(if (and != null) "&&" else "||", v1, v2)
 
         if (and != null)
@@ -291,7 +289,7 @@ trait NCIntentDslBaselCompiler {
         val usedTok = f1 || f2
 
         if (plus != null) {
-            if (isString(v1) && isString(v2)) pushAny(asString(v1) + asString(v2), usedTok)
+            if (isStr(v1) && isStr(v2)) pushAny(asStr(v1) + asStr(v2), usedTok)
             else if (isJLong(v1) && isJLong(v2)) pushLong(asJLong(v1) + asJLong(v2), usedTok)
             else if (isJLong(v1) && isJDouble(v2)) pushDouble(asJLong(v1) + asJDouble(v2), usedTok)
             else if (isJDouble(v1) && isJLong(v2)) pushDouble(asJDouble(v1) + asJLong(v2), usedTok)
@@ -331,7 +329,7 @@ trait NCIntentDslBaselCompiler {
         else {
             assert(not != null)
 
-            if (isBoolean(v)) pushBool(!asBool(v), usedTok)
+            if (isBool(v)) pushBool(!asBool(v), usedTok)
             else
                 throw rtUnaryOpError("!", v)
         }
@@ -386,11 +384,12 @@ trait NCIntentDslBaselCompiler {
 
             val (v, f) = pop1()
 
-            if (!isString(v))
+            if (!isStr(v))
                 throw rtParamTypeError(fun, v, "string")
 
-            (asString(v), f)
+            (asStr(v), f)
         }
+
         def get1Double(): (JDouble, Boolean) = {
             ensureStack(1)
 
@@ -401,9 +400,10 @@ trait NCIntentDslBaselCompiler {
 
             (asJDouble(v), f)
         }
+
         def get2Doubles(): (JDouble, JDouble, Boolean) = {
             ensureStack(2)
-            
+
             val (v1, v2, f1, f2) = pop2()
 
             if (!isJDouble(v1))
@@ -413,37 +413,42 @@ trait NCIntentDslBaselCompiler {
 
             (asJDouble(v1), asJDouble(v2), f1 || f2)
         }
-        def get1Any(): (Any, Boolean) = {
-            ensureStack(1)
-
-            pop1()
-        }
 
-        def doSplit(): Unit = {
+        def get2Str(): (String, String, Boolean) = {
             ensureStack(2)
 
             val (v1, v2, f1, f2) = pop2()
 
-            if (!isString(v1))
+            if (!isStr(v1))
                 throw rtParamTypeError(fun, v1, "string")
-            if (!isString(v2))
+            if (!isStr(v2))
                 throw rtParamTypeError(fun, v2, "string")
 
-            asString(v1).split(asString(v2)).foreach { pushAny(_, f1 || f2) }
+            (asStr(v1), asStr(v2), f1 || f2)
         }
-        def doSplitTrim(): Unit = {
+
+        def get1Tok1Str(): (NCToken, String, Boolean) = {
             ensureStack(2)
 
             val (v1, v2, f1, f2) = pop2()
 
-            if (!isString(v1))
-                throw rtParamTypeError(fun, v1, "string")
-            if (!isString(v2))
+            if (!isToken(v1))
+                throw rtParamTypeError(fun, v1, "token")
+            if (!isStr(v2))
                 throw rtParamTypeError(fun, v2, "string")
 
-            asString(v1).split(asString(v2)).foreach { s ⇒ pushAny(s.strip, f1 || f2) }
+            (asToken(v1), asStr(v2), f1 || f2)
         }
 
+        def get1Any(): (Any, Boolean) = {
+            ensureStack(1)
+
+            pop1()
+        }
+
+        def doSplit(): Unit = get2Str() match { case (s1, s2, f) ⇒  s1.split(asStr(s2)).foreach { pushAny(_, f) }}
+        def doSplitTrim(): Unit = get2Str() match { case (s1, s2, f) ⇒  s1.split(asStr(s2)).foreach { s ⇒ pushAny(s.strip, f) }}
+
         /*
          * Collection, statistical operations.
          */
@@ -460,6 +465,7 @@ trait NCIntentDslBaselCompiler {
 
             pushAny(jl, f)
         }
+
         def doMap(): Unit = {
             if (stack.size % 2 != 0)
                 throw rtParamNumError(fun)
@@ -488,18 +494,7 @@ trait NCIntentDslBaselCompiler {
         /*
          * Metadata operations.
          */
-        def doPartMeta(): Unit = {
-            ensureStack(2)
-
-            val (v1, v2, f1, f2) = pop2()
-
-            if (!isToken(v1))
-                throw rtParamTypeError(fun, v1, "token")
-            if (!isString(v2))
-                throw rtParamTypeError(fun, v2, "string")
-
-            pushAny(v1.asInstanceOf[NCToken].meta(v2.asInstanceOf[String]), f1 || f2)
-        }
+        def doPartMeta(): Unit = get1Tok1Str() match { case (t, s, f) ⇒  pushAny(t.meta(s), f) }
 
         /*
          * Math operations.
@@ -509,19 +504,23 @@ trait NCIntentDslBaselCompiler {
             case (a: JDouble, f) ⇒ pushDouble(Math.abs(a), f)
             case x ⇒ throw rtParamTypeError(fun, x, "numeric")
         }
+
         def doSquare(): Unit = get1Any() match {
             case (a: JLong, f) ⇒ pushLong(a * a, f)
             case (a: JDouble, f) ⇒ pushDouble(a * a, f)
             case x ⇒ throw rtParamTypeError(fun, x, "numeric")
         }
 
-        def doJson(): Unit = get1Str() match { case (s, f) ⇒ pushAny(U.jsonToJavaMap(asString(s)), f) }
+        def doJson(): Unit = get1Str() match {
+            case (s, f) ⇒ pushAny(U.jsonToJavaMap(asStr(s)), f)
+        }
+
         def doIf(): Unit = {
             ensureStack(3)
 
             val (v1, v2, v3, f1, f2, f3) = pop3()
 
-            if (!isBoolean(v1))
+            if (!isBool(v1))
                 throw rtParamTypeError(fun, v1, "boolean")
 
             if (asBool(v1))
@@ -534,17 +533,7 @@ trait NCIntentDslBaselCompiler {
             if (stack.nonEmpty && stack.top.isInstanceOf[NCToken]) stack.top.asInstanceOf[NCToken] else tok
 
         def doPart(): Unit = {
-            ensureStack(2)
-
-            val (v1, v2, f1, f2) = pop2()
-
-            if (!isToken(v1))
-                throw rtParamTypeError(fun, v1, "token")
-            if (!isString(v2))
-                throw rtParamTypeError(fun, v2, "string")
-
-            val t = v1.asInstanceOf[NCToken]
-            val aliasId = v2.asInstanceOf[String]
+            val (t, aliasId, f) = get1Tok1Str()
 
             val parts = t.findPartTokens(aliasId)
 
@@ -552,28 +541,17 @@ trait NCIntentDslBaselCompiler {
                 throw newRuntimeError(s"Cannot find part for token (use 'parts' function instead) [" +
                     s"id=${t.getId}, " +
                     s"aliasId=$aliasId" +
-                s"]")
+                    s"]")
             else if (parts.size() > 1)
                 throw newRuntimeError(s"Too many parts found for token (use 'parts' function instead) [" +
                     s"id=${t.getId}, " +
                     s"aliasId=$aliasId" +
-                s"]")
+                    s"]")
 
-            pushAny(parts.get(0), f1 || f2)
+            pushAny(parts.get(0), f)
         }
 
-        def doParts(): Unit = {
-            ensureStack(2)
-
-            val (v1, v2, f1, f2) = pop2()
-
-            if (!isToken(v1))
-                throw rtParamTypeError(fun, v1, "token")
-            if (!isString(v2))
-                throw rtParamTypeError(fun, v2, "string")
-
-            pushAny(v1.asInstanceOf[NCToken].findPartTokens(v2.asInstanceOf[String]), f1 || f2)
-        }
+        def doParts(): Unit = get1Tok1Str() match { case (t, aliasId, f) ⇒ pushAny(t.findPartTokens(aliasId), f) }
 
         fun match {
             // Metadata access.
@@ -637,13 +615,13 @@ trait NCIntentDslBaselCompiler {
             case "strip" ⇒ get1Str() match { case (s, f) ⇒ pushAny(s.trim, f) }
             case "uppercase" ⇒ get1Str() match { case (s, f) ⇒ pushAny(s.toUpperCase, f) }
             case "lowercase" ⇒ get1Str() match { case (s, f) ⇒ pushAny(s.toLowerCase, f) }
-            case "is_alpha" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isAlpha(asString(s)), f) }
-            case "is_alphanum" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isAlphanumeric(asString(s)), f) }
-            case "is_whitespace" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isWhitespace(asString(s)), f) }
-            case "is_num" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isNumeric(asString(s)), f) }
-            case "is_numspace" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isNumericSpace(asString(s)), f) }
-            case "is_alphaspace" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isAlphaSpace(asString(s)), f) }
-            case "is_alphanumspace" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isAlphanumericSpace(asString(s)), f) }
+            case "is_alpha" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isAlpha(asStr(s)), f) }
+            case "is_alphanum" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isAlphanumeric(asStr(s)), f) }
+            case "is_whitespace" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isWhitespace(asStr(s)), f) }
+            case "is_num" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isNumeric(asStr(s)), f) }
+            case "is_numspace" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isNumericSpace(asStr(s)), f) }
+            case "is_alphaspace" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isAlphaSpace(asStr(s)), f) }
+            case "is_alphanumspace" ⇒ get1Str() match { case (s, f) ⇒ pushBool(StringUtils.isAlphanumericSpace(asStr(s)), f) }
             case "substring" ⇒
             case "charAt" ⇒
             case "regex" ⇒
@@ -654,11 +632,11 @@ trait NCIntentDslBaselCompiler {
 
             // Math functions.
             case "abs" ⇒ doAbs()
-            case "ceil" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushDouble(Math.ceil(a), f) }
-            case "floor" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushDouble(Math.floor(a), f) }
-            case "rint" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushDouble(Math.rint(a), f) }
-            case "round" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushLong(Math.round(a), f) }
-            case "signum" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushDouble(Math.signum(a), f) }
+            case "ceil" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushDouble(Math.ceil(a), f) } 
+            case "floor" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushDouble(Math.floor(a), f) } 
+            case "rint" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushDouble(Math.rint(a), f) } 
+            case "round" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushLong(Math.round(a), f) } 
+            case "signum" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushDouble(Math.signum(a), f) } 
             case "sqrt" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushDouble(Math.sqrt(a), f) }
             case "cbrt" ⇒ get1Double() match { case (a: JDouble, f) ⇒ pushDouble(Math.cbrt(a), f) }
             case "pi" ⇒ pushDouble(Math.PI, false)
@@ -716,18 +694,18 @@ trait NCIntentDslBaselCompiler {
             case "sum" ⇒
 
             // Date-time functions.
-            case "year" ⇒ pushLong(LocalDate.now.getYear,false) // 2021.
-            case "month" ⇒ pushLong(LocalDate.now.getMonthValue,false) // 1 ... 12.
-            case "day_of_month" ⇒ pushLong(LocalDate.now.getDayOfMonth,false) // 1 ... 31.
-            case "day_of_week" ⇒ pushLong(LocalDate.now.getDayOfWeek.getValue,false)
-            case "day_of_year" ⇒ pushLong(LocalDate.now.getDayOfYear,false)
+            case "year" ⇒ pushLong(LocalDate.now.getYear, false) // 2021.
+            case "month" ⇒ pushLong(LocalDate.now.getMonthValue, false) // 1 ... 12.
+            case "day_of_month" ⇒ pushLong(LocalDate.now.getDayOfMonth, false) // 1 ... 31.
+            case "day_of_week" ⇒ pushLong(LocalDate.now.getDayOfWeek.getValue, false)
+            case "day_of_year" ⇒ pushLong(LocalDate.now.getDayOfYear, false)
             case "hour" ⇒
             case "minute" ⇒
             case "second" ⇒
             case "week_of_month" ⇒
             case "week_of_year" ⇒
             case "quarter" ⇒
-            case "now" ⇒ pushLong(System.currentTimeMillis(),false) // Epoc time.
+            case "now" ⇒ pushLong(System.currentTimeMillis(), false) // Epoc time.
 
             case _ ⇒ throw rtUnknownFunError(fun) // Assertion.
         }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIntentDslCompiler.scala
similarity index 87%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIntentDslCompiler.scala
index 691af29..55793c2 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslCompiler.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIntentDslCompiler.scala
@@ -15,21 +15,21 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.model.intent.impl
+package org.apache.nlpcraft.model.intent.compiler
 
 import com.typesafe.scalalogging.LazyLogging
-import org.antlr.v4.runtime._
 import org.antlr.v4.runtime.tree.ParseTreeWalker
+import org.antlr.v4.runtime._
 import org.apache.nlpcraft.common._
-import org.apache.nlpcraft.model._
-import org.apache.nlpcraft.model.intent.impl.antlr4.{NCIntentDslParser ⇒ IDP, _}
-import org.apache.nlpcraft.model.intent.impl.{NCIntentDslFragmentCache ⇒ FragCache}
+import org.apache.nlpcraft.model.intent.compiler.antlr4.{NCIntentDslBaseListener, NCIntentDslLexer, NCIntentDslParser ⇒ IDP}
 import org.apache.nlpcraft.model.intent.utils._
+import org.apache.nlpcraft.model.intent.compiler.{NCIntentDslFragmentCache ⇒ FragCache}
+import org.apache.nlpcraft.model._
+import scala.collection.JavaConverters._
 
 import java.nio.file.Path
 import java.util.Optional
 import java.util.regex.{Pattern, PatternSyntaxException}
-import scala.collection.JavaConverters._
 import scala.collection.mutable
 import scala.collection.mutable.ArrayBuffer
 
@@ -44,8 +44,12 @@ object NCIntentDslCompiler extends LazyLogging {
      * @param mdlId
      */
     class FiniteStateMachine(dsl: String, mdlId: String) extends NCIntentDslBaseListener with NCIntentDslBaselCompiler {
-        // Accumulator for parsed intents.
+        // Accumulators for parsed objects.
         private val intents = ArrayBuffer.empty[NCDslIntent]
+        private var synonym: NCDslSynonym = _
+
+        // Synonym.
+        private var alias: String = _
 
         // Fragment components.
         private var fragId: String = _
@@ -70,27 +74,27 @@ object NCIntentDslCompiler extends LazyLogging {
         private var refClsName: Option[String] = None
         private var refMtdName: Option[String] = None
 
-        // Current term's code, i.e. list of instructions.
-        private var termInstrs = mutable.Buffer.empty[Instr]
+        // Current expression code, i.e. list of instructions.
+        private var instrs = mutable.Buffer.empty[Instr]
 
         /*
          * Shared/common implementation.
          */
-        override def exitUnaryExpr(ctx: IDP.UnaryExprContext): Unit = termInstrs += parseUnaryExpr(ctx.MINUS(), ctx.NOT())(ctx)
+        override def exitUnaryExpr(ctx: IDP.UnaryExprContext): Unit = instrs += parseUnaryExpr(ctx.MINUS(), ctx.NOT())(ctx)
 
-        override def exitMultExpr(ctx: IDP.MultExprContext): Unit = termInstrs += parseMultExpr(ctx.MULT(), ctx.MOD(), ctx.DIV())(ctx)
+        override def exitMultExpr(ctx: IDP.MultExprContext): Unit = instrs += parseMultExpr(ctx.MULT(), ctx.MOD(), ctx.DIV())(ctx)
 
-        override def exitPlusExpr(ctx: IDP.PlusExprContext): Unit = termInstrs += parsePlusExpr(ctx.PLUS(), ctx.MINUS())(ctx)
+        override def exitPlusExpr(ctx: IDP.PlusExprContext): Unit = instrs += parsePlusExpr(ctx.PLUS(), ctx.MINUS())(ctx)
 
-        override def exitCompExpr(ctx: IDP.CompExprContext): Unit = termInstrs += parseCompExpr(ctx.LT(), ctx.GT(), ctx.LTEQ(), ctx.GTEQ())(ctx)
+        override def exitCompExpr(ctx: IDP.CompExprContext): Unit = instrs += parseCompExpr(ctx.LT(), ctx.GT(), ctx.LTEQ(), ctx.GTEQ())(ctx)
 
-        override def exitLogExpr(ctx: IDP.LogExprContext): Unit = termInstrs += parseLogExpr(ctx.AND, ctx.OR())(ctx)
+        override def exitLogExpr(ctx: IDP.LogExprContext): Unit = instrs += parseLogExpr(ctx.AND, ctx.OR())(ctx)
 
-        override def exitEqExpr(ctx: IDP.EqExprContext): Unit = termInstrs += parseEqExpr(ctx.EQ, ctx.NEQ())(ctx)
+        override def exitEqExpr(ctx: IDP.EqExprContext): Unit = instrs += parseEqExpr(ctx.EQ, ctx.NEQ())(ctx)
 
-        override def exitCallExpr(ctx: IDP.CallExprContext): Unit = termInstrs += parseCallExpr(ctx.FUN_NAME())(ctx)
+        override def exitCallExpr(ctx: IDP.CallExprContext): Unit = instrs += parseCallExpr(ctx.FUN_NAME())(ctx)
 
-        override def exitAtom(ctx: IDP.AtomContext): Unit = termInstrs += parseAtom(ctx.getText)(ctx)
+        override def exitAtom(ctx: IDP.AtomContext): Unit = instrs += parseAtom(ctx.getText)(ctx)
 
         /**
          *
@@ -146,6 +150,35 @@ object NCIntentDslCompiler extends LazyLogging {
                 throw newSyntaxError(s"Duplicate intent ID: $intentId")(ctx.id())
         }
 
+
+        override def exitAlias(ctx: IDP.AliasContext): Unit = {
+            alias = ctx.id().getText
+        }
+
+        override def exitSynonym(ctx: IDP.SynonymContext): Unit = {
+            implicit val evidence: ParserRuleContext = ctx
+
+            val code = mutable.Buffer.empty[Instr] ++ instrs // Local copy.
+
+            synonym = NCDslSynonym(
+                Option(alias),
+                (tok: NCToken, termCtx: NCDslTermContext) ⇒ {
+                    val stack = new mutable.ArrayStack[NCDslTermRetVal]()
+
+                    // Execute all instructions.
+                    code.foreach(_ (tok, stack, termCtx))
+
+                    // Pop final result from stack.
+                    val x = stack.pop()
+
+                    if (!isBool(x.retVal))
+                        throw newRuntimeError(s"Synonym does not return boolean value: ${ctx.getText}")
+
+                    asBool(x.retVal)
+                }
+            )
+        }
+
         override def exitFragId(ctx: IDP.FragIdContext): Unit = {
             fragId = ctx.id().getText
 
@@ -264,25 +297,24 @@ object NCIntentDslCompiler extends LazyLogging {
                     }
                 }
                 else { // DSL-defined term.
-                    val instrs = mutable.Buffer.empty[Instr]
+                    val code = mutable.Buffer.empty[Instr]
 
-                    instrs ++= termInstrs
+                    code ++= instrs
 
                     (tok: NCToken, termCtx: NCDslTermContext) ⇒ {
                         val stack = new mutable.ArrayStack[NCDslTermRetVal]()
 
                         // Execute all instructions.
-                        instrs.foreach(_ (tok, stack, termCtx))
+                        code.foreach(_ (tok, stack, termCtx))
 
                         // Pop final result from stack.
                         val x = stack.pop()
 
-                        if (!isBoolean(x.retVal))
+                        if (!isBool(x.retVal))
                             throw newRuntimeError(s"Intent term does not return boolean value: ${ctx.getText}")
 
                         (asBool(x.retVal), x.usedTok)
                     }
-
                 }
 
             // Add term.
@@ -297,7 +329,7 @@ object NCIntentDslCompiler extends LazyLogging {
             // Reset term vars.
             setMinMax(1, 1)
             termId = null
-            termInstrs.clear()
+            instrs.clear()
             refClsName = None
             refMtdName = None
         }
@@ -336,7 +368,7 @@ object NCIntentDslCompiler extends LazyLogging {
          *
          * @return
          */
-        def getCompiledSynonym: NCDslSynonym = ???
+        def getCompiledSynonym: NCDslSynonym = synonym
 
         override def syntaxError(errMsg: String, srcName: String, line: Int, pos: Int): NCE =
             throw new NCE(mkSyntaxError(errMsg, srcName, line, pos, dsl, mdlId))
@@ -520,7 +552,7 @@ object NCIntentDslCompiler extends LazyLogging {
      * accumulated in a static map keyed by model ID. Only intents are returned, if any.
      *
      * @param filePath *.nc intent DSL file to compile.
-     * @param mdlId ID of the model *.nc file belongs to.
+     * @param mdlId    ID of the model *.nc file belongs to.
      * @return
      */
     @throws[NCE]
@@ -533,8 +565,8 @@ object NCIntentDslCompiler extends LazyLogging {
      * Compiles inline (supplied) fragments and/or intents. Note that fragments are accumulated in a static
      * map keyed by model ID. Only intents are returned, if any.
      *
-     * @param dsl Intent DSL to compile.
-     * @param mdlId ID of the model DSL belongs to.
+     * @param dsl     Intent DSL to compile.
+     * @param mdlId   ID of the model DSL belongs to.
      * @param srcName Optional source name.
      * @return
      */
@@ -547,7 +579,7 @@ object NCIntentDslCompiler extends LazyLogging {
 
     /**
      *
-     * @param dsl Synonym DSL to compile.
+     * @param dsl   Synonym DSL to compile.
      * @param mdlId ID of the model DSL belongs to.
      * @return
      */
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslFragmentCache.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIntentDslFragmentCache.scala
similarity index 81%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslFragmentCache.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIntentDslFragmentCache.scala
index 601a817..fbb2998 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentDslFragmentCache.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/NCIntentDslFragmentCache.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.model.intent.impl
+package org.apache.nlpcraft.model.intent.compiler
 
 import org.apache.nlpcraft.model.intent.utils.NCDslFragment
 
@@ -23,42 +23,42 @@ import scala.collection.concurrent.TrieMap
 import scala.collection.mutable
 
 /**
-  * Global intent DSL fragment cache.
-  */
+ * Global intent DSL fragment cache.
+ */
 object NCIntentDslFragmentCache {
-    private final val cache = TrieMap.empty[String /* Model ID. */, mutable.Map[String, NCDslFragment]]
-    
+    private final val cache = TrieMap.empty[String /* Model ID. */ , mutable.Map[String, NCDslFragment]]
+
     /**
-      *
-      */
+     *
+     */
     def clear(): Unit = cache.clear()
-    
+
     /**
-      *
-      * @param mdlId
-      */
+     *
+     * @param mdlId
+     */
     def clear(mdlId: String): Unit = cache += mdlId → mutable.HashMap.empty[String, NCDslFragment]
-    
+
     /**
-      *
-      * @param mdlId
-      * @param frag
-      */
+     *
+     * @param mdlId
+     * @param frag
+     */
     def add(mdlId: String, frag: NCDslFragment): Unit =
         cache.getOrElse(mdlId, {
             val m = mutable.HashMap.empty[String, NCDslFragment]
-            
+
             cache += mdlId → m
-            
+
             m
         }) += (frag.id → frag)
-    
+
     /**
-      *
-      * @param mdlId
-      * @param fragId
-      * @return
-      */
+     *
+     * @param mdlId
+     * @param fragId
+     * @return
+     */
     def get(mdlId: String, fragId: String): Option[NCDslFragment] =
         cache.get(mdlId).flatMap(_.get(fragId))
 }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4 b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDsl.g4
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.g4
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDsl.g4
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDsl.interp
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.interp
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDsl.interp
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDsl.tokens
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDsl.tokens
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDsl.tokens
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslBaseListener.java
similarity index 99%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslBaseListener.java
index 3c6c2cf..f1beff5 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslBaseListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslBaseListener.java
@@ -1,5 +1,5 @@
 // Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
-package org.apache.nlpcraft.model.intent.impl.antlr4;
+package org.apache.nlpcraft.model.intent.compiler.antlr4;
 
 import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.tree.ErrorNode;
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.interp
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.interp
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.interp
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.java
similarity index 99%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.java
index aeb35e2..63cae30 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.java
@@ -1,13 +1,10 @@
 // Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
-package org.apache.nlpcraft.model.intent.impl.antlr4;
+package org.apache.nlpcraft.model.intent.compiler.antlr4;
 import org.antlr.v4.runtime.Lexer;
 import org.antlr.v4.runtime.CharStream;
-import org.antlr.v4.runtime.Token;
-import org.antlr.v4.runtime.TokenStream;
 import org.antlr.v4.runtime.*;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
-import org.antlr.v4.runtime.misc.*;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCIntentDslLexer extends Lexer {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.tokens
similarity index 100%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslLexer.tokens
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslLexer.tokens
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslListener.java
similarity index 99%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslListener.java
index 904069b..1a0c376 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslListener.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslListener.java
@@ -1,5 +1,5 @@
 // Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
-package org.apache.nlpcraft.model.intent.impl.antlr4;
+package org.apache.nlpcraft.model.intent.compiler.antlr4;
 import org.antlr.v4.runtime.tree.ParseTreeListener;
 
 /**
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslParser.java
similarity index 99%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslParser.java
index 976d4c3..fa8282d 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4/NCIntentDslParser.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/compiler/antlr4/NCIntentDslParser.java
@@ -1,13 +1,10 @@
 // Generated from C:/Users/Nikita Ivanov/Documents/GitHub/incubator-nlpcraft/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/antlr4\NCIntentDsl.g4 by ANTLR 4.9.1
-package org.apache.nlpcraft.model.intent.impl.antlr4;
+package org.apache.nlpcraft.model.intent.compiler.antlr4;
 import org.antlr.v4.runtime.atn.*;
 import org.antlr.v4.runtime.dfa.DFA;
 import org.antlr.v4.runtime.*;
-import org.antlr.v4.runtime.misc.*;
 import org.antlr.v4.runtime.tree.*;
 import java.util.List;
-import java.util.Iterator;
-import java.util.ArrayList;
 
 @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
 public class NCIntentDslParser extends Parser {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolver.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala
similarity index 97%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolver.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala
index f7dbfeb..7198adf 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolver.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolver.scala
@@ -15,10 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.model.intent.impl
+package org.apache.nlpcraft.model.intent.solver
 
 import com.typesafe.scalalogging.LazyLogging
 import io.opencensus.trace.Span
+import org.apache.nlpcraft.common._
 import org.apache.nlpcraft.common.debug.NCLogHolder
 import org.apache.nlpcraft.common.opencensus.NCOpenCensusTrace
 import org.apache.nlpcraft.common.util.NCUtils
@@ -26,7 +27,7 @@ import org.apache.nlpcraft.model.impl.NCVariantImpl
 import org.apache.nlpcraft.model.intent.utils.NCDslIntent
 import org.apache.nlpcraft.model.{NCContext, NCIntentMatch, NCIntentSkip, NCModel, NCRejection, NCResult, NCToken, NCVariant}
 import org.apache.nlpcraft.probe.mgrs.dialogflow.NCDialogFlowManager
-import org.apache.nlpcraft.common._
+
 import scala.collection.JavaConverters._
 
 /**
@@ -107,7 +108,7 @@ class NCIntentSolver(intents: List[(NCDslIntent/*Intent*/, NCIntentMatch ⇒ NCR
                     override def getTermTokens(idx: Int): java.util.List[NCToken] =
                         res.groups(idx).tokens.asJava
                     override def getTermTokens(termId: String): java.util.List[NCToken] =
-                        res.groups.find(_.termId == termId).flatMap(grp ⇒ Some(grp.tokens)).getOrElse(Nil).asJava
+                        res.groups.find(_.termId === termId).flatMap(grp ⇒ Some(grp.tokens)).getOrElse(Nil).asJava
                 }
                 
                 if (!in.context.getModel.asInstanceOf[NCModel].onMatchedIntent(intentMatch)) {
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
similarity index 88%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
index 72f5e4c..01d1c4b 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverEngine.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
@@ -1,44 +1,28 @@
-/*
- * 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.model.intent.impl
+package org.apache.nlpcraft.model.intent.solver
 
-import java.util.function.Function
 import com.typesafe.scalalogging.LazyLogging
-import org.apache.nlpcraft.common._
 import org.apache.nlpcraft.common.ascii.NCAsciiTable
 import org.apache.nlpcraft.common.debug.{NCLogGroupToken, NCLogHolder}
 import org.apache.nlpcraft.common.opencensus.NCOpenCensusTrace
-import org.apache.nlpcraft.model.intent.utils.{NCDslIntent, NCDslTerm, NCDslTermContext}
-import org.apache.nlpcraft.model._
+import org.apache.nlpcraft.common._
 import org.apache.nlpcraft.model.impl.NCTokenLogger
+import org.apache.nlpcraft.model.intent.utils.{NCDslIntent, NCDslTerm, NCDslTermContext}
+import org.apache.nlpcraft.model.{NCContext, NCIntentMatch, NCResult, NCToken}
 import org.apache.nlpcraft.probe.mgrs.dialogflow.NCDialogFlowManager
+import org.apache.nlpcraft.model.impl.NCTokenPimp._
 
-import collection.convert.ImplicitConversions._
+import java.util.function.Function
 import scala.collection.mutable
 
 /**
-  * Intent solver that finds the best matching intent given user sentence.
-  */
+ * Intent solver that finds the best matching intent given user sentence.
+ */
 object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
+
     /**
      * NOTE: not thread-safe.
      */
-    private [impl] class Weight(ws: Int*) extends Ordered[Weight] {
+    private[impl] class Weight(ws: Int*) extends Ordered[Weight] {
         private var buf = mutable.ArrayBuffer[Int]()
 
         buf.appendAll(ws)
@@ -126,10 +110,10 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
     }
 
     /**
-      *
-      * @param used
-      * @param token
-      */
+     *
+     * @param used
+     * @param token
+     */
     private case class UsedToken(
         var used: Boolean,
         var conv: Boolean,
@@ -137,12 +121,12 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
     )
 
     /**
-      * @param termId
-      * @param usedTokens
-      * @param weight
-      */
+     * @param termId
+     * @param usedTokens
+     * @param weight
+     */
     private case class TermMatch(
-        termId: String,
+        termId: Option[String],
         usedTokens: List[UsedToken],
         weight: Weight
     ) {
@@ -150,22 +134,22 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
     }
 
     /**
-      *
-      * @param termId
-      * @param usedTokens
-      */
+     *
+     * @param termId
+     * @param usedTokens
+     */
     private case class TermTokensGroup(
-        termId: String,
+        termId: Option[String],
         usedTokens: List[UsedToken]
     )
 
     /**
-      *
-      * @param tokenGroups
-      * @param weight
-      * @param intent
-      * @param exactMatch
-      */
+     *
+     * @param tokenGroups
+     * @param weight
+     * @param intent
+     * @param exactMatch
+     */
     private case class IntentMatch(
         tokenGroups: List[TermTokensGroup],
         weight: Weight,
@@ -174,17 +158,17 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
     )
 
     /**
-      * Main entry point for intent engine.
-      *
-      * @param ctx Query context.
-      * @param intents Set of intents to match for.
-      * @param logHldr Log holder.
-      * @return
-      */
+     * Main entry point for intent engine.
+     *
+     * @param ctx     Query context.
+     * @param intents Set of intents to match for.
+     * @param logHldr Log holder.
+     * @return
+     */
     @throws[NCE]
     def solve(
         ctx: NCContext,
-        intents: List[(NCDslIntent/*Intent*/, NCIntentMatch ⇒ NCResult)/*Callback*/],
+        intents: List[(NCDslIntent /*Intent*/ , NCIntentMatch ⇒ NCResult) /*Callback*/ ],
         logHldr: NCLogHolder
     ): List[NCIntentSolverResult] = {
         case class MatchHolder(
@@ -321,9 +305,9 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
                                 def calcHash(m: MatchHolder): Int = {
                                     val variantPart =
                                         m.variant.
-                                        tokens.
-                                        map(t ⇒ s"${t.getId}${t.getGroups}${t.getValue}${t.normText}").
-                                        mkString("")
+                                            tokens.
+                                            map(t ⇒ s"${t.getId}${t.getGroups}${t.getValue}${t.normText}").
+                                            mkString("")
 
                                     val intentPart = m.intentMatch.intent.toString
 
@@ -372,8 +356,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
                             im.exactMatch,
                             im.weight.toSeq,
                             im.tokenGroups.map(g ⇒
-                                (if (g.termId == null) "" else g.termId) →
-                                g.usedTokens.map(t ⇒ NCLogGroupToken(t.token, t.conv, t.used))
+                                g.termId.getOrElse("") → g.usedTokens.map(t ⇒ NCLogGroupToken(t.token, t.conv, t.used))
                             ).toMap
                         )
                 })
@@ -397,10 +380,10 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
     }
 
     /**
-      *
-      * @param im
-      * @return
-      */
+     *
+     * @param im
+     * @return
+     */
     private def mkPickTokens(im: IntentMatch): List[String] = {
         val buf = mutable.ListBuffer.empty[String]
 
@@ -433,12 +416,12 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
     }
 
     /**
-      *
-      * @param intent
-      * @param senToks
-      * @param convToks
-      * @return
-      */
+     *
+     * @param intent
+     * @param senToks
+     * @param convToks
+     * @return
+     */
     //noinspection DuplicatedCode
     private def solveIntent(
         ctx: NCContext,
@@ -451,13 +434,13 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
         val flow = NCDialogFlowManager.getDialogFlow(ctx.getRequest.getUser.getId, ctx.getModel.getId)
         val varStr = s"(variant #${varIdx + 1})"
         val flowRegex = intent.flowRegex
-        
+
         var flowMatched = true
 
         // Check dialog flow regex first, if any.
         if (intent.flowRegex.isDefined) {
             val str = flow.map(_.getIntentId).mkString(" ")
-            
+
             def x(s: String): Unit = {
                 logger.info(s"Intent '$intentId' ${bo(s)} regex dialog flow $varStr:")
                 logger.info(s"  |-- ${c("Intent IDs  :")} $str")
@@ -466,7 +449,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
 
             if (!flowRegex.get.matcher(str).find(0)) {
                 x("did not match")
-                
+
                 flowMatched = false
             }
             else
@@ -475,14 +458,14 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
         else if (intent.flowMtdName.isDefined) {
             // TODO.
         }
-        
+
         if (flowMatched) {
             val intentW = new Weight()
             val intentGrps = mutable.ListBuffer.empty[TermTokensGroup]
             var abort = false
             val ordered = intent.ordered
             var lastTermMatch: TermMatch = null
-            
+
             val termCtx = NCDslTermContext(
                 intentMeta = intent.meta,
                 reqMeta = ctx.getRequest.getRequestData,
@@ -564,7 +547,7 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
                             logger,
                             Some(
                                 s"Intent '$intentId' ${r("did not")} match because of remaining unused user tokens $varStr." +
-                                s"\nUnused user tokens for intent '$intentId' $varStr:"
+                                    s"\nUnused user tokens for intent '$intentId' $varStr:"
                             )
                         )
                 else {
@@ -589,16 +572,16 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
         else
             None
     }
-    
+
     /**
-      * Solves term.
-      *
-      * @param term
-      * @param ctx
-      * @param convToks
-      * @param senToks
-      * @return
-      */
+     * Solves term.
+     *
+     * @param term
+     * @param ctx
+     * @param convToks
+     * @param senToks
+     * @return
+     */
     @throws[NCE]
     private def solveTerm(
         term: NCDslTerm,
@@ -637,21 +620,21 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
             // Term not found at all.
             case None ⇒ None
         }
-    
+
     /**
-      * Solves term's predicate.
-      *
-      * @param pred
-      * @param ctx
-      * @param min
-      * @param max
-      * @param senToks
-      * @param convToks
-      * @return
-      */
+     * Solves term's predicate.
+     *
+     * @param pred
+     * @param ctx
+     * @param min
+     * @param max
+     * @param senToks
+     * @param convToks
+     * @return
+     */
     @throws[NCE]
     private def solvePredicate(
-        pred: (NCToken, NCDslTermContext) ⇒ (Boolean/*Predicate.*/, Boolean/*Whether or not token was used.*/),
+        pred: (NCToken, NCDslTermContext) ⇒ (Boolean /*Predicate.*/ , Boolean /*Whether or not token was used.*/ ),
         ctx: NCDslTermContext,
         min: Int,
         max: Int,
@@ -661,23 +644,23 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
         // Algorithm is "hungry", i.e. it will fetch all tokens satisfying item's predicate
         // in entire sentence even if these tokens are separated by other already used tokens
         // and conversation will be used only to get to the 'max' number of the item.
-    
+
         var usedToks = List.empty[UsedToken]
-        
+
         var matches = 0
 
         // Collect to the 'max' from sentence & conversation, if possible.
         for (col ← Seq(senToks, convToks); tok ← col.filter(!_.used) if usedToks.lengthCompare(max) < 0) {
             val (res, used) = pred.apply(tok.token, ctx)
-            
+
             if (res) {
                 matches += 1
-    
+
                 if (used)
                     usedToks :+= tok
             }
         }
-    
+
         // We couldn't collect even 'min' matches.
         if (matches < min)
             None
@@ -685,13 +668,13 @@ object NCIntentSolverEngine extends LazyLogging with NCOpenCensusTrace {
         else if (matches == 0) {
             require(min == 0)
             require(usedToks.isEmpty)
-            
+
             Some(usedToks → new Weight(0, 0))
         }
         // We've found some matches (and min > 0).
         else {
             require(matches > 0 && matches > min)
-            
+
             val convSrvReqIds = convToks.map(_.token.getServerRequestId).distinct
 
             // Number of tokens from the current sentence.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverInput.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverInput.scala
similarity index 95%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverInput.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverInput.scala
index 5f627d1..c8ffb59 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverInput.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverInput.scala
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.model.intent.impl
+package org.apache.nlpcraft.model.intent.solver
 
 import org.apache.nlpcraft.model.{NCContext, NCIntentMatch}
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverResult.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverResult.scala
similarity index 90%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverResult.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverResult.scala
index 10ccabb..cf5ea6c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverResult.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverResult.scala
@@ -15,14 +15,14 @@
  * limitations under the License.
  */
 
-package org.apache.nlpcraft.model.intent.impl
+package org.apache.nlpcraft.model.intent.solver
 
 import org.apache.nlpcraft.model.{NCIntentMatch, _}
 
 /**
   * Intent solver engine result. Using basic case class for easier Java interop.
   */
-case class NCIntentTokensGroup(termId: String, tokens: List[NCToken])
+case class NCIntentTokensGroup(termId: Option[String], tokens: List[NCToken])
 case class NCIntentSolverResult(
     intentId: String,
     fn: java.util.function.Function[NCIntentMatch, NCResult],
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverVariant.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverVariant.scala
similarity index 66%
rename from nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverVariant.scala
rename to nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverVariant.scala
index fd8f86a..e6b7da4 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/impl/NCIntentSolverVariant.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverVariant.scala
@@ -1,37 +1,18 @@
-/*
- * 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.model.intent.solver
 
-package org.apache.nlpcraft.model.intent.impl
+import org.apache.nlpcraft.model.NCToken
 
 import java.util
 
-import org.apache.nlpcraft.model._
-
-import scala.collection.JavaConverters._
-
 /**
-  * Sentence variant & its weight.
-  */
+ * Sentence variant & its weight.
+ */
 case class NCIntentSolverVariant(tokens: util.List[NCToken]) extends Ordered[NCIntentSolverVariant] {
     val (userToks, wordCnt, avgWordsPerTokPct, totalSparsity, totalUserDirect) = calcWeight()
 
     /**
-      * Calculates weight components.
-      */
+     * Calculates weight components.
+     */
     private def calcWeight(): (Int, Int, Int, Int, Int) = {
         var userToks = 0 // More is better.
         var wordCnt = 0
@@ -87,5 +68,5 @@ case class NCIntentSolverVariant(tokens: util.List[NCToken]) extends Ordered[NCI
             s", avgWordsPerTokPct=$avgWordsPerTokPct" +
             s", sparsity=$totalSparsity" +
             s", toks=$tokens" +
-        "]"
-}
\ No newline at end of file
+            "]"
+}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenChecker.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenChecker.scala
deleted file mode 100644
index 6bfce61..0000000
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenChecker.scala
+++ /dev/null
@@ -1,46 +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.model.intent.utils
-
-import org.apache.nlpcraft.model.NCToken
-import org.apache.nlpcraft.common._
-
-import scala.collection.mutable
-
-/**
- * Token checker.
- */
-object NCDslTokenChecker {
-    /**
-     *
-     * @param tok
-     * @param id
-     * @return
-     */
-    def isValidGroup(tok: NCToken, id: String): Boolean =
-        tok.getModel.getMetadata.get(MDL_META_ALL_GRP_IDS_KEY).asInstanceOf[Set[String]].contains(id)
-    
-    /**
-      *
-      * @param tok
-      * @param id
-      * @return
-      */
-    def isValidElementId(tok: NCToken, id: String): Boolean =
-        tok.getModel.getMetadata.get(MDL_META_ALL_ELM_IDS_KEY).asInstanceOf[Set[String]].contains(id)
-}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
deleted file mode 100644
index 41e66ae..0000000
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenPredicate.java
+++ /dev/null
@@ -1,473 +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.model.intent.utils;
-
-import org.apache.commons.collections.*;
-import org.apache.commons.lang3.*;
-import org.apache.nlpcraft.common.util.*;
-import org.apache.nlpcraft.model.*;
-import java.util.*;
-import java.util.function.*;
-import java.util.regex.*;
-import java.util.stream.*;
-
-/**
- * Internal DSL token predicate.
- */
-@SuppressWarnings("unchecked")
-public class NCDslTokenPredicate implements Function<NCToken, Boolean> {
-    private static final List<String> OPS = Arrays.asList(
-        // Order is important!
-        "==",
-        "!=",
-        ">=",
-        "<=",
-        "@@",
-        "!@",
-        ">",
-        "<"
-    );
-
-    private static final List<String> PARAMS = Arrays.asList(
-        "id",
-        "ancestors",
-        "parent",
-        "groups",
-        "value",
-        "aliases",
-        "startidx",
-        "endidx"
-    );
-
-    private final List<String> parts;
-    private final String param;
-    private final String paramFunc;
-    private final String op;
-    private final Object value;
-    private final String valueStr;
-    private final Function<NCToken, NCToken> qualFunc;
-
-    private boolean validated = false;
-
-    /**
-     * Creates new predicate with given parameters.
-     *
-     * @param parts List of qualification token IDs or aliases.
-     * @param paramFunc Optional parameter function. Can be {@code null}.
-     * @param param Rule's left-side parameter.
-     * @param op Rule's operation.
-     * @param value Rule's right-side value.
-     */
-    public NCDslTokenPredicate(List<String> parts, String paramFunc, String param, String op, Object value) {
-        assert parts != null;
-
-        // Assert?
-        if (param == null || (param.charAt(0) != '~' && !PARAMS.contains(param)))
-            throw new IllegalArgumentException(String.format(
-                "Invalid token predicate DSL parameter ('%s'): %s %s %s",
-                param, param, op, value));
-
-        // Assert?
-        if (op == null || !OPS.contains(op))
-            throw new IllegalArgumentException(String.format(
-                "Invalid token predicate DSL operation ('%s'): %s %s %s",
-                op, param, op, value));
-
-        this.parts = new ArrayList<>(parts);
-        this.paramFunc = paramFunc;
-        this.param = param;
-        this.op = op;
-
-        if (value == null)
-            valueStr = "null";
-        else if (value instanceof Collection)
-            valueStr =
-                "(" +
-                ((Collection<?>)value).stream().map(Object::toString).collect(Collectors.joining(",")) +
-                ")";
-        else
-            valueStr = value.toString();
-
-        if (value instanceof String)
-            this.value = stripQuotes((String)value);
-        else if (value instanceof Collection)
-            this.value = ((Collection<?>)value).stream().map(obj -> {
-                if (obj instanceof String) return stripQuotes((String)obj); else return obj;
-            }).collect(Collectors.toList());
-        else
-            this.value = value;
-
-        qualFunc = new NCDslTokenQualifier(this.parts);
-    }
-
-    /**
-     *
-     * @param s
-     * @return
-     */
-    private String stripQuotes(String s) {
-        boolean start = s.charAt(0) == '\'';
-        boolean end = s.charAt(s.length() - 1) == '\'';
-
-        return start && end ? s.substring(1, s.length() - 1) : s;
-    }
-
-    /**
-     *
-     */
-    private IllegalArgumentException operatorError(Object lv, Object rv) {
-        return new IllegalArgumentException(String.format(
-            "Unexpected token predicate DSL operator '%s' for values: %s, %s",
-            op, lv.toString(), rv.toString()));
-    }
-
-    /**
-     *
-     * @param s
-     * @return
-     */
-    private boolean isRegex(String s) {
-        return s.startsWith(NCUtils.REGEX_FIX()) && s.endsWith(NCUtils.REGEX_FIX());
-    }
-
-    /**
-     *
-     * @param s
-     * @return
-     */
-    private String stripRegex(String s) {
-        int len = NCUtils.REGEX_FIX().length();
-
-        return s.substring(len, s.length() - len);
-    }
-
-    /**
-     * 
-     * @param lv Left value.
-     * @param rv right value.
-     * @return
-     */
-    @SuppressWarnings("rawtypes")
-    private boolean doEqual(Object lv, Object rv) {
-        if (lv == rv)
-            return true;
-        // Collection equality.
-        else if (lv instanceof Collection && rv instanceof Collection)
-            return CollectionUtils.isEqualCollection(
-                (Collection)lv,
-                (Collection)rv
-            );
-        // 'in' operator.
-        else if (rv instanceof Collection)
-            return ((Collection)rv).contains(lv);
-        else if (lv instanceof Number && rv instanceof Number)
-            return Double.compare(
-                ((Number)lv).doubleValue(),
-                ((Number)rv).doubleValue()
-            ) == 0;
-        // Regex.
-        else if (lv instanceof String && rv instanceof String && isRegex((String)rv) && !isRegex((String)lv))
-            return Pattern.matches(stripRegex((String)rv), (String)lv);
-        else if (lv instanceof String && rv instanceof String && isRegex((String)lv) && !isRegex((String)rv))
-            return Pattern.matches(stripRegex((String)lv), (String)rv);
-        else if (lv == null || rv == null)
-            return false;
-        else
-            return Objects.equals(lv, rv);
-    }
-
-    /**
-     *
-     * @param lv Left value.
-     * @param rv right value.
-     * @return
-     */
-    @SuppressWarnings("rawtypes")
-    private boolean doContain(Object lv, Object rv) {
-        if (lv == null || lv == rv)
-            return false;
-        else if (lv instanceof Collection && !(rv instanceof Collection))
-            return ((Collection)lv).contains(rv);
-        else if (lv instanceof Collection) // Two collections.
-            return ((Collection)lv).containsAll((Collection)rv);
-        else if (lv instanceof String && rv instanceof String) // Substring containment.
-            return ((String)lv).contains((String)rv);
-        else
-            throw operatorError(lv, rv);
-    }
-
-    /**
-     *
-     * @param v1
-     * @param v2
-     * @return
-     */
-    private int doCompare(Object v1, Object v2) {
-        if (v1 == v2)
-            return 0;
-        else if (v1 == null)
-            return -1;
-        else if (v2 == null)
-            return 1;
-        if (v1 instanceof Number && v2 instanceof Number)
-            return Double.compare(
-                ((Number)v1).doubleValue(),
-                ((Number)v2).doubleValue()
-            );
-        else
-            throw operatorError(v1, v2);
-    }
-
-    /**
-     *
-     * @param lval
-     * @return
-     */
-    private Object processParamFunction(Object lval) {
-        switch (paramFunc) {
-            case "trim":
-                if (lval instanceof String)
-                    return ((String) lval).strip();
-
-                break;
-
-            case "uppercase":
-                if (lval instanceof String)
-                    return ((String) lval).toUpperCase();
-
-                break;
-
-            case "lowercase":
-                if (lval instanceof String)
-                    return ((String) lval).toLowerCase();
-
-                break;
-
-            case "abs":
-                if (lval instanceof Double)
-                    return Math.abs((Double) lval);
-                else if (lval instanceof Float)
-                    return Math.abs((Float) lval);
-                else if (lval instanceof Long)
-                    return Math.abs((Long) lval);
-                else if (lval instanceof Integer)
-                    return Math.abs((Integer) lval);
-
-                break;
-
-            case "ceil":
-                if (lval instanceof Double)
-                    return Math.ceil((Double) lval);
-
-                break;
-
-            case "floor":
-                if (lval instanceof Double)
-                    return Math.floor((Double) lval);
-
-                break;
-
-            case "rint":
-                if (lval instanceof Double)
-                    return Math.rint((Double) lval);
-
-                break;
-
-            case "round":
-                if (lval instanceof Double)
-                    return Math.round((Double) lval);
-                else if (lval instanceof Float)
-                    return Math.round((Float) lval);
-
-                break;
-
-            case "signum":
-                if (lval instanceof Double)
-                    return Math.signum((Double) lval);
-                else if (lval instanceof Float)
-                    return Math.signum((Float) lval);
-
-                break;
-
-            case "keys":
-                if (lval instanceof Map)
-                    return ((Map<String, Object>)lval).keySet();
-
-                break;
-
-            case "values":
-                if (lval instanceof Map)
-                    return ((Map<String, Object>)lval).values();
-
-                break;
-
-            case "isalpha":
-                if (lval instanceof String)
-                    return StringUtils.isAlpha((String) lval);
-
-                break;
-
-            case "isalphanum":
-                if (lval instanceof String)
-                    return StringUtils.isAlphanumeric((String) lval);
-
-                break;
-
-            case "iswhitespace":
-                if (lval instanceof String)
-                    return StringUtils.isWhitespace((String) lval);
-
-                break;
-
-            case "isnumeric":
-                if (lval instanceof String)
-                    return StringUtils.isNumeric((String) lval);
-
-                break;
-
-            case "length":
-            case "count":
-            case "size":
-                if (lval instanceof Collection)
-                    return ((java.util.Collection<Object>)lval).size();
-                else if (lval instanceof Map)
-                    return ((Map<String, Object>)lval).size();
-                else if (lval instanceof String)
-                    return ((String)lval).length();
-
-                break;
-        }
-
-        throw new IllegalArgumentException(String.format("Token predicate function '%s' cannot be applied to value type '%s'",
-            paramFunc, lval.getClass().toString()));
-    }
-
-    @Override
-    public Boolean apply(NCToken tok) {
-        // Qualify token, if required.
-        tok = qualFunc.apply(tok);
-
-        Object lval = null;
-
-        if (param.charAt(0) == '~') {
-            String str = param.substring(1);
-
-            if (str.isEmpty())
-                throw new IllegalArgumentException(String.format("Token predicate DSL empty meta parameter name: %s %s %s",
-                    param, op, valueStr));
-
-            String[] parts = str.split("[\\[\\]]");
-
-            String metaName = parts[0];
-
-            if (parts.length == 1)
-                lval = tok.meta(metaName);
-            else if (parts.length == 2) {
-                Object obj = tok.meta(metaName);
-
-                if (obj != null) {
-                    String strIdx = parts[1];
-
-                    if (strIdx.isEmpty())
-                        throw new IllegalArgumentException(
-                            String.format("Token predicate DSL meta parameter empty index: %s %s %s", param, op,
-                                valueStr));
-                    else if (obj instanceof java.util.List) {
-                        try {
-                            lval = ((List<Object>)obj).get(Integer.parseInt(strIdx));
-                        }
-                        catch (NumberFormatException e) {
-                            throw new IllegalArgumentException(String.format(
-                                "Invalid token predicate DSL meta parameter index ('%s') for java.util.List value (integer only): %s %s %s",
-                                strIdx, param, op, valueStr),
-                                e);
-                        }
-                    }
-                    else if (obj instanceof Map)
-                        lval = ((Map<String, Object>)obj).get(stripQuotes(strIdx));
-                    else
-                        throw new IllegalArgumentException(String.format(
-                            "Invalid token predicate DSL meta parameter value " +
-                            "for indexed access (java.util.List or java.util.Map only): %s %s %s",
-                            param, op, valueStr));
-                }
-            }
-            else
-                throw new IllegalArgumentException(String.format(
-                    "Invalid token predicate DSL meta parameter: %s %s %s", param, op, valueStr));
-        }
-        else
-            switch (param) {
-                case "id": lval = tok.getId().strip(); break;
-                case "groups": lval = tok.getGroups(); break;
-                case "aliases": lval = tok.getAliases(); break;
-                case "startidx": lval = tok.getStartCharIndex(); break;
-                case "endidx": lval = tok.getEndCharIndex(); break;
-                case "ancestors": lval = tok.getAncestors(); break;
-                case "value": lval = tok.getValue() == null ? null : tok.getValue().strip(); break;
-                case "parent": lval = tok.getParentId() == null ? null : tok.getParentId().strip(); break;
-
-                default: throw new IllegalArgumentException(String.format(
-                    "Invalid token predicate DSL parameter ('%s'): %s %s %s",
-                    param, param, op, valueStr));
-            }
-
-        if (paramFunc != null)
-            lval = processParamFunction(lval);
-
-        Object rval = value;
-
-        if (!validated) {
-            if ((param.equals("ancestors") ||
-                param.equals("id") ||
-                param.equals("parent")) &&
-                !NCDslTokenChecker.isValidElementId(tok, (String)rval))
-                throw new IllegalArgumentException(String.format("Attempt to check unknown element ID '%s': %s %s %s",
-                    rval, param, op, valueStr));
-
-            if ((param.equals("groups")) &&
-                !NCDslTokenChecker.isValidGroup(tok, (String)rval))
-                throw new IllegalArgumentException(String.format("Attempt to check unknown group ID '%s': %s %s %s",
-                    rval, param, op, valueStr));
-
-            validated = true;
-        }
-
-        switch (op) {
-            case "==": return doEqual(lval, rval);
-            case "!=": return !doEqual(lval, rval);
-            case ">": return doCompare(lval, rval) == 1;
-            case ">=": return doCompare(lval, rval) >= 0;
-            case "<": return doCompare(lval, rval) == -1;
-            case "<=": return doCompare(lval, rval) <= 0;
-            case "@@": return doContain(lval, rval);
-            case "!@": return !doContain(lval, rval);
-
-            default:
-                throw new AssertionError("Unexpected token predicate DSL operation: " + op);
-        }
-    }
-
-    @Override
-    public String toString() {
-        String x = parts.isEmpty() ? param : String.format("%s.%s", String.join(".", parts), param);
-        String x1 = paramFunc != null ? String.format("%s(%s)", paramFunc, x) : x;
-
-        return String.format("%s %s %s", x1, op, valueStr);
-    }
-}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenQualifier.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenQualifier.scala
deleted file mode 100644
index fe5d6e0..0000000
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/utils/NCDslTokenQualifier.scala
+++ /dev/null
@@ -1,62 +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.model.intent.utils
-
-import org.apache.nlpcraft.common._
-import org.apache.nlpcraft.model.NCToken
-
-import scala.collection.JavaConverters._
-import scala.collection.mutable
-
-/**
- * DSL token qualifier.
- */
-class NCDslTokenQualifier(parts: java.util.List[String]) extends java.util.function.Function[NCToken, NCToken] {
-    private final val func: NCToken ⇒ NCToken =
-        if (parts.isEmpty)
-            t ⇒ t // Identity function.
-        else
-            t ⇒ {
-                var tok = t
-                
-                for (part ← parts.asScala) {
-                    val partToks = tok.getPartTokens.asScala
-                    
-                    val qualToks: mutable.Buffer[(NCToken, Set[String]/*ID or predicate alias*/)] =
-                        (
-                            partToks.zip(partToks.map(tok ⇒ Set(tok.getId))) ++
-                            partToks.zip(partToks.map(tok ⇒ tok.meta(TOK_META_ALIASES_KEY).asInstanceOf[java.util.Set[String]] match {
-                                case null ⇒ Set.empty[String]
-                                case x ⇒ x.asScala.toSet
-                            }))
-                        )
-                        .filter(_._2.contains(part))
-                    
-                    if (qualToks.isEmpty)
-                        throw new IllegalArgumentException(s"Unknown part token qualifier: $part for token: ${t.getId}")
-                    if (qualToks.size > 1)
-                        throw new IllegalArgumentException(s"Multiple part tokens found for: $part for token: ${t.getId}")
-                    
-                    tok = qualToks.head._1
-                }
-                
-                tok
-            }
-        
-    override def apply(tok: NCToken): NCToken = func(tok)
-}
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeModel.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeModel.scala
index f52d8d2..bc2cd72 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeModel.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/NCProbeModel.scala
@@ -17,7 +17,7 @@
 
 package org.apache.nlpcraft.probe.mgrs
 
-import org.apache.nlpcraft.model.intent.impl.NCIntentSolver
+import org.apache.nlpcraft.model.intent.solver.NCIntentSolver
 import org.apache.nlpcraft.model.intent.utils.NCDslIntent
 import org.apache.nlpcraft.model.{NCElement, NCModel}
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
index e63aceb..6e3ddb4 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/deploy/NCDeployManager.scala
@@ -33,7 +33,8 @@ import org.apache.nlpcraft.common.nlp.core.{NCNlpCoreManager, NCNlpPorterStemmer
 import org.apache.nlpcraft.common.util.NCUtils.{DSL_FIX, REGEX_FIX}
 import org.apache.nlpcraft.model._
 import org.apache.nlpcraft.model.factories.basic.NCBasicModelFactory
-import org.apache.nlpcraft.model.intent.impl.{NCIntentDslCompiler, NCIntentSolver}
+import org.apache.nlpcraft.model.intent.compiler.NCIntentDslCompiler
+import org.apache.nlpcraft.model.intent.solver.NCIntentSolver
 import org.apache.nlpcraft.model.intent.utils.NCDslIntent
 import org.apache.nlpcraft.probe.mgrs.NCProbeSynonymChunkKind.{DSL, REGEX, TEXT}
 import org.apache.nlpcraft.probe.mgrs.{NCProbeModel, NCProbeSynonym, NCProbeSynonymChunk, NCProbeSynonymsWrapper}
@@ -466,7 +467,6 @@ object NCDeployManager extends NCService with DecorateAsScala {
                 throw new NCE(s"Duplicated synonyms found and not allowed [mdlId=$mdlId]")
         }
 
-        mdl.getMetadata.put(MDL_META_ALL_ALIASES_KEY, allAliases.toSet)
         mdl.getMetadata.put(MDL_META_ALL_ELM_IDS_KEY,
             mdl.getElements.asScala.map(_.getId).toSet ++
                 Set("nlpcraft:nlp") ++
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala
index cec9bdd..aeb931f 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/dialogflow/NCDialogFlowManager.scala
@@ -19,8 +19,8 @@ package org.apache.nlpcraft.probe.mgrs.dialogflow
 
 import io.opencensus.trace.Span
 import org.apache.nlpcraft.common.{NCService, _}
+import org.apache.nlpcraft.model.intent.solver.NCIntentSolverResult
 import org.apache.nlpcraft.model.{NCContext, NCDialogFlowItem, NCIntentMatch}
-import org.apache.nlpcraft.model.intent.impl.NCIntentSolverResult
 import org.apache.nlpcraft.probe.mgrs.model.NCModelManager
 
 import scala.collection._
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
index 9aec9cc..da85340 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/nlp/NCProbeEnrichmentManager.scala
@@ -27,7 +27,7 @@ import org.apache.nlpcraft.common.nlp.{NCNlpSentence, NCNlpSentenceNote}
 import org.apache.nlpcraft.common.pool.NCThreadPoolManager
 import org.apache.nlpcraft.model._
 import org.apache.nlpcraft.model.impl.NCTokenLogger
-import org.apache.nlpcraft.model.intent.impl.NCIntentSolverInput
+import org.apache.nlpcraft.model.intent.solver.NCIntentSolverInput
 import org.apache.nlpcraft.model.opencensus.stats.NCOpenCensusModelStats
 import org.apache.nlpcraft.model.tools.embedded.NCEmbeddedResult
 import org.apache.nlpcraft.probe.mgrs.conn.NCConnectionManager
diff --git a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/NCIntentDslCompilerSpec.scala b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/NCIntentDslCompilerSpec.scala
index 685ea43..761f5e3 100644
--- a/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/NCIntentDslCompilerSpec.scala
+++ b/nlpcraft/src/test/scala/org/apache/nlpcraft/model/intent/dsl/compiler/NCIntentDslCompilerSpec.scala
@@ -18,7 +18,8 @@
 package org.apache.nlpcraft.model.intent.dsl.compiler
 
 import org.apache.nlpcraft.common._
-import org.apache.nlpcraft.model.intent.impl.{NCIntentDslCompiler, NCIntentDslFragmentCache}
+import org.apache.nlpcraft.model.intent.compiler.{NCIntentDslCompiler, NCIntentDslFragmentCache}
+import org.apache.nlpcraft.model.intent.impl.NCIntentDslFragmentCache
 import org.junit.jupiter.api.Test
 
 import java.nio.file.{Path, Paths}