diff --git a/test/cpp/qps/async_streaming_ping_pong_test.cc b/test/cpp/qps/async_streaming_ping_pong_test.cc
index a1822b7e15623bbc4f515eeeef7956b02cb2a6fb..d4871c0ba11790b9606350b1933ca40a810e4df5 100644
--- a/test/cpp/qps/async_streaming_ping_pong_test.cc
+++ b/test/cpp/qps/async_streaming_ping_pong_test.cc
@@ -64,8 +64,8 @@ static void RunAsyncStreamingPingPong() {
   const auto result =
       RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
 
-  ReportQPS(result);
-  ReportLatency(result);
+  ReportQPS(*result);
+  ReportLatency(*result);
 }
 
 }  // namespace testing
diff --git a/test/cpp/qps/async_unary_ping_pong_test.cc b/test/cpp/qps/async_unary_ping_pong_test.cc
index 8b037a865628b1f3f3f942f5d29579d5607ed34c..35f188c98621b8e47f2f65265d6ef229a4c51537 100644
--- a/test/cpp/qps/async_unary_ping_pong_test.cc
+++ b/test/cpp/qps/async_unary_ping_pong_test.cc
@@ -64,8 +64,8 @@ static void RunAsyncUnaryPingPong() {
   const auto result =
       RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
 
-  ReportQPS(result);
-  ReportLatency(result);
+  ReportQPS(*result);
+  ReportLatency(*result);
 }
 
 }  // namespace testing
diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc
index 6959f980ae2bd865f0044723c50f776815711cba..682d515ebea185fb7b5f0bf325ada567280c6449 100644
--- a/test/cpp/qps/driver.cc
+++ b/test/cpp/qps/driver.cc
@@ -77,13 +77,10 @@ static deque<string> get_hosts(const string& name) {
   }
 }
 
