diff --git a/libcore/awt-kernel/src/main/java/java/awt/font/TextAttribute.java b/libcore/awt-kernel/src/main/java/java/awt/font/TextAttribute.java
index aa1394a..f887540 100644
--- a/libcore/awt-kernel/src/main/java/java/awt/font/TextAttribute.java
+++ b/libcore/awt-kernel/src/main/java/java/awt/font/TextAttribute.java
@@ -137,13 +137,13 @@
      * The Constant RUN_DIRECTION_LTR indicates left-to-right run 
      * direction. 
      */
-    public static final Boolean RUN_DIRECTION_LTR = new Boolean(false);
+    public static final Boolean RUN_DIRECTION_LTR = false;
 
     /** 
      * The Constant RUN_DIRECTION_RTL indicates right-to-left run
      * direction. 
      */
-    public static final Boolean RUN_DIRECTION_RTL = new Boolean(true);
+    public static final Boolean RUN_DIRECTION_RTL = true;
 
     /** The SIZE text attribute. */
     public static final TextAttribute SIZE = new TextAttribute("size"); //$NON-NLS-1$
@@ -152,16 +152,16 @@
     public static final TextAttribute STRIKETHROUGH = new TextAttribute("strikethrough"); //$NON-NLS-1$
 
     /** The Constant STRIKETHROUGH_ON indicates a single strikethrough. */
-    public static final Boolean STRIKETHROUGH_ON = new Boolean(true);
+    public static final Boolean STRIKETHROUGH_ON = true;
 
     /** The SUPERSCRIPT text attribute. */
     public static final TextAttribute SUPERSCRIPT = new TextAttribute("superscript"); //$NON-NLS-1$
 
     /** The Constant SUPERSCRIPT_SUB indicates a standard subscript. */
-    public static final Integer SUPERSCRIPT_SUB = new Integer(-1);
+    public static final Integer SUPERSCRIPT_SUB = -1;
 
     /** The Constant SUPERSCRIPT_SUPER indicates a standard superscript. */
-    public static final Integer SUPERSCRIPT_SUPER = new Integer(1);
+    public static final Integer SUPERSCRIPT_SUPER = 1;
 
     /** The SWAP_COLORS text attribute. */
     public static final TextAttribute SWAP_COLORS = new TextAttribute("swap_colors"); //$NON-NLS-1$
@@ -170,7 +170,7 @@
      * The Constant SWAP_COLORS_ON indicates a swap of foreground 
      * and background.
      */
-    public static final Boolean SWAP_COLORS_ON = new Boolean(true);
+    public static final Boolean SWAP_COLORS_ON = true;
 
     /** The TRANSFORM text attribute. */
     public static final TextAttribute TRANSFORM = new TextAttribute("transform"); //$NON-NLS-1$
@@ -182,37 +182,37 @@
      * The Constant UNDERLINE_ON indicates a standard underline 
      * at the roman baseline for roman text.
      */
-    public static final Integer UNDERLINE_ON = new Integer(0);
+    public static final Integer UNDERLINE_ON = 0;
 
     /** 
      * The Constant UNDERLINE_LOW_ONE_PIXEL indicates a single 
      * pixel solid low underline. 
      */
-    public static final Integer UNDERLINE_LOW_ONE_PIXEL = new Integer(1);
+    public static final Integer UNDERLINE_LOW_ONE_PIXEL = 1;
 
     /** 
      * The Constant UNDERLINE_LOW_TWO_PIXEL indicates a double 
      * pixel solid low underline. 
      */
-    public static final Integer UNDERLINE_LOW_TWO_PIXEL = new Integer(2);
+    public static final Integer UNDERLINE_LOW_TWO_PIXEL = 2;
 
     /** 
      * The Constant UNDERLINE_LOW_DOTTED indicates a 
      * single pixel dotted low underline. 
      */
