Index: /trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 16426)
@@ -21,5 +21,4 @@
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -43,6 +42,5 @@
 import org.openstreetmap.josm.data.preferences.PreferencesWriter;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.io.OfflineAccessException;
-import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.io.NetworkManager;
 import org.openstreetmap.josm.spi.preferences.AbstractPreferences;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -804,12 +802,5 @@
     public Collection<String> getOnlinePluginSites() {
         Collection<String> pluginSites = new ArrayList<>(getPluginSites());
-        for (Iterator<String> it = pluginSites.iterator(); it.hasNext();) {
-            try {
-                OnlineResource.JOSM_WEBSITE.checkOfflineAccess(it.next(), Config.getUrls().getJOSMWebsite());
-            } catch (OfflineAccessException ex) {
-                Logging.log(Logging.LEVEL_WARN, ex);
-                it.remove();
-            }
-        }
+        pluginSites.removeIf(NetworkManager::isOffline);
         return pluginSites;
     }
Index: /trunk/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/CachedAttributionBingAerialTileSource.java	(revision 16426)
@@ -15,5 +15,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.CacheCustomContent;
-import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.io.NetworkManager;
 import org.openstreetmap.josm.tools.HttpClient;
 import org.openstreetmap.josm.tools.Logging;
@@ -63,10 +63,10 @@
 
         @Override
