Index: trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 17545)
+++ trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 17548)
@@ -23,5 +23,5 @@
 import org.openstreetmap.josm.gui.io.importexport.GeoJSONImporter;
 import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
-import org.openstreetmap.josm.gui.io.importexport.JpgImporter;
+import org.openstreetmap.josm.gui.io.importexport.ImageImporter;
 import org.openstreetmap.josm.gui.io.importexport.NMEAImporter;
 import org.openstreetmap.josm.gui.io.importexport.NoteImporter;
@@ -70,5 +70,5 @@
                 RtkLibImporter.class,
                 NoteImporter.class,
-                JpgImporter.class,
+                ImageImporter.class,
                 WMSLayerImporter.class,
                 AllFormatsImporter.class,
Index: trunk/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java	(revision 17545)
+++ trunk/src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java	(revision 17548)
@@ -2,6 +2,7 @@
 package org.openstreetmap.josm.data.gpx;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 import java.io.File;
-import java.io.IOException;
 import java.util.Date;
 import java.util.List;
@@ -18,5 +19,6 @@
 
 import com.drew.imaging.jpeg.JpegMetadataReader;
-import com.drew.lang.CompoundException;
+import com.drew.imaging.png.PngMetadataReader;
+import com.drew.imaging.tiff.TiffMetadataReader;
 import com.drew.metadata.Directory;
 import com.drew.metadata.Metadata;
@@ -582,22 +584,61 @@
         }
 
+        String fn = file.getName();
+
         try {
-            metadata = JpegMetadataReader.readMetadata(file);
-        } catch (CompoundException | IOException ex) {
-            Logging.error(ex);
-            setExifTime(null);
-            setExifCoor(null);
-            setPos(null);
-            return;
+            // try to parse metadata according to extension
+            String ext = fn.substring(fn.lastIndexOf(".") + 1).toLowerCase();
+            switch (ext) {
+            case "jpg":
+            case "jpeg":
+                metadata = JpegMetadataReader.readMetadata(file);
+                break;
+            case "tif":
+            case "tiff":
+                metadata = TiffMetadataReader.readMetadata(file);
+                break;
+            case "png":
+                metadata = PngMetadataReader.readMetadata(file);
+                break;
+            default:
+                throw new NoMetadataReaderWarning(ext);
+            }
+        } catch (Exception topException) {
+            //try other formats (e.g. JPEG file with .png extension)
+            try {
+                metadata = JpegMetadataReader.readMetadata(file);
+            } catch (Exception ex1) {
+                try {
+                    metadata = TiffMetadataReader.readMetadata(file);
+                } catch (Exception ex2) {
+                    try {
+                        metadata = PngMetadataReader.readMetadata(file);
+                    } catch (Exception ex3) {
+
+                        Logging.warn(topException);
+                        Logging.info(tr("Can''t parse metadata for file \"{0}\". Using last modified date as timestamp.", fn));
+                        setExifTime(new Date(file.lastModified()));
+                        setExifCoor(null);
+                        setPos(null);
+                        return;
+                    }
+                }
+            }
         }
 
         // Changed to silently cope with no time info in exif. One case
         // of person having time that couldn't be parsed, but valid GPS info
+        Date time = null;
         try {
-            setExifTime(ExifReader.readTime(metadata));
+            time = ExifReader.readTime(metadata);
         } catch (JosmRuntimeException | IllegalArgumentException | IllegalStateException ex) {
             Logging.warn(ex);
-            setExifTime(null);
-        }
+        }
+
+        if (time == null) {
+            Logging.info(tr("No EXIF time in file \"{0}\". Using last modified date as timestamp.", fn));
+            time = new Date(file.lastModified()); //use lastModified time if no EXIF time present
+        }
+        setExifTime(time);
 
         final Directory dir = metadata.getFirstDirectoryOfType(JpegDirectory.class);
@@ -623,5 +664,5 @@
         }
 
