Index: src/org/openstreetmap/josm/actions/OpenFileAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/OpenFileAction.java	(revision 1519)
+++ src/org/openstreetmap/josm/actions/OpenFileAction.java	(arbetskopia)
@@ -19,6 +19,7 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.layer.geoTiffLayer;
 import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
 import org.openstreetmap.josm.io.GpxReader;
 import org.openstreetmap.josm.io.NmeaReader;
@@ -61,6 +62,8 @@
                 openFileAsGpx(file);
             else if (asNmeaData(file.getName()))
                 openFileAsNmea(file);
+            else if (asGeoTiffData(file.getName()))
+                openFileAsGeoTiff(file);
             else
                 openAsData(file);
         } catch (SAXException x) {
@@ -72,6 +75,17 @@
         }
     }
 
+    private void openFileAsGeoTiff(File file) throws SAXException, IOException, FileNotFoundException {
+        String fn = file.getName();
+        if (ExtensionFileFilter.filters[ExtensionFileFilter.GEOTIFF].acceptName(fn)) {
+        	geoTiffLayer gtLayer = new geoTiffLayer(fn, file.getAbsolutePath());
+            Main.main.addLayer(gtLayer);
+ 
+        } else {
+            throw new IllegalStateException();
+        }
+    }
+    
     private void openAsData(File file) throws SAXException, IOException, FileNotFoundException {
         String fn = file.getName();
         if (ExtensionFileFilter.filters[ExtensionFileFilter.OSM].acceptName(fn)) {
@@ -177,5 +191,8 @@
         return ExtensionFileFilter.filters[ExtensionFileFilter.NMEA].acceptName(fn);
     }
 
+    private boolean asGeoTiffData(String fn) {
+        return ExtensionFileFilter.filters[ExtensionFileFilter.GEOTIFF].acceptName(fn);
+    }
 
 }
Index: src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 1519)
+++ src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(arbetskopia)
@@ -21,11 +21,13 @@
     public static final int OSM = 0;
     public static final int GPX = 1;
     public static final int NMEA = 2;
