Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 4932)
@@ -5,9 +5,6 @@
 import java.awt.BorderLayout;
 import java.awt.Component;
-import java.awt.Dimension;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
-import java.awt.Rectangle;
-import java.awt.Toolkit;
 import java.awt.event.ComponentEvent;
 import java.awt.event.ComponentListener;
@@ -90,4 +87,5 @@
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.Utils;
+import org.openstreetmap.josm.tools.WindowGeometry;
 
 abstract public class Main {
@@ -421,5 +419,5 @@
     public static final JPanel panel = new JPanel(new BorderLayout());
 
-    protected static Rectangle bounds;
+    protected static WindowGeometry geometry;
     protected static int windowState = JFrame.NORMAL;
 
@@ -474,46 +472,7 @@
         }
 
-        Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
-        String geometry = null;
-        if (args.containsKey("geometry")) {
-            geometry = args.get("geometry").iterator().next();
-        } else {
-            geometry = Main.pref.get("gui.geometry");
-        }
-        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));
-                int h = Integer.valueOf(m.group(2));
-                int x = 0, y = 0;
-                if (m.group(3) != null) {
-                    x = Integer.valueOf(m.group(5));
-                    y = Integer.valueOf(m.group(7));
-                    if (m.group(4).equals("-")) {
-                        x = screenDimension.width - x - w;
-                    }
-                    if (m.group(6).equals("-")) {
-                        y = screenDimension.height - y - h;
-                    }
-                }
-                // copied from WindowsGeometry.applySafe()
-                if (x > Toolkit.getDefaultToolkit().getScreenSize().width - 10) {
-                    x = 0;
-                }
-                if (y > Toolkit.getDefaultToolkit().getScreenSize().height - 10) {
-                    y = 0;
-                }
-                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);
-            }
-        }
-        if (bounds == null) {
-            bounds = !args.containsKey("no-maximize") ? new Rectangle(0,0,screenDimension.width,screenDimension.height) : new Rectangle(1000,740);
-        }
+        geometry = WindowGeometry.mainWindow("gui.geometry",
+            (args.containsKey("geometry") ? args.get("geometry").iterator().next() : null),
+            !args.containsKey("no-maximize"));
     }
 
