diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm
index a32406d5bc161c0aaf45a1b64609c7fdcb7d48d2..42328c9ea01cf497c44c207f09dccfc6000a23d9 100644
--- a/Bugzilla/DB.pm
+++ b/Bugzilla/DB.pm
@@ -569,6 +569,21 @@ sub bz_drop_index_raw {
     $self->do($_) foreach (@statements);
 }
 
+sub bz_drop_table {
+    my ($self, $name) = @_;
+
+    my $table_exists = $self->bz_table_info($name);
+
+    if ($table_exists) {
+        my @statements = $self->_bz_schema->get_drop_table_ddl($name);
+        print "Dropping table $name...\n";
+        $self->do($_) foreach (@statements);
+        $self->_bz_real_schema->delete_table($name);
+        $self->_bz_store_real_schema;
+    }
+}
+
+
 # XXX - Needs to be made cross-db compatible
 sub bz_drop_table_indexes ($) {
     my ($self, $table) = @_;
@@ -1006,6 +1021,7 @@ Bugzilla::DB - Database access routines, using L<DBI>
   $dbh->bz_add_index($table, $name, $definition);
   $dbh->bz_add_table($name);
   $dbh->bz_drop_index($table, $name);
+  $dbh->bz_drop_table($name);
   $dbh->bz_alter_column($table, $name, \%new_def);
   $dbh->bz_drop_column($table, $column);
   $dbh->bz_rename_column($table, $old_name, $new_name);
@@ -1363,6 +1379,13 @@ C<Bugzilla::DB::Schema::ABSTRACT_SCHEMA>.
               $name  - The name of the index that you want to drop.
  Returns:     nothing
 
+=item C<bz_drop_table($name)>
+
+ Description: Drops a table from the database. If the table
+              doesn't exist, we just return silently.
+ Params:      $name - The name of the table to drop.
+ Returns:     nothing
+
 =item C<bz_alter_column($table, $name, \%new_def)>
 
  Description: Changes the data type of a column in a table. Prints out
diff --git a/Bugzilla/DB/Schema.pm b/Bugzilla/DB/Schema.pm
index c65d1f0f2f45f8c650fd5b0fd0839d3c42d55bfe..8dce761d82d3a8e7fbad4aa7ca7fedb3a1340bb7 100644
--- a/Bugzilla/DB/Schema.pm
+++ b/Bugzilla/DB/Schema.pm
@@ -1549,6 +1549,18 @@ sub get_drop_column_ddl {
     return ("ALTER TABLE $table DROP COLUMN $column");
 }
 
+=item C<get_drop_table_ddl($table)>
+
+ Description: Generate SQL to drop a table from the database.
+ Params:      $table - The name of the table to drop.
+ Returns:     An array of SQL statements.
+
+=cut
+sub get_drop_table_ddl {
+    my ($self, $table) = @_;
+    return ("DROP TABLE $table");
+}
+
 sub get_rename_column_ddl {
 
 =item C<get_rename_column_ddl($table, $old_name, $new_name)>
@@ -1568,11 +1580,28 @@ sub get_rename_column_ddl {
         . " has not implemented a method.";
 }
 
+=item C<delete_table($name)>
+
+ Description: Deletes a table from this Schema object.
+              Dies if you try to delete a table that doesn't exist.
+ Params:      $name - The name of the table to delete.
+ Returns:     nothing
+
+=cut
+sub delete_table {
+    my ($self, $name) = @_;
+
+    die "Attempted to delete nonexistent table '$name'." unless
+        $self->get_table_abstract($name);
+
+    delete $self->{abstract_schema}->{$name};
+    delete $self->{schema}->{$name};
+}
+
 sub get_column_abstract {
 
 =item C<get_column_abstract($table, $column)>
 
-
  Description: A column definition from the abstract internal schema.
               cross-database format.
  Params:      $table - The name of the table