diff --git a/src/main/java/hudson/plugins/starteam/StarTeamChangeLogParser.java b/src/main/java/hudson/plugins/starteam/StarTeamChangeLogParser.java
index 1bd5a36..a53cdef 100644
--- a/src/main/java/hudson/plugins/starteam/StarTeamChangeLogParser.java
+++ b/src/main/java/hudson/plugins/starteam/StarTeamChangeLogParser.java
@@ -29,84 +29,101 @@ import org.xml.sax.SAXException;
  */
 public class StarTeamChangeLogParser extends ChangeLogParser {
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see hudson.scm.ChangeLogParser#parse(hudson.model.AbstractBuild,
-	 *      java.io.File)
-	 */
-	@Override
-	public ChangeLogSet<? extends Entry> parse(AbstractBuild build,
-			File changelogFile) throws IOException, SAXException {
-		return StarTeamChangeLogParser.parse(build, new FileInputStream(
-				changelogFile));
-	}
-	/**
-	 * Parses the change log stream and returns a Perforce change log set.
-	 * 
-	 * @param aBuild
-	 *            the build for the change log
-	 * @param aChangeLogStream
-	 *            input stream containing the change log
-	 * @return the change log set
-	 */
-	@SuppressWarnings("unchecked")
-	public static StarTeamChangeLogSet parse(AbstractBuild aBuild,
-			InputStream aChangeLogStream) throws IOException, SAXException {
-
-		ArrayList<StarTeamChangeLogEntry> changeLogEntries = new ArrayList<StarTeamChangeLogEntry>();
-
-		SAXReader reader = new SAXReader();
-		Document changeDoc = null;
-		StarTeamChangeLogSet changeLogSet = new StarTeamChangeLogSet(aBuild,
-				changeLogEntries);
-
-		try {
-			changeDoc = reader.read(aChangeLogStream);
-
-			Node historyNode = changeDoc.selectSingleNode("/changelog");
-			if (historyNode == null)
-				return changeLogSet;
-
-			List<Node> entries = historyNode.selectNodes("entry");
-			if (entries == null)
-				return changeLogSet;
-
-			for (Node node : entries) {
-				StarTeamChangeLogEntry change = new StarTeamChangeLogEntry();
-
-				if (node.selectSingleNode("fileName") != null)
-					change.setFileName(node.selectSingleNode("fileName")
-							.getStringValue());
-				if (node.selectSingleNode("revisionNumber") != null)
-					change.setRevisionNumber(Integer.parseInt((node.selectSingleNode(
-							"revisionNumber").getStringValue())));
-
-				if (node.selectSingleNode("date") != null)
-					change.setDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
-							.parse(node.selectSingleNode("date")
-									.getStringValue()));
-
-				if (node.selectSingleNode("message") != null)
-					change.setMsg(node.selectSingleNode("message")
-							.getStringValue());
-
-				if (node.selectSingleNode("user") != null)
-					change.setUsername(node.selectSingleNode("user")
-							.getStringValue());
-
-				if (node.selectSingleNode("changeType") != null)
-					change.setChangeType(node.selectSingleNode("changeType")
-							.getStringValue());
-
-				changeLogEntries.add(change);
-			}
-		} catch (Exception e) {
-			throw new IOException("Failed to parse changelog file: "
-					+ e.getMessage());
-		}
-
-		return changeLogSet;
-	}
-
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public ChangeLogSet<? extends Entry> parse(AbstractBuild build,
+      File changelogFile) throws IOException, SAXException {
+    return parse0(build, new FileInputStream(changelogFile),
+        changelogFile.getAbsolutePath());
+  }
+
+  /**
+   * Parses the change log stream and returns a Perforce change log set.
+   * 
+   * @param aBuild
+   *          the build for the change log
+   * @param aChangeLogStream
+   *          input stream containing the change log
+   * @return the change log set
+   */
+  public static StarTeamChangeLogSet parse(AbstractBuild aBuild,
+      InputStream aChangeLogStream) throws IOException, SAXException {
+    return parse0(aBuild, aChangeLogStream, null);
+  }
+
+  private static final ThreadLocal<SimpleDateFormat> TIME_FORMATTER =
+      new ThreadLocal<SimpleDateFormat>() {
+        @Override
+        protected SimpleDateFormat initialValue() {
+          return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        };
+      };
+
+  @SuppressWarnings("unchecked")
+  private static StarTeamChangeLogSet parse0(AbstractBuild aBuild,
+      InputStream aChangeLogStream, String filePath) throws IOException,
+      SAXException {
+
+    ArrayList<StarTeamChangeLogEntry> changeLogEntries =
+        new ArrayList<StarTeamChangeLogEntry>();
+
+    SAXReader reader = new SAXReader();
+    Document changeDoc = null;
+    StarTeamChangeLogSet changeLogSet =
+        new StarTeamChangeLogSet(aBuild, changeLogEntries);
+
+    try {
+      changeDoc = reader.read(aChangeLogStream);
+
+      Node historyNode = changeDoc.selectSingleNode("/changelog");
+      if (historyNode == null) {
+        return changeLogSet;
+      }
+
+      List<Node> entries = historyNode.selectNodes("entry");
+      if (entries == null) {
+        return changeLogSet;
+      }
+
+      for (Node node : entries) {
+        StarTeamChangeLogEntry change = new StarTeamChangeLogEntry();
+
+        if (node.selectSingleNode("fileName") != null) {
+          change
+              .setFileName(node.selectSingleNode("fileName").getStringValue());
+        }
+        if (node.selectSingleNode("revisionNumber") != null) {
+          change.setRevisionNumber(Integer.parseInt((node
+              .selectSingleNode("revisionNumber").getStringValue())));
+        }
+
+        if (node.selectSingleNode("date") != null) {
+          change.setDate(TIME_FORMATTER.get().parse(
+              node.selectSingleNode("date").getStringValue()));
+        }
+
+        if (node.selectSingleNode("message") != null) {
+          change.setMsg(node.selectSingleNode("message").getStringValue());
+        }
+
+        if (node.selectSingleNode("user") != null) {
+          change.setUsername(node.selectSingleNode("user").getStringValue());
+        }
+
+        if (node.selectSingleNode("changeType") != null) {
+          change.setChangeType(node.selectSingleNode("changeType")
+              .getStringValue());
+        }
+
+        change.setParent(changeLogSet); // Assign Parent
+        changeLogEntries.add(change);
+      }
+    } catch (Exception e) {
+      throw new IOException("Failed to parse changelog file"
+          + (filePath != null ? filePath : "") + ": " + e.getMessage(), e);
+    }
+    return changeLogSet;
+  }
 }