-    public static final Integer UNDERLINE_LOW_DOTTED = new Integer(3);
+    public static final Integer UNDERLINE_LOW_DOTTED = 3;
 
     /** 
      * The Constant UNDERLINE_LOW_GRAY indicates double pixel 
      * gray low underline. 
      */
-    public static final Integer UNDERLINE_LOW_GRAY = new Integer(4);
+    public static final Integer UNDERLINE_LOW_GRAY = 4;
 
     /** 
      * The Constant UNDERLINE_LOW_DASHED indicates single pixel dashed 
      * low underline. 
      */
-    public static final Integer UNDERLINE_LOW_DASHED = new Integer(5);
+    public static final Integer UNDERLINE_LOW_DASHED = 5;
 
     /** The WEIGHT text attribute. */
     public static final TextAttribute WEIGHT = new TextAttribute("weight"); //$NON-NLS-1$
diff --git a/libcore/awt-kernel/src/main/java/java/beans/PropertyChangeSupport.java b/libcore/awt-kernel/src/main/java/java/beans/PropertyChangeSupport.java
index 9225d95..32e2da6 100644
--- a/libcore/awt-kernel/src/main/java/java/beans/PropertyChangeSupport.java
+++ b/libcore/awt-kernel/src/main/java/java/beans/PropertyChangeSupport.java
@@ -266,7 +266,7 @@
 
         if (oldValue != newValue) {
             fireIndexedPropertyChange(propertyName, index,
-                    new Integer(oldValue), new Integer(newValue));
+                    Integer.valueOf(oldValue), Integer.valueOf(newValue));
         }
     }
 
diff --git a/libcore/luni-kernel/src/main/java/java/lang/reflect/Array.java b/libcore/luni-kernel/src/main/java/java/lang/reflect/Array.java
index d633e69..8c01054 100644
--- a/libcore/luni-kernel/src/main/java/java/lang/reflect/Array.java
+++ b/libcore/luni-kernel/src/main/java/java/lang/reflect/Array.java
@@ -76,19 +76,19 @@
             return ((boolean[]) array)[index] ? Boolean.TRUE : Boolean.FALSE;
         
         if (array instanceof byte[])
-            return new Byte(((byte[]) array)[index]);
+            return Byte.valueOf(((byte[]) array)[index]);
         
         if (array instanceof char[])
-            return new Character(((char[]) array)[index]);
+            return Character.valueOf(((char[]) array)[index]);
         
         if (array instanceof short[])
-            return new Short(((short[]) array)[index]);
+            return Short.valueOf(((short[]) array)[index]);
         
         if (array instanceof int[])
-            return new Integer(((int[]) array)[index]);
+            return Integer.valueOf(((int[]) array)[index]);
         
         if (array instanceof long[])
-            return new Long(((long[]) array)[index]);
+            return Long.valueOf(((long[]) array)[index]);
         
         if (array instanceof float[])
             return new Float(((float[]) array)[index]);
diff --git a/libcore/nio/src/main/java/org/apache/harmony/nio/internal/MappedByteBufferFactory.java b/libcore/nio/src/main/java/org/apache/harmony/nio/internal/MappedByteBufferFactory.java
index b598c15..94d6219 100644
--- a/libcore/nio/src/main/java/org/apache/harmony/nio/internal/MappedByteBufferFactory.java
+++ b/libcore/nio/src/main/java/org/apache/harmony/nio/internal/MappedByteBufferFactory.java
@@ -56,7 +56,7 @@
          * than Integer.MAX_VALUE, so long to int cast is safe here.
          */
         return (MappedByteBuffer) constructor.newInstance(new Object[] { addr,
-                new Integer((int) size), new Integer(offset),
-                new Integer(mapmode) });
+                Integer.valueOf((int) size), Integer.valueOf(offset),
+                Integer.valueOf(mapmode) });
     }
 }
