diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java
index 47f9eb242c5eb0223232b0fe4605a760b30480d3..d5e68965e9c6e256416a35ebd4881a2aad3eb09d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHandler.java
@@ -1,6 +1,5 @@
 package net.i2p.router.web;
 
-import net.i2p.I2PAppContext;
 import net.i2p.crypto.TrustedUpdate;
 import net.i2p.data.DataHelper;
 import net.i2p.util.FileUtil;
@@ -78,7 +77,7 @@ public class ConfigUpdateHandler extends FormHandler {
         if (_action == null)
             return;
         if (_action.equals(_("Check for updates"))) {
-            NewsFetcher fetcher = NewsFetcher.getInstance(I2PAppContext.getGlobalContext());
+            NewsFetcher fetcher = NewsFetcher.getInstance(_context);
             fetcher.fetchNews();
             if (fetcher.shouldFetchUnsigned())
                 fetcher.fetchUnsignedHead();
@@ -100,6 +99,7 @@ public class ConfigUpdateHandler extends FormHandler {
             String oldURL = ConfigUpdateHelper.getNewsURL(_context);
             if ( (oldURL == null) || (!_newsURL.equals(oldURL)) ) {
                 _context.router().setConfigSetting(PROP_NEWS_URL, _newsURL);
+                NewsFetcher.getInstance(_context).invalidateNews();
                 addFormNotice(_("Updating news URL to") + " " + _newsURL);
             }
         }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
index 562c3e7cadb2d326785e7002d8b04ebe5490ad07..1f1cd4098d55ff7ac55949dcc2ccb47c66596f09 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
@@ -33,6 +33,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
     private String _updateVersion;
     private String _unsignedUpdateVersion;
     private String _lastModified;
+    private boolean _invalidated;
     private File _newsFile;
     private File _tempFile;
     private static NewsFetcher _instance;
@@ -134,6 +135,8 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
     }
     
     private boolean shouldFetchNews() {
+        if (_invalidated)
+            return true;
         updateLastFetched();
         String freq = _context.getProperty(ConfigUpdateHandler.PROP_REFRESH_FREQUENCY,
                                            ConfigUpdateHandler.DEFAULT_REFRESH_FREQUENCY);
@@ -155,6 +158,16 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
             return false;
         }
     }
+
+    /**
+     *  Call this when changing news URLs to force an update next time the timer fires.
+     *  @since 0.8.7
+     */
+    void invalidateNews() {
+        _lastModified = null;
+        _invalidated = true;
+    }
+
     public void fetchNews() {
         String newsURL = ConfigUpdateHelper.getNewsURL(_context);
         boolean shouldProxy = Boolean.valueOf(_context.getProperty(ConfigUpdateHandler.PROP_SHOULD_PROXY, ConfigUpdateHandler.DEFAULT_SHOULD_PROXY)).booleanValue();
@@ -172,6 +185,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
             get.addStatusListener(this);
             if (get.fetch()) {
                 _lastModified = get.getLastModified();
+                _invalidated = false;
             } else {
                 // backup news location - always proxied
                 _tempFile.delete();