diff --git a/facetapi.admin.inc b/facetapi.admin.inc
index 26ddb38..1761b97 100644
--- a/facetapi.admin.inc
+++ b/facetapi.admin.inc
@@ -321,15 +321,18 @@ function facetapi_get_widgets(array $realm, array $facet) {
 
   // Iterates over all defined plugins, initializes requirements.
   foreach (ctools_get_plugins('facetapi', 'widgets') as $id => $plugin) {
-    $plugin['handler'] += array(
-      'requirements' => array(
-        'facetapi_requirement_realm_property' => array('element type' => 'links')
-      ),
-    );
+    //Exclude abstract classes
+    if(!isset($plugin['handler']['abstract']) || !$plugin['handler']['abstract']) {
+      $plugin['handler'] += array(
+        'requirements' => array(
+          'facetapi_requirement_realm_property' => array('element type' => 'links')
+        ),
+      );
 
-    // Checks requirements, only saves widgets that pass all requirements.
-    if (facetapi_check_requirements($plugin['handler']['requirements'], $realm, $facet)) {
-      $plugins[$id] = $plugin;
+      // Checks requirements, only saves widgets that pass all requirements.
+      if (facetapi_check_requirements($plugin['handler']['requirements'], $realm, $facet)) {
+        $plugins[$id] = $plugin;
+      }
     }
   }
 
@@ -502,10 +505,13 @@ function facetapi_facet_display_form(&$form_state, FacetapiAdapter $adapter, arr
 
   $empty_options = array();
   foreach (ctools_get_plugins('facetapi', 'empty_behaviors') as $id => $plugin) {
-    $empty_options[$id] = $plugin['handler']['label'];
-    $class = $plugin['handler']['class'];
-    $plugin = new $class($facet_settings);
-    $plugin->settingsForm($form, $form_state);
+    //Exclude abstract classes
+    if(!isset($plugin['handler']['abstract']) || !$plugin['handler']['abstract']) {
+      $empty_options[$id] = $plugin['handler']['label'];
+      $class = ctools_plugin_get_class($plugin, 'handler');
+      $plugin_instance = new $class($facet_settings);
+      $plugin_instance->settingsForm($form, $form_state);
+    }
   }
 
   $form['widget']['empty']['empty_behavior'] = array(
diff --git a/facetapi.facetapi.inc b/facetapi.facetapi.inc
index f5ce8a0..5616305 100644
--- a/facetapi.facetapi.inc
+++ b/facetapi.facetapi.inc
@@ -66,12 +66,45 @@ function facetapi_facetapi_sort_info() {
 /**
  * Implements hook_facetapi_widgets().
  */
+function facetapi_facetapi_adapters() {
+  $path = drupal_get_path('module', 'facetapi') . '/plugins/facetapi';
+  return array(
+    'adapter' => array(
+      'handler' => array(
+        'label' => t('Abstract class for adapters'),
+        'class' => 'FacetapiAdapter',
+        'abstract' => TRUE,
+        'path' => $path,
+        'file' => 'adapter.inc',
+      ),
+    ),
+  ); 
+}
+
+/**
+ * Implements hook_facetapi_widgets().
+ */
+//TODO: why other naming convention?
 function facetapi_facetapi_widgets() {
+  $path = drupal_get_path('module', 'facetapi') . '/plugins/facetapi';
   return array(
+    'facetapi_widget' => array(
+      'handler' => array(
+        'label' => t('Abstract class for widgets'),
+        'class' => 'FacetapiWidget',
+        'abstract' => TRUE,
+        'path' => $path,
+        'file' => 'widget.inc',
+        'query types' => array('term', 'date'),
+      ),
+    ),
     'facetapi_links' => array(
       'handler' => array(
         'label' => t('Links'),
         'class' => 'FacetapiWidgetLinks',
+        'parent' => 'facetapi_widget',
+        'path' => $path,
+        'file' => 'widget_links.inc',
         'query types' => array('term', 'date'),
       ),
     ),
@@ -79,6 +112,9 @@ function facetapi_facetapi_widgets() {
       'handler' => array(
         'label' => t('Links with checkboxes'),
         'class' => 'FacetapiWidgetCheckboxLinks',
+        'parent' => 'facetapi_widget',
+        'path' => $path,
+        'file' => 'widget_links.inc',
         'query types' => array('term', 'date'),
       ),
     ),
@@ -89,38 +125,101 @@ function facetapi_facetapi_widgets() {
  * Implements hook_facetapi_filters().
  */
 function facetapi_facetapi_filters() {
+  $path = drupal_get_path('module', 'facetapi') . '/plugins/facetapi';
   return array(
+    'filter' => array(
+      'handler' => array(
+        'label' => t('Abstract classs for filters'),
+        'class' => 'FacetapiFilter',
+        'abstract' => TRUE,
+        'path' => $path,
+        'file' => 'filter.inc',
+      ),
+    ),
     'active_items' => array(
       'handler' => array(
         'label' => t('Do not display active items'),
         'class' => 'FacetapiFilterActiveItems',
+        'parent' => 'filter',
+        'path' => $path,
+        'file' => 'filter.inc', //not really needed since parent file will be included
       ),
     ),
     'current_depth' => array(
       'handler' => array(
         'label' => t('Only show items in the current level of the hierarchy'),
         'class' => 'FacetapiFilterCurrentDepth',
+        'parent' => 'filter',
+        'path' => $path,
+        'file' => 'filter.inc', //not really needed since parent file will be included
         'requirements' => array('facetapi_requirement_facet_hierarchical' => TRUE),
       ),
     ),
   );
 }
 
+function facetapi_facetapi_query_types() {
+  $path = drupal_get_path('module', 'facetapi') . '/plugins/facetapi';
+  return array(
+    'query_type' => array(
+      'handler' => array(
+        'label' => t('Abstract classs for query types'),
+        'class' => 'FacetapiQueryType',
+        'abstract' => TRUE,
+        'path' => $path,
+        'file' => 'query_type.inc',
+      ),
+    ),
+    'range' => array(
+      'handler' => array(
+        'label' => t('Range'),
+        'class' => 'FacetapiQueryTypeRange',
+        'path' => $path,
+        'file' => 'query_type.inc', //not really needed since parent file will be included
+      ),
+    ),
+    'date' => array(
+      'handler' => array(
+        'label' => t('Date'),
+        'class' => 'FacetapiQueryTypeDate',
+        'path' => $path,
+        'file' => 'query_type.inc', //not really needed since parent file will be included
+      ),
+    ),
+  );
+}
+
 /**
  * Implements hook_facetapi_dependencies().
  */
 function facetapi_facetapi_dependencies() {
+  $path = drupal_get_path('module', 'facetapi') . '/plugins/facetapi';
   return array(
+    'dependency' => array(
+      'handler' => array(
+        'label' => t('Abstract class for dependencies'),
+        'class' => 'FacetapiDependency',
+        'abstract' => TRUE,
+        'path' => $path,
+        'file' => 'dependency.inc',
+      ),
+    ),
     'bundle' => array(
       'handler' => array(
         'label' => t('Bundles'),
         'class' => 'FacetapiDependencyBundle',
+        'parent' => 'dependency',
+        'path' => $path,
+        'file' => 'dependency_bundle.inc',
       ),
     ),
     'role' => array(
       'handler' => array(
         'label' => t('Roles'),
         'class' => 'FacetapiDependencyRole',
+        'parent' => 'dependency',
+        'path' => $path,
+        'file' => 'dependency_role.inc',
       ),
     ),
   );
@@ -130,17 +229,33 @@ function facetapi_facetapi_dependencies() {
  * Implements hook_facetapi_empty_behaviors().
  */
 function facetapi_facetapi_empty_behaviors() {
+  $path = drupal_get_path('module', 'facetapi') . '/plugins/facetapi';
   return array(
+    'empty_behavior' => array(
+      'handler' => array(
+        'label' => t('Abstract class for empty behaviors'),
+        'class' => 'FacetapiEmptyBehavior',
+        'abstract' => TRUE,
+        'path' => $path,
+        'file' => 'empty_behavior.inc',
+      ),
+    ),
     'none' => array(
       'handler' => array(
         'label' => t('Do not display facet'),
         'class' => 'FacetapiEmptyBehaviorNone',
+        'parent' => 'empty_behavior',
+        'path' => $path,
+        'file' => 'empty_behavior.inc', //not really needed since parent file will be included
       ),
     ),
     'text' => array(
       'handler' => array(
         'label' => t('Display text'),
         'class' => 'FacetapiEmptyBehaviorText',
+        'parent' => 'empty_behavior',
+        'path' => $path,
+        'file' => 'empty_behavior_text.inc',
       ),
     ),
   );
@@ -150,11 +265,24 @@ function facetapi_facetapi_empty_behaviors() {
  * Implements hook_facetapi_url_processors().
  */
 function facetapi_facetapi_url_processors() {
+  $path = drupal_get_path('module', 'facetapi') . '/plugins/facetapi';
   return array(
+    'url_processor' => array(
+      'handler' => array(
+        'label' => t('Abstract URL processor'),
+        'class' => 'FacetapiUrlProcessor',
+        'abstract' => TRUE,
+        'path' => $path,
+        'file' => 'url_processor.inc',
+      ),
+    ),
     'standard' => array(
       'handler' => array(
-        'label' => t('Standard URL processors'),
+        'label' => t('Standard URL processor'),
         'class' => 'FacetapiUrlProcessorStandard',
+        'parent' => 'url_processor',
+        'path' => $path,
+        'file' => 'url_processor_standard.inc',
       ),
     ),
   );
diff --git a/facetapi.info b/facetapi.info
index 89724fa..e2b8f71 100644
--- a/facetapi.info
+++ b/facetapi.info
@@ -1,7 +1,6 @@
 name = Facet API
 description = An abstracted facet API that can be used by various search backends.
 dependencies[] = ctools
-dependencies[] = autoload
 package = Search Toolkit
 core = 6.x
 files[] = plugins/facetapi/adapter.inc
diff --git a/facetapi.module b/facetapi.module
index d9a8433..fb0d466 100644
--- a/facetapi.module
+++ b/facetapi.module
@@ -67,10 +67,7 @@ define('FACETAPI_REGEX_DATE_RANGE', '/^\[(' . trim(FACETAPI_REGEX_DATE, '/^$') .
 
 // Calls block specific hooks and overrides.
 require_once dirname(__FILE__) . '/facetapi.block.inc';
-
-function facetapi_init() {
-  module_load_include('inc', 'facetapi', 'facetapi.facetapi');
-}
+require_once dirname(__FILE__) . '/facetapi.facetapi.inc';
 
 /**
  * Implements hook_facetapi_hook_info().
@@ -220,29 +217,63 @@ function facetapi_menu() {
 /**
  * Implements hook_ctools_plugin_type().
  */
-function facetapi_ctools_plugin_type() {
+function facetapi_ctools_plugin_adapters() {
   return array(
-    'adapters' => array(
-      'use hooks' => TRUE,
-    ),
-    'dependencies' => array(
-      'use hooks' => TRUE,
-    ),
-    'empty_behaviors' => array(
-      'use hooks' => TRUE,
-    ),
-    'filters' => array(
-      'use hooks' => TRUE,
-    ),
-    'query_types' => array(
-      'use hooks' => TRUE,
-    ),
-    'url_processors' => array(
-      'use hooks' => TRUE,
-    ),
-    'widgets' => array(
-      'use hooks' => TRUE,
-    ),
+    'use hooks' => TRUE,
+  );
+}
+
+/**
+ * Implements hook_ctools_plugin_type().
+ */
+function facetapi_ctools_plugin_dependencies() {
+  return array(
+    'use hooks' => TRUE
+  );
+}
+
+/**
+ * Implements hook_ctools_plugin_type().
+ */
+function facetapi_ctools_plugin_empty_behaviors() {
+  return array(
+    'use hooks' => TRUE
+  );
+}
+
+/**
+ * Implements hook_ctools_plugin_type().
+ */
+function facetapi_ctools_plugin_filters() {
+  return array(
+    'use hooks' => TRUE
+  );
+}
+
+/**
+ * Implements hook_ctools_plugin_type().
+ */
+function facetapi_ctools_plugin_query_types() {
+  return array(
+    'use hooks' => TRUE
+  );
+}
+
+/**
+ * Implements hook_ctools_plugin_type().
+ */
+function facetapi_ctools_plugin_url_processors() {
+  return array(
+    'use hooks' => TRUE
+  );
+}
+
+/**
+ * Implements hook_ctools_plugin_type().
+ */
+function facetapi_ctools_plugin_widgets() {
+  return array(
+    'use hooks' => TRUE
   );
 }
 
@@ -1327,4 +1358,4 @@ function facetapi_parse_url($url) {
   }
 
   return $options;
-}
\ No newline at end of file
+}
diff --git a/plugins/facetapi/adapter.inc b/plugins/facetapi/adapter.inc
index 4de4934..de621f0 100644
--- a/plugins/facetapi/adapter.inc
+++ b/plugins/facetapi/adapter.inc
@@ -101,8 +101,9 @@ abstract class FacetapiAdapter {
     $registered_types = array();
     foreach (ctools_get_plugins('facetapi', 'query_types') as $plugin) {
       if ($searcher_info['adapter'] == $plugin['handler']['adapter']) {
-        $type = call_user_func(array($plugin['handler']['class'], 'getType'));
-        $registered_types[$type] = $plugin['handler']['class'];
+        $class = ctools_plugin_get_class($plugin, 'handler');
+        $type = call_user_func(array($class, 'getType'));
+        $registered_types[$type] = $class;
       }
     }
 
