diff --git a/phpBB/includes/db/db_tools.php b/phpBB/includes/db/db_tools.php
index 7c96965a9b..f1947ab0d3 100644
--- a/phpBB/includes/db/db_tools.php
+++ b/phpBB/includes/db/db_tools.php
@@ -649,6 +649,23 @@ class phpbb_db_tools
 			$sqlite = true;
 		}
 
+		// Drop tables?
+		if (!empty($schema_changes['drop_tables']))
+		{
+			foreach ($schema_changes['drop_tables'] as $table)
+			{
+				// only drop table if it exists
+				if ($this->sql_table_exists($table))
+				{
+					$result = $this->sql_table_drop($table);
+					if ($this->return_statements)
+					{
+						$statements = array_merge($statements, $result);
+					}
+				}
+			}
+		}
+
 		// Add tables?
 		if (!empty($schema_changes['add_tables']))
 		{
diff --git a/tests/dbal/db_tools_test.php b/tests/dbal/db_tools_test.php
index ddea500f83..753cc08fc5 100644
--- a/tests/dbal/db_tools_test.php
+++ b/tests/dbal/db_tools_test.php
@@ -271,6 +271,66 @@ class phpbb_dbal_db_tools_test extends phpbb_database_test_case
 				'foo' => array('UINT', 42)))
 		);
 
+		$this->assertTrue($this->tools->sql_table_exists('prefix_test_table'));
+
 		$this->tools->sql_table_drop('prefix_test_table');
+
+		$this->assertFalse($this->tools->sql_table_exists('prefix_test_table'));
+	}
+
+	public function test_peform_schema_changes_drop_tables()
+	{
+		$db_tools = $this->getMock('phpbb_db_tools', array(
+			'sql_table_exists',
+			'sql_table_drop',
+		), array(&$this->db));
+
+		// pretend all tables exist
+		$db_tools->expects($this->any())->method('sql_table_exists')
+			->will($this->returnValue(true));
+
+		// drop tables
+		$db_tools->expects($this->exactly(2))->method('sql_table_drop');
+		$db_tools->expects($this->at(1))->method('sql_table_drop')
+			->with($this->equalTo('dropped_table_1'));
+		$db_tools->expects($this->at(3))->method('sql_table_drop')
+			->with($this->equalTo('dropped_table_2'));
+
+		$db_tools->perform_schema_changes(array(
+			'drop_tables' => array(
+				'dropped_table_1',
+				'dropped_table_2',
+			),
+		));
+	}
+
+	public function test_peform_schema_changes_drop_columns()
+	{
+		$db_tools = $this->getMock('phpbb_db_tools', array(
+			'sql_column_exists',
+			'sql_column_remove',
+		), array(&$this->db));
+
+		// pretend all columns exist
+		$db_tools->expects($this->any())->method('sql_column_exists')
+			->will($this->returnValue(true));
+		$db_tools->expects($this->any())->method('sql_column_exists')
+			->will($this->returnValue(true));
+
+		// drop columns
+		$db_tools->expects($this->exactly(2))->method('sql_column_remove');
+		$db_tools->expects($this->at(1))->method('sql_column_remove')
+			->with($this->equalTo('existing_table'), $this->equalTo('dropped_column_1'));
+		$db_tools->expects($this->at(3))->method('sql_column_remove')
+			->with($this->equalTo('existing_table'), $this->equalTo('dropped_column_2'));
+
+		$db_tools->perform_schema_changes(array(
+			'drop_columns' => array(
+				'existing_table' => array(
+					'dropped_column_1',
+					'dropped_column_2',
+				),
+			),
+		));
 	}
 }