-ScenarioResult RunScenario(const ClientConfig& initial_client_config,
-                           size_t num_clients,
-                           const ServerConfig& server_config,
-                           size_t num_servers,
-                           int warmup_seconds,
-                           int benchmark_seconds,
-                           int spawn_local_worker_count) {
+std::unique_ptr<ScenarioResult> RunScenario(
+    const ClientConfig& initial_client_config, size_t num_clients,
+    const ServerConfig& server_config, size_t num_servers, int warmup_seconds,
+    int benchmark_seconds, int spawn_local_worker_count) {
   // ClientContext allocator (all are destroyed at scope exit)
   list<ClientContext> contexts;
   auto alloc_context = [&contexts]() {
@@ -91,6 +88,11 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config,
     return &contexts.back();
   };
 
+  // To be added to the result, containing the final configuration used for
+  // client and config (incluiding host, etc.)
+  ClientConfig result_client_config;
+  ServerConfig result_server_config;
+
   // Get client, server lists
   auto workers = get_hosts("QPS_WORKERS");
   ClientConfig client_config = initial_client_config;
@@ -139,6 +141,8 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config,
     sd.stub = std::move(Worker::NewStub(
         CreateChannel(workers[i], InsecureCredentials(), ChannelArguments())));
     ServerArgs args;
+    result_server_config = server_config;
+    result_server_config.set_host(workers[i]);
     *args.mutable_setup() = server_config;
     sd.stream = std::move(sd.stub->RunServer(alloc_context()));
     GPR_ASSERT(sd.stream->Write(args));
@@ -168,6 +172,8 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config,
     cd.stub = std::move(Worker::NewStub(CreateChannel(
         workers[i + num_servers], InsecureCredentials(), ChannelArguments())));
     ClientArgs args;
+    result_client_config = client_config;
+    result_client_config.set_host(workers[i + num_servers]);
     *args.mutable_setup() = client_config;
     cd.stream = std::move(cd.stub->RunTest(alloc_context()));
     GPR_ASSERT(cd.stream->Write(args));
@@ -208,7 +214,9 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config,
   gpr_sleep_until(gpr_time_add(start, gpr_time_from_seconds(benchmark_seconds)));
 
   // Finish a run
-  ScenarioResult result;
+  std::unique_ptr<ScenarioResult> result(new ScenarioResult);
+  result->client_config = result_client_config;
+  result->server_config = result_server_config;
   gpr_log(GPR_INFO, "Finishing");
   for (auto server = servers.begin(); server != servers.end(); server++) {
     GPR_ASSERT(server->stream->Write(server_mark));
@@ -219,14 +227,14 @@ ScenarioResult RunScenario(const ClientConfig& initial_client_config,
   for (auto server = servers.begin(); server != servers.end(); server++) {
     GPR_ASSERT(server->stream->Read(&server_status));
     const auto& stats = server_status.stats();
-    result.server_resources.push_back(ResourceUsage{
+    result->server_resources.push_back(ResourceUsage{
         stats.time_elapsed(), stats.time_user(), stats.time_system()});
   }
   for (auto client = clients.begin(); client != clients.end(); client++) {
     GPR_ASSERT(client->stream->Read(&client_status));
     const auto& stats = client_status.stats();
-    result.latencies.MergeProto(stats.latencies());
-    result.client_resources.push_back(ResourceUsage{
+    result->latencies.MergeProto(stats.latencies());
+    result->client_resources.push_back(ResourceUsage{
         stats.time_elapsed(), stats.time_user(), stats.time_system()});
   }
 
diff --git a/test/cpp/qps/driver.h b/test/cpp/qps/driver.h
index eb7119a89ddceb81ef9cfe3fa598588c48f1237d..5e9d4b3cb92a6ca9b2a766a38d886cafa7b3b43d 100644
--- a/test/cpp/qps/driver.h
+++ b/test/cpp/qps/driver.h
@@ -34,6 +34,8 @@
 #ifndef TEST_QPS_DRIVER_H
 #define TEST_QPS_DRIVER_H
 
+#include <memory>
+
 #include "test/cpp/qps/histogram.h"
 #include "test/cpp/qps/qpstest.grpc.pb.h"
 
@@ -49,15 +51,14 @@ struct ScenarioResult {
   Histogram latencies;
   std::vector<ResourceUsage> client_resources;
   std::vector<ResourceUsage> server_resources;
+  ClientConfig client_config;
+  ServerConfig server_config;
 };
 
-ScenarioResult RunScenario(const grpc::testing::ClientConfig& client_config,
-                           size_t num_clients,
-                           const grpc::testing::ServerConfig& server_config,
-                           size_t num_servers,
-                           int warmup_seconds,
-                           int benchmark_seconds,
-                           int spawn_local_worker_count);
+std::unique_ptr<ScenarioResult> RunScenario(
+    const grpc::testing::ClientConfig& client_config, size_t num_clients,
+    const grpc::testing::ServerConfig& server_config, size_t num_servers,
+    int warmup_seconds, int benchmark_seconds, int spawn_local_worker_count);
 
 }  // namespace testing
 }  // namespace grpc
diff --git a/test/cpp/qps/qps_driver.cc b/test/cpp/qps/qps_driver.cc
index fc8e04201cd0f62e55e4009d33742cdeda60c0c0..f49cd38b33927a6b90e4a42fa0d417e2ea8cff51 100644
--- a/test/cpp/qps/qps_driver.cc
+++ b/test/cpp/qps/qps_driver.cc
@@ -103,14 +103,13 @@ int main(int argc, char** argv) {
                FLAGS_server_threads <  FLAGS_client_channels *
                FLAGS_outstanding_rpcs_per_channel));
 
-  auto result = RunScenario(client_config, FLAGS_num_clients,
-                            server_config, FLAGS_num_servers,
-                            FLAGS_warmup_seconds, FLAGS_benchmark_seconds,
-                            FLAGS_local_workers);
-
-  ReportQPSPerCore(result, server_config);
-  ReportLatency(result);
-  ReportTimes(result);
+  const auto result = RunScenario(
+      client_config, FLAGS_num_clients, server_config, FLAGS_num_servers,
+      FLAGS_warmup_seconds, FLAGS_benchmark_seconds, FLAGS_local_workers);
+
+  ReportQPSPerCore(*result, server_config);
+  ReportLatency(*result);
+  ReportTimes(*result);
 
   return 0;
 }
diff --git a/test/cpp/qps/qps_test.cc b/test/cpp/qps/qps_test.cc
index f567e4cf06104960c39c30d92cc089168c2bdf02..9a81d0fc90cd1c003cb1a37b77886ff9d9ccfee5 100644
--- a/test/cpp/qps/qps_test.cc
+++ b/test/cpp/qps/qps_test.cc
@@ -64,8 +64,8 @@ static void RunQPS() {
   const auto result =
       RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
 
-  ReportQPSPerCore(result, server_config);
-  ReportLatency(result);
+  ReportQPSPerCore(*result, server_config);
+  ReportLatency(*result);
 }
 
 }  // namespace testing
diff --git a/test/cpp/qps/qpstest.proto b/test/cpp/qps/qpstest.proto
index 1553ef5f07eac2a15120367a54a83e66dea53c6f..122a7df1ac98a7a248c0eb74943a20d4cbc656ba 100644
--- a/test/cpp/qps/qpstest.proto
+++ b/test/cpp/qps/qpstest.proto
@@ -102,6 +102,7 @@ message ClientConfig {
   // only for async client:
   optional int32 async_client_threads = 7;
   optional RpcType rpc_type = 8 [default=UNARY];
+  optional string host = 9;
 }
 
 // Request current stats
@@ -129,6 +130,7 @@ message ServerConfig {
   required ServerType server_type = 1;
   optional int32 threads = 2 [default=1];
   optional bool enable_ssl = 3 [default=false];
+  optional string host = 4;
 }
 
 message ServerArgs {
diff --git a/test/cpp/qps/sync_streaming_ping_pong_test.cc b/test/cpp/qps/sync_streaming_ping_pong_test.cc
index 48c7ff63e03bd1896dd691dcdd2e247947c2e5a5..218306846b50f8fa32e48a74064bf4af41a89788 100644
--- a/test/cpp/qps/sync_streaming_ping_pong_test.cc
+++ b/test/cpp/qps/sync_streaming_ping_pong_test.cc
@@ -63,8 +63,8 @@ static void RunSynchronousStreamingPingPong() {
   const auto result =
       RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
 
-  ReportQPS(result);
-  ReportLatency(result);
+  ReportQPS(*result);
+  ReportLatency(*result);
 }
 
 }  // namespace testing
diff --git a/test/cpp/qps/sync_unary_ping_pong_test.cc b/test/cpp/qps/sync_unary_ping_pong_test.cc
index 4c4de6377b8f22de244c707cf139983a86a30739..137ef79f2f815f4cb5c8610d1d9c1d9dc4a0e5b8 100644
--- a/test/cpp/qps/sync_unary_ping_pong_test.cc
+++ b/test/cpp/qps/sync_unary_ping_pong_test.cc
@@ -63,8 +63,8 @@ static void RunSynchronousUnaryPingPong() {
   const auto result =
       RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
 
-  ReportQPS(result);
-  ReportLatency(result);
+  ReportQPS(*result);
+  ReportLatency(*result);
 }
 
 }  // namespace testing