diff --git a/test/Microsoft.SqlTools.ServiceLayer.TestDriver/Driver/ServiceTestDriver.cs b/test/Microsoft.SqlTools.ServiceLayer.TestDriver/Driver/ServiceTestDriver.cs
new file mode 100644
index 00000000..ac7e76c0
--- /dev/null
+++ b/test/Microsoft.SqlTools.ServiceLayer.TestDriver/Driver/ServiceTestDriver.cs
@@ -0,0 +1,39 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+//
+// The following is based upon code from PowerShell Editor Services
+// License: https://github.com/PowerShell/PowerShellEditorServices/blob/develop/LICENSE
+//
+
+using System.Threading.Tasks;
+using Microsoft.SqlTools.ServiceLayer.Hosting.Protocol;
+using Microsoft.SqlTools.ServiceLayer.Hosting.Protocol.Channel;
+
+namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Driver
+{
+ ///
+ /// Test driver for the service host
+ ///
+ public class ServiceTestDriver : TestDriverBase
+ {
+ public ServiceTestDriver(string serviceHostExecutable)
+ {
+ var clientChannel = new StdioClientChannel(serviceHostExecutable);
+ this.protocolClient = new ProtocolEndpoint(clientChannel, MessageProtocolType.LanguageServer);
+ }
+
+ public async Task Start()
+ {
+ await this.protocolClient.Start();
+ await Task.Delay(1000); // Wait for the service host to start
+ }
+
+ public async Task Stop()
+ {
+ await this.protocolClient.Stop();
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/Microsoft.SqlTools.ServiceLayer.TestDriver/Driver/TestDriverBase.cs b/test/Microsoft.SqlTools.ServiceLayer.TestDriver/Driver/TestDriverBase.cs
new file mode 100644
index 00000000..7f86764a
--- /dev/null
+++ b/test/Microsoft.SqlTools.ServiceLayer.TestDriver/Driver/TestDriverBase.cs
@@ -0,0 +1,173 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+//
+// The following is based upon code from PowerShell Editor Services
+// License: https://github.com/PowerShell/PowerShellEditorServices/blob/develop/LICENSE
+//
+
+using System;
+using System.Collections.Concurrent;
+using System.Threading.Tasks;
+using Microsoft.SqlTools.ServiceLayer.Hosting.Protocol;
+using Microsoft.SqlTools.ServiceLayer.Hosting.Protocol.Contracts;
+using Microsoft.SqlTools.ServiceLayer.Utility;
+
+namespace Microsoft.SqlTools.ServiceLayer.TestDriver.Driver
+{
+ ///
+ /// Wraps the ProtocolEndpoint class with queues to handle events/requests
+ ///
+ public class TestDriverBase
+ {
+ protected ProtocolEndpoint protocolClient;
+
+ private ConcurrentDictionary> eventQueuePerType =
+ new ConcurrentDictionary>();
+
+ private ConcurrentDictionary> requestQueuePerType =
+ new ConcurrentDictionary>();
+
+ public Task SendRequest(
+ RequestType requestType,
+ TParams requestParams)
+ {
+ return
+ this.protocolClient.SendRequest(
+ requestType,
+ requestParams);
+ }
+
+ public Task SendEvent(EventType eventType, TParams eventParams)
+ {
+ return
+ this.protocolClient.SendEvent(
+ eventType,
+ eventParams);
+ }
+
+ public void QueueEventsForType(EventType eventType)
+ {
+ var eventQueue =
+ this.eventQueuePerType.AddOrUpdate(
+ eventType.MethodName,
+ new AsyncQueue