diff --git a/package.json b/package.json
index 5b601fb..6b063e9 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
     "name": "@ebenos/monorepo",
-    "version": "3.1.0",
+    "version": "3.1.1",
     "main": "index.js",
     "license": "MIT",
     "private": true,
diff --git a/packages/framework/lib/index.ts b/packages/framework/lib/index.ts
index 2fcbc3f..b53b50c 100644
--- a/packages/framework/lib/index.ts
+++ b/packages/framework/lib/index.ts
@@ -12,6 +12,7 @@ import Bot from './bot';
 import User from './models/User';
 import DatabaseUser, { userLoader as databaseUserLoader } from './models/DatabaseUser';
 import InMemoryUser, { userLoader as inMemoryUserLoader } from './models/InMemoryUser';
+import { IUser } from './models/UserSchema';
 import GenericAdapter from './adapter';
 import TestAdapter from './tests/test-adapter';
 export { Module, BotOptions, Scenario } from './interfaces/bot';
@@ -33,5 +34,6 @@ export {
     databaseUserLoader,
     InMemoryUser,
     inMemoryUserLoader,
-    TestAdapter
+    TestAdapter,
+    IUser
 };
diff --git a/packages/framework/lib/interfaces/nlp.ts b/packages/framework/lib/interfaces/nlp.ts
index 34b8747..c9d4d74 100644
--- a/packages/framework/lib/interfaces/nlp.ts
+++ b/packages/framework/lib/interfaces/nlp.ts
@@ -1,11 +1,16 @@
 export interface WitNLP {
-    entities: {
-        intent?: WitEntityNLP[];
-        sentiment?: WitEntityNLP[];
-    };
+    text: string;
+    intents: WitIntentNLP[];
+    entities: any;
 }
 
 export interface WitEntityNLP {
     value: string;
     confidence: number;
 }
