diff --git a/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetAdapter.java b/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetAdapter.java
index 85b0f26a27545b9644f2a85157b9887a22a509a8..992038a3176c5e70ff53ff47981d32f1521320fb 100644
--- a/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetAdapter.java
+++ b/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetAdapter.java
@@ -131,10 +131,10 @@ public class OpenHABWidgetAdapter extends RecyclerView.Adapter<OpenHABWidgetAdap
         mChartTheme = tv.string;
     }
 
-    public void update(List<OpenHABWidget> widgets) {
+    public void update(List<OpenHABWidget> widgets, boolean forceFullUpdate) {
         boolean compatibleUpdate = true;
 
-        if (widgets.size() != mItems.size()) {
+        if (widgets.size() != mItems.size() || forceFullUpdate) {
             compatibleUpdate = false;
         } else {
             for (int i = 0; i < widgets.size(); i++) {
diff --git a/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetListFragment.java b/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetListFragment.java
index 6b7128c00eda4c10c88239f1206606188480be7b..8a3c0f48de85637195c6d481ab97ba1c3bb594ed 100644
--- a/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetListFragment.java
+++ b/mobile/src/main/java/org/openhab/habdroid/ui/OpenHABWidgetListFragment.java
@@ -293,7 +293,7 @@ public class OpenHABWidgetListFragment extends Fragment
         mWidgets = widgets;
 
         if (openHABWidgetAdapter != null) {
-            openHABWidgetAdapter.update(widgets);
+            openHABWidgetAdapter.update(widgets, refreshLayout.isRefreshing());
             setHighlightedPageLink(mHighlightedPageLink);
             refreshLayout.setRefreshing(false);
         }
diff --git a/mobile/src/main/java/org/openhab/habdroid/ui/widget/WidgetImageView.java b/mobile/src/main/java/org/openhab/habdroid/ui/widget/WidgetImageView.java
index f4b527e534abf085ef55bd8489aa26a3cff21bc4..7e9d8a2191c6ec42f80168da9918f29705261aea 100644
--- a/mobile/src/main/java/org/openhab/habdroid/ui/widget/WidgetImageView.java
+++ b/mobile/src/main/java/org/openhab/habdroid/ui/widget/WidgetImageView.java
@@ -109,21 +109,23 @@ public class WidgetImageView extends AppCompatImageView {
         AsyncHttpClient client = connection.getAsyncHttpClient();
         HttpUrl actualUrl = client.buildUrl(url);
 
-        if (mLastRequest != null && mLastRequest.isForUrl(actualUrl)) {
-            // Nothing to do
+        if (mLastRequest != null && mLastRequest.isActiveForUrl(actualUrl)) {
+            // We're already in the process of loading this image, thus there's nothing to do
             return;
         }
 
         cancelCurrentLoad();
-        // Make sure to discard last request (which was for a different URL) to ensure
-        // it's not re-triggered later, e.g. when being attached to the window
-        mLastRequest = null;
 
         if (actualUrl == null) {
             applyFallbackDrawable();
+            mLastRequest = null;
             return;
         }
+
         Bitmap cached = CacheManager.getInstance(getContext()).getCachedBitmap(actualUrl);
+
+        mLastRequest = new HttpImageRequest(client, actualUrl, timeoutMillis);
+
         if (cached != null) {
             setBitmapInternal(cached);
         } else {
@@ -131,7 +133,6 @@ public class WidgetImageView extends AppCompatImageView {
         }
 
         if (cached == null || forceLoad) {
-            mLastRequest = new HttpImageRequest(client, actualUrl, timeoutMillis);
             mLastRequest.execute(forceLoad);
         }
     }
@@ -188,8 +189,12 @@ public class WidgetImageView extends AppCompatImageView {
     @Override
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
-        if (mLastRequest != null && !mLastRequest.hasCompleted()) {
-            mLastRequest.execute(false);
+        if (mLastRequest != null) {
+            if (!mLastRequest.hasCompleted()) {
+                mLastRequest.execute(false);
+            } else {
+                scheduleNextRefresh();
+            }
         }
     }
 
@@ -288,10 +293,6 @@ public class WidgetImageView extends AppCompatImageView {
             mCall = null;
         }
 
-        public boolean hasCompleted() {
-            return mCall != null;
-        }
-
         public void execute(boolean avoidCache) {
             Log.i(TAG, "Refreshing image at " + mUrl);
             HttpClient.CachingMode cachingMode = avoidCache
@@ -303,12 +304,15 @@ public class WidgetImageView extends AppCompatImageView {
         public void cancel() {
             if (mCall != null) {
                 mCall.cancel();
-                mCall = null;
             }
         }
 
-        public boolean isForUrl(HttpUrl url) {
-            return mCall != null && mCall.request().url().equals(url);
+        public boolean hasCompleted() {
+            return mCall == null;
+        }
+
+        public boolean isActiveForUrl(HttpUrl url) {
+            return mCall != null && mCall.request().url().equals(url) && !mCall.isCanceled();
         }
     }
 }