diff --git a/plugins/services_entity_resource.inc b/plugins/services_entity_resource.inc
index 5869cd9..79a901b 100644
--- a/plugins/services_entity_resource.inc
+++ b/plugins/services_entity_resource.inc
@@ -14,9 +14,16 @@ class ServicesEntityResourceController implements ServicesResourceControllerInte
       return TRUE;
     }
     if ($op == 'create') {
-      list($entity_type) = $args;
-      // Pass the entity to the access control.
-      return entity_access($op, $entity_type);
+      list($entity_type, $data) = $args;
+      // Workaround for bug in Entity API node access.
+      // @todo remove once https://drupal.org/node/1780646 lands.
+      if ($entity_type === 'node') {
+        return isset($data['type']) ? node_access('create', $data['type']) : FALSE;
+      }
+      // Create an entity from the data and pass this to entity_access. This
+      // allows us to check per-bundle creation rights (e.g. in node_access).
+      $entity = entity_create($entity_type, $data);
+      return entity_access($op, $entity_type, $entity);
     }
     else {
       // Retrieve, Delete, Update.
diff --git a/plugins/services_entity_resource_clean.inc b/plugins/services_entity_resource_clean.inc
index 215271b..46b0a53 100644
--- a/plugins/services_entity_resource_clean.inc
+++ b/plugins/services_entity_resource_clean.inc
@@ -11,16 +11,28 @@
  * Much of this code is borrowed from restws module.
  */
 class ServicesEntityResourceControllerClean extends ServicesEntityResourceController {
-
-  public function create($entity_type, array $values) {
-    $property_info = entity_get_all_property_info($entity_type);
-    $values = $this->transform_values($entity_type, $property_info, $values);
-    try {
-      $wrapper = entity_property_values_create_entity($entity_type, $values);
+  /**
+   * @see ServicesEntityResourceController::access()
+   */
+  public function access($op, $args) {
+    if ($op == 'create') {
+      list($entity_type, $data) = $args;
+      // Workaround for bug in Entity API node access.
+      // @todo remove once https://drupal.org/node/1780646 lands.
+      if ($entity_type == 'node') {
+        return isset($data['type']) ? node_access('create', $data['type']) : FALSE;
+      }
+      // Create a wrapper from the entity so we can call its access() method.
+      $wrapper = $this->createWrapperFromValues($entity_type, $data);
+      return $wrapper->entityAccess('create');
     }
-    catch (EntityMetadataWrapperException $e) {
-      services_error($e->getMessage(), 406);
+    else {
+      return parent::access($op, $args);
     }
+  }
+
+  public function create($entity_type, array $values) {
+    $wrapper = $this->createWrapperFromValues($entity_type, $values);
 
     // Make sure that bundle information is present on entities that have
     // bundles. We have to do this after creating the wrapper, because the
@@ -223,4 +235,28 @@ class ServicesEntityResourceControllerClean extends ServicesEntityResourceContro
     }
     return $values;
   }
-}
\ No newline at end of file
+
+  /**
+   * Helper function to create a wrapped entity from provided data values.
+   *
+   * @param $entity_type
+   *   The type of entity to be created.
+   * @param $values
+   *   Array of data property values.
+   * @return EntityDrupalWrapper
+   *   The wrapped entity.
+   * @todo the created wrapper should probably be statically cached, so we
+   * don't have to build it twice (first on access() and again on create()).
+   */
+  protected function createWrapperFromValues($entity_type, array &$values) {
+    $property_info = entity_get_all_property_info($entity_type);
+    $values = $this->transform_values($entity_type, $property_info, $values);
+    try {
+      $wrapper = entity_property_values_create_entity($entity_type, $values);
+    }
+    catch (EntityMetadataWrapperException $e) {
+      services_error($e->getMessage(), 406);
+    }
+    return $wrapper;
+  }
+}
diff --git a/tests/services_entity.test b/tests/services_entity.test
index 5dc8fe7..9d92295 100644
--- a/tests/services_entity.test
+++ b/tests/services_entity.test
@@ -440,7 +440,7 @@ class ServicesEntityNodeResourceTest extends ServicesEntityTestHelper {
 
     // Test format access.
     // @todo restore this when https://drupal.org/node/2059845 lands.
-    $account = $this->drupalCreateUser(array('bypass node access'));
+    $account = $this->drupalCreateUser(array('create page content', 'edit any page content', 'delete any page content'));
     // $this->serviceLogin($account->name, $account->pass_raw);
     // $this->create($resource, $node, 403);
     // $this->serviceLogout();
@@ -460,25 +460,7 @@ class ServicesEntityNodeResourceTest extends ServicesEntityTestHelper {
 
     // We cannot create a node with the clean controller because of [issue link]
     // @todo remove this conditional once that lands.
-    if ($clean) {
-      $temp_node = $this->drupalCreateNode(array(
-        'type' => $node['type'],
-        'title' => $node['title'],
-        'body' => array(
-          'und' => array(
-            '0' => array(
-              'value' => $node['body']['value'],
-              'format' => $node['body']['format'],
-              'summary' => $node['body']['summary'],
-            ),
-          )
-        )
-      ));
-      $created_node = $this->retrieve($resource, $temp_node->nid);
-    }
-    else {
-      $created_node = $this->create($resource, $node);
-    }
+    $created_node = $this->create($resource, $node);
     $this->assertTrue($created_node['nid'], t('node create response has a node id'));
     $nid = $created_node['nid'];
 