@@ -608,5 +567,9 @@
     public static boolean exitJosm(boolean exit) {
         if (Main.saveUnsavedModifications()) {
-            Main.saveGuiGeometry();
+            geometry.remember("gui.geometry");
+            if (map  != null) {
+                map.rememberToggleDialogWidth();
+            }
+            pref.put("gui.maximized", (windowState & JFrame.MAXIMIZED_BOTH) != 0);
             // Remove all layers because somebody may rely on layerRemoved events (like AutosaveTask)
             if (Main.isDisplayingMapView()) {
@@ -714,67 +677,26 @@
     }
 
-    static public void saveGuiGeometry() {
-        // save the current window geometry and the width of the toggle dialog area
-        String newGeometry = "";
-        String newToggleDlgWidth = null;
-        try {
-            Dimension screenDimension = Toolkit.getDefaultToolkit().getScreenSize();
-            int width = (int)bounds.getWidth();
-            int height = (int)bounds.getHeight();
-            int x = (int)bounds.getX();
-            int y = (int)bounds.getY();
-            if (width > screenDimension.width) {
-                width = screenDimension.width;
-            }
-            if (height > screenDimension.height) {
-                width = screenDimension.height;
-            }
-            if (x < 0) {
-                x = 0;
-            }
-            if (y < 0) {
-                y = 0;
-            }
-            newGeometry = width + "x" + height + "+" + x + "+" + y;
-
-            if (map  != null) {
-                newToggleDlgWidth = Integer.toString(map.getToggleDlgWidth());
-                if (newToggleDlgWidth.equals(Integer.toString(MapFrame.DEF_TOGGLE_DLG_WIDTH))) {
-                    newToggleDlgWidth = "";
-                }
-            }
-        }
-        catch (Exception e) {
-            System.out.println("Failed to get GUI geometry: " + e);
-            e.printStackTrace();
-        }
-        boolean maximized = (windowState & JFrame.MAXIMIZED_BOTH) != 0;
-        // Main.debug("Main window: saving geometry \"" + newGeometry + "\" " + (maximized?"maximized":"normal"));
-        pref.put("gui.maximized", maximized);
-        pref.put("gui.geometry", newGeometry);
-        if (newToggleDlgWidth != null) {
-            pref.put("toggleDialogs.width", newToggleDlgWidth);
-        }
-    }
     private static class WindowPositionSizeListener extends WindowAdapter implements
     ComponentListener {
-
         @Override
         public void windowStateChanged(WindowEvent e) {
             Main.windowState = e.getNewState();
-            // Main.debug("Main window state changed to " + Main.windowState);
-        }
-
+        }
+
+        @Override
         public void componentHidden(ComponentEvent e) {
         }
 
+        @Override
         public void componentMoved(ComponentEvent e) {
             handleComponentEvent(e);
         }
 
+        @Override
         public void componentResized(ComponentEvent e) {
             handleComponentEvent(e);
         }
 
+        @Override
         public void componentShown(ComponentEvent e) {
         }
@@ -782,14 +704,8 @@
         private void handleComponentEvent(ComponentEvent e) {
             Component c = e.getComponent();
-            if (c instanceof JFrame) {
-                if (Main.windowState == JFrame.NORMAL) {
-                    Main.bounds = ((JFrame) c).getBounds();
-                    // Main.debug("Main window: new geometry " + Main.bounds);
-                } else {
-                    // Main.debug("Main window state is " + Main.windowState);
-                }
-            }
-        }
-
+            if (c instanceof JFrame && c.isVisible() && Main.windowState == JFrame.NORMAL) {
+                Main.geometry = new WindowGeometry((JFrame) c);
+            }
+        }
     }
     public static void addListener() {
Index: trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 4932)
@@ -214,5 +214,5 @@
         }
         else if (mode.equals("download")) {
-            if (Main.pref.hasKey("osm-download.bounds")) {
+            if (!Main.pref.get("osm-download.bounds").isEmpty()) {
                 try {
                     v.visit(new Bounds(Main.pref.get("osm-download.bounds"), ";"));
Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 4932)
@@ -334,7 +334,8 @@
     }
 
+ /*   @Deprecated
     synchronized public boolean hasKey(final String key) {
         return properties.containsKey(key);
-    }
+    }*/
 
     /**
@@ -638,4 +639,5 @@
             }
         }
+        removeObsolete();
     }
 
@@ -1727,3 +1729,23 @@
         return b.toString();
     }
+
+    /**
+     * Removes obsolete preference settings. If you throw out a once-used preference
+     * setting, add it to the list here with an expiry date (written as comment). If you
+     * see something with an expiry date in the past, remove it from the list.
+     */
+    public void removeObsolete() {
+        String[] obsolete = {
+                "edit.make-parallel-way-action.snap-threshold",  // 10/2011 - replaced by snap-threshold-percent. Can be removed mid 2012
+        };
+        for (String key : obsolete) {
+            boolean removed = false;
+            if(properties.containsKey(key)) { properties.remove(key); removed = true; }
+            if(collectionProperties.containsKey(key)) { collectionProperties.remove(key); removed = true; }
+            if(arrayProperties.containsKey(key)) { arrayProperties.remove(key); removed = true; }
+            if(listOfStructsProperties.containsKey(key)) { listOfStructsProperties.remove(key); removed = true; }
+            if(removed)
+                System.out.println(tr("Preference setting {0} has been removed since it is no longer used.", key));
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapRendererFactory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapRendererFactory.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapRendererFactory.java	(revision 4932)
@@ -115,19 +115,4 @@
     private MapRendererFactory() {
         registerDefaultRenderers();
-        boolean drawWireframe = false;
-        if (Main.pref.hasKey("draw.wireframe")) {
-            drawWireframe = Main.pref.getBoolean("draw.wireframe",false);
-            /*
-             * transition 05/2011 - 'draw.wireframe' isn't supported anymore. Remove
-             * it from the preferences.
-             * Can be removed after ~ 01/2012
-             */
-            Main.pref.put("draw.wireframe", null);
-        }
-        if (drawWireframe){
-            activate(WireframeMapRenderer.class);
-            return;
-        }
-
         String rendererClassName = Main.pref.get(PREF_KEY_RENDERER_CLASS_NAME, null);
         if (rendererClassName != null) {
Index: trunk/src/org/openstreetmap/josm/data/preferences/AbstractProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/AbstractProperty.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/data/preferences/AbstractProperty.java	(revision 4932)
@@ -19,5 +19,5 @@
 
     public boolean isSet() {
-        return Main.pref.hasKey(key);
+        return !Main.pref.get(key).isEmpty();
     }
 
Index: trunk/src/org/openstreetmap/josm/data/preferences/CachedProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/CachedProperty.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/data/preferences/CachedProperty.java	(revision 4932)
@@ -20,5 +20,5 @@
 
     protected void updateValue() {
-        if (Main.pref.hasKey(key)) {
+        if (!Main.pref.get(key).isEmpty()) {
             this.value = fromString(Main.pref.get(key));
         } else {
Index: trunk/src/org/openstreetmap/josm/gui/ExtendedDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ExtendedDialog.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/ExtendedDialog.java	(revision 4932)
@@ -456,5 +456,5 @@
             if(visible) {
                 new WindowGeometry(rememberSizePref,
-                        defaultWindowGeometry).applySafeMultiScreen(this);
+                        defaultWindowGeometry).applySafe(this);
             } else {
                 new WindowGeometry(this).remember(rememberSizePref);
Index: trunk/src/org/openstreetmap/josm/gui/MainApplet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplet.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplet.java	(revision 4932)
@@ -50,5 +50,4 @@
             setContentPane(contentPanePrivate);
             setJMenuBar(menu);
-            setBounds(bounds);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 4932)
@@ -65,5 +65,5 @@
         mainFrame.setContentPane(contentPanePrivate);
         mainFrame.setJMenuBar(menu);
-        mainFrame.setBounds(bounds);
+        geometry.applySafe(mainFrame);
         LinkedList<Image> l = new LinkedList<Image>();
         l.add(ImageProvider.get("logo_16x16x32").getImage());
@@ -74,5 +74,4 @@
         l.add(ImageProvider.get("logo_48x48x8").getImage());
         l.add(ImageProvider.get("logo").getImage());
-        //mainFrame.setIconImage(ImageProvider.get("logo").getImage());
         mainFrame.setIconImages(l);
         mainFrame.addWindowListener(new WindowAdapter(){
@@ -247,5 +246,4 @@
         monitor.indeterminateSubTask(tr("Setting defaults"));
         preConstructorInit(args);
-        removeObsoletePreferences();
 
         monitor.indeterminateSubTask(tr("Creating main GUI"));
@@ -319,23 +317,4 @@
             RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());
         }
-
-    }
-
-    /**
-     * Removes obsolete preference settings. If you throw out a once-used preference
-     * setting, add it to the list here with an expiry date (written as comment). If you
-     * see something with an expiry date in the past, remove it from the list.
-     */
-    public static void removeObsoletePreferences() {
-
-        String[] obsolete = {
-                "edit.make-parallel-way-action.snap-threshold"  // 10/2011 - replaced by snap-threshold-percent. Can be removed mid 2012
-        };
-        for (String key : obsolete) {
-            if (Main.pref.hasKey(key)) {
-                Main.pref.removeFromCollection(key, Main.pref.get(key));
-                System.out.println(tr("Preference setting {0} has been removed since it is no longer used.", key));
-            }
-        }
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 4932)
@@ -479,8 +479,8 @@
 
     /**
-     * Returns the current width of the (possibly resized) toggle dialog area
-     */
-    public int getToggleDlgWidth() {
-        return dialogsPanel.getWidth();
+     * Remember the current width of the (possibly resized) toggle dialog area
+     */
+    public void rememberToggleDialogWidth() {
+        Main.pref.putInteger("toggleDialogs.width", dialogsPanel.getWidth());
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/SplashScreen.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/SplashScreen.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/SplashScreen.java	(revision 4932)
@@ -29,4 +29,5 @@
 import org.openstreetmap.josm.gui.progress.SwingRenderingProgressMonitor;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.WindowGeometry;
 
 /**
@@ -58,4 +59,5 @@
         GridBagConstraints gbc = new GridBagConstraints();
         gbc.gridheight = 2;
+        gbc.insets = new Insets(0, 0, 0, 70);
         innerContentPane.add(logo, gbc);
 
@@ -92,6 +94,5 @@
         pack();
 
-        // Center the splash screen
-        setLocationRelativeTo(null);
+        WindowGeometry.centerOnScreen(this, "gui.geometry");
 
         // Add ability to hide splash screen by clicking it
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 4932)
@@ -51,4 +51,6 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.WindowGeometry;
+import org.openstreetmap.josm.tools.WindowGeometry.WindowGeometryException;
 
 /**
@@ -507,10 +509,7 @@
             });
 
-            String bounds = Main.pref.get(preferencePrefix+".bounds",null);
-            if (bounds != null) {
-                String[] b = bounds.split(",");
-                setBounds(getDetachedGeometry(new Rectangle(
-                        Integer.parseInt(b[0]),Integer.parseInt(b[1]),Integer.parseInt(b[2]),Integer.parseInt(b[3]))));
-            } else {
+            try {
+                new WindowGeometry(preferencePrefix+".geometry").applySafe(this);
+            } catch (WindowGeometryException e) {
                 ToggleDialog.this.setPreferredSize(ToggleDialog.this.getDefaultDetachedSize());
                 pack();
@@ -523,5 +522,5 @@
         protected void rememberGeometry() {
             if (detachedDialog != null) {
-                Main.pref.put(preferencePrefix+".bounds", detachedDialog.getX()+","+detachedDialog.getY()+","+detachedDialog.getWidth()+","+detachedDialog.getHeight());
+                new WindowGeometry(detachedDialog).remember(preferencePrefix+".geometry");
             }
         }
Index: trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 4932)
@@ -328,5 +328,5 @@
             boundingBoxChanged(currentBounds,null);
         }
-        else if (Main.pref.hasKey("osm-download.bounds")) {
+        else if (!Main.pref.get("osm-download.bounds").isEmpty()) {
             // read the bounding box from the preferences
             try {
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java	(revision 4932)
@@ -74,5 +74,5 @@
     public void placeOnScreen(HistoryBrowserDialog dialog) {
         WindowGeometry geometry = WindowGeometry.centerOnScreen(new Dimension(800,500));
-        geometry.apply(dialog);
+        geometry.applySafe(dialog);
         Point p = dialog.getLocation();
         while(hasDialogWithCloseUpperLeftCorner(p)) {
Index: trunk/src/org/openstreetmap/josm/gui/io/CredentialDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/CredentialDialog.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/io/CredentialDialog.java	(revision 4932)
@@ -75,5 +75,5 @@
     public void setVisible(boolean visible) {
         if (visible) {
-            WindowGeometry.centerInWindow(Main.parent, new Dimension(350,300)).apply(this);
+            WindowGeometry.centerInWindow(Main.parent, new Dimension(350,300)).applySafe(this);
         }
         super.setVisible(visible);
Index: trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/io/SaveLayersDialog.java	(revision 4932)
@@ -72,5 +72,5 @@
     protected void build() {
         WindowGeometry geometry = WindowGeometry.centerOnScreen(new Dimension(600,300));
-        geometry.apply(this);
+        geometry.applySafe(this);
         getContentPane().setLayout(new BorderLayout());
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/GPXSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/GPXSettingsPanel.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/GPXSettingsPanel.java	(revision 4932)
@@ -297,6 +297,6 @@
     public void loadPreferences () {
         makeAutoMarkers.setSelected(Main.pref.getBoolean("marker.makeautomarkers", true));
-        if(layerName!=null && !Main.pref.hasKey("draw.rawgps.lines."+layerName)
-                && !Main.pref.hasKey("draw.rawgps.lines.local."+layerName)){
+        if(layerName!=null && Main.pref.get("draw.rawgps.lines."+layerName).isEmpty()
+                && Main.pref.get("draw.rawgps.lines.local."+layerName).isEmpty()){
             // no line preferences for layer is found
             drawRawGpsLinesGlobal.setSelected(true);
@@ -323,5 +323,5 @@
         drawRawGpsLinesActionListener.actionPerformed(null);
 
-        if(layerName!=null && !Main.pref.hasKey("draw.rawgps.colors."+layerName)) {
+        if(layerName!=null && Main.pref.get("draw.rawgps.colors."+layerName).isEmpty()) {
             colorTypeGlobal.setSelected(true);
             colorDynamic.setSelected(false);
Index: trunk/src/org/openstreetmap/josm/io/CacheFiles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/CacheFiles.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/io/CacheFiles.java	(revision 4932)
@@ -189,5 +189,5 @@
     public void setExpire(int amount, boolean force) {
         String key = "cache." + ident + "." + "expire";
-        if(Main.pref.hasKey(key) && !force)
+        if(!Main.pref.get(key).isEmpty() && !force)
             return;
 
@@ -203,5 +203,5 @@
     public void setMaxSize(int amount, boolean force) {
         String key = "cache." + ident + "." + "maxsize";
-        if(Main.pref.hasKey(key) && !force)
+        if(!Main.pref.get(key).isEmpty() && !force)
             return;
 
Index: trunk/src/org/openstreetmap/josm/tools/WindowGeometry.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/WindowGeometry.java	(revision 4931)
+++ trunk/src/org/openstreetmap/josm/tools/WindowGeometry.java	(revision 4932)
@@ -138,4 +138,35 @@
     }
 
+    static public WindowGeometry mainWindow(String preferenceKey, String arg, boolean maximize) {
+        Dimension screenDimension = getScreenSize(null);
+        if (arg != null) {
+            final Matcher m = Pattern.compile("(\\d+)x(\\d+)(([+-])(\\d+)([+-])(\\d+))?").matcher(arg);
+            if (m.matches()) {
+                int w = Integer.valueOf(m.group(1));
+                int h = Integer.valueOf(m.group(2));
+                int x = 0, y = 0;
+                if (m.group(3) != null) {
+                    x = Integer.valueOf(m.group(5));
+                    y = Integer.valueOf(m.group(7));
+                    if (m.group(4).equals("-")) {
+                        x = screenDimension.width - x - w;
+                    }
+                    if (m.group(6).equals("-")) {
+                        y = screenDimension.height - y - h;
+                    }
+                }
+                return new WindowGeometry(new Point(x,y), new Dimension(w,h));
+            } else {
+                System.out.println(tr("Ignoring malformed geometry: {0}", arg));
+            }
+        }
+        WindowGeometry def;
+        if(maximize)
+            def = new WindowGeometry(new Point(0,0), screenDimension);
+        else
+            def = new WindowGeometry(new Point(0,0), new Dimension(1000, 740));
+        return new WindowGeometry(preferenceKey, def);
+    }
+
     /**
      * Creates a window geometry from the values kept in the preference store under the
@@ -163,5 +194,4 @@
             initFromPreferences(preferenceKey);
         } catch(WindowGeometryException e) {
-            //            System.out.println(tr("Warning: Failed to restore window geometry from key ''{0}''. Falling back to default geometry. Details: {1}", preferenceKey, e.getMessage()));
             initFromWindowGeometry(defaultGeometry);
         }
@@ -201,31 +231,16 @@
 
     /**
-     * Applies this geometry to a window
-     *
+     * Center window on screen. When preferenceKey is given, the window is centered
+     * on the screen where the corresponding window is.
+     * 
      * @param window the window
-     */
-    public void apply(Window window) {
-        window.setLocation(topLeft);
-        window.setSize(extent);
-    }
-
-    /**
-     * Applies this geometry to a window. Makes sure that the window is not placed outside
-     * of the coordinate range of the current screen.
-     *
-     * @param window the window
-     */
-    public void applySafe(Window window) {
-        Point p = new Point(topLeft);
-        if (p.x < 0 || p.x > Toolkit.getDefaultToolkit().getScreenSize().width - 10) {
-            p.x  = 0;
-        }
-        if (p.y < 0 || p.y > Toolkit.getDefaultToolkit().getScreenSize().height - 10) {
-            p.y = 0;
-        }
-        window.setLocation(p);
-        window.setSize(extent);
-    }
-    
+     * @param preferenceKey the key to get size and position from
+     */
+    public static void centerOnScreen(Window window, String preferenceKey) {
+        Dimension dim = getScreenSize(preferenceKey);
+        Dimension size = window.getSize();
+        window.setLocation(new Point((dim.width-size.width)/2,(dim.height-size.height)/2));
+    }
+
     /**
      * Applies this geometry to a window. Makes sure that the window is not
@@ -234,5 +249,5 @@
      * @param window the window
      */
-    public void applySafeMultiScreen(Window window) {
+    public void applySafe(Window window) {
         Point p = new Point(topLeft);
 
@@ -265,4 +280,15 @@
     }
 
+    /**
+     * Find the size of the screen the for given coordinates. Use first screen,
+     * when no coordinates are stored or null is passed.
+     * 
+     * @param preferenceKey the key to get size and position from
+     */
+    public static Dimension getScreenSize(String preferenceKey) {
+        /* TODO: implement this function properly */
+        return Toolkit.getDefaultToolkit().getScreenSize();
+    }
+
     public String toString() {
         return "WindowGeometry{topLeft="+topLeft+",extent="+extent+"}";