+
+export interface WitIntentNLP {
+    id: string;
+    name: string;
+    confidence: number;
+}
diff --git a/packages/framework/lib/interfaces/trackingData.ts b/packages/framework/lib/interfaces/trackingData.ts
index 86910fa..86f58e1 100644
--- a/packages/framework/lib/interfaces/trackingData.ts
+++ b/packages/framework/lib/interfaces/trackingData.ts
@@ -1,5 +1 @@
-export type TrackingDataPrimitives = null | string | number | boolean;
-export type ITrackingData =
-    | TrackingDataPrimitives
-    | Array<ITrackingData>
-    | { [key: string]: ITrackingData };
+export type ITrackingData = Record<string, any> | string;
diff --git a/packages/framework/lib/modules/index.ts b/packages/framework/lib/modules/index.ts
index 8ce5da4..78957f5 100644
--- a/packages/framework/lib/modules/index.ts
+++ b/packages/framework/lib/modules/index.ts
@@ -79,7 +79,7 @@ export function addBaseLocationRule<U extends User<any>>(
 
 export function addTextRule<U extends User<any>>(
     module: Module<U>,
-    action: (user: U, payload?: IPayload, ...args: any[]) => Promise<any>,
+    action: (user: U, payload: IPayload, ...args: any[]) => Promise<any>,
     rule: RegExp | RegExp[]
 ): void {
     const actionName = module.name + '/' + action.name;
diff --git a/packages/framework/package.json b/packages/framework/package.json
index ce62e35..d4e98b4 100644
--- a/packages/framework/package.json
+++ b/packages/framework/package.json
@@ -1,6 +1,6 @@
 {
-    "name": "@ebenos/framework",
-    "version": "4.0.0-alpha.29",
+    "name": "@ebonydevcopy/framework",
+    "version": "4.0.0-alpha.30",
     "description": "A module-based NodeJS chatbot framework.",
     "main": "./build/index.js",
     "types": "./build/index.d.ts",
diff --git a/packages/viber-adapter/lib/adapter.ts b/packages/viber-adapter/lib/adapter.ts
index bb9a221..8061237 100644
--- a/packages/viber-adapter/lib/adapter.ts
+++ b/packages/viber-adapter/lib/adapter.ts
@@ -1,26 +1,45 @@
-import { EbonyHandlers, GenericAdapter, GenericAttachment, IRouters } from '@ebenos/framework';
+import {
+    EbonyHandlers,
+    GenericAdapter,
+    GenericAttachment,
+    IRouters
+} from '@ebonydevcopy/framework';
 import express, { Request, Response } from 'express';
 import { json as bodyParser } from 'body-parser';
 import senderFactory from './sender';
-import { IViberMessageEvent, IViberSender, WebhookIncomingViberEvent } from './interfaces/webhook';
+import {
+    IViberMessageEvent,
+    IViberSender,
+    WebhookIncomingViberEvent,
+    IViberUnsubscribedEvent,
+    IViberSubscribedEvent,
+    IViberConversationStartedEvent
+} from './interfaces/webhook';
 import { setWebhook } from './api/requests';
 import { IViberSetWebhookResult } from './interfaces/api';
-import { IUser } from '@ebenos/framework/lib/models/UserSchema';
 import {
     isMediaMessage,
     IViberLocationMessage,
     IViberTextMessage
 } from './interfaces/message_types';
 import { isPostbackTrackingData } from './interfaces/tracking_data';
-import { ITrackingData } from '@ebenos/framework';
+import { ITrackingData, IUser } from '@ebonydevcopy/framework';
 
-export interface IViberOptions {
+export interface IViberOptions<U> {
     route?: string;
     authToken: string;
     welcomeMessage?: Record<string, unknown>;
+    userLoader?: (userData: IUser) => Promise<U>;
+    webhookHanlers?: IViberWebhookHandlers;
+}
+
+export interface IViberWebhookHandlers {
+    unsubscribeWebhook?: (e: IViberUnsubscribedEvent) => Promise<void>;
+    subscribeWebhook?: (e: IViberSubscribedEvent) => Promise<void>;
+    conversationStartedWebhook?: (e: IViberConversationStartedEvent) => Promise<void>;
 }
 
-export default class ViberAdapter extends GenericAdapter {
+export default class ViberAdapter<U extends IUser> extends GenericAdapter {
     public operations = {
         handover: (): Promise<void> => {
             console.log('Not implemented!');
@@ -31,25 +50,41 @@ export default class ViberAdapter extends GenericAdapter {
     public sender;
 
     private welcomeMessage?: Record<string, unknown>;
+    private webhookHanlers?: IViberWebhookHandlers;
     private route: string;
     private authToken: string;
     public webhook = express();
+    private userLoader?: (userData: IUser) => Promise<U>;
 
-    constructor(options: IViberOptions) {
+    constructor(options: IViberOptions<U>) {
         super();
-        const { route = '/viber/webhook', authToken, welcomeMessage } = options;
+        const {
+            route = '/viber/webhook',
+            authToken,
+            welcomeMessage,
+            userLoader,
+            webhookHanlers
+        } = options;
 
         this.route = route;
         this.authToken = authToken;
         this.sender = senderFactory(this.authToken);
         this.welcomeMessage = welcomeMessage;
+        this.userLoader = userLoader;
+        this.webhookHanlers = webhookHanlers;
     }
 
-    public initialization(): void {
+    public async initialization(): Promise<void> {
         this.webhook.use(bodyParser());
         this.webhook.post(
             this.route,
-            viberWebhookFactory(this.routers, this.handlers, this.welcomeMessage)
+            await viberWebhookFactory(
+                this.routers,
+                this.handlers,
+                this.welcomeMessage,
+                this.userLoader,
+                this.webhookHanlers
+            )
         );
     }
 
@@ -110,19 +145,27 @@ function handleTextMessage(
     return;
 }
 
-function viberWebhookFactory(
+async function viberWebhookFactory<U extends IUser>(
     routers: IRouters,
     handlers: EbonyHandlers<any>,
-    welcomeMessage?: Record<string, unknown>
+    welcomeMessage?: Record<string, unknown>,
+    userLoader?: (userData: IUser) => Promise<U>,
+    webhooks?: {
+        unsubscribeWebhook?: (e: IViberUnsubscribedEvent) => Promise<void>;
+        subscribeWebhook?: (e: IViberSubscribedEvent) => Promise<void>;
+        conversationStartedWebhook?: (e: IViberConversationStartedEvent) => Promise<void>;
+    }
 ) {
-    function messageWebhook(e: IViberMessageEvent): void {
-        const user = convertViberSenderToUser(e.sender);
+    async function messageWebhook(e: IViberMessageEvent): Promise<void> {
+        const user = userLoader
+            ? await userLoader(convertViberSenderToUser(e.sender))
+            : convertViberSenderToUser(e.sender);
+
         switch (e.message.type) {
             case 'text':
             case 'location':
                 handleTextMessage(e.message, user, handlers.text, routers);
                 return;
-
             default:
                 if (isMediaMessage(e.message)) {
                     if (handlers.attachment !== undefined) {
@@ -152,6 +195,7 @@ function viberWebhookFactory(
                 console.log('seen');
                 return;
             case 'conversation_started':
+                if (webhooks?.conversationStartedWebhook) webhooks.conversationStartedWebhook(body);
                 console.log('conversation_started');
                 if (welcomeMessage !== undefined) {
                     res.json(welcomeMessage);
@@ -163,10 +207,12 @@ function viberWebhookFactory(
                 console.log('delivered');
                 return;
             case 'subscribed':
+                if (webhooks?.subscribeWebhook) webhooks.subscribeWebhook(body);
                 console.log('subscribed');
                 return;
             case 'unsubscribed':
-                console.log('unsubscribed');
+                if (webhooks?.unsubscribeWebhook) webhooks.unsubscribeWebhook(body);
+                else console.log('unsubscribed');
                 return;
             case 'failed':
                 console.log(`Failed: ${body.desc}`);
diff --git a/packages/viber-adapter/lib/sender.ts b/packages/viber-adapter/lib/sender.ts
index aaa878c..9895775 100644
--- a/packages/viber-adapter/lib/sender.ts
+++ b/packages/viber-adapter/lib/sender.ts
@@ -1,4 +1,4 @@
-import { IInteraction } from '@ebenos/framework';
+import { IInteraction } from '@ebonydevcopy/framework';
 import { sendMessage } from './api/requests';
 
 export default function senderFactory(viberToken: string) {
diff --git a/packages/viber-adapter/package.json b/packages/viber-adapter/package.json
index 2bf035d..ca1c388 100644
--- a/packages/viber-adapter/package.json
+++ b/packages/viber-adapter/package.json
@@ -1,6 +1,6 @@
 {
-    "name": "@ebenos/viber-adapter",
-    "version": "4.0.0-alpha.29",
+    "name": "@ebonydevcopy/viber-adapter",
+    "version": "4.0.0-alpha.31",
     "description": "Viber adapter for the Ebony framework.",
     "main": "./build/index.js",
     "publishConfig": {
@@ -33,7 +33,7 @@
         "node-fetch": "^2.6.6"
     },
     "devDependencies": {
-        "@ebenos/framework": "^4.0.0-alpha.29",
+        "@ebonydevcopy/framework": "^4.0.0-alpha.29",
         "@types/body-parser": "^1.19.2",
         "@types/express": "^4.17.13",
         "@types/node-fetch": "^2.5.12"
diff --git a/packages/viber-elements/lib/viberAPI/attachments.ts b/packages/viber-elements/lib/viberAPI/attachments.ts
index df1ee2c..2d9ef40 100644
--- a/packages/viber-elements/lib/viberAPI/attachments.ts
+++ b/packages/viber-elements/lib/viberAPI/attachments.ts
@@ -17,7 +17,7 @@ import {
     OpenURLMediaType,
     ISerializedButton
 } from './interfaces';
-import { ISerializable } from '@ebenos/framework';
+import { ISerializable } from '@ebonydevcopy/framework';
 
 /**Viber RichMedia Button */
 export class Button implements ISerializable {
diff --git a/packages/viber-elements/lib/viberAPI/carousel.ts b/packages/viber-elements/lib/viberAPI/carousel.ts
index b5ef24b..a7da9f7 100644
--- a/packages/viber-elements/lib/viberAPI/carousel.ts
+++ b/packages/viber-elements/lib/viberAPI/carousel.ts
@@ -1,6 +1,6 @@
 import { Button, RichMedia } from './attachments';
 import { IFrame, IRichMediaOptions } from './interfaces';
-import { ISerializable } from '@ebenos/framework';
+import { ISerializable } from '@ebonydevcopy/framework';
 
 export interface ICarouselElement {
     title?: string;
diff --git a/packages/viber-elements/lib/viberAPI/interfaces.ts b/packages/viber-elements/lib/viberAPI/interfaces.ts
index 127248f..5ca8929 100644
--- a/packages/viber-elements/lib/viberAPI/interfaces.ts
+++ b/packages/viber-elements/lib/viberAPI/interfaces.ts
@@ -1,7 +1,7 @@
 import { RichMedia, Picture, Button } from './attachments';
 import { Carousel } from './carousel';
 import { Keyboard } from './keyboard';
-import { ITrackingData } from '@ebenos/framework';
+import { ITrackingData } from '@ebonydevcopy/framework';
 
 export type ScaleType = 'crop' | 'fill' | 'fit';
 export type ActionType = 'reply' | 'open-url' | 'location-picker' | 'share-phone' | 'none';
diff --git a/packages/viber-elements/lib/viberAPI/keyboard.ts b/packages/viber-elements/lib/viberAPI/keyboard.ts
index 3af8f59..e170f61 100644
--- a/packages/viber-elements/lib/viberAPI/keyboard.ts
+++ b/packages/viber-elements/lib/viberAPI/keyboard.ts
@@ -1,4 +1,4 @@
-import { ISerializable } from '@ebenos/framework';
+import { ISerializable } from '@ebonydevcopy/framework';
 import { Button } from './attachments';
 import { IKeyboardOptions, InputFieldState, ISerializedKeyboard } from './interfaces';
 
diff --git a/packages/viber-elements/lib/viberAPI/message.ts b/packages/viber-elements/lib/viberAPI/message.ts
index 72b8201..090fe5f 100644
--- a/packages/viber-elements/lib/viberAPI/message.ts
+++ b/packages/viber-elements/lib/viberAPI/message.ts
@@ -1,4 +1,4 @@
-import { ISerializable } from '@ebenos/framework';
+import { ISerializable } from '@ebonydevcopy/framework';
 import {
     IMessageOptions,
     ISender,
@@ -12,7 +12,7 @@ import {
 import { Picture, RichMedia } from './attachments';
 import { Keyboard } from './keyboard';
 import { Carousel } from './carousel';
-import { ITrackingData } from '@ebenos/framework';
+import { ITrackingData } from '@ebonydevcopy/framework';
 
 function isText(options: IMessageOptions): options is ITextOptions {
     return (options as ITextOptions).text !== undefined;
diff --git a/packages/viber-elements/package.json b/packages/viber-elements/package.json
index b1d8dc1..8bf6df1 100644
--- a/packages/viber-elements/package.json
+++ b/packages/viber-elements/package.json
@@ -1,6 +1,6 @@
 {
-    "name": "@ebenos/viber-elements",
-    "version": "4.0.0-alpha.29",
+    "name": "@ebonydevcopy/viber-elements",
+    "version": "4.0.0-alpha.31",
     "description": "Elements Library for the Ebony framework.",
     "main": "./build/index.js",
     "publishConfig": {
@@ -29,10 +29,10 @@
     ],
     "license": "MIT",
     "peerDependencies": {
-        "@ebenos/framework": "*"
+        "@ebonydevcopy/framework": "*"
     },
     "devDependencies": {
-        "@ebenos/framework": "^4.0.0-alpha.29"
+        "@ebonydevcopy/framework": "^4.0.0-alpha.29"
     },
     "engines": {
         "node": ">=14.0.0"
diff --git a/yarn.lock b/yarn.lock
index d75c828..3e1caf4 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -23,6 +23,24 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
+"@ebenos/framework@^4.0.0-alpha.29":
+  version "4.0.0-alpha.29"
+  resolved "https://registry.yarnpkg.com/@ebenos/framework/-/framework-4.0.0-alpha.29.tgz#966f8535dd7d7abcdb2de5ea4bcad4bac371d6bc"
+  integrity sha512-P+9RDnP2AZNCGGY0QNY+WMEfTGOWSGuhnjJ0IKNdhGk+Pvp8bDRZ329BHuIYE5KjUajOZbY/pTvnys3smu7Zrw==
+  dependencies:
+    lodash "^4.17.21"
+    mongodb "^4.2.0"
+    mongoose "^6.0.13"
+
+"@ebenos/viber-adapter@^4.0.0-alpha.29":
+  version "4.0.0-alpha.29"
+  resolved "https://registry.yarnpkg.com/@ebenos/viber-adapter/-/viber-adapter-4.0.0-alpha.29.tgz#b849d77f6604b2156156f12f5de2dc3ab4db9048"
+  integrity sha512-hhaf3c05kI7txUF5dbWFsN9Om0CobhAs82KFfo1Hsxvwk4QboOX6Bgklv2lzvWj2szV4HGUskeQPp0BINIx8bw==
+  dependencies:
+    body-parser "^1.19.0"
+    express "^4.17.1"
+    node-fetch "^2.6.6"
+
 "@eslint/eslintrc@^1.0.4":
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.4.tgz#dfe0ff7ba270848d10c5add0715e04964c034b31"
@@ -1414,7 +1432,7 @@ browser-stdout@1.3.1:
   resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
   integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
 
-bson@^4.2.2, bson@^4.5.4:
+bson@^4.2.2, bson@^4.5.4, bson@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/bson/-/bson-4.6.0.tgz#15c3b39ba3940c3d915a0c44d51459f4b4fbf1b2"
   integrity sha512-8jw1NU1hglS+Da1jDOUYuNcBJ4cNHCFIqzlwoFNnsTOg2R/ox0aTYcTiBN4dzRa9q7Cvy6XErh3L8ReTEb9AQQ==
@@ -3328,6 +3346,11 @@ kareem@2.3.2:
   resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.2.tgz#78c4508894985b8d38a0dc15e1a8e11078f2ca93"
   integrity sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ==
 
+kareem@2.3.3:
+  version "2.3.3"
+  resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.3.tgz#a4432d7965a5bb06fc2b4eeae71317344c9a756a"
+  integrity sha512-uESCXM2KdtOQ8LOvKyTUXEeg0MkYp4wGglTIpGcYHvjJcS5sn2Wkfrfit8m4xSbaNDAw2KdI9elgkOxZbrFYbg==
+
 kind-of@^6.0.2, kind-of@^6.0.3:
   version "6.0.3"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
@@ -3800,6 +3823,14 @@ mongodb-connection-string-url@^2.1.0, mongodb-connection-string-url@^2.2.0:
     "@types/whatwg-url" "^8.2.1"
     whatwg-url "^11.0.0"
 
+mongodb-connection-string-url@^2.3.2:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.4.1.tgz#6b3c6c40133a0ad059fe9a0abda64b2a1cb4e8b4"
+  integrity sha512-d5Kd2bVsKcSA7YI/yo57fSTtMwRQdFkvc5IZwod1RRxJtECeWPPSo7zqcUGJELifRA//Igs4spVtYAmvFCatug==
+  dependencies:
+    "@types/whatwg-url" "^8.2.1"
+    whatwg-url "^11.0.0"
+
 mongodb@4.1.4:
   version "4.1.4"
   resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.1.4.tgz#ba8062c7c67e7a22db5a059dbac1e3044b48453b"
@@ -3811,6 +3842,17 @@ mongodb@4.1.4:
   optionalDependencies:
     saslprep "^1.0.3"
 
+mongodb@4.2.2:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.2.2.tgz#cd70568bd96003877e35358ad17a0c5de35c6dfd"
+  integrity sha512-zt8rCTnTKyMQppyt63qMnrLM5dbADgUk18ORPF1XbtHLIYCyc9hattaYHi0pqMvNxDpgGgUofSVzS+UQErgTug==
+  dependencies:
+    bson "^4.6.0"
+    denque "^2.0.1"
+    mongodb-connection-string-url "^2.3.2"
+  optionalDependencies:
+    saslprep "^1.0.3"
+
 mongodb@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.2.0.tgz#7ef94ab0613a2fd890763260fdac20cd099d0d7f"
@@ -3822,6 +3864,21 @@ mongodb@^4.2.0:
   optionalDependencies:
     saslprep "^1.0.3"
 
+mongoose@^6.0.13:
+  version "6.1.4"
+  resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.1.4.tgz#a414e64c849fae3ced99348e9de73f986c9f0551"
+  integrity sha512-RsNiMpGWo7OXFmq5xt0ZWYt2rabHLxNYr0oAiR0xDv23lHKCkXDqyDl71+sXF9rcWEe8BTHG+1IRQykiNBvaKQ==
+  dependencies:
+    bson "^4.2.2"
+    kareem "2.3.3"
+    mongodb "4.2.2"
+    mpath "0.8.4"
+    mquery "4.0.0"
+    ms "2.1.2"
+    regexp-clone "1.0.0"
+    sift "13.5.2"
+    sliced "1.0.1"
+
 mongoose@^6.0.14:
   version "6.0.14"
   resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.0.14.tgz#8f4d45318bb5de08814a8a9b040dd53521246608"