Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryLayerInfo.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryLayerInfo.java	(revision 24619)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryLayerInfo.java	(revision 24620)
@@ -12,4 +12,5 @@
 import java.util.Collections;
 import java.util.LinkedList;
+import java.util.List;
 
 import org.openstreetmap.josm.Main;
@@ -102,3 +103,7 @@
         Main.pref.putArray("imagery.layers", coll);
     }
+
+    public List<ImageryInfo> getLayers() {
+        return Collections.unmodifiableList(layers);
+    }
 }
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPlugin.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPlugin.java	(revision 24619)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPlugin.java	(revision 24620)
@@ -21,4 +21,5 @@
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.bbox.SlippyMapBBoxChooser;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.plugins.Plugin;
@@ -26,4 +27,5 @@
 import org.openstreetmap.josm.plugins.PluginInformation;
 import org.openstreetmap.josm.plugins.PluginProxy;
+import org.openstreetmap.josm.plugins.imagery.tms.TMSTileSourceProvider;
 import org.openstreetmap.josm.plugins.imagery.wms.Map_Rectifier_WMSmenuAction;
 import org.openstreetmap.josm.plugins.imagery.wms.WMSAdapter;
@@ -207,4 +209,5 @@
         refreshMenu();
         initRemoteControl();
+        SlippyMapBBoxChooser.addTileSourceProvider(new TMSTileSourceProvider());
     }
 
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPreferenceEditor.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPreferenceEditor.java	(revision 24619)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPreferenceEditor.java	(revision 24620)
@@ -61,4 +61,5 @@
     private JSpinner minZoomLvl;
     private JSpinner maxZoomLvl;
+    private JCheckBox addToSlippyMapChosser = new JCheckBox();
 
     private JPanel buildCommonSettingsPanel(final PreferenceTabbedPane gui) {
@@ -156,4 +157,5 @@
     private JPanel buildTMSSettingsPanel() {
         JPanel tmsTab = new JPanel(new GridBagLayout());
+
         minZoomLvl = new JSpinner(new SpinnerNumberModel(TMSPreferences.DEFAULT_MIN_ZOOM, TMSPreferences.MIN_ZOOM, TMSPreferences.MAX_ZOOM, 1));
         maxZoomLvl = new JSpinner(new SpinnerNumberModel(TMSPreferences.DEFAULT_MAX_ZOOM, TMSPreferences.MIN_ZOOM, TMSPreferences.MAX_ZOOM, 1));
@@ -175,8 +177,11 @@
         tmsTab.add(this.maxZoomLvl, GBC.eol().fill(GBC.HORIZONTAL));
 
-        tmsTab.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.VERTICAL));
+        tmsTab.add(new JLabel(tr("Add to slippymap chooser: ")), GBC.std());
+        tmsTab.add(GBC.glue(5, 0), GBC.std().fill(GBC.HORIZONTAL));
+        tmsTab.add(addToSlippyMapChosser, GBC.eol().fill(GBC.HORIZONTAL));
 
         this.autozoomActive.setSelected(TMSPreferences.PROP_DEFAULT_AUTOZOOM.get());
         this.autoloadTiles.setSelected(TMSPreferences.PROP_DEFAULT_AUTOLOAD.get());
+        this.addToSlippyMapChosser.setSelected(TMSPreferences.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get());
         this.maxZoomLvl.setValue(TMSPreferences.getMaxZoomLvl(null));
         this.minZoomLvl.setValue(TMSPreferences.getMinZoomLvl(null));
@@ -220,4 +225,5 @@
     @Override
     public boolean ok() {
+        boolean restartRequired = false;
         plugin.info.save();
         plugin.refreshMenu();
@@ -232,4 +238,7 @@
         Main.pref.put("imagery.wms.browser", browser.getEditor().getItem().toString());
 
+        if (TMSPreferences.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get() != this.addToSlippyMapChosser.isSelected())
+            restartRequired = true;
+        TMSPreferences.PROP_ADD_TO_SLIPPYMAP_CHOOSER.put(this.addToSlippyMapChosser.isSelected());
         TMSPreferences.PROP_DEFAULT_AUTOZOOM.put(this.autozoomActive.isSelected());
         TMSPreferences.PROP_DEFAULT_AUTOLOAD.put(this.autoloadTiles.isSelected());
@@ -242,5 +251,5 @@
         ImageryPreferences.PROP_SHARPEN_LEVEL.put(sharpen.getSelectedIndex());
 
-        return false;
+        return restartRequired;
     }
 
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPreferences.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPreferences.java	(revision 24619)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/ImageryPreferences.java	(revision 24620)
@@ -24,3 +24,7 @@
         Main.pref.putColor("imagery.fade", color);
     }
