diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 0b911e78586e52fd51068a5428c0558713a009a3..53608dc47bf3c20115b9bc8feb99970e291aed8b 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -10,8 +10,10 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="ffce6e62-d498-4e17-b121-42833fbda3f5" name="Default" comment="">
+      <change type="DELETED" beforePath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/USB/HidBridge.java" afterPath="" />
       <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
-      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java" afterPath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCGMService.java" afterPath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCGMService.java" />
+      <change type="MODIFICATION" beforePath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java" afterPath="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java" />
     </list>
     <ignored path="Medtronic640gUploader.iws" />
     <ignored path=".idea/workspace.xml" />
@@ -32,12 +34,13 @@
   </component>
   <component name="FileEditorManager">
     <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file leaf-file-name="Medtronic640gActivity.java" pinned="false" current-in-tab="true">
+      <file leaf-file-name="Medtronic640gActivity.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="0.29955947">
-              <caret line="126" column="32" selection-start-line="126" selection-start-column="32" selection-end-line="126" selection-end-column="32" />
+            <state vertical-scroll-proportion="-8.407408">
+              <caret line="543" column="58" selection-start-line="543" selection-start-column="48" selection-end-line="543" selection-end-column="58" />
               <folding>
+                <element signature="imports" expanded="true" />
                 <element signature="e#15673#15939#0" expanded="true" />
                 <element signature="e#15938#15939#0" expanded="true" />
               </folding>
@@ -45,21 +48,11 @@
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="Eula.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/eula/Eula.java">
-          <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="0.0">
-              <caret line="42" column="38" selection-start-line="42" selection-start-column="4" selection-end-line="42" selection-end-column="38" />
-              <folding />
-            </state>
-          </provider>
-        </entry>
-      </file>
       <file leaf-file-name="MedtronicCNLService.java" pinned="false" current-in-tab="false">
         <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCNLService.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="-7.259259">
-              <caret line="241" column="5" selection-start-line="237" selection-start-column="4" selection-end-line="241" selection-end-column="5" />
+            <state vertical-scroll-proportion="-10.185185">
+              <caret line="150" column="25" selection-start-line="150" selection-start-column="16" selection-end-line="150" selection-end-column="25" />
               <folding>
                 <element signature="imports" expanded="true" />
               </folding>
@@ -67,13 +60,23 @@
           </provider>
         </entry>
       </file>
-      <file leaf-file-name="GetHmacAndKeyActivity.java" pinned="false" current-in-tab="false">
-        <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java">
+      <file leaf-file-name="MedtronicCNLReader.java" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java">
           <provider selected="true" editor-type-id="text-editor">
-            <state vertical-scroll-proportion="-5.5925927">
-              <caret line="114" column="42" selection-start-line="114" selection-start-column="42" selection-end-line="114" selection-end-column="42" />
+            <state vertical-scroll-proportion="0.7641509">
+              <caret line="197" column="12" selection-start-line="197" selection-start-column="12" selection-end-line="197" selection-end-column="12" />
+              <folding />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="AndroidManifest.xml" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/app/src/main/AndroidManifest.xml">
+          <provider selected="true" editor-type-id="text-editor">
+            <state vertical-scroll-proportion="-11.291667">
+              <caret line="54" column="77" selection-start-line="54" selection-start-column="58" selection-end-line="54" selection-end-column="77" />
               <folding>
-                <element signature="e#4031#4073#0" expanded="true" />
+                <element signature="e#198#215#0" expanded="true" />
               </folding>
             </state>
           </provider>
@@ -1778,6 +1781,8 @@
         <option value="$PROJECT_DIR$/app/src/main/res/values/strings.xml" />
         <option value="$PROJECT_DIR$/app/src/main/res/xml/preferences.xml" />
         <option value="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java" />
+        <option value="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCGMService.java" />
+        <option value="$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java" />
       </list>
     </option>
   </component>
@@ -1838,6 +1843,10 @@
               <option name="myItemId" value="res" />
               <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidResFolderNode" />
             </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="xml" />
+              <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidResFolderTypeNode" />
+            </PATH_ELEMENT>
           </PATH>
           <PATH>
             <PATH_ELEMENT>
