diff --git a/src/main/java/hudson/plugins/accurev/AccurevSCM.java b/src/main/java/hudson/plugins/accurev/AccurevSCM.java
index 22b1143..b9840a6 100644
--- a/src/main/java/hudson/plugins/accurev/AccurevSCM.java
+++ b/src/main/java/hudson/plugins/accurev/AccurevSCM.java
@@ -93,18 +93,18 @@
      */
     @DataBoundConstructor
     public AccurevSCM(String serverName,
-                      String depot,
-                      String stream,
-                      boolean useWorkspace,
-                      String workspace,
-                      String workspaceSubPath,
-                      boolean synctime,
-                      boolean useUpdate,
-                      boolean usePurgeIfLastFailed,
-                      boolean useRevert,
-                      boolean useSnapshot,
-                      String snapshotNameFormat,
-                      boolean ignoreStreamParent) {
+            String depot,
+            String stream,
+            boolean useWorkspace,
+            String workspace,
+            String workspaceSubPath,
+            boolean synctime,
+            boolean useUpdate,
+            boolean usePurgeIfLastFailed,
+            boolean useRevert,
+            boolean useSnapshot,
+            String snapshotNameFormat,
+            boolean ignoreStreamParent) {
         super();
         this.serverName = serverName;
         this.depot = depot;
@@ -291,8 +291,8 @@
             for (Object o : changeSet.getItems()) {
                 AccurevTransaction t = (AccurevTransaction) o;
                 if (t.getEditType() == EditType.EDIT) { // this means promote or chstream in AccuRev
-                   lastTransaction = t.getRevision();
-                   break;
+                    lastTransaction = t.getRevision();
+                    break;
                 }
             }
             /*
@@ -313,7 +313,7 @@
      * {@inheritDoc}
      */
     public boolean checkout(AbstractBuild build, Launcher launcher, FilePath workspace, BuildListener listener,
-                            File changelogFile) throws IOException, InterruptedException {
+            File changelogFile) throws IOException, InterruptedException {
 
         final AccurevServer server = DESCRIPTOR.getServer(serverName);
 
@@ -489,11 +489,11 @@
                 if ((workspaceSubPath == null) || (workspaceSubPath.trim().length() == 0)) {
                     popcmd.add(".");
                 } else {
-		            final StringTokenizer st = new StringTokenizer(workspaceSubPath, ",");
-		        	while (st.hasMoreElements()) {
-		        		popcmd.add(st.nextToken().trim());
-		            }
-				}
+                    final StringTokenizer st = new StringTokenizer(workspaceSubPath, ",");
+                    while (st.hasMoreElements()) {
+                        popcmd.add(st.nextToken().trim());
+                    }
+                }
                 startDateOfPopulate = new Date();
                 if (Boolean.TRUE != AccurevLauncher.runCommand("Populate workspace command", launcher, popcmd, null,
                         getOptionalLock(), accurevEnv, workspace, listener, logger, new ParsePopulate(),
@@ -536,9 +536,9 @@
                 popcmd.add(".");
             } else {
                 final StringTokenizer st = new StringTokenizer(workspaceSubPath, ",");
-            	while (st.hasMoreElements()) {
-            		popcmd.add(st.nextToken().trim());
-				}
+                while (st.hasMoreElements()) {
+                    popcmd.add(st.nextToken().trim());
+                }
             }
             startDateOfPopulate = new Date();
             if (Boolean.TRUE != AccurevLauncher.runCommand("Populate from snapshot command", launcher, popcmd, null,
@@ -562,9 +562,9 @@
                 popcmd.add(".");
             } else {
                 final StringTokenizer st = new StringTokenizer(workspaceSubPath, ",");
-            	while (st.hasMoreElements()) {
-            		popcmd.add(st.nextToken().trim());
-				}
+                while (st.hasMoreElements()) {
+                    popcmd.add(st.nextToken().trim());
+                }
             }
             startDateOfPopulate = new Date();
             if (Boolean.TRUE != AccurevLauncher.runCommand("Populate command", launcher, popcmd, null,
@@ -587,27 +587,46 @@
         }
 
         {
-            AccurevStream stream = streams == null ? null : streams.get(localStream);
+			AccurevStream stream = streams == null ? null : streams.get(localStream);
 
-            if (stream == null) {
-                // if there was a problem, fall back to simple stream check
-                return captureChangelog(server, accurevEnv, workspace, listener, accurevPath, launcher,
-                        startDateOfPopulate, startTime == null ? null : startTime.getTime(),
-                        localStream, changelogFile);
-            }
-            // There may be changes in a parent stream that we need to factor in.
-            // TODO produce a consolidated list of changes from the parent streams
-            do {
-                // This is a best effort to get as close to the changes as possible
-                if (checkStreamForChanges(server, accurevEnv, workspace, listener, accurevPath, launcher,
-                        stream.getName(), startTime == null ? null : startTime.getTime())) {
-                    return captureChangelog(server, accurevEnv, workspace, listener, accurevPath, launcher,
-                            startDateOfPopulate, startTime == null ? null : startTime
-                            .getTime(), stream.getName(), changelogFile);
-                }
-                stream = stream.getParent();
-            } while (stream != null && stream.isReceivingChangesFromParent());
-        }
+			if (stream == null) {
+				// if there was a problem, fall back to simple stream check
+				return captureChangelog(server, accurevEnv, workspace, listener, accurevPath, launcher,
+						startDateOfPopulate, startTime == null ? null : startTime.getTime(),
+						localStream, changelogFile);
+			}
+			// There may be changes in a parent stream that we need to factor in.
+			// TODO produce a consolidated list of changes from the parent streams
+			boolean capturedChangelog = false;
+			boolean foundChange = false;
+			List<String> changedStreams = new ArrayList<String>();
+			do {
+				// This is a best effort to get as close to the changes as possible
+				if (!foundChange) {
+					foundChange = checkStreamForChanges(server, accurevEnv, workspace, listener, accurevPath, launcher,
+							stream.getName(), startTime == null ? null : startTime.getTime());
+				}
+				if (foundChange) {
+					do {
+						File streamChangeLog = XmlConsolidateStreamChangeLog.getStreamChangeLogFile(changelogFile, stream);
+						capturedChangelog = captureChangelog(server, accurevEnv, workspace, listener, accurevPath, launcher,
+								startDateOfPopulate, startTime == null ? null : startTime
+								.getTime(), stream.getName(), streamChangeLog);
+						if (capturedChangelog) {
+							changedStreams.add(streamChangeLog.getName());
+						}
+						stream = stream.getParent();
+					} while (stream != null && stream.isReceivingChangesFromParent() && capturedChangelog && startTime != null);
+				}
+				if (stream != null) {
+					stream = stream.getParent();
+				}
+			} while (stream != null && stream.isReceivingChangesFromParent() && !foundChange);
+			if (foundChange) {
+				XmlConsolidateStreamChangeLog.createChangeLog(changedStreams, changelogFile);
+				return capturedChangelog;
+			}
+		}
         return captureChangelog(server, accurevEnv, workspace, listener, accurevPath, launcher,
                 startDateOfPopulate, startTime == null ? null : startTime.getTime(), localStream,
                 changelogFile);
@@ -623,11 +642,11 @@
     }
 
     private Map<String, AccurevWorkspace> getWorkspaces(AccurevServer server,
-                                                        Map<String, String> accurevEnv,
-                                                        FilePath workspace,
-                                                        TaskListener listener,
-                                                        String accurevPath,
-                                                        Launcher launcher)
+            Map<String, String> accurevEnv,
+            FilePath workspace,
+            TaskListener listener,
+            String accurevPath,
+            Launcher launcher)
             throws IOException, InterruptedException {
         final ArgumentListBuilder cmd = new ArgumentListBuilder();
         cmd.add(accurevPath);
@@ -644,15 +663,15 @@
     }
 
     private boolean captureChangelog(AccurevServer server,
-                                     Map<String, String> accurevEnv,
-                                     FilePath workspace,
-                                     BuildListener listener,
-                                     String accurevPath,
-                                     Launcher launcher,
-                                     Date buildDate,
-                                     Date startDate,
-                                     String stream,
-                                     File changelogFile) throws IOException, InterruptedException {
+            Map<String, String> accurevEnv,
+            FilePath workspace,
+            BuildListener listener,
+            String accurevPath,
+            Launcher launcher,
+            Date buildDate,
+            Date startDate,
+            String stream,
+            File changelogFile) throws IOException, InterruptedException {
         ArgumentListBuilder cmd = new ArgumentListBuilder();
         cmd.add(accurevPath);
         cmd.add("hist");
@@ -853,9 +872,9 @@
                             .equals(requiredUsername);
                     listener.getLogger().println(
                             "Currently authenticated with Accurev server as '"
-                                    + currentUsername
-                                    + (loginRequired ? "', login required"
-                                            : "', not logging in again."));
+                            + currentUsername
+                            + (loginRequired ? "', login required"
+                            : "', not logging in again."));
                 }
             } else {
                 loginRequired = true;
@@ -1069,13 +1088,13 @@
      * @throws InterruptedException
      */
     private boolean checkStreamForChanges(AccurevServer server,
-                                          Map<String, String> accurevEnv,
-                                          FilePath workspace,
-                                          TaskListener listener,
-                                          String accurevPath,
-                                          Launcher launcher,
-                                          String stream,
-                                          Date buildDate)
+            Map<String, String> accurevEnv,
+            FilePath workspace,
+            TaskListener listener,
+            String accurevPath,
+            Launcher launcher,
+            String stream,
+            Date buildDate)
             throws IOException, InterruptedException {
         AccurevTransaction latestCodeChangeTransaction = new AccurevTransaction();
         latestCodeChangeTransaction.setDate(NO_TRANS_DATE);
@@ -1095,7 +1114,7 @@
 
         listener.getLogger().println(//
                 "Checking transactions of type " + Arrays.asList(validTransactionTypes) + //
-                        " in stream [" + stream + "]");
+                " in stream [" + stream + "]");
         for (final String transactionType : validTransactionTypes) {
             try {
                 final AccurevTransaction tempTransaction = getLatestTransaction(server, accurevEnv, workspace,
diff --git a/src/main/java/hudson/plugins/accurev/ParseChangeLog.java b/src/main/java/hudson/plugins/accurev/ParseChangeLog.java
index 8a24386..2c918ee 100644
--- a/src/main/java/hudson/plugins/accurev/ParseChangeLog.java
+++ b/src/main/java/hudson/plugins/accurev/ParseChangeLog.java
@@ -30,6 +30,11 @@
      */
     public ChangeLogSet<AccurevTransaction> parse(AbstractBuild build, File changelogFile)//
             throws IOException, SAXException {
+        List<AccurevTransaction> transactions = parse(changelogFile);
+        return new AccurevChangeLogSet(build, transactions);
+    }
+
+	private List<AccurevTransaction> parse(File changelogFile) throws IOException{
         List<AccurevTransaction> transactions = null;
         try {
             XmlPullParser parser = XmlParserFactory.newParser();
@@ -39,7 +44,7 @@
                 fis = new FileReader(changelogFile);
                 bis = new BufferedReader(fis);
                 parser.setInput(bis);
-                transactions = parseTransactions(parser);
+                transactions = parseTransactions(parser, changelogFile);
             } finally {
                 if (bis != null) {
                     bis.close();
@@ -54,15 +59,15 @@
         } catch (XmlPullParserException e) {
             throw new IOException2(e);
         }
-
+		
         logger.info("transactions size = " + transactions.size());
-        return new AccurevChangeLogSet(build, transactions);
-    }
-
-    private List<AccurevTransaction> parseTransactions(XmlPullParser parser) throws IOException, XmlPullParserException {
+		return transactions;
+	}
+    private List<AccurevTransaction> parseTransactions(XmlPullParser parser, File changeLogFile) throws IOException, XmlPullParserException {
         List<AccurevTransaction> transactions = new ArrayList<AccurevTransaction>();
         AccurevTransaction currentTransaction = null;
         boolean inComment = false;
+		boolean inConsolidatedChangeLog = false;
         while (true) {
             switch (parser.next()) {
             case XmlPullParser.START_DOCUMENT:
@@ -72,6 +77,7 @@
             case XmlPullParser.START_TAG:
                 final String tagName = parser.getName();
                 inComment = "comment".equalsIgnoreCase(tagName);
+				inConsolidatedChangeLog = "ChangeLog".equalsIgnoreCase(tagName);
                 if ("transaction".equalsIgnoreCase(tagName)) {
                     currentTransaction = new AccurevTransaction();
                     transactions.add(currentTransaction);
@@ -98,6 +104,10 @@
                 if (inComment && currentTransaction != null) {
                     currentTransaction.setMsg(parser.getText());
                 }
+				if (inConsolidatedChangeLog){
+					File subChangeLog = new File(changeLogFile.getParent(), parser.getText());
+					transactions.addAll(parse(subChangeLog));
+				}
                 break;
             }
         }
diff --git a/src/main/java/hudson/plugins/accurev/XmlConsolidateStreamChangeLog.java b/src/main/java/hudson/plugins/accurev/XmlConsolidateStreamChangeLog.java
new file mode 100644
index 0000000..dfa5529
--- /dev/null
+++ b/src/main/java/hudson/plugins/accurev/XmlConsolidateStreamChangeLog.java
@@ -0,0 +1,75 @@
+package hudson.plugins.accurev;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.logging.Logger;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
+
+/**
+ *
+ */
+public class XmlConsolidateStreamChangeLog {
+
+	private static final Logger logger = Logger.getLogger(AccurevSCM.class.getName());
+	private static final Map<Class<XMLOutputFactory>, XMLOutputFactory> OUTPUT_FACTORY_CACHE = new WeakHashMap<Class<XMLOutputFactory>, XMLOutputFactory>(1);
+
+	static XMLOutputFactory getFactory() {
+		synchronized (OUTPUT_FACTORY_CACHE) {
+			final XMLOutputFactory existingFactory = OUTPUT_FACTORY_CACHE.get(XMLOutputFactory.class);
+			if (existingFactory != null) {
+				return existingFactory;
+			}
+			XMLOutputFactory newFactory = XMLOutputFactory.newFactory();
+			OUTPUT_FACTORY_CACHE.put(XMLOutputFactory.class, newFactory);
+			return newFactory;
+		}
+
+	}
+
+	public static File getStreamChangeLogFile(File changelogFile, AccurevStream stream) {
+		File dir = changelogFile.getParentFile();
+		File retVal = new File(dir, stream.getName() + "_" + changelogFile.getName());
+		return retVal;
+	}
+
+	public static void createChangeLog(List<String> streamFiles, File changeLogFile) {
+		FileOutputStream changeLogStream = null;
+		try {
+			changeLogStream = new FileOutputStream(changeLogFile);
+			XMLOutputFactory outputFactory = getFactory();
+			XMLStreamWriter streamWriter = outputFactory.createXMLStreamWriter(changeLogStream);
+			streamWriter.writeStartDocument();
+			streamWriter.writeStartElement("ChangeLogs");
+			for (String streamFile : streamFiles) {
+				streamWriter.writeStartElement("ChangeLog");
+				streamWriter.writeCharacters(streamFile);
+				streamWriter.writeEndElement();
+			}
+			streamWriter.writeEndElement();
+			streamWriter.writeEndDocument();
+		} catch (FileNotFoundException ex) {
+			AccurevLauncher.logException("Unable to create consolidated changelog " + XmlConsolidateStreamChangeLog.class.getSimpleName(), ex,
+					logger, null);
+		} catch (XMLStreamException ex) {
+			AccurevLauncher.logException("Unable to create consolidated changelog " + XmlConsolidateStreamChangeLog.class.getSimpleName(), ex,
+					logger, null);
+		} finally {
+			try {
+				if (changeLogStream != null) {
+					changeLogStream.close();
+				}
+			} catch (IOException ex) {
+				AccurevLauncher.logException("Unable to create consolidated changelog " + XmlConsolidateStreamChangeLog.class.getSimpleName(), ex,
+						logger, null);
+			}
+		}
+
+	}
+}
