Index: src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
===================================================================
--- src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 5727)
+++ src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(working copy)
@@ -6,15 +6,15 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
 import java.util.List;
 
+import org.xml.sax.SAXException;
+
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryPreferenceEntry;
+import org.openstreetmap.josm.io.MirroredInputStream;
 import org.openstreetmap.josm.io.imagery.ImageryReader;
-import org.openstreetmap.josm.io.MirroredInputStream;
 import org.openstreetmap.josm.tools.Utils;
-import org.xml.sax.SAXException;
 
 /**
  * Manages the list of imagery entries that are shown in the imagery menu.
@@ -59,6 +59,15 @@
         }
     }
 
+    /**
+     * Loads the available imagery entries.
+     *
+     * The data is downloaded from the JOSM website (or loaded from cache).
+     * Entries marked as "default" are added to the user selection, if not
+     * already present.
+     *
+     * @param clearCache if true, clear the cache and start a fresh download.
+     */
     public void loadDefaults(boolean clearCache) {
         defaultLayers.clear();
         for (String source : Main.pref.getCollection("imagery.layers.sites", Arrays.asList(DEFAULT_LAYER_SITES))) {
@@ -147,7 +156,6 @@
     public static void addLayer(ImageryInfo info) {
         instance.add(info);
         instance.save();
-        Main.main.menu.imageryMenu.refreshImageryMenu();
     }
 
     public static void addLayers(Collection<ImageryInfo> infos) {
@@ -156,6 +164,5 @@
         }
         instance.save();
         Collections.sort(instance.layers);
-        Main.main.menu.imageryMenu.refreshImageryMenu();
     }
 }
Index: src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java
===================================================================
--- src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(revision 5727)
+++ src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTask.java	(working copy)
@@ -282,11 +282,6 @@
                 computeBboxAndCenterScale();
                 targetLayer.onPostDownloadFromServer();
             }
-
-            // Suggest potential imagery data, except if the data is downloaded after a "data update" command (see #8307)
-            if (!isUpdateData) {
-                suggestImageryLayers();
-            }
         }
         
         protected void computeBboxAndCenterScale() {
@@ -305,59 +300,6 @@
                 reader.cancel();
             }
         }
-
-        protected void suggestImageryLayers() {
-            if (currentBounds != null) {
-                final LatLon center = currentBounds.getCenter();
-                final Set<ImageryInfo> layers = new HashSet<ImageryInfo>();
-    
-                for (ImageryInfo i : ImageryLayerInfo.instance.getDefaultLayers()) {
-                    if (i.getBounds() != null && i.getBounds().contains(center)) {
-                        layers.add(i);
-                    }
-                }
-                // Do not suggest layers already in use
-                layers.removeAll(ImageryLayerInfo.instance.getLayers());
-                // For layers containing complex shapes, check that center is in one of its shapes (fix #7910)
-                for (Iterator<ImageryInfo> iti = layers.iterator(); iti.hasNext(); ) {
-                    List<Shape> shapes = iti.next().getBounds().getShapes();
-                    if (shapes != null && !shapes.isEmpty()) {
-                        boolean found = false;
-                        for (Iterator<Shape> its = shapes.iterator(); its.hasNext() && !found; ) {
-                            found = its.next().contains(center);
-                        }
-                        if (!found) {
-                            iti.remove();
-                        }
-                    }
-                }
-    
-                if (layers.isEmpty()) {
-                    return;
-                }
-    
-                final List<String> layerNames = new ArrayList<String>();
-                for (ImageryInfo i : layers) {
-                    layerNames.add(i.getName());
-                }
-    
-                if (!ConditionalOptionPaneUtil.showConfirmationDialog(
-                        "download.suggest-imagery-layer",
-                        Main.parent,
-                        tr("<html>For the downloaded area, the following additional imagery layers are available: {0}" +
-                                "Do you want to add those layers to the <em>Imagery</em> menu?" +
-                                "<br>(If needed, you can remove those entries in the <em>Preferences</em>.)",
-                                Utils.joinAsHtmlUnorderedList(layerNames)),
-                        tr("Add imagery layers?"),
-                        JOptionPane.YES_NO_OPTION,
-                        JOptionPane.QUESTION_MESSAGE,
-                        JOptionPane.YES_OPTION)) {
-                    return;
-                }
-    
-                ImageryLayerInfo.addLayers(layers);
-            }
-        }
     }
 
     @Override
Index: src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 5727)
+++ src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(working copy)
@@ -139,7 +139,6 @@
         layerInfo.save();
         ImageryLayerInfo.instance.clear();
         ImageryLayerInfo.instance.load();
-        Main.main.menu.imageryMenu.refreshImageryMenu();
         Main.main.menu.imageryMenu.refreshOffsetMenu();
         OffsetBookmark.saveBookmarks();
 
@@ -830,7 +829,6 @@
         ImageryLayerInfo.instance.loadDefaults(false);
         ImageryLayerInfo.instance.load();
         OffsetBookmark.loadBookmarks();
-        Main.main.menu.imageryMenu.refreshImageryMenu();
         Main.main.menu.imageryMenu.refreshOffsetMenu();
     }
 }
