diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index c00382aaa298e51eb1f07803f31df39a3b6b49df..4db6ed48511f87a4f547aa5f0ee62f0f6b2374df 100644
diff --git a/skinr_ui.module b/skinr_ui.module
index a7eadca51ba266b09bd3eff9f6bdfc9465387639..2d58a282eee8d7928de65197eca6de2b65cf8110 100755
--- a/skinr_ui.module
+++ b/skinr_ui.module
@@ -444,6 +444,7 @@ function skinr_ui_form_alter(&$form, $form_state, $form_id) {
             'theme' => $theme->name,
             'skin_name' => $skin_name,
             'skin_info' => $skin_info,
+            'value' => isset($defaults[$theme->name][$skin_name]) ? $defaults[$theme->name][$skin_name] : array(),
           );
           $field = $skin_info['form callback']($form, $form_state, $context);
         }
@@ -656,6 +657,69 @@ 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_ui_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_element_is_skinable($module, $element) {
+  $theme_hooks = skinr_theme_hooks($module, $element);
+  $skinable_hooks = skinr_ui_get_skinable_hooks();
+  if (isset($skinable_hooks['*'])) {
+    // Skins exist that apply to any hook.
+    return TRUE;
+  }
+
+  $theme_hooks = skinr_theme_hooks($module, $element);
+  list($element_base) = explode('__', $element, 2);
+  foreach ($theme_hooks as $theme_hook) {
+    if (isset($skinable_hooks[$theme_hook]) ) {
+      return TRUE;
+    }
+  }
+
+  return FALSE;
+}
+
+/**
  * Implements hook_preprocess().
  */
 function skinr_ui_preprocess(&$variables, $hook) {
@@ -670,6 +734,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_element_is_skinable($module, $element)) {
+        // If element is not skinable, don't add contextual link.
+        continue;
+      }
+
       $contextual_links['skinr-' .  $module . '-' . $counter++] = array(
         'admin/structure/skinr/edit', array($module, $element),
       );
