Index: /trunk/ippTools/share/Makefile.am
===================================================================
--- /trunk/ippTools/share/Makefile.am	(revision 20721)
+++ /trunk/ippTools/share/Makefile.am	(revision 20722)
@@ -163,5 +163,6 @@
      warptool_pendingcleanuprun.sql \
      warptool_pendingcleanupskyfile.sql \
-     warptool_revertwarped.sql \
+     warptool_revertwarped_update.sql \
+     warptool_revertwarped_delete.sql \
      warptool_scmap.sql \
      warptool_tooverlap.sql \
Index: unk/ippTools/share/warptool_revertwarped.sql
===================================================================
--- /trunk/ippTools/share/warptool_revertwarped.sql	(revision 20721)
+++ 	(revision )
@@ -1,9 +1,0 @@
-DELETE FROM warpSkyfile
-USING warpSkyfile, warpRun, fakeRun, camRun, chipRun, rawExp
-WHERE
-    warpSkyfile.warp_id = warpRun.warp_id
-    AND warpRun.fake_id = fakeRun.fake_id
-    AND fakeRun.cam_id = camRun.cam_id
-    AND camRun.chip_id = chipRun.chip_id
-    AND chipRun.exp_id = rawExp.exp_id
-    AND warpSkyfile.fault != 0
Index: /trunk/ippTools/share/warptool_revertwarped_delete.sql
===================================================================
--- /trunk/ippTools/share/warptool_revertwarped_delete.sql	(revision 20722)
+++ /trunk/ippTools/share/warptool_revertwarped_delete.sql	(revision 20722)
@@ -0,0 +1,8 @@
+DELETE FROM warpSkyfile
+USING warpSkyfile, warpRun, fakeRun, camRun, chipRun, rawExp
+WHERE warpSkyfile.warp_id = warpRun.warp_id
+    AND warpRun.fake_id = fakeRun.fake_id
+    AND fakeRun.cam_id = camRun.cam_id
+    AND camRun.chip_id = chipRun.chip_id
+    AND chipRun.exp_id = rawExp.exp_id
+    AND warpSkyfile.fault != 0
Index: /trunk/ippTools/share/warptool_revertwarped_update.sql
===================================================================
--- /trunk/ippTools/share/warptool_revertwarped_update.sql	(revision 20722)
+++ /trunk/ippTools/share/warptool_revertwarped_update.sql	(revision 20722)
@@ -0,0 +1,8 @@
+UPDATE warpRun
+JOIN warpSkyfile USING(warp_id)
+JOIN fakeRun USING(fake_id)
+JOIN camRun USING(cam_id)
+JOIN chipRun USING(chip_id)
+JOIN rawExp USING(exp_id)
+SET warpRun.state = 'new'
+WHERE warpSkyfile.fault != 0
Index: /trunk/ippTools/src/warptool.c
===================================================================
--- /trunk/ippTools/src/warptool.c	(revision 20721)
+++ /trunk/ippTools/src/warptool.c	(revision 20722)
@@ -1213,25 +1213,92 @@
     }
 
-    psString query = pxDataGet("warptool_revertwarped.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+    if (!psDBTransaction(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
         psFree(where);
         return false;
     }
 
-    if (where && psListLength(where->list)) {
-        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
+    int num;                            // Number affected
+
+    // Update state to 'new'
+    {
+        psString query = pxDataGet("warptool_revertwarped_update.sql");
+        if (!query) {
+            psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return false;
+        }
+
+        if (psListLength(where->list)) {
+            psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+            psStringAppend(&query, " AND %s", whereClause);
+            psFree(whereClause);
+        }
+
+        if (!p_psDBRunQuery(config->dbh, query)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            psFree(query);
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return false;
+        }
+        psFree(query);
+
+        num = psDBAffectedRows(config->dbh);
+
+        if (num < 1) {
+            psError(PS_ERR_UNKNOWN, false, "should have affected atleast 1 row");
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return false;
+        }
+    }
+
+    // Delete product
+    {
+        psString query = pxDataGet("warptool_revertwarped_delete.sql");
+        if (!query) {
+            psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return false;
+        }
+
+        if (psListLength(where->list)) {
+            psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+            psStringAppend(&query, " AND %s", whereClause);
+            psFree(whereClause);
+        }
+
+        if (!p_psDBRunQuery(config->dbh, query)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            psFree(query);
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return false;
+        }
+        psFree(query);
+
+        if (psDBAffectedRows(config->dbh) != num) {
+            psError(PS_ERR_UNKNOWN, false, "Updated and deleted different number of entries!");
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return false;
+        }
     }
 
     psFree(where);
 
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-    psFree(query);
+    if (!psDBCommit(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
 
     return true;
