diff --git a/west/trezor/trezor-ble/prj.conf b/west/trezor/trezor-ble/prj.conf
index c2b2b478a6..5c0459b66c 100644
--- a/west/trezor/trezor-ble/prj.conf
+++ b/west/trezor/trezor-ble/prj.conf
@@ -36,7 +36,8 @@ CONFIG_POWEROFF=y
 
 CONFIG_BT=y
 CONFIG_BT_PERIPHERAL=y
-CONFIG_BT_DEVICE_NAME="Trezor T3W1"
+CONFIG_BT_DEVICE_NAME="Trezor BLE"
+CONFIG_BT_DEVICE_NAME_DYNAMIC=y
 CONFIG_BT_DEVICE_APPEARANCE=833
 CONFIG_BT_MAX_CONN=1
 CONFIG_BT_MAX_PAIRED=8
diff --git a/west/trezor/trezor-ble/src/ble/advertising.c b/west/trezor/trezor-ble/src/ble/advertising.c
index 0ceed6f1e3..0e8f5045fb 100644
--- a/west/trezor/trezor-ble/src/ble/advertising.c
+++ b/west/trezor/trezor-ble/src/ble/advertising.c
@@ -37,10 +37,7 @@ bool advertising_wl = false;
 
 uint8_t manufacturer_data[8] = {0xff, 0xff, 0, 0, 'T', '3', 'W', '1'};
 
-static const struct bt_data advertising_data[] = {
-    BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
-    BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
-};
+static struct bt_data advertising_data[2];
 
 static const struct bt_data scan_response_data[] = {
     BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_TRZ_VAL),
@@ -64,22 +61,29 @@ void advertising_setup_wl(void) {
   bt_foreach_bond(BT_ID_DEFAULT, add_to_whitelist, NULL);
 }
 
-void advertising_start(bool wl) {
+void advertising_start(bool wl, uint8_t color, char *name, int name_len) {
   if (advertising) {
-    if (wl != advertising_wl) {
-      LOG_WRN("Restarting advertising");
-      bt_le_adv_stop();
-    } else {
-      LOG_WRN("Already advertising");
-
-      management_send_status_event();
-      return;
-    }
+    LOG_WRN("Restarting advertising");
+    bt_le_adv_stop();
   }
-
   int err;
 
-  manufacturer_data[3] = 0x03;  // todo color
+  manufacturer_data[3] = color;
+
+  advertising_data[0].type = BT_DATA_FLAGS;
+  advertising_data[0].data_len = 1;
+  static const uint8_t flags = (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR);
+  advertising_data[0].data = &flags;
+
+  /* Fill second element for the name */
+  advertising_data[1].type = BT_DATA_NAME_COMPLETE;
+  advertising_data[1].data_len = name_len;
+  advertising_data[1].data = (const uint8_t *)name;
+
+  char gap_name[21] = {0};
+  memcpy(gap_name, name, name_len);
+
+  bt_set_name(gap_name);
 
   if (wl) {
     advertising_setup_wl();
diff --git a/west/trezor/trezor-ble/src/ble/ble.c b/west/trezor/trezor-ble/src/ble/ble.c
index 38a2731c3a..5bf829deac 100644
--- a/west/trezor/trezor-ble/src/ble/ble.c
+++ b/west/trezor/trezor-ble/src/ble/ble.c
@@ -73,8 +73,6 @@ bool ble_init(void) {
     return 0;
   }
 
-  bt_set_name("TrezorGAP");
-
   advertising_init();
   management_init();
 
diff --git a/west/trezor/trezor-ble/src/ble/ble_internal.h b/west/trezor/trezor-ble/src/ble/ble_internal.h
index 7d21517ad5..4de37ce101 100644
--- a/west/trezor/trezor-ble/src/ble/ble_internal.h
+++ b/west/trezor/trezor-ble/src/ble/ble_internal.h
@@ -106,7 +106,7 @@ bool bonds_erase_current(void);
 // Initialization
 void advertising_init(void);
 // Start advertising, with or without whitelist
-void advertising_start(bool wl);
+void advertising_start(bool wl, uint8_t color, char *name, int name_len);
 // Stop advertising
 void advertising_stop(void);
 // Check if advertising is active
diff --git a/west/trezor/trezor-ble/src/ble/management.c b/west/trezor/trezor-ble/src/ble/management.c
index e15e095bc8..3995e603a2 100644
--- a/west/trezor/trezor-ble/src/ble/management.c
+++ b/west/trezor/trezor-ble/src/ble/management.c
@@ -62,15 +62,15 @@ void management_send_status_event(void) {
 
 void management_send_success_event(void) {
   uint8_t tx_data[] = {
-    INTERNAL_EVENT_SUCCESS,
-};
+      INTERNAL_EVENT_SUCCESS,
+  };
   trz_comm_send_msg(NRF_SERVICE_BLE_MANAGER, tx_data, sizeof(tx_data));
 }
 
 void management_send_failure_event(void) {
   uint8_t tx_data[] = {
-    INTERNAL_EVENT_FAILURE,
-};
+      INTERNAL_EVENT_FAILURE,
+  };
   trz_comm_send_msg(NRF_SERVICE_BLE_MANAGER, tx_data, sizeof(tx_data));
 }
 
@@ -105,9 +105,12 @@ static void process_command(uint8_t *data, uint16_t len) {
       send_respons = false;
       management_send_status_event();
       break;
-    case INTERNAL_CMD_ADVERTISING_ON:
-      advertising_start(data[1] != 0);
-      break;
+    case INTERNAL_CMD_ADVERTISING_ON: {
+      uint8_t color = data[2];
+      char *name = &data[3];
+      int name_len = strnlen(name, 20);
+      advertising_start(data[1] != 0, color, name, name_len);
+    } break;
     case INTERNAL_CMD_ADVERTISING_OFF:
       advertising_stop();
       break;
@@ -121,13 +124,13 @@ static void process_command(uint8_t *data, uint16_t len) {
       break;
     case INTERNAL_CMD_ALLOW_PAIRING:
       pairing_num_comp_reply(true);
-    break;
+      break;
     case INTERNAL_CMD_REJECT_PAIRING:
       pairing_num_comp_reply(false);
-    break;
+      break;
     case INTERNAL_CMD_UNPAIR:
       success = bonds_erase_current();
-    break;
+      break;
     default:
       break;
   }