diff --git a/cpp/route_guide/Makefile b/cpp/route_guide/Makefile
index fae9a9d284afc5d1b77fca377ff3c90ae9abb7c0..131956296cb7681447ccb79730b51fbb229fd2e4 100644
--- a/cpp/route_guide/Makefile
+++ b/cpp/route_guide/Makefile
@@ -43,10 +43,10 @@ vpath %.proto $(PROTOS_PATH)
 
 all: system-check route_guide_client route_guide_server
 
-route_guide_client: route_guide.pb.o route_guide_client.o
+route_guide_client: route_guide.pb.o route_guide_client.o helper.o
 	$(CXX) $^ $(LDFLAGS) -o $@
 
-route_guide_server: route_guide.pb.o route_guide_server.o
+route_guide_server: route_guide.pb.o route_guide_server.o helper.o
 	$(CXX) $^ $(LDFLAGS) -o $@
 
 %.pb.cc: %.proto
diff --git a/cpp/route_guide/helper.cc b/cpp/route_guide/helper.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a4be8bfc6c65ff268c61e77c7998529d80c1e372
--- /dev/null
+++ b/cpp/route_guide/helper.cc
@@ -0,0 +1,73 @@
+/*
+ *
+ * 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 <fstream>
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+#include "route_guide.pb.h"
+
+namespace examples {
+
+std::string GetDbFileContent(int argc, char** argv) {
+  std::string db_path;
+  std::string arg_str("--db_path");
+  if (argc > 1) {
+    std::string argv_1 = argv[1];
+    size_t start_position = argv_1.find(arg_str);
+    if (start_position != std::string::npos) {
+      start_position += arg_str.size();
+      if (argv_1[start_position] == ' ' ||
+          argv_1[start_position] == '=') {
+        db_path = argv_1.substr(start_position + 1);
+      }
+    }
+  }
+  std::ifstream db_file(db_path);
+  if (!db_file.is_open()) {
+    std::cout << "Failed to open " << db_path << std::endl;
+    return "";
+  }
+  std::stringstream db;
+  db << db_file.rdbuf();
+  return db.str();
+}
+
+void ParseDb(const std::string& db, std::vector<Feature>* feature_list) {
+
+}
+
+
+}  // namespace examples
+
diff --git a/cpp/route_guide/helper.h b/cpp/route_guide/helper.h
new file mode 100644
index 0000000000000000000000000000000000000000..65c93c1d3477169c7f16893540848f213367211c
--- /dev/null
+++ b/cpp/route_guide/helper.h
@@ -0,0 +1,50 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#ifndef GRPC_COMMON_CPP_ROUTE_GUIDE_HELPER_H_
+#define GRPC_COMMON_CPP_ROUTE_GUIDE_HELPER_H_
+
+#include <string>
+#include <vector>
+
+namespace examples {
+class Feature;
+
+std::string GetDbFileContent(int argc, char** argv);
+
+void ParseDb(const std::string& db, std::vector<Feature>* feature_list);
+
+}  // namespace examples
+
+#endif  // GRPC_COMMON_CPP_ROUTE_GUIDE_HELPER_H_
+
diff --git a/cpp/route_guide/route_guide_client.cc b/cpp/route_guide/route_guide_client.cc
index 8b4a53232712400565fa67f564d1b75ae9a080c0..fd3d98e30af3d672e7dfcb6b35c340a35e2ea78f 100644
--- a/cpp/route_guide/route_guide_client.cc
+++ b/cpp/route_guide/route_guide_client.cc
@@ -32,11 +32,9 @@
  */
 
 #include <chrono>
-#include <fstream>
 #include <iostream>
 #include <memory>
 #include <random>
-#include <sstream>
 #include <string>
 #include <thread>
 
@@ -47,6 +45,7 @@
 #include <grpc++/create_channel.h>
 #include <grpc++/status.h>
 #include <grpc++/stream.h>
+#include "helper.h"
 #include "route_guide.pb.h"
 
 using grpc::ChannelArguments;
@@ -86,23 +85,6 @@ RouteNote MakeRouteNote(const std::string& message,
   return n;
 }
 