+    public static final int GEOTIFF = 3;
 
     public static ExtensionFileFilter[] filters = {
         new ExtensionFileFilter("osm,xml", "osm", tr("OSM Server Files")+ " (*.osm *.xml)"),
         new ExtensionFileFilter("gpx,gpx.gz", "gpx", tr("GPX Files") + " (*.gpx *.gpx.gz)"),
         new ExtensionFileFilter("nmea,nme,nma,txt", "nmea", tr("NMEA-0183 Files") + " (*.nmea *.nme *.nma *.txt)"),
+        new ExtensionFileFilter("tif,tiff", "tif", tr("GeoTiff Files") + " (*.tif *.tiff)"),
     };
 
     /**
Index: src/org/openstreetmap/josm/gui/layer/geoTiffLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/geoTiffLayer.java	(revision 0)
+++ src/org/openstreetmap/josm/gui/layer/geoTiffLayer.java	(revision 0)
@@ -0,0 +1,216 @@
+package org.openstreetmap.josm.gui.layer;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import geotiffplugin.GeoTiffPlugin;
+
+import java.awt.Component;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.Toolkit;
+import java.awt.geom.AffineTransform;
+import java.awt.image.RenderedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+import javax.swing.filechooser.FileFilter;
+
+import javax.media.jai.*;
+
+import org.geotools.coverage.grid.GridCoverage2D;
+import org.geotools.data.DataSourceException;
+import org.geotools.gce.geotiff.GeoTiffReader;
+import org.opengis.geometry.DirectPosition;
+import org.opengis.geometry.Envelope;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.ExtensionFileFilter;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
+import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+
+/**
+ * This is a layer that displays a geotiff image
+ */
+public class geoTiffLayer extends Layer {
+
+	protected static final Icon icon =
+		new ImageIcon(Toolkit.getDefaultToolkit().createImage(GeoTiffPlugin.class.getResource("/images/geotiff_small.png")));
+
+	protected ExecutorService executor = null;
+	protected String baseURL;
+	protected GeoTiffReader gtRreader = null;
+	protected GridCoverage2D coverage = null;
+	protected File file;
+	protected RenderedImage image;
+	protected CoordinateReferenceSystem crs;
+	protected Envelope env;
+
+	protected DirectPosition lc;
+	protected EastNorth lcEN;
+	protected DirectPosition uc;
+	protected EastNorth ucEN;
+	
+	public geoTiffLayer() {
+		this(tr("Blank Layer"), null);
+	}
+
+
+	public geoTiffLayer(String name, String baseURL) {
+		super(name);
+		this.baseURL = baseURL;
+		try {
+			file = new File(baseURL);
+		} catch (Exception e) {
+			JFileChooser fc = createAndOpenFileChooser(true, false);
+			if (fc == null){
+				System.out.println("no file");
+				return;		
+			}else{
+			file = fc.getSelectedFile();
+			}
+		}
+		file = new File(file.getAbsolutePath());
+		try {
+			gtRreader =  new GeoTiffReader(file);
+		} catch (DataSourceException e) {
+			e.printStackTrace();
+			return;
+		}
+		try {
+			coverage = (GridCoverage2D) gtRreader.read(null);
+		} catch (IOException ex) {
+			ex.printStackTrace();
+			return;
+		}
+		this.name = file.getName();
+		crs = coverage.getCoordinateReferenceSystem2D();
+		env = coverage.getEnvelope();
+		image = coverage.getRenderedImage();
+			
+		lc = env.getLowerCorner();
+		lcEN = Main.proj.latlon2eastNorth(new LatLon(lc.getCoordinate()[1],lc.getCoordinate()[0]));
+		uc = env.getUpperCorner();
+		ucEN = Main.proj.latlon2eastNorth(new LatLon(uc.getCoordinate()[1],uc.getCoordinate()[0]));
+		
+		executor = Executors.newFixedThreadPool(3);
+	}
+
+	public void destroy() {
+		try { 
+			executor.shutdown();  
+			// Might not be initalized, so catch NullPointer as well
+		} catch(Exception x) {}
+	}
+
+	@Override public Icon getIcon() {
+		return ImageProvider.get("layer", "geotiff_small");
+	}
+
+	@Override public String getToolTipText() {
+
+		return tr("GeoTifflayer ({0}), file: {1}", name, baseURL);
+
+	}
+
+	@Override public boolean isMergable(Layer other) {
+		return false;
+	}
+
+	@Override public void mergeFrom(Layer from) {
+	}
+
+	@Override public void paint(Graphics g, final MapView mv) {
+		if (env == null){
+			System.out.println("file error");
+			return;
+		}
+
+		java.awt.Point min = mv.getPoint(lcEN);
+		java.awt.Point max = mv.getPoint(ucEN);
+		
+		double width = Math.abs(max.getX()-min.getX());
+		double height = Math.abs(max.getY()-min.getY());
+
+		Graphics2D g2d = (Graphics2D)g;
+
+		AffineTransform trans = new AffineTransform();
+		trans.translate(min.getX(), max.getY());
+		trans.scale(width/image.getWidth(),height/image.getHeight());
+
+		g2d.drawRenderedImage(image, trans);
+
+	}
+
+	@Override public void visitBoundingBox(BoundingXYVisitor v) {
+		v.visit(lcEN);
+		v.visit(ucEN);
+	}
+
+	@Override public Object getInfoComponent() {
+		return getToolTipText();
+	}
+
+	@Override public Component[] getMenuEntries() {
+		return new Component[]{
+		};
+	}
+
+
+	protected static JFileChooser createAndOpenFileChooser(boolean open, boolean multiple) {
+		String curDir = Main.pref.get("lastDirectory");
+		if (curDir.equals(""))
+			curDir = ".";
+		JFileChooser fc = new JFileChooser(new File(curDir));
+		fc.setMultiSelectionEnabled(multiple);
+		for (int i = 0; i < ExtensionFileFilter.filters.length; ++i)
+			fc.addChoosableFileFilter(ExtensionFileFilter.filters[i]);
+		fc.setAcceptAllFileFilterUsed(true);
+
+		int answer = open ? fc.showOpenDialog(Main.parent) : fc.showSaveDialog(Main.parent);
+		if (answer != JFileChooser.APPROVE_OPTION)
+			return null;
+
+		if (!fc.getCurrentDirectory().getAbsolutePath().equals(curDir))
+			Main.pref.put("lastDirectory", fc.getCurrentDirectory().getAbsolutePath());
+
+		if (!open) {
+			File file = fc.getSelectedFile();
+			if (file == null || (file.exists() && JOptionPane.YES_OPTION !=
+				JOptionPane.showConfirmDialog(Main.parent, tr("File exists. Overwrite?"), tr("Overwrite"), JOptionPane.YES_NO_OPTION)))
+				return null;
+		}
+
+		return fc;
+	}
+
+	public static File openFileDialog(boolean open) {
+		JFileChooser fc = createAndOpenFileChooser(open, false);
+		if (fc == null)
+			return null;
+
+		File file = fc.getSelectedFile();
+		
+
+		String fn = file.getPath();
+		if (fn.indexOf('.') == -1) {
+			FileFilter ff = fc.getFileFilter();
+			if (ff instanceof ExtensionFileFilter)
+				fn = "." + ((ExtensionFileFilter)ff).defaultExtension;
+			else
+				fn += ".tif";
+			file = new File(fn);
+		}
+		return file;
+	}
+}
