diff --git a/payment/payment.classes.inc b/payment/payment.classes.inc
index 38cb424..a7fefbb 100644
--- a/payment/payment.classes.inc
+++ b/payment/payment.classes.inc
@@ -549,7 +549,7 @@ class PaymentMethod extends PaymentCommon {
    *
    * @var string
    */
-  public $title_generic = NULL;
+  public $title_generic = '';
 
   /**
    * The UID of the user this payment method belongs to.
@@ -567,7 +567,9 @@ class PaymentMethod extends PaymentCommon {
     parent::__construct($properties);
 
     if (is_null($this->uid)) {
-      $this->uid = $user->uid;
+      // Cast non-string scalars to their original types, because some backends
+      // store/return all variables as strings.
+      $this->uid = (int) $user->uid;
     }
   }
 
@@ -671,6 +673,9 @@ class PaymentMethodEntityController extends EntityAPIControllerExportable {
   function save($entity, DatabaseTransaction $transaction = NULL) {
     $entity->controller_class_name = $entity->controller->name;
     $return = parent::save($entity, $transaction);
+    // Cast non-string scalars to their original types, because some backends
+    // store/return all variables as strings.
+    $entity->pmid = (int) $entity->pmid;
     unset($entity->controller_class_name);
 
     return $return;
diff --git a/payment/tests/payment_test/payment_test.info b/payment/tests/payment_test/payment_test.info
index d295f06..fcbf054 100644
--- a/payment/tests/payment_test/payment_test.info
+++ b/payment/tests/payment_test/payment_test.info
@@ -8,6 +8,7 @@ package = Payment
 hidden = TRUE
 files[] = tests/PaymentTestActionHookAndCallbackWebTestCase.test
 files[] = tests/PaymentTestCallablesWebTestCase.test
+files[] = tests/PaymentTestEntityCrudWebTestCase.test
 files[] = tests/PaymentTestPaymentAmountFormElementWebTestCase.test
 files[] = tests/PaymentTestPaymentEntityPermissionWebTestCase.test
 files[] = tests/PaymentTestPaymentLineItemFormElementWebTestCase.test
diff --git a/payment/tests/payment_test/tests/PaymentTestEntityCRUDWebTestCase.test b/payment/tests/payment_test/tests/PaymentTestEntityCRUDWebTestCase.test
new file mode 100644
index 0000000..742d68e
--- /dev/null
+++ b/payment/tests/payment_test/tests/PaymentTestEntityCRUDWebTestCase.test
@@ -0,0 +1,146 @@
+<?php
+
+/**
+ * @file
+ * Contains class PaymentTestEntityCrudWebTestCase.
+ */
+
+/**
+ * Tests entity CRUD functionality.
+ */
+class PaymentTestEntityCrudWebTestCase extends PaymentWebTestCase {
+
+  static function getInfo() {
+    return array(
+      'name' => 'Entity CRUD functionality',
+      'group' => 'Payment',
+    );
+  }
+
+  function setUp(array $modules = array()) {
+    parent::setUp($modules = array('payment', 'xtools'));
+  }
+
+  /**
+   * Test payment method CRUD functionality.
+   */
+  function testPaymentMethodCRUD() {
+    $schema = drupal_get_schema('payment_method');
+
+    // Test inserting a payment method.
+    $payment_method = new PaymentMethod(array(
+      'controller' => payment_method_controller_load('PaymentMethodControllerUnavailable'),
+      'name' => 'foo',
+      'title_generic' => 'bar',
+      'title_specific' => 'baz',
+    ));
+    entity_save('payment_method', $payment_method);
+    $query = db_select('payment_method');
+    foreach (array_keys($schema['fields']) as $field) {
+      if (property_exists($payment_method, $field)) {
+        $query->condition($field, $payment_method->$field);
+      }
+    }
+    $count = $query->countQuery()->execute()->fetchField();
+    $this->assertTrue($count, 'A new payment method is correctly inserted.');
+
+    // Test loading a payment method.
+    $payment_method_loaded = entity_load_single('payment_method', $payment_method->pmid);
+    $blueprint = xtools_blueprint_info('PaymentMethod');
+    $asserts = array();
+    $blueprint->validate($payment_method_loaded, $asserts, '$payment_method');
+    foreach ($asserts as $assert) {
+      $this->assert($assert->valid, $assert->message, 'Other', $assert->caller);
+    }
+
+    // Test updating a payment method.
+    $payment_method->controller = payment_method_controller_load('PaymentMethodControllerUnavailable');
+    $payment_method->name = 'bar';
+    $payment_method->title_generic = 'baz';
+    $payment_method->title_specific = 'foo';
+    entity_save('payment_method', $payment_method);
+    $query = db_select('payment_method');
+    foreach (array_keys($schema['fields']) as $field) {
+      if (property_exists($payment_method, $field)) {
+        $query->condition($field, $payment_method->$field);
+      }
+    }
+    $count = $query->countQuery()->execute()->fetchField();
+    $this->assertTrue($count, 'A payment method is correctly updated.');
+
+    // Test deleting a payment method.
+    entity_delete('payment_method', $payment_method->pmid);
+    $count = db_select('payment_method')
+      ->condition('pmid', $payment_method->pmid)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertFalse($count, 'A payment method is correctly deleted.');
+  }
+
+  /**
+   * Test payment CRUD functionality.
+   */
+  function testPaymentCRUD() {
+    $schema = drupal_get_schema('payment');
+    $payment_method = $this->paymentMethodCreate(1, payment_method_controller_load('PaymentMethodControllerUnavailable'));
+    entity_save('payment_method', $payment_method);
+
+    // Test inserting a payment.
+    $payment = new Payment(array(
+      'method' => $payment_method,
+      'currency_code' => 'foo',
+      'description' => 'bar',
+    ));
+    entity_save('payment', $payment);
+    $query = db_select('payment');
+    foreach ($schema['fields'] as $name => $definition) {
+      if (property_exists($payment, $name)) {
+        if (!empty($definition['serialize'])) {
+          $query->condition($name, serialize($payment->$name));
+        }
+        else {
+          $query->condition($name, $payment->$name);
+        }
+      }
+    }
+    $count = $query->countQuery()->execute()->fetchField();
+    $this->assertTrue($count, 'A new payment is correctly inserted.');
+
+    // Test loading a payment.
+    $payment_loaded = entity_load_single('payment', $payment->pid);
+    $blueprint = xtools_blueprint_info('Payment');
+    $asserts = array();
+    $blueprint->validate($payment_loaded, $asserts, '$payment');
+    foreach ($asserts as $assert) {
+      $this->assert($assert->valid, $assert->message, 'Other', $assert->caller);
+    }
+
+    // Test updating a payment.
+    $payment->currency_code = 'bar';
+    $payment->description = 'foo';
+    entity_save('payment', $payment);
+    $query = db_select('payment');
+    foreach ($schema['fields'] as $name => $definition) {
+      if (property_exists($payment, $name)) {
+        if (!empty($definition['serialize'])) {
+          $query->condition($name, serialize($payment->$name));
+        }
+        else {
+          $query->condition($name, $payment->$name);
+        }
+      }
+    }
+    $count = $query->countQuery()->execute()->fetchField();
+    $this->assertTrue($count, 'A payment is correctly updated.');
+
+    // Test deleting a payment.
+    entity_delete('payment', $payment->pid);
+    $count = db_select('payment')
+      ->condition('pid', $payment->pid)
+      ->countQuery()
+      ->execute()
+      ->fetchField();
+    $this->assertFalse($count, 'A payment is correctly deleted.');
+  }
+}
