diff --git a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh
index 6f61281f68bde981388fd0cb0664c52c088dff23..0e5e2e03f2b8394ec15c52ee6eb3706059c4ea2d 100755
--- a/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh
+++ b/package/network/utils/uqmi/files/lib/netifd/proto/qmi.sh
@@ -17,6 +17,14 @@ proto_qmi_init_config() {
 	proto_config_add_string modes
 }
 
+qmi_disconnect() {
+	# disable previous autoconnect state using the global handle
+	# do not reuse previous wds client id to prevent hangs caused by stale data
+	uqmi -s -d "$device" \
+		--stop-network 0xffffffff \
+		--autoconnect > /dev/null
+}
+
 proto_qmi_setup() {
 	local interface="$1"
 
@@ -68,6 +76,8 @@ proto_qmi_setup() {
 		return 1
 	}
 
+	qmi_disconnect
+
 	echo "Waiting for network registration"
 	while uqmi -s -d "$device" --get-serving-system | grep '"searching"' > /dev/null; do
 		sleep 5;
@@ -83,24 +93,17 @@ proto_qmi_setup() {
 		proto_block_restart "$interface"
 		return 1
 	}
-	uci_set_state network $interface cid "$cid"
 
-	pdh=`uqmi -s -d "$device" --set-client-id wds,"$cid" --start-network "$apn" \
-	${auth:+--auth-type $auth} \
-	${username:+--username $username} \
-	${password:+--password $password}`
-	[ $? -ne 0 ] && {
-		echo "Unable to connect, check APN and authentication"
-		proto_notify_error "$interface" NO_PDH
-		proto_block_restart "$interface"
-		return 1
-	}
-	uci_set_state network $interface pdh "$pdh"
+	uqmi -s -d "$device" --set-client-id wds,"$cid" \
+		--start-network "$apn" \
+		${auth:+--auth-type $auth} \
+		${username:+--username $username} \
+		${password:+--password $password} \
+		--autoconnect > /dev/null
 
 	if ! uqmi -s -d "$device" --get-data-status | grep '"connected"' > /dev/null; then
 		echo "Connection lost"
 		proto_notify_error "$interface" NOT_CONNECTED
-		proto_block_restart "$interface"
 		return 1
 	fi
 
@@ -129,14 +132,10 @@ proto_qmi_teardown() {
 	local device
 	json_get_vars device
 	local cid=$(uci_get_state network $interface cid)
-	local pdh=$(uci_get_state network $interface pdh)
 
 	echo "Stopping network"
+	qmi_disconnect
 	[ -n "$cid" ] && {
-		[ -n "$pdh" ] && {
-			uqmi -s -d "$device" --set-client-id wds,"$cid" --stop-network "$pdh"
-			uci_revert_state network $interface pdh
-		}
 		uqmi -s -d "$device" --set-client-id wds,"$cid" --release-client-id wds
 		uci_revert_state network $interface cid
 	}