return err;
 }
 
+static int mptcp_userspace_pm_remove_id_zero_address(struct mptcp_sock *msk,
+                                                    struct genl_info *info)
+{
+       struct mptcp_rm_list list = { .nr = 0 };
+       struct mptcp_subflow_context *subflow;
+       struct sock *sk = (struct sock *)msk;
+       bool has_id_0 = false;
+       int err = -EINVAL;
+
+       lock_sock(sk);
+       mptcp_for_each_subflow(msk, subflow) {
+               if (subflow->local_id == 0) {
+                       has_id_0 = true;
+                       break;
+               }
+       }
+       if (!has_id_0) {
+               GENL_SET_ERR_MSG(info, "address with id 0 not found");
+               goto remove_err;
+       }
+
+       list.ids[list.nr++] = 0;
+
+       spin_lock_bh(&msk->pm.lock);
+       mptcp_pm_remove_addr(msk, &list);
+       spin_unlock_bh(&msk->pm.lock);
+
+       err = 0;
+
+remove_err:
+       release_sock(sk);
+       return err;
+}
+
 int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
 {
        struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
                goto remove_err;
        }
 
+       if (id_val == 0) {
+               err = mptcp_userspace_pm_remove_id_zero_address(msk, info);
+               goto remove_err;
+       }
+
        lock_sock((struct sock *)msk);
 
        list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {