Index: src/org/openstreetmap/josm/actions/ExitAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/ExitAction.java	(revision 1212)
+++ src/org/openstreetmap/josm/actions/ExitAction.java	(working copy)
@@ -24,7 +24,9 @@
     }
 
     public void actionPerformed(ActionEvent e) {
-        if (!Main.breakBecauseUnsavedChanges())
+        if (!Main.breakBecauseUnsavedChanges()) {
+            Main.saveGuiGeometry();
             System.exit(0);
+	}
     }
 }
Index: src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- src/org/openstreetmap/josm/gui/MainApplication.java	(revision 1212)
+++ src/org/openstreetmap/josm/gui/MainApplication.java	(working copy)
@@ -55,6 +55,7 @@
             @Override public void windowClosing(final WindowEvent arg0) {
                 if (Main.breakBecauseUnsavedChanges())
                     return;
+                Main.saveGuiGeometry();
                 System.exit(0);
             }
         });
@@ -213,7 +214,7 @@
         mainFrame.setVisible(true);
         splash.closeSplash();
 
-        if (!args.containsKey("no-fullscreen") && !args.containsKey("geometry") && Toolkit.getDefaultToolkit().isFrameStateSupported(JFrame.MAXIMIZED_BOTH))
+        if (!args.containsKey("no-fullscreen") && !args.containsKey("geometry") && Main.pref.get("gui.geometry") == null && Toolkit.getDefaultToolkit().isFrameStateSupported(JFrame.MAXIMIZED_BOTH))
             mainFrame.setExtendedState(JFrame.MAXIMIZED_BOTH);
 
         EventQueue.invokeLater(new Runnable(){
Index: src/org/openstreetmap/josm/Main.java
===================================================================
--- src/org/openstreetmap/josm/Main.java	(revision 1212)
+++ src/org/openstreetmap/josm/Main.java	(working copy)
@@ -411,8 +411,11 @@
         UIManager.put("OptionPane.noIcon", UIManager.get("OptionPane.cancelIcon"));
 
         Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
+	String geometry = Main.pref.get("gui.geometry");
         if (args.containsKey("geometry")) {
-            String geometry = args.get("geometry").iterator().next();
+            geometry = args.get("geometry").iterator().next();
+	}
+	if (geometry.length() != 0) {
             final Matcher m = Pattern.compile("(\\d+)x(\\d+)(([+-])(\\d+)([+-])(\\d+))?").matcher(geometry);
             if (m.matches()) {
                 int w = Integer.valueOf(m.group(1));
@@ -427,6 +430,10 @@
                         y = screenDimension.height - y - h;
                 }
                 bounds = new Rectangle(x,y,w,h);
+		if(!Main.pref.get("gui.geometry").equals(geometry)) {
+		    // remember this geometry
+		    Main.pref.put("gui.geometry", geometry);
+		}
             } else
                 System.out.println("Ignoring malformed geometry: "+geometry);
         }
@@ -539,4 +546,18 @@
     {
         return Locale.getDefault().getLanguage() + ":";
     }
+
+    static public void saveGuiGeometry() {
+	// if the gui.geometry preference is already set,
+	// save the current window geometry
+	String curGeometryPref = pref.get("gui.geometry");
+	if(curGeometryPref.length() != 0) {
+	    Rectangle bounds = parent.getBounds();
+	    pref.put("gui.geometry",
+		     (int)bounds.getWidth() +
+		     "x" + (int)bounds.getHeight() +
+		     "+" + (int)bounds.getX() +
+		     "+" + (int)bounds.getY());
+	}
+    }
 }