-        if (dirGps == null) {
+        if (dirGps == null || dirGps.getTagCount() <= 1) {
             setExifCoor(null);
             setPos(null);
@@ -658,4 +699,10 @@
     }
 
+    private static class NoMetadataReaderWarning extends Exception {
+        NoMetadataReaderWarning(String ext) {
+            super("No metadata reader for format *." + ext);
+        }
+    }
+
     private static <T> void ifNotNull(T value, Consumer<T> setter) {
         if (value != null) {
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/ImageImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/ImageImporter.java	(revision 17548)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/ImageImporter.java	(revision 17548)
@@ -0,0 +1,146 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.io.importexport;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.imageio.ImageIO;
+
+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.IllegalDataException;
+
+/**
+ * File importer allowing to import geotagged images
+ * @since 17548
+ */
+public class ImageImporter extends FileImporter {
+    private GpxLayer gpx;
+
+    /**
+     * The supported image file types on the current system
+     */
+    public static final String[] SUPPORTED_FILE_TYPES = ImageIO.getReaderFileSuffixes();
+
+    /**
+     * The default file filter
+     */
+    public static final ExtensionFileFilter FILE_FILTER = getFileFilters(false);
+
+    /**
+     * An alternate file filter that also includes folders.
+     */
+    public static final ExtensionFileFilter FILE_FILTER_WITH_FOLDERS = getFileFilters(true);
+
+    private static ExtensionFileFilter getFileFilters(boolean folder) {
+        String typeStr = String.join(",", SUPPORTED_FILE_TYPES);
+        String humanStr = tr("Image Files") + " (*." + String.join(", *.", SUPPORTED_FILE_TYPES);
+        if (folder) {
+            humanStr += ", " + tr("folder");
+        }
+        humanStr += ")";
+
+        return new ExtensionFileFilter(typeStr, "jpg", humanStr);
+    }
+
+    /**
+     * Constructs a new {@code ImageImporter}.
+     */
+    public ImageImporter() {
+        this(false);
+    }
+
+    /**
+     * Constructs a new {@code ImageImporter} with folders selection, if wanted.
+     * @param includeFolders If true, includes folders in the file filter
+     */
+    public ImageImporter(boolean includeFolders) {
+        super(includeFolders ? FILE_FILTER_WITH_FOLDERS : FILE_FILTER);
+    }
+
+    /**
+     * Constructs a new {@code ImageImporter} for the given GPX layer. Folders selection is allowed.
+     * @param gpx The GPX layer
+     */
+    public ImageImporter(GpxLayer gpx) {
+        this(true);
+        this.gpx = gpx;
+    }
+
+    @Override
+    public boolean acceptFile(File pathname) {
+        return super.acceptFile(pathname) || pathname.isDirectory();
+    }
+
+    @Override
+    public void importData(List<File> sel, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
+        progressMonitor.beginTask(tr("Looking for image files"), 1);
+        try {
+            List<File> files = new ArrayList<>();
+            Set<String> visitedDirs = new HashSet<>();
+            addRecursiveFiles(files, visitedDirs, sel, progressMonitor.createSubTaskMonitor(1, true));
+
+            if (progressMonitor.isCanceled())
+                return;
+
+            if (files.isEmpty())
+                throw new IOException(tr("No image files found."));
+
+            GeoImageLayer.create(files, gpx);
+        } finally {
+            progressMonitor.finishTask();
+        }
+    }
+
+    static void addRecursiveFiles(List<File> files, Set<String> visitedDirs, List<File> sel, ProgressMonitor progressMonitor)
+            throws IOException {
+
+        if (progressMonitor.isCanceled())
+            return;
+
+        progressMonitor.beginTask(null, sel.size());
+        try {
+            for (File f : sel) {
+                if (f.isDirectory()) {
+                    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));
+                        }
+                    } else {
+                        progressMonitor.worked(1);
+                    }
+                } else {
+                    if (FILE_FILTER.accept(f)) {
+                        files.add(f);
+                    }
+                    progressMonitor.worked(1);
+                }
+            }
+        } finally {
+            progressMonitor.finishTask();
+        }
+    }
+
+    @Override
+    public boolean isBatchImporter() {
+        return true;
+    }
+
+    /**
+     * Needs to be the last, to avoid problems.
+     */
+    @Override
+    public double getPriority() {
+        return -1000;
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/io/importexport/JpgImporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/importexport/JpgImporter.java	(revision 17545)
+++ trunk/src/org/openstreetmap/josm/gui/io/importexport/JpgImporter.java	(revision 17548)
@@ -2,160 +2,25 @@
 package org.openstreetmap.josm.gui.io.importexport;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.io.File;
-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;
-
 /**
- * File importer allowing to import geotagged images (*.jpg files).
- *
- */
-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;
+*  File importer allowing to import geotagged images
+*  @deprecated use {@link ImageImporter} instead
+*/
+@Deprecated
+public class JpgImporter extends ImageImporter {
 
     /**
-     * The default file filter (only *.jpg files).
-     */
-    public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
-            "jpg,jpeg", "jpg", tr("Image Files") + " (*.jpg)");
-
-    /**
-     * An alternate file filter that also includes folders.
-     * @since 5438
-     */
-    public static final ExtensionFileFilter FILE_FILTER_WITH_FOLDERS = new ExtensionFileFilter(
-            "jpg,jpeg", "jpg", tr("Image Files") + " (*.jpg, "+ tr("folder")+')');
-
-    /**
-     * Constructs a new {@code JpgImporter}.
-     */
+    * Constructs a new {@code JpgImporter}.
+    */
     public JpgImporter() {
-        this(false);
+        super(false);
     }
 
     /**
-     * Constructs a new {@code JpgImporter} with folders selection, if wanted.
-     * @param includeFolders If true, includes folders in the file filter
-     * @since 5438
-     */
+    * Constructs a new {@code JpgImporter} with folders selection, if wanted.
+    * @param includeFolders If true, includes folders in the file filter
+    * @since 5438
+    */
     public JpgImporter(boolean includeFolders) {
-        super(includeFolders ? FILE_FILTER_WITH_FOLDERS : FILE_FILTER);
-    }
-
-    /**
-     * Constructs a new {@code JpgImporter} for the given GPX layer. Folders selection is allowed.
-     * @param gpx The GPX layer
-     */
-    public JpgImporter(GpxLayer gpx) {
-        this(true);
-        this.gpx = gpx;
-    }
-
-    @Override
-    public boolean acceptFile(File pathname) {
-        return super.acceptFile(pathname) || pathname.isDirectory();
-    }
-
-    @Override
-    public void importData(List<File> sel, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
-        progressMonitor.beginTask(tr("Looking for image files"), 1);
-        try {
-            List<File> files = new ArrayList<>();
-            Set<String> visitedDirs = new HashSet<>();
-            addRecursiveFiles(this.options, files, visitedDirs, sel, progressMonitor.createSubTaskMonitor(1, true));
-
-            if (progressMonitor.isCanceled())
-                return;
-
-            if (files.isEmpty())
-                throw new IOException(tr("No image files found."));
-
-            GeoImageLayer.create(files, gpx);
-        } finally {
-            progressMonitor.finishTask();
-        }
-    }
-
-    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;
-
-        progressMonitor.beginTask(null, sel.size());
-        try {
-            for (File f : sel) {
-                if (f.isDirectory()) {
-                    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(options, files, visitedDirs, Arrays.asList(dirFiles),
-                                    progressMonitor.createSubTaskMonitor(1, true));
-                        }
-                    } else {
-                        progressMonitor.worked(1);
-                    }
-                } else {
-                    /* 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);
-                }
-            }
-        } finally {
-            progressMonitor.finishTask();
-        }
-    }
-
-    @Override
-    public boolean isBatchImporter() {
-        return true;
-    }
-
-    /**
-     * Needs to be the last, to avoid problems.
-     */
-    @Override
-    public double getPriority() {
-        return -1000;
+        super(includeFolders);
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 17545)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 17548)
@@ -79,5 +79,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.io.importexport.GpxImporter;
-import org.openstreetmap.josm.gui.io.importexport.JpgImporter;
+import org.openstreetmap.josm.gui.io.importexport.ImageImporter;
 import org.openstreetmap.josm.gui.io.importexport.NMEAImporter;
 import org.openstreetmap.josm.gui.io.importexport.RtkLibImporter;
@@ -718,5 +718,5 @@
             openButton.addActionListener(ae -> {
                 AbstractFileChooser fc = DiskAccessAction.createAndOpenFileChooser(true, false, null,
-                        JpgImporter.FILE_FILTER_WITH_FOLDERS, JFileChooser.FILES_ONLY, "geoimage.lastdirectory");
+                        ImageImporter.FILE_FILTER_WITH_FOLDERS, JFileChooser.FILES_ONLY, "geoimage.lastdirectory");
                 if (fc == null)
                     return;
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 17545)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 17548)
@@ -56,5 +56,5 @@
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
-import org.openstreetmap.josm.gui.io.importexport.JpgImporter;
+import org.openstreetmap.josm.gui.io.importexport.ImageImporter;
 import org.openstreetmap.josm.gui.layer.AbstractModifiableLayer;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
