diff --git a/lib/types/tunnelbroker/message-to-tunnelbroker-request-types.js b/lib/types/tunnelbroker/message-to-tunnelbroker-request-types.js
new file mode 100644
--- /dev/null
+++ b/lib/types/tunnelbroker/message-to-tunnelbroker-request-types.js
@@ -0,0 +1,19 @@
+// @flow
+
+import type { TInterface } from 'tcomb';
+import t from 'tcomb';
+
+import { tShape, tString } from '../../utils/validation-utils.js';
+
+export type MessageToTunnelbrokerRequest = {
+  +type: 'MessageToTunnelbrokerRequest',
+  +clientMessageID: string,
+  +payload: string,
+};
+
+export const messageToTunnelbrokerRequestValidator: TInterface<MessageToTunnelbrokerRequest> =
+  tShape<MessageToTunnelbrokerRequest>({
+    type: tString('MessageToTunnelbrokerRequest'),
+    clientMessageID: t.String,
+    payload: t.String,
+  });
diff --git a/lib/types/tunnelbroker/messages.js b/lib/types/tunnelbroker/messages.js
--- a/lib/types/tunnelbroker/messages.js
+++ b/lib/types/tunnelbroker/messages.js
@@ -19,6 +19,10 @@
   type MessageToDevice,
   messageToDeviceValidator,
 } from './message-to-device-types.js';
+import {
+  type MessageToTunnelbrokerRequest,
+  messageToTunnelbrokerRequestValidator,
+} from './message-to-tunnelbroker-request-types.js';
 import {
   type ConnectionInitializationMessage,
   connectionInitializationMessageValidator,
@@ -49,6 +53,7 @@
   ANONYMOUS_INITIALIZATION_MESSAGE: 'AnonymousInitializationMessage',
   MESSAGE_TO_DEVICE_REQUEST_STATUS: 'MessageToDeviceRequestStatus',
   MESSAGE_TO_DEVICE_REQUEST: 'MessageToDeviceRequest',
+  MESSAGE_TO_TUNNELBROKER_REQUEST: 'MessageToTunnelbrokerRequest',
   MESSAGE_TO_DEVICE: 'MessageToDevice',
   MESSAGE_RECEIVE_CONFIRMATION: 'MessageReceiveConfirmation',
   HEARTBEAT: 'Heartbeat',
@@ -63,6 +68,7 @@
     messageToDeviceValidator,
     messageReceiveConfirmationValidator,
     heartbeatValidator,
+    messageToTunnelbrokerRequestValidator,
   ]);
 
 export type TunnelbrokerMessage =
@@ -72,4 +78,5 @@
   | MessageToDeviceRequest
   | MessageToDevice
   | MessageReceiveConfirmation
-  | Heartbeat;
+  | Heartbeat
+  | MessageToTunnelbrokerRequest;
diff --git a/shared/tunnelbroker_messages/src/messages/message_to_tunnelbroker_request.rs b/shared/tunnelbroker_messages/src/messages/message_to_tunnelbroker_request.rs
new file mode 100644
--- /dev/null
+++ b/shared/tunnelbroker_messages/src/messages/message_to_tunnelbroker_request.rs
@@ -0,0 +1,11 @@
+//! Message sent from device to Tunnelbroker.
+
+use serde::{Deserialize, Serialize};
+
+#[derive(Serialize, Deserialize, PartialEq, Debug)]
+#[serde(tag = "type", rename_all = "camelCase")]
+pub struct MessageToTunnelbrokerRequest {
+  #[serde(rename = "clientMessageID")]
+  pub client_message_id: String,
+  pub payload: String,
+}
diff --git a/shared/tunnelbroker_messages/src/messages/mod.rs b/shared/tunnelbroker_messages/src/messages/mod.rs
--- a/shared/tunnelbroker_messages/src/messages/mod.rs
+++ b/shared/tunnelbroker_messages/src/messages/mod.rs
@@ -6,6 +6,7 @@
 pub mod message_to_device;
 pub mod message_to_device_request;
 pub mod message_to_device_request_status;
+pub mod message_to_tunnelbroker_request;
 pub mod session;
 
 pub use device_list_updated::*;
@@ -14,6 +15,7 @@
 pub use message_to_device::*;
 pub use message_to_device_request::*;
 pub use message_to_device_request_status::*;
+pub use message_to_tunnelbroker_request::*;
 pub use session::*;
 pub use websocket_messages::{
   ConnectionInitializationResponse, ConnectionInitializationStatus, Heartbeat,
@@ -42,6 +44,7 @@
   MessageToDeviceRequest(MessageToDeviceRequest),
   MessageToDevice(MessageToDevice),
   MessageReceiveConfirmation(MessageReceiveConfirmation),
+  MessageToTunnelbrokerRequest(MessageToTunnelbrokerRequest),
   Heartbeat(Heartbeat),
   IdentityDeviceListUpdated(IdentityDeviceListUpdated),
 }
@@ -52,3 +55,7 @@
   RefreshKeysRequest(RefreshKeyRequest),
   IdentityDeviceListUpdated(IdentityDeviceListUpdated),
 }
+
+#[derive(Serialize, Deserialize, Debug)]
+#[serde(untagged)]
+pub enum MessageToTunnelbroker {}