Index: src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 4187)
+++ src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(working copy)
@@ -9,6 +9,7 @@
 import java.awt.Dimension;
 import java.awt.FontMetrics;
 import java.awt.Graphics;
+import java.awt.Graphics2D;
 import java.awt.Image;
 import java.awt.MediaTracker;
 import java.awt.Point;
@@ -19,13 +20,22 @@
 import java.awt.event.MouseMotionListener;
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
+import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
 import java.io.File;
 
 import javax.swing.JComponent;
 
 import org.openstreetmap.josm.Main;
 
+import com.drew.imaging.jpeg.JpegMetadataReader;
+import com.drew.imaging.jpeg.JpegProcessingException;
+import com.drew.metadata.Directory;
+import com.drew.metadata.Metadata;
+import com.drew.metadata.MetadataException;
+import com.drew.metadata.exif.ExifDirectory;
+
 public class ImageDisplay extends JComponent {
 
     /** The file that is currently displayed */
@@ -89,8 +99,64 @@
                     tracker.removeImage(img);
                     return;
                 }
+
                 ImageDisplay.this.image = img;
                 visibleRect = new Rectangle(0, 0, img.getWidth(null), img.getHeight(null));
+
+                int orientation = -1;
+                try {
+                    final Metadata metadata = JpegMetadataReader.readMetadata(file);
+                    final Directory dir = metadata.getDirectory(ExifDirectory.class);
+                    orientation = dir.getInt(ExifDirectory.TAG_ORIENTATION);
+                } catch (JpegProcessingException e1) {
+                    e1.printStackTrace();
+                } catch (MetadataException e) {
+                    e.printStackTrace();
+                }
+
+                final int w = (int) visibleRect.getWidth();
+                final int h = (int) visibleRect.getHeight();
+
+                outer: {
+                    final int hh, ww, q;
+                    final double ax, ay;
+                    switch (orientation) {
+                    case 8:
+                        q = -1;
+                        ax = w / 2;
+                        ay = w / 2;
+                        ww = h;
+                        hh = w;
+                        break;
+                    case 3:
+                        q = 2;
+                        ax = w / 2;
+                        ay = h / 2;
+                        ww = w;
+                        hh = h;
+                        break;
+                    case 6:
+                        q = 1;
+                        ax = h / 2;
+                        ay = h / 2;
+                        ww = h;
+                        hh = w;
+                        break;
+                    default:
+                        break outer;
+                    }
+
+                    final BufferedImage rot = new BufferedImage(ww, hh, BufferedImage.TYPE_INT_RGB);
+                    final AffineTransform xform = AffineTransform.getQuadrantRotateInstance(q, ax, ay);
+                    final Graphics2D g = rot.createGraphics();
+                    g.drawImage(image, xform, null);
+                    g.dispose();
+
+                    visibleRect.setSize(ww, hh);
+                    image.flush();
+                    ImageDisplay.this.image = rot;
+                }
+
                 selectedRect = null;
                 errorLoading = error;
             }