@@ -313,5 +313,5 @@
                     }
 
-                    File[] children = f.listFiles(JpgImporter.FILE_FILTER_WITH_FOLDERS);
+                    File[] children = f.listFiles(ImageImporter.FILE_FILTER_WITH_FOLDERS);
                     if (children != null) {
                         progressMonitor.subTask(tr("Scanning directory {0}", f.getPath()));
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 17545)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 17548)
@@ -14,5 +14,4 @@
 import java.awt.Rectangle;
 import java.awt.RenderingHints;
-import java.awt.Toolkit;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
@@ -25,5 +24,7 @@
 import java.awt.image.ImageObserver;
 import java.io.File;
-
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
 import javax.swing.JComponent;
 import javax.swing.SwingUtilities;
@@ -244,6 +245,13 @@
             if (!(entry.getWidth() > 0 && entry.getHeight() > 0)) {
                 synchronized (entry) {
-                    img.getWidth(this);
-                    img.getHeight(this);
+                    int width = img.getWidth(this);
+                    int height = img.getHeight(this);
+
+                    if (!(entry.getWidth() > 0 && entry.getHeight() > 0) && width > 0 && height > 0) {
+                        // dimensions not in metadata but already present in image, so observer won't be called
+                        entry.setWidth(width);
+                        entry.setHeight(height);
+                        entry.notifyAll();
+                    }
 
                     long now = System.currentTimeMillis();
@@ -280,80 +288,86 @@
         @Override
         public void run() {
-            Image img = Toolkit.getDefaultToolkit().createImage(file.getPath());
-            if (!updateImageEntry(img))
-                return;
-
-            int width = entry.getWidth();
-            int height = entry.getHeight();
-
-            if (mayFitMemory(((long) width)*height*4*2)) {
-                Logging.info(tr("Loading {0}", file.getPath()));
-                tracker.addImage(img, 1);
-
-                // Wait for the end of loading
-                while (!tracker.checkID(1, true)) {
+            Image img;
+            try {
+                img = ImageIO.read(file);
+
+                if (!updateImageEntry(img))
+                    return;
+
+                int width = entry.getWidth();
+                int height = entry.getHeight();
+
+                if (mayFitMemory(((long) width)*height*4*2)) {
+                    Logging.info(tr("Loading {0}", file.getPath()));
+                    tracker.addImage(img, 1);
+
+                    // Wait for the end of loading
+                    while (!tracker.checkID(1, true)) {
+                        if (this.entry != ImageDisplay.this.entry) {
+                            // The file has changed
+                            tracker.removeImage(img);
+                            return;
+                        }
+                        try {
+                            Thread.sleep(5);
+                        } catch (InterruptedException e) {
+                            Logging.trace(e);
+                            Logging.warn("InterruptedException in {0} while loading image {1}",
+                                    getClass().getSimpleName(), file.getPath());
+                            Thread.currentThread().interrupt();
+                        }
+                    }
+                    if (tracker.isErrorID(1)) {
+                        Logging.warn("Abort loading of {0} since tracker errored with 1", file);
+                        // the tracker catches OutOfMemory conditions
+                        tracker.removeImage(img);
+                        img = null;
+                    } else {
+                        tracker.removeImage(img);
+                    }
+                } else {
+                    Logging.warn("Abort loading of {0} since it might not fit into memory", file);
+                    img = null;
+                }
+
+                synchronized (ImageDisplay.this) {
                     if (this.entry != ImageDisplay.this.entry) {
                         // The file has changed
-                        tracker.removeImage(img);
                         return;
                     }
-                    try {
-                        Thread.sleep(5);
-                    } catch (InterruptedException e) {
-                        Logging.trace(e);
-                        Logging.warn("InterruptedException in {0} while loading image {1}",
-                                getClass().getSimpleName(), file.getPath());
-                        Thread.currentThread().interrupt();
+
+                    if (img != null) {
+                        boolean switchedDim = false;
+                        if (ExifReader.orientationNeedsCorrection(entry.getExifOrientation())) {
+                            if (ExifReader.orientationSwitchesDimensions(entry.getExifOrientation())) {
+                                width = img.getHeight(null);
+                                height = img.getWidth(null);
+                                switchedDim = true;
+                            }
+                            final BufferedImage rot = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+                            final AffineTransform xform = ExifReader.getRestoreOrientationTransform(
+                                    entry.getExifOrientation(),
+                                    img.getWidth(null),
+                                    img.getHeight(null));
+                            final Graphics2D g = rot.createGraphics();
+                            g.drawImage(img, xform, null);
+                            g.dispose();
+                            img = rot;
+                        }
+
+                        ImageDisplay.this.image = img;
+                        visibleRect = new VisRect(0, 0, width, height);
+
+                        Logging.debug("Loaded {0} with dimensions {1}x{2} memoryTaken={3}m exifOrientationSwitchedDimension={4}",
+                                file.getPath(), width, height, width*height*4/1024/1024, switchedDim);
                     }
-                }
-                if (tracker.isErrorID(1)) {
-                    Logging.warn("Abort loading of {0} since tracker errored with 1", file);
-                    // the tracker catches OutOfMemory conditions
-                    tracker.removeImage(img);
-                    img = null;
-                } else {
-                    tracker.removeImage(img);
-                }
-            } else {
-                Logging.warn("Abort loading of {0} since it might not fit into memory", file);
-                img = null;
-            }
-
-            synchronized (ImageDisplay.this) {
-                if (this.entry != ImageDisplay.this.entry) {
-                    // The file has changed
-                    return;
-                }
-
-                if (img != null) {
-                    boolean switchedDim = false;
-                    if (ExifReader.orientationNeedsCorrection(entry.getExifOrientation())) {
-                        if (ExifReader.orientationSwitchesDimensions(entry.getExifOrientation())) {
-                            width = img.getHeight(null);
-                            height = img.getWidth(null);
-                            switchedDim = true;
-                        }
-                        final BufferedImage rot = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-                        final AffineTransform xform = ExifReader.getRestoreOrientationTransform(
-                                entry.getExifOrientation(),
-                                img.getWidth(null),
-                                img.getHeight(null));
-                        final Graphics2D g = rot.createGraphics();
-                        g.drawImage(img, xform, null);
-                        g.dispose();
-                        img = rot;
-                    }
-
-                    ImageDisplay.this.image = img;
-                    visibleRect = new VisRect(0, 0, width, height);
-
-                    Logging.debug("Loaded {0} with dimensions {1}x{2} memoryTaken={3}m exifOrientationSwitchedDimension={4}",
-                            file.getPath(), width, height, width*height*4/1024/1024, switchedDim);
-                }
-
-                selectedRect = null;
-                errorLoading = (img == null);
-            }
-            ImageDisplay.this.repaint();
+
+                    selectedRect = null;
+                    errorLoading = (img == null);
+                }
+                ImageDisplay.this.repaint();
+            } catch (IOException ex) {
+                Logging.error(ex);
+            }
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportImagesAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportImagesAction.java	(revision 17545)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/ImportImagesAction.java	(revision 17548)
@@ -16,5 +16,5 @@
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.io.importexport.JpgImporter;
+import org.openstreetmap.josm.gui.io.importexport.ImageImporter;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
@@ -69,5 +69,5 @@
             return;
         }
-        JpgImporter importer = new JpgImporter(layer);
+        ImageImporter importer = new ImageImporter(layer);
         AbstractFileChooser fc = new FileChooserManager(true, "geoimage.lastdirectory", Config.getPref().get("lastDirectory")).
                 createFileChooser(true, null, importer.filter, JFileChooser.FILES_AND_DIRECTORIES).openFileChooser();
Index: trunk/src/org/openstreetmap/josm/tools/ExifReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ExifReader.java	(revision 17545)
+++ trunk/src/org/openstreetmap/josm/tools/ExifReader.java	(revision 17548)
@@ -178,5 +178,5 @@
      */
     public static LatLon readLatLon(GpsDirectory dirGps) throws MetadataException {
-        if (dirGps != null) {
+        if (dirGps != null && dirGps.getTagCount() > 1) {
             double lat = readAxis(dirGps, GpsDirectory.TAG_LATITUDE, GpsDirectory.TAG_LATITUDE_REF, 'S');
             double lon = readAxis(dirGps, GpsDirectory.TAG_LONGITUDE, GpsDirectory.TAG_LONGITUDE_REF, 'W');
