VOL-4032: gRPC Streams for Events, Metrics

Change-Id: Iff813c7e701490833b8585a6c5516348000e541f
diff --git a/VERSION b/VERSION
index 930e300..a551051 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.14.1
+0.15.0
diff --git a/cpp/dmi/hw_events_mgmt_service.grpc.pb.cc b/cpp/dmi/hw_events_mgmt_service.grpc.pb.cc
index 450a295..7168f79 100644
--- a/cpp/dmi/hw_events_mgmt_service.grpc.pb.cc
+++ b/cpp/dmi/hw_events_mgmt_service.grpc.pb.cc
@@ -24,6 +24,7 @@
 static const char* NativeEventsManagementService_method_names[] = {
   "/dmi.NativeEventsManagementService/ListEvents",
   "/dmi.NativeEventsManagementService/UpdateEventsConfiguration",
+  "/dmi.NativeEventsManagementService/StreamEvents",
 };
 
 std::unique_ptr< NativeEventsManagementService::Stub> NativeEventsManagementService::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
@@ -35,6 +36,7 @@
 NativeEventsManagementService::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel)
   : channel_(channel), rpcmethod_ListEvents_(NativeEventsManagementService_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   , rpcmethod_UpdateEventsConfiguration_(NativeEventsManagementService_method_names[1], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  , rpcmethod_StreamEvents_(NativeEventsManagementService_method_names[2], ::grpc::internal::RpcMethod::SERVER_STREAMING, channel)
   {}
 
 ::grpc::Status NativeEventsManagementService::Stub::ListEvents(::grpc::ClientContext* context, const ::dmi::HardwareID& request, ::dmi::ListEventsResponse* response) {
@@ -93,6 +95,22 @@
   return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::EventsConfigurationResponse>::Create(channel_.get(), cq, rpcmethod_UpdateEventsConfiguration_, context, request, false);
 }
 
+::grpc::ClientReader< ::dmi::Event>* NativeEventsManagementService::Stub::StreamEventsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request) {
+  return ::grpc_impl::internal::ClientReaderFactory< ::dmi::Event>::Create(channel_.get(), rpcmethod_StreamEvents_, context, request);
+}
+
+void NativeEventsManagementService::Stub::experimental_async::StreamEvents(::grpc::ClientContext* context, ::google::protobuf::Empty* request, ::grpc::experimental::ClientReadReactor< ::dmi::Event>* reactor) {
+  ::grpc_impl::internal::ClientCallbackReaderFactory< ::dmi::Event>::Create(stub_->channel_.get(), stub_->rpcmethod_StreamEvents_, context, request, reactor);
+}
+
+::grpc::ClientAsyncReader< ::dmi::Event>* NativeEventsManagementService::Stub::AsyncStreamEventsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq, void* tag) {
+  return ::grpc_impl::internal::ClientAsyncReaderFactory< ::dmi::Event>::Create(channel_.get(), cq, rpcmethod_StreamEvents_, context, request, true, tag);
+}
+
+::grpc::ClientAsyncReader< ::dmi::Event>* NativeEventsManagementService::Stub::PrepareAsyncStreamEventsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc_impl::internal::ClientAsyncReaderFactory< ::dmi::Event>::Create(channel_.get(), cq, rpcmethod_StreamEvents_, context, request, false, nullptr);
+}
+
 NativeEventsManagementService::Service::Service() {
   AddMethod(new ::grpc::internal::RpcServiceMethod(
       NativeEventsManagementService_method_names[0],
@@ -114,6 +132,16 @@
              ::dmi::EventsConfigurationResponse* resp) {
                return service->UpdateEventsConfiguration(ctx, req, resp);
              }, this)));
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      NativeEventsManagementService_method_names[2],
+      ::grpc::internal::RpcMethod::SERVER_STREAMING,
+      new ::grpc::internal::ServerStreamingHandler< NativeEventsManagementService::Service, ::google::protobuf::Empty, ::dmi::Event>(
+          [](NativeEventsManagementService::Service* service,
+             ::grpc_impl::ServerContext* ctx,
+             const ::google::protobuf::Empty* req,
+             ::grpc_impl::ServerWriter<::dmi::Event>* writer) {
+               return service->StreamEvents(ctx, req, writer);
+             }, this)));
 }
 
 NativeEventsManagementService::Service::~Service() {
@@ -133,6 +161,13 @@
   return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
 }
 
+::grpc::Status NativeEventsManagementService::Service::StreamEvents(::grpc::ServerContext* context, const ::google::protobuf::Empty* request, ::grpc::ServerWriter< ::dmi::Event>* writer) {
+  (void) context;
+  (void) request;
+  (void) writer;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
 
 }  // namespace dmi
 
diff --git a/cpp/dmi/hw_events_mgmt_service.grpc.pb.h b/cpp/dmi/hw_events_mgmt_service.grpc.pb.h
index b6877d1..d247295 100644
--- a/cpp/dmi/hw_events_mgmt_service.grpc.pb.h
+++ b/cpp/dmi/hw_events_mgmt_service.grpc.pb.h
@@ -54,6 +54,16 @@
     std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::EventsConfigurationResponse>> PrepareAsyncUpdateEventsConfiguration(::grpc::ClientContext* context, const ::dmi::EventsConfigurationRequest& request, ::grpc::CompletionQueue* cq) {
       return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::EventsConfigurationResponse>>(PrepareAsyncUpdateEventsConfigurationRaw(context, request, cq));
     }
+    // Initiate the server streaming of the events

+    std::unique_ptr< ::grpc::ClientReaderInterface< ::dmi::Event>> StreamEvents(::grpc::ClientContext* context, const ::google::protobuf::Empty& request) {
+      return std::unique_ptr< ::grpc::ClientReaderInterface< ::dmi::Event>>(StreamEventsRaw(context, request));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::dmi::Event>> AsyncStreamEvents(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq, void* tag) {
+      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::dmi::Event>>(AsyncStreamEventsRaw(context, request, cq, tag));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::dmi::Event>> PrepareAsyncStreamEvents(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::dmi::Event>>(PrepareAsyncStreamEventsRaw(context, request, cq));
+    }
     class experimental_async_interface {
      public:
       virtual ~experimental_async_interface() {}
@@ -85,6 +95,12 @@
       #else
       virtual void UpdateEventsConfiguration(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::EventsConfigurationResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
       #endif
+      // Initiate the server streaming of the events

+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void StreamEvents(::grpc::ClientContext* context, ::google::protobuf::Empty* request, ::grpc::ClientReadReactor< ::dmi::Event>* reactor) = 0;
+      #else
+      virtual void StreamEvents(::grpc::ClientContext* context, ::google::protobuf::Empty* request, ::grpc::experimental::ClientReadReactor< ::dmi::Event>* reactor) = 0;
+      #endif
     };
     #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
     typedef class experimental_async_interface async_interface;
@@ -98,6 +114,9 @@
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::ListEventsResponse>* PrepareAsyncListEventsRaw(::grpc::ClientContext* context, const ::dmi::HardwareID& request, ::grpc::CompletionQueue* cq) = 0;
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::EventsConfigurationResponse>* AsyncUpdateEventsConfigurationRaw(::grpc::ClientContext* context, const ::dmi::EventsConfigurationRequest& request, ::grpc::CompletionQueue* cq) = 0;
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::EventsConfigurationResponse>* PrepareAsyncUpdateEventsConfigurationRaw(::grpc::ClientContext* context, const ::dmi::EventsConfigurationRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientReaderInterface< ::dmi::Event>* StreamEventsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request) = 0;
+    virtual ::grpc::ClientAsyncReaderInterface< ::dmi::Event>* AsyncStreamEventsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq, void* tag) = 0;
+    virtual ::grpc::ClientAsyncReaderInterface< ::dmi::Event>* PrepareAsyncStreamEventsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) = 0;
   };
   class Stub final : public StubInterface {
    public:
@@ -116,6 +135,15 @@
     std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::EventsConfigurationResponse>> PrepareAsyncUpdateEventsConfiguration(::grpc::ClientContext* context, const ::dmi::EventsConfigurationRequest& request, ::grpc::CompletionQueue* cq) {
       return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::EventsConfigurationResponse>>(PrepareAsyncUpdateEventsConfigurationRaw(context, request, cq));
     }
+    std::unique_ptr< ::grpc::ClientReader< ::dmi::Event>> StreamEvents(::grpc::ClientContext* context, const ::google::protobuf::Empty& request) {
+      return std::unique_ptr< ::grpc::ClientReader< ::dmi::Event>>(StreamEventsRaw(context, request));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncReader< ::dmi::Event>> AsyncStreamEvents(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq, void* tag) {
+      return std::unique_ptr< ::grpc::ClientAsyncReader< ::dmi::Event>>(AsyncStreamEventsRaw(context, request, cq, tag));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncReader< ::dmi::Event>> PrepareAsyncStreamEvents(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncReader< ::dmi::Event>>(PrepareAsyncStreamEventsRaw(context, request, cq));
+    }
     class experimental_async final :
       public StubInterface::experimental_async_interface {
      public:
@@ -143,6 +171,11 @@
       #else
       void UpdateEventsConfiguration(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::EventsConfigurationResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
       #endif
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void StreamEvents(::grpc::ClientContext* context, ::google::protobuf::Empty* request, ::grpc::ClientReadReactor< ::dmi::Event>* reactor) override;
+      #else
+      void StreamEvents(::grpc::ClientContext* context, ::google::protobuf::Empty* request, ::grpc::experimental::ClientReadReactor< ::dmi::Event>* reactor) override;
+      #endif
      private:
       friend class Stub;
       explicit experimental_async(Stub* stub): stub_(stub) { }
@@ -158,8 +191,12 @@
     ::grpc::ClientAsyncResponseReader< ::dmi::ListEventsResponse>* PrepareAsyncListEventsRaw(::grpc::ClientContext* context, const ::dmi::HardwareID& request, ::grpc::CompletionQueue* cq) override;
     ::grpc::ClientAsyncResponseReader< ::dmi::EventsConfigurationResponse>* AsyncUpdateEventsConfigurationRaw(::grpc::ClientContext* context, const ::dmi::EventsConfigurationRequest& request, ::grpc::CompletionQueue* cq) override;
     ::grpc::ClientAsyncResponseReader< ::dmi::EventsConfigurationResponse>* PrepareAsyncUpdateEventsConfigurationRaw(::grpc::ClientContext* context, const ::dmi::EventsConfigurationRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientReader< ::dmi::Event>* StreamEventsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request) override;
+    ::grpc::ClientAsyncReader< ::dmi::Event>* AsyncStreamEventsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq, void* tag) override;
+    ::grpc::ClientAsyncReader< ::dmi::Event>* PrepareAsyncStreamEventsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) override;
     const ::grpc::internal::RpcMethod rpcmethod_ListEvents_;
     const ::grpc::internal::RpcMethod rpcmethod_UpdateEventsConfiguration_;
+    const ::grpc::internal::RpcMethod rpcmethod_StreamEvents_;
   };
   static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
 
@@ -173,6 +210,8 @@
     // The default behavior of the device is to report all the supported events

     // This configuration is persisted across reboots of the device or the device manager

     virtual ::grpc::Status UpdateEventsConfiguration(::grpc::ServerContext* context, const ::dmi::EventsConfigurationRequest* request, ::dmi::EventsConfigurationResponse* response);
+    // Initiate the server streaming of the events

+    virtual ::grpc::Status StreamEvents(::grpc::ServerContext* context, const ::google::protobuf::Empty* request, ::grpc::ServerWriter< ::dmi::Event>* writer);
   };
   template <class BaseClass>
   class WithAsyncMethod_ListEvents : public BaseClass {
@@ -214,7 +253,27 @@
       ::grpc::Service::RequestAsyncUnary(1, context, request, response, new_call_cq, notification_cq, tag);
     }
   };
-  typedef WithAsyncMethod_ListEvents<WithAsyncMethod_UpdateEventsConfiguration<Service > > AsyncService;
+  template <class BaseClass>
+  class WithAsyncMethod_StreamEvents : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_StreamEvents() {
+      ::grpc::Service::MarkMethodAsync(2);
+    }
+    ~WithAsyncMethod_StreamEvents() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status StreamEvents(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Event>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestStreamEvents(::grpc::ServerContext* context, ::google::protobuf::Empty* request, ::grpc::ServerAsyncWriter< ::dmi::Event>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncServerStreaming(2, context, request, writer, new_call_cq, notification_cq, tag);
+    }
+  };
+  typedef WithAsyncMethod_ListEvents<WithAsyncMethod_UpdateEventsConfiguration<WithAsyncMethod_StreamEvents<Service > > > AsyncService;
   template <class BaseClass>
   class ExperimentalWithCallbackMethod_ListEvents : public BaseClass {
    private:
@@ -309,11 +368,49 @@
     #endif
       { return nullptr; }
   };
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_StreamEvents : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_StreamEvents() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(2,
+          new ::grpc_impl::internal::CallbackServerStreamingHandler< ::google::protobuf::Empty, ::dmi::Event>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::google::protobuf::Empty* request) { return this->StreamEvents(context, request); }));
+    }
+    ~ExperimentalWithCallbackMethod_StreamEvents() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status StreamEvents(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Event>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerWriteReactor< ::dmi::Event>* StreamEvents(
+      ::grpc::CallbackServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/)
+    #else
+    virtual ::grpc::experimental::ServerWriteReactor< ::dmi::Event>* StreamEvents(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/)
+    #endif
+      { return nullptr; }
+  };
   #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
-  typedef ExperimentalWithCallbackMethod_ListEvents<ExperimentalWithCallbackMethod_UpdateEventsConfiguration<Service > > CallbackService;
+  typedef ExperimentalWithCallbackMethod_ListEvents<ExperimentalWithCallbackMethod_UpdateEventsConfiguration<ExperimentalWithCallbackMethod_StreamEvents<Service > > > CallbackService;
   #endif
 
-  typedef ExperimentalWithCallbackMethod_ListEvents<ExperimentalWithCallbackMethod_UpdateEventsConfiguration<Service > > ExperimentalCallbackService;
+  typedef ExperimentalWithCallbackMethod_ListEvents<ExperimentalWithCallbackMethod_UpdateEventsConfiguration<ExperimentalWithCallbackMethod_StreamEvents<Service > > > ExperimentalCallbackService;
   template <class BaseClass>
   class WithGenericMethod_ListEvents : public BaseClass {
    private:
@@ -349,6 +446,23 @@
     }
   };
   template <class BaseClass>
+  class WithGenericMethod_StreamEvents : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_StreamEvents() {
+      ::grpc::Service::MarkMethodGeneric(2);
+    }
+    ~WithGenericMethod_StreamEvents() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status StreamEvents(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Event>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
   class WithRawMethod_ListEvents : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -389,6 +503,26 @@
     }
   };
   template <class BaseClass>
