Branch for 7790.

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/solr7790@1697337 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lucene/ivy-settings.xml b/lucene/ivy-settings.xml
index 80dd305..e615d91 100644
--- a/lucene/ivy-settings.xml
+++ b/lucene/ivy-settings.xml
@@ -41,16 +41,12 @@
     <!-- you might need to tweak this from china so it works -->
     <ibiblio name="working-chinese-mirror" root="http://uk.maven.org/maven2" m2compatible="true" />
 
-    <ibiblio name="rr-snapshot" root="https://oss.sonatype.org/content/repositories/comcarrotsearch-1039" m2compatible="true" />
-
-    <!--
     <filesystem name="local-maven-2" m2compatible="true" local="true">
       <artifact
           pattern="${local-maven2-dir}/[organisation]/[module]/[revision]/[module]-[revision].[ext]" />
       <ivy
           pattern="${local-maven2-dir}/[organisation]/[module]/[revision]/[module]-[revision].pom" />
     </filesystem>
-    -->
 
     <chain name="default" returnFirst="true" checkmodified="true" changingPattern=".*SNAPSHOT">
       <resolver ref="local"/>
@@ -59,7 +55,6 @@
       <resolver ref="maven.restlet.org" />
       <resolver ref="sonatype-releases" />
       <resolver ref="releases.cloudera.com"/>
-      <resolver ref="rr-snapshot"/>
       <!-- <resolver ref="svnkit-releases" /> -->
       <resolver ref="working-chinese-mirror" />
     </chain>
diff --git a/lucene/ivy-versions.properties b/lucene/ivy-versions.properties
index baf0041..503df94 100644
--- a/lucene/ivy-versions.properties
+++ b/lucene/ivy-versions.properties
@@ -11,7 +11,7 @@
 /com.carrotsearch.randomizedtesting/junit4-ant = ${com.carrotsearch.randomizedtesting.version}
 /com.carrotsearch.randomizedtesting/randomizedtesting-runner = ${com.carrotsearch.randomizedtesting.version}
 
-/com.carrotsearch/hppc = 0.5.2
+/com.carrotsearch/hppc = 0.7.1
 
 com.codahale.metrics.version = 3.0.1
 /com.codahale.metrics/metrics-core = ${com.codahale.metrics.version}
@@ -211,10 +211,12 @@
 /org.bouncycastle/bcmail-jdk15 = ${org.bouncycastle.version}
 /org.bouncycastle/bcprov-jdk15 = ${org.bouncycastle.version}
 
-/org.carrot2.attributes/attributes-binder = 1.2.1
-/org.carrot2/carrot2-mini = 3.9.0
+/org.carrot2.attributes/attributes-binder = 1.2.3
+/org.carrot2.shaded/carrot2-guava = 18.0
 
-org.carrot2.morfologik.version = 1.7.1
+/org.carrot2/carrot2-mini = 3.10.3
+
+org.carrot2.morfologik.version = 1.10.0
 /org.carrot2/morfologik-fsa = ${org.carrot2.morfologik.version}
 /org.carrot2/morfologik-polish = ${org.carrot2.morfologik.version}
 /org.carrot2/morfologik-stemming = ${org.carrot2.morfologik.version}
@@ -286,7 +288,7 @@
 /org.restlet.jee/org.restlet = ${org.restlet.jee.version}
 /org.restlet.jee/org.restlet.ext.servlet = ${org.restlet.jee.version}
 
-/org.simpleframework/simple-xml = 2.7
+/org.simpleframework/simple-xml = 2.7.1
 
 org.slf4j.version = 1.7.7
 /org.slf4j/jcl-over-slf4j = ${org.slf4j.version}
diff --git a/lucene/licenses/morfologik-fsa-1.10.0.jar.sha1 b/lucene/licenses/morfologik-fsa-1.10.0.jar.sha1
new file mode 100644
index 0000000..0831b2c
--- /dev/null
+++ b/lucene/licenses/morfologik-fsa-1.10.0.jar.sha1
@@ -0,0 +1 @@
+87100c6baf60f096b42b9af06dafeb20f686cd02
diff --git a/lucene/licenses/morfologik-fsa-1.7.1.jar.sha1 b/lucene/licenses/morfologik-fsa-1.7.1.jar.sha1
deleted file mode 100644
index b71174e..0000000
--- a/lucene/licenses/morfologik-fsa-1.7.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-fdf556c88d66f65440bd24024f55a52c227c0e3f
diff --git a/lucene/licenses/morfologik-polish-1.10.0.jar.sha1 b/lucene/licenses/morfologik-polish-1.10.0.jar.sha1
new file mode 100644
index 0000000..7e6a54e
--- /dev/null
+++ b/lucene/licenses/morfologik-polish-1.10.0.jar.sha1
@@ -0,0 +1 @@
+0f8eeb58acb5a39e162c0d49fcf29a70744cc2bc
diff --git a/lucene/licenses/morfologik-polish-1.7.1.jar.sha1 b/lucene/licenses/morfologik-polish-1.7.1.jar.sha1
deleted file mode 100644
index 3bd0d88..0000000
--- a/lucene/licenses/morfologik-polish-1.7.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-e03b9feb39f6e2c0ac7c37e220d01cdae66d3a28
diff --git a/lucene/licenses/morfologik-stemming-1.10.0.jar.sha1 b/lucene/licenses/morfologik-stemming-1.10.0.jar.sha1
new file mode 100644
index 0000000..e1459e0
--- /dev/null
+++ b/lucene/licenses/morfologik-stemming-1.10.0.jar.sha1
@@ -0,0 +1 @@
+a74ad7ceb29ff1d8194eb161f5b2dfbd636626a5
diff --git a/lucene/licenses/morfologik-stemming-1.7.1.jar.sha1 b/lucene/licenses/morfologik-stemming-1.7.1.jar.sha1
deleted file mode 100644
index 3b53503..0000000
--- a/lucene/licenses/morfologik-stemming-1.7.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c81d6c63e22e97819063cad7f1ecd20269cba720
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index b44479c..d15e091 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -164,6 +164,10 @@
 Other Changes
 ----------------------
 