diff --git a/tests/skinr_ui.test b/tests/skinr_ui.test
index ca774645ab806058a9ef50a65cc0726c7d1aa41d..db6b79ae433a47f116939d6a1d42e7e07f28b44c 100644
--- a/tests/skinr_ui.test
+++ b/tests/skinr_ui.test
@@ -251,6 +251,62 @@ class SkinrUIBasicTestCase extends SkinrUITestCase {
 }

 /**
+ * Tests UI functionality for Block plugin.
+ */
+/**
+ * Tests UI functionality for Block plugin.
+ */
+class SkinrUISkinableTestCase extends DrupalWebTestCase {
+  public static function getInfo() {
+    return array(
+      'name' => 'UI - Is Skinable',
+      'description' => 'Tests whether or not elements are skinable in Skinr UI.',
+      'group' => 'Skinr',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('skinr_ui_test_skinable'));
+
+    $this->admin_user = $this->drupalCreateUser(array(
+      'administer blocks',
+      'access contextual links',
+      'administer skinr',
+      'edit skin settings',
+      'edit advanced skin settings',
+    ));
+    $this->drupalLogin($this->admin_user);
+  }
+
+  /**
+   * Tests if hooks are properly identified as skinable.
+   */
+  function testHookSkinable() {
+    // This test doesn't include the * (all) theme hook option.
+
+    // Only page nodes are allowed.
+    $this->drupalGet('skinr-ui-test/element-skinable/node/page');
+    $this->assertText('true', t('Element node__page is skinable.'));
+    $this->drupalGet('skinr-ui-test/element-skinable/node/article');
+    $this->assertText('false', t('Element node__article is not skinable.'));
+
+    // All blocks are allowed.
+    $this->drupalGet('skinr-ui-test/element-skinable/block/system__navigation');
+    $this->assertText('true', t('Element block__system__navigation is skinable.'));
+
+    // Only page comments are allowed.
+    $this->drupalGet('skinr-ui-test/element-skinable/comment/page');
+    $this->assertText('true', t('Element comment__page is skinable.'));
+    $this->drupalGet('skinr-ui-test/element-skinable/comment/panel');
+    $this->assertText('false', t('Element comment__panel is not skinable.'));
+
+    // No regions are allowed.
+    $this->drupalGet('skinr-ui-test/element-skinable/system/region__sidebar_first');
+    $this->assertText('false', t('Element region__sidebar_first is not skinable.'));
+  }
+}
+
+/**
  * Tests administrative pages functionality.
  */
 class SkinrUIAdminTestCase extends SkinrUITestCase {
@@ -378,7 +434,7 @@ class SkinrUIPluginTestCase extends DrupalWebTestCase {
   }

   function setUp() {
-    parent::setUp(array('block', 'comment', 'node', 'skinr_ui', 'skinr_test'));
+    parent::setUp(array('block', 'comment', 'node', 'skinr_ui', 'skinr_ui_test'));

     $this->admin_user = $this->drupalCreateUser(array(
       'administer blocks',
@@ -465,7 +521,7 @@ class SkinrUIPluginTestCase extends DrupalWebTestCase {
     $default_theme = variable_get('theme_default', 'bartik');

     // Create a node.
-    $node1 = $this->drupalCreateNode(array('type' => 'article'));
+    $node1 = $this->drupalCreateNode(array('type' => 'page'));

     // Go to node.
     $uri = entity_uri('node', $node1);
@@ -479,17 +535,17 @@ class SkinrUIPluginTestCase extends DrupalWebTestCase {
     $this->drupalPost(NULL, $edit, t('Save'));

     // Make sure our contextual link appears on the page.
-    $this->assertLinkByHref('admin/structure/skinr/edit/comment/article/configure', 0, 'Contexual link to edit comment\'s skin configuration was found.');
+    $this->assertLinkByHref('admin/structure/skinr/edit/comment/page/configure', 0, 'Contexual link to edit comment\'s skin configuration was found.');

     // Make sure this block's options are returned.
     $this->drupalGet('admin/structure/skinr/add');
-    $this->assertOptionExists('element', 'article', 'Node type was returned by node_skinr_ui_element_options().');
+    $this->assertOptionExists('element', 'page', 'Node type was returned by node_skinr_ui_element_options().');

     // Test the returned element title.
     $skin = (object) array(
       'theme' => $default_theme,
       'module' => 'comment',
-      'element' => 'article',
+      'element' => 'page',
       'skin' => 'skinr_ui_test_bgcolor',
       'options' => array('bgcolor_red'),
       'status' => 1,
@@ -497,7 +553,7 @@ class SkinrUIPluginTestCase extends DrupalWebTestCase {
     skinr_skin_save($skin);

     $title = reset(skinr_invoke_all('skinr_ui_element_title', $skin->module, $skin->element, $skin->theme));
-    $this->assertEqual($title, 'Article', 'Node type title was returned.');
+    $this->assertEqual($title, 'Basic page', 'Node type title was returned.');
   }

   /**
diff --git a/tests/skinr_ui_test/skinr_ui_test.module b/tests/skinr_ui_test/skinr_ui_test.module
index cc8fab8497bad82c22a35ea2b2265dc92f7239a4..07889223043992d9b2d1d7c29540f7e044d3800f 100644
--- a/tests/skinr_ui_test/skinr_ui_test.module
+++ b/tests/skinr_ui_test/skinr_ui_test.module
@@ -6,7 +6,7 @@
  */

 /**
- * Implementation of hook_views_api().
+ * Implements hook_views_api().
  */
 function skinr_ui_test_views_api() {
   return array('api' => 3);
diff --git a/tests/skinr_ui_test_skinable/skinr_ui_test_skinable.info b/tests/skinr_ui_test_skinable/skinr_ui_test_skinable.info
new file mode 100644
index 0000000000000000000000000000000000000000..ca8cf288afb360c6a948f1d6e86848d9119f9b2f
--- /dev/null
+++ b/tests/skinr_ui_test_skinable/skinr_ui_test_skinable.info
@@ -0,0 +1,6 @@
+name = Skinr UI Skinable Testing
+description = A test module used for testing whether or not an element is skinable in Skinr UI.
+package = Testing
+core = 7.x
+hidden = TRUE
+dependencies[] = skinr_ui
diff --git a/tests/skinr_ui_test_skinable/skinr_ui_test_skinable.module b/tests/skinr_ui_test_skinable/skinr_ui_test_skinable.module
new file mode 100644
index 0000000000000000000000000000000000000000..523a670f57574cb070602458dcac7a4dcbe5233d
--- /dev/null
+++ b/tests/skinr_ui_test_skinable/skinr_ui_test_skinable.module
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @file
+ * Skinr UI skinable testing module.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function skinr_ui_test_skinable_menu() {
+  $items['skinr-ui-test/element-skinable/%/%'] = array(
+    'title' => 'Test skinability of element through availability of theme hooks',
+    'page callback' => 'skinr_ui_test_skinable_element',
+    'page arguments' => array(2, 3),
+    'access arguments' => array('access content'),
+  );
+  return $items;
+}
+
+function skinr_ui_test_skinable_element($module, $element) {
+  return skinr_ui_element_is_skinable($module, $element) ? 'true' : 'false';
+}
diff --git a/tests/skinr_ui_test_skinable/skinr_ui_test_skinable.skinr.inc b/tests/skinr_ui_test_skinable/skinr_ui_test_skinable.skinr.inc
new file mode 100644
index 0000000000000000000000000000000000000000..fe95369745a94171a20cf3b06cae74be9203763c
--- /dev/null
+++ b/tests/skinr_ui_test_skinable/skinr_ui_test_skinable.skinr.inc
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * Implements hook_skinr_api_VERSION().
+ */
+function skinr_ui_test_skinable_skinr_api_2() {
+}
+
+/**
+ * Implements hook_skinr_skin_info().
+ */
+function skinr_ui_test_skinable_skinr_skin_info() {
+  $skins['skinr_ui_test_skinable'] = array(
+    'title' => t('Color'),
+    'type' => 'checkboxes',
+    'group' => 'general',
+    'theme hooks' => array('block', 'comment_wrapper__page', 'node__page'),
+    'default status' => 1,
+    'options' => array(
+      'color_white' => array(
+        'title' => 'White',
+        'class' => array('color-white'),
+      ),
+    ),
+  );
+  return $skins;
+}
