done
 }
 
+kill_wait()
+{
+       kill $1 > /dev/null 2>&1
+       wait $1 2>/dev/null
+}
+
 pm_nl_set_limits()
 {
        local ns=$1
 
        local port=$((10000 + TEST_COUNT - 1))
        local cappid
+       local userspace_pm=0
+       local evts_ns1
+       local evts_ns1_pid
 
        :> "$cout"
        :> "$sout"
                extra_args="-r ${speed:6}"
        fi
 
+       if [[ "${addr_nr_ns1}" = "userspace_"* ]]; then
+               userspace_pm=1
+               addr_nr_ns1=${addr_nr_ns1:10}
+       fi
+
        if [[ "${addr_nr_ns2}" = "fastclose_"* ]]; then
                # disconnect
                extra_args="$extra_args -I ${addr_nr_ns2:10}"
                addr_nr_ns2=0
        fi
 
+       if [ $userspace_pm -eq 1 ]; then
+               evts_ns1=$(mktemp)
+               :> "$evts_ns1"
+               ip netns exec ${listener_ns} ./pm_nl_ctl events >> "$evts_ns1" 2>&1 &
+               evts_ns1_pid=$!
+       fi
+
        local local_addr
        if is_v6 "${connect_addr}"; then
                local_addr="::"
        if [ $addr_nr_ns1 -gt 0 ]; then
                local counter=2
                local add_nr_ns1=${addr_nr_ns1}
+               local id=10
+               local tk
                while [ $add_nr_ns1 -gt 0 ]; do
                        local addr
                        if is_v6 "${connect_addr}"; then
                        else
                                addr="10.0.$counter.1"
                        fi
-                       pm_nl_add_endpoint $ns1 $addr flags signal
+                       if [ $userspace_pm -eq 0 ]; then
+                               pm_nl_add_endpoint $ns1 $addr flags signal
+                       else
+                               tk=$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evts_ns1")
+                               ip netns exec ${listener_ns} ./pm_nl_ctl ann $addr token $tk id $id
+                               sleep 1
+                               ip netns exec ${listener_ns} ./pm_nl_ctl rem token $tk id $id
+                       fi
+
                        counter=$((counter + 1))
                        add_nr_ns1=$((add_nr_ns1 - 1))
+                       id=$((id + 1))
                done
        elif [ $addr_nr_ns1 -lt 0 ]; then
                local rm_nr_ns1=$((-addr_nr_ns1))
            kill $cappid
        fi
 
+       if [ $userspace_pm -eq 1 ]; then
+               kill_wait $evts_ns1_pid
+               rm -rf $evts_ns1
+       fi
+
        NSTAT_HISTORY=/tmp/${listener_ns}.nstat ip netns exec ${listener_ns} \
                nstat | grep Tcp > /tmp/${listener_ns}.out
        NSTAT_HISTORY=/tmp/${connector_ns}.nstat ip netns exec ${connector_ns} \
                chk_join_nr 0 0 0
                chk_rm_nr 0 0
        fi
+
+       # userspace pm add & remove address
+       if reset "userspace pm add & remove address"; then
+               set_userspace_pm $ns1
+               pm_nl_set_limits $ns2 1 1
+               run_tests $ns1 $ns2 10.0.1.1 0 userspace_1 0 slow
+               chk_join_nr 1 1 1
+               chk_add_nr 1 1
+               chk_rm_nr 1 1 invert
+       fi
 }
 
 endpoint_tests()