diff --git a/bindings/java/doxygen/Doxyfile b/bindings/java/doxygen/Doxyfile
index 465408c5bfbd7af51e9e959fb10c371f83760386..e7526309ddfec0f7f1b338d430fa36269a2a13f0 100644
--- a/bindings/java/doxygen/Doxyfile
+++ b/bindings/java/doxygen/Doxyfile
@@ -38,7 +38,7 @@ PROJECT_NAME           = "Sleuth Kit Java Bindings (JNI)"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 4.5.0 
+PROJECT_NUMBER         = 4.7.0 
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -415,7 +415,7 @@ EXTRACT_ALL            = YES
 # be included in the documentation.
 # The default value is: NO.
 
-EXTRACT_PRIVATE        = YES
+EXTRACT_PRIVATE        = NO
 
 # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
 # scope will be included in the documentation.
@@ -760,8 +760,9 @@ WARN_LOGFILE           =
 
 INPUT                  = main.dox \
                          query_database.dox \
-			 blackboard.dox \
+			             blackboard.dox \
                          insert_and_update_database.dox \
+                         communications.dox \
 						 ../src
 
 # This tag can be used to specify the character encoding of the source files
@@ -1046,7 +1047,7 @@ GENERATE_HTML          = YES
 # The default directory is: html.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_OUTPUT            = jni-docs/4.5.0/
+HTML_OUTPUT            = jni-docs/4.7.0/
 
 # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
 # generated HTML page (for example: .htm, .php, .asp).
diff --git a/bindings/java/doxygen/communications.dox b/bindings/java/doxygen/communications.dox
index add62f93f30e59d00e7c21dcf3f9d94114d85161..61a8b19d7605490183a12aadfd44789be7a37989 100644
--- a/bindings/java/doxygen/communications.dox
+++ b/bindings/java/doxygen/communications.dox
@@ -37,24 +37,29 @@ A <b>relationship source</b> is where we learned about the relationship.  This t
 
 Now lets cover what you should do when you are parsing some communications data and want to store it in the TSK database.  Let's assume we are parsing a smart phone app that has messages. 
 
-When you encounter a message, the first thing to do is store information about the accounts.  TSK wants to know about each <i>file</i> that had a reference of the account.   You should call X…..
+\subsection jni_com_add_acct Adding Account Instances
 
+When you encounter a message, the first thing to do is store information about the accounts.  TSK wants to know about each <i>file</i> that had a reference of the account.   You should call org.sleuthkit.datamodel.CommunicationsManager.createAccountFileInstance() for each file that you encounter a given account.   
 
+Behind the scenes, createAccountFileInstance will make an entry in the accounts table for each unique account on a given device and will make a org.sleuthkit.datamodel.BlackboardArtifact for each unique account in a given file. 
 
+If you want to create a custom account type, call org.sleuthkit.datamodel.CommunicationsManager.addAccountType(). 
 
-\section OTHER ……
+\subsection jni_com_add_msg Adding The Message (Source)
 
+You also need to make sure that you store the org.sleuthkit.datamodel.BlackboardArtifact that used the accounts.  You can do this before or after calling createAccountFileInstance(). The order does not matter.
 
-Things to cover:
-- What to do when you encounter an Account.
--- How often should you create an 'instance'
---- Once per file so that we have traceability. 
+For a messaging app, you would make org.sleuthkit.datamodel.BlackboardArtifact objects with a type of org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_MESSAGE.  That artifact would store various name and value pairs using org.sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE values. 
 
--- When do you create a relationship
---- How many are stored between who
---- What should be passed in etc.
 
-http://wiki.sleuthkit.org/index.php?title=Database_v7.2_Schema#Communications_.2F_Accounts
+\subsection jni_com_add_relationship Adding the Relationship
 
+The final step is to create store the relationships between the accounts.  You can do this via org.sleuthkit.datamodel.CommunicationsManager.addRelationships().  This method will require you to pass in the org.sleuthkit.datamodel.AccountInstance objects that you created and the org.sleuthkit.datamodel.BlackboardArtifact that you created for the message or other source.
+
+
+\section jni_com_schema Database Schema
+
+For details of how this is stored in the database, refer to the 
+<a href="http://wiki.sleuthkit.org/index.php?title=Database_v7.2_Schema#Communications_.2F_Accounts]">wiki</a>.
 
 */