diff --git a/libcore/security/src/main/java/java/security/cert/X509CertSelector.java b/libcore/security/src/main/java/java/security/cert/X509CertSelector.java
index e2de95b..0460fd6 100644
--- a/libcore/security/src/main/java/java/security/cert/X509CertSelector.java
+++ b/libcore/security/src/main/java/java/security/cert/X509CertSelector.java
@@ -751,7 +751,6 @@
         ArrayList result = new ArrayList();
         for (int tag=0; tag<9; tag++) {
             if (subjectAltNames[tag] != null) {
-                Integer teg = new Integer(tag);
                 for (int name=0; name<subjectAltNames[tag].size(); name++) {
                     Object neim = subjectAltNames[tag].get(name);
                     if (neim instanceof byte[]) {
@@ -760,7 +759,7 @@
                         System.arraycopy(arr_neim, 0, neim, 0, arr_neim.length);
                     }
                     List list = new ArrayList(2);
-                    list.add(teg);
+                    list.add(Integer.valueOf(tag)); // android-changed
                     list.add(neim);
                     result.add(list);
                 }
@@ -1431,4 +1430,3 @@
         return result;
     }
 }
-
diff --git a/libcore/security/src/main/java/org/apache/harmony/security/x509/GeneralName.java b/libcore/security/src/main/java/org/apache/harmony/security/x509/GeneralName.java
index 3b291a1..dcf4b94 100644
--- a/libcore/security/src/main/java/org/apache/harmony/security/x509/GeneralName.java
+++ b/libcore/security/src/main/java/org/apache/harmony/security/x509/GeneralName.java
@@ -463,7 +463,7 @@
      */
     public List getAsList() {
         ArrayList result = new ArrayList();
-        result.add(new Integer(tag));
+        result.add(Integer.valueOf(tag)); // android-changed
         switch (tag) {
             case OTHER_NAME:
                 result.add(((OtherName) name).getEncoded());
diff --git a/libcore/security/src/main/java/org/bouncycastle/crypto/macs/HMac.java b/libcore/security/src/main/java/org/bouncycastle/crypto/macs/HMac.java
index 0bd4d39..7272f32 100644
--- a/libcore/security/src/main/java/org/bouncycastle/crypto/macs/HMac.java
+++ b/libcore/security/src/main/java/org/bouncycastle/crypto/macs/HMac.java
@@ -32,23 +32,23 @@
     {
         blockLengths = new Hashtable();
         
-        blockLengths.put("GOST3411", new Integer(32));
+        blockLengths.put("GOST3411", Integer.valueOf(32));
         
-        blockLengths.put("MD2", new Integer(16));
-        blockLengths.put("MD4", new Integer(64));
-        blockLengths.put("MD5", new Integer(64));
+        blockLengths.put("MD2", Integer.valueOf(16));
+        blockLengths.put("MD4", Integer.valueOf(64));
+        blockLengths.put("MD5", Integer.valueOf(64));
         
-        blockLengths.put("RIPEMD128", new Integer(64));
-        blockLengths.put("RIPEMD160", new Integer(64));
+        blockLengths.put("RIPEMD128", Integer.valueOf(64));
+        blockLengths.put("RIPEMD160", Integer.valueOf(64));
         
-        blockLengths.put("SHA-1", new Integer(64));
-        blockLengths.put("SHA-224", new Integer(64));
-        blockLengths.put("SHA-256", new Integer(64));
-        blockLengths.put("SHA-384", new Integer(128));
-        blockLengths.put("SHA-512", new Integer(128));
+        blockLengths.put("SHA-1", Integer.valueOf(64));
+        blockLengths.put("SHA-224", Integer.valueOf(64));
+        blockLengths.put("SHA-256", Integer.valueOf(64));
+        blockLengths.put("SHA-384", Integer.valueOf(128));
+        blockLengths.put("SHA-512", Integer.valueOf(128));
         
-        blockLengths.put("Tiger", new Integer(64));
-        blockLengths.put("Whirlpool", new Integer(64));
+        blockLengths.put("Tiger", Integer.valueOf(64));
+        blockLengths.put("Whirlpool", Integer.valueOf(64));
     }
     
     private static int getByteLength(
diff --git a/libcore/security/src/main/java/org/bouncycastle/jce/provider/JDKKeyPairGenerator.java b/libcore/security/src/main/java/org/bouncycastle/jce/provider/JDKKeyPairGenerator.java
index cb3b172..24233d6 100644
--- a/libcore/security/src/main/java/org/bouncycastle/jce/provider/JDKKeyPairGenerator.java
+++ b/libcore/security/src/main/java/org/bouncycastle/jce/provider/JDKKeyPairGenerator.java
@@ -397,9 +397,9 @@
 //        static {
 //            ecParameters = new Hashtable();
 //
-//            ecParameters.put(new Integer(192), new ECGenParameterSpec("prime192v1"));
-//            ecParameters.put(new Integer(239), new ECGenParameterSpec("prime239v1"));
-//            ecParameters.put(new Integer(256), new ECGenParameterSpec("prime256v1"));
+//            ecParameters.put(Integer.valueOf(192), new ECGenParameterSpec("prime192v1"));
+//            ecParameters.put(Integer.valueOf(239), new ECGenParameterSpec("prime239v1"));
+//            ecParameters.put(Integer.valueOf(256), new ECGenParameterSpec("prime256v1"));
 //        }
 //
 //        public EC()
@@ -421,7 +421,7 @@
 //        {
 //            this.strength = strength;
 //            this.random = random;
-//            this.ecParams = (ECGenParameterSpec)ecParameters.get(new Integer(strength));
+//            this.ecParams = (ECGenParameterSpec)ecParameters.get(Integer.valueOf(strength));
 //
 //            if (ecParams != null)
 //            {
diff --git a/libcore/security/src/main/java/org/bouncycastle/x509/PKIXCertPathReviewer.java b/libcore/security/src/main/java/org/bouncycastle/x509/PKIXCertPathReviewer.java
index 50037db..cc00697 100644
--- a/libcore/security/src/main/java/org/bouncycastle/x509/PKIXCertPathReviewer.java
+++ b/libcore/security/src/main/java/org/bouncycastle/x509/PKIXCertPathReviewer.java
@@ -662,7 +662,7 @@
         }
 
         ErrorBundle msg = new ErrorBundle(RESOURCE_NAME,"CertPathReviewer.totalPathLength",
-                new Object[] {new Integer(totalPathLength)});
+                new Object[] {Integer.valueOf(totalPathLength)});
         
         addNotification(msg);
     }
