diff --git a/plugins/base.inc b/plugins/base.inc
deleted file mode 100644
index 19b07e0..0000000
--- a/plugins/base.inc
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-
-/**
- * Base class for the views content cache plugins.
- */
-class views_content_cache_key {
-
-  /**
-   * Optionally provides a option form for the user to use this segment.
-   *
-   * Typical uses of this will include returning a checkboxes FormAPI element
-   * that will allow the user to indicate which keys in the cache segement
-   * they are interested in for the view that they are building.
-   * Eg. Checkboxes for each node type or each organic group.
-   *
-   * @param $value
-   *   The default value that has been previously set.
-   * @param $handler
-   *   The handler that this options for is for.
-   * @return
-   *   A FormAPI element that will appear as part of the views content cache
-   *   options form when building a view.
-   */
-  function options_form($value, &$handler) {
-    return array();
-  }
-
-  /**
-   * Builds an array of keys for the cache segment.
-   *
-   * When an 'event' happens, e.g. a node is saved, views content cache will
-   * consult this plugin for the keys it wishes to store in its cache segments.
-   * Views content cache will then handle the storage.
-   *
-   * @param $object
-   *   The object that is being changed.
-   * @param $object_type
-   *   The type of the object that is being changed.
-   * @return
-   *   Either a scalar value or an array of scalars. These should be the
-   *   different keys that are effected by the event in this cache segment.
-   */
-  function content_key($object, $object_type) {
-    return NULL;
-  }
-
-
-  /**
-   * An array of keys to check in this cache segment when viewing the view.
-   *
-   * As a user views a view, we are asked for the keys that views content cache
-   * should consider in our segment. Normally we'd just return the values as set
-   * by the user from our options_form().
-   *
-   * @param $values
-   *   An array of values that was stored from our form element in options_form().
-   * @return
-   *   An array of keys in our cache segment.
-   */
-  function view_key($values, &$handler) {
-    $values = array_filter($values);
-
-    // Find any values that are for arguments and replace with real values.
-    if (count($this->view_key_from_arguments())) {
-      $values = $this->view_key_replace_arguments($values, $handler);
-    }
-
-    return $values;
-  }
-
-  /**
-   * Replaces values corresponding to argument values set dynamically.
-   */
-  function view_key_replace_arguments($values, &$handler) {
-    foreach ($values as $value) {
-      if (strpos($value, '__arg:') === 0) {
-        // Get the argument and make sure its actually on the view still.
-        $arg_id = substr($value, strlen('__arg:'));
-        if (isset($handler->view->argument[$arg_id]) && $handler->view->argument[$arg_id]->argument_validated) {
-          // Argument is there and ready to go!
-          $argument = drupal_clone($handler->view->argument[$arg_id]);
-          $arg_value = $argument->get_value();
-          // Might need to split this up.
-          if (!empty($argument->options['break_phrase'])) {
-            views_break_phrase($argument->get_value(), $argument);
-            foreach ($argument->value as $new_val) {
-              $values[$new_val] = $new_val;
-            }
-          }
-          else {
-            $new_val = $argument->get_value();
-            $values[$new_val] = $new_val;
-          }
-        }
-        // Always remove the dummy argument value.
-        unset($values[$value]);
-      }
-    }
-
-    return $values;
-  }
-
-  /**
-   * Returns an array of views arguments that can supply valid key values.
-   *
-   * Plugins can define types of arguments that can optionally be checked for
-   * key values when looking up cache segments.
-   *
-   * @return
-   *   An array of argument handler classes that this plugin supports.
-   */
-  function view_key_from_arguments() {
-    return array();
-  }
-
-  /**
-   * Handy helper method that scans the given view looking for arguments.
-   */
-  function additional_options_for_arguments(&$view) {
-    $options = array();
-
-    $arguments = $view->display_handler->get_handlers('argument');
-
-    if (is_array($arguments)) {
-      foreach ($arguments as $arg_id => $argument) {
-        foreach ($this->view_key_from_arguments() as $class) {
-          if (is_a($argument, $class)) {
-            // This argument can provide us with keys.
-            $options['__arg:' . $arg_id] = t('Value from argument: %title', array('%title' => $argument->ui_name()));
-          }
-        }
-      }
-    }
-
-    return $options;
-  }
-
-  /**
-   * The method by which this plugin's where clause will be combined with others.
-   *
-   * Can either be 'AND' or 'OR' at the moment.
-   */
-  function clause_mode() {
-    return 'AND';
-  }
-}
diff --git a/plugins/comment.inc b/plugins/comment.inc
deleted file mode 100644
index 40eaed2..0000000
--- a/plugins/comment.inc
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-class views_content_cache_key_comment extends views_content_cache_key {
-  function options_form($value) {
-    return array(
-      '#title' => t('Comments'),
-      '#description' => t('Checks for new or updated comments'),
-      '#type' => 'checkboxes',
-      '#options' => array(
-        'changed' => t('New or updated comments'),
-      ),
-      '#default_value' => $value,
-    );
-  }
-
-  function content_key($object, $object_type) {
-    if ($object_type === 'comment') {
-      return 'changed';
-    }
-  }
-}
diff --git a/plugins/node.inc b/plugins/node.inc
deleted file mode 100644
index 155c5c4..0000000
--- a/plugins/node.inc
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-class views_content_cache_key_node extends views_content_cache_key {
-  function options_form($value, &$handler) {
-    return array(
-      '#title' => t('Node types'),
-      '#description' => t('Checks for new or updated nodes of any of the selected types.'),
-      '#type' => 'checkboxes',
-      '#options' => array_merge(node_type_get_names(), $this->additional_options_for_arguments($handler->view)),
-      '#default_value' => $value,
-      '#weight' => -10,
-    );
-  }
-
-  function content_key($object, $object_type) {
-    if ($object_type === 'node') {
-      return $object->type;
-    }
-    elseif ($object_type === 'comment' && !empty($object['nid']) && ($node = node_load($object['nid']))) {
-      return $node->type;
-    }
-  }
-
-  /**
-   * We support using the node type argument for the view key
-   */
-  function view_key_from_arguments() {
-    return array('views_handler_argument_node_type');
-  }
-}
diff --git a/plugins/node_only.inc b/plugins/node_only.inc
deleted file mode 100644
index 3ed28c4..0000000
--- a/plugins/node_only.inc
+++ /dev/null
@@ -1,21 +0,0 @@
-<?php
-
-class views_content_cache_key_node_only extends views_content_cache_key {
-  function options_form($value) {
-    return array(
-      '#title' => t('Node only'),
-      '#description' => t('Allows the node segment to be refined to only include main operations create/update/delete. Be careful about combing with other node related segments.'),
-      '#type' => 'checkboxes',
-      '#options' => array(
-        'node_changed' => t('Nodes updated/created/deleted'),
-      ),
-      '#default_value' => $value,
-    );
-  }
-
-  function content_key($object, $object_type) {
-    if ($object_type === 'node') {
-      return 'node_changed';
-    }
-  }
-}
diff --git a/plugins/og.inc b/plugins/og.inc
deleted file mode 100644
index 2a3be42..0000000
--- a/plugins/og.inc
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-/**
- * Views content cache plugin for Organic Groups.
- *
- * This plugin allows using OG as a cache segment, views caching can depend on
- * the current group context, and/or all the groups that the current user
- * belongs to.
- */
-class views_content_cache_key_og extends views_content_cache_key {
-  function options_form($value, &$handler) {
-    return array(
-      '#title' => t('Organic Groups'),
-      '#description' => t('Checks for updates related to Organic Groups'),
-      '#type' => 'checkboxes',
-      '#options' => array_merge(array(
-        'current' => t('Current group'),
-        'user' => t("Member's groups")
-      ), $this->additional_options_for_arguments($handler->view)),
-      '#default_value' => $value,
-    );
-  }
-
-  function content_key($object, $object_type) {
-    $keys = array();
-    if ($object_type === 'node' && !empty($object->og_groups)) {
-      foreach ($object->og_groups as $gid) {
-        $keys[] = $gid;
-      }
-    }
-    elseif ($object_type === 'comment' && !empty($object['nid']) && ($node = node_load($object['nid'])) && !empty($node->og_groups)) {
-      foreach ($node->og_groups as $gid) {
-        $keys[] = $gid;
-      }
-    }
-    return $keys;
-  }
-
-  function view_key($values, &$handler) {
-    $values = array_filter($values);
-    $groups = array();
-    if (!empty($values['current']) && ($current = og_get_group_context())) {
-      $groups[] = $current->nid;
-    }
-    if (!empty($values['user'])) {
-      global $user;
-      if (!empty($user->og_groups)) {
-        $groups = array_merge($groups, array_keys($user->og_groups));
-      }
-    }
-    unset($values['current'], $values['user']);
-    // Add in the arguments.
-    foreach ($this->view_key_replace_arguments($values, $handler) as $gid) {
-      $groups[] = $gid;
-    }
-    return array_unique($groups);
-  }
-
-  function view_key_from_arguments() {
-    return array('og_views_handler_argument_og_group_nid');
-  }
-}
diff --git a/plugins/views_content_cache/base.inc b/plugins/views_content_cache/base.inc
new file mode 100644
index 0000000..19b07e0
--- /dev/null
+++ b/plugins/views_content_cache/base.inc
@@ -0,0 +1,146 @@
+<?php
+
+/**
+ * Base class for the views content cache plugins.
+ */
+class views_content_cache_key {
+
+  /**
+   * Optionally provides a option form for the user to use this segment.
+   *
+   * Typical uses of this will include returning a checkboxes FormAPI element
+   * that will allow the user to indicate which keys in the cache segement
+   * they are interested in for the view that they are building.
+   * Eg. Checkboxes for each node type or each organic group.
+   *
+   * @param $value
+   *   The default value that has been previously set.
+   * @param $handler
+   *   The handler that this options for is for.
+   * @return
+   *   A FormAPI element that will appear as part of the views content cache
+   *   options form when building a view.
+   */
+  function options_form($value, &$handler) {
+    return array();
+  }
+
+  /**
+   * Builds an array of keys for the cache segment.
+   *
+   * When an 'event' happens, e.g. a node is saved, views content cache will
+   * consult this plugin for the keys it wishes to store in its cache segments.
+   * Views content cache will then handle the storage.
+   *
+   * @param $object
+   *   The object that is being changed.
+   * @param $object_type
+   *   The type of the object that is being changed.
+   * @return
+   *   Either a scalar value or an array of scalars. These should be the
+   *   different keys that are effected by the event in this cache segment.
+   */
+  function content_key($object, $object_type) {
+    return NULL;
+  }
+
+
+  /**
+   * An array of keys to check in this cache segment when viewing the view.
+   *
+   * As a user views a view, we are asked for the keys that views content cache
+   * should consider in our segment. Normally we'd just return the values as set
+   * by the user from our options_form().
+   *
+   * @param $values
+   *   An array of values that was stored from our form element in options_form().
+   * @return
+   *   An array of keys in our cache segment.
+   */
+  function view_key($values, &$handler) {
+    $values = array_filter($values);
+
+    // Find any values that are for arguments and replace with real values.
+    if (count($this->view_key_from_arguments())) {
+      $values = $this->view_key_replace_arguments($values, $handler);
+    }
+
+    return $values;
+  }
+
+  /**
+   * Replaces values corresponding to argument values set dynamically.
+   */
+  function view_key_replace_arguments($values, &$handler) {
+    foreach ($values as $value) {
+      if (strpos($value, '__arg:') === 0) {
+        // Get the argument and make sure its actually on the view still.
+        $arg_id = substr($value, strlen('__arg:'));
+        if (isset($handler->view->argument[$arg_id]) && $handler->view->argument[$arg_id]->argument_validated) {
+          // Argument is there and ready to go!
+          $argument = drupal_clone($handler->view->argument[$arg_id]);
+          $arg_value = $argument->get_value();
+          // Might need to split this up.
+          if (!empty($argument->options['break_phrase'])) {
+            views_break_phrase($argument->get_value(), $argument);
+            foreach ($argument->value as $new_val) {
+              $values[$new_val] = $new_val;
+            }
+          }
+          else {
+            $new_val = $argument->get_value();
+            $values[$new_val] = $new_val;
+          }
+        }
+        // Always remove the dummy argument value.
+        unset($values[$value]);
+      }
+    }
+
+    return $values;
+  }
+
+  /**
+   * Returns an array of views arguments that can supply valid key values.
+   *
+   * Plugins can define types of arguments that can optionally be checked for
+   * key values when looking up cache segments.
+   *
+   * @return
+   *   An array of argument handler classes that this plugin supports.
+   */
+  function view_key_from_arguments() {
+    return array();
+  }
+
+  /**
+   * Handy helper method that scans the given view looking for arguments.
+   */
+  function additional_options_for_arguments(&$view) {
+    $options = array();
+
+    $arguments = $view->display_handler->get_handlers('argument');
+
+    if (is_array($arguments)) {
+      foreach ($arguments as $arg_id => $argument) {
+        foreach ($this->view_key_from_arguments() as $class) {
+          if (is_a($argument, $class)) {
+            // This argument can provide us with keys.
+            $options['__arg:' . $arg_id] = t('Value from argument: %title', array('%title' => $argument->ui_name()));
+          }
+        }
+      }
+    }
+
+    return $options;
+  }
+
+  /**
+   * The method by which this plugin's where clause will be combined with others.
+   *
+   * Can either be 'AND' or 'OR' at the moment.
+   */
+  function clause_mode() {
+    return 'AND';
+  }
+}
diff --git a/plugins/views_content_cache/comment.inc b/plugins/views_content_cache/comment.inc
new file mode 100644
index 0000000..40eaed2
--- /dev/null
+++ b/plugins/views_content_cache/comment.inc
@@ -0,0 +1,21 @@
+<?php
+
+class views_content_cache_key_comment extends views_content_cache_key {
+  function options_form($value) {
+    return array(
+      '#title' => t('Comments'),
+      '#description' => t('Checks for new or updated comments'),
+      '#type' => 'checkboxes',
+      '#options' => array(
+        'changed' => t('New or updated comments'),
+      ),
+      '#default_value' => $value,
+    );
+  }
+
+  function content_key($object, $object_type) {
+    if ($object_type === 'comment') {
+      return 'changed';
+    }
+  }
+}
diff --git a/plugins/views_content_cache/node.inc b/plugins/views_content_cache/node.inc
new file mode 100644
index 0000000..155c5c4
--- /dev/null
+++ b/plugins/views_content_cache/node.inc
@@ -0,0 +1,30 @@
+<?php
+
+class views_content_cache_key_node extends views_content_cache_key {
+  function options_form($value, &$handler) {
+    return array(
+      '#title' => t('Node types'),
+      '#description' => t('Checks for new or updated nodes of any of the selected types.'),
+      '#type' => 'checkboxes',
+      '#options' => array_merge(node_type_get_names(), $this->additional_options_for_arguments($handler->view)),
+      '#default_value' => $value,
+      '#weight' => -10,
+    );
+  }
+
+  function content_key($object, $object_type) {
+    if ($object_type === 'node') {
+      return $object->type;
+    }
+    elseif ($object_type === 'comment' && !empty($object['nid']) && ($node = node_load($object['nid']))) {
+      return $node->type;
+    }
+  }
+
+  /**
+   * We support using the node type argument for the view key
+   */
+  function view_key_from_arguments() {
+    return array('views_handler_argument_node_type');
+  }
+}
diff --git a/plugins/views_content_cache/node_only.inc b/plugins/views_content_cache/node_only.inc
new file mode 100644
index 0000000..3ed28c4
--- /dev/null
+++ b/plugins/views_content_cache/node_only.inc
@@ -0,0 +1,21 @@
+<?php
+
+class views_content_cache_key_node_only extends views_content_cache_key {
+  function options_form($value) {
+    return array(
+      '#title' => t('Node only'),
+      '#description' => t('Allows the node segment to be refined to only include main operations create/update/delete. Be careful about combing with other node related segments.'),
+      '#type' => 'checkboxes',
+      '#options' => array(
+        'node_changed' => t('Nodes updated/created/deleted'),
+      ),
+      '#default_value' => $value,
+    );
+  }
+
+  function content_key($object, $object_type) {
+    if ($object_type === 'node') {
+      return 'node_changed';
+    }
+  }
+}
diff --git a/plugins/views_content_cache/og.inc b/plugins/views_content_cache/og.inc
new file mode 100644
index 0000000..2a3be42
--- /dev/null
+++ b/plugins/views_content_cache/og.inc
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * Views content cache plugin for Organic Groups.
+ *
+ * This plugin allows using OG as a cache segment, views caching can depend on
+ * the current group context, and/or all the groups that the current user
+ * belongs to.
+ */
+class views_content_cache_key_og extends views_content_cache_key {
+  function options_form($value, &$handler) {
+    return array(
+      '#title' => t('Organic Groups'),
+      '#description' => t('Checks for updates related to Organic Groups'),
+      '#type' => 'checkboxes',
+      '#options' => array_merge(array(
+        'current' => t('Current group'),
+        'user' => t("Member's groups")
+      ), $this->additional_options_for_arguments($handler->view)),
+      '#default_value' => $value,
+    );
+  }
+
+  function content_key($object, $object_type) {
+    $keys = array();
+    if ($object_type === 'node' && !empty($object->og_groups)) {
+      foreach ($object->og_groups as $gid) {
+        $keys[] = $gid;
+      }
+    }
+    elseif ($object_type === 'comment' && !empty($object['nid']) && ($node = node_load($object['nid'])) && !empty($node->og_groups)) {
+      foreach ($node->og_groups as $gid) {
+        $keys[] = $gid;
+      }
+    }
+    return $keys;
+  }
+
+  function view_key($values, &$handler) {
+    $values = array_filter($values);
+    $groups = array();
+    if (!empty($values['current']) && ($current = og_get_group_context())) {
+      $groups[] = $current->nid;
+    }
+    if (!empty($values['user'])) {
+      global $user;
+      if (!empty($user->og_groups)) {
+        $groups = array_merge($groups, array_keys($user->og_groups));
+      }
+    }
+    unset($values['current'], $values['user']);
+    // Add in the arguments.
+    foreach ($this->view_key_replace_arguments($values, $handler) as $gid) {
+      $groups[] = $gid;
+    }
+    return array_unique($groups);
+  }
+
+  function view_key_from_arguments() {
+    return array('og_views_handler_argument_og_group_nid');
+  }
+}
diff --git a/plugins/views_content_cache/votingapi.inc b/plugins/views_content_cache/votingapi.inc
new file mode 100644
index 0000000..1aa0766
--- /dev/null
+++ b/plugins/views_content_cache/votingapi.inc
@@ -0,0 +1,40 @@
+<?php
+
+class views_content_cache_key_votingapi extends views_content_cache_key {
+
+  function options_form($value) {
+    // Get all of the possible tags that we could monitor:
+    $metadata = votingapi_metadata();
+    $options = array();
+    foreach ($metadata['tags'] as $tag => $data) {
+      $options['tag:' . $tag] = t('Tag: @name', array('@name' => $data['name']));
+    }
+    foreach ($metadata['functions'] as $function => $data) {
+      $options['function:' . $function] = t('Function: @name', array('@name' => $data['name']));
+    }
+
+    return array(
+      '#title' => t('Voting API'),
+      '#description' => t('Checks for updates to votes'),
+      '#type' => 'checkboxes',
+      '#options' => $options,
+      '#default_value' => $value,
+    );
+  }
+
+  function content_key($object, $object_type) {
+    $keys = array();
+    if ($object_type === 'votingapi_results') {
+      foreach ($object as $result) {
+        $keys[] = 'tag:' . $result['tag'];
+        $keys[] = 'function:' . $result['function'];
+      }
+    }
+    return $keys;
+  }
+  
+  function clause_mode() {
+    // We can't be combined with other cache segments:
+    return 'OR';
+  }
+}
diff --git a/plugins/votingapi.inc b/plugins/votingapi.inc
deleted file mode 100644
index 1aa0766..0000000
--- a/plugins/votingapi.inc
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-class views_content_cache_key_votingapi extends views_content_cache_key {
-
-  function options_form($value) {
-    // Get all of the possible tags that we could monitor:
-    $metadata = votingapi_metadata();
-    $options = array();
-    foreach ($metadata['tags'] as $tag => $data) {
-      $options['tag:' . $tag] = t('Tag: @name', array('@name' => $data['name']));
-    }
-    foreach ($metadata['functions'] as $function => $data) {
-      $options['function:' . $function] = t('Function: @name', array('@name' => $data['name']));
-    }
-
-    return array(
-      '#title' => t('Voting API'),
-      '#description' => t('Checks for updates to votes'),
-      '#type' => 'checkboxes',
-      '#options' => $options,
-      '#default_value' => $value,
-    );
-  }
-
-  function content_key($object, $object_type) {
-    $keys = array();
-    if ($object_type === 'votingapi_results') {
-      foreach ($object as $result) {
-        $keys[] = 'tag:' . $result['tag'];
-        $keys[] = 'function:' . $result['function'];
-      }
-    }
-    return $keys;
-  }
-  
-  function clause_mode() {
-    // We can't be combined with other cache segments:
-    return 'OR';
-  }
-}
diff --git a/views_content_cache.info b/views_content_cache.info
index c7375f0..b70ff43 100644
--- a/views_content_cache.info
+++ b/views_content_cache.info
@@ -6,12 +6,12 @@ dependencies[] = views
 dependencies[] = ctools
 
 ; Context plugins
