diff --git a/VERSION b/VERSION
index 972ef76..5b209ea 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.7.9
+0.7.10
diff --git a/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py b/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
index 6a32cb0..bcd8b06 100755
--- a/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
+++ b/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
@@ -24,6 +24,8 @@
 report the result to the central monitoring server.
 '''
 
+USE_MODEM_CMDS = False
+
 # Parse config with backwards compatibility with config.json pre 0.6.6
 config_file_contents = open(os.getenv('CONFIG_FILE', "./config.json")).read()
 config_file_contents = config_file_contents.replace("user_plane_ping_test", "dns")
@@ -121,8 +123,11 @@
 
 
 def get_control_plane_state(modem, dongle_stats=None):
-    if dongle_stats and dongle_stats['Connection'] == 'Connected':
-        return State.connected
+    if not modem and dongle_stats:
+        if dongle_stats and dongle_stats['Connection'] == 'Connected':
+            return State.connected
+        else:
+            return State.disconnected
 
     # Disable radio fuction
     # "echo" works more stable than serial for this action
@@ -174,7 +179,7 @@
     return state
 
 
-def get_user_plane_state(modem):
+def get_user_plane_state():
     if "dry_run" in CONF.ips._fields and CONF.ips.dry_run: # run dry_run latency test as user plane test
         dry_run_latency, dry_run_passed = run_ping_test(CONF.ips.dry_run, 10)
         if dry_run_passed:
@@ -320,10 +325,15 @@
 
 
 def get_signal_quality(modem, dongle_stats=None):
-    if dongle_stats and dongle_stats['RSRQ'] != '' and dongle_stats['RSRP'] != '':
-        rsrq = int((float(dongle_stats['RSRQ']) + 19.5) * 2)
-        rsrp = int(float(dongle_stats['RSRP']) + 140)
-        return {'rsrq': rsrq, 'rsrp': rsrp}
+    if not modem and dongle_stats:
+        if dongle_stats['RSRQ'] != '' and dongle_stats['RSRP'] != '':
+            rsrq = int((float(dongle_stats['RSRQ']) + 19.5) * 2)
+            rsrp = int(float(dongle_stats['RSRP']) + 140)
+            return {'rsrq': rsrq, 'rsrp': rsrp}
+        else:
+            return {'rsrq': 0, 'rsrp': 0}
+
+    # Fall back to modem cmds
 
     success, result = modem.write('AT+CESQ')
     logging.debug("get_signal_quality success %i result %s",success,result)
@@ -479,8 +489,6 @@
         logging.error("Failed to send report: " + str(e))
         c.close()
 
-    time.sleep(CONF.report_interval)
-
 def reset_usb():
     try:
         # Attempt to run uhubctl
@@ -533,46 +541,51 @@
             time.sleep(10) # Sleep for 10 seconds before retry
             sys.exit(1)
 
-    modem = Modem(CONF.modem.port, CONF.modem.baud)
-    try:
-        modem.connect()
-    except serial.serialutil.SerialException as e:
-        logging.error("Failed to connect the modem for %s", e)
-        sys.exit(1)
-
-    while True:
-        dongle_stats = get_dongle_stats()
-        cp_state = get_control_plane_state(modem, dongle_stats)
-        if cp_state != State.connected:
-            logging.error("Control plane not connected")
-            continue
-        signal_quality = get_signal_quality(modem, dongle_stats)
-        if cp_state is State.error:
-            logging.error("Modem is in error state.")
-            reset_usb()
+    if USE_MODEM_CMDS:
+        modem = Modem(CONF.modem.port, CONF.modem.baud)
+        try:
+            modem.connect()
+        except serial.serialutil.SerialException as e:
+            logging.error("Failed to connect the modem for %s", e)
             sys.exit(1)
-        if cp_state is State.disconnected:
-            # Failed to attach, don't need to run other tests
-            logging.error("Check control plane - fail")
-            report_status(signal_quality, dongle_stats)
-            continue
+    else:
+        modem = None
 
-        up_state, dry_run_latency = get_user_plane_state(modem)
+    connect_retries = 0
+    while True:
+        dongle_retries = 0
+        dongle_stats = get_dongle_stats()
+        while not dongle_stats['SuccessfulFetch']:
+            log.error("Dongle error")
+            dongle_retries += 1
+            if dongle_retries > 10:
+                logging.warn("Rebooting Pi")
+                os.system("shutdown /r /t 0")
+                sys.exit(1)
+            dongle_stats = get_dongle_stats()
+
+        cp_state = get_control_plane_state(modem, dongle_stats)
+
+        if cp_state != State.connected:
+            logging.error("Dongle not connected")
+            connect_retries += 1
+            if connect_retries > 10:
+                os.system("shutdown /r /t 0")
+                sys.exit(1)
+
+        signal_quality = get_signal_quality(modem, dongle_stats)
+        up_state, dry_run_latency = get_user_plane_state()
         if up_state is State.disconnected:
-            logging.error("Check user plane - fail")
-            # Basic user plane test failed, don't need to run the rest of tests
-            report_status(signal_quality, dongle_stats, cp_state)
-            continue
+            logging.error("Dry run ping failed")
 
         speedtest_ping, speedtest_status = get_ping_test(modem, dry_run_latency)
-        if speedtest_status:
-            speedtest_iperf = get_iperf_test(modem)
-        else:
-            logging.error("Check iperf check - fail")
-            report_status(signal_quality, dongle_stats, cp_state, up_state, speedtest_ping)
-            continue
+        if not speedtest_status:
+            logging.error("Ping tests failed")
+
+        speedtest_iperf = get_iperf_test(modem)
 
         report_status(signal_quality, dongle_stats, cp_state, up_state, speedtest_ping, speedtest_iperf)
+        time.sleep(CONF.report_interval)
 
     modem.close()
 
