commit 7f96af80faed001f381e58b3badfbcc6747fc678
Author: Simon Legner <Simon.Legner@gmail.com>
Date:   Mon Aug 31 23:53:51 2015 +0200

    v1

diff --git a/src/org/openstreetmap/josm/gui/MapFrame.java b/src/org/openstreetmap/josm/gui/MapFrame.java
index 1a7f72e..723ebd9 100644
--- a/src/org/openstreetmap/josm/gui/MapFrame.java
+++ b/src/org/openstreetmap/josm/gui/MapFrame.java
@@ -66,6 +66,7 @@
 import org.openstreetmap.josm.gui.dialogs.FilterDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.MapPaintDialog;
+import org.openstreetmap.josm.gui.dialogs.MinimapDialog;
 import org.openstreetmap.josm.gui.dialogs.NotesDialog;
 import org.openstreetmap.josm.gui.dialogs.RelationListDialog;
 import org.openstreetmap.josm.gui.dialogs.SelectionListDialog;
@@ -238,6 +239,7 @@ public void setBorder(Border b) {
         addToggleDialog(propertiesDialog = new PropertiesDialog());
         addToggleDialog(selectionListDialog = new SelectionListDialog());
         addToggleDialog(relationListDialog = new RelationListDialog());
+        addToggleDialog(new MinimapDialog());
         addToggleDialog(new CommandStackDialog());
         addToggleDialog(new UserListDialog());
         addToggleDialog(conflictDialog = new ConflictDialog());
diff --git a/src/org/openstreetmap/josm/gui/dialogs/MinimapDialog.java b/src/org/openstreetmap/josm/gui/dialogs/MinimapDialog.java
new file mode 100644
index 0000000..463e828
--- /dev/null
+++ b/src/org/openstreetmap/josm/gui/dialogs/MinimapDialog.java
@@ -0,0 +1,65 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.Collections;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.NavigatableComponent;
+import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.bbox.BBoxChooser;
+import org.openstreetmap.josm.gui.bbox.SlippyMapBBoxChooser;
+
+public class MinimapDialog extends ToggleDialog implements NavigatableComponent.ZoomChangeListener, PropertyChangeListener {
+
+    protected final SlippyMapBBoxChooser slippyMap = new SlippyMapBBoxChooser();
+    protected boolean skipEvents;
+
+    public MinimapDialog() {
+        super(tr("Mini map"), "map", tr("Displays a small map of the current edit location"), null, 150);
+        createLayout(slippyMap, false, Collections.<SideButton>emptyList());
+        slippyMap.addPropertyChangeListener(BBoxChooser.BBOX_PROP, this);
+    }
+
+    @Override
+    public void showDialog() {
+        NavigatableComponent.addZoomChangeListener(this);
+        super.showDialog();
+    }
+
+    @Override
+    public void hideDialog() {
+        NavigatableComponent.removeZoomChangeListener(this);
+        super.hideDialog();
+    }
+
+    @Override
+    public void zoomChanged() {
+        if (Main.isDisplayingMapView() && !skipEvents) {
+            MapView mv = Main.map.mapView;
+            final Bounds currentBounds = new Bounds(
+                    mv.getLatLon(0, mv.getHeight()),
+                    mv.getLatLon(mv.getWidth(), 0)
+            );
+            skipEvents = true;
+            slippyMap.setBoundingBox(currentBounds);
+            slippyMap.zoomOut(); // again, to give a better overview
+            skipEvents = false;
+        }
+    }
+
+    @Override
+    public void propertyChange(PropertyChangeEvent evt) {
+        System.out.println(evt.getSource());
+        if (!skipEvents) {
+            skipEvents = true;
+            Main.map.mapView.zoomTo(slippyMap.getBoundingBox());
+            skipEvents = false;
+        }
+    }
+}
