diff --git a/src/core/cntlr_ubus.c b/src/core/cntlr_ubus.c
index 2ce015f93291927f166f77d72c67e94b8b42d1f3..53e9dd9fa72e877d7875ed3c7ba67280103eb571 100644
--- a/src/core/cntlr_ubus.c
+++ b/src/core/cntlr_ubus.c
@@ -62,6 +62,15 @@ static const struct blobmsg_policy sta_caps_policy_params[__STA_POLICY_MAX] = {
 	[STA_POLICY_BSSID] = { .name = "bssid", .type = BLOBMSG_TYPE_STRING }
 };
 
+enum {
+	CHANNEL_PREF_POLICY_AGENT,
+	__CHANNEL_PREF_POLICY_MAX,
+};
+
+static const struct blobmsg_policy channel_pref_policy_params[__CHANNEL_PREF_POLICY_MAX] = {
+	[CHANNEL_PREF_POLICY_AGENT] = { .name = "agent", .type = BLOBMSG_TYPE_STRING }
+};
+
 static void send_cmdu_cb(struct ubus_request *req,
 				int type, struct blob_attr *msg)
 {
@@ -304,6 +313,46 @@ static int cntlr_ap_caps(struct ubus_context *ctx, struct ubus_object *obj,
 	return 0;
 }
 
+static int cntlr_channel_pref(struct ubus_context *ctx, struct ubus_object *obj,
+			struct ubus_request_data *req, const char *method,
+			struct blob_attr *msg)
+{
+	struct blob_attr *tb[__CHANNEL_PREF_POLICY_MAX];
+	struct controller *c = container_of(obj, struct controller, obj);
+	char agent[18] = {0};
+	struct cmdu_cstruct *cmdu_data;
+
+	cmdu_data = (struct cmdu_cstruct *)calloc(1,
+			sizeof(struct cmdu_cstruct));
+	if (!cmdu_data) {
+		fprintf(stderr, "failed to malloc cmdu\n");
+		return UBUS_STATUS_UNKNOWN_ERROR;
+	}
+
+	blobmsg_parse(channel_pref_policy_params, __CHANNEL_PREF_POLICY_MAX, tb,
+		blob_data(msg), blob_len(msg));
+
+
+	if (tb[CHANNEL_PREF_POLICY_AGENT]) {
+		strncpy(agent, blobmsg_data(tb[CHANNEL_PREF_POLICY_AGENT]),
+			sizeof(agent) - 1);
+		if (!hwaddr_aton(agent, cmdu_data->origin))
+			return UBUS_STATUS_UNKNOWN_ERROR;
+	}
+
+	// TODO: ff:ff:ff:ff:ff:ff = send to all agents
+
+	cmdu_data->message_type = CMDU_CHANNEL_PREFERENCE_QUERY;
+	cmdu_data->message_id = 1;
+
+	cmdu_data->num_tlvs = 0;
+
+	send_cmdu(c, cmdu_data);
+
+	return 0;
+}
+
+
 static int cntlr_sta_caps(struct ubus_context *ctx, struct ubus_object *obj,
 			struct ubus_request_data *req, const char *method,
 			struct blob_attr *msg)
@@ -385,10 +434,11 @@ int cntlr_publish_object(struct controller *c, const char *objname)
 	struct ubus_object *obj;
 	struct ubus_object_type *obj_type;
 	struct ubus_method *obj_methods;
-	struct ubus_method m[3] = {
+	struct ubus_method m[4] = {
 		UBUS_METHOD_NOARG("status", cntlr_status),
 		UBUS_METHOD("ap_caps", cntlr_ap_caps, ap_caps_policy_params),
 		UBUS_METHOD("sta_caps", cntlr_sta_caps, sta_caps_policy_params),
+		UBUS_METHOD("channels", cntlr_channel_pref, channel_pref_policy_params)
 	};
 	int num_methods = ARRAY_SIZE(m);
 	int ret;