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/Source/tSQLt.class.sql b/Source/tSQLt.class.sql
index f20b85632..30ccb2b49 100644
--- a/Source/tSQLt.class.sql
+++ b/Source/tSQLt.class.sql
@@ -541,6 +541,8 @@ GO
CREATE PROCEDURE tSQLt.Uninstall
AS
BEGIN
+ EXEC tSQLt.DropAllClasses;
+
DROP TYPE tSQLt.Private;
EXEC tSQLt.DropClass 'tSQLt';
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
diff --git a/Tests/tSQLt_test.class.sql b/Tests/tSQLt_test.class.sql
index f009c5fc5..21c76e16c 100644
--- a/Tests/tSQLt_test.class.sql
+++ b/Tests/tSQLt_test.class.sql
@@ -1606,6 +1606,28 @@ BEGIN
END;
GO
+CREATE PROCEDURE tSQLt_test.[test Uninstall removes test classes]
+AS
+BEGIN
+ EXEC tSQLt.SpyProcedure 'tSQLt.DropAllClasses';
+ DECLARE @call INT;
+ BEGIN TRAN;
+ DECLARE @TranName CHAR(32); EXEC tSQLt.GetNewTranName @TranName OUT;
+ SAVE TRAN @TranName;
+
+ EXEC tSQLt.Uninstall;
+ SET @call = (SELECT 1 FROM tSQLt.DropAllClasses_SpyProcedureLog);
+
+ ROLLBACK TRAN @TranName;
+ COMMIT TRAN;
+
+ IF @id IS NULL
+ BEGIN
+ EXEC tSQLt.Fail 'DropAllClasses not called';
+ END;
+END;
+GO
+
CREATE PROCEDURE tSQLt_test.[test Uninstall removes schema tSQLt]
AS
BEGIN
@@ -1671,4 +1693,4 @@ END;
GO
--ROLLBACK
---tSQLt_test
\ No newline at end of file
+--tSQLt_test