diff --git a/src/csharp/Grpc.Examples.MathClient/MathClient.cs b/src/csharp/Grpc.Examples.MathClient/MathClient.cs
index f5956bd33e008cdafe2e0116d76640645e793570..ca7683d399ff2cfbfd278c3cd171e1d41d6eaa34 100644
--- a/src/csharp/Grpc.Examples.MathClient/MathClient.cs
+++ b/src/csharp/Grpc.Examples.MathClient/MathClient.cs
@@ -46,11 +46,15 @@ namespace math
                 MathGrpc.IMathServiceClient stub = new MathGrpc.MathServiceClientStub(channel);
                 MathExamples.DivExample(stub);
 
-                MathExamples.FibExample(stub);
+                MathExamples.DivAsyncExample(stub).Wait();
 
-                MathExamples.SumExample(stub);
+                MathExamples.FibExample(stub).Wait();
 
-                MathExamples.DivManyExample(stub);
+                MathExamples.SumExample(stub).Wait();
+
+                MathExamples.DivManyExample(stub).Wait();
+
+                MathExamples.DependendRequestsExample(stub).Wait();
             }
 
             GrpcEnvironment.Shutdown();
diff --git a/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj b/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj
index cf5a6400796e66b8daf36d0890602e44d15f4ffd..f9c1caf700d010694dde98b7d384788f68ef5f4d 100644
--- a/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj
+++ b/src/csharp/Grpc.Examples.Tests/Grpc.Examples.Tests.csproj
@@ -37,6 +37,18 @@
     <Reference Include="Google.ProtocolBuffers">
       <HintPath>..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.dll</HintPath>
     </Reference>
+    <Reference Include="System.Reactive.Interfaces">
+      <HintPath>..\packages\Rx-Interfaces.2.2.5\lib\net45\System.Reactive.Interfaces.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Core">
+      <HintPath>..\packages\Rx-Core.2.2.5\lib\net45\System.Reactive.Core.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.Linq">
+      <HintPath>..\packages\Rx-Linq.2.2.5\lib\net45\System.Reactive.Linq.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Reactive.PlatformServices">
+      <HintPath>..\packages\Rx-PlatformServices.2.2.5\lib\net45\System.Reactive.PlatformServices.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Properties\AssemblyInfo.cs" />
diff --git a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
index 85f213cb39161da5e8c61723c8ce4b1ff1b4df09..fa5d6688a6bdcaf1ddec742b69cf9c213c02ee3a 100644
--- a/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
+++ b/src/csharp/Grpc.Examples.Tests/MathClientServerTests.cs
@@ -33,6 +33,7 @@
 
 using System;
 using System.Collections.Generic;
+using System.Reactive.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 using Grpc.Core;
@@ -120,14 +121,12 @@ namespace math.Tests
         [Test]
         public void Sum()
         {
-            var res = client.Sum();
-            foreach (var num in new long[] { 10, 20, 30 })
-            {
-                res.Inputs.OnNext(Num.CreateBuilder().SetNum_(num).Build());
-            }
-            res.Inputs.OnCompleted();
+            var clientStreamingResult = client.Sum();
+            var numList = new List<long> { 10, 20, 30 }.ConvertAll(
+                     n => Num.CreateBuilder().SetNum_(n).Build());
+            numList.Subscribe(clientStreamingResult.Inputs);
 
-            Assert.AreEqual(60, res.Task.Result.Num_);
+            Assert.AreEqual(60, clientStreamingResult.Task.Result.Num_);
         }
 
         [Test]
@@ -142,13 +141,7 @@ namespace math.Tests
 
             var recorder = new RecordingObserver<DivReply>();
             var requestObserver = client.DivMany(recorder);
-
-            foreach (var arg in divArgsList)
-            {
-                requestObserver.OnNext(arg);
-            }
-            requestObserver.OnCompleted();
-
+            divArgsList.Subscribe(requestObserver);
             var result = recorder.ToList().Result;
 
             CollectionAssert.AreEqual(new long[] { 3, 4, 3 }, result.ConvertAll((divReply) => divReply.Quotient));
diff --git a/src/csharp/Grpc.Examples.Tests/packages.config b/src/csharp/Grpc.Examples.Tests/packages.config
index 51c17bcd5e74685ab31264eae00dc062b5b9083d..06c5e6a4ebeba590275479bbd8ecf913beda4f7c 100644
--- a/src/csharp/Grpc.Examples.Tests/packages.config
+++ b/src/csharp/Grpc.Examples.Tests/packages.config
@@ -1,5 +1,10 @@
-<?xml version="1.0" encoding="utf-8"?>
-<packages>
-  <package id="Google.ProtocolBuffers" version="2.4.1.521" targetFramework="net45" />
-  <package id="NUnit" version="2.6.4" targetFramework="net45" />
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Google.ProtocolBuffers" version="2.4.1.521" targetFramework="net45" />
+  <package id="NUnit" version="2.6.4" targetFramework="net45" />
+  <package id="Rx-Core" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-Interfaces" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-Linq" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-Main" version="2.2.5" targetFramework="net45" />
+  <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net45" />
 </packages>
