Index: pom.xml
===================================================================
--- pom.xml	(revision 17146)
+++ pom.xml	(working copy)
@@ -22,7 +22,7 @@
     <dependency>
       <groupId>org.jvnet.its</groupId>
       <artifactId>issuetracker-stats</artifactId>
-      <version>1.1</version>
+      <version>1.3-SNAPSHOT</version>
     </dependency>
     <!--
       TODO: dependency resolution isn't working correctly.
Index: src/main/java/hudson/plugins/javanet/JavaNetStatsAction.java
===================================================================
--- src/main/java/hudson/plugins/javanet/JavaNetStatsAction.java	(revision 17146)
+++ src/main/java/hudson/plugins/javanet/JavaNetStatsAction.java	(working copy)
@@ -23,6 +23,8 @@
  * @author Kohsuke Kawaguchi
  */
 public class JavaNetStatsAction implements Action {
+    private static final String JAVA_NET_PROJECT_SUBCOMPONENT_NAMES_FILE = "java.net.project.subcomponentNames";
+
     /**
      * Project that owns this action.
      */
@@ -33,20 +35,30 @@
      */
     private String projectName;
 
+    /**
+     * Sub component names in the Java.net project.
+     */
+    private String subcomponentNames;
+
     private File reportDir;
 
-    public JavaNetStatsAction(AbstractProject<?, ?> project, String projectName) {
+    public JavaNetStatsAction(AbstractProject<?, ?> project, String projectName, String subcomponentNames) {
         this.project = project;
         this.projectName = projectName;
         this.reportDir = getReportDirectory();
+        this.subcomponentNames = subcomponentNames;
     }
 
     public String getProjectName() {
         return projectName;
     }
 
+    public String getSubcomponentNames() {
+        return subcomponentNames;
+    }
+
     public void scheduleGeneration() {
-        new ReportGenerator(projectName,reportDir).schedule();
+        new ReportGenerator(projectName,subcomponentNames,reportDir).schedule();
     }
 
     public String getIconFileName() {
@@ -107,11 +119,20 @@
 
         projectName = name.trim();
         reportDir = getReportDirectory();
-        FileUtils.writeStringToFile(getOverrideFile(),projectName,"UTF-8");
+        FileUtils.writeStringToFile(getProjectNameOverrideFile(),projectName,"UTF-8");
+        getSubcomponentOverrideFile().delete();
 
         rsp.sendRedirect2(".");
     }
 
+    public void doChangeSubcomponents(StaplerRequest req, StaplerResponse rsp,@QueryParameter("name") String name) throws IOException, ServletException {
+        project.checkPermission(CONFIGURE);
+
+        subcomponentNames = name.trim();
+        FileUtils.writeStringToFile(getSubcomponentOverrideFile(),subcomponentNames,"UTF-8");
+        rsp.sendRedirect2(".");
+    }
+
     /**
      * Manually trigger the regeneration.
      */
@@ -131,13 +152,28 @@
      * File that stores the java.net project name, to manually override
      * the default project name inference.
      */
-    private File getOverrideFile() {
+    private File getProjectNameOverrideFile() {
         return new File(project.getRootDir(),"java.net.projectName");
     }
 
-    /*package*/ static String readOverrideFile(AbstractProject<?,?> project) {
+    /**
+     * File that stores the java.net project sub component name.
+     */
+    private File getSubcomponentOverrideFile() {
+        return new File(project.getRootDir(),JAVA_NET_PROJECT_SUBCOMPONENT_NAMES_FILE);
+    }
+
+    /*package*/ static String readProjectNameOverrideFile(AbstractProject<?,?> project) {
+        return readOverrideFile(project, "java.net.projectName");
+    }
+
+    /*package*/ static String readSubComponentNameOverrideFile(AbstractProject<?,?> project) {
+        return readOverrideFile(project, JAVA_NET_PROJECT_SUBCOMPONENT_NAMES_FILE);
+    }
+
+    private static String readOverrideFile(AbstractProject<?,?> project, String filename) {
         try {
-            return FileUtils.readFileToString(new File(project.getRootDir(),"java.net.projectName"),"UTF-8").trim();
+            return FileUtils.readFileToString(new File(project.getRootDir(),filename),"UTF-8").trim();
         } catch (IOException e) {
             return null;
         }
Index: src/main/java/hudson/plugins/javanet/ReportGenerator.java
===================================================================
--- src/main/java/hudson/plugins/javanet/ReportGenerator.java	(revision 17146)
+++ src/main/java/hudson/plugins/javanet/ReportGenerator.java	(working copy)
@@ -1,5 +1,6 @@
 package hudson.plugins.javanet;
 
+import hudson.Util;
 import hudson.util.DaemonThreadFactory;
 import org.jvnet.its.Generator;
 import org.kohsuke.jnt.JavaNet;
@@ -7,6 +8,8 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
@@ -22,9 +25,11 @@
 class ReportGenerator implements Runnable {
     private final String projectName;
     private final File reportDir;
+    private final String subcomponentNames;
 
-    ReportGenerator(String projectName, File reportDir) {
+    ReportGenerator(String projectName, String subcomponentNames, File reportDir) {
         this.projectName = projectName;
+        this.subcomponentNames = subcomponentNames;
         this.reportDir = reportDir;
     }
 
@@ -39,12 +44,16 @@
         Generator gen = new Generator();
 
         long start = System.currentTimeMillis();
-        LOGGER.info("Starting to generate java.net issue tracker stats for "+projectName);
+        LOGGER.info("Starting to generate java.net issue tracker stats for "+projectName+(subcomponentNames == null ? "" : "(" + subcomponentNames + ")"));
         String oldName = Thread.currentThread().getName();
         Thread.currentThread().setName("java.net issue tracker stat generation for "+projectName);
         reportDir.mkdirs();
         try {
-            gen.generate(JavaNet.connect().getProject(projectName), reportDir);
+           if (Util.fixEmpty(subcomponentNames) == null) {
+                gen.generate(JavaNet.connect().getProject(projectName), reportDir);
+            } else {
+                gen.generate(JavaNet.connect().getProject(projectName), new HashSet<String>(Arrays.asList(subcomponentNames.split(","))), reportDir);        		
+            }
         } catch (ProcessingException e) {
             LOGGER.log(Level.SEVERE, "Failed to generate java.net stat report for "+projectName,e);
         } catch (IOException e) {
Index: src/main/java/hudson/plugins/javanet/StatsProperty.java
===================================================================
--- src/main/java/hudson/plugins/javanet/StatsProperty.java	(revision 17146)
+++ src/main/java/hudson/plugins/javanet/StatsProperty.java	(working copy)
@@ -1,5 +1,6 @@
 package hudson.plugins.javanet;
 
+import hudson.Util;
 import hudson.model.AbstractProject;
 import hudson.model.Job;
 import hudson.model.JobProperty;
@@ -31,15 +32,19 @@
         String jnp = getJavaNetProject(job);
         if(jnp==null)
             return null;
-        return new JavaNetStatsAction(job,jnp);
+        return new JavaNetStatsAction(job,jnp,getJavaNetSubcomponent(job));
     }
 
     private String getJavaNetProject(AbstractProject<?,?> job) {
-        String v = JavaNetStatsAction.readOverrideFile(job);
+        String v = JavaNetStatsAction.readProjectNameOverrideFile(job);
         if(v!=null)     return v;
         return getJavaNetProject(job.getScm());
     }
 
+    private String getJavaNetSubcomponent(AbstractProject<?,?> job) {
+        return Util.fixEmpty(JavaNetStatsAction.readSubComponentNameOverrideFile(job));
+    }
+
     /**
      * Determines if this SCM is a java.net project,
      * and if so, return the project name, otherwise null.
Index: src/main/resources/hudson/plugins/javanet/JavaNetStatsAction/index.jelly
===================================================================
--- src/main/resources/hudson/plugins/javanet/JavaNetStatsAction/index.jelly	(revision 17146)
+++ src/main/resources/hudson/plugins/javanet/JavaNetStatsAction/index.jelly	(working copy)
@@ -10,6 +10,13 @@
               <input type="submit" value="Submit" class="submit-button"/>
             </form>
           </l:expandButton>
+          <br/>
+          <l:expandButton title="But, this project is only a sub component of the main project!">
+            <form method="post" action="changeSubcomponents">
+              Comma separated list of Java.net subcomponent names: <input type="text" name="name" value="${it.subcomponentNames}" />
+              <input type="submit" value="Submit" class="submit-button"/>
+            </form>
+          </l:expandButton>
         </div>
       </j:if>
       <j:choose>