diff --git rules/includes/rules.core.inc rules/includes/rules.core.inc
index cf4e232..98a9bd8 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..bc0ac23 100644
--- rules/modules/data.eval.inc
+++ rules/modules/data.eval.inc
@@ -111,6 +111,42 @@ function rules_action_data_list_remove($list, $item) {
 }
 
 /**
+ * Action: Add variable.
+ */
+function rules_action_variable_add($args, $element) {
+  return array('variable_added' => $args['value']);
+}
+
+/**
+ * Action: Create data.
+ */
+function rules_action_data_create($args, $element) {
+  $type = $args['settings']['type'];
+  $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'][$type];
+  if (isset($type_info['creation callback'])) {
+    $data = $type_info['creation callback']($values, $type);
+    return array('data_created' => $data);
+  }
+  else {
+    throw new RulesException('Unable to create @data, no creation callback found.', array('@data' => $type));
+  }
+}
+
+/**
+ * Creation callback for array structured data.
+ */
+function rules_action_data_create_array($values = array(), $type) {
+  // $values is an array already, so we can just pass it to the wrapper.
+  return rules_wrap_data($values, array('type' => $type));
+}
+
+/**
  * 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..be4aa94 100644
--- rules/modules/data.rules.inc
+++ rules/modules/data.rules.inc
@@ -61,7 +61,7 @@ function rules_data_action_info() {
       'base' => 'rules_action_entity_fetch',
       'callbacks' => array(
         'access' => 'rules_action_entity_createfetch_access',
-        'form_alter' => 'rules_action_entity_type_form_alter',
+        'form_alter' => 'rules_action_type_form_alter',
       ),
     );
     $return['entity_query'] = array(
@@ -100,7 +100,7 @@ function rules_data_action_info() {
       'access callback' => 'rules_data_action_access',
       'base' => 'rules_action_entity_query',
       'callbacks' => array(
-        'form_alter' => 'rules_action_entity_type_form_alter',
+        'form_alter' => 'rules_action_type_form_alter',
       ),
     );
   }
@@ -131,7 +131,8 @@ function rules_data_action_info() {
       'base' => 'rules_action_entity_create',
       'callbacks' => array(
         'access' => 'rules_action_entity_createfetch_access',
-        'form_alter' => 'rules_action_entity_type_form_alter',
+        'form_alter' => 'rules_action_type_form_alter',
+        'validate' => 'rules_action_create_type_validate',
       ),
     );
   }
@@ -232,6 +233,64 @@ function rules_data_action_info() {
       'validate' => 'rules_data_validate_list_item_type',
     ),
   );
+  $return['variable_add'] = array(
+    'label' => t('Add a variable'),
+    'named parameter' => TRUE,
+    'parameter' => array(
+      'type' => array(
+        'type' => 'text',
+        'label' => t('Type'),
+        'options list' => 'rules_data_action_variable_add_options',
+        'description' => t('Specifies the type of the variable that should be added.'),
+        'restriction' => 'input',
+      ),
+      'value' => array(
+        'type' => 'unknown',
+        'label' => t('Value'),
+      ),
+    ),
+    'provides' => array(
+      'variable_added' => array(
+        'type' => 'unknown',
+        'label' => t('Added variable'),
+      ),
+    ),
+    'group' => t('Data'),
+    'base' => 'rules_action_variable_add',
+    'callbacks' => array(
+      'form_alter' => 'rules_action_type_form_alter',
+      'validate' => 'rules_action_create_type_validate',
+    ),
+  );
+
+  if (rules_data_action_data_create_options()) {
+    $return['data_create'] = array(
+      'label' => t('Create a data structure'),
+      '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 structure 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_type_form_alter',
+        'validate' => 'rules_action_create_type_validate',
+      ),
+    );
+  }
   return $return;
 }
 
@@ -378,16 +437,17 @@ function rules_action_entity_query_process(RulesAbstractPlugin $element) {
 }
 
 /**
- * Custom validate callback for data create action.
+ * Custom validate callback for entity create, add variable and data create
+ * action.
  */
