diff --git a/xxclient/src/main/java/io/elixxir/xxclient/bindings/Bindings.kt b/xxclient/src/main/java/io/elixxir/xxclient/bindings/Bindings.kt
index f021394b32091e248c0ee6f6a390ab18d113bae2..1f3546e6e428bb12641a6a96477509a1b15e52e0 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/bindings/Bindings.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/bindings/Bindings.kt
@@ -26,7 +26,7 @@ interface Bindings {
     fun downloadAndVerifySignedNdf(
         environmentUrl: String,
         certificate: Certificate,
-    ): Ndf
+    ): Ndf?
 
     fun generateSecret(byteLength: Long): Password
 
@@ -34,7 +34,7 @@ interface Bindings {
         sessionFileDirectory: String,
         sessionPassword: Password,
         cmixParams: CmixParams
-    ): CMix
+    ): CMix?
 
     fun newCmix(
         ndfJson: String,
@@ -114,7 +114,7 @@ interface Bindings {
     fun getReceptionIdentity(
         key: String,
         e2eId: E2eId
-    ): ReceptionIdentity
+    ): ReceptionIdentity?
 
     fun newFileTransferManager(
         e2eId: E2eId,
@@ -125,7 +125,7 @@ interface Bindings {
 
     fun getIdFromContact(contactData: ContactData): ByteArray
     fun getPublicKeyFromContact(contactData: ContactData): ByteArray
-    fun getFactsFromContact(contactData: ContactData): Fact
+    fun getFactsFromContact(contactData: ContactData): List<Fact>
     fun setFactsOnContact(contactData: ContactData, fact: Fact): ContactData
 
     fun searchUd(
@@ -134,7 +134,7 @@ interface Bindings {
         listener: UdSearchResultListener,
         factsListJson: ByteArray,
         singleRequestParamsJson: ByteArray
-    ): SingleUseReport
+    ): SingleUseReport?
 
     fun lookupUd(
         e2eId: E2eId,
@@ -142,7 +142,7 @@ interface Bindings {
         listener: UdLookupResultListener,
         lookupId: UserId,
         singleRequestParamsJson: ByteArray
-    ): SingleUseReport
+    ): SingleUseReport?
 
     fun multiLookupUd(
         e2eId: E2eId,
@@ -167,7 +167,7 @@ interface Bindings {
         payload: Payload,
         paramsJson: ByteArray,
         listener: SingleUseResponseListener
-    ): SingleUseReport
+    ): SingleUseReport?
 
     fun updateCommonErrors(errorsJson: String)
 
diff --git a/xxclient/src/main/java/io/elixxir/xxclient/bindings/BindingsAdapter.kt b/xxclient/src/main/java/io/elixxir/xxclient/bindings/BindingsAdapter.kt
index ad63bf4299ab275a4bc6d76e96bbb3fd6cdff7b5..d3138cb63dbb8fc502567fb1e98e64a112512b97 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/bindings/BindingsAdapter.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/bindings/BindingsAdapter.kt
@@ -1,6 +1,5 @@
 package io.elixxir.xxclient.bindings
 
-import bindings.GroupChatProcessor
 import io.elixxir.xxclient.backup.Backup
 import io.elixxir.xxclient.backup.BackupAdapter
 import io.elixxir.xxclient.callbacks.*
@@ -22,6 +21,7 @@ import io.elixxir.xxclient.groupchat.GroupChat
 import io.elixxir.xxclient.groupchat.GroupChatAdapter
 import io.elixxir.xxclient.models.*
 import io.elixxir.xxclient.models.BindingsModel.Companion.decode
+import io.elixxir.xxclient.models.BindingsModel.Companion.decodeArray
 import io.elixxir.xxclient.models.BindingsModel.Companion.encode
 import io.elixxir.xxclient.models.ReceiveFileCallbackAdapter
 import io.elixxir.xxclient.userdiscovery.UserDiscovery
@@ -48,7 +48,7 @@ open class BindingsAdapter : Bindings {
     override fun downloadAndVerifySignedNdf(
         environmentUrl: String,
         certificate: Certificate
-    ): Ndf {
+    ): Ndf? {
         return CoreBindings.downloadAndVerifySignedNdfWithUrl(environmentUrl, certificate)
     }
 
@@ -233,7 +233,7 @@ open class BindingsAdapter : Bindings {
         )
     }
 
-    override fun getReceptionIdentity(key: String, e2eId: E2eId): ReceptionIdentity {
+    override fun getReceptionIdentity(key: String, e2eId: E2eId): ReceptionIdentity? {
         return decode(
             CoreBindings.loadReceptionIdentity(key, e2eId)
         )
@@ -263,8 +263,8 @@ open class BindingsAdapter : Bindings {
         return CoreBindings.getPubkeyFromContact(contactData)
     }
 
-    override fun getFactsFromContact(contactData: ContactData): Fact {
-        return decode(
+    override fun getFactsFromContact(contactData: ContactData): List<Fact> {
+        return decodeArray(
             CoreBindings.getFactsFromContact(contactData)
         )
     }
@@ -279,7 +279,7 @@ open class BindingsAdapter : Bindings {
         listener: UdSearchResultListener,
         factsListJson: ByteArray,
         singleRequestParamsJson: ByteArray
-    ): SingleUseReport {
+    ): SingleUseReport? {
         val result = CoreBindings.searchUD(
                 e2eId,
                 udContact.encoded(),
@@ -296,7 +296,7 @@ open class BindingsAdapter : Bindings {
         listener: UdLookupResultListener,
         lookupId: UserId,
         singleRequestParamsJson: ByteArray
-    ): SingleUseReport {
+    ): SingleUseReport? {
         val result = CoreBindings.lookupUD(
             e2eId,
             udContact.encoded(),
@@ -348,7 +348,7 @@ open class BindingsAdapter : Bindings {
         payload: Payload,
         paramsJson: ByteArray,
         listener: SingleUseResponseListener
-    ): SingleUseReport {
+    ): SingleUseReport? {
         val result = CoreBindings.transmitSingleUse(
             e2eId,
             recipient.encoded(),
diff --git a/xxclient/src/main/java/io/elixxir/xxclient/callbacks/BroadcastListener.kt b/xxclient/src/main/java/io/elixxir/xxclient/callbacks/BroadcastListener.kt
index 9fdedbd5af1e4279808e2592f9fc2e1cf653aa74..05d55117803cf848f13ebdddf8de9e2bdacff81e 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/callbacks/BroadcastListener.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/callbacks/BroadcastListener.kt
@@ -14,8 +14,8 @@ open class BroadcastListenerAdapter(
 ) : BroadcastListener by listener, BroadcastListenerBindings {
 
     override fun callback(data: ByteArray?, error: Exception?) {
-        listener.onBroadcast(
-            parseModel(data, error)
-        )
+        parseModel<BroadcastMessage>(data, error).let {
+            listener.onBroadcast(it)
+        }
     }
 }
\ No newline at end of file
diff --git a/xxclient/src/main/java/io/elixxir/xxclient/callbacks/MessageListener.kt b/xxclient/src/main/java/io/elixxir/xxclient/callbacks/MessageListener.kt
index 839adc7ed1b86523b86b288bb6e13edadfccce14..f71485b7c894b870f346f9cb119936849b6bafc3 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/callbacks/MessageListener.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/callbacks/MessageListener.kt
@@ -13,10 +13,10 @@ open class MessageListenerAdapter(
     protected val listener: MessageListener
 ) : Listener {
     override fun hear(message: ByteArray?) {
-        message?.let {
-            listener.onMessageReceived(
-                decode(it)
-            )
+        message?.let { data ->
+            decode<Message>(data)?.let {
+                listener.onMessageReceived(it)
+            }
         }
     }
 
diff --git a/xxclient/src/main/java/io/elixxir/xxclient/channel/Channel.kt b/xxclient/src/main/java/io/elixxir/xxclient/channel/Channel.kt
index 5bd52e4b868e585229e8b09054ec54471f602ff8..e1046d1838a0ace88791e274d2df6dc6c5cc8c35 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/channel/Channel.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/channel/Channel.kt
@@ -12,9 +12,9 @@ interface Channel {
     val maxAsymmetricPayloadSize: Long
     val maxPayloadSize: Long
 
-    fun broadcast(payload: Payload): BroadcastReport
-    fun broadcastAsymmetric(payload: Payload, privateKey: ByteArray): BroadcastReport
-    fun get(): ChannelDef
+    fun broadcast(payload: Payload): BroadcastReport?
+    fun broadcastAsymmetric(payload: Payload, privateKey: ByteArray): BroadcastReport?
+    fun get(): ChannelDef?
     fun listen(channel: Long, listener: BroadcastListener)
     fun stop()
 }
@@ -25,19 +25,19 @@ open class ChannelAdapter(protected val channel: BindingsChannel) : Channel {
     override val maxPayloadSize: Long
         get() = channel.maxPayloadSize()
 
-    override fun broadcast(payload: Payload): BroadcastReport {
+    override fun broadcast(payload: Payload): BroadcastReport? {
         return decode(
             channel.broadcast(payload)
         )
     }
 
-    override fun broadcastAsymmetric(payload: Payload, privateKey: ByteArray): BroadcastReport {
+    override fun broadcastAsymmetric(payload: Payload, privateKey: ByteArray): BroadcastReport? {
         return decode(
             channel.broadcastAsymmetric(payload, privateKey)
         )
     }
 
-    override fun get(): ChannelDef {
+    override fun get(): ChannelDef? {
         return decode(
             channel.get()
         )
diff --git a/xxclient/src/main/java/io/elixxir/xxclient/cmix/CMix.kt b/xxclient/src/main/java/io/elixxir/xxclient/cmix/CMix.kt
index 8cddba19c2aa53489d76b264781262dd13932524..8552e5d2705b4889107c45bbee216f031f694f1f 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/cmix/CMix.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/cmix/CMix.kt
@@ -15,9 +15,9 @@ interface CMix {
     val receptionRegistrationValidationSignature: ByteArray
 
     fun makeReceptionIdentity(): ByteArray
-    fun makeLegacyReceptionIdentity(): ReceptionIdentity
+    fun makeLegacyReceptionIdentity(): ReceptionIdentity?
     fun isNetworkHealthy(): Boolean
-    fun getNodeRegistrationStatus(): NodeRegistrationReport
+    fun getNodeRegistrationStatus(): NodeRegistrationReport?
     fun hasRunningProcesses(): Boolean
     fun getNetworkFollowerStatus(): NetworkFollowerStatus
     fun startNetworkFollower(timeoutMs: Long)
@@ -49,7 +49,7 @@ open class CMixAdapter(protected val cMix: CMixBindings) : CMix {
         return cMix.makeReceptionIdentity()
     }
 
-    override fun makeLegacyReceptionIdentity(): ReceptionIdentity {
+    override fun makeLegacyReceptionIdentity(): ReceptionIdentity? {
         return decode(
             cMix.makeLegacyReceptionIdentity()
         )
@@ -59,7 +59,7 @@ open class CMixAdapter(protected val cMix: CMixBindings) : CMix {
         return cMix.isHealthy
     }
 
-    override fun getNodeRegistrationStatus(): NodeRegistrationReport {
+    override fun getNodeRegistrationStatus(): NodeRegistrationReport? {
         return decode(
             cMix.nodeRegistrationStatus
         )
diff --git a/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2e.kt b/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2e.kt
index 552a2bd278e106d9541b43cbe504ae6201b362d2..3d181eb523fa40eb7b9733e06abc8c0cda9711bc 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2e.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2e.kt
@@ -33,7 +33,7 @@ interface E2e {
     fun resetAuthenticatedChannel(contact: Contact): RoundId
 
     fun callAllReceivedRequests()
-    fun getReceivedRequest(partnerId: UserId): Request
+    fun getReceivedRequest(partnerId: UserId): Request?
     fun deleteRequest(partnerId: UserId)
     fun deleteAllRequests()
     fun deleteReceivedRequests()
@@ -54,7 +54,7 @@ interface E2e {
         receiverId: UserId,
         payload: Payload,
         params: E2eParams
-    ): SendReport
+    ): SendReport?
 
     fun registerListener(
         senderId: UserId,
diff --git a/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2eAdapter.kt b/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2eAdapter.kt
index 464bead1fa42e25a17f3d81ff9b340a6f6fd50fe..532165c97baabf7293bc397c2588d369a0df867a 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2eAdapter.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/e2e/E2eAdapter.kt
@@ -75,7 +75,7 @@ open class E2eAdapter(protected val e2e: E2eBindings) : E2e{
         e2e.callAllReceivedRequests()
     }
 
-    override fun getReceivedRequest(partnerId: UserId): Request {
+    override fun getReceivedRequest(partnerId: UserId): Request? {
         return decode(
             e2e.getReceivedRequest(partnerId)
         )
@@ -122,7 +122,7 @@ open class E2eAdapter(protected val e2e: E2eBindings) : E2e{
         receiverId: UserId,
         payload: Payload,
         params: E2eParams
-    ): SendReport {
+    ): SendReport? {
         val reportData = e2e.sendE2E(
             messageType.code,
             receiverId,
diff --git a/xxclient/src/main/java/io/elixxir/xxclient/groupchat/GroupChat.kt b/xxclient/src/main/java/io/elixxir/xxclient/groupchat/GroupChat.kt
index b8e2ac2449a9fa1e96fd7bd02b370feac8ace369..814ceb288cdb94e9a28deba4ef835d546382fc34 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/groupchat/GroupChat.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/groupchat/GroupChat.kt
@@ -13,11 +13,11 @@ interface GroupChat {
 
     fun getGroup(groupId: ByteArray): Group
     fun getGroups(): List<Group>
-    fun makeGroup(membership: ByteArray, message: ByteArray, name: ByteArray): GroupReport
+    fun makeGroup(membership: ByteArray, message: ByteArray, name: ByteArray): GroupReport?
     fun joinGroup(trackedGroupId: ByteArray)
     fun leaveGroup(groupId: ByteArray)
-    fun resendRequest(groupId: ByteArray): GroupReport
-    fun send(groupId: ByteArray, message: ByteArray, tag: String?): GroupSendReport
+    fun resendRequest(groupId: ByteArray): GroupReport?
+    fun send(groupId: ByteArray, message: ByteArray, tag: String?): GroupSendReport?
 }
 
 open class GroupChatAdapter(
@@ -40,7 +40,7 @@ open class GroupChatAdapter(
         membership: ByteArray,
         message: ByteArray,
         name: ByteArray
-    ): GroupReport {
+    ): GroupReport? {
         return decode(
             group.makeGroup(membership, message, name)
         )
@@ -54,13 +54,13 @@ open class GroupChatAdapter(
         group.leaveGroup(groupId)
     }
 
-    override fun resendRequest(groupId: ByteArray): GroupReport {
+    override fun resendRequest(groupId: ByteArray): GroupReport? {
         return decode(
             group.resendRequest(groupId)
         )
     }
 
-    override fun send(groupId: ByteArray, message: ByteArray, tag: String?): GroupSendReport {
+    override fun send(groupId: ByteArray, message: ByteArray, tag: String?): GroupSendReport? {
         return decode(
             group.send(groupId, message, tag)
         )
diff --git a/xxclient/src/main/java/io/elixxir/xxclient/models/BindingsModel.kt b/xxclient/src/main/java/io/elixxir/xxclient/models/BindingsModel.kt
index 509e505089d3d5b17e705005c55fe0864949d193..16b02dfb080d681f4c85915cf513c9ca2b4b5ecb 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/models/BindingsModel.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/models/BindingsModel.kt
@@ -17,13 +17,13 @@ interface BindingsModel {
             return Gson().toJson(list.toTypedArray(), typeToken).encodeToByteArray()
         }
 
-        inline fun <reified T> decode(data: ByteArray): T {
+        inline fun <reified T> decode(data: ByteArray): T? {
             return if (data.isNotEmpty()) {
                 val typeToken = object : TypeToken<T>() {}.type
                 Gson().fromJson(data.decodeToString(), typeToken)
             } else {
                 Log.d("Decode", "Failed to decode data: ${data.decodeToString()}")
-                throw InvalidDataException()
+                null
             }
         }
 
diff --git a/xxclient/src/main/java/io/elixxir/xxclient/utils/Bindings.kt b/xxclient/src/main/java/io/elixxir/xxclient/utils/Bindings.kt
index 2198c2d43c94812cefd9360037d96e677612de39..999119aaf26b6f8c8d34d8de255ff73347be91b1 100644
--- a/xxclient/src/main/java/io/elixxir/xxclient/utils/Bindings.kt
+++ b/xxclient/src/main/java/io/elixxir/xxclient/utils/Bindings.kt
@@ -10,8 +10,9 @@ inline fun <reified T: BindingsModel> parseModel(data: ByteArray?, error: Except
     return error?.let {
         Result.failure(it)
     } ?: data?.let {
-        if (it.isNotEmpty()) Result.success(BindingsModel.decode(it))
-        else Result.failure(NoResultsException())
+        BindingsModel.decode<T>(it)?.let { model ->
+            Result.success(model)
+        } ?: Result.failure(NoResultsException())
     } ?: Result.failure(InvalidDataException())
 }