diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
index 988e6687a5e61989ef24a718392773f522e73863..2c2e6f32076dfd12369c428a621eac25cf3296ce 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
@@ -2148,7 +2148,7 @@ private CaseDbSchemaVersionNumber updateFromSchema8dot4toSchema8dot5(CaseDbSchem
 					throw new TskCoreException("Failed to retrieve the default tag_set_id from DB");
 				}
 			}
-			
+
 			// Add data_source_obj_id column to the tsk_files table. For newly created cases
 			// this column will have a foreign key constraint on the data_source_info table.
 			// There does not seem to be a reasonable way to do this in an upgrade,
@@ -2171,7 +2171,7 @@ private CaseDbSchemaVersionNumber updateFromSchema8dot4toSchema8dot5(CaseDbSchem
 			} finally {
 				closeStatement(updateStatement);
 			}
-			
+
 			return new CaseDbSchemaVersionNumber(8, 5);
 
 		} finally {
@@ -6093,7 +6093,7 @@ public FileSystem addFileSystem(long parentObjId, long imgOffset, TskData.TSK_FS
 
 			// Get the data source object ID
 			long dataSourceId = getDataSourceObjectId(connection, newObjId);
-			
+
 			// Add a row to tsk_fs_info
 			// INSERT INTO tsk_fs_info (obj_id, data_source_obj_id, img_offset, fs_type, block_size, block_count, root_inum, first_inum, last_inum, display_name)
 			PreparedStatement preparedStatement = connection.getPreparedStatement(PREPARED_STATEMENT.INSERT_FS_INFO);
@@ -7888,13 +7888,13 @@ Directory getDirectoryById(long id, FileSystem parentFs) throws TskCoreException
 	 * @param image Image to lookup FileSystem for
 	 *
 	 * @return Collection of FileSystems in the image
-	 * 
+	 *
 	 * @throws TskCoreException
 	 */
-	public Collection<FileSystem> getImageFileSystems(Image image) throws TskCoreException {		
+	public Collection<FileSystem> getImageFileSystems(Image image) throws TskCoreException {
 		List<FileSystem> fileSystems = new ArrayList<>();
 		CaseDbConnection connection = connections.getConnection();
-		
+
 		acquireSingleUserCaseReadLock();
 		Statement s = null;
 		ResultSet rs = null;
@@ -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(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				tagNames.add(new TagName(this, 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(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				tagNames.add(new TagName(this, 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(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				tagNames.add(new TagName(this, 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,7 +9746,7 @@ public TagName addOrUpdateTagName(String displayName, String description, TagNam
 			resultSet = connection.executeQuery(statement);
 			resultSet.next();
 
-			return new TagName(tagId,
+			return new TagName(this, 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);
@@ -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(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(this, 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(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(this, 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(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(this, 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(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(this, 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(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(this, 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(resultSet.getLong("tag_name_id"), resultSet.getString("display_name"),
+				TagName tagName = new TagName(this, 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());
@@ -11307,7 +11307,7 @@ void addLayoutFileRangeJNI(long objId, long byteStart, long byteLen,
 			releaseSingleUserCaseWriteLock();
 		}
 	}
-	
+
 	/**
 	 * Stores a pair of object ID and its type
 	 */
@@ -12865,15 +12865,16 @@ public LocalFile addLocalFile(String fileName, String localPath,
 	public AddImageProcess makeAddImageProcess(String timezone, boolean addUnallocSpace, boolean noFatFsOrphans) {
 		return this.caseHandle.initAddImageProcess(timezone, addUnallocSpace, noFatFsOrphans, "", this);
 	}
-	
+
 	/**
 	 * Helper to return FileSystems in an Image
 	 *
 	 * @param image Image to lookup FileSystem for
 	 *
 	 * @return Collection of FileSystems in the image
-	 * 
-	 * @deprecated Use getImageFileSystems which throws an exception if an error occurs.
+	 *
+	 * @deprecated Use getImageFileSystems which throws an exception if an error
+	 * occurs.
 	 */
 	@Deprecated
 	public Collection<FileSystem> getFileSystems(Image image) {
diff --git a/bindings/java/src/org/sleuthkit/datamodel/TagName.java b/bindings/java/src/org/sleuthkit/datamodel/TagName.java
index 769971b5e9be1776d6a8aab10a5fce03c3db4971..131073bf5f44245861df7f8bdd36f18de86120e7 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/TagName.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/TagName.java
@@ -20,6 +20,7 @@
 
 import java.io.Serializable;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -33,23 +34,23 @@ public class TagName implements Comparable<TagName>, Serializable {
 
 	public enum HTML_COLOR {
 
-		NONE	("None",	""), //NON-NLS
-		WHITE	("White",	"#FFFFFF"), //NON-NLS
-		SILVER	("Silver",	"#C0C0C0"), //NON-NLS
-		GRAY	("Gray",	"#808080"), //NON-NLS
-		BLACK	("Black",	"#000000"), //NON-NLS
-		RED		("Red",		"#FF0000"), //NON-NLS
-		MAROON	("Maron",	"#800000"), //NON-NLS
-		YELLOW	("Yellow",	"#FFFF00"), //NON-NLS
-		OLIVE	("Olive",	"#808000"), //NON-NLS
-		LIME	("Lime",	"#00FF00"), //NON-NLS
-		GREEN	("Green",	"#008000"), //NON-NLS
-		AQUA	("Aqua",	"#00FFFF"), //NON-NLS
-		TEAL	("Teal",	"#008080"), //NON-NLS
-		BLUE	("Blue",	"#0000FF"), //NON-NLS
-		NAVY	("Navy",	"#000080"), //NON-NLS
-		FUCHSIA	("Fuchsia", "#FF00FF"), //NON-NLS
-		PURPLE	("Purple",	"#800080"); //NON-NLS
+		NONE("None", ""), //NON-NLS
+		WHITE("White", "#FFFFFF"), //NON-NLS
+		SILVER("Silver", "#C0C0C0"), //NON-NLS
+		GRAY("Gray", "#808080"), //NON-NLS
+		BLACK("Black", "#000000"), //NON-NLS
+		RED("Red", "#FF0000"), //NON-NLS
+		MAROON("Maron", "#800000"), //NON-NLS
+		YELLOW("Yellow", "#FFFF00"), //NON-NLS
+		OLIVE("Olive", "#808000"), //NON-NLS
+		LIME("Lime", "#00FF00"), //NON-NLS
+		GREEN("Green", "#008000"), //NON-NLS
+		AQUA("Aqua", "#00FFFF"), //NON-NLS
+		TEAL("Teal", "#008080"), //NON-NLS
+		BLUE("Blue", "#0000FF"), //NON-NLS
+		NAVY("Navy", "#000080"), //NON-NLS
+		FUCHSIA("Fuchsia", "#FF00FF"), //NON-NLS
+		PURPLE("Purple", "#800080"); //NON-NLS
 		private final static HashMap<String, HTML_COLOR> colorMap = new HashMap<String, HTML_COLOR>();
 		private final String name;
 		private final String hexString;
@@ -68,7 +69,7 @@ public enum HTML_COLOR {
 		String getName() {
 			return name;
 		}
-		
+
 		public String getRgbValue() {
 			return hexString;
 		}
@@ -88,9 +89,10 @@ 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(long id, String displayName, String description, HTML_COLOR color, TskData.FileKnown knownStatus, long tagSetId, int rank) {
+	TagName(SleuthkitCase sleuthkitCase, 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;
@@ -98,6 +100,7 @@ public static HTML_COLOR getColorByName(String colorName) {
 		this.knownStatus = knownStatus;
 		this.tagSetId = tagSetId;
 		this.rank = rank;
+		this.skCase = sleuthkitCase;
 	}
 
 	public long getId() {
@@ -123,11 +126,32 @@ public TskData.FileKnown getKnownStatus() {
 	long getTagSetId() {
 		return tagSetId;
 	}
-	
+
 	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.
 	 *
diff --git a/bindings/java/src/org/sleuthkit/datamodel/TagSet.java b/bindings/java/src/org/sleuthkit/datamodel/TagSet.java
index 2821aff4d08f8534f93babfa886f1786b114b908..31e86808e21e04a915bb1ecb40da58b7c175469b 100755
--- a/bindings/java/src/org/sleuthkit/datamodel/TagSet.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/TagSet.java
@@ -18,7 +18,9 @@
  */
 package org.sleuthkit.datamodel;
 
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Objects;
 
@@ -41,7 +43,8 @@ public class TagSet {
 		if (setName == null || setName.isEmpty()) {
 			throw new IllegalArgumentException("TagSet name must be a non-empty string");
 		}
-		this.tagNameList = tagNameList;
+		this.tagNameList = new ArrayList<>(tagNameList);
+		this.tagNameList.sort(new TagNameComparator());
 		this.id = id;
 		this.setName = setName;
 	}
@@ -99,5 +102,18 @@ public int hashCode() {
 
 		return hash;
 	}
-
+	
+	/**
+	 * Comparator for TagNames. TagNames will sort by rank, then TagName.getName().
+	 */
+	private class TagNameComparator implements Comparator<TagName> {
+		@Override
+		public int compare(TagName tagName1, TagName tagName2) {
+			int result = ((Integer)tagName1.getRank()).compareTo(tagName2.getRank());
+			if(result == 0) {
+				result =  tagName1.getDisplayName().compareTo(tagName2.getDisplayName());
+			} 
+			return result;
+		}
+	}
 }
diff --git a/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java b/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java
index 29826d973765b201532398a5c6c391262281d7ad..97e8b7b4b7a42e1d4b963e9c234104a3f25c3c95 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(tagName.getId(),
+						updatedTags.add(new TagName(skCase, tagName.getId(),
 								tagName.getDisplayName(),
 								tagName.getDescription(),
 								tagName.getColor(),
@@ -173,55 +173,6 @@ public void deleteTagSet(TagSet tagSet) throws TskCoreException {
 		}
 	}
 
-	/**
-	 * Add the given TagName to the TagSet.
-	 *
-	 * @param tagSet	 The tag set being added to.
-	 * @param tagName	The tag name to add to the set.
-	 *
-	 * @return TagSet	TagSet object with newly added TagName.
-	 *
-	 * @throws TskCoreException
-	 */
-	public TagSet addTagNameToTagSet(TagSet tagSet, TagName tagName) throws TskCoreException {
-		if (tagSet == null || tagName == null) {
-			throw new IllegalArgumentException("NULL value passed to addTagToTagSet");
-		}
-
-		// Make sure the tagName is not already in the list.
-		List<TagName> setTagNameList = tagSet.getTagNames();
-		for (TagName tag : setTagNameList) {
-			if (tagName.getId() == tag.getId()) {
-				return tagSet;
-			}
-		}
-
-		CaseDbConnection connection = skCase.getConnection();
-		skCase.acquireSingleUserCaseWriteLock();
-
-		try (Statement stmt = connection.createStatement()) {
-			connection.beginTransaction();
-
-			String queryTemplate = "UPDATE tag_names SET tag_set_id = %d where tag_name_id = %d";
-			stmt.executeUpdate(String.format(queryTemplate, tagSet.getId(), tagName.getId()));
-
-			connection.commitTransaction();
-
-			List<TagName> newTagNameList = new ArrayList<>();
-			newTagNameList.addAll(setTagNameList);
-			newTagNameList.add(new TagName(tagName.getId(), tagName.getDisplayName(), tagName.getDescription(), tagName.getColor(), tagName.getKnownStatus(), tagSet.getId(), tagName.getRank()));
-
-			return new TagSet(tagSet.getId(), tagSet.getName(), newTagNameList);
-
-		} catch (SQLException ex) {
-			connection.rollbackTransaction();
-			throw new TskCoreException(String.format("Error adding TagName (id=%d) to TagSet (id=%s)", tagName.getId(), tagSet.getId()), ex);
-		} finally {
-			connection.close();
-			skCase.releaseSingleUserCaseWriteLock();
-		}
-	}
-
 	/**
 	 * Inserts a row into the blackboard_artifact_tags table in the case
 	 * database.
@@ -257,6 +208,7 @@ 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"),
@@ -353,6 +305,7 @@ 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"),
@@ -485,7 +438,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(resultSet.getLong("tag_name_id"),
+				tagNameList.add(new TagName(skCase, resultSet.getLong("tag_name_id"),
 						resultSet.getString("display_name"),
 						resultSet.getString("description"),
 						TagName.HTML_COLOR.getColorByName(resultSet.getString("color")),