diff --git a/Package.swift b/Package.swift
index 39491b404d64670299dd35279db2d3264e4297e3..bf419b1d337afe4e8dc8bd9459758d0a1a658a23 100644
--- a/Package.swift
+++ b/Package.swift
@@ -53,7 +53,7 @@ let package = Package(
     dependencies: [
         .package(
             url: "https://git.xx.network/elixxir/client-ios-db.git",
-            revision: "e1b3b1a8d1df6d259c99289e8d09e73fbfa9fe63"
+            revision: "2e51a960216340cf12a4c6cbc7ac18a9f07d5ee6"
         ),
         .package(url: "https://github.com/Quick/Quick", from: "3.0.0"),
         .package(url: "https://github.com/Quick/Nimble", from: "9.0.0"),
diff --git a/Sources/Integration/Interfaces/BindingsInterface.swift b/Sources/Integration/Interfaces/BindingsInterface.swift
index 34e0e4207c6e1f7625cec55ddf44d7946fa18e7a..f56ebccb463d6dd908e1d979fc5b29059bef4f84 100644
--- a/Sources/Integration/Interfaces/BindingsInterface.swift
+++ b/Sources/Integration/Interfaces/BindingsInterface.swift
@@ -1,6 +1,7 @@
 import Models
-import Foundation
 import Combine
+import XXModels
+import Foundation
 
 public enum MessageDeliveryStatus {
     case sent
diff --git a/Sources/Integration/Interfaces/UserDiscoveryInterface.swift b/Sources/Integration/Interfaces/UserDiscoveryInterface.swift
index 07398985fd1a25e500bb9015832d18e07226b57b..ded311ecdf19e7b179b2f91d325588f57a33ff2d 100644
--- a/Sources/Integration/Interfaces/UserDiscoveryInterface.swift
+++ b/Sources/Integration/Interfaces/UserDiscoveryInterface.swift
@@ -1,4 +1,5 @@
 import Models
+import XXModels
 import Foundation
 
 public struct LookupResult {
diff --git a/Sources/Integration/Mocks/BindingsMock.swift b/Sources/Integration/Mocks/BindingsMock.swift
index 8eaf8a0688d3efdaab0ba1ccedad20bd4b6c7577..901ff8e6aa05b0d3d8d4408aafaef874fba4a0dd 100644
--- a/Sources/Integration/Mocks/BindingsMock.swift
+++ b/Sources/Integration/Mocks/BindingsMock.swift
@@ -1,5 +1,6 @@
 import Models
 import Combine
+import XXModels
 import Foundation
 
 public final class BindingsMock: BindingsInterface {
diff --git a/Sources/Integration/Mocks/UserDiscoveryMock.swift b/Sources/Integration/Mocks/UserDiscoveryMock.swift
index 910faf080c1b476af9c63677a25a6211f8f8a448..86458744e191bd1d5e65ca1748e8a8943d7b3dbd 100644
--- a/Sources/Integration/Mocks/UserDiscoveryMock.swift
+++ b/Sources/Integration/Mocks/UserDiscoveryMock.swift
@@ -1,4 +1,5 @@
 import Models
+import XXModels
 import Foundation
 
 final class UserDiscoveryMock: UserDiscoveryInterface {
diff --git a/Sources/Integration/Session/Session+Contacts.swift b/Sources/Integration/Session/Session+Contacts.swift
index c78c8fa3ebdbba5094db6c9c10c52b1506810a82..af09d6096fce1ad59cd9f7b76b53a3a911770219 100644
--- a/Sources/Integration/Session/Session+Contacts.swift
+++ b/Sources/Integration/Session/Session+Contacts.swift
@@ -51,7 +51,7 @@ extension Session {
                 log(string: "Verified \(contact.username)", type: .info)
 
                 do {
-                    try self.dbManager.save(contact)
+                    try self.dbManager.saveContact(contact)
                 } catch {
                     log(string: error.localizedDescription, type: .error)
                 }
@@ -61,7 +61,7 @@ extension Session {
                 contact.status = .verificationFailed
 
                 do {
-                    try self.dbManager.save(contact)
+                    try self.dbManager.saveContact(contact)
                 } catch {
                     log(string: error.localizedDescription, type: .error)
                 }
@@ -210,38 +210,6 @@ extension Session {
         }
     }
 
-    public func update(_ contact: Contact) {
-        do {
-            if var stored = try dbManager.fetch(.withUsername(contact.username)).first as Contact? {
-                stored.email = contact.email
-                stored.photo = contact.photo
-                stored.phone = contact.phone
-                stored.nickname = contact.nickname
-                stored.isRecent = contact.isRecent
-                stored.createdAt = contact.createdAt
-                try dbManager.save(stored)
-
-                try dbManager.updateAll(
-                    GroupMember.self,
-                    GroupMember.Request.withUserId(stored.userId),
-                    with: [GroupMember.Column.photo.set(to: stored.photo)]
-                )
-            }
-        } catch {
-            log(string: "Error updating a contact: \(error.localizedDescription)", type: .error)
-        }
-    }
-
-    public func delete<T: Persistable>(_ model: T, isRequest: Bool = false) {
-        log(string: "Deleting a model...", type: .info)
-
-        do {
-            try dbManager.delete(model)
-        } catch {
-            log(string: "Error deleting a model: \(error.localizedDescription)", type: .error)
-        }
-    }
-
     public func find(by username: String) -> Contact? {
         log(string: "Trying to find contact with username: \(username)", type: .info)
 
diff --git a/Sources/Integration/Session/Session.swift b/Sources/Integration/Session/Session.swift
index bb47d1249eab7b950e47ce6f814eeb77332f557a..6c48b77c8fcb3a1be1fb55290ec1baa846da3a7d 100644
--- a/Sources/Integration/Session/Session.swift
+++ b/Sources/Integration/Session/Session.swift
@@ -4,6 +4,7 @@ import Shared
 import Combine
 import Defaults
 import XXModels
+import XXDatabase
 import Foundation
 import BackupFeature
 import NetworkMonitor
@@ -88,7 +89,7 @@ public final class Session: SessionType {
         os_signpost(.end, log: logHandler, name: "Decrypting", "Finished newClientFromBackup")
 
         self.client = client
-        dbManager = GRDBDatabaseManager()
+        dbManager = try Database.inMemory()
 
         let report = try! JSONDecoder().decode(BackupReport.self, from: backupData!)
 
@@ -110,13 +111,11 @@ public final class Session: SessionType {
     public init(ndf: String) throws {
         let network = try! DependencyInjection.Container.shared.resolve() as XXNetworking
         self.client = try network.newClient(ndf: ndf)
-        dbManager = GRDBDatabaseManager()
+        dbManager = try Database.inMemory()
         try continueInitialization()
     }
 
     private func continueInitialization() throws {
-        try dbManager.setup()
-
         setupBindings()
         networkMonitor.start()
 
@@ -127,13 +126,8 @@ public final class Session: SessionType {
 
         registerUnfinishedTransfers()
 
-        if let pendingVerificationUsers: [Contact] = try? dbManager.fetch(.verificationInProgress) {
-            pendingVerificationUsers.forEach {
-                var contact = $0
-                contact.status = .verificationFailed
-                _ = try? dbManager.save(contact)
-            }
-        }
+        let query = Contact.Query(authStatus: [.verificationInProgress])
+        _ = try? dbManager.bulkUpdateContacts(query, .init(authStatus: .verificationFailed))
     }
 
     public func setDummyTraffic(status: Bool) {
@@ -155,7 +149,7 @@ public final class Session: SessionType {
             guard self.hasRunningTasks == false else { throw NSError.create("") }
         }.finalCatch { _ in fatalError("Couldn't delete account because network is not stopping") }
 
-        dbManager.drop()
+        try? dbManager.drop()
         FileManager.xxCleanup()
 
         email = nil
@@ -175,69 +169,39 @@ public final class Session: SessionType {
         inappnotifications = true
     }
 
-    public func hideRequestOf(group: Group) {
-        var group = group
-        group.status = .hidden
-        _ = try? dbManager.save(group)
-    }
-
-    public func hideRequestOf(contact: Contact) {
-        var contact = contact
-        contact.status = .hidden
-        _ = try? dbManager.save(contact)
-    }
-
-    public func forceFailMessages() {
-        if let pendingE2E: [Message] = try? dbManager.fetch(.sending) {
-            pendingE2E.forEach {
-                var message = $0
-                message.status = .failedToSend
-                _ = try? dbManager.save(message)
-            }
-        }
-
-        if let pendingGroupMessages: [GroupMessage] = try? dbManager.fetch(.sending) {
-            pendingGroupMessages.forEach {
-                var message = $0
-                message.status = .failed
-                _ = try? dbManager.save(message)
-            }
-        }
-    }
-
     private func registerUnfinishedTransfers() {
-        guard let unfinisheds: [Message] = try? dbManager.fetch(.sendingAttachment), !unfinisheds.isEmpty else { return }
-
-        for var message in unfinisheds {
-            guard let tid = message.payload.attachment?.transferId else { return }
-
-            do {
-                try client.transferManager?.listenUploadFromTransfer(with: tid) { completed, sent, arrived, total, error in
-                    if completed {
-                        message.status = .sent
-                        message.payload.attachment?.progress = 1.0
-
-                        if let transfer: FileTransfer = try? self.dbManager.fetch(.withTID(tid)).first {
-                            try? self.dbManager.delete(transfer)
-                        }
-                    } else {
-                        if let error = error {
-                            log(string: error.localizedDescription, type: .error)
-                            message.status = .failedToSend
-                        } else {
-                            let progress = Float(arrived)/Float(total)
-                            message.payload.attachment?.progress = progress
-                            return
-                        }
-                    }
-
-                    _ = try? self.dbManager.save(message)
-                }
-            } catch {
-                message.status = .sent
-                _ = try? self.dbManager.save(message)
-            }
-        }
+//        guard let unfinisheds: [Message] = try? dbManager.fetch(.sendingAttachment), !unfinisheds.isEmpty else { return }
+//
+//        for var message in unfinisheds {
+//            guard let tid = message.payload.attachment?.transferId else { return }
+//
+//            do {
+//                try client.transferManager?.listenUploadFromTransfer(with: tid) { completed, sent, arrived, total, error in
+//                    if completed {
+//                        message.status = .sent
+//                        message.payload.attachment?.progress = 1.0
+//
+//                        if let transfer: FileTransfer = try? self.dbManager.fetch(.withTID(tid)).first {
+//                            try? self.dbManager.delete(transfer)
+//                        }
+//                    } else {
+//                        if let error = error {
+//                            log(string: error.localizedDescription, type: .error)
+//                            message.status = .failedToSend
+//                        } else {
+//                            let progress = Float(arrived)/Float(total)
+//                            message.payload.attachment?.progress = progress
+//                            return
+//                        }
+//                    }
+//
+//                    _ = try? self.dbManager.save(message)
+//                }
+//            } catch {
+//                message.status = .sent
+//                _ = try? self.dbManager.save(message)
+//            }
+//        }
     }
 
     func updateFactsOnBackup() {
@@ -277,7 +241,7 @@ public final class Session: SessionType {
             }.store(in: &cancellables)
 
         client.requestsSent
-            .sink { [unowned self] in _ = try? dbManager.save($0) }
+            .sink { [unowned self] in _ = try? dbManager.saveContact($0) }
             .store(in: &cancellables)
 
         client.backup
@@ -292,7 +256,7 @@ public final class Session: SessionType {
                 ///
                 var contact = $0
                 contact.status = .friend
-                _ = try? dbManager.save(contact)
+                _ = try? dbManager.saveContact(contact)
             }.store(in: &cancellables)
 
         backupService.settingsPublisher
@@ -321,7 +285,7 @@ public final class Session: SessionType {
             .store(in: &cancellables)
 
         client.groupMessages
-            .sink { [unowned self] in _ = try? dbManager.save($0) }
+            .sink { [unowned self] in _ = try? dbManager.saveMessage($0) }
             .store(in: &cancellables)
 
         client.messages
@@ -357,7 +321,7 @@ public final class Session: SessionType {
                     contact.status = .friend
                     contact.isRecent = true
                     contact.createdAt = Date()
-                    _ = try? dbManager.save(contact)
+                    _ = try? dbManager.saveContact(contact)
 
                     toastController.enqueueToast(model: .init(
                         title: contact.nickname ?? contact.username,
@@ -367,24 +331,4 @@ public final class Session: SessionType {
                 }
             }.store(in: &cancellables)
     }
-
-    public func getTextFromMessage(messageId: Data) -> String? {
-        guard let message: Message = try? dbManager.fetch(.withUniqueId(messageId)).first else { return nil }
-        return message.payload.text
-    }
-
-    public func getTextFromGroupMessage(messageId: Data) -> String? {
-        guard let message: GroupMessage = try? dbManager.fetch(.withUniqueId(messageId)).first else { return nil }
-        return message.payload.text
-    }
-
-    public func getContactWith(userId: Data) -> Contact? {
-        let contact: Contact? = try? dbManager.fetch(.withUserId(userId)).first
-        return contact
-    }
-
-    public func getGroupChatInfoWith(groupId: Data) -> GroupChatInfo? {
-        let info: GroupChatInfo? = try? dbManager.fetch(.fromGroup(groupId)).first
-        return info
-    }
 }
diff --git a/Sources/Integration/Session/SessionType.swift b/Sources/Integration/Session/SessionType.swift
index e32ecf0ad1e8a8a7b159550670909c517e8d012b..0c5d67824121e6282376872a3fd17b096bd23cda 100644
--- a/Sources/Integration/Session/SessionType.swift
+++ b/Sources/Integration/Session/SessionType.swift
@@ -12,12 +12,6 @@ public protocol SessionType {
     func deleteMyself() throws
     func getId(from: Data) -> Data?
 
-    func forceFailMessages()
-
-    func hideRequestOf(group: Group)
-
-    func hideRequestOf(contact: Contact)
-
     func send(imageData: Data, to: Contact, completion: @escaping (Result<Void, Error>) -> Void)
 
     func verify(contact: Contact)
@@ -54,17 +48,11 @@ public protocol SessionType {
     func delete(groupMessages: [Int64])
     func send(_: Payload, toContact: Contact)
 
-    func getTextFromMessage(messageId: Data) -> String?
-    func getTextFromGroupMessage(messageId: Data) -> String?
-
     // Contacts
 
-    func update(_: Contact)
     func add(_: Contact) throws
     func confirm(_: Contact) throws
     func find(by: String) -> Contact?
-    func delete<T: Persistable>(_: T, isRequest: Bool)
-
     func deleteContact(_: Contact) throws
 
     func retryRequest(_: Contact) throws
@@ -82,7 +70,4 @@ public protocol SessionType {
         members: [Contact],
         _ completion: @escaping (Result<(Group, [GroupMember]), Error>) -> Void
     )
-
-    func getContactWith(userId: Data) -> Contact?
-    func getGroupChatInfoWith(groupId: Data) -> GroupChatInfo?
 }
diff --git a/Sources/Models/Contact.swift b/Sources/Models/Contact.swift
index 1959743eb66d6888db0d7c65e07f5cfd0e11826a..c0ca99ed09353cfc8afc8d9e4fa0ee0c0b62a088 100644
--- a/Sources/Models/Contact.swift
+++ b/Sources/Models/Contact.swift
@@ -41,83 +41,83 @@ public class IndexedListCollator<Item: IndexableItem> {
         return (sections: sections.filter { !$0.isEmpty }, collation: collation)
     }
 }
-
-public struct Contact: Codable, Hashable, Equatable {
-    public enum Request {
-        case all
-        case failed
-        case friends
-        case received
-        case requested
-        case isRecent
-        case verificationInProgress
-        case withUserId(Data)
-        case withUserIds([Data])
-        case withUsername(String)
-    }
-
-    public enum Status: Int64, Codable {
-        case friend
-        case stranger
-        case verified
-        case verificationFailed
-        case verificationInProgress
-        case requested
-        case requesting
-        case requestFailed
-        case confirming
-        case confirmationFailed
-        case hidden
-    }
-
-    public var id: Int64?
-    public var photo: Data?
-    public let userId: Data
-    public var email: String?
-    public var phone: String?
-    public var status: Status
-    public var marshaled: Data
-    public var createdAt: Date
-    public let username: String
-    public var nickname: String?
-    public var isRecent: Bool
-
-    public init(
-        photo: Data?,
-        userId: Data,
-        email: String?,
-        phone: String?,
-        status: Status,
-        marshaled: Data,
-        username: String,
-        nickname: String?,
-        createdAt: Date,
-        isRecent: Bool
-    ) {
-        self.email = email
-        self.phone = phone
-        self.photo = photo
-        self.status = status
-        self.userId = userId
-        self.username = username
-        self.nickname = nickname
-        self.marshaled = marshaled
-        self.createdAt = createdAt
-        self.isRecent = isRecent
-    }
-
-    public var differenceIdentifier: Data { userId }
-
-    public static var databaseTableName: String { "contacts" }
-}
-
-extension Contact: Differentiable {}
-extension Contact: IndexableItem {
-    public var indexedOn: NSString {
-        guard let nickname = nickname else {
-            return "\(username.first!)" as NSString
-        }
-
-        return "\(nickname.first!)" as NSString
-    }
-}
+//
+//public struct Contact: Codable, Hashable, Equatable {
+//    public enum Request {
+//        case all
+//        case failed
+//        case friends
+//        case received
+//        case requested
+//        case isRecent
+//        case verificationInProgress
+//        case withUserId(Data)
+//        case withUserIds([Data])
+//        case withUsername(String)
+//    }
+//
+//    public enum Status: Int64, Codable {
+//        case friend
+//        case stranger
+//        case verified
+//        case verificationFailed
+//        case verificationInProgress
+//        case requested
+//        case requesting
+//        case requestFailed
+//        case confirming
+//        case confirmationFailed
+//        case hidden
+//    }
+//
+//    public var id: Int64?
+//    public var photo: Data?
+//    public let userId: Data
+//    public var email: String?
+//    public var phone: String?
+//    public var status: Status
+//    public var marshaled: Data
+//    public var createdAt: Date
+//    public let username: String
+//    public var nickname: String?
+//    public var isRecent: Bool
+//
+//    public init(
+//        photo: Data?,
+//        userId: Data,
+//        email: String?,
+//        phone: String?,
+//        status: Status,
+//        marshaled: Data,
+//        username: String,
+//        nickname: String?,
+//        createdAt: Date,
+//        isRecent: Bool
+//    ) {
+//        self.email = email
+//        self.phone = phone
+//        self.photo = photo
+//        self.status = status
+//        self.userId = userId
+//        self.username = username
+//        self.nickname = nickname
+//        self.marshaled = marshaled
+//        self.createdAt = createdAt
+//        self.isRecent = isRecent
+//    }
+//
+//    public var differenceIdentifier: Data { userId }
+//
+//    public static var databaseTableName: String { "contacts" }
+//}
+//
+//extension Contact: Differentiable {}
+//extension Contact: IndexableItem {
+//    public var indexedOn: NSString {
+//        guard let nickname = nickname else {
+//            return "\(username.first!)" as NSString
+//        }
+//
+//        return "\(nickname.first!)" as NSString
+//    }
+//}
diff --git a/Sources/Models/Group.swift b/Sources/Models/Group.swift
index feda834cb266a933e2470e3d6ab5910b22d4588b..20634688bc4312cfae2f1daaf708889f799803ce 100644
--- a/Sources/Models/Group.swift
+++ b/Sources/Models/Group.swift
@@ -1,42 +1,42 @@
-import Foundation
-import KeychainAccess
-
-public struct Group: Codable, Equatable, Hashable {
-    public enum Status: Int64, Codable {
-        case hidden
-        case pending
-        case deleting
-        case participating
-    }
-
-    public enum Request {
-        case pending
-        case accepted
-        case withGroupId(Data)
-    }
-
-    public var id: Int64?
-    public var name: String
-    public var leader: Data
-    public var groupId: Data
-    public var status: Status
-    public var serialize: Data
-    public var createdAt: Date
-    public static var databaseTableName: String { "groups" }
-
-    public init(
-        leader: Data,
-        name: String,
-        groupId: Data,
-        status: Status,
-        createdAt: Date,
-        serialize: Data
-    ) {
-        self.name = name
-        self.leader = leader
-        self.status = status
-        self.groupId = groupId
-        self.createdAt = createdAt
-        self.serialize = serialize
-    }
-}
+//import Foundation
+//import KeychainAccess
+//
+//public struct Group: Codable, Equatable, Hashable {
+//    public enum Status: Int64, Codable {
+//        case hidden
+//        case pending
+//        case deleting
+//        case participating
+//    }
+//
+//    public enum Request {
+//        case pending
+//        case accepted
+//        case withGroupId(Data)
+//    }
+//
+//    public var id: Int64?
+//    public var name: String
+//    public var leader: Data
+//    public var groupId: Data
+//    public var status: Status
+//    public var serialize: Data
+//    public var createdAt: Date
+//    public static var databaseTableName: String { "groups" }
+//
+//    public init(
+//        leader: Data,
+//        name: String,
+//        groupId: Data,
+//        status: Status,
+//        createdAt: Date,
+//        serialize: Data
+//    ) {
+//        self.name = name
+//        self.leader = leader
+//        self.status = status
+//        self.groupId = groupId
+//        self.createdAt = createdAt
+//        self.serialize = serialize
+//    }
+//}
diff --git a/Sources/Models/SingleChatInfo.swift b/Sources/Models/SingleChatInfo.swift
index 21c7f7d28bb4fb98b32c4239101cc8308b4be6ae..79fc4ba0766c688464b17b1a9f71924ef0423c70 100644
--- a/Sources/Models/SingleChatInfo.swift
+++ b/Sources/Models/SingleChatInfo.swift
@@ -1,18 +1,18 @@
-import Foundation
-
-public struct SingleChatInfo: Codable, Equatable, Hashable {
-    public enum Request {
-        case all
-    }
-
-    public var contact: Contact
-    public var lastMessage: Message?
-
-    public init(
-        contact: Contact,
-        lastMessage: Message?
-    ) {
-        self.contact = contact
-        self.lastMessage = lastMessage
-    }
-}
+//import Foundation
+//
+//public struct SingleChatInfo: Codable, Equatable, Hashable {
+//    public enum Request {
+//        case all
+//    }
+//
+//    public var contact: Contact
+//    public var lastMessage: Message?
+//
+//    public init(
+//        contact: Contact,
+//        lastMessage: Message?
+//    ) {
+//        self.contact = contact
+//        self.lastMessage = lastMessage
+//    }
+//}
diff --git a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved
index e65586a6cb720b7524ee3e8f605a9dc87aed2a62..435cb2c1f5f93033e366ee014b39cb6643fdf95b 100644
--- a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -50,7 +50,7 @@
       "kind" : "remoteSourceControl",
       "location" : "https://git.xx.network/elixxir/client-ios-db.git",
       "state" : {
-        "revision" : "e1b3b1a8d1df6d259c99289e8d09e73fbfa9fe63"
+        "revision" : "2e51a960216340cf12a4c6cbc7ac18a9f07d5ee6"
       }
     },
     {