Index: /trunk/src/org/openstreetmap/josm/gui/download/AbstractDownloadSourcePanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/AbstractDownloadSourcePanel.java	(revision 12683)
+++ /trunk/src/org/openstreetmap/josm/gui/download/AbstractDownloadSourcePanel.java	(revision 12684)
@@ -98,3 +98,12 @@
         getDownloadSource().doDownload(getData(), downloadSettings);
     }
+
+    /**
+     * Returns a simple name describing this panel. This string can be used from other GUI parts
+     * of JOSM to save the user preferences related to the GUI settings. For example, the panel for downloading
+     * the OSM data can be named 'downloadosmpanel'. Note, choose the name such that it is unique to avoid
+     * collisions with other names.
+     * @return A simple name describing this panel.
+     */
+    public abstract String getSimpleName();
 }
Index: /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 12683)
+++ /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 12684)
@@ -16,4 +16,5 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
+import java.beans.PropertyChangeListener;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -33,4 +34,6 @@
 import javax.swing.JTabbedPane;
 import javax.swing.KeyStroke;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
 
 import org.openstreetmap.josm.Main;
@@ -51,4 +54,5 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
+import org.openstreetmap.josm.tools.JosmRuntimeException;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.OsmUrlToBounds;
@@ -62,7 +66,7 @@
      * Preference properties
      */
+    private static final String TAB_SPLIT_NAMESPACE = "download.tabsplit.";
     private static final IntegerProperty DOWNLOAD_TAB = new IntegerProperty("download.tab", 0);
     private static final IntegerProperty DOWNLOAD_SOURCE_TAB = new IntegerProperty("download-source.tab", 0);
-    private static final IntegerProperty DIALOG_SPLIT = new IntegerProperty("download.split", 200);
     private static final BooleanProperty DOWNLOAD_AUTORUN = new BooleanProperty("download.autorun", false);
     private static final BooleanProperty DOWNLOAD_NEWLAYER = new BooleanProperty("download.newlayer", false);
@@ -115,11 +119,7 @@
         mainPanel = new JPanel(new GridBagLayout());
 
-        downloadSources.add(new OSMDownloadSource());
-        downloadSources.add(new OverpassDownloadSource());
-
-        // register all default download sources
-        for (int i = 0; i < downloadSources.size(); i++) {
-            downloadSources.get(i).addGui(this);
-        }
+        // add default download sources
+        addDownloadSource(new OSMDownloadSource());
+        addDownloadSource(new OverpassDownloadSource());
 
         // must be created before hook
@@ -141,6 +141,6 @@
         }
 
-        // allow to collapse the panes completely
-        downloadSourcesTab.setMinimumSize(new Dimension(0, 0));
+        // allow to collapse the panes, but reserve some space for tabs
+        downloadSourcesTab.setMinimumSize(new Dimension(0, 25));
         tpDownloadAreaSelectors.setMinimumSize(new Dimension(0, 0));
 
@@ -149,4 +149,9 @@
                 downloadSourcesTab,
                 tpDownloadAreaSelectors);
+        dialogSplit.addPropertyChangeListener(getDividerChangedListener());
+
+        ChangeListener tabChangedListener = getDownloadSourceTabChangeListener();
+        tabChangedListener.stateChanged(new ChangeEvent(downloadSourcesTab));
+        downloadSourcesTab.addChangeListener(tabChangedListener);
 
         mainPanel.add(dialogSplit, GBC.eol().fill());
@@ -171,9 +176,11 @@
         ExpertToggleAction.addVisibilitySwitcher(cbZoomToDownloadedData);
 
