diff --git a/prj.conf b/prj.conf
index eacd454..e598756 100644
--- a/prj.conf
+++ b/prj.conf
@@ -41,4 +41,6 @@ CONFIG_LOG_PRINTK=n
 CONFIG_ASSERT=y
 
 CONFIG_NCS_BOOT_BANNER=n
-CONFIG_BOOT_BANNER=n
\ No newline at end of file
+CONFIG_BOOT_BANNER=n
+
+CONFIG_BT_CUSTOM_CLIENT_LOG_LEVEL_DBG=y
\ No newline at end of file
diff --git a/src/bt_client/custom_client.c b/src/bt_client/custom_client.c
index a7dffde..f9cbe02 100644
--- a/src/bt_client/custom_client.c
+++ b/src/bt_client/custom_client.c
@@ -16,10 +16,11 @@ LOG_MODULE_REGISTER(custom_c, CONFIG_BT_CUSTOM_CLIENT_LOG_LEVEL);
 enum {
 	CUSTOM_C_INITIALIZED,
 	CUSTOM_C_TX_NOTIF_ENABLED,
+	CUSTOM_C_RX_NOTIF_ENABLED,
 	CUSTOM_C_RX_WRITE_PENDING
 };
 
-static uint8_t on_received(struct bt_conn *conn,
+static uint8_t on_received_tx(struct bt_conn *conn,
 			struct bt_gatt_subscribe_params *params,
 			const void *data, uint16_t length)
 {
@@ -39,8 +40,35 @@ static uint8_t on_received(struct bt_conn *conn,
 	}
 
 	LOG_DBG("[NOTIFICATION] data %p length %u", data, length);
-	if (custom->cb.received) {
-		return custom->cb.received(custom, data, length);
+	if (custom->cb.received_tx) {
+		return custom->cb.received_tx(custom, data, length);
+	}
+
+	return BT_GATT_ITER_CONTINUE;
+}
+
+static uint8_t on_received_rx(struct bt_conn *conn,
+			struct bt_gatt_subscribe_params *params,
+			const void *data, uint16_t length)
+{
+	struct bt_custom_client *custom;
+
+	/* Retrieve CUSTOM Client module context. */
+	custom = CONTAINER_OF(params, struct bt_custom_client, rx_notif_params);
+
+	if (!data) {
+		LOG_DBG("[UNSUBSCRIBED]");
+		params->value_handle = 0;
+		atomic_clear_bit(&custom->state, CUSTOM_C_RX_NOTIF_ENABLED);
+		if (custom->cb.unsubscribed) {
+			custom->cb.unsubscribed(custom);
+		}
+		return BT_GATT_ITER_STOP;
+	}
+
+	LOG_DBG("[NOTIFICATION] data %p length %u", data, length);
+	if (custom->cb.received_rx) {
+		return custom->cb.received_rx(custom, data, length);
 	}
 
 	return BT_GATT_ITER_CONTINUE;
@@ -54,7 +82,7 @@ static void on_sent(struct bt_conn *conn, uint8_t err,
 	uint16_t length;
 
 	/* Retrieve CUSTOM Client module context. */
-	custom_c = CONTAINER_OF(params, struct bt_custom_client, rx_write_params);
+	custom_c = CONTAINER_OF(params, struct bt_custom_client, tx_write_params);
 
 	/* Make a copy of volatile data that is required by the callback. */
 	data = params->data;
@@ -95,13 +123,13 @@ int bt_custom_client_send(struct bt_custom_client *custom_c, const uint8_t *data
 		return -EALREADY;
 	}
 
-	custom_c->rx_write_params.func = on_sent;
-	custom_c->rx_write_params.handle = custom_c->handles.rx;
-	custom_c->rx_write_params.offset = 0;
-	custom_c->rx_write_params.data = data;
-	custom_c->rx_write_params.length = len;
+	custom_c->tx_write_params.func = on_sent;
+	custom_c->tx_write_params.handle = custom_c->handles.rx;
+	custom_c->tx_write_params.offset = 0;
+	custom_c->tx_write_params.data = data;
+	custom_c->tx_write_params.length = len;
 
-	err = bt_gatt_write(custom_c->conn, &custom_c->rx_write_params);
+	err = bt_gatt_write(custom_c->conn, &custom_c->tx_write_params);
 	if (err) {
 		atomic_clear_bit(&custom_c->state, CUSTOM_C_RX_WRITE_PENDING);
 	}
@@ -163,12 +191,22 @@ int bt_custom_handles_assign(struct bt_gatt_dm *dm,
 	LOG_DBG("Found handle for CUSTOM RX characteristic.");
 	custom_c->handles.rx = gatt_desc->handle;
 
+	/* CUSTOM RX CCC */
+	gatt_desc = bt_gatt_dm_desc_by_uuid(dm, gatt_chrc, BT_UUID_GATT_CCC);
+	if (!gatt_desc) {
+		LOG_ERR("Missing CUSTOM TX CCC in characteristic.");
+		return -EINVAL;
+	}
+
+	LOG_DBG("Found handle for CCC of CUSTOM RX characteristic.");
+	custom_c->handles.rx_ccc = gatt_desc->handle;
+
 	/* Assign connection instance. */
 	custom_c->conn = bt_gatt_dm_conn_get(dm);
 	return 0;
 }
 
-int bt_custom_subscribe_receive(struct bt_custom_client *custom_c)
+int bt_custom_subscribe_tx_receive(struct bt_custom_client *custom_c)
 {
 	int err;
 
@@ -176,7 +214,7 @@ int bt_custom_subscribe_receive(struct bt_custom_client *custom_c)
 		return -EALREADY;
 	}
 
-	custom_c->tx_notif_params.notify = on_received;
+	custom_c->tx_notif_params.notify = on_received_tx;
 	custom_c->tx_notif_params.value = BT_GATT_CCC_NOTIFY;
 	custom_c->tx_notif_params.value_handle = custom_c->handles.tx;
 	custom_c->tx_notif_params.ccc_handle = custom_c->handles.tx_ccc;
@@ -193,3 +231,24 @@ int bt_custom_subscribe_receive(struct bt_custom_client *custom_c)
 
 	return err;
 }
+
+int bt_custom_subscribe_rx_receive(struct bt_custom_client *custom_c)
+{
+	int err;
+
+	custom_c->rx_notif_params.notify = on_received_rx;
+	custom_c->rx_notif_params.value = BT_GATT_CCC_NOTIFY;
+	custom_c->rx_notif_params.value_handle = custom_c->handles.rx;
+	custom_c->rx_notif_params.ccc_handle = custom_c->handles.rx_ccc;
+
+
+	err = bt_gatt_subscribe(custom_c->conn, &custom_c->rx_notif_params);
+	if (err) {
+		LOG_ERR("Subscribe failed (err %d)", err);
+		atomic_clear_bit(&custom_c->state, CUSTOM_C_TX_NOTIF_ENABLED);
+	} else {
+		LOG_DBG("[SUBSCRIBED]");
+	}
+
+	return err;
+}
\ No newline at end of file
diff --git a/src/bt_client/custom_client.h b/src/bt_client/custom_client.h
index 303ddf8..062a296 100644
--- a/src/bt_client/custom_client.h
+++ b/src/bt_client/custom_client.h
@@ -48,6 +48,11 @@ struct bt_custom_client_handles {
          */
 	uint16_t rx;
 
+    /** Handle of the CCC descriptor of the CUSTOM RX characteristic,
+	 *  as provided by a discovery.
+     */
+	uint16_t rx_ccc;
+
         /** Handle of the CUSTOM TX characteristic, as provided by
 	 *  a discovery.
          */
@@ -75,7 +80,9 @@ struct bt_custom_client_cb {
 	 * @retval BT_GATT_ITER_CONTINUE To keep notifications enabled.
 	 * @retval BT_GATT_ITER_STOP To disable notifications.
 	 */
-	uint8_t (*received)(struct bt_custom_client *custom, const uint8_t *data, uint16_t len);
+	uint8_t (*received_tx)(struct bt_custom_client *custom, const uint8_t *data, uint16_t len);
+
+	uint8_t (*received_rx)(struct bt_custom_client *custom, const uint8_t *data, uint16_t len);
 
 	/** @brief Data sent callback.
 	 *
@@ -114,8 +121,11 @@ struct bt_custom_client {
         /** GATT subscribe parameters for CUSTOM TX Characteristic. */
 	struct bt_gatt_subscribe_params tx_notif_params;
 
+        /** GATT subscribe parameters for CUSTOM RX Characteristic. */
+	struct bt_gatt_subscribe_params rx_notif_params;
+
         /** GATT write parameters for CUSTOM RX Characteristic. */
-	struct bt_gatt_write_params rx_write_params;
+	struct bt_gatt_write_params tx_write_params;
 
         /** Application callbacks. */
 	struct bt_custom_client_cb cb;
@@ -189,7 +199,9 @@ int bt_custom_handles_assign(struct bt_gatt_dm *dm,
  * @retval 0 If the operation was successful.
  *           Otherwise, a negative error code is returned.
  */
-int bt_custom_subscribe_receive(struct bt_custom_client *custom);
+int bt_custom_subscribe_tx_receive(struct bt_custom_client *custom);
+
+int bt_custom_subscribe_rx_receive(struct bt_custom_client *custom);
 
 #ifdef __cplusplus
 }
diff --git a/src/main.c b/src/main.c
index dcfc7cf..4c65942 100644
--- a/src/main.c
+++ b/src/main.c
@@ -75,7 +75,7 @@ static void ble_data_sent(struct bt_custom_client *custom, uint8_t err,
 	}
 }
 
-static uint8_t ble_data_received(struct bt_custom_client *custom,
+static uint8_t ble_data_received_tx(struct bt_custom_client *custom,
 						const uint8_t *data, uint16_t len)
 {
 	ARG_UNUSED(custom);
@@ -120,6 +120,16 @@ static uint8_t ble_data_received(struct bt_custom_client *custom,
 	return BT_GATT_ITER_CONTINUE;
 }
 
+static uint8_t ble_data_received_rx(struct bt_custom_client *custom,
+						const uint8_t *data, uint16_t len)
+{
+	ARG_UNUSED(custom);
+
+	LOG_INF("Received data from RX characteristic");
+
+	return BT_GATT_ITER_CONTINUE;
+}
+
 static void uart_cb(const struct device *dev, struct uart_event *evt, void *user_data)
 {
 	ARG_UNUSED(dev);
@@ -294,7 +304,8 @@ static void discovery_complete(struct bt_gatt_dm *dm,
 	bt_gatt_dm_data_print(dm);
 
 	bt_custom_handles_assign(dm, custom);
-	bt_custom_subscribe_receive(custom);
+	bt_custom_subscribe_tx_receive(custom);
+	bt_custom_subscribe_rx_receive(custom);
 
 	bt_gatt_dm_data_release(dm);
 }
@@ -380,15 +391,10 @@ static void connected(struct bt_conn *conn, uint8_t conn_err)
 		LOG_WRN("MTU exchange failed (err %d)", err);
 	}
 
-	err = bt_conn_set_security(conn, BT_SECURITY_L2);
-	if (err) {
-		LOG_WRN("Failed to set security: %d", err);
-
-		gatt_discover(conn);
-	}
-
+	gatt_discover(conn);
+	
 	err = bt_scan_stop();
-	if ((!err) && (err != -EALREADY)) {
+	if ((err) && (err != -EALREADY)) {
 		LOG_ERR("Stop LE scan failed (err %d)", err);
 	}
 }
@@ -467,7 +473,8 @@ static int custom_client_init(void)
 	int err;
 	struct bt_custom_client_init_param init = {
 		.cb = {
-			.received = ble_data_received,
+			.received_tx = ble_data_received_tx,
+			.received_rx = ble_data_received_rx,
 			.sent = ble_data_sent,
 		}
 	};
@@ -501,19 +508,17 @@ static int scan_init(void)
 {
 	int err;
 	struct bt_scan_init_param scan_init = {
-		.connect_if_match = 0,
+		.connect_if_match = 1,
 	};
 
 	bt_scan_init(&scan_init);
 	bt_scan_cb_register(&scan_cb);
 
-	//err = bt_scan_filter_add(BT_SCAN_FILTER_TYPE_UUID, BT_UUID_CUSTOM_SERVICE);
-	//if (err) {
-	//	LOG_ERR("Scanning filters cannot be set (err %d)", err);
-	//	return err;
-	//}
-
-
+	err = bt_scan_filter_add(BT_SCAN_FILTER_TYPE_UUID, BT_UUID_CUSTOM_SERVICE);
+	if (err) {
+		LOG_ERR("Scanning filters cannot be set (err %d)", err);
+		return err;
+	}
 
 	bt_addr_le_t addr = {
 		.type = BT_ADDR_LE_RANDOM,
@@ -526,7 +531,7 @@ static int scan_init(void)
 		return err;
 	}
 
-	err = bt_scan_filter_enable(BT_SCAN_ADDR_FILTER, false);
+	err = bt_scan_filter_enable(BT_SCAN_UUID_FILTER, false);
 	if (err) {
 		LOG_ERR("Filters cannot be turned on (err %d)", err);
 		return err;
