From 3597f9e130fe3b03bafb4b546b280ee0f85a8c82 Mon Sep 17 00:00:00 2001
From: Daniel Lyubomirov <daniel.lyubomirov@vereign.com>
Date: Fri, 22 May 2020 11:17:23 +0300
Subject: [PATCH] [18] gRPC and vereign services code generation

---
 cpp/proto                                     |   2 +-
 cpp/src/CMakeLists.txt                        |  25 +-
 cpp/src/vereign/grpc/gen/action_api.hh        |  77 +++
 cpp/src/vereign/grpc/gen/activity_api.hh      |  55 ++
 cpp/src/vereign/grpc/gen/company_api.hh       | 517 +++++++++++++++++
 cpp/src/vereign/grpc/gen/contacts_api.hh      | 121 ++++
 cpp/src/vereign/grpc/gen/conversation_api.hh  | 121 ++++
 cpp/src/vereign/grpc/gen/delete_api.hh        |  77 +++
 cpp/src/vereign/grpc/gen/document_api.hh      | 275 +++++++++
 cpp/src/vereign/grpc/gen/email_api.hh         | 231 ++++++++
 cpp/src/vereign/grpc/gen/entity_api.hh        | 517 +++++++++++++++++
 cpp/src/vereign/grpc/gen/event_api.hh         |  55 ++
 cpp/src/vereign/grpc/gen/ews_api.hh           |  55 ++
 cpp/src/vereign/grpc/gen/gen.cc               |  37 ++
 cpp/src/vereign/grpc/gen/gen.hh               |  38 +-
 cpp/src/vereign/grpc/gen/identity_api.hh      | 385 ++++++++++++
 cpp/src/vereign/grpc/gen/interactions_api.hh  |  55 ++
 cpp/src/vereign/grpc/gen/orders_api.hh        | 143 +++++
 cpp/src/vereign/grpc/gen/passport_api.hh      | 333 +++++++++++
 cpp/src/vereign/grpc/gen/reporting_api.hh     |  77 +++
 cpp/src/vereign/grpc/gen/resource_api.hh      |  77 +++
 cpp/src/vereign/grpc/gen/sharing_api.hh       | 165 ++++++
 cpp/src/vereign/grpc/gen/sign_api.hh          | 165 ++++++
 cpp/src/vereign/grpc/passport_api.hh          |   3 +
 cpp/src/vereign/grpc/server.cc                |  28 +-
 cpp/src/vereign/grpc/server.hh                |   7 +-
 cpp/src/vereign/grpc/service_registry.cc      |  13 +
 cpp/src/vereign/grpc/service_registry.hh      |  36 ++
 cpp/src/vereign/restapi/detail/post_task.hh   |  14 +-
 cpp/src/vereign/service/gen/action_service.cc |  45 ++
 cpp/src/vereign/service/gen/action_service.hh |  57 ++
 .../vereign/service/gen/activity_service.cc   |  32 +
 .../vereign/service/gen/activity_service.hh   |  48 ++
 .../vereign/service/gen/company_service.cc    | 305 ++++++++++
 .../vereign/service/gen/company_service.hh    | 237 ++++++++
 .../vereign/service/gen/contacts_service.cc   |  71 +++
 .../vereign/service/gen/contacts_service.hh   |  75 +++
 .../service/gen/conversation_service.cc       |  71 +++
 .../service/gen/conversation_service.hh       |  75 +++
 cpp/src/vereign/service/gen/delete_service.cc |  45 ++
 cpp/src/vereign/service/gen/delete_service.hh |  57 ++
 .../vereign/service/gen/document_service.cc   | 162 ++++++
 .../vereign/service/gen/document_service.hh   | 138 +++++
 cpp/src/vereign/service/gen/email_service.cc  | 136 +++++
 cpp/src/vereign/service/gen/email_service.hh  | 120 ++++
 cpp/src/vereign/service/gen/entity_service.cc | 305 ++++++++++
 cpp/src/vereign/service/gen/entity_service.hh | 237 ++++++++
 cpp/src/vereign/service/gen/event_service.cc  |  32 +
 cpp/src/vereign/service/gen/event_service.hh  |  48 ++
 cpp/src/vereign/service/gen/ews_service.cc    |  32 +
 cpp/src/vereign/service/gen/ews_service.hh    |  48 ++
 cpp/src/vereign/service/gen/gen.hh            |  21 +-
 .../vereign/service/gen/identity_service.cc   | 227 ++++++++
 .../vereign/service/gen/identity_service.hh   | 183 ++++++
 .../service/gen/interactions_service.cc       |  32 +
 .../service/gen/interactions_service.hh       |  48 ++
 cpp/src/vereign/service/gen/orders_service.cc |  84 +++
 cpp/src/vereign/service/gen/orders_service.hh |  84 +++
 .../vereign/service/gen/passport_service.cc   | 194 +++++++
 .../vereign/service/gen/passport_service.hh   | 137 ++++-
 .../vereign/service/gen/reporting_service.cc  |  45 ++
 .../vereign/service/gen/reporting_service.hh  |  57 ++
 .../vereign/service/gen/resource_service.cc   |  45 ++
 .../vereign/service/gen/resource_service.hh   |  57 ++
 .../vereign/service/gen/sharing_service.cc    |  97 ++++
 .../vereign/service/gen/sharing_service.hh    |  93 +++
 cpp/src/vereign/service/gen/sign_service.cc   |  97 ++++
 cpp/src/vereign/service/gen/sign_service.hh   |  93 +++
 cpp/src/vereign/service/passport_service.hh   |   2 +-
 .../vereign/grpc/gen/++service++_api.hh.tmpl  |  60 ++
 cpp/templates/vereign/grpc/gen/gen.cc.tmpl    |  21 +
 cpp/templates/vereign/grpc/gen/gen.hh.tmpl    |  25 +
 .../service/gen/++service++_service.cc.tmpl   |  39 ++
 .../service/gen/++service++_service.hh.tmpl   |  53 ++
 cpp/templates/vereign/service/gen/gen.hh.tmpl |   8 +
 cpp/tests/protobuf/CMakeLists.txt             |   8 -
 cpp/tests/protobuf/json_test.cc               |  82 ++-
 cpp/tests/protobuf/proto/messages.proto       |   9 +
 cpp/tests/protobuf/testpb/messages.pb.cc      | 546 +++++++++++++++++-
 cpp/tests/protobuf/testpb/messages.pb.h       | 477 ++++++++++++++-
 cpp/tests/vereign/grpc/server_test.cc         |  17 +
 .../vereign/restapi/client_session_test.cc    |   2 +-
 .../service/gen/passport_service_test.cc      |   2 +-
 83 files changed, 8943 insertions(+), 82 deletions(-)
 create mode 100644 cpp/src/vereign/grpc/gen/action_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/activity_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/company_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/contacts_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/conversation_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/delete_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/document_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/email_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/entity_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/event_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/ews_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/gen.cc
 create mode 100644 cpp/src/vereign/grpc/gen/identity_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/interactions_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/orders_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/reporting_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/resource_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/sharing_api.hh
 create mode 100644 cpp/src/vereign/grpc/gen/sign_api.hh
 create mode 100644 cpp/src/vereign/grpc/service_registry.cc
 create mode 100644 cpp/src/vereign/grpc/service_registry.hh
 create mode 100644 cpp/src/vereign/service/gen/action_service.cc
 create mode 100644 cpp/src/vereign/service/gen/action_service.hh
 create mode 100644 cpp/src/vereign/service/gen/activity_service.cc
 create mode 100644 cpp/src/vereign/service/gen/activity_service.hh
 create mode 100644 cpp/src/vereign/service/gen/company_service.cc
 create mode 100644 cpp/src/vereign/service/gen/company_service.hh
 create mode 100644 cpp/src/vereign/service/gen/contacts_service.cc
 create mode 100644 cpp/src/vereign/service/gen/contacts_service.hh
 create mode 100644 cpp/src/vereign/service/gen/conversation_service.cc
 create mode 100644 cpp/src/vereign/service/gen/conversation_service.hh
 create mode 100644 cpp/src/vereign/service/gen/delete_service.cc
 create mode 100644 cpp/src/vereign/service/gen/delete_service.hh
 create mode 100644 cpp/src/vereign/service/gen/document_service.cc
 create mode 100644 cpp/src/vereign/service/gen/document_service.hh
 create mode 100644 cpp/src/vereign/service/gen/email_service.cc
 create mode 100644 cpp/src/vereign/service/gen/email_service.hh
 create mode 100644 cpp/src/vereign/service/gen/entity_service.cc
 create mode 100644 cpp/src/vereign/service/gen/entity_service.hh
 create mode 100644 cpp/src/vereign/service/gen/event_service.cc
 create mode 100644 cpp/src/vereign/service/gen/event_service.hh
 create mode 100644 cpp/src/vereign/service/gen/ews_service.cc
 create mode 100644 cpp/src/vereign/service/gen/ews_service.hh
 create mode 100644 cpp/src/vereign/service/gen/identity_service.cc
 create mode 100644 cpp/src/vereign/service/gen/identity_service.hh
 create mode 100644 cpp/src/vereign/service/gen/interactions_service.cc
 create mode 100644 cpp/src/vereign/service/gen/interactions_service.hh
 create mode 100644 cpp/src/vereign/service/gen/orders_service.cc
 create mode 100644 cpp/src/vereign/service/gen/orders_service.hh
 create mode 100644 cpp/src/vereign/service/gen/reporting_service.cc
 create mode 100644 cpp/src/vereign/service/gen/reporting_service.hh
 create mode 100644 cpp/src/vereign/service/gen/resource_service.cc
 create mode 100644 cpp/src/vereign/service/gen/resource_service.hh
 create mode 100644 cpp/src/vereign/service/gen/sharing_service.cc
 create mode 100644 cpp/src/vereign/service/gen/sharing_service.hh
 create mode 100644 cpp/src/vereign/service/gen/sign_service.cc
 create mode 100644 cpp/src/vereign/service/gen/sign_service.hh
 create mode 100644 cpp/templates/vereign/grpc/gen/++service++_api.hh.tmpl
 create mode 100644 cpp/templates/vereign/grpc/gen/gen.cc.tmpl
 create mode 100644 cpp/templates/vereign/grpc/gen/gen.hh.tmpl
 create mode 100644 cpp/templates/vereign/service/gen/++service++_service.cc.tmpl
 create mode 100644 cpp/templates/vereign/service/gen/++service++_service.hh.tmpl
 create mode 100644 cpp/templates/vereign/service/gen/gen.hh.tmpl

diff --git a/cpp/proto b/cpp/proto
index 910d2c3..37be183 160000
--- a/cpp/proto
+++ b/cpp/proto
@@ -1 +1 @@
-Subproject commit 910d2c372559e31a0f0df6a6e7048e4256d02028
+Subproject commit 37be183be5f248ada04ba58ca72784e0fe1d63d3
diff --git a/cpp/src/CMakeLists.txt b/cpp/src/CMakeLists.txt
index 4f3b7b0..1c7b906 100644
--- a/cpp/src/CMakeLists.txt
+++ b/cpp/src/CMakeLists.txt
@@ -16,8 +16,14 @@ list(APPEND PROTO_SRC
   ${CMAKE_SOURCE_DIR}/proto/cpp/google/api/annotations.pb.cc
   ${CMAKE_SOURCE_DIR}/proto/cpp/google/api/http.pb.cc
 
-  ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/entities-management-agent/api/api.pb.cc
   ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/versions/api/api.pb.cc
+  ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/audit-log-agent/api/api.pb.cc
+  ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/entities-management-agent/api/api.pb.cc
+  ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/hyperledger-agent/api/api.pb.cc
+  ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/image-storage-agent/api/api.pb.cc
+  ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/restful-api/api/api.pb.cc
+  ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/signing-service-agent/api/api.pb.cc
+  ${CMAKE_SOURCE_DIR}/proto/cpp/code.vereign.com/code/viam-apis/passport-generation-agent/api/api.pb.cc
 )
 add_library(vereignproto STATIC ${PROTO_SRC})
 
@@ -30,15 +36,19 @@ target_link_libraries(
   $<$<CXX_COMPILER_ID:MSVC>:CRYPT32.LIB>
 )
 