diff --git a/bindings/java/doxygen/footer.html b/bindings/java/doxygen/footer.html
index 8c7566ec4c9a43901439245b60f01aa1a5792138..3462f3efd17e90420d08d7e2e8102b516d480457 100644
--- a/bindings/java/doxygen/footer.html
+++ b/bindings/java/doxygen/footer.html
@@ -1,5 +1,5 @@
 <hr/>
-<p><i>Copyright &#169; 2011-2015 Brian Carrier.  (carrier -at- sleuthkit -dot- org)<br/> 
+<p><i>Copyright &#169; 2011-2018 Brian Carrier.  (carrier -at- sleuthkit -dot- org)<br/> 
 This work is licensed under a
 <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/us/">Creative Commons Attribution-Share Alike 3.0 United States License</a>.
 </i></p>
diff --git a/bindings/java/doxygen/insert_and_update_database.dox b/bindings/java/doxygen/insert_and_update_database.dox
index 7d4dc47bab5f1926d3807e3a81608373c8e4d504..874f537d44d3a409f3815eecec32b3bc45401921 100644
--- a/bindings/java/doxygen/insert_and_update_database.dox
+++ b/bindings/java/doxygen/insert_and_update_database.dox
@@ -1,38 +1,19 @@
-/*! \page insert_and_update_database_page INSERT and UPDATE
+/*! \page insert_and_update_database_page Inserting Data
 
 \section types_of_databases_available Inserting Into the Database
-This page is for people who are developing code for the Autopsy framework and need to place items into the database with SQL statements. If you are not developing Autopsy framework code (Autopsy Modules are not Autopsy framework code), you should have no need to create SQL statements to insert items into the database. If you developing an Autopsy module, please see \ref query_database_page.
+This page is for people who are developing Sleuth Kit code and need to place items into the database with SQL statements. If you are simply writing modules that read from the database (such as Autopsy ingest modules), there is nothing for you here. 
 
-Autopsy currently allows either \ref sqlite_db or \ref postgresql_db as the back-end database system for a case. Any code you write could be used with either as the backend database, at the user's discretion. Be sure to test your work with both platforms.
+The Sleuth Kit currently allows either SQLite or PostgreSQL as the back-end database system for a case. Any code you write could be used with either as the backend database, at the user's discretion. Be sure to test your work with both platforms.
 
+- For SQLite compatibility, use SQL statements supported by SQLite 3
+- For PostgreSQL compatibility, use SQL statements supported by PostgreSQL 9.4
 
-\subsection sqlite_db SQLite
-- Use SQL statements supported by SQLite 3
-- Used for Single-user cases
-- Built-in
-- No configuration required
-- Databases are stored locally
-
-\subsection postgresql_db PostgreSQL
-- Use SQL statements supported by PostgreSQL 9.4
-- Used for Multi-user cases
-- An accessible instance of PostgreSQL must be running (on a server, or locally)
-- Proper configuration to connect to this instance of PostgreSQL required
-- Databases are stored within PostgreSQL, wherever it happens to be running
-
-
-<br>
 \section insert_pitfalls_to_avoid How to Avoid Pitfalls When INSERTing into the Database
 - Do not use INSERT OR REPLACE INTO. It does not exist in PostgreSQL.
-<br>
-<br>
 - Do not use INSERT OR IGNORE INTO. It does not exist in PostgreSQL.
-<br>
-<br>
 - Do not insert [NUL characters](http://en.wikipedia.org/wiki/Null_character) into the database as UTF-8 (NUL characters are not NULL fields). Translate NUL characters to the [SUB character](http://en.wikipedia.org/wiki/Substitute_character) with the following instead:
 \code{.java}
 private String replaceNulls(String text);
 \endcode
-<br>
 
 */
