diff --git a/src/cmdu_input.c b/src/cmdu_input.c
index f7a7c1b3272f6b6db7e0c897886599665fe792d3..a16130f759dee005ce123a6f44c987530c9d2575 100644
--- a/src/cmdu_input.c
+++ b/src/cmdu_input.c
@@ -170,8 +170,8 @@ int i1905_handle_topology_notification(const char *ifname, uint8_t *from,
 	neigh_set_1905(&((struct i1905_private *)priv)->neigh_q, aladdr_origin);
 
 	/* relay mcast the change notification */
-	ret = i1905_send_cmdu_relay_mcast(priv, ifname, MCAST_1905, iface->aladdr,
-					  ETHERTYPE_1905, rxf);
+	ret = i1905_relay_cmdu(priv, ifname, MCAST_1905, iface->aladdr,
+			       ETHERTYPE_1905, rxf);
 	if (ret)
 		fprintf(stderr, "Error sending relaying TOPOLOGY_CHANGE\n");
 
@@ -472,8 +472,8 @@ int i1905_handle_ap_autoconfig_search(const char *ifname, uint8_t *from,
 	}
 
 	/* relay mcast the received cmdu */
-	ret = i1905_send_cmdu_relay_mcast(priv, ifname, MCAST_1905, rxf->origin,
-					  ETHERTYPE_1905, rxf);
+	ret = i1905_relay_cmdu(priv, ifname, MCAST_1905, rxf->origin,
+			       ETHERTYPE_1905, rxf);
 	if (ret)
 		fprintf(stderr, "Error sending AP_AUTOCONFIG_SEARCH\n");
 
@@ -655,8 +655,8 @@ int i1905_handle_ap_autoconfig_renew(const char *ifname, uint8_t *from,
 	}
 
 	/* relay mcast the received cmdu */
-	ret = i1905_send_cmdu_relay_mcast(priv, ifname, MCAST_1905, rxf->origin,
-					  ETHERTYPE_1905, rxf);
+	ret = i1905_relay_cmdu(priv, ifname, MCAST_1905, rxf->origin,
+			       ETHERTYPE_1905, rxf);
 	if (ret)
 		fprintf(stderr, "Error relaying AP_AUTOCONFIG_RENEW\n");
 
diff --git a/src/i1905.c b/src/i1905.c
index f040ae6bb1732ed0b7bd980d3ec24b3a9c53c2e1..9b7ab139870d1f9ce1818dab6f5db9b266b3f233 100644
--- a/src/i1905.c
+++ b/src/i1905.c
@@ -631,6 +631,47 @@ int i1905_send_cmdu_relay_mcast(struct i1905_private *priv, const char *ifname,
 	return 0;
 }
 
+int i1905_relay_cmdu(struct i1905_private *priv, const char *ifname,
+		     uint8_t *dst, uint8_t *src, uint16_t ethtype,
+		     struct cmdu_buff *frm)
+{
+	struct i1905_selfdevice *self;
+	struct i1905_interface *ifs;
+	uint16_t mid = 0;
+	uint16_t type;
+	int ret;
+
+
+	if (!priv || !frm || !frm->cdata)
+		return -1;
+
+	if (!IS_CMDU_RELAY_MCAST(frm->cdata))
+		return -1;
+
+	self = &priv->dm.self;
+	type = cmdu_get_type(frm);
+	mid = cmdu_get_mid(frm);
+
+	UNUSED(ethtype);
+
+	list_for_each_entry(ifs, &self->iflist, list) {
+		struct i1905_interface_private *ifpriv = ifs->priv;
+
+		/* skip sending out through the receiving interface */
+		if (ifname && !strncmp(ifname, ifs->ifname, 16))
+			continue;
+
+		ret = i1905_cmdu_tx(ifpriv, dst, src, type, &mid,
+				     frm->data, frm->datalen, false);
+		if (ret < 0) {
+			dbg("Error relay mcast through '%s' (err = %d, %s)\n",
+			    ifs->ifname, errno, strerror(errno));
+		}
+	}
+
+	return 0;
+}
+
 int i1905_cmdu_fragment_and_tx(struct i1905_interface_private *ifpriv,
 			       uint8_t *dst, uint8_t *src, uint16_t type,
 			       uint16_t *mid, uint8_t *data, int datalen,
diff --git a/src/i1905.h b/src/i1905.h
index d129bc7c8eafb16ea8f1156ac474bea5fbf9002f..e517a7bb387defccde396fc5df870f0a363e4711 100644
--- a/src/i1905.h
+++ b/src/i1905.h
@@ -150,6 +150,11 @@ int i1905_send_cmdu_relay_mcast(struct i1905_private *priv, const char *ifname,
 				uint8_t *dst, uint8_t *src, uint16_t ethtype,
 				struct cmdu_buff *frm);
 
+int i1905_relay_cmdu(struct i1905_private *priv, const char *ifname,
+		     uint8_t *dst, uint8_t *src, uint16_t ethtype,
+		     struct cmdu_buff *frm);
+
+
 int i1905_process_cmdu(struct i1905_private *priv, struct cmdu_buff *rxf);