diff --git a/common/protob/messages-ble.proto b/common/protob/messages-ble.proto
new file mode 100644
index 0000000000..554291a82d
--- /dev/null
+++ b/common/protob/messages-ble.proto
@@ -0,0 +1,30 @@
+syntax = "proto2";
+package hw.trezor.messages.ble;
+
+// Sugar for easier handling in Java
+option java_package = "com.satoshilabs.trezor.lib.protobuf";
+option java_outer_classname = "TrezorMessageBLE";
+
+import "options.proto";
+
+option (include_in_bitcoin_only) = true;
+
+
+/**
+ * Request: erases all BLE bonds
+ * @start
+ * @next Success
+ * @next Failure
+ */
+message EraseBonds {
+}
+
+
+/**
+ * Request: disconnect
+ * @start
+ * @next Success
+ * @next Failure
+ */
+message Disconnect {
+}
diff --git a/common/protob/messages-common.proto b/common/protob/messages-common.proto
index 3e8cb9537c..6f54cce4b3 100644
--- a/common/protob/messages-common.proto
+++ b/common/protob/messages-common.proto
@@ -39,6 +39,7 @@ message Failure {
         Failure_PinMismatch = 12;
         Failure_WipeCodeMismatch = 13;
         Failure_InvalidSession = 14;
+        Failure_DeviceIsBusy = 15;
         Failure_FirmwareError = 99;
     }
 }