+* SOLR-7790, SOLR-7792, SOLR-7791: Update Carrot2 clustering component to 
+  version 3.10.3. Upgrade HPPC library to version 0.7.1, morfologik-stemming 
+  to version 1.10.0. (Dawid Weiss)
+
 * SOLR-7831: Start Scripts: Allow a configurable stack size [-Xss] (Steve Davids via Mark Miller)
 
 * SOLR-7870: Write a test which asserts that requests to stateFormat=2 collection succeed on a node
diff --git a/solr/contrib/clustering/ivy.xml b/solr/contrib/clustering/ivy.xml
index d3b153c..b7ae2f1 100644
--- a/solr/contrib/clustering/ivy.xml
+++ b/solr/contrib/clustering/ivy.xml
@@ -24,25 +24,22 @@
   </configurations>
   <dependencies>
     <dependency org="org.carrot2" name="carrot2-mini" rev="${/org.carrot2/carrot2-mini}" conf="compile"/>
-
-    <dependency org="com.carrotsearch" name="hppc" rev="${/com.carrotsearch/hppc}" conf="compile"/>
+    <dependency org="org.carrot2.shaded" name="carrot2-guava" rev="${/org.carrot2.shaded/carrot2-guava}" conf="compile"/>
     <dependency org="org.carrot2.attributes" name="attributes-binder" rev="${/org.carrot2.attributes/attributes-binder}" conf="compile"/>
+
     <dependency org="org.simpleframework" name="simple-xml" rev="${/org.simpleframework/simple-xml}" conf="compile"/>
 
-    <dependency org="org.apache.mahout" name="mahout-math" rev="${/org.apache.mahout/mahout-math}" conf="compile"/>
+    <dependency org="org.apache.mahout" name="mahout-math"        rev="${/org.apache.mahout/mahout-math}"        conf="compile"/>
     <dependency org="org.apache.mahout" name="mahout-collections" rev="${/org.apache.mahout/mahout-collections}" conf="compile"/>
 
-    <dependency org="org.codehaus.jackson" name="jackson-core-asl" rev="${/org.codehaus.jackson/jackson-core-asl}" conf="compile"/>
-    <dependency org="org.codehaus.jackson" name="jackson-mapper-asl" rev="${/org.codehaus.jackson/jackson-mapper-asl}" conf="compile"/>
-
-    <!--
-    Included as part of Solr's environment.
-
-    com.google.guava:guava:jar:14.0.1:compile
-    commons-lang:commons-lang:jar:2.6:compile
-     -->
-
+    <dependency org="com.fasterxml.jackson.core" name="jackson-annotations"  rev="${/com.fasterxml.jackson.core/jackson-annotations}"   conf="compile"/>
+    <dependency org="com.fasterxml.jackson.core" name="jackson-databind"     rev="${/com.fasterxml.jackson.core/jackson-databind}"      conf="compile"/>
+    
     <dependency org="org.slf4j" name="jcl-over-slf4j" rev="${/org.slf4j/jcl-over-slf4j}" conf="test"/>
+    
+    <!--
+    NOTE: There are dependencies that are part of core Solr server (jackson-core, HPPC, etc.).
+    -->
 
     <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/>
   </dependencies>
