Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 2619)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 2620)
@@ -19,4 +19,5 @@
 import java.util.Collections;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -62,7 +63,7 @@
 
     private static class DefaultPreferenceChangeEvent implements PreferenceChangeEvent {
-        private String key;
-        private String oldValue;
-        private String newValue;
+        private final String key;
+        private final String oldValue;
+        private final String newValue;
 
         public DefaultPreferenceChangeEvent(String key, String oldValue, String newValue) {
@@ -75,18 +76,9 @@
             return key;
         }
-        public void setKey(String key) {
-            this.key = key;
-        }
         public String getOldValue() {
             return oldValue;
         }
-        public void setOldValue(String oldValue) {
-            this.oldValue = oldValue;
-        }
         public String getNewValue() {
             return newValue;
-        }
-        public void setNewValue(String newValue) {
-            this.newValue = newValue;
         }
     }
@@ -713,10 +705,7 @@
     }
     synchronized public void removeFromCollection(String key, String value) {
-        ArrayList<String> a = new ArrayList<String>(getCollection(key, null));
-        if(a != null)
-        {
-            a.remove(value);
-            putCollection(key, a);
-        }
+        List<String> a = new ArrayList<String>(getCollection(key, null));
+        a.remove(value);
+        putCollection(key, a);
     }
     synchronized public boolean putCollection(String key, Collection<String> val) {
Index: trunk/src/org/openstreetmap/josm/data/osm/Filters.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Filters.java	(revision 2619)
+++ trunk/src/org/openstreetmap/josm/data/osm/Filters.java	(revision 2620)
@@ -4,15 +4,14 @@
 import static org.openstreetmap.josm.tools.I18n.trc;
 
-import javax.swing.table.AbstractTableModel;
-
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Collection;
 import java.util.Map;
 
-import org.openstreetmap.josm.data.osm.Filter;
+import javax.swing.table.AbstractTableModel;
+
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.actions.search.SearchAction.Function;
-import org.openstreetmap.josm.actions.search.SearchAction;
 
 /**
@@ -22,193 +21,198 @@
 public class Filters extends AbstractTableModel{
 
-   public int disabledCount, hiddenCount;
-
-   public Filters(){
-      loadPrefs();
-   }
-
-   private List<Filter> filters = new LinkedList<Filter>();
-   public void filter(){
-      Collection<OsmPrimitive> seld = new LinkedList<OsmPrimitive> ();
-      Collection<OsmPrimitive> self = new LinkedList<OsmPrimitive> ();
-      if(Main.main.getCurrentDataSet() == null)return;
-      Main.main.getCurrentDataSet().setFiltered();
-      Main.main.getCurrentDataSet().setDisabled();
-      for (Filter flt : filters){
+    public int disabledCount, hiddenCount;
+
+    public Filters(){
+        loadPrefs();
+    }
+
+    private List<Filter> filters = new LinkedList<Filter>();
+    public void filter(){
+        Collection<OsmPrimitive> seld = new LinkedList<OsmPrimitive> ();
+        Collection<OsmPrimitive> self = new LinkedList<OsmPrimitive> ();
+        if(Main.main.getCurrentDataSet() == null)return;
+        Main.main.getCurrentDataSet().setFiltered();
+        Main.main.getCurrentDataSet().setDisabled();
+        for (Filter flt : filters){
             if(flt.enable){
-               SearchAction.getSelection(flt, seld, new Function(){
-                  public Boolean isSomething(OsmPrimitive o){
-                     return o.isDisabled();
-                  }
-               });
-               if(flt.hide) {
-                  SearchAction.getSelection(flt, self, new Function(){
-                     public Boolean isSomething(OsmPrimitive o){
-                        return o.isFiltered();
-                     }
-                  });
-               }
+                SearchAction.getSelection(flt, seld, new Function(){
+                    public Boolean isSomething(OsmPrimitive o){
+                        return o.isDisabled();
+                    }
+                });
+                if(flt.hide) {
+                    SearchAction.getSelection(flt, self, new Function(){
+                        public Boolean isSomething(OsmPrimitive o){
+                            return o.isFiltered();
+                        }
+                    });
+                }
             }
-      }
-      disabledCount = seld.size() - self.size();
-      hiddenCount = self.size();
-      Main.main.getCurrentDataSet().setFiltered(self);
-      Main.main.getCurrentDataSet().setDisabled(seld);
-      Main.map.mapView.repaint();
-   }
-
-   private void loadPrefs(){
-      Map<String,String> prefs = Main.pref.getAllPrefix("filters.filter");
-      for (String value : prefs.values()) {
-         Filter filter = new Filter(value);
-         if(filter!=null)
-            filters.add(filter);
-      }
-   }
-
-   private void savePrefs(){
-      Map<String,String> prefs = Main.pref.getAllPrefix("filters.filter");
-      for (String key : prefs.keySet()) {
-         String[] sts = key.split("\\.");
-         if (sts.length != 3)throw new Error("Incompatible filter preferences");
-         Main.pref.put("filters.filter." + sts[2], null);
-      }
-
-      int i = 0;
-      for (Filter flt : filters){
-         Main.pref.put("filters.filter." + i++, flt.getPrefString());
-      }
-   }
-
-   private void savePref(int i){
-      if(i >= filters.size())
-         Main.pref.put("filters.filter." + i, null);
-      else
-         Main.pref.put("filters.filter." + i, filters.get(i).getPrefString());
-   }
-
-   public void addFilter(Filter f){
-      filters.add(f);
-      savePref(filters.size()-1);
-      filter();
-      fireTableRowsInserted(filters.size()-1, filters.size()-1);
-   }
-
-   public void moveDownFilter(int i){
-      if(i >= filters.size()-1) return;
-      filters.add(i+1, filters.remove(i));
-      savePref(i);
-      savePref(i+1);
-      filter();
-      fireTableRowsUpdated(i, i+1);
-   }
-
-   public void moveUpFilter(int i){
-      if(i == 0) return;
-      filters.add(i-1, filters.remove(i));
-      savePref(i);
-      savePref(i-1);
-      filter();
-      fireTableRowsUpdated(i-1, i);
-   }
-
-   public void removeFilter(int i){
-      filters.remove(i);
-      savePrefs();
-      filter();
-      fireTableRowsDeleted(i, i);
-   }
-
-   public void setFilter(int i, Filter f){
-      filters.set(i, f);
-      savePref(i);
-      filter();
-      fireTableRowsUpdated(i, i);
-   }
-
-   public Filter getFilter(int i){
-      return filters.get(i);
-   }
-
-   public int getRowCount(){
-      return filters.size();
-   }
-
-   public int getColumnCount(){
-      return 6;
-   }
-
-   public String getColumnName(int column){
-      String[] names = { /* translators notes must be in front */
-          /* column header: enable filter */             trc("filter","E"),
-          /* column header: hide filter */               tr("H"),
-          /* column header: filter text */               tr("Text"),
-          /* column header: apply filter for children */ tr("C"),
-          /* column header: inverted filter */           tr("I"),
-          /* column header: filter mode */               tr("M")
-      };
-      return names[column];
-   }
-
-   public Class getColumnClass(int column){
-      Class[] classes = { Boolean.class, Boolean.class, String.class, Boolean.class, Boolean.class, String.class };
-      return classes[column];
-   }
-
-   public boolean isCellEnabled(int row, int column){
-      if(!filters.get(row).enable && column!=0) return false;
-      return true;
-   }
-
-   public boolean isCellEditable(int row, int column){
-      if(!filters.get(row).enable && column!=0) return false;
-      if(column < 5)return true;
-      return false;
-   }
-
-   public void setValueAt(Object aValue, int row, int column){
-      Filter f = filters.get(row);
-      switch(column){
-         case 0: f.enable = (Boolean)aValue;
-                 savePref(row);
-                 filter();
-                 fireTableRowsUpdated(row, row);
-                 break;
-         case 1: f.hide = (Boolean)aValue;
-                 savePref(row);
-                 filter();
-                 break;
-         case 2: f.text = (String)aValue;
-                 savePref(row);
-                 break;
-         case 3: f.applyForChildren = (Boolean)aValue;
-                 savePref(row);
-                 filter();
-                 break;
-         case 4: f.inverted = (Boolean)aValue;
-                 savePref(row);
-                 filter();
-                 break;
-      }
-      if(column!=0)fireTableCellUpdated(row, column);
-   }
-
-   public Object getValueAt(int row, int column){
-      Filter f = filters.get(row);
-      switch(column){
-         case 0: return f.enable;
-         case 1: return f.hide;
-         case 2: return f.text;
-         case 3: return f.applyForChildren;
-         case 4: return f.inverted;
-         case 5:
-                 switch(f.mode){ /* translators notes must be in front */
-                    case replace:      /* filter mode: replace */      return tr("R");
-                    case add:          /* filter mode: add */          return tr("A");
-                    case remove:       /* filter mode: remove */       return tr("D");
-                    case in_selection: /* filter mode: in selection */ return tr("F");
-                 }
-      }
-      return null;
-   }
+        }
+        disabledCount = seld.size() - self.size();
+        hiddenCount = self.size();
+        Main.main.getCurrentDataSet().setFiltered(self);
+        Main.main.getCurrentDataSet().setDisabled(seld);
+        Main.map.mapView.repaint();
+    }
+
+    private void loadPrefs(){
+        Map<String,String> prefs = Main.pref.getAllPrefix("filters.filter");
+        for (String value : prefs.values()) {
+            filters.add(new Filter(value));
+        }
+    }
+
+    private void savePrefs(){
+        Map<String,String> prefs = Main.pref.getAllPrefix("filters.filter");
+        for (String key : prefs.keySet()) {
+            String[] sts = key.split("\\.");
+            if (sts.length != 3)throw new Error("Incompatible filter preferences");
+            Main.pref.put("filters.filter." + sts[2], null);
+        }
+
+        int i = 0;
+        for (Filter flt : filters){
+            Main.pref.put("filters.filter." + i++, flt.getPrefString());
+        }
+    }
+
+    private void savePref(int i){
+        if(i >= filters.size()) {
+            Main.pref.put("filters.filter." + i, null);
+        } else {
+            Main.pref.put("filters.filter." + i, filters.get(i).getPrefString());
+        }
+    }
+
+    public void addFilter(Filter f){
+        filters.add(f);
+        savePref(filters.size()-1);
+        filter();
+        fireTableRowsInserted(filters.size()-1, filters.size()-1);
+    }
+
+    public void moveDownFilter(int i){
+        if(i >= filters.size()-1) return;
+        filters.add(i+1, filters.remove(i));
+        savePref(i);
+        savePref(i+1);
+        filter();
+        fireTableRowsUpdated(i, i+1);
+    }
+
+    public void moveUpFilter(int i){
+        if(i == 0) return;
+        filters.add(i-1, filters.remove(i));
+        savePref(i);
+        savePref(i-1);
+        filter();
+        fireTableRowsUpdated(i-1, i);
+    }
+
+    public void removeFilter(int i){
+        filters.remove(i);
+        savePrefs();
+        filter();
+        fireTableRowsDeleted(i, i);
+    }
+
+    public void setFilter(int i, Filter f){
+        filters.set(i, f);
+        savePref(i);
+        filter();
+        fireTableRowsUpdated(i, i);
+    }
+
+    public Filter getFilter(int i){
+        return filters.get(i);
+    }
+
+    public int getRowCount(){
+        return filters.size();
+    }
+
+    public int getColumnCount(){
+        return 6;
+    }
+
+    @Override
+    public String getColumnName(int column){
+        String[] names = { /* translators notes must be in front */
+                /* column header: enable filter */             trc("filter","E"),
+                /* column header: hide filter */               tr("H"),
+                /* column header: filter text */               tr("Text"),
+                /* column header: apply filter for children */ tr("C"),
+                /* column header: inverted filter */           tr("I"),
+                /* column header: filter mode */               tr("M")
+        };
+        return names[column];
+    }
+
+    @Override
+    public Class<?> getColumnClass(int column){
+        Class<?>[] classes = { Boolean.class, Boolean.class, String.class, Boolean.class, Boolean.class, String.class };
+        return classes[column];
+    }
+
+    public boolean isCellEnabled(int row, int column){
+        if(!filters.get(row).enable && column!=0) return false;
+        return true;
+    }
+
+    @Override
+    public boolean isCellEditable(int row, int column){
+        if(!filters.get(row).enable && column!=0) return false;
+        if(column < 5)return true;
+        return false;
+    }
+
+    @Override
+    public void setValueAt(Object aValue, int row, int column){
+        Filter f = filters.get(row);
+        switch(column){
+        case 0: f.enable = (Boolean)aValue;
+        savePref(row);
+        filter();
+        fireTableRowsUpdated(row, row);
+        break;
+        case 1: f.hide = (Boolean)aValue;
+        savePref(row);
+        filter();
+        break;
+        case 2: f.text = (String)aValue;
+        savePref(row);
+        break;
+        case 3: f.applyForChildren = (Boolean)aValue;
+        savePref(row);
+        filter();
+        break;
+        case 4: f.inverted = (Boolean)aValue;
+        savePref(row);
+        filter();
+        break;
+        }
+        if(column!=0) {
+            fireTableCellUpdated(row, column);
+        }
+    }
+
+    public Object getValueAt(int row, int column){
+        Filter f = filters.get(row);
+        switch(column){
+        case 0: return f.enable;
+        case 1: return f.hide;
+        case 2: return f.text;
+        case 3: return f.applyForChildren;
+        case 4: return f.inverted;
+        case 5:
+            switch(f.mode){ /* translators notes must be in front */
+            case replace:      /* filter mode: replace */      return tr("R");
+            case add:          /* filter mode: add */          return tr("A");
+            case remove:       /* filter mode: remove */       return tr("D");
+            case in_selection: /* filter mode: in selection */ return tr("F");
+            }
+        }
+        return null;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 2619)
+++ trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 2620)
@@ -68,4 +68,14 @@
     public Node(long id) {
         super(id, false);
+    }
+
+    /**
+     * Create new complete node
+     * @param id
+     * @param version
+     */
+    public Node(long id, int version) {
+        super(id, false);
+        setOsmId(id, version);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2619)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 2620)
@@ -245,9 +245,12 @@
 
     /**
-     * Creates a new primitive for the given id. If the id > 0, the primitive is marked
-     * as incomplete.
-     *
-     * @param id the id. > 0 required
-     * @param allowNegativeId Allows to set negative id. For internal use
+     * Creates a new primitive for the given id.
+     * 
+     * If allowNegativeId is set, provided id can be < 0 and will be set to primitive without any processing.
+     * If allowNegativeId is not set, then id will have to be 0 (in that case new unique id will be generated) or
+     * positive number.
+     *
+     * @param id the id
+     * @param allowNegativeId
      * @throws IllegalArgumentException thrown if id < 0 and allowNegativeId is false
      */
