QPS, latencies recorded with authentication
diff --git a/test/cpp/qps/report.cc b/test/cpp/qps/report.cc
index e116175..b422988 100644
--- a/test/cpp/qps/report.cc
+++ b/test/cpp/qps/report.cc
@@ -35,6 +35,7 @@
 
 #include <grpc/support/log.h>
 #include "test/cpp/qps/stats.h"
+#include "user_data_client.h"
 
 namespace grpc {
 namespace testing {
@@ -120,5 +121,107 @@
                   [](ResourceUsage u) { return u.wall_time; }));
 }
 
+UserDataClient userDataClient(grpc::CreateChannel("localhost:50052", grpc::InsecureCredentials(),
+                          ChannelArguments()));
+
+//Leaderboard Reported implementation.
+void UserDatabaseReporter::ReportQPS(const ScenarioResult& result) const {
+  double qps = result.latencies.Count() /
+              average(result.client_resources,
+                      [](ResourceUsage u) { return u.wall_time; });
+
+  userDataClient.setAccessToken(access_token_);
+  userDataClient.setQPS(qps);
+  
+  int userDataState = userDataClient.sendDataIfReady();
+
+  switch(userDataState) {
+    case 1:
+      gpr_log(GPR_INFO, "Data sent to user database successfully");
+      break;
+    case -1:
+      gpr_log(GPR_INFO, "Data could not be sent to user database");
+      break;
+  }
+}
+
+void UserDatabaseReporter::ReportQPSPerCore(const ScenarioResult& result,
+                                      const ServerConfig& server_config) const {
+  double qps = result.latencies.Count() /
+              average(result.client_resources,
+                      [](ResourceUsage u) { return u.wall_time; });
+
+  double qpsPerCore = qps / server_config.threads();
+
+  userDataClient.setAccessToken(access_token_);
+  //TBD
+  userDataClient.setQPSPerCore(qpsPerCore);
+
+  int userDataState = userDataClient.sendDataIfReady();
+
+  switch(userDataState) {
+    case 1:
+      gpr_log(GPR_INFO, "Data sent to user database successfully");
+      break;
+    case -1:
+      gpr_log(GPR_INFO, "Data could not be sent to user database");
+      break;
+  }
+}
+
+void UserDatabaseReporter::ReportLatency(const ScenarioResult& result) const {
+  userDataClient.setAccessToken(access_token_);
+  userDataClient.setLatencies(result.latencies.Percentile(50) / 1000,
+                                 result.latencies.Percentile(90) / 1000,
+                                 result.latencies.Percentile(95) / 1000,
+                                 result.latencies.Percentile(99) / 1000,
+                                 result.latencies.Percentile(99.9) / 1000);
+  
+  int userDataState = userDataClient.sendDataIfReady();
+
+  switch(userDataState) {
+    case 1:
+      gpr_log(GPR_INFO, "Data sent to user database successfully");
+      break;
+    case -1:
+      gpr_log(GPR_INFO, "Data could not be sent to user database");
+      break;
+  }
+}
+
+void UserDatabaseReporter::ReportTimes(const ScenarioResult& result) const {
+  double serverSystemTime = 100.0 * sum(result.server_resources,
+                  [](ResourceUsage u) { return u.system_time; }) /
+                    sum(result.server_resources,
+                  [](ResourceUsage u) { return u.wall_time; });
+  double serverUserTime = 100.0 * sum(result.server_resources,
+                  [](ResourceUsage u) { return u.user_time; }) /
+                    sum(result.server_resources,
+                  [](ResourceUsage u) { return u.wall_time; });
+  double clientSystemTime = 100.0 * sum(result.client_resources,
+                  [](ResourceUsage u) { return u.system_time; }) /
+                    sum(result.client_resources,
+                  [](ResourceUsage u) { return u.wall_time; });
+  double clientUserTime = 100.0 * sum(result.client_resources,
+                  [](ResourceUsage u) { return u.user_time; }) /
+                    sum(result.client_resources,
+                  [](ResourceUsage u) { return u.wall_time; });
+
+  userDataClient.setAccessToken(access_token_);
+  userDataClient.setTimes(serverSystemTime, serverUserTime, 
+    clientSystemTime, clientUserTime);
+
+  int userDataState = userDataClient.sendDataIfReady();
+
+  switch(userDataState) {
+    case 1:
+      gpr_log(GPR_INFO, "Data sent to user database successfully");
+      break;
+    case -1:
+      gpr_log(GPR_INFO, "Data could not be sent to user database");
+      break;
+  }
+}
+
 }  // namespace testing
 }  // namespace grpc