@@ -1857,6 +1866,20 @@
               <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidResFolderTypeNode" />
             </PATH_ELEMENT>
           </PATH>
+          <PATH>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="Medtronic640gUploader" />
+              <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidViewProjectNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="app" />
+              <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidModuleNode" />
+            </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="res" />
+              <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidResFolderNode" />
+            </PATH_ELEMENT>
+          </PATH>
           <PATH>
             <PATH_ELEMENT>
               <option name="myItemId" value="Medtronic640gUploader" />
@@ -2100,6 +2123,10 @@
               <option name="myItemId" value="app" />
               <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidModuleNode" />
             </PATH_ELEMENT>
+            <PATH_ELEMENT>
+              <option name="myItemId" value="manifests" />
+              <option name="myItemType" value="com.android.tools.idea.navigator.nodes.AndroidManifestsGroupNode" />
+            </PATH_ELEMENT>
           </PATH>
         </subPane>
       </pane>
@@ -2110,7 +2137,7 @@
   <component name="PropertiesComponent">
     <property name="settings.editor.selected.configurable" value="android.sdk-updates" />
     <property name="settings.editor.splitter.proportion" value="0.2" />
-    <property name="SearchEverywhereHistoryKey" value="uploa&#9;PSI&#9;JAVA://com.nightscout.android.upload.UploadHelper&#10;g4&#9;PSI&#9;JAVA://com.nightscout.android.dexcom.DexcomG4Activity&#10;cnlread&#9;PSI&#9;JAVA://com.nightscout.android.medtronic.MedtronicCNLReader" />
+    <property name="SearchEverywhereHistoryKey" value="reader&#9;FILE&#9;file:///Users/lgoedhart/StudioProjects/Medtronic640gUploader/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java&#10;uploa&#9;PSI&#9;JAVA://com.nightscout.android.upload.UploadHelper&#10;g4&#9;PSI&#9;JAVA://com.nightscout.android.dexcom.DexcomG4Activity&#10;cnlread&#9;PSI&#9;JAVA://com.nightscout.android.medtronic.MedtronicCNLReader" />
     <property name="android.project.structure.last.selected" value="app" />
     <property name="android.project.structure.proportion" value="0.15" />
     <property name="device.picker.selection" value="192.168.0.115:5555" />
@@ -2414,7 +2441,7 @@
       <window_info id="Palette&#9;" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
       <window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
-      <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2633864" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
+      <window_info id="Android Monitor" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.86975396" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Preview" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
       <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
       <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3299566" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
@@ -2454,7 +2481,7 @@
       <breakpoints-dialog>
         <breakpoints-dialog />
       </breakpoints-dialog>
-      <option name="time" value="15" />
+      <option name="time" value="17" />
     </breakpoint-manager>
     <watches-manager />
   </component>
@@ -2464,6 +2491,7 @@
         <state vertical-scroll-proportion="0.0">
           <caret line="166" column="77" selection-start-line="166" selection-start-column="71" selection-end-line="166" selection-end-column="77" />
           <folding>
+            <element signature="imports" expanded="true" />
             <element signature="e#15673#15939#0" expanded="true" />
             <element signature="e#15938#15939#0" expanded="true" />
           </folding>
@@ -2503,6 +2531,7 @@
         <state vertical-scroll-proportion="0.0">
           <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
           <folding>
+            <element signature="imports" expanded="true" />
             <element signature="e#15673#15939#0" expanded="true" />
             <element signature="e#15938#15939#0" expanded="true" />
           </folding>
@@ -2534,6 +2563,7 @@
         <state vertical-scroll-proportion="0.0">
           <caret line="166" column="77" selection-start-line="166" selection-start-column="71" selection-end-line="166" selection-end-column="77" />
           <folding>
+            <element signature="imports" expanded="true" />
             <element signature="e#15673#15939#0" expanded="true" />
             <element signature="e#15938#15939#0" expanded="true" />
           </folding>
