diff --git a/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java b/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java
index f57b1d6a9fe8d903373caff713207df044e0c8e7..0d34029b7ef99e0ed09e646056bc6f720fdf4989 100755
--- a/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java
@@ -58,6 +58,14 @@ public class BlackboardAttribute {
 	private long artifactID;
 	private SleuthkitCase sleuthkitCase;
 	private String sources;
+	
+	// Cached parent artifact. This field is populated lazily upon the first
+	// call to getParentArtifact().
+	private BlackboardArtifact parentArtifact;
+	
+	// The parent data source is defined as being 
+	// the data source of the parent artifact.
+	private Long parentDataSourceID;
 
 	/**
 	 * Constructs a standard attribute with an integer value. The attribute
@@ -474,7 +482,10 @@ public void addSource(String source) throws TskCoreException {
 	 *                          case database.
 	 */
 	public BlackboardArtifact getParentArtifact() throws TskCoreException {
-		return sleuthkitCase.getBlackboardArtifact(artifactID);
+		if (parentArtifact == null) {
+			parentArtifact = sleuthkitCase.getBlackboardArtifact(artifactID);
+		}
+		return parentArtifact;
 	}
 
 	@Override
@@ -531,7 +542,11 @@ public String getDisplayString() {
 
 			case DATETIME: {
 				try {
-					final Content dataSource = getParentArtifact().getDataSource();
+					if (parentDataSourceID == null) {
+						BlackboardArtifact parent = getParentArtifact();
+						parentDataSourceID = parent.getDataSourceObjectID();
+					}
+					final Content dataSource = sleuthkitCase.getContentById(parentDataSourceID);
 					if ((dataSource != null) && (dataSource instanceof Image)) {
 						// return the date/time string in the timezone associated with the datasource,
 						Image image = (Image) dataSource;
@@ -612,6 +627,16 @@ void setCaseDatabase(SleuthkitCase sleuthkitCase) {
 	void setArtifactId(long artifactID) {
 		this.artifactID = artifactID;
 	}
+	
+	/**
+	 * Sets the parent data source id. The parent data source is defined
+	 * as being the data source of the parent artifact.
+	 * 
+	 * @param parentDataSourceID The parent data source id.
+	 */
+	void setParentDataSourceID(long parentDataSourceID) {
+		this.parentDataSourceID = parentDataSourceID;
+	}
 
 	/**
 	 * Gets the sources of this attribute.
diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
index f380bc88aedeeeaa47004a371a6fd833317bb446..40436741704157b731d3ee429878a5cb251f6c23 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
@@ -4406,6 +4406,7 @@ public ArrayList<BlackboardAttribute> getBlackboardAttributes(final BlackboardAr
 						rs.getString("value_text"),
 						rs.getBytes("value_byte"), this
 				);
+				attr.setParentDataSourceID(artifact.getDataSourceObjectID());
 				attributes.add(attr);
 			}
 			return attributes;