diff --git rules/includes/rules.core.inc rules/includes/rules.core.inc
index 6748bdd..43347c6 100644
--- rules/includes/rules.core.inc
+++ rules/includes/rules.core.inc
@@ -612,10 +612,10 @@ abstract class RulesPlugin extends RulesExtendable {
    *   In case the argument cannot be retrieved an exception is thrown.
    */
   protected function getArgument($name, $info, RulesState $state) {
-    if (isset($this->settings[$name . ':select']) && $state->varinfo($name)) {
+    if (!empty($this->settings[$name . ':select']) && $state->varinfo($name)) {
       $arg = $state->get($this->settings[$name . ':select']);
     }
-    elseif (isset($this->settings[$name . ':select'])) {
+    elseif (!empty($this->settings[$name . ':select'])) {
       $arg = $state->applyDataSelector($this->settings[$name . ':select']);
     }
     elseif (isset($this->settings[$name])) {
@@ -684,10 +684,10 @@ abstract class RulesPlugin extends RulesExtendable {
    */
   public function getArgumentInfo($name) {
     $vars = $this->availableVariables();
-    if (isset($this->settings[$name . ':select']) && isset($vars[$this->settings[$name . ':select']])) {
+    if (!empty($this->settings[$name . ':select']) && !empty($vars[$this->settings[$name . ':select']])) {
       return $vars[$this->settings[$name . ':select']];
     }
-    elseif (isset($this->settings[$name . ':select'])) {
+    elseif (!empty($this->settings[$name . ':select'])) {
       if ($wrapper = $this->applyDataSelector($this->settings[$name . ':select'])) {
         return $wrapper->info();
       }
diff --git rules/modules/data.eval.inc rules/modules/data.eval.inc
index accbec8..8444742 100644
--- rules/modules/data.eval.inc
+++ rules/modules/data.eval.inc
@@ -111,6 +111,38 @@ function rules_action_data_list_remove($list, $item) {
 }
 
 /**
+ * Action: Create data.
+ */
+function rules_action_data_create($args, $element) {
+  // If value is set we deal with an input form generated data type.
+  if (isset($args['settings']['value'])) {
+    $data = entity_metadata_wrapper($args['settings']['type'], $args['settings']['value'])->value();
+    return array('data_created' => $data);
+  }
+  // Otherwise we collect property info parameters and invoke the creation
+  // callback.
+  $values = array();
+  foreach (array_keys($args['settings']['#info']['parameter']) as $name) {
+    // Remove the parameter name prefix 'param_'.
+    $values[substr($name, 6)] = $args[$name];
+  }
+  $cache = rules_get_cache();
+  $type_info = $cache['data_info'][$args['settings']['type']];
+  if (isset($type_info['creation callback'])) {
+    $created_var = $type_info['creation callback']($values);
+    $data = entity_metadata_wrapper($args['settings']['type'], $created_var, $type_info)->value();
+    return array('data_created' => $data);
+  }
+}
+
+/**
+ * Creation callback for array structured data.
+ */
+function rules_action_data_create_array($values = array()) {
+  return $values;
+}
+
+/**
  * Condition: Compare data
  */
 function rules_condition_data_is($data, $op, $value) {
diff --git rules/modules/data.rules.inc rules/modules/data.rules.inc
index 7292cd0..8abb80d 100644
--- rules/modules/data.rules.inc
+++ rules/modules/data.rules.inc
@@ -232,6 +232,33 @@ function rules_data_action_info() {
       'validate' => 'rules_data_validate_list_item_type',
     ),
   );
+
+  $return['data_create'] = array(
+    'label' => t('Create variable'),
+    'named parameter' => TRUE,
+    'parameter' => array(
+      'type' => array(
+        'type' => 'text',
+        'label' => t('Type'),
+        'options list' => 'rules_data_action_data_create_options',
+        'description' => t('Specifies the type of the data variable that should be created.'),
+        'restriction' => 'input',
+       ),
+       // Further needed parameters depend on the type.
+    ),
+    'provides' => array(
+      'data_created' => array(
+        'type' => 'unknown',
+        'label' => t('Created data'),
+      ),
+    ),
+    'group' => t('Data'),
+    'base' => 'rules_action_data_create',
+    'callbacks' => array(
+      'form_alter' => 'rules_action_entity_type_form_alter',
+      'validate' => 'rules_action_entity_create_validate',
+    ),
+  );
   return $return;
 }
 
@@ -378,7 +405,7 @@ function rules_action_entity_query_process(RulesAbstractPlugin $element) {
 }
 
 /**
- * Custom validate callback for data create action.
+ * Custom validate callback for entity create action.
  */
 function rules_action_entity_create_validate($element) {
   if (!isset($element->settings['type'])) {
@@ -387,7 +414,7 @@ function rules_action_entity_create_validate($element) {
 }
 
 /**
- * Custom process callback for data create action.
+ * Custom process callback for entity create action.
  */
 function rules_action_entity_create_process(RulesAbstractPlugin $element) {
   $element->settings += array('type' => NULL);
@@ -532,6 +559,54 @@ function rules_action_data_list_add_positions() {
 }
 
 /**
+ * Options list callback for data creation action.
+ */
+function rules_data_action_data_create_options() {
+  $cache = rules_get_cache();
+  $data_info = $cache['data_info'];
+  $entity_info = entity_get_info();
+  $options = array();
+  foreach ($data_info as $type => $properties) {
+    // Only add non-entities.
+    if (!isset($entity_info[$type]) && $type != 'entity') {
+      // Only add data types with input form or creation callback.
+      if ((isset($properties['ui class']) && in_array('RulesDataDirectInputFormInterface', class_implements($properties['ui class'])))
+        || isset($properties['creation callback'])
+      ) {
+        $options[$type] = $properties['label'];
+      }
+    }
+  }
+  natcasesort($options);
+  return $options;
+}
+
+/**
+ * Custom process callback for data create action.
+ */
+function rules_action_data_create_process(RulesAbstractPlugin $element) {
+  $type = $element->settings['type'];
+  $cache = rules_get_cache();
+  $type_info = $cache['data_info'][$type];
+  if (isset($type_info['ui class']) && in_array('RulesDataDirectInputFormInterface', class_implements($type_info['ui class']))) {
+    $element_info['parameter']['value'] = $type_info;
+    $element_info['parameter']['value']['type'] = $type;
+  }
+  elseif (isset($type_info['property info'])) {
+    // Add the data type's properties as parameters.
+    foreach ($type_info['property info'] as $property => $property_info) {
+      // Prefix parameter names to avoid name clashes with existing parameters.
+      $element_info['parameter']['param_' . $property] = array_intersect_key($property_info, array_flip(array('type', 'label')));
+      if (empty($property_info['required'])) {
+        $element_info['parameter']['param_' . $property]['optional'] = TRUE;
+      }
+    }
+  }
+  $element_info['provides']['data_created']['type'] = $type;
+  $element->alterInfo($element_info);
+}
+
+/**
  * Implements hook_rules_condition_info() on behalf of the pseudo data module.
  * @see rules_core_modules()
  */
diff --git rules/rules.api.php rules/rules.api.php
index fec4e85..0143087 100644
--- rules/rules.api.php
+++ rules/rules.api.php
@@ -328,6 +328,8 @@ function hook_rules_event_info() {
  *     Optional.
  *   - 'cleaning callback': An optional callback that input evaluators may use
  *     to clean inserted replacements; e.g. this is used by the token evaluator.
+ *   - 'creation callback': Optionally, a callback that creates a new instance of
+ *     this data type. See entity_metadata_create_node() for an example.
  *
  *  @see entity_metadata_wrapper()
  *  @see hook_rules_data_info_alter()
