diff --git a/app/build.gradle b/app/build.gradle
index 6bfea65e09c18951c4bedbba1cb835ca18935ecb..b54f1f8a56453af8a710861a1fe258c16bf8d0be 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -156,7 +156,7 @@ dependencies {
     compile 'com.mikepenz:google-material-typeface:2.2.0.1.original@aar'
     compile 'uk.co.chrisjenx:calligraphy:2.2.0'
     compile 'com.bugfender.sdk:android:0.7.2'
-    compile 'com.jjoe64:graphview:4.2.1'
+    compile 'com.jjoe64:graphview:4.0.1'
     compile 'com.android.support:support-v4:23.4.0'
     compile 'com.google.code.gson:gson:2.7'
     compile 'com.squareup.retrofit2:retrofit:2.1.0'
diff --git a/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java b/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java
index 4a7e1110aad092b11c1c44bacec2596712abe957..bb686c818791e74973699645f5a8f6a1e07ee94d 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/MainActivity.java
@@ -328,6 +328,8 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
         mChart.getViewport().setMaxX(now);
         mChart.getViewport().setMinX(left);
 
+// due to bug in GraphView v4.2.1 using setNumHorizontalLabels reverted to using v4.0.1 and setOnXAxisBoundsChangedListener is n/a in this version
+/*
         mChart.getViewport().setOnXAxisBoundsChangedListener(new Viewport.OnXAxisBoundsChangedListener() {
             @Override
             public void onXAxisBoundsChanged(double minX, double maxX, Reason reason) {
@@ -335,7 +337,7 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
                 hasZoomedChart = (rightX != maxX || rightX - chartZoom * 60 * 60 * 1000 != minX);
             }
         });
-
+*/
         mChart.setOnLongClickListener(new View.OnLongClickListener() {
             @Override
             public boolean onLongClick(View v) {
@@ -349,7 +351,9 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
             }
         });
         mChart.getGridLabelRenderer().setNumHorizontalLabels(6);
-        mChart.getGridLabelRenderer().setHumanRounding(false);
+
+// due to bug in GraphView v4.2.1 using setNumHorizontalLabels reverted to using v4.0.1 and setHumanRounding is n/a in this version
+//        mChart.getGridLabelRenderer().setHumanRounding(false);
 
         mChart.getGridLabelRenderer().setLabelFormatter(new DefaultLabelFormatter() {
             DateFormat mFormat = new SimpleDateFormat("HH:mm");  // 24 hour format forced to fix label overlap
@@ -446,14 +450,15 @@ public class MainActivity extends AppCompatActivity implements OnSharedPreferenc
     }
 
     private void startCgmServiceDelayed(long delay) {
-        RealmResults<PumpStatusEvent> results = mRealm.where(PumpStatusEvent.class)
-                .findAllSorted("eventDate", Sort.DESCENDING);
-
-        if (results.size() > 0) {
-            startCgmService(getNextPoll(results.first()) + delay);
-        } else {
-            startCgmService(System.currentTimeMillis() + (delay==0?1000:delay));
+        if (!mRealm.isClosed()) {
+            RealmResults<PumpStatusEvent> results = mRealm.where(PumpStatusEvent.class)
+                    .findAllSorted("eventDate", Sort.DESCENDING);
+            if (results.size() > 0) {
+                startCgmService(getNextPoll(results.first()) + delay);
+                return;
+            }
         }
+        startCgmService(System.currentTimeMillis() + (delay == 0 ? 1000 : delay));
     }
 
     private void startCgmService(long initialPoll) {
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 6763c82d683bcd7daf32ba61f95294216a4a2a70..79fc5ce59946aaf202f8f520f435ab203267f150 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/MedtronicCnlReader.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/MedtronicCnlReader.java
@@ -171,44 +171,16 @@ public class MedtronicCnlReader {
 
     public Date getPumpTime() throws EncryptionException, IOException, ChecksumException, TimeoutException, UnexpectedMessageException {
         Log.d(TAG, "Begin getPumpTime");
-
-        // CNL<-->PUMP comms can have occasional short lived noise causing errors, retrying once catches this
-        try {
-            PumpTimeResponseMessage response = new PumpTimeRequestMessage(mPumpSession).send(mDevice);
-            Log.d(TAG, "Finished getPumpTime with date " + response.getPumpTime());
-            return response.getPumpTime();
-        } catch (UnexpectedMessageException e) {
-            Log.e(TAG, "Unexpected Message", e);
-        } catch (TimeoutException e) {
-            Log.e(TAG, "Timeout communicating with the Contour Next Link.", e);
-        }
-
         PumpTimeResponseMessage response = new PumpTimeRequestMessage(mPumpSession).send(mDevice);
-
         Log.d(TAG, "Finished getPumpTime with date " + response.getPumpTime());
         return response.getPumpTime();
     }
 
     public PumpStatusEvent updatePumpStatus(PumpStatusEvent pumpRecord) throws IOException, EncryptionException, ChecksumException, TimeoutException, UnexpectedMessageException {
         Log.d(TAG, "Begin updatePumpStatus");
-
-        // CNL<-->PUMP comms can have occasional short lived noise causing errors, retrying once catches this
-        try {
-            PumpStatusResponseMessage response = new PumpStatusRequestMessage(mPumpSession).send(mDevice);
-            response.updatePumpRecord(pumpRecord);
-            Log.d(TAG, "Finished updatePumpStatus");
-            return pumpRecord;
-        } catch (UnexpectedMessageException e) {
-            Log.e(TAG, "Unexpected Message", e);
-        } catch (TimeoutException e) {
-            Log.e(TAG, "Timeout communicating with the Contour Next Link.", e);
-        }
-
         PumpStatusResponseMessage response = new PumpStatusRequestMessage(mPumpSession).send(mDevice);
         response.updatePumpRecord(pumpRecord);
-
         Log.d(TAG, "Finished updatePumpStatus");
-
         return pumpRecord;
     }
 
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java
index bc656cbd18a4b0c3177e339567f0d5c42d94d74a..18de1f899ec1354ce7605ccd486c4aaa0bf845d8 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/CloseConnectionRequestMessage.java
@@ -7,6 +7,7 @@ import info.nightscout.android.USB.UsbHidDriver;
 import info.nightscout.android.medtronic.MedtronicCnlSession;
 import info.nightscout.android.medtronic.exception.ChecksumException;
 import info.nightscout.android.medtronic.exception.EncryptionException;
+import info.nightscout.android.medtronic.exception.UnexpectedMessageException;
 
 /**
  * Created by volker on 10.12.2016.
@@ -17,6 +18,24 @@ public class CloseConnectionRequestMessage extends ContourNextLinkBinaryRequestM
         super(CommandType.CLOSE_CONNECTION, pumpSession, payload);
     }
 
+    @Override
+    public CloseConnectionResponseMessage send(UsbHidDriver mDevice, int millis) throws IOException, TimeoutException, ChecksumException, EncryptionException, UnexpectedMessageException {
+
+        // clear unexpected incoming messages
+        clearMessage(mDevice);
+
+        sendMessage(mDevice);
+        if (millis > 0) {
+            try {
+                Thread.sleep(millis);
+            } catch (InterruptedException e) {
+            }
+        }
+
+        CloseConnectionResponseMessage response = this.getResponse(readMessage(mDevice));
+        return response;
+    }
+
     @Override
     protected CloseConnectionResponseMessage getResponse(byte[] payload) throws ChecksumException, EncryptionException, IOException {
         return new CloseConnectionResponseMessage(payload);
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusRequestMessage.java
index 163f42775f2161bcf92ae7e743c2a0435ba99165..13858f38e76f4e761bd2bd13e6a343683ab34daf 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/PumpStatusRequestMessage.java
@@ -40,11 +40,13 @@ public class PumpStatusRequestMessage extends MedtronicSendMessageRequestMessage
             } catch (InterruptedException e) {
             }
         }
-        PumpStatusResponseMessage response = this.getResponse(readMessage(mDevice));
+        // Read the 0x80
+        byte[] payload = readMessage(mDevice);
 
         // clear unexpected incoming messages
         clearMessage(mDevice);
 
+        PumpStatusResponseMessage response = this.getResponse(payload);
         return response;
     }
 
diff --git a/app/src/main/java/info/nightscout/android/medtronic/message/PumpTimeRequestMessage.java b/app/src/main/java/info/nightscout/android/medtronic/message/PumpTimeRequestMessage.java
index 592800406888cb5c6ce3860642c785b274ce79a2..c4063b53e0681c472885b90ebf4ee6d7aa9ce231 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/message/PumpTimeRequestMessage.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/message/PumpTimeRequestMessage.java
@@ -36,11 +36,12 @@ public class PumpTimeRequestMessage extends MedtronicSendMessageRequestMessage<P
             }
         }
         // Read the 0x80
-        PumpTimeResponseMessage response = this.getResponse(readMessage(mDevice));
+        byte[] payload = readMessage(mDevice);
 
         // Pump sends additional 0x80 message when not using EHSM, lets clear this and any unexpected incoming messages
         clearMessage(mDevice);
 
+        PumpTimeResponseMessage response = this.getResponse(payload);
         return response;
     }
 
diff --git a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java
index b7881f6c2d24c284ef14f116d98f83d15b61b85f..77dbee6aaededae6fd72f1311a4c3ab886e49068 100644
--- a/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java
+++ b/app/src/main/java/info/nightscout/android/medtronic/service/MedtronicCnlIntentService.java
@@ -259,14 +259,14 @@ public class MedtronicCnlIntentService extends IntentService {
                         }
                         sendStatus("SGV: " + MainActivity.strFormatSGV(pumpRecord.getSgv()) + "  At: " + df.format(pumpRecord.getEventDate().getTime()) + "  Pump: " + offsetSign + (pumpOffset / 1000L) + "sec");  //note: event time is currently stored with offset
 
-                        // Check if pump sent old event when new expected and schedule a re-poll
+                        // Check if pump sent old event when new expected
                         if (((pumpRecord.getEventDate().getTime() - dataStore.getLastPumpStatus().getEventDate().getTime()) < 5000L) && ((timePollExpected - timePollStarted) < 5000L)) {
-                            pollInterval = 90000L; // polling interval set to 90 seconds
-                            sendStatus("Pump sent old SGV event, re-polling...");
+                            sendStatus("Pump sent old SGV event");
                         }
 
                         //MainActivity.timeLastGoodSGV =  pumpRecord.getEventDate().getTime(); // track last good sgv event time
                         //MainActivity.pumpBattery =  pumpRecord.getBatteryPercentage(); // track pump battery
+                        timeLastGoodSGV = pumpRecord.getEventDate().getTime();
                         dataStore.clearUnavailableSGVCount(); // reset unavailable sgv count
 
                         // Check that the record doesn't already exist before committing
@@ -295,11 +295,11 @@ public class MedtronicCnlIntentService extends IntentService {
             } catch (UnexpectedMessageException e) {
                 Log.e(TAG, "Unexpected Message", e);
                 sendStatus("Communication Error: " + e.getMessage());
-                pollInterval = configurationStore.getPollInterval() / (configurationStore.isReducePollOnPumpAway()?2L:1L);
+                pollInterval = 60000L; // retry once during this poll period
             } catch (TimeoutException e) {
                 Log.e(TAG, "Timeout communicating with the Contour Next Link.", e);
                 sendStatus("Timeout communicating with the Contour Next Link.");
-                pollInterval = configurationStore.getPollInterval() / (configurationStore.isReducePollOnPumpAway()?2L:1L);
+                pollInterval = 60000L; // retry once during this poll period
             } catch (NoSuchAlgorithmException e) {
                 Log.e(TAG, "Could not determine CNL HMAC", e);
                 sendStatus("Error connecting to Contour Next Link: Hashing error.");