@@ -697,7 +697,7 @@
                 // conflicting trust anchors                
                 ErrorBundle msg = new ErrorBundle(RESOURCE_NAME,
                         "CertPathReviewer.conflictingTrustAnchors",
-                        new Object[] {new Integer(trustColl.size()),
+                        new Object[] {Integer.valueOf(trustColl.size()),
                                       new UntrustedInput(cert.getIssuerX500Principal())});
                 addError(msg);
             }
@@ -706,7 +706,7 @@
                 ErrorBundle msg = new ErrorBundle(RESOURCE_NAME,
                         "CertPathReviewer.noTrustAnchorFound",
                         new Object[] {new UntrustedInput(cert.getIssuerX500Principal()),
-                                      new Integer(pkixParams.getTrustAnchors().size())});
+                                Integer.valueOf(pkixParams.getTrustAnchors().size())});
                 addError(msg);
             }
             else
@@ -1883,7 +1883,7 @@
                     else
                     {
                         msg = new ErrorBundle(RESOURCE_NAME,"CertPathReviewer.QcLimitValueNum",
-                                new Object[] {new Integer(limit.getCurrency().getNumeric()),
+                                new Object[] {Integer.valueOf(limit.getCurrency().getNumeric()),
                                               new Double(value),
                                               limit});
                     }
@@ -1978,7 +1978,7 @@
                         "CertPathReviewer.noCrlInCertstore",
                         new Object[] {new UntrustedInput(crlselect.getIssuers()),
                                       new UntrustedInput(nonMatchingCrlNames),
-                                      new Integer(numbOfCrls)});
+                                      Integer.valueOf(numbOfCrls)});
                 addNotification(msg,index);
             }
 
