Index: src/org/openstreetmap/josm/actions/OpenFileAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/OpenFileAction.java	(revision 17426)
+++ src/org/openstreetmap/josm/actions/OpenFileAction.java	(working copy)
@@ -16,14 +16,17 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.Future;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Stream;
 
 import javax.swing.JOptionPane;
 import javax.swing.SwingUtilities;
@@ -37,6 +40,7 @@
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.io.importexport.AllFormatsImporter;
 import org.openstreetmap.josm.gui.io.importexport.FileImporter;
+import org.openstreetmap.josm.gui.io.importexport.Options;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
 import org.openstreetmap.josm.io.OsmTransferException;
@@ -95,7 +99,7 @@
      * @since 11986 (return task)
      */
     public static Future<?> openFiles(List<File> fileList) {
-        return openFiles(fileList, false);
+        return openFiles(fileList, (Options[]) null);
     }
 
     /**
@@ -104,10 +108,24 @@
      * @param recordHistory {@code true} to save filename in history (default: false)
      * @return the future task
      * @since 11986 (return task)
+     * @deprecated Since xxx, use {@link OpenFileAction#openFiles(List, Options...)} with {@link Options#RECORD_HISTORY} instead.
      */
+    @Deprecated
     public static Future<?> openFiles(List<File> fileList, boolean recordHistory) {
+        Options[] options = recordHistory ? new Options[] {Options.RECORD_HISTORY} : null;
+        return openFiles(fileList, options);
+    }
+
+    /**
+     * Open a list of files. The complete list will be passed to batch importers.
+     * @param fileList A list of files
+     * @param options The options to use
+     * @return the future task
+     * @since xxx ({@link Options})
+     */
+    public static Future<?> openFiles(List<File> fileList, Options... options) {
         OpenFileTask task = new OpenFileTask(fileList, null);
-        task.setRecordHistory(recordHistory);
+        task.setOptions(options);
         return MainApplication.worker.submit(task);
     }
 
@@ -121,7 +139,7 @@
         private final Set<String> failedAll = new HashSet<>();
         private final FileFilter fileFilter;
         private boolean canceled;
-        private boolean recordHistory;
+        private final EnumSet<Options> options = EnumSet.noneOf(Options.class);
 
         /**
          * Constructs a new {@code OpenFileTask}.
@@ -167,19 +185,45 @@
         /**
          * Sets whether to save filename in history (for list of recently opened files).
          * @param recordHistory {@code true} to save filename in history (default: false)
+         * @deprecated since xxx (use {@link #setOptions} instead).
          */
+        @Deprecated
         public void setRecordHistory(boolean recordHistory) {
-            this.recordHistory = recordHistory;
+            if (recordHistory) {
+                this.options.add(Options.RECORD_HISTORY);
+            } else {
+                this.options.remove(Options.RECORD_HISTORY);
+            }
         }
 
         /**
+         * Set the options for the task.
+         * @param options The options to set
+         * @see Options
+         */
+        public void setOptions(Options[] options) {
+            this.options.clear();
+            if (options != null) {
+                Stream.of(options).filter(Objects::nonNull).forEach(this.options::add);
+            }
+        }
+
+        /**
          * Determines if filename must be saved in history (for list of recently opened files).
          * @return {@code true} if filename must be saved in history
          */
         public boolean isRecordHistory() {
-            return recordHistory;
+            return this.options.contains(Options.RECORD_HISTORY);
         }
 
+        /**
+         * Get the options for this task
+         * @return A set of options
+         */
+        public Set<Options> getOptions() {
+            return Collections.unmodifiableSet(this.options);
+        }
+
         @Override
         protected void cancel() {
             this.canceled = true;
@@ -339,7 +383,7 @@
                 }
             }
 
