diff --git a/lib/types/tunnelbroker/message-to-tunnelbroker-types.js b/lib/types/tunnelbroker/message-to-tunnelbroker-types.js
new file mode 100644
--- /dev/null
+++ b/lib/types/tunnelbroker/message-to-tunnelbroker-types.js
@@ -0,0 +1,10 @@
+// @flow
+
+export const messageToTunnelbrokerTypes = Object.freeze({
+  SET_DEVICE_TOKEN: 'SetDeviceToken',
+});
+
+export type SetDeviceToken = {
+  +type: 'SetDeviceToken',
+  +deviceToken: string,
+};
diff --git a/shared/tunnelbroker_messages/src/messages/message_to_tunnelbroker.rs b/shared/tunnelbroker_messages/src/messages/message_to_tunnelbroker.rs
new file mode 100644
--- /dev/null
+++ b/shared/tunnelbroker_messages/src/messages/message_to_tunnelbroker.rs
@@ -0,0 +1,8 @@
+use serde::{Deserialize, Serialize};
+
+/// Message sent by device to set device token.
+#[derive(Serialize, Deserialize, PartialEq, Debug)]
+#[serde(tag = "type", rename_all = "camelCase")]
+pub struct SetDeviceToken {
+  pub device_token: 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;
 pub mod message_to_tunnelbroker_request;
 pub mod session;
 
@@ -15,6 +16,7 @@
 pub use message_to_device::*;
 pub use message_to_device_request::*;
 pub use message_to_device_request_status::*;
+pub use message_to_tunnelbroker::*;
 pub use message_to_tunnelbroker_request::*;
 pub use session::*;
 pub use websocket_messages::{
@@ -58,4 +60,6 @@
 
 #[derive(Serialize, Deserialize, Debug)]
 #[serde(untagged)]
-pub enum MessageToTunnelbroker {}
+pub enum MessageToTunnelbroker {
+  SetDeviceToken(SetDeviceToken),
+}