LUCENE-3969: Merged /lucene/dev/trunk:r1311219-1324765

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/lucene3969@1324945 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dev-tools/eclipse/dot.classpath b/dev-tools/eclipse/dot.classpath
index c536e5f..06ea987 100644
--- a/dev-tools/eclipse/dot.classpath
+++ b/dev-tools/eclipse/dot.classpath
@@ -109,10 +109,10 @@
 	<classpathentry kind="lib" path="solr/lib/commons-lang-2.6.jar"/>
 	<classpathentry kind="lib" path="solr/lib/easymock-2.2.jar"/>
 	<classpathentry kind="lib" path="solr/lib/guava-r05.jar"/>
-	<classpathentry kind="lib" path="solr/lib/jcl-over-slf4j-1.6.1.jar"/>
-	<classpathentry kind="lib" path="solr/lib/log4j-over-slf4j-1.6.1.jar"/>
-	<classpathentry kind="lib" path="solr/lib/slf4j-api-1.6.1.jar"/>
-	<classpathentry kind="lib" path="solr/lib/slf4j-jdk14-1.6.1.jar"/>
+	<classpathentry kind="lib" path="solr/lib/jcl-over-slf4j-1.6.4.jar"/>
+	<classpathentry kind="lib" path="solr/lib/log4j-over-slf4j-1.6.4.jar"/>
+	<classpathentry kind="lib" path="solr/lib/slf4j-api-1.6.4.jar"/>
+	<classpathentry kind="lib" path="solr/lib/slf4j-jdk14-1.6.4.jar"/>
 	<classpathentry kind="lib" path="solr/lib/wstx-asl-3.2.7.jar"/>
 	<classpathentry kind="lib" path="solr/lib/zookeeper-3.3.4.jar"/>
   <classpathentry kind="lib" path="solr/example/lib/jetty-continuation-8.1.2.v20120308.jar"/>
diff --git a/dev-tools/idea/lucene/lucene.iml b/dev-tools/idea/lucene/lucene.iml
index 96b2fa5..44a142b 100644
--- a/dev-tools/idea/lucene/lucene.iml
+++ b/dev-tools/idea/lucene/lucene.iml
@@ -16,16 +16,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module-library">
-      <library>
-        <CLASSES>
-          <root url="file://$MODULE_DIR$/test-framework/lib" />
-        </CLASSES>
-        <JAVADOC />
-        <SOURCES />
-        <jarDirectory url="file://$MODULE_DIR$/test-framework/lib" recursive="false" />
-      </library>
-    </orderEntry>
+    <orderEntry type="library" scope="TEST" name="JUnit" level="project" />
   </component>
 </module>
 
diff --git a/dev-tools/idea/solr/contrib/dataimporthandler-extras/dataimporthandler-extras.iml b/dev-tools/idea/solr/contrib/dataimporthandler-extras/dataimporthandler-extras.iml
index adc16d3..55ba4ff 100644
--- a/dev-tools/idea/solr/contrib/dataimporthandler-extras/dataimporthandler-extras.iml
+++ b/dev-tools/idea/solr/contrib/dataimporthandler-extras/dataimporthandler-extras.iml
@@ -11,6 +11,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="TEST" name="JUnit" level="project" />
     <orderEntry type="library" name="Solr library" level="project" />
     <orderEntry type="library" name="Solr DIH library" level="project" />
     <orderEntry type="library" name="Solr extraction library" level="project" />
diff --git a/dev-tools/idea/solr/contrib/dataimporthandler/dataimporthandler.iml b/dev-tools/idea/solr/contrib/dataimporthandler/dataimporthandler.iml
index 8f0fcbc..c517ade 100644
--- a/dev-tools/idea/solr/contrib/dataimporthandler/dataimporthandler.iml
+++ b/dev-tools/idea/solr/contrib/dataimporthandler/dataimporthandler.iml
@@ -12,6 +12,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="TEST" name="JUnit" level="project" />
     <orderEntry type="library" name="Solr library" level="project" />
     <orderEntry type="library" name="Solr DIH library" level="project" />
     <orderEntry type="module" module-name="solr" />
diff --git a/dev-tools/idea/solr/contrib/extraction/extraction.iml b/dev-tools/idea/solr/contrib/extraction/extraction.iml
index 01b0be7..6410dc3 100644
--- a/dev-tools/idea/solr/contrib/extraction/extraction.iml
+++ b/dev-tools/idea/solr/contrib/extraction/extraction.iml
@@ -11,6 +11,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="TEST" name="JUnit" level="project" />
     <orderEntry type="library" name="Solr library" level="project" />
     <orderEntry type="library" name="Solr extraction library" level="project" />
     <orderEntry type="module" module-name="solr" />
diff --git a/dev-tools/idea/solr/contrib/langid/langid.iml b/dev-tools/idea/solr/contrib/langid/langid.iml
index bd3dd8d..3f79403 100644
--- a/dev-tools/idea/solr/contrib/langid/langid.iml
+++ b/dev-tools/idea/solr/contrib/langid/langid.iml
@@ -12,6 +12,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="TEST" name="JUnit" level="project" />
     <orderEntry type="library" name="Solr library" level="project" />
     <orderEntry type="library" name="Solr extraction library" level="project" />
     <orderEntry type="module-library">
diff --git a/dev-tools/idea/solr/contrib/uima/uima.iml b/dev-tools/idea/solr/contrib/uima/uima.iml
index 245e11c..5489efa 100644
--- a/dev-tools/idea/solr/contrib/uima/uima.iml
+++ b/dev-tools/idea/solr/contrib/uima/uima.iml
@@ -12,6 +12,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="TEST" name="JUnit" level="project" />
     <orderEntry type="library" name="Solr library" level="project" />
     <orderEntry type="module-library">
       <library>
diff --git a/dev-tools/idea/solr/contrib/velocity/velocity.iml b/dev-tools/idea/solr/contrib/velocity/velocity.iml
index 3c78f31..1c1972d 100644
--- a/dev-tools/idea/solr/contrib/velocity/velocity.iml
+++ b/dev-tools/idea/solr/contrib/velocity/velocity.iml
@@ -11,6 +11,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="TEST" name="JUnit" level="project" />
     <orderEntry type="library" name="Solr library" level="project" />
     <orderEntry type="library" name="Solr velocity library" level="project" />
     <orderEntry type="module" module-name="solr" />
diff --git a/dev-tools/idea/solr/solr.iml b/dev-tools/idea/solr/solr.iml
index 1056e62..72e4abe 100644
--- a/dev-tools/idea/solr/solr.iml
+++ b/dev-tools/idea/solr/solr.iml
@@ -18,6 +18,7 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="TEST" name="JUnit" level="project" />
     <orderEntry type="library" name="Solr library" level="project" />
     <orderEntry type="library" name="Solr example library" level="project" />
     <orderEntry type="module" module-name="kuromoji" />
diff --git a/dev-tools/maven/pom.xml.template b/dev-tools/maven/pom.xml.template
index ee08e3f..d79f562 100644
--- a/dev-tools/maven/pom.xml.template
+++ b/dev-tools/maven/pom.xml.template
@@ -43,8 +43,8 @@
     <maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
     <java.compat.version>1.6</java.compat.version>
     <jetty.version>8.1.2.v20120308</jetty.version>
-    <slf4j.version>1.6.1</slf4j.version>
-    <tika.version>1.0</tika.version>
+    <slf4j.version>1.6.4</slf4j.version>
+    <tika.version>1.1</tika.version>
     <httpcomponents.version>4.1.3</httpcomponents.version>
 
     <tests.asserts.gracious>false</tests.asserts.gracious>
diff --git a/dev-tools/maven/solr/contrib/clustering/pom.xml.template b/dev-tools/maven/solr/contrib/clustering/pom.xml.template
index bcd51e9..4d43643 100644
--- a/dev-tools/maven/solr/contrib/clustering/pom.xml.template
+++ b/dev-tools/maven/solr/contrib/clustering/pom.xml.template
@@ -93,21 +93,6 @@
         </exclusion>
       </exclusions>
     </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
   <build>
     <directory>${build-directory}</directory>
diff --git a/dev-tools/maven/solr/contrib/dataimporthandler/pom.xml.template b/dev-tools/maven/solr/contrib/dataimporthandler/pom.xml.template
index f0e0369..808568c 100644
--- a/dev-tools/maven/solr/contrib/dataimporthandler/pom.xml.template
+++ b/dev-tools/maven/solr/contrib/dataimporthandler/pom.xml.template
@@ -72,21 +72,6 @@
       <artifactId>easymock</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
   <build>
     <directory>${build-directory}</directory>
diff --git a/dev-tools/maven/solr/test-framework/pom.xml.template b/dev-tools/maven/solr/test-framework/pom.xml.template
index 45171b1..187c152 100644
--- a/dev-tools/maven/solr/test-framework/pom.xml.template
+++ b/dev-tools/maven/solr/test-framework/pom.xml.template
@@ -63,6 +63,23 @@
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
     </dependency>
+    <!-- If your tests don't use BaseDistributedSearchTestCase or SolrJettyTestBase,
+         you can exclude the three Jetty dependencies below. -->
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-util</artifactId>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-webapp</artifactId>
+      <scope>runtime</scope>
+    </dependency>
   </dependencies>
   <build>
     <directory>${build-directory}</directory>
diff --git a/dev-tools/scripts/crawl.maven.release.dist.sh b/dev-tools/scripts/crawl.maven.release.dist.sh
old mode 100644
new mode 100755
index 6a8db7b..edd839c
--- a/dev-tools/scripts/crawl.maven.release.dist.sh
+++ b/dev-tools/scripts/crawl.maven.release.dist.sh
@@ -1,7 +1,8 @@
 #!/bin/sh
 #
