Index: build.xml
===================================================================
--- build.xml	(revision 1537002)
+++ build.xml	(working copy)
@@ -137,15 +137,9 @@
   <property name="maven-build-dir" value="maven-build"/>
   <property name="maven-version" value="2.2.1"/>
   
-  <target name="get-maven-poms"
+  <target name="get-maven-poms" depends="resolve"
           description="Copy Maven POMs from dev-tools/maven/ to maven-build/">
-    <copy todir="${maven-build-dir}" overwrite="true" encoding="UTF-8">
-      <fileset dir="${basedir}/dev-tools/maven"/>
-      <filterset begintoken="@" endtoken="@">
-        <filter token="version" value="${version}"/>
-      </filterset>
-      <globmapper from="*.template" to="*"/>
-    </copy>
+    <ant dir="lucene" target="-get-maven-poms" inheritall="false"/>
   </target>
 
   <target name="clean-maven-build"
@@ -471,4 +465,13 @@
   <!-- TODO: remove me when jenkins works -->
   <target name="regenerateAndCheck" depends="regenerate,-check-after-regeneration"/>
 
+  <target name="-append-all-modules-dependencies-properties">
+    <sequential>
+      <delete file="lucene/build/module.dependencies.properties"/>
+      <subant target="-append-module-dependencies-properties" inheritall="false" failonerror="true">
+        <fileset dir="lucene" includes="build.xml" />
+        <fileset dir="solr" includes="build.xml" />
+      </subant>
+    </sequential>
+  </target>
 </project>
Index: dev-tools/maven/lucene/analysis/common/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/analysis/common/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/analysis/common/pom.xml.template	(working copy)
@@ -44,16 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-analyzers-common.internal.dependencies@
+@lucene-analyzers-common.external.dependencies@
+@lucene-analyzers-common.internal.test.dependencies@
+@lucene-analyzers-common.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/analysis/icu/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/analysis/icu/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/analysis/icu/pom.xml.template	(working copy)
@@ -1,4 +1,4 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0"
+ <project xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <!--
@@ -49,23 +49,12 @@
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
       <groupId>${project.groupId}</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.ibm.icu</groupId>
-      <artifactId>icu4j</artifactId>
-    </dependency>
+@lucene-analyzers-icu.internal.dependencies@
+@lucene-analyzers-icu.external.dependencies@
+@lucene-analyzers-icu.internal.test.dependencies@
+@lucene-analyzers-icu.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/analysis/kuromoji/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/analysis/kuromoji/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/analysis/kuromoji/pom.xml.template	(working copy)
@@ -46,21 +46,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-analyzers-kuromoji.internal.dependencies@
+@lucene-analyzers-kuromoji.external.dependencies@
+@lucene-analyzers-kuromoji.internal.test.dependencies@
+@lucene-analyzers-kuromoji.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/analysis/morfologik/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/analysis/morfologik/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/analysis/morfologik/pom.xml.template	(working copy)
@@ -46,25 +46,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.carrot2</groupId>
-      <artifactId>morfologik-polish</artifactId>
-    </dependency>
+@lucene-analyzers-morfologik.internal.dependencies@
+@lucene-analyzers-morfologik.external.dependencies@
+@lucene-analyzers-morfologik.internal.test.dependencies@
+@lucene-analyzers-morfologik.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/analysis/phonetic/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/analysis/phonetic/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/analysis/phonetic/pom.xml.template	(working copy)
@@ -46,25 +46,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-    </dependency>
+@lucene-analyzers-phonetic.internal.dependencies@
+@lucene-analyzers-phonetic.external.dependencies@
+@lucene-analyzers-phonetic.internal.test.dependencies@
+@lucene-analyzers-phonetic.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/analysis/smartcn/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/analysis/smartcn/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/analysis/smartcn/pom.xml.template	(working copy)
@@ -44,21 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-analyzers-smartcn.internal.dependencies@
+@lucene-analyzers-smartcn.external.dependencies@
+@lucene-analyzers-smartcn.internal.test.dependencies@
+@lucene-analyzers-smartcn.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/analysis/stempel/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/analysis/stempel/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/analysis/stempel/pom.xml.template	(working copy)
@@ -44,21 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-analyzers-stempel.internal.dependencies@
+@lucene-analyzers-stempel.external.dependencies@
+@lucene-analyzers-stempel.internal.test.dependencies@
+@lucene-analyzers-stempel.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/analysis/uima/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/analysis/uima/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/analysis/uima/pom.xml.template	(working copy)
@@ -48,33 +48,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>Tagger</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>WhitespaceTokenizer</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>uimaj-core</artifactId>
-    </dependency>
+@lucene-analyzers-uima.internal.dependencies@
+@lucene-analyzers-uima.external.dependencies@
+@lucene-analyzers-uima.internal.test.dependencies@
+@lucene-analyzers-uima.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/benchmark/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/benchmark/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/benchmark/pom.xml.template	(working copy)
@@ -44,69 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-highlighter</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-memory</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-queryparser</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-facet</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-spatial</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.ibm.icu</groupId>
-      <artifactId>icu4j</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>net.sourceforge.nekohtml</groupId>
-      <artifactId>nekohtml</artifactId>
-      <version>1.9.17</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-compress</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>org.tukaani</groupId>
-          <artifactId>xz</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-    </dependency>
+@lucene-benchmark.internal.dependencies@
+@lucene-benchmark.external.dependencies@
+@lucene-benchmark.internal.test.dependencies@
+@lucene-benchmark.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/classification/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/classification/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/classification/pom.xml.template	(working copy)
@@ -44,27 +44,14 @@
   <dependencies>
     <dependency>
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-queries</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
+@lucene-classification.internal.dependencies@
+@lucene-classification.external.dependencies@
+@lucene-classification.internal.test.dependencies@
+@lucene-classification.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/codecs/src/java/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/codecs/src/java/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/codecs/src/java/pom.xml.template	(working copy)
@@ -44,11 +44,8 @@
     <url>${vc-browse-base-url}/${module-directory}</url>
   </scm>
   <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-codecs.internal.dependencies@
+@lucene-codecs.external.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}</sourceDirectory>
Index: dev-tools/maven/lucene/codecs/src/test/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/codecs/src/test/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/codecs/src/test/pom.xml.template	(working copy)
@@ -40,15 +40,15 @@
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-codecs</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
+@lucene-codecs.internal.test.dependencies@
+@lucene-codecs.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory/>
Index: dev-tools/maven/lucene/core/src/test/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/core/src/test/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/core/src/test/pom.xml.template	(working copy)
@@ -40,25 +40,15 @@
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.ant</groupId>
-      <artifactId>ant</artifactId>
-      <scope>test</scope>
-    </dependency>
+@lucene-core.internal.test.dependencies@
+@lucene-core.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory/>
Index: dev-tools/maven/lucene/demo/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/demo/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/demo/pom.xml.template	(working copy)
@@ -44,36 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-facet</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-queryparser</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>provided</scope>
-    </dependency>
+@lucene-demo.internal.dependencies@
+@lucene-demo.external.dependencies@
+@lucene-demo.internal.test.dependencies@
+@lucene-demo.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/expressions/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/expressions/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/expressions/pom.xml.template	(working copy)
@@ -41,33 +41,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.antlr</groupId>
-      <artifactId>antlr-runtime</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.ow2.asm</groupId>
-      <artifactId>asm</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.ow2.asm</groupId>
-      <artifactId>asm-commons</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-queries</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-expressions.internal.dependencies@
+@lucene-expressions.external.dependencies@
+@lucene-expressions.internal.test.dependencies@
+@lucene-expressions.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/facet/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/facet/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/facet/pom.xml.template	(working copy)
@@ -46,21 +46,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-facet.internal.dependencies@
+@lucene-facet.external.dependencies@
+@lucene-facet.internal.test.dependencies@
+@lucene-facet.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/grouping/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/grouping/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/grouping/pom.xml.template	(working copy)
@@ -44,21 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-queries</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-grouping.internal.dependencies@
+@lucene-grouping.external.dependencies@
+@lucene-grouping.internal.test.dependencies@
+@lucene-grouping.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/highlighter/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/highlighter/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/highlighter/pom.xml.template	(working copy)
@@ -46,26 +46,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-memory</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-queries</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-highlighter.internal.dependencies@
+@lucene-highlighter.external.dependencies@
+@lucene-highlighter.internal.test.dependencies@
+@lucene-highlighter.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/join/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/join/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/join/pom.xml.template	(working copy)
@@ -44,21 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-grouping</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-join.internal.dependencies@
+@lucene-join.external.dependencies@
+@lucene-join.internal.test.dependencies@
+@lucene-join.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/memory/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/memory/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/memory/pom.xml.template	(working copy)
@@ -46,22 +46,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-queryparser</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
-    </dependency>
+@lucene-memory.internal.dependencies@
+@lucene-memory.external.dependencies@
+@lucene-memory.internal.test.dependencies@
+@lucene-memory.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/misc/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/misc/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/misc/pom.xml.template	(working copy)
@@ -44,16 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
-      <scope>test</scope>
+     <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-misc.internal.dependencies@
+@lucene-misc.external.dependencies@
+@lucene-misc.internal.test.dependencies@
+@lucene-misc.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/queries/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/queries/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/queries/pom.xml.template	(working copy)
@@ -44,16 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-queries.internal.dependencies@
+@lucene-queries.external.dependencies@
+@lucene-queries.internal.test.dependencies@
+@lucene-queries.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/queryparser/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/queryparser/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/queryparser/pom.xml.template	(working copy)
@@ -44,26 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-queries</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-sandbox</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-queryparser.internal.dependencies@
+@lucene-queryparser.external.dependencies@
+@lucene-queryparser.internal.test.dependencies@
+@lucene-queryparser.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/replicator/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/replicator/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/replicator/pom.xml.template	(working copy)
@@ -44,43 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-facet</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>org.eclipse.jetty</groupId>
-          <artifactId>jetty-security</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-    </dependency>
+@lucene-replicator.internal.dependencies@
+@lucene-replicator.external.dependencies@
+@lucene-replicator.internal.test.dependencies@
+@lucene-replicator.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/sandbox/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/sandbox/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/sandbox/pom.xml.template	(working copy)
@@ -44,20 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>jakarta-regexp</groupId>
-      <artifactId>jakarta-regexp</artifactId>
-    </dependency>
+@lucene-sandbox.internal.dependencies@
+@lucene-sandbox.external.dependencies@
+@lucene-sandbox.internal.test.dependencies@
+@lucene-sandbox.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/spatial/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/spatial/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/spatial/pom.xml.template	(working copy)
@@ -41,25 +41,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>com.spatial4j</groupId>
-      <artifactId>spatial4j</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-queries</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-spatial.internal.dependencies@
+@lucene-spatial.external.dependencies@
+@lucene-spatial.internal.test.dependencies@
+@lucene-spatial.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/suggest/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/suggest/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/suggest/pom.xml.template	(working copy)
@@ -44,36 +44,14 @@
   <dependencies>
     <dependency> 
       <!-- lucene-test-framework dependency must be declared before lucene-core -->
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-misc</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-expressions</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-queries</artifactId>
-      <version>${project.version}</version>
-    </dependency>
+@lucene-suggest.internal.dependencies@
+@lucene-suggest.external.dependencies@
+@lucene-suggest.internal.test.dependencies@
+@lucene-suggest.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/lucene/test-framework/pom.xml.template
===================================================================
--- dev-tools/maven/lucene/test-framework/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/lucene/test-framework/pom.xml.template	(working copy)
@@ -42,24 +42,10 @@
     <url>${vc-browse-base-url}/${module-directory}</url>
   </scm>
   <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>lucene-codecs</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.carrotsearch.randomizedtesting</groupId>
-      <artifactId>randomizedtesting-runner</artifactId>
-    </dependency>
+@lucene-test-framework.internal.dependencies@
+@lucene-test-framework.external.dependencies@
+@lucene-test-framework.internal.test.dependencies@
+@lucene-test-framework.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/pom.xml.template
===================================================================
--- dev-tools/maven/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/pom.xml.template	(working copy)
@@ -45,13 +45,6 @@
     <maven.build.timestamp.format>yyyy-MM-dd HH:mm:ss</maven.build.timestamp.format>
     <java.compat.version>1.7</java.compat.version>
     <jetty.version>8.1.10.v20130312</jetty.version>
