diff --git a/Core/build.xml b/Core/build.xml
index 31379f9772bd33493c207ad50d7c25fd69575ca9..40b8e966a3777859f302ef93dfa348e252a949ca 100644
--- a/Core/build.xml
+++ b/Core/build.xml
@@ -89,7 +89,10 @@
             <fileset dir="${thirdparty.dir}/ImageMagick-7.0.10-27-portable-Q16-x64"/>
         </copy>
 
-        <mkdir dir="${basedir}/release/DomainCategorization"/>
+        <!--Copy DomainCategorization to release-->
+        <copy todir="${basedir}/release/DomainCategorization" >
+            <fileset dir="${thirdparty.dir}/DomainCategorization"/>
+        </copy>
 
         <!-- The 'libgstlibav.dll' file is too big to store on GitHub, so we
         have it stored in a ZIP file. We'll extract it in place and remove
diff --git a/Core/src/org/sleuthkit/autopsy/url/analytics/AddEditCategoryDialog.form b/Core/src/org/sleuthkit/autopsy/url/analytics/AddEditCategoryDialog.form
index 4e51979df7cdeda40ff8d5e43809f9d4dd0a0bf5..afaf4d85dc1a3a53031cdf28bfc30c47455534e7 100644
--- a/Core/src/org/sleuthkit/autopsy/url/analytics/AddEditCategoryDialog.form
+++ b/Core/src/org/sleuthkit/autopsy/url/analytics/AddEditCategoryDialog.form
@@ -78,8 +78,14 @@
   </Layout>
   <SubComponents>
     <Component class="javax.swing.JTextField" name="categoryTextField">
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="categoryTextFieldActionPerformed"/>
+      </Events>
     </Component>
     <Component class="javax.swing.JTextField" name="domainSuffixTextField">
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="domainSuffixTextFieldActionPerformed"/>
+      </Events>
     </Component>
     <Component class="javax.swing.JLabel" name="categoryLabel">
       <Properties>
