diff --git a/Sources/LaunchFeature/LaunchViewModel.swift b/Sources/LaunchFeature/LaunchViewModel.swift
index 5178c2e25847abe17334cf10b4717981bff6cfbd..e35515a2de49c40f4917bf82d09f6517478131a3 100644
--- a/Sources/LaunchFeature/LaunchViewModel.swift
+++ b/Sources/LaunchFeature/LaunchViewModel.swift
@@ -145,10 +145,16 @@ final class LaunchViewModel {
                 try messenger.connect()
             }
 
-            try generateGroupManager(messenger: messenger)
+            try messenger.e2e.get()?.registerListener(
+                senderId: nil,
+                messageType: 2,
+                callback: .init(handle: {
+                    print(">>> \(String(data: $0.payload, encoding: .utf8))")
+                })
+            )
 
+            try generateGroupManager(messenger: messenger)
             try generateTrafficManager(messenger: messenger)
-
             try generateTransferManager(messenger: messenger)
 
             if messenger.isLoggedIn() == false {
@@ -448,8 +454,8 @@ extension LaunchViewModel {
             createdAt: Date()
         ))
 
-        if email == nil, phone == nil {
-            do {
+        do {
+            if email == nil, phone == nil {
                 try performLookup(on: contact) { [weak self] in
                     guard let self = self else { return }
 
@@ -467,11 +473,27 @@ extension LaunchViewModel {
                         try! self.database.saveContact(model)
                     }
                 }
-            } catch {
-                print(">>> Error \(#file):\(#line): \(error.localizedDescription)")
+            } else {
+                try performSearch(on: contact) { [weak self] in
+                    guard let self = self else { return }
+
+                    switch $0 {
+                    case .success(let searchedContact):
+                        if try! self.verifyOwnership(contact, searchedContact) { // How could this ever throw?
+                            model.authStatus = .verified
+                            try! self.database.saveContact(model)
+                        } else {
+                            try! self.database.deleteContact(model)
+                        }
+                    case .failure(let error):
+                        model.authStatus = .verificationFailed
+                        print(">>> Error \(#file):\(#line): \(error.localizedDescription)")
+                        try! self.database.saveContact(model)
+                    }
+                }
             }
-        } else {
-            performSearch(on: contact)
+        } catch {
+            print(">>> Error \(#file):\(#line): \(error.localizedDescription)")
         }
     }
 
@@ -494,7 +516,36 @@ extension LaunchViewModel {
     }
 
     private func handleGroupRequest(from group: XXClient.Group) {
-        // TODO
+        if let _ = try? database.fetchGroups(.init(id: [group.getId()])).first {
+            print(">>> Tried to handle a group request that is already handled")
+            return
+        }
+
+        let leaderId = try! group.getMembership() // This is all users on the group, the 1st is the leader/creator.
+
+        try! database.saveGroup(.init(
+            id: group.getId(),
+            name: String(data: group.getName(), encoding: .utf8)!,
+            leaderId: leaderId,
+            createdAt: Date.fromTimestamp(Int(group.getCreatedMS())),
+            authStatus: .pending,
+            serialized: group.serialize()
+        ))
+
+        if let initialMessage = String(data: group.getInitMessage(), encoding: .utf8) {
+            try! database.saveMessage(.init(
+                senderId: leaderId,
+                recipientId: nil,
+                groupId: group.getId(),
+                date: Date.fromTimestamp(Int(group.getCreatedMS())),
+                status: .received,
+                isUnread: true,
+                text: initialMessage
+            ))
+        }
+
+        // TODO:
+        // All other members should be added to the database as GroupMembers
     }
 
     private func performLookup(
@@ -515,19 +566,40 @@ extension LaunchViewModel {
                 switch $0 {
                 case .success(let otherContact):
                     print(">>> Lookup succeeded")
-
                     completion(.success(otherContact))
                 case .failure(let error):
                     print(">>> Lookup failed: \(error.localizedDescription)")
-
                     completion(.failure(error))
                 }
             })
         )
     }
 
-    private func performSearch(on contact: XXClient.Contact) {
-        fatalError(">>> UD Search is not implemented yet")
+    private func performSearch(
+        on contact: XXClient.Contact,
+        completion: @escaping (Result<XXClient.Contact, Error>) -> Void
+    ) throws {
+        guard let messenger = try? DependencyInjection.Container.shared.resolve() as Messenger else {
+            fatalError(">>> Tried to search, but there's no messenger instance on DI container")
+        }
+
+        print(">>> Performing Search")
+
+        let _ = try SearchUD.live(
+            e2eId: messenger.e2e.get()!.getId(),
+            udContact: try messenger.ud.get()!.getContact(),
+            facts: contact.getFacts(),
+            callback: .init(handle: {
+                switch $0 {
+                case .success(let otherContact):
+                    print(">>> Search succeeded")
+                    completion(.success(otherContact.first!))
+                case .failure(let error):
+                    print(">>> Search failed: \(error.localizedDescription)")
+                    completion(.failure(error))
+                }
+            })
+        )
     }
 
     private func verifyOwnership(
diff --git a/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift b/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift
index ea8dd26ddfda1dc94f22991a81817d50d71d4bc6..96586dea576f39d472cc2ac41020fcdc3a4f79ee 100644
--- a/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift
+++ b/Sources/SettingsFeature/ViewModels/AccountDeleteViewModel.swift
@@ -1,9 +1,17 @@
 import HUD
 import Combine
+import Defaults
 import Foundation
+import XXClient
+import XXMessengerClient
 import DependencyInjection
+import Models
 
 final class AccountDeleteViewModel {
+    @Dependency var messenger: Messenger
+
+    @KeyObject(.username, defaultValue: nil) var username: String?
+
     var deleting = false
 
     var hud: AnyPublisher<HUDStatus, Never> { hudRelay.eraseToAnyPublisher() }
@@ -18,6 +26,10 @@ final class AccountDeleteViewModel {
         }
 
         do {
+            let fact = Fact(fact: username!, type: FactType.username.rawValue)
+            try messenger.ud.get()!.permanentDeleteAccount(username: fact)
+            try messenger.destroy()
+
             DispatchQueue.main.async { [weak self] in
                 self?.hudRelay.send(.error(.init(
                     content: "Now kill the app and re-open",
@@ -26,7 +38,6 @@ final class AccountDeleteViewModel {
                 )))
             }
         } catch {
-
             DispatchQueue.main.async { [weak self] in
                 self?.hudRelay.send(.error(.init(with: error)))
             }
diff --git a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 4fd5a9556ed7b6cf460a8a9d1ae2e32487e19399..def30f909786b1a3dee029082a11de178bf0e989 100644
--- a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -105,7 +105,7 @@
       "location" : "https://git.xx.network/elixxir/elixxir-dapps-sdk-swift",
       "state" : {
         "branch" : "development",
-        "revision" : "32ac1c46d6015069efa20dfe772f20adee6e3ecb"
+        "revision" : "108dd0bfc00775b051f848cdc8b3921c26be47e7"
       }
     },
     {