diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
index 3f7ad417bcd6bc9908b30d81c26768222ce78565..69d98bd4400ac9a83b721616b506a1d96f34440f 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
@@ -9593,7 +9593,7 @@ public List<TagName> getAllTagNames() throws TskCoreException {
 			resultSet = connection.executeQuery(statement);
 			ArrayList<TagName> tagNames = new ArrayList<>();
 			while (resultSet.next()) {
-				tagNames.add(new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				tagNames.add(new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
 						resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),
 						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"))); //NON-NLS
 			}
@@ -9627,7 +9627,7 @@ public List<TagName> getTagNamesInUse() throws TskCoreException {
 			resultSet = connection.executeQuery(statement);
 			ArrayList<TagName> tagNames = new ArrayList<>();
 			while (resultSet.next()) {
-				tagNames.add(new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				tagNames.add(new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
 						resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),
 						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"))); //NON-NLS
 			}
@@ -9671,7 +9671,7 @@ public List<TagName> getTagNamesInUse(long dsObjId) throws TskCoreException {
 			statement.setLong(2, dsObjId);
 			resultSet = connection.executeQuery(statement); //NON-NLS
 			while (resultSet.next()) {
-				tagNames.add(new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				tagNames.add(new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
 						resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),
 						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"))); //NON-NLS
 			}
@@ -9746,8 +9746,8 @@ public TagName addOrUpdateTagName(String displayName, String description, TagNam
 			resultSet = connection.executeQuery(statement);
 			resultSet.next();
 
-			return new TagName(this, tagId,
-					displayName, description, color, knownStatus, resultSet.getLong("tag_set_id"), resultSet.getInt("rank"));
+			return new TagName(tagId, displayName, description, color, knownStatus, resultSet.getLong("tag_set_id"), resultSet.getInt("rank"));
+			
 		} catch (SQLException ex) {
 			throw new TskCoreException("Error adding row for " + displayName + " tag name to tag_names table", ex);
 		} finally {
@@ -9819,7 +9819,7 @@ public List<ContentTag> getAllContentTags() throws TskCoreException {
 			resultSet = connection.executeQuery(statement);
 			ArrayList<ContentTag> tags = new ArrayList<ContentTag>();
 			while (resultSet.next()) {
-				TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
 						resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),
 						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"));  //NON-NLS
 				Content content = getContentById(resultSet.getLong("obj_id")); //NON-NLS
@@ -9949,7 +9949,7 @@ public ContentTag getContentTagByID(long contentTagID) throws TskCoreException {
 			resultSet = connection.executeQuery(statement);
 
 			while (resultSet.next()) {
-				TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
 						resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),
 						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"));
 				tag = new ContentTag(resultSet.getLong("tag_id"), getContentById(resultSet.getLong("obj_id")), tagName,
@@ -10085,7 +10085,7 @@ public List<ContentTag> getContentTagsByContent(Content content) throws TskCoreE
 			resultSet = connection.executeQuery(statement);
 			ArrayList<ContentTag> tags = new ArrayList<ContentTag>();
 			while (resultSet.next()) {
-				TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
 						resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),
 						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"));  //NON-NLS
 				ContentTag tag = new ContentTag(resultSet.getLong("tag_id"), content, tagName,
@@ -10165,7 +10165,7 @@ public List<BlackboardArtifactTag> getAllBlackboardArtifactTags() throws TskCore
 			resultSet = connection.executeQuery(statement);
 			ArrayList<BlackboardArtifactTag> tags = new ArrayList<>();
 			while (resultSet.next()) {
-				TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
 						resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),
 						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"));  //NON-NLS
 				BlackboardArtifact artifact = getBlackboardArtifact(resultSet.getLong("artifact_id")); //NON-NLS
@@ -10395,7 +10395,7 @@ public BlackboardArtifactTag getBlackboardArtifactTagByID(long artifactTagID) th
 			resultSet = connection.executeQuery(statement);
 
 			while (resultSet.next()) {
-				TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
 						resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),
 						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"));
 				BlackboardArtifact artifact = getBlackboardArtifact(resultSet.getLong("artifact_id")); //NON-NLS
@@ -10443,7 +10443,7 @@ public List<BlackboardArtifactTag> getBlackboardArtifactTagsByArtifact(Blackboar
 			resultSet = connection.executeQuery(statement);
 			ArrayList<BlackboardArtifactTag> tags = new ArrayList<>();
 			while (resultSet.next()) {
-				TagName tagName = new TagName(this, resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
 						resultSet.getString("description"), TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),
 						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"), resultSet.getInt("rank"));  //NON-NLS
 				Content content = getContentById(artifact.getObjectID());
diff --git a/bindings/java/src/org/sleuthkit/datamodel/TagName.java b/bindings/java/src/org/sleuthkit/datamodel/TagName.java
index 131073bf5f44245861df7f8bdd36f18de86120e7..c514db5ff92fb1a3138bb798faa3272613836a0a 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/TagName.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/TagName.java
@@ -1,7 +1,7 @@
 /*
  * Sleuth Kit Data Model
  *
- * Copyright 2011-2018 Basis Technology Corp.
+ * Copyright 2013-2020 Basis Technology Corp.
  * Contact: carrier <at> sleuthkit <dot> org
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +20,6 @@
 
 import java.io.Serializable;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Objects;
 
 /**
@@ -89,10 +88,9 @@ public static HTML_COLOR getColorByName(String colorName) {
 	private final TskData.FileKnown knownStatus;
 	private final long tagSetId;
 	private final int rank;
-	private final SleuthkitCase skCase;
 
 	// Clients of the org.sleuthkit.datamodel package should not directly create these objects.
-	TagName(SleuthkitCase sleuthkitCase, long id, String displayName, String description, HTML_COLOR color, TskData.FileKnown knownStatus, long tagSetId, int rank) {
+	TagName(long id, String displayName, String description, HTML_COLOR color, TskData.FileKnown knownStatus, long tagSetId, int rank) {
 		this.id = id;
 		this.displayName = displayName;
 		this.description = description;
@@ -100,7 +98,6 @@ public static HTML_COLOR getColorByName(String colorName) {
 		this.knownStatus = knownStatus;
 		this.tagSetId = tagSetId;
 		this.rank = rank;
-		this.skCase = sleuthkitCase;
 	}
 
 	public long getId() {
@@ -131,27 +128,6 @@ public int getRank() {
 		return rank;
 	}
 
-	/**
-	 * Returns the TagName TagSet object.
-	 *
-	 * @return TagName TagSet object or null if the TagName is not a part of a
-	 *         TagSet.
-	 *
-	 * @throws TskCoreException
-	 */
-	public TagSet getTagSet() throws TskCoreException {
-		if (tagSetId != 0) {
-			List<TagSet> tagSets = skCase.getTaggingManager().getTagSets();
-			for (TagSet set : tagSets) {
-				if (tagSetId == set.getId()) {
-					return set;
-				}
-			}
-		}
-
-		return null;
-	}
-
 	/**
 	 * Compares two TagName objects by comparing their display names.
 	 *
@@ -185,11 +161,11 @@ public boolean equals(Object obj) {
 			return false;
 		}
 		final TagName other = (TagName) obj;
-		return (this.id == other.id
-				&& Objects.equals(this.displayName, other.displayName)
-				&& Objects.equals(this.description, other.description)
-				&& Objects.equals(this.color, other.color)
-				&& Objects.equals(this.knownStatus, other.knownStatus)
-				&& this.tagSetId == other.tagSetId);
+		return (this.id == other.getId()
+				&& Objects.equals(this.displayName, other.getDisplayName())
+				&& Objects.equals(this.description, other.getDescription())
+				&& Objects.equals(this.color, other.getColor())
+				&& Objects.equals(this.knownStatus, other.getKnownStatus())
+				&& this.tagSetId == other.getTagSetId());
 	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java b/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java
index 97e8b7b4b7a42e1d4b963e9c234104a3f25c3c95..b4e8803e03905dc8d903c168c329d7bdb60d6da3 100755
--- a/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java
@@ -112,7 +112,7 @@ public TagSet addTagSet(String name, List<TagName> tagNames) throws TskCoreExcep
 					for (int index = 0; index < tagNames.size(); index++) {
 						TagName tagName = tagNames.get(index);
 						stmt.executeUpdate(String.format("UPDATE tag_names SET tag_set_id = %d, rank = %d WHERE tag_name_id = %d", setID, index, tagName.getId()));
-						updatedTags.add(new TagName(skCase, tagName.getId(),
+						updatedTags.add(new TagName(tagName.getId(),
 								tagName.getDisplayName(),
 								tagName.getDescription(),
 								tagName.getColor(),
@@ -173,6 +173,43 @@ public void deleteTagSet(TagSet tagSet) throws TskCoreException {
 		}
 	}
 
+	/**
+	 * Gets the tag set a tag name (tag definition) belongs to, if any.
+	 *
+	 * @param tagName The tag name.
+	 *
+	 * @return A TagSet object or null.
+	 *
+	 * @throws TskCoreException If there is an error querying the case database.
+	 */
+	public TagSet getTagSetForTagName(TagName tagName) throws TskCoreException {
+		if (tagName == null || tagName == null) {
+			throw new IllegalArgumentException("Null tagName argument");
+		}
+		
+		if (tagName.getTagSetId() <= 0) {
+			return null;
+		}
+		
+		CaseDbConnection connection = skCase.getConnection();
+		skCase.acquireSingleUserCaseReadLock();
+		TagSet tagSet = null;
+		String sqlQuery = String.format("SELECT * FROM tsk_tag_sets WHERE tag_set_id = %d", tagName.getTagSetId());
+		try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(sqlQuery);) {
+			if (resultSet.next()) {
+				int setID = resultSet.getInt("tag_set_id");
+				String setName = resultSet.getString("name");
+				tagSet = new TagSet(setID, setName, getTagNamesByTagSetID(setID));
+			}
+			return tagSet;
+		} catch (SQLException ex) {
+			throw new TskCoreException(String.format("Error occurred getting TagSet for TagName '%s' (ID=%d)", tagName.getDisplayName(), tagName.getId()), ex);
+		} finally {
+			connection.close();
+			skCase.releaseSingleUserCaseReadLock();
+		}
+	}
+
 	/**
 	 * Inserts a row into the blackboard_artifact_tags table in the case
 	 * database.
@@ -208,7 +245,6 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T
 				try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(selectQuery)) {
 					while (resultSet.next()) {
 						TagName removedTag = new TagName(
-								skCase,
 								resultSet.getLong("tag_name_id"),
 								resultSet.getString("display_name"),
 								resultSet.getString("description"),
@@ -305,7 +341,6 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c
 				try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(selectQuery)) {
 					while (resultSet.next()) {
 						TagName removedTag = new TagName(
-								skCase,
 								resultSet.getLong("tag_name_id"),
 								resultSet.getString("display_name"),
 								resultSet.getString("description"),
@@ -438,7 +473,7 @@ private List<TagName> getTagNamesByTagSetID(int tagSetId) throws TskCoreExceptio
 		String query = String.format("SELECT * FROM tag_names WHERE tag_set_id = %d", tagSetId);
 		try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(query)) {
 			while (resultSet.next()) {
-				tagNameList.add(new TagName(skCase, resultSet.getLong("tag_name_id"),
+				tagNameList.add(new TagName(resultSet.getLong("tag_name_id"),
 						resultSet.getString("display_name"),
 						resultSet.getString("description"),
 						TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),