@@ -2573,6 +2603,7 @@
         <state vertical-scroll-proportion="0.0">
           <caret line="72" column="0" selection-start-line="72" selection-start-column="0" selection-end-line="72" selection-end-column="0" />
           <folding>
+            <element signature="imports" expanded="true" />
             <element signature="e#15673#15939#0" expanded="true" />
             <element signature="e#15938#15939#0" expanded="true" />
           </folding>
@@ -2753,14 +2784,6 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="1.0114943">
-          <caret line="331" column="0" selection-start-line="331" selection-start-column="0" selection-end-line="331" selection-end-column="0" />
-          <folding />
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/app/build/generated/source/r/debug/info/nightscout/android/R.java">
       <provider selected="true" editor-type-id="text-editor">
         <state vertical-scroll-proportion="0.3524229">
@@ -2769,16 +2792,6 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCNLService.java">
-      <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="-7.259259">
-          <caret line="241" column="5" selection-start-line="237" selection-start-column="4" selection-end-line="241" selection-end-column="5" />
-          <folding>
-            <element signature="imports" expanded="true" />
-          </folding>
-        </state>
-      </provider>
-    </entry>
     <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/eula/Eula.java">
       <provider selected="true" editor-type-id="text-editor">
         <state vertical-scroll-proportion="0.0">
@@ -2807,9 +2820,7 @@
       <provider selected="true" editor-type-id="text-editor">
         <state vertical-scroll-proportion="0.7417943">
           <caret line="59" column="50" selection-start-line="59" selection-start-column="50" selection-end-line="59" selection-end-column="50" />
-          <folding>
-            <element signature="e#3741#3758#0" expanded="true" />
-          </folding>
+          <folding />
         </state>
       </provider>
     </entry>
@@ -2821,42 +2832,98 @@
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/src/main/AndroidManifest.xml">
+    <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="-5.5925927">
+          <caret line="114" column="42" selection-start-line="114" selection-start-column="42" selection-end-line="114" selection-end-column="42" />
+          <folding>
+            <element signature="e#4031#4073#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCNLService.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="-10.185185">
+          <caret line="150" column="25" selection-start-line="150" selection-start-column="16" selection-end-line="150" selection-end-column="25" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/app/src/main/res/xml/device_filter.xml">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.13953489">
-          <caret line="4" column="26" selection-start-line="4" selection-start-column="26" selection-end-line="4" selection-end-column="26" />
+        <state vertical-scroll-proportion="-0.21387284">
+          <caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
           <folding />
         </state>
       </provider>
     </entry>
-    <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/GetHmacAndKeyActivity.java">
+    <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/USB/UsbDriver.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="-5.5925927">
-          <caret line="114" column="42" selection-start-line="114" selection-start-column="42" selection-end-line="114" selection-end-column="42" />
+        <state vertical-scroll-proportion="0.0">
+          <caret line="29" column="17" selection-start-line="29" selection-start-column="17" selection-end-line="29" selection-end-column="17" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/USB/CommonUsbDriver.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.0">
+          <caret line="31" column="42" selection-start-line="31" selection-start-column="42" selection-end-line="31" selection-end-column="42" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/USB/UsbHidDriver.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.4827586">
+          <caret line="22" column="13" selection-start-line="22" selection-start-column="13" selection-end-line="22" selection-end-column="13" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/app/src/main/AndroidManifest.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="-11.291667">
+          <caret line="54" column="77" selection-start-line="54" selection-start-column="58" selection-end-line="54" selection-end-column="77" />
           <folding>
-            <element signature="e#4031#4073#0" expanded="true" />
+            <element signature="e#198#215#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCGMService.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.33264032">
-          <caret line="601" column="36" selection-start-line="601" selection-start-column="36" selection-end-line="601" selection-end-column="36" />
-          <folding />
+        <state vertical-scroll-proportion="-4.0740743">
+          <caret line="1352" column="28" selection-start-line="1352" selection-start-column="22" selection-end-line="1352" selection-end-column="28" />
+          <folding>
+            <element signature="e#50698#50964#0" expanded="true" />
+            <element signature="e#50963#50964#0" expanded="true" />
+          </folding>
         </state>
       </provider>
     </entry>
     <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/Medtronic640gActivity.java">
       <provider selected="true" editor-type-id="text-editor">