-            if (recordHistory) {
+            if (this.options.contains(Options.RECORD_HISTORY)) {
                 Collection<String> oldFileHistory = Config.getPref().getList("file-open.history");
                 fileHistory.addAll(oldFileHistory);
                 // remove the files which failed to load from the list
@@ -355,6 +399,7 @@
          * @param files data files to import
          */
         public void importData(FileImporter importer, List<File> files) {
+            importer.setOptions(this.options.toArray(new Options[0]));
             if (importer.isBatchImporter()) {
                 if (canceled) return;
                 String msg = trn("Opening {0} file...", "Opening {0} files...", files.size(), files.size());
@@ -372,7 +417,7 @@
                     }
                 }
             }
-            if (recordHistory && !importer.isBatchImporter()) {
+            if (this.options.contains(Options.RECORD_HISTORY) && !importer.isBatchImporter()) {
                 for (File f : files) {
                     try {
                         if (successfullyOpenedFiles.contains(f)) {
Index: src/org/openstreetmap/josm/gui/io/importexport/FileImporter.java
===================================================================
--- src/org/openstreetmap/josm/gui/io/importexport/FileImporter.java	(revision 17426)
+++ src/org/openstreetmap/josm/gui/io/importexport/FileImporter.java	(working copy)
@@ -5,7 +5,10 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.EnumSet;
 import java.util.List;
+import java.util.Objects;
+import java.util.stream.Stream;
 
 import javax.swing.JOptionPane;
 
@@ -36,6 +39,8 @@
 
     private boolean enabled;
 
+    protected final EnumSet<Options> options = EnumSet.noneOf(Options.class);
+
     /**
      * Constructs a new {@code FileImporter} with the given extension file filter.
      * @param filter The extension file filter
@@ -190,4 +195,16 @@
     public final void setEnabled(boolean enabled) {
         this.enabled = enabled;
     }
+
+    /**
+     * Set the options for the {@code FileImporter}.
+     * @param options The options to set
+     * @since xxx
+     */
+    public final void setOptions(Options[] options) {
+        this.options.clear();
+        if (options != null) {
+            Stream.of(options).filter(Objects::nonNull).forEach(this.options::add);
+        }
+    }
 }
Index: src/org/openstreetmap/josm/gui/io/importexport/JpgImporter.java
===================================================================
--- src/org/openstreetmap/josm/gui/io/importexport/JpgImporter.java	(revision 17426)
+++ src/org/openstreetmap/josm/gui/io/importexport/JpgImporter.java	(working copy)
@@ -7,14 +7,18 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.io.CachedFile;
 import org.openstreetmap.josm.io.IllegalDataException;
 
 /**
@@ -22,6 +26,11 @@
  *
  */
 public class JpgImporter extends FileImporter {
+    /** Check if the filename starts with a borked path ({@link java.io.File#File} drops consecutive {@code /} characters). */
+    private static final Pattern URL_START_BAD = Pattern.compile("^(https?:/)([^/].*)$");
+    /** Check for the beginning of a "good" url */
+    private static final Pattern URL_START_GOOD = Pattern.compile("^https?://.*$");
+
     private GpxLayer gpx;
 
     /**
@@ -73,7 +82,7 @@
         try {
             List<File> files = new ArrayList<>();
             Set<String> visitedDirs = new HashSet<>();
-            addRecursiveFiles(files, visitedDirs, sel, progressMonitor.createSubTaskMonitor(1, true));
+            addRecursiveFiles(this.options, files, visitedDirs, sel, progressMonitor.createSubTaskMonitor(1, true));
 
             if (progressMonitor.isCanceled())
                 return;
@@ -89,7 +98,12 @@
 
     static void addRecursiveFiles(List<File> files, Set<String> visitedDirs, List<File> sel, ProgressMonitor progressMonitor)
             throws IOException {
+        addRecursiveFiles(EnumSet.noneOf(Options.class), files, visitedDirs, sel, progressMonitor);
+    }
 
+    static void addRecursiveFiles(Set<Options> options, List<File> files, Set<String> visitedDirs, List<File> sel,
+            ProgressMonitor progressMonitor) throws IOException {
+
         if (progressMonitor.isCanceled())
             return;
 
@@ -100,13 +114,28 @@
                     if (visitedDirs.add(f.getCanonicalPath())) { // Do not loop over symlinks
                         File[] dirFiles = f.listFiles(); // Can be null for some strange directories (like lost+found)
                         if (dirFiles != null) {
-                            addRecursiveFiles(files, visitedDirs, Arrays.asList(dirFiles), progressMonitor.createSubTaskMonitor(1, true));
+                            addRecursiveFiles(options, files, visitedDirs, Arrays.asList(dirFiles),
+                                    progressMonitor.createSubTaskMonitor(1, true));
                         }
                     } else {
                         progressMonitor.worked(1);
                     }
                 } else {
-                    if (FILE_FILTER.accept(f)) {
+                    /* Check if the path is a web path, and if so, ensure that it is "correct" */
+                    final String path = f.getPath();
+                    Matcher matcherBad = URL_START_BAD.matcher(path);
+                    final String realPath;
+                    if (matcherBad.matches()) {
+                        realPath = matcherBad.replaceFirst(matcherBad.group(1) + "/" + matcherBad.group(2));
+                    } else {
+                        realPath = path;
+                    }
+                    if (URL_START_GOOD.matcher(realPath).matches() && FILE_FILTER.accept(f)
+                            && options.contains(Options.ALLOW_WEB_RESOURCES)) {
+                        try (CachedFile cachedFile = new CachedFile(realPath)) {
+                            files.add(cachedFile.getFile());
+                        }
+                    } else if (FILE_FILTER.accept(f)) {
                         files.add(f);
                     }
                     progressMonitor.worked(1);
Index: src/org/openstreetmap/josm/gui/io/importexport/Options.java
===================================================================
--- src/org/openstreetmap/josm/gui/io/importexport/Options.java	(nonexistent)
+++ src/org/openstreetmap/josm/gui/io/importexport/Options.java	(working copy)
@@ -0,0 +1,14 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.io.importexport;
+
+/**
+ * Options for ImportExport classes. Not all ImportExport classes support all options.
+ * @author Taylor Smock
+ *
+ */
+public enum Options {
+    /** Allow import/export of web resources */
+    ALLOW_WEB_RESOURCES,
+    /** Record history. Primarily used in OpenFileAction */
+    RECORD_HISTORY
+}
Index: src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java	(revision 17426)
+++ src/org/openstreetmap/josm/io/remotecontrol/PermissionPrefWithDefault.java	(working copy)
@@ -29,6 +29,9 @@
     /** Open local files */
     public static final PermissionPrefWithDefault OPEN_FILES =
             new PermissionPrefWithDefault("remotecontrol.permission.open-files", false, tr("Open local files"));
+    /** Open web files */
+    public static final PermissionPrefWithDefault ALLOW_WEB_RESOURCES =
+            new PermissionPrefWithDefault("remotecontrol.permission.open-remote-files", false, tr("Open remote files"));
     /** Load imagery layers */
     public static final PermissionPrefWithDefault LOAD_IMAGERY =
             new PermissionPrefWithDefault("remotecontrol.permission.imagery", true, tr("Load imagery layers"));
@@ -44,6 +47,7 @@
     /** Read protocol version */
     public static final PermissionPrefWithDefault READ_PROTOCOL_VERSION =
             new PermissionPrefWithDefault("remotecontrol.permission.read-protocolversion", true, tr("Read protocol version"));
+
     /**
      * name of the preference setting to permit the remote operation
      */
Index: src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(revision 17426)
+++ src/org/openstreetmap/josm/io/remotecontrol/RequestProcessor.java	(working copy)
@@ -162,6 +162,7 @@
             addRequestHandlerClass(LoadDataHandler.command, LoadDataHandler.class, true);
             addRequestHandlerClass(ImportHandler.command, ImportHandler.class, true);
             addRequestHandlerClass(OpenFileHandler.command, OpenFileHandler.class, true);
+            PermissionPrefWithDefault.addPermissionPref(PermissionPrefWithDefault.ALLOW_WEB_RESOURCES);
             addRequestHandlerClass(ImageryHandler.command, ImageryHandler.class, true);
             PermissionPrefWithDefault.addPermissionPref(PermissionPrefWithDefault.CHANGE_SELECTION);
             PermissionPrefWithDefault.addPermissionPref(PermissionPrefWithDefault.CHANGE_VIEWPORT);
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/OpenFileHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/OpenFileHandler.java	(revision 17426)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/OpenFileHandler.java	(working copy)
@@ -5,8 +5,10 @@
 
 import java.io.File;
 import java.util.Arrays;
+import java.util.EnumSet;
 
 import org.openstreetmap.josm.actions.OpenFileAction;
+import org.openstreetmap.josm.gui.io.importexport.Options;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
 
@@ -42,7 +44,12 @@
 
     @Override
     protected void handleRequest() throws RequestHandlerErrorException, RequestHandlerBadRequestException {
-        GuiHelper.runInEDTAndWait(() -> OpenFileAction.openFiles(Arrays.asList(new File(args.get("filename")))));
+        EnumSet<Options> options = EnumSet.noneOf(Options.class);
+        if (PermissionPrefWithDefault.ALLOW_WEB_RESOURCES.isAllowed()) {
+            options.add(Options.ALLOW_WEB_RESOURCES);
+        }
+        GuiHelper.runInEDTAndWait(() ->
+            OpenFileAction.openFiles(Arrays.asList(new File(args.get("filename"))), options.toArray(new Options[0])));
     }
 
     @Override