+  class WithRawMethod_StreamEvents : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_StreamEvents() {
+      ::grpc::Service::MarkMethodRaw(2);
+    }
+    ~WithRawMethod_StreamEvents() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status StreamEvents(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Event>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestStreamEvents(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncWriter< ::grpc::ByteBuffer>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncServerStreaming(2, context, request, writer, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
   class ExperimentalWithRawCallbackMethod_ListEvents : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -465,6 +599,44 @@
       { return nullptr; }
   };
   template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_StreamEvents : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_StreamEvents() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(2,
+          new ::grpc_impl::internal::CallbackServerStreamingHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const::grpc::ByteBuffer* request) { return this->StreamEvents(context, request); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_StreamEvents() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status StreamEvents(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Event>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerWriteReactor< ::grpc::ByteBuffer>* StreamEvents(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/)
+    #else
+    virtual ::grpc::experimental::ServerWriteReactor< ::grpc::ByteBuffer>* StreamEvents(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
   class WithStreamedUnaryMethod_ListEvents : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -519,8 +691,35 @@
     virtual ::grpc::Status StreamedUpdateEventsConfiguration(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::dmi::EventsConfigurationRequest,::dmi::EventsConfigurationResponse>* server_unary_streamer) = 0;
   };
   typedef WithStreamedUnaryMethod_ListEvents<WithStreamedUnaryMethod_UpdateEventsConfiguration<Service > > StreamedUnaryService;
-  typedef Service SplitStreamedService;
-  typedef WithStreamedUnaryMethod_ListEvents<WithStreamedUnaryMethod_UpdateEventsConfiguration<Service > > StreamedService;
+  template <class BaseClass>
+  class WithSplitStreamingMethod_StreamEvents : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithSplitStreamingMethod_StreamEvents() {
+      ::grpc::Service::MarkMethodStreamed(2,
+        new ::grpc::internal::SplitServerStreamingHandler<
+          ::google::protobuf::Empty, ::dmi::Event>(
+            [this](::grpc_impl::ServerContext* context,
+                   ::grpc_impl::ServerSplitStreamer<
+                     ::google::protobuf::Empty, ::dmi::Event>* streamer) {
+                       return this->StreamedStreamEvents(context,
+                         streamer);
+                  }));
+    }
+    ~WithSplitStreamingMethod_StreamEvents() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status StreamEvents(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Event>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with split streamed
+    virtual ::grpc::Status StreamedStreamEvents(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::google::protobuf::Empty,::dmi::Event>* server_split_streamer) = 0;
+  };
+  typedef WithSplitStreamingMethod_StreamEvents<Service > SplitStreamedService;
+  typedef WithStreamedUnaryMethod_ListEvents<WithStreamedUnaryMethod_UpdateEventsConfiguration<WithSplitStreamingMethod_StreamEvents<Service > > > StreamedService;
 };
 
 }  // namespace dmi
diff --git a/cpp/dmi/hw_events_mgmt_service.pb.cc b/cpp/dmi/hw_events_mgmt_service.pb.cc
index 4f856f0..28a38bc 100644
--- a/cpp/dmi/hw_events_mgmt_service.pb.cc
+++ b/cpp/dmi/hw_events_mgmt_service.pb.cc
@@ -391,112 +391,115 @@
 const char descriptor_table_protodef_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[] =
   "\n dmi/hw_events_mgmt_service.proto\022\003dmi\032"
   "\021dmi/commons.proto\032\014dmi/hw.proto\032\037google"
-  "/protobuf/timestamp.proto\"N\n\tValueType\022\021"
-  "\n\007int_val\030\001 \001(\003H\000\022\022\n\010uint_val\030\002 \001(\004H\000\022\023\n"
-  "\tfloat_val\030\003 \001(\002H\000B\005\n\003val\"G\n\nWaterMarks\022"
-  "\034\n\004high\030\001 \001(\0132\016.dmi.ValueType\022\033\n\003low\030\002 \001"
-  "(\0132\016.dmi.ValueType\"]\n\nThresholds\022 \n\005uppe"
-  "r\030\001 \001(\0132\017.dmi.WaterMarksH\000\022 \n\005lower\030\002 \001("
-  "\0132\017.dmi.WaterMarksH\000B\013\n\tthreshold\"c\n\024Thr"
-  "esholdInformation\022&\n\016observed_value\030\001 \001("
-  "\0132\016.dmi.ValueType\022#\n\nthresholds\030\002 \001(\0132\017."
-  "dmi.Thresholds\"g\n\010EventCfg\022\037\n\010event_id\030\001"
-  " \001(\0162\r.dmi.EventIds\022\025\n\ris_configured\030\002 \001"
-  "(\010\022#\n\nthresholds\030\003 \001(\0132\017.dmi.Thresholds\""
-  ")\n\tEventsCfg\022\034\n\005items\030\001 \003(\0132\r.dmi.EventC"
-  "fg\"\370\001\n\022ListEventsResponse\022\033\n\006status\030\001 \001("
-  "\0162\013.dmi.Status\022.\n\006reason\030\002 \001(\0162\036.dmi.Lis"
-  "tEventsResponse.Reason\022\036\n\006events\030\003 \001(\0132\016"
-  ".dmi.EventsCfg\022\025\n\rreason_detail\030\004 \001(\t\"^\n"
-  "\006Reason\022\024\n\020UNDEFINED_REASON\020\000\022\022\n\016UNKNOWN"
-  "_DEVICE\020\001\022\022\n\016INTERNAL_ERROR\020\002\022\026\n\022DEVICE_"
-  "UNREACHABLE\020\003\"\210\001\n\032EventsConfigurationReq"
-  "uest\022\036\n\013device_uuid\030\001 \001(\0132\t.dmi.Uuid\022!\n\007"
-  "changes\030\002 \001(\0132\016.dmi.EventsCfgH\000\022\032\n\020reset"
-  "_to_default\030\003 \001(\010H\000B\013\n\toperation\"\376\001\n\033Eve"
-  "ntsConfigurationResponse\022\033\n\006status\030\001 \001(\016"
-  "2\013.dmi.Status\0227\n\006reason\030\002 \001(\0162\'.dmi.Even"
-  "tsConfigurationResponse.Reason\022\025\n\rreason"
-  "_detail\030\003 \001(\t\"r\n\006Reason\022\024\n\020UNDEFINED_REA"
-  "SON\020\000\022\022\n\016UNKNOWN_DEVICE\020\001\022\022\n\016INTERNAL_ER"
-  "ROR\020\002\022\022\n\016INVALID_CONFIG\020\003\022\026\n\022DEVICE_UNRE"
-  "ACHABLE\020\004\"j\n\rEventMetaData\022\036\n\013device_uui"
-  "d\030\001 \001(\0132\t.dmi.Uuid\022!\n\016component_uuid\030\002 \001"
-  "(\0132\t.dmi.Uuid\022\026\n\016component_name\030\003 \001(\t\"\310\001"
-  "\n\005Event\022*\n\016event_metadata\030\001 \001(\0132\022.dmi.Ev"
-  "entMetaData\022\037\n\010event_id\030\002 \001(\0162\r.dmi.Even"
-  "tIds\022-\n\traised_ts\030\003 \001(\0132\032.google.protobu"
-  "f.Timestamp\0221\n\016threshold_info\030\004 \001(\0132\031.dm"
-  "i.ThresholdInformation\022\020\n\010add_info\030\005 \001(\t"
-  "*\321\016\n\010EventIds\022\030\n\024EVENT_NAME_UNDEFINED\020\000\022"
-  "\036\n\032EVENT_TRANSCEIVER_PLUG_OUT\020d\022\035\n\031EVENT"
-  "_TRANSCEIVER_PLUG_IN\020e\022-\n)EVENT_TRANSCEI"
-  "VER_VOLTAGE_ABOVE_THRESHOLD\020f\022-\n)EVENT_T"
-  "RANSCEIVER_VOLTAGE_BELOW_THRESHOLD\020g\0221\n-"
-  "EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRE"
-  "SHOLD\020h\0221\n-EVENT_TRANSCEIVER_TEMPERATURE"
-  "_BELOW_THRESHOLD\020i\022-\n)EVENT_TRANSCEIVER_"
-  "CURRENT_ABOVE_THRESHOLD\020j\022-\n)EVENT_TRANS"
-  "CEIVER_CURRENT_BELOW_THRESHOLD\020k\022.\n*EVEN"
-  "T_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD\020l"
-  "\022.\n*EVENT_TRANSCEIVER_RX_POWER_BELOW_THR"
-  "ESHOLD\020m\022.\n*EVENT_TRANSCEIVER_TX_POWER_A"
-  "BOVE_THRESHOLD\020n\022.\n*EVENT_TRANSCEIVER_TX"
-  "_POWER_BELOW_THRESHOLD\020o\022\035\n\031EVENT_TRANSC"
-  "EIVER_FAILURE\020p\0227\n3EVENT_TRANSCEIVER_VOL"
-  "TAGE_ABOVE_THRESHOLD_RECOVERED\020q\0227\n3EVEN"
-  "T_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD_RE"
-  "COVERED\020r\022;\n7EVENT_TRANSCEIVER_TEMPERATU"
-  "RE_ABOVE_THRESHOLD_RECOVERED\020s\022;\n7EVENT_"
-  "TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD_"
-  "RECOVERED\020t\0227\n3EVENT_TRANSCEIVER_CURRENT"
-  "_ABOVE_THRESHOLD_RECOVERED\020u\0227\n3EVENT_TR"
-  "ANSCEIVER_CURRENT_BELOW_THRESHOLD_RECOVE"
-  "RED\020v\0228\n4EVENT_TRANSCEIVER_RX_POWER_ABOV"
-  "E_THRESHOLD_RECOVERED\020w\0228\n4EVENT_TRANSCE"
-  "IVER_RX_POWER_BELOW_THRESHOLD_RECOVERED\020"
-  "x\0228\n4EVENT_TRANSCEIVER_TX_POWER_ABOVE_TH"
-  "RESHOLD_RECOVERED\020y\0228\n4EVENT_TRANSCEIVER"
-  "_TX_POWER_BELOW_THRESHOLD_RECOVERED\020z\022\'\n"
-  "#EVENT_TRANSCEIVER_FAILURE_RECOVERED\020{\022\027"
-  "\n\022EVENT_PSU_PLUG_OUT\020\310\001\022\026\n\021EVENT_PSU_PLU"
-  "G_IN\020\311\001\022\026\n\021EVENT_PSU_FAILURE\020\312\001\022 \n\033EVENT"
-  "_PSU_FAILURE_RECOVERED\020\313\001\022\026\n\021EVENT_FAN_F"
-  "AILURE\020\254\002\022\027\n\022EVENT_FAN_PLUG_OUT\020\255\002\022\026\n\021EV"
-  "ENT_FAN_PLUG_IN\020\256\002\022 \n\033EVENT_FAN_FAILURE_"
-  "RECOVERED\020\257\002\022)\n$EVENT_CPU_TEMPERATURE_AB"
-  "OVE_CRITICAL\020\220\003\022&\n!EVENT_CPU_TEMPERATURE"
-  "_ABOVE_FATAL\020\221\003\0223\n.EVENT_CPU_TEMPERATURE"
-  "_ABOVE_CRITICAL_RECOVERED\020\222\003\0220\n+EVENT_CP"
-  "U_TEMPERATURE_ABOVE_FATAL_RECOVERED\020\223\003\022\032"
-  "\n\025EVENT_HW_DEVICE_RESET\020\364\003\022/\n*EVENT_HW_D"
-  "EVICE_TEMPERATURE_ABOVE_CRITICAL\020\365\003\022,\n\'E"
-  "VENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL\020\366"
-  "\003\0229\n4EVENT_HW_DEVICE_TEMPERATURE_ABOVE_C"
-  "RITICAL_RECOVERED\020\367\003\0226\n1EVENT_HW_DEVICE_"
-  "TEMPERATURE_ABOVE_FATAL_RECOVERED\020\370\0032\267\001\n"
-  "\035NativeEventsManagementService\0226\n\nListEv"
-  "ents\022\017.dmi.HardwareID\032\027.dmi.ListEventsRe"
-  "sponse\022^\n\031UpdateEventsConfiguration\022\037.dm"
-  "i.EventsConfigurationRequest\032 .dmi.Event"
-  "sConfigurationResponseB;Z9github.com/ope"
-  "ncord/device-management-interface/v3/go/"
-  "dmib\006proto3"
+  "/protobuf/timestamp.proto\032\033google/protob"
+  "uf/empty.proto\"N\n\tValueType\022\021\n\007int_val\030\001"
+  " \001(\003H\000\022\022\n\010uint_val\030\002 \001(\004H\000\022\023\n\tfloat_val\030"
+  "\003 \001(\002H\000B\005\n\003val\"G\n\nWaterMarks\022\034\n\004high\030\001 \001"
+  "(\0132\016.dmi.ValueType\022\033\n\003low\030\002 \001(\0132\016.dmi.Va"
+  "lueType\"]\n\nThresholds\022 \n\005upper\030\001 \001(\0132\017.d"
+  "mi.WaterMarksH\000\022 \n\005lower\030\002 \001(\0132\017.dmi.Wat"
+  "erMarksH\000B\013\n\tthreshold\"c\n\024ThresholdInfor"
+  "mation\022&\n\016observed_value\030\001 \001(\0132\016.dmi.Val"
+  "ueType\022#\n\nthresholds\030\002 \001(\0132\017.dmi.Thresho"
+  "lds\"g\n\010EventCfg\022\037\n\010event_id\030\001 \001(\0162\r.dmi."
+  "EventIds\022\025\n\ris_configured\030\002 \001(\010\022#\n\nthres"
+  "holds\030\003 \001(\0132\017.dmi.Thresholds\")\n\tEventsCf"
+  "g\022\034\n\005items\030\001 \003(\0132\r.dmi.EventCfg\"\370\001\n\022List"
+  "EventsResponse\022\033\n\006status\030\001 \001(\0162\013.dmi.Sta"
+  "tus\022.\n\006reason\030\002 \001(\0162\036.dmi.ListEventsResp"
+  "onse.Reason\022\036\n\006events\030\003 \001(\0132\016.dmi.Events"
+  "Cfg\022\025\n\rreason_detail\030\004 \001(\t\"^\n\006Reason\022\024\n\020"
+  "UNDEFINED_REASON\020\000\022\022\n\016UNKNOWN_DEVICE\020\001\022\022"
+  "\n\016INTERNAL_ERROR\020\002\022\026\n\022DEVICE_UNREACHABLE"
+  "\020\003\"\210\001\n\032EventsConfigurationRequest\022\036\n\013dev"
+  "ice_uuid\030\001 \001(\0132\t.dmi.Uuid\022!\n\007changes\030\002 \001"
+  "(\0132\016.dmi.EventsCfgH\000\022\032\n\020reset_to_default"
+  "\030\003 \001(\010H\000B\013\n\toperation\"\376\001\n\033EventsConfigur"
+  "ationResponse\022\033\n\006status\030\001 \001(\0162\013.dmi.Stat"
+  "us\0227\n\006reason\030\002 \001(\0162\'.dmi.EventsConfigura"
+  "tionResponse.Reason\022\025\n\rreason_detail\030\003 \001"
+  "(\t\"r\n\006Reason\022\024\n\020UNDEFINED_REASON\020\000\022\022\n\016UN"
+  "KNOWN_DEVICE\020\001\022\022\n\016INTERNAL_ERROR\020\002\022\022\n\016IN"
+  "VALID_CONFIG\020\003\022\026\n\022DEVICE_UNREACHABLE\020\004\"j"
+  "\n\rEventMetaData\022\036\n\013device_uuid\030\001 \001(\0132\t.d"
+  "mi.Uuid\022!\n\016component_uuid\030\002 \001(\0132\t.dmi.Uu"
+  "id\022\026\n\016component_name\030\003 \001(\t\"\310\001\n\005Event\022*\n\016"
+  "event_metadata\030\001 \001(\0132\022.dmi.EventMetaData"
+  "\022\037\n\010event_id\030\002 \001(\0162\r.dmi.EventIds\022-\n\trai"
+  "sed_ts\030\003 \001(\0132\032.google.protobuf.Timestamp"
+  "\0221\n\016threshold_info\030\004 \001(\0132\031.dmi.Threshold"
+  "Information\022\020\n\010add_info\030\005 \001(\t*\321\016\n\010EventI"
+  "ds\022\030\n\024EVENT_NAME_UNDEFINED\020\000\022\036\n\032EVENT_TR"
+  "ANSCEIVER_PLUG_OUT\020d\022\035\n\031EVENT_TRANSCEIVE"
+  "R_PLUG_IN\020e\022-\n)EVENT_TRANSCEIVER_VOLTAGE"
+  "_ABOVE_THRESHOLD\020f\022-\n)EVENT_TRANSCEIVER_"
+  "VOLTAGE_BELOW_THRESHOLD\020g\0221\n-EVENT_TRANS"
+  "CEIVER_TEMPERATURE_ABOVE_THRESHOLD\020h\0221\n-"
+  "EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRE"
+  "SHOLD\020i\022-\n)EVENT_TRANSCEIVER_CURRENT_ABO"
+  "VE_THRESHOLD\020j\022-\n)EVENT_TRANSCEIVER_CURR"
+  "ENT_BELOW_THRESHOLD\020k\022.\n*EVENT_TRANSCEIV"
+  "ER_RX_POWER_ABOVE_THRESHOLD\020l\022.\n*EVENT_T"
+  "RANSCEIVER_RX_POWER_BELOW_THRESHOLD\020m\022.\n"
+  "*EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESH"
+  "OLD\020n\022.\n*EVENT_TRANSCEIVER_TX_POWER_BELO"
+  "W_THRESHOLD\020o\022\035\n\031EVENT_TRANSCEIVER_FAILU"
+  "RE\020p\0227\n3EVENT_TRANSCEIVER_VOLTAGE_ABOVE_"
+  "THRESHOLD_RECOVERED\020q\0227\n3EVENT_TRANSCEIV"
+  "ER_VOLTAGE_BELOW_THRESHOLD_RECOVERED\020r\022;"
+  "\n7EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_TH"
+  "RESHOLD_RECOVERED\020s\022;\n7EVENT_TRANSCEIVER"
+  "_TEMPERATURE_BELOW_THRESHOLD_RECOVERED\020t"
+  "\0227\n3EVENT_TRANSCEIVER_CURRENT_ABOVE_THRE"
+  "SHOLD_RECOVERED\020u\0227\n3EVENT_TRANSCEIVER_C"
+  "URRENT_BELOW_THRESHOLD_RECOVERED\020v\0228\n4EV"
+  "ENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD"
+  "_RECOVERED\020w\0228\n4EVENT_TRANSCEIVER_RX_POW"
+  "ER_BELOW_THRESHOLD_RECOVERED\020x\0228\n4EVENT_"
+  "TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD_REC"
+  "OVERED\020y\0228\n4EVENT_TRANSCEIVER_TX_POWER_B"
+  "ELOW_THRESHOLD_RECOVERED\020z\022\'\n#EVENT_TRAN"
+  "SCEIVER_FAILURE_RECOVERED\020{\022\027\n\022EVENT_PSU"
+  "_PLUG_OUT\020\310\001\022\026\n\021EVENT_PSU_PLUG_IN\020\311\001\022\026\n\021"
+  "EVENT_PSU_FAILURE\020\312\001\022 \n\033EVENT_PSU_FAILUR"
+  "E_RECOVERED\020\313\001\022\026\n\021EVENT_FAN_FAILURE\020\254\002\022\027"
+  "\n\022EVENT_FAN_PLUG_OUT\020\255\002\022\026\n\021EVENT_FAN_PLU"
+  "G_IN\020\256\002\022 \n\033EVENT_FAN_FAILURE_RECOVERED\020\257"
+  "\002\022)\n$EVENT_CPU_TEMPERATURE_ABOVE_CRITICA"
+  "L\020\220\003\022&\n!EVENT_CPU_TEMPERATURE_ABOVE_FATA"
+  "L\020\221\003\0223\n.EVENT_CPU_TEMPERATURE_ABOVE_CRIT"
+  "ICAL_RECOVERED\020\222\003\0220\n+EVENT_CPU_TEMPERATU"
+  "RE_ABOVE_FATAL_RECOVERED\020\223\003\022\032\n\025EVENT_HW_"
+  "DEVICE_RESET\020\364\003\022/\n*EVENT_HW_DEVICE_TEMPE"
+  "RATURE_ABOVE_CRITICAL\020\365\003\022,\n\'EVENT_HW_DEV"
+  "ICE_TEMPERATURE_ABOVE_FATAL\020\366\003\0229\n4EVENT_"
+  "HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_REC"
+  "OVERED\020\367\003\0226\n1EVENT_HW_DEVICE_TEMPERATURE"
+  "_ABOVE_FATAL_RECOVERED\020\370\0032\355\001\n\035NativeEven"
+  "tsManagementService\0226\n\nListEvents\022\017.dmi."
+  "HardwareID\032\027.dmi.ListEventsResponse\022^\n\031U"
+  "pdateEventsConfiguration\022\037.dmi.EventsCon"
+  "figurationRequest\032 .dmi.EventsConfigurat"
+  "ionResponse\0224\n\014StreamEvents\022\026.google.pro"
+  "tobuf.Empty\032\n.dmi.Event0\001B;Z9github.com/"
+  "opencord/device-management-interface/v3/"
+  "go/dmib\006proto3"
   ;
 ::google::protobuf::internal::DescriptorTable descriptor_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto = {
   false, InitDefaults_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 
   descriptor_table_protodef_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto,
-  "dmi/hw_events_mgmt_service.proto", &assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 3691,
+  "dmi/hw_events_mgmt_service.proto", &assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 3774,
 };
 
 void AddDescriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
-  static constexpr ::google::protobuf::internal::InitFunc deps[3] =
+  static constexpr ::google::protobuf::internal::InitFunc deps[4] =
   {
     ::AddDescriptors_dmi_2fcommons_2eproto,
     ::AddDescriptors_dmi_2fhw_2eproto,
     ::AddDescriptors_google_2fprotobuf_2ftimestamp_2eproto,
+    ::AddDescriptors_google_2fprotobuf_2fempty_2eproto,
   };
- ::google::protobuf::internal::AddDescriptors(&descriptor_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, deps, 3);
+ ::google::protobuf::internal::AddDescriptors(&descriptor_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, deps, 4);
 }
 
 // Force running AddDescriptors() at dynamic initialization time.
diff --git a/cpp/dmi/hw_events_mgmt_service.pb.h b/cpp/dmi/hw_events_mgmt_service.pb.h
index 472a6a9..4f6cf5a 100644
--- a/cpp/dmi/hw_events_mgmt_service.pb.h
+++ b/cpp/dmi/hw_events_mgmt_service.pb.h
@@ -35,6 +35,7 @@
 #include "dmi/commons.pb.h"
 #include "dmi/hw.pb.h"
 #include <google/protobuf/timestamp.pb.h>
+#include <google/protobuf/empty.pb.h>
 // @@protoc_insertion_point(includes)
 #include <google/protobuf/port_def.inc>
 #define PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto
diff --git a/cpp/dmi/hw_metrics_mgmt_service.grpc.pb.cc b/cpp/dmi/hw_metrics_mgmt_service.grpc.pb.cc
index 1c674c4..a35f91e 100644
--- a/cpp/dmi/hw_metrics_mgmt_service.grpc.pb.cc
+++ b/cpp/dmi/hw_metrics_mgmt_service.grpc.pb.cc
@@ -25,6 +25,7 @@
   "/dmi.NativeMetricsManagementService/ListMetrics",
   "/dmi.NativeMetricsManagementService/UpdateMetricsConfiguration",
   "/dmi.NativeMetricsManagementService/GetMetric",
+  "/dmi.NativeMetricsManagementService/StreamMetrics",
 };
 
 std::unique_ptr< NativeMetricsManagementService::Stub> NativeMetricsManagementService::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
@@ -37,6 +38,7 @@
   : channel_(channel), rpcmethod_ListMetrics_(NativeMetricsManagementService_method_names[0], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   , rpcmethod_UpdateMetricsConfiguration_(NativeMetricsManagementService_method_names[1], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   , rpcmethod_GetMetric_(NativeMetricsManagementService_method_names[2], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  , rpcmethod_StreamMetrics_(NativeMetricsManagementService_method_names[3], ::grpc::internal::RpcMethod::SERVER_STREAMING, channel)
   {}
 
 ::grpc::Status NativeMetricsManagementService::Stub::ListMetrics(::grpc::ClientContext* context, const ::dmi::HardwareID& request, ::dmi::ListMetricsResponse* response) {
@@ -123,6 +125,22 @@
   return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::GetMetricResponse>::Create(channel_.get(), cq, rpcmethod_GetMetric_, context, request, false);
 }
 
+::grpc::ClientReader< ::dmi::Metric>* NativeMetricsManagementService::Stub::StreamMetricsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request) {
+  return ::grpc_impl::internal::ClientReaderFactory< ::dmi::Metric>::Create(channel_.get(), rpcmethod_StreamMetrics_, context, request);
+}
+
+void NativeMetricsManagementService::Stub::experimental_async::StreamMetrics(::grpc::ClientContext* context, ::google::protobuf::Empty* request, ::grpc::experimental::ClientReadReactor< ::dmi::Metric>* reactor) {
+  ::grpc_impl::internal::ClientCallbackReaderFactory< ::dmi::Metric>::Create(stub_->channel_.get(), stub_->rpcmethod_StreamMetrics_, context, request, reactor);
+}
+
+::grpc::ClientAsyncReader< ::dmi::Metric>* NativeMetricsManagementService::Stub::AsyncStreamMetricsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq, void* tag) {
+  return ::grpc_impl::internal::ClientAsyncReaderFactory< ::dmi::Metric>::Create(channel_.get(), cq, rpcmethod_StreamMetrics_, context, request, true, tag);
+}
+
+::grpc::ClientAsyncReader< ::dmi::Metric>* NativeMetricsManagementService::Stub::PrepareAsyncStreamMetricsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc_impl::internal::ClientAsyncReaderFactory< ::dmi::Metric>::Create(channel_.get(), cq, rpcmethod_StreamMetrics_, context, request, false, nullptr);
+}
+
 NativeMetricsManagementService::Service::Service() {
   AddMethod(new ::grpc::internal::RpcServiceMethod(
       NativeMetricsManagementService_method_names[0],
@@ -154,6 +172,16 @@
              ::dmi::GetMetricResponse* resp) {
                return service->GetMetric(ctx, req, resp);
              }, this)));
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      NativeMetricsManagementService_method_names[3],
+      ::grpc::internal::RpcMethod::SERVER_STREAMING,
+      new ::grpc::internal::ServerStreamingHandler< NativeMetricsManagementService::Service, ::google::protobuf::Empty, ::dmi::Metric>(
+          [](NativeMetricsManagementService::Service* service,
+             ::grpc_impl::ServerContext* ctx,
+             const ::google::protobuf::Empty* req,
+             ::grpc_impl::ServerWriter<::dmi::Metric>* writer) {
+               return service->StreamMetrics(ctx, req, writer);
+             }, this)));
 }
 
 NativeMetricsManagementService::Service::~Service() {
@@ -180,6 +208,13 @@
   return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
 }
 
+::grpc::Status NativeMetricsManagementService::Service::StreamMetrics(::grpc::ServerContext* context, const ::google::protobuf::Empty* request, ::grpc::ServerWriter< ::dmi::Metric>* writer) {
+  (void) context;
+  (void) request;
+  (void) writer;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
 
 }  // namespace dmi
 
diff --git a/cpp/dmi/hw_metrics_mgmt_service.grpc.pb.h b/cpp/dmi/hw_metrics_mgmt_service.grpc.pb.h
index 560b350..a96cbd7 100644
--- a/cpp/dmi/hw_metrics_mgmt_service.grpc.pb.h
+++ b/cpp/dmi/hw_metrics_mgmt_service.grpc.pb.h
@@ -66,6 +66,16 @@
     std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetMetricResponse>> PrepareAsyncGetMetric(::grpc::ClientContext* context, const ::dmi::GetMetricRequest& request, ::grpc::CompletionQueue* cq) {
       return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetMetricResponse>>(PrepareAsyncGetMetricRaw(context, request, cq));
     }
+    // Initiate the server streaming of the metrics

+    std::unique_ptr< ::grpc::ClientReaderInterface< ::dmi::Metric>> StreamMetrics(::grpc::ClientContext* context, const ::google::protobuf::Empty& request) {
+      return std::unique_ptr< ::grpc::ClientReaderInterface< ::dmi::Metric>>(StreamMetricsRaw(context, request));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::dmi::Metric>> AsyncStreamMetrics(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq, void* tag) {
+      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::dmi::Metric>>(AsyncStreamMetricsRaw(context, request, cq, tag));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::dmi::Metric>> PrepareAsyncStreamMetrics(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::dmi::Metric>>(PrepareAsyncStreamMetricsRaw(context, request, cq));
+    }
     class experimental_async_interface {
      public:
       virtual ~experimental_async_interface() {}
@@ -114,6 +124,12 @@
       #else
       virtual void GetMetric(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::GetMetricResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
       #endif
+      // Initiate the server streaming of the metrics

+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void StreamMetrics(::grpc::ClientContext* context, ::google::protobuf::Empty* request, ::grpc::ClientReadReactor< ::dmi::Metric>* reactor) = 0;
+      #else
+      virtual void StreamMetrics(::grpc::ClientContext* context, ::google::protobuf::Empty* request, ::grpc::experimental::ClientReadReactor< ::dmi::Metric>* reactor) = 0;
+      #endif
     };
     #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
     typedef class experimental_async_interface async_interface;
@@ -129,6 +145,9 @@
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::MetricsConfigurationResponse>* PrepareAsyncUpdateMetricsConfigurationRaw(::grpc::ClientContext* context, const ::dmi::MetricsConfigurationRequest& request, ::grpc::CompletionQueue* cq) = 0;
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetMetricResponse>* AsyncGetMetricRaw(::grpc::ClientContext* context, const ::dmi::GetMetricRequest& request, ::grpc::CompletionQueue* cq) = 0;
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetMetricResponse>* PrepareAsyncGetMetricRaw(::grpc::ClientContext* context, const ::dmi::GetMetricRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientReaderInterface< ::dmi::Metric>* StreamMetricsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request) = 0;
+    virtual ::grpc::ClientAsyncReaderInterface< ::dmi::Metric>* AsyncStreamMetricsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq, void* tag) = 0;
+    virtual ::grpc::ClientAsyncReaderInterface< ::dmi::Metric>* PrepareAsyncStreamMetricsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) = 0;
   };
   class Stub final : public StubInterface {
    public:
@@ -154,6 +173,15 @@
     std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::GetMetricResponse>> PrepareAsyncGetMetric(::grpc::ClientContext* context, const ::dmi::GetMetricRequest& request, ::grpc::CompletionQueue* cq) {
       return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::GetMetricResponse>>(PrepareAsyncGetMetricRaw(context, request, cq));
     }
+    std::unique_ptr< ::grpc::ClientReader< ::dmi::Metric>> StreamMetrics(::grpc::ClientContext* context, const ::google::protobuf::Empty& request) {
+      return std::unique_ptr< ::grpc::ClientReader< ::dmi::Metric>>(StreamMetricsRaw(context, request));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncReader< ::dmi::Metric>> AsyncStreamMetrics(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq, void* tag) {
+      return std::unique_ptr< ::grpc::ClientAsyncReader< ::dmi::Metric>>(AsyncStreamMetricsRaw(context, request, cq, tag));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncReader< ::dmi::Metric>> PrepareAsyncStreamMetrics(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncReader< ::dmi::Metric>>(PrepareAsyncStreamMetricsRaw(context, request, cq));
+    }
     class experimental_async final :
       public StubInterface::experimental_async_interface {
      public:
@@ -193,6 +221,11 @@
       #else
       void GetMetric(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::GetMetricResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
       #endif
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void StreamMetrics(::grpc::ClientContext* context, ::google::protobuf::Empty* request, ::grpc::ClientReadReactor< ::dmi::Metric>* reactor) override;
+      #else
+      void StreamMetrics(::grpc::ClientContext* context, ::google::protobuf::Empty* request, ::grpc::experimental::ClientReadReactor< ::dmi::Metric>* reactor) override;
+      #endif
      private:
       friend class Stub;
       explicit experimental_async(Stub* stub): stub_(stub) { }
@@ -210,9 +243,13 @@
     ::grpc::ClientAsyncResponseReader< ::dmi::MetricsConfigurationResponse>* PrepareAsyncUpdateMetricsConfigurationRaw(::grpc::ClientContext* context, const ::dmi::MetricsConfigurationRequest& request, ::grpc::CompletionQueue* cq) override;
     ::grpc::ClientAsyncResponseReader< ::dmi::GetMetricResponse>* AsyncGetMetricRaw(::grpc::ClientContext* context, const ::dmi::GetMetricRequest& request, ::grpc::CompletionQueue* cq) override;
     ::grpc::ClientAsyncResponseReader< ::dmi::GetMetricResponse>* PrepareAsyncGetMetricRaw(::grpc::ClientContext* context, const ::dmi::GetMetricRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientReader< ::dmi::Metric>* StreamMetricsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request) override;
+    ::grpc::ClientAsyncReader< ::dmi::Metric>* AsyncStreamMetricsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq, void* tag) override;
+    ::grpc::ClientAsyncReader< ::dmi::Metric>* PrepareAsyncStreamMetricsRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) override;
     const ::grpc::internal::RpcMethod rpcmethod_ListMetrics_;
     const ::grpc::internal::RpcMethod rpcmethod_UpdateMetricsConfiguration_;
     const ::grpc::internal::RpcMethod rpcmethod_GetMetric_;
+    const ::grpc::internal::RpcMethod rpcmethod_StreamMetrics_;
   };
   static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
 
@@ -232,6 +269,8 @@
     virtual ::grpc::Status UpdateMetricsConfiguration(::grpc::ServerContext* context, const ::dmi::MetricsConfigurationRequest* request, ::dmi::MetricsConfigurationResponse* response);
     // Get the instantenous value of a metric

     virtual ::grpc::Status GetMetric(::grpc::ServerContext* context, const ::dmi::GetMetricRequest* request, ::dmi::GetMetricResponse* response);
+    // Initiate the server streaming of the metrics

+    virtual ::grpc::Status StreamMetrics(::grpc::ServerContext* context, const ::google::protobuf::Empty* request, ::grpc::ServerWriter< ::dmi::Metric>* writer);
   };
   template <class BaseClass>
   class WithAsyncMethod_ListMetrics : public BaseClass {
@@ -293,7 +332,27 @@
       ::grpc::Service::RequestAsyncUnary(2, context, request, response, new_call_cq, notification_cq, tag);
     }
   };
