diff --git a/css/webform-admin.css b/css/webform-admin.css
index e6a42da..510bb21 100644
--- a/css/webform-admin.css
+++ b/css/webform-admin.css
@@ -164,12 +164,13 @@ td.webform-email-option {
   padding-left: 1em;
   padding-right: 8em;
   margin-left: 3em;
-  max-width: 500px;
+  max-width: 600px;
 }
 
 .webform-conditional-new {
   text-align: right;
-  margin-left: 8em;
+  margin-left: 11em;
+  padding-right: 0;
 }
 
 .webform-conditional-if {
diff --git a/includes/webform.components.inc b/includes/webform.components.inc
index 3f2e25e..4336eea 100644
--- a/includes/webform.components.inc
+++ b/includes/webform.components.inc
@@ -952,6 +952,7 @@ function webform_component_feature($type, $feature) {
     'title_display' => TRUE,
     'title_inline' => TRUE,
     'conditional' => TRUE,
+    'conditional_action_set' => FALSE,
     'spam_analysis' => FALSE,
     'group' => FALSE,
     'attachment' => FALSE,
diff --git a/includes/webform.conditionals.inc b/includes/webform.conditionals.inc
index 01bf0f4..195bed6 100644
--- a/includes/webform.conditionals.inc
+++ b/includes/webform.conditionals.inc
@@ -74,6 +74,7 @@ function webform_conditionals_form($form, &$form_state, $node) {
       '#actions' => array(
         'show' => t('shown'),
         'require' => t('required'),
+        'set' => t('set to'),
       ),
       '#targets' => $target_list,
       '#parents' => array('conditionals', $rgid),
@@ -171,7 +172,9 @@ function webform_conditionals_form_validate($form, &$form_state) {
     return;
   }
 
-  $components = $form['#node']->webform['components'];
+  $node = $form['#node'];
+  $components = $node->webform['components'];
+  $component_options = webform_component_options();
   foreach ($form_state['complete form']['conditionals'] as $conditional_key => $element) {
     if (substr($conditional_key, 0, 1) !== '#' && $conditional_key !== 'new') {
       $conditional = $element['conditional'];
@@ -179,10 +182,19 @@ function webform_conditionals_form_validate($form, &$form_state) {
       foreach ($conditional['actions'] as $action_key => $action) {
         if (substr($action_key, 0, 1) !== '#') {
           $target_id = $action['target']['#value'];
+          $target_name = $action['target']['#options'][$action['target']['#value']];
           if (isset($targets[$target_id])) {
             form_set_error('conditionals][' . $conditional_key . '][actions][' . $action_key . '][target',
                            t('A conditional cannot show or hide a component more than once. (%target).',
-                             array('%target' => $action['target']['#options'][$action['target']['#value']])));
+                             array('%target' => $target_name)));
+          }
+          $component_type = $node->webform['components'][$action['target']['#value']]['type'];
+          if (!webform_conditional_action_able($component_type, $action['action']['#value'])) {
+            form_set_error('conditionals][' . $conditional_key . '][actions][' . $action_key . '][action',
+                           t('A component of type %type can\'t be %action. (%target)',
+                             array(
+                                   '%action' => $action['action']['#options'][$action['action']['#value']],
+                                   '%type' => $component_options[$component_type])));
           }
           $targets[$target_id] = $target_id;
         }
@@ -405,7 +417,12 @@ function _webform_conditional_expand($element) {
       '#title' => t('Action'),
       '#options' => $element['#actions'],
       '#default_value' => $element['#default_value']['actions'][$aid]['action'],
-
+    );
+    $element['actions'][$aid]['argument'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Argument'),
+      '#size' => 30,
+      '#default_value' => $element['#default_value']['actions'][$aid]['argument'],
     );
     $element['actions'][$aid]['remove'] = array(
       '#type' => 'submit',
@@ -630,15 +647,18 @@ function theme_webform_conditional($variables) {
     $element['actions'][$aid]['target']['#title_display'] = 'none';
     $element['actions'][$aid]['invert']['#title_display'] = 'none';
     $element['actions'][$aid]['action']['#title_display'] = 'none';
+    $element['actions'][$aid]['argument']['#title_display'] = 'none';
 
     $target = '<div class="webform-conditional-target">' . drupal_render($element['actions'][$aid]['target']) . '</div>';
     $invert = '<div class="webform-conditional-invert">' . drupal_render($element['actions'][$aid]['invert']) . '</div>';
     $action = '<div class="webform-conditional-action">' . drupal_render($element['actions'][$aid]['action']) . '</div>';
+    $argument = '<div class="webform-conditional-argument">' . drupal_render($element['actions'][$aid]['argument']) . '</div>';
 
-    $target_phrase = t('then !target !invert !action ', array(
+    $target_phrase = t('then !target !invert !action !argument', array(
       '!target' => $target,
       '!invert' => $invert,
       '!action' => $action,
+      '!argument' => $argument,
     ));
 
     $output .= '<div class="webform-conditional-action">';
@@ -1019,7 +1039,7 @@ function webform_conditional_prepare_javascript($node, $submission_data, $page_n
           'target' => 'webform-component--' . str_replace('_', '-', implode('--', $target_parents)),
           'invert' => (int)$action['invert'],
           'action' => $action['action'],
-          'argument' => $action['argument'],
+          'argument' => $components[$action['target']]['type'] == 'markup' ? filter_xss_admin($action['argument']) : $action['argument'],
         );
         $settings['ruleGroups'][$rgid_key]['actions'][$aid_key] = $action_settings;
       }
@@ -1061,6 +1081,23 @@ function webform_conditional_prepare_javascript($node, $submission_data, $page_n
 }
 
 /**
+ * Determine whether a component type is capable of a given conditional action.
+ */
+function webform_conditional_action_able($component_type, $action) {
+  switch ($action) {
+    case 'show':
+      return TRUE;
+      // break;
+    case 'require':
+      return webform_component_feature($component_type, 'required');
+      // break;
+    default:
+      return webform_component_feature($component_type, "conditional_action_$action");
+      // break;
+  }
+}
+
+/**
  * Prepare a conditional value for adding as a JavaScript setting.
  */
 function webform_conditional_prepare_date_js($rule_value) {
diff --git a/includes/webform.webformconditionals.inc b/includes/webform.webformconditionals.inc
index fbe3e0c..dd045fa 100644
--- a/includes/webform.webformconditionals.inc
+++ b/includes/webform.webformconditionals.inc
@@ -66,20 +66,24 @@ class WebformConditionals {
 
     // Generate a component to condional map for conditional targets.
     $cid_to_target_rgid = array();
+    $cid_hidden = array();
     foreach ($conditionals as $rgid => $conditional) {
       foreach ($conditional['actions'] as $aid => $action) {
         $target_id = $action['target'];
         $cid_to_target_rgid[$target_id][$rgid] = $rgid;
-        if (count($cid_to_target_rgid[$target_id]) == 2) {
-          $component = $components[$target_id];
-          $errors[$component['page_num']][] = t('More than one conditional hides or shows component "@name".',
-                                                array('@name' => $component['name']));
+        if ($action['action'] == 'show') {
+          $cid_hidden[$target_id] = isset($cid_hidden[$target_id]) ? $cid_hidden[$target_id] + 1 : 1;
+          if ($cid_hidden[$target_id] == 2) {
+            $component = $components[$target_id];
+            $errors[$component['page_num']][] = t('More than one conditional hides or shows component "@name".',
+                                                  array('@name' => $component['name']));
+          }
         }
       }
     }
 
     // Generate T-Orders for each page
-    $new_entry = array('in' => array(), 'out' => array(), 'rgid' => -1);
+    $new_entry = array('in' => array(), 'out' => array(), 'rgid' => array());
     $page_num = 0;
     // If the first component is a page break, then no component is on page 1. Create empty arrays for page 1.
     $sorted = array(1 => array());
@@ -113,7 +117,7 @@ class WebformConditionals {
           if (!isset($nodes[$cid])) {
             $nodes[$cid] = $new_entry;
           }
-          $nodes[$cid]['rgid'] = $rgid;
+          $nodes[$cid]['rgid'][$rgid] = $rgid;
           foreach ($conditional['rules'] as $rule) {
             if ($rule['source_type'] == 'component') {
               $source_id = $rule['source'];
@@ -166,12 +170,15 @@ class WebformConditionals {
           // If the node represents an actual conditional, it can now be added
           // to the end of the sorted order because anything it depends upon has
           // already been calcuated.
-          if ($nodes[$id]['rgid'] >= 0) {
-            $sorted[$page_num][] = array(
-              'cid' => $id,
-              'rgid' => $nodes[$id]['rgid'],
-              'name' => $components[$id]['name'],
-            );
+          if ($nodes[$id]['rgid']) {
+            foreach ($nodes[$id]['rgid'] as $rgid) {
+              $sorted[$page_num][] = array(
+                'cid' => $id,
+                'rgid' => $rgid,
+                'name' => $components[$id]['name'],
+              );
+
+            }
           }
 
           // Any other nodes that depend upon this node may now have their dependency
@@ -316,7 +323,7 @@ class WebformConditionals {
     $components = $this->node->webform['components'];
     $conditionals = $this->node->webform['conditionals'];
     $operators = webform_conditional_operators();
-
+    $targetLocked = array();
 
     $first_page = $page_num ? $page_num : 1;
     $last_page = $page_num ? $page_num : count($this->topologicalOrder);
@@ -377,11 +384,17 @@ class WebformConditionals {
               if (!$action_result) {
                 $this->visibilityMap[$page_num][$target] = in_array($page_num, $source_page_nums) ? self::componentDependent : self::componentHidden;
                 $this->deleteFamily($input_values, $target, $this->visibilityMap[$page_num]);
+                $targetLocked[$target] = TRUE;
               }
               break;
             case 'require':
               $this->requiredMap[$page_num][$target] = $action_result;
               break;
+            case 'set':
+              if ($action_result && empty($targetLocked[$target]) && $components[$target]['type'] != 'markup') {
+                $input_values[$target] = $action['argument'];
+              }
+              break;
           }
         }
 
diff --git a/js/webform-admin.js b/js/webform-admin.js
index dc280c2..f7367a8 100644
--- a/js/webform-admin.js
+++ b/js/webform-admin.js
@@ -141,6 +141,10 @@ Drupal.webform.conditionalAdmin = function(context) {
     if ($target.is('.webform-conditional-andor select')) {
       Drupal.webform.conditionalAndOrChange.apply(e.target);
     }
+
+    if ($target.is('.webform-conditional-action select')) {
+      Drupal.webform.conditionalActionChange.apply(e.target);
+    }
   });
 
   // Add event handlers to delete the entire row if the last rule or action is removed.
@@ -157,6 +161,9 @@ Drupal.webform.conditionalAdmin = function(context) {
   // the operator handlers.
   $context.find('.webform-conditional-source select').trigger('change');
 
+  // Trigger defaults handlers on the action element.
+  $context.find('.webform-conditional-action select').trigger('change');
+
   // When adding a new table row, make it draggable and hide the weight column.
   if ($context.is('tr.ajax-new-content') && $context.find('.webform-conditional').length === 1) {
     Drupal.tableDrag['webform-conditionals-table'].makeDraggable($context[0]);
@@ -278,6 +285,28 @@ Drupal.webform.conditionalAndOrChange = function() {
 }
 
 /**
+ * Event callback to show argument only for appropriate actions.
+ */
+Drupal.webform.conditionalActionChange = function() {
+  var action = $(this).val();
+  var $argument = $(this).parents('.webform-conditional:first').find('.webform-conditional-argument input');
+  var isShown = $argument.is(':visible');
+  switch (action) {
+    case 'show':
+    case 'require':
+      if (isShown) {
+        $argument.hide();
+      }
+      break;
+    case 'set':
+      if (!isShown) {
+        $argument.show();
+      }
+      break;
+  }
+}
+
+/**
  * Given a table's DOM element, restripe the odd/even classes.
  */
 Drupal.webform.restripeTable = function(table) {
diff --git a/js/webform.js b/js/webform.js
index 523911f..c3a4b88 100644
--- a/js/webform.js
+++ b/js/webform.js
@@ -98,9 +98,7 @@ Drupal.webform.conditional = function(context) {
       $currentForm.bind('change', { 'settings': settings }, Drupal.webform.conditionalCheck);
 
       // Trigger all the elements that cause conditionals on this form.
-      $.each(Drupal.settings.webform.conditionals[formKey]['ruleGroups'], function(rgid_key, rule_group) {
-        Drupal.webform.doCondition($form, settings, rgid_key);
-      });
+      Drupal.webform.doConditions($form, settings);
     })
   });
 };
@@ -116,80 +114,108 @@ Drupal.webform.conditionalCheck = function(e) {
   var triggerElementKey = $triggerElement.attr('class').match(/webform-component--[^ ]+/)[0];
   var settings = e.data.settings;
   if (settings.sourceMap[triggerElementKey]) {
-    $.each(settings.ruleGroups, function(rgid_key, rule_group) {
-      Drupal.webform.doCondition($form, settings, rgid_key);
-    });
+    Drupal.webform.doConditions($form, settings);
   }
 };
 
 /**
- * Processes one condition.
+ * Processes all conditional.
  */
-Drupal.webform.doCondition = function($form, settings, rgid_key) {
-  var ruleGroup = settings.ruleGroups[rgid_key];
-
-  // Perform the comparison callback and build the results for this group.
-  var conditionalResult = true;
-  var conditionalResults = [];
-  $.each(ruleGroup['rules'], function(m, rule) {
-    var elementKey = rule['source'];
-    var element = $form.find('.' + elementKey)[0];
-    var existingValue = settings.values[elementKey] ? settings.values[elementKey] : null;
-    conditionalResults.push(window['Drupal']['webform'][rule.callback](element, existingValue, rule['value'] ));
-  });
+Drupal.webform.doConditions = function($form, settings) {
+  // Track what has be set/shown for each target component.
+  var targetLocked = [];
+
+  $.each(settings.ruleGroups, function(rgid_key, rule_group) {
+    var ruleGroup = settings.ruleGroups[rgid_key];
+
+    // Perform the comparison callback and build the results for this group.
+    var conditionalResult = true;
+    var conditionalResults = [];
+    $.each(ruleGroup['rules'], function(m, rule) {
+      var elementKey = rule['source'];
+      var element = $form.find('.' + elementKey)[0];
+      var existingValue = settings.values[elementKey] ? settings.values[elementKey] : null;
+      conditionalResults.push(window['Drupal']['webform'][rule.callback](element, existingValue, rule['value'] ));
+    });
 
-  // Filter out false values.
-  var filteredResults = [];
-  for (var i = 0; i < conditionalResults.length; i++) {
-    if (conditionalResults[i]) {
-      filteredResults.push(conditionalResults[i]);
+    // Filter out false values.
+    var filteredResults = [];
+    for (var i = 0; i < conditionalResults.length; i++) {
+      if (conditionalResults[i]) {
+        filteredResults.push(conditionalResults[i]);
+      }
     }
-  }
 
-  // Calculate the and/or result.
-  if (ruleGroup['andor'] === 'or') {
-    conditionalResult = filteredResults.length > 0;
-  }
-  else {
-    conditionalResult = filteredResults.length === conditionalResults.length;
-  }
+    // Calculate the and/or result.
+    if (ruleGroup['andor'] === 'or') {
+      conditionalResult = filteredResults.length > 0;
+    }
+    else {
+      conditionalResult = filteredResults.length === conditionalResults.length;
+    }
 
-  $.each(ruleGroup['actions'], function(aid, action) {
-    var $target = $form.find('.' + action['target']);
-    var actionResult = action['invert'] ? !conditionalResult : conditionalResult;
-    // Flip the result of the action is to hide.
-    switch (action['action']) {
-      case 'show':
-        var $targetElements;
-        if (actionResult != Drupal.webform.isVisible($target)) {
-          if (actionResult) {
-            $targetElements = $target.find('.webform-conditional-disabled').removeClass('webform-conditional-disabled');
-            $.fn.prop ? $targetElements.prop('disabled', false) : $targetElements.removeAttr('disabled');
-            $target.show();
+    $.each(ruleGroup['actions'], function(aid, action) {
+      var $target = $form.find('.' + action['target']);
+      var actionResult = action['invert'] ? !conditionalResult : conditionalResult;
+      switch (action['action']) {
+        case 'show':
+          if (actionResult != Drupal.webform.isVisible($target)) {
+            var $targetElements = actionResult
+                                    ? $target.find('.webform-conditional-disabled').removeClass('webform-conditional-disabled')
+                                    : $target.find(':input').addClass('webform-conditional-disabled');
+            $targetElements.webformProp('disabled', !actionResult);
+            $target.toggle();
+            if (!actionResult) {
+              // Record that the target was hidden.
+              targetLocked[action['target']] = 'hide';
+            }
           }
-          else {
-            $targetElements = $target.find(':input').addClass('webform-conditional-disabled');
-            $.fn.prop ? $targetElements.prop('disabled', true) : $targetElements.attr('disabled', true);
-            $target.hide();
+          break;
+        case 'require':
+          var $requiredSpan = $target.find('.form-required, .form-optional').first();
+          if (actionResult != $requiredSpan.hasClass('form-required')) {
+            // Rather than hide the required tag, remove it so that other jQuery can respond via Drupal behaviors.
+            Drupal.detachBehaviors($requiredSpan);
+            if (actionResult) {
+              $requiredSpan.replaceWith('<span class="form-required" title="' + Drupal.t('This field is required.') + '">*</span>');
+            }
+            else {
+              $requiredSpan.replaceWith('<span class="form-optional"></span>');
+            }
+            Drupal.attachBehaviors($requiredSpan);
           }
-        }
-        break;
-      case 'require':
-        var $requiredSpan = $target.find('.form-required, .form-optional').first();
-        if (actionResult != $requiredSpan.hasClass('form-required')) {
-          // Rather than hide the required tag, remove it so that other jQuery can respond via Drupal behaviors.
-          Drupal.detachBehaviors($requiredSpan);
+          break;
+        case 'set':
+          var isLocked = targetLocked[action['target']];
+          var $texts = $target.find('input:text,textarea');
+          var $selects = $target.find('select,select option,input:radio,input:checkbox');
           if (actionResult) {
-            $requiredSpan.replaceWith('<span class="form-required" title="' + Drupal.t('This field is required.') + '">*</span>');
+            var multiple = $.map(action['argument'].split(','), $.trim);
+            $selects.webformVal(multiple);
+            $texts.val([action['argument']]);
+            // A special case is made for markup. It is sanitized with filter_xss_admin on the server.
+            // otherwise text() should be used to avoid an XSS vulnerability. text() however would
+            // preclude the use of tags like <strong> or <a>
+            $target.filter('.webform-component-markup').html(action['argument']);
           }
-          else {
-            $requiredSpan.replaceWith('<span class="form-optional"></span>');
+          if (!isLocked) {
+            // If not previously hidden or set, disable the element readonly or readonly-like behavior.
+            $selects.webformProp('disabled', actionResult);
+            $texts.webformProp('readonly', actionResult);
+            targetLocked[action['target']] = actionResult ? 'set' : false;
           }
-          Drupal.attachBehaviors($requiredSpan);
-        }
-        break;
-    }
-  });
+          break;
+      }
+    }); // End look on each action for one conditional
+  }); // End loop on each conditional
+}
+
+/**
+ * Event handler to prevent propogation of events, typically click for disabling
+ * radio and checkboxes.
+ */
+Drupal.webform.stopEvent = function() {
+  return false;
 }
 
 Drupal.webform.conditionalOperatorStringEqual = function(element, existingValue, ruleValue) {
@@ -460,4 +486,36 @@ Drupal.webform.timeValue = function(element, existingValue) {
   return value;
 };
 
+/**
+ * Make a prop shim for jQuery < 1.9.
+ */
+$.fn.webformProp = function(name, value) {
+  if (value) {
+    $.fn.prop ? this.prop(name, true) : this.attr(name, true);
+  }
+  else {
+    $.fn.prop ? this.prop(name, false) : this.removeAttr(name);
+  }
+  return this;
+}
+
+/**
+ * Make a multi-valued val() function for setting checkboxes, radios, and select
+ * elements.
+ */
+$.fn.webformVal = function(values) {
+  this.each(function() {
+    var $this = $(this);
+    var value = $this.val();
+    var on = $.inArray($this.val(), values) != -1;
+    if (this.nodeName == 'OPTION') {
+      $this.webformProp('selected', on ? value : false);
+    }
+    else {
+      $this.val(on ? [value] : false);
+    }
+  });
+  return this;
+}
+
 })(jQuery);
diff --git a/webform.module b/webform.module
index 495d6b3..b28a146 100644
--- a/webform.module
+++ b/webform.module
@@ -1039,6 +1039,7 @@ function webform_webform_component_info() {
         'private' => FALSE,
         'wrapper_classes' => FALSE,
         'css_classes' => FALSE,
+        'conditional_action_set' => TRUE,
       ),
     ),
     'markup' => array(
@@ -1056,6 +1057,7 @@ function webform_webform_component_info() {
         'private' => FALSE,
         'wrapper_classes' => FALSE,
         'css_classes' => FALSE,
+        'conditional_action_set' => TRUE,
       ),
       'file' => 'components/markup.inc',
     ),
@@ -1092,6 +1094,7 @@ function webform_webform_component_info() {
         'default_value' => FALSE,
         'email_address' => TRUE,
         'email_name' => TRUE,
+        'conditional_action_set' => TRUE,
       ),
       'conditional_type' => 'select',
     ),
@@ -1101,6 +1104,7 @@ function webform_webform_component_info() {
       'file' => 'components/textarea.inc',
       'features' => array(
         'spam_analysis' => TRUE,
+        'conditional_action_set' => TRUE,
       ),
     ),
     'textfield' => array(
@@ -1110,6 +1114,7 @@ function webform_webform_component_info() {
       'features' => array(
         'email_name' => TRUE,
         'spam_analysis' => TRUE,
+        'conditional_action_set' => TRUE,
       ),
     ),
     'time' => array(
