When creating tables, consider creating a field named 'deleted'. You might want to make this the last field in the table. `deleted` tinyint(1) unsigned NOT NULL DEFAULT '0', This facilitates flagging records as deleted, via a trigger. For List mode, display only records whose default value is 0. Below the table definition, filter the selected records with: $opts['filters'] = 'deleted = "0"'; The generated field array for 'deleted' should resemble: $opts['fdd']['deleted'] = array( 'default' => '0', 'input' => '', 'name' => 'Deleted', 'options' => '', 'required' => true, 'select' => 'T', 'size|ACP' => 1, 'sort' => true ); Comment out the field array. You don't really want it to appear in the form. In place of the above field array, add a trigger: $opts['triggers']['delete']['before'] = 'triggers/mark_as_deleted.TDB.inc'; Contents of the trigger file might read as follows: $query2 = sprintf('UPDATE %s SET `deleted` = "1" WHERE `%s` = "%s" LIMIT 1', $this->tb, $this->key, $this->rec); if($this->MyQuery($query2)){ // success return false; }else{ echo "\n".'

'.htmlspecialchars(mysql_error()).'

'; echo "\n".'

Go Back

'; exit; } A utility such as phpMyAdmin can subsequently be utilized to reactivate "deleted" records. TEST THOROUGHLY BEFORE IMPLEMENTING ON A WIDE SCALE. The `deleted` field might alternatively be an ENUM('Y','N') field.