diff --git CHANGELOG.txt CHANGELOG.txt
index ceaaa9b..7cbf3bb 100644
--- CHANGELOG.txt
+++ CHANGELOG.txt
@@ -1,6 +1,8 @@
 
 Skinr 7.x-2.x, xxxx-xx-xx
 -------------------------
+Issues #1127434 by moonray: Fixed previous widget displaying twice if skin type
+  is invalid in skin plugin.
 by moonray: Organized testing related modules into their own sub-directories.
 Issue #1185224 by moonray: Added tests for functionality plugins. Update.
 Issue #1185224 by moonray: Added tests for functionality plugins. Fixed a small
diff --git skinr_ui.module skinr_ui.module
index bbc9e61..f78972f 100644
--- skinr_ui.module
+++ skinr_ui.module
@@ -488,9 +488,9 @@ function skinr_ui_form_alter(&$form, $form_state, $form_id) {
           }
 
           // Create widget.
+          $field = array();
           if (!empty($skin_info['form callback']) && function_exists($skin_info['form callback'])) {
             // @todo Allow for custom form callbacks.
-            $field = array();
           }
           else {
             switch ($skin_info['type']) {
@@ -525,13 +525,17 @@ function skinr_ui_form_alter(&$form, $form_state, $form_id) {
                   '#weight' => isset($skin_info['weight']) ? $skin_info['weight'] : NULL,
                 );
                 break;
+              default:
+                // Raise an error.
+                drupal_set_message(t("Widget %name's type is invalid.", array('%name' => $skin_name)), 'error', FALSE);
+                break;
             }
           }
           if (empty($skin_info['group']) || empty($groups[$skin_info['group']])) {
             $form['skinr_settings'][$module . '_group'][$theme->name][$skin_name] = $field;
           }
           else {
-            if (!isset($form['skinr_settings'][$module . '_group'][$theme->name][$skin_info['group']])) {
+            if (!empty($field) && !isset($form['skinr_settings'][$module . '_group'][$theme->name][$skin_info['group']])) {
               $group = $groups[$skin_info['group']];
               $form['skinr_settings'][$module . '_group'][$theme->name][$skin_info['group']] = array(
                 '#type' => 'fieldset',
diff --git tests/skinr_ui.test tests/skinr_ui.test
index 01c84a1..cf7a750 100644
--- tests/skinr_ui.test
+++ tests/skinr_ui.test
@@ -12,7 +12,7 @@ class SkinrUITestCase extends DrupalWebTestCase {
   protected $profile = 'testing';
 
   function setUp() {
-    parent::setUp(array('block', 'contextual', 'skinr_test', 'skinr_ui'));
+    parent::setUp(array('block', 'contextual', 'skinr_test', 'skinr_ui', 'skinr_ui_test'));
 
     $this->admin_user = $this->drupalCreateUser(array(
       'administer blocks',
@@ -188,6 +188,22 @@ class SkinrUIBasicTestCase extends SkinrUITestCase {
     $this->drupalGet('');
     $this->assertSkinrClass('block-system-user-menu', 'additional', 'Additional CSS class <em>additional</em> of configured skin option found.');
   }
+
+  /**
+   * Tests output of widgets on the skin configuration form.
+   */
+  function testSkinEditWidgets() {
+    // Go to the edit page for system__user_menu block.
+    $this->drupalGet('admin/appearance/skinr/skins');
+    $this->drupalGet('admin/appearance/skinr/edit/nojs/block/system__user-menu/configure');
+
+    // Check the widgets.
+    $this->assertFieldByName('skinr_settings[block_group][bartik][box][skinr_ui_test_border]', NULL, 'Widget with valid #type is displayed.');
+    $this->assertNoFieldByName('skinr_settings[block_group][bartik][box][skinr_ui_test_bgcolor]', NULL, 'Widget with invalid #type is not displayed.');
+
+    // Check for output from empty groups.
+    $this->assertNoRaw('id="edit-skinr-settings-block-group-bartik-general"', 'The resulting empty group is not displayed.');
+  }
 }
 
 /**
diff --git tests/skinr_ui_test/skinr_ui_test.skinr.inc tests/skinr_ui_test/skinr_ui_test.skinr.inc
new file mode 100644
index 0000000..3d3c475
--- /dev/null
+++ tests/skinr_ui_test/skinr_ui_test.skinr.inc
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Implements hook_skinr_api_VERSION().
+ */
+function skinr_ui_test_skinr_api_2() {
+  return array(
+    'directory' => 'skins',
+  );
+}
+
+/**
+ * Implements hook_skinr_skin_info().
+ */
+function skinr_ui_test_skinr_skin_info() {
+  drupal_set_message('skinr_ui_test_skinr_skin_info');
+  $skins['skinr_ui_test_border'] = array(
+    'title' => t('Border'),
+    'type' => 'select',
+    'group' => 'box',
+    'default status' => 1,
+    'options' => array(
+      'border_1' => array(
+        'title' => 'Thin border',
+        'class' => array('border-1'),
+      ),
+    ),
+  );
+  $skins['skinr_ui_test_bgcolor'] = array(
+    'title' => t('Background color'),
+    // Use an invalid type name.
+    'type' => 'invalid',
+    // Use a different group than the skin before to test for output of an empty group.
+    'group' => 'general',
+    'default status' => 1,
+    'options' => array(
+      'bgcolor_red' => array(
+        'title' => 'Red',
+        'class' => array('bgcolor-red'),
+      ),
+    ),
+  );
+  return $skins;
+}

