diff --git a/skinr_ui.module b/skinr_ui.module
index 94c84bc4d1fcf68770b328916770b5a354d8efef..c029ead4a17c0700f2a2ad80c454ef0702f29c00 100755
--- a/skinr_ui.module
+++ b/skinr_ui.module
@@ -642,6 +642,67 @@ function skinr_ui_form_submit($form, &$form_state) {
 }
 
 /**
+ * Fetch all theme_hooks that are compatible with active skins.
+ *
+ * @return
+ *   An array of all theme hooks listed in active skins for current theme.
+ */
+function skinr_get_skinable_hooks($theme = NULL) {
+  $skinable_hooks = &drupal_static(__FUNCTION__);
+
+  if (!isset($skinable_hooks)) {
+    if ($cached = cache_get('skinr_skinable_hooks')) {
+      $skinable_hooks = $cached->data;
+    }
+  }
+
+  if (!isset($theme)) {
+    $theme = skinr_current_theme();
+  }
+  if (!isset($skinable_hooks[$theme])) {
+    $skinable_hooks[$theme] = array();
+    $skin_infos = skinr_get_skin_info();
+    foreach ($skin_infos as $skin_name => $skin_info) {
+      $skin_infos[$skin_name]['status'] = skinr_skin_info_status_get($skin_infos[$skin_name]);
+      if (!empty($skin_infos[$skin_name]['status'][$theme])) {
+        foreach ($skin_infos[$skin_name]['theme hooks'] as $active_hook) {
+          if (!isset($skinable_hooks[$active_hook])) {
+            $skinable_hooks[$theme][$active_hook] = $active_hook;
+          }
+        }
+      }
+    }
+
+    // Allow modules to alter config info via hook_skinr_skinnable_hooks_alter().
+    drupal_alter('skinr_skinable_hooks', $skinable_hooks);
+
+    cache_set('skinr_skinable_hooks', $skinable_hooks);
+  }
+
+  return $skinable_hooks[$theme];
+}
+
+/**
+ * Fetch all theme_hooks that are compatible with active skins.
+ */
+function skinr_ui_hook_is_skinable($hook, $module, $element) {
+  $skinable_hooks = skinr_get_skinable_hooks();
+  if (isset($skinable_hooks['*'])) {
+    // Skins exist that apply to any hook.
+    return TRUE;
+  }
+
+  $theme_hooks = skinr_theme_hooks($module, $element);
+  foreach ($theme_hooks as $theme_hook) {
+    if (isset($skinable_hooks[$hook])) {
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
+
+/**
  * Implements hook_preprocess().
  */
 function skinr_ui_preprocess(&$variables, $hook) {
@@ -656,6 +717,11 @@ function skinr_ui_preprocess(&$variables, $hook) {
   $array_elements = skinr_invoke_all('skinr_elements', $variables, $original_hook, 'contextual_links');
   foreach ($array_elements as $module => $elements) {
     foreach ($elements as $element) {
+      if (!skinr_ui_hook_is_skinable($original_hook, $module, $element)) {
+        // If hook is not skinable, don't add contextual link.
+        continue;
+      }
+
       $contextual_links['skinr-' .  $module . '-' . $counter++] = array(
         'admin/structure/skinr/edit', array($module, $element),
       );
