Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 3346)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 3347)
@@ -2,4 +2,5 @@
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
@@ -18,5 +19,5 @@
 public final class Relation extends OsmPrimitive {
 
-    private final List<RelationMember> members = new ArrayList<RelationMember>();
+    private RelationMember[] members = new RelationMember[0];
 
     private BBox bbox;
@@ -28,5 +29,5 @@
      */
     public List<RelationMember> getMembers() {
-        return new CopyList<RelationMember>(members.toArray(new RelationMember[members.size()]));
+        return new CopyList<RelationMember>(members);
     }
 
@@ -41,7 +42,6 @@
         }
 
-        this.members.clear();
         if (members != null) {
-            this.members.addAll(members);
+            this.members = members.toArray(new RelationMember[members.size()]);
         }
         for (RelationMember rm:this.members) {
@@ -56,13 +56,16 @@
      */
     public int getMembersCount() {
-        return members.size();
+        return members.length;
     }
 
     public RelationMember getMember(int index) {
-        return members.get(index);
+        return members[index];
     }
 
     public void addMember(RelationMember member) {
-        members.add(member);
+        RelationMember[] newMembers = new RelationMember[members.length + 1];
+        System.arraycopy(members, 0, newMembers, 0, members.length);
+        newMembers[members.length] = member;
+        members = newMembers;
         member.getMember().addReferrer(this);
         fireMembersChanged();
@@ -70,5 +73,9 @@
 
     public void addMember(int index, RelationMember member) {
-        members.add(index, member);
+        RelationMember[] newMembers = new RelationMember[members.length + 1];
+        System.arraycopy(members, 0, newMembers, 0, index);
+        System.arraycopy(members, index, newMembers, index + 1, members.length - index);
+        newMembers[index] = member;
+        members = newMembers;
         member.getMember().addReferrer(this);
         fireMembersChanged();
@@ -82,11 +89,12 @@
      */
     public RelationMember setMember(int index, RelationMember member) {
-        RelationMember result = members.set(index, member);
-        if (result.getMember() != member.getMember()) {
+        RelationMember originalMember = members[index];
+        members[index] = member;
+        if (originalMember.getMember() != member.getMember()) {
             member.getMember().addReferrer(this);
-            result.getMember().removeReferrer(this);
+            originalMember.getMember().removeReferrer(this);
             fireMembersChanged();
         }
-        return result;
+        return originalMember;
     }
 
@@ -97,12 +105,7 @@
      */
     public RelationMember removeMember(int index) {
+        List<RelationMember> members = getMembers();
         RelationMember result = members.remove(index);
-        for (RelationMember rm:members) {
-            // Do not remove referrer if this primitive is used in relation twice
-            if (rm.getMember() == result.getMember())
-                return result;
-        }
-        result.getMember().removeReferrer(this);
-        fireMembersChanged();
+        setMembers(members);
         return result;
     }
@@ -216,5 +219,5 @@
             return false;
         Relation r = (Relation)other;
-        return members.equals(r.members);
+        return Arrays.equals(members, r.members);
     }
 
@@ -225,9 +228,9 @@
     public RelationMember firstMember() {
         if (isIncomplete()) return null;
-        return (members.size() == 0) ? null : members.get(0);
+        return (members.length == 0) ? null : members[0];
     }
     public RelationMember lastMember() {
         if (isIncomplete()) return null;
-        return (members.size() == 0) ? null : members.get(members.size() -1);
+        return (members.length == 0) ? null : members[members.length - 1];
     }
 
@@ -241,5 +244,5 @@
             return;
 
-        ArrayList<RelationMember> todelete = new ArrayList<RelationMember>();
+        List<RelationMember> todelete = new ArrayList<RelationMember>();
         for (RelationMember member: members) {
             if (member.getMember() == primitive) {
@@ -247,7 +250,7 @@
             }
         }
-        primitive.removeReferrer(this);
+        List<RelationMember> members = getMembers();
         members.removeAll(todelete);
-        fireMembersChanged();
+        setMembers(members);
     }
 
@@ -279,9 +282,7 @@
             }
         }
+        List<RelationMember> members = getMembers();
         members.removeAll(todelete);
-        for (OsmPrimitive primitive:primitives) {
-            primitive.removeReferrer(this);
-        }
-        fireMembersChanged();
+        setMembers(members);
     }
 
@@ -314,5 +315,5 @@
     @Override
     public BBox getBBox() {
-        if (members.isEmpty())
+        if (members.length == 0)
             return new BBox(0, 0, 0, 0);
         if (getDataSet() == null)
@@ -333,5 +334,5 @@
             return null;
         visitedRelations.add(this);
-        if (members.isEmpty())
+        if (members.length == 0)
             return null;
         else {