Index: src/org/openstreetmap/josm/gui/ImageryMenu.java
===================================================================
--- src/org/openstreetmap/josm/gui/ImageryMenu.java	(revision 5727)
+++ src/org/openstreetmap/josm/gui/ImageryMenu.java	(working copy)
@@ -7,7 +7,10 @@
 import java.awt.Component;
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
+import java.util.Set;
 
 import javax.swing.Action;
 import javax.swing.JComponent;
@@ -15,18 +18,23 @@
 import javax.swing.JMenuItem;
 import javax.swing.JPopupMenu;
 import javax.swing.MenuElement;
+import javax.swing.event.MenuEvent;
+import javax.swing.event.MenuListener;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AddImageryLayerAction;
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.actions.Map_Rectifier_WMSmenuAction;
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
+import org.openstreetmap.josm.data.imagery.Shape;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.tools.ImageProvider;
 
 public class ImageryMenu extends JMenu implements MapView.LayerChangeListener {
+
     private Action offsetAction = new JosmAction(
             tr("Imagery offset"), "mapmode/adjustimg", tr("Adjust imagery offset"), null, false, false) {
         {
@@ -65,41 +73,86 @@
             popup.show(source, source.getWidth()/2, source.getHeight()/2);
         }
     };
+
     private JMenuItem singleOffset = new JMenuItem(offsetAction);
     private JMenuItem offsetMenuItem = singleOffset;
     private Map_Rectifier_WMSmenuAction rectaction = new Map_Rectifier_WMSmenuAction();
-    private int offsPos;
-    private MenuScroller menuScroller;
 
     public ImageryMenu() {
         super(tr("Imagery"));
         setupMenuScroller();
         MapView.addLayerChangeListener(this);
+        // build dynamically
+        addMenuListener(new MenuListener() {
+            @Override
+            public void menuSelected(MenuEvent e) {
+                refreshImageryMenu();
+            }
+
+            @Override
+            public void menuDeselected(MenuEvent e) {
+            }
+
+            @Override
+            public void menuCanceled(MenuEvent e) {
+            }
+        });
     }
     
-    private final void setupMenuScroller() {
+    private void setupMenuScroller() {
         int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
         int menuItemHeight = singleOffset.getPreferredSize().height;
-        menuScroller = MenuScroller.setScrollerFor(this, (screenHeight / menuItemHeight)-1);
+        MenuScroller.setScrollerFor(this, (screenHeight / menuItemHeight)-1);
     }
 
-    public void refreshImageryMenu() {
-        if (menuScroller != null) {
-            menuScroller.dispose();
-            menuScroller = null;
-        }
-        setupMenuScroller();
+    protected void refreshImageryMenu() {
         removeAll();
 
         // for each configured ImageryInfo, add a menu entry.
         for (final ImageryInfo u : ImageryLayerInfo.instance.getLayers()) {
             add(new AddImageryLayerAction(u));
         }
+
+        // list all imagery entries where the current map location
+        // is within the imagery bounds
+        if (Main.isDisplayingMapView()) {
+            MapView mv = Main.map.mapView;
+            LatLon pos = mv.getProjection().eastNorth2latlon(mv.getCenter());
+            final Set<ImageryInfo> inViewLayers = new HashSet<ImageryInfo>();
+
+            for (ImageryInfo i : ImageryLayerInfo.instance.getDefaultLayers()) {
+                if (i.getBounds() != null && i.getBounds().contains(pos)) {
+                    inViewLayers.add(i);
+                }
+            }
+            // Do not suggest layers already in use
+            inViewLayers.removeAll(ImageryLayerInfo.instance.getLayers());
+            // For layers containing complex shapes, check that center is in one
+            // of its shapes (fix #7910)
+            for (Iterator<ImageryInfo> iti = inViewLayers.iterator(); iti.hasNext(); ) {
+                List<Shape> shapes = iti.next().getBounds().getShapes();
+                if (shapes != null && !shapes.isEmpty()) {
+                    boolean found = false;
+                    for (Iterator<Shape> its = shapes.iterator(); its.hasNext() && !found; ) {
+                        found = its.next().contains(pos);
+                    }
+                    if (!found) {
+                        iti.remove();
+                    }
+                }
+            }
+            if (!inViewLayers.isEmpty()) {
+                addSeparator();
+                for (ImageryInfo i : inViewLayers) {
+                    add(new AddImageryLayerAction(i));
+                }
+            }
+        }
+
         addSeparator();
         add(new JMenuItem(rectaction));
 
         addSeparator();
-        offsPos = getMenuComponentCount();
         add(offsetMenuItem);
     }
 
@@ -136,10 +189,7 @@
     }
 
     public void refreshOffsetMenu() {
-        JMenuItem newItem = getNewOffsetMenu();
-        remove(offsetMenuItem);
-        add(newItem, offsPos);
-        offsetMenuItem = newItem;
+        offsetMenuItem = getNewOffsetMenu();
     }
 
     @Override
Index: src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java
===================================================================
--- src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java	(revision 5727)
+++ src/org/openstreetmap/josm/gui/io/RecentlyOpenedFilesMenu.java	(working copy)
@@ -8,6 +8,7 @@
 import java.io.File;
 import java.util.Collection;
 import java.util.Collections;
+
 import javax.swing.AbstractAction;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
