diff --git a/server/core/src/types.ts b/server/core/src/types.ts
index 610917d638..46310d86ef 100644
--- a/server/core/src/types.ts
+++ b/server/core/src/types.ts
@@ -59,3 +59,10 @@ export interface FullTextAdapter {
  * @public
  */
 export type FullTextAdapterFactory = (url: string, workspace: string) => Promise<FullTextAdapter>
+
+/**
+ * @public
+ */
+export interface Token {
+  workspace: string
+}
diff --git a/server/mongo/src/storage.ts b/server/mongo/src/storage.ts
index dd2e857d6f..8355bc98b4 100644
--- a/server/mongo/src/storage.ts
+++ b/server/mongo/src/storage.ts
@@ -19,8 +19,8 @@ import type { DbAdapter, TxAdapter } from '@anticrm/server-core'
 
 import { MongoClient, Db, Filter, Document, Sort } from 'mongodb'
 
-function translateQuery<T extends Doc> (query: DocumentQuery<T>): Filter<T> {
-  return query as Filter<T>
+function translateQuery<T extends Doc> (query: DocumentQuery<T>): Filter<Document> {
+  return query as Filter<Document>
 }
 
 function translateDoc (doc: Doc): Document {
diff --git a/server/ws/package.json b/server/ws/package.json
index 504a4b44c4..54467afb10 100644
--- a/server/ws/package.json
+++ b/server/ws/package.json
@@ -23,6 +23,7 @@
     "jwt-simple": "^0.5.6",
     "ws": "^8.0.0",
     "@anticrm/platform": "~0.6.5",
-    "@anticrm/core": "~0.6.11"
+    "@anticrm/core": "~0.6.11",
+    "@anticrm/server-core": "~0.6.1"
   }
 }
diff --git a/server/ws/src/__tests__/remote.test.ts b/server/ws/src/__tests__/remote.test.ts
index 2d9ee5c670..cf6b565d8a 100644
--- a/server/ws/src/__tests__/remote.test.ts
+++ b/server/ws/src/__tests__/remote.test.ts
@@ -15,13 +15,13 @@
 //
 
 import { readResponse, serialize } from '@anticrm/platform'
-import { _Token } from '../server'
+import type { Token } from '@anticrm/server-core'
 import { encode } from 'jwt-simple'
 import WebSocket from 'ws'
 
 describe('server', () => {
   function connect (): WebSocket {
-    const payload: _Token = {
+    const payload: Token = {
       workspace: 'ws1'
     }
     const token = encode(payload, 'secret')
diff --git a/server/ws/src/__tests__/server.test.ts b/server/ws/src/__tests__/server.test.ts
index b228b6268e..56e325e48c 100644
--- a/server/ws/src/__tests__/server.test.ts
+++ b/server/ws/src/__tests__/server.test.ts
@@ -15,7 +15,8 @@
 //
 
 import { readResponse, serialize } from '@anticrm/platform'
-import { start, _Token, disableLogging } from '../server'
+import { start, disableLogging } from '../server'
+import type { Token } from '@anticrm/server-core'
 import { encode } from 'jwt-simple'
 import WebSocket from 'ws'
 
@@ -34,7 +35,7 @@ describe('server', () => {
   }), 3333)
 
   function connect (): WebSocket {
-    const payload: _Token = {
+    const payload: Token = {
       workspace: 'latest'
     }
     const token = encode(payload, 'secret')
diff --git a/server/ws/src/server.ts b/server/ws/src/server.ts
index 8585fef2d4..1d530c4f76 100644
--- a/server/ws/src/server.ts
+++ b/server/ws/src/server.ts
@@ -15,6 +15,7 @@
 //
 
 import { readRequest, serialize, Response } from '@anticrm/platform'
+import type { Token } from '@anticrm/server-core'
 import { createServer, IncomingMessage } from 'http'
 import WebSocket, { Server } from 'ws'
 import { decode } from 'jwt-simple'
@@ -25,17 +26,10 @@ let LOGGING_ENABLED = true
 
 export function disableLogging (): void { LOGGING_ENABLED = false }
 
-/**
- * @internal
- */
-export interface _Token {
-  workspace: string
-}
-
 class Session implements Storage {
   constructor (
     private readonly manager: SessionManager,
-    private readonly token: _Token,
+    private readonly token: Token,
     private readonly storage: ServerStorage
   ) {}
 
@@ -62,7 +56,7 @@ interface Workspace {
 class SessionManager {
   private readonly workspaces = new Map<string, Workspace>()
 
-  async addSession (ws: WebSocket, token: _Token, storageFactory: (ws: string) => Promise<ServerStorage>): Promise<Session> {
+  async addSession (ws: WebSocket, token: Token, storageFactory: (ws: string) => Promise<ServerStorage>): Promise<Session> {
     const workspace = this.workspaces.get(token.workspace)
     if (workspace === undefined) {
       const storage = await storageFactory(token.workspace)
@@ -80,7 +74,7 @@ class SessionManager {
     }
   }
 
-  close (ws: WebSocket, token: _Token, code: number, reason: string): void {
+  close (ws: WebSocket, token: Token, code: number, reason: string): void {
     if (LOGGING_ENABLED) console.log(`closing websocket, code: ${code}, reason: ${reason}`)
     const workspace = this.workspaces.get(token.workspace)
     if (workspace === undefined) {
@@ -93,7 +87,7 @@ class SessionManager {
     }
   }
 
-  broadcast (from: Session, token: _Token, resp: Response<any>): void {
+  broadcast (from: Session, token: Token, resp: Response<any>): void {
     const workspace = this.workspaces.get(token.workspace)
     if (workspace === undefined) {
       throw new Error('internal: cannot find sessions')
@@ -127,7 +121,7 @@ export function start (storageFactory: (workspace: string) => Promise<ServerStor
 
   const wss = new Server({ noServer: true })
   // eslint-disable-next-line @typescript-eslint/no-misused-promises
-  wss.on('connection', async (ws: WebSocket, request: any, token: _Token) => {
+  wss.on('connection', async (ws: WebSocket, request: any, token: Token) => {
     const buffer: string[] = []
 
     ws.on('message', (msg: string) => { buffer.push(msg) })