-function rules_action_entity_create_validate($element) {
+function rules_action_create_type_validate($element) {
   if (!isset($element->settings['type'])) {
     throw new RulesException('Invalid type specified.', array(), array($element, 'parameter', 'type'));
   }
 }
 
 /**
- * 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);
@@ -422,9 +482,9 @@ function rules_action_entity_parameter_options_list(RulesPlugin $element, $param
 }
 
 /**
- * Form alter callback for actions relying on the entity type.
+ * Form alter callback for actions relying on the entity type or the data type.
  */
-function rules_action_entity_type_form_alter(&$form, &$form_state, $options, RulesAbstractPlugin $element) {
+function rules_action_type_form_alter(&$form, &$form_state, $options, RulesAbstractPlugin $element) {
   $first_step = empty($element->settings['type']);
   $form['reload'] = array(
     '#weight' => 5,
@@ -432,7 +492,7 @@ function rules_action_entity_type_form_alter(&$form, &$form_state, $options, Rul
     '#name' => 'reload',
     '#value' => $first_step ? t('Continue') : t('Reload form'),
     '#limit_validation_errors' => array('parameter', 'type'),
-    '#submit' => array('rules_action_entity_type_form_submit_rebuild'),
+    '#submit' => array('rules_action_type_form_submit_rebuild'),
     '#ajax' => rules_ui_form_default_ajax(),
   );
   // Use ajax and trigger as the reload button.
@@ -461,9 +521,9 @@ function rules_action_entity_type_form_alter(&$form, &$form_state, $options, Rul
 }
 
 /**
- * FAPI submit callback for reloading the entity type form.
+ * FAPI submit callback for reloading the type form for entities or data types.
  */
-function rules_action_entity_type_form_submit_rebuild($form, &$form_state) {
+function rules_action_type_form_submit_rebuild($form, &$form_state) {
   rules_form_submit_rebuild($form, $form_state);
   // Clear the parameter modes for the parameters, so they get the proper
   // default values based upon the data types on rebuild.
@@ -532,6 +592,71 @@ function rules_action_data_list_add_positions() {
 }
 
 /**
+ * Options list callback for variable add action.
+ */
+function rules_data_action_variable_add_options() {
+  $cache = rules_get_cache();
+  $data_info = $cache['data_info'];
+  $options = rules_extract_property($data_info, 'label');
+  natcasesort($options);
+  return $options;
+}
+
+/**
+ * Custom process callback for variable add action.
+ */
+function rules_action_variable_add_process(RulesAbstractPlugin $element) {
+  $type = $element->settings['type'];
+  $cache = rules_get_cache();
+  $type_info = $cache['data_info'][$type];
+  $element_info['parameter']['value']['type'] = $type;
+  $element_info['parameter']['value']['label'] = $type_info['label'];
+  $element_info['provides']['variable_added']['type'] = $type;
+  $element->alterInfo($element_info);
+}
+
+/**
+ * Options list callback for data create action.
+ */
+function rules_data_action_data_create_options() {
+  $cache = rules_get_cache();
+  $data_info = $cache['data_info'];
+  $entity_info = entity_get_info();
+  // Remove entities.
+  $data_info = array_diff_key($data_info, $entity_info);
+  $options = array();
+  foreach ($data_info as $type => $properties) {
+    if (isset($properties['creation callback'])) {
+      // Add data types with creation callback only.
+      $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['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..d66f4ee 100644
--- rules/rules.api.php
+++ rules/rules.api.php
@@ -317,6 +317,11 @@ function hook_rules_event_info() {
  *     info about the data properties, such that data selectors via an entity
  *     metadata wrapper are supported. Specify an array as expected by
  *     entity_metadata_wrapper(). Optionally.
+ *   - 'creation callback': If 'property info' is given, an optional callback
+ *     that makes use of the property info to create a new instance of this
+ *     data type. Entities should use hook_entity_info() to specify
+ *     'creation callback' instead, as introduced by the entity metadata
+ *     module. See rules_action_data_create_array() for an example.
  *   - 'property defaults': May be used for non-entity data structures to
  *     to provide property info defaults for the data properties. Specify an
  *     array as expected by entity_metadata_wrapper(). Optionally.
diff --git rules/tests/rules.test rules/tests/rules.test
index deaa11a..22ffbe1 100644
--- rules/tests/rules.test
+++ rules/tests/rules.test
@@ -941,6 +941,44 @@ class RulesIntegrationTestCase extends DrupalWebTestCase {
     //debug(RulesLog::logger()->render());
   }
 
+  /**
+   * Test the data create action.
+   */
+  function testCreateData() {
+    $action = rules_action('data_create', array(
+      'type' => 'log_entry',
+      'param_type' => 'rules_test',
+      'param_message' => 'Rules test log message',
+      'param_severity' => WATCHDOG_WARNING,
+      'param_request_uri' => 'http://example.com',
+      'param_link' => '',
+    ));
+    $action->access();
+    $action->execute();
+    $text = RulesLog::logger()->render();
+    $pos = strpos($text, RulesTestCase::t('Added the provided variable %data_created of type %log_entry', array('data_created', 'log_entry')));
+    $this->assertTrue($pos !== FALSE, 'Data of type log entry has been created.');
+  }
+
+/**
+   * Test the variable add action.
+   */
+  function testVariableAdd() {
+    // Test creation.
+    $action = rules_action('variable_add', array(
+      'type' => 'text_formatted',
+      'value' => array(
+        'value' => 'test text',
+        'format' => 1,
+      )
+    ));
+    $action->access();
+    $action->execute();
+    $text = RulesLog::logger()->render();
+    $pos = strpos($text, RulesTestCase::t('Added the provided variable %variable_added of type %text_formatted', array('variable_added', 'text_formatted')));
+    $this->assertTrue($pos !== FALSE, 'Data of type text formatted has been created.');
+  }
+
   function testDataQueryAction() {
     $node = $this->drupalCreateNode(array('type' => 'page', 'title' => 'foo'));
     $rule = rule();
diff --git rules/tests/rules_test.rules.inc rules/tests/rules_test.rules.inc
index 4e42232..4cda919 100644
--- rules/tests/rules_test.rules.inc
+++ rules/tests/rules_test.rules.inc
@@ -148,3 +148,10 @@ function rules_test_rules_action_info() {
     ),
   );
 }
+
+/**
+ * Implements hook_rules_data_info_alter().
+ */
+function rules_test_rules_data_info_alter(&$data_info) {
+  $data_info['log_entry']['creation callback'] = 'rules_action_data_create_array';
+}