-    <slf4j.version>1.6.6</slf4j.version>
-    <log4j.version>1.2.16</log4j.version>
-    <tika.version>1.4</tika.version>
-    <httpcomponents.version>4.2.6</httpcomponents.version>
-    <commons-io.version>2.1</commons-io.version>
-    <restlet.version>2.1.1</restlet.version>
-    <hadoop.version>2.2.0</hadoop.version>
 
     <!-- RandomizedTesting library system properties -->
     <tests.iters>1</tests.iters>
@@ -142,422 +135,7 @@
   </repositories>
   <dependencyManagement>
     <dependencies>
-      <dependency>
-        <groupId>com.ibm.icu</groupId>
-        <artifactId>icu4j</artifactId>
-        <version>49.1</version>
-      </dependency>
-      <dependency>
-        <groupId>com.google.guava</groupId>
-        <artifactId>guava</artifactId>
-        <version>14.0.1</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-codec</groupId>
-        <artifactId>commons-codec</artifactId>
-        <version>1.7</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-cli</groupId>
-        <artifactId>commons-cli</artifactId>
-        <version>1.2</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-digester</groupId>
-        <artifactId>commons-digester</artifactId>
-        <version>1.7</version>
-        <exclusions>
-          <exclusion>
-            <groupId>xml-apis</groupId>
-            <artifactId>xml-apis</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>commons-fileupload</groupId>
-        <artifactId>commons-fileupload</artifactId>
-        <version>1.2.1</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-io</groupId>
-        <artifactId>commons-io</artifactId>
-        <version>${commons-io.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>joda-time</groupId>
-        <artifactId>joda-time</artifactId>
-        <version>2.2</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.httpcomponents</groupId>
-        <artifactId>httpclient</artifactId>
-        <version>${httpcomponents.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.httpcomponents</groupId>
-        <artifactId>httpmime</artifactId>
-        <version>${httpcomponents.version}</version>
-        <exclusions>
-          <exclusion>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>org.noggit</groupId>
-        <artifactId>noggit</artifactId>
-        <version>0.5</version>
-      </dependency>
-      <dependency>
-        <groupId>com.googlecode.concurrentlinkedhashmap</groupId>
-        <artifactId>concurrentlinkedhashmap-lru</artifactId>
-        <version>1.2</version>
-      </dependency>
-      <dependency>
-        <groupId>com.sun.jersey</groupId>
-        <artifactId>jersey-core</artifactId>
-        <version>1.16</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-lang</groupId>
-        <artifactId>commons-lang</artifactId>
-        <version>2.6</version>
-      </dependency>
-      <dependency>
-        <groupId>commons-logging</groupId>
-        <artifactId>commons-logging</artifactId>
-        <version>1.1.1</version>
-      </dependency>
-      <dependency>
-        <groupId>hsqldb</groupId>
-        <artifactId>hsqldb</artifactId>
-        <version>1.8.0.10</version>
-      </dependency>
-      <dependency>
-        <groupId>jakarta-regexp</groupId>
-        <artifactId>jakarta-regexp</artifactId>
-        <version>1.4</version>
-      </dependency>
-      <dependency>
-        <groupId>javax.activation</groupId>
-        <artifactId>activation</artifactId>
-        <version>1.1</version>
-      </dependency>
-      <dependency>
-        <groupId>javax.mail</groupId>
-        <artifactId>mail</artifactId>
-        <version>1.4.1</version>
-      </dependency>
-      <dependency>
-        <groupId>jline</groupId>
-        <artifactId>jline</artifactId>
-        <version>0.9.1</version>
-      </dependency>
-      <dependency>
-        <groupId>junit</groupId>
-        <artifactId>junit</artifactId>
-        <version>4.10</version>
-        <exclusions>
-          <exclusion>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest-core</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>org.antlr</groupId>
-        <artifactId>antlr-runtime</artifactId>
-        <version>3.5</version>
-        <!-- these are dependencies to compile antlr-runtime itself -->
-        <exclusions>
-          <exclusion>
-            <groupId>antlr</groupId>
-            <artifactId>antlr</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>org.antlr</groupId>
-            <artifactId>stringtemplate</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>org.ow2.asm</groupId>
-        <artifactId>asm</artifactId>
-        <version>4.1</version>
-      </dependency>
-      <dependency>
-        <groupId>org.ow2.asm</groupId>
-        <artifactId>asm-commons</artifactId>
-        <version>4.1</version>
-        <exclusions>
-          <exclusion>
-            <groupId>org.ow2.asm</groupId>
-            <artifactId>asm-tree</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.ant</groupId>
-        <artifactId>ant</artifactId>
-        <version>1.8.2</version>
-        <exclusions>
-          <exclusion>
-            <groupId>org.apache.ant</groupId>
-            <artifactId>ant-launcher</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-compress</artifactId>
-        <version>1.4.1</version>
-      </dependency>
-      <dependency>
-        <groupId>net.arnx</groupId>
-        <artifactId>jsonic</artifactId>
-        <version>1.2.7</version>
-      </dependency>
-      <dependency>
-        <groupId>com.cybozu.labs</groupId>
-        <artifactId>langdetect</artifactId>
-        <version>1.1-20120112</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.derby</groupId>
-        <artifactId>derby</artifactId>
-        <version>10.9.1.0</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.hadoop</groupId>
-        <artifactId>hadoop-annotations</artifactId>
-        <version>${hadoop.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.hadoop</groupId>
-        <artifactId>hadoop-auth</artifactId>
-        <version>${hadoop.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.hadoop</groupId>
-        <artifactId>hadoop-common</artifactId>
-        <version>${hadoop.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.hadoop</groupId>
-        <artifactId>hadoop-common</artifactId>
-        <version>${hadoop.version}</version>
-        <classifier>tests</classifier>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.hadoop</groupId>
-        <artifactId>hadoop-hdfs</artifactId>
-        <version>${hadoop.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.hadoop</groupId>
-        <artifactId>hadoop-hdfs</artifactId>
-        <version>${hadoop.version}</version>
-        <classifier>tests</classifier>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.tika</groupId>
-        <artifactId>tika-core</artifactId>
-        <version>${tika.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.tika</groupId>
-        <artifactId>tika-parsers</artifactId>
-        <version>${tika.version}</version>
-        <exclusions>
-          <exclusion>
-            <groupId>com.adobe.xmp</groupId>
-            <artifactId>xmpcore</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>commons-logging</groupId>
-            <artifactId>commons-logging</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>org.apache.geronimo.specs</groupId>
-            <artifactId>geronimo-stax-api_1.0_spec</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>org.gagravarr</groupId>
-            <artifactId>vorbis-java-core</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>org.ow2.asm</groupId>
-            <artifactId>asm-debug-all</artifactId>
-          </exclusion>
-          <exclusion>
-            <groupId>org.aspectj</groupId>
-            <artifactId>aspectjrt</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.uima</groupId>
-        <artifactId>AlchemyAPIAnnotator</artifactId>
-        <version>2.3.1</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.uima</groupId>
-        <artifactId>OpenCalaisAnnotator</artifactId>
-        <version>2.3.1</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.uima</groupId>
-        <artifactId>Tagger</artifactId>
-        <version>2.3.1</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.uima</groupId>
-        <artifactId>WhitespaceTokenizer</artifactId>
-        <version>2.3.1</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.uima</groupId>
-        <artifactId>uimaj-core</artifactId>
-        <version>2.3.1</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.velocity</groupId>
-        <artifactId>velocity</artifactId>
-        <version>1.7</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.velocity</groupId>
-        <artifactId>velocity-tools</artifactId>
-        <version>2.0</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.zookeeper</groupId>
-        <artifactId>zookeeper</artifactId>
-        <version>3.4.5</version>
-      </dependency>
-      <dependency>
-        <groupId>org.carrot2</groupId>
-        <artifactId>carrot2-mini</artifactId>
-        <version>3.8.0</version>
-      </dependency>
-      <dependency>
-        <groupId>org.carrot2</groupId>
-        <artifactId>morfologik-polish</artifactId>
-        <version>1.7.1</version>
-      </dependency>
-      <dependency>
-        <groupId>org.codehaus.woodstox</groupId>
-        <artifactId>wstx-asl</artifactId>
-        <version>3.2.7</version>
-      </dependency>
-      <dependency>
-        <groupId>org.easymock</groupId>
-        <artifactId>easymock</artifactId>
-        <version>3.0</version>
-        <scope>test</scope>
-      </dependency>
-      <dependency>
-        <groupId>org.eclipse.jetty</groupId>
-        <artifactId>jetty-server</artifactId>
-        <version>${jetty.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.eclipse.jetty</groupId>
-        <artifactId>jetty-servlet</artifactId>
-        <version>${jetty.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.eclipse.jetty</groupId>
-        <artifactId>jetty-util</artifactId>
-        <version>${jetty.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.eclipse.jetty</groupId>
-        <artifactId>jetty-webapp</artifactId>
-        <version>${jetty.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.mortbay.jetty</groupId>
-        <artifactId>jetty</artifactId>
-        <version>6.1.26</version>
-      </dependency>
-      <dependency>
-        <groupId>org.mortbay.jetty</groupId>
-        <artifactId>jetty-util</artifactId>
-        <version>6.1.26</version>
-      </dependency>
-      <dependency>
-        <groupId>org.restlet.jee</groupId>
-        <artifactId>org.restlet</artifactId>
-        <version>${restlet.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.restlet.jee</groupId>
-        <artifactId>org.restlet.ext.servlet</artifactId>
-        <version>${restlet.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.slf4j</groupId>
-        <artifactId>jcl-over-slf4j</artifactId>
-        <version>${slf4j.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.slf4j</groupId>
-        <artifactId>jul-to-slf4j</artifactId>
-        <version>${slf4j.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.slf4j</groupId>
-        <artifactId>slf4j-api</artifactId>
-        <version>${slf4j.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.slf4j</groupId>
-        <artifactId>slf4j-log4j12</artifactId>
-        <version>${slf4j.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>log4j</groupId>
-        <artifactId>log4j</artifactId>
-        <version>${log4j.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.eclipse.jetty.orbit</groupId>
-        <artifactId>javax.servlet</artifactId>
-        <version>3.0.0.v201112011016</version>
-      </dependency>
-      <dependency>
-        <groupId>javax.servlet</groupId>
-        <artifactId>servlet-api</artifactId>
-        <version>2.4</version>
-      </dependency>
-      <dependency>
-        <groupId>com.spatial4j</groupId>
-        <artifactId>spatial4j</artifactId>
-        <version>0.3</version>
-      </dependency>
-      <dependency>
-        <groupId>xerces</groupId>
-        <artifactId>xercesImpl</artifactId>
-        <version>2.9.1</version>
-        <exclusions>
-          <exclusion>
-            <groupId>xml-apis</groupId>
-            <artifactId>xml-apis</artifactId>
-          </exclusion>
-        </exclusions>
-      </dependency>
-      <dependency>
-        <groupId>com.carrotsearch.randomizedtesting</groupId>
-        <artifactId>randomizedtesting-runner</artifactId>
-        <version>2.0.10</version>
-      </dependency>
-      <dependency>
-        <groupId>com.carrotsearch</groupId>
-        <artifactId>hppc</artifactId>
-        <version>0.5.2</version>
-      </dependency>
+@lucene.solr.dependency.management@
     </dependencies>
   </dependencyManagement>
   <prerequisites>
@@ -565,16 +143,15 @@
   </prerequisites>
   <dependencies>
     <dependency> 
-      <!-- Maven 2.2.X has a bug that omits as duplicate all JUnit         -->
-      <!-- dependencies from the classpath when compiling solr-clustering, -->
-      <!-- causing test compilation to fail.  Maven 3.0.4 test compilation -->
-      <!-- succeeds with the exact same dependencies, so apparently the    -->
-      <!-- bug has been fixed.  This dependency can be removed when the    -->
-      <!-- minimum Maven version is upgraded to 3.0.4+.                    -->
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>com.carrotsearch.randomizedtesting</groupId>
+      <artifactId>randomizedtesting-runner</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
   <build>
     <pluginManagement>
Index: dev-tools/maven/solr/contrib/analysis-extras/pom.xml.template
===================================================================
--- dev-tools/maven/solr/contrib/analysis-extras/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/contrib/analysis-extras/pom.xml.template	(working copy)
@@ -48,31 +48,17 @@
       <!-- dependencies are always ordered before inherited dependencies.       -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-analyzers-icu</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <!-- SOLR-3263: Test scope dep is required to avoid jar signing conflicts -->
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>test</scope>
-    </dependency>
+@solr-analysis-extras.internal.dependencies@
+@solr-analysis-extras.external.dependencies@
+@solr-analysis-extras.internal.test.dependencies@
+@solr-analysis-extras.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/solr/contrib/clustering/pom.xml.template
===================================================================
--- dev-tools/maven/solr/contrib/clustering/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/contrib/clustering/pom.xml.template	(working copy)
@@ -48,42 +48,17 @@
       <!-- dependencies are always ordered before inherited dependencies.       -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.carrot2</groupId>
-      <artifactId>carrot2-mini</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>jfree</groupId>
-          <artifactId>jcommon</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.commons</groupId>
-          <artifactId>commons-math</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.uncommons.maths</groupId>
-          <artifactId>uncommons-maths</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>xpp3</groupId>
-          <artifactId>xpp3</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
+@solr-clustering.internal.dependencies@
+@solr-clustering.external.dependencies@
+@solr-clustering.internal.test.dependencies@
+@solr-clustering.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/solr/contrib/dataimporthandler/pom.xml.template
===================================================================
--- dev-tools/maven/solr/contrib/dataimporthandler/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/contrib/dataimporthandler/pom.xml.template	(working copy)
@@ -48,35 +48,17 @@
       <!-- dependencies are always ordered before inherited dependencies.       -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>hsqldb</groupId>
-      <artifactId>hsqldb</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.derby</groupId>
-      <artifactId>derby</artifactId>
-      <scope>test</scope>
-    </dependency>
+@solr-dataimporthandler.internal.dependencies@
+@solr-dataimporthandler.external.dependencies@
+@solr-dataimporthandler.internal.test.dependencies@
+@solr-dataimporthandler.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/solr/contrib/dataimporthandler-extras/pom.xml.template
===================================================================
--- dev-tools/maven/solr/contrib/dataimporthandler-extras/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/contrib/dataimporthandler-extras/pom.xml.template	(working copy)
@@ -48,44 +48,24 @@
       <!-- dependencies are always ordered before inherited dependencies.       -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-dataimporthandler</artifactId>
       <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-dataimporthandler</artifactId>
-      <version>${project.version}</version>
       <type>test-jar</type>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>javax.activation</groupId>
-      <artifactId>activation</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>javax.mail</groupId>
-      <artifactId>mail</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tika</groupId>
-      <artifactId>tika-parsers</artifactId>
-    </dependency>
+@solr-dataimporthandler-extras.internal.dependencies@
+@solr-dataimporthandler-extras.external.dependencies@
+@solr-dataimporthandler-extras.internal.test.dependencies@
+@solr-dataimporthandler-extras.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/solr/contrib/extraction/pom.xml.template
===================================================================
--- dev-tools/maven/solr/contrib/extraction/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/contrib/extraction/pom.xml.template	(working copy)
@@ -51,38 +51,17 @@
       <!-- dependencies are always ordered before inherited dependencies.       -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>com.ibm.icu</groupId>
-      <artifactId>icu4j</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tika</groupId>
-      <artifactId>tika-parsers</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>xerces</groupId>
-      <artifactId>xercesImpl</artifactId>
-    </dependency>
-    <dependency>
-      <!-- SOLR-3263: Test scope dep is required to avoid jar signing conflicts -->
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>test</scope>
-    </dependency>
+@solr-extraction.internal.dependencies@
+@solr-extraction.external.dependencies@
+@solr-extraction.internal.test.dependencies@
+@solr-extraction.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/solr/contrib/langid/pom.xml.template
===================================================================
--- dev-tools/maven/solr/contrib/langid/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/contrib/langid/pom.xml.template	(working copy)
@@ -52,38 +52,17 @@
       <!-- dependencies are always ordered before inherited dependencies.       -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>net.arnx</groupId>
-      <artifactId>jsonic</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.cybozu.labs</groupId>
-      <artifactId>langdetect</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.tika</groupId>
-      <artifactId>tika-parsers</artifactId>
-    </dependency>
-    <dependency>
-      <!-- SOLR-3263: Test scope dep is required to avoid jar signing conflicts -->
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>test</scope>
-    </dependency>
+@solr-langid.internal.dependencies@
+@solr-langid.external.dependencies@
+@solr-langid.internal.test.dependencies@
+@solr-langid.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/solr/contrib/uima/pom.xml.template
===================================================================
--- dev-tools/maven/solr/contrib/uima/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/contrib/uima/pom.xml.template	(working copy)
@@ -48,61 +48,17 @@
       <!-- dependencies are always ordered before inherited dependencies.       -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-analyzers-uima</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>AlchemyAPIAnnotator</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>commons-digester</groupId>
-          <artifactId>commons-digester</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>OpenCalaisAnnotator</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>Tagger</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>WhitespaceTokenizer</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.uima</groupId>
-      <artifactId>uimaj-core</artifactId>
-    </dependency>
-    <dependency>
-      <!-- SOLR-3263: Test scope dep is required to avoid jar signing conflicts -->
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>test</scope>
-    </dependency>
+@solr-uima.internal.dependencies@
+@solr-uima.external.dependencies@
+@solr-uima.internal.test.dependencies@
+@solr-uima.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/solr/contrib/velocity/pom.xml.template
===================================================================
--- dev-tools/maven/solr/contrib/velocity/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/contrib/velocity/pom.xml.template	(working copy)
@@ -48,82 +48,17 @@
       <!-- dependencies are always ordered before inherited dependencies.       -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.velocity</groupId>
-      <artifactId>velocity</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>oro</groupId>
-          <artifactId>oro</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.velocity</groupId>
-      <artifactId>velocity-tools</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>commons-chain</groupId>
-          <artifactId>commons-chain</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-digester</groupId>
-          <artifactId>commons-digester</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-validator</groupId>
-          <artifactId>commons-validator</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>dom4j</groupId>
-          <artifactId>dom4j</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>oro</groupId>
-          <artifactId>oro</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>sslext</groupId>
-          <artifactId>sslext</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.struts</groupId>
-          <artifactId>struts-core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.struts</groupId>
-          <artifactId>struts-taglib</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.struts</groupId>
-          <artifactId>struts-tiles</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <!-- SOLR-3263: Test scope dep is required to avoid jar signing conflicts -->
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <scope>test</scope>
-    </dependency>
+@solr-velocity.internal.dependencies@
+@solr-velocity.external.dependencies@
+@solr-velocity.internal.test.dependencies@
+@solr-velocity.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
Index: dev-tools/maven/solr/core/src/java/pom.xml.template
===================================================================
--- dev-tools/maven/solr/core/src/java/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/core/src/java/pom.xml.template	(working copy)
@@ -42,344 +42,8 @@
     <url>${vc-browse-base-url}/${module-directory}</url>
   </scm>
   <dependencies>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-solrj</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-codecs</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-analyzers-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-analyzers-kuromoji</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-analyzers-morfologik</artifactId>
-      <version>${project.version}</version>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-analyzers-phonetic</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-highlighter</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-memory</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-misc</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-join</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-queryparser</artifactId>
-      <version>${project.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.apache.lucene</groupId>
-          <artifactId>lucene-sandbox</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-spatial</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-suggest</artifactId>
-      <version>${project.version}</version>
-      <exclusions>
-        <exclusion>
-          <groupId>org.apache.lucene</groupId>
-          <artifactId>lucene-expressions</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-grouping</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.lucene</groupId>
-      <artifactId>lucene-queries</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.carrotsearch</groupId>
-      <artifactId>hppc</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.googlecode.concurrentlinkedhashmap</groupId>
-      <artifactId>concurrentlinkedhashmap-lru</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-cli</groupId>
-      <artifactId>commons-cli</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-fileupload</groupId>
-      <artifactId>commons-fileupload</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>joda-time</groupId>
-      <artifactId>joda-time</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-annotations</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-auth</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-common</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>javax.servlet</groupId>
-          <artifactId>servlet-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.servlet.jsp</groupId>
-          <artifactId>jsp-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.commons</groupId>
-          <artifactId>commons-math</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>xmlenc</groupId>
-          <artifactId>xmlenc</artifactId>                                  
-        </exclusion>
-        <exclusion>
-          <groupId>commons-configuration</groupId>
-          <artifactId>commons-configuration</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-httpclient</groupId>
-          <artifactId>commons-httpclient</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-net</groupId>
-          <artifactId>commons-net</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jersey</groupId>
-          <artifactId>jersey-core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jersey</groupId>
-          <artifactId>jersey-json</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jersey</groupId>
-          <artifactId>jersey-server</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.mortbay.jetty</groupId>
-          <artifactId>jetty</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.mortbay.jetty</groupId>
-          <artifactId>jetty-util</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>tomcat</groupId>
-          <artifactId>jasper-compiler</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>tomcat</groupId>
-          <artifactId>jasper-runtime</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-el</groupId>
-          <artifactId>commons-el</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>net.java.dev.jets3t</groupId>
-          <artifactId>jets3t</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-digester</groupId>
-          <artifactId>commons-digester</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-beanutils</groupId>
-          <artifactId>commons-beanutils-core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-core-asl</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-mapper-asl</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.avro</groupId>
-          <artifactId>avro</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>net.sf.kosmosfs</groupId>
-          <artifactId>kfs</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.jcraft</groupId>
-          <artifactId>jsch</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-hdfs</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>javax.servlet</groupId>
-          <artifactId>servlet-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>javax.servlet.jsp</groupId>
-          <artifactId>jsp-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jersey</groupId>
-          <artifactId>jersey-core</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jersey</groupId>
-          <artifactId>jersey-server</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-core-asl</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-mapper-asl</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.mortbay.jetty</groupId>
-          <artifactId>jetty</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.mortbay.jetty</groupId>
-          <artifactId>jetty-util</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>tomcat</groupId>
-          <artifactId>jasper-runtime</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>xmlenc</groupId>
-          <artifactId>xmlenc</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-daemon</groupId>
-          <artifactId>commons-daemon</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.restlet.jee</groupId>
-      <artifactId>org.restlet</artifactId>
-      <version>${restlet.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.restlet.jee</groupId>
-      <artifactId>org.restlet.ext.servlet</artifactId>
-      <version>${restlet.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-server</artifactId>
-      <optional>true</optional> <!-- Only used for tests and one command-line utility: JettySolrRunner -->
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <optional>true</optional> <!-- Only used for tests and one command-line utility: JettySolrRunner -->
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-webapp</artifactId>
-      <optional>true</optional> <!-- Only used for tests and one command-line utility: JettySolrRunner -->
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <!-- SOLR-3263: Provided scope is required to avoid jar signing conflicts -->
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpmime</artifactId>
-    </dependency>
+@solr-core.internal.dependencies@
+@solr-core.external.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}</sourceDirectory>
@@ -420,7 +84,7 @@
               <bundledSignatures>
                 <bundledSignature>jdk-unsafe</bundledSignature>
                 <bundledSignature>jdk-deprecated</bundledSignature>
-                <bundledSignature>commons-io-unsafe-${commons-io.version}</bundledSignature>
+                <bundledSignature>commons-io-unsafe-@commons-io:commons-io.version@</bundledSignature>
               </bundledSignatures>
               <signaturesFiles>
                 <signaturesFile>${top-level}/lucene/tools/forbiddenApis/base.txt</signaturesFile>
Index: dev-tools/maven/solr/core/src/test/pom.xml.template
===================================================================
--- dev-tools/maven/solr/core/src/test/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/core/src/test/pom.xml.template	(working copy)
@@ -42,168 +42,20 @@
       <!-- dependencies are always ordered before inherited dependencies.       -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.easymock</groupId>
-      <artifactId>easymock</artifactId>
+      <groupId>org.apache.solr</groupId>
+      <artifactId>solr-core</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-common</artifactId>
-      <classifier>tests</classifier>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>javax.servlet</groupId>
-          <artifactId>servlet-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.commons</groupId>
-          <artifactId>commons-math</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>xmlenc</groupId>
-          <artifactId>xmlenc</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-httpclient</groupId>
-          <artifactId>commons-httpclient</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-net</groupId>
-          <artifactId>commons-net</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jersey</groupId>
-          <artifactId>jersey-json</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jersey</groupId>
-          <artifactId>jersey-server</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>tomcat</groupId>
-          <artifactId>jasper-compiler</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>tomcat</groupId>
-          <artifactId>jasper-runtime</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-el</groupId>
-          <artifactId>commons-el</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>net.java.dev.jets3t</groupId>
-          <artifactId>jets3t</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-digester</groupId>
-          <artifactId>commons-digester</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-core-asl</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-mapper-asl</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.apache.avro</groupId>
-          <artifactId>avro</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>net.sf.kosmosfs</groupId>
-          <artifactId>kfs</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.jcraft</groupId>
-          <artifactId>jsch</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-beanutils</groupId>
-          <artifactId>commons-beanutils-core</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.hadoop</groupId>
-      <artifactId>hadoop-hdfs</artifactId>
-      <classifier>tests</classifier>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>javax.servlet</groupId>
-          <artifactId>servlet-api</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jersey</groupId>
-          <artifactId>jersey-server</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-core-asl</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.codehaus.jackson</groupId>
-          <artifactId>jackson-mapper-asl</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>tomcat</groupId>
-          <artifactId>jasper-runtime</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>xmlenc</groupId>
-          <artifactId>xmlenc</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>commons-daemon</groupId>
-          <artifactId>commons-daemon</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-
-    <!-- Jetty 6 required for Hadoop DfsMiniCluster -->
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jetty</artifactId>
-      <scope>test</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>org.mortbay.jetty</groupId>
-          <artifactId>servlet-api</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.mortbay.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>dom4j</groupId>
-      <artifactId>dom4j</artifactId>
-      <version>1.6.1</version>
-      <scope>test</scope>
-    </dependency>
+@solr-core.internal.test.dependencies@
+@solr-core.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory/>
@@ -281,7 +133,7 @@
               <bundledSignatures>
                 <bundledSignature>jdk-unsafe</bundledSignature>
                 <bundledSignature>jdk-deprecated</bundledSignature>
-                <bundledSignature>commons-io-unsafe-${commons-io.version}</bundledSignature>
+                <bundledSignature>commons-io-unsafe-@commons-io:commons-io.version@</bundledSignature>
               </bundledSignatures>
               <signaturesFiles>
                 <signaturesFile>${top-level}/lucene/tools/forbiddenApis/base.txt</signaturesFile>
Index: dev-tools/maven/solr/pom.xml.template
===================================================================
--- dev-tools/maven/solr/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/pom.xml.template	(working copy)
@@ -82,33 +82,6 @@
       <url>http://maven.restlet.org</url>
     </repository>
   </repositories>
-  <dependencies>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>jcl-over-slf4j</artifactId>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>jul-to-slf4j</artifactId>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-api</artifactId>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>org.slf4j</groupId>
-      <artifactId>slf4j-log4j12</artifactId>
-      <optional>true</optional>
-    </dependency>
-    <dependency>
-      <groupId>log4j</groupId>
-      <artifactId>log4j</artifactId>
-      <optional>true</optional>
-    </dependency>
-  </dependencies>
   <build>
     <pluginManagement>
       <plugins>
@@ -164,7 +137,7 @@
                 <bundledSignature>jdk-unsafe</bundledSignature>
                 <bundledSignature>jdk-deprecated</bundledSignature>
                 <!-- Include commons-io-unsafe only in those modules with commons-io on their classpath -->
-                <!-- <bundledSignature>commons-io-unsafe-${commons-io.version}</bundledSignature>       -->
+                <!-- <bundledSignature>commons-io-unsafe-@commons-io:commons-io.version@</bundledSignature>       -->
               </bundledSignatures>
               <signaturesFiles>
                 <signaturesFile>${top-level}/lucene/tools/forbiddenApis/tests.txt</signaturesFile>
Index: dev-tools/maven/solr/solrj/src/java/pom.xml.template
===================================================================
--- dev-tools/maven/solr/solrj/src/java/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/solrj/src/java/pom.xml.template	(working copy)
@@ -42,76 +42,8 @@
     <url>${vc-browse-base-url}/${module-directory}</url>
   </scm>
   <dependencies>
-    <dependency>
-      <groupId>org.apache.zookeeper</groupId>
-      <artifactId>zookeeper</artifactId>
-      <exclusions>
-        <exclusion>
-          <groupId>javax.jms</groupId>
-          <artifactId>jms</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jmx</groupId>
-          <artifactId>jmxri</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>com.sun.jdmk</groupId>
-          <artifactId>jmxtools</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>log4j</groupId>
-          <artifactId>log4j</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.jboss.netty</groupId>
-          <artifactId>netty</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>org.slf4j</groupId>
-          <artifactId>slf4j-log4j12</artifactId>
-        </exclusion>
-        <exclusion>
-          <groupId>jline</groupId>
-          <artifactId>jline</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.noggit</groupId>
-      <artifactId>noggit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpclient</artifactId>
-      <!-- HttpSolrServer requires this dependency. -->
-      <exclusions>
-        <exclusion>
-          <groupId>commons-logging</groupId>
-          <artifactId>commons-logging</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.httpcomponents</groupId>
-      <artifactId>httpmime</artifactId>
-      <!-- HttpSolrServer requires this dependency. -->
-    </dependency>
-    <!-- Technically, this is optional in SolrJ; but it's fast. SOLR-2852 -->
-    <dependency>
-      <groupId>org.codehaus.woodstox</groupId>
-      <artifactId>wstx-asl</artifactId>
-      <scope>runtime</scope>
-      <exclusions>
-        <exclusion>
-          <groupId>stax</groupId>
-          <artifactId>stax-api</artifactId>
-        </exclusion>
-      </exclusions>
-    </dependency>
+@solr-solrj.internal.dependencies@
+@solr-solrj.external.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}</sourceDirectory>
@@ -151,7 +83,7 @@
               <bundledSignatures>
                 <bundledSignature>jdk-unsafe</bundledSignature>
                 <bundledSignature>jdk-deprecated</bundledSignature>
-                <bundledSignature>commons-io-unsafe-${commons-io.version}</bundledSignature>
+                <bundledSignature>commons-io-unsafe-@commons-io:commons-io.version@</bundledSignature>
               </bundledSignatures>
               <signaturesFiles>
                 <signaturesFile>${top-level}/lucene/tools/forbiddenApis/base.txt</signaturesFile>
Index: dev-tools/maven/solr/solrj/src/test/pom.xml.template
===================================================================
--- dev-tools/maven/solr/solrj/src/test/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/solrj/src/test/pom.xml.template	(working copy)
@@ -42,15 +42,20 @@
       <!-- dependencies are always ordered before inherited dependencies.       -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
+      <groupId>org.apache.solr</groupId>
       <artifactId>solr-test-framework</artifactId>
-      <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.solr</groupId>
+      <artifactId>solr-solrj</artifactId>
+      <scope>test</scope>
+    </dependency>
+@solr-solrj.internal.test.dependencies@
+@solr-solrj.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory/>
@@ -137,7 +142,7 @@
               <bundledSignatures>
                 <bundledSignature>jdk-unsafe</bundledSignature>
                 <bundledSignature>jdk-deprecated</bundledSignature>
-                <bundledSignature>commons-io-unsafe-${commons-io.version}</bundledSignature>
+                <bundledSignature>commons-io-unsafe-@commons-io:commons-io.version@</bundledSignature>
               </bundledSignatures>
               <signaturesFiles>
                 <signaturesFile>${top-level}/lucene/tools/forbiddenApis/base.txt</signaturesFile>
Index: dev-tools/maven/solr/test-framework/pom.xml.template
===================================================================
--- dev-tools/maven/solr/test-framework/pom.xml.template	(revision 1537002)
+++ dev-tools/maven/solr/test-framework/pom.xml.template	(working copy)
@@ -47,44 +47,11 @@
       <!-- lucene-test-framework dependency must come before lucene-core -->
       <groupId>org.apache.lucene</groupId>
       <artifactId>lucene-test-framework</artifactId>
-      <version>${project.version}</version>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>solr-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>javax.servlet</groupId>
-      <artifactId>servlet-api</artifactId>
-      <!-- SOLR-3263: Provided scope is required to avoid jar signing conflicts -->
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-servlet</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.eclipse.jetty</groupId>
-      <artifactId>jetty-util</artifactId>
-    </dependency>
-
-    <!-- If your tests don't use BaseDistributedSearchTestCase or SolrJettyTestBase,
-         you can exclude the two 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-webapp</artifactId>
-      <scope>runtime</scope>
-    </dependency>
+@solr-test-framework.internal.dependencies@
+@solr-test-framework.external.dependencies@
+@solr-test-framework.internal.test.dependencies@
+@solr-test-framework.external.test.dependencies@
   </dependencies>
   <build>
     <sourceDirectory>${module-path}/src/java</sourceDirectory>
@@ -125,7 +92,7 @@
               <bundledSignatures>
                 <bundledSignature>jdk-unsafe</bundledSignature>
                 <bundledSignature>jdk-deprecated</bundledSignature>
-                <bundledSignature>commons-io-unsafe-${commons-io.version}</bundledSignature>
+                <bundledSignature>commons-io-unsafe-@commons-io:commons-io.version@</bundledSignature>
               </bundledSignatures>
               <signaturesFiles>
                 <signaturesFile>${top-level}/lucene/tools/forbiddenApis/base.txt</signaturesFile>
Index: lucene/analysis/build.xml
===================================================================
--- lucene/analysis/build.xml	(revision 1537002)
+++ lucene/analysis/build.xml	(working copy)
@@ -141,5 +141,9 @@
   <target name="regenerate">
     <forall-analyzers target="regenerate"/>
   </target>
+  
+  <target name="-append-module-dependencies-properties">
+    <forall-analyzers target="-append-module-dependencies-properties"/>
+  </target>
 	
 </project>
Index: lucene/analysis/uima/build.xml
===================================================================
--- lucene/analysis/uima/build.xml	(revision 1537002)
+++ lucene/analysis/uima/build.xml	(working copy)
@@ -34,10 +34,14 @@
 
   <path id="classpath">
     <pathelement path="${analyzers-common.jar}"/>
-    <pathelement path="${tests.userdir}"/>
     <path refid="uimajars"/>
     <path refid="base.classpath"/>
   </path>
+  
+  <path id="test.classpath">
+    <path refid="test.base.classpath"/>
+    <pathelement path="${tests.userdir}"/>
+  </path>
 
   <target name="compile-core" depends="jar-analyzers-common, common.compile-core" />
 </project>
Index: lucene/benchmark/build.xml
===================================================================
--- lucene/benchmark/build.xml	(revision 1537002)
+++ lucene/benchmark/build.xml	(working copy)
@@ -170,8 +170,6 @@
       <pathelement path="${facet.jar}"/>
       <pathelement path="${spatial.jar}"/>
       <pathelement path="${queries.jar}"/>
-      <fileset dir="${common.dir}/analysis/icu/lib"/>
-      <fileset dir="${common.dir}/spatial/lib"/>
       <path refid="base.classpath"/>
       <fileset dir="lib"/>
     </path>
@@ -227,7 +225,6 @@
 	<path id="collation.runtime.classpath">
 	  <path refid="run.classpath"/>
       <pathelement path="${analyzers-icu.jar}"/>
-      <fileset dir="${common.dir}/analysis/icu/lib"/>
 	</path>
 	
 	<target name="collation" depends="compile,jar-analyzers-icu,top-100k-wiki-word-files">
@@ -274,14 +271,7 @@
       <echo>Benchmark output in JIRA table format is in file: ${shingle.jira.output.file}</echo>
     </target>
 
-    <!-- we don't actually need to compile this thing, we just want its lib -->
-    <target name="resolve-icu">
-       <ant dir="${common.dir}/analysis/icu/" target="resolve" inheritAll="false">
-         <propertyset refid="uptodate.and.compiled.properties"/>
-      </ant>
-    </target>
-
-    <target name="init" depends="module-build.init,resolve-icu,jar-memory,jar-highlighter,jar-analyzers-common,jar-queryparser,jar-facet,jar-spatial"/>
+    <target name="init" depends="module-build.init,jar-memory,jar-highlighter,jar-analyzers-common,jar-queryparser,jar-facet,jar-spatial"/>
   
     <target name="compile-test" depends="copy-alg-files-for-testing,module-build.compile-test"/>
     <target name="copy-alg-files-for-testing" description="copy .alg files as resources for testing">
Index: lucene/benchmark/ivy.xml
===================================================================
--- lucene/benchmark/ivy.xml	(revision 1537002)
+++ lucene/benchmark/ivy.xml	(working copy)
@@ -22,6 +22,8 @@
       <dependency org="org.apache.commons" name="commons-compress" rev="${/org.apache.commons/commons-compress}" transitive="false"/>
       <dependency org="xerces" name="xercesImpl" rev="${/xerces/xercesImpl}" transitive="false"/>
       <dependency org="net.sourceforge.nekohtml" name="nekohtml" rev="${/net.sourceforge.nekohtml/nekohtml}" transitive="false"/>
+      <dependency org="com.ibm.icu" name="icu4j" rev="${/com.ibm.icu/icu4j}" transitive="false"/>
+      <dependency org="com.spatial4j" name="spatial4j" rev="${/com.spatial4j/spatial4j}" transitive="false"/>
       <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/> 
     </dependencies>
 </ivy-module>
Index: lucene/build.xml
===================================================================
--- lucene/build.xml	(revision 1537002)
+++ lucene/build.xml	(working copy)
@@ -631,4 +631,11 @@
     <modules-crawl target="regenerate"/>
   </target>
 
+  <target name="-append-module-dependencies-properties">
+    <sequential>
+      <ant dir="core" target="common.-append-module-dependencies-properties" inheritall="false"/>
+      <ant dir="test-framework" target="common.-append-module-dependencies-properties" inheritall="false"/>
+      <modules-crawl target="-append-module-dependencies-properties" failonerror="true"/>
+    </sequential>
+  </target>
 </project>
Index: lucene/classification/build.xml
===================================================================
--- lucene/classification/build.xml	(revision 1537002)
+++ lucene/classification/build.xml	(working copy)
@@ -26,14 +26,11 @@
 
   <path id="classpath">
     <path refid="base.classpath"/>
-    <pathelement path="${lucene-core.jar}"/>
     <pathelement path="${queries.jar}"/>
-    <pathelement location="${build.dir}/classes/java" />
   </path>
 
   <path id="test.classpath">
     <pathelement path="${analyzers-common.jar}"/>
-    <pathelement location="${test-framework.jar}"/>
     <pathelement location="${codecs.jar}"/>
     <path refid="test.base.classpath"/>
   </path>
Index: lucene/common-build.xml
===================================================================
--- lucene/common-build.xml	(revision 1537002)
+++ lucene/common-build.xml	(working copy)
@@ -1470,10 +1470,55 @@
       </excludes>
     </m2-validate-dependencies>
   </target>
+  
+  <property name="module.dependencies.properties.file" location="${common.build.dir}/module.dependencies.properties"/>
 
-  <target name="filter-pom-templates" unless="filtered.pom.templates.uptodate">
+  <target name="-append-module-dependencies-properties">
+    <sequential>
+      <property name="top.level.dir" location="${common.dir}/.."/>
+      <pathconvert property="classpath.list" pathsep="," dirsep="/" setonempty="true">
+        <path refid="classpath"/>
+        <globmapper from="${top.level.dir}/*" to="*" handledirsep="true"/>
+      </pathconvert>
+      <pathconvert property="test.classpath.list" pathsep="," dirsep="/" setonempty="true">
+        <path refid="test.classpath"/>
+        <globmapper from="${top.level.dir}/*" to="*" handledirsep="true"/>
+      </pathconvert>
+      <echo append="true" file="${module.dependencies.properties.file}">
+${ant.project.name}.dependencies=${classpath.list}
+${ant.project.name}.test.dependencies=${test.classpath.list}
+      </echo>
+    </sequential>
+  </target>
+
+  <property name="maven.dependencies.filters.file" location="${common.build.dir}/maven.dependencies.filters.properties"/>
+
+  <target name="-get-maven-dependencies" depends="compile-tools,resolve,load-custom-tasks">
+    <ant dir="${common.dir}/.." target="-append-all-modules-dependencies-properties" inheritall="false"/>
+    <get-maven-dependencies-macro
+        dir="${common.dir}/.."
+        centralized.versions.file="${common.dir}/ivy-versions.properties"
+        module.dependencies.properties.file="${module.dependencies.properties.file}"
+        maven.dependencies.filters.file="${maven.dependencies.filters.file}"/>
+  </target>
+
+  <target name="-get-maven-poms" depends="-get-maven-dependencies">
+    <property name="maven-build-dir" location="${common.dir}/../maven-build"/>
+    <copy todir="${maven-build-dir}" overwrite="true" encoding="UTF-8">
+      <fileset dir="${common.dir}/../dev-tools/maven"/>
+      <filterset begintoken="@" endtoken="@">
+        <filter token="version" value="${version}"/>
+      </filterset>
+      <filterset>
+        <filtersfile file="${maven.dependencies.filters.file}"/>
+      </filterset>
+      <globmapper from="*.template" to="*"/>
+    </copy>
+  </target>
+
+  <target name="filter-pom-templates" depends="-get-maven-dependencies">
     <mkdir dir="${filtered.pom.templates.dir}"/>
-    <copy todir="${common.dir}/build/poms" overwrite="true" encoding="UTF-8">
+    <copy todir="${common.dir}/build/poms" overwrite="true" encoding="UTF-8" filtering="on">
       <fileset dir="${common.dir}/../dev-tools/maven"/>
       <filterset begintoken="@" endtoken="@">
         <filter token="version" value="${version}"/>
Index: lucene/test-framework/build.xml
===================================================================
--- lucene/test-framework/build.xml	(revision 1537002)
+++ lucene/test-framework/build.xml	(working copy)
@@ -31,6 +31,8 @@
     <path refid="ant-path"/>
   </path>
 
+  <path id="test.classpath"/>
+
   <!-- 
       Specialize compile-core to depend on lucene-core and lucene-codecs compilation.
    -->
Index: lucene/tools/custom-tasks.xml
===================================================================
--- lucene/tools/custom-tasks.xml	(revision 1537002)
+++ lucene/tools/custom-tasks.xml	(working copy)
@@ -109,4 +109,33 @@
       </libversions>
     </sequential>
   </macrodef>
+
+  <macrodef name="get-maven-dependencies-macro">
+    <attribute name="dir"/>
+    <attribute name="centralized.versions.file"/>
+    <attribute name="module.dependencies.properties.file"/>
+    <attribute name="maven.dependencies.filters.file"/>
+    <sequential>
+      <!-- 
+        Verify that the '/org/name' keys in ivy-versions.properties are sorted
+        lexically and are neither duplicates nor orphans, and that all
+         dependencies in all ivy.xml files use rev="${/org/name}" format.
+        -->
+      <echo>Get maven dependencies called under: @{dir}</echo>
+      <mvndeps centralizedVersionsFile="@{centralized.versions.file}"
+               moduleDependenciesPropertiesFile="@{module.dependencies.properties.file}"
+               mavenDependenciesFiltersFile="@{maven.dependencies.filters.file}">
+        <fileset dir="@{dir}">
+          <include name="**/ivy.xml" />
+          <!-- Speed up scanning a bit. -->
+          <exclude name="**/.git/**" />
+          <exclude name="**/.svn/**" />
+          <exclude name="**/bin/**" />
+          <exclude name="**/build/**" />
+          <exclude name="**/dist/**" />
+          <exclude name="**/src/**" />
+        </fileset>
+      </mvndeps>
+    </sequential>
+  </macrodef>
 </project>
Index: lucene/tools/src/java/lucene-solr.antlib.xml
===================================================================
--- lucene/tools/src/java/lucene-solr.antlib.xml	(revision 1537002)
+++ lucene/tools/src/java/lucene-solr.antlib.xml	(working copy)
@@ -21,4 +21,7 @@
     <taskdef
         name="libversions"
         classname="org.apache.lucene.validation.LibVersionsCheckTask" />
+    <taskdef
+        name="mvndeps"
+        classname="org.apache.lucene.dependencies.GetMavenDependenciesTask" />
 </antlib> 
Index: lucene/tools/src/java/org/apache/lucene/dependencies/GetMavenDependenciesTask.java
===================================================================
--- lucene/tools/src/java/org/apache/lucene/dependencies/GetMavenDependenciesTask.java	(revision 0)
+++ lucene/tools/src/java/org/apache/lucene/dependencies/GetMavenDependenciesTask.java	(working copy)
@@ -0,0 +1,854 @@
+package org.apache.lucene.dependencies;
+
+/*
+ * 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.
+ */
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.resources.FileResource;
+import org.apache.tools.ant.types.resources.Resources;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+/**
+ * An Ant task to verify that the '/org/name' keys in ivy-versions.properties
+ * are sorted lexically and are neither duplicates nor orphans, and that all
+ * dependencies in all ivy.xml files use rev="${/org/name}" format.
+ */
+public class GetMavenDependenciesTask extends Task {
+  private static final Pattern PROPERTY_PREFIX_FROM_IVY_XML_FILE_PATTERN = Pattern.compile
+      ("[/\\\\](lucene|solr)[/\\\\](?:(?:contrib|(analysis)|(example))[/\\\\])?([^/\\\\]+)[/\\\\]ivy\\.xml");
+  private static final Pattern COORDINATE_KEY_PATTERN = Pattern.compile("/([^/]+)/([^/]+)");
+  private static final Pattern MODULE_DEPENDENCIES_COORDINATE_KEY_PATTERN
+      = Pattern.compile("(.*?)(\\.test)?\\.dependencies");
+  // lucene/build/core/classes/java
+  private static final Pattern COMPILATION_OUTPUT_DIRECTORY_PATTERN 
+      = Pattern.compile("(lucene|solr)/build/(?:contrib/)?(.*)/classes/(?:java|test)");
+  // lucene/build/analysis/common/lucene-analyzers-common-5.0-SNAPSHOT.jar
+  private static final Pattern INTERNAL_JAR_PATTERN 
+      = Pattern.compile(".*(lucene|solr)([^/]*?)-(?:\\d\\.)+\\d(?:-SNAPSHOT)?\\.jar");
+  private static final Pattern PROPERTY_REFERENCE_PATTERN = Pattern.compile("\\$\\{([^}]+)\\}");
+  private static final String UNWANTED_INTERNAL_DEPENDENCIES
+      = "/(?:test-)?lib/|test-framework/classes/java|/test-files|/resources";
+  private static final Pattern SHARED_EXTERNAL_DEPENDENCIES_PATTERN
+      = Pattern.compile("((?:solr|lucene)/(?!test-framework).*)/lib/");
+
+  private static final String DEPENDENCY_MANAGEMENT_PROPERTY = "lucene.solr.dependency.management";
+  private static final String IVY_USER_DIR_PROPERTY = "ivy.default.ivy.user.dir";
+  private static final Properties allProperties = new Properties();
+  private static final Set<String> modulesWithSeparateCompileAndTestPOMs = new HashSet<String>();
+
+  private static final Set<String>  optionalExternalDependencies = new HashSet<String>();
+  static {
+    // Add modules here that have split compile and test POMs
+    // - they need compile-scope deps to also be test-scope deps.
+    modulesWithSeparateCompileAndTestPOMs.addAll
+        (Arrays.asList("lucene-core", "lucene-codecs", "solr-core", "solr-solrj"));
+    
+    // Add external dependencies here that should be optional (i.e., not invoke Maven's transitive dep mechanism).
+    // Format is "groupId:artifactId"
+    optionalExternalDependencies.addAll(Arrays.asList
+        ("org.slf4j:jcl-over-slf4j", "org.slf4j:jul-to-slf4j", "org.slf4j:slf4j-api", "org.slf4j:slf4j-log4j12"));
+  }
+
+  private final XPath xpath = XPathFactory.newInstance().newXPath();
+  private final SortedMap<String,SortedSet<String>> internalCompileScopeDependencies
+      = new TreeMap<String,SortedSet<String>>();
+  private final Set<String> nonJarDependencies = new HashSet<String>();
+  private final Map<String,Set<String>> dependencyClassifiers = new HashMap<String,Set<String>>();
+  private final Map<String,Set<String>> interModuleExternalCompileScopeDependencies = new HashMap<String,Set<String>>();
+  private final Map<String,Set<String>> interModuleExternalTestScopeDependencies = new HashMap<String,Set<String>>();
+  private final Map<String,SortedSet<ExternalDependency>> allExternalDependencies
+     = new HashMap<String,SortedSet<ExternalDependency>>();
+  private final DocumentBuilder documentBuilder;
+  private File ivyCacheDir;
+
+
+  /**
+   * All ivy.xml files to get external dependencies from.
+   */
+  private Resources ivyXmlResources = new Resources();
+
+  /**
+   * Centralized Ivy versions properties file
+   */
+  private File centralizedVersionsFile;
+
+  /**
+   * Module dependencies properties file, generated by task -append-module-dependencies-properties.
+   */
+  private File moduleDependenciesPropertiesFile;
+
+  /**
+   * Where all properties are written, to be used to filter POM templates when copying them.
+   */
+  private File mavenDependenciesFiltersFile;
+
+  /**
+   * A logging level associated with verbose logging.
+   */
+  private int verboseLevel = Project.MSG_VERBOSE;
+
+  /**
+   * Adds a set of ivy.xml resources to check.
+   */
+  public void add(ResourceCollection rc) {
+    ivyXmlResources.add(rc);
+  }
+
+  public void setVerbose(boolean verbose) {
+    verboseLevel = (verbose ? Project.MSG_INFO : Project.MSG_VERBOSE);
+  }
+
+  public void setCentralizedVersionsFile(File file) {
+    centralizedVersionsFile = file;
+  }
+
+  public void setModuleDependenciesPropertiesFile(File file) {
+    moduleDependenciesPropertiesFile = file;
+  }
+  
+  public void setMavenDependenciesFiltersFile(File file) {
+    mavenDependenciesFiltersFile = file;
+  }
+
+  public GetMavenDependenciesTask() {
+    try {
+      documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
+    } catch (ParserConfigurationException e) {
+      throw new BuildException(e);
+    }
+  }
+  
+  /**
+   * Collect dependency information from Ant build.xml and ivy.xml files
+   * and from ivy-versions.properties, then write out an Ant filters file
+   * to be used when copying POMs.
+   */
+  @Override
+  public void execute() throws BuildException {
+    setInternalDependencyProperties();            // side-effect: all modules' internal deps are recorded
+    setExternalDependencyProperties();            // side-effect: all modules' external deps are recorded
+    setGrandparentDependencyManagementProperty(); // uses deps recorded in above two methods
+    writeFiltersFile();
+  }
+
+  /**
+   * Write out an Ant filters file to be used when copying POMs.
+   */
+  private void writeFiltersFile() {
+    Writer writer = null;
+    try {
+      FileOutputStream outputStream = new FileOutputStream(mavenDependenciesFiltersFile);
+      writer = new OutputStreamWriter(outputStream, "ISO-8859-1");
+      allProperties.store(writer, null);
+    } catch (FileNotFoundException e) {
+      throw new BuildException("Can't find file: '" + mavenDependenciesFiltersFile.getPath() + "'", e);
+    } catch (UnsupportedEncodingException e) {
+      throw new BuildException(e);
+    } catch (IOException e) {
+      throw new BuildException("Exception writing out '" + mavenDependenciesFiltersFile.getPath() + "'", e);
+    } finally {
+      if (null != writer) {
+        try {
+          writer.close();
+        } catch (IOException e) {
+          // ignore
+        }
+      }
+    }
+  }
+
+  /**
+   * Collects external dependencies from each ivy.xml file and sets
+   * external dependency properties to be inserted into modules' POMs. 
+   */
+  private void setExternalDependencyProperties() {
+    @SuppressWarnings("unchecked")
+    Iterator<Resource> iter = (Iterator<Resource>)ivyXmlResources.iterator();
+    while (iter.hasNext()) {
+      final Resource resource = iter.next();
+      if ( ! resource.isExists()) {
+        throw new BuildException("Resource does not exist: " + resource.getName());
+      }
+      if ( ! (resource instanceof FileResource)) {
+        throw new BuildException("Only filesystem resources are supported: "
+            + resource.getName() + ", was: " + resource.getClass().getName());
+      }
+
+      File ivyXmlFile = ((FileResource)resource).getFile();
+      try {
+        collectExternalDependenciesFromIvyXmlFile(ivyXmlFile);
+      } catch (BuildException e) {
+        throw e;
+      } catch (Exception e) {
+        throw new BuildException("Exception reading file " + ivyXmlFile.getPath(), e);
+      }
+    }
+    addSharedExternalDependencies();
+    setExternalDependencyXmlProperties();
+  }
+
+  /**
+   * For each module that include other modules' external dependencies via
+   * including all files under their ".../lib/" dirs in their (test.)classpath,
+   * add the other modules' dependencies to its set of external dependencies. 
+   */
+  private void addSharedExternalDependencies() {
+    // Delay adding shared compile-scope dependencies until after all have been processed,
+    // so dependency sharing is limited to a depth of one.
+    Map<String,SortedSet<ExternalDependency>> sharedDependencies = new HashMap<String,SortedSet<ExternalDependency>>();
+    for (String artifactId : interModuleExternalCompileScopeDependencies.keySet()) {
+      TreeSet<ExternalDependency> deps = new TreeSet<>();
+      sharedDependencies.put(artifactId, deps);
+      Set<String> moduleDependencies = interModuleExternalCompileScopeDependencies.get(artifactId);
+      if (null != moduleDependencies) {
+        for (String otherArtifactId : moduleDependencies) {
+          SortedSet<ExternalDependency> otherExtDeps = allExternalDependencies.get(otherArtifactId); 
+          if (null != otherExtDeps) {
+            for (ExternalDependency otherDep : otherExtDeps) {
+              if ( ! otherDep.isTestDependency) {
+                deps.add(otherDep);
+              }
+            }
+          }
+        }
+      }
+    }
+    for (String artifactId : interModuleExternalTestScopeDependencies.keySet()) {
+      SortedSet<ExternalDependency> deps = sharedDependencies.get(artifactId);
+      if (null == deps) {
+        deps = new TreeSet<ExternalDependency>();
+        sharedDependencies.put(artifactId, deps);
+      }
+      Set<String> moduleDependencies = interModuleExternalTestScopeDependencies.get(artifactId);
+      if (null != moduleDependencies) {
+        for (String otherArtifactId : moduleDependencies) {
+          SortedSet<ExternalDependency> otherExtDeps = allExternalDependencies.get(otherArtifactId);
+          if (null != otherExtDeps) {
+            for (ExternalDependency otherDep : otherExtDeps) {
+              if ( ! otherDep.isTestDependency) {
+                if (  ! deps.contains(otherDep)
+                   && (  null == allExternalDependencies.get(artifactId)
+                      || ! allExternalDependencies.get(artifactId).contains(otherDep))) { 
+                  // Add test-scope clone only if it's not already a compile-scope dependency. 
+                  ExternalDependency otherDepTestScope = new ExternalDependency
+                      (otherDep.groupId, otherDep.artifactId, otherDep.classifier, true, otherDep.isOptional);
+                  deps.add(otherDepTestScope);
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    for (String artifactId : sharedDependencies.keySet()) {
+      SortedSet<ExternalDependency> deps = allExternalDependencies.get(artifactId);
+      if (null == deps) {
+        deps = new TreeSet<ExternalDependency>();
+        allExternalDependencies.put(artifactId, deps);
+      }
+      deps.addAll(sharedDependencies.get(artifactId));
+    }
+  }
+
+  /**
+   * For each module, sets a compile-scope and a test-scope property
+   * with values that contain the appropriate &lt;dependency&gt;
+   * snippets.
+   */
+  private void setExternalDependencyXmlProperties() {
+    for (String module : internalCompileScopeDependencies.keySet()) { // get full module list
+      StringBuilder compileScopeBuilder = new StringBuilder();
+      StringBuilder testScopeBuilder = new StringBuilder();
+      SortedSet<ExternalDependency> extDeps = allExternalDependencies.get(module);
+      if (null != extDeps) {
+        for (ExternalDependency dep : extDeps) {
+          StringBuilder builder = dep.isTestDependency ? testScopeBuilder : compileScopeBuilder;
+          appendDependencyXml(builder, dep.groupId, dep.artifactId, "    ", null, 
+                              dep.isTestDependency, dep.isOptional, dep.classifier, null);
+          // Test POMs for solrj, solr-core, lucene-codecs and lucene-core modules
+          // need to include all compile-scope dependencies as test-scope dependencies
+          // since we've turned off transitive dependency resolution.
+          if ( ! dep.isTestDependency && modulesWithSeparateCompileAndTestPOMs.contains(module)) {
+            appendDependencyXml(testScopeBuilder, dep.groupId, dep.artifactId, "    ", null,
+                                true, dep.isOptional, dep.classifier, null);
+          }
+        }
+      }
+      if (compileScopeBuilder.length() > 0) {
+        compileScopeBuilder.setLength(compileScopeBuilder.length() - 1); // drop trailing newline
+      }
+      if (testScopeBuilder.length() > 0) {
+        testScopeBuilder.setLength(testScopeBuilder.length() - 1); // drop trailing newline
+      }
+      allProperties.setProperty(module + ".external.dependencies", compileScopeBuilder.toString());
+      allProperties.setProperty(module + ".external.test.dependencies", testScopeBuilder.toString());
+    }
+  }
+
+  /**
+   * Sets the property to be inserted into the grandparent POM's 
+   * &lt;dependencyManagement&gt; section.
+   */
+  private void setGrandparentDependencyManagementProperty() {
+    StringBuilder builder = new StringBuilder();
+    appendAllInternalDependencies(builder);
+    Map<String,String> versionsMap = new HashMap<String,String>();
+    appendAllExternalDependencies(builder, versionsMap);
+    builder.setLength(builder.length() - 1); // drop trailing newline
+    allProperties.setProperty(DEPENDENCY_MANAGEMENT_PROPERTY, builder.toString());
+    for (Map.Entry<String,String> entry : versionsMap.entrySet()) {
+      allProperties.setProperty(entry.getKey(), entry.getValue());
+    }
+  }
+
+  /**
+   * For each artifact in the project, append a dependency with version
+   * ${project.version} to the grandparent POM's &lt;dependencyManagement&gt;
+   * section.  An &lt;exclusion&gt; is added for each of the artifact's
+   * dependencies.
+   */
+  private void appendAllInternalDependencies(StringBuilder builder) {
+    for (String artifactId : internalCompileScopeDependencies.keySet()) {
+      List<String> exclusions = new ArrayList<String>();
+      exclusions.addAll(internalCompileScopeDependencies.get(artifactId));
+      SortedSet<ExternalDependency> extDeps = allExternalDependencies.get(artifactId);
+      if (null != extDeps) {
+        for (ExternalDependency externalDependency : extDeps) {
+          if ( ! externalDependency.isTestDependency && ! externalDependency.isOptional) {
+            exclusions.add(externalDependency.groupId + ':' + externalDependency.artifactId);
+          }
+        }
+      }
+      String groupId = "org.apache." + artifactId.substring(0, artifactId.indexOf('-'));
+      appendDependencyXml(builder, groupId, artifactId, "      ", "${project.version}", false, false, null, exclusions);
+    }
+  }
+
+  /**
+   * Sets the ivyCacheDir field, to either the ${ivy.default.ivy.user.dir} 
+   * property, or if that's not set, to the default ~/.ivy2/.
+   */
+  private File getIvyCacheDir() {
+    String ivyUserDirName = getProject().getUserProperty(IVY_USER_DIR_PROPERTY);
+    if (null == ivyUserDirName) {
+      ivyUserDirName = getProject().getProperty(IVY_USER_DIR_PROPERTY);
+      if (null == ivyUserDirName) {
+        ivyUserDirName = System.getProperty("user.home") + System.getProperty("file.separator") + ".ivy2";
+      }
+    }
+    File ivyUserDir = new File(ivyUserDirName);
+    if ( ! ivyUserDir.exists()) {
+      throw new BuildException("Ivy user dir does not exist: '" + ivyUserDir.getPath() + "'");
+    }
+    File dir = new File(ivyUserDir, "cache");
+    if ( ! dir.exists()) {
+      throw new BuildException("Ivy cache dir does not exist: '" + ivyCacheDir.getPath() + "'");
+    }
+    return dir;
+  }
+
+  /**
+   * Append each dependency listed in the centralized Ivy versions file
+   * to the grandparent POM's &lt;dependencyManagement&gt; section.  
+   * An &lt;exclusion&gt; is added for each of the artifact's dependencies,
+   * which are collected from the artifact's ivy.xml from the Ivy cache.
+   * 
+   * Also add a version property for each dependency.
+   */
+  private void appendAllExternalDependencies(StringBuilder dependenciesBuilder, Map<String,String> versionsMap) {
+    log("Loading centralized ivy versions from: " + centralizedVersionsFile, verboseLevel);
+    ivyCacheDir = getIvyCacheDir();
+    Properties versions = loadPropertiesFile(centralizedVersionsFile);
+    SortedSet<Map.Entry> sortedEntries = new TreeSet<Map.Entry>(new Comparator<Map.Entry>() {
+      @Override public int compare(Map.Entry o1, Map.Entry o2) {
+        return ((String)o1.getKey()).compareTo((String)o2.getKey());
+      }
+    });
+    sortedEntries.addAll(versions.entrySet());
+    for (Map.Entry entry : sortedEntries) {
+      String key = (String)entry.getKey();
+      Matcher matcher = COORDINATE_KEY_PATTERN.matcher(key);
+      if (matcher.lookingAt()) {
+        String groupId = matcher.group(1);
+        String artifactId = matcher.group(2);
+        String coordinate = groupId + ':' + artifactId;
+        String version = (String)entry.getValue();
+        versionsMap.put(coordinate + ".version", version);
+        if ( ! nonJarDependencies.contains(coordinate)) {
+          for (String classifier : dependencyClassifiers.get(coordinate)) {
+            Collection<String> exclusions = getTransitiveDependenciesFromIvyCache(groupId, artifactId, version);
+            appendDependencyXml
+                (dependenciesBuilder, groupId, artifactId, "      ", version, false, false, classifier, exclusions);
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * Collect transitive compile-scope dependencies for the given artifact's
+   * ivy.xml from the Ivy cache, using the default ivy pattern 
+   * "[organisation]/[module]/ivy-[revision].xml".  See 
+   * <a href="http://ant.apache.org/ivy/history/latest-milestone/settings/caches.html"
+   * >the Ivy cache documentation</a>.
+   */
+  private Collection<String> getTransitiveDependenciesFromIvyCache
+  (String groupId, String artifactId, String version) {
+    SortedSet<String> transitiveDependencies = new TreeSet<String>();
+    //                                      E.g. ~/.ivy2/cache/xerces/xercesImpl/ivy-2.9.1.xml
+    File ivyXmlFile = new File(new File(new File(ivyCacheDir, groupId), artifactId), "ivy-" + version + ".xml");
+    if ( ! ivyXmlFile.exists()) {
+      throw new BuildException("File not found: " + ivyXmlFile.getPath());
+    }
+    try {
+      Document document = documentBuilder.parse(ivyXmlFile);
+      String dependencyPath = "/ivy-module/dependencies/dependency"
+                            + "[   not(starts-with(@conf,'test->'))"
+                            + "and not(starts-with(@conf,'provided->'))"
+                            + "and not(starts-with(@conf,'optional->'))]";
+      NodeList dependencies = (NodeList)xpath.evaluate(dependencyPath, document, XPathConstants.NODESET);
+      for (int i = 0 ; i < dependencies.getLength() ; ++i) {
+        Element dependency = (Element)dependencies.item(i);
+        transitiveDependencies.add(dependency.getAttribute("org") + ':' + dependency.getAttribute("name"));
+      }
+    } catch (Exception e) {
+      throw new BuildException( "Exception collecting transitive dependencies for " 
+                              + groupId + ':' + artifactId + ':' + version + " from "
+                              + ivyXmlFile.getAbsolutePath(), e);
+    }
+    return transitiveDependencies;
+  }
+
+  /**
+   * Sets the internal dependencies compile and test properties to be inserted 
+   * into modules' POMs.                                                                          k
+   * 
+   * Also collects shared external dependencies, 
+   * e.g. solr-core wants all of solrj's external dependencies 
+   */
+  private void  setInternalDependencyProperties() {
+    log("Loading module dependencies from: " + moduleDependenciesPropertiesFile, verboseLevel);
+    Properties moduleDependencies = loadPropertiesFile(moduleDependenciesPropertiesFile);
+    Map<String,SortedSet<String>> testScopeDependencies = new HashMap<String,SortedSet<String>>();
+    Map<String, String> testScopePropertyKeys = new HashMap<String,String>();
+    for (Map.Entry entry : moduleDependencies.entrySet()) {
+      String newPropertyKey = (String)entry.getKey();
+      StringBuilder newPropertyValue = new StringBuilder();
+      String value = (String)entry.getValue();
+      Matcher matcher = MODULE_DEPENDENCIES_COORDINATE_KEY_PATTERN.matcher(newPropertyKey);
+      if ( ! matcher.matches()) {
+        throw new BuildException("Malformed module dependencies property key: '" + newPropertyKey + "'");
+      }
+      String antProjectName = matcher.group(1);
+      boolean isTest = null != matcher.group(2);
+      String artifactName = antProjectToArtifactName(antProjectName);
+      newPropertyKey = artifactName + (isTest ? ".internal.test" : ".internal") + ".dependencies"; // Add ".internal"
+      if (isTest) {
+        testScopePropertyKeys.put(artifactName, newPropertyKey);
+      }
+      if (null == value || value.isEmpty()) {
+        allProperties.setProperty(newPropertyKey, "");
+        Map<String,SortedSet<String>> scopedDependencies
+            = isTest ? testScopeDependencies : internalCompileScopeDependencies;
+        scopedDependencies.put(artifactName, new TreeSet<String>());
+      } else {
+        // Lucene analysis modules' build dirs do not include hyphens, but Solr contribs' build dirs do
+        String origModuleDir = antProjectName.replace("analyzers-", "analysis/");
+        Pattern unwantedInternalDependencies = Pattern.compile
+            ("(?:lucene/build/|solr/build/(?:contrib/)?)" + origModuleDir + "|" + UNWANTED_INTERNAL_DEPENDENCIES);
+        SortedSet<String> sortedDeps = new TreeSet<String>();
+        for (String dependency : value.split(",")) {
+          matcher = SHARED_EXTERNAL_DEPENDENCIES_PATTERN.matcher(dependency);
+          if (matcher.find()) {
+            String otherArtifactName = matcher.group(1);
+            otherArtifactName = otherArtifactName.replace('/', '-');
+            otherArtifactName = otherArtifactName.replace("lucene-analysis", "lucene-analyzers");
+            otherArtifactName = otherArtifactName.replace("solr-contrib-", "solr-");
+            if ( ! otherArtifactName.equals(artifactName)) {
+              Map<String,Set<String>> sharedDeps
+                  = isTest ? interModuleExternalTestScopeDependencies : interModuleExternalCompileScopeDependencies;
+              Set<String> sharedSet = sharedDeps.get(artifactName);
+              if (null == sharedSet) {
+                sharedSet = new HashSet<String>();
+                sharedDeps.put(artifactName, sharedSet);
+              }
+              sharedSet.add(otherArtifactName);
+            }
+          }
+          matcher = unwantedInternalDependencies.matcher(dependency);
+          if (matcher.find()) {
+            continue;  // skip external (/(test-)lib/), and non-jar and unwanted (self) internal deps
+          }
+          String artifactId = dependencyToArtifactId(newPropertyKey, dependency);
+          String groupId = "org.apache." + artifactId.substring(0, artifactId.indexOf('-'));
+          String coordinate = groupId + ':' + artifactId;
+          sortedDeps.add(coordinate);
+        }
+        if (isTest) {  // Don't set test-scope properties until all compile-scope deps have been seen
+          testScopeDependencies.put(artifactName, sortedDeps);
+        } else {
+          internalCompileScopeDependencies.put(artifactName, sortedDeps);
+          for (String dependency : sortedDeps) {
+            int splitPos = dependency.indexOf(':');
+            String groupId = dependency.substring(0, splitPos);
+            String artifactId = dependency.substring(splitPos + 1);
+            appendDependencyXml(newPropertyValue, groupId, artifactId, "    ", null, false, false, null, null);
+          }
+          if (newPropertyValue.length() > 0) {
+            newPropertyValue.setLength(newPropertyValue.length() - 1); // drop trailing newline
+          }
+          allProperties.setProperty(newPropertyKey, newPropertyValue.toString());
+        }
+      }
+    }
+    // Now that all compile-scope dependencies have been seen, include only those test-scope
+    // dependencies that are not also compile-scope dependencies.
+    for (Map.Entry<String,SortedSet<String>> entry : testScopeDependencies.entrySet()) {
+      String module = entry.getKey();
+      SortedSet<String> testDeps = entry.getValue();
+      SortedSet<String> compileDeps = internalCompileScopeDependencies.get(module);
+      if (null == compileDeps) {
+        throw new BuildException("Can't find compile scope dependencies for module " + module);
+      }
+      StringBuilder newPropertyValue = new StringBuilder();
+      for (String dependency : testDeps) {
+        // modules with separate compile-scope and test-scope POMs need their compile-scope deps
+        // included in their test-scope deps.
+        if (modulesWithSeparateCompileAndTestPOMs.contains(module) || ! compileDeps.contains(dependency)) {
+          int splitPos = dependency.indexOf(':');
+          String groupId = dependency.substring(0, splitPos);
+          String artifactId = dependency.substring(splitPos + 1);
+          appendDependencyXml(newPropertyValue, groupId, artifactId, "    ", null, true, false, null, null);
+        }
+      }
+      if (newPropertyValue.length() > 0) {
+        newPropertyValue.setLength(newPropertyValue.length() - 1); // drop trailing newline
+      }
+      allProperties.setProperty(testScopePropertyKeys.get(module), newPropertyValue.toString());
+    }
+  }
+
+  /**
+   * Converts either a compile output directory or an internal jar
+   * dependency, taken from an Ant (test.)classpath, into an artifactId
+   */
+  private String dependencyToArtifactId(String newPropertyKey, String dependency) {
+    StringBuilder artifactId = new StringBuilder();
+    Matcher matcher = COMPILATION_OUTPUT_DIRECTORY_PATTERN.matcher(dependency);
+    if (matcher.matches()) {
+      // Pattern.compile("(lucene|solr)/build/(.*)/classes/java");
+      String artifact = matcher.group(2);
+      artifact = artifact.replace('/', '-');
+      artifact = artifact.replace("analysis-", "analyzers-");
+      if ("lucene".equals(matcher.group(1))) {
+        artifactId.append("lucene-");
+      }
+      artifactId.append(artifact);
+    } else {
+      matcher = INTERNAL_JAR_PATTERN.matcher(dependency);
+      if (matcher.matches()) {
+        // Pattern.compile(".*(lucene|solr)([^/]*?)-(?:\\d\\.)+\\d(?:-SNAPSHOT)?\\.jar)")
+        artifactId.append(matcher.group(1));
+        artifactId.append(matcher.group(2));
+      } else {
+        throw new BuildException
+            ("Malformed module dependency from '" + newPropertyKey + "': '" + dependency + "'");
+      }
+    }
+    return artifactId.toString();
+  }
+
+  /**
+   * Convert Ant project names to artifact names: prepend "lucene-"
+   * to Lucene project names; and "solr-cell" -> "solr-extraction"
+   */
+  private String antProjectToArtifactName(String origModule) {
+    String module = origModule;
+    if ( ! origModule.startsWith("solr-")) { // lucene modules names don't have "lucene-" prepended
+      module = "lucene-" + module;
+    }
+    if (module.equals("solr-cell")) { 
+      module = "solr-extraction";
+    }
+    return module;
+  }
+
+  /**
+   * Collect external dependencies from the given ivy.xml file, constructing
+   * property values containing &lt;dependency&gt; snippets, which will be
+   * filtered (substituted) when copying the POM for the module corresponding
+   * to the given ivy.xml file.
+   */
+  private void collectExternalDependenciesFromIvyXmlFile(File ivyXmlFile)
+      throws XPathExpressionException, IOException, SAXException {
+    String module = getModuleName(ivyXmlFile);
+    log("Collecting external dependencies from: " + ivyXmlFile.getPath(), verboseLevel);
+    Document document = documentBuilder.parse(ivyXmlFile);
+    String dependencyPath = "/ivy-module/dependencies/dependency";
+    NodeList dependencies = (NodeList)xpath.evaluate(dependencyPath, document, XPathConstants.NODESET);
+    for (int i = 0 ; i < dependencies.getLength() ; ++i) {
+      Element dependency = (Element)dependencies.item(i);
+      String groupId = dependency.getAttribute("org");
+      String artifactId = dependency.getAttribute("name");
+      String dependencyCoordinate = groupId + ':' + artifactId;
+      String classifier = null;
+      Set<String> classifiers = dependencyClassifiers.get(dependencyCoordinate);
+      if (null == classifiers) {
+        classifiers = new HashSet<>();
+        dependencyClassifiers.put(dependencyCoordinate, classifiers);
+      }
+      if (dependency.hasChildNodes()) {
+        NodeList artifacts = (NodeList)xpath.evaluate("artifact", dependency, XPathConstants.NODESET);
+        Element firstArtifact = (Element)artifacts.item(0);
+        if (artifacts.getLength() > 0) {
+          if (  ! "jar".equals(firstArtifact.getAttribute("type"))
+             && ! "jar".equals(firstArtifact.getAttribute("ext"))) {
+            nonJarDependencies.add(dependencyCoordinate);
+            continue; // ignore non-jar dependencies
+          }
+          String mavenClassifier = firstArtifact.getAttribute("maven:classifier");
+          if ( ! mavenClassifier.isEmpty()) {
+            classifier = mavenClassifier;
+            classifiers.add(classifier);
+          }
+        }
+      }
+      classifiers.add(classifier);
+      String conf = dependency.getAttribute("conf");
+      boolean isTestDependency = conf.contains("test");
+      boolean isOptional = optionalExternalDependencies.contains(dependencyCoordinate);
+      SortedSet<ExternalDependency> deps = allExternalDependencies.get(module);
+      if (null == deps) {
+        deps = new TreeSet<ExternalDependency>();
+        allExternalDependencies.put(module, deps);
+      }
+      deps.add(new ExternalDependency(groupId, artifactId, classifier, isTestDependency, isOptional));
+    }
+  }
+
+  /**
+   * Stores information about an external dependency
+   */
+  private class ExternalDependency implements Comparable<ExternalDependency> {
+    String groupId;
+    String artifactId;
+    boolean isTestDependency;
+    boolean isOptional;
+    String classifier;
+    
+    public ExternalDependency
+        (String groupId, String artifactId, String classifier, boolean isTestDependency, boolean isOptional) {
+      this.groupId = groupId;
+      this.artifactId = artifactId;
+      this.classifier = classifier;
+      this.isTestDependency = isTestDependency;
+      this.isOptional = isOptional;
+    }
+    
+    @Override
+    public boolean equals(Object o) {
+      if ( ! (o instanceof ExternalDependency)) {
+        return false;
+      }
+      ExternalDependency other = (ExternalDependency)o;
+      return groupId.equals(other.groupId) 
+          && artifactId.equals(other.artifactId) 
+          && isTestDependency == other.isTestDependency
+          && isOptional == other.isOptional
+          && classifier.equals(other.classifier);
+    } 
+    
+    @Override
+    public int hashCode() {
+      return groupId.hashCode() * 31
+          + artifactId.hashCode() * 31
+          + (isTestDependency ? 31 : 0)
+          + (isOptional ? 31 : 0)
+          + classifier.hashCode();
+    }
+
+    @Override
+    public int compareTo(ExternalDependency other) {
+      int comparison = groupId.compareTo(other.groupId);
+      if (0 != comparison) {
+        return comparison;
+      }
+      comparison = artifactId.compareTo(other.artifactId);
+      if (0 != comparison) {
+        return comparison;
+      }
+      if (null == classifier) {
+        if (null != other.classifier) {
+          return -1;
+        }
+      } else if (null == other.classifier) { // classifier is not null
+        return 1;
+      } else {                               // neither classifier is  null
+        if (0 != (comparison = classifier.compareTo(other.classifier))) {
+          return comparison;
+        }
+      }
+      // test and optional don't matter in this sort
+      return 0;
+    }
+  }
+  
+  /**
+   * Extract module name from ivy.xml path.
+   */
+  private String getModuleName(File ivyXmlFile) {
+    String path = ivyXmlFile.getAbsolutePath();
+    Matcher matcher = PROPERTY_PREFIX_FROM_IVY_XML_FILE_PATTERN.matcher(path);
+    if ( ! matcher.find()) {
+      throw new BuildException("Can't get module name from ivy.xml path: " + path);
+    }
+    StringBuilder builder = new StringBuilder();
+    builder.append(matcher.group(1));
+    if (null != matcher.group(2)) { // "lucene/analysis/..."
+      builder.append("-analyzers");
+    }
+    if (null != matcher.group(3)) { // "solr/example/..."
+      builder.append("-example");
+    }
+    builder.append('-');
+    builder.append(matcher.group(4));
+    return builder.toString();
+  }
+
+  /**
+   * Parse the given properties file, performing non-recursive Ant-like
+   * property value interpolation, and return the resulting Properties.
+   */
+  private Properties loadPropertiesFile(File file) {
+    final InputStream stream;
+    try {
+      stream = new FileInputStream(file);
+    } catch (FileNotFoundException e) {
+      throw new BuildException("Properties file does not exist: " + file.getPath());
+    }
+    // Properties files are encoded as Latin-1
+    final Reader reader = new InputStreamReader(stream, Charset.forName("ISO-8859-1"));
+    final Properties properties = new Properties(); 
+    try {
+      properties.load(reader);
+    } catch (IOException e) {
+      throw new BuildException("Exception reading properties file " + file, e);
+    } finally {
+      try {
+        reader.close();
+      } catch (IOException e) {
+        // do nothing
+      }
+    }
+    // Perform non-recursive Ant-like property value interpolation
+    StringBuffer buffer = new StringBuffer();
+    for (Map.Entry entry : properties.entrySet()) {
+      buffer.setLength(0);
+      Matcher matcher = PROPERTY_REFERENCE_PATTERN.matcher((String)entry.getValue());
+      while (matcher.find()) {
+        String interpolatedValue = properties.getProperty(matcher.group(1));
+        if (null != interpolatedValue) {
+          matcher.appendReplacement(buffer, interpolatedValue);
+        }
+      }
+      matcher.appendTail(buffer);
+      properties.setProperty((String)entry.getKey(), buffer.toString());
+    }
+    return properties;
+  }
+
+/**
+ * Appends a &lt;dependency&gt; snippet to the given builder.
+ */
+  private void appendDependencyXml(StringBuilder builder, String groupId, String artifactId, 
+                                   String indent, String version, boolean isTestDependency, 
+                                   boolean isOptional, String classifier, Collection<String> exclusions) {
+    builder.append(indent).append("<dependency>\n");
+    builder.append(indent).append("  <groupId>").append(groupId).append("</groupId>\n");
+    builder.append(indent).append("  <artifactId>").append(artifactId).append("</artifactId>\n");
+    if (null != version) {
+      builder.append(indent).append("  <version>").append(version).append("</version>\n");
+    }
+    if (isTestDependency) {
+      builder.append(indent).append("  <scope>test</scope>\n");
+    }
+    if (isOptional) {
+      builder.append(indent).append("  <optional>true</optional>\n");
+    }
+    if (null != classifier) {
+      builder.append(indent).append("  <classifier>").append(classifier).append("</classifier>\n");
+    }
+    if (null != exclusions && ! exclusions.isEmpty()) {
+      builder.append(indent).append("  <exclusions>\n");
+      for (String dependency : exclusions) {
+        int splitPos = dependency.indexOf(':');
+        String excludedGroupId = dependency.substring(0, splitPos);
+        String excludedArtifactId = dependency.substring(splitPos + 1);
+        builder.append(indent).append("    <exclusion>\n");
+        builder.append(indent).append("      <groupId>").append(excludedGroupId).append("</groupId>\n");
+        builder.append(indent).append("      <artifactId>").append(excludedArtifactId).append("</artifactId>\n");
+        builder.append(indent).append("    </exclusion>\n");
+      }
+      builder.append(indent).append("  </exclusions>\n");
+    }
+    builder.append(indent).append("</dependency>\n");
+  }
+}

Property changes on: lucene/tools/src/java/org/apache/lucene/dependencies/GetMavenDependenciesTask.java
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+Date Author Id Revision HeadURL
\ No newline at end of property
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: lucene/tools/src/java/org/apache/lucene/validation/LibVersionsCheckTask.java
===================================================================
--- lucene/tools/src/java/org/apache/lucene/validation/LibVersionsCheckTask.java	(revision 1537002)
+++ lucene/tools/src/java/org/apache/lucene/validation/LibVersionsCheckTask.java	(working copy)
@@ -314,12 +314,7 @@
     DependencyRevChecker revChecker = new DependencyRevChecker(ivyXmlFile); 
     xmlReader.setContentHandler(revChecker);
     xmlReader.setErrorHandler(revChecker);
-    // To work around a bug in XERCES (XERCESJ-1257), we assume the XML is always UTF8, so we simply provide reader.
-    CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder()
-        .onMalformedInput(CodingErrorAction.REPORT)
-        .onUnmappableCharacter(CodingErrorAction.REPORT);
-    InputStream stream = new FileInputStream(ivyXmlFile);
-    xmlReader.parse(new InputSource(new BufferedReader(new InputStreamReader(stream, decoder))));
+    xmlReader.parse(new InputSource(ivyXmlFile.getAbsolutePath()));
     return ! revChecker.fail;
   }
 
Index: solr/build.xml
===================================================================
--- solr/build.xml	(revision 1537002)
+++ solr/build.xml	(working copy)
@@ -743,4 +743,10 @@
     <jar-checksum-macro srcdir="${common-solr.dir}" dstdir="${common-solr.dir}/licenses"/>
   </target>
 
+  <target name="-append-module-dependencies-properties">
+    <ant dir="core" target="-append-module-dependencies-properties" inheritAll="false"/>
+    <ant dir="solrj" target="-append-module-dependencies-properties" inheritAll="false"/>
+    <ant dir="test-framework" target="-append-module-dependencies-properties" inheritAll="false"/>
+    <contrib-crawl target="-append-module-dependencies-properties"/>
+  </target>
 </project>
Index: solr/contrib/dataimporthandler/ivy.xml
===================================================================
--- solr/contrib/dataimporthandler/ivy.xml	(revision 1537002)
+++ solr/contrib/dataimporthandler/ivy.xml	(working copy)
@@ -25,9 +25,11 @@
   <dependencies>
     <dependency org="javax.activation" name="activation" rev="${/javax.activation/activation}" conf="compile->*"/>
     <dependency org="javax.mail" name="mail" rev="${/javax.mail/mail}"  conf="compile->*"/>
-    
-    <dependency org="org.easymock" name="easymock" rev="${/org.easymock/easymock}" conf="test->*"/>
 
+    <dependency org="hsqldb" name="hsqldb" rev="${/hsqldb/hsqldb}" transitive="false" conf="test->*"/>
+    <dependency org="org.apache.derby" name="derby" rev="${/org.apache.derby/derby}" transitive="false" conf="test->*"/>
+    <dependency org="org.easymock" name="easymock" rev="${/org.easymock/easymock}" transitive="false" conf="test->*"/>
+
     <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/> 
   </dependencies>
 </ivy-module>
