Index: /trunk/src/org/openstreetmap/josm/gui/download/AbstractDownloadSourcePanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/AbstractDownloadSourcePanel.java	(revision 12704)
+++ /trunk/src/org/openstreetmap/josm/gui/download/AbstractDownloadSourcePanel.java	(revision 12705)
@@ -8,4 +8,5 @@
 
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.gui.download.DownloadSourceSizingPolicy.FixedDownloadSourceSizePolicy;
 
 /**
@@ -16,4 +17,9 @@
  */
 public abstract class AbstractDownloadSourcePanel<T> extends JPanel {
+
+    /**
+     * A prefix to be used for tab height preferences
+     */
+    public static final String TAB_SPLIT_NAMESPACE = "download.tabsplit.";
 
     /**
@@ -107,3 +113,12 @@
      */
     public abstract String getSimpleName();
+
+    /**
+     * Gets the policy that defines how this component should be sized
+     * @return The sizing policy. A fixed policy on default.
+     * @since 12705
+     */
+    public DownloadSourceSizingPolicy getSizingPolicy() {
+        return new FixedDownloadSourceSizePolicy(this);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 12704)
+++ /trunk/src/org/openstreetmap/josm/gui/download/DownloadDialog.java	(revision 12705)
@@ -15,5 +15,4 @@
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
-import java.beans.PropertyChangeListener;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -62,8 +61,4 @@
 public class DownloadDialog extends JDialog {
 
-    /**
-     * 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);
@@ -97,5 +92,5 @@
     protected SlippyMapChooser slippyMapChooser;
     protected JPanel mainPanel;
-    protected JSplitPane dialogSplit;
+    protected DownloadDialogSplitPane dialogSplit;
 
     /*
@@ -144,9 +139,7 @@
         tpDownloadAreaSelectors.setMinimumSize(new Dimension(0, 0));
 
-        dialogSplit = new JSplitPane(
-                JSplitPane.VERTICAL_SPLIT,
+        dialogSplit = new DownloadDialogSplitPane(
                 downloadSourcesTab,
                 tpDownloadAreaSelectors);
-        dialogSplit.addPropertyChangeListener(getDividerChangedListener());
 
         ChangeListener tabChangedListener = getDownloadSourceTabChangeListener();
@@ -556,26 +549,5 @@
             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())
-                    );
-                }
+                dialogSplit.setPolicy(panel.getSizingPolicy());
             }
         };
@@ -659,3 +631,49 @@
         }
     }
+
+    /**
+     * A special split pane that acts according to a {@link DownloadSourceSizingPolicy}
+     *
+     * It attempts to size the top tab content correctly.
+     *
+     * @author Michael Zangl
+     * @since 12705
+     */
+    private static class DownloadDialogSplitPane extends JSplitPane {
+        private DownloadSourceSizingPolicy policy;
+        private JTabbedPane topComponent;
+
+        DownloadDialogSplitPane(JTabbedPane newTopComponent, Component newBottomComponent) {
+            super(VERTICAL_SPLIT, newTopComponent, newBottomComponent);
+            this.topComponent = newTopComponent;
+        }
+
+        public void setPolicy(DownloadSourceSizingPolicy policy) {
+            this.policy = policy;
+
+            super.setDividerLocation(policy.getComponentHeight() + computeOffset());
+            setDividerSize(policy.isHeightAdjustable() ? 10 : 0);
+            setEnabled(policy.isHeightAdjustable());
+        }
+
+        @Override
+        public void doLayout() {
+            // We need to force this height before the layout manager is run.
+            // We cannot do this in the setDividerLocation, since the offset cannot be computed there.
+            int offset = computeOffset();
+            if (policy.isHeightAdjustable()) {
+                policy.storeHeight(Math.max(getDividerLocation() - offset, 0));
+            }
+            super.setDividerLocation(policy.getComponentHeight() + offset);
+            super.doLayout();
+        }
+
+        /**
+         * @return The difference between the content height and the divider location
+         */
+        private int computeOffset() {
+            Component selectedComponent = topComponent.getSelectedComponent();
+            return topComponent.getHeight() - (selectedComponent == null ? 0 : selectedComponent.getHeight());
+        }
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/download/DownloadSourceSizingPolicy.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/DownloadSourceSizingPolicy.java	(revision 12705)
+++ /trunk/src/org/openstreetmap/josm/gui/download/DownloadSourceSizingPolicy.java	(revision 12705)
@@ -0,0 +1,94 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.download;
+
+import java.awt.Component;
+
+import org.openstreetmap.josm.data.preferences.AbstractProperty;
+
+/**
+ * Defines the sizing policy used for download tabs.
+ * @author Michael Zangl
+ * @since 12705
+ */
+public interface DownloadSourceSizingPolicy {
+    /**
+     * Gets the height of the download source panel.
+     * @return The height the component should have.
+     */
+    public int getComponentHeight();
+
+    /**
+     * Check whether the user should be allowed to adjust the height of this download source panel
+     * @return <code>true</code> if the height should be adjustable
+     */
+    public boolean isHeightAdjustable();
+
+    /**
+     * Stores the height
+     * @param height the height in pixel
+     */
+    public default void storeHeight(int height) {
+        throw new UnsupportedOperationException(
+                "Setting the height is not supported for " + this.getClass().getCanonicalName());
+    }
+
+    /**
+     * The download source has a fixed size provided by the component
+     * @author Michael Zangl
+     */
+    public class FixedDownloadSourceSizePolicy implements DownloadSourceSizingPolicy {
+        private final Component base;
+
+        /**
+         * Create a new fixed download source policy
+         * @param base The component of which the size should be taken.
+         */
+        public FixedDownloadSourceSizePolicy(Component base) {
+            this.base = base;
+        }
+
+        @Override
+        public int getComponentHeight() {
+            return (int) base.getPreferredSize().getHeight();
+        }
+
+        @Override
+        public boolean isHeightAdjustable() {
+            return false;
+        }
+    }
+
+    /**
+     * The height of this component is given by a preference entry.
+     * <p>
+     * Mind that using a preferred component size is not possible in this case, since the preference entry needs to have a onstant default value.
+     */
+    public class AdjustableDownloadSizePolicy implements DownloadSourceSizingPolicy {
+
+        private final AbstractProperty<Integer> preference;
+
+        /**
+         * Create a new {@link AdjustableDownloadSizePolicy}
+         * @param preference The preference key to use
+         */
+        public AdjustableDownloadSizePolicy(AbstractProperty<Integer> preference) {
+            this.preference = preference;
+        }
+
+        @Override
+        public int getComponentHeight() {
+            return Math.max(1, preference.get());
+        }
+
+        @Override
+        public boolean isHeightAdjustable() {
+            return true;
+        }
+
+        @Override
+        public void storeHeight(int height) {
+            preference.put(height);
+        }
+
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java	(revision 12704)
+++ /trunk/src/org/openstreetmap/josm/gui/download/OverpassDownloadSource.java	(revision 12705)
@@ -29,7 +29,10 @@
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.preferences.AbstractProperty;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
+import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.download.DownloadSourceSizingPolicy.AdjustableDownloadSizePolicy;
 import org.openstreetmap.josm.gui.preferences.server.OverpassServerPreference;
 import org.openstreetmap.josm.gui.util.GuiHelper;
@@ -44,4 +47,5 @@
  */
 public class OverpassDownloadSource implements DownloadSource<OverpassDownloadSource.OverpassDownloadData> {
+
 
     @Override
@@ -81,11 +85,13 @@
     public static class OverpassDownloadSourcePanel extends AbstractDownloadSourcePanel<OverpassDownloadData> {
 
-        private JosmTextArea overpassQuery;
-        private OverpassQueryList overpassQueryList;
-
         private static final String SIMPLE_NAME = "overpassdownloadpanel";
+        private static final AbstractProperty<Integer> PANEL_SIZE_PROPERTY =
+                new IntegerProperty(TAB_SPLIT_NAMESPACE + SIMPLE_NAME, 150).cached();
         private static final BooleanProperty OVERPASS_QUERY_LIST_OPENED =
                 new BooleanProperty("download.overpass.query-list.opened", false);
         private static final String ACTION_IMG_SUBDIR = "dialogs";
+
+        private JosmTextArea overpassQuery;
+        private OverpassQueryList overpassQueryList;
 
         /**
@@ -278,4 +284,9 @@
         }
 
+        @Override
+        public DownloadSourceSizingPolicy getSizingPolicy() {
+            return new AdjustableDownloadSizePolicy(PANEL_SIZE_PROPERTY);
+        }
+
         /**
          * Action that delegates snippet creation to {@link OverpassQueryList#createNewItem()}.