+
+    public static boolean isUrlWithPatterns(String url) {
+        return url != null && url.contains("{") && url.contains("}");
+    }
 }
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java	(revision 24619)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSLayer.java	(revision 24620)
@@ -53,5 +53,4 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.plugins.imagery.ImageryInfo;
-import org.openstreetmap.josm.plugins.imagery.ImageryInfo.ImageryType;
 import org.openstreetmap.josm.plugins.imagery.ImageryLayer;
 import org.openstreetmap.josm.plugins.imagery.ImageryPreferences;
@@ -184,13 +183,8 @@
         this.setVisible(true);
 
-        if (info.getImageryType() == ImageryType.TMS) {
-            if(isUrlWithPatterns(info.getURL())) {
-                initTileSource(new TemplatedTMSTileSource(info.getName(), info.getURL(), info.getMaxZoom()));
-            } else {
-                initTileSource(new TMSTileSource(info.getName(),info.getURL(), info.getMaxZoom()));
-            }
-        } else if (info.getImageryType() == ImageryType.BING) {
-            initTileSource(new BingAerialTileSource());
-        } else throw new IllegalStateException("cannot create TMSLayer with non-TMS ImageryInfo");
+        TileSource source = TMSPreferences.getTileSource(info);
+        if (source == null)
+            throw new IllegalStateException("cannot create TMSLayer with non-TMS ImageryInfo");
+        initTileSource(source);
 
         tileOptionMenu = new JPopupMenu();
@@ -364,8 +358,4 @@
             }
         });
-    }
-
-    public static boolean isUrlWithPatterns(String url) {
-        return url != null && url.contains("{") && url.contains("}");
     }
 
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSPreferences.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSPreferences.java	(revision 24619)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSPreferences.java	(revision 24620)
@@ -4,4 +4,7 @@
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
+import org.openstreetmap.josm.plugins.imagery.ImageryInfo;
+import org.openstreetmap.josm.plugins.imagery.ImageryInfo.ImageryType;
+import org.openstreetmap.josm.plugins.imagery.ImageryPreferences;
 
 /**
@@ -27,4 +30,5 @@
     public static final IntegerProperty PROP_MAX_ZOOM_LVL = new IntegerProperty(PREFERENCE_PREFIX + ".max_zoom_lvl", DEFAULT_MAX_ZOOM);
     public static final BooleanProperty PROP_DRAW_DEBUG = new BooleanProperty(PREFERENCE_PREFIX + ".draw_debug", false);
+    public static final BooleanProperty PROP_ADD_TO_SLIPPYMAP_CHOOSER = new BooleanProperty(PREFERENCE_PREFIX + ".add_to_slippymap_chooser", true);
 
     static int checkMaxZoomLvl(int maxZoomLvl, TileSource ts)
@@ -80,3 +84,16 @@
         PROP_MIN_ZOOM_LVL.put(minZoomLvl);
     }
+
+    public static TileSource getTileSource(ImageryInfo info) {
+        if (info.getImageryType() == ImageryType.TMS) {
+            if(ImageryPreferences.isUrlWithPatterns(info.getURL())) {
+                return new TemplatedTMSTileSource(info.getName(), info.getURL(), info.getMaxZoom());
+            } else {
+                return new TMSTileSource(info.getName(),info.getURL(), info.getMaxZoom());
+            }
+        } else if (info.getImageryType() == ImageryType.BING) {
+            return new BingAerialTileSource();
+        }
+        return null;
+    }
 }
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSTileSource.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSTileSource.java	(revision 24619)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSTileSource.java	(revision 24620)
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSTileSourceProvider.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSTileSourceProvider.java	(revision 24620)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/tms/TMSTileSourceProvider.java	(revision 24620)
@@ -0,0 +1,41 @@
+package org.openstreetmap.josm.plugins.imagery.tms;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+
+import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
+import org.openstreetmap.josm.gui.bbox.SlippyMapBBoxChooser.TileSourceProvider;
+import org.openstreetmap.josm.plugins.imagery.ImageryInfo;
+import org.openstreetmap.josm.plugins.imagery.ImageryPlugin;
+
+/**
+ * TMS TileSource provider for the slippymap chooser
+ * @author Upliner
+ */
+public class TMSTileSourceProvider implements TileSourceProvider {
+    static final HashSet<String> existingSlippyMapUrls = new HashSet<String>();
+    static {
+        // Urls that already exist in the slippymap chooser
+        existingSlippyMapUrls.add("http://tile.openstreetmap.org");
+        existingSlippyMapUrls.add("http://tah.openstreetmap.org/Tiles");
+        existingSlippyMapUrls.add("http://tile.opencyclemap.org/cycle");
+    }
+
+    @Override
+    public List<TileSource> getTileSources() {
+        if (!TMSPreferences.PROP_ADD_TO_SLIPPYMAP_CHOOSER.get()) return Collections.<TileSource>emptyList();
+        List<TileSource> sources = new ArrayList<TileSource>();
+        for (ImageryInfo info : ImageryPlugin.instance.info.getLayers()) {
+            if (existingSlippyMapUrls.contains(info.getURL())) continue;
+            TileSource source = TMSPreferences.getTileSource(info);
+            if (source != null) sources.add(source);
+        }
+        return sources;
+    }
+
+    public static void addExistingSlippyMapUrl(String url) {
+        existingSlippyMapUrls.add(url);
+    }
+}
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/wms/WMSGrabber.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/wms/WMSGrabber.java	(revision 24619)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/wms/WMSGrabber.java	(revision 24620)
@@ -31,11 +31,9 @@
 import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.io.ProgressInputStream;