-        if (!ExpertToggleAction.isExpert()) {
-            JLabel infoLabel = new JLabel(
-                    tr("Use left click&drag to select area, arrows or right mouse button to scroll map, wheel or +/- to zoom."));
-            mainPanel.add(infoLabel, GBC.eol().anchor(GBC.SOUTH).insets(0, 0, 0, 0));
-        }
+        mainPanel.add(new JLabel(), GBC.eol()); // place info label at a new line
+        JLabel infoLabel = new JLabel(
+                tr("Use left click&drag to select area, arrows or right mouse button to scroll map, wheel or +/- to zoom."));
+        mainPanel.add(infoLabel, GBC.eol().anchor(GBC.CENTER).insets(0, 0, 0, 0));
+
+        ExpertToggleAction.addExpertModeChangeListener(isExpert -> infoLabel.setVisible(!isExpert), true);
+
         return mainPanel;
     }
@@ -253,4 +260,9 @@
         ExpertToggleAction.addExpertModeChangeListener(expertListener);
         restoreSettings();
+
+        // if no bounding box is selected make sure it is still propagated.
+        if (currentBounds == null) {
+            boundingBoxChanged(null, null);
+        }
     }
 
@@ -315,5 +327,5 @@
     /**
      * Determines if the dialog autorun is enabled in preferences.
-     * @return {@code true} if the download dialog must be open at startup, {@code false} otherwise
+     * @return {@code true} if the download dialog must be open at startup, {@code false} otherwise.
      */
     public static boolean isAutorunEnabled() {
@@ -322,8 +334,8 @@
 
     /**
-     * Adds a new download area selector to the download dialog
+     * Adds a new download area selector to the download dialog.
      *
-     * @param selector the download are selector
-     * @param displayName the display name of the selector
+     * @param selector the download are selector.
+     * @param displayName the display name of the selector.
      */
     public void addDownloadAreaSelector(JPanel selector, String displayName) {
@@ -332,10 +344,17 @@
 
     /**
-     * Adds a new download source to the download dialog
+     * Adds a new download source to the download dialog if it is not added.
      *
      * @param downloadSource The download source to be added.
      * @param <T> The type of the download data.
+     * @throws JosmRuntimeException If the download source is already added. Note, download sources are
+     * compared by their reference.
      */
     public <T> void addDownloadSource(DownloadSource<T> downloadSource) {
+        if (downloadSources.contains(downloadSource)) {
+            throw new JosmRuntimeException("The download source you are trying to add already exists.");
+        }
+
+        downloadSources.add(downloadSource);
         if ((ExpertToggleAction.isExpert() && downloadSource.onlyExpert()) || !downloadSource.onlyExpert()) {
             addNewDownloadSourceTab(downloadSource);
@@ -344,5 +363,5 @@
 
     /**
-     * Refreshes the tile sources
+     * Refreshes the tile sources.
      * @since 6364
      */
@@ -359,5 +378,4 @@
         DOWNLOAD_TAB.put(tpDownloadAreaSelectors.getSelectedIndex());
         DOWNLOAD_SOURCE_TAB.put(downloadSourcesTab.getSelectedIndex());
-        DIALOG_SPLIT.put(dialogSplit.getDividerLocation());
         DOWNLOAD_NEWLAYER.put(cbNewLayer.isSelected());
         DOWNLOAD_ZOOMTODATA.put(cbZoomToDownloadedData.isSelected());
@@ -374,5 +392,4 @@
         cbStartup.setSelected(isAutorunEnabled());
         cbZoomToDownloadedData.setSelected(DOWNLOAD_ZOOMTODATA.get());
-        dialogSplit.setDividerLocation(DIALOG_SPLIT.get());
 
         try {
@@ -408,5 +425,5 @@
     /**
      * Returns the previously saved bounding box from preferences.
-     * @return The bounding box saved in preferences if any, {@code null} otherwise
+     * @return The bounding box saved in preferences if any, {@code null} otherwise.
      * @since 6509
      */
@@ -500,5 +517,5 @@
      * @param <T> The type of the download data.
      */
-    private <T> void addNewDownloadSourceTab(DownloadSource<T> downloadSource) {
+    protected <T> void addNewDownloadSourceTab(DownloadSource<T> downloadSource) {
         AbstractDownloadSourcePanel<T> panel = downloadSource.createPanel();
         downloadSourcesTab.add(panel, downloadSource.getLabel());
@@ -536,4 +553,42 @@
 
     /**
+     * Creates a listener that reacts on tab switches for {@code downloadSourcesTab} in order
+     * to adjust proper division of the dialog according to user saved preferences or minimal size
+     * of the panel.
+     * @return A listener to adjust dialog division.
+     */
+    private ChangeListener getDownloadSourceTabChangeListener() {
+        return ec -> {
+            JTabbedPane tabbedPane = (JTabbedPane) ec.getSource();
+            Component selectedComponent = tabbedPane.getSelectedComponent();
+            if (selectedComponent instanceof AbstractDownloadSourcePanel) {
+                AbstractDownloadSourcePanel<?> panel = (AbstractDownloadSourcePanel<?>) selectedComponent;
+                dialogSplit.setDividerLocation(Main.pref.getInteger(
+                        TAB_SPLIT_NAMESPACE + panel.getSimpleName(),
+                        panel.getMinimumSize().height));
+            }
+        };
+    }
+
+    /**
+     * Creates a listener that react on dialog splitters movements to save users preferences.
+     * @return A listener to save user preferred split of the dialog.
+     */
+    private PropertyChangeListener getDividerChangedListener() {
+        return evt -> {
+            if (evt.getPropertyName().equalsIgnoreCase(JSplitPane.DIVIDER_LOCATION_PROPERTY)) {
+                Component selectedComponent = downloadSourcesTab.getSelectedComponent();
+                if (selectedComponent instanceof AbstractDownloadSourcePanel) {
+                    AbstractDownloadSourcePanel<?> panel = (AbstractDownloadSourcePanel<?>) selectedComponent;
+                    Main.pref.put(
+                            TAB_SPLIT_NAMESPACE + panel.getSimpleName(),
+                            String.valueOf(dialogSplit.getDividerLocation())
+                    );
+                }
+            }
+        };
+    }
+
+    /**
      * Action that is executed when the cancel button is pressed.
      */
@@ -555,7 +610,12 @@
         @Override
         public void actionPerformed(ActionEvent e) {
-            AbstractDownloadSourcePanel<?> pnl = (AbstractDownloadSourcePanel<?>) downloadSourcesTab.getSelectedComponent();
-            run();
-            pnl.checkCancel();
+            Component panel = downloadSourcesTab.getSelectedComponent();
+            if (panel instanceof AbstractDownloadSourcePanel) {
+                AbstractDownloadSourcePanel<?> pnl = (AbstractDownloadSourcePanel<?>) panel;
+                run();
+                pnl.checkCancel();
+            } else {
+                run();
+            }
         }
     }
@@ -573,5 +633,6 @@
 
         /**
-         * Starts the download, if possible
+         * Starts the download and closes the dialog, if all requirements for the current download source are met.
+         * Otherwise the download is not started and the dialog remains visible.
          */
         public void run() {
Index: /trunk/src/org/openstreetmap/josm/gui/download/DownloadSettings.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/DownloadSettings.java	(revision 12683)
+++ /trunk/src/org/openstreetmap/josm/gui/download/DownloadSettings.java	(revision 12684)
@@ -2,7 +2,7 @@
 package org.openstreetmap.josm.gui.download;
 
+import org.openstreetmap.josm.data.Bounds;
+
 import java.util.Optional;
-
-import org.openstreetmap.josm.data.Bounds;
 
 /**
@@ -52,9 +52,5 @@
      */
     public Optional<Bounds> getDownloadBounds() {
-        if (downloadBounds == null) {
-            return Optional.empty();
-        } else {
-            return Optional.of(downloadBounds);
-        }
+        return Optional.ofNullable(downloadBounds);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/download/DownloadSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/DownloadSource.java	(revision 12683)
+++ /trunk/src/org/openstreetmap/josm/gui/download/DownloadSource.java	(revision 12684)
@@ -31,10 +31,4 @@
 
     /**
-     * Add a download source to the dialog, see {@link DownloadDialog}.
-     * @param dialog The download dialog.
-     */
-    void addGui(DownloadDialog dialog);
-
-    /**
      * Defines whether this download source should be visible only in the expert mode.
      * @return Returns {@code true} if the download source should be visible only in the
Index: /trunk/src/org/openstreetmap/josm/gui/download/OSMDownloadSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/OSMDownloadSource.java	(revision 12683)
+++ /trunk/src/org/openstreetmap/josm/gui/download/OSMDownloadSource.java	(revision 12684)
@@ -5,4 +5,5 @@
 
 import java.awt.Color;
+import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.GridBagLayout;
@@ -118,9 +119,4 @@
 
     @Override
-    public void addGui(DownloadDialog dialog) {
-        dialog.addDownloadSource(this);
-    }
-
-    @Override
     public boolean onlyExpert() {
         return false;
@@ -138,4 +134,5 @@
         private final JLabel sizeCheck = new JLabel();
 
+        private static final String SIMPLE_NAME = "osmdownloadpanel";
         private static final BooleanProperty DOWNLOAD_OSM = new BooleanProperty("download.osm.data", true);
         private static final BooleanProperty DOWNLOAD_GPS = new BooleanProperty("download.osm.gps", false);
@@ -143,6 +140,6 @@
 
         /**
-         * Creates a new {@link OSMDownloadSourcePanel}
-         * @param ds The osm download source the panel is for
+         * Creates a new {@link OSMDownloadSourcePanel}.
+         * @param ds The osm download source the panel is for.
          */
         public OSMDownloadSourcePanel(OSMDownloadSource ds) {
@@ -175,4 +172,6 @@
             add(cbDownloadNotes, GBC.eol().insets(1, 5, 1, 5));
             add(sizeCheck, GBC.eol().anchor(GBC.EAST).insets(5, 5, 5, 2));
+
+            setMinimumSize(new Dimension(450, 115));
         }
 
@@ -278,10 +277,18 @@
         }
 
+        @Override
+        public String getSimpleName() {
+            return SIMPLE_NAME;
+        }
+
         private void updateSizeCheck(Bounds bbox) {
-            boolean isAreaTooLarge = false;
             if (bbox == null) {
                 sizeCheck.setText(tr("No area selected yet"));
                 sizeCheck.setForeground(Color.darkGray);
-            } else if (!isDownloadNotes() && !isDownloadOsmData() && !isDownloadGpxData()) {
+                return;
+            }
+
+            boolean isAreaTooLarge = false;
+            if (!isDownloadNotes() && !isDownloadOsmData() && !isDownloadGpxData()) {
                 isAreaTooLarge = false;
             } else if (isDownloadNotes() && !isDownloadOsmData() && !isDownloadGpxData()) {
Index: /trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java	(revision 12683)
+++ /trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java	(revision 12684)
@@ -71,9 +71,4 @@
 
     @Override
-    public void addGui(DownloadDialog dialog) {
-        dialog.addDownloadSource(this);
-    }
-
-    @Override
     public boolean onlyExpert() {
         return true;
@@ -89,4 +84,5 @@
         private OverpassQueryList overpassQueryList;
 
+        private static final String SIMPLE_NAME = "overpassdownloadpanel";
         private static final BooleanProperty OVERPASS_QUERY_LIST_OPENED =
                 new BooleanProperty("download.overpass.query-list.opened", false);
@@ -180,4 +176,6 @@
             add(innerPanel, BorderLayout.CENTER);
             add(listPanel, BorderLayout.EAST);
+
+            setMinimumSize(new Dimension(450, 240));
         }
 
@@ -275,4 +273,9 @@
         }
 
+        @Override
+        public String getSimpleName() {
+            return SIMPLE_NAME;
+        }
+
         /**
          * Action that delegates snippet creation to {@link OverpassQueryList#createNewItem()}.
