diff --git a/libs/c-crdtlib.jar b/libs/c-crdtlib-jvm.jar
similarity index 100%
rename from libs/c-crdtlib.jar
rename to libs/c-crdtlib-jvm.jar
diff --git a/libs/c-crdtlib-metadata.jar b/libs/c-crdtlib-metadata.jar
new file mode 100644
index 0000000000000000000000000000000000000000..10814ec686c51f93da06bfd5d070da59f0be75d2
Binary files /dev/null and b/libs/c-crdtlib-metadata.jar differ
diff --git a/libs/c-crdtlib-nodejs.jar b/libs/c-crdtlib-nodejs.jar
new file mode 100644
index 0000000000000000000000000000000000000000..c0171c7ad27b92ae205cca0eeebd7f045cd0e182
Binary files /dev/null and b/libs/c-crdtlib-nodejs.jar differ
diff --git a/src/commonMain/kotlin/client/CObject.kt b/src/commonMain/kotlin/client/CObject.kt
index 192b94e28f76aef967e894b9dc86f152abb310b8..cf51f21a4b5fdf4b043d9d5782a929c31d8f9199 100644
--- a/src/commonMain/kotlin/client/CObject.kt
+++ b/src/commonMain/kotlin/client/CObject.kt
@@ -21,37 +21,47 @@ package client
 
 import client.utils.ActiveSession
 import client.utils.CObjectUId
+import client.utils.OperationUId
+import crdtlib.crdt.DeltaCRDT
 
-class CObject<T> {
+open class CObject<T> {
 
     /**
     * Concordant object unique id
     */
-    private val id: CObjectUId
+    private val id: CObjectUId<T>
 
     /**
     * Is openned in read only mode
     */
     private val readOnly: Boolean
 
-    constructor(oid: CObjectUId, readOnly: Boolean) {
+    /**
+    * The encapsulated CRDT
+    */
+    protected var crdt: DeltaCRDT<T>? = null
+
+    constructor(oid: CObjectUId<T>, readOnly: Boolean) {
         this.id = oid
         this.readOnly = readOnly
     }
 
-    fun update() {
+    protected fun beforeUpdate(): OperationUId {
         if (this.readOnly) throw RuntimeException("CObject has been opened in read-only mode.")
+        if (ActiveSession == null) RuntimeException("Not active session.")
+        this.crdt = CService.getObject<T>(this.id)
+        return (ActiveSession as Session).environment.tick()
+    }
+
+    protected fun afterUpdate() {
+        CService.pushObject<T>(this.id, this.crdt)
+    }
 
-        // Should be integrated to CRDTs
-        val crdt = CService.getObject<T>(this.id)
-        val ts = ActiveSession.environment.tick()
-        // crdt.update(ts)
-        CService.pushObject<T>(this.id, crdt)
+    protected fun beforeGetter() {
+        this.crdt = CService.getObject<T>(this.id)
     }
 
-    fun getter(): Any {
-        val crdt = CService.getObject<T>(this.id)
-        return 1 // crdt.getter()
+    protected fun afterGetter() {
     }
 
     fun close() {
diff --git a/src/commonMain/kotlin/client/CService.kt b/src/commonMain/kotlin/client/CService.kt
index 12cee746fc1ae8b50ba6da9a70e2b1e66d60f8c5..74da7035a91c82b8b0fe13b3ff8f3171f21ce8e0 100644
--- a/src/commonMain/kotlin/client/CService.kt
+++ b/src/commonMain/kotlin/client/CService.kt
@@ -31,11 +31,11 @@ class CService {
             return true
         }
 
-        fun <T> getObject(oid: CObjectUId): DeltaCRDT<T>? {
+        fun <T> getObject(oid: CObjectUId<T>): DeltaCRDT<T>? {
             return null
         }
 
-        fun <T> pushObject(oid: CObjectUId, crdt: DeltaCRDT<T>) {
+        fun <T> pushObject(oid: CObjectUId<T>, crdt: DeltaCRDT<T>?) {
         }
 
         fun close(cid: ClientUId) {
diff --git a/src/commonMain/kotlin/client/Collection.kt b/src/commonMain/kotlin/client/Collection.kt
index 98a82df5e8fc3e1bda86e50f241a6f401b5647a3..997e331cae7fd2398caa9aacdf352b0ae82e94db 100644
--- a/src/commonMain/kotlin/client/Collection.kt
+++ b/src/commonMain/kotlin/client/Collection.kt
@@ -41,11 +41,11 @@ class Collection {
     }
 
     // c_open_read|write<T>
-    fun <T> open(oid: String, readOnly: Boolean, handler: NotificationHandler): T {
+    fun <T> open(oid: String, readOnly: Boolean, handler: NotificationHandler<T>): T {
         if (this.readOnly && !readOnly) throw RuntimeException("Collection has been opened in read-only mode.")
 
-        val oid = CObjectUId<T>(this.id, oid, T)
-        return CObject<T>(oid, readOnly)
+        val oid = CObjectUId<T>(this.id, oid)
+        return CObject<T>(oid, readOnly) as T
     }
 
     // c_close_collection
diff --git a/src/commonMain/kotlin/client/Session.kt b/src/commonMain/kotlin/client/Session.kt
index 52b549c2480155b203bd041cbcd5f353cae05c9c..46343f14c7e1d08e9839bfe80fbfd5a7ac09a4f8 100644
--- a/src/commonMain/kotlin/client/Session.kt
+++ b/src/commonMain/kotlin/client/Session.kt
@@ -37,7 +37,7 @@ class Session {
     /**
     * The environment linked to the session
     */
-    private val environment: SimpleEnvironment
+    public val environment: SimpleEnvironment
 
     private constructor(cid: ClientUId) {
         this.clientUId = cid
@@ -66,7 +66,7 @@ class Session {
     companion object {
         // c_begin_session
         fun connect(dbName: String, credentials: String): Session {
-            val clientUId = UUID()
+            val clientUId = ClientUId("MY_ID")
             if (!CService.connect(dbName, clientUId)) throw RuntimeException("Connection to server failed.")
             val session = Session(clientUId)
             ActiveSession = session
diff --git a/src/commonMain/kotlin/client/utils/CObjectUId.kt b/src/commonMain/kotlin/client/utils/CObjectUId.kt
index 88d253abf8f93ceaf60446cc0ab19c0b32ce4240..4deadbc592c2d6ee442bcb2d18e36caa4c918576 100644
--- a/src/commonMain/kotlin/client/utils/CObjectUId.kt
+++ b/src/commonMain/kotlin/client/utils/CObjectUId.kt
@@ -22,4 +22,4 @@ package client.utils
 /**
 * Concordant object unique identifiers
 */
-data class CObjectUId(val cid: CollectionUId, val name: String, val type: Type)
+data class CObjectUId<T>(val cid: CollectionUId, val name: String)
diff --git a/src/commonMain/kotlin/client/utils/NotificationHandler.kt b/src/commonMain/kotlin/client/utils/NotificationHandler.kt
index bdd03a8c7851a18814be65455dd64834dd2659a7..152f93e8b78df74c2dfde996e411a697a4c0a2ce 100644
--- a/src/commonMain/kotlin/client/utils/NotificationHandler.kt
+++ b/src/commonMain/kotlin/client/utils/NotificationHandler.kt
@@ -24,4 +24,4 @@ import crdtlib.utils.VersionVector
 /**
 * The notification handler (function) type accepted for c-objects
 */
-typealias NotificationHandler = (VersionVector, CObjectUId) -> Unit
+typealias NotificationHandler<T> = (VersionVector, CObjectUId<T>) -> Unit