diff --git a/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngineTest.java b/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngineTest.java
index 2a366f1..a3aa76e 100644
--- a/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngineTest.java
+++ b/solr/contrib/clustering/src/test/org/apache/solr/handler/clustering/carrot2/CarrotClusteringEngineTest.java
@@ -376,7 +376,7 @@
     params.add(CarrotParams.SNIPPET_FIELD_NAME, "snippet");
 
     final List<String> labels = getLabels(checkEngine(
-        getClusteringEngine("custom-duplicating-tokenizer"), 1, 16, new TermQuery(new Term("title",
+        getClusteringEngine("custom-duplicating-tokenizer"), 1, 15, new TermQuery(new Term("title",
             "field")), params).get(0));
     
     // The custom test tokenizer duplicates each token's text
diff --git a/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java b/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
index 34ac972..6243df5 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java
@@ -27,11 +27,11 @@
 import java.util.List;
 import java.util.Map;
 
-import com.carrotsearch.hppc.IntObjectOpenHashMap;
-import com.carrotsearch.hppc.IntOpenHashSet;
+import com.carrotsearch.hppc.IntHashSet;
+import com.carrotsearch.hppc.IntObjectHashMap;
+import com.carrotsearch.hppc.LongHashSet;
+import com.carrotsearch.hppc.LongObjectHashMap;
 import com.carrotsearch.hppc.LongObjectMap;
-import com.carrotsearch.hppc.LongObjectOpenHashMap;
-import com.carrotsearch.hppc.LongOpenHashSet;
 import com.carrotsearch.hppc.cursors.IntObjectCursor;
 import com.carrotsearch.hppc.cursors.LongCursor;
 import com.carrotsearch.hppc.cursors.LongObjectCursor;
@@ -247,9 +247,9 @@
     }
 
     FixedBitSet groupBits = null;
-    LongOpenHashSet groupSet = null;
+    LongHashSet groupSet = null;
     DocList docList = rb.getResults().docList;
-    IntOpenHashSet collapsedSet = new IntOpenHashSet(docList.size() * 2);
+    IntHashSet collapsedSet = new IntHashSet(docList.size() * 2);
 
     //Gather the groups for the current page of documents
     DocIterator idit = docList.iterator();
@@ -269,7 +269,7 @@
     int currentContext = 0;
     int currentDocBase = contexts.get(currentContext).docBase;
     int nextDocBase = (currentContext+1)<contexts.size() ? contexts.get(currentContext+1).docBase : Integer.MAX_VALUE;
-    IntObjectOpenHashMap<BytesRef> ordBytes = null;
+    IntObjectHashMap<BytesRef> ordBytes = null;
     if(values != null) {
       groupBits = new FixedBitSet(values.getValueCount());
       MultiDocValues.OrdinalMap ordinalMap = null;
@@ -284,7 +284,7 @@
       }
       int count = 0;
 
-      ordBytes = new IntObjectOpenHashMap();
+      ordBytes = new IntObjectHashMap<>();
 
       for(int i=0; i<globalDocs.length; i++) {
         int globalDoc = globalDocs[i];
@@ -329,7 +329,7 @@
         }
       }
     } else {
-      groupSet = new LongOpenHashSet((int)(docList.size()*1.25));
+      groupSet = new LongHashSet(docList.size());
       NumericDocValues collapseValues = contexts.get(currentContext).reader().getNumericDocValues(field);
       int count = 0;
       for(int i=0; i<globalDocs.length; i++) {
@@ -389,12 +389,12 @@
           .build();
       searcher.search(q, collector);
     }
-    LongObjectMap groups = ((GroupCollector)groupExpandCollector).getGroups();
+    LongObjectMap<Collector> groups = ((GroupCollector) groupExpandCollector).getGroups();
     NamedList outMap = new SimpleOrderedMap();
     CharsRefBuilder charsRef = new CharsRefBuilder();
-    for (LongObjectCursor cursor : (Iterable<LongObjectCursor>) groups) {
+    for (LongObjectCursor<Collector> cursor : groups) {
       long groupValue = cursor.key;
-      TopDocsCollector topDocsCollector = (TopDocsCollector) cursor.value;
+      TopDocsCollector<?> topDocsCollector = TopDocsCollector.class.cast(cursor.value);
       TopDocs topDocs = topDocsCollector.topDocs();
       ScoreDoc[] scoreDocs = topDocs.scoreDocs;
       if (scoreDocs.length > 0) {
@@ -502,11 +502,11 @@
 
     private LongObjectMap<Collector> groups;
     private FixedBitSet groupBits;
-    private IntOpenHashSet collapsedSet;
+    private IntHashSet collapsedSet;
 
-    public GroupExpandCollector(SortedDocValues docValues, FixedBitSet groupBits, IntOpenHashSet collapsedSet, int limit, Sort sort) throws IOException {
+    public GroupExpandCollector(SortedDocValues docValues, FixedBitSet groupBits, IntHashSet collapsedSet, int limit, Sort sort) throws IOException {
       int numGroups = collapsedSet.size();
-      groups = new LongObjectOpenHashMap<>(numGroups * 2);
+      groups = new LongObjectHashMap<>(numGroups);
       DocIdSetIterator iterator = new BitSetIterator(groupBits, 0); // cost is not useful here
       int group;
       while ((group = iterator.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
@@ -536,7 +536,7 @@
         this.segmentOrdinalMap = ordinalMap.getGlobalOrds(context.ord);
       }
 
-      final LongObjectMap<LeafCollector> leafCollectors = new LongObjectOpenHashMap<>();
+      final LongObjectMap<LeafCollector> leafCollectors = new LongObjectHashMap<>();
       for (LongObjectCursor<Collector> entry : groups) {
         leafCollectors.put(entry.key, entry.value.getLeafCollector(context));
       }
@@ -578,17 +578,16 @@
   private class NumericGroupExpandCollector implements Collector, GroupCollector {
     private NumericDocValues docValues;
 
-
     private String field;
-    private LongObjectOpenHashMap<Collector> groups;
+    private LongObjectHashMap<Collector> groups;
 
-    private IntOpenHashSet collapsedSet;
+    private IntHashSet collapsedSet;
     private long nullValue;
 
-    public NumericGroupExpandCollector(String field, long nullValue, LongOpenHashSet groupSet, IntOpenHashSet collapsedSet, int limit, Sort sort) throws IOException {
+    public NumericGroupExpandCollector(String field, long nullValue, LongHashSet groupSet, IntHashSet collapsedSet, int limit, Sort sort) throws IOException {
       int numGroups = collapsedSet.size();
       this.nullValue = nullValue;
-      groups = new LongObjectOpenHashMap(numGroups * 2);
+      groups = new LongObjectHashMap<>(numGroups);
       Iterator<LongCursor> iterator = groupSet.iterator();
       while (iterator.hasNext()) {
         LongCursor cursor = iterator.next();
@@ -609,7 +608,7 @@
       final int docBase = context.docBase;
       this.docValues = context.reader().getNumericDocValues(this.field);
 
-      final LongObjectOpenHashMap<LeafCollector> leafCollectors = new LongObjectOpenHashMap<>();
+      final LongObjectHashMap<LeafCollector> leafCollectors = new LongObjectHashMap<>();
 
       for (LongObjectCursor<Collector> entry : groups) {
         leafCollectors.put(entry.key, entry.value.getLeafCollector(context));
@@ -627,29 +626,30 @@
         @Override
         public void collect(int docId) throws IOException {
           long value = docValues.get(docId);
-          if (value != nullValue && leafCollectors.containsKey(value) && !collapsedSet.contains(docId + docBase)) {
-            LeafCollector c = leafCollectors.lget();
-            c.collect(docId);
+          final int index;
+          if (value != nullValue && 
+              (index = leafCollectors.indexOf(value)) >= 0 && 
+              !collapsedSet.contains(docId + docBase)) {
+            leafCollectors.indexGet(index).collect(docId);
           }
         }
       };
     }
 
-    public LongObjectOpenHashMap<Collector> getGroups() {
+    public LongObjectHashMap<Collector> getGroups() {
       return groups;
     }
 
   }
 
   private interface GroupCollector {
-    public LongObjectMap getGroups();
-
+    public LongObjectMap<Collector> getGroups();
   }
 
   private Query getGroupQuery(String fname,
                            FieldType ft,
                            int size,
-                           LongOpenHashSet groupSet) {
+                           LongHashSet groupSet) {
 
     BytesRef[] bytesRefs = new BytesRef[size];
     BytesRefBuilder term = new BytesRefBuilder();
@@ -676,8 +676,7 @@
 
   private Query getGroupQuery(String fname,
                               int size,
-                              IntObjectOpenHashMap<BytesRef> ordBytes) throws Exception {
-
+                              IntObjectHashMap<BytesRef> ordBytes) throws Exception {
     BytesRef[] bytesRefs = new BytesRef[size];
     int index = -1;
     Iterator<IntObjectCursor<BytesRef>>it = ordBytes.iterator();
@@ -728,7 +727,7 @@
 
     public FieldInfos getFieldInfos() {
       Iterator<FieldInfo> it = in.getFieldInfos().iterator();
-      List<FieldInfo> newInfos = new ArrayList();
+      List<FieldInfo> newInfos = new ArrayList<>();
       while(it.hasNext()) {
         FieldInfo fieldInfo = it.next();
 
diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
index b94e4b3..1ee1f26 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
@@ -17,8 +17,6 @@
 
 package org.apache.solr.handler.component;
 
-import com.carrotsearch.hppc.IntIntOpenHashMap;
-
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
@@ -73,6 +71,8 @@
 import org.w3c.dom.NodeList;
 import org.xml.sax.InputSource;
 
+import com.carrotsearch.hppc.IntIntHashMap;
+
 import javax.xml.xpath.XPath;
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathExpressionException;
@@ -536,16 +536,16 @@
   }
 
 
-  public static IntIntOpenHashMap getBoostDocs(SolrIndexSearcher indexSearcher, Map<BytesRef, Integer>boosted, Map context) throws IOException {
+  public static IntIntHashMap getBoostDocs(SolrIndexSearcher indexSearcher, Map<BytesRef, Integer>boosted, Map context) throws IOException {
 
-    IntIntOpenHashMap boostDocs = null;
+    IntIntHashMap boostDocs = null;
 
     if(boosted != null) {
 
       //First see if it's already in the request context. Could have been put there
       //by another caller.
       if(context != null) {
-        boostDocs = (IntIntOpenHashMap)context.get(BOOSTED_DOCIDS);
+        boostDocs = (IntIntHashMap) context.get(BOOSTED_DOCIDS);
       }
 
       if(boostDocs != null) {
@@ -555,13 +555,13 @@
 
       SchemaField idField = indexSearcher.getSchema().getUniqueKeyField();
       String fieldName = idField.getName();
-      HashSet<BytesRef> localBoosts = new HashSet(boosted.size()*2);
+      HashSet<BytesRef> localBoosts = new HashSet<>(boosted.size()*2);
       Iterator<BytesRef> boostedIt = boosted.keySet().iterator();
       while(boostedIt.hasNext()) {
         localBoosts.add(boostedIt.next());
       }
 
-      boostDocs = new IntIntOpenHashMap(boosted.size()*2);
+      boostDocs = new IntIntHashMap(boosted.size());
 
       List<LeafReaderContext>leaves = indexSearcher.getTopReaderContext().leaves();
       PostingsEnum postingsEnum = null;
diff --git a/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java b/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java
index 1a53c71..a885990 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/StatsValuesFactory.java
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.util.*;
 import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
 
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.queries.function.FunctionValues;
@@ -823,7 +824,6 @@
 
   @Override
   public long hash(String v) {
-    // NOTE: renamed hashUnencodedChars starting with guava 15
     return hasher.hashString(v).asLong();
   }
   
diff --git a/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
index f59abc2..cb1097e 100644
--- a/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
@@ -27,8 +27,8 @@
 
 import com.carrotsearch.hppc.FloatArrayList;
 import com.carrotsearch.hppc.IntArrayList;
-import com.carrotsearch.hppc.IntIntOpenHashMap;
-import com.carrotsearch.hppc.IntLongOpenHashMap;
+import com.carrotsearch.hppc.IntIntHashMap;
+import com.carrotsearch.hppc.IntLongHashMap;
 import com.carrotsearch.hppc.cursors.IntIntCursor;
 import com.carrotsearch.hppc.cursors.IntLongCursor;
 import org.apache.lucene.index.DocValues;
@@ -228,8 +228,8 @@
       }
     }
 
-    private IntIntOpenHashMap getBoostDocs(SolrIndexSearcher indexSearcher, Map<BytesRef, Integer> boosted, Map context) throws IOException {
-      IntIntOpenHashMap boostDocs = QueryElevationComponent.getBoostDocs(indexSearcher, boosted, context);
+    private IntIntHashMap getBoostDocs(SolrIndexSearcher indexSearcher, Map<BytesRef, Integer> boosted, Map context) throws IOException {
+      IntIntHashMap boostDocs = QueryElevationComponent.getBoostDocs(indexSearcher, boosted, context);
       return boostDocs;
     }
 
@@ -242,7 +242,7 @@
         //We have to deal with it here rather then the constructor because
         //because the QueryElevationComponent runs after the Queries are constructed.
 
-        IntIntOpenHashMap boostDocsMap = null;
+        IntIntHashMap boostDocsMap = null;
         Map context = null;
         SolrRequestInfo info = SolrRequestInfo.getRequestInfo();
         if(info != null) {
@@ -413,7 +413,7 @@
                              int segments,
                              SortedDocValues collapseValues,
                              int nullPolicy,
-                             IntIntOpenHashMap boostDocsMap) {
+                             IntIntHashMap boostDocsMap) {
       this.maxDoc = maxDoc;
       this.contexts = new LeafReaderContext[segments];
       this.collapsedSet = new FixedBitSet(maxDoc);
@@ -608,7 +608,7 @@
     private LeafReaderContext[] contexts;
     private FixedBitSet collapsedSet;
     private NumericDocValues collapseValues;
-    private IntLongOpenHashMap cmap;
+    private IntLongHashMap cmap;
     private int maxDoc;
     private int nullPolicy;
     private float nullScore = -Float.MAX_VALUE;
@@ -627,7 +627,7 @@
                              int nullPolicy,
                              int size,
                              String field,
-                             IntIntOpenHashMap boostDocsMap) {
+                             IntIntHashMap boostDocsMap) {
       this.maxDoc = maxDoc;
       this.contexts = new LeafReaderContext[segments];
       this.collapsedSet = new FixedBitSet(maxDoc);
@@ -636,7 +636,7 @@
       if(nullPolicy == CollapsingPostFilter.NULL_POLICY_EXPAND) {
         nullScores = new FloatArrayList();
       }
-      this.cmap = new IntLongOpenHashMap(size);
+      this.cmap = new IntLongHashMap(size);
       this.field = field;
 
       if(boostDocsMap != null) {
@@ -680,18 +680,19 @@
 
       if(collapseValue != nullValue) {
         float score = scorer.score();
-        if(cmap.containsKey(collapseValue)) {
-          long scoreDoc = cmap.lget();
+        final int idx;
+        if((idx = cmap.indexOf(collapseValue)) >= 0) {
+          long scoreDoc = cmap.indexGet(idx);
           int testScore = (int)(scoreDoc>>32);
           int currentScore = Float.floatToRawIntBits(score);
           if(currentScore > testScore) {
             //Current score is higher so replace the old scoreDoc with the current scoreDoc
-            cmap.lset((((long)currentScore)<<32)+globalDoc);
+            cmap.indexReplace(idx, (((long)currentScore)<<32)+globalDoc);
           }
         } else {
           //Combine the score and document into a long.
           long scoreDoc = (((long)Float.floatToRawIntBits(score))<<32)+globalDoc;
-          cmap.put(collapseValue, scoreDoc);
+          cmap.indexInsert(idx, collapseValue, scoreDoc);
         }
       } else if(nullPolicy == CollapsingPostFilter.NULL_POLICY_COLLAPSE) {
         float score = scorer.score();
@@ -807,7 +808,7 @@
                                   boolean max,
                                   boolean needsScores,
                                   FieldType fieldType,
-                                  IntIntOpenHashMap boostDocs,
+                                  IntIntHashMap boostDocs,
                                   FunctionQuery funcQuery, IndexSearcher searcher) throws IOException{
 
       this.maxDoc = maxDoc;
@@ -975,7 +976,7 @@
                                   boolean max,
                                   boolean needsScores,
                                   FieldType fieldType,
-                                  IntIntOpenHashMap boostDocsMap,
+                                  IntIntHashMap boostDocsMap,
                                   FunctionQuery funcQuery,
                                   IndexSearcher searcher) throws IOException{
 
@@ -1035,7 +1036,7 @@
       DocIdSetIterator it = new BitSetIterator(collapseStrategy.getCollapsedSet(), 0); // cost is not useful here
       int globalDoc = -1;
       int nullScoreIndex = 0;
-      IntIntOpenHashMap cmap = collapseStrategy.getCollapseMap();
+      IntIntHashMap cmap = collapseStrategy.getCollapseMap();
       int[] docs = collapseStrategy.getDocs();
       float[] scores = collapseStrategy.getScores();
       FloatArrayList nullScores = collapseStrategy.getNullScores();
@@ -1090,7 +1091,7 @@
                                             String hint,
                                             boolean needsScores,
                                             int size,
-                                            IntIntOpenHashMap boostDocs,
+                                            IntIntHashMap boostDocs,
                                             SolrIndexSearcher searcher) throws IOException {
 
 
@@ -1285,7 +1286,7 @@
                                  int nullPolicy,
                                  boolean max,
                                  boolean needsScores,
-                                 IntIntOpenHashMap boostDocsMap,
+                                 IntIntHashMap boostDocsMap,
                                  SortedDocValues values) {
       this.field = field;
       this.nullPolicy = nullPolicy;
@@ -1376,7 +1377,7 @@
                           int[] ords,
                           boolean max,
                           boolean needsScores,
-                          IntIntOpenHashMap boostDocs,
+                          IntIntHashMap boostDocs,
                           SortedDocValues values) throws IOException {
       super(maxDoc, field, nullPolicy, max, needsScores, boostDocs, values);
       this.ords = ords;
@@ -1457,7 +1458,7 @@
                           int[] ords,
                           boolean max,
                           boolean needsScores,
-                          IntIntOpenHashMap boostDocs,
+                          IntIntHashMap boostDocs,
                           SortedDocValues values) throws IOException {
       super(maxDoc, field, nullPolicy, max, needsScores, boostDocs, values);
       this.ords = ords;
@@ -1539,7 +1540,7 @@
                            int[] ords,
                            boolean max,
                            boolean needsScores,
-                           IntIntOpenHashMap boostDocs, SortedDocValues values) throws IOException {
+                           IntIntHashMap boostDocs, SortedDocValues values) throws IOException {
       super(maxDoc, field, nullPolicy, max, needsScores, boostDocs, values);
       this.ords = ords;
       this.ordVals = new long[ords.length];
@@ -1623,7 +1624,7 @@
                                   int[] ords,
                                   boolean max,
                                   boolean needsScores,
-                                  IntIntOpenHashMap boostDocs,
+                                  IntIntHashMap boostDocs,
                                   FunctionQuery funcQuery,
                                   IndexSearcher searcher,
                                   SortedDocValues values) throws IOException {
@@ -1707,7 +1708,7 @@
 
   private abstract class IntFieldValueStrategy {
     protected int nullPolicy;
-    protected IntIntOpenHashMap cmap;
+    protected IntIntHashMap cmap;
     protected Scorer scorer;
     protected FloatArrayList nullScores;
     protected float nullScore;
@@ -1736,7 +1737,7 @@
                                  int nullPolicy,
                                  boolean max,
                                  boolean needsScores,
-                                 IntIntOpenHashMap boostDocsMap) {
+                                 IntIntHashMap boostDocsMap) {
       this.field = field;
       this.collapseField = collapseField;
       this.nullValue = nullValue;
@@ -1744,7 +1745,7 @@
       this.max = max;
       this.needsScores = needsScores;
       this.collapsedSet = new FixedBitSet(maxDoc);
-      this.cmap = new IntIntOpenHashMap(size);
+      this.cmap = new IntIntHashMap(size);
       if(boostDocsMap != null) {
         this.boosts = true;
         this.boostDocs = new IntArrayList();
@@ -1801,7 +1802,7 @@
       return nullScores;
     }
 
-    public IntIntOpenHashMap getCollapseMap() {
+    public IntIntHashMap getCollapseMap() {
       return cmap;
     }
 
@@ -1842,7 +1843,7 @@
                           int nullPolicy,
                           boolean max,
                           boolean needsScores,
-                          IntIntOpenHashMap boostDocs) throws IOException {
+                          IntIntHashMap boostDocs) throws IOException {
 
       super(maxDoc, size, collapseField, field, nullValue, nullPolicy, max, needsScores, boostDocs);
 
@@ -1881,8 +1882,9 @@
       int currentVal = (int) minMaxVals.get(contextDoc);
 
       if(collapseKey != nullValue) {
-        if(cmap.containsKey(collapseKey)) {
-          int pointer = cmap.lget();
+        final int idx;
+        if((idx = cmap.indexOf(collapseKey)) >= 0) {
+          int pointer = cmap.indexGet(idx);
           if(comp.test(currentVal, testValues[pointer])) {
             testValues[pointer]= currentVal;
             docs[pointer] = globalDoc;
@@ -1942,7 +1944,7 @@
                           int nullPolicy,
                           boolean max,
                           boolean needsScores,
-                          IntIntOpenHashMap boostDocs) throws IOException {
+                          IntIntHashMap boostDocs) throws IOException {
 
       super(maxDoc, size, collapseField, field, nullValue, nullPolicy, max, needsScores, boostDocs);
 
@@ -1982,8 +1984,9 @@
       float currentVal = Float.intBitsToFloat(minMaxVal);
 
       if(collapseKey != nullValue) {
-        if(cmap.containsKey(collapseKey)) {
-          int pointer = cmap.lget();
+        final int idx;
+        if((idx = cmap.indexOf(collapseKey)) >= 0) {
+          int pointer = cmap.indexGet(idx);
           if(comp.test(currentVal, testValues[pointer])) {
             testValues[pointer] = currentVal;
             docs[pointer] = globalDoc;
@@ -2054,7 +2057,7 @@
                                   int nullPolicy,
                                   boolean max,
                                   boolean needsScores,
-                                  IntIntOpenHashMap boostDocs,
+                                  IntIntHashMap boostDocs,
                                   FunctionQuery funcQuery,
                                   IndexSearcher searcher) throws IOException {
 
@@ -2108,8 +2111,9 @@
       float currentVal = functionValues.floatVal(contextDoc);
 
       if(collapseKey != nullValue) {
-        if(cmap.containsKey(collapseKey)) {
-          int pointer = cmap.lget();
+        final int idx;
+        if((idx = cmap.indexOf(collapseKey)) >= 0) {
+          int pointer = cmap.indexGet(idx);
           if(comp.test(currentVal, testValues[pointer])) {
             testValues[pointer] = currentVal;
             docs[pointer] = globalDoc;
diff --git a/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java
index f5fb64d..8beebe1 100644
--- a/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/ReRankQParserPlugin.java
@@ -23,8 +23,9 @@
 import java.util.Map;
 import java.util.Set;
 
-import com.carrotsearch.hppc.IntFloatOpenHashMap;
-import com.carrotsearch.hppc.IntIntOpenHashMap;
+import com.carrotsearch.hppc.IntFloatHashMap;
+import com.carrotsearch.hppc.IntIntHashMap;
+
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.Term;
@@ -42,7 +43,6 @@
 import org.apache.lucene.search.TopFieldCollector;
 import org.apache.lucene.search.TopScoreDocCollector;
 import org.apache.lucene.search.Weight;
-import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
@@ -292,7 +292,7 @@
             requestContext = info.getReq().getContext();
           }
 
-          IntIntOpenHashMap boostedDocs = QueryElevationComponent.getBoostDocs((SolrIndexSearcher)searcher, boostedPriority, requestContext);
+          IntIntHashMap boostedDocs = QueryElevationComponent.getBoostDocs((SolrIndexSearcher)searcher, boostedPriority, requestContext);
 
           ScoreDoc[] mainScoreDocs = mainDocs.scoreDocs;
           ScoreDoc[] reRankScoreDocs = new ScoreDoc[Math.min(mainScoreDocs.length, reRankDocs)];
@@ -391,14 +391,15 @@
   }
 
   public class BoostedComp implements Comparator {
-    IntFloatOpenHashMap boostedMap;
+    IntFloatHashMap boostedMap;
 
-    public BoostedComp(IntIntOpenHashMap boostedDocs, ScoreDoc[] scoreDocs, float maxScore) {
-      this.boostedMap = new IntFloatOpenHashMap(boostedDocs.size()*2);
+    public BoostedComp(IntIntHashMap boostedDocs, ScoreDoc[] scoreDocs, float maxScore) {
+      this.boostedMap = new IntFloatHashMap(boostedDocs.size()*2);
 
       for(int i=0; i<scoreDocs.length; i++) {
-        if(boostedDocs.containsKey(scoreDocs[i].doc)) {
-          boostedMap.put(scoreDocs[i].doc, maxScore+boostedDocs.lget());
+        final int idx;
+        if((idx = boostedDocs.indexOf(scoreDocs[i].doc)) >= 0) {
+          boostedMap.put(scoreDocs[i].doc, maxScore+boostedDocs.indexGet(idx));
         } else {
           break;
         }
@@ -410,21 +411,16 @@
       ScoreDoc doc2 = (ScoreDoc) o2;
       float score1 = doc1.score;
       float score2 = doc2.score;
-      if(boostedMap.containsKey(doc1.doc)) {
-        score1 = boostedMap.lget();
+      int idx;
+      if((idx = boostedMap.indexOf(doc1.doc)) >= 0) {
+        score1 = boostedMap.indexGet(idx);
       }
 
-      if(boostedMap.containsKey(doc2.doc)) {
-        score2 = boostedMap.lget();
+      if((idx = boostedMap.indexOf(doc2.doc)) >= 0) {
+        score2 = boostedMap.indexGet(idx);
       }
 
-      if(score1 > score2) {
-        return -1;
-      } else if(score1 < score2) {
-        return 1;
-      } else {
-        return 0;
-      }
+      return -Float.compare(score1, score2);
     }
   }
 }
\ No newline at end of file
diff --git a/solr/core/src/java/org/apache/solr/util/hll/HLL.java b/solr/core/src/java/org/apache/solr/util/hll/HLL.java
index 432401b..39ba80b 100644
--- a/solr/core/src/java/org/apache/solr/util/hll/HLL.java
+++ b/solr/core/src/java/org/apache/solr/util/hll/HLL.java
@@ -19,8 +19,8 @@
 
 import java.util.Arrays;
 
-import com.carrotsearch.hppc.IntByteOpenHashMap;
-import com.carrotsearch.hppc.LongOpenHashSet;
+import com.carrotsearch.hppc.IntByteHashMap;
+import com.carrotsearch.hppc.LongHashSet;
 import com.carrotsearch.hppc.cursors.IntByteCursor;
 import com.carrotsearch.hppc.cursors.LongCursor;
 
@@ -69,9 +69,9 @@
     // ************************************************************************
     // Storage
     // storage used when #type is EXPLICIT, null otherwise
-    LongOpenHashSet explicitStorage;
+    LongHashSet explicitStorage;
     // storage used when #type is SPARSE, null otherwise
-    IntByteOpenHashMap sparseProbabilisticStorage;
+    IntByteHashMap sparseProbabilisticStorage;
     // storage used when #type is FULL, null otherwise
     BitVector probabilisticStorage;
 
@@ -398,8 +398,9 @@
         final int j = (int)(rawValue & mBitsMask);
 
         final byte currentValue;
-        if (sparseProbabilisticStorage.containsKey(j)) {
-          currentValue = sparseProbabilisticStorage.lget();
+        final int index = sparseProbabilisticStorage.indexOf(j);
+        if (index >= 0) {
+          currentValue = sparseProbabilisticStorage.indexGet(index);
         } else {
           currentValue = 0;
         }
@@ -467,10 +468,10 @@
                 // nothing to be done
                 break;
             case EXPLICIT:
-                this.explicitStorage = new LongOpenHashSet();
+                this.explicitStorage = new LongHashSet();
                 break;
             case SPARSE:
-                this.sparseProbabilisticStorage = new IntByteOpenHashMap();
+                this.sparseProbabilisticStorage = new IntByteHashMap();
                 break;
             case FULL:
                 this.probabilisticStorage = new BitVector(regwidth, m);
@@ -522,7 +523,7 @@
         for(int j=0; j<m; j++) {
             final long register;
             if (sparseProbabilisticStorage.containsKey(j)) {
-              register = sparseProbabilisticStorage.lget();
+              register = sparseProbabilisticStorage.get(j);
             } else {
               register = 0;
             }
diff --git a/solr/core/src/test/org/apache/solr/handler/component/TestDistributedStatsComponentCardinality.java b/solr/core/src/test/org/apache/solr/handler/component/TestDistributedStatsComponentCardinality.java
index d3e20f0..b4d6c21 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/TestDistributedStatsComponentCardinality.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/TestDistributedStatsComponentCardinality.java
@@ -88,7 +88,6 @@
                     "long_l", ""+longValue, 
                     "long_l_prehashed_l", ""+HASHER.hashLong(longValue).asLong(),
                     "string_s", strValue,
-                    // NOTE: renamed hashUnencodedChars starting with guava 15
                     "string_s_prehashed_l", ""+HASHER.hashString(strValue).asLong()));
 
       longValue -= BIG_PRIME;
diff --git a/solr/core/src/test/org/apache/solr/util/hll/ExplicitHLLTest.java b/solr/core/src/test/org/apache/solr/util/hll/ExplicitHLLTest.java
index 1d7a85b..bf30d2f 100644
--- a/solr/core/src/test/org/apache/solr/util/hll/ExplicitHLLTest.java
+++ b/solr/core/src/test/org/apache/solr/util/hll/ExplicitHLLTest.java
@@ -22,7 +22,7 @@
 import org.apache.lucene.util.LuceneTestCase;
 import org.junit.Test;
 
-import com.carrotsearch.hppc.LongOpenHashSet;
+import com.carrotsearch.hppc.LongHashSet;
 import static com.carrotsearch.randomizedtesting.RandomizedTest.*;
 
 
@@ -214,8 +214,8 @@
      * Asserts that values in both sets are exactly equal.
      */
     private static void assertElementsEqual(final HLL hllA, final HLL hllB) {
-        final LongOpenHashSet internalSetA = hllA.explicitStorage;
-        final LongOpenHashSet internalSetB = hllB.explicitStorage;
+        final LongHashSet internalSetA = hllA.explicitStorage;
+        final LongHashSet internalSetB = hllB.explicitStorage;
 
         assertTrue(internalSetA.equals(internalSetB));
     }
diff --git a/solr/core/src/test/org/apache/solr/util/hll/SparseHLLTest.java b/solr/core/src/test/org/apache/solr/util/hll/SparseHLLTest.java
index c62d773..e7e02cb 100644
--- a/solr/core/src/test/org/apache/solr/util/hll/SparseHLLTest.java
+++ b/solr/core/src/test/org/apache/solr/util/hll/SparseHLLTest.java
@@ -20,7 +20,7 @@
 import org.apache.lucene.util.LuceneTestCase;
 import org.junit.Test;
 
-import com.carrotsearch.hppc.IntByteOpenHashMap;
+import com.carrotsearch.hppc.IntByteHashMap;
 import com.carrotsearch.hppc.cursors.IntByteCursor;
 import com.carrotsearch.randomizedtesting.RandomizedTest;
 
@@ -393,7 +393,7 @@
         for(int run=0; run<100; run++) {
             final HLL hll = new HLL(log2m, regwidth, 128/*explicitThreshold, arbitrary, unused*/, sparseThreshold, HLLType.SPARSE);
 
-            final IntByteOpenHashMap map = new IntByteOpenHashMap();
+            final IntByteHashMap map = new IntByteHashMap();
 
             for(int i=0; i<sparseThreshold; i++) {
                 final long rawValue = RandomizedTest.randomLong();
@@ -423,7 +423,7 @@
     private static void assertRegisterPresent(final HLL hll,
                                               final int registerIndex,
                                               final int registerValue) {
-        final IntByteOpenHashMap sparseProbabilisticStorage = hll.sparseProbabilisticStorage;
+        final IntByteHashMap sparseProbabilisticStorage = hll.sparseProbabilisticStorage;
         assertEquals(sparseProbabilisticStorage.get(registerIndex), registerValue);
     }
 
@@ -433,7 +433,7 @@
     private static void assertOneRegisterSet(final HLL hll,
                                              final int registerIndex,
                                              final byte registerValue) {
-        final IntByteOpenHashMap sparseProbabilisticStorage = hll.sparseProbabilisticStorage;
+        final IntByteHashMap sparseProbabilisticStorage = hll.sparseProbabilisticStorage;
         assertEquals(sparseProbabilisticStorage.size(), 1);
         assertEquals(sparseProbabilisticStorage.get(registerIndex), registerValue);
     }
@@ -442,8 +442,8 @@
      * Asserts that all registers in the two {@link HLL} instances are identical.
      */
     private static void assertElementsEqual(final HLL hllA, final HLL hllB) {
-        final IntByteOpenHashMap sparseProbabilisticStorageA = hllA.sparseProbabilisticStorage;
-        final IntByteOpenHashMap sparseProbabilisticStorageB = hllB.sparseProbabilisticStorage;
+        final IntByteHashMap sparseProbabilisticStorageA = hllA.sparseProbabilisticStorage;
+        final IntByteHashMap sparseProbabilisticStorageB = hllB.sparseProbabilisticStorage;
         assertEquals(sparseProbabilisticStorageA.size(), sparseProbabilisticStorageB.size());
         for (IntByteCursor c : sparseProbabilisticStorageA) {
             assertEquals(sparseProbabilisticStorageA.get(c.key), 
diff --git a/solr/licenses/attributes-binder-1.2.1.jar.sha1 b/solr/licenses/attributes-binder-1.2.1.jar.sha1
deleted file mode 100644
index d848184..0000000
--- a/solr/licenses/attributes-binder-1.2.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-d597da840c4f706a1b0bcf55935c6c30c0fbb5f2
diff --git a/solr/licenses/attributes-binder-1.2.3.jar.sha1 b/solr/licenses/attributes-binder-1.2.3.jar.sha1
new file mode 100644
index 0000000..7433910
--- /dev/null
+++ b/solr/licenses/attributes-binder-1.2.3.jar.sha1
@@ -0,0 +1 @@
+4dd69fb0bac1148a408d88a0e0ef5b92edcee70f
diff --git a/solr/licenses/carrot2-guava-18.0.jar.sha1 b/solr/licenses/carrot2-guava-18.0.jar.sha1
new file mode 100644
index 0000000..ce50fe3
--- /dev/null
+++ b/solr/licenses/carrot2-guava-18.0.jar.sha1
@@ -0,0 +1 @@
+539317dc171b8c92cca964e87686602800cf19b0
diff --git a/solr/licenses/carrot2-guava-LICENSE-ASL.txt b/solr/licenses/carrot2-guava-LICENSE-ASL.txt
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/solr/licenses/carrot2-guava-LICENSE-ASL.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed 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.
diff --git a/solr/licenses/carrot2-guava-NOTICE.txt b/solr/licenses/carrot2-guava-NOTICE.txt
new file mode 100644
index 0000000..e87a0e1
--- /dev/null
+++ b/solr/licenses/carrot2-guava-NOTICE.txt
@@ -0,0 +1,5 @@
+This product includes software developed by
+Google, Inc. (http://code.google.com/p/guava-libraries/)
+
+Repacked Carrot2 Guava at:
+https://github.com/carrot2/lib-repackaged
\ No newline at end of file
diff --git a/solr/licenses/carrot2-mini-3.10.3.jar.sha1 b/solr/licenses/carrot2-mini-3.10.3.jar.sha1
new file mode 100644
index 0000000..8b5e180
--- /dev/null
+++ b/solr/licenses/carrot2-mini-3.10.3.jar.sha1
@@ -0,0 +1 @@
+49561bfc65428dff43b78d0c553b545a7dbd66fa
diff --git a/solr/licenses/carrot2-mini-3.9.0.jar.sha1 b/solr/licenses/carrot2-mini-3.9.0.jar.sha1
deleted file mode 100644
index 6698a97..0000000
--- a/solr/licenses/carrot2-mini-3.9.0.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-8eafc39444cd8d80802b2712d52ae751f3007cad
diff --git a/solr/licenses/hppc-0.5.2.jar.sha1 b/solr/licenses/hppc-0.5.2.jar.sha1
deleted file mode 100644
index 0557fa1..0000000
--- a/solr/licenses/hppc-0.5.2.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-074bcc9d152a928a4ea9ac59a5b45850bf00cd4e
diff --git a/solr/licenses/hppc-0.7.1.jar.sha1 b/solr/licenses/hppc-0.7.1.jar.sha1
new file mode 100644
index 0000000..d3e00e1
--- /dev/null
+++ b/solr/licenses/hppc-0.7.1.jar.sha1
@@ -0,0 +1 @@
+8b5057f74ea378c0150a1860874a3ebdcb713767
diff --git a/solr/licenses/morfologik-fsa-1.10.0.jar.sha1 b/solr/licenses/morfologik-fsa-1.10.0.jar.sha1
new file mode 100644
index 0000000..0831b2c
--- /dev/null
+++ b/solr/licenses/morfologik-fsa-1.10.0.jar.sha1
@@ -0,0 +1 @@
+87100c6baf60f096b42b9af06dafeb20f686cd02
diff --git a/solr/licenses/morfologik-fsa-1.7.1.jar.sha1 b/solr/licenses/morfologik-fsa-1.7.1.jar.sha1
deleted file mode 100644
index b71174e..0000000
--- a/solr/licenses/morfologik-fsa-1.7.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-fdf556c88d66f65440bd24024f55a52c227c0e3f
diff --git a/solr/licenses/morfologik-polish-1.10.0.jar.sha1 b/solr/licenses/morfologik-polish-1.10.0.jar.sha1
new file mode 100644
index 0000000..7e6a54e
--- /dev/null
+++ b/solr/licenses/morfologik-polish-1.10.0.jar.sha1
@@ -0,0 +1 @@
+0f8eeb58acb5a39e162c0d49fcf29a70744cc2bc
diff --git a/solr/licenses/morfologik-polish-1.7.1.jar.sha1 b/solr/licenses/morfologik-polish-1.7.1.jar.sha1
deleted file mode 100644
index 3bd0d88..0000000
--- a/solr/licenses/morfologik-polish-1.7.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-e03b9feb39f6e2c0ac7c37e220d01cdae66d3a28
diff --git a/solr/licenses/morfologik-stemming-1.10.0.jar.sha1 b/solr/licenses/morfologik-stemming-1.10.0.jar.sha1
new file mode 100644
index 0000000..e1459e0
--- /dev/null
+++ b/solr/licenses/morfologik-stemming-1.10.0.jar.sha1
@@ -0,0 +1 @@
+a74ad7ceb29ff1d8194eb161f5b2dfbd636626a5
diff --git a/solr/licenses/morfologik-stemming-1.7.1.jar.sha1 b/solr/licenses/morfologik-stemming-1.7.1.jar.sha1
deleted file mode 100644
index 3b53503..0000000
--- a/solr/licenses/morfologik-stemming-1.7.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c81d6c63e22e97819063cad7f1ecd20269cba720
diff --git a/solr/licenses/simple-xml-2.7.1.jar.sha1 b/solr/licenses/simple-xml-2.7.1.jar.sha1
new file mode 100644
index 0000000..d790fb4
--- /dev/null
+++ b/solr/licenses/simple-xml-2.7.1.jar.sha1
@@ -0,0 +1 @@
+dd91fb744c2ff921407475cb29a1e3fee397d411
diff --git a/solr/licenses/simple-xml-2.7.jar.sha1 b/solr/licenses/simple-xml-2.7.jar.sha1
deleted file mode 100644
index 117f50f..0000000
--- a/solr/licenses/simple-xml-2.7.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-48f90a787b2d59faab3b8c203945e4b0db32aec4