diff --git a/stager.module b/stager.module
index e8761a3..4d01430 100644
--- a/stager.module
+++ b/stager.module
@@ -230,8 +230,14 @@ function stager_staging_create($prefix) {
     db_create_table($prefix . '_' . $name, $table);
 
     // Copy all data, except for all cache tables and watchdog.
-    if (strpos($name, 'cache') === FALSE && $name != 'watchdog') {
-      db_query('INSERT INTO ' . $prefix . '_' . $name . ' SELECT * FROM ' . $name);
+    if (stager_sync_table_data($name)) {
+      try  {
+        $query = stager_copy_query($name, $prefix . '_' . $name, $table);
+        db_query($query);
+      }
+      catch (Exception $e) {
+		drupal_set_message(t("Stager fail to sync data of table !table_name", array("!table_name" => $name)));
+      }
     }
   }
 
@@ -245,14 +251,17 @@ function stager_staging_create($prefix) {
 function stager_staging_sync_and_or_remove($prefix, $sync_changes = TRUE, $remove_staging = TRUE) {
   $count = 0;
   $tables = db_find_tables($prefix . '_%');
+  $schema = drupal_get_schema();
 
   foreach ($tables as $table) {
 
     // Sync data if requested.
-    if (strpos($table, 'cache') === FALSE && $sync_changes && $table != 'watchdog') {
+    if (stager_sync_table_data($table, TRUE) && $sync_changes) {
       $original = str_replace($prefix . '_', '', $table);
       db_query('TRUNCATE ' . $original);
-      db_query('INSERT INTO ' . $original . ' SELECT * FROM ' . $table);
+
+      $query = stager_copy_query($table, $original, $schema[$original]);
+      db_query($query);
     }
 
     // Drop tables if requested.
@@ -346,3 +355,60 @@ function stager_recurse_copy($src, $dst, $ignore_folders) {
   }
   closedir($dir);
 }
+
+/**
+ * Generate query to sync data from two tables.
+ *
+ * @param string $source_name:
+ *   Name od origin table.
+ *
+ * @param string $destination_name:
+ *   Name of destination table.
+ *
+ * @param array $table:
+ *   Table definition in accord with hook_schema() specification.
+ *
+ * @return string:
+ *   Query to execute
+ */
+function stager_copy_query($source_name, $destination_name, $table) {
+  $fields = array();
+  foreach ($table['fields'] as $field => $data) {
+    $fields[] = $field;
+  }
+  $fields = implode(', ', $fields);
+
+  return "INSERT INTO $destination_name ($fields) SELECT $fields FROM $source_name";
+}
+
+
+/**
+ * Get information about required sync of table data
+ *
+ * @param string $table_name:
+ *    Table name to sync
+ *
+ * @return bool:
+ *    Return if table must or not sync
+ */
+function stager_sync_table_data($table_name, $sync_back = FALSE) {
+  // Exclude cache
+  if (strpos($table_name, 'cache') === 0) {
+    return FALSE;
+  }
+
+  // No sync back data from specified tables
+  if ($sync_back && in_array($table_name, variable_get('stager_ignore_tables', array()))) {
+    return FALSE;
+  }
+
+  // Other specific tables
+  switch ($table_name) {
+    case 'watchdog':
+      return FALSE;
+      break;
+
+    default:
+      return TRUE;
+  }
+}
