diff --git a/commerce.api.php b/commerce.api.php
index c73bb96..db9eeee 100644
--- a/commerce.api.php
+++ b/commerce.api.php
@@ -75,7 +75,7 @@ function hook_commerce_currency_info() {
 }
 
 /**
- * Alter commerce currencies.
+ * Allows modules to alter Commerce currency definitions.
  *
  * By default Commerce provides all active currencies according to ISO 4217.
  * This hook allows you to change the formatting properties of existing
@@ -91,3 +91,21 @@ function hook_commerce_currency_info() {
 function hook_commerce_currency_info_alter(&$currencies, $langcode) {
   $currencies['CHF']['code_placement'] = 'after';
 }
+
+/**
+ * Allows modules to alter newly created Commerce entities.
+ *
+ * Commerce's default entity controller, DrupalCommerceEntityController, invokes
+ * this hook after creating a new entity object using either a class specified
+ * by the entity type info or a stdClass. Using this hook, you can alter the
+ * entity before it is returned to any of our entity "new" API functions such
+ * as commerce_product_new().
+ *
+ * @param $entity_type
+ *   The machine-name type of the entity.
+ * @param $entity
+ *   The entity object that was just created.
+ */
+function hook_commerce_entity_create_alter($entity_type, $entity) {
+  // No example.
+}
diff --git a/includes/commerce.controller.inc b/includes/commerce.controller.inc
index d05ac63..e96be51 100644
--- a/includes/commerce.controller.inc
+++ b/includes/commerce.controller.inc
@@ -225,10 +225,20 @@ class DrupalCommerceEntityController extends DrupalDefaultEntityController imple
   public function create(array $values = array()) {
     // Add is_new property if it is not set.
     $values += array('is_new' => TRUE);
+
+    // If there is a class for this entity type, instantiate it now.
     if (isset($this->entityInfo['entity class']) && $class = $this->entityInfo['entity class']) {
-      return new $class($values, $this->entityType);
+      $entity = new $class($values, $this->entityType);
+    }
+    else {
+      // Otherwise use a good old stdClass.
+      $entity = (object) $values;
     }
-    return (object) $values;
+
+    // Allow other modules to alter the created entity.
+    drupal_alter('commerce_entity_create', $this->entityType, $entity);
+
+    return $entity;
   }
 
   /**
diff --git a/modules/customer/includes/commerce_customer_profile.controller.inc b/modules/customer/includes/commerce_customer_profile.controller.inc
index 7c9ca48..88fc6eb 100644
--- a/modules/customer/includes/commerce_customer_profile.controller.inc
+++ b/modules/customer/includes/commerce_customer_profile.controller.inc
@@ -21,7 +21,7 @@ class CommerceCustomerProfileEntityController extends DrupalCommerceEntityContro
    *   A customer profile object with all default fields initialized.
    */
   public function create(array $values = array()) {
-    return (object) ($values + array(
+    $values += array(
       'profile_id' => '',
       'revision_id' => '',
       'type' => '',
@@ -29,7 +29,9 @@ class CommerceCustomerProfileEntityController extends DrupalCommerceEntityContro
       'status' => 1,
       'created' => '',
       'changed' => '',
-    ));
+    );
+
+    return parent::create($values);
   }
 
   /**
diff --git a/modules/line_item/includes/commerce_line_item.controller.inc b/modules/line_item/includes/commerce_line_item.controller.inc
index e868212..99e6a79 100644
--- a/modules/line_item/includes/commerce_line_item.controller.inc
+++ b/modules/line_item/includes/commerce_line_item.controller.inc
@@ -21,7 +21,7 @@ class CommerceLineItemEntityController extends DrupalCommerceEntityController {
    *   A line item object with all default fields initialized.
    */
   public function create(array $values = array()) {
-    return (object) ($values + array(
+    $values += array(
       'line_item_id' => '',
       'order_id' => 0,
       'type' => '',
@@ -30,7 +30,9 @@ class CommerceLineItemEntityController extends DrupalCommerceEntityController {
       'created' => '',
       'changed' => '',
       'data' => array(),
-    ));
+    );
+
+    return parent::create($values);
   }
 
   /**
diff --git a/modules/order/includes/commerce_order.controller.inc b/modules/order/includes/commerce_order.controller.inc
index 0935820..d1cec78 100644
--- a/modules/order/includes/commerce_order.controller.inc
+++ b/modules/order/includes/commerce_order.controller.inc
@@ -21,7 +21,7 @@ class CommerceOrderEntityController extends DrupalCommerceEntityController {
    *   An order object with all default fields initialized.
    */
   public function create(array $values = array()) {
-    return (object) ($values + array(
+    $values += array(
       'order_id' => '',
       'order_number' => '',
       'revision_id' => '',
@@ -31,7 +31,9 @@ class CommerceOrderEntityController extends DrupalCommerceEntityController {
       'created' => '',
       'changed' => '',
       'hostname' => '',
-    ));
+    );
+
+    return parent::create($values);
   }
 
   /**
diff --git a/modules/payment/includes/commerce_payment_transaction.controller.inc b/modules/payment/includes/commerce_payment_transaction.controller.inc
index 543d216..762958f 100644
--- a/modules/payment/includes/commerce_payment_transaction.controller.inc
+++ b/modules/payment/includes/commerce_payment_transaction.controller.inc
@@ -24,7 +24,7 @@ class CommercePaymentTransactionEntityController extends DrupalCommerceEntityCon
   public function create(array $values = array()) {
     global $user;
 
-    return (object) ($values + array(
+    $values += array(
       'transaction_id' => '',
       'revision_id' => '',
       'uid' => $user->uid,
@@ -41,7 +41,9 @@ class CommercePaymentTransactionEntityController extends DrupalCommerceEntityCon
       'payload' => array(),
       'created' => '',
       'changed' => '',
-    ));
+    );
+
+    return parent::create($values);
   }
 
   /**
diff --git a/modules/product/includes/commerce_product.controller.inc b/modules/product/includes/commerce_product.controller.inc
index 87b2cf2..6de7f8e 100644
--- a/modules/product/includes/commerce_product.controller.inc
+++ b/modules/product/includes/commerce_product.controller.inc
@@ -22,7 +22,7 @@ class CommerceProductEntityController extends DrupalCommerceEntityController {
    *   A product object with all default fields initialized.
    */
   public function create(array $values = array()) {
-    return (object) ($values + array(
+    $values += array(
       'product_id' => '',
       'is_new' => TRUE,
       'sku' => '',
@@ -31,7 +31,9 @@ class CommerceProductEntityController extends DrupalCommerceEntityController {
       'status' => 1,
       'created' => '',
       'changed' => '',
-    ));
+    );
+
+    return parent::create($values);
   }
 
   /**