@@ -1206,6 +1209,5 @@
     }
 
-    //TODO This method should not be necessary, incomplete state should be handled internally by OsmPrimitive
-    public void setIncomplete(boolean incomplete) {
+    private void setIncomplete(boolean incomplete) {
         this.incomplete = incomplete;
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2619)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 2620)
@@ -169,4 +169,14 @@
     public Relation(long id) throws IllegalArgumentException {
         super(id, false);
+    }
+
+    /**
+     * Creates new complete relation
+     * @param id
+     * @param version
+     */
+    public Relation(long id, int version) {
+        super(id, false);
+        setOsmId(id, version);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2619)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 2620)
@@ -173,11 +173,21 @@
     /**
      * Creates a new way for the given id. If the id > 0, the way is marked
-     * as incomplete.
-     *
-     * @param id the id. > 0 required
+     * as incomplete. If id == 0 then way is marked as new
+     *
+     * @param id the id. >= 0 required
      * @throws IllegalArgumentException thrown if id < 0
      */
     public Way(long id) throws IllegalArgumentException {
         super(id, false);
+    }
+
+    /**
+     * Creates new way with given id and version. Way is marked as complete
+     * @param id
+     * @param version
+     */
+    public Way(long id, int version) {
+        super(id, false);
+        setOsmId(id, version);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java	(revision 2619)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java	(revision 2620)
@@ -48,4 +48,12 @@
     }
 
