diff --git a/spa/plugins/bluez5/backend-native.c b/spa/plugins/bluez5/backend-native.c
index 8144b09..51331a6 100644
--- a/spa/plugins/bluez5/backend-native.c
+++ b/spa/plugins/bluez5/backend-native.c
@@ -422,7 +422,7 @@ static void rfcomm_emit_volume_changed(struct rfcomm *rfcomm, int id, int hw_vol
 static bool rfcomm_hsp_ag(struct rfcomm *rfcomm, char* buf)
 {
 	struct impl *backend = rfcomm->backend;
-	unsigned int gain, dummy;
+	unsigned int gain;
 
 	/* There are only three HSP AT commands:
 	 * AT+VGS=value: value between 0 and 15, sent by the HS to AG to set the speaker gain.
@@ -445,8 +445,9 @@ static bool rfcomm_hsp_ag(struct rfcomm *rfcomm, char* buf)
 			rfcomm_send_reply(rfcomm, "ERROR");
 			spa_log_debug(backend->log, "RFCOMM receive unsupported VGM gain: %s", buf);
 		}
-	} else if (sscanf(buf, "AT+CKPD=%d", &dummy) == 1) {
+	} else if (spa_strstartswith(buf, "AT+CKPD=200") == 1) {
 		rfcomm_send_reply(rfcomm, "OK");
+		spa_bt_device_emit_switch_profile(rfcomm->device);
 	} else {
 		return false;
 	}
diff --git a/spa/plugins/bluez5/bluez5-device.c b/spa/plugins/bluez5/bluez5-device.c
index 8d6ef49..40acd24 100644
--- a/spa/plugins/bluez5/bluez5-device.c
+++ b/spa/plugins/bluez5/bluez5-device.c
@@ -1370,11 +1370,33 @@ static void device_connected(void *userdata, bool connected)
 	}
 }
 
+static void device_switch_profile(void *userdata)
+{
+	struct impl *this = userdata;
+	uint32_t profile;
+
+	switch(this->profile) {
+	case DEVICE_PROFILE_OFF:
+		profile = DEVICE_PROFILE_HSP_HFP;
+		break;
+	case DEVICE_PROFILE_HSP_HFP:
+		profile = DEVICE_PROFILE_OFF;
+		break;
+	default:
+		return;
+	}
+
+	spa_log_debug(this->log, "%p: device switch profile %d -> %d", this, this->profile, profile);
+
+	set_profile(this, profile, 0, false);
+}
+
 static const struct spa_bt_device_events bt_dev_events = {
 	SPA_VERSION_BT_DEVICE_EVENTS,
 	.connected = device_connected,
 	.codec_switched = codec_switched,
 	.profiles_changed = profiles_changed,
+	.switch_profile = device_switch_profile,
 	.device_set_changed = device_set_changed,
 };
 
diff --git a/spa/plugins/bluez5/defs.h b/spa/plugins/bluez5/defs.h
index 81e5164..258b4f6 100644
--- a/spa/plugins/bluez5/defs.h
+++ b/spa/plugins/bluez5/defs.h
@@ -459,6 +459,9 @@ struct spa_bt_device_events {
 	/** Profile configuration changed */
 	void (*profiles_changed) (void *data, uint32_t prev_profiles, uint32_t prev_connected);
 
+	/** Switch profile between OFF and HSP_HFP */
+	void (*switch_profile) (void *data);
+
 	/** Device set configuration changed */
 	void (*device_set_changed) (void *data);
 
@@ -553,6 +556,7 @@ void spa_bt_device_update_last_bluez_action_time(struct spa_bt_device *device);
 #define spa_bt_device_emit_connected(d,...)	        spa_bt_device_emit(d, connected, 0, __VA_ARGS__)
 #define spa_bt_device_emit_codec_switched(d,...)	spa_bt_device_emit(d, codec_switched, 0, __VA_ARGS__)
 #define spa_bt_device_emit_profiles_changed(d,...)	spa_bt_device_emit(d, profiles_changed, 0, __VA_ARGS__)
+#define spa_bt_device_emit_switch_profile(d)		spa_bt_device_emit(d, switch_profile, 0)
 #define spa_bt_device_emit_device_set_changed(d)	spa_bt_device_emit(d, device_set_changed, 0)
 #define spa_bt_device_emit_destroy(d)			spa_bt_device_emit(d, destroy, 0)
 #define spa_bt_device_add_listener(d,listener,events,data)           \