diff --git a/libcore/sqlite-jdbc/src/main/java/SQLite/JDBC2y/JDBCDatabaseMetaData.java b/libcore/sqlite-jdbc/src/main/java/SQLite/JDBC2y/JDBCDatabaseMetaData.java
index 2357c38..8d76173 100644
--- a/libcore/sqlite-jdbc/src/main/java/SQLite/JDBC2y/JDBCDatabaseMetaData.java
+++ b/libcore/sqlite-jdbc/src/main/java/SQLite/JDBC2y/JDBCDatabaseMetaData.java
@@ -637,7 +637,7 @@
 	if (rs0 != null && rs0.tr != null && rs0.tr.nrows > 0) {
 	    Hashtable<String, Integer> h = new Hashtable<String, Integer>();
 	    for (int i = 0; i < rs0.tr.ncolumns; i++) {
-		h.put(rs0.tr.column[i], new Integer(i));
+		h.put(rs0.tr.column[i], Integer.valueOf(i)); // android-changed
 	    }
 	    if (columnNamePattern != null &&
 		columnNamePattern.charAt(0) == '%') {
@@ -672,8 +672,7 @@
 		row[14] = "0";
 		row[15] = "65536";
 		col = ((Integer) h.get("cid")).intValue();
-		Integer cid = new Integer(r0[col]);
-		row[16] = "" + (cid.intValue() + 1);
+		row[16] = Integer.toString(Integer.parseInt(r0[col]) + 1); // android-changed
 		col = ((Integer) h.get("notnull")).intValue();
 		row[17] = (r0[col].charAt(0) == '0') ? "YES" : "NO";
 		row[10] = (r0[col].charAt(0) == '0') ? "" + columnNullable :
@@ -769,11 +768,11 @@
 	    rs1 != null && rs1.tr != null && rs1.tr.nrows > 0) {
 	    Hashtable<String, Integer> h0 = new Hashtable<String, Integer>();
 	    for (int i = 0; i < rs0.tr.ncolumns; i++) {
-		h0.put(rs0.tr.column[i], new Integer(i));
+		h0.put(rs0.tr.column[i], Integer.valueOf(i)); // android-changed
 	    }
 	    Hashtable<String, Integer> h1 = new Hashtable<String, Integer>();
 	    for (int i = 0; i < rs1.tr.ncolumns; i++) {
-		h1.put(rs1.tr.column[i], new Integer(i));
+		h1.put(rs1.tr.column[i], Integer.valueOf(i)); // android-changed
 	    }
 	    for (int i = 0; i < rs0.tr.nrows; i++) {
 		String r0[] = (String [])(rs0.tr.rows.elementAt(i));
@@ -800,7 +799,7 @@
 		Hashtable<String, Integer> h2 =
 		    new Hashtable<String, Integer>();
 		for (int k = 0; k < rs2.tr.ncolumns; k++) {
-		    h2.put(rs2.tr.column[k], new Integer(k));
+		    h2.put(rs2.tr.column[k], Integer.valueOf(k)); // android-changed
 		}
 		for (int k = 0; k < rs2.tr.nrows; k++) {
 		    String r2[] = (String [])(rs2.tr.rows.elementAt(k));
@@ -892,7 +891,7 @@
 	if (rs0 != null && rs0.tr != null && rs0.tr.nrows > 0) {
 	    Hashtable<String, Integer> h0 = new Hashtable<String, Integer>();
 	    for (int i = 0; i < rs0.tr.ncolumns; i++) {
-		h0.put(rs0.tr.column[i], new Integer(i));
+		h0.put(rs0.tr.column[i], Integer.valueOf(i)); // android-changed
 	    }
 	    for (int i = 0; i < rs0.tr.nrows; i++) {
 		String r0[] = (String [])(rs0.tr.rows.elementAt(i));
@@ -919,7 +918,7 @@
 		Hashtable<String, Integer> h1 =
 		    new Hashtable<String, Integer>();
 		for (int k = 0; k < rs1.tr.ncolumns; k++) {
-		    h1.put(rs1.tr.column[k], new Integer(k));
+		    h1.put(rs1.tr.column[k], Integer.valueOf(k)); // android-changed
 		}
 		for (int k = 0; k < rs1.tr.nrows; k++) {
 		    String r1[] = (String [])(rs1.tr.rows.elementAt(k));
@@ -952,7 +951,7 @@
 	if (rs0 != null && rs0.tr != null && rs0.tr.nrows > 0) {
 	    Hashtable<String, Integer> h0 = new Hashtable<String, Integer>();
 	    for (int i = 0; i < rs0.tr.ncolumns; i++) {
-		h0.put(rs0.tr.column[i], new Integer(i));
+		h0.put(rs0.tr.column[i], Integer.valueOf(i)); // android-changed
 	    }
 	    for (int i = 0; i < rs0.tr.nrows; i++) {
 		String r0[] = (String [])(rs0.tr.rows.elementAt(i));
@@ -985,7 +984,7 @@
 				      JDBCResultSet in, TableResultX out) {
 	Hashtable<String, Integer> h0 = new Hashtable<String, Integer>();
 	for (int i = 0; i < in.tr.ncolumns; i++) {
-	    h0.put(in.tr.column[i], new Integer(i));
+	    h0.put(in.tr.column[i], Integer.valueOf(i)); // android-changed
 	}
 	for (int i = 0; i < in.tr.nrows; i++) {
 	    String r0[] = (String [])(in.tr.rows.elementAt(i));
@@ -1312,7 +1311,7 @@
 	if (rs0 != null && rs0.tr != null && rs0.tr.nrows > 0) {
 	    Hashtable<String, Integer> h0 = new Hashtable<String, Integer>();
 	    for (int i = 0; i < rs0.tr.ncolumns; i++) {
-		h0.put(rs0.tr.column[i], new Integer(i));
+		h0.put(rs0.tr.column[i], Integer.valueOf(i)); // android-changed
 	    }
 	    for (int i = 0; i < rs0.tr.nrows; i++) {
 		String r0[] = (String [])(rs0.tr.rows.elementAt(i));
@@ -1339,7 +1338,7 @@
 		Hashtable<String, Integer> h1 =
 		    new Hashtable<String, Integer>();
 		for (int k = 0; k < rs1.tr.ncolumns; k++) {
-		    h1.put(rs1.tr.column[k], new Integer(k));
+		    h1.put(rs1.tr.column[k], Integer.valueOf(k)); // android-changed
 		}
 		for (int k = 0; k < rs1.tr.nrows; k++) {
 		    String r1[] = (String [])(rs1.tr.rows.elementAt(k));
diff --git a/libcore/sqlite-jdbc/src/main/java/SQLite/Stmt.java b/libcore/sqlite-jdbc/src/main/java/SQLite/Stmt.java
index d60e6b0..f959ed2 100644
--- a/libcore/sqlite-jdbc/src/main/java/SQLite/Stmt.java
+++ b/libcore/sqlite-jdbc/src/main/java/SQLite/Stmt.java
@@ -227,7 +227,7 @@
     public Object column(int col) throws SQLite.Exception {
         switch (column_type(col)) {
 	case Constants.SQLITE_INTEGER:
-	    return new Long(column_long(col));
+            return Long.valueOf(column_long(col)); // android-changed: performance
 	case Constants.SQLITE_FLOAT:
 	    return new Double(column_double(col));
 	case Constants.SQLITE_BLOB:
diff --git a/libcore/text/src/main/java/java/text/DateFormat.java b/libcore/text/src/main/java/java/text/DateFormat.java
index bf7ebbe..2a329e1 100644
--- a/libcore/text/src/main/java/java/text/DateFormat.java
+++ b/libcore/text/src/main/java/java/text/DateFormat.java
@@ -874,9 +874,8 @@
         protected Field(String fieldName, int calendarField) {
             super(fieldName);
             this.calendarField = calendarField;
-            if (calendarField != -1
-                    && table.get(new Integer(calendarField)) == null) {
-                table.put(new Integer(calendarField), this);
+            if (calendarField != -1 && table.get(Integer.valueOf(calendarField)) == null) {
+                table.put(Integer.valueOf(calendarField), this);
             }
         }
 
@@ -906,7 +905,7 @@
                 throw new IllegalArgumentException();
             }
 
-            return table.get(new Integer(calendarField));
+            return table.get(Integer.valueOf(calendarField));
         }
 
         /**
diff --git a/libcore/text/src/main/java/java/text/MessageFormat.java b/libcore/text/src/main/java/java/text/MessageFormat.java
index f6074b2..4dc684d 100644
--- a/libcore/text/src/main/java/java/text/MessageFormat.java
+++ b/libcore/text/src/main/java/java/text/MessageFormat.java
@@ -226,7 +226,7 @@
  *
  * <pre>
  * Object[] arguments = {
- *         new Integer(7), new Date(System.currentTimeMillis()),
+ *         Integer.valueOf(7), new Date(System.currentTimeMillis()),
  *         "a disturbance in the Force"};
  * String result = MessageFormat.format(
  *         "At {1,time} on {1,date}, there was {2} on planet {0,number,integer}.",
@@ -245,7 +245,7 @@
  * Example 2: <blockquote>
  *
  * <pre>
- * Object[] testArgs = {new Long(3), "MyDisk"};
+ * Object[] testArgs = {Long.valueOf(3), "MyDisk"};
  * MessageFormat form = new MessageFormat("The disk \"{1}\" contains {0} file(s).");
  * System.out.println(form.format(testArgs));
  * <em>
@@ -269,7 +269,7 @@
  * String[] filepart = {"no files","one file","{0,number} files"};
  * ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
  * form.setFormatByArgumentIndex(0, fileform);
- * Object[] testArgs = {new Long(12373), "MyDisk"};
+ * Object[] testArgs = {Long.valueOf(12373), "MyDisk"};
  * System.out.println(form.format(testArgs));
  * <em>
  * Output (with different testArgs):
@@ -621,21 +621,14 @@
 
     /**
      * Adds a new FieldContainer with MessageFormat.Field.ARGUMENT field,
-     * argnumber, begin and end index to the fields vector, or sets the
+     * argIndex, begin and end index to the fields vector, or sets the
      * position's begin and end index if it has MessageFormat.Field.ARGUMENT as
      * its field attribute.
-     * 
-     * @param begin
-     * @param end
-     * @param argnumber
-     * @param position
-     * @param fields
      */
-    private void handleArgumentField(int begin, int end, int argnumber,
+    private void handleArgumentField(int begin, int end, int argIndex,
             FieldPosition position, Vector<FieldContainer> fields) {
         if (fields != null) {
-            fields.add(new FieldContainer(begin, end, Field.ARGUMENT,
-                    new Integer(argnumber)));
+            fields.add(new FieldContainer(begin, end, Field.ARGUMENT, Integer.valueOf(argIndex)));
         } else {
             if (position != null
                     && position.getFieldAttribute() == Field.ARGUMENT
