R3_2_maintenance - 168354, 171653
diff --git a/buildnotes_jdt-core.html b/buildnotes_jdt-core.html
index b14d4d1..98193eb 100644
--- a/buildnotes_jdt-core.html
+++ b/buildnotes_jdt-core.html
@@ -48,6 +48,10 @@
 <h2>What's new in this drop</h2>
 
 <h3>Problem Reports Fixed</h3>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=171653">171653</a>
+Java Tooling initialization performance issue after startup
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=168354">168354</a>
+[indexing] Java Type Indicator eats CPU time
 
 <a name="v_684_R32x"></a>
 <p><hr><h1>
diff --git a/model/org/eclipse/jdt/internal/core/util/Util.java b/model/org/eclipse/jdt/internal/core/util/Util.java
index b8c0098..ec7ca35 100644
--- a/model/org/eclipse/jdt/internal/core/util/Util.java
+++ b/model/org/eclipse/jdt/internal/core/util/Util.java
@@ -1708,83 +1708,6 @@
 		}
 	}
 	/**
-	 * Reads in a string from the specified data input stream. The 
-	 * string has been encoded using a modified UTF-8 format. 
-	 * <p>
-	 * The first two bytes are read as if by 
-	 * <code>readUnsignedShort</code>. This value gives the number of 
-	 * following bytes that are in the encoded string, not
-	 * the length of the resulting string. The following bytes are then 
-	 * interpreted as bytes encoding characters in the UTF-8 format 
-	 * and are converted into characters. 
-	 * <p>
-	 * This method blocks until all the bytes are read, the end of the 
-	 * stream is detected, or an exception is thrown. 
-	 *
-	 * @param      in   a data input stream.
-	 * @return     a Unicode string.
-	 * @exception  EOFException            if the input stream reaches the end
-	 *               before all the bytes.
-	 * @exception  IOException             if an I/O error occurs.
-	 * @exception  UTFDataFormatException  if the bytes do not represent a
-	 *               valid UTF-8 encoding of a Unicode string.
-	 * @see        java.io.DataInputStream#readUnsignedShort()
-	 */
-	public final static char[] readUTF(DataInput in) throws IOException {
-		int utflen= in.readUnsignedShort();
-		char str[]= new char[utflen];
-		int count= 0;
-		int strlen= 0;
-		while (count < utflen) {
-			int c= in.readUnsignedByte();
-			int char2, char3;
-			switch (c >> 4) {
-				case 0 :
-				case 1 :
-				case 2 :
-				case 3 :
-				case 4 :
-				case 5 :
-				case 6 :
-				case 7 :
-					// 0xxxxxxx
-					count++;
-					str[strlen++]= (char) c;
-					break;
-				case 12 :
-				case 13 :
-					// 110x xxxx   10xx xxxx
-					count += 2;
-					if (count > utflen)
-						throw new UTFDataFormatException();
-					char2= in.readUnsignedByte();
-					if ((char2 & 0xC0) != 0x80)
-						throw new UTFDataFormatException();
-					str[strlen++]= (char) (((c & 0x1F) << 6) | (char2 & 0x3F));
-					break;
-				case 14 :
-					// 1110 xxxx  10xx xxxx  10xx xxxx
-					count += 3;
-					if (count > utflen)
-						throw new UTFDataFormatException();
-					char2= in.readUnsignedByte();
-					char3= in.readUnsignedByte();
-					if (((char2 & 0xC0) != 0x80) || ((char3 & 0xC0) != 0x80))
-						throw new UTFDataFormatException();
-					str[strlen++]= (char) (((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
-					break;
-				default :
-					// 10xx xxxx,  1111 xxxx
-					throw new UTFDataFormatException();
-			}
-		}
-		if (strlen < utflen) {
-			System.arraycopy(str, 0, str= new char[strlen], 0, strlen);
-		}
-		return str;
-	}
-
-	/**
 	 * Returns the toString() of the given full path minus the first given number of segments.
 	 * The returned string is always a relative path (it has no leading slash)
 	 */
diff --git a/search/org/eclipse/jdt/internal/core/index/DiskIndex.java b/search/org/eclipse/jdt/internal/core/index/DiskIndex.java
index 906c554..733f954 100644
--- a/search/org/eclipse/jdt/internal/core/index/DiskIndex.java
+++ b/search/org/eclipse/jdt/internal/core/index/DiskIndex.java
@@ -593,7 +593,7 @@
 		}
 		int largeArraySize = 256;
 		for (int i = 0; i < size; i++) {
-			char[] word = Util.readUTF(stream);
+			char[] word = stream.readUTF().toCharArray();
 			int arrayOffset = stream.readInt();
 			// if arrayOffset is:
 			//		<= 0 then the array size == 1 with the value -> -arrayOffset
@@ -618,7 +618,7 @@
 		this.categoryTables.put(categoryName, categoryTable);
 		// cache the table as long as its not too big
 		// in practise, some tables can be greater than 500K when the contain more than 10K elements
-		this.cachedCategoryName = categoryTable.elementSize < 10000 ? categoryName : null;
+		this.cachedCategoryName = categoryTable.elementSize < 20000 ? categoryName : null;
 	} finally {
 		stream.close();
 	}
@@ -733,7 +733,7 @@
 	int size = file.readInt();
 	this.categoryOffsets = new HashtableOfIntValues(size);
 	for (int i = 0; i < size; i++)
-		this.categoryOffsets.put(Util.readUTF(file), file.readInt()); // cache offset to category table
+		this.categoryOffsets.put(file.readUTF().toCharArray(), file.readInt()); // cache offset to category table
 	this.categoryTables = new HashtableOfObject(3);
 }
 synchronized void startQuery() {