-        <state vertical-scroll-proportion="0.29955947">
-          <caret line="126" column="32" selection-start-line="126" selection-start-column="32" selection-end-line="126" selection-end-column="32" />
+        <state vertical-scroll-proportion="-8.407408">
+          <caret line="543" column="58" selection-start-line="543" selection-start-column="48" selection-end-line="543" selection-end-column="58" />
           <folding>
+            <element signature="imports" expanded="true" />
             <element signature="e#15673#15939#0" expanded="true" />
             <element signature="e#15938#15939#0" expanded="true" />
           </folding>
         </state>
       </provider>
     </entry>
+    <entry file="file://$PROJECT_DIR$/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state vertical-scroll-proportion="0.7641509">
+          <caret line="197" column="12" selection-start-line="197" selection-start-column="12" selection-end-line="197" selection-end-column="12" />
+          <folding />
+        </state>
+      </provider>
+    </entry>
   </component>
 </project>
\ No newline at end of file
diff --git a/app/src/main/java/info/nightscout/android/USB/HidBridge.java b/app/src/main/java/info/nightscout/android/USB/HidBridge.java
deleted file mode 100644
index 57ed36a474d2ac4966dae9685b39b678d72ae0ad..0000000000000000000000000000000000000000
--- a/app/src/main/java/info/nightscout/android/USB/HidBridge.java
+++ /dev/null
@@ -1,397 +0,0 @@
-package info.nightscout.android.USB;
-
-import android.content.BroadcastReceiver;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.hardware.usb.UsbDevice;
-import android.hardware.usb.UsbDeviceConnection;
-import android.hardware.usb.UsbEndpoint;
-import android.hardware.usb.UsbInterface;
-import android.hardware.usb.UsbManager;
-import android.util.Log;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.Queue;
-
-/**
- * This class is used for talking to hid of the dongle, connecting, disconnecting and enumerating the devices.
- * @author gai
- */
-public class HidBridge {
-    private Context _context;
-    private int _productId;
-    private int _vendorId;
-
-    // Can be used for debugging.
-    @SuppressWarnings("unused")
-    //private HidBridgeLogSupporter _logSupporter = new HidBridgeLogSupporter();
-    private static final String ACTION_USB_PERMISSION =
-            "com.example.company.app.testhid.USB_PERMISSION";
-
-    // Locker object that is responsible for locking read/write thread.
-    private Object _locker = new Object();
-    private Thread _readingThread = null;
-    private String _deviceName;
-
-    private UsbManager _usbManager;
-    private UsbDevice _usbDevice;
-
-    // The queue that contains the read data.
-    private Queue<byte[]> _receivedQueue;
-
-    /**
-     * Creates a hid bridge to the dongle. Should be created once.
-     * @param context is the UI context of Android.
-     * @param productId of the device.
-     * @param vendorId of the device.
-     */
-    public HidBridge(Context context, int productId, int vendorId) {
-        _context = context;
-        _productId = productId;
-        _vendorId = vendorId;
-        _receivedQueue = new LinkedList<byte[]>();
-    }
-
-    /**
-     * Searches for the device and opens it if successful
-     * @return true, if connection was successful
-     */
-    public boolean OpenDevice() {
-        _usbManager = (UsbManager) _context.getSystemService(Context.USB_SERVICE);
-
-        HashMap<String, UsbDevice> deviceList = _usbManager.getDeviceList();
-
-        Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
-        _usbDevice = null;
-
-        // Iterate all the available devices and find ours.
-        while(deviceIterator.hasNext()){
-            UsbDevice device = deviceIterator.next();
-            if (device.getProductId() == _productId && device.getVendorId() == _vendorId) {
-                _usbDevice = device;
-                _deviceName = _usbDevice.getDeviceName();
-            }
-        }
-
-        if (_usbDevice == null) {
-            Log("Cannot find the device. Did you forgot to plug it?");
-            Log(String.format("\t I search for VendorId: %s and ProductId: %s", _vendorId, _productId));
-            return false;
-        }
-
-        // Create and intent and request a permission.
-        PendingIntent mPermissionIntent = PendingIntent.getBroadcast(_context, 0, new Intent(ACTION_USB_PERMISSION), 0);
-        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
-        _context.registerReceiver(mUsbReceiver, filter);
-
-        _usbManager.requestPermission(_usbDevice, mPermissionIntent);
-        Log("Found the device");
-        return true;
-    }
-
-    /**
-     * Closes the reading thread of the device.
-     */
-    public void CloseTheDevice() {
-        StopReadingThread();
-    }
-
-    /**
-     * Starts the thread that continuously reads the data from the device.
-     * Should be called in order to be able to talk with the device.
-     */
-    public void StartReadingThread() {
-        if (_readingThread == null) {
-            _readingThread = new Thread(readerReceiver);
-            _readingThread.start();
-        } else {
-            Log("Reading thread already started");
-        }
-    }
-
-    /**
-     * Stops the thread that continuously reads the data from the device.
-     * If it is stopped - talking to the device would be impossible.
-     */
-    @SuppressWarnings("deprecation")
-    public void StopReadingThread() {
-        if (_readingThread != null) {
-            // Just kill the thread. It is better to do that fast if we need that asap.
-            _readingThread.stop();
-            _readingThread = null;
-        } else {
-            Log("No reading thread to stop");
-        }
-    }
-
-    /**
-     * Write data to the usb hid. Data is written as-is, so calling method is responsible for adding header data.
-     * @param bytes is the data to be written.
-     * @param timeout in milliseconds.
-     * @return true if succeed.
-     */
-    public boolean WriteData(byte[] bytes, int timeout) {
-        try
-        {
-            // Lock that is common for read/write methods.
-            synchronized (_locker) {
-                Log.e( "HidBridge", "InterfaceCount: " +_usbDevice.getInterfaceCount() );
-                UsbInterface writeIntf = _usbDevice.getInterface(0);
-                Log.e( "HidBridge", writeIntf.toString() );
-                Log.e( "HidBridge", "" + writeIntf.getEndpointCount() );
-                UsbEndpoint writeEp = writeIntf.getEndpoint(0);
-                Log.e( "HidBridge", writeEp.toString() );
-
-                UsbDeviceConnection writeConnection = _usbManager.openDevice(_usbDevice);
-
-                // Lock the usb interface.
-                writeConnection.claimInterface(writeIntf, true);
-
-                // Write the data as a bulk transfer with defined data length.
-                int r = writeConnection.bulkTransfer(writeEp, bytes, bytes.length, timeout);
-                if (r != -1) {
-                    Log(String.format("Written %s bytes to the dongle. Data written: %s", r, composeString(bytes)));
-                } else {
-                    Log("Error happened while writing data. No ACK");
-                }
-
-                // Release the usb interface.
-                writeConnection.releaseInterface(writeIntf);
-                writeConnection.close();
-            }
-
-        } catch(NullPointerException e)
-        {
-            Log("Error happend while writing. Could not connect to the device or interface is busy?");
-            Log.e("HidBridge", Log.getStackTraceString(e));
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Read data from the usb hid. This is synchronous. If you want asynchronous reading, use StartReadingThread() instead.
-     * @param length the number of bytes to be read.
-     * @return an array of bytes.
-     */
-    public byte[] ReadData(int length, int timeout) {
-        byte[] bytes = new byte[length];
-
-        // Lock that is common for read/write methods.
-        synchronized (_locker) {
-            UsbInterface readIntf = _usbDevice.getInterface(0);
-            Log.e( "HidBridge", readIntf.toString() );
-            Log.e( "HidBridge", "" + readIntf.getEndpointCount() );
-            UsbEndpoint readEp = readIntf.getEndpoint(1);
-            Log.e( "HidBridge", readEp.toString() );
-            UsbDeviceConnection readConnection = _usbManager.openDevice(_usbDevice);
-
-            // Lock the usb interface.
-            readConnection.claimInterface(readIntf, true);
-
-            // Write the data as a bulk transfer with defined data length.
-            int r = readConnection.bulkTransfer(readEp, bytes, bytes.length, timeout);
-            if (r >= 0) {
-                Log(String.format("Read %s bytes from the dongle. Data read: %s", r, composeString(bytes)));
-            } else {
-                Log("Error happened while reading data.");
-            }
-
-            // Release the usb interface.
-            readConnection.releaseInterface(readIntf);
-            readConnection.close();
-        }
-
-        return bytes;
-    }
-
-    /**
-     * @return true if there are any data in the queue to be read.
-     */
-    public boolean IsThereAnyReceivedData() {
-        synchronized(_locker) {
-            return !_receivedQueue.isEmpty();
-        }
-    }
-
-    /**
-     * Queue the data from the read queue.
-     * @return queued data.
-     */
-    public byte[] GetReceivedDataFromQueue() {
-        synchronized(_locker) {
-            return _receivedQueue.poll();
-        }
-    }
-
-    // The thread that continuously receives data from the dongle and put it to the queue.
-    private Runnable readerReceiver = new Runnable() {
-        public void run() {
-            if (_usbDevice == null) {
-                Log("No device to read from");
-                return;
-            }
-
-            UsbEndpoint readEp;
-            UsbDeviceConnection readConnection = null;
-            UsbInterface readIntf = null;
-            boolean readerStartedMsgWasShown = false;
-
-            // We will continuously ask for the data from the device and store it in the queue.
-            while (true) {
-                // Lock that is common for read/write methods.
-                synchronized (_locker) {
-                    try
-                    {
-                        if (_usbDevice == null) {
-                            OpenDevice();
-                            Log("No device. Rechecking in 10 sec...");
-
-                            Sleep(10000);
-                            continue;
-                        }
-
-                        readIntf = _usbDevice.getInterface(0);
-                        readEp = readIntf.getEndpoint(1);
-                        if (!_usbManager.getDeviceList().containsKey(_deviceName)) {
-                            Log("Failed to connect to the device. Retrying to acquire it.");
-                            OpenDevice();
-                            if (!_usbManager.getDeviceList().containsKey(_deviceName)) {
-                                Log("No device. Rechecking in 10 sec...");
-
-                                Sleep(10000);
-                                continue;
-                            }
-                        }
-
-                        try
-                        {
-
-                            readConnection = _usbManager.openDevice(_usbDevice);
-
-                            if (readConnection == null) {
-                                Log("Cannot start reader because the user didn't gave me permissions or the device is not present. Retrying in 2 sec...");
-                                Sleep(2000);
-                                continue;
-                            }
-
-                            // Claim and lock the interface in the android system.
-                            readConnection.claimInterface(readIntf, true);
-                        }
-                        catch (SecurityException e) {
-                            Log("Cannot start reader because the user didn't gave me permissions. Retrying in 2 sec...");
-
-                            Sleep(2000);
-                            continue;
-                        }
-
-                        // Show the reader started message once.
-                        if (!readerStartedMsgWasShown) {
-                            Log("!!! Reader was started !!!");
-                            readerStartedMsgWasShown = true;
-                        }
-
-                        // Read the data as a bulk transfer with the size = MaxPacketSize
-                        int packetSize = readEp.getMaxPacketSize();
-                        byte[] bytes = new byte[packetSize];
-                        int r = readConnection.bulkTransfer(readEp, bytes, packetSize, 50);
-                        if (r >= 0) {
-                            byte[] trancatedBytes = new byte[r]; // Truncate bytes in the honor of r
-
-                            int i=0;
-                            for (byte b : bytes) {
-                                trancatedBytes[i] = b;
-                                i++;
-                            }
-
-                            _receivedQueue.add(trancatedBytes); // Store received data
-                            Log(String.format("Message received of lengths %s and content: %s", r, composeString(bytes)));
-                        }
-
-                        // Release the interface lock.
-                        readConnection.releaseInterface(readIntf);
-                        readConnection.close();
-                    }
-
-                    catch (NullPointerException e) {
-                        Log("Error happened while reading. No device or the connection is busy");
-                        Log.e("HidBridge", Log.getStackTraceString(e));
-                    }
-                    catch (ThreadDeath e) {
-                        if (readConnection != null) {
-                            readConnection.releaseInterface(readIntf);
-                            readConnection.close();
-                        }
-
-                        throw e;
-                    }
-                }
-
-                // Sleep for 10 ms to pause, so other thread can write data or anything.
-                // As both read and write data methods lock each other - they cannot be run in parallel.
-                // Looks like Android is not so smart in planning the threads, so we need to give it a small time
-                // to switch the thread context.
-                Sleep(10);
-            }
-        }
-    };
-
-    private void Sleep(int milliseconds) {
-        try {
-            Thread.sleep(milliseconds);
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-        }
-    }
-
-    private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
-
-        public void onReceive(Context context, Intent intent) {
-            String action = intent.getAction();
-            if (ACTION_USB_PERMISSION.equals(action)) {
-                synchronized (this) {
-                    UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
-
-                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
-                        if(device != null){
-                            //call method to set up device communication
-                        }
-                    }
-                    else {
-                        Log.d("TAG", "permission denied for the device " + device);
-                    }
-                }
-            }
-        }
-    };
-
-    /**
-     * Logs the message from HidBridge.
-     * @param message to log.
-     */
-    private void Log(String message) {
-        //LogHandler logHandler = LogHandler.getInstance();
-        //logHandler.WriteMessage("HidBridge: " + message, LogHandler.GetNormalColor());
-    }
-
-    /**
-     * Composes a string from byte array.
-     */
-    private String composeString(byte[] bytes) {
-        StringBuilder builder = new StringBuilder();
-        for (byte b: bytes) {
-            builder.append(b);
-            builder.append(" ");
-        }
-
-        return builder.toString();
-    }
-
-    public String toString() {
-        return "" + _usbDevice.getInterfaceCount();
-    }
-}
diff --git a/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java b/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java
index 76445d357768017da19babac6036a5c16564617e..e392fc11f4cbcf995026faedff19eef233c70776 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/MedtronicCNLReader.java
@@ -148,7 +148,7 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler {
     public void requestDeviceInfo() throws IOException, TimeoutException, UnexpectedMessageException {
         new ContourNextLinkCommandMessage("X").send(this);
 
-        boolean gotTimeout = false;
+        boolean doRetry = false;
 
         // TODO - parse this into an ASTM record for the device info.
         try {
@@ -169,10 +169,9 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler {
         } catch (TimeoutException e) {
             // Terminate comms with the pump, then try again
             new ContourNextLinkCommandMessage(ASCII.EOT.value).send(this);
-            gotTimeout = true;
+            doRetry = true;
         } finally {
-            // If we timed out - try to start the session again.
-            if (gotTimeout) {
+            if (doRetry) {
                 requestDeviceInfo();
             }
         }
@@ -187,10 +186,22 @@ public class MedtronicCNLReader implements ContourNextLinkMessageHandler {
     }
 
     public void enterControlMode() throws IOException, TimeoutException, UnexpectedMessageException {
-        new ContourNextLinkCommandMessage(ASCII.NAK.value).send(this);
-        checkControlMessage(readMessage(), ASCII.EOT.value);
-        new ContourNextLinkCommandMessage(ASCII.ENQ.value).send(this);
-        checkControlMessage(readMessage(), ASCII.ACK.value);
+        boolean doRetry = false;
+
+        try {
+            new ContourNextLinkCommandMessage(ASCII.NAK.value).send(this);
+            checkControlMessage(readMessage(), ASCII.EOT.value);
+            new ContourNextLinkCommandMessage(ASCII.ENQ.value).send(this);
+            checkControlMessage(readMessage(), ASCII.ACK.value);
+        } catch( UnexpectedMessageException e2 ) {
+            // Terminate comms with the pump, then try again
+            new ContourNextLinkCommandMessage(ASCII.EOT.value).send(this);
+            doRetry = true;
+        } finally {
+            if (doRetry) {
+                enterControlMode();
+            }
+        }
     }
 
     public void enterPassthroughMode() throws IOException, TimeoutException, UnexpectedMessageException {