diff --git a/test/cpp/qps/report.h b/test/cpp/qps/report.h
index 630275e..2e5b627 100644
--- a/test/cpp/qps/report.h
+++ b/test/cpp/qps/report.h
@@ -106,6 +106,20 @@
   void ReportTimes(const ScenarioResult& result) const GRPC_OVERRIDE;
 };
 
+/** Reporter for client leaderboard. */
+class UserDatabaseReporter : public Reporter {
+ public:
+  UserDatabaseReporter(const string& name, const string& access_token) : Reporter(name), access_token_(access_token) {}
+
+ private:
+  std::string access_token_;
+  void ReportQPS(const ScenarioResult& result) const GRPC_OVERRIDE;
+  void ReportQPSPerCore(const ScenarioResult& result,
+                        const ServerConfig& config) const GRPC_OVERRIDE;
+  void ReportLatency(const ScenarioResult& result) const GRPC_OVERRIDE;
+  void ReportTimes(const ScenarioResult& result) const GRPC_OVERRIDE;
+};
+
 }  // namespace testing
 }  // namespace grpc
 
diff --git a/test/cpp/qps/run_authenticated_test.sh b/test/cpp/qps/run_authenticated_test.sh
new file mode 100755
index 0000000..3cde649
--- /dev/null
+++ b/test/cpp/qps/run_authenticated_test.sh
@@ -0,0 +1,87 @@
+#!/bin/sh
+
+CLIENT_ID='1018396037782-tv81fshn76nemr24uuhuginceb9hni2m.apps.googleusercontent.com'
+CLIENT_SECRET='_HGHXg4DAA59r4w4x8p6ARzD'
+GRANT_TYPE='http://oauth.net/grant_type/device/1.0'
+ACCESS_TOKENS_DIR='/tmp/auth_lead_access_tokens'
+AUTH_TOKEN_LINK='https://www.googleapis.com/oauth2/v3/token'
+GOOGLE_ACCOUNTS_LINK='https://accounts.google.com/o/oauth2/device/code'
+USER_INFO_LINK='https://www.googleapis.com/oauth2/v1/userinfo'
+#Performs first time authentication
+#Or re-authentication if refresh token expires
+RE_AUTHENTICATE() {
+  INIT_AUTH_JSON=$(curl -s -d "client_id=$CLIENT_ID&scope=email profile" $GOOGLE_ACCOUNTS_LINK)
+
+  USER_CODE=$(echo $INIT_AUTH_JSON | jq .user_code | sed -e 's/^"//' -e 's/"$//')
+  echo 'Please use the following user code in the browser:' $USER_CODE
+  echo
+
+  VERIFICATION_URL=$(echo $INIT_AUTH_JSON | jq '.verification_url' | sed -e 's/^"//' -e 's/"$//')
+  echo 'Verification URL:' $VERIFICATION_URL
+  echo
+
+  xdg-open $VERIFICATION_URL
+
+  DEVICE_CODE=$(echo $INIT_AUTH_JSON | jq '.device_code' | sed -e 's/^"//' -e 's/"$//')
+  INTERVAL=$(echo $INIT_AUTH_JSON | jq '.interval' | sed -e 's/^"//' -e 's/"$//')
+
+  AUTH_JSON=$(curl -s -d "client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET&code=$DEVICE_CODE&grant_type=$GRANT_TYPE" $AUTH_TOKEN_LINK)
+  ACCESS_TOKEN=$(echo $AUTH_JSON | jq '.access_token' | sed -e 's/^"//' -e 's/"$//')
+
+  while [ $ACCESS_TOKEN == 'null' ]
+  do
+    sleep $INTERVAL
+    AUTH_JSON=$(curl -s -d "client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET&code=$DEVICE_CODE&grant_type=$GRANT_TYPE" $AUTH_TOKEN_LINK)
+    ACCESS_TOKEN=$(echo $AUTH_JSON | jq '.access_token' | sed -e 's/^"//' -e 's/"$//')
+  done
+
+  USER_DETAILS=$(curl -s $USER_INFO_LINK?access_token=$ACCESS_TOKEN)
+  USER_ID=$(echo $USER_DETAILS | jq '.email' | sed -e 's/^"//' -e 's/"$//' | awk -F"@" '{print $1}' | sed -e 's/\.//g' | awk '{print tolower($0)}')
+  echo $AUTH_JSON > $ACCESS_TOKENS_DIR/$USER_ID
+}
+
+#Use existing access token
+USE_ACCESS_TOKEN() {
+  ACCESS_TOKEN=$(jq '.access_token' $ACCESS_TOKENS_DIR/$USER_ID | sed -e 's/^"//' -e 's/"$//')
+
+  USER_DETAILS=$(curl -s $USER_INFO_LINK?access_token=$ACCESS_TOKEN)
+
+  ID=$(echo $USER_DETAILS | jq '.id' | sed -e 's/^"//' -e 's/"$//')
+
+  if [ $ID == 'null' ]; then
+    REFRESH_ACCESS_TOKEN
+  fi
+}
+
+#Obtain new access token using refresh token
+REFRESH_ACCESS_TOKEN() {
+  REFRESH_TOKEN=$(jq '.refresh_token' $ACCESS_TOKENS_DIR/$USER_ID | sed -e 's/^"//' -e 's/"$//')
+  if [ $REFRESH_TOKEN == 'null' ]; then
+    RE_AUTHENTICATE
+  else
+    REFRESH_JSON=$(curl -s -d "refresh_token=$REFRESH_TOKEN&client_id=$CLIENT_ID&client_secret=$CLIENT_SECRET&grant_type=refresh_token" $AUTH_TOKEN_LINK)
+    
+    ACCESS_TOKEN=$(echo $REFRESH_JSON | jq '.access_token')
+    if [ $ACCESS_TOKEN == 'null' ]; then
+      RE_AUTHENTICATE
+    else
+      NEW_AUTH_JSON=$(jq ".access_token=$ACCESS_TOKEN" $ACCESS_TOKENS_DIR/$USER_ID)
+      echo $NEW_AUTH_JSON > $ACCESS_TOKENS_DIR/$USER_ID
+    fi
+  fi
+}
+
+#create directory to store tokens, if not already present
+[ ! -d $ACCESS_TOKENS_DIR ] && mkdir $ACCESS_TOKENS_DIR
+
+#Convert user entered email id to unique string by converting to splitting on '@' symbol, if present,
+#removing '.'s and converting to lowercase
+USER_ID=$(echo $2 | awk -F"@" '{print $1}' | sed -e 's/\.//g' | awk '{print tolower($0)}')
+
+if [ -s $ACCESS_TOKENS_DIR/$USER_ID ]; then
+  USE_ACCESS_TOKEN
+else
+  RE_AUTHENTICATE
+fi
+
+./$1 --access_token=$ACCESS_TOKEN
\ No newline at end of file
diff --git a/test/cpp/qps/user_data.proto b/test/cpp/qps/user_data.proto
new file mode 100644
index 0000000..9c941ca
--- /dev/null
+++ b/test/cpp/qps/user_data.proto
@@ -0,0 +1,99 @@
+// Copyright 2015, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto2";
+
+package UserData;
+
+service UserDataTransfer {
+  // Sends client info
+  rpc RecordSingleClientData (SingleUserRecordRequest) returns (SingleUserRecordReply) {}
+
+  rpc RetrieveSingleUserData (SingleUserRetrieveRequest) returns (SingleUserRetrieveReply) {}
+
+  rpc RetrieveAllUsersData (AllUsersRetrieveRequest) returns (AllUsersRetrieveReply) {}
+}
+
+//Metrics to be stored
+message Metrics {
+  required double qps = 1;
+  required double perc_lat_50 = 2;
+  required double perc_lat_90 = 3;
+  required double perc_lat_95 = 4;
+  required double perc_lat_99 = 5;
+  required double perc_lat_99_point_9 = 6;
+}
+
+//Timestamped details
+message DataDetails {
+  required string timestamp = 1;
+  required Metrics metrics = 2;
+}
+
+//User details
+message UserDetails {
+  required string id = 1;
+  required string name = 2;
+  required string link = 3;
+}
+
+//Stored to database
+message SingleUserDetails {
+  repeated DataDetails data_details = 1;
+  required UserDetails user_details = 2;
+}
+
+//Request for storing a single user's data
+message SingleUserRecordRequest {
+  required string access_token = 1;
+  required Metrics metrics = 2;
+}
+
+//Reply to request for storing single user's data
+message SingleUserRecordReply {
+}
+
+//Request for retrieving single user's data
+message SingleUserRetrieveRequest {
+  required string client_id = 1;
+}
+
+//Reply for request to retrieve single user's data
+message SingleUserRetrieveReply {
+  required SingleUserDetails details = 1;
+}
+
+//Request for retrieving all users' data
+message AllUsersRetrieveReply {
+  repeated SingleUserDetails user_data = 1;
+}
+
+//Reply to request for retrieving all users' data
+message AllUsersRetrieveRequest {
+}
\ No newline at end of file
diff --git a/test/cpp/qps/user_data_client.cc b/test/cpp/qps/user_data_client.cc
new file mode 100644
index 0000000..20ce6d9
--- /dev/null
+++ b/test/cpp/qps/user_data_client.cc
@@ -0,0 +1,100 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "user_data_client.h"
+
+void UserDataClient::setAccessToken(std::string access_token) {
+  access_token_ = access_token;
+}
+
+void UserDataClient::setQPS(double QPS) {
+  QPS_ = QPS;
+  qpsSet = true;
+}
+
+void UserDataClient::setQPSPerCore(double qpsPerCore) {
+  //TBD
+}
+
+void UserDataClient::setLatencies(double percentileLatency50, double percentileLatency90,
+    double percentileLatency95, double percentileLatency99, double percentileLatency99Point9) {
+  percentileLatency50_ = percentileLatency50;
+  percentileLatency90_ = percentileLatency90;
+  percentileLatency95_ = percentileLatency95;
+  percentileLatency99_ = percentileLatency99;
+  percentileLatency99Point9_ = percentileLatency99Point9;
+
+  latenciesSet = true;
+}
+
+void UserDataClient::setTimes(double serverSystemTime, double serverUserTime, 
+    double clientSystemTime, double clientUserTime) {
+  //TBD
+}
+
+int UserDataClient::sendDataIfReady() {
+  if(!(qpsSet && latenciesSet))
+    return 0;
+
+  SingleUserRecordRequest singleUserRecordRequest;
+  singleUserRecordRequest.set_access_token(access_token_);
+  
+  Metrics* metrics = singleUserRecordRequest.mutable_metrics();
+  metrics->set_qps(QPS_);
+  metrics->set_perc_lat_50(percentileLatency50_);
+  metrics->set_perc_lat_90(percentileLatency90_);
+  metrics->set_perc_lat_95(percentileLatency95_);
+  metrics->set_perc_lat_99(percentileLatency99_);
+  metrics->set_perc_lat_99_point_9(percentileLatency99Point9_);
+
+  SingleUserRecordReply singleUserRecordReply;
+  ClientContext context;
+
+  Status status = stub_->RecordSingleClientData(&context, singleUserRecordRequest, &singleUserRecordReply);
+  if (status.IsOk()) {
+    return 1;
+  } else {
+    return -1;
+  }
+}
+
+// Get current date/time, format is YYYY-MM-DD.HH:mm:ss
+const std::string currentDateTime() {
+    time_t     now = time(0);
+    struct tm  tstruct;
+    char       buf[80];
+    tstruct = *localtime(&now);
+
+    strftime(buf, sizeof(buf), "%Y/%m/%d, %X", &tstruct);
+    return buf;
+}
\ No newline at end of file
diff --git a/test/cpp/qps/user_data_client.h b/test/cpp/qps/user_data_client.h
new file mode 100644
index 0000000..ec3dcb5
--- /dev/null
+++ b/test/cpp/qps/user_data_client.h
@@ -0,0 +1,88 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <iostream>
+#include <memory>
+#include <string>
+
+#include <grpc/grpc.h>
+#include <grpc++/channel_arguments.h>
+#include <grpc++/channel_interface.h>
+#include <grpc++/client_context.h>
+#include <grpc++/create_channel.h>
+#include <grpc++/credentials.h>
+#include <grpc++/status.h>
+#include "test/cpp/qps/user_data.grpc.pb.h"
+
+using grpc::ChannelArguments;
+using grpc::ChannelInterface;
+using grpc::ClientContext;
+using grpc::Status;
+using UserData::UserDataTransfer;
+using UserData::Metrics;
+using UserData::SingleUserRecordRequest;
+using UserData::SingleUserRecordReply;
+
+class UserDataClient {
+ public:
+  UserDataClient(std::shared_ptr<ChannelInterface> channel)
+    : stub_(UserDataTransfer::NewStub(channel)) {}
+  
+  ~UserDataClient() {}
+
+  void setAccessToken(std::string access_token);
+  
+  void setQPS(double QPS);
+
+  void setQPSPerCore(double qpsPerCore);
+
+  void setLatencies(double percentileLatency50, double percentileLatency90,
+     double percentileLatency95, double percentileLatency99, double percentileLatency99Point9);
+
+  void setTimes(double serverSystemTime, double serverUserTime, 
+    double clientSystemTime, double clientUserTime);
+
+  int sendDataIfReady();
+
+ private:
+  std::unique_ptr<UserDataTransfer::Stub> stub_;
+  std::string access_token_;
+  double QPS_;
+  double percentileLatency50_;
+  double percentileLatency90_;
+  double percentileLatency95_;
+  double percentileLatency99_;
+  double percentileLatency99Point9_;
+  bool qpsSet = false;
+  bool latenciesSet = false;
+};
\ No newline at end of file
diff --git a/test/cpp/util/benchmark_config.cc b/test/cpp/util/benchmark_config.cc
index 5b3c1da..b688224 100644
--- a/test/cpp/util/benchmark_config.cc
+++ b/test/cpp/util/benchmark_config.cc
@@ -37,6 +37,8 @@
 DEFINE_bool(enable_log_reporter, true,
             "Enable reporting of benchmark results through GprLog");
 
+DEFINE_string(access_token, "", "Authorizing JSON string for leaderboard");
+
 // In some distros, gflags is in the namespace google, and in some others,
 // in gflags. This hack is enabling us to find both.
 namespace google {}
@@ -57,6 +59,10 @@
     composite_reporter->add(
         std::unique_ptr<Reporter>(new GprLogReporter("LogReporter")));
   }
+  if(!FLAGS_access_token.empty())
+    composite_reporter->add(
+      std::unique_ptr<Reporter>(new UserDatabaseReporter("UserDataReporter", FLAGS_access_token)));
+
   return std::shared_ptr<Reporter>(composite_reporter);
 }