-  typedef WithAsyncMethod_ListMetrics<WithAsyncMethod_UpdateMetricsConfiguration<WithAsyncMethod_GetMetric<Service > > > AsyncService;
+  template <class BaseClass>
+  class WithAsyncMethod_StreamMetrics : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_StreamMetrics() {
+      ::grpc::Service::MarkMethodAsync(3);
+    }
+    ~WithAsyncMethod_StreamMetrics() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status StreamMetrics(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Metric>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestStreamMetrics(::grpc::ServerContext* context, ::google::protobuf::Empty* request, ::grpc::ServerAsyncWriter< ::dmi::Metric>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncServerStreaming(3, context, request, writer, new_call_cq, notification_cq, tag);
+    }
+  };
+  typedef WithAsyncMethod_ListMetrics<WithAsyncMethod_UpdateMetricsConfiguration<WithAsyncMethod_GetMetric<WithAsyncMethod_StreamMetrics<Service > > > > AsyncService;
   template <class BaseClass>
   class ExperimentalWithCallbackMethod_ListMetrics : public BaseClass {
    private:
@@ -435,11 +494,49 @@
     #endif
       { return nullptr; }
   };
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_StreamMetrics : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_StreamMetrics() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(3,
+          new ::grpc_impl::internal::CallbackServerStreamingHandler< ::google::protobuf::Empty, ::dmi::Metric>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::google::protobuf::Empty* request) { return this->StreamMetrics(context, request); }));
+    }
+    ~ExperimentalWithCallbackMethod_StreamMetrics() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status StreamMetrics(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Metric>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerWriteReactor< ::dmi::Metric>* StreamMetrics(
+      ::grpc::CallbackServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/)
+    #else
+    virtual ::grpc::experimental::ServerWriteReactor< ::dmi::Metric>* StreamMetrics(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/)
+    #endif
+      { return nullptr; }
+  };
   #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
-  typedef ExperimentalWithCallbackMethod_ListMetrics<ExperimentalWithCallbackMethod_UpdateMetricsConfiguration<ExperimentalWithCallbackMethod_GetMetric<Service > > > CallbackService;
+  typedef ExperimentalWithCallbackMethod_ListMetrics<ExperimentalWithCallbackMethod_UpdateMetricsConfiguration<ExperimentalWithCallbackMethod_GetMetric<ExperimentalWithCallbackMethod_StreamMetrics<Service > > > > CallbackService;
   #endif
 
-  typedef ExperimentalWithCallbackMethod_ListMetrics<ExperimentalWithCallbackMethod_UpdateMetricsConfiguration<ExperimentalWithCallbackMethod_GetMetric<Service > > > ExperimentalCallbackService;
+  typedef ExperimentalWithCallbackMethod_ListMetrics<ExperimentalWithCallbackMethod_UpdateMetricsConfiguration<ExperimentalWithCallbackMethod_GetMetric<ExperimentalWithCallbackMethod_StreamMetrics<Service > > > > ExperimentalCallbackService;
   template <class BaseClass>
   class WithGenericMethod_ListMetrics : public BaseClass {
    private:
@@ -492,6 +589,23 @@
     }
   };
   template <class BaseClass>
+  class WithGenericMethod_StreamMetrics : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_StreamMetrics() {
+      ::grpc::Service::MarkMethodGeneric(3);
+    }
+    ~WithGenericMethod_StreamMetrics() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status StreamMetrics(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Metric>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
   class WithRawMethod_ListMetrics : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -552,6 +666,26 @@
     }
   };
   template <class BaseClass>
