Index: src/main/java/hudson/tasks/MailSender.java
===================================================================
--- src/main/java/hudson/tasks/MailSender.java	(revision 34210)
+++ src/main/java/hudson/tasks/MailSender.java	(working copy)
@@ -39,12 +39,7 @@
 import javax.mail.internet.AddressException;
 import java.io.File;
 import java.io.IOException;
-import java.util.Date;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.HashSet;
+import java.util.*;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -59,6 +54,8 @@
      * Whitespace-separated list of e-mail addresses that represent recipients.
      */
     private String recipients;
+    
+    private List<AbstractProject> includeUpstreamCommitters = new ArrayList<AbstractProject>();
 
     /**
      * If true, only the first unstable build will be reported.
@@ -87,6 +84,14 @@
         this.charset = charset;
     }
 
+    public void includeUpstreamIndividualsOf(AbstractProject project) {
+        includeUpstreamCommitters.add(project);
+    }
+    
+    public void includeUpstreamIndividualsOf(Collection<AbstractProject> projects) {
+        includeUpstreamCommitters.addAll(projects);
+    }
+
     public boolean execute(AbstractBuild<?, ?> build, BuildListener listener) throws InterruptedException {
         try {
             MimeMessage mail = getMail(build, listener);
@@ -318,19 +323,7 @@
                     listener.getLogger().println("No such project exist: "+projectName);
                     continue;
                 }
-                AbstractBuild<?,?> pb = build.getPreviousBuild();
-                AbstractBuild<?,?> ub = build.getUpstreamRelationshipBuild(up);
-                AbstractBuild<?,?> upb = pb!=null ? pb.getUpstreamRelationshipBuild(up) : null;
-                if(pb==null && ub==null && upb==null) {
-                    listener.getLogger().println("Unable to compute the changesets in "+up+". Is the fingerprint configured?");
-                    continue;
-                }
-                if(pb==null || ub==null || upb==null) {
-                    listener.getLogger().println("Unable to compute the changesets in "+up);
-                    continue;
-                }
-                for( AbstractBuild<?,?> b=upb; b!=ub && b!=null; b=b.getNextBuild())
-                    rcp.addAll(buildCulpritList(listener,b.getCulprits()));
+                includeCulpritsOf(up, build, listener, rcp);
             } else {
                 // ordinary address
                 try {
@@ -342,6 +335,10 @@
             }
         }
 
+        for (AbstractProject project : includeUpstreamCommitters) {
+            includeCulpritsOf(project, build, listener, rcp);
+        }
+
         if (sendToIndividuals) {
             Set<User> culprits = build.getCulprits();
 
@@ -364,6 +361,22 @@
         return msg;
     }
 
+    private void includeCulpritsOf(AbstractProject upstreamBuild, AbstractBuild<?, ?> currentBuild, BuildListener listener, Set<InternetAddress> recipientList) throws AddressException {
+        AbstractBuild<?,?> pb = currentBuild.getPreviousBuild();
+        AbstractBuild<?,?> ub = currentBuild.getUpstreamRelationshipBuild(upstreamBuild);
+        AbstractBuild<?,?> upb = pb!=null ? pb.getUpstreamRelationshipBuild(upstreamBuild) : null;
+        if(pb==null && ub==null && upb==null) {
+            listener.getLogger().println("Unable to compute the changesets in "+ upstreamBuild +". Is the fingerprint configured?");
+            return;
+        }
+        if(pb==null || ub==null || upb==null) {
+            listener.getLogger().println("Unable to compute the changesets in "+ upstreamBuild);
+            return;
+        }
+        for( AbstractBuild<?,?> b=upb; b!=ub && b!=null; b=b.getNextBuild())
+            recipientList.addAll(buildCulpritList(listener,b.getCulprits()));
+    }
+
     private Set<InternetAddress> buildCulpritList(BuildListener listener, Set<User> culprits) throws AddressException {
         Set<InternetAddress> r = new HashSet<InternetAddress>();
         for (User a : culprits) {