-files[] = plugins/base.inc
-files[] = plugins/comment.inc
-files[] = plugins/node.inc
-files[] = plugins/node_only.inc
-files[] = plugins/og.inc
-files[] = plugins/votingapi.inc
+files[] = plugins/views_content_cache/base.inc
+files[] = plugins/views_content_cache/comment.inc
+files[] = plugins/views_content_cache/node.inc
+files[] = plugins/views_content_cache/node_only.inc
+files[] = plugins/views_content_cache/og.inc
+files[] = plugins/views_content_cache/votingapi.inc
 
 ; Views plugins
-files[] = views/views_content_cache_plugin_cache.inc
\ No newline at end of file
+files[] = views/views_content_cache_plugin_cache.inc
diff --git a/views_content_cache.module b/views_content_cache.module
index de8cd3a..121f7b1 100644
--- a/views_content_cache.module
+++ b/views_content_cache.module
@@ -413,17 +413,28 @@ function views_content_cache_ctools_plugin_api($module, $api) {
 }
 
 /**
- * Implements hook_ctools_plugin_plugins().
+ * Implements hook_ctools_plugin_type().
  */
-function views_content_cache_ctools_plugin_plugins() {
+function views_content_cache_ctools_plugin_type() {
   return array(
-    'cache' => TRUE,
-    'use hooks' => TRUE,
+    'plugins' => array(
+      'cache' => TRUE,
+      'use hooks' => TRUE,
+    ),
   );
 }
 
 /**
- * Implements hook_context_plugins().
+ * Implements hook_ctools_plugin_directory().
+ */
+function views_content_cache_ctools_plugin_directory($owner, $plugin_type) {
+  if ($owner == 'views_content_cache') {
+    return "plugins/$plugin_type";
+  }
+}
+
+/**
+ * Implements hook_views_content_cache_plugins().
  *
  * This is a ctools plugins hook.
  */
