WIP.
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCConversation.java b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCConversation.java
index 5655426..b990851 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCConversation.java
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/model/NCConversation.java
@@ -18,6 +18,7 @@
 package org.apache.nlpcraft.model;
 
 import java.util.List;
+import java.util.Map;
 import java.util.function.Predicate;
 
 /**
@@ -83,4 +84,16 @@
      * @param filter Dialog flow filter based on IDs of previously matched intents.
      */
     void clearDialog(Predicate<String/* Intent ID. */> filter);
+
+    /**
+     * Gets modifiable user data container that can be to store user data in the conversation.
+     * Note that this data will expire the same as other elements in the conversation (i.e. tokens and
+     * previously matched intents).
+     * <p>
+     * Note that you should obtain the user data container on every intent callback invocation to make
+     * sure that expiration policy takes an effect. Do not cache the returned object elsewhere.
+     *
+     * @return Mutable user data container. The returned map is safe for concurrent modifications.
+     */
+    Map<String, Object> getUserData();
 }
diff --git a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversation.scala b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversation.scala
index 1f8f51b..21c17a7 100644
--- a/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversation.scala
+++ b/nlpcraft/src/main/scala/org/apache/nlpcraft/probe/mgrs/conversation/NCConversation.scala
@@ -278,4 +278,9 @@
             new util.ArrayList[NCToken](toks.asJava)
         }
     }
+
+    /**
+      *
+      */
+    def getUserData: util.Map[String, Object] = data
 }
\ No newline at end of file
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 e40e5ac..3e6ff92 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
@@ -563,6 +563,7 @@
                 override def getDialogFlow: util.List[String] = NCDialogFlowManager.getDialogFlow(usrId, mdlId, span).asJava
                 override def clearStm(filter: Predicate[NCToken]): Unit = conv.clearTokens(filter)
                 override def clearDialog(filter: Predicate[String]): Unit = NCDialogFlowManager.clear(usrId, mdlId, span)
+                override def getUserData: util.Map[String, Object] = conv.getUserData
             }
 
             override def isOwnerOf(tok: NCToken): Boolean = allVars.contains(tok)