-        protected void checkOfflineAccess() {
+        protected boolean isOffline() {
             try {
-                String attributionUrl = getAttributionUrl().toExternalForm();
-                OnlineResource.ALL.checkOfflineAccess(attributionUrl, attributionUrl);
+                return NetworkManager.isOffline(getAttributionUrl().toExternalForm());
             } catch (MalformedURLException e) {
                 Logging.error(e);
+                return false;
             }
         }
Index: /trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 16426)
@@ -22,6 +22,5 @@
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.io.CachedFile;
-import org.openstreetmap.josm.io.OfflineAccessException;
-import org.openstreetmap.josm.io.OnlineResource;
+import org.openstreetmap.josm.io.NetworkManager;
 import org.openstreetmap.josm.io.imagery.ImageryReader;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -159,11 +158,5 @@
 
         protected void loadSource(String source) {
-            boolean online = true;
-            try {
-                OnlineResource.JOSM_WEBSITE.checkOfflineAccess(source, Config.getUrls().getJOSMWebsite());
-            } catch (OfflineAccessException e) {
-                Logging.log(Logging.LEVEL_WARN, e);
-                online = false;
-            }
+            boolean online = !NetworkManager.isOffline(source);
             if (clearCache && online) {
                 CachedFile.cleanup(source);
Index: /trunk/src/org/openstreetmap/josm/gui/GettingStarted.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/gui/GettingStarted.java	(revision 16426)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.gui.widgets.JosmEditorPane;
 import org.openstreetmap.josm.io.CacheCustomContent;
+import org.openstreetmap.josm.io.NetworkManager;
 import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -107,6 +108,6 @@
 
         @Override
-        protected void checkOfflineAccess() {
-            OnlineResource.JOSM_WEBSITE.checkOfflineAccess(new WikiReader().getBaseUrlWiki(), Config.getUrls().getJOSMWebsite());
+        protected boolean isOffline() {
+            return NetworkManager.isOffline(OnlineResource.JOSM_WEBSITE);
         }
 
Index: /trunk/src/org/openstreetmap/josm/io/CacheCustomContent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/CacheCustomContent.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/io/CacheCustomContent.java	(revision 16426)
@@ -95,19 +95,9 @@
     }
 
-    private boolean isOffline() {
-        try {
-            checkOfflineAccess();
-            return false;
-        } catch (OfflineAccessException e) {
-            Logging.trace(e);
-            return true;
-        }
-    }
-
-    /**
-     * Ensures underlying resource is not accessed in offline mode.
-     * @throws OfflineAccessException if resource is accessed in offline mode
-     */
-    protected abstract void checkOfflineAccess();
+    /**
+     * Checks underlying resource is not accessed in offline mode.
+     * @return whether resource is accessed in offline mode
+     */
+    protected abstract boolean isOffline();
 
     /**
Index: /trunk/src/org/openstreetmap/josm/io/CachedFile.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/CachedFile.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/io/CachedFile.java	(revision 16426)
@@ -435,11 +435,5 @@
         File localFile = null;
         List<String> localPathEntry = new ArrayList<>(Config.getPref().getList(prefKey));
-        boolean offline = false;
-        try {
-            checkOfflineAccess(urlStr);
-        } catch (OfflineAccessException e) {
-            Logging.trace(e);
-            offline = true;
-        }
+        boolean offline = NetworkManager.isOffline(urlStr);
         if (localPathEntry.size() == 2) {
             localFile = new File(localPathEntry.get(1));
@@ -534,9 +528,4 @@
     }
 
-    private static void checkOfflineAccess(String urlString) {
-        OnlineResource.JOSM_WEBSITE.checkOfflineAccess(urlString, Config.getUrls().getJOSMWebsite());
-        OnlineResource.OSM_API.checkOfflineAccess(urlString, OsmApi.getOsmApi().getServerUrl());
-    }
-
     private static String truncatePath(String directory, String fileName) {
         if (directory.length() + fileName.length() > 255) {
Index: /trunk/src/org/openstreetmap/josm/io/NetworkManager.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/NetworkManager.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/io/NetworkManager.java	(revision 16426)
@@ -74,4 +74,14 @@
 
     /**
+     * Determines if the given online resource specified as URL is currently offline.
+     * @param url the online resource specified as URL
+     * @return {@code true} if {@code url} is offline and should not be accessed
+     * @since 16426
+     */
+    public static boolean isOffline(String url) {
+        return OFFLINE_RESOURCES.stream().anyMatch(r -> r.matches(url));
+    }
+
+    /**
      * Determines if the given online resource is currently offline.
      * @param r the online resource
Index: /trunk/src/org/openstreetmap/josm/io/OnlineResource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OnlineResource.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/io/OnlineResource.java	(revision 16426)
@@ -3,4 +3,6 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+
+import org.openstreetmap.josm.spi.preferences.Config;
 
 /**
@@ -37,12 +39,34 @@
 
     /**
+     * Replies whether the given URL matches this online resource
+     * @return whether the given URL matches this online resource
+     */
+    public final boolean matches(String url) {
+        final String baseUrl;
+        switch (this) {
+            case ALL:
+                return true;
+            case OSM_API:
+                baseUrl = OsmApi.getOsmApi().getServerUrl();
+                break;
+            case JOSM_WEBSITE:
+                baseUrl = Config.getUrls().getJOSMWebsite();
+                break;
+            default:
+                return false;
+        }
+        return url.startsWith(baseUrl.substring(baseUrl.indexOf("://")), url.indexOf("://"));
+    }
+
+    /**
      * Ensures resource is not accessed in offline mode.
      * @param downloadString The attempted download string
-     * @param resourceString The resource download string that should not be accessed
+     * @param ignore ignored
      * @throws OfflineAccessException if resource is accessed in offline mode, in any protocol
+     * @deprecated use {@link NetworkManager#isOffline(String)}
      */
-    public final void checkOfflineAccess(String downloadString, String resourceString) {
-        if (NetworkManager.isOffline(this) && downloadString
-                .startsWith(resourceString.substring(resourceString.indexOf("://")), downloadString.indexOf("://"))) {
+    @Deprecated
+    public final void checkOfflineAccess(String downloadString, String ignore) {
+        if (NetworkManager.isOffline(downloadString)) {
             throw new OfflineAccessException(tr("Unable to access ''{0}'': {1} not available (offline mode)", downloadString, getLocName()));
         }
Index: /trunk/src/org/openstreetmap/josm/io/OsmApi.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmApi.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/io/OsmApi.java	(revision 16426)
@@ -209,6 +209,6 @@
 
         @Override
-        protected void checkOfflineAccess() {
-            OnlineResource.OSM_API.checkOfflineAccess(getBaseUrl(getServerUrlFromPref(), "0.6")+CAPABILITIES, getServerUrlFromPref());
+        protected boolean isOffline() {
+            return NetworkManager.isOffline(OnlineResource.OSM_API);
         }
 
Index: /trunk/src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 16426)
@@ -20,5 +20,4 @@
 import org.openstreetmap.josm.io.auth.CredentialsAgentException;
 import org.openstreetmap.josm.io.auth.CredentialsManager;
-import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.HttpClient;
 import org.openstreetmap.josm.tools.Logging;
@@ -158,6 +157,7 @@
             boolean uncompressAccordingToContentDisposition, String httpMethod, byte[] requestBody) throws OsmTransferException {
         try {
-            OnlineResource.JOSM_WEBSITE.checkOfflineAccess(urlStr, Config.getUrls().getJOSMWebsite());
-            OnlineResource.OSM_API.checkOfflineAccess(urlStr, OsmApi.getOsmApi().getServerUrl());
+            if (NetworkManager.isOffline(urlStr)) {
+                throw new OsmApiException(new OfflineAccessException(tr("{0} not available (offline mode)", urlStr)));
+            }
 
             URL url = null;
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 16425)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 16426)
@@ -67,6 +67,4 @@
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
 import org.openstreetmap.josm.io.NetworkManager;
-import org.openstreetmap.josm.io.OfflineAccessException;
-import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Destroyable;
@@ -436,5 +434,5 @@
      */
     public static boolean checkAndConfirmPluginUpdate(Component parent) {
-        if (!checkOfflineAccess()) {
+        if (Preferences.main().getPluginSites().stream().anyMatch(NetworkManager::isOffline)) {
             Logging.info(tr("{0} not available (offline mode)", tr("Plugin update")));
             return false;
@@ -541,21 +539,4 @@
         }
         return ret == 0;
-    }
-
-    private static boolean checkOfflineAccess() {
-        if (NetworkManager.isOffline(OnlineResource.ALL)) {
-            return false;
-        }
-        if (NetworkManager.isOffline(OnlineResource.JOSM_WEBSITE)) {
-            for (String updateSite : Preferences.main().getPluginSites()) {
-                try {
-                    OnlineResource.JOSM_WEBSITE.checkOfflineAccess(updateSite, Config.getUrls().getJOSMWebsite());
-                } catch (OfflineAccessException e) {
-                    Logging.trace(e);
-                    return false;
-                }
-            }
-        }
-        return true;
     }
 
Index: /trunk/test/unit/org/openstreetmap/josm/io/NetworkManagerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/io/NetworkManagerTest.java	(revision 16425)
+++ /trunk/test/unit/org/openstreetmap/josm/io/NetworkManagerTest.java	(revision 16426)
@@ -54,11 +54,17 @@
     public void testOfflineResources() {
         NetworkManager.setOnline(OnlineResource.ALL);
+        assertFalse(NetworkManager.isOffline("http://www.example.com/"));
         assertTrue(NetworkManager.getOfflineResources().isEmpty());
         assertFalse(NetworkManager.isOffline(OnlineResource.JOSM_WEBSITE));
         NetworkManager.setOffline(OnlineResource.JOSM_WEBSITE);
+        assertTrue(NetworkManager.isOffline("https://josm.openstreetmap.de/maps"));
+        assertFalse(NetworkManager.isOffline("http://www.example.com/"));
         assertTrue(NetworkManager.isOffline(OnlineResource.JOSM_WEBSITE));
         NetworkManager.setOnline(OnlineResource.JOSM_WEBSITE);
+        assertFalse(NetworkManager.isOffline("https://josm.openstreetmap.de/maps"));
         assertFalse(NetworkManager.isOffline(OnlineResource.JOSM_WEBSITE));
         NetworkManager.setOffline(OnlineResource.ALL);
+        assertTrue(NetworkManager.isOffline("https://josm.openstreetmap.de/maps"));
+        assertTrue(NetworkManager.isOffline("http://www.example.com/"));
         assertTrue(NetworkManager.isOffline(OnlineResource.JOSM_WEBSITE));
         assertTrue(NetworkManager.isOffline(OnlineResource.OSM_API));