+    protected boolean isInSelectionBase(OsmPrimitive primitive) {
+        return selectionBase.getSelected().contains(primitive);
+    }
+
+    protected boolean isAlreadyRemembered(OsmPrimitive primitive) {
+        return mappedPrimitives.keySet().contains(primitive);
+    }
+
     /**
      * Remebers a node in the "hull"
@@ -69,5 +77,5 @@
             return;
         Way clone = new Way(w);
-        List<Node> newNodes = new ArrayList<Node>();
+        List<Node> newNodes = new ArrayList<Node>(w.getNodesCount());
         for (Node n: w.getNodes()) {
             newNodes.add((Node)mappedPrimitives.get(n));
@@ -84,5 +92,5 @@
     protected void rememberRelation(Relation r) {
         Relation clone;
-        if (mappedPrimitives.keySet().contains(r)) {
+        if (isAlreadyRemembered(r)) {
             clone = (Relation)mappedPrimitives.get(r);
             clone.cloneFrom(r);
@@ -99,5 +107,5 @@
         clone.setMembers(newMembers);
 
-        if (! mappedPrimitives.keySet().contains(r)) {
+        if (!isAlreadyRemembered(r)) {
             mappedPrimitives.put(r, clone);
         }
@@ -127,32 +135,18 @@
 
     protected void rememberNodeIncomplete(Node n) {
-        if (isAlreadyRemembered(n))
-            return;
-        Node clone = new Node(n);
-        clone.setIncomplete(true);
-        mappedPrimitives.put(n, clone);
+        if (!isAlreadyRemembered(n)) {
+            mappedPrimitives.put(n, new Node(n.getId()));
+        }
     }
 
     protected void rememberWayIncomplete(Way w) {
-        if (isAlreadyRemembered(w))
-            return;
-        Way clone = new Way(w);
-        clone.setNodes(null);
-        clone.setIncomplete(true);
-        mappedPrimitives.put(w, clone);
+        if (!isAlreadyRemembered(w)) {
+            mappedPrimitives.put(w, new Way(w.getId()));
+        }
     }
 
     protected void rememberRelationIncomplete(Relation r) {
-        Relation clone;
-        if (isAlreadyRemembered(r)) {
-            clone = (Relation)mappedPrimitives.get(r);
-            clone.cloneFrom(r);
-        } else {
-            clone = new Relation(r);
-        }
-        clone.setMembers(null);
-        clone.setIncomplete(true);
-        if (! isAlreadyRemembered(r)) {
-            mappedPrimitives.put(r, clone);
+        if (!isAlreadyRemembered(r)) {
+            mappedPrimitives.put(r, new Relation(r.getId()));
         }
     }
@@ -166,18 +160,8 @@
         //
         for (Node n: w.getNodes()) {
-            if (! isAlreadyRemembered(n)) {
-                n.visit(this);
-            }
+            n.visit(this);
         }
         // ... and the way itself
         rememberWay(w);
-    }
-
-    protected boolean isInSelectionBase(OsmPrimitive primitive) {
-        return selectionBase.getSelected().contains(primitive);
-    }
-
-    protected boolean isAlreadyRemembered(OsmPrimitive primitive) {
-        return mappedPrimitives.keySet().contains(primitive);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/projection/NTV2GridShiftFile.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/NTV2GridShiftFile.java	(revision 2619)
+++ trunk/src/org/openstreetmap/josm/data/projection/NTV2GridShiftFile.java	(revision 2620)
@@ -20,7 +20,6 @@
 package org.openstreetmap.josm.data.projection;
 
+import java.io.IOException;
 import java.io.InputStream;
-import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.io.Serializable;
 import java.util.ArrayList;
@@ -62,5 +61,4 @@
 public class NTV2GridShiftFile implements Serializable {
 
-    private static final int REC_SIZE = 16;
     private String overviewHeaderCountId;
     private int overviewHeaderCount;
@@ -270,5 +268,5 @@
     }
 
-    public void unload() throws IOException {
+    public void unload() {
         topLevelSubGrid = null;
     }
Index: trunk/src/org/openstreetmap/josm/io/GpxWriter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/GpxWriter.java	(revision 2619)
+++ trunk/src/org/openstreetmap/josm/io/GpxWriter.java	(revision 2620)
@@ -50,5 +50,5 @@
         out.println("<gpx version=\"1.1\" creator=\"JOSM GPX export\" xmlns=\"http://www.topografix.com/GPX/1/1\"\n" +
                 "    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" \n" +
-                "    xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">");
+        "    xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">");
         indent = "  ";
         writeMetaData();
@@ -60,4 +60,5 @@
     }
 
+    @SuppressWarnings("unchecked")
     private void writeAttr(Map<String, Object> attr) {
         // FIXME this loop is evil, because it does not assure the
@@ -67,6 +68,6 @@
             String k = ent.getKey();
             if (k.equals(GpxData.META_LINKS)) {
-                for (Object link : (Collection) ent.getValue()) {
-                    gpxLink((GpxLink) link);
+                for (GpxLink link : (Collection<GpxLink>) ent.getValue()) {
+                    gpxLink(link);
                 }
             } else {
@@ -76,4 +77,5 @@
     }
 
+    @SuppressWarnings("unchecked")
     private void writeMetaData() {
         Map<String, Object> attr = data.attr;
@@ -81,5 +83,7 @@
 
         // write the description
-        if (attr.containsKey(GpxData.META_DESC)) simpleTag("desc", (String)attr.get(GpxData.META_DESC));
+        if (attr.containsKey(GpxData.META_DESC)) {
+            simpleTag("desc", (String)attr.get(GpxData.META_DESC));
+        }
 
         // write the author details
@@ -116,11 +120,13 @@
         // write links
         if(attr.containsKey(GpxData.META_LINKS)) {
-            for (Object link : (Collection) attr.get(GpxData.META_LINKS)) {
-                gpxLink((GpxLink) link);
+            for (GpxLink link : (Collection<GpxLink>) attr.get(GpxData.META_LINKS)) {
+                gpxLink(link);
             }
         }
 
         // write keywords
-        if (attr.containsKey(GpxData.META_KEYWORDS)) simpleTag("keywords", (String)attr.get(GpxData.META_KEYWORDS));
+        if (attr.containsKey(GpxData.META_KEYWORDS)) {
+            simpleTag("keywords", (String)attr.get(GpxData.META_KEYWORDS));
+        }
 
         Bounds bounds = data.recalculateBounds();
@@ -128,5 +134,5 @@
         {
             String b = "minlat=\"" + bounds.getMin().lat() + "\" minlon=\"" + bounds.getMin().lon() +
-                "\" maxlat=\"" + bounds.getMax().lat() + "\" maxlon=\"" + bounds.getMax().lon() + "\"" ;
+            "\" maxlat=\"" + bounds.getMax().lat() + "\" maxlon=\"" + bounds.getMax().lon() + "\"" ;
             inline("bounds", b);
         }
Index: trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 2619)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 2620)
@@ -21,5 +21,4 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.AboutAction;
 import org.openstreetmap.josm.data.Version;
 import org.openstreetmap.josm.tools.LanguageInfo;
@@ -125,5 +124,5 @@
         {
             int myv = Version.getInstance().getVersion();
-            for(Map.Entry entry : attr.entrySet())
+            for(Map.Entry<Object, Object> entry : attr.entrySet())
             {
                 try {
Index: trunk/test/unit/org/openstreetmap/josm/data/osm/APIDataSetTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/APIDataSetTest.java	(revision 2619)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/APIDataSetTest.java	(revision 2620)
@@ -74,7 +74,6 @@
         r3.put("name", "r3");
 
-        Relation r4 = new Relation(1);
+        Relation r4 = new Relation(1, 1);
         r4.put("name", "r4");
-        r4.setIncomplete(false);
         r4.setModified(true);
 
Index: trunk/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java	(revision 2619)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java	(revision 2620)
@@ -191,7 +191,6 @@
         DataSet my = new DataSet();
         my.setVersion("0.6");
-        Node n = new Node(1);
+        Node n = new Node(1, 1);
         n.setCoor(new LatLon(0,0));
-        n.setIncomplete(false);
         n.setDeleted(true);
         n.put("key1", "value1");
@@ -201,5 +200,5 @@
         their.setVersion("0.6");
         Node n1 = new Node(new LatLon(0,0));
-        n1.setOsmId(1,1);
+        n1.setOsmId(1,2);
         n1.setModified(false);
         n1.put("key1", "value1-new");
@@ -437,8 +436,5 @@
         DataSet my = new DataSet();
         my.setVersion("0.6");
-        Node n = new Node();
-        n.setCoor(new LatLon(0,0));
-        n.setOsmId(1,1);
-        n.setIncomplete(true);
+        Node n = new Node(1);
         my.addPrimitive(n);
 
@@ -1057,6 +1053,5 @@
         my.addPrimitive(n5);
 
-        Way w6 = new Way(3);
-        w6.setIncomplete(false);
+        Way w6 = new Way(3, 1);
         w6.setNodes(Arrays.asList(n4,n5));
         my.addPrimitive(w6);
@@ -1097,16 +1092,14 @@
 
         // an complete node
-        Node n1 = new Node(1);
+        Node n1 = new Node(1, 1);
         n1.setCoor(new LatLon(1,1));
-        n1.setIncomplete(false);
         source.addPrimitive(n1);
 
         // another complete node
-        Node n2 = new Node(2);
+        Node n2 = new Node(2, 1);
         n2.setCoor(new LatLon(2,2));
-        n2.setIncomplete(false);
         source.addPrimitive(n2);
 
-        // --- target daset
+        // --- target dataset
         DataSet target = new DataSet();
         target.setVersion("0.6");
@@ -1118,9 +1111,7 @@
         target.addPrimitive(n5);
 
-        Way w6 = new Way(3);
-        w6.setIncomplete(false);
+        Way w6 = new Way(3, 1);
         w6.addNode(n4);
         w6.addNode(n5);
-        w6.setIncomplete(true);
         target.addPrimitive(w6);
 
@@ -1143,5 +1134,5 @@
         assertNotNull(w);
         assertFalse(w.hasIncompleteNodes());
-        assertFalse(w.isUsable());
+        assertTrue(w.isUsable());
         assertEquals(2, w.getNodesCount());
         assertEquals(1, w.getNode(0).getId());
Index: trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java	(revision 2619)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java	(revision 2620)
@@ -71,6 +71,5 @@
         Node n1 = new Node(1);
         Node n2 = new Node(2);
-        Way w1 = new Way(3);
-        w1.setIncomplete(false);
+        Way w1 = new Way(3, 1);
         w1.addNode(n1);
         w1.addNode(n2);
@@ -104,6 +103,5 @@
         Node n1 = new Node(1);
         Node n2 = new Node(2);
-        Way w1 = new Way(3);
-        w1.setIncomplete(false);
+        Way w1 = new Way(3, 1);
         w1.addNode(n1);
         w1.addNode(n2);
@@ -154,9 +152,7 @@
         DataSet source = new DataSet();
         Relation r1 = new Relation(1);
-        Node n20 = new Node(20);
+        Node n20 = new Node(20, 1);
         r1.addMember(new RelationMember("node-20",n20));
-        r1.setIncomplete(false);
-        Way w30 = new Way(30);
-        w30.setIncomplete(false);
+        Way w30 = new Way(30, 1);
         Node n21;
         w30.addNode(n21 = new Node(21));
@@ -216,6 +212,5 @@
         Node n20 = new Node(20);
         r1.addMember(new RelationMember("node-20",n20));
-        Way w30 = new Way(30);
-        w30.setIncomplete(false);
+        Way w30 = new Way(30, 1);
         Node n21;
         w30.addNode(n21 = new Node(21));
Index: trunk/test/unit/org/openstreetmap/josm/gui/conflict/nodes/NodeListMergeModelTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/conflict/nodes/NodeListMergeModelTest.java	(revision 2619)
+++ trunk/test/unit/org/openstreetmap/josm/gui/conflict/nodes/NodeListMergeModelTest.java	(revision 2620)
@@ -29,5 +29,5 @@
     }
 
-    protected DefaultListSelectionModel inspectListSelectionModel(NodeListMergeModel model, String name) throws NoSuchFieldException, IllegalAccessException {
+    protected DefaultListSelectionModel inspectListSelectionModel(NodeListMergeModel model, String name) {
         return field(name).ofType(DefaultListSelectionModel.class)
         .in(model)
@@ -61,9 +61,8 @@
 
     @Test
-    public void test_copyMyNodesToTop_1() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesToTop_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(2));
         myWay.addNode(new Node(3));
@@ -85,10 +84,9 @@
 
     @Test
-    public void test_copyMyNodesToTop_2() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesToTop_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(2));
         myWay.addNode(new Node(3));
@@ -117,10 +115,9 @@
 
     @Test
-    public void test_copyMyNodesToTop_3() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesToTop_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(2));
         myWay.addNode(new Node(3));
@@ -145,10 +142,9 @@
 
     @Test
-    public void test_copyMyNodesToTop_4() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesToTop_4() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(2));
         myWay.addNode(new Node(3));
@@ -175,9 +171,8 @@
 
     @Test
-    public void test_copyMyNodesToEnd_1() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesToEnd_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(2));
         myWay.addNode(new Node(3));
@@ -197,9 +192,8 @@
 
     @Test
-    public void test_copyMyNodesToEnd_2() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesToEnd_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(2));
         myWay.addNode(new Node(3));
@@ -223,10 +217,9 @@
 
     @Test
-    public void test_copyMyNodesToEnd_3() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesToEnd_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(2));
         myWay.addNode(new Node(3));
@@ -251,10 +244,9 @@
 
     @Test
-    public void test_copyMyNodesToEnd_4() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesToEnd_4() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(2));
         myWay.addNode(new Node(3));
@@ -285,9 +277,8 @@
 
     @Test
-    public void test_copyMyNodesBeforeCurrent_1() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesBeforeCurrent_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -314,9 +305,8 @@
 
     @Test
-    public void test_copyMyNodesBeforeCurrent_2() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesBeforeCurrent_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -343,9 +333,8 @@
 
     @Test
-    public void test_copyMyNodesBeforeCurrent_3() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesBeforeCurrent_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -377,9 +366,8 @@
     /* ----------------------------------------------------------------------------- */
     @Test
