diff --git modules/block.skinr.inc modules/block.skinr.inc
index 3392fa0..7721b6b 100644
--- modules/block.skinr.inc
+++ modules/block.skinr.inc
@@ -14,20 +14,6 @@
  * Implements hook_skinr_config_info().
  */
 function block_skinr_config_info() {
-  $data['block']['form']['block_admin_configure'] = array(
-    'index_handler' => 'block_skinr_form_index_handler',
-    'preprocess_hook_callback' => 'block_skinr_preprocess_hook_callback',
-    'title' => t('block settings'),
-    'skinr_weight' => 0,
-    'collapsed' => FALSE,
-  );
-  $data['block']['form']['block_add_block_form'] = array(
-    'index_handler' => 'block_skinr_form_index_handler',
-    'preprocess_hook_callback' => 'block_skinr_preprocess_hook_callback',
-    'title' => t('block settings'),
-    'skinr_weight' => 0,
-    'collapsed' => FALSE,
-  );
   $data['block']['form']['skinr_ui_form'] = array(
     'preprocess_hook_callback' => 'block_skinr_preprocess_hook_callback',
     'title' => t('block settings'),
@@ -63,10 +49,10 @@ function block_skinr_config_info() {
 function block_skinr_form_index_handler($op, &$form, $form_state) {
   switch ($op) {
     case 'form':
-      return $form['module']['#value'] . '-' . $form['delta']['#value'];
+      return $form['module']['#value'] . '__' . $form['delta']['#value'];
 
     case 'submit':
-      return $form_state['values']['module'] . '-' . $form_state['values']['delta'];
+      return $form_state['values']['module'] . '__' . $form_state['values']['delta'];
   }
 }
 
@@ -85,10 +71,13 @@ function block_skinr_preprocess_hook_callback(&$form, $form_state) {
   $preprocess_hooks = array();
 
   if (empty($form['module']['#value']) && !empty($form['skinr']['element']['#value'])) {
+    list($module, $delta) = explode('__', $form['skinr']['element']['#value'], 2);
+
     $result = db_select('block', 'b')
       ->fields('b')
       ->distinct()
-      ->where('CONCAT(b.module, \'-\', b.delta) = :identifier', array(':identifier' => $form['skinr']['element']['#value']))
+      ->condition('b.module', $module)
+      ->condition('b.delta', $delta)
       ->range(0, 1)
       ->execute();
     foreach ($result as $block) {
@@ -115,7 +104,7 @@ function block_skinr_preprocess_hook_callback(&$form, $form_state) {
  *   structure and merge the returned classes.
  */
 function block_skinr_preprocess_index_handler(&$variables) {
-  return array($variables['block']->module . '-' . $variables['block']->delta);
+  return array($variables['block']->module . '__' . $variables['block']->delta);
 }
 
 /**
@@ -136,7 +125,7 @@ function block_skinr_preprocess_index_handler(&$variables) {
 function block_skinr_contextual_links(&$variables) {
   $links = array();
   $links['skinr-block'] = array(
-    'admin/appearance/skinr/edit/nojs', array('block', $variables['block']->module . '-' . $variables['block']->delta),
+    'admin/appearance/skinr/edit/nojs', array('block', $variables['block']->module . '__' . $variables['block']->delta),
   );
   return $links;
 }
diff --git modules/comment.skinr.inc modules/comment.skinr.inc
index d823cbe..0e17809 100644
--- modules/comment.skinr.inc
+++ modules/comment.skinr.inc
@@ -14,12 +14,6 @@
  * Implements hook_skinr_config_info().
  */
 function comment_skinr_config_info() {
-  $data['comment']['form']['node_type_form'] = array(
-    'index_handler' => 'comment_skinr_form_index_handler',
-    'preprocess_hook_callback' => 'comment_skinr_preprocess_hook_callback',
-    'title' => t('comment settings'),
-    'weight' => 1,
-  );
   $data['comment']['form']['skinr_ui_form'] = array(
     'preprocess_hook_callback' => 'comment_skinr_preprocess_hook_callback',
     'title' => t('comment settings'),
diff --git modules/node.skinr.inc modules/node.skinr.inc
index ad634d7..d64fee0 100644
--- modules/node.skinr.inc
+++ modules/node.skinr.inc
@@ -14,11 +14,6 @@
  * Implements hook_skinr_config_info().
  */
 function node_skinr_config_info() {
-  $data['node']['form']['node_type_form'] = array(
-    'index_handler' => 'node_skinr_form_index_handler',
-    'preprocess_hook_callback' => 'node_skinr_preprocess_hook_callback',
-    'title' => t('node settings'),
-  );
   $data['node']['form']['skinr_ui_form'] = array(
     'preprocess_hook_callback' => 'node_skinr_preprocess_hook_callback',
     'title' => t('node settings'),
diff --git modules/panels.skinr.inc modules/panels.skinr.inc
index b45efa0..7ac69b5 100644
--- modules/panels.skinr.inc
+++ modules/panels.skinr.inc
@@ -14,36 +14,11 @@
  * Implements hook_skinr_config_info().
  */
 function panels_skinr_config_info() {
-  $data['panels']['form']['panels_edit_style_settings_form'] = array(
-    'index_handler' => 'panels_skinr_form_index_handler',
-    'data_handler' => 'panels_skinr_data_handler',
-    'submit_handler' => 'panels_skinr_submit_handler_settings',
-    'preprocess_hook_callback' => 'panels_skinr_preprocess_hook_callback',
-    'title' => t('panel pane settings'),
-    'skinr_weight' => 0,
-    'collapsed' => FALSE,
-  );
-  // AJAX form.
   $data['panels']['form']['skinr_ui_form'] = array(
-    'preprocess_hook_callback' => 'panels_skinr_ajax_preprocess_hook_callback',
+    'preprocess_hook_callback' => 'panels_skinr_preprocess_hook_callback',
     'title' => t('panel pane settings'),
     'collapsed' => FALSE,
   );
-  // Panel pages.
-  $data['panels']['form']['page_manager_save_page_form'] = array(
-    'access_handler' => 'panels_skinr_access_handler_display',
-    'submit_handler' => 'panels_skinr_submit_handler_display',
-  );
-  // Content form for panel pages.
-  $data['panels']['form']['panels_panel_context_edit_content'] = array(
-    'access_handler' => 'panels_skinr_access_handler_display',
-    'submit_handler' => 'panels_skinr_submit_handler_display',
-  );
-  // Mini panels.
-  $data['panels']['form']['panels_edit_display_form'] = array(
-    'access_handler' => 'panels_skinr_access_handler_display',
-    'submit_handler' => 'panels_skinr_submit_handler_display',
-  );
   $data['panels']['preprocess']['panels_pane'] = array(
     'index_handler' => 'panels_skinr_preprocess_index_handler',
   );
@@ -52,279 +27,6 @@ function panels_skinr_config_info() {
 }
 
 /**
- * Skinr form index handler.
- *
- * @param $op
- *   What kind of action is being performed. Possible values:
- *   - 'form': the form elements for Skinr are being inserted in a form.
- *   - 'submit': the form has been submitted.
- * @param &$form
- *   - For 'form', passes in the $form parameter from hook_form_alter().
- *   - For 'submit', passes in the $form parameter from hook_form_submit().
- * @param $form_state
- *   - For 'form', passes in the $form_state parameter from hook_form_alter().
- *   - For 'submit', passes in the $form_state parameter from hook_form_submit().
- *
- * @return
- *   The index where we can find our values in Skinr's data structure.
- */
-function panels_skinr_form_index_handler($op, &$form, $form_state) {
-  switch ($op) {
-    case 'form':
-    case 'submit':
-      switch ($form_state['type']) {
-        case 'display':
-          return 'display-' . $form_state['display']->did;
-        case 'region':
-          return 'display-' . $form_state['display']->did . '-region-' . $form_state['pid'];
-        case 'pane':
-          return 'display-' . $form_state['display']->did . '-pane-' . $form_state['pid'];
-      }
-  }
-}
-
-/**
- * Skinr access handler.
- *
- * @param $op
- *   What kind of action is being performed. Possible values:
- *   - edit skin settings
- *   - edit advanced skin settings
- * @param &$form
- *   Passes in the $form parameter from hook_form_alter().
- * @param $form_state
- *   Passes in the $form_state parameter from hook_form_alter().
- *
- * @return
- *   TRUE if we get access, FALSE otherwise.
- */
-function panels_skinr_access_handler_display($op, &$form, $form_state) {
-  // We don't want the skinr settings form to appear on this form. We only want
-  // to intercept it so we can save our cached data.
-
-  // Since we're not using the form, we won't get our form submitter, so let's
-  // add it manually.
-
-  $form_id = $form['form_id']['#value'];
-
-  switch ($form_id) {
-    case 'panels_panel_context_edit_content':
-      // Update and save button
-
-      // Only add submit handler once.
-      if (!in_array('skinr_ui_form_submit', $form['#submit'])) {
-        $form['#submit'][] = 'skinr_ui_form_submit';
-      }
-      break;
-
-    case 'page_manager_save_page_form':
-      // Submitting a panel page.
-
-      // Only add submit handler once.
-      if (!in_array('skinr_ui_form_submit', $form['#submit'])) {
-        $form['#submit'][] = 'skinr_ui_form_submit';
-      }
-      if (isset($form['save']['#submit']) && !in_array('skinr_ui_form_submit', $form['save']['#submit'])) {
-        $form['save']['#submit'][] = 'skinr_ui_form_submit';
-      }
-      if (isset($form['cancel']['#submit']) && !in_array('skinr_ui_form_submit', $form['cancel']['#submit'])) {
-        $form['cancel']['#submit'][] = 'skinr_ui_form_submit';
-      }
-      break;
-
-    case 'panels_edit_display_form':
-      // Only add submit handler once.
-      if (!in_array('skinr_ui_form_submit', $form['#submit'])) {
-        $form['#submit'][] = 'skinr_ui_form_submit';
-      }
-      if (isset($form['buttons']['submit']['#submit']) && !in_array('skinr_ui_form_submit', $form['buttons']['submit']['#submit'])) {
-        $form['buttons']['submit']['#submit'][] = 'skinr_ui_form_submit';
-      }
-      break;
-
-    default:
-      // We only want to save or cancel on these other forms if we're dealing with a panel_page.
-      if ($form_state['task']['name'] == 'panel_page') {
-        // Only add submit handler once
-        if (!in_array('skinr_ui_form_submit', $form['#submit'])) {
-          $form['#submit'][] = 'skinr_ui_form_submit';
-        }
-        if (isset($form['buttons']['cancel']['#submit']) && !in_array('skinr_ui_form_submit', $form['buttons']['cancel']['#submit'])) {
-          $form['buttons']['cancel']['#submit'][] = 'skinr_ui_form_submit';
-        }
-      }
-      break;
-  }
-
-  return FALSE;
-}
-
-/**
- * Skinr data handler.
- * This is the data that populates the skinr form.
- *
- * @param &$form
- *   Passes in the $form parameter from hook_form_submit().
- * @param $form_state
- *   Passes in the $form_state parameter from hook_form_submit().
- * @param $module
- *   The module that is currently being processed.
- * @param $form_settings
- *   The settings from hook_skinr_config() for the form that's currently being
- *   processed.
- *
- * @return
- *   A skinr settings object.
- */
-function panels_skinr_data_handler(&$form, $form_state, $theme, $module, $form_settings) {
-  // Ensure we have the required index_handler.
-  if (empty($form_settings['index_handler'])) {
-    trigger_error(sprintf("No index_handler was found for form_id '%s' in module '%s'.", $form_id, $module), E_USER_ERROR);
-  }
-  $index = skinr_handler('form_index_handler', 'form', $form_settings['index_handler'], $form, $form_state);
-
-  // Fetch skinr data for this view from cache.
-  ctools_include('object-cache');
-
-  if ($skinr_data = ctools_object_cache_get('skinr', $form_state['display']->did, TRUE)) {
-    if (isset($skinr_data[$theme][$index])) {
-      return $skinr_data[$theme][$index];
-    }
-    else {
-      return array();
-    }
-  }
-
-  // No data exists in cache, so let's grab it from the regular source.
-  return skinr_skin_load($theme, $module, $index);
-}
-
-/**
- * Skinr submit handler.
- *
- * @param &$form
- *   Passes in the $form parameter from hook_form_submit().
- * @param $form_state
- *   Passes in the $form_state parameter from hook_form_submit().
- * @param $module
- *   The module that is currently being processed.
- * @param $form_settings
- *   The settings from hook_skinr_config() for the form that's currently being
- *   processed.
- */
-function panels_skinr_submit_handler_settings(&$form, $form_state, $module, $form_settings) {
-  foreach ($form_state['values']['skinr_settings'][$module . '_group'] as $theme_name => $theme) {
-    if ((!empty($theme['widgets']) && is_array($theme['widgets'])) || isset($theme['_additional'])) {
-      $hook  = $module;
-      $element = skinr_handler('form_index_handler', 'submit', $form_settings['index_handler'], $form, $form_state);
-
-      // Key doesn't exist properly for new displays. Perhaps we should inject a timestamp based key into the display object
-      // and use that for reference on the final submit? If it works...
-
-      $value = array();
-
-      if (!empty($theme['widgets']) && is_array($theme['widgets'])) {
-        foreach ($theme['widgets'] as $skin_name => $skin_value) {
-          $value['_options'][$skin_name] = $skin_value;
-        }
-      }
-
-      if (isset($theme['_additional'])) {
-        $theme['_additional'] = trim($theme['_additional']);
-        if (!empty($theme['_additional'])) {
-          $value['_additional'] = $theme['_additional'];
-        }
-      }
-
-      if (empty($element)) {
-        // We didn't receive a valid element, so raise an error.
-        drupal_set_message(t("Skinr settings weren't saved due to an error."), 'error');
-      }
-
-      // Save skinr_settings for this panel display in cache.
-      ctools_include('object-cache');
-      if (!$skinr_data = ctools_object_cache_get('skinr', $form_state['display']->did, TRUE)) {
-        $skinr_data = array();
-        // Fetch skinr data.
-        $skinr = skinr_skin_load($theme_name);
-        if (isset($skinr[$module])) {
-          foreach ($skinr[$module] as $skinr_key => $skinr_value) {
-            if (drupal_substr($skinr_key, 0, drupal_strlen('display-' . $form_state['display']->did)) == 'display-' . $form_state['display']->did) {
-              $skinr_data[$theme_name][$skinr_key] = $skinr_value;
-            }
-          }
-        }
-      }
-      $skinr_data[$theme_name][$element] = $value;
-      ctools_object_cache_set('skinr', $form_state['display']->did, $skinr_data);
-    }
-  }
-}
-
-/**
- * @todo Remove values from skinr if a display is deleted.
- */
-function panels_skinr_submit_handler_display(&$form, $form_state, $module, $form_settings) {
-  $form_id = $form_state['values']['form_id'];
-
-  // Include ctools' object cache files.
-  ctools_include('object-cache');
-
-  if ($form_state['values']['op'] == t('Save') || $form_state['values']['op'] == t('Update and save')) {
-    switch ($form_id) {
-      case 'panels_panel_context_edit_content':
-      case 'page_manager_save_page_form':
-        // Panel page.
-        foreach ($form_state['page']->handler_info as $id => $info) {
-          if ($info['changed']) {
-            _panels_skinr_save_and_clear_cache($form_state['page']->handlers[$id]->conf['did']);
-          }
-        }
-        break;
-
-      case 'panels_edit_display_form':
-        // Mini panels.
-        _panels_skinr_save_and_clear_cache($form_state['display']->did);
-        break;
-    }
-  }
-  elseif ($form_state['values']['op'] == t('Cancel')) {
-    switch ($form_id) {
-      case 'page_manager_save_page_form':
-        // Panel page.
-        foreach ($form_state['page']->handler_info as $id => $info) {
-          if ($info['changed']) {
-            ctools_object_cache_clear('skinr', $form_state['page']->handlers[$id]->conf['did']);
-          }
-        }
-        break;
-
-      case 'panels_edit_display_form':
-        // Mini panels.
-        ctools_object_cache_clear('skinr', $form_state['display']->did);
-        break;
-    }
-  }
-}
-
-function _panels_skinr_save_and_clear_cache($did) {
-  if ($skinr_data = ctools_object_cache_get('skinr', $did, TRUE)) {
-    foreach ($skinr_data as $theme_name => $theme) {
-      foreach ($theme as $element => $skins) {
-        $skinr = new stdClass();
-        $skinr->theme = $theme_name;
-        $skinr->module = 'panels';
-        $skinr->element = $element;
-        $skinr->skins = $skins;
-
-        skinr_skin_save($skinr);
-      }
-    }
-    ctools_object_cache_clear('skinr', $did);
-  }
-}
-
-/**
  * Skinr preprocess hook callback.
  *
  * @param &$form
@@ -336,32 +38,10 @@ function _panels_skinr_save_and_clear_cache($did) {
  *   An array of preprocess hooks we wish to use.
  */
 function panels_skinr_preprocess_hook_callback(&$form, $form_state) {
-  switch ($form_state['type']) {
-    case 'display':
-      return 'panels_display';
-    case 'region':
-      return 'panels_region';
-    case 'pane':
-      return 'panels_pane';
-  }
-}
-
-/**
- * Skinr preprocess hook callback.
- *
- * @param &$form
- *   Passes in the $form parameter from hook_form_alter().
- * @param $form_state
- *   Passes in the $form_state parameter from hook_form_alter().
- *
- * @return
- *   An array of preprocess hooks we wish to use.
- */
-function panels_skinr_ajax_preprocess_hook_callback(&$form, $form_state) {
-  if (strpos($form['skinr']['element']['#value'], '-region-') !== FALSE) {
+  if (strpos($form['skinr']['element']['#value'], 'region') === 0) {
     return 'panels_region';
   }
-  elseif (strpos($form['skinr']['element']['#value'], '-pane-') !== FALSE) {
+  elseif (strpos($form['skinr']['element']['#value'], 'pane') === 0) {
     return 'panels_pane';
   }
   else {
@@ -382,26 +62,24 @@ function panels_skinr_ajax_preprocess_hook_callback(&$form, $form_state) {
  */
 function panels_skinr_preprocess_index_handler(&$variables) {
   $index = array();
-  if (isset($variables['pane']->style['style']) && $variables['pane']->style['style'] == 'skinr') {
-    $index[] = 'display-' . $variables['pane']->did . '-pane-' . $variables['pane']->pid;
-  }
+  $index[] = 'pane__' . $variables['pane']->did . '__' . $variables['pane']->pid;
   return $index;
 }
 
-//----------------------------------------------------------------------------
-// Panels hooks.
-
 /**
- * Implements hook_ctools_plugin_directory() to let the system know
- * we implement panels plugins.
+ * Implements hook_panels_pane_content_alter().
+ *
+ * Because of the way panels handles contextual links we can't use a
+ * contextual links handler.
  */
-function skinr_ctools_plugin_directory($module, $plugin) {
-  // Safety: go away if CTools is not at an appropriate version.
-  if (!module_invoke('ctools', 'api_version', PANELS_REQUIRED_CTOOLS_API)) {
-    return;
-  }
-  if ($module == 'panels') {
-    return 'modules/panels';
+function panels_panels_pane_content_alter(&$content, $pane, $display_args, $context) {
+  if (user_access('edit skin settings')) {
+    $element = 'pane__' . $pane->did . '__' . $pane->pid;
+    $content->admin_links[] = array(
+      'title' => t('Edit skin'),
+      'href' => 'admin/appearance/skinr/edit/nojs/panels/' . $element,
+      'query' => drupal_get_destination(),
+    );
   }
 }
 
diff --git modules/panels/skinr.inc modules/panels/skinr.inc
deleted file mode 100644
index a8de707..0000000
--- modules/panels/skinr.inc
+++ /dev/null
@@ -1,93 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of the 'skinr' panel style.
- */
-
-// Plugin definition
-$plugin = array(
-  'title'              => t('Skinr'),
-  'description'        => t('Allows you to apply Skinr skins.'),
-  'render region'      => 'panels_skinr_style_render_region',
-  'render pane'        => 'panels_skinr_style_render_pane',
-  'settings form'      => 'panels_skinr_style_settings_form',
-  'pane settings form' => 'panels_skinr_style_settings_form',
-);
-
-/**
- * Render region callback.
- *
- * @ingroup themeable
- */
-function theme_panels_skinr_style_render_region($variables) {
-  $hook = 'panels';
-  $element = 'display-' . $variables['display']->did . '-region-' . $variables['region_id'];
-
-  // Add skinr styles.
-  $style = array();
-  if ($skinr = skinr_skin_load(NULL, $hook, $element)) {
-    $style = implode(' ', skinr_flatten_skins_array($skinr->skins));
-  }
-
-  $output = implode('<div class="panel-separator"></div>', $variables['panes']);
-  if (!empty($style)) {
-    $output = '<div class="' . $style . '">' . $output . '</div>';
-  }
-
-  // Add our contextual links here because panels does some crazy custom stuff.
-  if (user_access('skinr access')) {
-    $variables['content']->admin_links[] = array(
-      'title' => t('Edit skin'),
-      'href' => 'admin/appearance/skinr/edit/nojs/panels/' . $element,
-      'query' => drupal_get_destination(),
-    );
-  }
-
-  return $output;
-}
-
-/**
- * Render pane callback.
- *
- * @ingroup themeable
- */
-function theme_panels_skinr_style_render_pane($variables) {
-  $hook = 'panels';
-  $element = 'display-' . $variables['display']->did . '-pane-' . $variables['pane']->pid;
-
-  // Add skinr styles
-  $style = array();
-  if ($skinr = skinr_skin_load(NULL, $hook, $element)) {
-    $style = skinr_flatten_skins_array($skinr->skins);
-  }
-
-  if (!empty($style)) {
-    if (!empty($variables['classes_array'])) {
-      $variables['classes_array'] += $style;
-    }
-    else {
-      $variables['classes_array'] = $style;
-    }
-  }
-
-  // Add our contextual links here because panels does some crazy custom stuff.
-  if (user_access('skinr access')) {
-    $variables['content']->admin_links[] = array(
-      'title' => t('Edit skin'),
-      'href' => 'admin/appearance/skinr/edit/nojs/panels/' . $element,
-      'query' => drupal_get_destination(),
-    );
-  }
-
-  return theme('panels_pane', $variables);
-}
-
-/**
- * Settings form callback.
- */
-function panels_skinr_style_settings_form($style_settings) {
-  // Return an empty form, and let skinr handle the rest.
-  $form = array();
-  return $form;
-}
diff --git modules/views.skinr.inc modules/views.skinr.inc
index 7beda1f..ea34136 100644
--- modules/views.skinr.inc
+++ modules/views.skinr.inc
@@ -2,11 +2,11 @@
 
 /**
  * @file
- * Provide skinr handling for node.module
+ * Provide skinr handling for views.module
  */
 
 /**
- * @defgroup skinr_node_module node.module handlers
+ * @defgroup skinr_views_module views.module handlers
  *
  * @{
  */
@@ -15,21 +15,6 @@
  * Implements hook_skinr_config_info().
  */
 function views_skinr_config_info() {
-  $data['views']['form']['views_ui_edit_display_form'] = array(
-    'index_handler' => 'views_skinr_form_index_handler',
-    'access_handler' => 'views_skinr_access_handler_display',
-    'data_handler' => 'views_skinr_data_handler',
-    'submit_handler' => 'views_skinr_submit_handler_display',
-    'submit_handler_attach_to' => array('buttons', 'submit', '#submit'),
-    'preprocess_hook_callback' => 'views_skinr_preprocess_hook_callback',
-    'title' => t('views style settings'),
-    'skinr_weight' => 0,
-    'collapsed' => FALSE,
-  );
-  $data['views']['form']['views_ui_edit_view_form'] = array(
-    'access_handler' => 'views_skinr_access_handler_view',
-    'submit_handler' => 'views_skinr_submit_handler_view',
-  );
   $data['views']['form']['skinr_ui_form'] = array(
     'preprocess_hook_callback' => 'views_skinr_preprocess_hook_callback',
     'title' => t('views style settings'),
@@ -38,237 +23,14 @@ function views_skinr_config_info() {
   $data['views']['preprocess']['views_view'] = array(
     'index_handler' => 'views_skinr_preprocess_index_handler',
   );
+  $data['views']['contextual_links']['page'] = array(
+    'contextual_links_handler' => 'views_skinr_contextual_links',
+  );
 
   return $data;
 }
 
 /**
- * Skinr form index handler.
- *
- * @param $op
- *   What kind of action is being performed. Possible values:
- *   - 'form': the form elements for Skinr are being inserted in a form.
- *   - 'submit': the form has been submitted.
- * @param &$form
- *   - For 'form', passes in the $form parameter from hook_form_alter().
- *   - For 'submit', passes in the $form parameter from hook_form_submit().
- * @param $form_state
- *   - For 'form', passes in the $form_state parameter from hook_form_alter().
- *   - For 'submit', passes in the $form_state parameter from hook_form_submit().
- *
- * @return
- *   The index where we can find our values in Skinr's data structure.
- */
-function views_skinr_form_index_handler($op, &$form, $form_state) {
-  switch ($op) {
-    case 'form':
-      $default = $form_state['view']->display_handler->is_defaulted('style_options');
-      if ($default) {
-        return 'view-'. $form_state['view']->name .'-display-default';
-      }
-      else {
-        return 'view-'. $form_state['view']->name .'-display-'. $form_state['view']->current_display;
-      }
-
-    case 'submit':
-      // Can't use display_handler->is_defaulted('style_options') on submit
-      $default = ($form_state['#section'] == 'default-style_options');
-      if ($default) {
-        return 'view-'. $form_state['view']->name .'-display-default';
-      }
-      else {
-        return 'view-'. $form_state['view']->name .'-display-'. $form_state['display_id'];
-      }
-  }
-}
-
-/**
- * Skinr access handler.
- *
- * @param $op
- *   What kind of action is being performed. Possible values:
- *   - edit skin settings
- *   - edit advanced skin settings
- * @param &$form
- *   Passes in the $form parameter from hook_form_alter().
- * @param $form_state
- *   Passes in the $form_state parameter from hook_form_alter().
- *
- * @return
- *   TRUE if we get access, FALSE otherwise.
- */
-function views_skinr_access_handler_display($op, &$form, $form_state) {
-  if ($access = skinr_access_handler($op, $form, $form_state)) {
-    // Views uses the same form_id for all forms, but it sets a $section
-    // variable to distinguish between them. So only show the skinr settings
-    // form on the style options form.
-    if ($form_state['section'] != 'style_options') {
-      $access = FALSE;
-    }
-  }
-
-  return $access;
-}
-
-function views_skinr_access_handler_view($op, &$form, $form_state) {
-  // We don't want the skinr settings form to appear on this form. We only want
-  // to intercept it so we can save our cached data.
-
-  // Since we're not using the form, we won't get our form submitter, so let's
-  // add it manually.
-
-  // Only add submit handler once
-  if (!in_array('skinr_ui_form_submit', $form['#submit'])) {
-    $form['#submit'][] = 'skinr_ui_form_submit';
-  }
-  // Special for views
-  if (isset($form['buttons']['save']['#submit']) && !in_array('skinr_ui_form_submit', $form['buttons']['save']['#submit'])) {
-    $form['buttons']['save']['#submit'][] = 'skinr_ui_form_submit';
-  }
-  if (isset($form['buttons']['cancel']['#submit']) && !in_array('skinr_ui_form_submit', $form['buttons']['cancel']['#submit'])) {
-    // Need to make this happen before views' submit handler because it hijacks
-    // things and does a drupal_goto(). That effectively prevents any other
-    // submit handlers from being processed.
-    array_unshift($form['buttons']['cancel']['#submit'], 'skinr_ui_form_submit');
-  }
-
-  return FALSE;
-}
-
-/**
- * Skinr data handler.
- * This is the data that populates the skinr form.
- *
- * @param &$form
- *   Passes in the $form parameter from hook_form_submit().
- * @param $form_state
- *   Passes in the $form_state parameter from hook_form_submit().
- * @param $module
- *   The module that is currently being processed.
- * @param $form_settings
- *   The settings from hook_skinr_config() for the form that's currently being
- *   processed.
- *
- * @return
- *   A skinr settings object.
- */
-function views_skinr_data_handler(&$form, $form_state, $theme, $module, $form_settings) {
-  // Ensure we have the required index_handler
-  if (empty($form_settings['index_handler'])) {
-    trigger_error(sprintf("No index_handler was found for form_id '%s' in module '%s'.", $form_id, $module), E_USER_ERROR);
-  }
-  $index = skinr_handler('form_index_handler', 'form', $form_settings['index_handler'], $form, $form_state);
-
-  // Fetch skinr data for this view from cache
-  views_include('cache');
-
-  if ($skinrs = ctools_object_cache_get('skinr', $form_state['view']->name)) {
-    if (isset($skinrs[$theme][$index])) {
-      $skinr = new stdClass();
-      $skinr->theme = $theme;
-      $skinr->module = $module;
-      $skinr->element = $index;
-      $skinr->skins = $skinrs[$theme][$index];
-
-      return $skinr;
-    }
-    else {
-      return array();
-    }
-  }
-
-  // No data exists in cache, so let's grab it from the regular source
-  return skinr_skin_load($theme, $module, $index);
-}
-
-/**
- * Skinr submit handler.
- *
- * @param &$form
- *   Passes in the $form parameter from hook_form_submit().
- * @param $form_state
- *   Passes in the $form_state parameter from hook_form_submit().
- * @param $module
- *   The module that is currently being processed.
- * @param $form_settings
- *   The settings from hook_skinr_config() for the form that's currently being
- *   processed.
- */
-function views_skinr_submit_handler_display(&$form, $form_state, $module, $form_settings) {
-  foreach ($form_state['values']['skinr_settings'][$module .'_group'] as $theme_name => $theme) {
-    if ((!empty($theme['widgets']) && is_array($theme['widgets'])) || isset($theme['_additional'])) {
-      $element = skinr_handler('form_index_handler', 'submit', $form_settings['index_handler'], $form, $form_state);
-      $value = array();
-
-      if (!empty($theme['widgets']) && is_array($theme['widgets'])) {
-        foreach ($theme['widgets'] as $skin_name => $skin_value) {
-          $value['_options'][$skin_name] = $skin_value;
-        }
-      }
-
-      if (isset($theme['_additional'])) {
-        $theme['_additional'] = trim($theme['_additional']);
-        if (!empty($theme['_additional'])) {
-          $value['_additional'] = $theme['_additional'];
-        }
-      }
-
-      if (empty($element)) {
-        // We didn't receive a valid element, so raise an error
-        drupal_set_message(t("Skinr settings weren't saved due to an error."), 'error');
-      }
-
-      // Save skinr_settings for this view in cache
-      ctools_include('object-cache');
-      if (!$skinrs = ctools_object_cache_get('skinr', $form_state['view']->name, TRUE)) {
-        $skinrs = array();
-        // Fetch skinr data
-        $skinr = skinr_skin_load($theme_name);
-        if (isset($skinr[$module])) {
-          foreach ($skinr[$module] as $skinr_key => $skinr_value) {
-            if (drupal_substr($skinr_key, 0, drupal_strlen('view-'. $form_state['view']->name)) == 'view-'. $form_state['view']->name) {
-              $skinrs[$theme_name][$skinr_key] = $skinr_value;
-            }
-          }
-        }
-      }
-      $skinrs[$theme_name][$element] = $value;
-      ctools_object_cache_set('skinr', $form_state['view']->name, $skinrs);
-    }
-  }
-}
-
-function views_skinr_submit_handler_view(&$form, $form_state, $module, $form_settings) {
-  switch ($form_state['values']['op']) {
-    case t('Save'):
-      // Fetch skinr data for this view from cache
-      ctools_include('object-cache');
-
-      if ($skinrs = ctools_object_cache_get('skinr', $form_state['view']->name, TRUE)) {
-        foreach ($skinrs as $theme_name => $theme) {
-          foreach ($theme as $element => $skins) {
-            $skinr = new stdClass();
-            $skinr->theme = $theme_name;
-            $skinr->module = $module;
-            $skinr->element = $element;
-            $skinr->skins = $skins;
-
-            skinr_skin_save($skinr);
-          }
-        }
-        ctools_object_cache_clear('skinr', $form_state['view']->name);
-      }
-      break;
-    case t('Cancel'):
-      // Remove our data from views cache
-      ctools_include('object-cache');
-
-      ctools_object_cache_clear('skinr', $form_state['view']->name);
-      break;
-  }
-}
-
-/**
  * Skinr form preprocess hook callback.
  *
  * @param &$form
@@ -286,7 +48,7 @@ function views_skinr_preprocess_hook_callback(&$form, $form_state) {
     $view = $form_state['view'];
   }
   elseif(isset($form['skinr']['element']['#value'])) {
-    $element_info = _views_skinr_element_info($form['skinr']['element']['#value']);
+    list($element_info['view'], $element_info['display']) = explode('__', $form['skinr']['element']['#value'], 2);
     if ($view = views_get_view($element_info['view'])) {
       $view->execute_display($element_info['display']);
     }
@@ -306,58 +68,24 @@ function views_skinr_preprocess_hook_callback(&$form, $form_state) {
   return $preprocess_hooks;
 }
 
-function _views_skinr_element_info($element) {
-  // view-[view_name]-display-[display_name]
-  $pos = strpos($element, '-display-');
-  if ($pos !== FALSE) {
-    $element_info = array();
-    $element_info['view'] = substr($element, strlen('view-'), $pos - strlen('view-'));
-    $element_info['display'] = substr($element, $pos + strlen('-display-'));
-
-    return $element_info;
-  }
-
-  return FALSE;
-}
-
 /**
  * Skinr preprocess index handler.
- *
- * @param &$variables
- *   Passes in the $variables parameter from module_preprocess().
- *
- * @return
- *   The index where we can find our values in Skinr's data structure. If an
- *   array is returned, it will loop through each index in Skinr's data
- *   structure and merge the returned classes.
  */
 function views_skinr_preprocess_index_handler(&$variables) {
-  $default = $variables['view']->display_handler->is_defaulted('style_options');
-  if ($default) {
-    return array('view-'. $variables['view']->name .'-display-default');
-  }
-  else {
-    return array('view-'. $variables['view']->name .'-display-'. $variables['view']->current_display);
-  }
+  return array($variables['view']->name .'__'. $variables['view']->current_display);
 }
 
 /**
- * Implements hook_views_admin_links_alter().
+ * Skinr contextual links handler.
  */
-function views_views_admin_links_alter(&$links, &$view) {
-  $default = $view->display_handler->is_defaulted('style_options');
-  if ($default) {
-    $element = 'view-'. $view->name .'-display-default';
-  }
-  else {
-    $element = 'view-'. $view->name .'-display-'. $view->current_display;
-  }
-
-  $links[] = array(
-    'title' => skinr_ui_edit_contextual_title('views', $element),
-    'href' => 'admin/appearance/skinr/edit/nojs/views/' . $element,
-    'query' => drupal_get_destination(),
-  );
+function views_skinr_contextual_links(&$variables) {
+  $links = array();
+  if (!empty($variables['page']['#views_contextual_links_info'])) {
+    $links['skinr-views'] = array(
+      'admin/appearance/skinr/edit/nojs', array('views', $variables['page']['#views_contextual_links_info']['views_ui']['view_name'] . '__' . $variables['page']['#views_contextual_links_info']['views_ui']['view_display_id']),
+    );
+  }
+  return $links;
 }
 
 /**
diff --git skinr.skinr.inc skinr.skinr.inc
index a5a5c37..e304698 100644
--- skinr.skinr.inc
+++ skinr.skinr.inc
@@ -180,14 +180,14 @@ function rules_skinr_contextual_links(&$variables) {
   else {
     $rule_type = 'page';
   }
-  $rules = skinr_rule_load_multiple(array(), array('rule_type' => 'page'));
+  $rules = skinr_rule_load_multiple(array(), array('rule_type' => $rule_type));
   $links = array();
   $counter = 1;
 
   foreach ($rules as $rule) {
     if (skinr_rule_visible($rule->rid)) {
       $links['skinr-rule-' . $counter++] = array(
-        'admin/config/skinr/edit/nojs', array('page', $rule->rid),
+        'admin/config/skinr/edit/nojs', array('rule', $rule->rid),
       );
     }
   }
diff --git skinr_ui.module skinr_ui.module
index ba60df7..4016c48 100644
--- skinr_ui.module
+++ skinr_ui.module
@@ -644,13 +644,10 @@ function skinr_ui_preprocess(&$variables, $hook) {
   }
 
   foreach ($config as $module => $module_settings) {
-    if (!empty($module_settings['preprocess'][$original_hook])) {
-
+    if (!empty($module_settings['contextual_links'][$original_hook])) {
       // Set contextual links.
-      if (!empty($module_settings['contextual_links'][$original_hook])) {
-        if ($contextual_links = skinr_handler('contextual_links', '', $module_settings['contextual_links'][$original_hook]['contextual_links_handler'], $variables)) {
-          skinr_ui_contextual_links($variables, $original_hook, $contextual_links);
-        }
+      if ($contextual_links = skinr_handler('contextual_links', '', $module_settings['contextual_links'][$original_hook]['contextual_links_handler'], $variables)) {
+        skinr_ui_contextual_links($variables, $original_hook, $contextual_links);
       }
     }
   }

