Index: trunk/src/org/openstreetmap/josm/data/osm/BBox.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/BBox.java	(revision 16672)
+++ trunk/src/org/openstreetmap/josm/data/osm/BBox.java	(revision 16673)
@@ -216,4 +216,12 @@
 
     /**
+     * Gets the area of the bbox.
+     * @return the area computed from {@link #width()} and {@link #height()}
+     */
+    public double area() {
+        return width() * height();
+    }
+
+    /**
      * Tests, whether the bbox {@code b} lies completely inside this bbox.
      * @param b bounding box
Index: trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 16672)
+++ trunk/src/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanel.java	(revision 16673)
@@ -24,4 +24,5 @@
 import javax.swing.JLabel;
 import javax.swing.JPanel;
+import javax.swing.JTextField;
 import javax.swing.event.AncestorEvent;
 import javax.swing.event.AncestorListener;
@@ -31,5 +32,7 @@
 
 import org.openstreetmap.josm.data.osm.Changeset;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.io.UploadTextComponentValidator.UploadAreaValidator;
 import org.openstreetmap.josm.gui.widgets.HistoryComboBox;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
@@ -69,4 +72,6 @@
     /** the checkbox to request feedback from other users */
     private final JCheckBox cbRequestReview = new JCheckBox(tr("I would like someone to review my edits."));
+    private final JLabel areaValidatorFeedback = new JLabel();
+    private final UploadAreaValidator areaValidator = new UploadAreaValidator(new JTextField(), areaValidatorFeedback);
     /** the changeset comment model */
     private final transient ChangesetCommentModel changesetCommentModel;
@@ -200,4 +205,7 @@
             cbRequestReview.addItemListener(e -> changesetReviewModel.setReviewRequested(e.getStateChange() == ItemEvent.SELECTED));
         }
+        JPanel pnl = new JPanel(new GridBagLayout());
+        pnl.add(areaValidatorFeedback, GBC.eol().fill(GBC.HORIZONTAL));
+        add(pnl);
     }
 
@@ -274,4 +282,8 @@
     }
 
+    void setUploadedPrimitives(List<OsmPrimitive> primitives) {
+        areaValidator.computeArea(primitives);
+    }
+
     /**
      * Returns the panel that displays a summary of data the user is about to upload.
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 16672)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 16673)
@@ -253,4 +253,5 @@
             return;
         }
+        pnlBasicUploadSettings.setUploadedPrimitives(toUpload.getPrimitives());
         pnlUploadedObjects.setUploadedPrimitives(
                 toUpload.getPrimitivesToAdd(),
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadTextComponentValidator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadTextComponentValidator.java	(revision 16672)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadTextComponentValidator.java	(revision 16673)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.Collection;
 import java.util.Collections;
 
@@ -9,5 +10,8 @@
 import javax.swing.text.JTextComponent;
 
+import org.openstreetmap.josm.data.osm.BBox;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.gui.widgets.AbstractTextComponentValidator;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -111,3 +115,34 @@
         }
     }
+
+    /**
+     * Validator for the changeset area
+     */
+    static class UploadAreaValidator extends UploadTextComponentValidator {
+        private double area = Double.NaN;
+
+        UploadAreaValidator(JTextComponent tc, JLabel feedback) {
+            super(tc, feedback);
+        }
+
+        void computeArea(Collection<? extends IPrimitive> primitives) {
+            this.area = primitives.stream()
+                    .map(IPrimitive::getBBox)
+                    .reduce((b1, b2) -> {
+                        b1.add(b2);
+                        return b1;
+                    }).map(BBox::area)
+                    .orElse(Double.NaN);
+            validate();
+        }
+
+        @Override
+        public void validate() {
+            if (Double.isFinite(area) && area <= Config.getPref().getDouble("upload.max-area", 3.)) {
+                feedbackValid(null);
+            } else {
+                feedbackWarning(tr("The bounding box of this changeset is very large – please consider splitting your changes!"));
+            }
+        }
+    }
 }
Index: trunk/test/unit/org/openstreetmap/josm/data/osm/BBoxTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/BBoxTest.java	(revision 16672)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/BBoxTest.java	(revision 16673)
@@ -166,14 +166,16 @@
 
     /**
-     * Unit test of {@link BBox#height} and {@link BBox#width} methods.
+     * Unit test of {@link BBox#height} and {@link BBox#width} and {@link BBox#area} methods.
      */
     @Test
-    public void testHeightWidth() {
+    public void testHeightWidthArea() {
         BBox b1 = new BBox(1, 2, 3, 5);
         assertEquals(2, b1.width(), 1e-7);
         assertEquals(3, b1.height(), 1e-7);
+        assertEquals(6, b1.area(), 1e-7);
         BBox b2 = new BBox();
         assertEquals(0, b2.width(), 1e-7);
         assertEquals(0, b2.height(), 1e-7);
+        assertEquals(0, b2.area(), 1e-7);
     }
 
