diff --git a/KeywordSearch/manifest.mf b/KeywordSearch/manifest.mf
index 2a5aa19d6b2fecdb6d1406f3276e75987e740250..08495144a6f6db640757f3ebc0078c2c082bb427 100644
--- a/KeywordSearch/manifest.mf
+++ b/KeywordSearch/manifest.mf
@@ -4,4 +4,5 @@ OpenIDE-Module-Implementation-Version: 1
 OpenIDE-Module-Install: org/sleuthkit/autopsy/keywordsearch/Installer.class
 OpenIDE-Module-Layer: org/sleuthkit/autopsy/keywordsearch/layer.xml
 OpenIDE-Module-Localizing-Bundle: org/sleuthkit/autopsy/keywordsearch/Bundle.properties
+OpenIDE-Module-Requires: org.openide.windows.WindowManager
 
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties
index e07cd1e00e4a58e95ee4e26c863f09d1b58ff56c..e3853e4d59e7ed8159f4677fd3b68841c66dec1e 100644
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/Bundle.properties
@@ -1,10 +1,9 @@
+CTL_KeywordSearchTabsTopComponentAction=Keyword Search
+CTL_KeywordSearchTabsTopComponentTopComponent=Keyword Search
+HINT_KeywordSearchTabsTopComponentTopComponent=This is a Keyword Search window
 OpenIDE-Module-Name=KeywordSearch
 IndexProgressPanel.statusText.text=Status text
 IndexProgressPanel.cancelButton.text=Cancel
-KeywordSearchTopComponent.searchButton.text=Search
-KeywordSearchTopComponent.queryLabel.text=Query:
-KeywordSearchTopComponent.filesIndexedNameLabel.text=Files indexed:
-KeywordSearchTopComponent.filesIndexedValLabel.text=-
 KeywordSearchTopComponent.filesIndexedNameLabel.AccessibleContext.accessibleName=Files indexed:
 KeywordSearchTopComponent.filesIndexedValLabel.AccessibleContext.accessibleName=-
 ExtractedContentPanel.hitLabel.text=Match:
@@ -14,5 +13,9 @@ ExtractedContentPanel.hitTotalLabel.text=-
 ExtractedContentPanel.hitButtonsLabel.text=Match
 ExtractedContentPanel.hitPreviousButton.text=
 ExtractedContentPanel.hitNextButton.text=