+  class WithRawMethod_StreamMetrics : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_StreamMetrics() {
+      ::grpc::Service::MarkMethodRaw(3);
+    }
+    ~WithRawMethod_StreamMetrics() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status StreamMetrics(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Metric>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestStreamMetrics(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncWriter< ::grpc::ByteBuffer>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncServerStreaming(3, context, request, writer, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
   class ExperimentalWithRawCallbackMethod_ListMetrics : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -666,6 +800,44 @@
       { return nullptr; }
   };
   template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_StreamMetrics : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_StreamMetrics() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(3,
+          new ::grpc_impl::internal::CallbackServerStreamingHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const::grpc::ByteBuffer* request) { return this->StreamMetrics(context, request); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_StreamMetrics() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status StreamMetrics(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Metric>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerWriteReactor< ::grpc::ByteBuffer>* StreamMetrics(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/)
+    #else
+    virtual ::grpc::experimental::ServerWriteReactor< ::grpc::ByteBuffer>* StreamMetrics(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
   class WithStreamedUnaryMethod_ListMetrics : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -747,8 +919,35 @@
     virtual ::grpc::Status StreamedGetMetric(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::dmi::GetMetricRequest,::dmi::GetMetricResponse>* server_unary_streamer) = 0;
   };
   typedef WithStreamedUnaryMethod_ListMetrics<WithStreamedUnaryMethod_UpdateMetricsConfiguration<WithStreamedUnaryMethod_GetMetric<Service > > > StreamedUnaryService;
-  typedef Service SplitStreamedService;
-  typedef WithStreamedUnaryMethod_ListMetrics<WithStreamedUnaryMethod_UpdateMetricsConfiguration<WithStreamedUnaryMethod_GetMetric<Service > > > StreamedService;
+  template <class BaseClass>
+  class WithSplitStreamingMethod_StreamMetrics : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithSplitStreamingMethod_StreamMetrics() {
+      ::grpc::Service::MarkMethodStreamed(3,
+        new ::grpc::internal::SplitServerStreamingHandler<
+          ::google::protobuf::Empty, ::dmi::Metric>(
+            [this](::grpc_impl::ServerContext* context,
+                   ::grpc_impl::ServerSplitStreamer<
+                     ::google::protobuf::Empty, ::dmi::Metric>* streamer) {
+                       return this->StreamedStreamMetrics(context,
+                         streamer);
+                  }));
+    }
+    ~WithSplitStreamingMethod_StreamMetrics() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status StreamMetrics(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::grpc::ServerWriter< ::dmi::Metric>* /*writer*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with split streamed
+    virtual ::grpc::Status StreamedStreamMetrics(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::google::protobuf::Empty,::dmi::Metric>* server_split_streamer) = 0;
+  };
+  typedef WithSplitStreamingMethod_StreamMetrics<Service > SplitStreamedService;
+  typedef WithStreamedUnaryMethod_ListMetrics<WithStreamedUnaryMethod_UpdateMetricsConfiguration<WithStreamedUnaryMethod_GetMetric<WithSplitStreamingMethod_StreamMetrics<Service > > > > StreamedService;
 };
 
 }  // namespace dmi
diff --git a/cpp/dmi/hw_metrics_mgmt_service.pb.cc b/cpp/dmi/hw_metrics_mgmt_service.pb.cc
index 389e53d..14a0306 100644
--- a/cpp/dmi/hw_metrics_mgmt_service.pb.cc
+++ b/cpp/dmi/hw_metrics_mgmt_service.pb.cc
@@ -319,85 +319,88 @@
 
 const char descriptor_table_protodef_dmi_2fhw_5fmetrics_5fmgmt_5fservice_2eproto[] =
   "\n!dmi/hw_metrics_mgmt_service.proto\022\003dmi"
-  "\032\021dmi/commons.proto\032\014dmi/hw.proto\"a\n\014Met"
-  "ricConfig\022#\n\tmetric_id\030\001 \001(\0162\020.dmi.Metri"
-  "cNames\022\025\n\ris_configured\030\002 \001(\010\022\025\n\rpoll_in"
-  "terval\030\003 \001(\r\"3\n\rMetricsConfig\022\"\n\007metrics"
-  "\030\001 \003(\0132\021.dmi.MetricConfig\"\377\001\n\023ListMetric"
-  "sResponse\022\033\n\006status\030\001 \001(\0162\013.dmi.Status\022/"
-  "\n\006reason\030\002 \001(\0162\037.dmi.ListMetricsResponse"
-  ".Reason\022#\n\007metrics\030\003 \001(\0132\022.dmi.MetricsCo"
-  "nfig\022\025\n\rreason_detail\030\004 \001(\t\"^\n\006Reason\022\024\n"
-  "\020UNDEFINED_REASON\020\000\022\022\n\016UNKNOWN_DEVICE\020\001\022"
-  "\022\n\016INTERNAL_ERROR\020\002\022\026\n\022DEVICE_UNREACHABL"
-  "E\020\003\"\215\001\n\033MetricsConfigurationRequest\022\036\n\013d"
-  "evice_uuid\030\001 \001(\0132\t.dmi.Uuid\022%\n\007changes\030\002"
-  " \001(\0132\022.dmi.MetricsConfigH\000\022\032\n\020reset_to_d"
-  "efault\030\003 \001(\010H\000B\013\n\toperation\"\240\002\n\034MetricsC"
-  "onfigurationResponse\022\033\n\006status\030\001 \001(\0162\013.d"
-  "mi.Status\0228\n\006reason\030\002 \001(\0162(.dmi.MetricsC"
-  "onfigurationResponse.Reason\022\025\n\rreason_de"
-  "tail\030\003 \001(\t\"\221\001\n\006Reason\022\024\n\020UNDEFINED_REASO"
-  "N\020\000\022\022\n\016UNKNOWN_DEVICE\020\001\022\022\n\016INTERNAL_ERRO"
-  "R\020\002\022\035\n\031POLL_INTERVAL_UNSUPPORTED\020\003\022\022\n\016IN"
-  "VALID_METRIC\020\004\022\026\n\022DEVICE_UNREACHABLE\020\005\"k"
-  "\n\016MetricMetaData\022\036\n\013device_uuid\030\001 \001(\0132\t."
-  "dmi.Uuid\022!\n\016component_uuid\030\002 \001(\0132\t.dmi.U"
-  "uid\022\026\n\016component_name\030\003 \001(\t\"\204\001\n\006Metric\022#"
-  "\n\tmetric_id\030\001 \001(\0162\020.dmi.MetricNames\022,\n\017m"
-  "etric_metadata\030\002 \001(\0132\023.dmi.MetricMetaDat"
-  "a\022\'\n\005value\030\003 \001(\0132\030.dmi.ComponentSensorDa"
-  "ta\"_\n\020GetMetricRequest\022&\n\tmeta_data\030\001 \001("
-  "\0132\023.dmi.MetricMetaData\022#\n\tmetric_id\030\002 \001("
-  "\0162\020.dmi.MetricNames\"\237\002\n\021GetMetricRespons"
-  "e\022\033\n\006status\030\001 \001(\0162\013.dmi.Status\022-\n\006reason"
-  "\030\002 \001(\0162\035.dmi.GetMetricResponse.Reason\022\033\n"
-  "\006metric\030\003 \001(\0132\013.dmi.Metric\022\025\n\rreason_det"
-  "ail\030\004 \001(\t\"\211\001\n\006Reason\022\024\n\020UNDEFINED_REASON"
-  "\020\000\022\022\n\016UNKNOWN_DEVICE\020\001\022\025\n\021UNKNOWN_COMPON"
-  "ENT\020\002\022\022\n\016INTERNAL_ERROR\020\003\022\022\n\016INVALID_MET"
-  "RIC\020\004\022\026\n\022DEVICE_UNREACHABLE\020\005*\331\005\n\013Metric"
-  "Names\022\031\n\025METRIC_NAME_UNDEFINED\020\000\022\024\n\020METR"
-  "IC_FAN_SPEED\020\001\022\023\n\017METRIC_CPU_TEMP\020d\022\037\n\033M"
-  "ETRIC_CPU_USAGE_PERCENTAGE\020e\022\034\n\027METRIC_T"
-  "RANSCEIVER_TEMP\020\310\001\022\037\n\032METRIC_TRANSCEIVER"
-  "_VOLTAGE\020\311\001\022\034\n\027METRIC_TRANSCEIVER_BIAS\020\312"
-  "\001\022 \n\033METRIC_TRANSCEIVER_RX_POWER\020\313\001\022 \n\033M"
-  "ETRIC_TRANSCEIVER_TX_POWER\020\314\001\022\"\n\035METRIC_"
-  "TRANSCEIVER_WAVELENGTH\020\315\001\022\025\n\020METRIC_DISK"
-  "_TEMP\020\254\002\022\031\n\024METRIC_DISK_CAPACITY\020\255\002\022\026\n\021M"
-  "ETRIC_DISK_USAGE\020\256\002\022!\n\034METRIC_DISK_USAGE"
-  "_PERCENTAGE\020\257\002\022&\n!METRIC_DISK_READ_WRITE"
-  "_PERCENTAGE\020\260\002\022(\n#METRIC_DISK_FAULTY_CEL"
-  "LS_PERCENTAGE\020\261\002\022\024\n\017METRIC_RAM_TEMP\020\220\003\022\030"
-  "\n\023METRIC_RAM_CAPACITY\020\221\003\022\025\n\020METRIC_RAM_U"
-  "SAGE\020\222\003\022 \n\033METRIC_RAM_USAGE_PERCENTAGE\020\223"
-  "\003\022\025\n\020METRIC_POWER_MAX\020\364\003\022\027\n\022METRIC_POWER"
-  "_USAGE\020\365\003\022\"\n\035METRIC_POWER_USAGE_PERCENTA"
-  "GE\020\366\003\022\"\n\035METRIC_INNER_SURROUNDING_TEMP\020\330"
-  "\0042\371\001\n\036NativeMetricsManagementService\0228\n\013"
-  "ListMetrics\022\017.dmi.HardwareID\032\030.dmi.ListM"
-  "etricsResponse\022a\n\032UpdateMetricsConfigura"
-  "tion\022 .dmi.MetricsConfigurationRequest\032!"
-  ".dmi.MetricsConfigurationResponse\022:\n\tGet"
-  "Metric\022\025.dmi.GetMetricRequest\032\026.dmi.GetM"
-  "etricResponseB;Z9github.com/opencord/dev"
-  "ice-management-interface/v3/go/dmib\006prot"
-  "o3"
+  "\032\021dmi/commons.proto\032\014dmi/hw.proto\032\033googl"
+  "e/protobuf/empty.proto\"a\n\014MetricConfig\022#"
+  "\n\tmetric_id\030\001 \001(\0162\020.dmi.MetricNames\022\025\n\ri"
+  "s_configured\030\002 \001(\010\022\025\n\rpoll_interval\030\003 \001("
+  "\r\"3\n\rMetricsConfig\022\"\n\007metrics\030\001 \003(\0132\021.dm"
+  "i.MetricConfig\"\377\001\n\023ListMetricsResponse\022\033"
+  "\n\006status\030\001 \001(\0162\013.dmi.Status\022/\n\006reason\030\002 "
+  "\001(\0162\037.dmi.ListMetricsResponse.Reason\022#\n\007"
+  "metrics\030\003 \001(\0132\022.dmi.MetricsConfig\022\025\n\rrea"
+  "son_detail\030\004 \001(\t\"^\n\006Reason\022\024\n\020UNDEFINED_"
+  "REASON\020\000\022\022\n\016UNKNOWN_DEVICE\020\001\022\022\n\016INTERNAL"
+  "_ERROR\020\002\022\026\n\022DEVICE_UNREACHABLE\020\003\"\215\001\n\033Met"
+  "ricsConfigurationRequest\022\036\n\013device_uuid\030"
+  "\001 \001(\0132\t.dmi.Uuid\022%\n\007changes\030\002 \001(\0132\022.dmi."
+  "MetricsConfigH\000\022\032\n\020reset_to_default\030\003 \001("
+  "\010H\000B\013\n\toperation\"\240\002\n\034MetricsConfiguratio"
+  "nResponse\022\033\n\006status\030\001 \001(\0162\013.dmi.Status\0228"
+  "\n\006reason\030\002 \001(\0162(.dmi.MetricsConfiguratio"
+  "nResponse.Reason\022\025\n\rreason_detail\030\003 \001(\t\""
+  "\221\001\n\006Reason\022\024\n\020UNDEFINED_REASON\020\000\022\022\n\016UNKN"
+  "OWN_DEVICE\020\001\022\022\n\016INTERNAL_ERROR\020\002\022\035\n\031POLL"
+  "_INTERVAL_UNSUPPORTED\020\003\022\022\n\016INVALID_METRI"
+  "C\020\004\022\026\n\022DEVICE_UNREACHABLE\020\005\"k\n\016MetricMet"
+  "aData\022\036\n\013device_uuid\030\001 \001(\0132\t.dmi.Uuid\022!\n"
+  "\016component_uuid\030\002 \001(\0132\t.dmi.Uuid\022\026\n\016comp"
+  "onent_name\030\003 \001(\t\"\204\001\n\006Metric\022#\n\tmetric_id"
+  "\030\001 \001(\0162\020.dmi.MetricNames\022,\n\017metric_metad"
+  "ata\030\002 \001(\0132\023.dmi.MetricMetaData\022\'\n\005value\030"
+  "\003 \001(\0132\030.dmi.ComponentSensorData\"_\n\020GetMe"
+  "tricRequest\022&\n\tmeta_data\030\001 \001(\0132\023.dmi.Met"
+  "ricMetaData\022#\n\tmetric_id\030\002 \001(\0162\020.dmi.Met"
+  "ricNames\"\237\002\n\021GetMetricResponse\022\033\n\006status"
+  "\030\001 \001(\0162\013.dmi.Status\022-\n\006reason\030\002 \001(\0162\035.dm"
+  "i.GetMetricResponse.Reason\022\033\n\006metric\030\003 \001"
+  "(\0132\013.dmi.Metric\022\025\n\rreason_detail\030\004 \001(\t\"\211"
+  "\001\n\006Reason\022\024\n\020UNDEFINED_REASON\020\000\022\022\n\016UNKNO"
+  "WN_DEVICE\020\001\022\025\n\021UNKNOWN_COMPONENT\020\002\022\022\n\016IN"
+  "TERNAL_ERROR\020\003\022\022\n\016INVALID_METRIC\020\004\022\026\n\022DE"
+  "VICE_UNREACHABLE\020\005*\331\005\n\013MetricNames\022\031\n\025ME"
+  "TRIC_NAME_UNDEFINED\020\000\022\024\n\020METRIC_FAN_SPEE"
+  "D\020\001\022\023\n\017METRIC_CPU_TEMP\020d\022\037\n\033METRIC_CPU_U"
+  "SAGE_PERCENTAGE\020e\022\034\n\027METRIC_TRANSCEIVER_"
+  "TEMP\020\310\001\022\037\n\032METRIC_TRANSCEIVER_VOLTAGE\020\311\001"
+  "\022\034\n\027METRIC_TRANSCEIVER_BIAS\020\312\001\022 \n\033METRIC"
+  "_TRANSCEIVER_RX_POWER\020\313\001\022 \n\033METRIC_TRANS"
+  "CEIVER_TX_POWER\020\314\001\022\"\n\035METRIC_TRANSCEIVER"
+  "_WAVELENGTH\020\315\001\022\025\n\020METRIC_DISK_TEMP\020\254\002\022\031\n"
+  "\024METRIC_DISK_CAPACITY\020\255\002\022\026\n\021METRIC_DISK_"
+  "USAGE\020\256\002\022!\n\034METRIC_DISK_USAGE_PERCENTAGE"
+  "\020\257\002\022&\n!METRIC_DISK_READ_WRITE_PERCENTAGE"
+  "\020\260\002\022(\n#METRIC_DISK_FAULTY_CELLS_PERCENTA"
+  "GE\020\261\002\022\024\n\017METRIC_RAM_TEMP\020\220\003\022\030\n\023METRIC_RA"
+  "M_CAPACITY\020\221\003\022\025\n\020METRIC_RAM_USAGE\020\222\003\022 \n\033"
+  "METRIC_RAM_USAGE_PERCENTAGE\020\223\003\022\025\n\020METRIC"
+  "_POWER_MAX\020\364\003\022\027\n\022METRIC_POWER_USAGE\020\365\003\022\""
+  "\n\035METRIC_POWER_USAGE_PERCENTAGE\020\366\003\022\"\n\035ME"
+  "TRIC_INNER_SURROUNDING_TEMP\020\330\0042\261\002\n\036Nativ"
+  "eMetricsManagementService\0228\n\013ListMetrics"
+  "\022\017.dmi.HardwareID\032\030.dmi.ListMetricsRespo"
+  "nse\022a\n\032UpdateMetricsConfiguration\022 .dmi."
+  "MetricsConfigurationRequest\032!.dmi.Metric"
+  "sConfigurationResponse\022:\n\tGetMetric\022\025.dm"
+  "i.GetMetricRequest\032\026.dmi.GetMetricRespon"
+  "se\0226\n\rStreamMetrics\022\026.google.protobuf.Em"
+  "pty\032\013.dmi.Metric0\001B;Z9github.com/opencor"
+  "d/device-management-interface/v3/go/dmib"
+  "\006proto3"
   ;
 ::google::protobuf::internal::DescriptorTable descriptor_table_dmi_2fhw_5fmetrics_5fmgmt_5fservice_2eproto = {
   false, InitDefaults_dmi_2fhw_5fmetrics_5fmgmt_5fservice_2eproto, 
   descriptor_table_protodef_dmi_2fhw_5fmetrics_5fmgmt_5fservice_2eproto,
-  "dmi/hw_metrics_mgmt_service.proto", &assign_descriptors_table_dmi_2fhw_5fmetrics_5fmgmt_5fservice_2eproto, 2602,
+  "dmi/hw_metrics_mgmt_service.proto", &assign_descriptors_table_dmi_2fhw_5fmetrics_5fmgmt_5fservice_2eproto, 2687,
 };
 
 void AddDescriptors_dmi_2fhw_5fmetrics_5fmgmt_5fservice_2eproto() {
-  static constexpr ::google::protobuf::internal::InitFunc deps[2] =
+  static constexpr ::google::protobuf::internal::InitFunc deps[3] =
   {
     ::AddDescriptors_dmi_2fcommons_2eproto,
     ::AddDescriptors_dmi_2fhw_2eproto,
+    ::AddDescriptors_google_2fprotobuf_2fempty_2eproto,
   };
- ::google::protobuf::internal::AddDescriptors(&descriptor_table_dmi_2fhw_5fmetrics_5fmgmt_5fservice_2eproto, deps, 2);
+ ::google::protobuf::internal::AddDescriptors(&descriptor_table_dmi_2fhw_5fmetrics_5fmgmt_5fservice_2eproto, deps, 3);
 }
 
 // Force running AddDescriptors() at dynamic initialization time.
diff --git a/cpp/dmi/hw_metrics_mgmt_service.pb.h b/cpp/dmi/hw_metrics_mgmt_service.pb.h
index 5967faa..ab393ae 100644
--- a/cpp/dmi/hw_metrics_mgmt_service.pb.h
+++ b/cpp/dmi/hw_metrics_mgmt_service.pb.h
@@ -34,6 +34,7 @@
 #include <google/protobuf/unknown_field_set.h>
 #include "dmi/commons.pb.h"
 #include "dmi/hw.pb.h"
+#include <google/protobuf/empty.pb.h>
 // @@protoc_insertion_point(includes)
 #include <google/protobuf/port_def.inc>
 #define PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fmetrics_5fmgmt_5fservice_2eproto
diff --git a/dmi.pb b/dmi.pb
index e61d910..147fe01 100644
--- a/dmi.pb
+++ b/dmi.pb
Binary files differ
diff --git a/go/dmi/hw_events_mgmt_service.pb.go b/go/dmi/hw_events_mgmt_service.pb.go
index ba213a6..6110b97 100644
--- a/go/dmi/hw_events_mgmt_service.pb.go
+++ b/go/dmi/hw_events_mgmt_service.pb.go
@@ -7,6 +7,7 @@
 	context "context"
 	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
+	empty "github.com/golang/protobuf/ptypes/empty"
 	timestamp "github.com/golang/protobuf/ptypes/timestamp"
 	grpc "google.golang.org/grpc"
 	codes "google.golang.org/grpc/codes"
@@ -959,98 +960,100 @@
 func init() { proto.RegisterFile("dmi/hw_events_mgmt_service.proto", fileDescriptor_8962d785556e9979) }
 
 var fileDescriptor_8962d785556e9979 = []byte{
-	// 1448 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0x4b, 0x73, 0xdb, 0xd4,
-	0x17, 0x8f, 0xad, 0x3c, 0x9c, 0x93, 0xc6, 0x7f, 0xf5, 0x4e, 0xff, 0x6d, 0xe2, 0x4e, 0x5b, 0xe3,
-	0x40, 0x93, 0x06, 0x62, 0xb7, 0x09, 0xb4, 0x74, 0xba, 0x00, 0xc5, 0x56, 0x6a, 0x0d, 0x8e, 0x9c,
-	0xb9, 0x91, 0x1d, 0x86, 0x45, 0x35, 0x37, 0xd6, 0xb5, 0x2d, 0x6a, 0x49, 0xae, 0x74, 0x95, 0x50,
-	0x98, 0x61, 0xc1, 0x92, 0x15, 0xaf, 0x25, 0xc3, 0x27, 0xa0, 0xb0, 0xe4, 0x2b, 0xf0, 0x58, 0xf1,
-	0x5d, 0x78, 0x2d, 0x19, 0x5d, 0xc9, 0xb6, 0xe2, 0x47, 0x9c, 0xce, 0xb0, 0xb3, 0xce, 0xf9, 0xfd,
-	0xce, 0xf9, 0x5d, 0x9d, 0x73, 0x8f, 0x8e, 0x21, 0x6b, 0x58, 0x66, 0xa1, 0x7d, 0xaa, 0xd3, 0x13,
-	0x6a, 0x33, 0x4f, 0xb7, 0x5a, 0x16, 0xd3, 0x3d, 0xea, 0x9e, 0x98, 0x0d, 0x9a, 0xef, 0xba, 0x0e,
-	0x73, 0x90, 0x60, 0x58, 0x66, 0xe6, 0x72, 0x00, 0x6b, 0x38, 0x96, 0xe5, 0xd8, 0x5e, 0x68, 0xcf,
-	0x5c, 0x0a, 0x99, 0xd1, 0xd3, 0xad, 0x96, 0xe3, 0xb4, 0x3a, 0xb4, 0xc0, 0x9f, 0x8e, 0xfd, 0x66,
-	0x81, 0x99, 0x16, 0xf5, 0x18, 0xb1, 0xba, 0x21, 0x20, 0x67, 0xc2, 0x62, 0x9d, 0x74, 0x7c, 0xaa,
-	0x3d, 0xef, 0x52, 0xb4, 0x0a, 0x0b, 0xa6, 0xcd, 0xf4, 0x13, 0xd2, 0x59, 0x49, 0x64, 0x13, 0x1b,
-	0x42, 0x79, 0x06, 0xcf, 0x9b, 0x36, 0xab, 0x93, 0x0e, 0xba, 0x0e, 0x29, 0xbf, 0xe7, 0x4b, 0x66,
-	0x13, 0x1b, 0xb3, 0xe5, 0x19, 0xbc, 0xe0, 0x47, 0xce, 0x1b, 0xb0, 0xd8, 0xec, 0x38, 0x24, 0xf4,
-	0x0a, 0xd9, 0xc4, 0x46, 0xb2, 0x3c, 0x83, 0x53, 0xdc, 0x54, 0x27, 0x9d, 0xdd, 0x39, 0x10, 0x4e,
-	0x48, 0x27, 0x87, 0x01, 0x8e, 0x08, 0xa3, 0xee, 0x3e, 0x71, 0x9f, 0x7a, 0x28, 0x07, 0xb3, 0x6d,
-	0xb3, 0xd5, 0xe6, 0x89, 0x96, 0xb6, 0xd3, 0x79, 0xc3, 0x32, 0xf3, 0x7d, 0x25, 0x98, 0xfb, 0x50,
-	0x16, 0x84, 0x8e, 0x73, 0xca, 0xf3, 0x8d, 0x42, 0x02, 0x57, 0xee, 0x29, 0x80, 0xd6, 0x76, 0xa9,
-	0xd7, 0x76, 0x3a, 0x86, 0x87, 0xd6, 0x61, 0xce, 0xef, 0x76, 0xa9, 0x1b, 0x05, 0xfd, 0x1f, 0x67,
-	0x0c, 0x72, 0x96, 0x67, 0x70, 0xe8, 0x0f, 0x80, 0x1d, 0xe7, 0x94, 0xba, 0x51, 0xe8, 0x71, 0x40,
-	0xee, 0xdf, 0x5d, 0x82, 0x45, 0xd6, 0x8b, 0x9f, 0xfb, 0x14, 0xae, 0xf4, 0x93, 0x29, 0x76, 0xd3,
-	0x71, 0x2d, 0xc2, 0x4c, 0xc7, 0x46, 0x6f, 0x41, 0xda, 0x39, 0x0e, 0xaa, 0x43, 0x8d, 0xe0, 0x0d,
-	0xf8, 0x74, 0xc2, 0xa1, 0x96, 0x7b, 0x28, 0x6e, 0x42, 0x05, 0x80, 0x7e, 0x6c, 0xef, 0x8c, 0x92,
-	0xc1, 0x91, 0x70, 0x0c, 0x92, 0xfb, 0x3c, 0x01, 0x29, 0x39, 0x68, 0x88, 0x62, 0xb3, 0x85, 0x36,
-	0x20, 0xc5, 0x9b, 0x43, 0x37, 0x0d, 0x9e, 0x2e, 0xbd, 0xbd, 0xcc, 0xb9, 0x1c, 0xa0, 0x18, 0x1e,
-	0x5e, 0xa0, 0xe1, 0x2f, 0xb4, 0x06, 0xcb, 0xa6, 0xa7, 0x37, 0x1c, 0xbb, 0x69, 0xb6, 0x7c, 0x97,
-	0x1a, 0x3c, 0x55, 0x0a, 0x5f, 0x32, 0xbd, 0x62, 0xdf, 0x36, 0x24, 0x46, 0x98, 0x2e, 0xe6, 0x2e,
-	0x2c, 0xf2, 0x54, 0x5e, 0x20, 0x66, 0x0d, 0xe6, 0x4c, 0x46, 0x2d, 0x6f, 0x25, 0x91, 0x15, 0x36,
-	0x96, 0xe2, 0x4a, 0x8a, 0xcd, 0x16, 0x0e, 0x7d, 0xb9, 0xef, 0x92, 0x80, 0x2a, 0xa6, 0xc7, 0x42,
-	0x1a, 0xa6, 0x5e, 0xd7, 0xb1, 0x3d, 0x8a, 0xd6, 0x60, 0xde, 0x63, 0x84, 0xf9, 0x5e, 0x74, 0x8c,
-	0x25, 0x4e, 0x3e, 0xe4, 0x26, 0x1c, 0xb9, 0xd0, 0x7d, 0x98, 0x77, 0x29, 0xf1, 0x1c, 0x9b, 0x8b,
-	0x4f, 0x6f, 0xdf, 0xe4, 0xa0, 0xd1, 0x68, 0x79, 0xcc, 0x51, 0x38, 0x42, 0xa3, 0xdb, 0x30, 0x1f,
-	0x5e, 0xa1, 0xe8, 0x48, 0xe9, 0x81, 0xb2, 0x40, 0x38, 0x8e, 0xbc, 0xc1, 0x3b, 0x0a, 0x19, 0xba,
-	0x41, 0x19, 0x31, 0x3b, 0x2b, 0xb3, 0xd9, 0xc4, 0xc6, 0x22, 0xbe, 0x14, 0x1a, 0x4b, 0xdc, 0x96,
-	0x7b, 0x02, 0xf3, 0x61, 0x78, 0x74, 0x05, 0xc4, 0x9a, 0x5a, 0x92, 0xf7, 0x14, 0x55, 0x2e, 0xe9,
-	0x58, 0x96, 0x0e, 0xab, 0xaa, 0x38, 0x83, 0x10, 0xa4, 0x6b, 0xea, 0x7b, 0x6a, 0xf5, 0x48, 0xd5,
-	0x4b, 0x72, 0x5d, 0x29, 0xca, 0x62, 0x22, 0xb0, 0x29, 0xaa, 0x26, 0x63, 0x55, 0xaa, 0xe8, 0x32,
-	0xc6, 0x55, 0x2c, 0x26, 0xd1, 0x55, 0x40, 0xa1, 0x5f, 0xaf, 0xa9, 0x58, 0x96, 0x8a, 0x65, 0x69,
-	0xb7, 0x22, 0x8b, 0x42, 0xee, 0x45, 0x02, 0x32, 0x91, 0xb4, 0xa8, 0x30, 0xbc, 0xbf, 0x30, 0x7d,
-	0xe6, 0x53, 0x8f, 0xa1, 0x4d, 0x58, 0x32, 0x68, 0x30, 0x01, 0x74, 0xdf, 0x8f, 0x8a, 0xbe, 0xb4,
-	0xbd, 0xc8, 0x0f, 0x54, 0xf3, 0x4d, 0x03, 0x43, 0xe8, 0x0d, 0x7e, 0xa3, 0x4d, 0x58, 0x68, 0xb4,
-	0x89, 0xdd, 0xa2, 0xde, 0x99, 0xdb, 0xd3, 0x3f, 0x78, 0x70, 0x7b, 0x23, 0x00, 0xda, 0x04, 0xd1,
-	0xa5, 0x1e, 0x65, 0x3a, 0x73, 0x74, 0x83, 0x36, 0x89, 0xdf, 0x61, 0xfc, 0x6d, 0xa5, 0xca, 0x33,
-	0x38, 0xcd, 0x3d, 0x9a, 0x53, 0x0a, 0xed, 0xc1, 0x7d, 0x70, 0xba, 0x34, 0xd4, 0x95, 0xfb, 0x36,
-	0x09, 0xd7, 0xc7, 0xea, 0x7d, 0x99, 0xca, 0xbe, 0x33, 0x54, 0xd9, 0xf5, 0xb8, 0xd0, 0x71, 0x61,
-	0x87, 0x4b, 0x3c, 0x52, 0x3a, 0x61, 0x4c, 0xe9, 0xdc, 0xff, 0xa8, 0x74, 0xdc, 0x56, 0x97, 0x2a,
-	0x4a, 0x49, 0x2f, 0x56, 0xd5, 0x3d, 0xe5, 0xb1, 0x28, 0x4c, 0x28, 0xe7, 0x6c, 0xee, 0x9b, 0x04,
-	0x2c, 0xf3, 0x73, 0xec, 0x53, 0x46, 0x4a, 0x84, 0x91, 0x97, 0xaa, 0xe0, 0x5d, 0x48, 0x37, 0x1c,
-	0xab, 0xeb, 0xd8, 0xc1, 0x1d, 0xe7, 0xf0, 0xe4, 0x30, 0x7c, 0xb9, 0x0f, 0xe0, 0x8c, 0xd7, 0xe2,
-	0x0c, 0x9b, 0x58, 0x34, 0x7a, 0x13, 0x03, 0x98, 0x4a, 0x2c, 0x9a, 0xfb, 0x2c, 0x09, 0x73, 0x5c,
-	0x16, 0x7a, 0x08, 0xe9, 0x70, 0x84, 0x58, 0x94, 0x11, 0x83, 0x30, 0x12, 0x29, 0x42, 0x83, 0x12,
-	0xf4, 0xa4, 0xe3, 0x65, 0xda, 0x7b, 0x0c, 0x80, 0x67, 0xa6, 0x4f, 0xf2, 0xdc, 0xe9, 0xf3, 0x00,
-	0x16, 0x5d, 0x62, 0x7a, 0xd4, 0xd0, 0xfb, 0x97, 0x30, 0x93, 0x0f, 0xbf, 0x4a, 0xf9, 0xde, 0x57,
-	0x29, 0xaf, 0xf5, 0xbe, 0x4a, 0x38, 0x15, 0x82, 0x35, 0x0f, 0xbd, 0x0b, 0xe9, 0xfe, 0xb8, 0xd1,
-	0x4d, 0xbb, 0xe9, 0xf0, 0x3b, 0xb9, 0xb4, 0xbd, 0x7a, 0x76, 0x2a, 0xc5, 0x06, 0x31, 0x5e, 0x66,
-	0x71, 0x2b, 0x5a, 0x85, 0x14, 0x31, 0x22, 0xee, 0x1c, 0x7f, 0x15, 0x0b, 0xc4, 0xe0, 0xae, 0xcd,
-	0xdf, 0xd3, 0xd1, 0x28, 0x55, 0x0c, 0x0f, 0xad, 0xc0, 0x15, 0xb9, 0x2e, 0xab, 0x9a, 0xae, 0x4a,
-	0xfb, 0x41, 0x11, 0xa3, 0xee, 0x10, 0x67, 0xd0, 0x4d, 0xc8, 0x84, 0x1e, 0x0d, 0x4b, 0xea, 0x61,
-	0x51, 0x56, 0xea, 0x32, 0xd6, 0x0f, 0x2a, 0xb5, 0xc7, 0x7a, 0xb5, 0xa6, 0x89, 0x06, 0xba, 0x01,
-	0xab, 0x13, 0xfc, 0x8a, 0x2a, 0x52, 0xb4, 0x05, 0x77, 0x46, 0xdd, 0xf5, 0x6a, 0x45, 0x93, 0x1e,
-	0xcb, 0xba, 0xb4, 0x5b, 0xad, 0xcb, 0xba, 0x56, 0xc6, 0xf2, 0x61, 0xb9, 0x5a, 0x29, 0x89, 0xcd,
-	0xf3, 0xe1, 0xbb, 0x72, 0xa5, 0x7a, 0x14, 0x83, 0xb7, 0xd0, 0x3d, 0xd8, 0x1a, 0x85, 0x6b, 0xf2,
-	0xfe, 0x81, 0x8c, 0x25, 0xad, 0x86, 0x47, 0x33, 0xb4, 0xa7, 0x53, 0x86, 0xb3, 0x98, 0xe3, 0x45,
-	0x15, 0x6b, 0x18, 0x07, 0xb6, 0xe1, 0x0c, 0x1f, 0x9e, 0x0f, 0x1f, 0x8e, 0xfe, 0x14, 0xe5, 0x61,
-	0x73, 0x14, 0x8e, 0xdf, 0xd7, 0x0f, 0xaa, 0x47, 0x32, 0x1e, 0x09, 0xdf, 0x99, 0x82, 0x1f, 0x8e,
-	0x6f, 0x8d, 0xc7, 0x6b, 0x93, 0xe2, 0xdb, 0x53, 0xf0, 0xc3, 0xf1, 0x9d, 0xf1, 0x0d, 0xb0, 0x27,
-	0x29, 0x95, 0x1a, 0x96, 0xc5, 0x2e, 0x7a, 0x00, 0x3b, 0x17, 0x6e, 0x00, 0x1d, 0xcb, 0xc5, 0x6a,
-	0x5d, 0xc6, 0x72, 0x49, 0x7c, 0x76, 0x3e, 0x71, 0x48, 0x46, 0x8c, 0xe8, 0xa2, 0x47, 0xf0, 0xe0,
-	0xa5, 0x9a, 0x22, 0x46, 0xf6, 0xa6, 0x93, 0x27, 0x67, 0x66, 0xe3, 0x25, 0x4f, 0x68, 0x94, 0x18,
-	0xd1, 0x3f, 0x9f, 0x38, 0x39, 0xe3, 0x09, 0x7a, 0x1b, 0xde, 0xbc, 0x78, 0xf3, 0xc4, 0x98, 0xa7,
-	0x53, 0x98, 0x93, 0x73, 0x7e, 0x34, 0x9e, 0xa9, 0x4d, 0xcf, 0xf9, 0x7c, 0x0a, 0x73, 0x72, 0xce,
-	0x8f, 0xd1, 0x3a, 0xac, 0x4d, 0x6c, 0xb2, 0x18, 0xf0, 0x13, 0x74, 0x0d, 0x50, 0x08, 0x3c, 0x38,
-	0xac, 0x0d, 0xc6, 0xd4, 0xcf, 0x09, 0x74, 0x15, 0x2e, 0x0f, 0x39, 0x14, 0x55, 0xfc, 0x65, 0xc8,
-	0xde, 0x6b, 0xdb, 0x5f, 0x13, 0x28, 0x0b, 0xd7, 0x47, 0xec, 0xb1, 0x4c, 0xbf, 0xc5, 0x98, 0x7b,
-	0x92, 0xda, 0x67, 0x7e, 0x9f, 0x1c, 0x48, 0x08, 0xec, 0x7d, 0x09, 0x2f, 0x92, 0x67, 0x09, 0x3d,
-	0x09, 0x3f, 0x24, 0x07, 0xa9, 0x62, 0x81, 0x62, 0xa9, 0x7e, 0x4c, 0xa2, 0x3b, 0xf0, 0x6a, 0x88,
-	0x28, 0x1e, 0xd4, 0xc6, 0xb4, 0x72, 0x11, 0x2b, 0x9a, 0x52, 0x94, 0x2a, 0xe2, 0x17, 0x02, 0xba,
-	0x0d, 0xaf, 0x9c, 0x07, 0xdd, 0x93, 0x34, 0xa9, 0x22, 0x7e, 0x29, 0xa0, 0x1d, 0xc8, 0x5f, 0x24,
-	0x64, 0x4c, 0xc7, 0x57, 0x02, 0xba, 0x0b, 0xaf, 0x4f, 0x0d, 0x1e, 0x63, 0x7c, 0x2d, 0xa0, 0x0c,
-	0xfc, 0x3f, 0x64, 0x94, 0x8f, 0xa2, 0xb5, 0x42, 0xc7, 0xf2, 0xa1, 0xac, 0x89, 0x7f, 0x08, 0xa8,
-	0xd0, 0x9b, 0x34, 0x03, 0xdf, 0x39, 0x67, 0xfb, 0x53, 0x40, 0x6f, 0xc0, 0xfa, 0x74, 0x42, 0x78,
-	0xc2, 0xbf, 0x04, 0xf4, 0xb0, 0xd7, 0x6d, 0x17, 0x09, 0x1f, 0x53, 0xfd, 0xb7, 0x80, 0xee, 0xc3,
-	0xbd, 0x0b, 0x26, 0x8a, 0xf1, 0xfe, 0x11, 0xb6, 0x7f, 0x4a, 0xc0, 0x0d, 0x95, 0x30, 0xf3, 0x84,
-	0x86, 0xdb, 0xdb, 0x3e, 0xb1, 0x49, 0x8b, 0x5a, 0xd4, 0x66, 0x87, 0xe1, 0x3f, 0x57, 0x74, 0x1f,
-	0x60, 0xb0, 0xb2, 0xa3, 0xf0, 0xef, 0x45, 0x99, 0xb8, 0xc6, 0x29, 0x71, 0xa9, 0x52, 0xca, 0x5c,
-	0x9b, 0xb0, 0xd4, 0xa3, 0x27, 0xb0, 0x5a, 0xeb, 0x1a, 0x84, 0xd1, 0x31, 0x6b, 0x21, 0xba, 0x35,
-	0x79, 0x61, 0xe4, 0x7b, 0x73, 0x26, 0x3b, 0x6d, 0xa3, 0xdc, 0x7d, 0xf4, 0xc1, 0xc3, 0x96, 0xc9,
-	0xda, 0xfe, 0x71, 0xbe, 0xe1, 0x58, 0x05, 0xa7, 0x4b, 0xed, 0x86, 0xe3, 0x1a, 0x85, 0x70, 0x1b,
-	0xdb, 0xb2, 0xfa, 0xe7, 0xd8, 0x32, 0x6d, 0x46, 0xdd, 0x26, 0x69, 0xd0, 0xc2, 0xc9, 0x4e, 0xa1,
-	0xe5, 0x14, 0x0c, 0xcb, 0x3c, 0x9e, 0xe7, 0x5b, 0xcc, 0xce, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff,
-	0x36, 0x83, 0x3b, 0x4c, 0xb3, 0x0f, 0x00, 0x00,
+	// 1480 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x57, 0xcb, 0x72, 0xdb, 0x46,
+	0x16, 0x15, 0x09, 0x3d, 0xa8, 0x2b, 0x89, 0x03, 0x77, 0x79, 0x6c, 0x89, 0x2a, 0xdb, 0x1c, 0x6a,
+	0xc6, 0x92, 0x35, 0x23, 0x52, 0x96, 0x3c, 0x76, 0x5c, 0x5e, 0x24, 0x14, 0x09, 0x99, 0xa8, 0x50,
+	0xa0, 0xaa, 0x09, 0x52, 0xa9, 0x2c, 0x8c, 0x6a, 0x11, 0x4d, 0x12, 0x31, 0x01, 0xd0, 0x40, 0x43,
+	0x8a, 0x93, 0xaa, 0x2c, 0xb2, 0xcc, 0x2a, 0xaf, 0x65, 0x2a, 0x5f, 0x10, 0x27, 0xbf, 0x91, 0xc7,
+	0x2a, 0x1f, 0x92, 0x5d, 0x5e, 0xcb, 0x14, 0x1a, 0x20, 0x09, 0xf1, 0x21, 0xca, 0x55, 0xd9, 0x91,
+	0xf7, 0x9c, 0x73, 0xef, 0x69, 0xdc, 0xdb, 0x8d, 0x06, 0xa4, 0x75, 0xd3, 0xc8, 0xb5, 0xcf, 0x35,
+	0x7a, 0x46, 0x2d, 0xe6, 0x6a, 0x66, 0xcb, 0x64, 0x9a, 0x4b, 0x9d, 0x33, 0xa3, 0x41, 0xb3, 0x5d,
+	0xc7, 0x66, 0x36, 0x12, 0x74, 0xd3, 0x48, 0x5d, 0xf3, 0x69, 0x0d, 0xdb, 0x34, 0x6d, 0xcb, 0x0d,
+	0xe2, 0xa9, 0xe5, 0x40, 0x19, 0xfe, 0xbb, 0xd3, 0xb2, 0xed, 0x56, 0x87, 0xe6, 0xf8, 0xbf, 0x53,
+	0xaf, 0x99, 0x63, 0x86, 0x49, 0x5d, 0x46, 0xcc, 0x6e, 0x48, 0x58, 0x1f, 0x26, 0x50, 0xb3, 0xcb,
+	0x5e, 0x06, 0x60, 0xc6, 0x80, 0xc5, 0x3a, 0xe9, 0x78, 0x54, 0x7d, 0xd9, 0xa5, 0x68, 0x0d, 0x16,
+	0x0c, 0x8b, 0x69, 0x67, 0xa4, 0xb3, 0x1a, 0x4b, 0xc7, 0xb6, 0x84, 0xd2, 0x0c, 0x9e, 0x37, 0x2c,
+	0x56, 0x27, 0x1d, 0xb4, 0x0e, 0x09, 0xaf, 0x87, 0xc5, 0xd3, 0xb1, 0xad, 0xd9, 0xd2, 0x0c, 0x5e,
+	0xf0, 0x42, 0xf0, 0x16, 0x2c, 0x36, 0x3b, 0x36, 0x09, 0x50, 0x21, 0x1d, 0xdb, 0x8a, 0x97, 0x66,
+	0x70, 0x82, 0x87, 0xea, 0xa4, 0x73, 0x30, 0x07, 0xc2, 0x19, 0xe9, 0x64, 0x30, 0xc0, 0x09, 0x61,
+	0xd4, 0x39, 0x22, 0xce, 0x73, 0x17, 0x65, 0x60, 0xb6, 0x6d, 0xb4, 0xda, 0xbc, 0xd0, 0xd2, 0x5e,
+	0x32, 0xab, 0x9b, 0x46, 0xb6, 0xef, 0x04, 0x73, 0x0c, 0xa5, 0x41, 0xe8, 0xd8, 0xe7, 0xbc, 0xde,
+	0x28, 0xc5, 0x87, 0x32, 0xcf, 0x01, 0xd4, 0xb6, 0x43, 0xdd, 0xb6, 0xdd, 0xd1, 0x5d, 0xb4, 0x09,
+	0x73, 0x5e, 0xb7, 0x4b, 0x9d, 0x30, 0xe9, 0x3f, 0xb8, 0x62, 0x50, 0xb3, 0x34, 0x83, 0x03, 0xdc,
+	0x27, 0x76, 0xec, 0x73, 0xea, 0x84, 0xa9, 0xc7, 0x11, 0x39, 0x7e, 0xb0, 0x04, 0x8b, 0xac, 0x97,
+	0x3f, 0xf3, 0x11, 0x5c, 0xef, 0x17, 0x93, 0xad, 0xa6, 0xed, 0x98, 0x84, 0x19, 0xb6, 0x85, 0xfe,
+	0x0f, 0x49, 0xfb, 0xd4, 0x6f, 0x1d, 0xd5, 0xfd, 0x27, 0xe0, 0xd1, 0x09, 0x8b, 0x5a, 0xe9, 0xb1,
+	0x78, 0x08, 0xe5, 0x00, 0xfa, 0xb9, 0xdd, 0x0b, 0x4e, 0x06, 0x4b, 0xc2, 0x11, 0x4a, 0xe6, 0x93,
+	0x18, 0x24, 0x24, 0x7f, 0x5a, 0x0a, 0xcd, 0x16, 0xda, 0x82, 0x04, 0x9f, 0x1c, 0xcd, 0xd0, 0x79,
+	0xb9, 0xe4, 0xde, 0x0a, 0xd7, 0x72, 0x82, 0xac, 0xbb, 0x78, 0x81, 0x06, 0xbf, 0xd0, 0x06, 0xac,
+	0x18, 0xae, 0xd6, 0xb0, 0xad, 0xa6, 0xd1, 0xf2, 0x1c, 0xaa, 0xf3, 0x52, 0x09, 0xbc, 0x6c, 0xb8,
+	0x85, 0x7e, 0x6c, 0xc8, 0x8c, 0x30, 0xdd, 0xcc, 0x2e, 0x2c, 0xf2, 0x52, 0xae, 0x6f, 0x66, 0x03,
+	0xe6, 0x0c, 0x46, 0x4d, 0x77, 0x35, 0x96, 0x16, 0xb6, 0x96, 0xa2, 0x4e, 0x0a, 0xcd, 0x16, 0x0e,
+	0xb0, 0xcc, 0xd7, 0x71, 0x40, 0x65, 0xc3, 0x65, 0x81, 0x0c, 0x53, 0xb7, 0x6b, 0x5b, 0x2e, 0x45,
+	0x1b, 0x30, 0xef, 0x32, 0xc2, 0x3c, 0x37, 0x5c, 0xc6, 0x12, 0x17, 0x57, 0x79, 0x08, 0x87, 0x10,
+	0x7a, 0x08, 0xf3, 0x0e, 0x25, 0xae, 0x6d, 0x71, 0xf3, 0xc9, 0xbd, 0xdb, 0x9c, 0x34, 0x9a, 0x2d,
+	0x8b, 0x39, 0x0b, 0x87, 0x6c, 0x74, 0x17, 0xe6, 0x83, 0xfd, 0x15, 0x2e, 0x29, 0x39, 0x70, 0xe6,
+	0x1b, 0xc7, 0x21, 0xea, 0x3f, 0xa3, 0x40, 0xa1, 0xe9, 0x94, 0x11, 0xa3, 0xb3, 0x3a, 0x9b, 0x8e,
+	0x6d, 0x2d, 0xe2, 0xe5, 0x20, 0x58, 0xe4, 0xb1, 0xcc, 0x33, 0x98, 0x0f, 0xd2, 0xa3, 0xeb, 0x20,
+	0xd6, 0x94, 0xa2, 0x74, 0x28, 0x2b, 0x52, 0x51, 0xc3, 0x52, 0xbe, 0x5a, 0x51, 0xc4, 0x19, 0x84,
+	0x20, 0x59, 0x53, 0xde, 0x56, 0x2a, 0x27, 0x8a, 0x56, 0x94, 0xea, 0x72, 0x41, 0x12, 0x63, 0x7e,
+	0x4c, 0x56, 0x54, 0x09, 0x2b, 0xf9, 0xb2, 0x26, 0x61, 0x5c, 0xc1, 0x62, 0x1c, 0xdd, 0x00, 0x14,
+	0xe0, 0x5a, 0x4d, 0xc1, 0x52, 0xbe, 0x50, 0xca, 0x1f, 0x94, 0x25, 0x51, 0xc8, 0xbc, 0x8a, 0x41,
+	0x2a, 0xb4, 0x16, 0x36, 0x86, 0xcf, 0x17, 0xa6, 0x2f, 0x3c, 0xea, 0x32, 0xb4, 0x0d, 0x4b, 0x3a,
+	0xf5, 0x8f, 0x07, 0xcd, 0xf3, 0xc2, 0xa6, 0x2f, 0xed, 0x2d, 0xf2, 0x05, 0xd5, 0x3c, 0x43, 0xc7,
+	0x10, 0xa0, 0xfe, 0x6f, 0xb4, 0x0d, 0x0b, 0x8d, 0x36, 0xb1, 0x5a, 0xd4, 0xbd, 0xb0, 0x7b, 0xfa,
+	0x0b, 0xf7, 0x77, 0x6f, 0x48, 0x40, 0xdb, 0x20, 0x3a, 0xd4, 0xa5, 0x4c, 0x63, 0xb6, 0xa6, 0xd3,
+	0x26, 0xf1, 0x3a, 0x8c, 0x3f, 0xad, 0x44, 0x69, 0x06, 0x27, 0x39, 0xa2, 0xda, 0xc5, 0x20, 0xee,
+	0xef, 0x07, 0xbb, 0x4b, 0x03, 0x5f, 0x99, 0xaf, 0xe2, 0xb0, 0x3e, 0xd6, 0xef, 0xeb, 0x74, 0xf6,
+	0xcd, 0xa1, 0xce, 0x6e, 0x46, 0x8d, 0x8e, 0x4b, 0x3b, 0xdc, 0xe2, 0x91, 0xd6, 0x09, 0x63, 0x5a,
+	0xe7, 0xfc, 0x4d, 0xad, 0xe3, 0xb1, 0x7a, 0xbe, 0x2c, 0x17, 0xb5, 0x42, 0x45, 0x39, 0x94, 0x9f,
+	0x8a, 0xc2, 0x84, 0x76, 0xce, 0x66, 0xbe, 0x8c, 0xc1, 0x0a, 0x5f, 0xc7, 0x11, 0x65, 0xa4, 0x48,
+	0x18, 0x79, 0xad, 0x0e, 0xee, 0x42, 0xb2, 0x61, 0x9b, 0x5d, 0xdb, 0xf2, 0xf7, 0x38, 0xa7, 0xc7,
+	0x87, 0xe9, 0x2b, 0x7d, 0x02, 0x57, 0xfc, 0x27, 0xaa, 0xb0, 0x88, 0x49, 0xc3, 0x27, 0x31, 0xa0,
+	0x29, 0xc4, 0xa4, 0x99, 0x8f, 0xe3, 0x30, 0xc7, 0x6d, 0xa1, 0xc7, 0x90, 0x0c, 0x8e, 0x10, 0x93,
+	0x32, 0xa2, 0x13, 0x46, 0x42, 0x47, 0x68, 0xd0, 0x82, 0x9e, 0x75, 0xbc, 0x42, 0x7b, 0x7f, 0x7d,
+	0xe2, 0x85, 0xd3, 0x27, 0x7e, 0xe9, 0xe9, 0xf3, 0x08, 0x16, 0x1d, 0x62, 0xb8, 0x54, 0xd7, 0xfa,
+	0x9b, 0x30, 0x95, 0x0d, 0xde, 0x48, 0xd9, 0xde, 0x1b, 0x29, 0xab, 0xf6, 0x5e, 0x59, 0x38, 0x11,
+	0x90, 0x55, 0x17, 0xbd, 0x05, 0xc9, 0xfe, 0x71, 0xa3, 0x19, 0x56, 0xd3, 0xe6, 0x7b, 0x72, 0x69,
+	0x6f, 0xed, 0xe2, 0xa9, 0x14, 0x39, 0x88, 0xf1, 0x0a, 0x8b, 0x46, 0xd1, 0x1a, 0x24, 0x88, 0x1e,
+	0x6a, 0xe7, 0xf8, 0xa3, 0x58, 0x20, 0x3a, 0x87, 0xb6, 0x7f, 0x4e, 0x86, 0x47, 0xa9, 0xac, 0xbb,
+	0x68, 0x15, 0xae, 0x4b, 0x75, 0x49, 0x51, 0x35, 0x25, 0x7f, 0xe4, 0x37, 0x31, 0x9c, 0x0e, 0x71,
+	0x06, 0xdd, 0x86, 0x54, 0x80, 0xa8, 0x38, 0xaf, 0x54, 0x0b, 0x92, 0x5c, 0x97, 0xb0, 0x76, 0x5c,
+	0xae, 0x3d, 0xd5, 0x2a, 0x35, 0x55, 0xd4, 0xd1, 0x2d, 0x58, 0x9b, 0x80, 0xcb, 0x8a, 0x48, 0xd1,
+	0x0e, 0xdc, 0x1b, 0x85, 0xeb, 0x95, 0xb2, 0x9a, 0x7f, 0x2a, 0x69, 0xf9, 0x83, 0x4a, 0x5d, 0xd2,
+	0xd4, 0x12, 0x96, 0xaa, 0xa5, 0x4a, 0xb9, 0x28, 0x36, 0x2f, 0xa7, 0x1f, 0x48, 0xe5, 0xca, 0x49,
+	0x84, 0xde, 0x42, 0xf7, 0x61, 0x67, 0x94, 0xae, 0x4a, 0x47, 0xc7, 0x12, 0xce, 0xab, 0x35, 0x3c,
+	0x5a, 0xa1, 0x3d, 0x5d, 0x32, 0x5c, 0xc5, 0x18, 0x6f, 0xaa, 0x50, 0xc3, 0xd8, 0x8f, 0x0d, 0x57,
+	0x78, 0xef, 0x72, 0xfa, 0x70, 0xf6, 0xe7, 0x28, 0x0b, 0xdb, 0xa3, 0x74, 0xfc, 0x8e, 0x76, 0x5c,
+	0x39, 0x91, 0xf0, 0x48, 0xfa, 0xce, 0x14, 0xfe, 0x70, 0x7e, 0x73, 0x3c, 0x5f, 0x9d, 0x94, 0xdf,
+	0x9a, 0xc2, 0x1f, 0xce, 0x6f, 0x8f, 0x1f, 0x80, 0xc3, 0xbc, 0x5c, 0xae, 0x61, 0x49, 0xec, 0xa2,
+	0x47, 0xb0, 0x7f, 0xe5, 0x01, 0xd0, 0xb0, 0x54, 0xa8, 0xd4, 0x25, 0x2c, 0x15, 0xc5, 0x17, 0x97,
+	0x0b, 0x87, 0x6c, 0x44, 0x84, 0x0e, 0x7a, 0x02, 0x8f, 0x5e, 0x6b, 0x28, 0x22, 0x62, 0x77, 0xba,
+	0x78, 0x72, 0x65, 0x36, 0xde, 0xf2, 0x84, 0x41, 0x89, 0x08, 0xbd, 0xcb, 0x85, 0x93, 0x2b, 0x9e,
+	0xa1, 0x37, 0xe0, 0xc1, 0xd5, 0x87, 0x27, 0xa2, 0x3c, 0x9f, 0xa2, 0x9c, 0x5c, 0xf3, 0xfd, 0xf1,
+	0x4a, 0x75, 0x7a, 0xcd, 0x97, 0x53, 0x94, 0x93, 0x6b, 0x7e, 0x80, 0x36, 0x61, 0x63, 0xe2, 0x90,
+	0x45, 0x88, 0x1f, 0xa2, 0x9b, 0x80, 0x02, 0xe2, 0x71, 0xb5, 0x36, 0x38, 0xa6, 0xbe, 0x8f, 0xa1,
+	0x1b, 0x70, 0x6d, 0x08, 0x90, 0x15, 0xf1, 0x87, 0xa1, 0x78, 0x6f, 0x6c, 0x7f, 0x8c, 0xa1, 0x34,
+	0xac, 0x8f, 0xc4, 0x23, 0x95, 0x7e, 0x8a, 0x28, 0x0f, 0xf3, 0x4a, 0x5f, 0xf9, 0x4d, 0x7c, 0x60,
+	0xc1, 0x8f, 0xf7, 0x2d, 0xbc, 0x8a, 0x5f, 0x14, 0xf4, 0x2c, 0x7c, 0x1b, 0x1f, 0x94, 0x8a, 0x24,
+	0x8a, 0x94, 0xfa, 0x2e, 0x8e, 0xee, 0xc1, 0xbf, 0x03, 0x46, 0xe1, 0xb8, 0x36, 0x66, 0x94, 0x0b,
+	0x58, 0x56, 0xe5, 0x42, 0xbe, 0x2c, 0x7e, 0x2a, 0xa0, 0xbb, 0xf0, 0xaf, 0xcb, 0xa8, 0x87, 0x79,
+	0x35, 0x5f, 0x16, 0x3f, 0x13, 0xd0, 0x3e, 0x64, 0xaf, 0x92, 0x32, 0xe2, 0xe3, 0x73, 0x01, 0xed,
+	0xc2, 0x7f, 0xa7, 0x26, 0x8f, 0x28, 0xbe, 0x10, 0x50, 0x0a, 0xfe, 0x19, 0x28, 0x4a, 0x27, 0xe1,
+	0xb5, 0x42, 0xc3, 0x52, 0x55, 0x52, 0xc5, 0x5f, 0x05, 0x94, 0xeb, 0x9d, 0x34, 0x03, 0xec, 0x92,
+	0xb5, 0xfd, 0x26, 0xa0, 0xff, 0xc1, 0xe6, 0x74, 0x41, 0xb0, 0xc2, 0xdf, 0x05, 0xf4, 0xb8, 0x37,
+	0x6d, 0x57, 0x49, 0x1f, 0x71, 0xfd, 0x87, 0x80, 0x1e, 0xc2, 0xfd, 0x2b, 0x16, 0x8a, 0xe8, 0xfe,
+	0x14, 0xf6, 0x7e, 0x89, 0xc1, 0x2d, 0x85, 0x30, 0xe3, 0x8c, 0x06, 0xb7, 0xb7, 0x23, 0x62, 0x91,
+	0x16, 0x35, 0xa9, 0xc5, 0xaa, 0xc1, 0x67, 0x2d, 0x7a, 0x08, 0x30, 0xb8, 0xb2, 0xa3, 0xe0, 0xf3,
+	0xa2, 0x44, 0x1c, 0xfd, 0x9c, 0x38, 0x54, 0x2e, 0xa6, 0x6e, 0x4e, 0xb8, 0xd4, 0xa3, 0x67, 0xb0,
+	0x56, 0xeb, 0xea, 0x84, 0xd1, 0x31, 0xd7, 0x42, 0x74, 0x67, 0xf2, 0x85, 0x91, 0xdf, 0x9b, 0x53,
+	0xe9, 0x69, 0x37, 0x4a, 0xf4, 0x00, 0x96, 0xab, 0xcc, 0xa1, 0xc4, 0x0c, 0x9d, 0xdd, 0x18, 0xb9,
+	0xa0, 0x48, 0xfe, 0x27, 0x73, 0x0a, 0x06, 0x99, 0x76, 0x63, 0x07, 0x4f, 0xde, 0x7d, 0xdc, 0x32,
+	0x58, 0xdb, 0x3b, 0xcd, 0x36, 0x6c, 0x33, 0x67, 0x77, 0xa9, 0xd5, 0xb0, 0x1d, 0x3d, 0x17, 0xdc,
+	0xe1, 0x76, 0xcc, 0xfe, 0xea, 0x77, 0x0c, 0x8b, 0x51, 0xa7, 0x49, 0x1a, 0x34, 0x77, 0xb6, 0x9f,
+	0x6b, 0xd9, 0x39, 0xdd, 0x34, 0x4e, 0xe7, 0x79, 0xea, 0xfd, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff,
+	0x6c, 0x0c, 0x39, 0xe6, 0x06, 0x10, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -1071,6 +1074,8 @@
 	// The default behavior of the device is to report all the supported events
 	// This configuration is persisted across reboots of the device or the device manager
 	UpdateEventsConfiguration(ctx context.Context, in *EventsConfigurationRequest, opts ...grpc.CallOption) (*EventsConfigurationResponse, error)
+	// Initiate the server streaming of the events
+	StreamEvents(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (NativeEventsManagementService_StreamEventsClient, error)
 }
 
 type nativeEventsManagementServiceClient struct {
@@ -1099,6 +1104,38 @@
 	return out, nil
 }
 
+func (c *nativeEventsManagementServiceClient) StreamEvents(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (NativeEventsManagementService_StreamEventsClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeEventsManagementService_serviceDesc.Streams[0], "/dmi.NativeEventsManagementService/StreamEvents", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeEventsManagementServiceStreamEventsClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeEventsManagementService_StreamEventsClient interface {
+	Recv() (*Event, error)
+	grpc.ClientStream
+}
+
+type nativeEventsManagementServiceStreamEventsClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeEventsManagementServiceStreamEventsClient) Recv() (*Event, error) {
+	m := new(Event)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
 // NativeEventsManagementServiceServer is the server API for NativeEventsManagementService service.
 type NativeEventsManagementServiceServer interface {
 	// List the supported events for the passed device
@@ -1107,6 +1144,8 @@
 	// The default behavior of the device is to report all the supported events
 	// This configuration is persisted across reboots of the device or the device manager
 	UpdateEventsConfiguration(context.Context, *EventsConfigurationRequest) (*EventsConfigurationResponse, error)
+	// Initiate the server streaming of the events
+	StreamEvents(*empty.Empty, NativeEventsManagementService_StreamEventsServer) error
 }
 
 // UnimplementedNativeEventsManagementServiceServer can be embedded to have forward compatible implementations.
@@ -1119,6 +1158,9 @@
 func (*UnimplementedNativeEventsManagementServiceServer) UpdateEventsConfiguration(ctx context.Context, req *EventsConfigurationRequest) (*EventsConfigurationResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method UpdateEventsConfiguration not implemented")
 }
+func (*UnimplementedNativeEventsManagementServiceServer) StreamEvents(req *empty.Empty, srv NativeEventsManagementService_StreamEventsServer) error {
+	return status.Errorf(codes.Unimplemented, "method StreamEvents not implemented")
+}
 
 func RegisterNativeEventsManagementServiceServer(s *grpc.Server, srv NativeEventsManagementServiceServer) {
 	s.RegisterService(&_NativeEventsManagementService_serviceDesc, srv)
@@ -1160,6 +1202,27 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _NativeEventsManagementService_StreamEvents_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(empty.Empty)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeEventsManagementServiceServer).StreamEvents(m, &nativeEventsManagementServiceStreamEventsServer{stream})
+}
+
+type NativeEventsManagementService_StreamEventsServer interface {
+	Send(*Event) error
+	grpc.ServerStream
+}
+
+type nativeEventsManagementServiceStreamEventsServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeEventsManagementServiceStreamEventsServer) Send(m *Event) error {
+	return x.ServerStream.SendMsg(m)
+}
+
 var _NativeEventsManagementService_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "dmi.NativeEventsManagementService",
 	HandlerType: (*NativeEventsManagementServiceServer)(nil),
@@ -1173,6 +1236,12 @@
 			Handler:    _NativeEventsManagementService_UpdateEventsConfiguration_Handler,
 		},
 	},
-	Streams:  []grpc.StreamDesc{},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "StreamEvents",
+			Handler:       _NativeEventsManagementService_StreamEvents_Handler,
+			ServerStreams: true,
+		},
+	},
 	Metadata: "dmi/hw_events_mgmt_service.proto",
 }
diff --git a/go/dmi/hw_metrics_mgmt_service.pb.go b/go/dmi/hw_metrics_mgmt_service.pb.go
index e3d211f..93426b0 100644
--- a/go/dmi/hw_metrics_mgmt_service.pb.go
+++ b/go/dmi/hw_metrics_mgmt_service.pb.go
@@ -7,6 +7,7 @@
 	context "context"
 	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
+	empty "github.com/golang/protobuf/ptypes/empty"
 	grpc "google.golang.org/grpc"
 	codes "google.golang.org/grpc/codes"
 	status "google.golang.org/grpc/status"
@@ -587,7 +588,7 @@
 	return ""
 }
 
-// The Metrics are conveyed to external systems by submitting them on a kafka bus.
+// The Metrics are conveyed to external systems either by submitting them on a message bus or using gRPC server streaming.
 // The topic to which are Metrics are submitted would be configured as startup
 // configuration of the components
 type Metric struct {
@@ -774,82 +775,85 @@
 func init() { proto.RegisterFile("dmi/hw_metrics_mgmt_service.proto", fileDescriptor_6b6c2f1384c11ff5) }
 
 var fileDescriptor_6b6c2f1384c11ff5 = []byte{
-	// 1198 bytes of a gzipped FileDescriptorProto
+	// 1242 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x4d, 0x6f, 0xdb, 0x46,
-	0x13, 0x36, 0xa9, 0xc4, 0x89, 0x57, 0xb6, 0x42, 0xaf, 0xf3, 0xa1, 0x38, 0xc9, 0x1b, 0x59, 0xc1,
-	0x5b, 0x08, 0x69, 0x23, 0x07, 0x0e, 0x8a, 0x7e, 0xe5, 0x50, 0x9a, 0xdc, 0xd8, 0x44, 0x28, 0x4a,
-	0x58, 0x91, 0x72, 0xd2, 0x43, 0x17, 0x1b, 0x71, 0x23, 0x13, 0x10, 0x49, 0x95, 0xa4, 0x9c, 0x9f,
-	0x50, 0xf4, 0xd6, 0xb4, 0xe8, 0x4f, 0x68, 0x4f, 0xfd, 0xfe, 0x01, 0xbd, 0x15, 0xe8, 0xe7, 0xbd,
-	0xfd, 0x1f, 0x6d, 0x81, 0xde, 0x0a, 0xee, 0x52, 0xca, 0x5a, 0x96, 0x9b, 0xba, 0xe8, 0x4d, 0x7a,
-	0xe6, 0x99, 0x99, 0x67, 0x66, 0x96, 0xb3, 0x0b, 0x36, 0xfc, 0x30, 0xd8, 0xdc, 0x7f, 0x42, 0x42,
-	0x96, 0x25, 0x41, 0x3f, 0x25, 0xe1, 0x20, 0xcc, 0x48, 0xca, 0x92, 0x83, 0xa0, 0xcf, 0x9a, 0xa3,
-	0x24, 0xce, 0x62, 0x58, 0xf2, 0xc3, 0x60, 0x7d, 0x35, 0xe7, 0xf5, 0xe3, 0x30, 0x8c, 0xa3, 0x54,
-	0xe0, 0xeb, 0xcb, 0xc2, 0x55, 0xfc, 0xab, 0xbf, 0xab, 0x80, 0xe5, 0x16, 0x0f, 0x62, 0xc4, 0xd1,
-	0xe3, 0x60, 0x00, 0x6f, 0x81, 0x25, 0x11, 0x94, 0x04, 0x7e, 0x55, 0xa9, 0x29, 0x8d, 0xca, 0x96,
-	0xd6, 0xf4, 0xc3, 0xa0, 0x29, 0x58, 0x0e, 0x0d, 0x59, 0x8a, 0xcf, 0x0a, 0x8a, 0xe5, 0xc3, 0x1b,
-	0x60, 0x25, 0x48, 0x49, 0x9f, 0xfb, 0x8e, 0x13, 0xe6, 0x57, 0xd5, 0x9a, 0xd2, 0x38, 0x8b, 0x97,
-	0x83, 0xd4, 0x98, 0x62, 0x39, 0x69, 0x14, 0x0f, 0x87, 0x24, 0x88, 0x32, 0x96, 0x1c, 0xd0, 0x61,
-	0xb5, 0x54, 0x53, 0x1a, 0x2b, 0x78, 0x39, 0x07, 0xad, 0x02, 0xab, 0xdf, 0x05, 0x2b, 0x22, 0x45,
-	0xe1, 0x09, 0x5f, 0x04, 0x67, 0x8a, 0xf2, 0xaa, 0x4a, 0xad, 0xd4, 0x28, 0x6f, 0xad, 0x4a, 0x3a,
-	0x04, 0x07, 0x4f, 0x18, 0xf5, 0x4f, 0x54, 0xb0, 0x66, 0x07, 0x69, 0x56, 0x84, 0xc0, 0x2c, 0x1d,
-	0xc5, 0x51, 0xca, 0xe0, 0x0d, 0xb0, 0x98, 0x66, 0x34, 0x1b, 0xa7, 0x45, 0x2d, 0x65, 0x1e, 0xa3,
-	0xcb, 0x21, 0x5c, 0x98, 0xe0, 0x2b, 0x60, 0x31, 0x61, 0x34, 0x8d, 0x23, 0xae, 0xbe, 0xb2, 0x75,
-	0x9d, 0x93, 0xe6, 0x84, 0x6b, 0x62, 0x4e, 0xc3, 0x05, 0x1d, 0xbe, 0xf4, 0x4c, 0x62, 0x5e, 0x52,
-	0x79, 0x0b, 0x4a, 0x12, 0xd3, 0x19, 0x8d, 0x79, 0x1b, 0x84, 0x1f, 0xf1, 0x59, 0x46, 0x83, 0x61,
-	0xf5, 0x54, 0x4d, 0x69, 0x2c, 0xe1, 0x65, 0x01, 0x9a, 0x1c, 0xab, 0xbf, 0x0d, 0x16, 0x45, 0x12,
-	0x78, 0x1e, 0x68, 0x9e, 0x63, 0xa2, 0x7b, 0x96, 0x83, 0x4c, 0x82, 0x91, 0xde, 0x6d, 0x3b, 0xda,
-	0x02, 0x84, 0xa0, 0xe2, 0x39, 0xf7, 0x9d, 0xf6, 0x9e, 0x43, 0x4c, 0xd4, 0xb3, 0x0c, 0xa4, 0x29,
-	0x39, 0x66, 0x39, 0x2e, 0xc2, 0x8e, 0x6e, 0x13, 0x84, 0x71, 0x1b, 0x6b, 0x2a, 0xbc, 0x08, 0xa0,
-	0xb0, 0x13, 0xcf, 0xc1, 0x48, 0x37, 0x76, 0xf5, 0x6d, 0x1b, 0x69, 0xa5, 0xfa, 0xd7, 0x0a, 0xb8,
-	0x72, 0x48, 0xdf, 0x38, 0xa1, 0x59, 0x10, 0x47, 0x98, 0xbd, 0x33, 0x66, 0x69, 0x06, 0x6f, 0x82,
-	0xb2, 0xcf, 0xf2, 0x63, 0x44, 0xc6, 0xe3, 0xe2, 0x04, 0x94, 0xb7, 0x96, 0x78, 0x59, 0xde, 0x38,
-	0xf0, 0x31, 0x10, 0xd6, 0xfc, 0x37, 0x6c, 0x82, 0x33, 0xfd, 0x7d, 0x1a, 0x0d, 0x58, 0xca, 0x1b,
-	0x37, 0xb7, 0xfc, 0xdd, 0x05, 0x3c, 0x21, 0xc1, 0x9b, 0x40, 0x4b, 0x58, 0xca, 0x32, 0x92, 0xc5,
-	0xc4, 0x67, 0x8f, 0xe9, 0x78, 0x98, 0xf1, 0xbe, 0x9d, 0xdd, 0x5d, 0xc0, 0x15, 0x6e, 0x71, 0x63,
-	0x53, 0xe0, 0xdb, 0x65, 0xb0, 0x14, 0x8f, 0x98, 0xd0, 0x56, 0xff, 0x46, 0x05, 0x57, 0xe7, 0x8b,
-	0x3e, 0xc9, 0x98, 0xdf, 0x9c, 0x19, 0x73, 0xe3, 0xa8, 0xda, 0x99, 0xb8, 0xb3, 0xf3, 0x3e, 0x32,
-	0xc1, 0xd2, 0x9c, 0x09, 0x3e, 0x55, 0xfe, 0xa3, 0x11, 0x5e, 0x03, 0x97, 0x3b, 0x6d, 0xdb, 0x26,
-	0xdc, 0xd0, 0xd3, 0x6d, 0xe2, 0x39, 0x5d, 0xaf, 0xd3, 0x69, 0x63, 0x17, 0x99, 0x5a, 0x49, 0xb8,
-	0xf4, 0x74, 0xdb, 0x32, 0x49, 0x0b, 0xb9, 0xd8, 0x32, 0xb4, 0x53, 0xc7, 0x4c, 0xfd, 0x74, 0xfd,
-	0x23, 0x05, 0x54, 0x44, 0xa1, 0x2d, 0x96, 0x51, 0x93, 0x66, 0xf4, 0x44, 0x83, 0xbe, 0x0d, 0x2a,
-	0xfd, 0x38, 0x1c, 0xc5, 0x11, 0x8b, 0x32, 0x41, 0x57, 0x67, 0xe9, 0x2b, 0x53, 0x02, 0xf7, 0xf8,
-	0xbf, 0xec, 0x11, 0xd1, 0x90, 0x15, 0xad, 0x7a, 0x46, 0xcb, 0x37, 0x49, 0xfd, 0x63, 0x05, 0x2c,
-	0x0a, 0x5d, 0x27, 0x5d, 0x3c, 0x77, 0xc1, 0xb9, 0x82, 0x1e, 0xb2, 0x8c, 0xfa, 0x34, 0xa3, 0x85,
-	0xa6, 0x35, 0xc9, 0x69, 0x52, 0x2c, 0xae, 0x84, 0xd3, 0xff, 0x39, 0x15, 0x36, 0xc1, 0xe9, 0x03,
-	0x3a, 0x1c, 0xb3, 0xe2, 0xb3, 0xad, 0x72, 0x1f, 0x63, 0x22, 0xad, 0xcb, 0xa2, 0x34, 0x4e, 0xb8,
-	0xa3, 0xa0, 0xd5, 0x53, 0xa0, 0xed, 0xb0, 0x62, 0x1b, 0x4c, 0xbe, 0x94, 0xdb, 0x5c, 0x30, 0x25,
-	0x3c, 0xb7, 0x72, 0x7c, 0xee, 0x5c, 0xb3, 0x68, 0xf9, 0xa1, 0x12, 0xd5, 0xe7, 0x95, 0x58, 0xff,
-	0x56, 0x05, 0xab, 0x52, 0xd6, 0x93, 0x1c, 0xf5, 0x97, 0x67, 0x8e, 0xfa, 0x35, 0x4e, 0x3a, 0x12,
-	0xec, 0xe8, 0xf9, 0x5e, 0x14, 0xd9, 0x8b, 0xbe, 0x94, 0x25, 0x75, 0xb8, 0x30, 0xfd, 0xb3, 0x35,
-	0xf6, 0xde, 0xbf, 0xf9, 0x08, 0x2e, 0x80, 0xd5, 0x09, 0x66, 0xb4, 0x5b, 0x9d, 0xb6, 0x83, 0x1c,
-	0x57, 0x53, 0xe7, 0x7c, 0x1b, 0x27, 0x3a, 0xfc, 0x37, 0x7f, 0x3d, 0x0d, 0xca, 0x52, 0x87, 0xe1,
-	0x65, 0x70, 0x41, 0xf8, 0x10, 0x47, 0x6f, 0xe5, 0xe4, 0x42, 0x9c, 0xb6, 0x90, 0x6b, 0x2d, 0x4c,
-	0xf7, 0x74, 0x87, 0x74, 0x3b, 0x08, 0x99, 0x9a, 0x02, 0xd7, 0xc0, 0xb9, 0x02, 0x35, 0x3a, 0x1e,
-	0x71, 0x51, 0xab, 0xa3, 0xf9, 0xf0, 0x3a, 0xb8, 0x22, 0x81, 0x5e, 0x57, 0xdf, 0x41, 0xa4, 0x83,
-	0xb0, 0x81, 0x1c, 0x57, 0xdf, 0x41, 0x1a, 0x83, 0x57, 0xc1, 0xa5, 0x82, 0xe0, 0x62, 0xdd, 0xe9,
-	0x1a, 0xc8, 0xea, 0x21, 0x2c, 0xbc, 0xbf, 0x53, 0xe0, 0x75, 0xb0, 0x3e, 0xc7, 0xda, 0x6b, 0xdb,
-	0xdc, 0xfb, 0x7b, 0xe5, 0x18, 0xf7, 0x6d, 0x4b, 0xef, 0x6a, 0x3f, 0x28, 0xb0, 0x36, 0xcd, 0x2e,
-	0x5b, 0xf1, 0x03, 0xd2, 0x69, 0xef, 0x21, 0xac, 0xfd, 0x78, 0x1c, 0xc3, 0x9d, 0x30, 0x7e, 0x52,
-	0x60, 0x1d, 0x5c, 0x9b, 0xc3, 0xd8, 0xd3, 0x7b, 0xc8, 0x46, 0xce, 0x8e, 0xbb, 0xab, 0xfd, 0x9c,
-	0x8f, 0x64, 0xd2, 0x10, 0xd3, 0xea, 0xde, 0x17, 0xea, 0x3f, 0x55, 0xe1, 0x65, 0x70, 0x5e, 0x86,
-	0x0d, 0xbd, 0xa3, 0x1b, 0x96, 0xfb, 0x50, 0xfb, 0x2c, 0xbf, 0x78, 0x56, 0x65, 0x13, 0x6f, 0x8c,
-	0xf6, 0xb9, 0x0a, 0x37, 0xc0, 0xd5, 0x23, 0xb8, 0xdc, 0xb0, 0x2f, 0x54, 0xf8, 0x02, 0xd8, 0x90,
-	0x29, 0x18, 0xe9, 0x26, 0xd9, 0xc3, 0x96, 0x7b, 0x88, 0xf7, 0xa5, 0x0a, 0x1b, 0xe0, 0x86, 0xcc,
-	0xbb, 0xa7, 0x7b, 0xb6, 0xfb, 0x90, 0x18, 0xc8, 0xb6, 0xbb, 0x32, 0xf3, 0x2b, 0x15, 0x9e, 0x9f,
-	0x4e, 0x0e, 0xeb, 0x2d, 0xa1, 0xfe, 0xfd, 0x12, 0xac, 0x82, 0x35, 0x09, 0x9d, 0x8a, 0x7f, 0x5a,
-	0x92, 0xca, 0xcd, 0x2d, 0x42, 0xfb, 0x07, 0x25, 0xa9, 0x97, 0x53, 0x58, 0x4e, 0xf4, 0xa1, 0xec,
-	0xc8, 0xdb, 0x4b, 0x5a, 0xfa, 0x03, 0xed, 0xb7, 0x12, 0xbc, 0x04, 0xe0, 0x21, 0x58, 0x44, 0xfc,
-	0xbd, 0x24, 0xf5, 0x5e, 0x32, 0xc8, 0x31, 0xff, 0x90, 0x39, 0x96, 0xe3, 0x20, 0x4c, 0xba, 0x1e,
-	0xc6, 0x6d, 0xcf, 0x31, 0x2d, 0x67, 0x47, 0x94, 0xf2, 0xcb, 0xa9, 0xad, 0x3f, 0x15, 0xf0, 0x3f,
-	0x87, 0x66, 0xc1, 0x01, 0x2b, 0xee, 0xb1, 0x16, 0x8d, 0xe8, 0x80, 0x85, 0x7c, 0x8b, 0xf1, 0xe7,
-	0x20, 0x7c, 0x15, 0x94, 0xa5, 0xa7, 0x0c, 0x3c, 0xc7, 0xbf, 0xe9, 0x5d, 0x9a, 0xf8, 0x4f, 0x68,
-	0xc2, 0x2c, 0x73, 0xbd, 0x7a, 0xdc, 0x6b, 0x07, 0x52, 0xb0, 0xee, 0x8d, 0x7c, 0x9a, 0xb1, 0x79,
-	0x77, 0x24, 0xac, 0xfd, 0xcd, 0xf5, 0xc9, 0x37, 0xe4, 0xfa, 0xc6, 0x73, 0x2f, 0x58, 0xf8, 0x3a,
-	0x58, 0x9a, 0x6e, 0x25, 0x78, 0x61, 0x76, 0x4b, 0x89, 0x30, 0x17, 0xe7, 0x2f, 0xaf, 0xed, 0x37,
-	0xde, 0x7a, 0x6d, 0x10, 0x64, 0xfb, 0xe3, 0x47, 0xcd, 0x7e, 0x1c, 0x6e, 0xc6, 0x23, 0x16, 0xf5,
-	0xe3, 0xc4, 0xdf, 0x14, 0xf7, 0xd6, 0xad, 0x70, 0xda, 0x88, 0x5b, 0xfc, 0xdd, 0xf9, 0x98, 0xf6,
-	0xd9, 0xe6, 0xc1, 0x9d, 0xcd, 0x41, 0xbc, 0xe9, 0x87, 0xc1, 0xa3, 0x45, 0xfe, 0xfe, 0xbd, 0xf3,
-	0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa4, 0xee, 0x26, 0xad, 0x4a, 0x0b, 0x00, 0x00,
+	0x13, 0x36, 0xa9, 0xc4, 0x89, 0x57, 0xb6, 0x42, 0xaf, 0xf3, 0xa1, 0x28, 0xc9, 0x1b, 0x59, 0xc1,
+	0x5b, 0x08, 0x69, 0x23, 0x05, 0x0e, 0xfa, 0x9d, 0x43, 0x69, 0x72, 0x63, 0x13, 0x91, 0x28, 0x61,
+	0x45, 0xda, 0x49, 0x0f, 0x5d, 0x6c, 0xc4, 0xb5, 0x4c, 0x40, 0x24, 0x55, 0x92, 0x72, 0xd0, 0x5f,
+	0x50, 0xf4, 0xd6, 0xb4, 0xe8, 0x4f, 0x68, 0x4f, 0xfd, 0x4a, 0x7f, 0x40, 0x6f, 0x05, 0xfa, 0x79,
+	0x6f, 0xff, 0x47, 0xdb, 0x73, 0xc1, 0x5d, 0x4a, 0x59, 0xcb, 0x72, 0x53, 0x17, 0xbd, 0x49, 0xcf,
+	0x3c, 0x33, 0xf3, 0xcc, 0xcc, 0x72, 0x76, 0xc1, 0xba, 0x17, 0xf8, 0xcd, 0xfd, 0xc7, 0x24, 0x60,
+	0x69, 0xec, 0xf7, 0x13, 0x12, 0x0c, 0x82, 0x94, 0x24, 0x2c, 0x3e, 0xf0, 0xfb, 0xac, 0x31, 0x8a,
+	0xa3, 0x34, 0x82, 0x05, 0x2f, 0xf0, 0x2b, 0xab, 0x19, 0xaf, 0x1f, 0x05, 0x41, 0x14, 0x26, 0x02,
+	0xaf, 0x2c, 0x0b, 0xd7, 0xfc, 0xdf, 0x95, 0x41, 0x14, 0x0d, 0x86, 0xac, 0xc9, 0xff, 0x3d, 0x1a,
+	0xef, 0x35, 0x59, 0x30, 0x4a, 0xdf, 0x13, 0xc6, 0xda, 0xfb, 0x0a, 0x58, 0x6e, 0xf3, 0x0c, 0x46,
+	0x14, 0xee, 0xf9, 0x03, 0x78, 0x0b, 0x2c, 0x89, 0x8c, 0xc4, 0xf7, 0xca, 0x4a, 0x55, 0xa9, 0x97,
+	0x36, 0xb4, 0x86, 0x17, 0xf8, 0x0d, 0xc1, 0xb2, 0x69, 0xc0, 0x12, 0x7c, 0x56, 0x50, 0x2c, 0x0f,
+	0xde, 0x00, 0x2b, 0x7e, 0x42, 0xfa, 0xdc, 0x77, 0x1c, 0x33, 0xaf, 0xac, 0x56, 0x95, 0xfa, 0x59,
+	0xbc, 0xec, 0x27, 0xc6, 0x14, 0xcb, 0x48, 0xa3, 0x68, 0x38, 0x24, 0x7e, 0x98, 0xb2, 0xf8, 0x80,
+	0x0e, 0xcb, 0x85, 0xaa, 0x52, 0x5f, 0xc1, 0xcb, 0x19, 0x68, 0xe5, 0x58, 0xed, 0x2e, 0x58, 0x11,
+	0x29, 0x72, 0x4f, 0xf8, 0x22, 0x38, 0x93, 0xd7, 0x5e, 0x56, 0xaa, 0x85, 0x7a, 0x71, 0x63, 0x55,
+	0xd2, 0x21, 0x38, 0x78, 0xc2, 0xa8, 0x7d, 0xa6, 0x82, 0xb5, 0x96, 0x9f, 0xa4, 0x79, 0x08, 0xcc,
+	0x92, 0x51, 0x14, 0x26, 0x0c, 0xde, 0x00, 0x8b, 0x49, 0x4a, 0xd3, 0x71, 0x92, 0xd7, 0x52, 0xe4,
+	0x31, 0x7a, 0x1c, 0xc2, 0xb9, 0x09, 0xbe, 0x0a, 0x16, 0x63, 0x46, 0x93, 0x28, 0xe4, 0xea, 0x4b,
+	0x1b, 0xd7, 0x39, 0x69, 0x4e, 0xb8, 0x06, 0xe6, 0x34, 0x9c, 0xd3, 0xe1, 0x4b, 0xcf, 0x24, 0x66,
+	0x25, 0x15, 0x37, 0xa0, 0x24, 0x31, 0x99, 0xd1, 0x98, 0xb5, 0x41, 0xf8, 0x11, 0x8f, 0xa5, 0xd4,
+	0x1f, 0x96, 0x4f, 0x55, 0x95, 0xfa, 0x12, 0x5e, 0x16, 0xa0, 0xc9, 0xb1, 0xda, 0x3b, 0x60, 0x51,
+	0x24, 0x81, 0xe7, 0x81, 0xe6, 0xda, 0x26, 0xba, 0x67, 0xd9, 0xc8, 0x24, 0x18, 0xe9, 0xbd, 0x8e,
+	0xad, 0x2d, 0x40, 0x08, 0x4a, 0xae, 0x7d, 0xdf, 0xee, 0xec, 0xda, 0xc4, 0x44, 0x3b, 0x96, 0x81,
+	0x34, 0x25, 0xc3, 0x2c, 0xdb, 0x41, 0xd8, 0xd6, 0x5b, 0x04, 0x61, 0xdc, 0xc1, 0x9a, 0x0a, 0x2f,
+	0x02, 0x28, 0xec, 0xc4, 0xb5, 0x31, 0xd2, 0x8d, 0x6d, 0x7d, 0xb3, 0x85, 0xb4, 0x42, 0xed, 0x1b,
+	0x05, 0x5c, 0x39, 0xa4, 0x6f, 0x1c, 0xd3, 0xd4, 0x8f, 0x42, 0xcc, 0xde, 0x1d, 0xb3, 0x24, 0x85,
+	0x37, 0x41, 0xd1, 0x63, 0xd9, 0x19, 0x23, 0xe3, 0x71, 0x7e, 0x02, 0x8a, 0x1b, 0x4b, 0xbc, 0x2c,
+	0x77, 0xec, 0x7b, 0x18, 0x08, 0x6b, 0xf6, 0x1b, 0x36, 0xc0, 0x99, 0xfe, 0x3e, 0x0d, 0x07, 0x2c,
+	0xe1, 0x8d, 0x9b, 0x5b, 0xfe, 0xf6, 0x02, 0x9e, 0x90, 0xe0, 0x4d, 0xa0, 0xc5, 0x2c, 0x61, 0x29,
+	0x49, 0x23, 0xe2, 0xb1, 0x3d, 0x3a, 0x1e, 0xa6, 0xbc, 0x6f, 0x67, 0xb7, 0x17, 0x70, 0x89, 0x5b,
+	0x9c, 0xc8, 0x14, 0xf8, 0x66, 0x11, 0x2c, 0x45, 0x23, 0x26, 0xb4, 0xd5, 0xbe, 0x55, 0xc1, 0xd5,
+	0xf9, 0xa2, 0x4f, 0x32, 0xe6, 0xb7, 0x66, 0xc6, 0x5c, 0x3f, 0xaa, 0x76, 0x26, 0xee, 0xec, 0xbc,
+	0x8f, 0x4c, 0xb0, 0x30, 0x67, 0x82, 0x4f, 0x94, 0xff, 0x68, 0x84, 0xd7, 0xc0, 0xe5, 0x6e, 0xa7,
+	0xd5, 0x22, 0xdc, 0xb0, 0xa3, 0xb7, 0x88, 0x6b, 0xf7, 0xdc, 0x6e, 0xb7, 0x83, 0x1d, 0x64, 0x6a,
+	0x05, 0xe1, 0xb2, 0xa3, 0xb7, 0x2c, 0x93, 0xb4, 0x91, 0x83, 0x2d, 0x43, 0x3b, 0x75, 0xcc, 0xd4,
+	0x4f, 0xd7, 0x3e, 0x51, 0x40, 0x49, 0x14, 0xda, 0x66, 0x29, 0x35, 0x69, 0x4a, 0x4f, 0x34, 0xe8,
+	0xdb, 0xa0, 0xd4, 0x8f, 0x82, 0x51, 0x14, 0xb2, 0x30, 0x15, 0x74, 0x75, 0x96, 0xbe, 0x32, 0x25,
+	0x70, 0x8f, 0xff, 0xcb, 0x1e, 0x21, 0x0d, 0x58, 0xde, 0xaa, 0x67, 0xb4, 0x6c, 0x93, 0xd4, 0x3e,
+	0x55, 0xc0, 0xa2, 0xd0, 0x75, 0xd2, 0xc5, 0x73, 0x17, 0x9c, 0xcb, 0xe9, 0x01, 0x4b, 0xa9, 0x47,
+	0x53, 0x9a, 0x6b, 0x5a, 0x93, 0x9c, 0x26, 0xc5, 0xe2, 0x52, 0x30, 0xfd, 0x9f, 0x51, 0x61, 0x03,
+	0x9c, 0x3e, 0xa0, 0xc3, 0x31, 0xcb, 0x3f, 0xdb, 0x32, 0xf7, 0x31, 0x26, 0xd2, 0x7a, 0x2c, 0x4c,
+	0xa2, 0x98, 0x3b, 0x0a, 0x5a, 0x2d, 0x01, 0xda, 0x16, 0xcb, 0xb7, 0xc1, 0xe4, 0x4b, 0xb9, 0xcd,
+	0x05, 0x53, 0xc2, 0x73, 0x2b, 0xc7, 0xe7, 0xce, 0x34, 0x8b, 0x96, 0x1f, 0x2a, 0x51, 0x7d, 0x5e,
+	0x89, 0xb5, 0xef, 0x54, 0xb0, 0x2a, 0x65, 0x3d, 0xc9, 0x51, 0x7f, 0x79, 0xe6, 0xa8, 0x5f, 0xe3,
+	0xa4, 0x23, 0xc1, 0x8e, 0x9e, 0xef, 0x45, 0x91, 0x3d, 0xef, 0x4b, 0x51, 0x52, 0x87, 0x73, 0xd3,
+	0x3f, 0x5b, 0x63, 0x1f, 0xfc, 0x9b, 0x8f, 0xe0, 0x02, 0x58, 0x9d, 0x60, 0x46, 0xa7, 0xdd, 0xed,
+	0xd8, 0xc8, 0x76, 0x34, 0x75, 0xce, 0xb7, 0x71, 0xa2, 0xc3, 0x7f, 0xf3, 0xb7, 0xd3, 0xa0, 0x28,
+	0x75, 0x18, 0x5e, 0x06, 0x17, 0x84, 0x0f, 0xb1, 0xf5, 0x76, 0x46, 0xce, 0xc5, 0x69, 0x0b, 0x99,
+	0xd6, 0xdc, 0x74, 0x4f, 0xb7, 0x49, 0xaf, 0x8b, 0x90, 0xa9, 0x29, 0x70, 0x0d, 0x9c, 0xcb, 0x51,
+	0xa3, 0xeb, 0x12, 0x07, 0xb5, 0xbb, 0x9a, 0x07, 0xaf, 0x83, 0x2b, 0x12, 0xe8, 0xf6, 0xf4, 0x2d,
+	0x44, 0xba, 0x08, 0x1b, 0xc8, 0x76, 0xf4, 0x2d, 0xa4, 0x31, 0x78, 0x15, 0x5c, 0xca, 0x09, 0x0e,
+	0xd6, 0xed, 0x9e, 0x81, 0xac, 0x1d, 0x84, 0x85, 0xf7, 0xf7, 0x0a, 0xbc, 0x0e, 0x2a, 0x73, 0xac,
+	0x3b, 0x9d, 0x16, 0xf7, 0xfe, 0x41, 0x39, 0xc6, 0x7d, 0xd3, 0xd2, 0x7b, 0xda, 0x8f, 0x0a, 0xac,
+	0x4e, 0xb3, 0xcb, 0x56, 0xfc, 0x80, 0x74, 0x3b, 0xbb, 0x08, 0x6b, 0x3f, 0x1d, 0xc7, 0x70, 0x26,
+	0x8c, 0x9f, 0x15, 0x58, 0x03, 0xd7, 0xe6, 0x30, 0x76, 0xf5, 0x1d, 0xd4, 0x42, 0xf6, 0x96, 0xb3,
+	0xad, 0xfd, 0x92, 0x8d, 0x64, 0xd2, 0x10, 0xd3, 0xea, 0xdd, 0x17, 0xea, 0x3f, 0x57, 0xe1, 0x65,
+	0x70, 0x5e, 0x86, 0x0d, 0xbd, 0xab, 0x1b, 0x96, 0xf3, 0x50, 0xfb, 0x22, 0xbb, 0x78, 0x56, 0x65,
+	0x13, 0x6f, 0x8c, 0xf6, 0xa5, 0x0a, 0xd7, 0xc1, 0xd5, 0x23, 0xb8, 0xdc, 0xb0, 0xaf, 0x54, 0xf8,
+	0x02, 0x58, 0x97, 0x29, 0x18, 0xe9, 0x26, 0xd9, 0xc5, 0x96, 0x73, 0x88, 0xf7, 0xb5, 0x0a, 0xeb,
+	0xe0, 0x86, 0xcc, 0xbb, 0xa7, 0xbb, 0x2d, 0xe7, 0x21, 0x31, 0x50, 0xab, 0xd5, 0x93, 0x99, 0x4f,
+	0x55, 0x78, 0x7e, 0x3a, 0x39, 0xac, 0xb7, 0x85, 0xfa, 0x0f, 0x0b, 0xb0, 0x0c, 0xd6, 0x24, 0x74,
+	0x2a, 0xfe, 0x49, 0x41, 0x2a, 0x37, 0xb3, 0x08, 0xed, 0x1f, 0x15, 0xa4, 0x5e, 0x4e, 0x61, 0x39,
+	0xd1, 0xc7, 0xb2, 0x23, 0x6f, 0x2f, 0x69, 0xeb, 0x0f, 0xb4, 0xdf, 0x0b, 0xf0, 0x12, 0x80, 0x87,
+	0x60, 0x11, 0xf1, 0x8f, 0x82, 0xd4, 0x7b, 0xc9, 0x20, 0xc7, 0xfc, 0x53, 0xe6, 0x58, 0xb6, 0x8d,
+	0x30, 0xe9, 0xb9, 0x18, 0x77, 0x5c, 0xdb, 0xb4, 0xec, 0x2d, 0x51, 0xca, 0xaf, 0xa7, 0x36, 0x9e,
+	0xaa, 0xe0, 0x7f, 0x36, 0x4d, 0xfd, 0x03, 0x96, 0xdf, 0x63, 0x6d, 0x1a, 0xd2, 0x01, 0x0b, 0xf8,
+	0x16, 0xe3, 0x6f, 0x45, 0xf8, 0x1a, 0x28, 0x4a, 0x4f, 0x19, 0x78, 0x8e, 0x7f, 0xd3, 0xdb, 0x34,
+	0xf6, 0x1e, 0xd3, 0x98, 0x59, 0x66, 0xa5, 0x7c, 0xdc, 0x6b, 0x07, 0x52, 0x50, 0x71, 0x47, 0x1e,
+	0x4d, 0xd9, 0xbc, 0x3b, 0x12, 0x56, 0xff, 0xe6, 0xfa, 0xe4, 0x1b, 0xb2, 0xb2, 0xfe, 0xdc, 0x0b,
+	0x16, 0xbe, 0x01, 0x96, 0xa6, 0x5b, 0x09, 0x5e, 0x98, 0xdd, 0x52, 0x22, 0xcc, 0xc5, 0xf9, 0xcb,
+	0x0b, 0xbe, 0x02, 0x56, 0x7a, 0x69, 0xcc, 0x68, 0x30, 0x29, 0xed, 0x62, 0x43, 0x3c, 0x75, 0x1b,
+	0x93, 0xa7, 0x6e, 0x03, 0x65, 0x4f, 0xdd, 0x8a, 0xbc, 0xc6, 0x6e, 0x2b, 0x9b, 0x6f, 0xbe, 0xfd,
+	0xfa, 0xc0, 0x4f, 0xf7, 0xc7, 0x8f, 0x1a, 0xfd, 0x28, 0x68, 0x46, 0x23, 0x16, 0xf6, 0xa3, 0xd8,
+	0x6b, 0x8a, 0xfb, 0xee, 0x56, 0x30, 0x6d, 0xe0, 0x2d, 0xfe, 0x5e, 0xdd, 0xa3, 0x7d, 0xd6, 0x3c,
+	0xb8, 0xd3, 0x1c, 0x44, 0x4d, 0x2f, 0xf0, 0x1f, 0x2d, 0xf2, 0xd8, 0x77, 0xfe, 0x0a, 0x00, 0x00,
+	0xff, 0xff, 0x04, 0xda, 0xd9, 0x9e, 0x9f, 0x0b, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -876,6 +880,8 @@
 	UpdateMetricsConfiguration(ctx context.Context, in *MetricsConfigurationRequest, opts ...grpc.CallOption) (*MetricsConfigurationResponse, error)
 	// Get the instantenous value of a metric
 	GetMetric(ctx context.Context, in *GetMetricRequest, opts ...grpc.CallOption) (*GetMetricResponse, error)
+	// Initiate the server streaming of the metrics
+	StreamMetrics(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (NativeMetricsManagementService_StreamMetricsClient, error)
 }
 
 type nativeMetricsManagementServiceClient struct {
@@ -913,6 +919,38 @@
 	return out, nil
 }
 
+func (c *nativeMetricsManagementServiceClient) StreamMetrics(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (NativeMetricsManagementService_StreamMetricsClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeMetricsManagementService_serviceDesc.Streams[0], "/dmi.NativeMetricsManagementService/StreamMetrics", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeMetricsManagementServiceStreamMetricsClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeMetricsManagementService_StreamMetricsClient interface {
+	Recv() (*Metric, error)
+	grpc.ClientStream
+}
+
+type nativeMetricsManagementServiceStreamMetricsClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeMetricsManagementServiceStreamMetricsClient) Recv() (*Metric, error) {
+	m := new(Metric)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
 // NativeMetricsManagementServiceServer is the server API for NativeMetricsManagementService service.
 type NativeMetricsManagementServiceServer interface {
 	// List the supported metrics for the passed device.
@@ -927,6 +965,8 @@
 	UpdateMetricsConfiguration(context.Context, *MetricsConfigurationRequest) (*MetricsConfigurationResponse, error)
 	// Get the instantenous value of a metric
 	GetMetric(context.Context, *GetMetricRequest) (*GetMetricResponse, error)
+	// Initiate the server streaming of the metrics
+	StreamMetrics(*empty.Empty, NativeMetricsManagementService_StreamMetricsServer) error
 }
 
 // UnimplementedNativeMetricsManagementServiceServer can be embedded to have forward compatible implementations.
@@ -942,6 +982,9 @@
 func (*UnimplementedNativeMetricsManagementServiceServer) GetMetric(ctx context.Context, req *GetMetricRequest) (*GetMetricResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetMetric not implemented")
 }
+func (*UnimplementedNativeMetricsManagementServiceServer) StreamMetrics(req *empty.Empty, srv NativeMetricsManagementService_StreamMetricsServer) error {
+	return status.Errorf(codes.Unimplemented, "method StreamMetrics not implemented")
+}
 
 func RegisterNativeMetricsManagementServiceServer(s *grpc.Server, srv NativeMetricsManagementServiceServer) {
 	s.RegisterService(&_NativeMetricsManagementService_serviceDesc, srv)
@@ -1001,6 +1044,27 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _NativeMetricsManagementService_StreamMetrics_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(empty.Empty)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeMetricsManagementServiceServer).StreamMetrics(m, &nativeMetricsManagementServiceStreamMetricsServer{stream})
+}
+
+type NativeMetricsManagementService_StreamMetricsServer interface {
+	Send(*Metric) error
+	grpc.ServerStream
+}
+
+type nativeMetricsManagementServiceStreamMetricsServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeMetricsManagementServiceStreamMetricsServer) Send(m *Metric) error {
+	return x.ServerStream.SendMsg(m)
+}
+
 var _NativeMetricsManagementService_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "dmi.NativeMetricsManagementService",
 	HandlerType: (*NativeMetricsManagementServiceServer)(nil),
@@ -1018,6 +1082,12 @@
 			Handler:    _NativeMetricsManagementService_GetMetric_Handler,
 		},
 	},
-	Streams:  []grpc.StreamDesc{},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "StreamMetrics",
+			Handler:       _NativeMetricsManagementService_StreamMetrics_Handler,
+			ServerStreams: true,
+		},
+	},
 	Metadata: "dmi/hw_metrics_mgmt_service.proto",
 }
diff --git a/protos/dmi/hw_events_mgmt_service.proto b/protos/dmi/hw_events_mgmt_service.proto
index 641adbe..db04006 100644
--- a/protos/dmi/hw_events_mgmt_service.proto
+++ b/protos/dmi/hw_events_mgmt_service.proto
@@ -6,6 +6,7 @@
 import "dmi/commons.proto";

 import "dmi/hw.proto";

 import "google/protobuf/timestamp.proto";

+import "google/protobuf/empty.proto";

 

 // Management of Events and protos for encoding of Events

 

@@ -143,8 +144,8 @@
     string component_name = 3;

 }

 

-// The Events are conveyed to external systems by submitting them on a kafka bus.

-// The topic to which are Events are submitted would be configured as startup

+// The Events are conveyed to external systems either by submitting them on a message bus or using gRPC server streaming.

+// The message bus topic to which are Events are submitted would be configured as startup

 // configuration of the components

 

 message Event {

@@ -166,4 +167,7 @@
     // The default behavior of the device is to report all the supported events

     // This configuration is persisted across reboots of the device or the device manager

     rpc UpdateEventsConfiguration(EventsConfigurationRequest) returns(EventsConfigurationResponse);

+

+    // Initiate the server streaming of the events

+    rpc StreamEvents(google.protobuf.Empty) returns(stream Event);

 }

diff --git a/protos/dmi/hw_metrics_mgmt_service.proto b/protos/dmi/hw_metrics_mgmt_service.proto
index 72a8414..2f1a23d 100644
--- a/protos/dmi/hw_metrics_mgmt_service.proto
+++ b/protos/dmi/hw_metrics_mgmt_service.proto
@@ -5,6 +5,7 @@
 

 import "dmi/commons.proto";

 import "dmi/hw.proto";

+import "google/protobuf/empty.proto";

 

 // The model used to represent the event data on the SensorData of a component as described

 // in RFC8348 (https://tools.ietf.org/html/rfc8348)

@@ -108,7 +109,7 @@
     string component_name = 3;

 }

 

-// The Metrics are conveyed to external systems by submitting them on a kafka bus.

+// The Metrics are conveyed to external systems either by submitting them on a message bus or using gRPC server streaming.

 // The topic to which are Metrics are submitted would be configured as startup

 // configuration of the components

 message Metric {

@@ -153,4 +154,7 @@
 

     // Get the instantenous value of a metric

     rpc GetMetric(GetMetricRequest) returns(GetMetricResponse);

+

+    // Initiate the server streaming of the metrics

+    rpc StreamMetrics(google.protobuf.Empty) returns(stream Metric);

 }

diff --git a/python/dmi/hw_events_mgmt_service_pb2.py b/python/dmi/hw_events_mgmt_service_pb2.py
index cd65493..18e1946 100644
--- a/python/dmi/hw_events_mgmt_service_pb2.py
+++ b/python/dmi/hw_events_mgmt_service_pb2.py
@@ -15,6 +15,7 @@
 from dmi import commons_pb2 as dmi_dot_commons__pb2
 from dmi import hw_pb2 as dmi_dot_hw__pb2
 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
@@ -23,9 +24,9 @@
   syntax='proto3',
   serialized_options=b'Z9github.com/opencord/device-management-interface/v3/go/dmi',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n dmi/hw_events_mgmt_service.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\x1a\x0c\x64mi/hw.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"N\n\tValueType\x12\x11\n\x07int_val\x18\x01 \x01(\x03H\x00\x12\x12\n\x08uint_val\x18\x02 \x01(\x04H\x00\x12\x13\n\tfloat_val\x18\x03 \x01(\x02H\x00\x42\x05\n\x03val\"G\n\nWaterMarks\x12\x1c\n\x04high\x18\x01 \x01(\x0b\x32\x0e.dmi.ValueType\x12\x1b\n\x03low\x18\x02 \x01(\x0b\x32\x0e.dmi.ValueType\"]\n\nThresholds\x12 \n\x05upper\x18\x01 \x01(\x0b\x32\x0f.dmi.WaterMarksH\x00\x12 \n\x05lower\x18\x02 \x01(\x0b\x32\x0f.dmi.WaterMarksH\x00\x42\x0b\n\tthreshold\"c\n\x14ThresholdInformation\x12&\n\x0eobserved_value\x18\x01 \x01(\x0b\x32\x0e.dmi.ValueType\x12#\n\nthresholds\x18\x02 \x01(\x0b\x32\x0f.dmi.Thresholds\"g\n\x08\x45ventCfg\x12\x1f\n\x08\x65vent_id\x18\x01 \x01(\x0e\x32\r.dmi.EventIds\x12\x15\n\ris_configured\x18\x02 \x01(\x08\x12#\n\nthresholds\x18\x03 \x01(\x0b\x32\x0f.dmi.Thresholds\")\n\tEventsCfg\x12\x1c\n\x05items\x18\x01 \x03(\x0b\x32\r.dmi.EventCfg\"\xf8\x01\n\x12ListEventsResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12.\n\x06reason\x18\x02 \x01(\x0e\x32\x1e.dmi.ListEventsResponse.Reason\x12\x1e\n\x06\x65vents\x18\x03 \x01(\x0b\x32\x0e.dmi.EventsCfg\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"^\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\"\x88\x01\n\x1a\x45ventsConfigurationRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x0e.dmi.EventsCfgH\x00\x12\x1a\n\x10reset_to_default\x18\x03 \x01(\x08H\x00\x42\x0b\n\toperation\"\xfe\x01\n\x1b\x45ventsConfigurationResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x37\n\x06reason\x18\x02 \x01(\x0e\x32\'.dmi.EventsConfigurationResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"r\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x12\n\x0eINVALID_CONFIG\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"j\n\rEventMetaData\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"\xc8\x01\n\x05\x45vent\x12*\n\x0e\x65vent_metadata\x18\x01 \x01(\x0b\x32\x12.dmi.EventMetaData\x12\x1f\n\x08\x65vent_id\x18\x02 \x01(\x0e\x32\r.dmi.EventIds\x12-\n\traised_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x31\n\x0ethreshold_info\x18\x04 \x01(\x0b\x32\x19.dmi.ThresholdInformation\x12\x10\n\x08\x61\x64\x64_info\x18\x05 \x01(\t*\xd1\x0e\n\x08\x45ventIds\x12\x18\n\x14\x45VENT_NAME_UNDEFINED\x10\x00\x12\x1e\n\x1a\x45VENT_TRANSCEIVER_PLUG_OUT\x10\x64\x12\x1d\n\x19\x45VENT_TRANSCEIVER_PLUG_IN\x10\x65\x12-\n)EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD\x10\x66\x12-\n)EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD\x10g\x12\x31\n-EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD\x10h\x12\x31\n-EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD\x10i\x12-\n)EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD\x10j\x12-\n)EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD\x10k\x12.\n*EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD\x10l\x12.\n*EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD\x10m\x12.\n*EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD\x10n\x12.\n*EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD\x10o\x12\x1d\n\x19\x45VENT_TRANSCEIVER_FAILURE\x10p\x12\x37\n3EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD_RECOVERED\x10q\x12\x37\n3EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD_RECOVERED\x10r\x12;\n7EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD_RECOVERED\x10s\x12;\n7EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD_RECOVERED\x10t\x12\x37\n3EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD_RECOVERED\x10u\x12\x37\n3EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD_RECOVERED\x10v\x12\x38\n4EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD_RECOVERED\x10w\x12\x38\n4EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD_RECOVERED\x10x\x12\x38\n4EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD_RECOVERED\x10y\x12\x38\n4EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD_RECOVERED\x10z\x12\'\n#EVENT_TRANSCEIVER_FAILURE_RECOVERED\x10{\x12\x17\n\x12\x45VENT_PSU_PLUG_OUT\x10\xc8\x01\x12\x16\n\x11\x45VENT_PSU_PLUG_IN\x10\xc9\x01\x12\x16\n\x11\x45VENT_PSU_FAILURE\x10\xca\x01\x12 \n\x1b\x45VENT_PSU_FAILURE_RECOVERED\x10\xcb\x01\x12\x16\n\x11\x45VENT_FAN_FAILURE\x10\xac\x02\x12\x17\n\x12\x45VENT_FAN_PLUG_OUT\x10\xad\x02\x12\x16\n\x11\x45VENT_FAN_PLUG_IN\x10\xae\x02\x12 \n\x1b\x45VENT_FAN_FAILURE_RECOVERED\x10\xaf\x02\x12)\n$EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL\x10\x90\x03\x12&\n!EVENT_CPU_TEMPERATURE_ABOVE_FATAL\x10\x91\x03\x12\x33\n.EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL_RECOVERED\x10\x92\x03\x12\x30\n+EVENT_CPU_TEMPERATURE_ABOVE_FATAL_RECOVERED\x10\x93\x03\x12\x1a\n\x15\x45VENT_HW_DEVICE_RESET\x10\xf4\x03\x12/\n*EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL\x10\xf5\x03\x12,\n\'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL\x10\xf6\x03\x12\x39\n4EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECOVERED\x10\xf7\x03\x12\x36\n1EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL_RECOVERED\x10\xf8\x03\x32\xb7\x01\n\x1dNativeEventsManagementService\x12\x36\n\nListEvents\x12\x0f.dmi.HardwareID\x1a\x17.dmi.ListEventsResponse\x12^\n\x19UpdateEventsConfiguration\x12\x1f.dmi.EventsConfigurationRequest\x1a .dmi.EventsConfigurationResponseB;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3'
+  serialized_pb=b'\n dmi/hw_events_mgmt_service.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\x1a\x0c\x64mi/hw.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\"N\n\tValueType\x12\x11\n\x07int_val\x18\x01 \x01(\x03H\x00\x12\x12\n\x08uint_val\x18\x02 \x01(\x04H\x00\x12\x13\n\tfloat_val\x18\x03 \x01(\x02H\x00\x42\x05\n\x03val\"G\n\nWaterMarks\x12\x1c\n\x04high\x18\x01 \x01(\x0b\x32\x0e.dmi.ValueType\x12\x1b\n\x03low\x18\x02 \x01(\x0b\x32\x0e.dmi.ValueType\"]\n\nThresholds\x12 \n\x05upper\x18\x01 \x01(\x0b\x32\x0f.dmi.WaterMarksH\x00\x12 \n\x05lower\x18\x02 \x01(\x0b\x32\x0f.dmi.WaterMarksH\x00\x42\x0b\n\tthreshold\"c\n\x14ThresholdInformation\x12&\n\x0eobserved_value\x18\x01 \x01(\x0b\x32\x0e.dmi.ValueType\x12#\n\nthresholds\x18\x02 \x01(\x0b\x32\x0f.dmi.Thresholds\"g\n\x08\x45ventCfg\x12\x1f\n\x08\x65vent_id\x18\x01 \x01(\x0e\x32\r.dmi.EventIds\x12\x15\n\ris_configured\x18\x02 \x01(\x08\x12#\n\nthresholds\x18\x03 \x01(\x0b\x32\x0f.dmi.Thresholds\")\n\tEventsCfg\x12\x1c\n\x05items\x18\x01 \x03(\x0b\x32\r.dmi.EventCfg\"\xf8\x01\n\x12ListEventsResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12.\n\x06reason\x18\x02 \x01(\x0e\x32\x1e.dmi.ListEventsResponse.Reason\x12\x1e\n\x06\x65vents\x18\x03 \x01(\x0b\x32\x0e.dmi.EventsCfg\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"^\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\"\x88\x01\n\x1a\x45ventsConfigurationRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x0e.dmi.EventsCfgH\x00\x12\x1a\n\x10reset_to_default\x18\x03 \x01(\x08H\x00\x42\x0b\n\toperation\"\xfe\x01\n\x1b\x45ventsConfigurationResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x37\n\x06reason\x18\x02 \x01(\x0e\x32\'.dmi.EventsConfigurationResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"r\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x12\n\x0eINVALID_CONFIG\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"j\n\rEventMetaData\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"\xc8\x01\n\x05\x45vent\x12*\n\x0e\x65vent_metadata\x18\x01 \x01(\x0b\x32\x12.dmi.EventMetaData\x12\x1f\n\x08\x65vent_id\x18\x02 \x01(\x0e\x32\r.dmi.EventIds\x12-\n\traised_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x31\n\x0ethreshold_info\x18\x04 \x01(\x0b\x32\x19.dmi.ThresholdInformation\x12\x10\n\x08\x61\x64\x64_info\x18\x05 \x01(\t*\xd1\x0e\n\x08\x45ventIds\x12\x18\n\x14\x45VENT_NAME_UNDEFINED\x10\x00\x12\x1e\n\x1a\x45VENT_TRANSCEIVER_PLUG_OUT\x10\x64\x12\x1d\n\x19\x45VENT_TRANSCEIVER_PLUG_IN\x10\x65\x12-\n)EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD\x10\x66\x12-\n)EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD\x10g\x12\x31\n-EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD\x10h\x12\x31\n-EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD\x10i\x12-\n)EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD\x10j\x12-\n)EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD\x10k\x12.\n*EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD\x10l\x12.\n*EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD\x10m\x12.\n*EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD\x10n\x12.\n*EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD\x10o\x12\x1d\n\x19\x45VENT_TRANSCEIVER_FAILURE\x10p\x12\x37\n3EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD_RECOVERED\x10q\x12\x37\n3EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD_RECOVERED\x10r\x12;\n7EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD_RECOVERED\x10s\x12;\n7EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD_RECOVERED\x10t\x12\x37\n3EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD_RECOVERED\x10u\x12\x37\n3EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD_RECOVERED\x10v\x12\x38\n4EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD_RECOVERED\x10w\x12\x38\n4EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD_RECOVERED\x10x\x12\x38\n4EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD_RECOVERED\x10y\x12\x38\n4EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD_RECOVERED\x10z\x12\'\n#EVENT_TRANSCEIVER_FAILURE_RECOVERED\x10{\x12\x17\n\x12\x45VENT_PSU_PLUG_OUT\x10\xc8\x01\x12\x16\n\x11\x45VENT_PSU_PLUG_IN\x10\xc9\x01\x12\x16\n\x11\x45VENT_PSU_FAILURE\x10\xca\x01\x12 \n\x1b\x45VENT_PSU_FAILURE_RECOVERED\x10\xcb\x01\x12\x16\n\x11\x45VENT_FAN_FAILURE\x10\xac\x02\x12\x17\n\x12\x45VENT_FAN_PLUG_OUT\x10\xad\x02\x12\x16\n\x11\x45VENT_FAN_PLUG_IN\x10\xae\x02\x12 \n\x1b\x45VENT_FAN_FAILURE_RECOVERED\x10\xaf\x02\x12)\n$EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL\x10\x90\x03\x12&\n!EVENT_CPU_TEMPERATURE_ABOVE_FATAL\x10\x91\x03\x12\x33\n.EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL_RECOVERED\x10\x92\x03\x12\x30\n+EVENT_CPU_TEMPERATURE_ABOVE_FATAL_RECOVERED\x10\x93\x03\x12\x1a\n\x15\x45VENT_HW_DEVICE_RESET\x10\xf4\x03\x12/\n*EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL\x10\xf5\x03\x12,\n\'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL\x10\xf6\x03\x12\x39\n4EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECOVERED\x10\xf7\x03\x12\x36\n1EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL_RECOVERED\x10\xf8\x03\x32\xed\x01\n\x1dNativeEventsManagementService\x12\x36\n\nListEvents\x12\x0f.dmi.HardwareID\x1a\x17.dmi.ListEventsResponse\x12^\n\x19UpdateEventsConfiguration\x12\x1f.dmi.EventsConfigurationRequest\x1a .dmi.EventsConfigurationResponse\x12\x34\n\x0cStreamEvents\x12\x16.google.protobuf.Empty\x1a\n.dmi.Event0\x01\x42;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3'
   ,
-  dependencies=[dmi_dot_commons__pb2.DESCRIPTOR,dmi_dot_hw__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,])
+  dependencies=[dmi_dot_commons__pb2.DESCRIPTOR,dmi_dot_hw__pb2.DESCRIPTOR,google_dot_protobuf_dot_timestamp__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
 
 _EVENTIDS = _descriptor.EnumDescriptor(
   name='EventIds',
@@ -247,8 +248,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1563,
-  serialized_end=3436,
+  serialized_start=1592,
+  serialized_end=3465,
 )
 _sym_db.RegisterEnumDescriptor(_EVENTIDS)
 
@@ -327,8 +328,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=759,
-  serialized_end=853,
+  serialized_start=788,
+  serialized_end=882,
 )
 _sym_db.RegisterEnumDescriptor(_LISTEVENTSRESPONSE_REASON)
 
@@ -367,8 +368,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1135,
-  serialized_end=1249,
+  serialized_start=1164,
+  serialized_end=1278,
 )
 _sym_db.RegisterEnumDescriptor(_EVENTSCONFIGURATIONRESPONSE_REASON)
 
@@ -419,8 +420,8 @@
       create_key=_descriptor._internal_create_key,
     fields=[]),
   ],
-  serialized_start=107,
-  serialized_end=185,
+  serialized_start=136,
+  serialized_end=214,
 )
 
 
@@ -458,8 +459,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=187,
-  serialized_end=258,
+  serialized_start=216,
+  serialized_end=287,
 )
 
 
@@ -502,8 +503,8 @@
       create_key=_descriptor._internal_create_key,
     fields=[]),
   ],
-  serialized_start=260,
-  serialized_end=353,
+  serialized_start=289,
+  serialized_end=382,
 )
 
 
@@ -541,8 +542,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=355,
-  serialized_end=454,
+  serialized_start=384,
+  serialized_end=483,
 )
 
 
@@ -587,8 +588,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=456,
-  serialized_end=559,
+  serialized_start=485,
+  serialized_end=588,
 )
 
 
@@ -619,8 +620,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=561,
-  serialized_end=602,
+  serialized_start=590,
+  serialized_end=631,
 )
 
 
@@ -673,8 +674,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=605,
-  serialized_end=853,
+  serialized_start=634,
+  serialized_end=882,
 )
 
 
@@ -724,8 +725,8 @@
       create_key=_descriptor._internal_create_key,
     fields=[]),
   ],
-  serialized_start=856,
-  serialized_end=992,
+  serialized_start=885,
+  serialized_end=1021,
 )
 
 
@@ -771,8 +772,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=995,
-  serialized_end=1249,
+  serialized_start=1024,
+  serialized_end=1278,
 )
 
 
@@ -817,8 +818,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1251,
-  serialized_end=1357,
+  serialized_start=1280,
+  serialized_end=1386,
 )
 
 
@@ -877,8 +878,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1360,
-  serialized_end=1560,
+  serialized_start=1389,
+  serialized_end=1589,
 )
 
 _VALUETYPE.oneofs_by_name['val'].fields.append(
@@ -1027,8 +1028,8 @@
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=3439,
-  serialized_end=3622,
+  serialized_start=3468,
+  serialized_end=3705,
   methods=[
   _descriptor.MethodDescriptor(
     name='ListEvents',
@@ -1050,6 +1051,16 @@
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
+  _descriptor.MethodDescriptor(
+    name='StreamEvents',
+    full_name='dmi.NativeEventsManagementService.StreamEvents',
+    index=2,
+    containing_service=None,
+    input_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    output_type=_EVENT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
 ])
 _sym_db.RegisterServiceDescriptor(_NATIVEEVENTSMANAGEMENTSERVICE)
 
diff --git a/python/dmi/hw_events_mgmt_service_pb2_grpc.py b/python/dmi/hw_events_mgmt_service_pb2_grpc.py
index 213d4f5..8212023 100644
--- a/python/dmi/hw_events_mgmt_service_pb2_grpc.py
+++ b/python/dmi/hw_events_mgmt_service_pb2_grpc.py
@@ -4,6 +4,7 @@
 
 from dmi import hw_events_mgmt_service_pb2 as dmi_dot_hw__events__mgmt__service__pb2
 from dmi import hw_pb2 as dmi_dot_hw__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
 class NativeEventsManagementServiceStub(object):
@@ -25,6 +26,11 @@
                 request_serializer=dmi_dot_hw__events__mgmt__service__pb2.EventsConfigurationRequest.SerializeToString,
                 response_deserializer=dmi_dot_hw__events__mgmt__service__pb2.EventsConfigurationResponse.FromString,
                 )
+        self.StreamEvents = channel.unary_stream(
+                '/dmi.NativeEventsManagementService/StreamEvents',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=dmi_dot_hw__events__mgmt__service__pb2.Event.FromString,
+                )
 
 
 class NativeEventsManagementServiceServicer(object):
@@ -46,6 +52,13 @@
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def StreamEvents(self, request, context):
+        """Initiate the server streaming of the events

+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
 
 def add_NativeEventsManagementServiceServicer_to_server(servicer, server):
     rpc_method_handlers = {
@@ -59,6 +72,11 @@
                     request_deserializer=dmi_dot_hw__events__mgmt__service__pb2.EventsConfigurationRequest.FromString,
                     response_serializer=dmi_dot_hw__events__mgmt__service__pb2.EventsConfigurationResponse.SerializeToString,
             ),
+            'StreamEvents': grpc.unary_stream_rpc_method_handler(
+                    servicer.StreamEvents,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=dmi_dot_hw__events__mgmt__service__pb2.Event.SerializeToString,
+            ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
             'dmi.NativeEventsManagementService', rpc_method_handlers)
@@ -102,3 +120,20 @@
             dmi_dot_hw__events__mgmt__service__pb2.EventsConfigurationResponse.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def StreamEvents(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/dmi.NativeEventsManagementService/StreamEvents',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            dmi_dot_hw__events__mgmt__service__pb2.Event.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/python/dmi/hw_metrics_mgmt_service_pb2.py b/python/dmi/hw_metrics_mgmt_service_pb2.py
index 663ef75..e4dfac7 100644
--- a/python/dmi/hw_metrics_mgmt_service_pb2.py
+++ b/python/dmi/hw_metrics_mgmt_service_pb2.py
@@ -14,6 +14,7 @@
 
 from dmi import commons_pb2 as dmi_dot_commons__pb2
 from dmi import hw_pb2 as dmi_dot_hw__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
@@ -22,9 +23,9 @@
   syntax='proto3',
   serialized_options=b'Z9github.com/opencord/device-management-interface/v3/go/dmi',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n!dmi/hw_metrics_mgmt_service.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\x1a\x0c\x64mi/hw.proto\"a\n\x0cMetricConfig\x12#\n\tmetric_id\x18\x01 \x01(\x0e\x32\x10.dmi.MetricNames\x12\x15\n\ris_configured\x18\x02 \x01(\x08\x12\x15\n\rpoll_interval\x18\x03 \x01(\r\"3\n\rMetricsConfig\x12\"\n\x07metrics\x18\x01 \x03(\x0b\x32\x11.dmi.MetricConfig\"\xff\x01\n\x13ListMetricsResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12/\n\x06reason\x18\x02 \x01(\x0e\x32\x1f.dmi.ListMetricsResponse.Reason\x12#\n\x07metrics\x18\x03 \x01(\x0b\x32\x12.dmi.MetricsConfig\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"^\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\"\x8d\x01\n\x1bMetricsConfigurationRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12%\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x12.dmi.MetricsConfigH\x00\x12\x1a\n\x10reset_to_default\x18\x03 \x01(\x08H\x00\x42\x0b\n\toperation\"\xa0\x02\n\x1cMetricsConfigurationResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x38\n\x06reason\x18\x02 \x01(\x0e\x32(.dmi.MetricsConfigurationResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\x91\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x1d\n\x19POLL_INTERVAL_UNSUPPORTED\x10\x03\x12\x12\n\x0eINVALID_METRIC\x10\x04\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x05\"k\n\x0eMetricMetaData\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"\x84\x01\n\x06Metric\x12#\n\tmetric_id\x18\x01 \x01(\x0e\x32\x10.dmi.MetricNames\x12,\n\x0fmetric_metadata\x18\x02 \x01(\x0b\x32\x13.dmi.MetricMetaData\x12\'\n\x05value\x18\x03 \x01(\x0b\x32\x18.dmi.ComponentSensorData\"_\n\x10GetMetricRequest\x12&\n\tmeta_data\x18\x01 \x01(\x0b\x32\x13.dmi.MetricMetaData\x12#\n\tmetric_id\x18\x02 \x01(\x0e\x32\x10.dmi.MetricNames\"\x9f\x02\n\x11GetMetricResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12-\n\x06reason\x18\x02 \x01(\x0e\x32\x1d.dmi.GetMetricResponse.Reason\x12\x1b\n\x06metric\x18\x03 \x01(\x0b\x32\x0b.dmi.Metric\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"\x89\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x15\n\x11UNKNOWN_COMPONENT\x10\x02\x12\x12\n\x0eINTERNAL_ERROR\x10\x03\x12\x12\n\x0eINVALID_METRIC\x10\x04\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x05*\xd9\x05\n\x0bMetricNames\x12\x19\n\x15METRIC_NAME_UNDEFINED\x10\x00\x12\x14\n\x10METRIC_FAN_SPEED\x10\x01\x12\x13\n\x0fMETRIC_CPU_TEMP\x10\x64\x12\x1f\n\x1bMETRIC_CPU_USAGE_PERCENTAGE\x10\x65\x12\x1c\n\x17METRIC_TRANSCEIVER_TEMP\x10\xc8\x01\x12\x1f\n\x1aMETRIC_TRANSCEIVER_VOLTAGE\x10\xc9\x01\x12\x1c\n\x17METRIC_TRANSCEIVER_BIAS\x10\xca\x01\x12 \n\x1bMETRIC_TRANSCEIVER_RX_POWER\x10\xcb\x01\x12 \n\x1bMETRIC_TRANSCEIVER_TX_POWER\x10\xcc\x01\x12\"\n\x1dMETRIC_TRANSCEIVER_WAVELENGTH\x10\xcd\x01\x12\x15\n\x10METRIC_DISK_TEMP\x10\xac\x02\x12\x19\n\x14METRIC_DISK_CAPACITY\x10\xad\x02\x12\x16\n\x11METRIC_DISK_USAGE\x10\xae\x02\x12!\n\x1cMETRIC_DISK_USAGE_PERCENTAGE\x10\xaf\x02\x12&\n!METRIC_DISK_READ_WRITE_PERCENTAGE\x10\xb0\x02\x12(\n#METRIC_DISK_FAULTY_CELLS_PERCENTAGE\x10\xb1\x02\x12\x14\n\x0fMETRIC_RAM_TEMP\x10\x90\x03\x12\x18\n\x13METRIC_RAM_CAPACITY\x10\x91\x03\x12\x15\n\x10METRIC_RAM_USAGE\x10\x92\x03\x12 \n\x1bMETRIC_RAM_USAGE_PERCENTAGE\x10\x93\x03\x12\x15\n\x10METRIC_POWER_MAX\x10\xf4\x03\x12\x17\n\x12METRIC_POWER_USAGE\x10\xf5\x03\x12\"\n\x1dMETRIC_POWER_USAGE_PERCENTAGE\x10\xf6\x03\x12\"\n\x1dMETRIC_INNER_SURROUNDING_TEMP\x10\xd8\x04\x32\xf9\x01\n\x1eNativeMetricsManagementService\x12\x38\n\x0bListMetrics\x12\x0f.dmi.HardwareID\x1a\x18.dmi.ListMetricsResponse\x12\x61\n\x1aUpdateMetricsConfiguration\x12 .dmi.MetricsConfigurationRequest\x1a!.dmi.MetricsConfigurationResponse\x12:\n\tGetMetric\x12\x15.dmi.GetMetricRequest\x1a\x16.dmi.GetMetricResponseB;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3'
+  serialized_pb=b'\n!dmi/hw_metrics_mgmt_service.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\x1a\x0c\x64mi/hw.proto\x1a\x1bgoogle/protobuf/empty.proto\"a\n\x0cMetricConfig\x12#\n\tmetric_id\x18\x01 \x01(\x0e\x32\x10.dmi.MetricNames\x12\x15\n\ris_configured\x18\x02 \x01(\x08\x12\x15\n\rpoll_interval\x18\x03 \x01(\r\"3\n\rMetricsConfig\x12\"\n\x07metrics\x18\x01 \x03(\x0b\x32\x11.dmi.MetricConfig\"\xff\x01\n\x13ListMetricsResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12/\n\x06reason\x18\x02 \x01(\x0e\x32\x1f.dmi.ListMetricsResponse.Reason\x12#\n\x07metrics\x18\x03 \x01(\x0b\x32\x12.dmi.MetricsConfig\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"^\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\"\x8d\x01\n\x1bMetricsConfigurationRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12%\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x12.dmi.MetricsConfigH\x00\x12\x1a\n\x10reset_to_default\x18\x03 \x01(\x08H\x00\x42\x0b\n\toperation\"\xa0\x02\n\x1cMetricsConfigurationResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x38\n\x06reason\x18\x02 \x01(\x0e\x32(.dmi.MetricsConfigurationResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\x91\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x1d\n\x19POLL_INTERVAL_UNSUPPORTED\x10\x03\x12\x12\n\x0eINVALID_METRIC\x10\x04\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x05\"k\n\x0eMetricMetaData\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"\x84\x01\n\x06Metric\x12#\n\tmetric_id\x18\x01 \x01(\x0e\x32\x10.dmi.MetricNames\x12,\n\x0fmetric_metadata\x18\x02 \x01(\x0b\x32\x13.dmi.MetricMetaData\x12\'\n\x05value\x18\x03 \x01(\x0b\x32\x18.dmi.ComponentSensorData\"_\n\x10GetMetricRequest\x12&\n\tmeta_data\x18\x01 \x01(\x0b\x32\x13.dmi.MetricMetaData\x12#\n\tmetric_id\x18\x02 \x01(\x0e\x32\x10.dmi.MetricNames\"\x9f\x02\n\x11GetMetricResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12-\n\x06reason\x18\x02 \x01(\x0e\x32\x1d.dmi.GetMetricResponse.Reason\x12\x1b\n\x06metric\x18\x03 \x01(\x0b\x32\x0b.dmi.Metric\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"\x89\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x15\n\x11UNKNOWN_COMPONENT\x10\x02\x12\x12\n\x0eINTERNAL_ERROR\x10\x03\x12\x12\n\x0eINVALID_METRIC\x10\x04\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x05*\xd9\x05\n\x0bMetricNames\x12\x19\n\x15METRIC_NAME_UNDEFINED\x10\x00\x12\x14\n\x10METRIC_FAN_SPEED\x10\x01\x12\x13\n\x0fMETRIC_CPU_TEMP\x10\x64\x12\x1f\n\x1bMETRIC_CPU_USAGE_PERCENTAGE\x10\x65\x12\x1c\n\x17METRIC_TRANSCEIVER_TEMP\x10\xc8\x01\x12\x1f\n\x1aMETRIC_TRANSCEIVER_VOLTAGE\x10\xc9\x01\x12\x1c\n\x17METRIC_TRANSCEIVER_BIAS\x10\xca\x01\x12 \n\x1bMETRIC_TRANSCEIVER_RX_POWER\x10\xcb\x01\x12 \n\x1bMETRIC_TRANSCEIVER_TX_POWER\x10\xcc\x01\x12\"\n\x1dMETRIC_TRANSCEIVER_WAVELENGTH\x10\xcd\x01\x12\x15\n\x10METRIC_DISK_TEMP\x10\xac\x02\x12\x19\n\x14METRIC_DISK_CAPACITY\x10\xad\x02\x12\x16\n\x11METRIC_DISK_USAGE\x10\xae\x02\x12!\n\x1cMETRIC_DISK_USAGE_PERCENTAGE\x10\xaf\x02\x12&\n!METRIC_DISK_READ_WRITE_PERCENTAGE\x10\xb0\x02\x12(\n#METRIC_DISK_FAULTY_CELLS_PERCENTAGE\x10\xb1\x02\x12\x14\n\x0fMETRIC_RAM_TEMP\x10\x90\x03\x12\x18\n\x13METRIC_RAM_CAPACITY\x10\x91\x03\x12\x15\n\x10METRIC_RAM_USAGE\x10\x92\x03\x12 \n\x1bMETRIC_RAM_USAGE_PERCENTAGE\x10\x93\x03\x12\x15\n\x10METRIC_POWER_MAX\x10\xf4\x03\x12\x17\n\x12METRIC_POWER_USAGE\x10\xf5\x03\x12\"\n\x1dMETRIC_POWER_USAGE_PERCENTAGE\x10\xf6\x03\x12\"\n\x1dMETRIC_INNER_SURROUNDING_TEMP\x10\xd8\x04\x32\xb1\x02\n\x1eNativeMetricsManagementService\x12\x38\n\x0bListMetrics\x12\x0f.dmi.HardwareID\x1a\x18.dmi.ListMetricsResponse\x12\x61\n\x1aUpdateMetricsConfiguration\x12 .dmi.MetricsConfigurationRequest\x1a!.dmi.MetricsConfigurationResponse\x12:\n\tGetMetric\x12\x15.dmi.GetMetricRequest\x1a\x16.dmi.GetMetricResponse\x12\x36\n\rStreamMetrics\x12\x16.google.protobuf.Empty\x1a\x0b.dmi.Metric0\x01\x42;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3'
   ,
-  dependencies=[dmi_dot_commons__pb2.DESCRIPTOR,dmi_dot_hw__pb2.DESCRIPTOR,])
+  dependencies=[dmi_dot_commons__pb2.DESCRIPTOR,dmi_dot_hw__pb2.DESCRIPTOR,google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
 
 _METRICNAMES = _descriptor.EnumDescriptor(
   name='MetricNames',
@@ -156,8 +157,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1552,
-  serialized_end=2281,
+  serialized_start=1581,
+  serialized_end=2310,
 )
 _sym_db.RegisterEnumDescriptor(_METRICNAMES)
 
@@ -218,8 +219,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=389,
-  serialized_end=483,
+  serialized_start=418,
+  serialized_end=512,
 )
 _sym_db.RegisterEnumDescriptor(_LISTMETRICSRESPONSE_REASON)
 
@@ -263,8 +264,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=773,
-  serialized_end=918,
+  serialized_start=802,
+  serialized_end=947,
 )
 _sym_db.RegisterEnumDescriptor(_METRICSCONFIGURATIONRESPONSE_REASON)
 
@@ -308,8 +309,8 @@
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=1412,
-  serialized_end=1549,
+  serialized_start=1441,
+  serialized_end=1578,
 )
 _sym_db.RegisterEnumDescriptor(_GETMETRICRESPONSE_REASON)
 
@@ -355,8 +356,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=75,
-  serialized_end=172,
+  serialized_start=104,
+  serialized_end=201,
 )
 
 
@@ -387,8 +388,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=174,
-  serialized_end=225,
+  serialized_start=203,
+  serialized_end=254,
 )
 
 
@@ -441,8 +442,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=228,
-  serialized_end=483,
+  serialized_start=257,
+  serialized_end=512,
 )
 
 
@@ -492,8 +493,8 @@
       create_key=_descriptor._internal_create_key,
     fields=[]),
   ],
-  serialized_start=486,
-  serialized_end=627,
+  serialized_start=515,
+  serialized_end=656,
 )
 
 
@@ -539,8 +540,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=630,
-  serialized_end=918,
+  serialized_start=659,
+  serialized_end=947,
 )
 
 
@@ -585,8 +586,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=920,
-  serialized_end=1027,
+  serialized_start=949,
+  serialized_end=1056,
 )
 
 
@@ -631,8 +632,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1030,
-  serialized_end=1162,
+  serialized_start=1059,
+  serialized_end=1191,
 )
 
 
@@ -670,8 +671,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1164,
-  serialized_end=1259,
+  serialized_start=1193,
+  serialized_end=1288,
 )
 
 
@@ -724,8 +725,8 @@
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=1262,
-  serialized_end=1549,
+  serialized_start=1291,
+  serialized_end=1578,
 )
 
 _METRICCONFIG.fields_by_name['metric_id'].enum_type = _METRICNAMES
@@ -841,8 +842,8 @@
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=2284,
-  serialized_end=2533,
+  serialized_start=2313,
+  serialized_end=2618,
   methods=[
   _descriptor.MethodDescriptor(
     name='ListMetrics',
@@ -874,6 +875,16 @@
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
+  _descriptor.MethodDescriptor(
+    name='StreamMetrics',
+    full_name='dmi.NativeMetricsManagementService.StreamMetrics',
+    index=3,
+    containing_service=None,
+    input_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    output_type=_METRIC,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
 ])
 _sym_db.RegisterServiceDescriptor(_NATIVEMETRICSMANAGEMENTSERVICE)
 
diff --git a/python/dmi/hw_metrics_mgmt_service_pb2_grpc.py b/python/dmi/hw_metrics_mgmt_service_pb2_grpc.py
index 7a2affa..0202897 100644
--- a/python/dmi/hw_metrics_mgmt_service_pb2_grpc.py
+++ b/python/dmi/hw_metrics_mgmt_service_pb2_grpc.py
@@ -4,6 +4,7 @@
 
 from dmi import hw_metrics_mgmt_service_pb2 as dmi_dot_hw__metrics__mgmt__service__pb2
 from dmi import hw_pb2 as dmi_dot_hw__pb2
+from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
 class NativeMetricsManagementServiceStub(object):
@@ -30,6 +31,11 @@
                 request_serializer=dmi_dot_hw__metrics__mgmt__service__pb2.GetMetricRequest.SerializeToString,
                 response_deserializer=dmi_dot_hw__metrics__mgmt__service__pb2.GetMetricResponse.FromString,
                 )
+        self.StreamMetrics = channel.unary_stream(
+                '/dmi.NativeMetricsManagementService/StreamMetrics',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=dmi_dot_hw__metrics__mgmt__service__pb2.Metric.FromString,
+                )
 
 
 class NativeMetricsManagementServiceServicer(object):
@@ -62,6 +68,13 @@
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def StreamMetrics(self, request, context):
+        """Initiate the server streaming of the metrics

+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
 
 def add_NativeMetricsManagementServiceServicer_to_server(servicer, server):
     rpc_method_handlers = {
@@ -80,6 +93,11 @@
                     request_deserializer=dmi_dot_hw__metrics__mgmt__service__pb2.GetMetricRequest.FromString,
                     response_serializer=dmi_dot_hw__metrics__mgmt__service__pb2.GetMetricResponse.SerializeToString,
             ),
+            'StreamMetrics': grpc.unary_stream_rpc_method_handler(
+                    servicer.StreamMetrics,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=dmi_dot_hw__metrics__mgmt__service__pb2.Metric.SerializeToString,
+            ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
             'dmi.NativeMetricsManagementService', rpc_method_handlers)
@@ -140,3 +158,20 @@
             dmi_dot_hw__metrics__mgmt__service__pb2.GetMetricResponse.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def StreamMetrics(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/dmi.NativeMetricsManagementService/StreamMetrics',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            dmi_dot_hw__metrics__mgmt__service__pb2.Metric.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)