diff --git a/packages/core/src/__tests__/client.test.ts b/packages/core/src/__tests__/client.test.ts
index 799659e2b0..1f6f822b4c 100644
--- a/packages/core/src/__tests__/client.test.ts
+++ b/packages/core/src/__tests__/client.test.ts
@@ -17,13 +17,13 @@
 import { Space } from '../classes'
 import { createClient } from '../client'
 import core from '../component'
-import { withOperations } from '../tx'
+import { TxOperations } from '../tx'
 import { connect } from './connection'
 
 describe('client', () => {
   it('client', async () => {
     const klass = core.class.Space
-    const client = withOperations(core.account.System, await createClient(connect))
+    const client = new TxOperations(await createClient(connect), core.account.System)
     const result = await client.findAll(klass, {})
     expect(result).toHaveLength(2)
 
diff --git a/packages/core/src/__tests__/memdb.test.ts b/packages/core/src/__tests__/memdb.test.ts
index dc2e72ac89..8f508eacfe 100644
--- a/packages/core/src/__tests__/memdb.test.ts
+++ b/packages/core/src/__tests__/memdb.test.ts
@@ -18,7 +18,7 @@ import core from '../component'
 import { Hierarchy } from '../hierarchy'
 import { ModelDb, TxDb } from '../memdb'
 import { SortingOrder } from '../storage'
-import { withOperations } from '../tx'
+import { TxOperations } from '../tx'
 import { genMinModel } from './minmodel'
 
 const txes = genMinModel()
@@ -52,7 +52,7 @@ describe('memdb', () => {
     const result = await model.findAll(core.class.Space, {})
     expect(result.length).toBe(2)
 
-    const ops = withOperations(core.account.System, model)
+    const ops = new TxOperations(model, core.account.System)
     await ops.removeDoc(result[0]._class, result[0].space, result[0]._id)
     const result2 = await model.findAll(core.class.Space, {})
     expect(result2).toHaveLength(1)
@@ -122,7 +122,7 @@ describe('memdb', () => {
   it('should push to array', async () => {
     const hierarchy = new Hierarchy()
     for (const tx of txes) await hierarchy.tx(tx)
-    const model = withOperations(core.account.System, new ModelDb(hierarchy))
+    const model = new TxOperations(new ModelDb(hierarchy), core.account.System)
     for (const tx of txes) await model.tx(tx)
     const space = await model.createDoc(core.class.Space, core.space.Model, {
       name: 'name',
@@ -131,15 +131,15 @@ describe('memdb', () => {
       members: []
     })
     const account = await model.createDoc(core.class.Account, core.space.Model, {})
-    await model.updateDoc(core.class.Space, core.space.Model, space._id, { $push: { members: account._id } })
-    const txSpace = await model.findAll(core.class.Space, { _id: space._id })
-    expect(txSpace[0].members).toEqual(expect.arrayContaining([account._id]))
+    await model.updateDoc(core.class.Space, core.space.Model, space, { $push: { members: account } })
+    const txSpace = await model.findAll(core.class.Space, { _id: space })
+    expect(txSpace[0].members).toEqual(expect.arrayContaining([account]))
   })
 
   it('limit and sorting', async () => {
     const hierarchy = new Hierarchy()
     for (const tx of txes) hierarchy.tx(tx)
-    const model = withOperations(core.account.System, new ModelDb(hierarchy))
+    const model = new TxOperations(new ModelDb(hierarchy), core.account.System)
     for (const tx of txes) await model.tx(tx)
 
     const without = await model.findAll(core.class.Space, {})
diff --git a/packages/core/src/tx.ts b/packages/core/src/tx.ts
index d10a59a5a8..a6c71ccd12 100644
--- a/packages/core/src/tx.ts
+++ b/packages/core/src/tx.ts
@@ -15,14 +15,10 @@
 
 import type { KeysByType } from 'simplytyped'
 import type { Class, Data, Doc, Domain, Ref, Account, Space, Arr, Mixin } from './classes'
+import { DocumentQuery, FindOptions, FindResult, Storage } from './storage'
 import core from './component'
 import { generateId } from './utils'
 
-//  export interface TxFactory {
-//   createTxCreateDoc: <T extends Doc>(_class: Ref<Class<T>>, space: Ref<Space>, attributes: Data<T>) => TxCreateDoc<T>
-//   createTxMixin: <D extends Doc, M extends D>(objectId: Ref<D>, objectClass: Ref<Class<D>>, mixin: Ref<Mixin<M>>, attributes: ExtendedAttributes<D, M>) => TxMixin<D, M>
-// }
-
 /**
  * @public
  */
@@ -139,82 +135,49 @@ export class TxProcessor implements WithTx {
 /**
  * @public
  */
-export interface TxOperations {
-  createDoc: <T extends Doc>(_class: Ref<Class<T>>, space: Ref<Space>, attributes: Data<T>) => Promise<T>
-  updateDoc: <T extends Doc>(
-    _class: Ref<Class<T>>,
-    space: Ref<Space>,
-    objectId: Ref<T>,
-    operations: DocumentUpdate<T>
-  ) => Promise<void>
-  removeDoc: <T extends Doc>(_class: Ref<Class<T>>, space: Ref<Space>, objectId: Ref<T>) => Promise<void>
-}
+export class TxOperations implements Storage {
+  private readonly txFactory: TxFactory
 
-/**
- * @public
- */
-export function withOperations<T extends WithTx> (user: Ref<Account>, storage: T): T & TxOperations {
-  const result = storage as T & TxOperations
+  constructor (private readonly storage: Storage, user: Ref<Account>) {
+    this.txFactory = new TxFactory(user)
+  }
 
-  result.createDoc = async <T extends Doc>(
+  findAll <T extends Doc>(_class: Ref<Class<T>>, query: DocumentQuery<T>, options?: FindOptions<T> | undefined): Promise<FindResult<T>> {
+    return this.storage.findAll(_class, query, options)
+  }
+
+  tx (tx: Tx<Doc>): Promise<void> {
+    return this.storage.tx(tx)
+  }
+
+  async createDoc<T extends Doc> (
     _class: Ref<Class<T>>,
     space: Ref<Space>,
     attributes: Data<T>
-  ): Promise<T> => {
-    const tx: TxCreateDoc<T> = {
-      _id: generateId(),
-      _class: core.class.TxCreateDoc,
-      space: core.space.Tx,
-      modifiedBy: user,
-      modifiedOn: Date.now(),
-      objectId: generateId(),
-      objectClass: _class,
-      objectSpace: space,
-      attributes
-    }
-    await storage.tx(tx)
-    return TxProcessor.createDoc2Doc(tx)
+  ): Promise<Ref<T>> {
+    const tx = this.txFactory.createTxCreateDoc(_class, space, attributes)
+    await this.storage.tx(tx)
+    return tx.objectId
   }
 
-  result.updateDoc = async <T extends Doc>(
+  updateDoc <T extends Doc>(
     _class: Ref<Class<T>>,
     space: Ref<Space>,
     objectId: Ref<T>,
     operations: DocumentUpdate<T>
-  ): Promise<void> => {
-    const tx: TxUpdateDoc<T> = {
-      _id: generateId(),
-      _class: core.class.TxUpdateDoc,
-      space: core.space.Tx,
-      modifiedBy: user,
-      modifiedOn: Date.now(),
-      objectId,
-      objectClass: _class,
-      objectSpace: space,
-      operations
-    }
-    await storage.tx(tx)
+  ): Promise<void> {
+    const tx = this.txFactory.createTxUpdateDoc(_class, space, objectId, operations)
+    return this.storage.tx(tx)
   }
 
-  result.removeDoc = async <T extends Doc>(
+  removeDoc<T extends Doc> (
     _class: Ref<Class<T>>,
     space: Ref<Space>,
     objectId: Ref<T>
-  ): Promise<void> => {
-    const tx: TxRemoveDoc<T> = {
-      _id: generateId(),
-      _class: core.class.TxRemoveDoc,
-      space: core.space.Tx,
-      modifiedBy: user,
-      modifiedOn: Date.now(),
-      objectId,
-      objectClass: _class,
-      objectSpace: space
-    }
-    await storage.tx(tx)
+  ): Promise<void> {
+    const tx = this.txFactory.createTxRemoveDoc(_class, space, objectId)
+    return this.storage.tx(tx)
   }
-
-  return result
 }
 
 /**
@@ -237,6 +200,42 @@ export class TxFactory {
     }
   }
 
+  createTxUpdateDoc <T extends Doc>(
+    _class: Ref<Class<T>>,
+    space: Ref<Space>,
+    objectId: Ref<T>,
+    operations: DocumentUpdate<T>
+  ): TxUpdateDoc<T> {
+    return {
+      _id: generateId(),
+      _class: core.class.TxUpdateDoc,
+      space: core.space.Tx,
+      modifiedBy: this.account,
+      modifiedOn: Date.now(),
+      objectId,
+      objectClass: _class,
+      objectSpace: space,
+      operations
+    }
+  }
+
+  createTxRemoveDoc<T extends Doc> (
+    _class: Ref<Class<T>>,
+    space: Ref<Space>,
+    objectId: Ref<T>
+  ): TxRemoveDoc<T> {
+    return {
+      _id: generateId(),
+      _class: core.class.TxRemoveDoc,
+      space: core.space.Tx,
+      modifiedBy: this.account,
+      modifiedOn: Date.now(),
+      objectId,
+      objectClass: _class,
+      objectSpace: space
+    }
+  }
+
   createTxMixin<D extends Doc, M extends D>(objectId: Ref<D>, objectClass: Ref<Class<D>>, mixin: Ref<Mixin<M>>, attributes: ExtendedAttributes<D, M>): TxMixin<D, M> {
     return {
       _id: generateId(),
diff --git a/packages/platform-rig/profiles/default/config/eslint.config.json b/packages/platform-rig/profiles/default/config/eslint.config.json
index c93dcfcbb0..71fa2b5ee5 100644
--- a/packages/platform-rig/profiles/default/config/eslint.config.json
+++ b/packages/platform-rig/profiles/default/config/eslint.config.json
@@ -3,6 +3,7 @@
         "standard-with-typescript"
     ],
     "rules": {
-        "@typescript-eslint/array-type": "off"
+        "@typescript-eslint/array-type": "off",
+        "@typescript-eslint/promise-function-async": "off"
     }    
 }