diff --git a/modules/data.eval.inc b/modules/data.eval.inc
index 8493b0d..2097ae5 100644
--- a/modules/data.eval.inc
+++ b/modules/data.eval.inc
@@ -176,6 +176,65 @@ function rules_action_variable_add_info_alter(&$element_info, RulesAbstractPlugi
 }
 
 /**
+ * Action: Convert a value.
+ */
+function rules_action_data_convert($arguments, RulesPlugin $element, $state) {
+
+  $value_info = $element->getArgumentInfo('value');
+  $from_type = $value_info['type'];
+  $target_type = $arguments['type'];
+
+  // First apply the rounding behavior if given.
+  if (isset($arguments['rounding_behavior'])) {
+    $arguments['value'] = round($arguments['value'], 0, $arguments['rounding_behavior']);
+  }
+
+  switch ($target_type) {
+    case 'decimal':
+      $result = floatval($arguments['value']);
+      break;
+    case 'integer':
+      $result = intval($arguments['value']);
+      break;
+    case 'text':
+      $result = strval($arguments['value']);
+      break;
+  }
+
+  return array('conversion_result' => $result);
+}
+
+/**
+ * Info alteration callback for variable add action.
+ */
+function rules_action_data_convert_info_alter(&$element_info, RulesAbstractPlugin $element) {
+
+  if (isset($element->settings['type']) && $type = $element->settings['type']) {
+    $element_info['provides']['conversion_result']['type'] = $type;
+
+    if ($type != 'integer') {
+      // Only support the rounding behavior option for integers.
+      unset($element_info['parameter']['rounding_behavior']);
+    }
+
+    // Configure compatible source-types:
+    switch ($type) {
+      case 'integer':
+        $sources = array('decimal', 'text', 'token', 'uri', 'date', 'duration', 'boolean');
+        break;
+      case 'decimal':
+        $sources = array('integer', 'text', 'token', 'uri', 'date', 'duration', 'boolean');
+        break;
+      case 'text':
+        $sources = array('integer', 'decimal', 'token', 'uri', 'date', 'duration', 'boolean');
+        break;
+    }
+    // @todo: Show the valid data type somewhere, e.g. in the description.
+    $element_info['parameter']['value']['type'] = $sources;
+  }
+}
+
+/**
  * Action: Create data.
  */
 function rules_action_data_create($args, $element) {
diff --git a/modules/data.rules.inc b/modules/data.rules.inc
index 7241e83..02e91c1 100644
--- a/modules/data.rules.inc
+++ b/modules/data.rules.inc
@@ -192,10 +192,72 @@ function rules_data_action_info() {
       ),
     );
   }
+  $return['data_convert'] = array(
+    'label' => t('Convert data type'),
+    'parameter' => array(
+      'type' => array(
+        'type' => 'token',
+        'label' => t('Target type'),
+        'description' => t('The data type to convert a value to.'),
+        'options list' => 'rules_action_data_convert_types_options',
+        'restriction' => 'input',
+      ),
+      'value' => array(
+        'type' => array('decimal', 'integer', 'text'),
+        'label' => t('Value to convert'),
+        'default mode' => 'selector',
+      ),
+      // For to-integer conversion only.
+      'rounding_behavior' => array(
+        'type' => 'token',
+        'label' => t('Rounding behavior'),
+        'description' => t('The rounding behavior the conversion should use.'),
+        'options list' => 'rules_action_data_convert_rounding_behavior_options',
+        'restriction' => 'input',
+        'default value' => PHP_ROUND_HALF_DOWN,
+        'optional' => TRUE,
+      ),
+    ),
+    'provides' => array(
+      'conversion_result' => array(
+        'type' => 'unknown',
+        'label' => t('Conversion result'),
+      ),
+    ),
+    'group' => t('Data'),
+    'base' => 'rules_action_data_convert',
+    'named parameter' => TRUE,
+    'callbacks' => array(
+      'form_alter' => 'rules_action_type_form_alter',
+    ),
+  );
   return $return;
 }
 
 /**
+ * Data conversation action: Options list callback for the target type.
+ */
+function rules_action_data_convert_types_options(RulesPlugin $element, $param_name) {
+  return array(
+    'decimal' => t('Decimal'),
+    'integer' => t('Integer'),
+    'text' => t('Text'),
+  );
+}
+
+/**
+ * Data conversation action: Options list callback for rounding behavior.
+ */
+function rules_action_data_convert_rounding_behavior_options(RulesPlugin $element, $param_name) {
+  return array(
+    PHP_ROUND_HALF_UP => t('Round half up (9.5 -> 10)'),
+    PHP_ROUND_HALF_DOWN => t('Round half down (9.5 -> 9)'),
+    PHP_ROUND_HALF_EVEN => t('Round half even (9.5 -> 10)'),
+    PHP_ROUND_HALF_ODD => t('Round half odd (9.5 -> 9)'),
+  );
+}
+
+/**
  * Customize access check for data set action.
  */
 function rules_action_data_set_access(RulesAbstractPlugin $element) {
