diff --git includes/rules.core.inc includes/rules.core.inc
index ea7a33a..ff06d84 100644
--- includes/rules.core.inc
+++ includes/rules.core.inc
@@ -441,14 +441,13 @@ abstract class RulesPlugin extends RulesExtendable {
   /**
    * Sets up the execution state for the given arguments.
    */
-  protected function setUpState(array $args) {
+  public function setUpState(array $args) {
     $state = new RulesState();
     $vars = $this->setUpVariables();
     // Fix numerically indexed args to start with 0.
     if (!isset($args[key($vars)])) {
       $args = array_values($args);
     }
-
     foreach (array_keys($vars) as $i => $name) {
       $info = $vars[$name];
       // Support numerically indexed arrays as well as named parameter style.
@@ -458,7 +457,7 @@ abstract class RulesPlugin extends RulesExtendable {
       elseif (isset($args[$name])) {
         $state->addVariable($name, $args[$name], $info);
       }
-      elseif (!empty($info['handler'])) {
+      elseif (!empty($info['handler']) || (isset($info['parameter']) && $info['parameter'] === FALSE)) {
         $state->addVariable($name, NULL, $info);
       }
       elseif (empty($info['optional']) && $info['type'] != 'hidden') {
@@ -1597,10 +1596,15 @@ abstract class RulesContainerPlugin extends RulesPlugin implements IteratorAggre
   }
 
   public function parameterInfo($optional = FALSE) {
+    $params = parent::parameterInfo($optional);
     if (isset($this->info['variables'])) {
-      return parent::parameterInfo($optional) + rules_filter_array($this->info['variables'], 'handler', FALSE);
+      foreach ($this->info['variables'] as $name => $var_info) {
+        if (empty($var_info['handler']) && (!isset($var_info['parameter']) || $var_info['parameter'])) {
+          $params[$name] = $var_info;
+        }
+      }
     }
-    return parent::parameterInfo($optional);
+    return $params;
   }
 
   public function availableVariables() {
diff --git includes/rules.state.inc includes/rules.state.inc
index 1d85bc6..5024c84 100644
--- includes/rules.state.inc
+++ includes/rules.state.inc
@@ -61,7 +61,7 @@ class RulesState {
       'type' => 'unknown',
       'handler' => FALSE,
     );
-    if (isset($data)) {
+    if (empty($this->info[$name]['handler'])) {
       $this->variables[$name] = rules_wrap_data($data, $this->info[$name]);
     }
   }
diff --git modules/data.rules.inc modules/data.rules.inc
index b750b8c..89194f6 100644
--- modules/data.rules.inc
+++ modules/data.rules.inc
@@ -313,7 +313,6 @@ function rules_action_data_set_validate(RulesAbstractPlugin $element) {
   $element->settings += array('data:select' => NULL);
   $info = $element->applyDataSelector($element->settings['data:select'])->info();
   if (strpos($element->settings['data:select'], ':') !== FALSE && empty($info['setter callback'])) {
-    // Modifying rules variables itself doesn't make any sense.
     throw new RulesException("The selected data property doesn't support writing.", array(), array($element, 'parameter', 'data'));
   }
 }
diff --git modules/rules_core.eval.inc modules/rules_core.eval.inc
index 0835b10..e2826ce 100644
--- modules/rules_core.eval.inc
+++ modules/rules_core.eval.inc
@@ -30,16 +30,10 @@ function rules_element_invoke_component($arguments, RulesPlugin $element) {
     rules_log('Evaluating @plugin %label.', $replacements, RulesLog::INFO, TRUE);
     module_invoke_all('rules_config_execute', $component);
 
-    // Manually create a new evaluation state.
-    $new_state = new RulesState();
-
-    // Register all parameters as variables.
-    $args = array_intersect_key($wrapped_args, $info['parameter']);
-    foreach ($args as $name => $data) {
-      $new_state->addVariable($name, $data, $info['parameter'][$name]);
-    }
-
+    // Manually create a new evaluation state and evaluate the component.
+    $new_state = $component->setUpState($wrapped_args);
     $return = $component->evaluate($new_state);
+
     // Care for the right return value in case we have to provide vars.
     if ($component instanceof RulesActionInterface && !empty($info['provides'])) {
       $return = array();
diff --git ui/ui.core.inc ui/ui.core.inc
index b8fd043..e6afffb 100644
--- ui/ui.core.inc
+++ ui/ui.core.inc
@@ -417,8 +417,10 @@ class RulesPluginUI extends FacesExtender implements RulesPluginUIInterface {
       );
       $weight = 0;
       foreach ($this->element->componentVariables() as $name => $var_info) {
-        $form['settings']['vars']['items'][$name] = RulesPluginUI::getVariableForm($name, $var_info);
-        $form['settings']['vars']['items'][$name]['weight']['#default_value'] = $weight++;
+        if (!(isset($var_info['parameter']) && $var_info['parameter'] == FALSE)) {
+          $form['settings']['vars']['items'][$name] = RulesPluginUI::getVariableForm($name, $var_info);
+          $form['settings']['vars']['items'][$name]['weight']['#default_value'] = $weight++;
+        }
       }
       // Always add three empty forms.
       for ($i = 0; $i < 3; $i++) {
