diff --git a/src/csharp/Grpc.Auth/GoogleCredential.cs b/src/csharp/Grpc.Auth/GoogleCredential.cs
index 3e31755bfc264cfead91f1353e7da9367f35207e..36d43d320714ba63e7b9b59b632a538f5e9b1534 100644
--- a/src/csharp/Grpc.Auth/GoogleCredential.cs
+++ b/src/csharp/Grpc.Auth/GoogleCredential.cs
@@ -78,8 +78,14 @@ namespace Grpc.Auth
 
         public GoogleCredential CreateScoped(IEnumerable<string> scopes)
         {
-            // TODO(jtattermusch): also support compute credential.
             var credsPath = Environment.GetEnvironmentVariable(GoogleApplicationCredentialsEnvName);
+            if (credsPath == null)
+            {
+                // Default to ComputeCredentials if path to JSON key is not set.
+                // ComputeCredential is not scoped actually, but for our use case it's
+                // fine to treat is as such.
+                return new GoogleCredential(new ComputeCredential(new ComputeCredential.Initializer()));
+            }
 
             JObject o1 = JObject.Parse(File.ReadAllText(credsPath));
             string clientEmail = o1.GetValue(ClientEmailFieldName).Value<string>();
diff --git a/src/csharp/Grpc.Core/Status.cs b/src/csharp/Grpc.Core/Status.cs
index 2c3c2a5d8eca2654523c44321bc565ea84936895..7d76aec4d1198dda8969c79cede6ff0dbe3e556b 100644
--- a/src/csharp/Grpc.Core/Status.cs
+++ b/src/csharp/Grpc.Core/Status.cs
@@ -74,7 +74,5 @@ namespace Grpc.Core
         {
             return string.Format("Status(StatusCode={0}, Detail=\"{1}\")", statusCode, detail);
         }
-
-
     }
 }
diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
index 3b909de01358ddd72c6c10377e15ee13ab144da2..c05a5cc6ce74b8e2b0d327419745266ca9eb8277 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
@@ -120,7 +120,7 @@ namespace Grpc.IntegrationTesting
             using (Channel channel = new Channel(addr, credentials, channelArgs))
             {
                 var stubConfig = StubConfiguration.Default;
-                if (options.testCase == "service_account_creds")
+                if (options.testCase == "service_account_creds" || options.testCase == "compute_engine_creds")
                 {
                     var credential = GoogleCredential.GetApplicationDefault();
                     if (credential.IsCreateScopedRequired)
@@ -162,6 +162,9 @@ namespace Grpc.IntegrationTesting
                 case "service_account_creds":
                     RunServiceAccountCreds(client);
                     break;
+                case "compute_engine_creds":
+                    RunComputeEngineCreds(client);
+                    break;
                 case "benchmark_empty_unary":
                     RunBenchmarkEmptyUnary(client);
                     break;
@@ -325,6 +328,26 @@ namespace Grpc.IntegrationTesting
             Console.WriteLine("Passed!");
         }
 
+        public static void RunComputeEngineCreds(TestServiceGrpc.ITestServiceClient client)
+        {
+            Console.WriteLine("running compute_engine_creds");
+            var request = SimpleRequest.CreateBuilder()
+                .SetResponseType(PayloadType.COMPRESSABLE)
+                    .SetResponseSize(314159)
+                    .SetPayload(CreateZerosPayload(271828))
+                    .SetFillUsername(true)
+                    .SetFillOauthScope(true)
+                    .Build();
+
+            var response = client.UnaryCall(request);
+
+            Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type);
+            Assert.AreEqual(314159, response.Payload.Body.Length);
+            Assert.AreEqual(AuthScopeResponse, response.OauthScope);
+            Assert.AreEqual(ServiceAccountUser, response.Username);
+            Console.WriteLine("Passed!");
+        }
+
         // This is not an official interop test, but it's useful.
         public static void RunBenchmarkEmptyUnary(TestServiceGrpc.ITestServiceClient client)
         {