diff --git a/modules/facebook/social_content_facebook.class.inc b/modules/facebook/social_content_facebook.class.inc
index 8c22076..e25c294 100644
--- a/modules/facebook/social_content_facebook.class.inc
+++ b/modules/facebook/social_content_facebook.class.inc
@@ -211,8 +211,9 @@ class SocialContentFacebook extends SocialContent {
     $row->created = strtotime($row->created_time);
     $row->account = $row->from->name;
     $row->account_link = 'http://www.facebook.com/' . $row->from->id;
-    if (parent::prepareRow($row) === FALSE) {
-      return FALSE;
+    $internal_id = parent::prepareRow($row);
+    if ($internal_id === FALSE) {
+      return -1;
     }
     if (!empty($row->full_picture)) {
       $validators = array();
@@ -233,7 +234,7 @@ class SocialContentFacebook extends SocialContent {
     // See https://www.drupal.org/node/2559873
     $row->picture = !empty($picture) ? $picture : NULL;
 
-    return TRUE;
+    return $internal_id;
   }
 
   /**
diff --git a/modules/instagram/social_content_instagram.class.inc b/modules/instagram/social_content_instagram.class.inc
index b892f44..974c552 100644
--- a/modules/instagram/social_content_instagram.class.inc
+++ b/modules/instagram/social_content_instagram.class.inc
@@ -383,8 +383,9 @@ class SocialContentInstagram extends SocialContent {
     $row->user_link = 'http://instagram.com/' . $row->user_name;
 
     $row->caption = isset($row->caption) ? $row->caption->text : '';
-    if (parent::prepareRow($row) === FALSE) {
-      return FALSE;
+    $internal_id = parent::prepareRow($row);
+    if ($internal_id === FALSE) {
+      return -1;
     }
 
     // Save the picture if we need to.
@@ -409,6 +410,7 @@ class SocialContentInstagram extends SocialContent {
     if (isset($row->videos) && $mappings['video_url']) {
       $row->video_url = isset($row->videos->standard_resolution) ? $row->videos->standard_resolution->url : $row->videos->low_resolution->url;
     }
+    return $internal_id;
   }
 
   /**
diff --git a/social_content.admin.inc b/social_content.admin.inc
index 358d5a1..dbb56de 100644
--- a/social_content.admin.inc
+++ b/social_content.admin.inc
@@ -192,7 +192,8 @@ function social_content_import_run_form_submit($form, &$form_state) {
       '!processed' => $stats['processed'],
       '!imported' => $stats['imported'],
       '!skipped' => $stats['skipped'],
+      '!updated' => $stats['updated'],
     );
-    drupal_set_message(t('%title run successfully, processed !processed, imported !imported, skipped !skipped nodes', $args));
+    drupal_set_message(t('%title run successfully, processed !processed, imported !imported, updated !updated, skipped !skipped nodes', $args));
   }
 }
diff --git a/social_content.class.inc b/social_content.class.inc
index f736833..688d1d3 100644
--- a/social_content.class.inc
+++ b/social_content.class.inc
@@ -339,7 +339,7 @@ abstract class SocialContent {
       '#default_value' => isset($settings['language']) ? $settings['language'] : NULL,
       '#required' => FALSE,
     );
-    if (module_exists('entity_translation')) {      
+    if (module_exists('entity_translation')) {
       $form['translate'] = array(
         '#type' => 'select',
         '#title' => t('Translate'),
@@ -546,6 +546,7 @@ abstract class SocialContent {
       'skipped' => 0,
       'imported' => 0,
       'processed' => 0,
+      'updated' => 0,
     );
     $field_mappings = $this->getFieldMappings();
 
@@ -567,48 +568,57 @@ abstract class SocialContent {
       // We know how many rows we will process for this import.
       $import_stats['processed'] = count($rows);
       foreach ($rows as $row) {
+        $internal_id = $this->prepareRow($row);
         // We are not importing a row if it is not an object
         // or doesn't have an id
-        // or prepareRow returns FALSE.
-        if (!is_object($row) && !isset($row->id) || $this->prepareRow($row) === FALSE) {
+        // or prepareRow returns a non-number.
+        if (!is_object($row) && !isset($row->id) || !is_numeric($internal_id)) {
           $import_stats['skipped']++;
           continue;
         }
-
-        // The path will be machine name plus row id.
-        $path = $this->getMachineName() . '/' . $row->id;
-        // Basic attributes of a node.
-        $values = array(
-          'type' => $settings['content_type'],
-          'status' => $settings['auto_publish'],
-          'promote' => 0,
-          'language' => $langcode,
-          'created' => isset($row->created) ? $row->created : time(),
-          'path' => array('alias' => $path),
-        );
-
-        // If an author has not yet been set, default to uid 1 (this is for
-        // legacy reasons, everything used to always be imported as uid 1).
-        if (!isset($settings['author'])) {
-          $values['uid'] = 1;
+        $entity = FALSE;
+        if ($internal_id !== -1) {
+          $entity = entity_load_single('node', $internal_id);
         }
-        // If it's set but is empty, then it's the anonymous user.
-        elseif (empty($settings['author'])) {
-          $values['uid'] = 0;
+        if (!empty($entity)) {
+          $import_stats['updated']++;
         }
         else {
-          $values['uid'] = $settings['author'];
+          // The path will be machine name plus row id.
+          $path = $this->getMachineName() . '/' . $row->id;
+          // Basic attributes of a node.
+          $values = array(
+            'type' => $settings['content_type'],
+            'status' => $settings['auto_publish'],
+            'promote' => 0,
+            'language' => $langcode,
+            'created' => isset($row->created) ? $row->created : time(),
+            'path' => array('alias' => $path),
+          );
+
+          // If an author has not yet been set, default to uid 1 (this is for
+          // legacy reasons, everything used to always be imported as uid 1).
+          if (!isset($settings['author'])) {
+            $values['uid'] = 1;
+          }
+          // If it's set but is empty, then it's the anonymous user.
+          elseif (empty($settings['author'])) {
+            $values['uid'] = 0;
+          }
+          else {
+            $values['uid'] = $settings['author'];
+          }
+          $entity = entity_create('node', $values);
         }
 
         // Using entity_metadata_wrapper as it's easier to set fields.
-        $entity = entity_create('node', $values);
         $wrapper = entity_metadata_wrapper('node', $entity);
 
         // We only want to set properties in this array on the $wrapper
         // or else it will throw an exception.
         // Set the title.
         $property_info = $wrapper->getPropertyInfo();
-        if (isset($property_info['title'])) {        
+        if (isset($property_info['title'])) {
           if (empty($row->title)) {
             $wrapper->title->set($this->getLabel() . ' : ' . $row->id);
           }
@@ -676,7 +686,7 @@ abstract class SocialContent {
         }
         elseif ($property_info[$field_name]['type'] == 'text') {
           $value = self::validateText($value);
-        }        
+        }
         elseif (in_array($property_info[$field_name]['type'], array('text_formatted', 'field_item_textsummary'))) {
           $value = self::validateText($value);
           $value = is_array($value) ? $value : array('value' => $value, 'format' => 'filtered_html');
@@ -737,7 +747,7 @@ abstract class SocialContent {
         'status' => 1,
         'language' => $langcode,
         'source' => $source_language,
-      ); 
+      );
       $handler->setTranslation($translation, $values);
       field_attach_update('node', $node);
     }
@@ -807,18 +817,12 @@ abstract class SocialContent {
    *   FALSE to skip this row else TRUE to import row.
    */
   public function prepareRow($row) {
-    $exists = db_select('social_content_history', 'social_content_history')
+    return db_select('social_content_history', 'social_content_history')
       ->fields('social_content_history', array('internal_id'))
       ->condition('external_id', $row->id)
       ->condition('instance', $this->settings['instance']['id'])
       ->execute()
       ->fetchField();
-
-    if ($exists) {
-      watchdog('social_content', '%global : %id already exists', array('%global' => $this->getMachineName(), '%id' => $row->id));
-    }
-
-    return !$exists;
   }
 
   /**
@@ -830,13 +834,18 @@ abstract class SocialContent {
    *   The row to which to log.
    */
   protected function logHistory($wrapper, $row) {
-    $history = (object) array(
+    $ids = array(
       'instance' => $this->settings['instance']['id'],
       'external_id' => $row->id,
+    );
+    $history = array(
       'internal_id' => $wrapper->getIdentifier(),
       'stamp' => $row->created,
     );
-    drupal_write_record('social_content_history', $history);
+    db_merge('social_content_history')
+      ->key($ids)
+      ->fields($history)
+      ->execute();
   }
 
   /**
