WIP on NLPCRAFT-369.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
index ddba511..1fb257c 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/common/NCService.scala
@@ -19,6 +19,7 @@
 
 import com.typesafe.scalalogging.LazyLogging
 import io.opencensus.trace.Span
+import org.apache.commons.lang3.StringUtils
 import org.apache.nlpcraft.common.opencensus.NCOpenCensusTrace
 import org.apache.nlpcraft.common.ansi.NCAnsi._
 
@@ -104,6 +105,14 @@
     }
 
     /**
+     *
+     * @param ms
+     * @return
+     */
+    private def padDur(ms: Long): String =
+        StringUtils.rightPad(s"${U.now() - ms}ms", 6)
+
+    /**
      * Acks started service. Should be called at the end of the `start()` method.
      */
     protected def ackStarted(): NCService = {
@@ -119,9 +128,9 @@
             "state" -> "started"
         )
 
-        val dur = s"$ansiGreenFg[${U.now() - timeStampMs}ms]$ansiReset"
+        val durBrkt = s"$ansiReversed$ansiGreenFg$ansiBold[${padDur(timeStampMs)}]$ansiReset"
 
-        logger.info(s"$name started $dur")
+        logger.info(s"$durBrkt $name started.")
 
         timeStampMs = -1L
 
@@ -142,7 +151,9 @@
             "state" -> "stopped"
         )
 
-        logger.info(s"$name stopped.")
+        val durBrkt = s"$ansiReversed$ansiBlueFg$ansiBold[${padDur(timeStampMs)}]$ansiReset"
+
+        logger.info(s"$durBrkt $name stopped.")
 
         timeStampMs = -1L
     }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
index dd59a88..86390ef 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/intent/solver/NCIntentSolverEngine.scala
@@ -192,11 +192,16 @@
 
         val req = ctx.getRequest
 
+        val usrId = req.getUser.getId
+        val mdlId = ctx.getModel.getId
+
         startScopedSpan("solve",
             "srvReqId" -> req.getServerRequestId,
-            "userId" -> req.getUser.getId,
-            "mdlId" -> ctx.getModel.getId,
-            "normText" -> req.getNormalizedText) { _ =>
+            "userId" -> usrId,
+            "mdlId" -> mdlId,
+            "normText" -> req.getNormalizedText) { span =>
+            NCDialogFlowManager.ack(usrId, mdlId, span)
+
             val matches = mutable.ArrayBuffer.empty[MatchHolder]
 
             // Find all matches across all intents and sentence variants.
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 8c5f2c1..b7e667d 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
@@ -18,13 +18,15 @@
 package org.apache.nlpcraft.probe.mgrs.dialogflow
 
 import io.opencensus.trace.Span
+import org.apache.nlpcraft.common.ascii.NCAsciiTable
 import org.apache.nlpcraft.common.{NCService, _}
 import org.apache.nlpcraft.model.intent.solver.NCIntentSolverResult
 import org.apache.nlpcraft.model.{NCCompany, NCContext, NCDialogFlowItem, NCIntentMatch, NCResult, NCToken, NCUser, NCVariant}
 import org.apache.nlpcraft.probe.mgrs.model.NCModelManager
 
+import java.text.DateFormat
 import java.util
-import java.util.Optional
+import java.util.{Date, Optional}
 import scala.collection._
 
 /**
@@ -151,6 +153,7 @@
       *
       * @param usrId User ID.
       * @param mdlId Model ID.
+      * @param parent Optional parent span.
       * @return Dialog flow.
       */
     def getDialogFlow(usrId: Long, mdlId: String, parent: Span = null): Seq[NCDialogFlowItem] =
@@ -161,6 +164,48 @@
         }
 
     /**
+     * Prints out ASCII table for current dialog flow.
+     *
+     * @param usrId User ID.
+     * @param mdlId Model ID.
+     * @param parent Optional parent span.
+     */
+    def ack(usrId: Long, mdlId: String, parent: Span = null): Unit = {
+        startScopedSpan("ack", parent, "usrId" -> usrId, "mdlId" -> mdlId) { _ =>
+            val curFlow = flow.synchronized {
+                flow.getOrElseUpdate(Key(usrId, mdlId), mutable.ArrayBuffer.empty[NCDialogFlowItem])
+            }
+
+            val tbl = NCAsciiTable(
+                "",
+                "Intent ID",
+                "Sever Request ID",
+                "Text",
+                "Received"
+            )
+
+            var i = 1
+
+            curFlow.foreach(x => {
+                tbl += (
+                    i,
+                    x.getIntentId,
+                    m(x.getServerRequestId),
+                    x.getNormalizedText,
+                    DateFormat.getDateTimeInstance.format(new Date(x.getReceiveTimestamp))
+                )
+
+                i += 1
+            })
+
+            logger.info(s"Current dialog flow (oldest first) for [" +
+                s"mdlId=$mdlId, " +
+                s"usrId=$usrId" +
+            s"]:\n${tbl.toString()}")
+        }
+    }
+
+    /**
      *  Gets next clearing time.
      */
     private def clearForTimeout(): Long =
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
index f4d2afe..a12a4e8 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/query/NCQueryManager.scala
@@ -270,7 +270,7 @@
                 tbl += (s"${b("Server Request ID")}", m(srvReqId))
                 tbl += (s"${b("Data")}", U.prettyJson(data.orNull).split("\n").toSeq)
 
-                logger.info(s"New request received:\n$tbl")
+                logger.info(s"New user request received:\n$tbl")
 
                 val enabledBuiltInToks = NCProbeManager.getModel(mdlId, span).enabledBuiltInTokens
 
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
index b24a5e8..93fa702 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/server/user/NCUserManager.scala
@@ -213,7 +213,7 @@
     private def clearSession(ses: SigninSession): Unit = {
         clearSigninCache(ses)
         
-        logger.info(s"User signed out: ${ses.userId}")
+        logger.info(s"User ID signed out: ${ses.userId}")
     }
 
     /**