diff --git a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
index da64ae96fef1501d7c167f0240f3f09e0178475f..897faa2f7f60645819974a15c5d9cfe0f68374e2 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/SleuthkitCase.java
@@ -2107,21 +2107,25 @@ private CaseDbSchemaVersionNumber updateFromSchema8dot4toSchema8dot5(CaseDbSchem
 		}
 
 		Statement statement = connection.createStatement();
-		ResultSet results = null;
-
 		acquireSingleUserCaseWriteLock();
 		try {
 			switch (getDatabaseType()) {
 				case POSTGRESQL:
-					statement.execute("CREATE TABLE tag_sets (tag_set_id BIGSERIAL PRIMARY KEY, name TEXT UNIQUE)");
+					statement.execute("CREATE TABLE tsk_tag_sets (tag_set_id BIGSERIAL PRIMARY KEY, name TEXT UNIQUE)");
 					break;
 				case SQLITE:
-					statement.execute("CREATE TABLE tag_sets (tag_set_id INTEGER PRIMARY KEY, name TEST UNIQUE)");
+					statement.execute("CREATE TABLE tsk_tag_sets (tag_set_id INTEGER PRIMARY KEY, name TEXT UNIQUE)");
 					break;
 			}
 
-			statement.execute("ALTER TABLE tag_names ADD COLUMN tag_set_id INTEGER REFERENCES tag_sets(tag_set_id)");
-			statement.execute("INSERT INTO tag_sets (name) VALUES ('Project VIC (United States)')");
+			statement.execute("ALTER TABLE tag_names ADD COLUMN tag_set_id INTEGER REFERENCES tsk_tag_sets(tag_set_id)");
+
+			String insertStmt = "INSERT INTO tsk_tag_sets (name) VALUES ('Project VIC (United States)')";
+			if (getDatabaseType() == DbType.POSTGRESQL) {
+				statement.execute(insertStmt, Statement.RETURN_GENERATED_KEYS);
+			} else {
+				statement.execute(insertStmt);
+			}
 			try (ResultSet resultSet = statement.getGeneratedKeys()) {
 				if (resultSet != null && resultSet.next()) {
 					int tagSetId = resultSet.getInt(1);
@@ -2140,10 +2144,9 @@ private CaseDbSchemaVersionNumber updateFromSchema8dot4toSchema8dot5(CaseDbSchem
 			return new CaseDbSchemaVersionNumber(8, 5);
 
 		} finally {
-			closeResultSet(results);
 			closeStatement(statement);
 			releaseSingleUserCaseWriteLock();
-		}	
+		}
 	}
 
 	/**
@@ -9642,7 +9645,7 @@ public List<TagName> getTagNamesInUse() throws TskCoreException {
 			while (resultSet.next()) {
 				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.getInt("tag_set_id"))); //NON-NLS
+						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"))); //NON-NLS
 			}
 			return tagNames;
 		} catch (SQLException ex) {
@@ -9686,7 +9689,7 @@ public List<TagName> getTagNamesInUse(long dsObjId) throws TskCoreException {
 			while (resultSet.next()) {
 				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.getInt("tag_set_id"))); //NON-NLS
+						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"))); //NON-NLS
 			}
 			return tagNames;
 		} catch (SQLException ex) {
@@ -9824,7 +9827,7 @@ public List<ContentTag> getAllContentTags() throws TskCoreException {
 			while (resultSet.next()) {
 				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.getInt("tag_set_id"));  //NON-NLS
+						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"));  //NON-NLS
 				Content content = getContentById(resultSet.getLong("obj_id")); //NON-NLS
 				tags.add(new ContentTag(resultSet.getLong("tag_id"), content, tagName, resultSet.getString("comment"),
 						resultSet.getLong("begin_byte_offset"), resultSet.getLong("end_byte_offset"), resultSet.getString("login_name")));  //NON-NLS
@@ -9954,7 +9957,7 @@ public ContentTag getContentTagByID(long contentTagID) throws TskCoreException {
 			while (resultSet.next()) {
 				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.getInt("tag_set_id"));
+						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"));
 				tag = new ContentTag(resultSet.getLong("tag_id"), getContentById(resultSet.getLong("obj_id")), tagName,
 						resultSet.getString("comment"), resultSet.getLong("begin_byte_offset"), resultSet.getLong("end_byte_offset"), resultSet.getString("login_name"));
 			}
@@ -10090,7 +10093,7 @@ public List<ContentTag> getContentTagsByContent(Content content) throws TskCoreE
 			while (resultSet.next()) {
 				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.getInt("tag_set_id"));  //NON-NLS
+						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"));  //NON-NLS
 				ContentTag tag = new ContentTag(resultSet.getLong("tag_id"), content, tagName,
 						resultSet.getString("comment"), resultSet.getLong("begin_byte_offset"), resultSet.getLong("end_byte_offset"), resultSet.getString("login_name"));  //NON-NLS
 				tags.add(tag);
@@ -10166,11 +10169,11 @@ public List<BlackboardArtifactTag> getAllBlackboardArtifactTags() throws TskCore
 			//	LEFT OUTER JOIN tsk_examiners ON blackboard_artifact_tags.examiner_id = tsk_examiners.examiner_id
 			PreparedStatement statement = connection.getPreparedStatement(PREPARED_STATEMENT.SELECT_ARTIFACT_TAGS);
 			resultSet = connection.executeQuery(statement);
-			ArrayList<BlackboardArtifactTag> tags = new ArrayList<BlackboardArtifactTag>();
+			ArrayList<BlackboardArtifactTag> tags = new ArrayList<>();
 			while (resultSet.next()) {
 				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.getInt("tag_set_id"));  //NON-NLS
+						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"));  //NON-NLS
 				BlackboardArtifact artifact = getBlackboardArtifact(resultSet.getLong("artifact_id")); //NON-NLS
 				Content content = getContentById(artifact.getObjectID());
 				BlackboardArtifactTag tag = new BlackboardArtifactTag(resultSet.getLong("tag_id"),
@@ -10400,7 +10403,7 @@ public BlackboardArtifactTag getBlackboardArtifactTagByID(long artifactTagID) th
 			while (resultSet.next()) {
 				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.getInt("tag_set_id"));
+						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"));
 				BlackboardArtifact artifact = getBlackboardArtifact(resultSet.getLong("artifact_id")); //NON-NLS
 				Content content = getContentById(artifact.getObjectID());
 				tag = new BlackboardArtifactTag(resultSet.getLong("tag_id"),
@@ -10444,11 +10447,11 @@ public List<BlackboardArtifactTag> getBlackboardArtifactTagsByArtifact(Blackboar
 			statement.clearParameters();
 			statement.setLong(1, artifact.getArtifactID());
 			resultSet = connection.executeQuery(statement);
-			ArrayList<BlackboardArtifactTag> tags = new ArrayList<BlackboardArtifactTag>();
+			ArrayList<BlackboardArtifactTag> tags = new ArrayList<>();
 			while (resultSet.next()) {
 				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.getInt("tag_set_id"));  //NON-NLS
+						TskData.FileKnown.valueOf(resultSet.getByte("knownStatus")), resultSet.getLong("tag_set_id"));  //NON-NLS
 				Content content = getContentById(artifact.getObjectID());
 				BlackboardArtifactTag tag = new BlackboardArtifactTag(resultSet.getLong("tag_id"),
 						artifact, content, tagName, resultSet.getString("comment"), resultSet.getString("login_name"));  //NON-NLS
diff --git a/bindings/java/src/org/sleuthkit/datamodel/TagName.java b/bindings/java/src/org/sleuthkit/datamodel/TagName.java
index 86a79db6e4bb5de47658081dcba445cbe96a39d3..0d446f9b62f18cb0e6a1ec1cb71f3abbe4c9de6e 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/TagName.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/TagName.java
@@ -86,10 +86,10 @@ public static HTML_COLOR getColorByName(String colorName) {
 	private final String description;
 	private final HTML_COLOR color;
 	private final TskData.FileKnown knownStatus;
-	private final int tagSetId;
-		
+	private final long tagSetId;
+
 	// 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, int tagSetId) {
+	TagName(long id, String displayName, String description, HTML_COLOR color, TskData.FileKnown knownStatus, long tagSetId) {
 		this.id = id;
 		this.displayName = displayName;
 		this.description = description;
@@ -97,7 +97,7 @@ public static HTML_COLOR getColorByName(String colorName) {
 		this.knownStatus = knownStatus;
 		this.tagSetId = tagSetId;
 	}
-	
+
 	public long getId() {
 		return id;
 	}
@@ -117,8 +117,8 @@ public HTML_COLOR getColor() {
 	public TskData.FileKnown getKnownStatus() {
 		return knownStatus;
 	}
-	
-	int getTagSetId() {
+
+	long getTagSetId() {
 		return tagSetId;
 	}
 
@@ -142,7 +142,7 @@ public int hashCode() {
 		hash = 89 * hash + (this.description != null ? this.description.hashCode() : 0);
 		hash = 89 * hash + (this.color != null ? this.color.hashCode() : 0);
 		hash = 89 * hash + (this.knownStatus != null ? this.knownStatus.hashCode() : 0);
-		hash = 89 * hash + tagSetId;
+		hash = 89 * hash + (int) (this.id ^ (this.tagSetId >>> 32));
 		return hash;
 	}
 
diff --git a/bindings/java/src/org/sleuthkit/datamodel/TagSet.java b/bindings/java/src/org/sleuthkit/datamodel/TagSet.java
index 9d8aabaf31a430b01642a437f1ccd1d8ad1ecf63..2821aff4d08f8534f93babfa886f1786b114b908 100755
--- a/bindings/java/src/org/sleuthkit/datamodel/TagSet.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/TagSet.java
@@ -18,7 +18,6 @@
  */
 package org.sleuthkit.datamodel;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -30,19 +29,19 @@ public class TagSet {
 
 	private final String setName;
 	private final long id;
-	private final List<TagName> tagNameList = new ArrayList<>();
+	private final List<TagName> tagNameList;
 
 	/**
 	 * Construct a TagSet.
 	 *
-	 * @param id		Tag set id value.
+	 * @param id		    Tag set id value.
 	 * @param setName	Name of tag set.
 	 */
-	TagSet(long id, String setName) {
+	TagSet(long id, String setName, List<TagName> tagNameList) {
 		if (setName == null || setName.isEmpty()) {
 			throw new IllegalArgumentException("TagSet name must be a non-empty string");
 		}
-
+		this.tagNameList = tagNameList;
 		this.id = id;
 		this.setName = setName;
 	}
@@ -65,35 +64,9 @@ public List<TagName> getTagNames() {
 		return Collections.unmodifiableList(tagNameList);
 	}
 
-	/**
-	 * Adds a TagName to the tag set.
-	 *
-	 * @param tagName
-	 */
-	void addTagName(TagName tagName) {
-		if (tagName == null) {
-			throw new IllegalArgumentException("Cannot add NULL value to TagSet");
-		}
-
-		tagNameList.add(tagName);
-	}
-
-	/**
-	 * Add a list of TagName objects to the tag set.
-	 *
-	 * @param tagNameList
-	 */
-	void addTagNames(List<TagName> tagNameList) {
-		if (tagNameList == null) {
-			throw new IllegalArgumentException("Cannot add a NULL list to TagSet");
-		}
-
-		tagNameList.addAll(tagNameList);
-	}
-
 	/**
 	 * Return the TagSet id.
-	 * 
+	 *
 	 * @return TagSet id value.
 	 */
 	long getId() {
diff --git a/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java b/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java
index 965dde8be8c1d4cab6a520a4701e76f2a4f378a3..0fb319766962749bd598930f19f1b449f4207eeb 100755
--- a/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/TaggingManager.java
@@ -25,6 +25,7 @@
 import java.util.Collections;
 import java.util.List;
 import org.sleuthkit.datamodel.SleuthkitCase.CaseDbConnection;
+import static org.sleuthkit.datamodel.TskData.DbType.POSTGRESQL;
 
 /**
  * Provides an API to manage Tags.
@@ -52,21 +53,20 @@ public class TaggingManager {
 	public List<TagSet> getTagSets() throws TskCoreException {
 		List<TagSet> tagSetList = new ArrayList<>();
 		CaseDbConnection connection = skCase.getConnection();
-		skCase.acquireSingleUserCaseWriteLock();
-		String getAllTagSetsQuery = "SELECT * FROM tag_sets";
+		skCase.acquireSingleUserCaseReadLock();
+		String getAllTagSetsQuery = "SELECT * FROM tsk_tag_sets";
 		try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(getAllTagSetsQuery);) {
 			while (resultSet.next()) {
 				int setID = resultSet.getInt("tag_set_id");
 				String setName = resultSet.getString("name");
-				TagSet set = new TagSet(setID, setName);
-				set.addTagNames(getTagNamesByTagSetID(setID));
+				TagSet set = new TagSet(setID, setName, getTagNamesByTagSetID(setID));
 				tagSetList.add(set);
 			}
 		} catch (SQLException ex) {
 			throw new TskCoreException("Error occurred getting TagSet list.", ex);
 		} finally {
 			connection.close();
-			skCase.releaseSingleUserCaseWriteLock();
+			skCase.releaseSingleUserCaseReadLock();
 		}
 		return tagSetList;
 	}
@@ -74,13 +74,14 @@ public List<TagSet> getTagSets() throws TskCoreException {
 	/**
 	 * Inserts a row into the tag_sets table in the case database.
 	 *
-	 * @param name The tag set name.
+	 * @param name     The tag set name.
+	 * @param tagNames
 	 *
 	 * @return A TagSet object for the new row.
 	 *
 	 * @throws TskCoreException
 	 */
-	public TagSet addTagSet(String name) throws TskCoreException {
+	public TagSet addTagSet(String name, List<TagName> tagNames) throws TskCoreException {
 		if (name == null || name.isEmpty()) {
 			throw new IllegalArgumentException("Error adding TagSet, TagSet name must be non-empty string.");
 		}
@@ -91,15 +92,40 @@ public TagSet addTagSet(String name) throws TskCoreException {
 		skCase.acquireSingleUserCaseWriteLock();
 		try (Statement stmt = connection.createStatement()) {
 			connection.beginTransaction();
-			// INSERT INTO tag_sets (name) VALUES('%s')
-			stmt.execute(String.format("INSERT INTO tag_sets (name) VALUES('%s')", name));
+			String query = String.format("INSERT INTO tsk_tag_sets (name) VALUES('%s')", name);
+
+			if (skCase.getDatabaseType() == POSTGRESQL) {
+				stmt.execute(query, Statement.RETURN_GENERATED_KEYS);
+			} else {
+				stmt.execute(query);
+			}
 
 			try (ResultSet resultSet = stmt.getGeneratedKeys()) {
 
 				resultSet.next();
 				int setID = resultSet.getInt(1);
 
-				tagSet = new TagSet(setID, name);
+				List<TagName> updatedTags = new ArrayList<>();
+				if (tagNames != null) {
+					// Get all of the TagName ids they can be updated in one
+					// SQL call.
+					List<String> idList = new ArrayList<>();
+					for (TagName tagName : tagNames) {
+						idList.add(Long.toString(tagName.getId()));
+					}
+
+					stmt.executeUpdate(String.format("UPDATE tag_names SET tag_set_id = %d WHERE tag_name_id IN (%s)", setID, String.join(",", idList)));
+
+					for (TagName tagName : tagNames) {
+						updatedTags.add(new TagName(tagName.getId(),
+								tagName.getDisplayName(),
+								tagName.getDescription(),
+								tagName.getColor(),
+								tagName.getKnownStatus(),
+								setID));
+					}
+				}
+				tagSet = new TagSet(setID, name, updatedTags);
 			}
 			connection.commitTransaction();
 		} catch (SQLException ex) {
@@ -114,32 +140,29 @@ public TagSet addTagSet(String name) throws TskCoreException {
 	}
 
 	/**
-	 * Remove a row from the tag set table. The TagNames in the TagSet will not 
-	 * be deleted, nor will any tags with the TagNames from the deleted tag set 
+	 * Remove a row from the tag set table. The TagNames in the TagSet will not
+	 * be deleted, nor will any tags with the TagNames from the deleted tag set
 	 * be deleted.
 	 *
-	 * @param name	Name of tag set to be deleted.
+	 * @param tagSet TagSet to be deleted
 	 *
 	 * @throws TskCoreException
 	 */
-	public void deletedTagSet(String name) throws TskCoreException, SQLException {
-		if (name == null || name.isEmpty()) {
-			throw new IllegalArgumentException("Error adding deleting TagSet, TagSet name must be non-empty string.");
+	public void deletedTagSet(TagSet tagSet) throws TskCoreException {
+		if (tagSet == null) {
+			throw new IllegalArgumentException("Error adding deleting TagSet, TagSet object was null");
 		}
 
 		CaseDbConnection connection = skCase.getConnection();
 		skCase.acquireSingleUserCaseWriteLock();
-		
-		java.sql.PreparedStatement stmt2 = connection.prepareStatement("statement", 0);
-
 		try (Statement stmt = connection.createStatement()) {
 			connection.beginTransaction();
-			String queryTemplate = "DELETE FROM tag_sets WHERE name = '%s'";
-			stmt.execute(String.format(queryTemplate, name));
+			String queryTemplate = "DELETE FROM tsk_tag_sets WHERE tag_set_id = '%d'";
+			stmt.execute(String.format(queryTemplate, tagSet.getId()));
 			connection.commitTransaction();
 		} catch (SQLException ex) {
 			connection.rollbackTransaction();
-			throw new TskCoreException(String.format("Error deleting tag set %s.", name), ex);
+			throw new TskCoreException(String.format("Error deleting tag set where id = %d.", tagSet.getId()), ex);
 		} finally {
 			connection.close();
 			skCase.releaseSingleUserCaseWriteLock();
@@ -152,13 +175,23 @@ public void deletedTagSet(String name) throws TskCoreException, SQLException {
 	 * @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 void addTagNameToTagSet(TagSet tagSet, TagName 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();
 
@@ -169,6 +202,13 @@ public void addTagNameToTagSet(TagSet tagSet, TagName tagName) throws TskCoreExc
 			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()));
+
+			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);
@@ -204,11 +244,11 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T
 			connection.beginTransaction();
 			// If a TagName is part of a TagSet remove any existing tags from the
 			// set that are currenctly on the artifact
-			int tagSetId = tagName.getTagSetId();
+			long tagSetId = tagName.getTagSetId();
 			if (tagSetId > 0) {
 				// Get the list of all of the blackboardArtifactTags that use
 				// TagName for the given artifact.
-				String selectQuery = String.format("SELECT * from blackboard_artifact_tags JOIN tag_names ON tag_names.tag_name_id = blackboard_artifact_tags.tag_name_id JOIN tsk_examiners on tsk_examiners.examiner_id = blackboard_artifact_tags.examiner_id WHERE artifact_id = %d AND tag_names.tag_set_id = %d", artifact.getId(), tagSetId);
+				String selectQuery = String.format("SELECT * from blackboard_artifact_tags JOIN tag_names ON tag_names.tag_name_id = blackboard_artifact_tags.tag_name_id JOIN tsk_examiners on tsk_examiners.examiner_id = blackboard_artifact_tags.examiner_id WHERE artifact_id = %d AND tag_names.tag_set_id = %d", artifact.getArtifactID(), tagSetId);
 
 				try (Statement stmt = connection.createStatement(); ResultSet resultSet = stmt.executeQuery(selectQuery)) {
 					while (resultSet.next()) {
@@ -221,7 +261,7 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T
 										resultSet.getString("login_name"));
 
 						removedTags.add(bat);
-						removedTagIds.add(Long.toString(bat.getId()));	
+						removedTagIds.add(Long.toString(bat.getId()));
 					}
 				}
 
@@ -238,13 +278,18 @@ public BlackboardArtifactTagChange addArtifactTag(BlackboardArtifact artifact, T
 			BlackboardArtifactTag artifactTag = null;
 			try (Statement stmt = connection.createStatement()) {
 				Examiner currentExaminer = skCase.getCurrentExaminer();
-				String queryTemplate = "INSERT INTO blackboard_artifact_tags (artifact_id, tag_name_id, comment, examiner_id) VALUES (%d, %d, '%s', %d)";
-
-				stmt.executeUpdate(String.format(queryTemplate,
+				String query = String.format(
+						"INSERT INTO blackboard_artifact_tags (artifact_id, tag_name_id, comment, examiner_id) VALUES (%d, %d, '%s', %d)",
 						artifact.getArtifactID(),
 						tagName.getId(),
 						comment,
-						currentExaminer.getId()));
+						currentExaminer.getId());
+
+				if (skCase.getDatabaseType() == POSTGRESQL) {
+					stmt.execute(query, Statement.RETURN_GENERATED_KEYS);
+				} else {
+					stmt.execute(query);
+				}
 
 				try (ResultSet resultSet = stmt.getGeneratedKeys()) {
 					resultSet.next();
@@ -286,7 +331,7 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c
 		skCase.acquireSingleUserCaseWriteLock();
 		try {
 			connection.beginTransaction();
-			int tagSetId = tagName.getTagSetId();
+			long tagSetId = tagName.getTagSetId();
 
 			if (tagSetId > 0) {
 				String selectQuery = String.format("SELECT * from content_tags JOIN tag_names ON tag_names.tag_name_id = content_tags.tag_name_id JOIN tsk_examiners on tsk_examiners.examiner_id = content_tags.examiner_id WHERE obj_id = %d AND tag_names.tag_set_id = %d", content.getId(), tagSetId);
@@ -301,8 +346,8 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c
 										resultSet.getLong("begin_byte_offset"),
 										resultSet.getLong("end_byte_offset"),
 										resultSet.getString("login_name"));
-						
-						removedTagIds.add(Long.toString(bat.getId()));					
+
+						removedTagIds.add(Long.toString(bat.getId()));
 						removedTags.add(bat);
 					}
 				}
@@ -327,7 +372,11 @@ public ContentTagChange addContentTag(Content content, TagName tagName, String c
 						endByteOffset,
 						currentExaminer.getId());
 
-				stmt.executeUpdate(query);
+				if (skCase.getDatabaseType() == POSTGRESQL) {
+					stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);
+				} else {
+					stmt.executeUpdate(query);
+				}
 
 				try (ResultSet resultSet = stmt.getGeneratedKeys()) {
 					resultSet.next();
diff --git a/tsk/auto/db_postgresql.cpp b/tsk/auto/db_postgresql.cpp
index 241ebf88f85155372906a567b805ebf8005f3563..653050780086c8f68d4e78495fe4544500093fd6 100755
--- a/tsk/auto/db_postgresql.cpp
+++ b/tsk/auto/db_postgresql.cpp
@@ -563,9 +563,9 @@ int TskDbPostgreSQL::initialize() {
         ||
         attempt_exec("CREATE TABLE tsk_files_derived_method (derived_id BIGSERIAL PRIMARY KEY, tool_name TEXT NOT NULL, tool_version TEXT NOT NULL, other TEXT)", "Error creating tsk_files_derived_method table: %s\n")
 		||
-		attempt_exec("CREATE TABLE tag_sets (tag_set_id BIGSERIAL PRIMARY KEY, name TEXT UNIQUE);", "Error creating tag_sets table: %s\n")
+		attempt_exec("CREATE TABLE tsk_tag_sets (tag_set_id BIGSERIAL PRIMARY KEY, name TEXT UNIQUE);", "Error creating tsk_tag_sets table: %s\n")
 		||
-        attempt_exec("CREATE TABLE tag_names (tag_name_id BIGSERIAL PRIMARY KEY, display_name TEXT UNIQUE, description TEXT NOT NULL, color TEXT NOT NULL, knownStatus INTEGER NOT NULL, tag_set_id INTEGER, FOREIGN KEY(tag_set_id) REFERENCES tag_sets(tag_set_id) ON DELETE SET NULL)", "Error creating tag_names table: %s\n")
+        attempt_exec("CREATE TABLE tag_names (tag_name_id BIGSERIAL PRIMARY KEY, display_name TEXT UNIQUE, description TEXT NOT NULL, color TEXT NOT NULL, knownStatus INTEGER NOT NULL, tag_set_id INTEGER, FOREIGN KEY(tag_set_id) REFERENCES tsk_tag_sets(tag_set_id) ON DELETE SET NULL)", "Error creating tag_names table: %s\n")
         ||
         attempt_exec("CREATE TABLE blackboard_artifact_types (artifact_type_id BIGSERIAL PRIMARY KEY, type_name TEXT NOT NULL, display_name TEXT)", "Error creating blackboard_artifact_types table: %s\n")
         ||
diff --git a/tsk/auto/db_sqlite.cpp b/tsk/auto/db_sqlite.cpp
index 2ba2810748005726ee147d58682ef1a9ccd2e2f3..5625c5ad21207d7754d9616559b41930ce89d1f3 100644
--- a/tsk/auto/db_sqlite.cpp
+++ b/tsk/auto/db_sqlite.cpp
@@ -285,7 +285,7 @@ TskDbSqlite::initialize()
 	}
 
 	if (attempt_exec
-        ("CREATE TABLE tsk_objects (obj_id INTEGER PRIMARY KEY, par_obj_id INTEGER, type INTEGER NOT NULL, UNIQUE (obj_id), FOREIGN KEY (par_obj_id) references tsk_objects(obj_id) ON DELETE SET NULL);",
+        ("CREATE TABLE tsk_objects (obj_id INTEGER PRIMARY KEY, par_obj_id INTEGER, type INTEGER NOT NULL, UNIQUE (obj_id), FOREIGN KEY (par_obj_id) references tsk_objects(obj_id) ON DELETE CASCADE);",
         "Error creating tsk_objects table: %s\n")
         ||
         attempt_exec
@@ -339,10 +339,10 @@ TskDbSqlite::initialize()
             "Error creating tsk_files_derived_method table: %s\n")
         ||
 		attempt_exec
-		("CREATE TABLE tag_sets (tag_set_id INTEGER PRIMARY KEY, name TEST UNIQUE)", "Error creating tag_sets table: %s\n")
+		("CREATE TABLE tsk_tag_sets (tag_set_id INTEGER PRIMARY KEY, name TEXT UNIQUE)", "Error creating tsk_tag_sets table: %s\n")
 		||
         attempt_exec
-        ("CREATE TABLE tag_names (tag_name_id INTEGER PRIMARY KEY, display_name TEXT UNIQUE, description TEXT NOT NULL, color TEXT NOT NULL, knownStatus INTEGER NOT NULL, tag_set_id INTEGER, FOREIGN KEY(tag_set_id) REFERENCES tag_sets(tag_set_id) ON DELETE SET NULL)",
+        ("CREATE TABLE tag_names (tag_name_id INTEGER PRIMARY KEY, display_name TEXT UNIQUE, description TEXT NOT NULL, color TEXT NOT NULL, knownStatus INTEGER NOT NULL, tag_set_id INTEGER, FOREIGN KEY(tag_set_id) REFERENCES tsk_tag_sets(tag_set_id) ON DELETE SET NULL)",
             "Error creating tag_names table: %s\n")
         ||
         attempt_exec("CREATE TABLE review_statuses (review_status_id INTEGER PRIMARY KEY, "