-KeywordSearchTopComponent.luceneQRadioButton.text=Lucene
-KeywordSearchTopComponent.regexQRadioButton.text=RegEx
+KeywordSearchSimpleTopComponent.filesIndexedValLabel.text=-
+KeywordSearchSimpleTopComponent.filesIndexedNameLabel.text=Files indexed:
+KeywordSearchSimpleTopComponent.queryLabel.text=Query:
+KeywordSearchSimpleTopComponent.searchButton.text=Search
+KeywordSearchSimpleTopComponent.regexQRadioButton.text=RegEx
+KeywordSearchSimpleTopComponent.luceneQRadioButton.text=Lucene
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchDataExplorer.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchDataExplorer.java
index e7e33239657f564de08d6e85bdd85c139e5c6a45..c6aef55e829d341203f3868de995d36ba7b4c605 100644
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchDataExplorer.java
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchDataExplorer.java
@@ -36,13 +36,13 @@
 public class KeywordSearchDataExplorer implements DataExplorer {
 
     private static KeywordSearchDataExplorer theInstance;
-    private KeywordSearchTopComponent tc;
+    private KeywordSearchTabsTopComponent tc;
 
     public KeywordSearchDataExplorer() {
         this.setTheInstance();
-        this.tc = new KeywordSearchTopComponent();
-        this.tc.addSearchButtonListener(new ActionListener() {
+        this.tc = new KeywordSearchTabsTopComponent();
 
+        this.tc.addSearchButtonListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
                 tc.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
@@ -62,6 +62,8 @@ public void actionPerformed(ActionEvent e) {
 
         KeywordSearch.changeSupport.addPropertyChangeListener(KeywordSearch.NUM_FILES_CHANGE_EVT, new IndexChangeListener());
     }
+    
+    
 
     private synchronized void setTheInstance() {
         if (theInstance == null) {
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTopComponent.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSimpleTopComponent.form
similarity index 87%
rename from KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTopComponent.form
rename to KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSimpleTopComponent.form
index 825cbf0468fb880fa921e8db088a9fa301f19861..be5325951e067488236d552a0c7ed015aaf45242 100644
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTopComponent.form
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSimpleTopComponent.form
@@ -84,21 +84,21 @@
     <Component class="javax.swing.JButton" name="searchButton">
       <Properties>
         <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
-          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchTopComponent.searchButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchSimpleTopComponent.searchButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
     </Component>
     <Component class="javax.swing.JLabel" name="queryLabel">
       <Properties>
         <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
-          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchTopComponent.queryLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchSimpleTopComponent.queryLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
     </Component>
     <Component class="javax.swing.JLabel" name="filesIndexedNameLabel">
       <Properties>
         <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
-          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchTopComponent.filesIndexedNameLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchSimpleTopComponent.filesIndexedNameLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
       <AccessibilityProperties>
@@ -110,7 +110,7 @@
     <Component class="javax.swing.JLabel" name="filesIndexedValLabel">
       <Properties>
         <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
-          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchTopComponent.filesIndexedValLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchSimpleTopComponent.filesIndexedValLabel.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
       <AccessibilityProperties>
@@ -123,14 +123,14 @@
       <Properties>
         <Property name="selected" type="boolean" value="true"/>
         <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
-          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchTopComponent.luceneQRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchSimpleTopComponent.luceneQRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
     </Component>
     <Component class="javax.swing.JRadioButton" name="regexQRadioButton">
       <Properties>
         <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
-          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchTopComponent.regexQRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+          <ResourceString bundle="org/sleuthkit/autopsy/keywordsearch/Bundle.properties" key="KeywordSearchSimpleTopComponent.regexQRadioButton.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
         </Property>
       </Properties>
     </Component>
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTopComponent.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSimpleTopComponent.java
similarity index 71%
rename from KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTopComponent.java
rename to KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSimpleTopComponent.java
index 14d990a0214734be300e1f30299b704266ab29f3..625920e04e5ac278b53b11b70384fcade0368849 100644
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTopComponent.java
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchSimpleTopComponent.java
@@ -19,31 +19,22 @@
 package org.sleuthkit.autopsy.keywordsearch;
 
 import java.awt.event.ActionListener;
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.apache.solr.client.solrj.SolrServerException;
 import org.openide.windows.TopComponent;
 
-public class KeywordSearchTopComponent extends TopComponent {
+public class KeywordSearchSimpleTopComponent extends TopComponent implements KeywordSearchTopComponentInterface {
 
-    private Logger logger = Logger.getLogger(KeywordSearchTopComponent.class.getName());
-    private PropertyChangeListener serverChangeListener;
+    private Logger logger = Logger.getLogger(KeywordSearchSimpleTopComponent.class.getName());
 
-    /** Creates new form KeywordSearchTopComponent */
-    public KeywordSearchTopComponent() {
+    /** Creates new form KeywordSearchSimpleTopComponent */
+    public KeywordSearchSimpleTopComponent() {
         initComponents();
-        setName("Keyword Search");
+        setName("Simple");
         buttonGroup1.add(luceneQRadioButton);
         buttonGroup1.add(regexQRadioButton);
         searchButton.setEnabled(false);
 
         putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE);
-
-        //register with server Actions
-        serverChangeListener = new KeywordSearchServerListener();
-        KeywordSearch.getServer().addServerActionListener(serverChangeListener);
     }
 
     /** This method is called from within the constructor to
@@ -69,18 +60,18 @@ private void initComponents() {
         queryTextArea.setRows(5);
         jScrollPane1.setViewportView(queryTextArea);
 
-        searchButton.setText(org.openide.util.NbBundle.getMessage(KeywordSearchTopComponent.class, "KeywordSearchTopComponent.searchButton.text")); // NOI18N
+        searchButton.setText(org.openide.util.NbBundle.getMessage(KeywordSearchSimpleTopComponent.class, "KeywordSearchSimpleTopComponent.searchButton.text")); // NOI18N
 
-        queryLabel.setText(org.openide.util.NbBundle.getMessage(KeywordSearchTopComponent.class, "KeywordSearchTopComponent.queryLabel.text")); // NOI18N
+        queryLabel.setText(org.openide.util.NbBundle.getMessage(KeywordSearchSimpleTopComponent.class, "KeywordSearchSimpleTopComponent.queryLabel.text")); // NOI18N
 
-        filesIndexedNameLabel.setText(org.openide.util.NbBundle.getMessage(KeywordSearchTopComponent.class, "KeywordSearchTopComponent.filesIndexedNameLabel.text")); // NOI18N
+        filesIndexedNameLabel.setText(org.openide.util.NbBundle.getMessage(KeywordSearchSimpleTopComponent.class, "KeywordSearchSimpleTopComponent.filesIndexedNameLabel.text")); // NOI18N
 
-        filesIndexedValLabel.setText(org.openide.util.NbBundle.getMessage(KeywordSearchTopComponent.class, "KeywordSearchTopComponent.filesIndexedValLabel.text")); // NOI18N
+        filesIndexedValLabel.setText(org.openide.util.NbBundle.getMessage(KeywordSearchSimpleTopComponent.class, "KeywordSearchSimpleTopComponent.filesIndexedValLabel.text")); // NOI18N
 
         luceneQRadioButton.setSelected(true);
-        luceneQRadioButton.setText(org.openide.util.NbBundle.getMessage(KeywordSearchTopComponent.class, "KeywordSearchTopComponent.luceneQRadioButton.text")); // NOI18N
+        luceneQRadioButton.setText(org.openide.util.NbBundle.getMessage(KeywordSearchSimpleTopComponent.class, "KeywordSearchSimpleTopComponent.luceneQRadioButton.text")); // NOI18N
 
-        regexQRadioButton.setText(org.openide.util.NbBundle.getMessage(KeywordSearchTopComponent.class, "KeywordSearchTopComponent.regexQRadioButton.text")); // NOI18N
+        regexQRadioButton.setText(org.openide.util.NbBundle.getMessage(KeywordSearchSimpleTopComponent.class, "KeywordSearchSimpleTopComponent.regexQRadioButton.text")); // NOI18N
 
         javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
         this.setLayout(layout);
@@ -122,8 +113,8 @@ private void initComponents() {
                 .addContainerGap(106, Short.MAX_VALUE))
         );
 
-        filesIndexedNameLabel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(KeywordSearchTopComponent.class, "KeywordSearchTopComponent.filesIndexedNameLabel.AccessibleContext.accessibleName")); // NOI18N
-        filesIndexedValLabel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(KeywordSearchTopComponent.class, "KeywordSearchTopComponent.filesIndexedValLabel.AccessibleContext.accessibleName")); // NOI18N
+        filesIndexedNameLabel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(KeywordSearchSimpleTopComponent.class, "KeywordSearchTopComponent.filesIndexedNameLabel.AccessibleContext.accessibleName")); // NOI18N
+        filesIndexedValLabel.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(KeywordSearchSimpleTopComponent.class, "KeywordSearchTopComponent.filesIndexedValLabel.AccessibleContext.accessibleName")); // NOI18N
     }// </editor-fold>//GEN-END:initComponents
     // Variables declaration - do not modify//GEN-BEGIN:variables
     private javax.swing.ButtonGroup buttonGroup1;
@@ -143,18 +134,23 @@ protected void componentOpened() {
         // clear old search
         queryTextArea.setText("");
     }
+    
+    @Override
     public void addSearchButtonListener(ActionListener l) {
         searchButton.addActionListener(l);
     }
 
+    @Override
     public String getQueryText() {
         return queryTextArea.getText();
     }
     
+    @Override
     public boolean isLuceneQuerySelected() {
         return luceneQRadioButton.isSelected();
     }
     
+    @Override
     public boolean isRegexQuerySelected() {
         return regexQRadioButton.isSelected();
     }
@@ -170,6 +166,7 @@ public int getPersistenceType() {
         return TopComponent.PERSISTENCE_NEVER;
     }
 
+    @Override
     public void setFilesIndexed(int filesIndexed) {
         filesIndexedValLabel.setText(Integer.toString(filesIndexed));
         if (filesIndexed == 0) {
@@ -179,29 +176,4 @@ public void setFilesIndexed(int filesIndexed) {
         }
     }
 
-    class KeywordSearchServerListener implements PropertyChangeListener {
-
-        @Override
-        public void propertyChange(PropertyChangeEvent evt) {
-            String eventType = evt.getPropertyName();
-
-            if (eventType.equals(Server.CORE_EVT)) {
-                final Server.CORE_EVT_STATES state = (Server.CORE_EVT_STATES) evt.getNewValue();
-                switch (state) {
-                    case STARTED:
-                        try {
-                            final int numIndexedFiles = KeywordSearch.getServer().getCore().queryNumIndexedFiles();
-                            KeywordSearch.changeSupport.firePropertyChange(KeywordSearch.NUM_FILES_CHANGE_EVT, null, new Integer(numIndexedFiles));
-                        } catch (SolrServerException se) {
-                            logger.log(Level.SEVERE, "Error executing Solr query, " + se.getMessage());
-                        }
-                        break;
-                    case STOPPED:
-                        break;
-                    default:
-
-                }
-            }
-        }
-    }
 }
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTabsTopComponent.form b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTabsTopComponent.form
new file mode 100644
index 0000000000000000000000000000000000000000..4b1b7a5f54ed27230e259dcf0664629adffafb44
--- /dev/null
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTabsTopComponent.form
@@ -0,0 +1,34 @@
+<?xml version="1.1" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <AuxValues>
+    <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/>
+    <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+    <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+    <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+    <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+  </AuxValues>
+
+  <Layout>
+    <DimensionLayout dim="0">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Component id="tabs" alignment="0" pref="400" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Component id="tabs" alignment="0" pref="300" max="32767" attributes="0"/>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Container class="javax.swing.JTabbedPane" name="tabs">
+
+      <Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
+    </Container>
+  </SubComponents>
+</Form>
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTabsTopComponent.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTabsTopComponent.java
new file mode 100644
index 0000000000000000000000000000000000000000..0033deb14912cc12e8b44338952a3aa6169ed606
--- /dev/null
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTabsTopComponent.java
@@ -0,0 +1,186 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2011 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.keywordsearch;
+
+import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.apache.solr.client.solrj.SolrServerException;
+import org.openide.util.NbBundle;
+import org.openide.windows.TopComponent;
+import org.netbeans.api.settings.ConvertAsProperties;
+import org.openide.awt.ActionID;
+import org.openide.awt.ActionReference;
+
+/**
+ * Keyword Search explorer top component, container for specific Keyword Search tabs
+ */
+@ConvertAsProperties(dtd = "-//org.sleuthkit.autopsy.keywordsearch//KeywordSearchTabsTopComponent//EN",
+autostore = false)
+@TopComponent.Description(preferredID = "KeywordSearchTabsTopComponent",
+//iconBase="SET/PATH/TO/ICON/HERE", 
+persistenceType = TopComponent.PERSISTENCE_NEVER)
+@TopComponent.Registration(mode = "explorer", openAtStartup = false)
+@ActionID(category = "Window", id = "org.sleuthkit.autopsy.keywordsearch.KeywordSearchTabsTopComponentTopComponent")
+@ActionReference(path = "Menu/Window" /*, position = 333 */)
+@TopComponent.OpenActionRegistration(displayName = "#CTL_KeywordSearchTabsTopComponentAction",
+preferredID = "KeywordSearchTabsTopComponent")
+public final class KeywordSearchTabsTopComponent extends TopComponent implements KeywordSearchTopComponentInterface {
+
+    private Logger logger = Logger.getLogger(KeywordSearchTabsTopComponent.class.getName());
+    private PropertyChangeListener serverChangeListener;
+
+    public KeywordSearchTabsTopComponent() {
+        initComponents();
+        initTabs();
+        setName(NbBundle.getMessage(KeywordSearchTabsTopComponent.class, "CTL_KeywordSearchTabsTopComponentTopComponent"));
+        setToolTipText(NbBundle.getMessage(KeywordSearchTabsTopComponent.class, "HINT_KeywordSearchTabsTopComponentTopComponent"));
+
+
+        putClientProperty(TopComponent.PROP_CLOSING_DISABLED, Boolean.TRUE);
+
+        //register with server Actions
+        serverChangeListener = new KeywordSearchServerListener();
+        KeywordSearch.getServer().addServerActionListener(serverChangeListener);
+    }
+
+    /** This method is called from within the constructor to
+     * initialize the form.
+     * WARNING: Do NOT modify this code. The content of this method is
+     * always regenerated by the Form Editor.
+     */
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        tabs = new javax.swing.JTabbedPane();
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addComponent(tabs, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addComponent(tabs, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE)
+        );
+    }// </editor-fold>//GEN-END:initComponents
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.JTabbedPane tabs;
+    // End of variables declaration//GEN-END:variables
+
+    private void initTabs() {
+        tabs.addTab("Simple", null, new KeywordSearchSimpleTopComponent(), "Single keyword or regex search");
+    }
+
+    @Override
+    public void componentOpened() {
+    }
+
+    @Override
+    public void componentClosed() {
+        
+    }
+
+    void writeProperties(java.util.Properties p) {
+        // better to version settings since initial version as advocated at
+        // http://wiki.apidesign.org/wiki/PropertyFiles
+        p.setProperty("version", "1.0");
+        // store your settings
+    }
+
+    void readProperties(java.util.Properties p) {
+        String version = p.getProperty("version");
+        // read your settings according to their version
+    }
+
+    @Override
+    public void addSearchButtonListener(ActionListener l) {
+        final int tabsCount = tabs.getTabCount();
+        for (int i = 0; i < tabsCount; ++i) {
+            KeywordSearchTopComponentInterface ks = (KeywordSearchTopComponentInterface) tabs.getComponentAt(i);
+            ks.addSearchButtonListener(l);
+        }
+    }
+
+    @Override
+    public String getQueryText() {
+        KeywordSearchTopComponentInterface selected = (KeywordSearchTopComponentInterface) tabs.getSelectedComponent();
+        if (selected == null) {
+            return "";
+        }
+        return selected.getQueryText();
+    }
+
+    @Override
+    public boolean isLuceneQuerySelected() {
+        KeywordSearchTopComponentInterface selected = (KeywordSearchTopComponentInterface) tabs.getSelectedComponent();
+        if (selected == null) {
+            return false;
+        }
+        return selected.isLuceneQuerySelected();
+    }
+
+    @Override
+    public boolean isRegexQuerySelected() {
+        KeywordSearchTopComponentInterface selected = (KeywordSearchTopComponentInterface) tabs.getSelectedComponent();
+        if (selected == null) {
+            return false;
+        }
+        return selected.isRegexQuerySelected();
+    }
+
+    @Override
+    public void setFilesIndexed(int filesIndexed) {
+        final int tabsCount = tabs.getTabCount();
+        for (int i = 0; i < tabsCount; ++i) {
+            KeywordSearchTopComponentInterface ks = (KeywordSearchTopComponentInterface) tabs.getComponentAt(i);
+            ks.setFilesIndexed(filesIndexed);
+        }
+
+    }
+
+    class KeywordSearchServerListener implements PropertyChangeListener {
+        @Override
+        public void propertyChange(PropertyChangeEvent evt) {
+            String eventType = evt.getPropertyName();
+
+            if (eventType.equals(Server.CORE_EVT)) {
+                final Server.CORE_EVT_STATES state = (Server.CORE_EVT_STATES) evt.getNewValue();
+                switch (state) {
+                    case STARTED:
+                        try {
+                            final int numIndexedFiles = KeywordSearch.getServer().getCore().queryNumIndexedFiles();
+                            KeywordSearch.changeSupport.firePropertyChange(KeywordSearch.NUM_FILES_CHANGE_EVT, null, new Integer(numIndexedFiles));
+                            //setFilesIndexed(numIndexedFiles);
+                        } catch (SolrServerException se) {
+                            logger.log(Level.SEVERE, "Error executing Solr query, " + se.getMessage());
+                        }
+                        break;
+                    case STOPPED:
+                        break;
+                    default:
+
+                }
+            }
+        }
+    }
+}
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTopComponentInterface.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTopComponentInterface.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f9c9466249c46e9de82f87d350137fe6ddff5ae
--- /dev/null
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/KeywordSearchTopComponentInterface.java
@@ -0,0 +1,36 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2011 Basis Technology Corp.
+ * Contact: carrier <at> sleuthkit <dot> org
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.sleuthkit.autopsy.keywordsearch;
+
+import java.awt.event.ActionListener;
+
+
+/**
+ * common methods for the KeywordSearch TCs / tabs
+ * 
+ */
+public interface KeywordSearchTopComponentInterface {
+    
+    boolean isLuceneQuerySelected();
+    boolean isRegexQuerySelected();
+    String getQueryText();
+    void setFilesIndexed(int filesIndexed);
+    void addSearchButtonListener(ActionListener l);
+    
+}