diff --git a/Source/BuildOrder.txt b/Source/BuildOrder.txt
index fb97a1066..71483abdb 100644
--- a/Source/BuildOrder.txt
+++ b/Source/BuildOrder.txt
@@ -1,5 +1,6 @@
tSQLt._Header.sql
tSQLt.DropClass.ssp.sql
+tSQLt.DropAllClasses.ssp.sql
tSQLt.Private_Bin2Hex.sfn.sql
tSQLt.Private_NewTestClassList.tbl.sql
tSQLt.Private_ResetNewTestClassList.ssp.sql
diff --git a/Source/Source.ssmssqlproj b/Source/Source.ssmssqlproj
index ed043c2a4..2319a8fc3 100644
--- a/Source/Source.ssmssqlproj
+++ b/Source/Source.ssmssqlproj
@@ -139,6 +139,12 @@
tSQLt.CaptureOutputLog.tbl.sql
+
+
+
+
+ tSQLt.DropAllClasses.ssp.sql
+
8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True
Dev_tSQLt
diff --git a/Source/tSQLt.DropAllClasses.ssp.sql b/Source/tSQLt.DropAllClasses.ssp.sql
new file mode 100644
index 000000000..791dd2f9c
--- /dev/null
+++ b/Source/tSQLt.DropAllClasses.ssp.sql
@@ -0,0 +1,26 @@
+IF OBJECT_ID('tSQLt.DropAllClasses') IS NOT NULL DROP PROCEDURE tSQLt.DropAllClasses;
+GO
+---Build+
+CREATE PROCEDURE tSQLt.DropAllClasses
+AS
+BEGIN
+ DECLARE TestClass CURSOR LOCAL FAST_FORWARD
+ FOR
+ SELECT Name FROM tSQLt.TestClasses;
+
+ DECLARE @schema sysname;
+ OPEN TestClass;
+
+ WHILE 1 = 1
+ BEGIN
+ FETCH NEXT FROM TestClass INTO @schema;
+ IF @@FETCH_STATUS <> 0
+ BREAK;
+ EXEC tSQLt.DropClass @ClassName = @schema;
+ END;
+
+ CLOSE TestClass;
+ DEALLOCATE TestClass;
+END;
+---Build-
+GO
diff --git a/Tests/DropAllClassesTests.class.sql b/Tests/DropAllClassesTests.class.sql
new file mode 100644
index 000000000..1f8ee67ee
--- /dev/null
+++ b/Tests/DropAllClassesTests.class.sql
@@ -0,0 +1,50 @@
+EXEC tSQLt.NewTestClass 'DropAllClassesTests';
+GO
+
+CREATE PROC DropAllClassesTests.[test DropClass not called if no test classes exist]
+AS
+BEGIN
+ EXEC tSQLt.FakeTable 'tSQLt.TestClasses';
+ EXEC tSQLt.SpyProcedure 'tSQLt.DropClass';
+
+ EXEC tSQLt.DropAllClasses;
+
+ EXEC tSQLt.AssertEmptyTable 'tSQLt.DropClass_SpyProcedureLog';
+END;
+GO
+CREATE PROC DropAllClassesTests.[test that one test class results in one call to DropClass]
+AS
+BEGIN
+ EXEC tSQLt.FakeTable 'tSQLt.TestClasses';
+ EXEC tSQLt.SpyProcedure 'tSQLt.DropClass';
+ EXEC('INSERT INTO tSQLt.TestClasses (Name)
+ VALUES (''MyTestClass'');');
+
+ SELECT ClassName = Name INTO #expected FROM tSQLt.TestClasses;
+
+ EXEC tSQLt.DropAllClasses;
+
+ SELECT ClassName INTO #actual FROM tSQLt.DropClass_SpyProcedureLog;
+
+ EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
+END;
+GO
+CREATE PROC DropAllClassesTests.[test that multiple test classes are all sent to DropClass]
+AS
+BEGIN
+ EXEC tSQLt.FakeTable 'tSQLt.TestClasses';
+ EXEC tSQLt.SpyProcedure 'tSQLt.DropClass';
+ EXEC('INSERT INTO tSQLt.TestClasses (Name)
+ VALUES (''MyTestClass1''),
+ (''MyTestClass2''),
+ (''MyTestClass3'');');
+
+ SELECT ClassName = Name INTO #expected FROM tSQLt.TestClasses;
+
+ EXEC tSQLt.DropAllClasses;
+
+ SELECT ClassName INTO #actual FROM tSQLt.DropClass_SpyProcedureLog;
+
+ EXEC tSQLt.AssertEqualsTable '#expected', '#actual';
+END;
+GO
diff --git a/Tests/Tests.ssmssqlproj b/Tests/Tests.ssmssqlproj
index fbd9eac4f..f22bbfedf 100644
--- a/Tests/Tests.ssmssqlproj
+++ b/Tests/Tests.ssmssqlproj
@@ -91,6 +91,12 @@
BootStrapTest.sql
+
+
+
+
+ DropAllClassesTests.class.sql
+
8c91a03d-f9b4-46c0-a305-b5dcc79ff907:Dev_tSQLt:True
Dev_tSQLt