-# Crawls all Maven release distribution artifacts at the given URL
-# and downloads them to the current directory.
+# Crawls all Maven release distribution artifacts at the given release RC URL
+# and downloads them to ./lucene/ and ./solr/ after first creating these
+# two directories in the current directory.
 #
 #
 # Licensed to the Apache Software Foundation (ASF) under one or more
@@ -21,9 +22,30 @@
 #
 
 if [ -z "$1" ] ; then
-    echo "Usage: $0 <RC-url-to-lucene-or-solr-maven-dist-dir>"
-    echo "Example: $0 'http://people.apache.org/~rmuir/staging_area/lucene-solr-3.6RC0-rev1309642/solr/maven/'"
+    echo "Usage: $0 <RC-URL>"
+    echo ""
+    echo "Example: $0 http://s.apache.org/lusolr36rc1"
     exit 1;
 fi
 
-wget -r -np -l 0 -nH -erobots=off --cut-dirs=8 --reject="*.md5,*.sha1,maven-metadata.xml*,index.html*" "$1/"
\ No newline at end of file
+# Resolve redirects, e.g. from URL shortening, e.g. http://s.apache.org/lusolr36rc1
+RC_URL=`(echo "Location: $1" ; wget -l 1 --spider "$1" 2>&1) \
+        | perl -ne '$url=$1 if (/Location:\s*(\S+)/); END { print "$url" if ($url); }'`
+
+if [ -d lucene ] ; then
+    echo "Please remove directory ./lucene/ before running this script."
+    exit 1;
+elif [ -d solr ] ; then
+    echo "Please remove directory ./solr/ before running this script."
+    exit 1;
+fi
+mkdir lucene
+cd lucene
+wget -r -np -l 0 -nH -erobots=off --cut-dirs=8 \
+     --reject="*.md5,*.sha1,maven-metadata.xml*,index.html*" "${RC_URL}/lucene/maven/"
+cd ..
+mkdir solr
+cd solr
+wget -r -np -l 0 -nH -erobots=off --cut-dirs=8 \
+     --reject="*.md5,*.sha1,maven-metadata.xml*,index.html*" "${RC_URL}/solr/maven/"
+cd ..
diff --git a/dev-tools/scripts/write.stage.maven.build.xml.pl b/dev-tools/scripts/write.stage.maven.build.xml.pl
old mode 100644
new mode 100755
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 224c999..7ee8014 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -259,6 +259,9 @@
 
 * LUCENE-2000: clone() now returns covariant types where possible. (ryan)
 
+* LUCENE-3970: Rename Fields.getUniqueFieldCount -> .size() and
+  Terms.getUniqueTermCount -> .size().  (Iulius Curt via Mike McCandless)
+
 Changes in Runtime Behavior
 
 * LUCENE-2846: omitNorms now behaves like omitTermFrequencyAndPositions, if you
diff --git a/lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java b/lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
index af9c5b0..ab6b7ca 100644
--- a/lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
+++ b/lucene/contrib/memory/src/java/org/apache/lucene/index/memory/MemoryIndex.java
@@ -759,7 +759,7 @@
             }
 
             @Override
-            public long getUniqueTermCount() {
+            public long size() {
               return info.sortedTerms.length;
             }
 
@@ -785,7 +785,7 @@
       }
 
       @Override
-      public int getUniqueFieldCount() {
+      public int size() {
         return sortedFields.length;
       }
     }
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/BlockTermsReader.java b/lucene/core/src/java/org/apache/lucene/codecs/BlockTermsReader.java
index 0c892c2..6e52354 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/BlockTermsReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/BlockTermsReader.java
@@ -202,7 +202,7 @@
   }
 
   @Override
-  public int getUniqueFieldCount() {
+  public int size() {
     return fields.size();
   }
 
@@ -261,7 +261,7 @@
     }
 
     @Override
-    public long getUniqueTermCount() {
+    public long size() {
       return numTerms;
     }
 
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsReader.java b/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsReader.java
index 9754302..cd70abb 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/BlockTreeTermsReader.java
@@ -216,7 +216,7 @@
   }
 
   @Override
-  public int getUniqueFieldCount() {
+  public int size() {
     return fields.size();
   }
 
@@ -455,7 +455,7 @@
     }
 
     @Override
-    public long getUniqueTermCount() {
+    public long size() {
       return numTerms;
     }
 
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/TermVectorsWriter.java b/lucene/core/src/java/org/apache/lucene/codecs/TermVectorsWriter.java
index 1f30e9a..b356b23 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/TermVectorsWriter.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/TermVectorsWriter.java
@@ -166,17 +166,17 @@
   /** Safe (but, slowish) default method to write every
    *  vector field in the document.  This default
    *  implementation requires that the vectors implement
-   *  both Fields.getUniqueFieldCount and
-   *  Terms.getUniqueTermCount. */
+   *  both Fields.size and
+   *  Terms.size. */
   protected final void addAllDocVectors(Fields vectors, FieldInfos fieldInfos) throws IOException {
     if (vectors == null) {
       startDocument(0);
       return;
     }
 
-    final int numFields = vectors.getUniqueFieldCount();
+    final int numFields = vectors.size();
     if (numFields == -1) {
-      throw new IllegalStateException("vectors.getUniqueFieldCount() must be implemented (it returned -1)");
+      throw new IllegalStateException("vectors.size() must be implemented (it returned -1)");
     }
     startDocument(numFields);
     
@@ -195,9 +195,9 @@
         // FieldsEnum shouldn't lie...
         continue;
       }
-      final int numTerms = (int) terms.getUniqueTermCount();
+      final int numTerms = (int) terms.size();
       if (numTerms == -1) {
-        throw new IllegalStateException("vector.getUniqueTermCount() must be implemented (it returned -1)");
+        throw new IllegalStateException("terms.size() must be implemented (it returned -1)");
       }
       final TermsEnum termsEnum = terms.iterator(null);
 
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xFields.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xFields.java
index a3edb7b..621fe44 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xFields.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xFields.java
@@ -161,7 +161,7 @@
   }
 
   @Override
-  public int getUniqueFieldCount() {
+  public int size() {
     return preTerms.size();
   }
 
@@ -246,7 +246,7 @@
     }
 
     @Override
-    public long getUniqueTermCount() throws IOException {
+    public long size() throws IOException {
       return -1;
     }
 
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xTermVectorsReader.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xTermVectorsReader.java
index 62406fc..c66e058 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xTermVectorsReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene3x/Lucene3xTermVectorsReader.java
@@ -270,7 +270,7 @@
     }
 
     @Override
