diff --git a/src/csharp/Grpc.Core.Api/LiteClientBase.cs b/src/csharp/Grpc.Core.Api/LiteClientBase.cs
new file mode 100644
index 00000000000..a978cdf09e0
--- /dev/null
+++ b/src/csharp/Grpc.Core.Api/LiteClientBase.cs
@@ -0,0 +1,96 @@
+#region Copyright notice and license
+
+// Copyright 2019 The gRPC Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#endregion
+
+using System;
+
+namespace Grpc.Core
+{
+ ///
+ /// Base class for lightweight client-side stubs.
+ /// All calls are invoked via a CallInvoker.
+ /// Lite client stubs have no configuration knobs, all configuration
+ /// is provided by decorating the call invoker.
+ /// Note: experimental API that can change or be removed without any prior notice.
+ ///
+ public abstract class LiteClientBase
+ {
+ readonly CallInvoker callInvoker;
+
+ ///
+ /// Initializes a new instance of LiteClientBase class that
+ /// throws NotImplementedException upon invocation of any RPC.
+ /// This constructor is only provided to allow creation of test doubles
+ /// for client classes (e.g. mocking requires a parameterless constructor).
+ ///
+ protected LiteClientBase() : this(new UnimplementedCallInvoker())
+ {
+ }
+
+ ///
+ /// Initializes a new instance of ClientBase class.
+ ///
+ /// The CallInvoker for remote call invocation.
+ public LiteClientBase(CallInvoker callInvoker)
+ {
+ this.callInvoker = callInvoker;
+ }
+
+ ///
+ /// Gets the call invoker.
+ ///
+ protected CallInvoker CallInvoker
+ {
+ get { return this.callInvoker; }
+ }
+
+ ///
+ /// Call invoker that throws NotImplementedException for all requests.
+ ///
+ private class UnimplementedCallInvoker : CallInvoker
+ {
+ public UnimplementedCallInvoker()
+ {
+ }
+
+ public override TResponse BlockingUnaryCall(Method method, string host, CallOptions options, TRequest request)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override AsyncUnaryCall AsyncUnaryCall(Method method, string host, CallOptions options, TRequest request)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override AsyncServerStreamingCall AsyncServerStreamingCall(Method method, string host, CallOptions options, TRequest request)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override AsyncClientStreamingCall AsyncClientStreamingCall(Method method, string host, CallOptions options)
+ {
+ throw new NotImplementedException();
+ }
+
+ public override AsyncDuplexStreamingCall AsyncDuplexStreamingCall(Method method, string host, CallOptions options)
+ {
+ throw new NotImplementedException();
+ }
+ }
+ }
+}