\ No newline at end of file
diff --git a/src/csharp/Grpc.Examples/MathExamples.cs b/src/csharp/Grpc.Examples/MathExamples.cs
index b8bb7eacbd0f3572ab9ec3aa5660dd0af6e9a613..032372b2a119f25509b6765560ceee1329c2b06b 100644
--- a/src/csharp/Grpc.Examples/MathExamples.cs
+++ b/src/csharp/Grpc.Examples/MathExamples.cs
@@ -45,51 +45,45 @@ namespace math
             Console.WriteLine("Div Result: " + result);
         }
 
-        public static void DivAsyncExample(MathGrpc.IMathServiceClient stub)
+        public static async Task DivAsyncExample(MathGrpc.IMathServiceClient stub)
         {
-            Task<DivReply> call = stub.DivAsync(new DivArgs.Builder { Dividend = 4, Divisor = 5 }.Build());
-            DivReply result = call.Result;
-            Console.WriteLine(result);
+            Task<DivReply> resultTask = stub.DivAsync(new DivArgs.Builder { Dividend = 4, Divisor = 5 }.Build());
+            DivReply result = await resultTask;
+            Console.WriteLine("DivAsync Result: " + result);
         }
 
-        public static void DivAsyncWithCancellationExample(MathGrpc.IMathServiceClient stub)
+        public static async Task DivAsyncWithCancellationExample(MathGrpc.IMathServiceClient stub)
         {
-            Task<DivReply> call = stub.DivAsync(new DivArgs.Builder { Dividend = 4, Divisor = 5 }.Build());
-            DivReply result = call.Result;
+            Task<DivReply> resultTask = stub.DivAsync(new DivArgs.Builder { Dividend = 4, Divisor = 5 }.Build());
+            DivReply result = await resultTask;
             Console.WriteLine(result);
         }
 
-        public static void FibExample(MathGrpc.IMathServiceClient stub)
+        public static async Task FibExample(MathGrpc.IMathServiceClient stub)
         {
             var recorder = new RecordingObserver<Num>();
             stub.Fib(new FibArgs.Builder { Limit = 5 }.Build(), recorder);
-
-            List<Num> numbers = recorder.ToList().Result;
-            Console.WriteLine("Fib Result: " + string.Join("|", recorder.ToList().Result));
+            List<Num> result = await recorder.ToList();
+            Console.WriteLine("Fib Result: " + string.Join("|", result));
         }
 
-        public static void SumExample(MathGrpc.IMathServiceClient stub)
+        public static async Task SumExample(MathGrpc.IMathServiceClient stub)
         {
-            List<Num> numbers = new List<Num>
+            var numbers = new List<Num>
             {
                 new Num.Builder { Num_ = 1 }.Build(),
                 new Num.Builder { Num_ = 2 }.Build(),
                 new Num.Builder { Num_ = 3 }.Build()
             };
 
-            var res = stub.Sum();
-            foreach (var num in numbers)
-            {
-                res.Inputs.OnNext(num);
-            }
-            res.Inputs.OnCompleted();
-
-            Console.WriteLine("Sum Result: " + res.Task.Result);
+            var clientStreamingResult = stub.Sum();
+            numbers.Subscribe(clientStreamingResult.Inputs);
+            Console.WriteLine("Sum Result: " + await clientStreamingResult.Task);
         }
 
-        public static void DivManyExample(MathGrpc.IMathServiceClient stub)
+        public static async Task DivManyExample(MathGrpc.IMathServiceClient stub)
         {
-            List<DivArgs> divArgsList = new List<DivArgs>
+            var divArgsList = new List<DivArgs>
             {
                 new DivArgs.Builder { Dividend = 10, Divisor = 3 }.Build(),
                 new DivArgs.Builder { Dividend = 100, Divisor = 21 }.Build(),
@@ -97,26 +91,27 @@ namespace math
             };
 
             var recorder = new RecordingObserver<DivReply>();
-
             var inputs = stub.DivMany(recorder);
-            foreach (var input in divArgsList)
-            {
-                inputs.OnNext(input);
-            }
-            inputs.OnCompleted();
-
-            Console.WriteLine("DivMany Result: " + string.Join("|", recorder.ToList().Result));
+            divArgsList.Subscribe(inputs);
+            var result = await recorder.ToList();
+            Console.WriteLine("DivMany Result: " + string.Join("|", result));
         }
 
-        public static void DependendRequestsExample(MathGrpc.IMathServiceClient stub)
+        public static async Task DependendRequestsExample(MathGrpc.IMathServiceClient stub)
         {
-            var numberList = new List<Num>
+            var numbers = new List<Num>
             {
-                new Num.Builder { Num_ = 1 }.Build(),
-                new Num.Builder { Num_ = 2 }.Build(), new Num.Builder { Num_ = 3 }.Build()
+                new Num.Builder { Num_ = 1 }.Build(), 
+                new Num.Builder { Num_ = 2 }.Build(),
+                new Num.Builder { Num_ = 3 }.Build()
             };
 
-            numberList.ToObservable();
+            var clientStreamingResult = stub.Sum();
+            numbers.Subscribe(clientStreamingResult.Inputs);
+            Num sum = await clientStreamingResult.Task;
+
+            DivReply result = await stub.DivAsync(new DivArgs.Builder { Dividend = sum.Num_, Divisor = numbers.Count }.Build());
+            Console.WriteLine("Avg Result: " + result);
         }
     }
 }