-    public int getUniqueFieldCount() {
+    public int size() {
       if (fieldNumbers == null) {
         return 0;
       } else {
@@ -307,7 +307,7 @@
     }
 
     @Override
-    public long getUniqueTermCount() {
+    public long size() {
       return numTerms;
     }
 
@@ -660,7 +660,7 @@
     }
     if (tvx != null) {
       Fields fields = new TVFields(docID);
-      if (fields.getUniqueFieldCount() == 0) {
+      if (fields.size() == 0) {
         // TODO: we can improve writer here, eg write 0 into
         // tvx file, so we know on first read from tvx that
         // this doc has no TVs
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40TermVectorsReader.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40TermVectorsReader.java
index af223fe..8e83f6d 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40TermVectorsReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene40/Lucene40TermVectorsReader.java
@@ -300,7 +300,7 @@
     }
 
     @Override
-    public int getUniqueFieldCount() {
+    public int size() {
       if (fieldNumbers == null) {
         return 0;
       } else {
@@ -335,7 +335,7 @@
     }
 
     @Override
-    public long getUniqueTermCount() {
+    public long size() {
       return numTerms;
     }
 
@@ -674,7 +674,7 @@
     }
     if (tvx != null) {
       Fields fields = new TVFields(docID);
-      if (fields.getUniqueFieldCount() == 0) {
+      if (fields.size() == 0) {
         // TODO: we can improve writer here, eg write 0 into
         // tvx file, so we know on first read from tvx that
         // this doc has no TVs
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/memory/MemoryPostingsFormat.java b/lucene/core/src/java/org/apache/lucene/codecs/memory/MemoryPostingsFormat.java
index 89d8bb3..8badc9b 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/memory/MemoryPostingsFormat.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/memory/MemoryPostingsFormat.java
@@ -824,7 +824,7 @@
     }
 
     @Override
-    public long getUniqueTermCount() throws IOException {
+    public long size() throws IOException {
       return termCount;
     }
 
@@ -888,7 +888,7 @@
       }
       
       @Override
-      public int getUniqueFieldCount() {
+      public int size() {
         return fields.size();
       }
 
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/perfield/PerFieldPostingsFormat.java b/lucene/core/src/java/org/apache/lucene/codecs/perfield/PerFieldPostingsFormat.java
index e443683..23cb6bd 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/perfield/PerFieldPostingsFormat.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/perfield/PerFieldPostingsFormat.java
@@ -248,7 +248,7 @@
     }
     
     @Override
-    public int getUniqueFieldCount() {
+    public int size() {
       return fields.size();
     }
 
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/simpletext/SimpleTextFieldsReader.java b/lucene/core/src/java/org/apache/lucene/codecs/simpletext/SimpleTextFieldsReader.java
index af4a826..c3b252d 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/simpletext/SimpleTextFieldsReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/simpletext/SimpleTextFieldsReader.java
@@ -596,7 +596,7 @@
     }
 
     @Override
-    public long getUniqueTermCount() {
+    public long size() {
       return (long) termCount;
     }
 
@@ -641,7 +641,7 @@
   }
 
   @Override
-  public int getUniqueFieldCount() {
+  public int size() {
     return -1;
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/simpletext/SimpleTextTermVectorsReader.java b/lucene/core/src/java/org/apache/lucene/codecs/simpletext/SimpleTextTermVectorsReader.java
index 1aeabdd..03d6825 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/simpletext/SimpleTextTermVectorsReader.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/simpletext/SimpleTextTermVectorsReader.java
@@ -257,7 +257,7 @@
     }
 
     @Override
-    public int getUniqueFieldCount() throws IOException {
+    public int size() throws IOException {
       return fields.size();
     }
   }
@@ -281,7 +281,7 @@
     }
 
     @Override
-    public long getUniqueTermCount() throws IOException {
+    public long size() throws IOException {
       return terms.size();
     }
 
diff --git a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
index 3683684..610f39a 100644
--- a/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
+++ b/lucene/core/src/java/org/apache/lucene/index/CheckIndex.java
@@ -1051,7 +1051,7 @@
         long termCount = -1;
         
         if (status.termCount-termCountStart > 0) {
-          termCount = fields.terms(field).getUniqueTermCount();
+          termCount = fields.terms(field).size();
           
           if (termCount != -1 && termCount != status.termCount - termCountStart) {
             throw new RuntimeException("termCount mismatch " + termCount + " vs " + (status.termCount - termCountStart));
@@ -1104,7 +1104,7 @@
       }
     }
     
-    int fieldCount = fields.getUniqueFieldCount();
+    int fieldCount = fields.size();
     
     if (fieldCount != -1) {
       if (fieldCount < 0) {
diff --git a/lucene/core/src/java/org/apache/lucene/index/Fields.java b/lucene/core/src/java/org/apache/lucene/index/Fields.java
index 81b1dbd..4cfe57a 100644
--- a/lucene/core/src/java/org/apache/lucene/index/Fields.java
+++ b/lucene/core/src/java/org/apache/lucene/index/Fields.java
@@ -36,7 +36,7 @@
    *  measure isn't stored by the codec. Note that, just like 
    *  other term measures, this measure does not take deleted 
    *  documents into account. */
-  public abstract int getUniqueFieldCount() throws IOException;
+  public abstract int size() throws IOException;
   
   /** Returns the number of terms for all fields, or -1 if this 
    *  measure isn't stored by the codec. Note that, just like 
@@ -53,7 +53,7 @@
       }
       Terms terms = terms(field);
       if (terms != null) {
-        final long termCount = terms.getUniqueTermCount();
+        final long termCount = terms.size();
         if (termCount == -1) {
           return -1;
         }
diff --git a/lucene/core/src/java/org/apache/lucene/index/FilterAtomicReader.java b/lucene/core/src/java/org/apache/lucene/index/FilterAtomicReader.java
index e1a302f..cc67c40 100644
--- a/lucene/core/src/java/org/apache/lucene/index/FilterAtomicReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/FilterAtomicReader.java
@@ -56,8 +56,8 @@
     }
 
     @Override
-    public int getUniqueFieldCount() throws IOException {
-      return in.getUniqueFieldCount();
+    public int size() throws IOException {
+      return in.size();
     }
 
     @Override
@@ -86,8 +86,8 @@
     }
 
     @Override
-    public long getUniqueTermCount() throws IOException {
-      return in.getUniqueTermCount();
+    public long size() throws IOException {
+      return in.size();
     }
 
     @Override
diff --git a/lucene/core/src/java/org/apache/lucene/index/MultiFields.java b/lucene/core/src/java/org/apache/lucene/index/MultiFields.java
index e2df431..9bd226c 100644
--- a/lucene/core/src/java/org/apache/lucene/index/MultiFields.java
+++ b/lucene/core/src/java/org/apache/lucene/index/MultiFields.java
@@ -228,7 +228,7 @@
   }
 
   @Override
-  public int getUniqueFieldCount() {
+  public int size() {
     return -1;
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/index/MultiTerms.java b/lucene/core/src/java/org/apache/lucene/index/MultiTerms.java
index 14c1f5d..c18ac6c 100644
--- a/lucene/core/src/java/org/apache/lucene/index/MultiTerms.java
+++ b/lucene/core/src/java/org/apache/lucene/index/MultiTerms.java
@@ -96,7 +96,7 @@
   }
 
   @Override
-  public long getUniqueTermCount() throws IOException {
+  public long size() throws IOException {
     return -1;
   }
 
diff --git a/lucene/core/src/java/org/apache/lucene/index/ParallelAtomicReader.java b/lucene/core/src/java/org/apache/lucene/index/ParallelAtomicReader.java
index 545eead..8e76d37 100644
--- a/lucene/core/src/java/org/apache/lucene/index/ParallelAtomicReader.java
+++ b/lucene/core/src/java/org/apache/lucene/index/ParallelAtomicReader.java
@@ -197,7 +197,7 @@
     }
     
     @Override
-    public int getUniqueFieldCount() throws IOException {
+    public int size() throws IOException {
       return fields.size();
     }
   }
diff --git a/lucene/core/src/java/org/apache/lucene/index/Terms.java b/lucene/core/src/java/org/apache/lucene/index/Terms.java
index 174ddce..435837a 100644
--- a/lucene/core/src/java/org/apache/lucene/index/Terms.java
+++ b/lucene/core/src/java/org/apache/lucene/index/Terms.java
@@ -81,7 +81,7 @@
    *  measure isn't stored by the codec. Note that, just like 
    *  other term measures, this measure does not take deleted 
    *  documents into account. */
-  public abstract long getUniqueTermCount() throws IOException;
+  public abstract long size() throws IOException;
   
   /** Returns the sum of {@link TermsEnum#totalTermFreq} for
    *  all terms in this field, or -1 if this measure isn't
diff --git a/lucene/core/src/java/org/apache/lucene/search/FieldCacheImpl.java b/lucene/core/src/java/org/apache/lucene/search/FieldCacheImpl.java
index 0c2513c..79b7500 100644
--- a/lucene/core/src/java/org/apache/lucene/search/FieldCacheImpl.java
+++ b/lucene/core/src/java/org/apache/lucene/search/FieldCacheImpl.java
@@ -1114,7 +1114,7 @@
         // is fine -- GrowableWriter will reallocate as needed
         long numUniqueTerms = 0;
         try {
-          numUniqueTerms = terms.getUniqueTermCount();
+          numUniqueTerms = terms.size();
         } catch (UnsupportedOperationException uoe) {
           numUniqueTerms = -1;
         }
@@ -1165,7 +1165,7 @@
           if (termOrd == termOrdToBytesOffset.size()) {
             // NOTE: this code only runs if the incoming
             // reader impl doesn't implement
-            // getUniqueTermCount (which should be uncommon)
+            // size (which should be uncommon)
             termOrdToBytesOffset = termOrdToBytesOffset.resize(ArrayUtil.oversize(1+termOrd, 1));
           }
           termOrdToBytesOffset.set(termOrd, bytes.copyUsingLengthPrefix(term));
@@ -1252,7 +1252,7 @@
         // is fine -- GrowableWriter will reallocate as needed
         long numUniqueTerms = 0;
         try {
-          numUniqueTerms = terms.getUniqueTermCount();
+          numUniqueTerms = terms.size();
         } catch (UnsupportedOperationException uoe) {
           numUniqueTerms = -1;
         }
diff --git a/lucene/core/src/test/org/apache/lucene/codecs/lucene40/TestReuseDocsEnum.java b/lucene/core/src/test/org/apache/lucene/codecs/lucene40/TestReuseDocsEnum.java
index 8d1c774..51346cb 100644
--- a/lucene/core/src/test/org/apache/lucene/codecs/lucene40/TestReuseDocsEnum.java
+++ b/lucene/core/src/test/org/apache/lucene/codecs/lucene40/TestReuseDocsEnum.java
@@ -21,7 +21,6 @@
 
 import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.codecs.Codec;
-import org.apache.lucene.codecs.lucene40.Lucene40PostingsFormat;
 import org.apache.lucene.index.AtomicReader;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.DocsEnum;
@@ -63,7 +62,7 @@
           enums.put(docs, true);
         }
         
-        assertEquals(terms.getUniqueTermCount(), enums.size());  
+        assertEquals(terms.size(), enums.size());
       }
     }.run();
     IOUtils.close(writer, open, dir);
@@ -100,7 +99,7 @@
         docs = iterator.docs(new Bits.MatchNoBits(open.maxDoc()), docs, random.nextBoolean());
         enums.put(docs, true);
       }
-      assertEquals(terms.getUniqueTermCount(), enums.size());  
+      assertEquals(terms.size(), enums.size());
       
       enums.clear();
       iterator = terms.iterator(null);
@@ -141,7 +140,7 @@
         docs = iterator.docs(null, randomDocsEnum("body", term, sequentialSubReaders2, bits), random.nextBoolean());
         enums.put(docs, true);
       }
-      assertEquals(terms.getUniqueTermCount(), enums.size());  
+      assertEquals(terms.size(), enums.size());
       
       iterator = terms.iterator(null);
       enums.clear();
@@ -150,7 +149,7 @@
         docs = iterator.docs(bits, randomDocsEnum("body", term, sequentialSubReaders2, bits), random.nextBoolean());
         enums.put(docs, true);
       }
-      assertEquals(terms.getUniqueTermCount(), enums.size());  
+      assertEquals(terms.size(), enums.size());
     }
     IOUtils.close(writer, firstReader, secondReader, dir);
   }
diff --git a/lucene/core/src/test/org/apache/lucene/document/TestDocument.java b/lucene/core/src/test/org/apache/lucene/document/TestDocument.java
index 90a11df..e23a944 100644
--- a/lucene/core/src/test/org/apache/lucene/document/TestDocument.java
+++ b/lucene/core/src/test/org/apache/lucene/document/TestDocument.java
@@ -21,7 +21,6 @@
 
 import org.apache.lucene.analysis.EmptyTokenizer;
 import org.apache.lucene.analysis.MockAnalyzer;
-import org.apache.lucene.analysis.Tokenizer;
 import org.apache.lucene.index.DirectoryReader;
 import org.apache.lucene.index.DocsAndPositionsEnum;
 import org.apache.lucene.index.Fields;
@@ -345,7 +344,7 @@
       Fields tvFields = r.getTermVectors(0);
       Terms tvs = tvFields.terms(field);
       assertNotNull(tvs);
-      assertEquals(2, tvs.getUniqueTermCount());
+      assertEquals(2, tvs.size());
       TermsEnum tvsEnum = tvs.iterator(null);
       assertEquals(new BytesRef("abc"), tvsEnum.next());
       final DocsAndPositionsEnum dpEnum = tvsEnum.docsAndPositions(null, null, false);
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java b/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java
index 77032da..512bb31 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDocumentWriter.java
@@ -290,11 +290,11 @@
     // f1
     Terms tfv1 = reader.getTermVectors(0).terms("f1");
     assertNotNull(tfv1);
-    assertEquals("the 'with_tv' setting should rule!",2,tfv1.getUniqueTermCount());
+    assertEquals("the 'with_tv' setting should rule!",2,tfv1.size());
     // f2
     Terms tfv2 = reader.getTermVectors(0).terms("f2");
     assertNotNull(tfv2);
-    assertEquals("the 'with_tv' setting should rule!",2,tfv2.getUniqueTermCount());
+    assertEquals("the 'with_tv' setting should rule!",2,tfv2.size());
     reader.close();
   }
 
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestDuelingCodecs.java b/lucene/core/src/test/org/apache/lucene/index/TestDuelingCodecs.java
index 7c416ca..ed7d5f4 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestDuelingCodecs.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestDuelingCodecs.java
@@ -184,8 +184,8 @@
    * checks that top-level statistics on Fields are the same 
    */
   public void assertFieldStatistics(Fields leftFields, Fields rightFields) throws Exception {
-    if (leftFields.getUniqueFieldCount() != -1 && rightFields.getUniqueFieldCount() != -1) {
-      assertEquals(info, leftFields.getUniqueFieldCount(), rightFields.getUniqueFieldCount());
+    if (leftFields.size() != -1 && rightFields.size() != -1) {
+      assertEquals(info, leftFields.size(), rightFields.size());
     }
     
     if (leftFields.getUniqueTermCount() != -1 && rightFields.getUniqueTermCount() != -1) {
@@ -238,8 +238,8 @@
     if (leftTerms.getSumTotalTermFreq() != -1 && rightTerms.getSumTotalTermFreq() != -1) {
       assertEquals(info, leftTerms.getSumTotalTermFreq(), rightTerms.getSumTotalTermFreq());
     }
-    if (leftTerms.getUniqueTermCount() != -1 && rightTerms.getUniqueTermCount() != -1) {
-      assertEquals(info, leftTerms.getUniqueTermCount(), rightTerms.getUniqueTermCount());
+    if (leftTerms.size() != -1 && rightTerms.size() != -1) {
+      assertEquals(info, leftTerms.size(), rightTerms.size());
     }
   }
 
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestSegmentMerger.java b/lucene/core/src/test/org/apache/lucene/index/TestSegmentMerger.java
index 242063e..2ee7d1f 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestSegmentMerger.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestSegmentMerger.java
@@ -19,10 +19,8 @@
 
 import java.io.IOException;
 
-import org.apache.lucene.analysis.MockAnalyzer;
 import org.apache.lucene.codecs.Codec;
 import org.apache.lucene.document.Document;
-import org.apache.lucene.document.TextField;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.BytesRef;
@@ -120,7 +118,7 @@
 
     Terms vector = mergedReader.getTermVectors(0).terms(DocHelper.TEXT_FIELD_2_KEY);
     assertNotNull(vector);
-    assertEquals(3, vector.getUniqueTermCount());
+    assertEquals(3, vector.size());
     TermsEnum termsEnum = vector.iterator(null);
 
     int i = 0;
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestSegmentReader.java b/lucene/core/src/test/org/apache/lucene/index/TestSegmentReader.java
index c84382b..870f5fe 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestSegmentReader.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestSegmentReader.java
@@ -193,7 +193,7 @@
   public void testTermVectors() throws IOException {
     Terms result = reader.getTermVectors(0).terms(DocHelper.TEXT_FIELD_2_KEY);
     assertNotNull(result);
-    assertEquals(3, result.getUniqueTermCount());
+    assertEquals(3, result.size());
     TermsEnum termsEnum = result.iterator(null);
     while(termsEnum.next() != null) {
       String term = termsEnum.term().utf8ToString();
@@ -204,6 +204,6 @@
 
     Fields results = reader.getTermVectors(0);
     assertTrue(results != null);
-    assertEquals("We do not have 3 term freq vectors", 3, results.getUniqueFieldCount());      
+    assertEquals("We do not have 3 term freq vectors", 3, results.size());
   }    
 }
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestStressIndexing2.java b/lucene/core/src/test/org/apache/lucene/index/TestStressIndexing2.java
index e309fbf..304bf73 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestStressIndexing2.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestStressIndexing2.java
@@ -600,7 +600,7 @@
 
   public static void verifyEquals(Fields d1, Fields d2) throws IOException {
     if (d1 == null) {
-      assertTrue(d2 == null || d2.getUniqueFieldCount() == 0);
+      assertTrue(d2 == null || d2.size() == 0);
       return;
     }
     assertTrue(d2 != null);
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestTermVectorsReader.java b/lucene/core/src/test/org/apache/lucene/index/TestTermVectorsReader.java
index 8fd532c..73b49e9 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestTermVectorsReader.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestTermVectorsReader.java
@@ -204,7 +204,7 @@
     for (int j = 0; j < 5; j++) {
       Terms vector = reader.get(j).terms(testFields[0]);
       assertNotNull(vector);
-      assertEquals(testTerms.length, vector.getUniqueTermCount());
+      assertEquals(testTerms.length, vector.size());
       TermsEnum termsEnum = vector.iterator(null);
       for (int i = 0; i < testTerms.length; i++) {
         final BytesRef text = termsEnum.next();
@@ -223,7 +223,7 @@
     for (int j = 0; j < 5; j++) {
       Terms vector = reader.get(j).terms(testFields[0]);
       assertNotNull(vector);
-      assertEquals(testTerms.length, vector.getUniqueTermCount());
+      assertEquals(testTerms.length, vector.size());
       TermsEnum termsEnum = vector.iterator(null);
       DocsEnum docsEnum = null;
       for (int i = 0; i < testTerms.length; i++) {
@@ -250,7 +250,7 @@
     BytesRef[] terms;
     Terms vector = reader.get(0).terms(testFields[0]);
     assertNotNull(vector);
-    assertEquals(testTerms.length, vector.getUniqueTermCount());
+    assertEquals(testTerms.length, vector.size());
     TermsEnum termsEnum = vector.iterator(null);
     DocsAndPositionsEnum dpEnum = null;
     for (int i = 0; i < testTerms.length; i++) {
@@ -287,7 +287,7 @@
 
     Terms freqVector = reader.get(0).terms(testFields[1]); //no pos, no offset
     assertNotNull(freqVector);
-    assertEquals(testTerms.length, freqVector.getUniqueTermCount());
+    assertEquals(testTerms.length, freqVector.size());
     termsEnum = freqVector.iterator(null);
     assertNotNull(termsEnum);
     for (int i = 0; i < testTerms.length; i++) {
@@ -306,7 +306,7 @@
     assertNotNull(vector);
     TermsEnum termsEnum = vector.iterator(null);
     assertNotNull(termsEnum);
-    assertEquals(testTerms.length, vector.getUniqueTermCount());
+    assertEquals(testTerms.length, vector.size());
     DocsAndPositionsEnum dpEnum = null;
     for (int i = 0; i < testTerms.length; i++) {
       final BytesRef text = termsEnum.next();
diff --git a/lucene/core/src/test/org/apache/lucene/search/FieldCacheRewriteMethod.java b/lucene/core/src/test/org/apache/lucene/search/FieldCacheRewriteMethod.java
index edfef5c..2abdf76 100644
--- a/lucene/core/src/test/org/apache/lucene/search/FieldCacheRewriteMethod.java
+++ b/lucene/core/src/test/org/apache/lucene/search/FieldCacheRewriteMethod.java
@@ -119,7 +119,7 @@
         }
 
         @Override
-        public long getUniqueTermCount() throws IOException {
+        public long size() throws IOException {
           return -1;
         }
       });
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTermVectors.java b/lucene/core/src/test/org/apache/lucene/search/TestTermVectors.java
index 9e2d391..838ca96 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTermVectors.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTermVectors.java
@@ -98,7 +98,7 @@
     for (int i = 0; i < hits.length; i++) {
       Fields vectors = searcher.reader.getTermVectors(hits[i].doc);
       assertNotNull(vectors);
-      assertEquals("doc=" + hits[i].doc + " tv=" + vectors, 1, vectors.getUniqueFieldCount());
+      assertEquals("doc=" + hits[i].doc + " tv=" + vectors, 1, vectors.size());
     }
     Terms vector;
     vector = searcher.reader.getTermVectors(hits[0].doc).terms("noTV");
@@ -121,13 +121,13 @@
     IndexReader reader = writer.getReader();
     writer.close();
     Fields v = reader.getTermVectors(0);
-    assertEquals(4, v.getUniqueFieldCount());
+    assertEquals(4, v.size());
     String[] expectedFields = new String[]{"a", "b", "c", "x"};
     int[] expectedPositions = new int[]{1, 2, 0};
     FieldsEnum fieldsEnum = v.iterator();
     for(int i=0;i<expectedFields.length;i++) {
       assertEquals(expectedFields[i], fieldsEnum.next());
-      assertEquals(3, v.terms(expectedFields[i]).getUniqueTermCount());
+      assertEquals(3, v.terms(expectedFields[i]).size());
 
       DocsAndPositionsEnum dpEnum = null;
       Terms terms = fieldsEnum.terms();
@@ -166,7 +166,7 @@
     for (int i = 0; i < hits.length; i++) {
       Fields vectors = searcher.reader.getTermVectors(hits[i].doc);
       assertNotNull(vectors);
-      assertEquals(1, vectors.getUniqueFieldCount());
+      assertEquals(1, vectors.size());
       
       TermsEnum termsEnum = vectors.terms("field").iterator(null);
       assertNotNull(termsEnum.next());
@@ -205,7 +205,7 @@
     for (int i = 0; i < hits.length; i++) {
       Fields vectors = searcher.reader.getTermVectors(hits[i].doc);
       assertNotNull(vectors);
-      assertEquals(1, vectors.getUniqueFieldCount());
+      assertEquals(1, vectors.size());
     }
   }
 
@@ -303,7 +303,7 @@
     Terms vector = knownSearcher.reader.getTermVectors(hits[1].doc).terms("field");
     assertNotNull(vector);
     //System.out.println("Vector: " + vector);
-    assertEquals(10, vector.getUniqueTermCount());
+    assertEquals(10, vector.size());
     TermsEnum termsEnum = vector.iterator(null);
     while(termsEnum.next() != null) {
       String term = termsEnum.term().utf8ToString();
@@ -371,7 +371,7 @@
 
       Fields vectors = searcher.reader.getTermVectors(hits[i].doc);
       assertNotNull(vectors);
-      assertEquals(1, vectors.getUniqueFieldCount());
+      assertEquals(1, vectors.size());
     }
     reader.close();
   }
@@ -418,10 +418,10 @@
 
     Fields vectors = searcher.reader.getTermVectors(hits[0].doc);
     assertNotNull(vectors);
-    assertEquals(1, vectors.getUniqueFieldCount());
+    assertEquals(1, vectors.size());
     Terms vector = vectors.terms("field");
     assertNotNull(vector);
-    assertEquals(1, vector.getUniqueTermCount());
+    assertEquals(1, vector.size());
     TermsEnum termsEnum = vector.iterator(null);
     assertNotNull(termsEnum.next());
     assertEquals("one", termsEnum.term().utf8ToString());
diff --git a/lucene/test-framework/src/java/org/apache/lucene/codecs/ramonly/RAMOnlyPostingsFormat.java b/lucene/test-framework/src/java/org/apache/lucene/codecs/ramonly/RAMOnlyPostingsFormat.java
index 824b6b5..6f956f9 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/codecs/ramonly/RAMOnlyPostingsFormat.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/codecs/ramonly/RAMOnlyPostingsFormat.java
@@ -109,7 +109,7 @@
     }
 
     @Override
-    public int getUniqueFieldCount() {
+    public int size() {
       return fieldToTerms.size();
     }
 
@@ -135,7 +135,7 @@
     }
 
     @Override
-    public long getUniqueTermCount() {
+    public long size() {
       return termToDocs.size();
     }
 
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java b/lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java
index 6c11e41..972f8ae 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/FieldFilterAtomicReader.java
@@ -130,7 +130,7 @@
     }
 
     @Override
-    public int getUniqueFieldCount() throws IOException {
+    public int size() throws IOException {
       // TODO: add faster implementation!
       int c = 0;
       final FieldsEnum it = iterator();
diff --git a/modules/analysis/common/src/test/org/apache/lucene/analysis/sinks/TestTeeSinkTokenFilter.java b/modules/analysis/common/src/test/org/apache/lucene/analysis/sinks/TestTeeSinkTokenFilter.java
index 263fc8b..2d0b26d 100644
--- a/modules/analysis/common/src/test/org/apache/lucene/analysis/sinks/TestTeeSinkTokenFilter.java
+++ b/modules/analysis/common/src/test/org/apache/lucene/analysis/sinks/TestTeeSinkTokenFilter.java
@@ -30,7 +30,6 @@
 import org.apache.lucene.document.FieldType;
 import org.apache.lucene.document.TextField;
 import org.apache.lucene.index.DocsAndPositionsEnum;
-import org.apache.lucene.index.DocsEnum;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.index.Terms;
@@ -106,7 +105,7 @@
 
     IndexReader r = IndexReader.open(dir);
     Terms vector = r.getTermVectors(0).terms("field");
-    assertEquals(1, vector.getUniqueTermCount());
+    assertEquals(1, vector.size());
     TermsEnum termsEnum = vector.iterator(null);
     termsEnum.next();
     assertEquals(2, termsEnum.totalTermFreq());
diff --git a/modules/analysis/common/src/test/org/apache/lucene/analysis/synonym/TestSynonymMapFilter.java b/modules/analysis/common/src/test/org/apache/lucene/analysis/synonym/TestSynonymMapFilter.java
index fe751ca..1891ec8 100644
--- a/modules/analysis/common/src/test/org/apache/lucene/analysis/synonym/TestSynonymMapFilter.java
+++ b/modules/analysis/common/src/test/org/apache/lucene/analysis/synonym/TestSynonymMapFilter.java
@@ -447,7 +447,11 @@
       checkRandomData(random, analyzer, 1000*RANDOM_MULTIPLIER);
     }
   }
-  
+
+  // NOTE: this is an invalid test... SynFilter today can't
+  // properly consume a graph... we can re-enable this once
+  // we fix that...
+  /*
   // Adds MockGraphTokenFilter before SynFilter:
   public void testRandom2GraphBefore() throws Exception {
     final int numIters = atLeast(10);
@@ -472,6 +476,7 @@
       checkRandomData(random, analyzer, 1000*RANDOM_MULTIPLIER);
     }
   }
+  */
 
   // Adds MockGraphTokenFilter after SynFilter:
   public void testRandom2GraphAfter() throws Exception {
diff --git a/modules/benchmark/src/test/org/apache/lucene/benchmark/byTask/TestPerfTasksLogic.java b/modules/benchmark/src/test/org/apache/lucene/benchmark/byTask/TestPerfTasksLogic.java
index 7d93f1e..9e0cb60 100755
--- a/modules/benchmark/src/test/org/apache/lucene/benchmark/byTask/TestPerfTasksLogic.java
+++ b/modules/benchmark/src/test/org/apache/lucene/benchmark/byTask/TestPerfTasksLogic.java
@@ -752,7 +752,7 @@
     IndexReader reader = IndexReader.open(dir);
     Fields tfv = reader.getTermVectors(0);
     assertNotNull(tfv);
-    assertTrue(tfv.getUniqueFieldCount() > 0);
+    assertTrue(tfv.size() > 0);
     reader.close();
   }
 
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index e42f40a..cdc8930 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -482,6 +482,9 @@
 * SOLR-3329: Dropped getSourceID() from SolrInfoMBean and using 
   getClass().getPackage().getSpecificationVersion() for Version. (ryan)
 
+* SOLR-3302: Upgraded SLF4j to version 1.6.4 (hossman)
+
+* SOLR-3322: Add more context to IndexReaderFactory.newReader (ab)
 
 Documentation
 ----------------------
diff --git a/solr/NOTICE.txt b/solr/NOTICE.txt
index fdb4204..c289690 100644
--- a/solr/NOTICE.txt
+++ b/solr/NOTICE.txt
@@ -244,7 +244,14 @@
 Copyright 2004 Sun Microsystems, Inc. (Rome JAR)
 
 Copyright 2002-2008 by John Cowan (TagSoup -- http://ccil.org/~cowan/XML/tagsoup/)
- 
+
+Copyright (C) 1999-2007 Shigeru Chiba. All Rights Reserved.
+(Javassist, MPL licensed: http://www.csg.ci.i.u-tokyo.ac.jp/~chiba/javassist/)
+
+Copyright (C) 1994-2007 by the Xiph.org Foundation, http://www.xiph.org/ (OggVorbis)
+
+Scannotation (C) Bill Burke
+
 =========================================================================
 ==  Language Detection Notices                                         ==
 =========================================================================
diff --git a/solr/core/ivy.xml b/solr/core/ivy.xml
index 55a77e3..afb6c17 100644
--- a/solr/core/ivy.xml
+++ b/solr/core/ivy.xml
@@ -25,14 +25,14 @@
       <dependency org="org.apache.httpcomponents" name="httpcore" rev="4.1.4" transitive="false"/>
       <dependency org="org.apache.httpcomponents" name="httpclient" rev="4.1.3" transitive="false"/>
       <dependency org="org.apache.httpcomponents" name="httpmime" rev="4.1.3" transitive="false"/>
-      <dependency org="org.slf4j" name="jcl-over-slf4j" rev="1.6.1" transitive="false"/>
+      <dependency org="org.slf4j" name="jcl-over-slf4j" rev="1.6.4" transitive="false"/>
       <dependency org="commons-io" name="commons-io" rev="2.1" transitive="false"/>
       <dependency org="commons-lang" name="commons-lang" rev="2.6" transitive="false"/>
       <dependency org="com.google.guava" name="guava" rev="r05" transitive="false"/>
       <dependency org="org.codehaus.woodstox" name="wstx-asl" rev="3.2.7" transitive="false"/>
       <dependency org="org.easymock" name="easymock" rev="2.2" transitive="false"/>
-      <dependency org="org.slf4j" name="slf4j-api" rev="1.6.1" transitive="false"/>
-      <dependency org="org.slf4j" name="slf4j-jdk14" rev="1.6.1" transitive="false"/>
+      <dependency org="org.slf4j" name="slf4j-api" rev="1.6.4" transitive="false"/>
+      <dependency org="org.slf4j" name="slf4j-jdk14" rev="1.6.4" transitive="false"/>
       <dependency org="com.spatial4j" name="spatial4j" rev="0.2" transitive="false"/>
       <dependency org="javax.servlet" name="javax.servlet-api" rev="3.0.1" transitive="false"/>
       <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/> 
diff --git a/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java b/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java
index 9d48d1a..b9e7409 100644
--- a/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java
+++ b/solr/core/src/java/org/apache/solr/core/IndexReaderFactory.java
@@ -58,9 +58,13 @@
    * Creates a new IndexReader instance using the given Directory.
    * 
    * @param indexDir indexDir index location
+   * @param core {@link SolrCore} instance where this reader will be used. NOTE:
+   * this SolrCore instance may not be fully configured yet, but basic things like
+   * {@link SolrCore#getCoreDescriptor()}, {@link SolrCore#getSchema()} and
+   * {@link SolrCore#getSolrConfig()} are valid.
    * @return An IndexReader instance
    * @throws IOException
    */
-  public abstract DirectoryReader newReader(Directory indexDir)
+  public abstract DirectoryReader newReader(Directory indexDir, SolrCore core)
       throws IOException;
 }
diff --git a/solr/core/src/java/org/apache/solr/core/StandardIndexReaderFactory.java b/solr/core/src/java/org/apache/solr/core/StandardIndexReaderFactory.java
index b52d412..615e9d9 100644
--- a/solr/core/src/java/org/apache/solr/core/StandardIndexReaderFactory.java
+++ b/solr/core/src/java/org/apache/solr/core/StandardIndexReaderFactory.java
@@ -30,7 +30,7 @@
 public class StandardIndexReaderFactory extends IndexReaderFactory {
   
   @Override
-  public DirectoryReader newReader(Directory indexDir) throws IOException {
+  public DirectoryReader newReader(Directory indexDir, SolrCore core) throws IOException {
     return DirectoryReader.open(indexDir, termInfosIndexDivisor);
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
index 9f254a8..6df7a21 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/LukeRequestHandler.java
@@ -595,7 +595,7 @@
       if (freq > tiq.minFreq) {
         UnicodeUtil.UTF8toUTF16(text, spare);
         String t = spare.toString();
-        tiq.distinctTerms = new Long(terms.getUniqueTermCount()).intValue();
+        tiq.distinctTerms = new Long(terms.size()).intValue();
 
         tiq.add(new TopTermQueue.TermInfo(new Term(field, t), termsEnum.docFreq()));
         if (tiq.size() > numTerms) { // if tiq full
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java
index e7756e1..db6b19c 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ShowFileRequestHandler.java
@@ -17,7 +17,6 @@
 
 package org.apache.solr.handler.admin;
 
-import org.apache.commons.io.IOUtils;
 import org.apache.solr.cloud.ZkSolrResourceLoader;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
@@ -38,7 +37,6 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URISyntaxException;
 import java.util.Date;
@@ -88,11 +86,9 @@
   
   protected Set<String> hiddenFiles;
   
-  private static ShowFileRequestHandler instance;
   public ShowFileRequestHandler()
   {
     super();
-    instance = this; // used so that getFileContents can access hiddenFiles
   }
 
   @Override
@@ -281,30 +277,7 @@
     rsp.setHttpCaching(false);
   }
   
-  /**
-   * This is a utility function that lets you get the contents of an admin file
-   * 
-   * It is only used so that we can get rid of "/admin/get-file.jsp" and include
-   * "admin-extra.html" in "/admin/index.html" using jsp scriptlets
-   */
-  public static String getFileContents(SolrCore core, String path )
-  {
-    if( instance != null && instance.hiddenFiles != null ) {
-      if( instance.hiddenFiles.contains( path ) ) {
-        return ""; // ignore it...
-      }
-    }
-    InputStream input = null;
-    try {
-      input = core.getResourceLoader().openResource(path);
-      return IOUtils.toString( input, "UTF-8" );
-    } catch( Exception ex ) {
-    } finally {
-      IOUtils.closeQuietly(input);
-    }
-    return "";
-  }
-
+  
   //////////////////////// SolrInfoMBeans methods //////////////////////
 
   @Override
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
index 52df144..0081e24 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/SolrInfoMBeanHandler.java
@@ -177,7 +177,7 @@
           // Something in the category changed
           // Now iterate the real beans
           
-          NamedList<NamedList<Object>> cat = new NamedList<NamedList<Object>>();
+          NamedList<NamedList<Object>> cat = new SimpleOrderedMap<NamedList<Object>>();
           for(int j=0;j<ref_cat.size();j++) {
             String name = ref_cat.getName(j);
             NamedList<Object> ref_bean = ref_cat.get(name);
@@ -205,7 +205,7 @@
   }
   
   public NamedList diffNamedList(NamedList ref, NamedList now) {
-    NamedList out = new NamedList();
+    NamedList out = new SimpleOrderedMap();
     for(int i=0; i<ref.size(); i++) {
       String name = ref.getName(i);
       Object r = ref.getVal(i);
diff --git a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
index 5a9312e..b2ae0ed 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
@@ -117,7 +117,7 @@
 
   public SolrIndexSearcher(SolrCore core, String path, IndexSchema schema, SolrIndexConfig config, String name, boolean enableCache, DirectoryFactory directoryFactory) throws IOException {
     // we don't need to reserve the directory because we get it from the factory
-    this(core, schema,name, core.getIndexReaderFactory().newReader(directoryFactory.get(path, config.lockType)), true, enableCache, false, directoryFactory);
+    this(core, schema,name, core.getIndexReaderFactory().newReader(directoryFactory.get(path, config.lockType), core), true, enableCache, false, directoryFactory);
   }
 
   public SolrIndexSearcher(SolrCore core, IndexSchema schema, String name, DirectoryReader r, boolean closeReader, boolean enableCache, boolean reserveDirectory, DirectoryFactory directoryFactory) throws IOException {
diff --git a/solr/core/src/java/org/apache/solr/servlet/LogLevelSelection.java b/solr/core/src/java/org/apache/solr/servlet/LogLevelSelection.java
deleted file mode 100644
index 5a93d53..0000000
--- a/solr/core/src/java/org/apache/solr/servlet/LogLevelSelection.java
+++ /dev/null
@@ -1,316 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.solr.servlet;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.solr.handler.admin.LogLevelHandler;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.*;
-import java.util.logging.Level;
-import java.util.logging.LogManager;
-import java.util.logging.Logger;
-
-
-/**
- * Admin JDK Logger level report and selection servlet.
- *
- * @since solr 1.3
- * @deprecated  {@link LogLevelHandler} this servlet will be removed before solr 4.0
- */
-public final class LogLevelSelection extends HttpServlet {
-  @Override
-  public void init() throws ServletException {
-  }
-
-  /**
-   * Processes an HTTP GET request and changes the logging level as
-   * specified.
-   */
-  @Override
-  public void doGet(HttpServletRequest request,
-                    HttpServletResponse response)
-          throws IOException, ServletException {
-    // Output page
-
-    response.setContentType("text/html");
-    PrintWriter out = response.getWriter();
-    out.write("<html><head>\n");
-    out.write("<title>Solr Admin: JDK Log Level Selector</title>\n");
-    out.write("<link rel=\"stylesheet\" type=\"text/css\" href=\"solr-admin.css\" />");
-    out.write("</head><body>\n");
-    out.write("<a href=\".\"><img border=\"0\" align=\"right\" height=\"78\" width=\"142\" src=\"img/solr.png\" alt=\"Solr\"></a>");
-    out.write("<h1 style='margin-bottom:5px;'>JDK Log Level Selector</h1>");
-    out.write("<h2 style='color:#AA0000; margin-top:0px;'>This will be removed before Solr 4.0.  See <a href='/#/logging'>logging</a></h1>");
-
-    out.write("<p>Below is the complete JDK Log hierarchy with " +
-            "intermediate logger/categories synthesized.  " +
-            "The effective logging level is shown to the " +
-            "far right. If a logger has unset level, then " +
-            "the effective level is that of the nearest ancestor " +
-            "with a level setting.  Note that this only shows " +
-            "JDK Log levels.</p>\n");
-
-    out.write("<form method='POST'>\n");
-
-    out.write("<input type='submit' name='submit' value='set' " +
-            "class='button'>\n");
-    out.write("<input type='submit' name='submit' value='cancel' " +
-            "class='button'>\n");
-    out.write("<br><br>\n");
-
-    out.write("<table cellspacing='2' cellpadding='2'>");
-
-    out.write("<tr bgcolor='#CCCCFF'>" +
-            "<th align=left>Logger/Category name<br>" +
-            "<th colspan=9>Level</th>" +
-            "</tr><tr bgcolor='#CCCCFF'>" +
-            "<td bgcolor='#AAAAAA'>" +
-            "(Dark rows don't yet exist.)</td>");
-
-    for (int j = 0; j < LEVELS.length; ++j) {
-      out.write("<th align=left>");
-      if (LEVELS[j] != null) out.write(LEVELS[j].toString());
-      else out.write("unset");
-      out.write("</th>");
-    }
-    out.write("<th align=left>Effective</th>\n");
-    out.write("</tr>\n");
-
-    Iterator iWrappers = buildWrappers().iterator();
-    while (iWrappers.hasNext()) {
-
-      LogWrapper wrapper = (LogWrapper) iWrappers.next();
-
-      out.write("<tr");
-      if (wrapper.logger == null) {
-        out.write(" bgcolor='#AAAAAA'");
-      }
-      //out.write( ( wrapper.logger != null ) ? "#DDDDDD" : "#AAAAAA" );
-      out.write("><td>");
-      if ("".equals(wrapper.name)) {
-        out.write("root");
-      } else {
-        out.write(wrapper.name);
-      }
-      out.write("</td>\n");
-      for (int j = 0; j < LEVELS.length; ++j) {
-        out.write("<td align=center>");
-        if (!wrapper.name.equals("root") ||
-                (LEVELS[j] != null)) {
-          out.write("<input type='radio' name='");
-          if ("".equals(wrapper.name)) {
-            out.write("root");
-          } else {
-            out.write(wrapper.name);
-          }
-          out.write("' value='");
-          if (LEVELS[j] != null) out.write(LEVELS[j].toString());
-          else out.write("unset");
-          out.write('\'');
-          if (LEVELS[j] == wrapper.level()) out.write(" checked");
-          out.write('>');
-        }
-        out.write("</td>\n");
-      }
-      out.write("<td align=center>");
-      if (wrapper.logger != null) {
-        out.write(getEffectiveLevel(wrapper.logger).toString());
-      }
-      out.write("</td></tr>\n");
-    }
-    out.write("</table>\n");
-
-    out.write("<br>\n");
-    out.write("<input type='submit' name='submit' value='set' " +
-            "class='button'>\n");
-    out.write("<input type='submit' name='submit' value='cancel' " +
-            "class='button'>\n");
-
-    out.write("</form>\n");
-
-    out.write("</body></html>\n");
-  }
-
-
-  @Override
-  public void doPost(HttpServletRequest request,
-                     HttpServletResponse response)
-          throws IOException, ServletException {
-    if (request.getParameter("submit").equals("set")) {
-
-      Map paramMap = request.getParameterMap();
-
-      Iterator iParams = paramMap.entrySet().iterator();
-      while (iParams.hasNext()) {
-        Map.Entry p = (Map.Entry) iParams.next();
-        String name = (String) p.getKey();
-        String value = ((String[]) p.getValue())[0];
-
-        if (name.equals("submit")) continue;
-        Logger logger;
-        LogManager logManager = LogManager.getLogManager();
-        if ("root".equals(name)) {
-          logger = logManager.getLogger("");
-        } else logger = logManager.getLogger(name);
-
-        if ("unset".equals(value)) {
-          if ((logger != null) && (logger.getLevel() != null)) {
-            logger.setLevel(null);
-            log.info("Unset log level on '" + name + "'.");
-          }
-        } else {
-          Level level = Level.parse(value);
-          if (logger == null) logger = Logger.getLogger(name);
-          if (logger.getLevel() != level) {
-            logger.setLevel(level);
-            log.info("Set '" + name + "' to " +
-                    level + " level.");
-          }
-        }
-      }
-    } else {
-      log.fine("Selection form cancelled");
-    }
-
-    // Redirect back to standard get page.
-    response.sendRedirect(request.getRequestURI());
-  }
-
-
-  private Collection buildWrappers() {
-    // Use tree to get sorted results
-    SortedSet<LogWrapper> roots = new TreeSet<LogWrapper>();
-
-    roots.add(LogWrapper.ROOT);
-
-    LogManager logManager = LogManager.getLogManager();
-
-    Enumeration<String> loggerNames = logManager.getLoggerNames();
-    while (loggerNames.hasMoreElements()) {
-      String name = loggerNames.nextElement();
-      Logger logger = Logger.getLogger(name);
-      LogWrapper wrapper = new LogWrapper(logger);
-      roots.remove(wrapper); // Make sure add occurs
-      roots.add(wrapper);
-
-      while (true) {
-        int dot = name.lastIndexOf(".");
-        if (dot < 0) break;
-        name = name.substring(0, dot);
-        roots.add(new LogWrapper(name)); // if not already
-      }
-    }
-
-    return roots;
-  }
-
-  private Level getEffectiveLevel(Logger logger) {
-    Level level = logger.getLevel();
-    if (level != null) {
-      return level;
-    }
-    for (Level l : LEVELS) {
-      if (l == null) {
-        // avoid NPE
-        continue;
-      }
-      if (logger.isLoggable(l)) {
-        // return first level loggable
-        return l;
-      }
-    }
-    return Level.OFF;
-  }
-
-  private static class LogWrapper
-          implements Comparable {
-    public static LogWrapper ROOT =
-            new LogWrapper(LogManager.getLogManager().getLogger(""));
-
-    public LogWrapper(Logger logger) {
-      this.logger = logger;
-      this.name = logger.getName();
-    }
-
-    public LogWrapper(String name) {
-      this.name = name;
-    }
-
-
-    public int compareTo(Object other) {
-      if (this.equals(other)) return 0;
-      if (this == ROOT) return -1;
-      if (other == ROOT) return 1;
-
-      return name.compareTo(((LogWrapper) other).name);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (this == obj)
-        return true;
-      if (obj == null)
-        return false;
-      if (getClass() != obj.getClass())
-        return false;
-      LogWrapper other = (LogWrapper) obj;
-      if (name == null) {
-        if (other.name != null)
-          return false;
-      } else if (!name.equals(other.name))
-        return false;
-      return true;
-    }
-    
-    @Override
-    public int hashCode() {
-      final int prime = 31;
-      int result = 1;
-      result = prime * result + ((name == null) ? 0 : name.hashCode());
-      return result;
-    }
-
-    public Level level() {
-      if (logger != null) return logger.getLevel();
-      return null;
-    }
-
-    public Logger logger = null;
-    public String name;
-  }
-
-  private static Level[] LEVELS = {
-          null, // aka unset
-          Level.FINEST,
-          Level.FINE,
-          Level.CONFIG,
-          Level.INFO,
-          Level.WARNING,
-          Level.SEVERE,
-          Level.OFF
-          // Level.ALL -- ignore.  It is useless.
-  };
-
-  private Logger log = Logger.getLogger(getClass().getName());
-}
diff --git a/solr/core/src/java/org/apache/solr/servlet/RedirectServlet.java b/solr/core/src/java/org/apache/solr/servlet/RedirectServlet.java
new file mode 100644
index 0000000..abbfa85
--- /dev/null
+++ b/solr/core/src/java/org/apache/solr/servlet/RedirectServlet.java
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.solr.servlet;
+
+import java.io.IOException;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * A Simple redirection servlet to help us deprecate old UI elements
+ */
+public class RedirectServlet extends HttpServlet{
+  
+  static final String CONTEXT_KEY = "${context}";
+  
+  String destination;
+  int code = HttpServletResponse.SC_MOVED_PERMANENTLY;
+  
+  public void init(ServletConfig config) throws ServletException {
+    super.init(config);
+    
+    destination = config.getInitParameter("destination");
+    if(destination==null) {
+      throw new ServletException("RedirectServlet missing destination configuration");
+    }
+    if( "false".equals(config.getInitParameter("permanent") )) {
+      code = HttpServletResponse.SC_MOVED_TEMPORARILY;
+    }
+    
+    // Replace the context key
+    if(destination.startsWith(CONTEXT_KEY)) {
+      destination = config.getServletContext().getContextPath()
+          +destination.substring(CONTEXT_KEY.length());
+    }
+  }
+  
+  public void doGet(HttpServletRequest req, HttpServletResponse res)
+          throws ServletException,IOException {
+      
+    res.setStatus(code);
+    res.setHeader("Location", destination);
+  }
+
+  public void doPost(HttpServletRequest req, HttpServletResponse res)
+          throws ServletException,IOException {
+    doGet(req,res);
+  }
+}
\ No newline at end of file
diff --git a/solr/core/src/test/org/apache/solr/TestDistributedSearch.java b/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
index a8022b5..0b9f3a9 100755
--- a/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
+++ b/solr/core/src/test/org/apache/solr/TestDistributedSearch.java
@@ -358,7 +358,9 @@
     // Thread.sleep(10000000000L);
   }
   
-  protected void queryPartialResults(final List<String> upShards, List<SolrServer> upClients, Object... q) throws Exception {
+  protected void queryPartialResults(final List<String> upShards, 
+                                     final List<SolrServer> upClients, 
+                                     Object... q) throws Exception {
     
     final ModifiableSolrParams params = new ModifiableSolrParams();
 
@@ -385,8 +387,8 @@
           @Override
           public void run() {
             for (int j = 0; j < stress; j++) {
-              int which = r.nextInt(clients.size());
-              SolrServer client = clients.get(which);
+              int which = r.nextInt(upClients.size());
+              SolrServer client = upClients.get(which);
               try {
                 QueryResponse rsp = client.query(new ModifiableSolrParams(params));
                 if (verifyStress) {
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
index 72888e3..9a90172 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerTest.java
@@ -93,7 +93,7 @@
 
     public void close(){
       try {
-        deleteNode(ZkStateReader.LIVE_NODES_ZKNODE + "/" + "node1");
+        deleteNode(ZkStateReader.LIVE_NODES_ZKNODE + "/" + nodeName);
         zkClient.close();
       } catch (InterruptedException e) {
         //e.printStackTrace();
@@ -127,7 +127,7 @@
           ZkStateReader.toJSON(coreStates.values().toArray(
               new CoreState[coreStates.size()])), true);
       
-      for (int i = 0; i < 10; i++) {
+      for (int i = 0; i < 30; i++) {
         String shardId = getShardId(coreName);
         if (shardId != null) {
           try {
@@ -154,9 +154,9 @@
           collection);
       if (slices != null) {
         for (Slice slice : slices.values()) {
-          if (slice.getShards().containsKey(nodeName + "_" + coreName))
-          ;
-          return slice.getName();
+          if (slice.getShards().containsKey(nodeName + "_" + coreName)) {
+            return slice.getName();
+          }
         }
       }
       return null;
diff --git a/solr/core/src/test/org/apache/solr/core/AlternateDirectoryTest.java b/solr/core/src/test/org/apache/solr/core/AlternateDirectoryTest.java
index 09ca9fc..0578d40 100755
--- a/solr/core/src/test/org/apache/solr/core/AlternateDirectoryTest.java
+++ b/solr/core/src/test/org/apache/solr/core/AlternateDirectoryTest.java
@@ -61,7 +61,7 @@
     static volatile boolean newReaderCalled = false;
 
     @Override
-    public DirectoryReader newReader(Directory indexDir) throws IOException {
+    public DirectoryReader newReader(Directory indexDir, SolrCore core) throws IOException {
       TestIndexReaderFactory.newReaderCalled = true;
       return DirectoryReader.open(indexDir);
     }
diff --git a/solr/example/solr/conf/solrconfig.xml b/solr/example/solr/conf/solrconfig.xml
index 669233d..3a5a4b2 100755
--- a/solr/example/solr/conf/solrconfig.xml
+++ b/solr/example/solr/conf/solrconfig.xml
@@ -933,7 +933,7 @@
   <!-- JSON Update Request Handler
        http://wiki.apache.org/solr/UpdateJSON
     -->
-  <requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler" startup="lazy">
+  <requestHandler name="/update/json" class="solr.JsonUpdateRequestHandler">
      <lst name="defaults">
        <str name="wt">json</str>
        <str name="indent">true</str>
diff --git a/solr/example/solr/conf/velocity/head.vm b/solr/example/solr/conf/velocity/head.vm
index 8efdc56..d240868 100644
--- a/solr/example/solr/conf/velocity/head.vm
+++ b/solr/example/solr/conf/velocity/head.vm
@@ -3,7 +3,7 @@
     <title>#param('title')</title>
     <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
 
-  <script type="text/javascript" src="#{url_for_solr}/js/lib/jquery-1.4.3.min.js"></script>
+  <script type="text/javascript" src="#{url_for_solr}/js/lib/jquery-1.7.2.min.js"></script>
   <link rel="stylesheet" type="text/css" href="#{url_for_solr}/admin/file?file=/velocity/main.css&contentType=text/css"/>
   <link rel="stylesheet" href="#{url_for_solr}/admin/file?file=/velocity/jquery.autocomplete.css&contentType=text/css" type="text/css" />
   <script type="text/javascript" src="#{url_for_solr}/admin/file?file=/velocity/jquery.autocomplete.js&contentType=text/javascript"></script>
diff --git a/solr/lib/jcl-over-slf4j-1.6.1.jar.sha1 b/solr/lib/jcl-over-slf4j-1.6.1.jar.sha1
deleted file mode 100644
index 1a14aea..0000000
--- a/solr/lib/jcl-over-slf4j-1.6.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-99c61095a14dfc9e47a086068033c286bf236475
diff --git a/solr/lib/jcl-over-slf4j-1.6.4.jar.sha1 b/solr/lib/jcl-over-slf4j-1.6.4.jar.sha1
new file mode 100644
index 0000000..ea8a9fe
--- /dev/null
+++ b/solr/lib/jcl-over-slf4j-1.6.4.jar.sha1
@@ -0,0 +1 @@
+aad8e9df65ebb68e3ba6f269e3312707f7f1065f
diff --git a/solr/lib/log4j-over-slf4j-1.6.1.jar.sha1 b/solr/lib/log4j-over-slf4j-1.6.1.jar.sha1
deleted file mode 100644
index a73e28f..0000000
--- a/solr/lib/log4j-over-slf4j-1.6.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-2083595b098f183da3c0cabf2819eb083a510a9e
diff --git a/solr/lib/log4j-over-slf4j-1.6.4.jar.sha1 b/solr/lib/log4j-over-slf4j-1.6.4.jar.sha1
new file mode 100644
index 0000000..4505442
--- /dev/null
+++ b/solr/lib/log4j-over-slf4j-1.6.4.jar.sha1
@@ -0,0 +1 @@
+ddfe7c1606881837039903db7bee486c1336c15e
diff --git a/solr/lib/slf4j-api-1.6.1.jar.sha1 b/solr/lib/slf4j-api-1.6.1.jar.sha1
deleted file mode 100644
index 80e8179..0000000
--- a/solr/lib/slf4j-api-1.6.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-6f3b8a24bf970f17289b234284c94f43eb42f0e4
diff --git a/solr/lib/slf4j-api-1.6.4.jar.sha1 b/solr/lib/slf4j-api-1.6.4.jar.sha1
new file mode 100644
index 0000000..f10146b
--- /dev/null
+++ b/solr/lib/slf4j-api-1.6.4.jar.sha1
@@ -0,0 +1 @@
+2396d74b12b905f780ed7966738bb78438e8371a
diff --git a/solr/lib/slf4j-jdk14-1.6.1.jar.sha1 b/solr/lib/slf4j-jdk14-1.6.1.jar.sha1
deleted file mode 100644
index e62d8d4..0000000
--- a/solr/lib/slf4j-jdk14-1.6.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-251899d8c17e29ed4c53d98c88e54241a14d9591
diff --git a/solr/lib/slf4j-jdk14-1.6.4.jar.sha1 b/solr/lib/slf4j-jdk14-1.6.4.jar.sha1
new file mode 100644
index 0000000..e515293
--- /dev/null
+++ b/solr/lib/slf4j-jdk14-1.6.4.jar.sha1
@@ -0,0 +1 @@
+6b32bc7c42b2509525ce812cb49bf96e7bf64141
diff --git a/solr/solrj/ivy.xml b/solr/solrj/ivy.xml
index 9e6eb19..45fe91b 100644
--- a/solr/solrj/ivy.xml
+++ b/solr/solrj/ivy.xml
@@ -21,15 +21,15 @@
 
     <dependencies>
       <dependency org="org.apache.zookeeper" name="zookeeper" rev="3.3.4" transitive="false"/>
-      <dependency org="org.slf4j" name="log4j-over-slf4j" rev="1.6.1" transitive="false"/>
+      <dependency org="org.slf4j" name="log4j-over-slf4j" rev="1.6.4" transitive="false"/>
       <dependency org="org.apache.httpcomponents" name="httpcore" rev="4.1.4" transitive="false"/>
       <dependency org="org.apache.httpcomponents" name="httpclient" rev="4.1.3" transitive="false"/>
       <dependency org="org.apache.httpcomponents" name="httpmime" rev="4.1.3" transitive="false"/>
       <dependency org="commons-io" name="commons-io" rev="2.1" transitive="false"/>
-      <dependency org="org.slf4j" name="jcl-over-slf4j" rev="1.6.1" transitive="false"/>
+      <dependency org="org.slf4j" name="jcl-over-slf4j" rev="1.6.4" transitive="false"/>
       <dependency org="org.codehaus.woodstox" name="wstx-asl" rev="3.2.7" transitive="false"/>
-      <dependency org="org.slf4j" name="slf4j-api" rev="1.6.1" transitive="false"/>
-      <dependency org="org.slf4j" name="slf4j-jdk14" rev="1.6.1" transitive="false"/> 
+      <dependency org="org.slf4j" name="slf4j-api" rev="1.6.4" transitive="false"/>
+      <dependency org="org.slf4j" name="slf4j-jdk14" rev="1.6.4" transitive="false"/> 
       <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/> 
     </dependencies>
 </ivy-module>
diff --git a/solr/webapp/web/WEB-INF/web.xml b/solr/webapp/web/WEB-INF/web.xml
index 76ca640..fe96fd7 100644
--- a/solr/webapp/web/WEB-INF/web.xml
+++ b/solr/webapp/web/WEB-INF/web.xml
@@ -84,11 +84,6 @@
   </filter-mapping>
 
   <servlet>
-    <servlet-name>Logging</servlet-name>
-    <servlet-class>org.apache.solr.servlet.LogLevelSelection</servlet-class>
-  </servlet>
-  
-  <servlet>
     <servlet-name>Zookeeper</servlet-name>
     <servlet-class>org.apache.solr.servlet.ZookeeperInfoServlet</servlet-class>
   </servlet>
@@ -97,13 +92,54 @@
     <servlet-name>LoadAdminUI</servlet-name>
     <servlet-class>org.apache.solr.servlet.LoadAdminUiServlet</servlet-class>
   </servlet>
-
-  <!-- Will be removed before 4.0 release! -->
+  
+  <!-- Remove in Solr 5.0 -->
+  <!-- This sends SC_MOVED_PERMANENTLY (301) for resources that changed in 4.0 -->
+  <servlet>
+    <servlet-name>RedirectOldAdminUI</servlet-name>
+    <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
+    <init-param>
+      <param-name>destination</param-name>
+      <param-value>${context}/#/</param-value>
+    </init-param>
+  </servlet>
+  
+  <servlet>
+    <servlet-name>RedirectOldZookeeper</servlet-name>
+    <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
+    <init-param>
+      <param-name>destination</param-name>
+      <param-value>${context}/zookeeper</param-value>
+    </init-param>
+  </servlet>
+  
+  <servlet>
+    <servlet-name>RedirectLogging</servlet-name>
+    <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
+    <init-param>
+      <param-name>destination</param-name>
+      <param-value>${context}/#/~logging</param-value>
+    </init-param>
+  </servlet>
+  
   <servlet-mapping>
-    <servlet-name>Logging</servlet-name>
+    <servlet-name>RedirectOldAdminUI</servlet-name>
+    <url-pattern>/admin/</url-pattern>
+  </servlet-mapping>
+  <servlet-mapping>
+    <servlet-name>RedirectOldAdminUI</servlet-name>
+    <url-pattern>/admin</url-pattern>
+  </servlet-mapping>
+  <servlet-mapping>
+    <servlet-name>RedirectOldZookeeper</servlet-name>
+    <url-pattern>/zookeeper.jsp</url-pattern>
+  </servlet-mapping>
+  <servlet-mapping>
+    <servlet-name>RedirectLogging</servlet-name>
     <url-pattern>/logging</url-pattern>
   </servlet-mapping>
-  
+
+  <!-- Servlet Mapping -->
   <servlet-mapping>
     <servlet-name>Zookeeper</servlet-name>
     <url-pattern>/zookeeper</url-pattern>
@@ -113,7 +149,7 @@
     <servlet-name>LoadAdminUI</servlet-name>
     <url-pattern>/admin.html</url-pattern>
   </servlet-mapping>
-
+  
   <mime-mapping>
     <extension>.xsl</extension>
     <!-- per http://www.w3.org/TR/2006/PR-xslt20-20061121/ -->
diff --git a/solr/webapp/web/js/lib/jquery-1.4.3.min.js b/solr/webapp/web/js/lib/jquery-1.7.2.min.js
similarity index 100%
rename from solr/webapp/web/js/lib/jquery-1.4.3.min.js
rename to solr/webapp/web/js/lib/jquery-1.7.2.min.js