+import org.openstreetmap.josm.plugins.imagery.ImageryPreferences;
 import org.openstreetmap.josm.plugins.imagery.wms.GeorefImage.State;
 
 
 public class WMSGrabber extends Grabber {
-    public static boolean isUrlWithPatterns(String url) {
-        return url != null && url.contains("{") && url.contains("}");
-    }
 
     protected String baseURL;
@@ -46,5 +44,5 @@
         this.baseURL = layer.getInfo().getURL();
         /* URL containing placeholders? */
-        urlWithPatterns = isUrlWithPatterns(baseURL);
+        urlWithPatterns = ImageryPreferences.isUrlWithPatterns(baseURL);
     }
 
Index: /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/wms/WMSLayer.java
===================================================================
--- /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/wms/WMSLayer.java	(revision 24619)
+++ /applications/editors/josm/plugins/imagery/src/org/openstreetmap/josm/plugins/imagery/wms/WMSLayer.java	(revision 24620)
@@ -30,7 +30,7 @@
 import org.openstreetmap.josm.actions.SaveActionBase;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
+import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
@@ -42,7 +42,8 @@
 import org.openstreetmap.josm.io.CacheFiles;
 import org.openstreetmap.josm.plugins.imagery.ImageryInfo;
+import org.openstreetmap.josm.plugins.imagery.ImageryInfo.ImageryType;
 import org.openstreetmap.josm.plugins.imagery.ImageryLayer;
 import org.openstreetmap.josm.plugins.imagery.ImageryPlugin;
-import org.openstreetmap.josm.plugins.imagery.ImageryInfo.ImageryType;
+import org.openstreetmap.josm.plugins.imagery.ImageryPreferences;
 import org.openstreetmap.josm.plugins.imagery.wms.GeorefImage.State;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -112,5 +113,5 @@
             WMSGrabber.getProjection(info.getURL(), true);
             startGrabberThreads();
-            if(info.getImageryType() == ImageryType.WMS && !WMSGrabber.isUrlWithPatterns(info.getURL())) {
+            if(info.getImageryType() == ImageryType.WMS && !ImageryPreferences.isUrlWithPatterns(info.getURL())) {
                 if (!(info.getURL().endsWith("&") || info.getURL().endsWith("?"))) {
                     if (!confirmMalformedUrl(info.getURL())) {