diff --git a/bindings/java/doxygen/main.dox b/bindings/java/doxygen/main.dox
index 545b1109cadbe5bb38575362af2528c54d7fabb8..74d39099e2cccc7be24ac508cb55e56c0743f63b 100644
--- a/bindings/java/doxygen/main.dox
+++ b/bindings/java/doxygen/main.dox
@@ -6,41 +6,41 @@ These classes allow Java programs to access data extracted by The Sleuth Kit.
 
 The Sleuth Kit is primarily a C/C++ library and set of command line tools. These classes allow programs to obtain the data that TSK can produce.   The typical steps would be to use JNI to cause the TSK library to create and populate a SQLite or PostgreSQL database.  The Java classes then directly open the database and perform queries on it. 
 
-\section basics Basic
 
-NOTE: This needs to be expanded on.
+\section main_classes Types of Classes
 
-\subsection basics_add Adding Data to Case
+There are three broad types of classes in this package:
+- org.sleuthkit.datamodel.SleuthkitCase contains all of the code that deals with the backend database. 
+- org.sleuthkit.datamodel.SleuthkitJNI deals with the JNI bindings with the C/C++ code (that primarily populate the database or allow file content to be read)
+- Lots of classes that store information about specific files or volumes.  Nearly all of them implement the org.sleuthkit.datamodel.Content interface.   Files from file systems or carved files will extend org.sleuthkit.datamodel.AbstractFile. 
 
-Use SleuthkitCase.newCase() or SleuthkitCase.openCase() to return an instance of a SleuthkitCase object. To add data to the case, use SleuthkitCase.makeAdImageProcess() to get a AddImageProcess object that allows you to populate the database in the scope of a transaction and get feedback on its update process. 
 
-To add a local file (logical file) you can use methods such as SleuthkitCase.addLocalFile(). 
+\section main_workflow Basic Workflow 
 
+\subsection basics_add Adding Data to Case 
 
-\subsection basics_analyzing Analyzing Data in Case
+To get data into the database (which is needed before you get it into a Java object), you need to call some org.sleuthkit.datamodel.SleuthkitCase methods. 
 
-You can either access files directly using methods such as SleuthkitCase.findFiles() or SleuthkitCase.getAbstractFileById(). 
+To open or create a case, call org.sleuthkit.datamodel.SleuthkitCase.newCase() or org.sleuthkit.datamodel.SleuthkitCase.openCase(). 
 
-You can also access the data in its tree form by starting with SleuthkitCase.getImages() and then calling getChildren() on each of the returned objects.  See the section below on basics of the datamodel structure. 
+To add a <b>disk image</b> to the case, use org.sleuthkit.datamodel.SleuthkitCase.makeAddImageProcess() to get a org.sleuthkit.datamodel.SleuthkitJNI.CaseDbHandle.AddImageProcess object that allows you to populate the database in the scope of a transaction and get feedback on its update process. 
 
+To add a <b>local file</b> (logical file) you can use methods such as org.sleuthkit.datamodel.SleuthkitCase.addLocalFile(). 
 
-\section jni_hierarchy Class Hierarchy
 
-Flush out here on general layout. 
+\subsection basics_analyzing Analyzing Data in Case
 
-- org.sleuthkit.datamodel.Content is top-level interface and gets more specific as it goes down.
-- Types disk and file system organization concepts (org.sleuthkit.datamodel.FileSystem, org.sleuthkit.datamodel.Image, etc. )
-- org.sleuthkit.datamodel.AbstractFile is interface for various types of files with more specific classes below it ( org.sleuthkit.datamodel.DerivedFile, org.sleuthkit.datamodel.FsContent, etc.)
+You can either access files directly using methods such as org.sleuthkit.datamodel.SleuthkitCase.findFiles() or org.sleuthkit.datamodel.SleuthkitCase.getAbstractFileById(). 
 
-\section jni_blackboard The Blackboard
+You can also access the data in its tree form by starting with org.sleuthkit.datamodel.SleuthkitCase.getImages() and then calling getChildren() on each of the returned objects.  See the section below on basics of the datamodel structure. 
 
-\subpage mod_bbpage
 
+\section main_other Other Topics
 