diff --git a/common/protob/messages.proto b/common/protob/messages.proto
index e58b50cb6b..da113e661a 100644
--- a/common/protob/messages.proto
+++ b/common/protob/messages.proto
@@ -88,6 +88,10 @@ enum MessageType {
     MessageType_FirmwareRequest = 8 [(bitcoin_only) = true, (wire_out) = true, (wire_bootloader) = true];
     MessageType_ProdTestT1 = 32 [(bitcoin_only) = true, (wire_in) = true, (wire_bootloader) = true];
 
+    // BLE
+    MessageType_EraseBonds = 8006 [(bitcoin_only) = true, (wire_in) = true];
+    MessageType_Disconnect = 8007 [(bitcoin_only) = true, (wire_in) = true];
+
     // Bitcoin
     MessageType_GetPublicKey = 11 [(bitcoin_only) = true, (wire_in) = true];
     MessageType_PublicKey = 12 [(bitcoin_only) = true, (wire_out) = true];
diff --git a/core/embed/rust/src/ui/api/firmware_micropython.rs b/core/embed/rust/src/ui/api/firmware_micropython.rs
index b6f16c41a2..e00fc70d76 100644
--- a/core/embed/rust/src/ui/api/firmware_micropython.rs
+++ b/core/embed/rust/src/ui/api/firmware_micropython.rs
@@ -1060,6 +1060,10 @@ pub static mp_module_trezorui_api: Module = obj_module! {
     ///         def button_event(self, event: int, button: int) -> LayoutState | None:
     ///             """Receive a button event `event` for button `button`."""
     ///
+    ///     if utils.USE_BLE:
+    ///         def ble_event(self, event: int, data: bytes) -> LayoutState | None:
+    ///             """Receive a BLE events."""
+    ///
     ///     def progress_event(self, value: int, description: str) -> LayoutState | None:
     ///         """Receive a progress event."""
     ///
diff --git a/core/mocks/generated/trezorio/ble.pyi b/core/mocks/generated/trezorio/ble.pyi
index 79388a1bca..d3311380f0 100644
--- a/core/mocks/generated/trezorio/ble.pyi
+++ b/core/mocks/generated/trezorio/ble.pyi
@@ -23,7 +23,7 @@ def erase_bonds() -> bool:
 
 
 # upymod/modtrezorio/modtrezorio-ble.h
-def unpair() -> None:
+def unpair() -> bool:
     """
     Erases bond for current connection, if any
     """
diff --git a/core/mocks/generated/trezorui_api.pyi b/core/mocks/generated/trezorui_api.pyi
index b2d011c64b..37bce5a9d1 100644
--- a/core/mocks/generated/trezorui_api.pyi
+++ b/core/mocks/generated/trezorui_api.pyi
@@ -22,6 +22,9 @@ class LayoutObj(Generic[T]):
     if utils.USE_BUTTON:
         def button_event(self, event: int, button: int) -> LayoutState | None:
             """Receive a button event `event` for button `button`."""
+    if utils.USE_BLE:
+        def ble_event(self, event: int, data: bytes) -> LayoutState | None:
+            """Receive a BLE events."""
     def progress_event(self, value: int, description: str) -> LayoutState | None:
         """Receive a progress event."""
     def usb_event(self, connected: bool) -> LayoutState | None:
diff --git a/core/src/all_modules.py b/core/src/all_modules.py
index 33bdc38243..8c604de172 100644
--- a/core/src/all_modules.py
+++ b/core/src/all_modules.py
@@ -33,6 +33,8 @@ from trezor import utils
 
 all_modules
 import all_modules
+bluetooth
+import bluetooth
 boot
 import boot
 main
@@ -367,6 +369,10 @@ apps.management.authenticate_device
 import apps.management.authenticate_device
 apps.management.backup_device
 import apps.management.backup_device
+apps.management.ble.disconnect
+import apps.management.ble.disconnect
+apps.management.ble.erase_bonds
+import apps.management.ble.erase_bonds
 apps.management.change_language
 import apps.management.change_language
 apps.management.change_pin
diff --git a/core/src/apps/management/ble/disconnect.py b/core/src/apps/management/ble/disconnect.py
new file mode 100644
index 0000000000..f41c13bb15
--- /dev/null
+++ b/core/src/apps/management/ble/disconnect.py
@@ -0,0 +1,21 @@
+from trezorio import ble
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from trezor.messages import Disconnect, Success
+
+
+async def disconnect(_msg: Disconnect) -> Success:
+    from trezor.messages import Success
+    from trezor.ui.layouts import confirm_action
+    from trezor.wire.context import get_context
+
+    await confirm_action("disconnect", "DISCONNECT")
+
+    ctx = get_context()
+
+    await ctx.write(Success(message="Erasing"))
+
+    ble.disconnect()
+
+    raise RuntimeError
diff --git a/core/src/apps/management/ble/erase_bonds.py b/core/src/apps/management/ble/erase_bonds.py
new file mode 100644
index 0000000000..f6f21c48bb
--- /dev/null
+++ b/core/src/apps/management/ble/erase_bonds.py
@@ -0,0 +1,21 @@
+from trezorio import ble
+from typing import TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from trezor.messages import EraseBonds, Success
+
+
+async def erase_bonds(_msg: EraseBonds) -> Success:
+    from trezor.messages import Success
+    from trezor.ui.layouts import confirm_action
+    from trezor.wire.context import get_context
+
+    await confirm_action("erase bonds", "ERASE BONDS")
+
+    ctx = get_context()
+
+    await ctx.write(Success(message="Erasing"))
+
+    ble.erase_bonds()
+
+    raise RuntimeError
diff --git a/core/src/apps/workflow_handlers.py b/core/src/apps/workflow_handlers.py
index c7ff7ba477..50caaa4356 100644
--- a/core/src/apps/workflow_handlers.py
+++ b/core/src/apps/workflow_handlers.py
@@ -76,6 +76,12 @@ def _find_message_handler_module(msg_type: int) -> str:
     if utils.USE_OPTIGA and msg_type == MessageType.AuthenticateDevice:
         return "apps.management.authenticate_device"
 
+    if utils.USE_BLE:
+        if msg_type == MessageType.EraseBonds:
+            return "apps.management.ble.erase_bonds"
+        if msg_type == MessageType.Disconnect:
+            return "apps.management.ble.disconnect"
+
     # bitcoin
     if msg_type == MessageType.AuthorizeCoinJoin:
         return "apps.bitcoin.authorize_coinjoin"
diff --git a/core/src/bluetooth.py b/core/src/bluetooth.py
new file mode 100644
index 0000000000..8bdbf8f9e5
--- /dev/null
+++ b/core/src/bluetooth.py
@@ -0,0 +1,20 @@
+from trezorio import BLE, ble
+
+
+class BleInterface:
+
+    RX_PACKET_LEN = ble.RX_PACKET_LEN
+    TX_PACKET_LEN = ble.TX_PACKET_LEN
+
+    def iface_num(self) -> int:
+        return BLE
+
+    def write(self, msg: bytes) -> int:
+        return ble.write(msg)
+
+    def read(self, buffer: bytearray, offset: int = 0) -> int:
+        return ble.read(buffer, offset)
+
+
+# interface used for trezor wire protocol
+iface_ble = BleInterface()
diff --git a/core/src/main.py b/core/src/main.py
index f0c9a54b06..ee48b9f476 100644
--- a/core/src/main.py
+++ b/core/src/main.py
@@ -49,6 +49,13 @@ import storage.device
 
 usb.bus.open(storage.device.get_device_id())
 
+if utils.USE_BLE:
+    from trezorio import ble
+    ble.start_comm()
+    if ble.peer_count() > 0:
+        ble.start_advertising(True, storage.device.get_label())
+
+
 # run the endless loop
 while True:
     with unimport_manager:
diff --git a/core/src/session.py b/core/src/session.py
index 1ecbc467be..6dca60a683 100644
--- a/core/src/session.py
+++ b/core/src/session.py
@@ -1,9 +1,15 @@
 # isort: skip_file
+from micropython import const
+
 from trezor import log, loop, utils, wire, workflow
 
 import apps.base
 import usb
 
+_PROTOBUF_BUFFER_SIZE = const(8192)
+WIRE_BUFFER = bytearray(_PROTOBUF_BUFFER_SIZE)
+
+
 apps.base.boot()
 
 if not utils.BITCOIN_ONLY and usb.ENABLE_IFACE_WEBAUTHN:
@@ -16,12 +22,22 @@ if __debug__:
 
     apps.debug.boot()
 
+
 # run main event loop and specify which screen is the default
 apps.base.set_homescreen()
 workflow.start_default()
 
+
 # initialize the wire codec
-wire.setup(usb.iface_wire)
+wire.setup(usb.iface_wire, WIRE_BUFFER)
+
+if utils.USE_BLE:
+    import bluetooth
+
+    BLE_BUFFER = bytearray(_PROTOBUF_BUFFER_SIZE)
+
+    wire.setup(bluetooth.iface_ble, BLE_BUFFER)
+
 
 # start the event loop
 loop.run()
diff --git a/core/src/trezor/enums/FailureType.py b/core/src/trezor/enums/FailureType.py
index fbb2001e54..625af7a461 100644
--- a/core/src/trezor/enums/FailureType.py
+++ b/core/src/trezor/enums/FailureType.py
@@ -16,4 +16,5 @@ NotInitialized = 11
 PinMismatch = 12
 WipeCodeMismatch = 13
 InvalidSession = 14
+DeviceIsBusy = 15
 FirmwareError = 99
diff --git a/core/src/trezor/enums/MessageType.py b/core/src/trezor/enums/MessageType.py
index 14de4cf790..13625d78b4 100644
--- a/core/src/trezor/enums/MessageType.py
+++ b/core/src/trezor/enums/MessageType.py
@@ -60,6 +60,8 @@ FirmwareErase = 6
 FirmwareUpload = 7
 FirmwareRequest = 8
 ProdTestT1 = 32
+EraseBonds = 8006
+Disconnect = 8007
 GetPublicKey = 11
 PublicKey = 12
 SignTx = 15
diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py
index 1ed220d2ad..960cd5bd8f 100644
--- a/core/src/trezor/enums/__init__.py
+++ b/core/src/trezor/enums/__init__.py
@@ -39,6 +39,7 @@ if TYPE_CHECKING:
         PinMismatch = 12
         WipeCodeMismatch = 13
         InvalidSession = 14
+        DeviceIsBusy = 15
         FirmwareError = 99
 
     class ButtonRequestType(IntEnum):
@@ -409,6 +410,8 @@ if TYPE_CHECKING:
         FirmwareUpload = 7
         FirmwareRequest = 8
         ProdTestT1 = 32
+        EraseBonds = 8006
+        Disconnect = 8007
         GetPublicKey = 11
         PublicKey = 12
         SignTx = 15
diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py
index 9d4c93f782..00a8369b52 100644
--- a/core/src/trezor/messages.py
+++ b/core/src/trezor/messages.py
@@ -1256,6 +1256,18 @@ if TYPE_CHECKING:
         def is_type_of(cls, msg: Any) -> TypeGuard["TxAckPrevExtraDataWrapper"]:
             return isinstance(msg, cls)
 
+    class EraseBonds(protobuf.MessageType):
+
+        @classmethod
+        def is_type_of(cls, msg: Any) -> TypeGuard["EraseBonds"]:
+            return isinstance(msg, cls)
+
+    class Disconnect(protobuf.MessageType):
+
+        @classmethod
+        def is_type_of(cls, msg: Any) -> TypeGuard["Disconnect"]:
+            return isinstance(msg, cls)
+
     class CardanoBlockchainPointerType(protobuf.MessageType):
         block_index: "int"
         tx_index: "int"
diff --git a/core/src/trezor/ui/__init__.py b/core/src/trezor/ui/__init__.py
index 9691402d61..6f006a882d 100644
--- a/core/src/trezor/ui/__init__.py
+++ b/core/src/trezor/ui/__init__.py
@@ -381,6 +381,8 @@ class Layout(Generic[T]):
             yield self._handle_input_iface(io.BUTTON, self.layout.button_event)
         if utils.USE_TOUCH:
             yield self._handle_input_iface(io.TOUCH, self.layout.touch_event)
+        if utils.USE_BLE:
+            yield self._handle_input_iface(io.BLE_EVENT, self.layout.ble_event)
 
     def _handle_input_iface(
         self, iface: int, event_call: Callable[..., LayoutState | None]
diff --git a/core/src/trezor/wire/__init__.py b/core/src/trezor/wire/__init__.py
index 2662a5610a..ac4e98fd67 100644
--- a/core/src/trezor/wire/__init__.py
+++ b/core/src/trezor/wire/__init__.py
@@ -23,7 +23,6 @@ reads the message's header. When the message type is known the first handler is
 
 """
 
-from micropython import const
 from typing import TYPE_CHECKING
 
 from trezor import log, loop, protobuf, utils
@@ -37,10 +36,6 @@ from .message_handler import failure
 # other packages.
 from .errors import *  # isort:skip # noqa: F401,F403
 
-_PROTOBUF_BUFFER_SIZE = const(8192)
-
-WIRE_BUFFER = bytearray(_PROTOBUF_BUFFER_SIZE)
-
 if TYPE_CHECKING:
     from trezorio import WireInterface
     from typing import Any, Callable, Coroutine, TypeVar
@@ -52,13 +47,13 @@ if TYPE_CHECKING:
     LoadedMessageType = TypeVar("LoadedMessageType", bound=protobuf.MessageType)
 
 
-def setup(iface: WireInterface) -> None:
+def setup(iface: WireInterface, buffer: bytearray) -> None:
     """Initialize the wire stack on the provided WireInterface."""
-    loop.schedule(handle_session(iface))
+    loop.schedule(handle_session(iface, buffer))
 
 
-async def handle_session(iface: WireInterface) -> None:
-    ctx = CodecContext(iface, WIRE_BUFFER)
+async def handle_session(iface: WireInterface, buffer: bytearray) -> None:
+    ctx = CodecContext(iface, buffer)
     next_msg: protocol_common.Message | None = None
 
     # Take a mark of modules that are imported at this point, so we can
diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py
index dedfaae21b..d2a4de0798 100644
--- a/python/src/trezorlib/messages.py
+++ b/python/src/trezorlib/messages.py
@@ -43,6 +43,7 @@ class FailureType(IntEnum):
     PinMismatch = 12
     WipeCodeMismatch = 13
     InvalidSession = 14
+    DeviceIsBusy = 15
     FirmwareError = 99
 
 
@@ -462,6 +463,8 @@ class MessageType(IntEnum):
     FirmwareUpload = 7
     FirmwareRequest = 8
     ProdTestT1 = 32
+    EraseBonds = 8006
+    Disconnect = 8007
     GetPublicKey = 11
     PublicKey = 12
     SignTx = 15
@@ -2207,6 +2210,14 @@ class TxAckPrevExtraDataWrapper(protobuf.MessageType):
         self.extra_data_chunk = extra_data_chunk
 
 
+class EraseBonds(protobuf.MessageType):
+    MESSAGE_WIRE_TYPE = 8006
+
+
+class Disconnect(protobuf.MessageType):
+    MESSAGE_WIRE_TYPE = 8007
+
+
 class FirmwareErase(protobuf.MessageType):
     MESSAGE_WIRE_TYPE = 6
     FIELDS = {
diff --git a/rust/trezor-client/src/messages/generated.rs b/rust/trezor-client/src/messages/generated.rs
index 814125c4dc..7635f7d9a1 100644
--- a/rust/trezor-client/src/messages/generated.rs
+++ b/rust/trezor-client/src/messages/generated.rs
@@ -60,6 +60,8 @@ trezor_message_impl! {
     FirmwareUpload => MessageType_FirmwareUpload,
     FirmwareRequest => MessageType_FirmwareRequest,
     ProdTestT1 => MessageType_ProdTestT1,
+    EraseBonds => MessageType_EraseBonds,
+    Disconnect => MessageType_Disconnect,
     CipherKeyValue => MessageType_CipherKeyValue,
     CipheredKeyValue => MessageType_CipheredKeyValue,
     SignIdentity => MessageType_SignIdentity,
diff --git a/rust/trezor-client/src/protos/generated/messages.rs b/rust/trezor-client/src/protos/generated/messages.rs
index e3797456aa..fae64f45a4 100644
--- a/rust/trezor-client/src/protos/generated/messages.rs
+++ b/rust/trezor-client/src/protos/generated/messages.rs
@@ -150,6 +150,10 @@ pub enum MessageType {
     MessageType_FirmwareRequest = 8,
     // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_ProdTestT1)
     MessageType_ProdTestT1 = 32,
+    // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_EraseBonds)
+    MessageType_EraseBonds = 8006,
+    // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_Disconnect)
+    MessageType_Disconnect = 8007,
     // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_GetPublicKey)
     MessageType_GetPublicKey = 11,
     // @@protoc_insertion_point(enum_value:hw.trezor.messages.MessageType.MessageType_PublicKey)
@@ -602,6 +606,8 @@ impl ::protobuf::Enum for MessageType {
             7 => ::std::option::Option::Some(MessageType::MessageType_FirmwareUpload),
             8 => ::std::option::Option::Some(MessageType::MessageType_FirmwareRequest),
             32 => ::std::option::Option::Some(MessageType::MessageType_ProdTestT1),
+            8006 => ::std::option::Option::Some(MessageType::MessageType_EraseBonds),
+            8007 => ::std::option::Option::Some(MessageType::MessageType_Disconnect),
             11 => ::std::option::Option::Some(MessageType::MessageType_GetPublicKey),
             12 => ::std::option::Option::Some(MessageType::MessageType_PublicKey),
             15 => ::std::option::Option::Some(MessageType::MessageType_SignTx),
@@ -859,6 +865,8 @@ impl ::protobuf::Enum for MessageType {
             "MessageType_FirmwareUpload" => ::std::option::Option::Some(MessageType::MessageType_FirmwareUpload),
             "MessageType_FirmwareRequest" => ::std::option::Option::Some(MessageType::MessageType_FirmwareRequest),
             "MessageType_ProdTestT1" => ::std::option::Option::Some(MessageType::MessageType_ProdTestT1),
+            "MessageType_EraseBonds" => ::std::option::Option::Some(MessageType::MessageType_EraseBonds),
+            "MessageType_Disconnect" => ::std::option::Option::Some(MessageType::MessageType_Disconnect),
             "MessageType_GetPublicKey" => ::std::option::Option::Some(MessageType::MessageType_GetPublicKey),
             "MessageType_PublicKey" => ::std::option::Option::Some(MessageType::MessageType_PublicKey),
             "MessageType_SignTx" => ::std::option::Option::Some(MessageType::MessageType_SignTx),
@@ -1115,6 +1123,8 @@ impl ::protobuf::Enum for MessageType {
         MessageType::MessageType_FirmwareUpload,
         MessageType::MessageType_FirmwareRequest,
         MessageType::MessageType_ProdTestT1,
+        MessageType::MessageType_EraseBonds,
+        MessageType::MessageType_Disconnect,
         MessageType::MessageType_GetPublicKey,
         MessageType::MessageType_PublicKey,
         MessageType::MessageType_SignTx,
@@ -1377,196 +1387,198 @@ impl ::protobuf::EnumFull for MessageType {
             MessageType::MessageType_FirmwareUpload => 58,
             MessageType::MessageType_FirmwareRequest => 59,
             MessageType::MessageType_ProdTestT1 => 60,
-            MessageType::MessageType_GetPublicKey => 61,
-            MessageType::MessageType_PublicKey => 62,
-            MessageType::MessageType_SignTx => 63,
-            MessageType::MessageType_TxRequest => 64,
-            MessageType::MessageType_TxAck => 65,
-            MessageType::MessageType_GetAddress => 66,
-            MessageType::MessageType_Address => 67,
-            MessageType::MessageType_TxAckPaymentRequest => 68,
-            MessageType::MessageType_SignMessage => 69,
-            MessageType::MessageType_VerifyMessage => 70,
-            MessageType::MessageType_MessageSignature => 71,
-            MessageType::MessageType_GetOwnershipId => 72,
-            MessageType::MessageType_OwnershipId => 73,
-            MessageType::MessageType_GetOwnershipProof => 74,
-            MessageType::MessageType_OwnershipProof => 75,
-            MessageType::MessageType_AuthorizeCoinJoin => 76,
-            MessageType::MessageType_CipherKeyValue => 77,
-            MessageType::MessageType_CipheredKeyValue => 78,
-            MessageType::MessageType_SignIdentity => 79,
-            MessageType::MessageType_SignedIdentity => 80,
-            MessageType::MessageType_GetECDHSessionKey => 81,
-            MessageType::MessageType_ECDHSessionKey => 82,
-            MessageType::MessageType_DebugLinkDecision => 83,
-            MessageType::MessageType_DebugLinkGetState => 84,
-            MessageType::MessageType_DebugLinkState => 85,
-            MessageType::MessageType_DebugLinkStop => 86,
-            MessageType::MessageType_DebugLinkLog => 87,
-            MessageType::MessageType_DebugLinkMemoryRead => 88,
-            MessageType::MessageType_DebugLinkMemory => 89,
-            MessageType::MessageType_DebugLinkMemoryWrite => 90,
-            MessageType::MessageType_DebugLinkFlashErase => 91,
-            MessageType::MessageType_DebugLinkLayout => 92,
-            MessageType::MessageType_DebugLinkReseedRandom => 93,
-            MessageType::MessageType_DebugLinkRecordScreen => 94,
-            MessageType::MessageType_DebugLinkEraseSdCard => 95,
-            MessageType::MessageType_DebugLinkWatchLayout => 96,
-            MessageType::MessageType_DebugLinkResetDebugEvents => 97,
-            MessageType::MessageType_DebugLinkOptigaSetSecMax => 98,
-            MessageType::MessageType_EthereumGetPublicKey => 99,
-            MessageType::MessageType_EthereumPublicKey => 100,
-            MessageType::MessageType_EthereumGetAddress => 101,
-            MessageType::MessageType_EthereumAddress => 102,
-            MessageType::MessageType_EthereumSignTx => 103,
-            MessageType::MessageType_EthereumSignTxEIP1559 => 104,
-            MessageType::MessageType_EthereumTxRequest => 105,
-            MessageType::MessageType_EthereumTxAck => 106,
-            MessageType::MessageType_EthereumSignMessage => 107,
-            MessageType::MessageType_EthereumVerifyMessage => 108,
-            MessageType::MessageType_EthereumMessageSignature => 109,
-            MessageType::MessageType_EthereumSignTypedData => 110,
-            MessageType::MessageType_EthereumTypedDataStructRequest => 111,
-            MessageType::MessageType_EthereumTypedDataStructAck => 112,
-            MessageType::MessageType_EthereumTypedDataValueRequest => 113,
-            MessageType::MessageType_EthereumTypedDataValueAck => 114,
-            MessageType::MessageType_EthereumTypedDataSignature => 115,
-            MessageType::MessageType_EthereumSignTypedHash => 116,
-            MessageType::MessageType_NEMGetAddress => 117,
-            MessageType::MessageType_NEMAddress => 118,
-            MessageType::MessageType_NEMSignTx => 119,
-            MessageType::MessageType_NEMSignedTx => 120,
-            MessageType::MessageType_NEMDecryptMessage => 121,
-            MessageType::MessageType_NEMDecryptedMessage => 122,
-            MessageType::MessageType_TezosGetAddress => 123,
-            MessageType::MessageType_TezosAddress => 124,
-            MessageType::MessageType_TezosSignTx => 125,
-            MessageType::MessageType_TezosSignedTx => 126,
-            MessageType::MessageType_TezosGetPublicKey => 127,
-            MessageType::MessageType_TezosPublicKey => 128,
-            MessageType::MessageType_StellarSignTx => 129,
-            MessageType::MessageType_StellarTxOpRequest => 130,
-            MessageType::MessageType_StellarGetAddress => 131,
-            MessageType::MessageType_StellarAddress => 132,
-            MessageType::MessageType_StellarCreateAccountOp => 133,
-            MessageType::MessageType_StellarPaymentOp => 134,
-            MessageType::MessageType_StellarPathPaymentStrictReceiveOp => 135,
-            MessageType::MessageType_StellarManageSellOfferOp => 136,
-            MessageType::MessageType_StellarCreatePassiveSellOfferOp => 137,
-            MessageType::MessageType_StellarSetOptionsOp => 138,
-            MessageType::MessageType_StellarChangeTrustOp => 139,
-            MessageType::MessageType_StellarAllowTrustOp => 140,
-            MessageType::MessageType_StellarAccountMergeOp => 141,
-            MessageType::MessageType_StellarManageDataOp => 142,
-            MessageType::MessageType_StellarBumpSequenceOp => 143,
-            MessageType::MessageType_StellarManageBuyOfferOp => 144,
-            MessageType::MessageType_StellarPathPaymentStrictSendOp => 145,
-            MessageType::MessageType_StellarClaimClaimableBalanceOp => 146,
-            MessageType::MessageType_StellarSignedTx => 147,
-            MessageType::MessageType_CardanoGetPublicKey => 148,
-            MessageType::MessageType_CardanoPublicKey => 149,
-            MessageType::MessageType_CardanoGetAddress => 150,
-            MessageType::MessageType_CardanoAddress => 151,
-            MessageType::MessageType_CardanoTxItemAck => 152,
-            MessageType::MessageType_CardanoTxAuxiliaryDataSupplement => 153,
-            MessageType::MessageType_CardanoTxWitnessRequest => 154,
-            MessageType::MessageType_CardanoTxWitnessResponse => 155,
-            MessageType::MessageType_CardanoTxHostAck => 156,
-            MessageType::MessageType_CardanoTxBodyHash => 157,
-            MessageType::MessageType_CardanoSignTxFinished => 158,
-            MessageType::MessageType_CardanoSignTxInit => 159,
-            MessageType::MessageType_CardanoTxInput => 160,
-            MessageType::MessageType_CardanoTxOutput => 161,
-            MessageType::MessageType_CardanoAssetGroup => 162,
-            MessageType::MessageType_CardanoToken => 163,
-            MessageType::MessageType_CardanoTxCertificate => 164,
-            MessageType::MessageType_CardanoTxWithdrawal => 165,
-            MessageType::MessageType_CardanoTxAuxiliaryData => 166,
-            MessageType::MessageType_CardanoPoolOwner => 167,
-            MessageType::MessageType_CardanoPoolRelayParameters => 168,
-            MessageType::MessageType_CardanoGetNativeScriptHash => 169,
-            MessageType::MessageType_CardanoNativeScriptHash => 170,
-            MessageType::MessageType_CardanoTxMint => 171,
-            MessageType::MessageType_CardanoTxCollateralInput => 172,
-            MessageType::MessageType_CardanoTxRequiredSigner => 173,
-            MessageType::MessageType_CardanoTxInlineDatumChunk => 174,
-            MessageType::MessageType_CardanoTxReferenceScriptChunk => 175,
-            MessageType::MessageType_CardanoTxReferenceInput => 176,
-            MessageType::MessageType_RippleGetAddress => 177,
-            MessageType::MessageType_RippleAddress => 178,
-            MessageType::MessageType_RippleSignTx => 179,
-            MessageType::MessageType_RippleSignedTx => 180,
-            MessageType::MessageType_MoneroTransactionInitRequest => 181,
-            MessageType::MessageType_MoneroTransactionInitAck => 182,
-            MessageType::MessageType_MoneroTransactionSetInputRequest => 183,
-            MessageType::MessageType_MoneroTransactionSetInputAck => 184,
-            MessageType::MessageType_MoneroTransactionInputViniRequest => 185,
-            MessageType::MessageType_MoneroTransactionInputViniAck => 186,
-            MessageType::MessageType_MoneroTransactionAllInputsSetRequest => 187,
-            MessageType::MessageType_MoneroTransactionAllInputsSetAck => 188,
-            MessageType::MessageType_MoneroTransactionSetOutputRequest => 189,
-            MessageType::MessageType_MoneroTransactionSetOutputAck => 190,
-            MessageType::MessageType_MoneroTransactionAllOutSetRequest => 191,
-            MessageType::MessageType_MoneroTransactionAllOutSetAck => 192,
-            MessageType::MessageType_MoneroTransactionSignInputRequest => 193,
-            MessageType::MessageType_MoneroTransactionSignInputAck => 194,
-            MessageType::MessageType_MoneroTransactionFinalRequest => 195,
-            MessageType::MessageType_MoneroTransactionFinalAck => 196,
-            MessageType::MessageType_MoneroKeyImageExportInitRequest => 197,
-            MessageType::MessageType_MoneroKeyImageExportInitAck => 198,
-            MessageType::MessageType_MoneroKeyImageSyncStepRequest => 199,
-            MessageType::MessageType_MoneroKeyImageSyncStepAck => 200,
-            MessageType::MessageType_MoneroKeyImageSyncFinalRequest => 201,
-            MessageType::MessageType_MoneroKeyImageSyncFinalAck => 202,
-            MessageType::MessageType_MoneroGetAddress => 203,
-            MessageType::MessageType_MoneroAddress => 204,
-            MessageType::MessageType_MoneroGetWatchKey => 205,
-            MessageType::MessageType_MoneroWatchKey => 206,
-            MessageType::MessageType_DebugMoneroDiagRequest => 207,
-            MessageType::MessageType_DebugMoneroDiagAck => 208,
-            MessageType::MessageType_MoneroGetTxKeyRequest => 209,
-            MessageType::MessageType_MoneroGetTxKeyAck => 210,
-            MessageType::MessageType_MoneroLiveRefreshStartRequest => 211,
-            MessageType::MessageType_MoneroLiveRefreshStartAck => 212,
-            MessageType::MessageType_MoneroLiveRefreshStepRequest => 213,
-            MessageType::MessageType_MoneroLiveRefreshStepAck => 214,
-            MessageType::MessageType_MoneroLiveRefreshFinalRequest => 215,
-            MessageType::MessageType_MoneroLiveRefreshFinalAck => 216,
-            MessageType::MessageType_EosGetPublicKey => 217,
-            MessageType::MessageType_EosPublicKey => 218,
-            MessageType::MessageType_EosSignTx => 219,
-            MessageType::MessageType_EosTxActionRequest => 220,
-            MessageType::MessageType_EosTxActionAck => 221,
-            MessageType::MessageType_EosSignedTx => 222,
-            MessageType::MessageType_BinanceGetAddress => 223,
-            MessageType::MessageType_BinanceAddress => 224,
-            MessageType::MessageType_BinanceGetPublicKey => 225,
-            MessageType::MessageType_BinancePublicKey => 226,
-            MessageType::MessageType_BinanceSignTx => 227,
-            MessageType::MessageType_BinanceTxRequest => 228,
-            MessageType::MessageType_BinanceTransferMsg => 229,
-            MessageType::MessageType_BinanceOrderMsg => 230,
-            MessageType::MessageType_BinanceCancelMsg => 231,
-            MessageType::MessageType_BinanceSignedTx => 232,
-            MessageType::MessageType_WebAuthnListResidentCredentials => 233,
-            MessageType::MessageType_WebAuthnCredentials => 234,
-            MessageType::MessageType_WebAuthnAddResidentCredential => 235,
-            MessageType::MessageType_WebAuthnRemoveResidentCredential => 236,
-            MessageType::MessageType_SolanaGetPublicKey => 237,
-            MessageType::MessageType_SolanaPublicKey => 238,
-            MessageType::MessageType_SolanaGetAddress => 239,
-            MessageType::MessageType_SolanaAddress => 240,
-            MessageType::MessageType_SolanaSignTx => 241,
-            MessageType::MessageType_SolanaTxSignature => 242,
-            MessageType::MessageType_NostrGetPubkey => 243,
-            MessageType::MessageType_NostrPubkey => 244,
-            MessageType::MessageType_NostrSignEvent => 245,
-            MessageType::MessageType_NostrEventSignature => 246,
-            MessageType::MessageType_BenchmarkListNames => 247,
-            MessageType::MessageType_BenchmarkNames => 248,
-            MessageType::MessageType_BenchmarkRun => 249,
-            MessageType::MessageType_BenchmarkResult => 250,
+            MessageType::MessageType_EraseBonds => 61,
+            MessageType::MessageType_Disconnect => 62,
+            MessageType::MessageType_GetPublicKey => 63,
+            MessageType::MessageType_PublicKey => 64,
+            MessageType::MessageType_SignTx => 65,
+            MessageType::MessageType_TxRequest => 66,
+            MessageType::MessageType_TxAck => 67,
+            MessageType::MessageType_GetAddress => 68,
+            MessageType::MessageType_Address => 69,
+            MessageType::MessageType_TxAckPaymentRequest => 70,
+            MessageType::MessageType_SignMessage => 71,
+            MessageType::MessageType_VerifyMessage => 72,
+            MessageType::MessageType_MessageSignature => 73,
+            MessageType::MessageType_GetOwnershipId => 74,
+            MessageType::MessageType_OwnershipId => 75,
+            MessageType::MessageType_GetOwnershipProof => 76,
+            MessageType::MessageType_OwnershipProof => 77,
+            MessageType::MessageType_AuthorizeCoinJoin => 78,
+            MessageType::MessageType_CipherKeyValue => 79,
+            MessageType::MessageType_CipheredKeyValue => 80,
+            MessageType::MessageType_SignIdentity => 81,
+            MessageType::MessageType_SignedIdentity => 82,
+            MessageType::MessageType_GetECDHSessionKey => 83,
+            MessageType::MessageType_ECDHSessionKey => 84,
+            MessageType::MessageType_DebugLinkDecision => 85,
+            MessageType::MessageType_DebugLinkGetState => 86,
+            MessageType::MessageType_DebugLinkState => 87,
+            MessageType::MessageType_DebugLinkStop => 88,
+            MessageType::MessageType_DebugLinkLog => 89,
+            MessageType::MessageType_DebugLinkMemoryRead => 90,
+            MessageType::MessageType_DebugLinkMemory => 91,
+            MessageType::MessageType_DebugLinkMemoryWrite => 92,
+            MessageType::MessageType_DebugLinkFlashErase => 93,
+            MessageType::MessageType_DebugLinkLayout => 94,
+            MessageType::MessageType_DebugLinkReseedRandom => 95,
+            MessageType::MessageType_DebugLinkRecordScreen => 96,
+            MessageType::MessageType_DebugLinkEraseSdCard => 97,
+            MessageType::MessageType_DebugLinkWatchLayout => 98,
+            MessageType::MessageType_DebugLinkResetDebugEvents => 99,
+            MessageType::MessageType_DebugLinkOptigaSetSecMax => 100,
+            MessageType::MessageType_EthereumGetPublicKey => 101,
+            MessageType::MessageType_EthereumPublicKey => 102,
+            MessageType::MessageType_EthereumGetAddress => 103,
+            MessageType::MessageType_EthereumAddress => 104,
+            MessageType::MessageType_EthereumSignTx => 105,
+            MessageType::MessageType_EthereumSignTxEIP1559 => 106,
+            MessageType::MessageType_EthereumTxRequest => 107,
+            MessageType::MessageType_EthereumTxAck => 108,
+            MessageType::MessageType_EthereumSignMessage => 109,
+            MessageType::MessageType_EthereumVerifyMessage => 110,
+            MessageType::MessageType_EthereumMessageSignature => 111,
+            MessageType::MessageType_EthereumSignTypedData => 112,
+            MessageType::MessageType_EthereumTypedDataStructRequest => 113,
+            MessageType::MessageType_EthereumTypedDataStructAck => 114,
+            MessageType::MessageType_EthereumTypedDataValueRequest => 115,
+            MessageType::MessageType_EthereumTypedDataValueAck => 116,
+            MessageType::MessageType_EthereumTypedDataSignature => 117,
+            MessageType::MessageType_EthereumSignTypedHash => 118,
+            MessageType::MessageType_NEMGetAddress => 119,
+            MessageType::MessageType_NEMAddress => 120,
+            MessageType::MessageType_NEMSignTx => 121,
+            MessageType::MessageType_NEMSignedTx => 122,
+            MessageType::MessageType_NEMDecryptMessage => 123,
+            MessageType::MessageType_NEMDecryptedMessage => 124,
+            MessageType::MessageType_TezosGetAddress => 125,
+            MessageType::MessageType_TezosAddress => 126,
+            MessageType::MessageType_TezosSignTx => 127,
+            MessageType::MessageType_TezosSignedTx => 128,
+            MessageType::MessageType_TezosGetPublicKey => 129,
+            MessageType::MessageType_TezosPublicKey => 130,
+            MessageType::MessageType_StellarSignTx => 131,
+            MessageType::MessageType_StellarTxOpRequest => 132,
+            MessageType::MessageType_StellarGetAddress => 133,
+            MessageType::MessageType_StellarAddress => 134,
+            MessageType::MessageType_StellarCreateAccountOp => 135,
+            MessageType::MessageType_StellarPaymentOp => 136,
+            MessageType::MessageType_StellarPathPaymentStrictReceiveOp => 137,
+            MessageType::MessageType_StellarManageSellOfferOp => 138,
+            MessageType::MessageType_StellarCreatePassiveSellOfferOp => 139,
+            MessageType::MessageType_StellarSetOptionsOp => 140,
+            MessageType::MessageType_StellarChangeTrustOp => 141,
+            MessageType::MessageType_StellarAllowTrustOp => 142,
+            MessageType::MessageType_StellarAccountMergeOp => 143,
+            MessageType::MessageType_StellarManageDataOp => 144,
+            MessageType::MessageType_StellarBumpSequenceOp => 145,
+            MessageType::MessageType_StellarManageBuyOfferOp => 146,
+            MessageType::MessageType_StellarPathPaymentStrictSendOp => 147,
+            MessageType::MessageType_StellarClaimClaimableBalanceOp => 148,
+            MessageType::MessageType_StellarSignedTx => 149,
+            MessageType::MessageType_CardanoGetPublicKey => 150,
+            MessageType::MessageType_CardanoPublicKey => 151,
+            MessageType::MessageType_CardanoGetAddress => 152,
+            MessageType::MessageType_CardanoAddress => 153,
+            MessageType::MessageType_CardanoTxItemAck => 154,
+            MessageType::MessageType_CardanoTxAuxiliaryDataSupplement => 155,
+            MessageType::MessageType_CardanoTxWitnessRequest => 156,
+            MessageType::MessageType_CardanoTxWitnessResponse => 157,
+            MessageType::MessageType_CardanoTxHostAck => 158,
+            MessageType::MessageType_CardanoTxBodyHash => 159,
+            MessageType::MessageType_CardanoSignTxFinished => 160,
+            MessageType::MessageType_CardanoSignTxInit => 161,
+            MessageType::MessageType_CardanoTxInput => 162,
+            MessageType::MessageType_CardanoTxOutput => 163,
+            MessageType::MessageType_CardanoAssetGroup => 164,
+            MessageType::MessageType_CardanoToken => 165,
+            MessageType::MessageType_CardanoTxCertificate => 166,
+            MessageType::MessageType_CardanoTxWithdrawal => 167,
+            MessageType::MessageType_CardanoTxAuxiliaryData => 168,
+            MessageType::MessageType_CardanoPoolOwner => 169,
+            MessageType::MessageType_CardanoPoolRelayParameters => 170,
+            MessageType::MessageType_CardanoGetNativeScriptHash => 171,
+            MessageType::MessageType_CardanoNativeScriptHash => 172,
+            MessageType::MessageType_CardanoTxMint => 173,
+            MessageType::MessageType_CardanoTxCollateralInput => 174,
+            MessageType::MessageType_CardanoTxRequiredSigner => 175,
+            MessageType::MessageType_CardanoTxInlineDatumChunk => 176,
+            MessageType::MessageType_CardanoTxReferenceScriptChunk => 177,
+            MessageType::MessageType_CardanoTxReferenceInput => 178,
+            MessageType::MessageType_RippleGetAddress => 179,
+            MessageType::MessageType_RippleAddress => 180,
+            MessageType::MessageType_RippleSignTx => 181,
+            MessageType::MessageType_RippleSignedTx => 182,
+            MessageType::MessageType_MoneroTransactionInitRequest => 183,
+            MessageType::MessageType_MoneroTransactionInitAck => 184,
+            MessageType::MessageType_MoneroTransactionSetInputRequest => 185,
+            MessageType::MessageType_MoneroTransactionSetInputAck => 186,
+            MessageType::MessageType_MoneroTransactionInputViniRequest => 187,
+            MessageType::MessageType_MoneroTransactionInputViniAck => 188,
+            MessageType::MessageType_MoneroTransactionAllInputsSetRequest => 189,
+            MessageType::MessageType_MoneroTransactionAllInputsSetAck => 190,
+            MessageType::MessageType_MoneroTransactionSetOutputRequest => 191,
+            MessageType::MessageType_MoneroTransactionSetOutputAck => 192,
+            MessageType::MessageType_MoneroTransactionAllOutSetRequest => 193,
+            MessageType::MessageType_MoneroTransactionAllOutSetAck => 194,
+            MessageType::MessageType_MoneroTransactionSignInputRequest => 195,
+            MessageType::MessageType_MoneroTransactionSignInputAck => 196,
+            MessageType::MessageType_MoneroTransactionFinalRequest => 197,
+            MessageType::MessageType_MoneroTransactionFinalAck => 198,
+            MessageType::MessageType_MoneroKeyImageExportInitRequest => 199,
+            MessageType::MessageType_MoneroKeyImageExportInitAck => 200,
+            MessageType::MessageType_MoneroKeyImageSyncStepRequest => 201,
+            MessageType::MessageType_MoneroKeyImageSyncStepAck => 202,
+            MessageType::MessageType_MoneroKeyImageSyncFinalRequest => 203,
+            MessageType::MessageType_MoneroKeyImageSyncFinalAck => 204,
+            MessageType::MessageType_MoneroGetAddress => 205,
+            MessageType::MessageType_MoneroAddress => 206,
+            MessageType::MessageType_MoneroGetWatchKey => 207,
+            MessageType::MessageType_MoneroWatchKey => 208,
+            MessageType::MessageType_DebugMoneroDiagRequest => 209,
+            MessageType::MessageType_DebugMoneroDiagAck => 210,
+            MessageType::MessageType_MoneroGetTxKeyRequest => 211,
+            MessageType::MessageType_MoneroGetTxKeyAck => 212,
+            MessageType::MessageType_MoneroLiveRefreshStartRequest => 213,
+            MessageType::MessageType_MoneroLiveRefreshStartAck => 214,
+            MessageType::MessageType_MoneroLiveRefreshStepRequest => 215,
+            MessageType::MessageType_MoneroLiveRefreshStepAck => 216,
+            MessageType::MessageType_MoneroLiveRefreshFinalRequest => 217,
+            MessageType::MessageType_MoneroLiveRefreshFinalAck => 218,
+            MessageType::MessageType_EosGetPublicKey => 219,
+            MessageType::MessageType_EosPublicKey => 220,
+            MessageType::MessageType_EosSignTx => 221,
+            MessageType::MessageType_EosTxActionRequest => 222,
+            MessageType::MessageType_EosTxActionAck => 223,
+            MessageType::MessageType_EosSignedTx => 224,
+            MessageType::MessageType_BinanceGetAddress => 225,
+            MessageType::MessageType_BinanceAddress => 226,
+            MessageType::MessageType_BinanceGetPublicKey => 227,
+            MessageType::MessageType_BinancePublicKey => 228,
+            MessageType::MessageType_BinanceSignTx => 229,
+            MessageType::MessageType_BinanceTxRequest => 230,
+            MessageType::MessageType_BinanceTransferMsg => 231,
+            MessageType::MessageType_BinanceOrderMsg => 232,
+            MessageType::MessageType_BinanceCancelMsg => 233,
+            MessageType::MessageType_BinanceSignedTx => 234,
+            MessageType::MessageType_WebAuthnListResidentCredentials => 235,
+            MessageType::MessageType_WebAuthnCredentials => 236,
+            MessageType::MessageType_WebAuthnAddResidentCredential => 237,
+            MessageType::MessageType_WebAuthnRemoveResidentCredential => 238,
+            MessageType::MessageType_SolanaGetPublicKey => 239,
+            MessageType::MessageType_SolanaPublicKey => 240,
+            MessageType::MessageType_SolanaGetAddress => 241,
+            MessageType::MessageType_SolanaAddress => 242,
+            MessageType::MessageType_SolanaSignTx => 243,
+            MessageType::MessageType_SolanaTxSignature => 244,
+            MessageType::MessageType_NostrGetPubkey => 245,
+            MessageType::MessageType_NostrPubkey => 246,
+            MessageType::MessageType_NostrSignEvent => 247,
+            MessageType::MessageType_NostrEventSignature => 248,
+            MessageType::MessageType_BenchmarkListNames => 249,
+            MessageType::MessageType_BenchmarkNames => 250,
+            MessageType::MessageType_BenchmarkRun => 251,
+            MessageType::MessageType_BenchmarkResult => 252,
         };
         Self::enum_descriptor().value_by_index(index)
     }
@@ -1585,7 +1597,7 @@ impl MessageType {
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
-    \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\x86W\
+    \n\x0emessages.proto\x12\x12hw.trezor.messages\x1a\roptions.proto*\xd4W\
     \n\x0bMessageType\x12(\n\x16MessageType_Initialize\x10\0\x1a\x0c\x80\xa6\
     \x1d\x01\xb0\xb5\x18\x01\x90\xb5\x18\x01\x12\x1e\n\x10MessageType_Ping\
     \x10\x01\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12%\n\x13MessageType_S\
@@ -1659,37 +1671,39 @@ static file_descriptor_proto_data: &'static [u8] = b"\
     \x18\x01\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12-\n\x1bMessageType_FirmwareR\
     equest\x10\x08\x1a\x0c\xb8\xb5\x18\x01\x80\xa6\x1d\x01\x98\xb5\x18\x01\
     \x12(\n\x16MessageType_ProdTestT1\x10\x20\x1a\x0c\xb8\xb5\x18\x01\x80\
-    \xa6\x1d\x01\x90\xb5\x18\x01\x12&\n\x18MessageType_GetPublicKey\x10\x0b\
-    \x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12#\n\x15MessageType_PublicKey\
-    \x10\x0c\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12\x20\n\x12MessageTyp\
-    e_SignTx\x10\x0f\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12#\n\x15Messa\
-    geType_TxRequest\x10\x15\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12\x1f\
-    \n\x11MessageType_TxAck\x10\x16\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\
-    \x12$\n\x16MessageType_GetAddress\x10\x1d\x1a\x08\x80\xa6\x1d\x01\x90\
-    \xb5\x18\x01\x12!\n\x13MessageType_Address\x10\x1e\x1a\x08\x80\xa6\x1d\
-    \x01\x98\xb5\x18\x01\x12)\n\x1fMessageType_TxAckPaymentRequest\x10%\x1a\
-    \x04\x90\xb5\x18\x01\x12%\n\x17MessageType_SignMessage\x10&\x1a\x08\x80\
-    \xa6\x1d\x01\x90\xb5\x18\x01\x12'\n\x19MessageType_VerifyMessage\x10'\
-    \x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12*\n\x1cMessageType_MessageSi\
-    gnature\x10(\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12(\n\x1aMessageTy\
-    pe_GetOwnershipId\x10+\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12%\n\
-    \x17MessageType_OwnershipId\x10,\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\
-    \x12+\n\x1dMessageType_GetOwnershipProof\x101\x1a\x08\x80\xa6\x1d\x01\
-    \x90\xb5\x18\x01\x12(\n\x1aMessageType_OwnershipProof\x102\x1a\x08\x80\
-    \xa6\x1d\x01\x98\xb5\x18\x01\x12+\n\x1dMessageType_AuthorizeCoinJoin\x10\
-    3\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMessageType_CipherKe\
-    yValue\x10\x17\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12*\n\x1cMessage\
-    Type_CipheredKeyValue\x100\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12&\
-    \n\x18MessageType_SignIdentity\x105\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\
-    \x01\x12(\n\x1aMessageType_SignedIdentity\x106\x1a\x08\x80\xa6\x1d\x01\
-    \x98\xb5\x18\x01\x12+\n\x1dMessageType_GetECDHSessionKey\x10=\x1a\x08\
-    \x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMessageType_ECDHSessionKey\
-    \x10>\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x123\n\x1dMessageType_Debu\
-    gLinkDecision\x10d\x1a\x10\xc0\xb5\x18\x01\xb0\xb5\x18\x01\x80\xa6\x1d\
-    \x01\xa0\xb5\x18\x01\x12/\n\x1dMessageType_DebugLinkGetState\x10e\x1a\
-    \x0c\x80\xa6\x1d\x01\xb0\xb5\x18\x01\xa0\xb5\x18\x01\x12(\n\x1aMessageTy\
-    pe_DebugLinkState\x10f\x1a\x08\x80\xa6\x1d\x01\xa8\xb5\x18\x01\x12'\n\
-    \x19MessageType_DebugLinkStop\x10g\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\
+    \xa6\x1d\x01\x90\xb5\x18\x01\x12%\n\x16MessageType_EraseBonds\x10\xc6>\
+    \x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12%\n\x16MessageType_Disconnec\
+    t\x10\xc7>\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12&\n\x18MessageType\
+    _GetPublicKey\x10\x0b\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12#\n\x15\
+    MessageType_PublicKey\x10\x0c\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\
+    \x12\x20\n\x12MessageType_SignTx\x10\x0f\x1a\x08\x80\xa6\x1d\x01\x90\xb5\
+    \x18\x01\x12#\n\x15MessageType_TxRequest\x10\x15\x1a\x08\x80\xa6\x1d\x01\
+    \x98\xb5\x18\x01\x12\x1f\n\x11MessageType_TxAck\x10\x16\x1a\x08\x80\xa6\
+    \x1d\x01\x90\xb5\x18\x01\x12$\n\x16MessageType_GetAddress\x10\x1d\x1a\
+    \x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12!\n\x13MessageType_Address\x10\
+    \x1e\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12)\n\x1fMessageType_TxAck\
+    PaymentRequest\x10%\x1a\x04\x90\xb5\x18\x01\x12%\n\x17MessageType_SignMe\
+    ssage\x10&\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12'\n\x19MessageType\
+    _VerifyMessage\x10'\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12*\n\x1cMe\
+    ssageType_MessageSignature\x10(\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\
+    \x12(\n\x1aMessageType_GetOwnershipId\x10+\x1a\x08\x80\xa6\x1d\x01\x90\
+    \xb5\x18\x01\x12%\n\x17MessageType_OwnershipId\x10,\x1a\x08\x80\xa6\x1d\
+    \x01\x98\xb5\x18\x01\x12+\n\x1dMessageType_GetOwnershipProof\x101\x1a\
+    \x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMessageType_OwnershipProo\
+    f\x102\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x12+\n\x1dMessageType_Aut\
+    horizeCoinJoin\x103\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMe\
+    ssageType_CipherKeyValue\x10\x17\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\
+    \x12*\n\x1cMessageType_CipheredKeyValue\x100\x1a\x08\x80\xa6\x1d\x01\x98\
+    \xb5\x18\x01\x12&\n\x18MessageType_SignIdentity\x105\x1a\x08\x80\xa6\x1d\
+    \x01\x90\xb5\x18\x01\x12(\n\x1aMessageType_SignedIdentity\x106\x1a\x08\
+    \x80\xa6\x1d\x01\x98\xb5\x18\x01\x12+\n\x1dMessageType_GetECDHSessionKey\
+    \x10=\x1a\x08\x80\xa6\x1d\x01\x90\xb5\x18\x01\x12(\n\x1aMessageType_ECDH\
+    SessionKey\x10>\x1a\x08\x80\xa6\x1d\x01\x98\xb5\x18\x01\x123\n\x1dMessag\
+    eType_DebugLinkDecision\x10d\x1a\x10\xc0\xb5\x18\x01\xb0\xb5\x18\x01\x80\
+    \xa6\x1d\x01\xa0\xb5\x18\x01\x12/\n\x1dMessageType_DebugLinkGetState\x10\
+    e\x1a\x0c\x80\xa6\x1d\x01\xb0\xb5\x18\x01\xa0\xb5\x18\x01\x12(\n\x1aMess\
+    ageType_DebugLinkState\x10f\x1a\x08\x80\xa6\x1d\x01\xa8\xb5\x18\x01\x12'\
+    \n\x19MessageType_DebugLinkStop\x10g\x1a\x08\x80\xa6\x1d\x01\xa0\xb5\x18\
     \x01\x12&\n\x18MessageType_DebugLinkLog\x10h\x1a\x08\x80\xa6\x1d\x01\xa8\
     \xb5\x18\x01\x12-\n\x1fMessageType_DebugLinkMemoryRead\x10n\x1a\x08\x80\
     \xa6\x1d\x01\xa0\xb5\x18\x01\x12)\n\x1bMessageType_DebugLinkMemory\x10o\
diff --git a/rust/trezor-client/src/protos/generated/messages_ble.rs b/rust/trezor-client/src/protos/generated/messages_ble.rs
new file mode 100644
index 0000000000..a5cc67c4a2
--- /dev/null
+++ b/rust/trezor-client/src/protos/generated/messages_ble.rs
@@ -0,0 +1,269 @@
+// This file is generated by rust-protobuf 3.3.0. Do not edit
+// .proto file is parsed by protoc 3.19.6
+// @generated
+
+// https://github.com/rust-lang/rust-clippy/issues/702
+#![allow(unknown_lints)]
+#![allow(clippy::all)]
+
+#![allow(unused_attributes)]
+#![cfg_attr(rustfmt, rustfmt::skip)]
+
+#![allow(box_pointers)]
+#![allow(dead_code)]
+#![allow(missing_docs)]
+#![allow(non_camel_case_types)]
+#![allow(non_snake_case)]
+#![allow(non_upper_case_globals)]
+#![allow(trivial_casts)]
+#![allow(unused_results)]
+#![allow(unused_mut)]
+
+//! Generated file from `messages-ble.proto`
+
+/// Generated files are compatible only with the same version
+/// of protobuf runtime.
+const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_3_0;
+
+// @@protoc_insertion_point(message:hw.trezor.messages.ble.EraseBonds)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct EraseBonds {
+    // special fields
+    // @@protoc_insertion_point(special_field:hw.trezor.messages.ble.EraseBonds.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a EraseBonds {
+    fn default() -> &'a EraseBonds {
+        <EraseBonds as ::protobuf::Message>::default_instance()
+    }
+}
+
+impl EraseBonds {
+    pub fn new() -> EraseBonds {
+        ::std::default::Default::default()
+    }
+
+    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(0);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<EraseBonds>(
+            "EraseBonds",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl ::protobuf::Message for EraseBonds {
+    const NAME: &'static str = "EraseBonds";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> EraseBonds {
+        EraseBonds::new()
+    }
+
+    fn clear(&mut self) {
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static EraseBonds {
+        static instance: EraseBonds = EraseBonds {
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
+    }
+}
+
+impl ::protobuf::MessageFull for EraseBonds {
+    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
+        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("EraseBonds").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for EraseBonds {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        ::protobuf::text_format::fmt(self, f)
+    }
+}
+
+impl ::protobuf::reflect::ProtobufValue for EraseBonds {
+    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+// @@protoc_insertion_point(message:hw.trezor.messages.ble.Disconnect)
+#[derive(PartialEq,Clone,Default,Debug)]
+pub struct Disconnect {
+    // special fields
+    // @@protoc_insertion_point(special_field:hw.trezor.messages.ble.Disconnect.special_fields)
+    pub special_fields: ::protobuf::SpecialFields,
+}
+
+impl<'a> ::std::default::Default for &'a Disconnect {
+    fn default() -> &'a Disconnect {
+        <Disconnect as ::protobuf::Message>::default_instance()
+    }
+}
+
+impl Disconnect {
+    pub fn new() -> Disconnect {
+        ::std::default::Default::default()
+    }
+
+    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
+        let mut fields = ::std::vec::Vec::with_capacity(0);
+        let mut oneofs = ::std::vec::Vec::with_capacity(0);
+        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Disconnect>(
+            "Disconnect",
+            fields,
+            oneofs,
+        )
+    }
+}
+
+impl ::protobuf::Message for Disconnect {
+    const NAME: &'static str = "Disconnect";
+
+    fn is_initialized(&self) -> bool {
+        true
+    }
+
+    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
+        while let Some(tag) = is.read_raw_tag_or_eof()? {
+            match tag {
+                tag => {
+                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
+                },
+            };
+        }
+        ::std::result::Result::Ok(())
+    }
+
+    // Compute sizes of nested messages
+    #[allow(unused_variables)]
+    fn compute_size(&self) -> u64 {
+        let mut my_size = 0;
+        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
+        self.special_fields.cached_size().set(my_size as u32);
+        my_size
+    }
+
+    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
+        os.write_unknown_fields(self.special_fields.unknown_fields())?;
+        ::std::result::Result::Ok(())
+    }
+
+    fn special_fields(&self) -> &::protobuf::SpecialFields {
+        &self.special_fields
+    }
+
+    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
+        &mut self.special_fields
+    }
+
+    fn new() -> Disconnect {
+        Disconnect::new()
+    }
+
+    fn clear(&mut self) {
+        self.special_fields.clear();
+    }
+
+    fn default_instance() -> &'static Disconnect {
+        static instance: Disconnect = Disconnect {
+            special_fields: ::protobuf::SpecialFields::new(),
+        };
+        &instance
+    }
+}
+
+impl ::protobuf::MessageFull for Disconnect {
+    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
+        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
+        descriptor.get(|| file_descriptor().message_by_package_relative_name("Disconnect").unwrap()).clone()
+    }
+}
+
+impl ::std::fmt::Display for Disconnect {
+    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
+        ::protobuf::text_format::fmt(self, f)
+    }
+}
+
+impl ::protobuf::reflect::ProtobufValue for Disconnect {
+    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
+}
+
+static file_descriptor_proto_data: &'static [u8] = b"\
+    \n\x12messages-ble.proto\x12\x16hw.trezor.messages.ble\x1a\roptions.prot\
+    o\"\x0c\n\nEraseBonds\"\x0c\n\nDisconnectB;\n#com.satoshilabs.trezor.lib\
+    .protobufB\x10TrezorMessageBLE\x80\xa6\x1d\x01\
+";
+
+/// `FileDescriptorProto` object which was a source for this generated file
+fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
+    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();
+    file_descriptor_proto_lazy.get(|| {
+        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
+    })
+}
+
+/// `FileDescriptor` object which allows dynamic access to files
+pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {
+    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();
+    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();
+    file_descriptor.get(|| {
+        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
+            let mut deps = ::std::vec::Vec::with_capacity(1);
+            deps.push(super::options::file_descriptor().clone());
+            let mut messages = ::std::vec::Vec::with_capacity(2);
+            messages.push(EraseBonds::generated_message_descriptor_data());
+            messages.push(Disconnect::generated_message_descriptor_data());
+            let mut enums = ::std::vec::Vec::with_capacity(0);
+            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(
+                file_descriptor_proto(),
+                deps,
+                messages,
+                enums,
+            )
+        });
+        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
+    })
+}
diff --git a/rust/trezor-client/src/protos/generated/messages_common.rs b/rust/trezor-client/src/protos/generated/messages_common.rs
index 4fd72b22f0..8b6203c811 100644
--- a/rust/trezor-client/src/protos/generated/messages_common.rs
+++ b/rust/trezor-client/src/protos/generated/messages_common.rs
@@ -414,6 +414,8 @@ pub mod failure {
         Failure_WipeCodeMismatch = 13,
         // @@protoc_insertion_point(enum_value:hw.trezor.messages.common.Failure.FailureType.Failure_InvalidSession)
         Failure_InvalidSession = 14,
+        // @@protoc_insertion_point(enum_value:hw.trezor.messages.common.Failure.FailureType.Failure_DeviceIsBusy)
+        Failure_DeviceIsBusy = 15,
         // @@protoc_insertion_point(enum_value:hw.trezor.messages.common.Failure.FailureType.Failure_FirmwareError)
         Failure_FirmwareError = 99,
     }
@@ -441,6 +443,7 @@ pub mod failure {
                 12 => ::std::option::Option::Some(FailureType::Failure_PinMismatch),
                 13 => ::std::option::Option::Some(FailureType::Failure_WipeCodeMismatch),
                 14 => ::std::option::Option::Some(FailureType::Failure_InvalidSession),
+                15 => ::std::option::Option::Some(FailureType::Failure_DeviceIsBusy),
                 99 => ::std::option::Option::Some(FailureType::Failure_FirmwareError),
                 _ => ::std::option::Option::None
             }
@@ -462,6 +465,7 @@ pub mod failure {
                 "Failure_PinMismatch" => ::std::option::Option::Some(FailureType::Failure_PinMismatch),
                 "Failure_WipeCodeMismatch" => ::std::option::Option::Some(FailureType::Failure_WipeCodeMismatch),
                 "Failure_InvalidSession" => ::std::option::Option::Some(FailureType::Failure_InvalidSession),
+                "Failure_DeviceIsBusy" => ::std::option::Option::Some(FailureType::Failure_DeviceIsBusy),
                 "Failure_FirmwareError" => ::std::option::Option::Some(FailureType::Failure_FirmwareError),
                 _ => ::std::option::Option::None
             }
@@ -482,6 +486,7 @@ pub mod failure {
             FailureType::Failure_PinMismatch,
             FailureType::Failure_WipeCodeMismatch,
             FailureType::Failure_InvalidSession,
+            FailureType::Failure_DeviceIsBusy,
             FailureType::Failure_FirmwareError,
         ];
     }
@@ -508,7 +513,8 @@ pub mod failure {
                 FailureType::Failure_PinMismatch => 11,
                 FailureType::Failure_WipeCodeMismatch => 12,
                 FailureType::Failure_InvalidSession => 13,
-                FailureType::Failure_FirmwareError => 14,
+                FailureType::Failure_DeviceIsBusy => 14,
+                FailureType::Failure_FirmwareError => 15,
             };
             Self::enum_descriptor().value_by_index(index)
         }
@@ -2481,9 +2487,9 @@ impl ::protobuf::reflect::ProtobufValue for HDNodeType {
 static file_descriptor_proto_data: &'static [u8] = b"\
     \n\x15messages-common.proto\x12\x19hw.trezor.messages.common\x1a\roption\
     s.proto\"%\n\x07Success\x12\x1a\n\x07message\x18\x01\x20\x01(\t:\0R\x07m\
-    essage\"\x8f\x04\n\x07Failure\x12B\n\x04code\x18\x01\x20\x01(\x0e2..hw.t\
+    essage\"\xa9\x04\n\x07Failure\x12B\n\x04code\x18\x01\x20\x01(\x0e2..hw.t\
     rezor.messages.common.Failure.FailureTypeR\x04code\x12\x18\n\x07message\
-    \x18\x02\x20\x01(\tR\x07message\"\xa5\x03\n\x0bFailureType\x12\x1d\n\x19\
+    \x18\x02\x20\x01(\tR\x07message\"\xbf\x03\n\x0bFailureType\x12\x1d\n\x19\
     Failure_UnexpectedMessage\x10\x01\x12\x1a\n\x16Failure_ButtonExpected\
     \x10\x02\x12\x15\n\x11Failure_DataError\x10\x03\x12\x1b\n\x17Failure_Act\
     ionCancelled\x10\x04\x12\x17\n\x13Failure_PinExpected\x10\x05\x12\x18\n\
@@ -2492,44 +2498,45 @@ static file_descriptor_proto_data: &'static [u8] = b"\
     essError\x10\t\x12\x1a\n\x16Failure_NotEnoughFunds\x10\n\x12\x1a\n\x16Fa\
     ilure_NotInitialized\x10\x0b\x12\x17\n\x13Failure_PinMismatch\x10\x0c\
     \x12\x1c\n\x18Failure_WipeCodeMismatch\x10\r\x12\x1a\n\x16Failure_Invali\
-    dSession\x10\x0e\x12\x19\n\x15Failure_FirmwareError\x10c\"\xab\x06\n\rBu\
-    ttonRequest\x12N\n\x04code\x18\x01\x20\x01(\x0e2:.hw.trezor.messages.com\
-    mon.ButtonRequest.ButtonRequestTypeR\x04code\x12\x14\n\x05pages\x18\x02\
-    \x20\x01(\rR\x05pages\x12\x12\n\x04name\x18\x04\x20\x01(\tR\x04name\"\
-    \x99\x05\n\x11ButtonRequestType\x12\x17\n\x13ButtonRequest_Other\x10\x01\
-    \x12\"\n\x1eButtonRequest_FeeOverThreshold\x10\x02\x12\x1f\n\x1bButtonRe\
-    quest_ConfirmOutput\x10\x03\x12\x1d\n\x19ButtonRequest_ResetDevice\x10\
-    \x04\x12\x1d\n\x19ButtonRequest_ConfirmWord\x10\x05\x12\x1c\n\x18ButtonR\
-    equest_WipeDevice\x10\x06\x12\x1d\n\x19ButtonRequest_ProtectCall\x10\x07\
-    \x12\x18\n\x14ButtonRequest_SignTx\x10\x08\x12\x1f\n\x1bButtonRequest_Fi\
-    rmwareCheck\x10\t\x12\x19\n\x15ButtonRequest_Address\x10\n\x12\x1b\n\x17\
-    ButtonRequest_PublicKey\x10\x0b\x12#\n\x1fButtonRequest_MnemonicWordCoun\
-    t\x10\x0c\x12\x1f\n\x1bButtonRequest_MnemonicInput\x10\r\x120\n(_Depreca\
-    ted_ButtonRequest_PassphraseType\x10\x0e\x1a\x02\x08\x01\x12'\n#ButtonRe\
-    quest_UnknownDerivationPath\x10\x0f\x12\"\n\x1eButtonRequest_RecoveryHom\
-    epage\x10\x10\x12\x19\n\x15ButtonRequest_Success\x10\x11\x12\x19\n\x15Bu\
-    ttonRequest_Warning\x10\x12\x12!\n\x1dButtonRequest_PassphraseEntry\x10\
-    \x13\x12\x1a\n\x16ButtonRequest_PinEntry\x10\x14J\x04\x08\x03\x10\x04\"\
-    \x0b\n\tButtonAck\"\xbb\x02\n\x10PinMatrixRequest\x12T\n\x04type\x18\x01\
-    \x20\x01(\x0e2@.hw.trezor.messages.common.PinMatrixRequest.PinMatrixRequ\
-    estTypeR\x04type\"\xd0\x01\n\x14PinMatrixRequestType\x12\x20\n\x1cPinMat\
-    rixRequestType_Current\x10\x01\x12!\n\x1dPinMatrixRequestType_NewFirst\
-    \x10\x02\x12\"\n\x1ePinMatrixRequestType_NewSecond\x10\x03\x12&\n\"PinMa\
-    trixRequestType_WipeCodeFirst\x10\x04\x12'\n#PinMatrixRequestType_WipeCo\
-    deSecond\x10\x05\"\x20\n\x0cPinMatrixAck\x12\x10\n\x03pin\x18\x01\x20\
-    \x02(\tR\x03pin\"5\n\x11PassphraseRequest\x12\x20\n\n_on_device\x18\x01\
-    \x20\x01(\x08R\x08OnDeviceB\x02\x18\x01\"g\n\rPassphraseAck\x12\x1e\n\np\
-    assphrase\x18\x01\x20\x01(\tR\npassphrase\x12\x19\n\x06_state\x18\x02\
-    \x20\x01(\x0cR\x05StateB\x02\x18\x01\x12\x1b\n\ton_device\x18\x03\x20\
-    \x01(\x08R\x08onDevice\"=\n!Deprecated_PassphraseStateRequest\x12\x14\n\
-    \x05state\x18\x01\x20\x01(\x0cR\x05state:\x02\x18\x01\"#\n\x1dDeprecated\
-    _PassphraseStateAck:\x02\x18\x01\"\xc0\x01\n\nHDNodeType\x12\x14\n\x05de\
-    pth\x18\x01\x20\x02(\rR\x05depth\x12\x20\n\x0bfingerprint\x18\x02\x20\
-    \x02(\rR\x0bfingerprint\x12\x1b\n\tchild_num\x18\x03\x20\x02(\rR\x08chil\
-    dNum\x12\x1d\n\nchain_code\x18\x04\x20\x02(\x0cR\tchainCode\x12\x1f\n\
-    \x0bprivate_key\x18\x05\x20\x01(\x0cR\nprivateKey\x12\x1d\n\npublic_key\
-    \x18\x06\x20\x02(\x0cR\tpublicKeyB>\n#com.satoshilabs.trezor.lib.protobu\
-    fB\x13TrezorMessageCommon\x80\xa6\x1d\x01\
+    dSession\x10\x0e\x12\x18\n\x14Failure_DeviceIsBusy\x10\x0f\x12\x19\n\x15\
+    Failure_FirmwareError\x10c\"\xab\x06\n\rButtonRequest\x12N\n\x04code\x18\
+    \x01\x20\x01(\x0e2:.hw.trezor.messages.common.ButtonRequest.ButtonReques\
+    tTypeR\x04code\x12\x14\n\x05pages\x18\x02\x20\x01(\rR\x05pages\x12\x12\n\
+    \x04name\x18\x04\x20\x01(\tR\x04name\"\x99\x05\n\x11ButtonRequestType\
+    \x12\x17\n\x13ButtonRequest_Other\x10\x01\x12\"\n\x1eButtonRequest_FeeOv\
+    erThreshold\x10\x02\x12\x1f\n\x1bButtonRequest_ConfirmOutput\x10\x03\x12\
+    \x1d\n\x19ButtonRequest_ResetDevice\x10\x04\x12\x1d\n\x19ButtonRequest_C\
+    onfirmWord\x10\x05\x12\x1c\n\x18ButtonRequest_WipeDevice\x10\x06\x12\x1d\
+    \n\x19ButtonRequest_ProtectCall\x10\x07\x12\x18\n\x14ButtonRequest_SignT\
+    x\x10\x08\x12\x1f\n\x1bButtonRequest_FirmwareCheck\x10\t\x12\x19\n\x15Bu\
+    ttonRequest_Address\x10\n\x12\x1b\n\x17ButtonRequest_PublicKey\x10\x0b\
+    \x12#\n\x1fButtonRequest_MnemonicWordCount\x10\x0c\x12\x1f\n\x1bButtonRe\
+    quest_MnemonicInput\x10\r\x120\n(_Deprecated_ButtonRequest_PassphraseTyp\
+    e\x10\x0e\x1a\x02\x08\x01\x12'\n#ButtonRequest_UnknownDerivationPath\x10\
+    \x0f\x12\"\n\x1eButtonRequest_RecoveryHomepage\x10\x10\x12\x19\n\x15Butt\
+    onRequest_Success\x10\x11\x12\x19\n\x15ButtonRequest_Warning\x10\x12\x12\
+    !\n\x1dButtonRequest_PassphraseEntry\x10\x13\x12\x1a\n\x16ButtonRequest_\
+    PinEntry\x10\x14J\x04\x08\x03\x10\x04\"\x0b\n\tButtonAck\"\xbb\x02\n\x10\
+    PinMatrixRequest\x12T\n\x04type\x18\x01\x20\x01(\x0e2@.hw.trezor.message\
+    s.common.PinMatrixRequest.PinMatrixRequestTypeR\x04type\"\xd0\x01\n\x14P\
+    inMatrixRequestType\x12\x20\n\x1cPinMatrixRequestType_Current\x10\x01\
+    \x12!\n\x1dPinMatrixRequestType_NewFirst\x10\x02\x12\"\n\x1ePinMatrixReq\
+    uestType_NewSecond\x10\x03\x12&\n\"PinMatrixRequestType_WipeCodeFirst\
+    \x10\x04\x12'\n#PinMatrixRequestType_WipeCodeSecond\x10\x05\"\x20\n\x0cP\
+    inMatrixAck\x12\x10\n\x03pin\x18\x01\x20\x02(\tR\x03pin\"5\n\x11Passphra\
+    seRequest\x12\x20\n\n_on_device\x18\x01\x20\x01(\x08R\x08OnDeviceB\x02\
+    \x18\x01\"g\n\rPassphraseAck\x12\x1e\n\npassphrase\x18\x01\x20\x01(\tR\n\
+    passphrase\x12\x19\n\x06_state\x18\x02\x20\x01(\x0cR\x05StateB\x02\x18\
+    \x01\x12\x1b\n\ton_device\x18\x03\x20\x01(\x08R\x08onDevice\"=\n!Depreca\
+    ted_PassphraseStateRequest\x12\x14\n\x05state\x18\x01\x20\x01(\x0cR\x05s\
+    tate:\x02\x18\x01\"#\n\x1dDeprecated_PassphraseStateAck:\x02\x18\x01\"\
+    \xc0\x01\n\nHDNodeType\x12\x14\n\x05depth\x18\x01\x20\x02(\rR\x05depth\
+    \x12\x20\n\x0bfingerprint\x18\x02\x20\x02(\rR\x0bfingerprint\x12\x1b\n\t\
+    child_num\x18\x03\x20\x02(\rR\x08childNum\x12\x1d\n\nchain_code\x18\x04\
+    \x20\x02(\x0cR\tchainCode\x12\x1f\n\x0bprivate_key\x18\x05\x20\x01(\x0cR\
+    \nprivateKey\x12\x1d\n\npublic_key\x18\x06\x20\x02(\x0cR\tpublicKeyB>\n#\
+    com.satoshilabs.trezor.lib.protobufB\x13TrezorMessageCommon\x80\xa6\x1d\
+    \x01\
 ";
 
 /// `FileDescriptorProto` object which was a source for this generated file