Index: src/org/openstreetmap/josm/actions/ApiPreconditionChecker.java
===================================================================
--- src/org/openstreetmap/josm/actions/ApiPreconditionChecker.java	(revision 0)
+++ src/org/openstreetmap/josm/actions/ApiPreconditionChecker.java	(revision 0)
@@ -0,0 +1,78 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map.Entry;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.UploadAction.UploadHook;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.io.OsmApi;
+import org.openstreetmap.josm.io.OsmApiInitializationException;
+
+public class ApiPreconditionChecker implements UploadHook {
+
+    public boolean checkUpload(Collection<OsmPrimitive> add, Collection<OsmPrimitive> update,
+            Collection<OsmPrimitive> delete) {
+        OsmApi api = OsmApi.getOsmApi();
+        try {
+            api.initialize();
+            long maxNodes = api.capabilities.getLong("waynodes","maximum");
+
+            if( !checkMaxNodes(add, maxNodes))
+                return false;
+            if( !checkMaxNodes(update, maxNodes))
+                return false;
+            if( !checkMaxNodes(delete, maxNodes))
+                return false;
+
+            long maxElements = api.capabilities.getLong("changesets", "maximum_elements");
+            if(add.size() + update.size() + delete.size() > maxElements) {
+                JOptionPane.showMessageDialog(Main.parent,tr("Maximum number of changes exceeded ({0}).", maxElements));
+
+                return false;
+            }
+        } catch (OsmApiInitializationException e) {
+            e.printStackTrace();
+            JOptionPane.showMessageDialog(Main.parent,tr("Network error. Unable to get server capabilities."));
+
+            return false;
+        }
+
+        return true;
+    }
+
+    private boolean checkMaxNodes(Collection<OsmPrimitive> add, long maxNodes) {
+        for (OsmPrimitive osmPrimitive : add) {
+            for (Entry<String,String> e : osmPrimitive.keys.entrySet()) {
+                if(e.getValue().length() > 255) {
+                    JOptionPane.showMessageDialog(Main.parent,tr("Id {0} tag {1} is too long.", osmPrimitive.id, e.getKey()));
+                    List<OsmPrimitive> newNodes = new LinkedList<OsmPrimitive>();
+                    newNodes.add(osmPrimitive);
+
+                    Main.ds.setSelected(newNodes);
+                    return false;
+                }
+            }
+
+            if (osmPrimitive instanceof Way &&
+                    ((Way)osmPrimitive).nodes.size() > maxNodes) {
+                JOptionPane.showMessageDialog(Main.parent,tr("Way id {1} exceeds maximum way nodes ({0}).", maxNodes, osmPrimitive.id));
+                List<OsmPrimitive> newNodes = new LinkedList<OsmPrimitive>();
+                newNodes.add(osmPrimitive);
+
+                Main.ds.setSelected(newNodes);
+                return false;
+            }
+        }
+        return true;
+    }
+
+}
Index: src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/UploadAction.java	(revision 1690)
+++ src/org/openstreetmap/josm/actions/UploadAction.java	(working copy)
@@ -80,6 +80,11 @@
                 Shortcut.registerShortcut("file:upload", tr("File: {0}", tr("Upload to OSM...")), KeyEvent.VK_U, Shortcut.GROUPS_ALT1+Shortcut.GROUP_HOTKEY), true);
 
         /**
+         * Checks server capabilities before upload.
+         */
+        uploadHooks.add(new ApiPreconditionChecker());
+
+        /**
          * Displays a screen where the actions that would be taken are displayed and
          * give the user the possibility to cancel the upload.
          */