-    public void test_copyMyNodesAfterCurrent_1() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesAfterCurrent_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -406,9 +394,8 @@
 
     @Test
-    public void test_copyMyNodesAfterCurrent_2() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesAfterCurrent_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -437,9 +424,8 @@
 
     @Test
-    public void test_copyMyNodesAfterCurrent_3() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesAfterCurrent_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -467,9 +453,8 @@
 
     @Test
-    public void test_copyMyNodesAfterCurrent_4() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_copyMyNodesAfterCurrent_4() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -501,9 +486,8 @@
     /* ----------------------------------------------------------------------------- */
     @Test
-    public void test_moveUpMergedNodes_1() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_moveUpMergedNodes_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -528,9 +512,8 @@
 
     @Test
-    public void test_moveUpMergedNodes_2() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_moveUpMergedNodes_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -559,9 +542,8 @@
 
     @Test
-    public void test_moveUpMergedNodes_3() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_moveUpMergedNodes_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -593,9 +575,8 @@
     /* ----------------------------------------------------------------------------- */
     @Test
-    public void test_moveDownMergedNodes_1() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_moveDownMergedNodes_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -620,9 +601,8 @@
 
     @Test
-    public void test_moveDownMergedNodes_2() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_moveDownMergedNodes_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
@@ -651,9 +631,8 @@
 
     @Test
-    public void test_moveDownMergedNodes_3() throws IllegalAccessException, NoSuchFieldException {
-        NodeListMergeModel model = new NodeListMergeModel();
-
-        Way myWay = new Way(1);
-        myWay.setIncomplete(false);
+    public void test_moveDownMergedNodes_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
         myWay.addNode(new Node(1));
         myWay.addNode(new Node(2));