-set(vereignlib_src
+set(VEREIGNLIB_SRC
   vereign/restapi/detail/http_reader.cc
   vereign/restapi/client.cc
-  vereign/service/gen/passport_service.cc
+  vereign/grpc/gen/gen.cc
+  vereign/grpc/service_registry.cc
   vereign/grpc/server.cc
   vereign/service/passport_service.cc
 )
 
-add_library(vereignlib STATIC ${vereignlib_src})
+file(GLOB GENERATED_SERVICES_SRC vereign/service/gen/*.cc)
+list(APPEND VEREIGNLIB_SRC ${GENERATED_SERVICES_SRC})
+
+add_library(vereignlib STATIC ${VEREIGNLIB_SRC})
 target_link_libraries(
   vereignlib
   vereignproto
@@ -62,3 +72,10 @@ target_link_libraries(csandbox
   OpenSSL::SSL
   $<$<CXX_COMPILER_ID:MSVC>:CRYPT32.LIB>
 )
+
+# Generates the gRPC and Vereign services source code.
+add_custom_target(
+  vcl-gen
+  COMMAND vcl-gen generate --templates-path=templates --output-path src
+  WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+)
diff --git a/cpp/src/vereign/grpc/gen/action_api.hh b/cpp/src/vereign/grpc/gen/action_api.hh
new file mode 100644
index 0000000..22d5f90
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/action_api.hh
@@ -0,0 +1,77 @@
+#ifndef __VEREIGN_GRPC_GEN_ACTION_API_HH
+#define __VEREIGN_GRPC_GEN_ACTION_API_HH
+
+#include <vereign/client_library/action_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class ActionAPI : public client_library::ActionAPI::Service {
+public:
+  static constexpr const char* Name = "action";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  ActionAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  ActionAPI(const ActionAPI&) = delete;
+  ActionAPI& operator=(const ActionAPI&) = delete;
+
+  ::grpc::Status GetActions(
+    ::grpc::ServerContext*,
+    const client_library::GetActionsForm* request,
+    client_library::GetActionsFormResponse* response
+  ) override {
+    auto result_future = service_->GetActions(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetActionsWithoutSession(
+    ::grpc::ServerContext*,
+    const client_library::GetActionsForm* request,
+    client_library::GetActionsFormResponse* response
+  ) override {
+    auto result_future = service_->GetActionsWithoutSession(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_ACTION_API_HH
diff --git a/cpp/src/vereign/grpc/gen/activity_api.hh b/cpp/src/vereign/grpc/gen/activity_api.hh
new file mode 100644
index 0000000..c35dbb0
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/activity_api.hh
@@ -0,0 +1,55 @@
+#ifndef __VEREIGN_GRPC_GEN_ACTIVITY_API_HH
+#define __VEREIGN_GRPC_GEN_ACTIVITY_API_HH
+
+#include <vereign/client_library/activity_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class ActivityAPI : public client_library::ActivityAPI::Service {
+public:
+  static constexpr const char* Name = "activity";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  ActivityAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  ActivityAPI(const ActivityAPI&) = delete;
+  ActivityAPI& operator=(const ActivityAPI&) = delete;
+
+  ::grpc::Status GetActivity(
+    ::grpc::ServerContext*,
+    const client_library::GetActivityForm* request,
+    client_library::GetActivityFormResponse* response
+  ) override {
+    auto result_future = service_->GetActivity(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_ACTIVITY_API_HH
diff --git a/cpp/src/vereign/grpc/gen/company_api.hh b/cpp/src/vereign/grpc/gen/company_api.hh
new file mode 100644
index 0000000..0dcb8ae
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/company_api.hh
@@ -0,0 +1,517 @@
+#ifndef __VEREIGN_GRPC_GEN_COMPANY_API_HH
+#define __VEREIGN_GRPC_GEN_COMPANY_API_HH
+
+#include <vereign/client_library/company_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class CompanyAPI : public client_library::CompanyAPI::Service {
+public:
+  static constexpr const char* Name = "company";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  CompanyAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  CompanyAPI(const CompanyAPI&) = delete;
+  CompanyAPI& operator=(const CompanyAPI&) = delete;
+
+  ::grpc::Status AddClaimToProfileTemplate(
+    ::grpc::ServerContext*,
+    const client_library::AddClaimToProfileTemplateForm* request,
+    client_library::AddClaimToProfileTemplateFormResponse* response
+  ) override {
+    auto result_future = service_->AddClaimToProfileTemplate(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddEmployee(
+    ::grpc::ServerContext*,
+    const client_library::AddEmployeeForm* request,
+    client_library::AddEmployeeFormResponse* response
+  ) override {
+    auto result_future = service_->AddEmployee(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddProfileTemplate(
+    ::grpc::ServerContext*,
+    const client_library::AddProfileTemplateForm* request,
+    client_library::AddProfileTemplateFormResponse* response
+  ) override {
+    auto result_future = service_->AddProfileTemplate(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddRole(
+    ::grpc::ServerContext*,
+    const client_library::AddRoleForm* request,
+    client_library::AddRoleFormResponse* response
+  ) override {
+    auto result_future = service_->AddRole(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddSharedIdentity(
+    ::grpc::ServerContext*,
+    const client_library::AddSharedIdentityForm* request,
+    client_library::AddSharedIdentityFormResponse* response
+  ) override {
+    auto result_future = service_->AddSharedIdentity(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ApplyProfileTemplate(
+    ::grpc::ServerContext*,
+    const client_library::ApplyProfileTemplateForm* request,
+    client_library::ApplyProfileTemplateFormResponse* response
+  ) override {
+    auto result_future = service_->ApplyProfileTemplate(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ApplyRoleTemplatesToEmployee(
+    ::grpc::ServerContext*,
+    const client_library::ApplyRoleTemplatesToEmployeeForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->ApplyRoleTemplatesToEmployee(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status CreateCompany(
+    ::grpc::ServerContext*,
+    const client_library::CreateCompanyForm* request,
+    client_library::CreateCompanyFormResponse* response
+  ) override {
+    auto result_future = service_->CreateCompany(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status DeleteCompanyLogo(
+    ::grpc::ServerContext*,
+    const client_library::DeleteCompanyLogoForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->DeleteCompanyLogo(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status DeleteRole(
+    ::grpc::ServerContext*,
+    const client_library::DeleteRoleForm* request,
+    client_library::DeleteRoleFormResponse* response
+  ) override {
+    auto result_future = service_->DeleteRole(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetCompanyLogo(
+    ::grpc::ServerContext*,
+    const client_library::GetCompanyLogoForm* request,
+    client_library::GetCompanyLogoFormResponse* response
+  ) override {
+    auto result_future = service_->GetCompanyLogo(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetInfrastructure(
+    ::grpc::ServerContext*,
+    const client_library::GetInfrastructureForm* request,
+    client_library::GetInfrastructureFormResponse* response
+  ) override {
+    auto result_future = service_->GetInfrastructure(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListCompanies(
+    ::grpc::ServerContext*,
+    const client_library::ListCompaniesForm* request,
+    client_library::ListCompaniesFormResponse* response
+  ) override {
+    auto result_future = service_->ListCompanies(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListEmployees(
+    ::grpc::ServerContext*,
+    const client_library::ListEmployeesForm* request,
+    client_library::ListEmployeesFormResponse* response
+  ) override {
+    auto result_future = service_->ListEmployees(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListEmployeesForSharedIdentity(
+    ::grpc::ServerContext*,
+    const client_library::ListEmployeesForSharedIdentityForm* request,
+    client_library::ListEmployeesForSharedIdentityFormResponse* response
+  ) override {
+    auto result_future = service_->ListEmployeesForSharedIdentity(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListProfileTemplates(
+    ::grpc::ServerContext*,
+    const client_library::ListProfileTemplatesForm* request,
+    client_library::ListProfileTemplatesFormResponse* response
+  ) override {
+    auto result_future = service_->ListProfileTemplates(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListSharedIdentities(
+    ::grpc::ServerContext*,
+    const client_library::ListSharedIdentitiesForm* request,
+    client_library::ListSharedIdentitiesFormResponse* response
+  ) override {
+    auto result_future = service_->ListSharedIdentities(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListSharedIdentitiesForEmployee(
+    ::grpc::ServerContext*,
+    const client_library::ListSharedIdentitiesForEmployeeForm* request,
+    client_library::ListSharedIdentitiesForEmployeeFormResponse* response
+  ) override {
+    auto result_future = service_->ListSharedIdentitiesForEmployee(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListSubscribedTemplatesToRole(
+    ::grpc::ServerContext*,
+    const client_library::ListSubscribedTemplatesToRoleForm* request,
+    client_library::ListSubscribedTemplatesToRoleFormResponse* response
+  ) override {
+    auto result_future = service_->ListSubscribedTemplatesToRole(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status PutCompanyLogo(
+    ::grpc::ServerContext*,
+    const client_library::PutCompanyLogoForm* request,
+    client_library::PutCompanyLogoFormResponse* response
+  ) override {
+    auto result_future = service_->PutCompanyLogo(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RemoveClaimFromProfileTemplate(
+    ::grpc::ServerContext*,
+    const client_library::RemoveClaimFromProfileTemplateForm* request,
+    client_library::RemoveClaimFromProfileTemplateFormResponse* response
+  ) override {
+    auto result_future = service_->RemoveClaimFromProfileTemplate(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status UpdateEmployeeStatus(
+    ::grpc::ServerContext*,
+    const client_library::UpdateEmployeeStatusForm* request,
+    client_library::UpdateEmployeeStatusFormResponse* response
+  ) override {
+    auto result_future = service_->UpdateEmployeeStatus(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_COMPANY_API_HH
diff --git a/cpp/src/vereign/grpc/gen/contacts_api.hh b/cpp/src/vereign/grpc/gen/contacts_api.hh
new file mode 100644
index 0000000..86e0c45
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/contacts_api.hh
@@ -0,0 +1,121 @@
+#ifndef __VEREIGN_GRPC_GEN_CONTACTS_API_HH
+#define __VEREIGN_GRPC_GEN_CONTACTS_API_HH
+
+#include <vereign/client_library/contacts_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class ContactsAPI : public client_library::ContactsAPI::Service {
+public:
+  static constexpr const char* Name = "contacts";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  ContactsAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  ContactsAPI(const ContactsAPI&) = delete;
+  ContactsAPI& operator=(const ContactsAPI&) = delete;
+
+  ::grpc::Status ChangeStatus(
+    ::grpc::ServerContext*,
+    const client_library::ChangeStatusForm* request,
+    client_library::ChangeStatusFormResponse* response
+  ) override {
+    auto result_future = service_->ChangeStatus(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetUserContacts(
+    ::grpc::ServerContext*,
+    const client_library::GetUserContactsForm* request,
+    client_library::GetUserContactsFormResponse* response
+  ) override {
+    auto result_future = service_->GetUserContacts(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListContacts(
+    ::grpc::ServerContext*,
+    const client_library::ListContactsForm* request,
+    client_library::ListContactsFormResponse* response
+  ) override {
+    auto result_future = service_->ListContacts(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status SearchContacts(
+    ::grpc::ServerContext*,
+    const client_library::SearchContactsForm* request,
+    client_library::SearchContactsFormResponse* response
+  ) override {
+    auto result_future = service_->SearchContacts(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_CONTACTS_API_HH
diff --git a/cpp/src/vereign/grpc/gen/conversation_api.hh b/cpp/src/vereign/grpc/gen/conversation_api.hh
new file mode 100644
index 0000000..9e45bae
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/conversation_api.hh
@@ -0,0 +1,121 @@
+#ifndef __VEREIGN_GRPC_GEN_CONVERSATION_API_HH
+#define __VEREIGN_GRPC_GEN_CONVERSATION_API_HH
+
+#include <vereign/client_library/conversation_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class ConversationAPI : public client_library::ConversationAPI::Service {
+public:
+  static constexpr const char* Name = "conversation";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  ConversationAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  ConversationAPI(const ConversationAPI&) = delete;
+  ConversationAPI& operator=(const ConversationAPI&) = delete;
+
+  ::grpc::Status AddEmail(
+    ::grpc::ServerContext*,
+    const client_library::AddEmailForm* request,
+    client_library::AddEmailFormResponse* response
+  ) override {
+    auto result_future = service_->AddEmail(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetConversations(
+    ::grpc::ServerContext*,
+    const client_library::GetConversationsForm* request,
+    client_library::GetConversationsFormResponse* response
+  ) override {
+    auto result_future = service_->GetConversations(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetConversationsAndMessageIDByMessageUUID(
+    ::grpc::ServerContext*,
+    const client_library::GetConversationsAndMessageIDByMessageUUIDForm* request,
+    client_library::GetConversationsAndMessageIDByMessageUUIDResponse* response
+  ) override {
+    auto result_future = service_->GetConversationsAndMessageIDByMessageUUID(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetEmails(
+    ::grpc::ServerContext*,
+    const client_library::GetEmailsForm* request,
+    client_library::GetEmailsFormResponse* response
+  ) override {
+    auto result_future = service_->GetEmails(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_CONVERSATION_API_HH
diff --git a/cpp/src/vereign/grpc/gen/delete_api.hh b/cpp/src/vereign/grpc/gen/delete_api.hh
new file mode 100644
index 0000000..2a59a2d
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/delete_api.hh
@@ -0,0 +1,77 @@
+#ifndef __VEREIGN_GRPC_GEN_DELETE_API_HH
+#define __VEREIGN_GRPC_GEN_DELETE_API_HH
+
+#include <vereign/client_library/delete_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class DeleteAPI : public client_library::DeleteAPI::Service {
+public:
+  static constexpr const char* Name = "delete";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  DeleteAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  DeleteAPI(const DeleteAPI&) = delete;
+  DeleteAPI& operator=(const DeleteAPI&) = delete;
+
+  ::grpc::Status DeleteInteraction(
+    ::grpc::ServerContext*,
+    const client_library::DeleteInteractionForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->DeleteInteraction(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status DeletePassport(
+    ::grpc::ServerContext*,
+    const client_library::DeletePassportForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->DeletePassport(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_DELETE_API_HH
diff --git a/cpp/src/vereign/grpc/gen/document_api.hh b/cpp/src/vereign/grpc/gen/document_api.hh
new file mode 100644
index 0000000..47c9a98
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/document_api.hh
@@ -0,0 +1,275 @@
+#ifndef __VEREIGN_GRPC_GEN_DOCUMENT_API_HH
+#define __VEREIGN_GRPC_GEN_DOCUMENT_API_HH
+
+#include <vereign/client_library/document_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class DocumentAPI : public client_library::DocumentAPI::Service {
+public:
+  static constexpr const char* Name = "document";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  DocumentAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  DocumentAPI(const DocumentAPI&) = delete;
+  DocumentAPI& operator=(const DocumentAPI&) = delete;
+
+  ::grpc::Status ConvertDocumentByUUID(
+    ::grpc::ServerContext*,
+    const client_library::ConvertDocumentByUUIDForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->ConvertDocumentByUUID(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status DeleteIdentityImage(
+    ::grpc::ServerContext*,
+    const client_library::DeleteIdentityImageForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->DeleteIdentityImage(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetDocument(
+    ::grpc::ServerContext*,
+    const client_library::EmptyRequest* request,
+    client_library::ListDocumentsResponse* response
+  ) override {
+    auto result_future = service_->GetDocument(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetDocumentByResourceID(
+    ::grpc::ServerContext*,
+    const client_library::GetDocumentByResourceIDForm* request,
+    client_library::GetDocumentByResourceIDFormResponse* response
+  ) override {
+    auto result_future = service_->GetDocumentByResourceID(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetDocumentByUUID(
+    ::grpc::ServerContext*,
+    const client_library::GetDocumentByUUIDForm* request,
+    client_library::GetDocumentByUUIDFormResponse* response
+  ) override {
+    auto result_future = service_->GetDocumentByUUID(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetFileInfo(
+    ::grpc::ServerContext*,
+    const client_library::EmptyRequest* request,
+    client_library::GetFileInfoResponse* response
+  ) override {
+    auto result_future = service_->GetFileInfo(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetIdentityImage(
+    ::grpc::ServerContext*,
+    const client_library::GetIdentityImageForm* request,
+    client_library::GetIdentityImageFormResponse* response
+  ) override {
+    auto result_future = service_->GetIdentityImage(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListDocuments(
+    ::grpc::ServerContext*,
+    const client_library::EmptyRequest* request,
+    client_library::ListDocumentsResponse* response
+  ) override {
+    auto result_future = service_->ListDocuments(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status PutDocumentByUUID(
+    ::grpc::ServerContext*,
+    const client_library::PutDocumentByUUIDForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->PutDocumentByUUID(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status PutIdentityImage(
+    ::grpc::ServerContext*,
+    const client_library::PutIdentityImageForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->PutIdentityImage(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status SignDocumentByUUID(
+    ::grpc::ServerContext*,
+    const client_library::SignDocumentByUUIDForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->SignDocumentByUUID(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_DOCUMENT_API_HH
diff --git a/cpp/src/vereign/grpc/gen/email_api.hh b/cpp/src/vereign/grpc/gen/email_api.hh
new file mode 100644
index 0000000..ce70d4a
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/email_api.hh
@@ -0,0 +1,231 @@
+#ifndef __VEREIGN_GRPC_GEN_EMAIL_API_HH
+#define __VEREIGN_GRPC_GEN_EMAIL_API_HH
+
+#include <vereign/client_library/email_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class EmailAPI : public client_library::EmailAPI::Service {
+public:
+  static constexpr const char* Name = "email";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  EmailAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  EmailAPI(const EmailAPI&) = delete;
+  EmailAPI& operator=(const EmailAPI&) = delete;
+
+  ::grpc::Status GetEmailStatusAll(
+    ::grpc::ServerContext*,
+    const client_library::GetEmailStatusAllForm* request,
+    client_library::GetEmailStatusAllFormResponse* response
+  ) override {
+    auto result_future = service_->GetEmailStatusAll(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetEmailStatusList(
+    ::grpc::ServerContext*,
+    const client_library::GetEmailStatusListForm* request,
+    client_library::GetEmailStatusListFormResponse* response
+  ) override {
+    auto result_future = service_->GetEmailStatusList(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetGmailMessageIDsByGmailThreadID(
+    ::grpc::ServerContext*,
+    const client_library::GetGmailMessageIDsByGmailThreadIDForm* request,
+    client_library::GetGmailMessageIDsByGmailThreadIDFormResponse* response
+  ) override {
+    auto result_future = service_->GetGmailMessageIDsByGmailThreadID(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetMessageIDsByGmailMessageIDs(
+    ::grpc::ServerContext*,
+    const client_library::GetMessageIDsByGmailMessageIDsForm* request,
+    client_library::GetMessageIDsByGmailMessageIDsFormResponse* response
+  ) override {
+    auto result_future = service_->GetMessageIDsByGmailMessageIDs(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status InitializeEmailStatus(
+    ::grpc::ServerContext*,
+    const client_library::InitializeEmailStatusForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->InitializeEmailStatus(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status SendEmailSmtp(
+    ::grpc::ServerContext*,
+    const client_library::SendEmailSmtpForm* request,
+    client_library::SendEmailSmtpFormResponse* response
+  ) override {
+    auto result_future = service_->SendEmailSmtp(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status SendFeedback(
+    ::grpc::ServerContext*,
+    const client_library::SendFeedbackForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->SendFeedback(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status StoreGmailMessageId(
+    ::grpc::ServerContext*,
+    const client_library::StoreGmailMessageIdForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->StoreGmailMessageId(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status UpdateRecipientEmailStatus(
+    ::grpc::ServerContext*,
+    const client_library::UpdateRecipientEmailStatusForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->UpdateRecipientEmailStatus(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_EMAIL_API_HH
diff --git a/cpp/src/vereign/grpc/gen/entity_api.hh b/cpp/src/vereign/grpc/gen/entity_api.hh
new file mode 100644
index 0000000..01f8a0a
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/entity_api.hh
@@ -0,0 +1,517 @@
+#ifndef __VEREIGN_GRPC_GEN_ENTITY_API_HH
+#define __VEREIGN_GRPC_GEN_ENTITY_API_HH
+
+#include <vereign/client_library/entity_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class EntityAPI : public client_library::EntityAPI::Service {
+public:
+  static constexpr const char* Name = "entity";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  EntityAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  EntityAPI(const EntityAPI&) = delete;
+  EntityAPI& operator=(const EntityAPI&) = delete;
+
+  ::grpc::Status AddChild(
+    ::grpc::ServerContext*,
+    const client_library::AddChildForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AddChild(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddClaim(
+    ::grpc::ServerContext*,
+    const client_library::AddClaimForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AddClaim(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddGuarded(
+    ::grpc::ServerContext*,
+    const client_library::AddGuardedForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AddGuarded(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddGuardian(
+    ::grpc::ServerContext*,
+    const client_library::AddGuardianForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AddGuardian(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddMember(
+    ::grpc::ServerContext*,
+    const client_library::AddMemberForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AddMember(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddMemberOf(
+    ::grpc::ServerContext*,
+    const client_library::AddMemberOfForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AddMemberOf(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddParent(
+    ::grpc::ServerContext*,
+    const client_library::AddParentForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AddParent(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AddViewer(
+    ::grpc::ServerContext*,
+    const client_library::AddViewerForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AddViewer(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status CreateEntity(
+    ::grpc::ServerContext*,
+    const client_library::CreateEntityForm* request,
+    client_library::CreateEntityFormResponse* response
+  ) override {
+    auto result_future = service_->CreateEntity(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status DeleteClaim(
+    ::grpc::ServerContext*,
+    const client_library::DeleteClaimForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->DeleteClaim(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetClaim(
+    ::grpc::ServerContext*,
+    const client_library::GetClaimForm* request,
+    client_library::GetClaimFormResponse* response
+  ) override {
+    auto result_future = service_->GetClaim(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetEntity(
+    ::grpc::ServerContext*,
+    const client_library::GetEntityForm* request,
+    client_library::GetEntityFormResponse* response
+  ) override {
+    auto result_future = service_->GetEntity(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RemoveChild(
+    ::grpc::ServerContext*,
+    const client_library::RemoveChildForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->RemoveChild(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RemoveGuarded(
+    ::grpc::ServerContext*,
+    const client_library::RemoveGuardedForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->RemoveGuarded(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RemoveGuardian(
+    ::grpc::ServerContext*,
+    const client_library::RemoveGuardianForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->RemoveGuardian(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RemoveMember(
+    ::grpc::ServerContext*,
+    const client_library::RemoveMemberForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->RemoveMember(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RemoveMemberOf(
+    ::grpc::ServerContext*,
+    const client_library::RemoveMemberOfForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->RemoveMemberOf(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RemoveParent(
+    ::grpc::ServerContext*,
+    const client_library::RemoveParentForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->RemoveParent(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RemoveViewer(
+    ::grpc::ServerContext*,
+    const client_library::RemoveViewerForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->RemoveViewer(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status SendClaimCode(
+    ::grpc::ServerContext*,
+    const client_library::ClaimSendCodeForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->SendClaimCode(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status UpdateClaim(
+    ::grpc::ServerContext*,
+    const client_library::AddClaimForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->UpdateClaim(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status VerifyClaimCode(
+    ::grpc::ServerContext*,
+    const client_library::ClaimVerifyCodeForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->VerifyClaimCode(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_ENTITY_API_HH
diff --git a/cpp/src/vereign/grpc/gen/event_api.hh b/cpp/src/vereign/grpc/gen/event_api.hh
new file mode 100644
index 0000000..4bfbeba
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/event_api.hh
@@ -0,0 +1,55 @@
+#ifndef __VEREIGN_GRPC_GEN_EVENT_API_HH
+#define __VEREIGN_GRPC_GEN_EVENT_API_HH
+
+#include <vereign/client_library/event_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class EventAPI : public client_library::EventAPI::Service {
+public:
+  static constexpr const char* Name = "event";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  EventAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  EventAPI(const EventAPI&) = delete;
+  EventAPI& operator=(const EventAPI&) = delete;
+
+  ::grpc::Status GetEvents(
+    ::grpc::ServerContext*,
+    const client_library::GetEventsForm* request,
+    client_library::GetEventsFormResponse* response
+  ) override {
+    auto result_future = service_->GetEvents(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_EVENT_API_HH
diff --git a/cpp/src/vereign/grpc/gen/ews_api.hh b/cpp/src/vereign/grpc/gen/ews_api.hh
new file mode 100644
index 0000000..15288f4
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/ews_api.hh
@@ -0,0 +1,55 @@
+#ifndef __VEREIGN_GRPC_GEN_EWS_API_HH
+#define __VEREIGN_GRPC_GEN_EWS_API_HH
+
+#include <vereign/client_library/ews_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class EwsAPI : public client_library::EwsAPI::Service {
+public:
+  static constexpr const char* Name = "ews";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  EwsAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  EwsAPI(const EwsAPI&) = delete;
+  EwsAPI& operator=(const EwsAPI&) = delete;
+
+  ::grpc::Status ProxyRequest(
+    ::grpc::ServerContext*,
+    const client_library::EWSProxyRequestForm* request,
+    client_library::EWSProxyRequestFormResponse* response
+  ) override {
+    auto result_future = service_->ProxyRequest(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_EWS_API_HH
diff --git a/cpp/src/vereign/grpc/gen/gen.cc b/cpp/src/vereign/grpc/gen/gen.cc
new file mode 100644
index 0000000..b8e6dcc
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/gen.cc
@@ -0,0 +1,37 @@
+#include <vereign/grpc/gen/gen.hh>
+
+#include <vereign/service/gen/gen.hh>
+#include <vereign/grpc/service_registry.hh>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+void RegisterAll(
+  restapi::ClientSession& client_session,
+  vereign::grpc::ServiceRegistry& service_registry
+) {
+  service_registry.RegisterIfNotExist<ActionAPI<service::gen::ActionService>>(client_session);
+  service_registry.RegisterIfNotExist<ActivityAPI<service::gen::ActivityService>>(client_session);
+  service_registry.RegisterIfNotExist<CompanyAPI<service::gen::CompanyService>>(client_session);
+  service_registry.RegisterIfNotExist<ContactsAPI<service::gen::ContactsService>>(client_session);
+  service_registry.RegisterIfNotExist<ConversationAPI<service::gen::ConversationService>>(client_session);
+  service_registry.RegisterIfNotExist<DeleteAPI<service::gen::DeleteService>>(client_session);
+  service_registry.RegisterIfNotExist<DocumentAPI<service::gen::DocumentService>>(client_session);
+  service_registry.RegisterIfNotExist<EmailAPI<service::gen::EmailService>>(client_session);
+  service_registry.RegisterIfNotExist<EntityAPI<service::gen::EntityService>>(client_session);
+  service_registry.RegisterIfNotExist<EventAPI<service::gen::EventService>>(client_session);
+  service_registry.RegisterIfNotExist<EwsAPI<service::gen::EwsService>>(client_session);
+  service_registry.RegisterIfNotExist<IdentityAPI<service::gen::IdentityService>>(client_session);
+  service_registry.RegisterIfNotExist<InteractionsAPI<service::gen::InteractionsService>>(client_session);
+  service_registry.RegisterIfNotExist<OrdersAPI<service::gen::OrdersService>>(client_session);
+  service_registry.RegisterIfNotExist<PassportAPI<service::gen::PassportService>>(client_session);
+  service_registry.RegisterIfNotExist<ReportingAPI<service::gen::ReportingService>>(client_session);
+  service_registry.RegisterIfNotExist<ResourceAPI<service::gen::ResourceService>>(client_session);
+  service_registry.RegisterIfNotExist<SharingAPI<service::gen::SharingService>>(client_session);
+  service_registry.RegisterIfNotExist<SignAPI<service::gen::SignService>>(client_session);
+}
+
+}
+}
+}
diff --git a/cpp/src/vereign/grpc/gen/gen.hh b/cpp/src/vereign/grpc/gen/gen.hh
index 19a6a01..1f0d44b 100644
--- a/cpp/src/vereign/grpc/gen/gen.hh
+++ b/cpp/src/vereign/grpc/gen/gen.hh
@@ -1,6 +1,42 @@
 #ifndef __VEREIGN_GRPC_GEN_GEN_HH
 #define __VEREIGN_GRPC_GEN_GEN_HH
 
+
+#include <vereign/grpc/gen/action_api.hh>
+#include <vereign/grpc/gen/activity_api.hh>
+#include <vereign/grpc/gen/company_api.hh>
+#include <vereign/grpc/gen/contacts_api.hh>
+#include <vereign/grpc/gen/conversation_api.hh>
+#include <vereign/grpc/gen/delete_api.hh>
+#include <vereign/grpc/gen/document_api.hh>
+#include <vereign/grpc/gen/email_api.hh>
+#include <vereign/grpc/gen/entity_api.hh>
+#include <vereign/grpc/gen/event_api.hh>
+#include <vereign/grpc/gen/ews_api.hh>
+#include <vereign/grpc/gen/identity_api.hh>
+#include <vereign/grpc/gen/interactions_api.hh>
+#include <vereign/grpc/gen/orders_api.hh>
 #include <vereign/grpc/gen/passport_api.hh>
+#include <vereign/grpc/gen/reporting_api.hh>
+#include <vereign/grpc/gen/resource_api.hh>
+#include <vereign/grpc/gen/sharing_api.hh>
+#include <vereign/grpc/gen/sign_api.hh>
+
+namespace vereign {
+namespace restapi {
+class ClientSession;
+}
+
+namespace grpc {
+
+class ServiceRegistry;
+
+namespace gen {
+
+void RegisterAll(restapi::ClientSession& client_session, grpc::ServiceRegistry& service_registry);
+
+} // namespace gen
+} // namespace grpc
+} // namespace vereign
 
-#endif
+#endif // __VEREIGN_GRPC_GEN_GEN_HH
diff --git a/cpp/src/vereign/grpc/gen/identity_api.hh b/cpp/src/vereign/grpc/gen/identity_api.hh
new file mode 100644
index 0000000..2d9f4dc
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/identity_api.hh
@@ -0,0 +1,385 @@
+#ifndef __VEREIGN_GRPC_GEN_IDENTITY_API_HH
+#define __VEREIGN_GRPC_GEN_IDENTITY_API_HH
+
+#include <vereign/client_library/identity_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class IdentityAPI : public client_library::IdentityAPI::Service {
+public:
+  static constexpr const char* Name = "identity";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  IdentityAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  IdentityAPI(const IdentityAPI&) = delete;
+  IdentityAPI& operator=(const IdentityAPI&) = delete;
+
+  ::grpc::Status AuthorizeDevice(
+    ::grpc::ServerContext*,
+    const client_library::AuthorizeDeviceForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AuthorizeDevice(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status CancelAction(
+    ::grpc::ServerContext*,
+    const client_library::CancelActionForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->CancelAction(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ConfirmAction(
+    ::grpc::ServerContext*,
+    const client_library::ConfirmActionExecutionForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->ConfirmAction(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ConfirmNewCarddavPublicKey(
+    ::grpc::ServerContext*,
+    const client_library::ConfirmNewCarddavPublicKeyForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->ConfirmNewCarddavPublicKey(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ConfirmNewDevice(
+    ::grpc::ServerContext*,
+    const client_library::ConfirmNewDeviceForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->ConfirmNewDevice(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GenerateCredentials(
+    ::grpc::ServerContext*,
+    const client_library::GenerateCredentialsForm* request,
+    client_library::GenerateCredentialsFormResponse* response
+  ) override {
+    auto result_future = service_->GenerateCredentials(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetAvatar(
+    ::grpc::ServerContext*,
+    const client_library::GetIdentityAvatarForm* request,
+    client_library::GetIdentityAvatarFormResponse* response
+  ) override {
+    auto result_future = service_->GetAvatar(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetIdentityProfileData(
+    ::grpc::ServerContext*,
+    const client_library::GetIdentityProfileDataForm* request,
+    client_library::GetIdentityProfileDataFormResponse* response
+  ) override {
+    auto result_future = service_->GetIdentityProfileData(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status HasUnauthorizedDevices(
+    ::grpc::ServerContext*,
+    const client_library::EmptyRequest* request,
+    client_library::HasUnauthorizedDevicesHandlerFormResponse* response
+  ) override {
+    auto result_future = service_->HasUnauthorizedDevices(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListDevices(
+    ::grpc::ServerContext*,
+    const client_library::EmptyRequest* request,
+    client_library::ListDevicesHandlerFormResponse* response
+  ) override {
+    auto result_future = service_->ListDevices(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status PullAvatarFromGravatar(
+    ::grpc::ServerContext*,
+    const client_library::PullAvatarFromGravatarForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->PullAvatarFromGravatar(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status Register2FAPublicKey(
+    ::grpc::ServerContext*,
+    const client_library::Register2FAPublicKeyForm* request,
+    client_library::Register2FAPublicKeyFormResponse* response
+  ) override {
+    auto result_future = service_->Register2FAPublicKey(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RenameDevice(
+    ::grpc::ServerContext*,
+    const client_library::RenameDeviceForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->RenameDevice(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ResumeDevice(
+    ::grpc::ServerContext*,
+    const client_library::ResumeDeviceForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->ResumeDevice(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RevokeDevice(
+    ::grpc::ServerContext*,
+    const client_library::RevokeDeviceForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->RevokeDevice(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status SuspendDevice(
+    ::grpc::ServerContext*,
+    const client_library::SuspendDeviceForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->SuspendDevice(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_IDENTITY_API_HH
diff --git a/cpp/src/vereign/grpc/gen/interactions_api.hh b/cpp/src/vereign/grpc/gen/interactions_api.hh
new file mode 100644
index 0000000..b0947b6
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/interactions_api.hh
@@ -0,0 +1,55 @@
+#ifndef __VEREIGN_GRPC_GEN_INTERACTIONS_API_HH
+#define __VEREIGN_GRPC_GEN_INTERACTIONS_API_HH
+
+#include <vereign/client_library/interactions_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class InteractionsAPI : public client_library::InteractionsAPI::Service {
+public:
+  static constexpr const char* Name = "interactions";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  InteractionsAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  InteractionsAPI(const InteractionsAPI&) = delete;
+  InteractionsAPI& operator=(const InteractionsAPI&) = delete;
+
+  ::grpc::Status SearchInteractions(
+    ::grpc::ServerContext*,
+    const client_library::SearchInteractionsForm* request,
+    client_library::SearchInteractionsFormResponse* response
+  ) override {
+    auto result_future = service_->SearchInteractions(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_INTERACTIONS_API_HH
diff --git a/cpp/src/vereign/grpc/gen/orders_api.hh b/cpp/src/vereign/grpc/gen/orders_api.hh
new file mode 100644
index 0000000..1fae8e7
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/orders_api.hh
@@ -0,0 +1,143 @@
+#ifndef __VEREIGN_GRPC_GEN_ORDERS_API_HH
+#define __VEREIGN_GRPC_GEN_ORDERS_API_HH
+
+#include <vereign/client_library/orders_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class OrdersAPI : public client_library::OrdersAPI::Service {
+public:
+  static constexpr const char* Name = "orders";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  OrdersAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  OrdersAPI(const OrdersAPI&) = delete;
+  OrdersAPI& operator=(const OrdersAPI&) = delete;
+
+  ::grpc::Status ConfirmCardPayment(
+    ::grpc::ServerContext*,
+    const client_library::ConfirmCardPaymentForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->ConfirmCardPayment(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetGeneratedInvoiceForOrder(
+    ::grpc::ServerContext*,
+    const client_library::GetGeneratedInvoiceForOrderForm* request,
+    client_library::GetGeneratedInvoiceForOrderFormResponse* response
+  ) override {
+    auto result_future = service_->GetGeneratedInvoiceForOrder(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetOrder(
+    ::grpc::ServerContext*,
+    const client_library::GetOrderForm* request,
+    client_library::GetOrderFormResponse* response
+  ) override {
+    auto result_future = service_->GetOrder(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status InitializeCardPayment(
+    ::grpc::ServerContext*,
+    const client_library::InitializeCardPaymentForm* request,
+    client_library::InitializeCardPaymentFormResponse* response
+  ) override {
+    auto result_future = service_->InitializeCardPayment(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListOrders(
+    ::grpc::ServerContext*,
+    const client_library::ListOrdersForm* request,
+    client_library::ListOrdersFormResponse* response
+  ) override {
+    auto result_future = service_->ListOrders(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_ORDERS_API_HH
diff --git a/cpp/src/vereign/grpc/gen/passport_api.hh b/cpp/src/vereign/grpc/gen/passport_api.hh
index 6375e25..14f0568 100644
--- a/cpp/src/vereign/grpc/gen/passport_api.hh
+++ b/cpp/src/vereign/grpc/gen/passport_api.hh
@@ -10,6 +10,9 @@ namespace gen {
 template <class VereignService>
 class PassportAPI : public client_library::PassportAPI::Service {
 public:
+  static constexpr const char* Name = "passport";
+
+  using VereignServiceType = VereignService;
   using VereignServicePtr = std::unique_ptr<VereignService>;
 
   PassportAPI(VereignServicePtr&& service)
@@ -19,6 +22,248 @@ public:
   PassportAPI(const PassportAPI&) = delete;
   PassportAPI& operator=(const PassportAPI&) = delete;
 
+  ::grpc::Status AttachFunction(
+    ::grpc::ServerContext*,
+    const client_library::AttachFunctionToPassportClaimForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AttachFunction(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status CallFunction(
+    ::grpc::ServerContext*,
+    const client_library::CallFunctionForm* request,
+    client_library::CallFunctionFormResponse* response
+  ) override {
+    auto result_future = service_->CallFunction(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GenerateDIDs(
+    ::grpc::ServerContext*,
+    const client_library::GenerateDIDsForm* request,
+    client_library::GenerateDIDsFormResponse* response
+  ) override {
+    auto result_future = service_->GenerateDIDs(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetAvatarByPassport(
+    ::grpc::ServerContext*,
+    const client_library::GetAvatarByPassportForm* request,
+    client_library::GetAvatarByPassportFormResponse* response
+  ) override {
+    auto result_future = service_->GetAvatarByPassport(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetDIDs(
+    ::grpc::ServerContext*,
+    const client_library::GetDIDsForm* request,
+    client_library::GetDIDsFormResponse* response
+  ) override {
+    auto result_future = service_->GetDIDs(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetEmailWithHeaderByPassport(
+    ::grpc::ServerContext*,
+    const client_library::GetEmailWithHeaderByPassportForm* request,
+    client_library::GetEmailWithHeaderByPassportFormResponse* response
+  ) override {
+    auto result_future = service_->GetEmailWithHeaderByPassport(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetInteractions(
+    ::grpc::ServerContext*,
+    const client_library::GetInteractionsForm* request,
+    client_library::GetInteractionsFormResponse* response
+  ) override {
+    auto result_future = service_->GetInteractions(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetVCardImage(
+    ::grpc::ServerContext*,
+    const client_library::GetVCardImageForm* request,
+    client_library::GetVCardImageFormResponse* response
+  ) override {
+    auto result_future = service_->GetVCardImage(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GetVCardTemplate(
+    ::grpc::ServerContext*,
+    const client_library::GetVCardTemplateForm* request,
+    client_library::GetVCardTemplateFormResponse* response
+  ) override {
+    auto result_future = service_->GetVCardTemplate(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status LinkClaim(
+    ::grpc::ServerContext*,
+    const client_library::LinkClaimToPassportForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->LinkClaim(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListFunctions(
+    ::grpc::ServerContext*,
+    const client_library::EmptyRequest* request,
+    client_library::ListFunctionsResponse* response
+  ) override {
+    auto result_future = service_->ListFunctions(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
   ::grpc::Status ListPassports(
     ::grpc::ServerContext*,
     const client_library::ListPassportsForm* request,
@@ -41,6 +286,94 @@ public:
     return ::grpc::Status::OK;
   }
 
+  ::grpc::Status ListPassportsForSharedIdentity(
+    ::grpc::ServerContext*,
+    const client_library::ListPassportsForSharedIdentityForm* request,
+    client_library::ListPassportsForSharedIdentityFormResponse* response
+  ) override {
+    auto result_future = service_->ListPassportsForSharedIdentity(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListSharedIdentitiesWithUser(
+    ::grpc::ServerContext*,
+    const client_library::ListSharedIdentitiesWithUserForm* request,
+    client_library::ListSharedIdentitiesWithUserFormResponse* response
+  ) override {
+    auto result_future = service_->ListSharedIdentitiesWithUser(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status SetVCardImage(
+    ::grpc::ServerContext*,
+    const client_library::SetVCardImageForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->SetVCardImage(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status StoreDIDs(
+    ::grpc::ServerContext*,
+    const client_library::StoreDIDsForm* request,
+    client_library::StoreDIDsFormResponse* response
+  ) override {
+    auto result_future = service_->StoreDIDs(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
 protected:
   VereignServicePtr service_;
 };
diff --git a/cpp/src/vereign/grpc/gen/reporting_api.hh b/cpp/src/vereign/grpc/gen/reporting_api.hh
new file mode 100644
index 0000000..bbbf4f0
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/reporting_api.hh
@@ -0,0 +1,77 @@
+#ifndef __VEREIGN_GRPC_GEN_REPORTING_API_HH
+#define __VEREIGN_GRPC_GEN_REPORTING_API_HH
+
+#include <vereign/client_library/reporting_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class ReportingAPI : public client_library::ReportingAPI::Service {
+public:
+  static constexpr const char* Name = "reporting";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  ReportingAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  ReportingAPI(const ReportingAPI&) = delete;
+  ReportingAPI& operator=(const ReportingAPI&) = delete;
+
+  ::grpc::Status Getbillingdataforperiod(
+    ::grpc::ServerContext*,
+    const client_library::GetBillingDataForPeriodForm* request,
+    client_library::GetBillingDataForPeriodFormResponse* response
+  ) override {
+    auto result_future = service_->Getbillingdataforperiod(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status Getreporttotaldata(
+    ::grpc::ServerContext*,
+    const client_library::GetReportTotalDataForm* request,
+    client_library::GetReportTotalDataFormResponse* response
+  ) override {
+    auto result_future = service_->Getreporttotaldata(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_REPORTING_API_HH
diff --git a/cpp/src/vereign/grpc/gen/resource_api.hh b/cpp/src/vereign/grpc/gen/resource_api.hh
new file mode 100644
index 0000000..13f6ba2
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/resource_api.hh
@@ -0,0 +1,77 @@
+#ifndef __VEREIGN_GRPC_GEN_RESOURCE_API_HH
+#define __VEREIGN_GRPC_GEN_RESOURCE_API_HH
+
+#include <vereign/client_library/resource_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class ResourceAPI : public client_library::ResourceAPI::Service {
+public:
+  static constexpr const char* Name = "resource";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  ResourceAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  ResourceAPI(const ResourceAPI&) = delete;
+  ResourceAPI& operator=(const ResourceAPI&) = delete;
+
+  ::grpc::Status DeleteResourceByToken(
+    ::grpc::ServerContext*,
+    const client_library::DeleteResourceForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->DeleteResourceByToken(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status StoreResource(
+    ::grpc::ServerContext*,
+    const client_library::StoreResourceForm* request,
+    client_library::StoreResourceFormResponse* response
+  ) override {
+    auto result_future = service_->StoreResource(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_RESOURCE_API_HH
diff --git a/cpp/src/vereign/grpc/gen/sharing_api.hh b/cpp/src/vereign/grpc/gen/sharing_api.hh
new file mode 100644
index 0000000..e52aea7
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/sharing_api.hh
@@ -0,0 +1,165 @@
+#ifndef __VEREIGN_GRPC_GEN_SHARING_API_HH
+#define __VEREIGN_GRPC_GEN_SHARING_API_HH
+
+#include <vereign/client_library/sharing_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class SharingAPI : public client_library::SharingAPI::Service {
+public:
+  static constexpr const char* Name = "sharing";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  SharingAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  SharingAPI(const SharingAPI&) = delete;
+  SharingAPI& operator=(const SharingAPI&) = delete;
+
+  ::grpc::Status AcceptSharingRequestMovePassport(
+    ::grpc::ServerContext*,
+    const client_library::AcceptSharingRequestMovePassportForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AcceptSharingRequestMovePassport(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status AcceptSharingRequestPersistPassport(
+    ::grpc::ServerContext*,
+    const client_library::AcceptSharingRequestPersistPassportForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->AcceptSharingRequestPersistPassport(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListPendingSharingRequests(
+    ::grpc::ServerContext*,
+    const client_library::ListPendingSharingRequestsForm* request,
+    client_library::ListPendingSharingRequestsFormResponse* response
+  ) override {
+    auto result_future = service_->ListPendingSharingRequests(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ListRejectedSharingRequests(
+    ::grpc::ServerContext*,
+    const client_library::ListRejectedSharingRequestsForm* request,
+    client_library::ListRejectedSharingRequestsFormResponse* response
+  ) override {
+    auto result_future = service_->ListRejectedSharingRequests(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RejectSharingRequest(
+    ::grpc::ServerContext*,
+    const client_library::RejectSharingRequestForm* request,
+    client_library::EmptyResponse* response
+  ) override {
+    auto result_future = service_->RejectSharingRequest(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status SendShareDocumentRequest(
+    ::grpc::ServerContext*,
+    const client_library::SendShareDocumentRequestForm* request,
+    client_library::SendShareDocumentRequestFormResponse* response
+  ) override {
+    auto result_future = service_->SendShareDocumentRequest(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_SHARING_API_HH
diff --git a/cpp/src/vereign/grpc/gen/sign_api.hh b/cpp/src/vereign/grpc/gen/sign_api.hh
new file mode 100644
index 0000000..7d9cf59
--- /dev/null
+++ b/cpp/src/vereign/grpc/gen/sign_api.hh
@@ -0,0 +1,165 @@
+#ifndef __VEREIGN_GRPC_GEN_SIGN_API_HH
+#define __VEREIGN_GRPC_GEN_SIGN_API_HH
+
+#include <vereign/client_library/sign_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+template <class VereignService>
+class SignAPI : public client_library::SignAPI::Service {
+public:
+  static constexpr const char* Name = "sign";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  SignAPI(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  SignAPI(const SignAPI&) = delete;
+  SignAPI& operator=(const SignAPI&) = delete;
+
+  ::grpc::Status GenerateCmsForChain(
+    ::grpc::ServerContext*,
+    const client_library::GenerateCmsForChainForm* request,
+    client_library::GenerateCmsForChainFormResponse* response
+  ) override {
+    auto result_future = service_->GenerateCmsForChain(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status GenerateCmsForPassport(
+    ::grpc::ServerContext*,
+    const client_library::GenerateCmsForPassportForm* request,
+    client_library::GenerateCmsForPassportFormResponse* response
+  ) override {
+    auto result_future = service_->GenerateCmsForPassport(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ResignEmail(
+    ::grpc::ServerContext*,
+    const client_library::ResignSMIMEForm* request,
+    client_library::ResignSMIMEFormResponse* response
+  ) override {
+    auto result_future = service_->ResignEmail(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status RetrieveRootCertificate(
+    ::grpc::ServerContext*,
+    const client_library::RetrieveRootCertificateForm* request,
+    client_library::RetrieveRootCertificateFormResponse* response
+  ) override {
+    auto result_future = service_->RetrieveRootCertificate(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status SignVCardForChain(
+    ::grpc::ServerContext*,
+    const client_library::SignVCardForChainForm* request,
+    client_library::SignVCardForChainFormResponse* response
+  ) override {
+    auto result_future = service_->SignVCardForChain(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+  ::grpc::Status ValidateVMime(
+    ::grpc::ServerContext*,
+    const client_library::ValidateVMimeForm* request,
+    client_library::ValidateVMimeFormResponse* response
+  ) override {
+    auto result_future = service_->ValidateVMime(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_SIGN_API_HH
diff --git a/cpp/src/vereign/grpc/passport_api.hh b/cpp/src/vereign/grpc/passport_api.hh
index 09023d4..02eb2b3 100644
--- a/cpp/src/vereign/grpc/passport_api.hh
+++ b/cpp/src/vereign/grpc/passport_api.hh
@@ -9,6 +9,9 @@ namespace grpc {
 template <class VereignService>
 class PassportAPI final : public gen::PassportAPI<VereignService> {
 public:
+  static constexpr const char* Name = gen::PassportAPI<VereignService>::Name;
+
+  using VereignServiceType = VereignService;
   using VereignServicePtr = std::unique_ptr<VereignService>;
 
   PassportAPI(VereignServicePtr&& service)
diff --git a/cpp/src/vereign/grpc/server.cc b/cpp/src/vereign/grpc/server.cc
index 1bc1870..902cabf 100644
--- a/cpp/src/vereign/grpc/server.cc
+++ b/cpp/src/vereign/grpc/server.cc
@@ -1,7 +1,9 @@
-#include "boost/asio/executor_work_guard.hpp"
-#include "vereign/grpc/gen/passport_api.hh"
-#include "vereign/service/gen/passport_service.hh"
+#include "vereign/grpc/gen/conversation_api.hh"
+#include "vereign/service/gen/conversation_service.hh"
 #include <vereign/grpc/server.hh>
+
+#include <vereign/grpc/gen/passport_api.hh>
+#include <vereign/service/gen/passport_service.hh>
 #include <vereign/restapi/client.hh>
 #include <vereign/restapi/client_session.hh>
 
@@ -15,6 +17,8 @@
 #include <grpcpp/server_context.h>
 #include <grpcpp/security/server_credentials.h>
 
+#include <boost/asio/executor_work_guard.hpp>
+
 namespace vereign {
 namespace grpc {
 
@@ -44,15 +48,13 @@ Server::Server(
     &selected_port_
   );
 
-  services_.emplace_back(
-    std::make_unique<grpc::PassportAPI<service::PassportService>>(
-        std::make_unique<service::PassportService>(*client_session_)
-    )
-  );
+  // register manually written services
+  services_registry_.RegisterIfNotExist<PassportAPI<service::PassportService>>(*client_session_);
 
-  for (auto& service : services_) {
-    builder.RegisterService(service.get());
-  }
+  // register all generated services
+  grpc::gen::RegisterAll(*client_session_, services_registry_);
+
+  services_registry_.RegisterIntoBuilder(builder);
 
   server_ = builder.BuildAndStart();
   if (server_ == nullptr) {
@@ -90,5 +92,5 @@ int Server::SelectedPort() const {
   return selected_port_;
 }
 
-}
-}
+} // namespace grpc
+} // namespace vereign
diff --git a/cpp/src/vereign/grpc/server.hh b/cpp/src/vereign/grpc/server.hh
index f72c981..7ba60bb 100644
--- a/cpp/src/vereign/grpc/server.hh
+++ b/cpp/src/vereign/grpc/server.hh
@@ -6,6 +6,7 @@
 #include <boost/asio/io_context.hpp>
 #include <boost/asio/ssl/context.hpp>
 #include <boost/asio/executor_work_guard.hpp>
+#include <vereign/grpc/service_registry.hh>
 
 namespace vereign {
 
@@ -76,13 +77,13 @@ private:
   asio::ssl::context ssl_context_;
   std::unique_ptr<vereign::restapi::Client> client_;
   std::unique_ptr<vereign::restapi::ClientSession> client_session_;
-  std::vector<std::unique_ptr<::grpc::Service>> services_;
+  ServiceRegistry services_registry_;
   std::unique_ptr<::grpc::Server> server_;
   std::thread server_thread_;
   std::thread service_thread_;
 };
 
-}
-}
+} // namespace grpc
+} // namespace vereign
 
 #endif
diff --git a/cpp/src/vereign/grpc/service_registry.cc b/cpp/src/vereign/grpc/service_registry.cc
new file mode 100644
index 0000000..357689f
--- /dev/null
+++ b/cpp/src/vereign/grpc/service_registry.cc
@@ -0,0 +1,13 @@
+#include <vereign/grpc/service_registry.hh>
+
+namespace vereign {
+namespace grpc {
+
+void ServiceRegistry::RegisterIntoBuilder(::grpc::ServerBuilder& builder) {
+  for (auto& pair : services_) {
+    builder.RegisterService(pair.second.get());
+  }
+}
+
+} // namespace grpc
+} // namespace vereign
diff --git a/cpp/src/vereign/grpc/service_registry.hh b/cpp/src/vereign/grpc/service_registry.hh
new file mode 100644
index 0000000..cddc32a
--- /dev/null
+++ b/cpp/src/vereign/grpc/service_registry.hh
@@ -0,0 +1,36 @@
+#ifndef __VEREIGN_GRPC_SERVICE_REGISTRY_HH
+#define __VEREIGN_GRPC_SERVICE_REGISTRY_HH
+
+#include <grpcpp/server_builder.h>
+#include <vereign/restapi/client_session.hh>
+
+#include <unordered_map>
+
+namespace vereign {
+namespace grpc {
+
+class ServiceRegistry {
+public:
+  void RegisterIntoBuilder(::grpc::ServerBuilder& builder);
+
+  template <class API>
+  bool RegisterIfNotExist(restapi::ClientSession& client_session) {
+    auto it = services_.find(API::Name);
+    if (it != services_.end()) {
+      return false;
+    }
+
+    using Service = typename API::VereignServiceType;
+    services_[API::Name] = std::make_unique<API>(std::make_unique<Service>(client_session));
+
+    return true;
+  }
+
+private:
+  std::unordered_map<std::string, std::unique_ptr<::grpc::Service>> services_;
+};
+
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_SERVICE_REGISTRY_HH
diff --git a/cpp/src/vereign/restapi/detail/post_task.hh b/cpp/src/vereign/restapi/detail/post_task.hh
index 302ea11..78bb439 100644
--- a/cpp/src/vereign/restapi/detail/post_task.hh
+++ b/cpp/src/vereign/restapi/detail/post_task.hh
@@ -72,14 +72,14 @@ public:
   PostTask& operator=(const PostTask&) = delete;
 
   void DecodeResponse(const HttpResponse& httpResp) override {
-    google::protobuf::util::JsonParseOptions options;
-    options.ignore_unknown_fields = true;
-
     if (httpResp.result() != beast::http::status::ok) {
       decodeErrorResponse(httpResp);
       return;
     }
 
+    google::protobuf::util::JsonParseOptions options;
+    options.ignore_unknown_fields = true;
+
     auto status = google::protobuf::util::JsonStringToMessage(
       httpResp.body(),
       &*resp_,
@@ -101,13 +101,9 @@ public:
 
     google::protobuf::util::JsonPrintOptions options;
     options.preserve_proto_field_names = true;
-    options.always_print_primitive_fields = true;
+    options.always_print_primitive_fields = false;
     options.always_print_enums_as_ints = true;
-    auto status = google::protobuf::util::MessageToJsonString(
-      *req_,
-      &req.body(),
-      options
-    );
+    auto status = google::protobuf::util::MessageToJsonString(*req_, &req.body(), options);
 
     if (!status.ok()) {
       return fmt::format(
diff --git a/cpp/src/vereign/service/gen/action_service.cc b/cpp/src/vereign/service/gen/action_service.cc
new file mode 100644
index 0000000..53d3d6b
--- /dev/null
+++ b/cpp/src/vereign/service/gen/action_service.cc
@@ -0,0 +1,45 @@
+#include <vereign/service/gen/action_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string getActionsPath = "getActions";
+  const std::string getActionsWithoutSessionPath = "getActionsWithoutSession";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string ActionService::ServicePath = "/action/";
+
+ActionService::ActionService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<ActionService::GetActionsResult>
+ActionService::GetActions(
+    const client_library::GetActionsForm* req,
+    client_library::GetActionsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getActionsPath,
+    req,
+    resp
+  );
+}
+
+std::future<ActionService::GetActionsWithoutSessionResult>
+ActionService::GetActionsWithoutSession(
+    const client_library::GetActionsForm* req,
+    client_library::GetActionsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getActionsWithoutSessionPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/action_service.hh b/cpp/src/vereign/service/gen/action_service.hh
new file mode 100644
index 0000000..cc24323
--- /dev/null
+++ b/cpp/src/vereign/service/gen/action_service.hh
@@ -0,0 +1,57 @@
+#ifndef __VEREIGN_SERVICE_GEN_ACTION_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_ACTION_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class ActionService {
+public:
+  static const std::string ServicePath;
+
+  explicit ActionService(restapi::ClientSession& client_session);
+
+  ActionService(const ActionService&) = delete;
+  ActionService& operator=(const ActionService&) = delete;
+
+  using GetActionsResult = Result<
+    const client_library::GetActionsForm*,
+    client_library::GetActionsFormResponse*>;
+
+  std::future<GetActionsResult> GetActions(
+    const client_library::GetActionsForm* req,
+    client_library::GetActionsFormResponse* resp
+  );
+
+  using GetActionsWithoutSessionResult = Result<
+    const client_library::GetActionsForm*,
+    client_library::GetActionsFormResponse*>;
+
+  std::future<GetActionsWithoutSessionResult> GetActionsWithoutSession(
+    const client_library::GetActionsForm* req,
+    client_library::GetActionsFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_ACTION_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/activity_service.cc b/cpp/src/vereign/service/gen/activity_service.cc
new file mode 100644
index 0000000..1fc83d3
--- /dev/null
+++ b/cpp/src/vereign/service/gen/activity_service.cc
@@ -0,0 +1,32 @@
+#include <vereign/service/gen/activity_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string getActivityPath = "getActivity";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string ActivityService::ServicePath = "/activity/";
+
+ActivityService::ActivityService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<ActivityService::GetActivityResult>
+ActivityService::GetActivity(
+    const client_library::GetActivityForm* req,
+    client_library::GetActivityFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getActivityPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/activity_service.hh b/cpp/src/vereign/service/gen/activity_service.hh
new file mode 100644
index 0000000..620bb3b
--- /dev/null
+++ b/cpp/src/vereign/service/gen/activity_service.hh
@@ -0,0 +1,48 @@
+#ifndef __VEREIGN_SERVICE_GEN_ACTIVITY_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_ACTIVITY_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class ActivityService {
+public:
+  static const std::string ServicePath;
+
+  explicit ActivityService(restapi::ClientSession& client_session);
+
+  ActivityService(const ActivityService&) = delete;
+  ActivityService& operator=(const ActivityService&) = delete;
+
+  using GetActivityResult = Result<
+    const client_library::GetActivityForm*,
+    client_library::GetActivityFormResponse*>;
+
+  std::future<GetActivityResult> GetActivity(
+    const client_library::GetActivityForm* req,
+    client_library::GetActivityFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_ACTIVITY_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/company_service.cc b/cpp/src/vereign/service/gen/company_service.cc
new file mode 100644
index 0000000..9cd740d
--- /dev/null
+++ b/cpp/src/vereign/service/gen/company_service.cc
@@ -0,0 +1,305 @@
+#include <vereign/service/gen/company_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string addClaimToProfileTemplatePath = "addClaimToProfileTemplate";
+  const std::string addEmployeePath = "addEmployee";
+  const std::string addProfileTemplatePath = "addProfileTemplate";
+  const std::string addRolePath = "addRole";
+  const std::string addSharedIdentityPath = "addSharedIdentity";
+  const std::string applyProfileTemplatePath = "applyProfileTemplate";
+  const std::string applyRoleTemplatesToEmployeePath = "applyRoleTemplatesToEmployee";
+  const std::string createCompanyPath = "createCompany";
+  const std::string deleteCompanyLogoPath = "deleteCompanyLogo";
+  const std::string deleteRolePath = "deleteRole";
+  const std::string getCompanyLogoPath = "getCompanyLogo";
+  const std::string getInfrastructurePath = "getInfrastructure";
+  const std::string listCompaniesPath = "listCompanies";
+  const std::string listEmployeesPath = "listEmployees";
+  const std::string listEmployeesForSharedIdentityPath = "listEmployeesForSharedIdentity";
+  const std::string listProfileTemplatesPath = "listProfileTemplates";
+  const std::string listSharedIdentitiesPath = "listSharedIdentities";
+  const std::string listSharedIdentitiesForEmployeePath = "listSharedIdentitiesForEmployee";
+  const std::string listSubscribedTemplatesToRolePath = "listSubscribedTemplatesToRole";
+  const std::string putCompanyLogoPath = "putCompanyLogo";
+  const std::string removeClaimFromProfileTemplatePath = "removeClaimFromProfileTemplate";
+  const std::string updateEmployeeStatusPath = "updateEmployeeStatus";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string CompanyService::ServicePath = "/company/";
+
+CompanyService::CompanyService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<CompanyService::AddClaimToProfileTemplateResult>
+CompanyService::AddClaimToProfileTemplate(
+    const client_library::AddClaimToProfileTemplateForm* req,
+    client_library::AddClaimToProfileTemplateFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addClaimToProfileTemplatePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::AddEmployeeResult>
+CompanyService::AddEmployee(
+    const client_library::AddEmployeeForm* req,
+    client_library::AddEmployeeFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addEmployeePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::AddProfileTemplateResult>
+CompanyService::AddProfileTemplate(
+    const client_library::AddProfileTemplateForm* req,
+    client_library::AddProfileTemplateFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addProfileTemplatePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::AddRoleResult>
+CompanyService::AddRole(
+    const client_library::AddRoleForm* req,
+    client_library::AddRoleFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addRolePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::AddSharedIdentityResult>
+CompanyService::AddSharedIdentity(
+    const client_library::AddSharedIdentityForm* req,
+    client_library::AddSharedIdentityFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addSharedIdentityPath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::ApplyProfileTemplateResult>
+CompanyService::ApplyProfileTemplate(
+    const client_library::ApplyProfileTemplateForm* req,
+    client_library::ApplyProfileTemplateFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + applyProfileTemplatePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::ApplyRoleTemplatesToEmployeeResult>
+CompanyService::ApplyRoleTemplatesToEmployee(
+    const client_library::ApplyRoleTemplatesToEmployeeForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + applyRoleTemplatesToEmployeePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::CreateCompanyResult>
+CompanyService::CreateCompany(
+    const client_library::CreateCompanyForm* req,
+    client_library::CreateCompanyFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + createCompanyPath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::DeleteCompanyLogoResult>
+CompanyService::DeleteCompanyLogo(
+    const client_library::DeleteCompanyLogoForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + deleteCompanyLogoPath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::DeleteRoleResult>
+CompanyService::DeleteRole(
+    const client_library::DeleteRoleForm* req,
+    client_library::DeleteRoleFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + deleteRolePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::GetCompanyLogoResult>
+CompanyService::GetCompanyLogo(
+    const client_library::GetCompanyLogoForm* req,
+    client_library::GetCompanyLogoFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getCompanyLogoPath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::GetInfrastructureResult>
+CompanyService::GetInfrastructure(
+    const client_library::GetInfrastructureForm* req,
+    client_library::GetInfrastructureFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getInfrastructurePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::ListCompaniesResult>
+CompanyService::ListCompanies(
+    const client_library::ListCompaniesForm* req,
+    client_library::ListCompaniesFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listCompaniesPath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::ListEmployeesResult>
+CompanyService::ListEmployees(
+    const client_library::ListEmployeesForm* req,
+    client_library::ListEmployeesFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listEmployeesPath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::ListEmployeesForSharedIdentityResult>
+CompanyService::ListEmployeesForSharedIdentity(
+    const client_library::ListEmployeesForSharedIdentityForm* req,
+    client_library::ListEmployeesForSharedIdentityFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listEmployeesForSharedIdentityPath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::ListProfileTemplatesResult>
+CompanyService::ListProfileTemplates(
+    const client_library::ListProfileTemplatesForm* req,
+    client_library::ListProfileTemplatesFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listProfileTemplatesPath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::ListSharedIdentitiesResult>
+CompanyService::ListSharedIdentities(
+    const client_library::ListSharedIdentitiesForm* req,
+    client_library::ListSharedIdentitiesFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listSharedIdentitiesPath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::ListSharedIdentitiesForEmployeeResult>
+CompanyService::ListSharedIdentitiesForEmployee(
+    const client_library::ListSharedIdentitiesForEmployeeForm* req,
+    client_library::ListSharedIdentitiesForEmployeeFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listSharedIdentitiesForEmployeePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::ListSubscribedTemplatesToRoleResult>
+CompanyService::ListSubscribedTemplatesToRole(
+    const client_library::ListSubscribedTemplatesToRoleForm* req,
+    client_library::ListSubscribedTemplatesToRoleFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listSubscribedTemplatesToRolePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::PutCompanyLogoResult>
+CompanyService::PutCompanyLogo(
+    const client_library::PutCompanyLogoForm* req,
+    client_library::PutCompanyLogoFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + putCompanyLogoPath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::RemoveClaimFromProfileTemplateResult>
+CompanyService::RemoveClaimFromProfileTemplate(
+    const client_library::RemoveClaimFromProfileTemplateForm* req,
+    client_library::RemoveClaimFromProfileTemplateFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + removeClaimFromProfileTemplatePath,
+    req,
+    resp
+  );
+}
+
+std::future<CompanyService::UpdateEmployeeStatusResult>
+CompanyService::UpdateEmployeeStatus(
+    const client_library::UpdateEmployeeStatusForm* req,
+    client_library::UpdateEmployeeStatusFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + updateEmployeeStatusPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/company_service.hh b/cpp/src/vereign/service/gen/company_service.hh
new file mode 100644
index 0000000..ee59d4f
--- /dev/null
+++ b/cpp/src/vereign/service/gen/company_service.hh
@@ -0,0 +1,237 @@
+#ifndef __VEREIGN_SERVICE_GEN_COMPANY_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_COMPANY_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class CompanyService {
+public:
+  static const std::string ServicePath;
+
+  explicit CompanyService(restapi::ClientSession& client_session);
+
+  CompanyService(const CompanyService&) = delete;
+  CompanyService& operator=(const CompanyService&) = delete;
+
+  using AddClaimToProfileTemplateResult = Result<
+    const client_library::AddClaimToProfileTemplateForm*,
+    client_library::AddClaimToProfileTemplateFormResponse*>;
+
+  std::future<AddClaimToProfileTemplateResult> AddClaimToProfileTemplate(
+    const client_library::AddClaimToProfileTemplateForm* req,
+    client_library::AddClaimToProfileTemplateFormResponse* resp
+  );
+
+  using AddEmployeeResult = Result<
+    const client_library::AddEmployeeForm*,
+    client_library::AddEmployeeFormResponse*>;
+
+  std::future<AddEmployeeResult> AddEmployee(
+    const client_library::AddEmployeeForm* req,
+    client_library::AddEmployeeFormResponse* resp
+  );
+
+  using AddProfileTemplateResult = Result<
+    const client_library::AddProfileTemplateForm*,
+    client_library::AddProfileTemplateFormResponse*>;
+
+  std::future<AddProfileTemplateResult> AddProfileTemplate(
+    const client_library::AddProfileTemplateForm* req,
+    client_library::AddProfileTemplateFormResponse* resp
+  );
+
+  using AddRoleResult = Result<
+    const client_library::AddRoleForm*,
+    client_library::AddRoleFormResponse*>;
+
+  std::future<AddRoleResult> AddRole(
+    const client_library::AddRoleForm* req,
+    client_library::AddRoleFormResponse* resp
+  );
+
+  using AddSharedIdentityResult = Result<
+    const client_library::AddSharedIdentityForm*,
+    client_library::AddSharedIdentityFormResponse*>;
+
+  std::future<AddSharedIdentityResult> AddSharedIdentity(
+    const client_library::AddSharedIdentityForm* req,
+    client_library::AddSharedIdentityFormResponse* resp
+  );
+
+  using ApplyProfileTemplateResult = Result<
+    const client_library::ApplyProfileTemplateForm*,
+    client_library::ApplyProfileTemplateFormResponse*>;
+
+  std::future<ApplyProfileTemplateResult> ApplyProfileTemplate(
+    const client_library::ApplyProfileTemplateForm* req,
+    client_library::ApplyProfileTemplateFormResponse* resp
+  );
+
+  using ApplyRoleTemplatesToEmployeeResult = Result<
+    const client_library::ApplyRoleTemplatesToEmployeeForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<ApplyRoleTemplatesToEmployeeResult> ApplyRoleTemplatesToEmployee(
+    const client_library::ApplyRoleTemplatesToEmployeeForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using CreateCompanyResult = Result<
+    const client_library::CreateCompanyForm*,
+    client_library::CreateCompanyFormResponse*>;
+
+  std::future<CreateCompanyResult> CreateCompany(
+    const client_library::CreateCompanyForm* req,
+    client_library::CreateCompanyFormResponse* resp
+  );
+
+  using DeleteCompanyLogoResult = Result<
+    const client_library::DeleteCompanyLogoForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<DeleteCompanyLogoResult> DeleteCompanyLogo(
+    const client_library::DeleteCompanyLogoForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using DeleteRoleResult = Result<
+    const client_library::DeleteRoleForm*,
+    client_library::DeleteRoleFormResponse*>;
+
+  std::future<DeleteRoleResult> DeleteRole(
+    const client_library::DeleteRoleForm* req,
+    client_library::DeleteRoleFormResponse* resp
+  );
+
+  using GetCompanyLogoResult = Result<
+    const client_library::GetCompanyLogoForm*,
+    client_library::GetCompanyLogoFormResponse*>;
+
+  std::future<GetCompanyLogoResult> GetCompanyLogo(
+    const client_library::GetCompanyLogoForm* req,
+    client_library::GetCompanyLogoFormResponse* resp
+  );
+
+  using GetInfrastructureResult = Result<
+    const client_library::GetInfrastructureForm*,
+    client_library::GetInfrastructureFormResponse*>;
+
+  std::future<GetInfrastructureResult> GetInfrastructure(
+    const client_library::GetInfrastructureForm* req,
+    client_library::GetInfrastructureFormResponse* resp
+  );
+
+  using ListCompaniesResult = Result<
+    const client_library::ListCompaniesForm*,
+    client_library::ListCompaniesFormResponse*>;
+
+  std::future<ListCompaniesResult> ListCompanies(
+    const client_library::ListCompaniesForm* req,
+    client_library::ListCompaniesFormResponse* resp
+  );
+
+  using ListEmployeesResult = Result<
+    const client_library::ListEmployeesForm*,
+    client_library::ListEmployeesFormResponse*>;
+
+  std::future<ListEmployeesResult> ListEmployees(
+    const client_library::ListEmployeesForm* req,
+    client_library::ListEmployeesFormResponse* resp
+  );
+
+  using ListEmployeesForSharedIdentityResult = Result<
+    const client_library::ListEmployeesForSharedIdentityForm*,
+    client_library::ListEmployeesForSharedIdentityFormResponse*>;
+
+  std::future<ListEmployeesForSharedIdentityResult> ListEmployeesForSharedIdentity(
+    const client_library::ListEmployeesForSharedIdentityForm* req,
+    client_library::ListEmployeesForSharedIdentityFormResponse* resp
+  );
+
+  using ListProfileTemplatesResult = Result<
+    const client_library::ListProfileTemplatesForm*,
+    client_library::ListProfileTemplatesFormResponse*>;
+
+  std::future<ListProfileTemplatesResult> ListProfileTemplates(
+    const client_library::ListProfileTemplatesForm* req,
+    client_library::ListProfileTemplatesFormResponse* resp
+  );
+
+  using ListSharedIdentitiesResult = Result<
+    const client_library::ListSharedIdentitiesForm*,
+    client_library::ListSharedIdentitiesFormResponse*>;
+
+  std::future<ListSharedIdentitiesResult> ListSharedIdentities(
+    const client_library::ListSharedIdentitiesForm* req,
+    client_library::ListSharedIdentitiesFormResponse* resp
+  );
+
+  using ListSharedIdentitiesForEmployeeResult = Result<
+    const client_library::ListSharedIdentitiesForEmployeeForm*,
+    client_library::ListSharedIdentitiesForEmployeeFormResponse*>;
+
+  std::future<ListSharedIdentitiesForEmployeeResult> ListSharedIdentitiesForEmployee(
+    const client_library::ListSharedIdentitiesForEmployeeForm* req,
+    client_library::ListSharedIdentitiesForEmployeeFormResponse* resp
+  );
+
+  using ListSubscribedTemplatesToRoleResult = Result<
+    const client_library::ListSubscribedTemplatesToRoleForm*,
+    client_library::ListSubscribedTemplatesToRoleFormResponse*>;
+
+  std::future<ListSubscribedTemplatesToRoleResult> ListSubscribedTemplatesToRole(
+    const client_library::ListSubscribedTemplatesToRoleForm* req,
+    client_library::ListSubscribedTemplatesToRoleFormResponse* resp
+  );
+
+  using PutCompanyLogoResult = Result<
+    const client_library::PutCompanyLogoForm*,
+    client_library::PutCompanyLogoFormResponse*>;
+
+  std::future<PutCompanyLogoResult> PutCompanyLogo(
+    const client_library::PutCompanyLogoForm* req,
+    client_library::PutCompanyLogoFormResponse* resp
+  );
+
+  using RemoveClaimFromProfileTemplateResult = Result<
+    const client_library::RemoveClaimFromProfileTemplateForm*,
+    client_library::RemoveClaimFromProfileTemplateFormResponse*>;
+
+  std::future<RemoveClaimFromProfileTemplateResult> RemoveClaimFromProfileTemplate(
+    const client_library::RemoveClaimFromProfileTemplateForm* req,
+    client_library::RemoveClaimFromProfileTemplateFormResponse* resp
+  );
+
+  using UpdateEmployeeStatusResult = Result<
+    const client_library::UpdateEmployeeStatusForm*,
+    client_library::UpdateEmployeeStatusFormResponse*>;
+
+  std::future<UpdateEmployeeStatusResult> UpdateEmployeeStatus(
+    const client_library::UpdateEmployeeStatusForm* req,
+    client_library::UpdateEmployeeStatusFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_COMPANY_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/contacts_service.cc b/cpp/src/vereign/service/gen/contacts_service.cc
new file mode 100644
index 0000000..e23a662
--- /dev/null
+++ b/cpp/src/vereign/service/gen/contacts_service.cc
@@ -0,0 +1,71 @@
+#include <vereign/service/gen/contacts_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string changeStatusPath = "changeStatus";
+  const std::string getUserContactsPath = "getUserContacts";
+  const std::string listContactsPath = "listContacts";
+  const std::string searchContactsPath = "searchContacts";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string ContactsService::ServicePath = "/contacts/";
+
+ContactsService::ContactsService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<ContactsService::ChangeStatusResult>
+ContactsService::ChangeStatus(
+    const client_library::ChangeStatusForm* req,
+    client_library::ChangeStatusFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + changeStatusPath,
+    req,
+    resp
+  );
+}
+
+std::future<ContactsService::GetUserContactsResult>
+ContactsService::GetUserContacts(
+    const client_library::GetUserContactsForm* req,
+    client_library::GetUserContactsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getUserContactsPath,
+    req,
+    resp
+  );
+}
+
+std::future<ContactsService::ListContactsResult>
+ContactsService::ListContacts(
+    const client_library::ListContactsForm* req,
+    client_library::ListContactsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listContactsPath,
+    req,
+    resp
+  );
+}
+
+std::future<ContactsService::SearchContactsResult>
+ContactsService::SearchContacts(
+    const client_library::SearchContactsForm* req,
+    client_library::SearchContactsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + searchContactsPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/contacts_service.hh b/cpp/src/vereign/service/gen/contacts_service.hh
new file mode 100644
index 0000000..3b11f3b
--- /dev/null
+++ b/cpp/src/vereign/service/gen/contacts_service.hh
@@ -0,0 +1,75 @@
+#ifndef __VEREIGN_SERVICE_GEN_CONTACTS_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_CONTACTS_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class ContactsService {
+public:
+  static const std::string ServicePath;
+
+  explicit ContactsService(restapi::ClientSession& client_session);
+
+  ContactsService(const ContactsService&) = delete;
+  ContactsService& operator=(const ContactsService&) = delete;
+
+  using ChangeStatusResult = Result<
+    const client_library::ChangeStatusForm*,
+    client_library::ChangeStatusFormResponse*>;
+
+  std::future<ChangeStatusResult> ChangeStatus(
+    const client_library::ChangeStatusForm* req,
+    client_library::ChangeStatusFormResponse* resp
+  );
+
+  using GetUserContactsResult = Result<
+    const client_library::GetUserContactsForm*,
+    client_library::GetUserContactsFormResponse*>;
+
+  std::future<GetUserContactsResult> GetUserContacts(
+    const client_library::GetUserContactsForm* req,
+    client_library::GetUserContactsFormResponse* resp
+  );
+
+  using ListContactsResult = Result<
+    const client_library::ListContactsForm*,
+    client_library::ListContactsFormResponse*>;
+
+  std::future<ListContactsResult> ListContacts(
+    const client_library::ListContactsForm* req,
+    client_library::ListContactsFormResponse* resp
+  );
+
+  using SearchContactsResult = Result<
+    const client_library::SearchContactsForm*,
+    client_library::SearchContactsFormResponse*>;
+
+  std::future<SearchContactsResult> SearchContacts(
+    const client_library::SearchContactsForm* req,
+    client_library::SearchContactsFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_CONTACTS_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/conversation_service.cc b/cpp/src/vereign/service/gen/conversation_service.cc
new file mode 100644
index 0000000..1074092
--- /dev/null
+++ b/cpp/src/vereign/service/gen/conversation_service.cc
@@ -0,0 +1,71 @@
+#include <vereign/service/gen/conversation_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string addEmailPath = "addEmail";
+  const std::string getConversationsPath = "getConversations";
+  const std::string getConversationsAndMessageIDByMessageUUIDPath = "getConversationsAndMessageIDByMessageUUID";
+  const std::string getEmailsPath = "getEmails";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string ConversationService::ServicePath = "/conversation/";
+
+ConversationService::ConversationService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<ConversationService::AddEmailResult>
+ConversationService::AddEmail(
+    const client_library::AddEmailForm* req,
+    client_library::AddEmailFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addEmailPath,
+    req,
+    resp
+  );
+}
+
+std::future<ConversationService::GetConversationsResult>
+ConversationService::GetConversations(
+    const client_library::GetConversationsForm* req,
+    client_library::GetConversationsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getConversationsPath,
+    req,
+    resp
+  );
+}
+
+std::future<ConversationService::GetConversationsAndMessageIDByMessageUUIDResult>
+ConversationService::GetConversationsAndMessageIDByMessageUUID(
+    const client_library::GetConversationsAndMessageIDByMessageUUIDForm* req,
+    client_library::GetConversationsAndMessageIDByMessageUUIDResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getConversationsAndMessageIDByMessageUUIDPath,
+    req,
+    resp
+  );
+}
+
+std::future<ConversationService::GetEmailsResult>
+ConversationService::GetEmails(
+    const client_library::GetEmailsForm* req,
+    client_library::GetEmailsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getEmailsPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/conversation_service.hh b/cpp/src/vereign/service/gen/conversation_service.hh
new file mode 100644
index 0000000..01031de
--- /dev/null
+++ b/cpp/src/vereign/service/gen/conversation_service.hh
@@ -0,0 +1,75 @@
+#ifndef __VEREIGN_SERVICE_GEN_CONVERSATION_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_CONVERSATION_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class ConversationService {
+public:
+  static const std::string ServicePath;
+
+  explicit ConversationService(restapi::ClientSession& client_session);
+
+  ConversationService(const ConversationService&) = delete;
+  ConversationService& operator=(const ConversationService&) = delete;
+
+  using AddEmailResult = Result<
+    const client_library::AddEmailForm*,
+    client_library::AddEmailFormResponse*>;
+
+  std::future<AddEmailResult> AddEmail(
+    const client_library::AddEmailForm* req,
+    client_library::AddEmailFormResponse* resp
+  );
+
+  using GetConversationsResult = Result<
+    const client_library::GetConversationsForm*,
+    client_library::GetConversationsFormResponse*>;
+
+  std::future<GetConversationsResult> GetConversations(
+    const client_library::GetConversationsForm* req,
+    client_library::GetConversationsFormResponse* resp
+  );
+
+  using GetConversationsAndMessageIDByMessageUUIDResult = Result<
+    const client_library::GetConversationsAndMessageIDByMessageUUIDForm*,
+    client_library::GetConversationsAndMessageIDByMessageUUIDResponse*>;
+
+  std::future<GetConversationsAndMessageIDByMessageUUIDResult> GetConversationsAndMessageIDByMessageUUID(
+    const client_library::GetConversationsAndMessageIDByMessageUUIDForm* req,
+    client_library::GetConversationsAndMessageIDByMessageUUIDResponse* resp
+  );
+
+  using GetEmailsResult = Result<
+    const client_library::GetEmailsForm*,
+    client_library::GetEmailsFormResponse*>;
+
+  std::future<GetEmailsResult> GetEmails(
+    const client_library::GetEmailsForm* req,
+    client_library::GetEmailsFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_CONVERSATION_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/delete_service.cc b/cpp/src/vereign/service/gen/delete_service.cc
new file mode 100644
index 0000000..11da596
--- /dev/null
+++ b/cpp/src/vereign/service/gen/delete_service.cc
@@ -0,0 +1,45 @@
+#include <vereign/service/gen/delete_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string deleteInteractionPath = "deleteInteraction";
+  const std::string deletePassportPath = "deletePassport";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string DeleteService::ServicePath = "/delete/";
+
+DeleteService::DeleteService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<DeleteService::DeleteInteractionResult>
+DeleteService::DeleteInteraction(
+    const client_library::DeleteInteractionForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + deleteInteractionPath,
+    req,
+    resp
+  );
+}
+
+std::future<DeleteService::DeletePassportResult>
+DeleteService::DeletePassport(
+    const client_library::DeletePassportForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + deletePassportPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/delete_service.hh b/cpp/src/vereign/service/gen/delete_service.hh
new file mode 100644
index 0000000..7e5ddfd
--- /dev/null
+++ b/cpp/src/vereign/service/gen/delete_service.hh
@@ -0,0 +1,57 @@
+#ifndef __VEREIGN_SERVICE_GEN_DELETE_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_DELETE_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class DeleteService {
+public:
+  static const std::string ServicePath;
+
+  explicit DeleteService(restapi::ClientSession& client_session);
+
+  DeleteService(const DeleteService&) = delete;
+  DeleteService& operator=(const DeleteService&) = delete;
+
+  using DeleteInteractionResult = Result<
+    const client_library::DeleteInteractionForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<DeleteInteractionResult> DeleteInteraction(
+    const client_library::DeleteInteractionForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using DeletePassportResult = Result<
+    const client_library::DeletePassportForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<DeletePassportResult> DeletePassport(
+    const client_library::DeletePassportForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_DELETE_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/document_service.cc b/cpp/src/vereign/service/gen/document_service.cc
new file mode 100644
index 0000000..68d18f8
--- /dev/null
+++ b/cpp/src/vereign/service/gen/document_service.cc
@@ -0,0 +1,162 @@
+#include <vereign/service/gen/document_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string convertDocumentByUUIDPath = "convertDocumentByUUID";
+  const std::string deleteIdentityImagePath = "deleteIdentityImage";
+  const std::string getDocumentPath = "getDocument";
+  const std::string getDocumentByResourceIDPath = "getDocumentByResourceID";
+  const std::string getDocumentByUUIDPath = "getDocumentByUUID";
+  const std::string getFileInfoPath = "getFileInfo";
+  const std::string getIdentityImagePath = "getIdentityImage";
+  const std::string listDocumentsPath = "listDocuments";
+  const std::string putDocumentByUUIDPath = "putDocumentByUUID";
+  const std::string putIdentityImagePath = "putIdentityImage";
+  const std::string signDocumentByUUIDPath = "signDocumentByUUID";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string DocumentService::ServicePath = "/document/";
+
+DocumentService::DocumentService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<DocumentService::ConvertDocumentByUUIDResult>
+DocumentService::ConvertDocumentByUUID(
+    const client_library::ConvertDocumentByUUIDForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + convertDocumentByUUIDPath,
+    req,
+    resp
+  );
+}
+
+std::future<DocumentService::DeleteIdentityImageResult>
+DocumentService::DeleteIdentityImage(
+    const client_library::DeleteIdentityImageForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + deleteIdentityImagePath,
+    req,
+    resp
+  );
+}
+
+std::future<DocumentService::GetDocumentResult>
+DocumentService::GetDocument(
+    const client_library::EmptyRequest* req,
+    client_library::ListDocumentsResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getDocumentPath,
+    req,
+    resp
+  );
+}
+
+std::future<DocumentService::GetDocumentByResourceIDResult>
+DocumentService::GetDocumentByResourceID(
+    const client_library::GetDocumentByResourceIDForm* req,
+    client_library::GetDocumentByResourceIDFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getDocumentByResourceIDPath,
+    req,
+    resp
+  );
+}
+
+std::future<DocumentService::GetDocumentByUUIDResult>
+DocumentService::GetDocumentByUUID(
+    const client_library::GetDocumentByUUIDForm* req,
+    client_library::GetDocumentByUUIDFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getDocumentByUUIDPath,
+    req,
+    resp
+  );
+}
+
+std::future<DocumentService::GetFileInfoResult>
+DocumentService::GetFileInfo(
+    const client_library::EmptyRequest* req,
+    client_library::GetFileInfoResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getFileInfoPath,
+    req,
+    resp
+  );
+}
+
+std::future<DocumentService::GetIdentityImageResult>
+DocumentService::GetIdentityImage(
+    const client_library::GetIdentityImageForm* req,
+    client_library::GetIdentityImageFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getIdentityImagePath,
+    req,
+    resp
+  );
+}
+
+std::future<DocumentService::ListDocumentsResult>
+DocumentService::ListDocuments(
+    const client_library::EmptyRequest* req,
+    client_library::ListDocumentsResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listDocumentsPath,
+    req,
+    resp
+  );
+}
+
+std::future<DocumentService::PutDocumentByUUIDResult>
+DocumentService::PutDocumentByUUID(
+    const client_library::PutDocumentByUUIDForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + putDocumentByUUIDPath,
+    req,
+    resp
+  );
+}
+
+std::future<DocumentService::PutIdentityImageResult>
+DocumentService::PutIdentityImage(
+    const client_library::PutIdentityImageForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + putIdentityImagePath,
+    req,
+    resp
+  );
+}
+
+std::future<DocumentService::SignDocumentByUUIDResult>
+DocumentService::SignDocumentByUUID(
+    const client_library::SignDocumentByUUIDForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + signDocumentByUUIDPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/document_service.hh b/cpp/src/vereign/service/gen/document_service.hh
new file mode 100644
index 0000000..8d78e7d
--- /dev/null
+++ b/cpp/src/vereign/service/gen/document_service.hh
@@ -0,0 +1,138 @@
+#ifndef __VEREIGN_SERVICE_GEN_DOCUMENT_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_DOCUMENT_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class DocumentService {
+public:
+  static const std::string ServicePath;
+
+  explicit DocumentService(restapi::ClientSession& client_session);
+
+  DocumentService(const DocumentService&) = delete;
+  DocumentService& operator=(const DocumentService&) = delete;
+
+  using ConvertDocumentByUUIDResult = Result<
+    const client_library::ConvertDocumentByUUIDForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<ConvertDocumentByUUIDResult> ConvertDocumentByUUID(
+    const client_library::ConvertDocumentByUUIDForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using DeleteIdentityImageResult = Result<
+    const client_library::DeleteIdentityImageForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<DeleteIdentityImageResult> DeleteIdentityImage(
+    const client_library::DeleteIdentityImageForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using GetDocumentResult = Result<
+    const client_library::EmptyRequest*,
+    client_library::ListDocumentsResponse*>;
+
+  std::future<GetDocumentResult> GetDocument(
+    const client_library::EmptyRequest* req,
+    client_library::ListDocumentsResponse* resp
+  );
+
+  using GetDocumentByResourceIDResult = Result<
+    const client_library::GetDocumentByResourceIDForm*,
+    client_library::GetDocumentByResourceIDFormResponse*>;
+
+  std::future<GetDocumentByResourceIDResult> GetDocumentByResourceID(
+    const client_library::GetDocumentByResourceIDForm* req,
+    client_library::GetDocumentByResourceIDFormResponse* resp
+  );
+
+  using GetDocumentByUUIDResult = Result<
+    const client_library::GetDocumentByUUIDForm*,
+    client_library::GetDocumentByUUIDFormResponse*>;
+
+  std::future<GetDocumentByUUIDResult> GetDocumentByUUID(
+    const client_library::GetDocumentByUUIDForm* req,
+    client_library::GetDocumentByUUIDFormResponse* resp
+  );
+
+  using GetFileInfoResult = Result<
+    const client_library::EmptyRequest*,
+    client_library::GetFileInfoResponse*>;
+
+  std::future<GetFileInfoResult> GetFileInfo(
+    const client_library::EmptyRequest* req,
+    client_library::GetFileInfoResponse* resp
+  );
+
+  using GetIdentityImageResult = Result<
+    const client_library::GetIdentityImageForm*,
+    client_library::GetIdentityImageFormResponse*>;
+
+  std::future<GetIdentityImageResult> GetIdentityImage(
+    const client_library::GetIdentityImageForm* req,
+    client_library::GetIdentityImageFormResponse* resp
+  );
+
+  using ListDocumentsResult = Result<
+    const client_library::EmptyRequest*,
+    client_library::ListDocumentsResponse*>;
+
+  std::future<ListDocumentsResult> ListDocuments(
+    const client_library::EmptyRequest* req,
+    client_library::ListDocumentsResponse* resp
+  );
+
+  using PutDocumentByUUIDResult = Result<
+    const client_library::PutDocumentByUUIDForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<PutDocumentByUUIDResult> PutDocumentByUUID(
+    const client_library::PutDocumentByUUIDForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using PutIdentityImageResult = Result<
+    const client_library::PutIdentityImageForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<PutIdentityImageResult> PutIdentityImage(
+    const client_library::PutIdentityImageForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using SignDocumentByUUIDResult = Result<
+    const client_library::SignDocumentByUUIDForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<SignDocumentByUUIDResult> SignDocumentByUUID(
+    const client_library::SignDocumentByUUIDForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_DOCUMENT_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/email_service.cc b/cpp/src/vereign/service/gen/email_service.cc
new file mode 100644
index 0000000..bb3b681
--- /dev/null
+++ b/cpp/src/vereign/service/gen/email_service.cc
@@ -0,0 +1,136 @@
+#include <vereign/service/gen/email_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string getEmailStatusAllPath = "getEmailStatusAll";
+  const std::string getEmailStatusListPath = "getEmailStatusList";
+  const std::string getGmailMessageIDsByGmailThreadIDPath = "getGmailMessageIDsByGmailThreadID";
+  const std::string getMessageIDsByGmailMessageIDsPath = "getMessageIDsByGmailMessageIDs";
+  const std::string initializeEmailStatusPath = "initializeEmailStatus";
+  const std::string sendEmailSmtpPath = "sendEmailSmtp";
+  const std::string sendFeedbackPath = "sendFeedback";
+  const std::string storeGmailMessageIdPath = "storeGmailMessageId";
+  const std::string updateRecipientEmailStatusPath = "updateRecipientEmailStatus";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string EmailService::ServicePath = "/email/";
+
+EmailService::EmailService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<EmailService::GetEmailStatusAllResult>
+EmailService::GetEmailStatusAll(
+    const client_library::GetEmailStatusAllForm* req,
+    client_library::GetEmailStatusAllFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getEmailStatusAllPath,
+    req,
+    resp
+  );
+}
+
+std::future<EmailService::GetEmailStatusListResult>
+EmailService::GetEmailStatusList(
+    const client_library::GetEmailStatusListForm* req,
+    client_library::GetEmailStatusListFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getEmailStatusListPath,
+    req,
+    resp
+  );
+}
+
+std::future<EmailService::GetGmailMessageIDsByGmailThreadIDResult>
+EmailService::GetGmailMessageIDsByGmailThreadID(
+    const client_library::GetGmailMessageIDsByGmailThreadIDForm* req,
+    client_library::GetGmailMessageIDsByGmailThreadIDFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getGmailMessageIDsByGmailThreadIDPath,
+    req,
+    resp
+  );
+}
+
+std::future<EmailService::GetMessageIDsByGmailMessageIDsResult>
+EmailService::GetMessageIDsByGmailMessageIDs(
+    const client_library::GetMessageIDsByGmailMessageIDsForm* req,
+    client_library::GetMessageIDsByGmailMessageIDsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getMessageIDsByGmailMessageIDsPath,
+    req,
+    resp
+  );
+}
+
+std::future<EmailService::InitializeEmailStatusResult>
+EmailService::InitializeEmailStatus(
+    const client_library::InitializeEmailStatusForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + initializeEmailStatusPath,
+    req,
+    resp
+  );
+}
+
+std::future<EmailService::SendEmailSmtpResult>
+EmailService::SendEmailSmtp(
+    const client_library::SendEmailSmtpForm* req,
+    client_library::SendEmailSmtpFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + sendEmailSmtpPath,
+    req,
+    resp
+  );
+}
+
+std::future<EmailService::SendFeedbackResult>
+EmailService::SendFeedback(
+    const client_library::SendFeedbackForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + sendFeedbackPath,
+    req,
+    resp
+  );
+}
+
+std::future<EmailService::StoreGmailMessageIdResult>
+EmailService::StoreGmailMessageId(
+    const client_library::StoreGmailMessageIdForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + storeGmailMessageIdPath,
+    req,
+    resp
+  );
+}
+
+std::future<EmailService::UpdateRecipientEmailStatusResult>
+EmailService::UpdateRecipientEmailStatus(
+    const client_library::UpdateRecipientEmailStatusForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + updateRecipientEmailStatusPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/email_service.hh b/cpp/src/vereign/service/gen/email_service.hh
new file mode 100644
index 0000000..9f25846
--- /dev/null
+++ b/cpp/src/vereign/service/gen/email_service.hh
@@ -0,0 +1,120 @@
+#ifndef __VEREIGN_SERVICE_GEN_EMAIL_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_EMAIL_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class EmailService {
+public:
+  static const std::string ServicePath;
+
+  explicit EmailService(restapi::ClientSession& client_session);
+
+  EmailService(const EmailService&) = delete;
+  EmailService& operator=(const EmailService&) = delete;
+
+  using GetEmailStatusAllResult = Result<
+    const client_library::GetEmailStatusAllForm*,
+    client_library::GetEmailStatusAllFormResponse*>;
+
+  std::future<GetEmailStatusAllResult> GetEmailStatusAll(
+    const client_library::GetEmailStatusAllForm* req,
+    client_library::GetEmailStatusAllFormResponse* resp
+  );
+
+  using GetEmailStatusListResult = Result<
+    const client_library::GetEmailStatusListForm*,
+    client_library::GetEmailStatusListFormResponse*>;
+
+  std::future<GetEmailStatusListResult> GetEmailStatusList(
+    const client_library::GetEmailStatusListForm* req,
+    client_library::GetEmailStatusListFormResponse* resp
+  );
+
+  using GetGmailMessageIDsByGmailThreadIDResult = Result<
+    const client_library::GetGmailMessageIDsByGmailThreadIDForm*,
+    client_library::GetGmailMessageIDsByGmailThreadIDFormResponse*>;
+
+  std::future<GetGmailMessageIDsByGmailThreadIDResult> GetGmailMessageIDsByGmailThreadID(
+    const client_library::GetGmailMessageIDsByGmailThreadIDForm* req,
+    client_library::GetGmailMessageIDsByGmailThreadIDFormResponse* resp
+  );
+
+  using GetMessageIDsByGmailMessageIDsResult = Result<
+    const client_library::GetMessageIDsByGmailMessageIDsForm*,
+    client_library::GetMessageIDsByGmailMessageIDsFormResponse*>;
+
+  std::future<GetMessageIDsByGmailMessageIDsResult> GetMessageIDsByGmailMessageIDs(
+    const client_library::GetMessageIDsByGmailMessageIDsForm* req,
+    client_library::GetMessageIDsByGmailMessageIDsFormResponse* resp
+  );
+
+  using InitializeEmailStatusResult = Result<
+    const client_library::InitializeEmailStatusForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<InitializeEmailStatusResult> InitializeEmailStatus(
+    const client_library::InitializeEmailStatusForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using SendEmailSmtpResult = Result<
+    const client_library::SendEmailSmtpForm*,
+    client_library::SendEmailSmtpFormResponse*>;
+
+  std::future<SendEmailSmtpResult> SendEmailSmtp(
+    const client_library::SendEmailSmtpForm* req,
+    client_library::SendEmailSmtpFormResponse* resp
+  );
+
+  using SendFeedbackResult = Result<
+    const client_library::SendFeedbackForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<SendFeedbackResult> SendFeedback(
+    const client_library::SendFeedbackForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using StoreGmailMessageIdResult = Result<
+    const client_library::StoreGmailMessageIdForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<StoreGmailMessageIdResult> StoreGmailMessageId(
+    const client_library::StoreGmailMessageIdForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using UpdateRecipientEmailStatusResult = Result<
+    const client_library::UpdateRecipientEmailStatusForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<UpdateRecipientEmailStatusResult> UpdateRecipientEmailStatus(
+    const client_library::UpdateRecipientEmailStatusForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_EMAIL_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/entity_service.cc b/cpp/src/vereign/service/gen/entity_service.cc
new file mode 100644
index 0000000..b5294a6
--- /dev/null
+++ b/cpp/src/vereign/service/gen/entity_service.cc
@@ -0,0 +1,305 @@
+#include <vereign/service/gen/entity_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string addChildPath = "addChild";
+  const std::string addClaimPath = "addClaim";
+  const std::string addGuardedPath = "addGuarded";
+  const std::string addGuardianPath = "addGuardian";
+  const std::string addMemberPath = "addMember";
+  const std::string addMemberOfPath = "addMemberOf";
+  const std::string addParentPath = "addParent";
+  const std::string addViewerPath = "addViewer";
+  const std::string createEntityPath = "createEntity";
+  const std::string deleteClaimPath = "deleteClaim";
+  const std::string getClaimPath = "getClaim";
+  const std::string getEntityPath = "getEntity";
+  const std::string removeChildPath = "removeChild";
+  const std::string removeGuardedPath = "removeGuarded";
+  const std::string removeGuardianPath = "removeGuardian";
+  const std::string removeMemberPath = "removeMember";
+  const std::string removeMemberOfPath = "removeMemberOf";
+  const std::string removeParentPath = "removeParent";
+  const std::string removeViewerPath = "removeViewer";
+  const std::string sendClaimCodePath = "sendClaimCode";
+  const std::string updateClaimPath = "updateClaim";
+  const std::string verifyClaimCodePath = "verifyClaimCode";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string EntityService::ServicePath = "/entity/";
+
+EntityService::EntityService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<EntityService::AddChildResult>
+EntityService::AddChild(
+    const client_library::AddChildForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addChildPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::AddClaimResult>
+EntityService::AddClaim(
+    const client_library::AddClaimForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addClaimPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::AddGuardedResult>
+EntityService::AddGuarded(
+    const client_library::AddGuardedForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addGuardedPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::AddGuardianResult>
+EntityService::AddGuardian(
+    const client_library::AddGuardianForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addGuardianPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::AddMemberResult>
+EntityService::AddMember(
+    const client_library::AddMemberForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addMemberPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::AddMemberOfResult>
+EntityService::AddMemberOf(
+    const client_library::AddMemberOfForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addMemberOfPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::AddParentResult>
+EntityService::AddParent(
+    const client_library::AddParentForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addParentPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::AddViewerResult>
+EntityService::AddViewer(
+    const client_library::AddViewerForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + addViewerPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::CreateEntityResult>
+EntityService::CreateEntity(
+    const client_library::CreateEntityForm* req,
+    client_library::CreateEntityFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + createEntityPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::DeleteClaimResult>
+EntityService::DeleteClaim(
+    const client_library::DeleteClaimForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + deleteClaimPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::GetClaimResult>
+EntityService::GetClaim(
+    const client_library::GetClaimForm* req,
+    client_library::GetClaimFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getClaimPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::GetEntityResult>
+EntityService::GetEntity(
+    const client_library::GetEntityForm* req,
+    client_library::GetEntityFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getEntityPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::RemoveChildResult>
+EntityService::RemoveChild(
+    const client_library::RemoveChildForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + removeChildPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::RemoveGuardedResult>
+EntityService::RemoveGuarded(
+    const client_library::RemoveGuardedForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + removeGuardedPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::RemoveGuardianResult>
+EntityService::RemoveGuardian(
+    const client_library::RemoveGuardianForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + removeGuardianPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::RemoveMemberResult>
+EntityService::RemoveMember(
+    const client_library::RemoveMemberForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + removeMemberPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::RemoveMemberOfResult>
+EntityService::RemoveMemberOf(
+    const client_library::RemoveMemberOfForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + removeMemberOfPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::RemoveParentResult>
+EntityService::RemoveParent(
+    const client_library::RemoveParentForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + removeParentPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::RemoveViewerResult>
+EntityService::RemoveViewer(
+    const client_library::RemoveViewerForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + removeViewerPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::SendClaimCodeResult>
+EntityService::SendClaimCode(
+    const client_library::ClaimSendCodeForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + sendClaimCodePath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::UpdateClaimResult>
+EntityService::UpdateClaim(
+    const client_library::AddClaimForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + updateClaimPath,
+    req,
+    resp
+  );
+}
+
+std::future<EntityService::VerifyClaimCodeResult>
+EntityService::VerifyClaimCode(
+    const client_library::ClaimVerifyCodeForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + verifyClaimCodePath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/entity_service.hh b/cpp/src/vereign/service/gen/entity_service.hh
new file mode 100644
index 0000000..322ae79
--- /dev/null
+++ b/cpp/src/vereign/service/gen/entity_service.hh
@@ -0,0 +1,237 @@
+#ifndef __VEREIGN_SERVICE_GEN_ENTITY_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_ENTITY_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class EntityService {
+public:
+  static const std::string ServicePath;
+
+  explicit EntityService(restapi::ClientSession& client_session);
+
+  EntityService(const EntityService&) = delete;
+  EntityService& operator=(const EntityService&) = delete;
+
+  using AddChildResult = Result<
+    const client_library::AddChildForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AddChildResult> AddChild(
+    const client_library::AddChildForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using AddClaimResult = Result<
+    const client_library::AddClaimForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AddClaimResult> AddClaim(
+    const client_library::AddClaimForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using AddGuardedResult = Result<
+    const client_library::AddGuardedForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AddGuardedResult> AddGuarded(
+    const client_library::AddGuardedForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using AddGuardianResult = Result<
+    const client_library::AddGuardianForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AddGuardianResult> AddGuardian(
+    const client_library::AddGuardianForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using AddMemberResult = Result<
+    const client_library::AddMemberForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AddMemberResult> AddMember(
+    const client_library::AddMemberForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using AddMemberOfResult = Result<
+    const client_library::AddMemberOfForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AddMemberOfResult> AddMemberOf(
+    const client_library::AddMemberOfForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using AddParentResult = Result<
+    const client_library::AddParentForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AddParentResult> AddParent(
+    const client_library::AddParentForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using AddViewerResult = Result<
+    const client_library::AddViewerForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AddViewerResult> AddViewer(
+    const client_library::AddViewerForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using CreateEntityResult = Result<
+    const client_library::CreateEntityForm*,
+    client_library::CreateEntityFormResponse*>;
+
+  std::future<CreateEntityResult> CreateEntity(
+    const client_library::CreateEntityForm* req,
+    client_library::CreateEntityFormResponse* resp
+  );
+
+  using DeleteClaimResult = Result<
+    const client_library::DeleteClaimForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<DeleteClaimResult> DeleteClaim(
+    const client_library::DeleteClaimForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using GetClaimResult = Result<
+    const client_library::GetClaimForm*,
+    client_library::GetClaimFormResponse*>;
+
+  std::future<GetClaimResult> GetClaim(
+    const client_library::GetClaimForm* req,
+    client_library::GetClaimFormResponse* resp
+  );
+
+  using GetEntityResult = Result<
+    const client_library::GetEntityForm*,
+    client_library::GetEntityFormResponse*>;
+
+  std::future<GetEntityResult> GetEntity(
+    const client_library::GetEntityForm* req,
+    client_library::GetEntityFormResponse* resp
+  );
+
+  using RemoveChildResult = Result<
+    const client_library::RemoveChildForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<RemoveChildResult> RemoveChild(
+    const client_library::RemoveChildForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using RemoveGuardedResult = Result<
+    const client_library::RemoveGuardedForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<RemoveGuardedResult> RemoveGuarded(
+    const client_library::RemoveGuardedForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using RemoveGuardianResult = Result<
+    const client_library::RemoveGuardianForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<RemoveGuardianResult> RemoveGuardian(
+    const client_library::RemoveGuardianForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using RemoveMemberResult = Result<
+    const client_library::RemoveMemberForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<RemoveMemberResult> RemoveMember(
+    const client_library::RemoveMemberForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using RemoveMemberOfResult = Result<
+    const client_library::RemoveMemberOfForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<RemoveMemberOfResult> RemoveMemberOf(
+    const client_library::RemoveMemberOfForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using RemoveParentResult = Result<
+    const client_library::RemoveParentForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<RemoveParentResult> RemoveParent(
+    const client_library::RemoveParentForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using RemoveViewerResult = Result<
+    const client_library::RemoveViewerForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<RemoveViewerResult> RemoveViewer(
+    const client_library::RemoveViewerForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using SendClaimCodeResult = Result<
+    const client_library::ClaimSendCodeForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<SendClaimCodeResult> SendClaimCode(
+    const client_library::ClaimSendCodeForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using UpdateClaimResult = Result<
+    const client_library::AddClaimForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<UpdateClaimResult> UpdateClaim(
+    const client_library::AddClaimForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using VerifyClaimCodeResult = Result<
+    const client_library::ClaimVerifyCodeForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<VerifyClaimCodeResult> VerifyClaimCode(
+    const client_library::ClaimVerifyCodeForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_ENTITY_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/event_service.cc b/cpp/src/vereign/service/gen/event_service.cc
new file mode 100644
index 0000000..3a253c2
--- /dev/null
+++ b/cpp/src/vereign/service/gen/event_service.cc
@@ -0,0 +1,32 @@
+#include <vereign/service/gen/event_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string getEventsPath = "getEvents";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string EventService::ServicePath = "/event/";
+
+EventService::EventService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<EventService::GetEventsResult>
+EventService::GetEvents(
+    const client_library::GetEventsForm* req,
+    client_library::GetEventsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getEventsPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/event_service.hh b/cpp/src/vereign/service/gen/event_service.hh
new file mode 100644
index 0000000..4537c43
--- /dev/null
+++ b/cpp/src/vereign/service/gen/event_service.hh
@@ -0,0 +1,48 @@
+#ifndef __VEREIGN_SERVICE_GEN_EVENT_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_EVENT_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class EventService {
+public:
+  static const std::string ServicePath;
+
+  explicit EventService(restapi::ClientSession& client_session);
+
+  EventService(const EventService&) = delete;
+  EventService& operator=(const EventService&) = delete;
+
+  using GetEventsResult = Result<
+    const client_library::GetEventsForm*,
+    client_library::GetEventsFormResponse*>;
+
+  std::future<GetEventsResult> GetEvents(
+    const client_library::GetEventsForm* req,
+    client_library::GetEventsFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_EVENT_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/ews_service.cc b/cpp/src/vereign/service/gen/ews_service.cc
new file mode 100644
index 0000000..d6c0d88
--- /dev/null
+++ b/cpp/src/vereign/service/gen/ews_service.cc
@@ -0,0 +1,32 @@
+#include <vereign/service/gen/ews_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string proxyRequestPath = "proxyRequest";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string EwsService::ServicePath = "/ews/";
+
+EwsService::EwsService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<EwsService::ProxyRequestResult>
+EwsService::ProxyRequest(
+    const client_library::EWSProxyRequestForm* req,
+    client_library::EWSProxyRequestFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + proxyRequestPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/ews_service.hh b/cpp/src/vereign/service/gen/ews_service.hh
new file mode 100644
index 0000000..f15a1e8
--- /dev/null
+++ b/cpp/src/vereign/service/gen/ews_service.hh
@@ -0,0 +1,48 @@
+#ifndef __VEREIGN_SERVICE_GEN_EWS_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_EWS_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class EwsService {
+public:
+  static const std::string ServicePath;
+
+  explicit EwsService(restapi::ClientSession& client_session);
+
+  EwsService(const EwsService&) = delete;
+  EwsService& operator=(const EwsService&) = delete;
+
+  using ProxyRequestResult = Result<
+    const client_library::EWSProxyRequestForm*,
+    client_library::EWSProxyRequestFormResponse*>;
+
+  std::future<ProxyRequestResult> ProxyRequest(
+    const client_library::EWSProxyRequestForm* req,
+    client_library::EWSProxyRequestFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_EWS_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/gen.hh b/cpp/src/vereign/service/gen/gen.hh
index fa5b9ab..0dda264 100644
--- a/cpp/src/vereign/service/gen/gen.hh
+++ b/cpp/src/vereign/service/gen/gen.hh
@@ -1,6 +1,25 @@
 #ifndef __VEREIGN_SERVICE_GEN_GEN_HH
 #define __VEREIGN_SERVICE_GEN_GEN_HH
 
+
+#include <vereign/service/gen/action_service.hh>
+#include <vereign/service/gen/activity_service.hh>
+#include <vereign/service/gen/company_service.hh>
+#include <vereign/service/gen/contacts_service.hh>
+#include <vereign/service/gen/conversation_service.hh>
+#include <vereign/service/gen/delete_service.hh>
+#include <vereign/service/gen/document_service.hh>
+#include <vereign/service/gen/email_service.hh>
+#include <vereign/service/gen/entity_service.hh>
+#include <vereign/service/gen/event_service.hh>
+#include <vereign/service/gen/ews_service.hh>
+#include <vereign/service/gen/identity_service.hh>
+#include <vereign/service/gen/interactions_service.hh>
+#include <vereign/service/gen/orders_service.hh>
 #include <vereign/service/gen/passport_service.hh>
+#include <vereign/service/gen/reporting_service.hh>
+#include <vereign/service/gen/resource_service.hh>
+#include <vereign/service/gen/sharing_service.hh>
+#include <vereign/service/gen/sign_service.hh>
 
-#endif
+#endif // __VEREIGN_SERVICE_GEN_GEN_HH
diff --git a/cpp/src/vereign/service/gen/identity_service.cc b/cpp/src/vereign/service/gen/identity_service.cc
new file mode 100644
index 0000000..1a3e0da
--- /dev/null
+++ b/cpp/src/vereign/service/gen/identity_service.cc
@@ -0,0 +1,227 @@
+#include <vereign/service/gen/identity_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string authorizeDevicePath = "authorizeDevice";
+  const std::string cancelActionPath = "cancelAction";
+  const std::string confirmActionPath = "confirmAction";
+  const std::string confirmNewCarddavPublicKeyPath = "confirmNewCarddavPublicKey";
+  const std::string confirmNewDevicePath = "confirmNewDevice";
+  const std::string generateCredentialsPath = "generateCredentials";
+  const std::string getAvatarPath = "getAvatar";
+  const std::string getIdentityProfileDataPath = "getIdentityProfileData";
+  const std::string hasUnauthorizedDevicesPath = "hasUnauthorizedDevices";
+  const std::string listDevicesPath = "listDevices";
+  const std::string pullAvatarFromGravatarPath = "pullAvatarFromGravatar";
+  const std::string register2FAPublicKeyPath = "register2FAPublicKey";
+  const std::string renameDevicePath = "renameDevice";
+  const std::string resumeDevicePath = "resumeDevice";
+  const std::string revokeDevicePath = "revokeDevice";
+  const std::string suspendDevicePath = "suspendDevice";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string IdentityService::ServicePath = "/identity/";
+
+IdentityService::IdentityService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<IdentityService::AuthorizeDeviceResult>
+IdentityService::AuthorizeDevice(
+    const client_library::AuthorizeDeviceForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + authorizeDevicePath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::CancelActionResult>
+IdentityService::CancelAction(
+    const client_library::CancelActionForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + cancelActionPath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::ConfirmActionResult>
+IdentityService::ConfirmAction(
+    const client_library::ConfirmActionExecutionForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + confirmActionPath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::ConfirmNewCarddavPublicKeyResult>
+IdentityService::ConfirmNewCarddavPublicKey(
+    const client_library::ConfirmNewCarddavPublicKeyForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + confirmNewCarddavPublicKeyPath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::ConfirmNewDeviceResult>
+IdentityService::ConfirmNewDevice(
+    const client_library::ConfirmNewDeviceForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + confirmNewDevicePath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::GenerateCredentialsResult>
+IdentityService::GenerateCredentials(
+    const client_library::GenerateCredentialsForm* req,
+    client_library::GenerateCredentialsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + generateCredentialsPath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::GetAvatarResult>
+IdentityService::GetAvatar(
+    const client_library::GetIdentityAvatarForm* req,
+    client_library::GetIdentityAvatarFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getAvatarPath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::GetIdentityProfileDataResult>
+IdentityService::GetIdentityProfileData(
+    const client_library::GetIdentityProfileDataForm* req,
+    client_library::GetIdentityProfileDataFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getIdentityProfileDataPath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::HasUnauthorizedDevicesResult>
+IdentityService::HasUnauthorizedDevices(
+    const client_library::EmptyRequest* req,
+    client_library::HasUnauthorizedDevicesHandlerFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + hasUnauthorizedDevicesPath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::ListDevicesResult>
+IdentityService::ListDevices(
+    const client_library::EmptyRequest* req,
+    client_library::ListDevicesHandlerFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listDevicesPath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::PullAvatarFromGravatarResult>
+IdentityService::PullAvatarFromGravatar(
+    const client_library::PullAvatarFromGravatarForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + pullAvatarFromGravatarPath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::Register2FAPublicKeyResult>
+IdentityService::Register2FAPublicKey(
+    const client_library::Register2FAPublicKeyForm* req,
+    client_library::Register2FAPublicKeyFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + register2FAPublicKeyPath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::RenameDeviceResult>
+IdentityService::RenameDevice(
+    const client_library::RenameDeviceForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + renameDevicePath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::ResumeDeviceResult>
+IdentityService::ResumeDevice(
+    const client_library::ResumeDeviceForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + resumeDevicePath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::RevokeDeviceResult>
+IdentityService::RevokeDevice(
+    const client_library::RevokeDeviceForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + revokeDevicePath,
+    req,
+    resp
+  );
+}
+
+std::future<IdentityService::SuspendDeviceResult>
+IdentityService::SuspendDevice(
+    const client_library::SuspendDeviceForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + suspendDevicePath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/identity_service.hh b/cpp/src/vereign/service/gen/identity_service.hh
new file mode 100644
index 0000000..8c5dad1
--- /dev/null
+++ b/cpp/src/vereign/service/gen/identity_service.hh
@@ -0,0 +1,183 @@
+#ifndef __VEREIGN_SERVICE_GEN_IDENTITY_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_IDENTITY_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class IdentityService {
+public:
+  static const std::string ServicePath;
+
+  explicit IdentityService(restapi::ClientSession& client_session);
+
+  IdentityService(const IdentityService&) = delete;
+  IdentityService& operator=(const IdentityService&) = delete;
+
+  using AuthorizeDeviceResult = Result<
+    const client_library::AuthorizeDeviceForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AuthorizeDeviceResult> AuthorizeDevice(
+    const client_library::AuthorizeDeviceForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using CancelActionResult = Result<
+    const client_library::CancelActionForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<CancelActionResult> CancelAction(
+    const client_library::CancelActionForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using ConfirmActionResult = Result<
+    const client_library::ConfirmActionExecutionForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<ConfirmActionResult> ConfirmAction(
+    const client_library::ConfirmActionExecutionForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using ConfirmNewCarddavPublicKeyResult = Result<
+    const client_library::ConfirmNewCarddavPublicKeyForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<ConfirmNewCarddavPublicKeyResult> ConfirmNewCarddavPublicKey(
+    const client_library::ConfirmNewCarddavPublicKeyForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using ConfirmNewDeviceResult = Result<
+    const client_library::ConfirmNewDeviceForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<ConfirmNewDeviceResult> ConfirmNewDevice(
+    const client_library::ConfirmNewDeviceForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using GenerateCredentialsResult = Result<
+    const client_library::GenerateCredentialsForm*,
+    client_library::GenerateCredentialsFormResponse*>;
+
+  std::future<GenerateCredentialsResult> GenerateCredentials(
+    const client_library::GenerateCredentialsForm* req,
+    client_library::GenerateCredentialsFormResponse* resp
+  );
+
+  using GetAvatarResult = Result<
+    const client_library::GetIdentityAvatarForm*,
+    client_library::GetIdentityAvatarFormResponse*>;
+
+  std::future<GetAvatarResult> GetAvatar(
+    const client_library::GetIdentityAvatarForm* req,
+    client_library::GetIdentityAvatarFormResponse* resp
+  );
+
+  using GetIdentityProfileDataResult = Result<
+    const client_library::GetIdentityProfileDataForm*,
+    client_library::GetIdentityProfileDataFormResponse*>;
+
+  std::future<GetIdentityProfileDataResult> GetIdentityProfileData(
+    const client_library::GetIdentityProfileDataForm* req,
+    client_library::GetIdentityProfileDataFormResponse* resp
+  );
+
+  using HasUnauthorizedDevicesResult = Result<
+    const client_library::EmptyRequest*,
+    client_library::HasUnauthorizedDevicesHandlerFormResponse*>;
+
+  std::future<HasUnauthorizedDevicesResult> HasUnauthorizedDevices(
+    const client_library::EmptyRequest* req,
+    client_library::HasUnauthorizedDevicesHandlerFormResponse* resp
+  );
+
+  using ListDevicesResult = Result<
+    const client_library::EmptyRequest*,
+    client_library::ListDevicesHandlerFormResponse*>;
+
+  std::future<ListDevicesResult> ListDevices(
+    const client_library::EmptyRequest* req,
+    client_library::ListDevicesHandlerFormResponse* resp
+  );
+
+  using PullAvatarFromGravatarResult = Result<
+    const client_library::PullAvatarFromGravatarForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<PullAvatarFromGravatarResult> PullAvatarFromGravatar(
+    const client_library::PullAvatarFromGravatarForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using Register2FAPublicKeyResult = Result<
+    const client_library::Register2FAPublicKeyForm*,
+    client_library::Register2FAPublicKeyFormResponse*>;
+
+  std::future<Register2FAPublicKeyResult> Register2FAPublicKey(
+    const client_library::Register2FAPublicKeyForm* req,
+    client_library::Register2FAPublicKeyFormResponse* resp
+  );
+
+  using RenameDeviceResult = Result<
+    const client_library::RenameDeviceForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<RenameDeviceResult> RenameDevice(
+    const client_library::RenameDeviceForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using ResumeDeviceResult = Result<
+    const client_library::ResumeDeviceForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<ResumeDeviceResult> ResumeDevice(
+    const client_library::ResumeDeviceForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using RevokeDeviceResult = Result<
+    const client_library::RevokeDeviceForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<RevokeDeviceResult> RevokeDevice(
+    const client_library::RevokeDeviceForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using SuspendDeviceResult = Result<
+    const client_library::SuspendDeviceForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<SuspendDeviceResult> SuspendDevice(
+    const client_library::SuspendDeviceForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_IDENTITY_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/interactions_service.cc b/cpp/src/vereign/service/gen/interactions_service.cc
new file mode 100644
index 0000000..f783273
--- /dev/null
+++ b/cpp/src/vereign/service/gen/interactions_service.cc
@@ -0,0 +1,32 @@
+#include <vereign/service/gen/interactions_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string searchInteractionsPath = "searchInteractions";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string InteractionsService::ServicePath = "/interactions/";
+
+InteractionsService::InteractionsService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<InteractionsService::SearchInteractionsResult>
+InteractionsService::SearchInteractions(
+    const client_library::SearchInteractionsForm* req,
+    client_library::SearchInteractionsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + searchInteractionsPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/interactions_service.hh b/cpp/src/vereign/service/gen/interactions_service.hh
new file mode 100644
index 0000000..105640c
--- /dev/null
+++ b/cpp/src/vereign/service/gen/interactions_service.hh
@@ -0,0 +1,48 @@
+#ifndef __VEREIGN_SERVICE_GEN_INTERACTIONS_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_INTERACTIONS_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class InteractionsService {
+public:
+  static const std::string ServicePath;
+
+  explicit InteractionsService(restapi::ClientSession& client_session);
+
+  InteractionsService(const InteractionsService&) = delete;
+  InteractionsService& operator=(const InteractionsService&) = delete;
+
+  using SearchInteractionsResult = Result<
+    const client_library::SearchInteractionsForm*,
+    client_library::SearchInteractionsFormResponse*>;
+
+  std::future<SearchInteractionsResult> SearchInteractions(
+    const client_library::SearchInteractionsForm* req,
+    client_library::SearchInteractionsFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_INTERACTIONS_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/orders_service.cc b/cpp/src/vereign/service/gen/orders_service.cc
new file mode 100644
index 0000000..1f981a4
--- /dev/null
+++ b/cpp/src/vereign/service/gen/orders_service.cc
@@ -0,0 +1,84 @@
+#include <vereign/service/gen/orders_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string confirmCardPaymentPath = "confirmCardPayment";
+  const std::string getGeneratedInvoiceForOrderPath = "getGeneratedInvoiceForOrder";
+  const std::string getOrderPath = "getOrder";
+  const std::string initializeCardPaymentPath = "initializeCardPayment";
+  const std::string listOrdersPath = "listOrders";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string OrdersService::ServicePath = "/orders/";
+
+OrdersService::OrdersService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<OrdersService::ConfirmCardPaymentResult>
+OrdersService::ConfirmCardPayment(
+    const client_library::ConfirmCardPaymentForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + confirmCardPaymentPath,
+    req,
+    resp
+  );
+}
+
+std::future<OrdersService::GetGeneratedInvoiceForOrderResult>
+OrdersService::GetGeneratedInvoiceForOrder(
+    const client_library::GetGeneratedInvoiceForOrderForm* req,
+    client_library::GetGeneratedInvoiceForOrderFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getGeneratedInvoiceForOrderPath,
+    req,
+    resp
+  );
+}
+
+std::future<OrdersService::GetOrderResult>
+OrdersService::GetOrder(
+    const client_library::GetOrderForm* req,
+    client_library::GetOrderFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getOrderPath,
+    req,
+    resp
+  );
+}
+
+std::future<OrdersService::InitializeCardPaymentResult>
+OrdersService::InitializeCardPayment(
+    const client_library::InitializeCardPaymentForm* req,
+    client_library::InitializeCardPaymentFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + initializeCardPaymentPath,
+    req,
+    resp
+  );
+}
+
+std::future<OrdersService::ListOrdersResult>
+OrdersService::ListOrders(
+    const client_library::ListOrdersForm* req,
+    client_library::ListOrdersFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listOrdersPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/orders_service.hh b/cpp/src/vereign/service/gen/orders_service.hh
new file mode 100644
index 0000000..c6f4e20
--- /dev/null
+++ b/cpp/src/vereign/service/gen/orders_service.hh
@@ -0,0 +1,84 @@
+#ifndef __VEREIGN_SERVICE_GEN_ORDERS_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_ORDERS_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class OrdersService {
+public:
+  static const std::string ServicePath;
+
+  explicit OrdersService(restapi::ClientSession& client_session);
+
+  OrdersService(const OrdersService&) = delete;
+  OrdersService& operator=(const OrdersService&) = delete;
+
+  using ConfirmCardPaymentResult = Result<
+    const client_library::ConfirmCardPaymentForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<ConfirmCardPaymentResult> ConfirmCardPayment(
+    const client_library::ConfirmCardPaymentForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using GetGeneratedInvoiceForOrderResult = Result<
+    const client_library::GetGeneratedInvoiceForOrderForm*,
+    client_library::GetGeneratedInvoiceForOrderFormResponse*>;
+
+  std::future<GetGeneratedInvoiceForOrderResult> GetGeneratedInvoiceForOrder(
+    const client_library::GetGeneratedInvoiceForOrderForm* req,
+    client_library::GetGeneratedInvoiceForOrderFormResponse* resp
+  );
+
+  using GetOrderResult = Result<
+    const client_library::GetOrderForm*,
+    client_library::GetOrderFormResponse*>;
+
+  std::future<GetOrderResult> GetOrder(
+    const client_library::GetOrderForm* req,
+    client_library::GetOrderFormResponse* resp
+  );
+
+  using InitializeCardPaymentResult = Result<
+    const client_library::InitializeCardPaymentForm*,
+    client_library::InitializeCardPaymentFormResponse*>;
+
+  std::future<InitializeCardPaymentResult> InitializeCardPayment(
+    const client_library::InitializeCardPaymentForm* req,
+    client_library::InitializeCardPaymentFormResponse* resp
+  );
+
+  using ListOrdersResult = Result<
+    const client_library::ListOrdersForm*,
+    client_library::ListOrdersFormResponse*>;
+
+  std::future<ListOrdersResult> ListOrders(
+    const client_library::ListOrdersForm* req,
+    client_library::ListOrdersFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_ORDERS_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/passport_service.cc b/cpp/src/vereign/service/gen/passport_service.cc
index 5c47d20..c7ce907 100644
--- a/cpp/src/vereign/service/gen/passport_service.cc
+++ b/cpp/src/vereign/service/gen/passport_service.cc
@@ -2,7 +2,22 @@
 #include <vereign/restapi/client_session.hh>
 
 namespace {
+  const std::string attachFunctionPath = "attachFunction";
+  const std::string callFunctionPath = "callFunction";
+  const std::string generateDIDsPath = "generateDIDs";
+  const std::string getAvatarByPassportPath = "getAvatarByPassport";
+  const std::string getDIDsPath = "getDIDs";
+  const std::string getEmailWithHeaderByPassportPath = "getEmailWithHeaderByPassport";
+  const std::string getInteractionsPath = "getInteractions";
+  const std::string getVCardImagePath = "getVCardImage";
+  const std::string getVCardTemplatePath = "getVCardTemplate";
+  const std::string linkClaimPath = "linkClaim";
+  const std::string listFunctionsPath = "listFunctions";
   const std::string listPassportsPath = "listPassports";
+  const std::string listPassportsForSharedIdentityPath = "listPassportsForSharedIdentity";
+  const std::string listSharedIdentitiesWithUserPath = "listSharedIdentitiesWithUser";
+  const std::string setVCardImagePath = "setVCardImage";
+  const std::string storeDIDsPath = "storeDIDs";
 }
 
 namespace vereign {
@@ -15,6 +30,138 @@ PassportService::PassportService(restapi::ClientSession& client_session)
   : client_session_{client_session}
 {}
 
+std::future<PassportService::AttachFunctionResult>
+PassportService::AttachFunction(
+    const client_library::AttachFunctionToPassportClaimForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + attachFunctionPath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::CallFunctionResult>
+PassportService::CallFunction(
+    const client_library::CallFunctionForm* req,
+    client_library::CallFunctionFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + callFunctionPath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::GenerateDIDsResult>
+PassportService::GenerateDIDs(
+    const client_library::GenerateDIDsForm* req,
+    client_library::GenerateDIDsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + generateDIDsPath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::GetAvatarByPassportResult>
+PassportService::GetAvatarByPassport(
+    const client_library::GetAvatarByPassportForm* req,
+    client_library::GetAvatarByPassportFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getAvatarByPassportPath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::GetDIDsResult>
+PassportService::GetDIDs(
+    const client_library::GetDIDsForm* req,
+    client_library::GetDIDsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getDIDsPath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::GetEmailWithHeaderByPassportResult>
+PassportService::GetEmailWithHeaderByPassport(
+    const client_library::GetEmailWithHeaderByPassportForm* req,
+    client_library::GetEmailWithHeaderByPassportFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getEmailWithHeaderByPassportPath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::GetInteractionsResult>
+PassportService::GetInteractions(
+    const client_library::GetInteractionsForm* req,
+    client_library::GetInteractionsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getInteractionsPath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::GetVCardImageResult>
+PassportService::GetVCardImage(
+    const client_library::GetVCardImageForm* req,
+    client_library::GetVCardImageFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getVCardImagePath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::GetVCardTemplateResult>
+PassportService::GetVCardTemplate(
+    const client_library::GetVCardTemplateForm* req,
+    client_library::GetVCardTemplateFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getVCardTemplatePath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::LinkClaimResult>
+PassportService::LinkClaim(
+    const client_library::LinkClaimToPassportForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + linkClaimPath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::ListFunctionsResult>
+PassportService::ListFunctions(
+    const client_library::EmptyRequest* req,
+    client_library::ListFunctionsResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listFunctionsPath,
+    req,
+    resp
+  );
+}
+
 std::future<PassportService::ListPassportsResult>
 PassportService::ListPassports(
     const client_library::ListPassportsForm* req,
@@ -27,6 +174,53 @@ PassportService::ListPassports(
   );
 }
 
+std::future<PassportService::ListPassportsForSharedIdentityResult>
+PassportService::ListPassportsForSharedIdentity(
+    const client_library::ListPassportsForSharedIdentityForm* req,
+    client_library::ListPassportsForSharedIdentityFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listPassportsForSharedIdentityPath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::ListSharedIdentitiesWithUserResult>
+PassportService::ListSharedIdentitiesWithUser(
+    const client_library::ListSharedIdentitiesWithUserForm* req,
+    client_library::ListSharedIdentitiesWithUserFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listSharedIdentitiesWithUserPath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::SetVCardImageResult>
+PassportService::SetVCardImage(
+    const client_library::SetVCardImageForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + setVCardImagePath,
+    req,
+    resp
+  );
+}
+
+std::future<PassportService::StoreDIDsResult>
+PassportService::StoreDIDs(
+    const client_library::StoreDIDsForm* req,
+    client_library::StoreDIDsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + storeDIDsPath,
+    req,
+    resp
+  );
+}
 
 } // namespace gen
 } // namespace service
diff --git a/cpp/src/vereign/service/gen/passport_service.hh b/cpp/src/vereign/service/gen/passport_service.hh
index e6bfad2..d9841ab 100644
--- a/cpp/src/vereign/service/gen/passport_service.hh
+++ b/cpp/src/vereign/service/gen/passport_service.hh
@@ -3,7 +3,7 @@
 
 #include <vereign/restapi/client_session.hh>
 #include <vereign/restapi/post_result.hh>
-#include <vereign/client_library/passport_types.gen.pb.h>
+#include <vereign/client_library/types.gen.pb.h>
 
 #include <future>
 
@@ -28,6 +28,105 @@ public:
   PassportService(const PassportService&) = delete;
   PassportService& operator=(const PassportService&) = delete;
 
+  using AttachFunctionResult = Result<
+    const client_library::AttachFunctionToPassportClaimForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AttachFunctionResult> AttachFunction(
+    const client_library::AttachFunctionToPassportClaimForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using CallFunctionResult = Result<
+    const client_library::CallFunctionForm*,
+    client_library::CallFunctionFormResponse*>;
+
+  std::future<CallFunctionResult> CallFunction(
+    const client_library::CallFunctionForm* req,
+    client_library::CallFunctionFormResponse* resp
+  );
+
+  using GenerateDIDsResult = Result<
+    const client_library::GenerateDIDsForm*,
+    client_library::GenerateDIDsFormResponse*>;
+
+  std::future<GenerateDIDsResult> GenerateDIDs(
+    const client_library::GenerateDIDsForm* req,
+    client_library::GenerateDIDsFormResponse* resp
+  );
+
+  using GetAvatarByPassportResult = Result<
+    const client_library::GetAvatarByPassportForm*,
+    client_library::GetAvatarByPassportFormResponse*>;
+
+  std::future<GetAvatarByPassportResult> GetAvatarByPassport(
+    const client_library::GetAvatarByPassportForm* req,
+    client_library::GetAvatarByPassportFormResponse* resp
+  );
+
+  using GetDIDsResult = Result<
+    const client_library::GetDIDsForm*,
+    client_library::GetDIDsFormResponse*>;
+
+  std::future<GetDIDsResult> GetDIDs(
+    const client_library::GetDIDsForm* req,
+    client_library::GetDIDsFormResponse* resp
+  );
+
+  using GetEmailWithHeaderByPassportResult = Result<
+    const client_library::GetEmailWithHeaderByPassportForm*,
+    client_library::GetEmailWithHeaderByPassportFormResponse*>;
+
+  std::future<GetEmailWithHeaderByPassportResult> GetEmailWithHeaderByPassport(
+    const client_library::GetEmailWithHeaderByPassportForm* req,
+    client_library::GetEmailWithHeaderByPassportFormResponse* resp
+  );
+
+  using GetInteractionsResult = Result<
+    const client_library::GetInteractionsForm*,
+    client_library::GetInteractionsFormResponse*>;
+
+  std::future<GetInteractionsResult> GetInteractions(
+    const client_library::GetInteractionsForm* req,
+    client_library::GetInteractionsFormResponse* resp
+  );
+
+  using GetVCardImageResult = Result<
+    const client_library::GetVCardImageForm*,
+    client_library::GetVCardImageFormResponse*>;
+
+  std::future<GetVCardImageResult> GetVCardImage(
+    const client_library::GetVCardImageForm* req,
+    client_library::GetVCardImageFormResponse* resp
+  );
+
+  using GetVCardTemplateResult = Result<
+    const client_library::GetVCardTemplateForm*,
+    client_library::GetVCardTemplateFormResponse*>;
+
+  std::future<GetVCardTemplateResult> GetVCardTemplate(
+    const client_library::GetVCardTemplateForm* req,
+    client_library::GetVCardTemplateFormResponse* resp
+  );
+
+  using LinkClaimResult = Result<
+    const client_library::LinkClaimToPassportForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<LinkClaimResult> LinkClaim(
+    const client_library::LinkClaimToPassportForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using ListFunctionsResult = Result<
+    const client_library::EmptyRequest*,
+    client_library::ListFunctionsResponse*>;
+
+  std::future<ListFunctionsResult> ListFunctions(
+    const client_library::EmptyRequest* req,
+    client_library::ListFunctionsResponse* resp
+  );
+
   using ListPassportsResult = Result<
     const client_library::ListPassportsForm*,
     client_library::ListPassportsFormResponse*>;
@@ -37,6 +136,42 @@ public:
     client_library::ListPassportsFormResponse* resp
   );
 
+  using ListPassportsForSharedIdentityResult = Result<
+    const client_library::ListPassportsForSharedIdentityForm*,
+    client_library::ListPassportsForSharedIdentityFormResponse*>;
+
+  std::future<ListPassportsForSharedIdentityResult> ListPassportsForSharedIdentity(
+    const client_library::ListPassportsForSharedIdentityForm* req,
+    client_library::ListPassportsForSharedIdentityFormResponse* resp
+  );
+
+  using ListSharedIdentitiesWithUserResult = Result<
+    const client_library::ListSharedIdentitiesWithUserForm*,
+    client_library::ListSharedIdentitiesWithUserFormResponse*>;
+
+  std::future<ListSharedIdentitiesWithUserResult> ListSharedIdentitiesWithUser(
+    const client_library::ListSharedIdentitiesWithUserForm* req,
+    client_library::ListSharedIdentitiesWithUserFormResponse* resp
+  );
+
+  using SetVCardImageResult = Result<
+    const client_library::SetVCardImageForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<SetVCardImageResult> SetVCardImage(
+    const client_library::SetVCardImageForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using StoreDIDsResult = Result<
+    const client_library::StoreDIDsForm*,
+    client_library::StoreDIDsFormResponse*>;
+
+  std::future<StoreDIDsResult> StoreDIDs(
+    const client_library::StoreDIDsForm* req,
+    client_library::StoreDIDsFormResponse* resp
+  );
+
 private:
   restapi::ClientSession& client_session_;
 };
diff --git a/cpp/src/vereign/service/gen/reporting_service.cc b/cpp/src/vereign/service/gen/reporting_service.cc
new file mode 100644
index 0000000..07d8784
--- /dev/null
+++ b/cpp/src/vereign/service/gen/reporting_service.cc
@@ -0,0 +1,45 @@
+#include <vereign/service/gen/reporting_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string getbillingdataforperiodPath = "getbillingdataforperiod";
+  const std::string getreporttotaldataPath = "getreporttotaldata";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string ReportingService::ServicePath = "/reporting/";
+
+ReportingService::ReportingService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<ReportingService::GetbillingdataforperiodResult>
+ReportingService::Getbillingdataforperiod(
+    const client_library::GetBillingDataForPeriodForm* req,
+    client_library::GetBillingDataForPeriodFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getbillingdataforperiodPath,
+    req,
+    resp
+  );
+}
+
+std::future<ReportingService::GetreporttotaldataResult>
+ReportingService::Getreporttotaldata(
+    const client_library::GetReportTotalDataForm* req,
+    client_library::GetReportTotalDataFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + getreporttotaldataPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/reporting_service.hh b/cpp/src/vereign/service/gen/reporting_service.hh
new file mode 100644
index 0000000..3781e78
--- /dev/null
+++ b/cpp/src/vereign/service/gen/reporting_service.hh
@@ -0,0 +1,57 @@
+#ifndef __VEREIGN_SERVICE_GEN_REPORTING_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_REPORTING_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class ReportingService {
+public:
+  static const std::string ServicePath;
+
+  explicit ReportingService(restapi::ClientSession& client_session);
+
+  ReportingService(const ReportingService&) = delete;
+  ReportingService& operator=(const ReportingService&) = delete;
+
+  using GetbillingdataforperiodResult = Result<
+    const client_library::GetBillingDataForPeriodForm*,
+    client_library::GetBillingDataForPeriodFormResponse*>;
+
+  std::future<GetbillingdataforperiodResult> Getbillingdataforperiod(
+    const client_library::GetBillingDataForPeriodForm* req,
+    client_library::GetBillingDataForPeriodFormResponse* resp
+  );
+
+  using GetreporttotaldataResult = Result<
+    const client_library::GetReportTotalDataForm*,
+    client_library::GetReportTotalDataFormResponse*>;
+
+  std::future<GetreporttotaldataResult> Getreporttotaldata(
+    const client_library::GetReportTotalDataForm* req,
+    client_library::GetReportTotalDataFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_REPORTING_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/resource_service.cc b/cpp/src/vereign/service/gen/resource_service.cc
new file mode 100644
index 0000000..317105d
--- /dev/null
+++ b/cpp/src/vereign/service/gen/resource_service.cc
@@ -0,0 +1,45 @@
+#include <vereign/service/gen/resource_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string deleteResourceByTokenPath = "deleteResourceByToken";
+  const std::string storeResourcePath = "storeResource";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string ResourceService::ServicePath = "/resource/";
+
+ResourceService::ResourceService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<ResourceService::DeleteResourceByTokenResult>
+ResourceService::DeleteResourceByToken(
+    const client_library::DeleteResourceForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + deleteResourceByTokenPath,
+    req,
+    resp
+  );
+}
+
+std::future<ResourceService::StoreResourceResult>
+ResourceService::StoreResource(
+    const client_library::StoreResourceForm* req,
+    client_library::StoreResourceFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + storeResourcePath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/resource_service.hh b/cpp/src/vereign/service/gen/resource_service.hh
new file mode 100644
index 0000000..bed33a2
--- /dev/null
+++ b/cpp/src/vereign/service/gen/resource_service.hh
@@ -0,0 +1,57 @@
+#ifndef __VEREIGN_SERVICE_GEN_RESOURCE_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_RESOURCE_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class ResourceService {
+public:
+  static const std::string ServicePath;
+
+  explicit ResourceService(restapi::ClientSession& client_session);
+
+  ResourceService(const ResourceService&) = delete;
+  ResourceService& operator=(const ResourceService&) = delete;
+
+  using DeleteResourceByTokenResult = Result<
+    const client_library::DeleteResourceForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<DeleteResourceByTokenResult> DeleteResourceByToken(
+    const client_library::DeleteResourceForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using StoreResourceResult = Result<
+    const client_library::StoreResourceForm*,
+    client_library::StoreResourceFormResponse*>;
+
+  std::future<StoreResourceResult> StoreResource(
+    const client_library::StoreResourceForm* req,
+    client_library::StoreResourceFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_RESOURCE_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/sharing_service.cc b/cpp/src/vereign/service/gen/sharing_service.cc
new file mode 100644
index 0000000..f30874b
--- /dev/null
+++ b/cpp/src/vereign/service/gen/sharing_service.cc
@@ -0,0 +1,97 @@
+#include <vereign/service/gen/sharing_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string acceptSharingRequestMovePassportPath = "acceptSharingRequestMovePassport";
+  const std::string acceptSharingRequestPersistPassportPath = "acceptSharingRequestPersistPassport";
+  const std::string listPendingSharingRequestsPath = "listPendingSharingRequests";
+  const std::string listRejectedSharingRequestsPath = "listRejectedSharingRequests";
+  const std::string rejectSharingRequestPath = "rejectSharingRequest";
+  const std::string sendShareDocumentRequestPath = "sendShareDocumentRequest";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string SharingService::ServicePath = "/sharing/";
+
+SharingService::SharingService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<SharingService::AcceptSharingRequestMovePassportResult>
+SharingService::AcceptSharingRequestMovePassport(
+    const client_library::AcceptSharingRequestMovePassportForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + acceptSharingRequestMovePassportPath,
+    req,
+    resp
+  );
+}
+
+std::future<SharingService::AcceptSharingRequestPersistPassportResult>
+SharingService::AcceptSharingRequestPersistPassport(
+    const client_library::AcceptSharingRequestPersistPassportForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + acceptSharingRequestPersistPassportPath,
+    req,
+    resp
+  );
+}
+
+std::future<SharingService::ListPendingSharingRequestsResult>
+SharingService::ListPendingSharingRequests(
+    const client_library::ListPendingSharingRequestsForm* req,
+    client_library::ListPendingSharingRequestsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listPendingSharingRequestsPath,
+    req,
+    resp
+  );
+}
+
+std::future<SharingService::ListRejectedSharingRequestsResult>
+SharingService::ListRejectedSharingRequests(
+    const client_library::ListRejectedSharingRequestsForm* req,
+    client_library::ListRejectedSharingRequestsFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + listRejectedSharingRequestsPath,
+    req,
+    resp
+  );
+}
+
+std::future<SharingService::RejectSharingRequestResult>
+SharingService::RejectSharingRequest(
+    const client_library::RejectSharingRequestForm* req,
+    client_library::EmptyResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + rejectSharingRequestPath,
+    req,
+    resp
+  );
+}
+
+std::future<SharingService::SendShareDocumentRequestResult>
+SharingService::SendShareDocumentRequest(
+    const client_library::SendShareDocumentRequestForm* req,
+    client_library::SendShareDocumentRequestFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + sendShareDocumentRequestPath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/sharing_service.hh b/cpp/src/vereign/service/gen/sharing_service.hh
new file mode 100644
index 0000000..0edb291
--- /dev/null
+++ b/cpp/src/vereign/service/gen/sharing_service.hh
@@ -0,0 +1,93 @@
+#ifndef __VEREIGN_SERVICE_GEN_SHARING_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_SHARING_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class SharingService {
+public:
+  static const std::string ServicePath;
+
+  explicit SharingService(restapi::ClientSession& client_session);
+
+  SharingService(const SharingService&) = delete;
+  SharingService& operator=(const SharingService&) = delete;
+
+  using AcceptSharingRequestMovePassportResult = Result<
+    const client_library::AcceptSharingRequestMovePassportForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AcceptSharingRequestMovePassportResult> AcceptSharingRequestMovePassport(
+    const client_library::AcceptSharingRequestMovePassportForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using AcceptSharingRequestPersistPassportResult = Result<
+    const client_library::AcceptSharingRequestPersistPassportForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<AcceptSharingRequestPersistPassportResult> AcceptSharingRequestPersistPassport(
+    const client_library::AcceptSharingRequestPersistPassportForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using ListPendingSharingRequestsResult = Result<
+    const client_library::ListPendingSharingRequestsForm*,
+    client_library::ListPendingSharingRequestsFormResponse*>;
+
+  std::future<ListPendingSharingRequestsResult> ListPendingSharingRequests(
+    const client_library::ListPendingSharingRequestsForm* req,
+    client_library::ListPendingSharingRequestsFormResponse* resp
+  );
+
+  using ListRejectedSharingRequestsResult = Result<
+    const client_library::ListRejectedSharingRequestsForm*,
+    client_library::ListRejectedSharingRequestsFormResponse*>;
+
+  std::future<ListRejectedSharingRequestsResult> ListRejectedSharingRequests(
+    const client_library::ListRejectedSharingRequestsForm* req,
+    client_library::ListRejectedSharingRequestsFormResponse* resp
+  );
+
+  using RejectSharingRequestResult = Result<
+    const client_library::RejectSharingRequestForm*,
+    client_library::EmptyResponse*>;
+
+  std::future<RejectSharingRequestResult> RejectSharingRequest(
+    const client_library::RejectSharingRequestForm* req,
+    client_library::EmptyResponse* resp
+  );
+
+  using SendShareDocumentRequestResult = Result<
+    const client_library::SendShareDocumentRequestForm*,
+    client_library::SendShareDocumentRequestFormResponse*>;
+
+  std::future<SendShareDocumentRequestResult> SendShareDocumentRequest(
+    const client_library::SendShareDocumentRequestForm* req,
+    client_library::SendShareDocumentRequestFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_SHARING_SERVICE_HH
diff --git a/cpp/src/vereign/service/gen/sign_service.cc b/cpp/src/vereign/service/gen/sign_service.cc
new file mode 100644
index 0000000..cb6a099
--- /dev/null
+++ b/cpp/src/vereign/service/gen/sign_service.cc
@@ -0,0 +1,97 @@
+#include <vereign/service/gen/sign_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+  const std::string generateCmsForChainPath = "generateCmsForChain";
+  const std::string generateCmsForPassportPath = "generateCmsForPassport";
+  const std::string resignEmailPath = "resignEmail";
+  const std::string retrieveRootCertificatePath = "retrieveRootCertificate";
+  const std::string signVCardForChainPath = "signVCardForChain";
+  const std::string validateVMimePath = "validateVMime";
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+const std::string SignService::ServicePath = "/sign/";
+
+SignService::SignService(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+std::future<SignService::GenerateCmsForChainResult>
+SignService::GenerateCmsForChain(
+    const client_library::GenerateCmsForChainForm* req,
+    client_library::GenerateCmsForChainFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + generateCmsForChainPath,
+    req,
+    resp
+  );
+}
+
+std::future<SignService::GenerateCmsForPassportResult>
+SignService::GenerateCmsForPassport(
+    const client_library::GenerateCmsForPassportForm* req,
+    client_library::GenerateCmsForPassportFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + generateCmsForPassportPath,
+    req,
+    resp
+  );
+}
+
+std::future<SignService::ResignEmailResult>
+SignService::ResignEmail(
+    const client_library::ResignSMIMEForm* req,
+    client_library::ResignSMIMEFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + resignEmailPath,
+    req,
+    resp
+  );
+}
+
+std::future<SignService::RetrieveRootCertificateResult>
+SignService::RetrieveRootCertificate(
+    const client_library::RetrieveRootCertificateForm* req,
+    client_library::RetrieveRootCertificateFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + retrieveRootCertificatePath,
+    req,
+    resp
+  );
+}
+
+std::future<SignService::SignVCardForChainResult>
+SignService::SignVCardForChain(
+    const client_library::SignVCardForChainForm* req,
+    client_library::SignVCardForChainFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + signVCardForChainPath,
+    req,
+    resp
+  );
+}
+
+std::future<SignService::ValidateVMimeResult>
+SignService::ValidateVMime(
+    const client_library::ValidateVMimeForm* req,
+    client_library::ValidateVMimeFormResponse* resp
+) {
+  return client_session_.Post(
+    ServicePath + validateVMimePath,
+    req,
+    resp
+  );
+}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/src/vereign/service/gen/sign_service.hh b/cpp/src/vereign/service/gen/sign_service.hh
new file mode 100644
index 0000000..bb0f81a
--- /dev/null
+++ b/cpp/src/vereign/service/gen/sign_service.hh
@@ -0,0 +1,93 @@
+#ifndef __VEREIGN_SERVICE_GEN_SIGN_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_SIGN_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+class SignService {
+public:
+  static const std::string ServicePath;
+
+  explicit SignService(restapi::ClientSession& client_session);
+
+  SignService(const SignService&) = delete;
+  SignService& operator=(const SignService&) = delete;
+
+  using GenerateCmsForChainResult = Result<
+    const client_library::GenerateCmsForChainForm*,
+    client_library::GenerateCmsForChainFormResponse*>;
+
+  std::future<GenerateCmsForChainResult> GenerateCmsForChain(
+    const client_library::GenerateCmsForChainForm* req,
+    client_library::GenerateCmsForChainFormResponse* resp
+  );
+
+  using GenerateCmsForPassportResult = Result<
+    const client_library::GenerateCmsForPassportForm*,
+    client_library::GenerateCmsForPassportFormResponse*>;
+
+  std::future<GenerateCmsForPassportResult> GenerateCmsForPassport(
+    const client_library::GenerateCmsForPassportForm* req,
+    client_library::GenerateCmsForPassportFormResponse* resp
+  );
+
+  using ResignEmailResult = Result<
+    const client_library::ResignSMIMEForm*,
+    client_library::ResignSMIMEFormResponse*>;
+
+  std::future<ResignEmailResult> ResignEmail(
+    const client_library::ResignSMIMEForm* req,
+    client_library::ResignSMIMEFormResponse* resp
+  );
+
+  using RetrieveRootCertificateResult = Result<
+    const client_library::RetrieveRootCertificateForm*,
+    client_library::RetrieveRootCertificateFormResponse*>;
+
+  std::future<RetrieveRootCertificateResult> RetrieveRootCertificate(
+    const client_library::RetrieveRootCertificateForm* req,
+    client_library::RetrieveRootCertificateFormResponse* resp
+  );
+
+  using SignVCardForChainResult = Result<
+    const client_library::SignVCardForChainForm*,
+    client_library::SignVCardForChainFormResponse*>;
+
+  std::future<SignVCardForChainResult> SignVCardForChain(
+    const client_library::SignVCardForChainForm* req,
+    client_library::SignVCardForChainFormResponse* resp
+  );
+
+  using ValidateVMimeResult = Result<
+    const client_library::ValidateVMimeForm*,
+    client_library::ValidateVMimeFormResponse*>;
+
+  std::future<ValidateVMimeResult> ValidateVMime(
+    const client_library::ValidateVMimeForm* req,
+    client_library::ValidateVMimeFormResponse* resp
+  );
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_SIGN_SERVICE_HH
diff --git a/cpp/src/vereign/service/passport_service.hh b/cpp/src/vereign/service/passport_service.hh
index 1df27e0..f59b4b2 100644
--- a/cpp/src/vereign/service/passport_service.hh
+++ b/cpp/src/vereign/service/passport_service.hh
@@ -3,7 +3,7 @@
 
 #include <vereign/restapi/client_session.hh>
 #include <vereign/restapi/post_result.hh>
-#include <vereign/client_library/passport_types.gen.pb.h>
+#include <vereign/client_library/types.gen.pb.h>
 #include <vereign/service/gen/passport_service.hh>
 
 #include <future>
diff --git a/cpp/templates/vereign/grpc/gen/++service++_api.hh.tmpl b/cpp/templates/vereign/grpc/gen/++service++_api.hh.tmpl
new file mode 100644
index 0000000..28e01d5
--- /dev/null
+++ b/cpp/templates/vereign/grpc/gen/++service++_api.hh.tmpl
@@ -0,0 +1,60 @@
+#ifndef __VEREIGN_GRPC_GEN_{{ upper .Name }}_API_HH
+#define __VEREIGN_GRPC_GEN_{{ upper .Name }}_API_HH
+
+#include <vereign/client_library/{{ .Name }}_api.gen.grpc.pb.h>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+{{- $class := (print (title .Name) "API") }}
+
+template <class VereignService>
+class {{ $class }} : public client_library::{{ $class }}::Service {
+public:
+  static constexpr const char* Name = "{{ .Name }}";
+
+  using VereignServiceType = VereignService;
+  using VereignServicePtr = std::unique_ptr<VereignService>;
+
+  {{ $class }}(VereignServicePtr&& service)
+    : service_{std::move(service)}
+  {}
+
+  {{ $class }}(const {{ $class }}&) = delete;
+  {{ $class }}& operator=(const {{ $class }}&) = delete;
+
+{{- range .Apis }}
+
+  ::grpc::Status {{ title .Name }}(
+    ::grpc::ServerContext*,
+    const client_library::{{ .RequestMessage }}* request,
+    client_library::{{ .ResponseMessage }}* response
+  ) override {
+    auto result_future = service_->{{ title .Name }}(request, response);
+
+    try {
+      result_future.get();
+    } catch (const std::exception& e) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error(e.what());
+    } catch (...) {
+      response->set_code("500");
+      response->set_status("Internal Service Error");
+      response->set_error("Internal Service Error");
+    }
+
+    return ::grpc::Status::OK;
+  }
+{{- end }}
+
+protected:
+  VereignServicePtr service_;
+};
+
+} // gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_{{ upper .Name }}_API_HH
diff --git a/cpp/templates/vereign/grpc/gen/gen.cc.tmpl b/cpp/templates/vereign/grpc/gen/gen.cc.tmpl
new file mode 100644
index 0000000..47604c7
--- /dev/null
+++ b/cpp/templates/vereign/grpc/gen/gen.cc.tmpl
@@ -0,0 +1,21 @@
+#include <vereign/grpc/gen/gen.hh>
+
+#include <vereign/service/gen/gen.hh>
+#include <vereign/grpc/service_registry.hh>
+
+namespace vereign {
+namespace grpc {
+namespace gen {
+
+void RegisterAll(
+  restapi::ClientSession& client_session,
+  vereign::grpc::ServiceRegistry& service_registry
+) {
+{{- range .Services }}
+  service_registry.RegisterIfNotExist<{{ title .Name }}API<service::gen::{{ title .Name }}Service>>(client_session);
+{{- end }}
+}
+
+}
+}
+}
diff --git a/cpp/templates/vereign/grpc/gen/gen.hh.tmpl b/cpp/templates/vereign/grpc/gen/gen.hh.tmpl
new file mode 100644
index 0000000..eee804a
--- /dev/null
+++ b/cpp/templates/vereign/grpc/gen/gen.hh.tmpl
@@ -0,0 +1,25 @@
+#ifndef __VEREIGN_GRPC_GEN_GEN_HH
+#define __VEREIGN_GRPC_GEN_GEN_HH
+
+{{ range .Services }}
+#include <vereign/grpc/gen/{{ .Name }}_api.hh>
+{{- end }}
+
+namespace vereign {
+namespace restapi {
+class ClientSession;
+}
+
+namespace grpc {
+
+class ServiceRegistry;
+
+namespace gen {
+
+void RegisterAll(restapi::ClientSession& client_session, grpc::ServiceRegistry& service_registry);
+
+} // namespace gen
+} // namespace grpc
+} // namespace vereign
+
+#endif // __VEREIGN_GRPC_GEN_GEN_HH
diff --git a/cpp/templates/vereign/service/gen/++service++_service.cc.tmpl b/cpp/templates/vereign/service/gen/++service++_service.cc.tmpl
new file mode 100644
index 0000000..93c489c
--- /dev/null
+++ b/cpp/templates/vereign/service/gen/++service++_service.cc.tmpl
@@ -0,0 +1,39 @@
+#include <vereign/service/gen/{{ .Name }}_service.hh>
+#include <vereign/restapi/client_session.hh>
+
+namespace {
+{{- range .Apis }}
+  const std::string {{ .Name }}Path = "{{ .Name }}";
+{{- end }}
+}
+
+namespace vereign {
+namespace service {
+namespace gen {
+
+{{- $class := (print (title .Name) "Service") }}
+
+const std::string {{ $class }}::ServicePath = "/{{ .Name }}/";
+
+{{ $class }}::{{ $class }}(restapi::ClientSession& client_session)
+  : client_session_{client_session}
+{}
+
+{{- range .Apis }}
+
+std::future<{{ $class }}::{{ title .Name }}Result>
+{{ $class }}::{{ title .Name }}(
+    const client_library::{{ .RequestMessage }}* req,
+    client_library::{{ .ResponseMessage }}* resp
+) {
+  return client_session_.Post(
+    ServicePath + {{ .Name }}Path,
+    req,
+    resp
+  );
+}
+{{- end }}
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
diff --git a/cpp/templates/vereign/service/gen/++service++_service.hh.tmpl b/cpp/templates/vereign/service/gen/++service++_service.hh.tmpl
new file mode 100644
index 0000000..698f1f3
--- /dev/null
+++ b/cpp/templates/vereign/service/gen/++service++_service.hh.tmpl
@@ -0,0 +1,53 @@
+#ifndef __VEREIGN_SERVICE_GEN_{{ upper .Name }}_SERVICE_HH
+#define __VEREIGN_SERVICE_GEN_{{ upper .Name }}_SERVICE_HH
+
+#include <vereign/restapi/client_session.hh>
+#include <vereign/restapi/post_result.hh>
+#include <vereign/client_library/types.gen.pb.h>
+
+#include <future>
+
+namespace vereign {
+
+namespace restapi {
+  class ClientSession;
+}
+
+namespace service {
+namespace gen {
+
+template <class Request, class Response>
+using Result = restapi::PostResult<Request, Response>;
+
+{{- $class := (print (title .Name) "Service") }}
+
+class {{ $class }} {
+public:
+  static const std::string ServicePath;
+
+  explicit {{ $class }}(restapi::ClientSession& client_session);
+
+  {{ $class }}(const {{ $class }}&) = delete;
+  {{ $class }}& operator=(const {{ $class }}&) = delete;
+
+{{- range .Apis }}
+
+  using {{ title .Name }}Result = Result<
+    const client_library::{{ .RequestMessage }}*,
+    client_library::{{ .ResponseMessage }}*>;
+
+  std::future<{{ title .Name }}Result> {{ title .Name }}(
+    const client_library::{{ .RequestMessage }}* req,
+    client_library::{{ .ResponseMessage }}* resp
+  );
+{{- end }}
+
+private:
+  restapi::ClientSession& client_session_;
+};
+
+} // namespace gen
+} // namespace service
+} // namespace vereign
+
+#endif // __VEREIGN_SERVICE_GEN_{{ upper .Name }}_SERVICE_HH
diff --git a/cpp/templates/vereign/service/gen/gen.hh.tmpl b/cpp/templates/vereign/service/gen/gen.hh.tmpl
new file mode 100644
index 0000000..9f6d6a8
--- /dev/null
+++ b/cpp/templates/vereign/service/gen/gen.hh.tmpl
@@ -0,0 +1,8 @@
+#ifndef __VEREIGN_SERVICE_GEN_GEN_HH
+#define __VEREIGN_SERVICE_GEN_GEN_HH
+
+{{ range .Services }}
+#include <vereign/service/gen/{{ .Name }}_service.hh>
+{{- end }}
+
+#endif // __VEREIGN_SERVICE_GEN_GEN_HH
diff --git a/cpp/tests/protobuf/CMakeLists.txt b/cpp/tests/protobuf/CMakeLists.txt
index 27d205c..a23b8ac 100644
--- a/cpp/tests/protobuf/CMakeLists.txt
+++ b/cpp/tests/protobuf/CMakeLists.txt
@@ -30,14 +30,6 @@ target_link_libraries(protobuf_tests ${LIBS}
   PRIVATE protobuf::libprotobuf
 )
 
-#add_custom_command(
-#  TARGET protobuf_tests
-#  COMMENT "Run protobuf tests"
-#  POST_BUILD
-#  WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
-#  COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/protobuf_tests
-#)
-
 add_test(
   NAME protobuf_tests
   COMMAND protobuf_tests
diff --git a/cpp/tests/protobuf/json_test.cc b/cpp/tests/protobuf/json_test.cc
index 9ec8931..6e9d4ef 100644
--- a/cpp/tests/protobuf/json_test.cc
+++ b/cpp/tests/protobuf/json_test.cc
@@ -5,7 +5,7 @@
 TEST_CASE("simple struct", "[protobuf]") {
   auto json = R"(
 {
-  "int_value": 42,
+  "int_value": 9223372036854775807,
   "string_value": "foo bar",
   "int_arr": [4, 2],
   "string_arr": ["foo", "bar", "baz"],
@@ -16,7 +16,8 @@ TEST_CASE("simple struct", "[protobuf]") {
   "string_map": {
     "foo": "foo_value",
     "bar": "bar_value"
-  }
+  },
+  "double_value": 42
 }
 )";
 
@@ -28,7 +29,7 @@ TEST_CASE("simple struct", "[protobuf]") {
   CHECK(status.error_message() == "");
   REQUIRE(status.ok());
   CHECK(msg.string_value() == "foo bar");
-  CHECK(msg.int_value() == 42);
+  CHECK(msg.int_value() == 9223372036854775807);
   CHECK(msg.int_arr().size() == 2);
   CHECK(msg.int_arr().Get(0) == 4);
   CHECK(msg.int_arr().Get(1) == 2);
@@ -49,6 +50,31 @@ TEST_CASE("simple struct", "[protobuf]") {
   CHECK(msg.string_map_size() == 2);
   CHECK(msg.string_map().at("foo") == "foo_value");
   CHECK(msg.string_map().at("bar") == "bar_value");
+  CHECK(msg.double_value() == 42);
+}
+
+TEST_CASE("two dimensional array", "[protobuf]") {
+  auto json = R"(
+{
+  arr: [
+    {
+      str_arr: ["foo", "bar"]
+    }
+  ]
+}
+)";
+
+  testproto::TwoDimensionalArray msg;
+
+  google::protobuf::util::JsonParseOptions options;
+  auto status = google::protobuf::util::JsonStringToMessage(json, &msg, options);
+
+  CHECK(status.error_message() == "");
+  REQUIRE(status.ok());
+  REQUIRE(msg.arr().size() == 1);
+  REQUIRE(msg.arr().at(0).str_arr().size() == 2);
+  REQUIRE(msg.arr().at(0).str_arr().at(0) == "foo");
+  REQUIRE(msg.arr().at(0).str_arr().at(1) == "bar");
 }
 
 TEST_CASE("invalid json", "[protobuf]") {
@@ -97,6 +123,42 @@ TEST_CASE("null/missing integer value", "[protobuf]") {
   REQUIRE(msg.int_value() == 0);
 }
 
+TEST_CASE("json marshal double", "[protobuf]") {
+  testproto::SimpleStruct msg;
+  msg.set_double_value(42);
+
+  std::string json;
+  google::protobuf::util::JsonOptions options;
+  options.add_whitespace = true;
+  options.preserve_proto_field_names = true;
+  options.always_print_enums_as_ints = true;
+  auto status = google::protobuf::util::MessageToJsonString(msg, &json, options);
+  auto expected = R"({
+ "double_value": 42
+}
+)";
+
+  REQUIRE(json == expected);
+}
+
+TEST_CASE("json marshal uint64", "[protobuf]") {
+  testproto::SimpleStruct msg;
+  msg.set_uint64_value(42);
+
+  std::string json;
+  google::protobuf::util::JsonOptions options;
+  options.add_whitespace = true;
+  options.preserve_proto_field_names = true;
+  options.always_print_enums_as_ints = true;
+  auto status = google::protobuf::util::MessageToJsonString(msg, &json, options);
+  auto expected = R"({
+ "uint64_value": "42"
+}
+)";
+
+  REQUIRE(json == expected);
+}
+
 TEST_CASE("json marshal naming", "[protobuf]") {
   testproto::JsonNaming msg;
   msg.set_foo_value(1);
@@ -240,18 +302,4 @@ TEST_CASE("oneof marshal", "[protobuf]") {
     CHECK(json == expected);
   }
 
-  SECTION("marshal test") {
-    testproto::OneofValue msg;
-    msg.mutable_struct_value()->set_int_value(42);
-    google::protobuf::util::JsonPrintOptions options;
-    options.preserve_proto_field_names = true;
-    std::string json;
-    auto status = google::protobuf::util::MessageToJsonString(msg, &json, options);
-
-    auto expected = R"({"struct_value":{"int_value":"42"}})";
-
-    CHECK(status.error_message() == "");
-    REQUIRE(status.ok());
-    CHECK(json == expected);
-  }
 }
diff --git a/cpp/tests/protobuf/proto/messages.proto b/cpp/tests/protobuf/proto/messages.proto
index 70f4b46..1e1e0e3 100644
--- a/cpp/tests/protobuf/proto/messages.proto
+++ b/cpp/tests/protobuf/proto/messages.proto
@@ -9,6 +9,8 @@ message SimpleStruct {
   repeated string string_arr = 4;
   map<string, int32> int_map = 5;
   map<string, string> string_map = 6;
+  double double_value = 7;
+  uint64 uint64_value = 8;
 }
 
 message JsonNaming {
@@ -25,3 +27,10 @@ message OneofValue {
   }
 }
 
+message StringArray {
+  repeated string str_arr = 1;
+}
+
+message TwoDimensionalArray {
+  repeated StringArray arr = 1;
+}
diff --git a/cpp/tests/protobuf/testpb/messages.pb.cc b/cpp/tests/protobuf/testpb/messages.pb.cc
index 28f1084..0721f36 100644
--- a/cpp/tests/protobuf/testpb/messages.pb.cc
+++ b/cpp/tests/protobuf/testpb/messages.pb.cc
@@ -17,6 +17,7 @@
 extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<2> scc_info_SimpleStruct_messages_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_SimpleStruct_IntMapEntry_DoNotUse_messages_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2eproto;
+extern PROTOBUF_INTERNAL_EXPORT_messages_2eproto ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_StringArray_messages_2eproto;
 namespace testproto {
 class SimpleStruct_IntMapEntry_DoNotUseDefaultTypeInternal {
  public:
@@ -40,6 +41,14 @@ class OneofValueDefaultTypeInternal {
   ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr string_value_;
   const ::testproto::SimpleStruct* struct_value_;
 } _OneofValue_default_instance_;
+class StringArrayDefaultTypeInternal {
+ public:
+  ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<StringArray> _instance;
+} _StringArray_default_instance_;
+class TwoDimensionalArrayDefaultTypeInternal {
+ public:
+  ::PROTOBUF_NAMESPACE_ID::internal::ExplicitlyConstructed<TwoDimensionalArray> _instance;
+} _TwoDimensionalArray_default_instance_;
 }  // namespace testproto
 static void InitDefaultsscc_info_JsonNaming_messages_2eproto() {
   GOOGLE_PROTOBUF_VERIFY_VERSION;
@@ -112,7 +121,36 @@ static void InitDefaultsscc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2
 ::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2eproto =
     {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2eproto}, {}};
 
-static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_messages_2eproto[5];
+static void InitDefaultsscc_info_StringArray_messages_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::testproto::_StringArray_default_instance_;
+    new (ptr) ::testproto::StringArray();
+    ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::testproto::StringArray::InitAsDefaultInstance();
+}
+
+::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<0> scc_info_StringArray_messages_2eproto =
+    {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 0, 0, InitDefaultsscc_info_StringArray_messages_2eproto}, {}};
+
+static void InitDefaultsscc_info_TwoDimensionalArray_messages_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::testproto::_TwoDimensionalArray_default_instance_;
+    new (ptr) ::testproto::TwoDimensionalArray();
+    ::PROTOBUF_NAMESPACE_ID::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::testproto::TwoDimensionalArray::InitAsDefaultInstance();
+}
+
+::PROTOBUF_NAMESPACE_ID::internal::SCCInfo<1> scc_info_TwoDimensionalArray_messages_2eproto =
+    {{ATOMIC_VAR_INIT(::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase::kUninitialized), 1, 0, InitDefaultsscc_info_TwoDimensionalArray_messages_2eproto}, {
+      &scc_info_StringArray_messages_2eproto.base,}};
+
+static ::PROTOBUF_NAMESPACE_ID::Metadata file_level_metadata_messages_2eproto[7];
 static constexpr ::PROTOBUF_NAMESPACE_ID::EnumDescriptor const** file_level_enum_descriptors_messages_2eproto = nullptr;
 static constexpr ::PROTOBUF_NAMESPACE_ID::ServiceDescriptor const** file_level_service_descriptors_messages_2eproto = nullptr;
 
@@ -146,6 +184,8 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_messages_2eproto::offsets[] PR
   PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, string_arr_),
   PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, int_map_),
   PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, string_map_),
+  PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, double_value_),
+  PROTOBUF_FIELD_OFFSET(::testproto::SimpleStruct, uint64_value_),
   ~0u,  // no _has_bits_
   PROTOBUF_FIELD_OFFSET(::testproto::JsonNaming, _internal_metadata_),
   ~0u,  // no _extensions_
@@ -163,13 +203,27 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_messages_2eproto::offsets[] PR
   offsetof(::testproto::OneofValueDefaultTypeInternal, string_value_),
   offsetof(::testproto::OneofValueDefaultTypeInternal, struct_value_),
   PROTOBUF_FIELD_OFFSET(::testproto::OneofValue, data_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::testproto::StringArray, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::testproto::StringArray, str_arr_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::testproto::TwoDimensionalArray, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::testproto::TwoDimensionalArray, arr_),
 };
 static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
   { 0, 7, sizeof(::testproto::SimpleStruct_IntMapEntry_DoNotUse)},
   { 9, 16, sizeof(::testproto::SimpleStruct_StringMapEntry_DoNotUse)},
   { 18, -1, sizeof(::testproto::SimpleStruct)},
-  { 29, -1, sizeof(::testproto::JsonNaming)},
-  { 38, -1, sizeof(::testproto::OneofValue)},
+  { 31, -1, sizeof(::testproto::JsonNaming)},
+  { 40, -1, sizeof(::testproto::OneofValue)},
+  { 48, -1, sizeof(::testproto::StringArray)},
+  { 54, -1, sizeof(::testproto::TwoDimensionalArray)},
 };
 
 static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] = {
@@ -178,40 +232,47 @@ static ::PROTOBUF_NAMESPACE_ID::Message const * const file_default_instances[] =
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_SimpleStruct_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_JsonNaming_default_instance_),
   reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_OneofValue_default_instance_),
+  reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_StringArray_default_instance_),
+  reinterpret_cast<const ::PROTOBUF_NAMESPACE_ID::Message*>(&::testproto::_TwoDimensionalArray_default_instance_),
 };
 
 const char descriptor_table_protodef_messages_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) =
-  "\n\016messages.proto\022\ttestproto\"\257\002\n\014SimpleSt"
+  "\n\016messages.proto\022\ttestproto\"\333\002\n\014SimpleSt"
   "ruct\022\021\n\tint_value\030\001 \001(\003\022\024\n\014string_value\030"
   "\002 \001(\t\022\017\n\007int_arr\030\003 \003(\003\022\022\n\nstring_arr\030\004 \003"
   "(\t\0224\n\007int_map\030\005 \003(\0132#.testproto.SimpleSt"
   "ruct.IntMapEntry\022:\n\nstring_map\030\006 \003(\0132&.t"
-  "estproto.SimpleStruct.StringMapEntry\032-\n\013"
-  "IntMapEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 \001(\005:"
-  "\0028\001\0320\n\016StringMapEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005va"
-  "lue\030\002 \001(\t:\0028\001\"V\n\nJsonNaming\022\021\n\tfoo_value"
-  "\030\001 \001(\002\022\020\n\010barValue\030\002 \001(\002\022\020\n\010BazValue\030\003 \001"
-  "(\002\022\021\n\tquX_Value\030\004 \001(\002\"]\n\nOneofValue\022\026\n\014s"
-  "tring_value\030\001 \001(\tH\000\022/\n\014struct_value\030\002 \001("
-  "\0132\027.testproto.SimpleStructH\000B\006\n\004datab\006pr"
-  "oto3"
+  "estproto.SimpleStruct.StringMapEntry\022\024\n\014"
+  "double_value\030\007 \001(\001\022\024\n\014uint64_value\030\010 \001(\004"
+  "\032-\n\013IntMapEntry\022\013\n\003key\030\001 \001(\t\022\r\n\005value\030\002 "
+  "\001(\005:\0028\001\0320\n\016StringMapEntry\022\013\n\003key\030\001 \001(\t\022\r"
+  "\n\005value\030\002 \001(\t:\0028\001\"V\n\nJsonNaming\022\021\n\tfoo_v"
+  "alue\030\001 \001(\002\022\020\n\010barValue\030\002 \001(\002\022\020\n\010BazValue"
+  "\030\003 \001(\002\022\021\n\tquX_Value\030\004 \001(\002\"]\n\nOneofValue\022"
+  "\026\n\014string_value\030\001 \001(\tH\000\022/\n\014struct_value\030"
+  "\002 \001(\0132\027.testproto.SimpleStructH\000B\006\n\004data"
+  "\"\036\n\013StringArray\022\017\n\007str_arr\030\001 \003(\t\":\n\023TwoD"
+  "imensionalArray\022#\n\003arr\030\001 \003(\0132\026.testproto"
+  ".StringArrayb\006proto3"
   ;
 static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_messages_2eproto_deps[1] = {
 };
-static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_messages_2eproto_sccs[5] = {
+static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_messages_2eproto_sccs[7] = {
   &scc_info_JsonNaming_messages_2eproto.base,
   &scc_info_OneofValue_messages_2eproto.base,
   &scc_info_SimpleStruct_messages_2eproto.base,
   &scc_info_SimpleStruct_IntMapEntry_DoNotUse_messages_2eproto.base,
   &scc_info_SimpleStruct_StringMapEntry_DoNotUse_messages_2eproto.base,
+  &scc_info_StringArray_messages_2eproto.base,
+  &scc_info_TwoDimensionalArray_messages_2eproto.base,
 };
 static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_messages_2eproto_once;
 static bool descriptor_table_messages_2eproto_initialized = false;
 const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_messages_2eproto = {
-  &descriptor_table_messages_2eproto_initialized, descriptor_table_protodef_messages_2eproto, "messages.proto", 524,
-  &descriptor_table_messages_2eproto_once, descriptor_table_messages_2eproto_sccs, descriptor_table_messages_2eproto_deps, 5, 0,
+  &descriptor_table_messages_2eproto_initialized, descriptor_table_protodef_messages_2eproto, "messages.proto", 660,
+  &descriptor_table_messages_2eproto_once, descriptor_table_messages_2eproto_sccs, descriptor_table_messages_2eproto_deps, 7, 0,
   schemas, file_default_instances, TableStruct_messages_2eproto::offsets,
-  file_level_metadata_messages_2eproto, 5, file_level_enum_descriptors_messages_2eproto, file_level_service_descriptors_messages_2eproto,
+  file_level_metadata_messages_2eproto, 7, file_level_enum_descriptors_messages_2eproto, file_level_service_descriptors_messages_2eproto,
 };
 
 // Force running AddDescriptors() at dynamic initialization time.
@@ -277,14 +338,18 @@ SimpleStruct::SimpleStruct(const SimpleStruct& from)
   if (!from._internal_string_value().empty()) {
     string_value_.AssignWithDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(), from.string_value_);
   }
-  int_value_ = from.int_value_;
+  ::memcpy(&int_value_, &from.int_value_,
+    static_cast<size_t>(reinterpret_cast<char*>(&uint64_value_) -
+    reinterpret_cast<char*>(&int_value_)) + sizeof(uint64_value_));
   // @@protoc_insertion_point(copy_constructor:testproto.SimpleStruct)
 }
 
 void SimpleStruct::SharedCtor() {
   ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_SimpleStruct_messages_2eproto.base);
   string_value_.UnsafeSetDefault(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
-  int_value_ = PROTOBUF_LONGLONG(0);
+  ::memset(&int_value_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&uint64_value_) -
+      reinterpret_cast<char*>(&int_value_)) + sizeof(uint64_value_));
 }
 
 SimpleStruct::~SimpleStruct() {
@@ -316,7 +381,9 @@ void SimpleStruct::Clear() {
   int_map_.Clear();
   string_map_.Clear();
   string_value_.ClearToEmptyNoArena(&::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited());
-  int_value_ = PROTOBUF_LONGLONG(0);
+  ::memset(&int_value_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&uint64_value_) -
+      reinterpret_cast<char*>(&int_value_)) + sizeof(uint64_value_));
   _internal_metadata_.Clear();
 }
 
@@ -391,6 +458,20 @@ const char* SimpleStruct::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_I
           } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<50>(ptr));
         } else goto handle_unusual;
         continue;
+      // double double_value = 7;
+      case 7:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 57)) {
+          double_value_ = ::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad<double>(ptr);
+          ptr += sizeof(double);
+        } else goto handle_unusual;
+        continue;
+      // uint64 uint64_value = 8;
+      case 8:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 64)) {
+          uint64_value_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr);
+          CHK_(ptr);
+        } else goto handle_unusual;
+        continue;
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
@@ -538,6 +619,18 @@ failure:
     }
   }
 
+  // double double_value = 7;
+  if (!(this->double_value() <= 0 && this->double_value() >= 0)) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteDoubleToArray(7, this->_internal_double_value(), target);
+  }
+
+  // uint64 uint64_value = 8;
+  if (this->uint64_value() != 0) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteUInt64ToArray(8, this->_internal_uint64_value(), target);
+  }
+
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields(), target, stream);
@@ -609,6 +702,18 @@ size_t SimpleStruct::ByteSizeLong() const {
         this->_internal_int_value());
   }
 
+  // double double_value = 7;
+  if (!(this->double_value() <= 0 && this->double_value() >= 0)) {
+    total_size += 1 + 8;
+  }
+
+  // uint64 uint64_value = 8;
+  if (this->uint64_value() != 0) {
+    total_size += 1 +
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::UInt64Size(
+        this->_internal_uint64_value());
+  }
+
   if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
     return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize(
         _internal_metadata_, total_size, &_cached_size_);
@@ -651,6 +756,12 @@ void SimpleStruct::MergeFrom(const SimpleStruct& from) {
   if (from.int_value() != 0) {
     _internal_set_int_value(from._internal_int_value());
   }
+  if (!(from.double_value() <= 0 && from.double_value() >= 0)) {
+    _internal_set_double_value(from._internal_double_value());
+  }
+  if (from.uint64_value() != 0) {
+    _internal_set_uint64_value(from._internal_uint64_value());
+  }
 }
 
 void SimpleStruct::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) {
@@ -681,6 +792,8 @@ void SimpleStruct::InternalSwap(SimpleStruct* other) {
   string_value_.Swap(&other->string_value_, &::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(),
     GetArenaNoVirtual());
   swap(int_value_, other->int_value_);
+  swap(double_value_, other->double_value_);
+  swap(uint64_value_, other->uint64_value_);
 }
 
 ::PROTOBUF_NAMESPACE_ID::Metadata SimpleStruct::GetMetadata() const {
@@ -1233,6 +1346,393 @@ void OneofValue::InternalSwap(OneofValue* other) {
 }
 
 
+// ===================================================================
+
+void StringArray::InitAsDefaultInstance() {
+}
+class StringArray::_Internal {
+ public:
+};
+
+StringArray::StringArray()
+  : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:testproto.StringArray)
+}
+StringArray::StringArray(const StringArray& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message(),
+      _internal_metadata_(nullptr),
+      str_arr_(from.str_arr_) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  // @@protoc_insertion_point(copy_constructor:testproto.StringArray)
+}
+
+void StringArray::SharedCtor() {
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_StringArray_messages_2eproto.base);
+}
+
+StringArray::~StringArray() {
+  // @@protoc_insertion_point(destructor:testproto.StringArray)
+  SharedDtor();
+}
+
+void StringArray::SharedDtor() {
+}
+
+void StringArray::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const StringArray& StringArray::default_instance() {
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_StringArray_messages_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void StringArray::Clear() {
+// @@protoc_insertion_point(message_clear_start:testproto.StringArray)
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  str_arr_.Clear();
+  _internal_metadata_.Clear();
+}
+
+const char* StringArray::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  while (!ctx->Done(&ptr)) {
+    ::PROTOBUF_NAMESPACE_ID::uint32 tag;
+    ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
+    CHK_(ptr);
+    switch (tag >> 3) {
+      // repeated string str_arr = 1;
+      case 1:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) {
+          ptr -= 1;
+          do {
+            ptr += 1;
+            auto str = _internal_add_str_arr();
+            ptr = ::PROTOBUF_NAMESPACE_ID::internal::InlineGreedyStringParser(str, ptr, ctx);
+            CHK_(::PROTOBUF_NAMESPACE_ID::internal::VerifyUTF8(str, "testproto.StringArray.str_arr"));
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr));
+        } else goto handle_unusual;
+        continue;
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->SetLastTag(tag);
+          goto success;
+        }
+        ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
+        CHK_(ptr != nullptr);
+        continue;
+      }
+    }  // switch
+  }  // while
+success:
+  return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
+}
+
+::PROTOBUF_NAMESPACE_ID::uint8* StringArray::_InternalSerialize(
+    ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
+  // @@protoc_insertion_point(serialize_to_array_start:testproto.StringArray)
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // repeated string str_arr = 1;
+  for (int i = 0, n = this->_internal_str_arr_size(); i < n; i++) {
+    const auto& s = this->_internal_str_arr(i);
+    ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String(
+      s.data(), static_cast<int>(s.length()),
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE,
+      "testproto.StringArray.str_arr");
+    target = stream->WriteString(1, s, target);
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target, stream);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:testproto.StringArray)
+  return target;
+}
+
+size_t StringArray::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:testproto.StringArray)
+  size_t total_size = 0;
+
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // repeated string str_arr = 1;
+  total_size += 1 *
+      ::PROTOBUF_NAMESPACE_ID::internal::FromIntSize(str_arr_.size());
+  for (int i = 0, n = str_arr_.size(); i < n; i++) {
+    total_size += ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize(
+      str_arr_.Get(i));
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize(
+        _internal_metadata_, total_size, &_cached_size_);
+  }
+  int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void StringArray::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:testproto.StringArray)
+  GOOGLE_DCHECK_NE(&from, this);
+  const StringArray* source =
+      ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<StringArray>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.StringArray)
+    ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.StringArray)
+    MergeFrom(*source);
+  }
+}
+
+void StringArray::MergeFrom(const StringArray& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:testproto.StringArray)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  str_arr_.MergeFrom(from.str_arr_);
+}
+
+void StringArray::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:testproto.StringArray)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void StringArray::CopyFrom(const StringArray& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:testproto.StringArray)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool StringArray::IsInitialized() const {
+  return true;
+}
+
+void StringArray::InternalSwap(StringArray* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  str_arr_.InternalSwap(&other->str_arr_);
+}
+
+::PROTOBUF_NAMESPACE_ID::Metadata StringArray::GetMetadata() const {
+  return GetMetadataStatic();
+}
+
+
+// ===================================================================
+
+void TwoDimensionalArray::InitAsDefaultInstance() {
+}
+class TwoDimensionalArray::_Internal {
+ public:
+};
+
+TwoDimensionalArray::TwoDimensionalArray()
+  : ::PROTOBUF_NAMESPACE_ID::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:testproto.TwoDimensionalArray)
+}
+TwoDimensionalArray::TwoDimensionalArray(const TwoDimensionalArray& from)
+  : ::PROTOBUF_NAMESPACE_ID::Message(),
+      _internal_metadata_(nullptr),
+      arr_(from.arr_) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  // @@protoc_insertion_point(copy_constructor:testproto.TwoDimensionalArray)
+}
+
+void TwoDimensionalArray::SharedCtor() {
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&scc_info_TwoDimensionalArray_messages_2eproto.base);
+}
+
+TwoDimensionalArray::~TwoDimensionalArray() {
+  // @@protoc_insertion_point(destructor:testproto.TwoDimensionalArray)
+  SharedDtor();
+}
+
+void TwoDimensionalArray::SharedDtor() {
+}
+
+void TwoDimensionalArray::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const TwoDimensionalArray& TwoDimensionalArray::default_instance() {
+  ::PROTOBUF_NAMESPACE_ID::internal::InitSCC(&::scc_info_TwoDimensionalArray_messages_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void TwoDimensionalArray::Clear() {
+// @@protoc_insertion_point(message_clear_start:testproto.TwoDimensionalArray)
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  arr_.Clear();
+  _internal_metadata_.Clear();
+}
+
+const char* TwoDimensionalArray::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) {
+#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure
+  while (!ctx->Done(&ptr)) {
+    ::PROTOBUF_NAMESPACE_ID::uint32 tag;
+    ptr = ::PROTOBUF_NAMESPACE_ID::internal::ReadTag(ptr, &tag);
+    CHK_(ptr);
+    switch (tag >> 3) {
+      // repeated .testproto.StringArray arr = 1;
+      case 1:
+        if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 10)) {
+          ptr -= 1;
+          do {
+            ptr += 1;
+            ptr = ctx->ParseMessage(_internal_add_arr(), ptr);
+            CHK_(ptr);
+            if (!ctx->DataAvailable(ptr)) break;
+          } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr));
+        } else goto handle_unusual;
+        continue;
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->SetLastTag(tag);
+          goto success;
+        }
+        ptr = UnknownFieldParse(tag, &_internal_metadata_, ptr, ctx);
+        CHK_(ptr != nullptr);
+        continue;
+      }
+    }  // switch
+  }  // while
+success:
+  return ptr;
+failure:
+  ptr = nullptr;
+  goto success;
+#undef CHK_
+}
+
+::PROTOBUF_NAMESPACE_ID::uint8* TwoDimensionalArray::_InternalSerialize(
+    ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const {
+  // @@protoc_insertion_point(serialize_to_array_start:testproto.TwoDimensionalArray)
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // repeated .testproto.StringArray arr = 1;
+  for (unsigned int i = 0,
+      n = static_cast<unsigned int>(this->_internal_arr_size()); i < n; i++) {
+    target = stream->EnsureSpace(target);
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::
+      InternalWriteMessage(1, this->_internal_arr(i), target, stream);
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::InternalSerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target, stream);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:testproto.TwoDimensionalArray)
+  return target;
+}
+
+size_t TwoDimensionalArray::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:testproto.TwoDimensionalArray)
+  size_t total_size = 0;
+
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // repeated .testproto.StringArray arr = 1;
+  total_size += 1UL * this->_internal_arr_size();
+  for (const auto& msg : this->arr_) {
+    total_size +=
+      ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg);
+  }
+
+  if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) {
+    return ::PROTOBUF_NAMESPACE_ID::internal::ComputeUnknownFieldsSize(
+        _internal_metadata_, total_size, &_cached_size_);
+  }
+  int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void TwoDimensionalArray::MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:testproto.TwoDimensionalArray)
+  GOOGLE_DCHECK_NE(&from, this);
+  const TwoDimensionalArray* source =
+      ::PROTOBUF_NAMESPACE_ID::DynamicCastToGenerated<TwoDimensionalArray>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:testproto.TwoDimensionalArray)
+    ::PROTOBUF_NAMESPACE_ID::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:testproto.TwoDimensionalArray)
+    MergeFrom(*source);
+  }
+}
+
+void TwoDimensionalArray::MergeFrom(const TwoDimensionalArray& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:testproto.TwoDimensionalArray)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::PROTOBUF_NAMESPACE_ID::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  arr_.MergeFrom(from.arr_);
+}
+
+void TwoDimensionalArray::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:testproto.TwoDimensionalArray)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void TwoDimensionalArray::CopyFrom(const TwoDimensionalArray& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:testproto.TwoDimensionalArray)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool TwoDimensionalArray::IsInitialized() const {
+  return true;
+}
+
+void TwoDimensionalArray::InternalSwap(TwoDimensionalArray* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  arr_.InternalSwap(&other->arr_);
+}
+
+::PROTOBUF_NAMESPACE_ID::Metadata TwoDimensionalArray::GetMetadata() const {
+  return GetMetadataStatic();
+}
+
+
 // @@protoc_insertion_point(namespace_scope)
 }  // namespace testproto
 PROTOBUF_NAMESPACE_OPEN
@@ -1251,6 +1751,12 @@ template<> PROTOBUF_NOINLINE ::testproto::JsonNaming* Arena::CreateMaybeMessage<
 template<> PROTOBUF_NOINLINE ::testproto::OneofValue* Arena::CreateMaybeMessage< ::testproto::OneofValue >(Arena* arena) {
   return Arena::CreateInternal< ::testproto::OneofValue >(arena);
 }
+template<> PROTOBUF_NOINLINE ::testproto::StringArray* Arena::CreateMaybeMessage< ::testproto::StringArray >(Arena* arena) {
+  return Arena::CreateInternal< ::testproto::StringArray >(arena);
+}
+template<> PROTOBUF_NOINLINE ::testproto::TwoDimensionalArray* Arena::CreateMaybeMessage< ::testproto::TwoDimensionalArray >(Arena* arena) {
+  return Arena::CreateInternal< ::testproto::TwoDimensionalArray >(arena);
+}
 PROTOBUF_NAMESPACE_CLOSE
 
 // @@protoc_insertion_point(global_scope)
diff --git a/cpp/tests/protobuf/testpb/messages.pb.h b/cpp/tests/protobuf/testpb/messages.pb.h
index f5fae93..d1acd7c 100644
--- a/cpp/tests/protobuf/testpb/messages.pb.h
+++ b/cpp/tests/protobuf/testpb/messages.pb.h
@@ -50,7 +50,7 @@ struct TableStruct_messages_2eproto {
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::PROTOBUF_NAMESPACE_ID::internal::AuxillaryParseTableField aux[]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
-  static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTable schema[5]
+  static const ::PROTOBUF_NAMESPACE_ID::internal::ParseTable schema[7]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::PROTOBUF_NAMESPACE_ID::internal::FieldMetadata field_metadata[];
   static const ::PROTOBUF_NAMESPACE_ID::internal::SerializationTable serialization_table[];
@@ -73,6 +73,12 @@ extern SimpleStruct_IntMapEntry_DoNotUseDefaultTypeInternal _SimpleStruct_IntMap
 class SimpleStruct_StringMapEntry_DoNotUse;
 class SimpleStruct_StringMapEntry_DoNotUseDefaultTypeInternal;
 extern SimpleStruct_StringMapEntry_DoNotUseDefaultTypeInternal _SimpleStruct_StringMapEntry_DoNotUse_default_instance_;
+class StringArray;
+class StringArrayDefaultTypeInternal;
+extern StringArrayDefaultTypeInternal _StringArray_default_instance_;
+class TwoDimensionalArray;
+class TwoDimensionalArrayDefaultTypeInternal;
+extern TwoDimensionalArrayDefaultTypeInternal _TwoDimensionalArray_default_instance_;
 }  // namespace testproto
 PROTOBUF_NAMESPACE_OPEN
 template<> ::testproto::JsonNaming* Arena::CreateMaybeMessage<::testproto::JsonNaming>(Arena*);
@@ -80,6 +86,8 @@ template<> ::testproto::OneofValue* Arena::CreateMaybeMessage<::testproto::Oneof
 template<> ::testproto::SimpleStruct* Arena::CreateMaybeMessage<::testproto::SimpleStruct>(Arena*);
 template<> ::testproto::SimpleStruct_IntMapEntry_DoNotUse* Arena::CreateMaybeMessage<::testproto::SimpleStruct_IntMapEntry_DoNotUse>(Arena*);
 template<> ::testproto::SimpleStruct_StringMapEntry_DoNotUse* Arena::CreateMaybeMessage<::testproto::SimpleStruct_StringMapEntry_DoNotUse>(Arena*);
+template<> ::testproto::StringArray* Arena::CreateMaybeMessage<::testproto::StringArray>(Arena*);
+template<> ::testproto::TwoDimensionalArray* Arena::CreateMaybeMessage<::testproto::TwoDimensionalArray>(Arena*);
 PROTOBUF_NAMESPACE_CLOSE
 namespace testproto {
 
@@ -264,6 +272,8 @@ class SimpleStruct :
     kStringMapFieldNumber = 6,
     kStringValueFieldNumber = 2,
     kIntValueFieldNumber = 1,
+    kDoubleValueFieldNumber = 7,
+    kUint64ValueFieldNumber = 8,
   };
   // repeated int64 int_arr = 3;
   int int_arr_size() const;
@@ -370,6 +380,24 @@ class SimpleStruct :
   void _internal_set_int_value(::PROTOBUF_NAMESPACE_ID::int64 value);
   public:
 
+  // double double_value = 7;
+  void clear_double_value();
+  double double_value() const;
+  void set_double_value(double value);
+  private:
+  double _internal_double_value() const;
+  void _internal_set_double_value(double value);
+  public:
+
+  // uint64 uint64_value = 8;
+  void clear_uint64_value();
+  ::PROTOBUF_NAMESPACE_ID::uint64 uint64_value() const;
+  void set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value);
+  private:
+  ::PROTOBUF_NAMESPACE_ID::uint64 _internal_uint64_value() const;
+  void _internal_set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value);
+  public:
+
   // @@protoc_insertion_point(class_scope:testproto.SimpleStruct)
  private:
   class _Internal;
@@ -392,6 +420,8 @@ class SimpleStruct :
       0 > string_map_;
   ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr string_value_;
   ::PROTOBUF_NAMESPACE_ID::int64 int_value_;
+  double double_value_;
+  ::PROTOBUF_NAMESPACE_ID::uint64 uint64_value_;
   mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_messages_2eproto;
 };
@@ -729,6 +759,286 @@ class OneofValue :
 
   friend struct ::TableStruct_messages_2eproto;
 };
+// -------------------------------------------------------------------
+
+class StringArray :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.StringArray) */ {
+ public:
+  StringArray();
+  virtual ~StringArray();
+
+  StringArray(const StringArray& from);
+  StringArray(StringArray&& from) noexcept
+    : StringArray() {
+    *this = ::std::move(from);
+  }
+
+  inline StringArray& operator=(const StringArray& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  inline StringArray& operator=(StringArray&& from) noexcept {
+    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
+      if (this != &from) InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() {
+    return GetDescriptor();
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() {
+    return GetMetadataStatic().descriptor;
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
+    return GetMetadataStatic().reflection;
+  }
+  static const StringArray& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const StringArray* internal_default_instance() {
+    return reinterpret_cast<const StringArray*>(
+               &_StringArray_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    5;
+
+  friend void swap(StringArray& a, StringArray& b) {
+    a.Swap(&b);
+  }
+  inline void Swap(StringArray* other) {
+    if (other == this) return;
+    InternalSwap(other);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline StringArray* New() const final {
+    return CreateMaybeMessage<StringArray>(nullptr);
+  }
+
+  StringArray* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final {
+    return CreateMaybeMessage<StringArray>(arena);
+  }
+  void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;
+  void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;
+  void CopyFrom(const StringArray& from);
+  void MergeFrom(const StringArray& from);
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final;
+  ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize(
+      ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  inline void SharedCtor();
+  inline void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(StringArray* other);
+  friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
+  static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+    return "testproto.StringArray";
+  }
+  private:
+  inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const {
+    return nullptr;
+  }
+  inline void* MaybeArenaPtr() const {
+    return nullptr;
+  }
+  public:
+
+  ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
+  private:
+  static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() {
+    ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto);
+    return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages];
+  }
+
+  public:
+
+  // nested types ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  enum : int {
+    kStrArrFieldNumber = 1,
+  };
+  // repeated string str_arr = 1;
+  int str_arr_size() const;
+  private:
+  int _internal_str_arr_size() const;
+  public:
+  void clear_str_arr();
+  const std::string& str_arr(int index) const;
+  std::string* mutable_str_arr(int index);
+  void set_str_arr(int index, const std::string& value);
+  void set_str_arr(int index, std::string&& value);
+  void set_str_arr(int index, const char* value);
+  void set_str_arr(int index, const char* value, size_t size);
+  std::string* add_str_arr();
+  void add_str_arr(const std::string& value);
+  void add_str_arr(std::string&& value);
+  void add_str_arr(const char* value);
+  void add_str_arr(const char* value, size_t size);
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>& str_arr() const;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>* mutable_str_arr();
+  private:
+  const std::string& _internal_str_arr(int index) const;
+  std::string* _internal_add_str_arr();
+  public:
+
+  // @@protoc_insertion_point(class_scope:testproto.StringArray)
+ private:
+  class _Internal;
+
+  ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string> str_arr_;
+  mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_messages_2eproto;
+};
+// -------------------------------------------------------------------
+
+class TwoDimensionalArray :
+    public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:testproto.TwoDimensionalArray) */ {
+ public:
+  TwoDimensionalArray();
+  virtual ~TwoDimensionalArray();
+
+  TwoDimensionalArray(const TwoDimensionalArray& from);
+  TwoDimensionalArray(TwoDimensionalArray&& from) noexcept
+    : TwoDimensionalArray() {
+    *this = ::std::move(from);
+  }
+
+  inline TwoDimensionalArray& operator=(const TwoDimensionalArray& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  inline TwoDimensionalArray& operator=(TwoDimensionalArray&& from) noexcept {
+    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
+      if (this != &from) InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() {
+    return GetDescriptor();
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() {
+    return GetMetadataStatic().descriptor;
+  }
+  static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() {
+    return GetMetadataStatic().reflection;
+  }
+  static const TwoDimensionalArray& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const TwoDimensionalArray* internal_default_instance() {
+    return reinterpret_cast<const TwoDimensionalArray*>(
+               &_TwoDimensionalArray_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    6;
+
+  friend void swap(TwoDimensionalArray& a, TwoDimensionalArray& b) {
+    a.Swap(&b);
+  }
+  inline void Swap(TwoDimensionalArray* other) {
+    if (other == this) return;
+    InternalSwap(other);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline TwoDimensionalArray* New() const final {
+    return CreateMaybeMessage<TwoDimensionalArray>(nullptr);
+  }
+
+  TwoDimensionalArray* New(::PROTOBUF_NAMESPACE_ID::Arena* arena) const final {
+    return CreateMaybeMessage<TwoDimensionalArray>(arena);
+  }
+  void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;
+  void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;
+  void CopyFrom(const TwoDimensionalArray& from);
+  void MergeFrom(const TwoDimensionalArray& from);
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final;
+  ::PROTOBUF_NAMESPACE_ID::uint8* _InternalSerialize(
+      ::PROTOBUF_NAMESPACE_ID::uint8* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  inline void SharedCtor();
+  inline void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(TwoDimensionalArray* other);
+  friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata;
+  static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() {
+    return "testproto.TwoDimensionalArray";
+  }
+  private:
+  inline ::PROTOBUF_NAMESPACE_ID::Arena* GetArenaNoVirtual() const {
+    return nullptr;
+  }
+  inline void* MaybeArenaPtr() const {
+    return nullptr;
+  }
+  public:
+
+  ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final;
+  private:
+  static ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadataStatic() {
+    ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&::descriptor_table_messages_2eproto);
+    return ::descriptor_table_messages_2eproto.file_level_metadata[kIndexInFileMessages];
+  }
+
+  public:
+
+  // nested types ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  enum : int {
+    kArrFieldNumber = 1,
+  };
+  // repeated .testproto.StringArray arr = 1;
+  int arr_size() const;
+  private:
+  int _internal_arr_size() const;
+  public:
+  void clear_arr();
+  ::testproto::StringArray* mutable_arr(int index);
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::StringArray >*
+      mutable_arr();
+  private:
+  const ::testproto::StringArray& _internal_arr(int index) const;
+  ::testproto::StringArray* _internal_add_arr();
+  public:
+  const ::testproto::StringArray& arr(int index) const;
+  ::testproto::StringArray* add_arr();
+  const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::StringArray >&
+      arr() const;
+
+  // @@protoc_insertion_point(class_scope:testproto.TwoDimensionalArray)
+ private:
+  class _Internal;
+
+  ::PROTOBUF_NAMESPACE_ID::internal::InternalMetadataWithArena _internal_metadata_;
+  ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::StringArray > arr_;
+  mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_messages_2eproto;
+};
 // ===================================================================
 
 
@@ -1003,6 +1313,46 @@ SimpleStruct::mutable_string_map() {
   return _internal_mutable_string_map();
 }
 
+// double double_value = 7;
+inline void SimpleStruct::clear_double_value() {
+  double_value_ = 0;
+}
+inline double SimpleStruct::_internal_double_value() const {
+  return double_value_;
+}
+inline double SimpleStruct::double_value() const {
+  // @@protoc_insertion_point(field_get:testproto.SimpleStruct.double_value)
+  return _internal_double_value();
+}
+inline void SimpleStruct::_internal_set_double_value(double value) {
+  
+  double_value_ = value;
+}
+inline void SimpleStruct::set_double_value(double value) {
+  _internal_set_double_value(value);
+  // @@protoc_insertion_point(field_set:testproto.SimpleStruct.double_value)
+}
+
+// uint64 uint64_value = 8;
+inline void SimpleStruct::clear_uint64_value() {
+  uint64_value_ = PROTOBUF_ULONGLONG(0);
+}
+inline ::PROTOBUF_NAMESPACE_ID::uint64 SimpleStruct::_internal_uint64_value() const {
+  return uint64_value_;
+}
+inline ::PROTOBUF_NAMESPACE_ID::uint64 SimpleStruct::uint64_value() const {
+  // @@protoc_insertion_point(field_get:testproto.SimpleStruct.uint64_value)
+  return _internal_uint64_value();
+}
+inline void SimpleStruct::_internal_set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value) {
+  
+  uint64_value_ = value;
+}
+inline void SimpleStruct::set_uint64_value(::PROTOBUF_NAMESPACE_ID::uint64 value) {
+  _internal_set_uint64_value(value);
+  // @@protoc_insertion_point(field_set:testproto.SimpleStruct.uint64_value)
+}
+
 // -------------------------------------------------------------------
 
 // JsonNaming
@@ -1248,6 +1598,127 @@ inline void OneofValue::clear_has_data() {
 inline OneofValue::DataCase OneofValue::data_case() const {
   return OneofValue::DataCase(_oneof_case_[0]);
 }
+// -------------------------------------------------------------------
+
+// StringArray
+
+// repeated string str_arr = 1;
+inline int StringArray::_internal_str_arr_size() const {
+  return str_arr_.size();
+}
+inline int StringArray::str_arr_size() const {
+  return _internal_str_arr_size();
+}
+inline void StringArray::clear_str_arr() {
+  str_arr_.Clear();
+}
+inline std::string* StringArray::add_str_arr() {
+  // @@protoc_insertion_point(field_add_mutable:testproto.StringArray.str_arr)
+  return _internal_add_str_arr();
+}
+inline const std::string& StringArray::_internal_str_arr(int index) const {
+  return str_arr_.Get(index);
+}
+inline const std::string& StringArray::str_arr(int index) const {
+  // @@protoc_insertion_point(field_get:testproto.StringArray.str_arr)
+  return _internal_str_arr(index);
+}
+inline std::string* StringArray::mutable_str_arr(int index) {
+  // @@protoc_insertion_point(field_mutable:testproto.StringArray.str_arr)
+  return str_arr_.Mutable(index);
+}
+inline void StringArray::set_str_arr(int index, const std::string& value) {
+  // @@protoc_insertion_point(field_set:testproto.StringArray.str_arr)
+  str_arr_.Mutable(index)->assign(value);
+}
+inline void StringArray::set_str_arr(int index, std::string&& value) {
+  // @@protoc_insertion_point(field_set:testproto.StringArray.str_arr)
+  str_arr_.Mutable(index)->assign(std::move(value));
+}
+inline void StringArray::set_str_arr(int index, const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  str_arr_.Mutable(index)->assign(value);
+  // @@protoc_insertion_point(field_set_char:testproto.StringArray.str_arr)
+}
+inline void StringArray::set_str_arr(int index, const char* value, size_t size) {
+  str_arr_.Mutable(index)->assign(
+    reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_set_pointer:testproto.StringArray.str_arr)
+}
+inline std::string* StringArray::_internal_add_str_arr() {
+  return str_arr_.Add();
+}
+inline void StringArray::add_str_arr(const std::string& value) {
+  str_arr_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add:testproto.StringArray.str_arr)
+}
+inline void StringArray::add_str_arr(std::string&& value) {
+  str_arr_.Add(std::move(value));
+  // @@protoc_insertion_point(field_add:testproto.StringArray.str_arr)
+}
+inline void StringArray::add_str_arr(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  str_arr_.Add()->assign(value);
+  // @@protoc_insertion_point(field_add_char:testproto.StringArray.str_arr)
+}
+inline void StringArray::add_str_arr(const char* value, size_t size) {
+  str_arr_.Add()->assign(reinterpret_cast<const char*>(value), size);
+  // @@protoc_insertion_point(field_add_pointer:testproto.StringArray.str_arr)
+}
+inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>&
+StringArray::str_arr() const {
+  // @@protoc_insertion_point(field_list:testproto.StringArray.str_arr)
+  return str_arr_;
+}
+inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField<std::string>*
+StringArray::mutable_str_arr() {
+  // @@protoc_insertion_point(field_mutable_list:testproto.StringArray.str_arr)
+  return &str_arr_;
+}
+
+// -------------------------------------------------------------------
+
+// TwoDimensionalArray
+
+// repeated .testproto.StringArray arr = 1;
+inline int TwoDimensionalArray::_internal_arr_size() const {
+  return arr_.size();
+}
+inline int TwoDimensionalArray::arr_size() const {
+  return _internal_arr_size();
+}
+inline void TwoDimensionalArray::clear_arr() {
+  arr_.Clear();
+}
+inline ::testproto::StringArray* TwoDimensionalArray::mutable_arr(int index) {
+  // @@protoc_insertion_point(field_mutable:testproto.TwoDimensionalArray.arr)
+  return arr_.Mutable(index);
+}
+inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::StringArray >*
+TwoDimensionalArray::mutable_arr() {
+  // @@protoc_insertion_point(field_mutable_list:testproto.TwoDimensionalArray.arr)
+  return &arr_;
+}
+inline const ::testproto::StringArray& TwoDimensionalArray::_internal_arr(int index) const {
+  return arr_.Get(index);
+}
+inline const ::testproto::StringArray& TwoDimensionalArray::arr(int index) const {
+  // @@protoc_insertion_point(field_get:testproto.TwoDimensionalArray.arr)
+  return _internal_arr(index);
+}
+inline ::testproto::StringArray* TwoDimensionalArray::_internal_add_arr() {
+  return arr_.Add();
+}
+inline ::testproto::StringArray* TwoDimensionalArray::add_arr() {
+  // @@protoc_insertion_point(field_add:testproto.TwoDimensionalArray.arr)
+  return _internal_add_arr();
+}
+inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::testproto::StringArray >&
+TwoDimensionalArray::arr() const {
+  // @@protoc_insertion_point(field_list:testproto.TwoDimensionalArray.arr)
+  return arr_;
+}
+
 #ifdef __GNUC__
   #pragma GCC diagnostic pop
 #endif  // __GNUC__
@@ -1259,6 +1730,10 @@ inline OneofValue::DataCase OneofValue::data_case() const {
 
 // -------------------------------------------------------------------
 
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
 
 // @@protoc_insertion_point(namespace_scope)
 
diff --git a/cpp/tests/vereign/grpc/server_test.cc b/cpp/tests/vereign/grpc/server_test.cc
index a779043..128d167 100644
--- a/cpp/tests/vereign/grpc/server_test.cc
+++ b/cpp/tests/vereign/grpc/server_test.cc
@@ -5,6 +5,7 @@
 #include <util/protobuf.hh>
 
 #include "catch.hpp"
+#include "vereign/client_library/types.gen.pb.h"
 
 #include <grpcpp/create_channel.h>
 
@@ -24,6 +25,7 @@ TEST_CASE("Server", "[vereign/grpc/server][.integration]") {
   );
 
   auto client = vereign::client_library::PassportAPI::NewStub(channel);
+  // vereign::client_library::
 
   vereign::client_library::ListPassportsForm req;
   vereign::client_library::ListPassportsFormResponse resp;
@@ -57,6 +59,21 @@ TEST_CASE("Server", "[vereign/grpc/server][.integration]") {
     CHECK(passport.uuid().size() == 36);
   }
 
+  vereign::client_library::GetInteractionsForm getInterReq;
+  vereign::client_library::GetInteractionsFormResponse getInterResp;
+  ::grpc::ClientContext getInterCtx;
+  status = client->GetInteractions(&getInterCtx, getInterReq, &getInterResp);
+  CHECK(status.error_message() == "");
+  CHECK(getInterResp.error() == "");
+  CHECK(getInterResp.status() == "OK");
+  CHECK(getInterResp.code() == "200");
+  for (auto& interaction : getInterResp.data()) {
+    CHECK(interaction.subject().size() > 0);
+    CHECK(interaction.passport().size() == 36);
+  }
+
+  // std::cout << vereign::test::ProtobufToJson(getDIDsResp) << std::endl;
+
   grpc_shutdown();
   google::protobuf::ShutdownProtobufLibrary();
 }
diff --git a/cpp/tests/vereign/restapi/client_session_test.cc b/cpp/tests/vereign/restapi/client_session_test.cc
index eefbb73..3f5bfc4 100644
--- a/cpp/tests/vereign/restapi/client_session_test.cc
+++ b/cpp/tests/vereign/restapi/client_session_test.cc
@@ -1,7 +1,7 @@
 #include <vereign/restapi/client.hh>
 #include <vereign/restapi/client_session.hh>
 #include <vereign/core/scope_guard.hh>
-#include <vereign/client_library/passport_types.gen.pb.h>
+#include <vereign/client_library/types.gen.pb.h>
 #include <util/env.hh>
 #include <util/protobuf.hh>
 
diff --git a/cpp/tests/vereign/service/gen/passport_service_test.cc b/cpp/tests/vereign/service/gen/passport_service_test.cc
index 637838a..2a296ff 100644
--- a/cpp/tests/vereign/service/gen/passport_service_test.cc
+++ b/cpp/tests/vereign/service/gen/passport_service_test.cc
@@ -1,6 +1,6 @@
 #include <vereign/service/gen/passport_service.hh>
 #include <vereign/core/scope_guard.hh>
-#include <vereign/client_library/passport_types.gen.pb.h>
+#include <vereign/client_library/types.gen.pb.h>
 #include <util/env.hh>
 #include <util/protobuf.hh>
 
-- 
GitLab