diff --git a/Core/src/org/sleuthkit/autopsy/url/analytics/AddEditCategoryDialog.java b/Core/src/org/sleuthkit/autopsy/url/analytics/AddEditCategoryDialog.java
index 771b826577cf29fa4a7b7cb0e60545cf1e586804..3a47d9060a2a9045955358c718e108b15156f4fe 100644
--- a/Core/src/org/sleuthkit/autopsy/url/analytics/AddEditCategoryDialog.java
+++ b/Core/src/org/sleuthkit/autopsy/url/analytics/AddEditCategoryDialog.java
@@ -32,6 +32,12 @@ public AddEditCategoryDialog(java.awt.Frame parent, Set<String> currentSuffixesT
         this.currentSuffixesToUpper = currentSuffixesToUpper;
         this.currentSuffix = currentSuffix;
         this.currentCategory = currentCategory;
+        
+        if (currentSuffix == null && currentCategory == null) {
+            
+        } else {
+            
+        }
     }
         
     /**
@@ -114,6 +120,18 @@ private void initComponents() {
 
         setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 
+        categoryTextField.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                categoryTextFieldActionPerformed(evt);
+            }
+        });
+
+        domainSuffixTextField.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                domainSuffixTextFieldActionPerformed(evt);
+            }
+        });
+
         categoryLabel.setText(org.openide.util.NbBundle.getMessage(AddEditCategoryDialog.class, "AddEditCategoryDialog.categoryLabel.text")); // NOI18N
 
         domainSuffixLabel.setText(org.openide.util.NbBundle.getMessage(AddEditCategoryDialog.class, "AddEditCategoryDialog.domainSuffixLabel.text")); // NOI18N
@@ -193,6 +211,14 @@ private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-
         dispose();
     }//GEN-LAST:event_cancelButtonActionPerformed
 
+    private void domainSuffixTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_domainSuffixTextFieldActionPerformed
+        onValueUpdate(domainSuffixTextField.getText(), categoryTextField.getText());
+    }//GEN-LAST:event_domainSuffixTextFieldActionPerformed
+
+    private void categoryTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_categoryTextFieldActionPerformed
+        onValueUpdate(domainSuffixTextField.getText(), categoryTextField.getText());
+    }//GEN-LAST:event_categoryTextFieldActionPerformed
+
 
     // Variables declaration - do not modify//GEN-BEGIN:variables
     private javax.swing.JTextField categoryTextField;
diff --git a/Core/src/org/sleuthkit/autopsy/url/analytics/Bundle.properties b/Core/src/org/sleuthkit/autopsy/url/analytics/Bundle.properties
index 58a1d65fbbf010a3f9d5af11ba731fff50211f4b..7c11e5c1877a2361c53dbde4591d4525f8396b99 100644
--- a/Core/src/org/sleuthkit/autopsy/url/analytics/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/url/analytics/Bundle.properties
@@ -3,4 +3,11 @@ WebCategoryOptionsController_keywords=Custom Web Categories
 AddEditCategoryDialog.categoryLabel.text=Category:
 AddEditCategoryDialog.domainSuffixLabel.text=Domain Suffix:
 AddEditCategoryDialog.saveButton.text=Save
-AddEditCategoryDialog.cancelButton.text=Cancel
\ No newline at end of file
+AddEditCategoryDialog.cancelButton.text=Cancel
+WebCategoriesOptionsPanel.panelDescription.text=This module allows you to find web categories based on host name.
+WebCategoriesOptionsPanel.categoriesTitle.text=Categories:
+WebCategoriesOptionsPanel.newEntryButton.text=New Entry
+WebCategoriesOptionsPanel.editEntryButton.text=Edit Entry
+WebCategoriesOptionsPanel.deleteEntryButton.text=Delete Entry
+WebCategoriesOptionsPanel.importSetButton.text=Import Set
+WebCategoriesOptionsPanel.exportSetButton.text=Export Set
\ No newline at end of file
diff --git a/Core/src/org/sleuthkit/autopsy/url/analytics/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/url/analytics/Bundle.properties-MERGED
index 655b63831ba92c4073d7f21d44d8044d342bee32..f97c373c6f70158128d2859c7e25ae1a0cd271ff 100644
--- a/Core/src/org/sleuthkit/autopsy/url/analytics/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/url/analytics/Bundle.properties-MERGED
@@ -10,3 +10,10 @@ AddEditCategoryDialog.categoryLabel.text=Category:
 AddEditCategoryDialog.domainSuffixLabel.text=Domain Suffix:
 AddEditCategoryDialog.saveButton.text=Save
 AddEditCategoryDialog.cancelButton.text=Cancel
+WebCategoriesOptionsPanel.panelDescription.text=This module allows you to find web categories based on host name.
+WebCategoriesOptionsPanel.categoriesTitle.text=Categories:
+WebCategoriesOptionsPanel.newEntryButton.text=New Entry
+WebCategoriesOptionsPanel.editEntryButton.text=Edit Entry
+WebCategoriesOptionsPanel.deleteEntryButton.text=Delete Entry
+WebCategoriesOptionsPanel.importSetButton.text=Import Set
+WebCategoriesOptionsPanel.exportSetButton.text=Export Set
diff --git a/Core/src/org/sleuthkit/autopsy/url/analytics/WebCategoriesOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/url/analytics/WebCategoriesOptionsPanel.form
index 53d451c9fba77e998530d5a86bd8992ad564be89..15dbe8da75d2e57e582cdf888e427e236844cea1 100644
--- a/Core/src/org/sleuthkit/autopsy/url/analytics/WebCategoriesOptionsPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/url/analytics/WebCategoriesOptionsPanel.form
@@ -19,11 +19,18 @@
     <Component class="javax.swing.JLabel" name="panelDescription">
       <Properties>
         <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
-          <ResourceString bundle="org/sleuthkit/autopsy/datamodel/hosts/Bundle.properties" key="WebCategoriesOptionsPanel.panelDescription.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+          <ResourceString bundle="org/sleuthkit/autopsy/url/analytics/Bundle.properties" key="WebCategoriesOptionsPanel.panelDescription.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
         <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
-          <Border info="org.netbeans.modules.form.compat2.border.EtchedBorderInfo">
-            <EtchetBorder/>
+          <Border info="org.netbeans.modules.form.compat2.border.CompoundBorderInfo">
+            <CompoundBorder>
+              <Border PropertyName="outside" info="org.netbeans.modules.form.compat2.border.EtchedBorderInfo">
+                <EtchetBorder/>
+              </Border>
+              <Border PropertyName="inside" info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
+                <EmptyBorder bottom="5" left="5" right="5" top="5"/>
+              </Border>
+            </CompoundBorder>
           </Border>
         </Property>
       </Properties>
@@ -39,7 +46,9 @@
     </Component>
     <Component class="javax.swing.JLabel" name="categoriesTitle">
       <Properties>
-        <Property name="text" type="java.lang.String" value="Categories:"/>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/url/analytics/Bundle.properties" key="WebCategoriesOptionsPanel.categoriesTitle.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
       </Properties>
       <AuxValues>
         <AuxValue name="JavaCodeGenerator_VariableLocal" type="java.lang.Boolean" value="true"/>
@@ -86,7 +95,9 @@
     </Container>
     <Component class="javax.swing.JButton" name="newEntryButton">
       <Properties>
-        <Property name="text" type="java.lang.String" value="New Entry"/>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/url/analytics/Bundle.properties" key="WebCategoriesOptionsPanel.newEntryButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
       </Properties>
       <Events>
         <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="newEntryButtonActionPerformed"/>
@@ -103,7 +114,9 @@
     </Component>
     <Component class="javax.swing.JButton" name="editEntryButton">
       <Properties>
-        <Property name="text" type="java.lang.String" value="Edit Entry"/>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/url/analytics/Bundle.properties" key="WebCategoriesOptionsPanel.editEntryButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
       </Properties>
       <Events>
         <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="editEntryButtonActionPerformed"/>
@@ -116,7 +129,9 @@
     </Component>
     <Component class="javax.swing.JButton" name="deleteEntryButton">
       <Properties>
-        <Property name="text" type="java.lang.String" value="Delete Entry"/>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/url/analytics/Bundle.properties" key="WebCategoriesOptionsPanel.deleteEntryButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
       </Properties>
       <Events>
         <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="deleteEntryButtonActionPerformed"/>
@@ -129,7 +144,9 @@
     </Component>
     <Component class="javax.swing.JButton" name="importSetButton">
       <Properties>
-        <Property name="text" type="java.lang.String" value="Import Set"/>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/url/analytics/Bundle.properties" key="WebCategoriesOptionsPanel.importSetButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
       </Properties>
       <Events>
         <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="importSetButtonActionPerformed"/>
@@ -146,7 +163,9 @@
     </Component>
     <Component class="javax.swing.JButton" name="exportSetButton">
       <Properties>
-        <Property name="text" type="java.lang.String" value="Export Set"/>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="org/sleuthkit/autopsy/url/analytics/Bundle.properties" key="WebCategoriesOptionsPanel.exportSetButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
       </Properties>
       <Events>
         <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exportSetButtonActionPerformed"/>
diff --git a/Core/src/org/sleuthkit/autopsy/url/analytics/WebCategoriesOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/url/analytics/WebCategoriesOptionsPanel.java
index dbe19cd16a7b6e4fc9d0f90efbf43723ea41b536..841969c65efd4060402a4b3627fe6a20fcac1b19 100644
--- a/Core/src/org/sleuthkit/autopsy/url/analytics/WebCategoriesOptionsPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/url/analytics/WebCategoriesOptionsPanel.java
@@ -60,7 +60,7 @@ private void initComponents() {
         setLayout(new java.awt.GridBagLayout());
 
         panelDescription.setText(org.openide.util.NbBundle.getMessage(WebCategoriesOptionsPanel.class, "WebCategoriesOptionsPanel.panelDescription.text")); // NOI18N
-        panelDescription.setBorder(javax.swing.BorderFactory.createEtchedBorder());
+        panelDescription.setBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createEtchedBorder(), javax.swing.BorderFactory.createEmptyBorder(5, 5, 5, 5)));
         gridBagConstraints = new java.awt.GridBagConstraints();
         gridBagConstraints.gridwidth = 3;
         gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
@@ -68,7 +68,7 @@ private void initComponents() {
         gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 0);
         add(panelDescription, gridBagConstraints);
 
-        categoriesTitle.setText("Categories:");
+        categoriesTitle.setText(org.openide.util.NbBundle.getMessage(WebCategoriesOptionsPanel.class, "WebCategoriesOptionsPanel.categoriesTitle.text")); // NOI18N
         gridBagConstraints = new java.awt.GridBagConstraints();
         gridBagConstraints.gridx = 0;
         gridBagConstraints.gridy = 1;
@@ -99,7 +99,7 @@ private void initComponents() {
         gridBagConstraints.insets = new java.awt.Insets(0, 10, 5, 0);
         add(categoriesScrollPane, gridBagConstraints);
 
-        newEntryButton.setText("New Entry");
+        newEntryButton.setText(org.openide.util.NbBundle.getMessage(WebCategoriesOptionsPanel.class, "WebCategoriesOptionsPanel.newEntryButton.text")); // NOI18N
         newEntryButton.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
                 newEntryButtonActionPerformed(evt);
@@ -112,7 +112,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
         gridBagConstraints.insets = new java.awt.Insets(0, 10, 5, 5);
         add(newEntryButton, gridBagConstraints);
 
-        editEntryButton.setText("Edit Entry");
+        editEntryButton.setText(org.openide.util.NbBundle.getMessage(WebCategoriesOptionsPanel.class, "WebCategoriesOptionsPanel.editEntryButton.text")); // NOI18N
         editEntryButton.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
                 editEntryButtonActionPerformed(evt);
@@ -125,7 +125,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
         gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 5);
         add(editEntryButton, gridBagConstraints);
 
-        deleteEntryButton.setText("Delete Entry");
+        deleteEntryButton.setText(org.openide.util.NbBundle.getMessage(WebCategoriesOptionsPanel.class, "WebCategoriesOptionsPanel.deleteEntryButton.text")); // NOI18N
         deleteEntryButton.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
                 deleteEntryButtonActionPerformed(evt);
@@ -138,7 +138,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
         gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 5);
         add(deleteEntryButton, gridBagConstraints);
 
-        importSetButton.setText("Import Set");
+        importSetButton.setText(org.openide.util.NbBundle.getMessage(WebCategoriesOptionsPanel.class, "WebCategoriesOptionsPanel.importSetButton.text")); // NOI18N
         importSetButton.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
                 importSetButtonActionPerformed(evt);
@@ -151,7 +151,7 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
         gridBagConstraints.insets = new java.awt.Insets(0, 10, 5, 5);
         add(importSetButton, gridBagConstraints);
 
-        exportSetButton.setText("Export Set");
+        exportSetButton.setText(org.openide.util.NbBundle.getMessage(WebCategoriesOptionsPanel.class, "WebCategoriesOptionsPanel.exportSetButton.text")); // NOI18N
         exportSetButton.addActionListener(new java.awt.event.ActionListener() {
             public void actionPerformed(java.awt.event.ActionEvent evt) {
                 exportSetButtonActionPerformed(evt);
diff --git a/thirdparty/DomainCategorization/README.txt b/thirdparty/DomainCategorization/README.txt
new file mode 100644
index 0000000000000000000000000000000000000000..4dfe31b7acc5d0ccc9d8f0b6f431ef8223980804
--- /dev/null
+++ b/thirdparty/DomainCategorization/README.txt
@@ -0,0 +1 @@
+This is a folder containing information for web domain categorization and custom categories.
\ No newline at end of file