diff --git a/resources/node_resource.inc b/resources/node_resource.inc
index e939dc0..0f37302 100644
--- a/resources/node_resource.inc
+++ b/resources/node_resource.inc
@@ -349,35 +349,40 @@ function _node_resource_update($nid, $node) {
   // Adds backwards compatability with regression fixed in #1083242
   $node = _services_arg_value($node, 'node');
 
-  // Validate the node. If there is validation error Exception will be thrown
-  // so code below won't be executed.
-  _node_resource_validate_type($node);
-
   $node['nid'] = $nid;
 
   $old_node = node_load($nid);
-  if ($old_node->nid) {
+  if (empty($old_node->nid)) {
+    return services_error(t('Node @nid not found', array('@nid' => $old_node->nid)), 404);
+  }
+  // If no type is provided use the existing node type.
+  if (empty($node['type'])) {
+    $node['type'] = $old_node->type;
+  }
+  elseif ($node['type'] != $old_node->type) {
     // Node types cannot be changed once they are created.
-    if (isset($node['type']) && $node['type'] != $old_node->type) {
-      return services_error(t('Node type cannot be changed'), 406);
-    }
+    return services_error(t('Node type cannot be changed'), 406);
+  }
 
-    // Load the required includes for drupal_execute
-    module_load_include('inc', 'node', 'node.pages');
+  // Validate the node. If there is validation error Exception will be thrown
+  // so code below won't be executed.
+  _node_resource_validate_type($node);
 
-    $node_type = $node['type'];
+  // Load the required includes for drupal_execute
+  module_load_include('inc', 'node', 'node.pages');
 
-    // Setup form_state.
-    $form_state = array();
-    $form_state['values'] = $node;
-    $form_state['values']['op'] = variable_get('services_node_save_button_' . $node_type . '_resource_update', t('Save'));
-    $form_state['node'] = (array)$old_node;
+  $node_type = $node['type'];
+  node_object_prepare($old_node);
 
-    drupal_execute($node_type . '_node_form', $form_state, $old_node);
+  // Setup form_state.
+  $form_state = array();
+  $form_state['values'] = $node;
+  $form_state['values']['op'] = variable_get('services_node_save_button_' . $node_type . '_resource_update', t('Save'));
+  $form_state['node'] = $old_node;
+  drupal_form_submit($node_type . '_node_form', $form_state, $old_node);
 
-    if ($errors = form_get_errors()) {
-      return services_error(implode(" ", $errors), 406, array('form_errors' => $errors));
-    }
+  if ($errors = form_get_errors()) {
+     return services_error(implode(" ", $errors), 406, array('form_errors' => $errors));
   }
   else {
     return services_error(t('Node not found'), 404);
diff --git a/tests/functional/ServicesResourceNodeTests.test b/tests/functional/ServicesResourceNodeTests.test
index 19e744e..0484ec5 100644
--- a/tests/functional/ServicesResourceNodeTests.test
+++ b/tests/functional/ServicesResourceNodeTests.test
@@ -8,6 +8,10 @@
 
 require_once('ServicesWebTestCase.php') ;
 
+define("SERVICES_NODE_TYPE_INCLUDE", 1);
+define("SERVICES_NODE_TYPE_EMPTY", 2);
+define("SERVICES_NODE_TYPE_REMOVED", 3);
+
 /**
  * Run test cases for the endpoint with no authentication turned on.
  *
@@ -378,15 +382,12 @@ class ServicesResourceNodetests extends ServicesWebtestCase {
   }
 
   /**
-   * Testing node_resource Update
-   */
-  public function testEndpointResourceNodeUpdate() {
-    // Create and log in our privileged user.
-    $this->privilegedUser = $this->drupalCreateUser(array(
-      'administer services',
-      'administer nodes',
-    ));
-    $this->drupalLogin($this->privilegedUser);
+    *  Helper function to perform node updates.
+    *
+    *  @parm $exclude_type
+    *    Integer how should the type value be treated.
+    */
+  function update_node($exclude_type) {
     $node = $this->drupalCreateNode();
     $node_update = array(
       'title' => 'testing',
@@ -395,20 +396,34 @@ class ServicesResourceNodetests extends ServicesWebtestCase {
       'name' => $this->privilegedUser->name,
     );
 
+    if ($exclude_type == SERVICES_NODE_TYPE_EMPTY) {
+      $node_update['type'] = '';
+    }
+    elseif($exclude_type == SERVICES_NODE_TYPE_REMOVED) {
+      unset($node_update['type']);
+    }
+
     $responseArray = $this->servicesPut($this->endpoint->path . '/node/' . $node->nid, $node_update);
     $nodeAfterUpdate = node_load($responseArray['body']['nid']);
     $this->assertTrue(isset($nodeAfterUpdate->nid), t('Node was successfully updated'), 'NodeResource: Updated');
-    if (isset($nodeAfterUpdate->nid)) {
-      $this->assertTrue($nodeAfterUpdate->title == $node_update['title'], t('Title was the same'), 'NodeResource: Update');
-      $this->assertTrue($nodeAfterUpdate->body == $node_update['body'], t('Body was the same'), 'NodeResource: Update');
-    }
+    $this->assertTrue($nodeAfterUpdate->title == $node_update['title'], t('Title was the same'), 'NodeResource: Update');
+    $this->assertTrue($nodeAfterUpdate->body == $node_update['body'], t('Body was the same'), 'NodeResource: Update');
+  }
+
+  /**
+   * Testing node_resource Update
+   */
+  public function testEndpointResourceNodeUpdate() {
+    // Create and log in our privileged user.
+    $this->privilegedUser = $this->drupalCreateUser(array(
+      'administer services',
+      'administer nodes',
+    ));
+    $this->drupalLogin($this->privilegedUser);
 
-    // Try to update the node without node type.
-    $node_update_no_type = $node_update;
-    unset($node_update_no_type['type']);
-    $node_update_no_type['title'] = $this->randomName();
-    $responseArray = $this->servicesPut($this->endpoint->path . '/node/' . $node->nid, $node_update_no_type);
-    $this->assertNotEqual($responseArray['code'], 200, t('Can\'t update node without specifying node type'), 'NodeResource: Update');
+    $this->update_node(SERVICES_NODE_TYPE_INCLUDE);
+    $this->update_node(SERVICES_NODE_TYPE_EMPTY);
+    $this->update_node(SERVICES_NODE_TYPE_REMOVED);
   }
 
   /**
