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
