diff --git a/bindings/java/src/org/sleuthkit/datamodel/AccountFileInstance.java b/bindings/java/src/org/sleuthkit/datamodel/AccountFileInstance.java
index 2c4ea7c078bed4726c2b57db09b86140fda7bcb7..6552269112f007d2faecc266167c68f362e77976 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/AccountFileInstance.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/AccountFileInstance.java
@@ -103,7 +103,7 @@ public Content getFile() throws TskCoreException {
 	 *
 	 * @return A Data Source Object ID
 	 */
-	long getDataSourceObjectID() {
+	Long getDataSourceObjectID() {
 		return artifact.getDataSourceObjectID();
 	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/AggregateScoresChangedEvent.java b/bindings/java/src/org/sleuthkit/datamodel/AggregateScoresChangedEvent.java
index d60ac44a0e6cf3c0e5711244d36fe18cf52f750f..2165989c9d7a08b355394953d6777eddf34db3c9 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/AggregateScoresChangedEvent.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/AggregateScoresChangedEvent.java
@@ -34,7 +34,7 @@ final public class AggregateScoresChangedEvent implements TskDataSourceEvent, Ts
 		// ensure that all score changes have the same data source as the one in the event.
 		scoreChanges.stream()
 				.forEach(chg -> {
-					if (chg.getDataSourceObjectId() != dataSourceId) {
+					if (!chg.getDataSourceObjectId().equals(dataSourceId)) {
 						throw new IllegalArgumentException("ScoreChange datasource id does not match the datasource id of the event.");
 					}
 				});
diff --git a/bindings/java/src/org/sleuthkit/datamodel/BlackboardArtifact.java b/bindings/java/src/org/sleuthkit/datamodel/BlackboardArtifact.java
index b1c0f10c05147111e039f91c467e3069460fcb66..88bdd806bb5b79b7cf733bed203a5b7c3d72fb21 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/BlackboardArtifact.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/BlackboardArtifact.java
@@ -54,7 +54,7 @@ public class BlackboardArtifact implements Content {
 	private final long artifactId;
 	private final long sourceObjId;				// refers to objID of parent/source object
 	private final long artifactObjId;			// objId of the artifact in tsk_objects. TBD: replace artifactID with this
-	private final long dataSourceObjId;			// objId of the data source in tsk_objects.
+	private final Long dataSourceObjId;			// objId of the data source in tsk_objects.
 	private final int artifactTypeId;
 	private final String artifactTypeName;
 	private final String displayName;
@@ -856,7 +856,7 @@ public String getName() {
 
 	@Override
 	public Content getDataSource() throws TskCoreException {
-		return getSleuthkitCase().getContentById(dataSourceObjId);
+		return dataSourceObjId != null ? getSleuthkitCase().getContentById(dataSourceObjId) : null;
 	}
 
 	/**
diff --git a/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java b/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java
index 82033ba71a8b59c2f4c519118a684aaa8e22fb50..7f3ecbf56f5b12d8aa71745eb1f7a8e524c32c9f 100755
--- a/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/BlackboardAttribute.java
@@ -1,7 +1,7 @@
 /*
  * Sleuth Kit Data Model
  *
- * Copyright 2011-2020 Basis Technology Corp.
+ * Copyright 2011-2021 Basis Technology Corp.
  * Contact: carrier <at> sleuthkit <dot> org
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -343,6 +343,7 @@ public String toString() {
 	 *
 	 * @return The value as a string.
 	 */
+	@Override
 	public String getDisplayString() {
 		switch (getAttributeType().getValueType()) {
 			case DATETIME: {
@@ -351,7 +352,7 @@ public String getDisplayString() {
 						BlackboardArtifact parent = getParentArtifact();
 						parentDataSourceID = parent.getDataSourceObjectID();
 					}
-					final Content dataSource = getCaseDatabase().getContentById(parentDataSourceID);
+					final Content dataSource = parentDataSourceID != null ? getCaseDatabase().getContentById(parentDataSourceID) : null;
 					if ((dataSource != null) && (dataSource instanceof Image)) {
 						// return the date/time string in the timezone associated with the datasource,
 						Image image = (Image) dataSource;
@@ -404,7 +405,7 @@ public String getDisplayString() {
 	 *
 	 * @param parentDataSourceID The parent data source id.
 	 */
-	void setParentDataSourceID(long parentDataSourceID) {
+	void setParentDataSourceID(Long parentDataSourceID) {
 		this.parentDataSourceID = parentDataSourceID;
 	}
 
diff --git a/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java b/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java
index 476f823cf755b8d7d01d32490566c20ce7782d8b..2e54a3d48d45ff324d15ad536731b8d503564e06 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java
@@ -355,6 +355,10 @@ public Account getAccount(org.sleuthkit.datamodel.Account.Type accountType, Stri
 	public void addRelationships(AccountFileInstance sender, List<AccountFileInstance> recipients,
 			BlackboardArtifact sourceArtifact, org.sleuthkit.datamodel.Relationship.Type relationshipType, long dateTime) throws TskCoreException, TskDataException {
 
+		if(sourceArtifact.getDataSourceObjectID() == null) {
+			throw new TskDataException("Source Artifact does not have a valid data source.");
+		}
+		
 		if (relationshipType.isCreatableFrom(sourceArtifact) == false) {
 			throw new TskDataException("Can not make a " + relationshipType.getDisplayName()
 					+ " relationship from a" + sourceArtifact.getDisplayName());
@@ -370,7 +374,7 @@ public void addRelationships(AccountFileInstance sender, List<AccountFileInstanc
 
 		if (null != sender) {
 			accountIDs.add(sender.getAccount().getAccountID());
-			if (sender.getDataSourceObjectID() != sourceArtifact.getDataSourceObjectID()) {
+			if (!sender.getDataSourceObjectID().equals(sourceArtifact.getDataSourceObjectID())) {
 				throw new TskDataException("Sender and relationship are from different data sources :"
 						+ "Sender source ID" + sender.getDataSourceObjectID() + " != relationship source ID" + sourceArtifact.getDataSourceObjectID());
 			}
@@ -378,7 +382,7 @@ public void addRelationships(AccountFileInstance sender, List<AccountFileInstanc
 
 		for (AccountFileInstance recipient : recipients) {
 			accountIDs.add(recipient.getAccount().getAccountID());
-			if (recipient.getDataSourceObjectID() != sourceArtifact.getDataSourceObjectID()) {
+			if (!recipient.getDataSourceObjectID().equals(sourceArtifact.getDataSourceObjectID())) {
 				throw new TskDataException("Recipient and relationship are from different data sources :"
 						+ "Recipient source ID" + recipient.getDataSourceObjectID() + " != relationship source ID" + sourceArtifact.getDataSourceObjectID());
 			}
diff --git a/bindings/java/src/org/sleuthkit/datamodel/ScoreChange.java b/bindings/java/src/org/sleuthkit/datamodel/ScoreChange.java
index f22142a6d65f71edd3025436f0de5f8636597c48..cf051b71dd02b7fef7840e4864eb37c8addee96c 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/ScoreChange.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/ScoreChange.java
@@ -1,7 +1,7 @@
 /*
  * Sleuth Kit Data Model
  *
- * Copyright 2020 Basis Technology Corp.
+ * Copyright 2020-2021 Basis Technology Corp.
  * Contact: carrier <at> sleuthkit <dot> org
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -18,24 +18,26 @@
  */
 package org.sleuthkit.datamodel;
 
+import java.util.Optional;
+
 /**
  * This class encapsulates a score change.
  */
 final public class ScoreChange {
 
 	private final long objId;
-	private final long dataSourceObjectId;
+	private final Long dataSourceObjectId;
 	private final Score oldScore;
 	private final Score newScore;
 
-	ScoreChange(long objId, long dataSourceObjectId, Score oldScore, Score newScore) {
+	ScoreChange(long objId, Long dataSourceObjectId, Score oldScore, Score newScore) {
 		this.objId = objId;
 		this.dataSourceObjectId = dataSourceObjectId;
 		this.oldScore = oldScore;
 		this.newScore = newScore;
 	}
 
-	public long getDataSourceObjectId() {
+	public Long getDataSourceObjectId() {
 		return dataSourceObjectId;
 	}
 
diff --git a/bindings/java/src/org/sleuthkit/datamodel/TimelineManager.java b/bindings/java/src/org/sleuthkit/datamodel/TimelineManager.java
index 57b05c05b03156459afd8da08af73facefd99fcf..0669e5ba890dc85b8d809bfbf4c798d84f90f658 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/TimelineManager.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/TimelineManager.java
@@ -814,7 +814,12 @@ private Optional<TimelineEvent> addArtifactEvent(TimelineEventDescriptionWithTim
 		String shortDescription = eventPayload.getDescription(TimelineLevelOfDetail.LOW);
 		long artifactID = artifact.getArtifactID();
 		long fileObjId = artifact.getObjectID();
-		long dataSourceObjectID = artifact.getDataSourceObjectID();
+		Long dataSourceObjectID = artifact.getDataSourceObjectID();
+		
+		if(dataSourceObjectID == null) {
+			logger.log(Level.SEVERE, String.format("Failed to create timeline event for artifact (%d), artifact data source was null"), artifact.getId());
+			return Optional.empty();
+		}
 
 		AbstractFile file = caseDB.getAbstractFileById(fileObjId);
 		boolean hasHashHits = false;