-bool ParseDb(const std::string& stream, std::vector<Feature>* feature_list) {
-  // TODO
-}
-
-void FillFeatureList(const std::string& db_path, std::vector<Feature>* feature_list) {
-  if (db_path.empty()) {
-    return;
-  }
-  std::ifstream db_file(db_path);
-  if (!db_file.is_open()) {
-    std::cout << "Failed to open " << db_path << std::endl;
-  }
-  std::stringstream db;
-  db << db_file.rdbuf();
-  ParseDb(db.str(), feature_list);
-}
-
 class RouteGuideClient {
  public:
   RouteGuideClient(std::shared_ptr<ChannelInterface> channel)
@@ -219,8 +201,8 @@ class RouteGuideClient {
 
   void Shutdown() { stub_.reset(); }
 
-  void FillFeatureList(const std::string& db_path) {
-    ::FillFeatureList(db_path, &feature_list_);
+  void FillFeatureList(const std::string& db) {
+    examples::ParseDb(db, &feature_list_);
   }
 
  private:
@@ -258,20 +240,8 @@ int main(int argc, char** argv) {
 
   RouteGuideClient guide(
       grpc::CreateChannel("localhost:50051", ChannelArguments()));
-  std::string db_path;
-  std::string arg_str("--db_path");
-  if (argc > 1) {
-    std::string argv_1 = argv[1];
-    size_t start_position = argv_1.find(arg_str);
-    if (start_position != std::string::npos) {
-      start_position += arg_str.size();
-      if (argv_1[start_position] == ' ' ||
-          argv_1[start_position] == '=') {
-        db_path = argv_1.substr(start_position + 1);
-      }
-    }
-  }
-  guide.FillFeatureList(db_path);
+  std::string db = examples::GetDbFileContent(argc, argv);
+  guide.FillFeatureList(db);
 
   guide.GetFeature();
   guide.ListFeatures();
diff --git a/cpp/route_guide/route_guide_server.cc b/cpp/route_guide/route_guide_server.cc
index d4ecded69ba99ed4050dcf53a1026fbbb8f320fa..38cd64be945a118c4ca83c73ab4ca2e715a77da0 100644
--- a/cpp/route_guide/route_guide_server.cc
+++ b/cpp/route_guide/route_guide_server.cc
@@ -34,10 +34,8 @@
 #include <algorithm>
 #include <chrono>
 #include <cmath>
-#include <fstream>
 #include <iostream>
 #include <memory>
-#include <sstream>
 #include <string>
 #include <thread>
 
@@ -47,6 +45,7 @@
 #include <grpc++/server_context.h>
 #include <grpc++/status.h>
 #include <grpc++/stream.h>
+#include "helper.h"
 #include "route_guide.pb.h"
 
 using grpc::Server;
@@ -64,18 +63,13 @@ using examples::RouteNote;
 using examples::RouteGuide;
 using std::chrono::system_clock;
 
-const float kCoordFactor = 10000000.0;
-
-bool ParseDb(const std::string& stream, std::vector<Feature>* feature_list) {
-  // TODO
-}
 
 float ConvertToRadians(float num) {
   return num * 3.1415926 /180;
 }
 
 float GetDistance(const Point& start, const Point& end) {
-
+  const float kCoordFactor = 10000000.0;
   float lat_1 = start.latitude() / kCoordFactor;
   float lat_2 = end.latitude() / kCoordFactor;
   float lon_1 = start.longitude() / kCoordFactor;
@@ -93,19 +87,6 @@ float GetDistance(const Point& start, const Point& end) {
   return R * c;
 }
 
-void FillFeatureList(const std::string& db_path, std::vector<Feature>* feature_list) {
-  if (db_path.empty()) {
-    return;
-  }
-  std::ifstream db_file(db_path);
-  if (!db_file.is_open()) {
-    std::cout << "Failed to open " << db_path << std::endl;
-  }
-  std::stringstream db;
-  db << db_file.rdbuf();
-  ParseDb(db.str(), feature_list);
-}
-
 std::string GetFeatureName(const Point& point,
                            const std::vector<Feature>& feature_list) {
   for (const Feature& f : feature_list) {
@@ -119,8 +100,8 @@ std::string GetFeatureName(const Point& point,
 
 class RouteGuideImpl final : public RouteGuide::Service {
  public:
-  RouteGuideImpl(const std::string& db_path) {
-    FillFeatureList(db_path, &feature_list_);
+  RouteGuideImpl(const std::string& db) {
+    examples::ParseDb(db, &feature_list_);
   }
 
   Status GetFeature(ServerContext* context, const Point* point,
@@ -218,20 +199,8 @@ void RunServer(const std::string& db_path) {
 int main(int argc, char** argv) {
   grpc_init();
 
-  std::string db_path;
-  std::string arg_str("--db_path");
-  if (argc > 1) {
-    std::string argv_1 = argv[1];
-    size_t start_position = argv_1.find(arg_str);
-    if (start_position != std::string::npos) {
-      start_position += arg_str.size();
-      if (argv_1[start_position] == ' ' ||
-          argv_1[start_position] == '=') {
-        db_path = argv_1.substr(start_position + 1);
-      }
-    }
-  }
-  RunServer(db_path);
+  std::string db = examples::GetDbFileContent(argc, argv);
+  RunServer(db);
 
   grpc_shutdown();
   return 0;