-\section the_database The Database
-How to \subpage query_database_page
-<br>
-How to \subpage insert_and_update_database_page into the Database
+- \subpage mod_bbpage is where analysis modules (such as those in Autopsy) can post and save their results. 
+- \subpage mod_compage is where analysis modules can store and retrieve communications-related data. 
+- Refer to \subpage query_database_page if you are going to use one of the SleuthkitCase methods that requires you to specify a query. 
+- Refer to \subpage insert_and_update_database_page if you are a Sleuth Kit developer and want to avoid database issues.
 
 
 */
diff --git a/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java b/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java
index c726c671b402a536afad8802318c0185d5938911..6f65080a32d30204217879083567b70d32c213c5 100644
--- a/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java
+++ b/bindings/java/src/org/sleuthkit/datamodel/CommunicationsManager.java
@@ -189,7 +189,8 @@ SleuthkitCase getSleuthkitCase() {
 	 * @throws TskCoreException exception thrown if a critical error occurs
 	 *                          within TSK core
 	 */
-	public Account.Type addAccountType(String accountTypeName, String displayName) throws TskCoreException {
+    // NOTE: Full name given for Type for doxygen linking
+	public org.sleuthkit.datamodel.Account.Type addAccountType(String accountTypeName, String displayName) throws TskCoreException {
 		Account.Type accountType = new Account.Type(accountTypeName, displayName);
 
 		// check if already in map
@@ -259,7 +260,8 @@ public Account.Type addAccountType(String accountTypeName, String displayName) t
 	 * @throws TskCoreException exception thrown if a critical error occurs
 	 *                          within TSK core
 	 */
-	public AccountFileInstance createAccountFileInstance(Account.Type accountType, String accountUniqueID, String moduleName, Content sourceFile) throws TskCoreException {
+    // NOTE: Full name given for Type for doxygen linking
+	public AccountFileInstance createAccountFileInstance(org.sleuthkit.datamodel.Account.Type accountType, String accountUniqueID, String moduleName, Content sourceFile) throws TskCoreException {
 
 		// make or get the Account (unique at the case-level)
 		Account account = getOrCreateAccount(accountType, normalizeAccountID(accountType, accountUniqueID));
@@ -293,7 +295,8 @@ public AccountFileInstance createAccountFileInstance(Account.Type accountType, S
 	 * @throws TskCoreException exception thrown if a critical error occurs
 	 *                          within TSK core
 	 */
-	public Account getAccount(Account.Type accountType, String accountUniqueID) throws TskCoreException {
+    // NOTE: Full name given for Type for doxygen linking
+	public Account getAccount(org.sleuthkit.datamodel.Account.Type accountType, String accountUniqueID) throws TskCoreException {
 		Account account = null;
 		CaseDbConnection connection = db.getConnection();
 		db.acquireSingleUserCaseReadLock();
@@ -366,8 +369,9 @@ public Account getAccount(Account.Type accountType, String accountUniqueID) thro
 	 *                                                  relationshipType are not
 	 *                                                  compatible.
 	 */
+    // NOTE: Full name given for Type for doxygen linking
 	public void addRelationships(AccountFileInstance sender, List<AccountFileInstance> recipients,
-			BlackboardArtifact sourceArtifact, Relationship.Type relationshipType, long dateTime) throws TskCoreException, TskDataException {
+			BlackboardArtifact sourceArtifact, org.sleuthkit.datamodel.Relationship.Type relationshipType, long dateTime) throws TskCoreException, TskDataException {
 
 		if (relationshipType.isCreatableFrom(sourceArtifact) == false) {
 			throw new TskDataException("Can not make a " + relationshipType.getDisplayName()
@@ -571,7 +575,8 @@ private BlackboardArtifact getAccountFileInstanceArtifact(Account.Type accountTy
 	 * @throws TskCoreException If an error occurs accessing the case database.
 	 *
 	 */
-	public Account.Type getAccountType(String accountTypeName) throws TskCoreException {
+    // NOTE: Full name given for Type for doxygen linking
+	public org.sleuthkit.datamodel.Account.Type getAccountType(String accountTypeName) throws TskCoreException {
 		if (this.typeNameToAccountTypeMap.containsKey(accountTypeName)) {
 			return this.typeNameToAccountTypeMap.get(accountTypeName);
 		}