Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 6716)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 6717)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.Utils;
 import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
 
@@ -924,8 +925,7 @@
     /**
      * Add new referrer. If referrer is already included then no action is taken
-     * @param referrer
+     * @param referrer The referrer to add
      */
     protected void addReferrer(OsmPrimitive referrer) {
-        // Based on methods from josm-ng
         if (referrers == null) {
             referrers = referrer;
@@ -939,9 +939,5 @@
                     return;
             }
-            OsmPrimitive[] orig = (OsmPrimitive[])referrers;
-            OsmPrimitive[] bigger = new OsmPrimitive[orig.length+1];
-            System.arraycopy(orig, 0, bigger, 0, orig.length);
-            bigger[orig.length] = referrer;
-            referrers = bigger;
+            referrers = Utils.addInArrayCopy((OsmPrimitive[])referrers, referrer);
         }
     }
@@ -949,8 +945,7 @@
     /**
      * Remove referrer. No action is taken if referrer is not registered
-     * @param referrer
+     * @param referrer The referrer to remove
      */
     protected void removeReferrer(OsmPrimitive referrer) {
-        // Based on methods from josm-ng
         if (referrers instanceof OsmPrimitive) {
             if (referrers == referrer) {
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 6716)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 6717)
@@ -82,8 +82,5 @@
         boolean locked = writeLock();
         try {
-            RelationMember[] newMembers = new RelationMember[members.length + 1];
-            System.arraycopy(members, 0, newMembers, 0, members.length);
-            newMembers[members.length] = member;
-            members = newMembers;
+            members = Utils.addInArrayCopy(members, member);
             member.getMember().addReferrer(this);
             member.getMember().clearCachedStyle();
@@ -480,5 +477,5 @@
     }
 
-    private void checkMembers() {
+    private void checkMembers() throws DataIntegrityProblemException {
         DataSet dataSet = getDataSet();
         if (dataSet != null) {
@@ -497,5 +494,5 @@
     }
 
-    private void fireMembersChanged() {
+    private void fireMembersChanged() throws DataIntegrityProblemException {
         checkMembers();
         if (getDataSet() != null) {
Index: trunk/src/org/openstreetmap/josm/data/osm/Storage.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Storage.java	(revision 6716)
+++ trunk/src/org/openstreetmap/josm/data/osm/Storage.java	(revision 6717)
@@ -3,4 +3,5 @@
 
 import java.util.AbstractSet;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.ConcurrentModificationException;
@@ -147,7 +148,5 @@
     private void copyArray() {
         if (arrayCopyNecessary) {
-            @SuppressWarnings("unchecked") T[] newData = (T[]) new Object[data.length];
-            System.arraycopy(data, 0, newData, 0, data.length);
-            data = newData;
+            data = Arrays.copyOf(data, data.length);
             arrayCopyNecessary = false;
         }
Index: trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 6716)
+++ trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 6717)
@@ -17,4 +17,5 @@
 import org.openstreetmap.josm.tools.CopyList;
 import org.openstreetmap.josm.tools.Pair;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -425,8 +426,5 @@
             clearCachedStyle();
             n.addReferrer(this);
-            Node[] newNodes = new Node[nodes.length + 1];
-            System.arraycopy(nodes, 0, newNodes, 0, nodes.length);
-            newNodes[nodes.length] = n;
-            nodes = newNodes;
+            nodes = Utils.addInArrayCopy(nodes, n);
             n.clearCachedStyle();
             fireNodesChanged();
Index: trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 6716)
+++ trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 6717)
@@ -17,4 +17,5 @@
 import java.text.DateFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
@@ -814,11 +815,9 @@
     final private void ensureTrackVisibilityLength() {
         final int l = data.tracks.size();
-        if(l == trackVisibility.length)
+        if (l == trackVisibility.length)
             return;
-        final boolean[] back = trackVisibility.clone();
-        final int m = Math.min(l, back.length);
-        trackVisibility = new boolean[l];
-        System.arraycopy(back, 0, trackVisibility, 0, m);
-        for(int i=m; i < l; i++) {
+        final int m = Math.min(l, trackVisibility.length);
+        trackVisibility = Arrays.copyOf(trackVisibility, l);
+        for (int i = m; i < l; i++) {
             trackVisibility[i] = true;
         }
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java	(revision 6716)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java	(revision 6717)
@@ -13,4 +13,5 @@
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
+import java.util.Arrays;
 import java.util.Map;
 
@@ -221,5 +222,5 @@
         // cancel for unknown buttons and copy back original settings
         if (v != 1 && v != 2) {
-            System.arraycopy(trackVisibilityBackup, 0, layer.trackVisibility, 0, layer.trackVisibility.length);
+            layer.trackVisibility = Arrays.copyOf(trackVisibilityBackup, layer.trackVisibility.length);
             Main.map.repaint();
             return;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/projection/PuwgProjectionChoice.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/projection/PuwgProjectionChoice.java	(revision 6716)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/projection/PuwgProjectionChoice.java	(revision 6717)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -44,7 +45,5 @@
     @Override
     public String[] allCodes() {
-        String[] zones = new String[CODES.length];
-        System.arraycopy(CODES, 0, zones, 0, CODES.length);
-        return zones;
+        return Arrays.copyOf(CODES, CODES.length);
     }
 
Index: trunk/src/org/openstreetmap/josm/tools/CopyList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/CopyList.java	(revision 6716)
+++ trunk/src/org/openstreetmap/josm/tools/CopyList.java	(revision 6717)
@@ -3,4 +3,5 @@
 
 import java.util.AbstractList;
+import java.util.Arrays;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
@@ -129,13 +130,9 @@
     }
 
-    @SuppressWarnings("unchecked")
     private void ensureCapacity(int target) {
         modCount++;
         if (target > array.length) {
-            E[] old = array;
-
             int newCapacity = Math.max(target, (array.length * 3)/2 + 1);
-            array = (E[]) new Object[newCapacity];
-            System.arraycopy(old, 0, array, 0, size);
+            array = Arrays.copyOf(array, newCapacity);
             pristine = false;
         }
Index: trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 6716)
+++ trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 6717)
@@ -952,3 +952,16 @@
         return result;
     }
+    
+    /**
+     * Adds the given item at the end of a new copy of given array.
+     * @param array The source array
+     * @param item The item to add
+     * @return An extended copy of {@code array} containing {@code item} as additional last element
+     * @since 6717
+     */
+    public static <T> T[] addInArrayCopy(T[] array, T item) {
+        T[] biggerCopy = Arrays.copyOf(array, array.length + 1);
+        biggerCopy[array.length] = item;
+        return biggerCopy;
+    }
 }
