VOL-4032 heartbeat check

Change-Id: I6f33476626d2925a5bca407bb1886809fe6e881f
diff --git a/VERSION b/VERSION
index 31e3287..ee6211d 100644
--- a/VERSION
+++ b/VERSION
@@ -1,2 +1,2 @@
-0.15.2
+0.15.3
 
diff --git a/cpp/dmi/hw_management_service.grpc.pb.cc b/cpp/dmi/hw_management_service.grpc.pb.cc
index 94ca677..a43edad 100644
--- a/cpp/dmi/hw_management_service.grpc.pb.cc
+++ b/cpp/dmi/hw_management_service.grpc.pb.cc
@@ -35,6 +35,7 @@
   "/dmi.NativeHWManagementService/GetLoggableEntities",
   "/dmi.NativeHWManagementService/SetLogLevel",
   "/dmi.NativeHWManagementService/GetLogLevel",
+  "/dmi.NativeHWManagementService/HeartbeatCheck",
 };
 
 std::unique_ptr< NativeHWManagementService::Stub> NativeHWManagementService::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
@@ -57,6 +58,7 @@
   , rpcmethod_GetLoggableEntities_(NativeHWManagementService_method_names[10], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   , rpcmethod_SetLogLevel_(NativeHWManagementService_method_names[11], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   , rpcmethod_GetLogLevel_(NativeHWManagementService_method_names[12], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  , rpcmethod_HeartbeatCheck_(NativeHWManagementService_method_names[13], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   {}
 
 ::grpc::ClientReader< ::dmi::StartManagingDeviceResponse>* NativeHWManagementService::Stub::StartManagingDeviceRaw(::grpc::ClientContext* context, const ::dmi::ModifiableComponent& request) {
@@ -387,6 +389,34 @@
   return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::GetLogLevelResponse>::Create(channel_.get(), cq, rpcmethod_GetLogLevel_, context, request, false);
 }
 
+::grpc::Status NativeHWManagementService::Stub::HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::dmi::Heartbeat* response) {
+  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_HeartbeatCheck_, context, request, response);
+}
+
+void NativeHWManagementService::Stub::experimental_async::HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response, std::function<void(::grpc::Status)> f) {
+  ::grpc_impl::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_HeartbeatCheck_, context, request, response, std::move(f));
+}
+
+void NativeHWManagementService::Stub::experimental_async::HeartbeatCheck(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::Heartbeat* response, std::function<void(::grpc::Status)> f) {
+  ::grpc_impl::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_HeartbeatCheck_, context, request, response, std::move(f));
+}
+
+void NativeHWManagementService::Stub::experimental_async::HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc_impl::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_HeartbeatCheck_, context, request, response, reactor);
+}
+
+void NativeHWManagementService::Stub::experimental_async::HeartbeatCheck(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::Heartbeat* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc_impl::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_HeartbeatCheck_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::dmi::Heartbeat>* NativeHWManagementService::Stub::AsyncHeartbeatCheckRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::Heartbeat>::Create(channel_.get(), cq, rpcmethod_HeartbeatCheck_, context, request, true);
+}
+
+::grpc::ClientAsyncResponseReader< ::dmi::Heartbeat>* NativeHWManagementService::Stub::PrepareAsyncHeartbeatCheckRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::Heartbeat>::Create(channel_.get(), cq, rpcmethod_HeartbeatCheck_, context, request, false);
+}
+
 NativeHWManagementService::Service::Service() {
   AddMethod(new ::grpc::internal::RpcServiceMethod(
       NativeHWManagementService_method_names[0],
@@ -518,6 +548,16 @@
              ::dmi::GetLogLevelResponse* resp) {
                return service->GetLogLevel(ctx, req, resp);
              }, this)));
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      NativeHWManagementService_method_names[13],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< NativeHWManagementService::Service, ::google::protobuf::Empty, ::dmi::Heartbeat>(
+          [](NativeHWManagementService::Service* service,
+             ::grpc_impl::ServerContext* ctx,
+             const ::google::protobuf::Empty* req,
+             ::dmi::Heartbeat* resp) {
+               return service->HeartbeatCheck(ctx, req, resp);
+             }, this)));
 }
 
 NativeHWManagementService::Service::~Service() {
@@ -614,6 +654,13 @@
   return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
 }
 
+::grpc::Status NativeHWManagementService::Service::HeartbeatCheck(::grpc::ServerContext* context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
 
 }  // namespace dmi
 
diff --git a/cpp/dmi/hw_management_service.grpc.pb.h b/cpp/dmi/hw_management_service.grpc.pb.h
index db23956..a468ab2 100644
--- a/cpp/dmi/hw_management_service.grpc.pb.h
+++ b/cpp/dmi/hw_management_service.grpc.pb.h
@@ -161,6 +161,14 @@
     std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetLogLevelResponse>> PrepareAsyncGetLogLevel(::grpc::ClientContext* context, const ::dmi::GetLogLevelRequest& request, ::grpc::CompletionQueue* cq) {
       return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetLogLevelResponse>>(PrepareAsyncGetLogLevelRaw(context, request, cq));
     }
+    // Performs the heartbeat check

+    virtual ::grpc::Status HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::dmi::Heartbeat* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::Heartbeat>> AsyncHeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::Heartbeat>>(AsyncHeartbeatCheckRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::Heartbeat>> PrepareAsyncHeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::Heartbeat>>(PrepareAsyncHeartbeatCheckRaw(context, request, cq));
+    }
     class experimental_async_interface {
      public:
       virtual ~experimental_async_interface() {}
@@ -327,6 +335,19 @@
       #else
       virtual void GetLogLevel(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::GetLogLevelResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
       #endif
+      // Performs the heartbeat check

+      virtual void HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response, std::function<void(::grpc::Status)>) = 0;
+      virtual void HeartbeatCheck(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::Heartbeat* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void HeartbeatCheck(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::Heartbeat* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void HeartbeatCheck(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::Heartbeat* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
     };
     #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
     typedef class experimental_async_interface async_interface;
@@ -365,6 +386,8 @@
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::SetLogLevelResponse>* PrepareAsyncSetLogLevelRaw(::grpc::ClientContext* context, const ::dmi::SetLogLevelRequest& request, ::grpc::CompletionQueue* cq) = 0;
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetLogLevelResponse>* AsyncGetLogLevelRaw(::grpc::ClientContext* context, const ::dmi::GetLogLevelRequest& request, ::grpc::CompletionQueue* cq) = 0;
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetLogLevelResponse>* PrepareAsyncGetLogLevelRaw(::grpc::ClientContext* context, const ::dmi::GetLogLevelRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::Heartbeat>* AsyncHeartbeatCheckRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::Heartbeat>* PrepareAsyncHeartbeatCheckRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) = 0;
   };
   class Stub final : public StubInterface {
    public:
@@ -466,6 +489,13 @@
     std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::GetLogLevelResponse>> PrepareAsyncGetLogLevel(::grpc::ClientContext* context, const ::dmi::GetLogLevelRequest& request, ::grpc::CompletionQueue* cq) {
       return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::GetLogLevelResponse>>(PrepareAsyncGetLogLevelRaw(context, request, cq));
     }
+    ::grpc::Status HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::dmi::Heartbeat* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::Heartbeat>> AsyncHeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::Heartbeat>>(AsyncHeartbeatCheckRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::Heartbeat>> PrepareAsyncHeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::Heartbeat>>(PrepareAsyncHeartbeatCheckRaw(context, request, cq));
+    }
     class experimental_async final :
       public StubInterface::experimental_async_interface {
      public:
@@ -604,6 +634,18 @@
       #else
       void GetLogLevel(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::GetLogLevelResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
       #endif
+      void HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response, std::function<void(::grpc::Status)>) override;
+      void HeartbeatCheck(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::Heartbeat* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void HeartbeatCheck(::grpc::ClientContext* context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void HeartbeatCheck(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::Heartbeat* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void HeartbeatCheck(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::Heartbeat* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
      private:
       friend class Stub;
       explicit experimental_async(Stub* stub): stub_(stub) { }
@@ -644,6 +686,8 @@
     ::grpc::ClientAsyncResponseReader< ::dmi::SetLogLevelResponse>* PrepareAsyncSetLogLevelRaw(::grpc::ClientContext* context, const ::dmi::SetLogLevelRequest& request, ::grpc::CompletionQueue* cq) override;
     ::grpc::ClientAsyncResponseReader< ::dmi::GetLogLevelResponse>* AsyncGetLogLevelRaw(::grpc::ClientContext* context, const ::dmi::GetLogLevelRequest& request, ::grpc::CompletionQueue* cq) override;
     ::grpc::ClientAsyncResponseReader< ::dmi::GetLogLevelResponse>* PrepareAsyncGetLogLevelRaw(::grpc::ClientContext* context, const ::dmi::GetLogLevelRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::dmi::Heartbeat>* AsyncHeartbeatCheckRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::dmi::Heartbeat>* PrepareAsyncHeartbeatCheckRaw(::grpc::ClientContext* context, const ::google::protobuf::Empty& request, ::grpc::CompletionQueue* cq) override;
     const ::grpc::internal::RpcMethod rpcmethod_StartManagingDevice_;
     const ::grpc::internal::RpcMethod rpcmethod_StopManagingDevice_;
     const ::grpc::internal::RpcMethod rpcmethod_GetManagedDevices_;
@@ -657,6 +701,7 @@
     const ::grpc::internal::RpcMethod rpcmethod_GetLoggableEntities_;
     const ::grpc::internal::RpcMethod rpcmethod_SetLogLevel_;
     const ::grpc::internal::RpcMethod rpcmethod_GetLogLevel_;
+    const ::grpc::internal::RpcMethod rpcmethod_HeartbeatCheck_;
   };
   static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
 
@@ -705,6 +750,8 @@
     // Gets the configured log level for a certain entity on a certain device.

     // If no entity is specified in the request all the entities with their log level should be returned.

     virtual ::grpc::Status GetLogLevel(::grpc::ServerContext* context, const ::dmi::GetLogLevelRequest* request, ::dmi::GetLogLevelResponse* response);
+    // Performs the heartbeat check

+    virtual ::grpc::Status HeartbeatCheck(::grpc::ServerContext* context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response);
   };
   template <class BaseClass>
   class WithAsyncMethod_StartManagingDevice : public BaseClass {
@@ -966,7 +1013,27 @@
       ::grpc::Service::RequestAsyncUnary(12, context, request, response, new_call_cq, notification_cq, tag);
     }
   };
-  typedef WithAsyncMethod_StartManagingDevice<WithAsyncMethod_StopManagingDevice<WithAsyncMethod_GetManagedDevices<WithAsyncMethod_GetPhysicalInventory<WithAsyncMethod_GetHWComponentInfo<WithAsyncMethod_SetHWComponentInfo<WithAsyncMethod_SetLoggingEndpoint<WithAsyncMethod_GetLoggingEndpoint<WithAsyncMethod_SetMsgBusEndpoint<WithAsyncMethod_GetMsgBusEndpoint<WithAsyncMethod_GetLoggableEntities<WithAsyncMethod_SetLogLevel<WithAsyncMethod_GetLogLevel<Service > > > > > > > > > > > > > AsyncService;
+  template <class BaseClass>
+  class WithAsyncMethod_HeartbeatCheck : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_HeartbeatCheck() {
+      ::grpc::Service::MarkMethodAsync(13);
+    }
+    ~WithAsyncMethod_HeartbeatCheck() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status HeartbeatCheck(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::dmi::Heartbeat* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestHeartbeatCheck(::grpc::ServerContext* context, ::google::protobuf::Empty* request, ::grpc::ServerAsyncResponseWriter< ::dmi::Heartbeat>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(13, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  typedef WithAsyncMethod_StartManagingDevice<WithAsyncMethod_StopManagingDevice<WithAsyncMethod_GetManagedDevices<WithAsyncMethod_GetPhysicalInventory<WithAsyncMethod_GetHWComponentInfo<WithAsyncMethod_SetHWComponentInfo<WithAsyncMethod_SetLoggingEndpoint<WithAsyncMethod_GetLoggingEndpoint<WithAsyncMethod_SetMsgBusEndpoint<WithAsyncMethod_GetMsgBusEndpoint<WithAsyncMethod_GetLoggableEntities<WithAsyncMethod_SetLogLevel<WithAsyncMethod_GetLogLevel<WithAsyncMethod_HeartbeatCheck<Service > > > > > > > > > > > > > > AsyncService;
   template <class BaseClass>
   class ExperimentalWithCallbackMethod_StartManagingDevice : public BaseClass {
    private:
@@ -1551,11 +1618,58 @@
     #endif
       { return nullptr; }
   };
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_HeartbeatCheck : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_HeartbeatCheck() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(13,
+          new ::grpc_impl::internal::CallbackUnaryHandler< ::google::protobuf::Empty, ::dmi::Heartbeat>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::google::protobuf::Empty* request, ::dmi::Heartbeat* response) { return this->HeartbeatCheck(context, request, response); }));}
+    void SetMessageAllocatorFor_HeartbeatCheck(
+        ::grpc::experimental::MessageAllocator< ::google::protobuf::Empty, ::dmi::Heartbeat>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(13);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(13);
+    #endif
+      static_cast<::grpc_impl::internal::CallbackUnaryHandler< ::google::protobuf::Empty, ::dmi::Heartbeat>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_HeartbeatCheck() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status HeartbeatCheck(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::dmi::Heartbeat* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* HeartbeatCheck(
+      ::grpc::CallbackServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::dmi::Heartbeat* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* HeartbeatCheck(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::dmi::Heartbeat* /*response*/)
+    #endif
+      { return nullptr; }
+  };
   #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
-  typedef ExperimentalWithCallbackMethod_StartManagingDevice<ExperimentalWithCallbackMethod_StopManagingDevice<ExperimentalWithCallbackMethod_GetManagedDevices<ExperimentalWithCallbackMethod_GetPhysicalInventory<ExperimentalWithCallbackMethod_GetHWComponentInfo<ExperimentalWithCallbackMethod_SetHWComponentInfo<ExperimentalWithCallbackMethod_SetLoggingEndpoint<ExperimentalWithCallbackMethod_GetLoggingEndpoint<ExperimentalWithCallbackMethod_SetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetLoggableEntities<ExperimentalWithCallbackMethod_SetLogLevel<ExperimentalWithCallbackMethod_GetLogLevel<Service > > > > > > > > > > > > > CallbackService;
+  typedef ExperimentalWithCallbackMethod_StartManagingDevice<ExperimentalWithCallbackMethod_StopManagingDevice<ExperimentalWithCallbackMethod_GetManagedDevices<ExperimentalWithCallbackMethod_GetPhysicalInventory<ExperimentalWithCallbackMethod_GetHWComponentInfo<ExperimentalWithCallbackMethod_SetHWComponentInfo<ExperimentalWithCallbackMethod_SetLoggingEndpoint<ExperimentalWithCallbackMethod_GetLoggingEndpoint<ExperimentalWithCallbackMethod_SetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetLoggableEntities<ExperimentalWithCallbackMethod_SetLogLevel<ExperimentalWithCallbackMethod_GetLogLevel<ExperimentalWithCallbackMethod_HeartbeatCheck<Service > > > > > > > > > > > > > > CallbackService;
   #endif
 
-  typedef ExperimentalWithCallbackMethod_StartManagingDevice<ExperimentalWithCallbackMethod_StopManagingDevice<ExperimentalWithCallbackMethod_GetManagedDevices<ExperimentalWithCallbackMethod_GetPhysicalInventory<ExperimentalWithCallbackMethod_GetHWComponentInfo<ExperimentalWithCallbackMethod_SetHWComponentInfo<ExperimentalWithCallbackMethod_SetLoggingEndpoint<ExperimentalWithCallbackMethod_GetLoggingEndpoint<ExperimentalWithCallbackMethod_SetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetLoggableEntities<ExperimentalWithCallbackMethod_SetLogLevel<ExperimentalWithCallbackMethod_GetLogLevel<Service > > > > > > > > > > > > > ExperimentalCallbackService;
+  typedef ExperimentalWithCallbackMethod_StartManagingDevice<ExperimentalWithCallbackMethod_StopManagingDevice<ExperimentalWithCallbackMethod_GetManagedDevices<ExperimentalWithCallbackMethod_GetPhysicalInventory<ExperimentalWithCallbackMethod_GetHWComponentInfo<ExperimentalWithCallbackMethod_SetHWComponentInfo<ExperimentalWithCallbackMethod_SetLoggingEndpoint<ExperimentalWithCallbackMethod_GetLoggingEndpoint<ExperimentalWithCallbackMethod_SetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetLoggableEntities<ExperimentalWithCallbackMethod_SetLogLevel<ExperimentalWithCallbackMethod_GetLogLevel<ExperimentalWithCallbackMethod_HeartbeatCheck<Service > > > > > > > > > > > > > > ExperimentalCallbackService;
   template <class BaseClass>
   class WithGenericMethod_StartManagingDevice : public BaseClass {
    private:
@@ -1778,6 +1892,23 @@
     }
   };
   template <class BaseClass>
+  class WithGenericMethod_HeartbeatCheck : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_HeartbeatCheck() {
+      ::grpc::Service::MarkMethodGeneric(13);
+    }
+    ~WithGenericMethod_HeartbeatCheck() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status HeartbeatCheck(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::dmi::Heartbeat* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
   class WithRawMethod_StartManagingDevice : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -2038,6 +2169,26 @@
     }
   };
   template <class BaseClass>
+  class WithRawMethod_HeartbeatCheck : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_HeartbeatCheck() {
+      ::grpc::Service::MarkMethodRaw(13);
+    }
+    ~WithRawMethod_HeartbeatCheck() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status HeartbeatCheck(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::dmi::Heartbeat* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestHeartbeatCheck(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(13, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
   class ExperimentalWithRawCallbackMethod_StartManagingDevice : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -2532,6 +2683,44 @@
       { return nullptr; }
   };
   template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_HeartbeatCheck : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_HeartbeatCheck() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(13,
+          new ::grpc_impl::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->HeartbeatCheck(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_HeartbeatCheck() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status HeartbeatCheck(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::dmi::Heartbeat* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* HeartbeatCheck(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* HeartbeatCheck(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
   class WithStreamedUnaryMethod_StopManagingDevice : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -2801,7 +2990,34 @@
     // replace default version of method with streamed unary
     virtual ::grpc::Status StreamedGetLogLevel(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::dmi::GetLogLevelRequest,::dmi::GetLogLevelResponse>* server_unary_streamer) = 0;
   };
-  typedef WithStreamedUnaryMethod_StopManagingDevice<WithStreamedUnaryMethod_GetManagedDevices<WithStreamedUnaryMethod_SetHWComponentInfo<WithStreamedUnaryMethod_SetLoggingEndpoint<WithStreamedUnaryMethod_GetLoggingEndpoint<WithStreamedUnaryMethod_SetMsgBusEndpoint<WithStreamedUnaryMethod_GetMsgBusEndpoint<WithStreamedUnaryMethod_GetLoggableEntities<WithStreamedUnaryMethod_SetLogLevel<WithStreamedUnaryMethod_GetLogLevel<Service > > > > > > > > > > StreamedUnaryService;
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_HeartbeatCheck : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_HeartbeatCheck() {
+      ::grpc::Service::MarkMethodStreamed(13,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::google::protobuf::Empty, ::dmi::Heartbeat>(
+            [this](::grpc_impl::ServerContext* context,
+                   ::grpc_impl::ServerUnaryStreamer<
+                     ::google::protobuf::Empty, ::dmi::Heartbeat>* streamer) {
+                       return this->StreamedHeartbeatCheck(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_HeartbeatCheck() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status HeartbeatCheck(::grpc::ServerContext* /*context*/, const ::google::protobuf::Empty* /*request*/, ::dmi::Heartbeat* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status StreamedHeartbeatCheck(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::google::protobuf::Empty,::dmi::Heartbeat>* server_unary_streamer) = 0;
+  };
+  typedef WithStreamedUnaryMethod_StopManagingDevice<WithStreamedUnaryMethod_GetManagedDevices<WithStreamedUnaryMethod_SetHWComponentInfo<WithStreamedUnaryMethod_SetLoggingEndpoint<WithStreamedUnaryMethod_GetLoggingEndpoint<WithStreamedUnaryMethod_SetMsgBusEndpoint<WithStreamedUnaryMethod_GetMsgBusEndpoint<WithStreamedUnaryMethod_GetLoggableEntities<WithStreamedUnaryMethod_SetLogLevel<WithStreamedUnaryMethod_GetLogLevel<WithStreamedUnaryMethod_HeartbeatCheck<Service > > > > > > > > > > > StreamedUnaryService;
   template <class BaseClass>
   class WithSplitStreamingMethod_StartManagingDevice : public BaseClass {
    private:
@@ -2884,7 +3100,7 @@
     virtual ::grpc::Status StreamedGetHWComponentInfo(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::dmi::HWComponentInfoGetRequest,::dmi::HWComponentInfoGetResponse>* server_split_streamer) = 0;
   };
   typedef WithSplitStreamingMethod_StartManagingDevice<WithSplitStreamingMethod_GetPhysicalInventory<WithSplitStreamingMethod_GetHWComponentInfo<Service > > > SplitStreamedService;
-  typedef WithSplitStreamingMethod_StartManagingDevice<WithStreamedUnaryMethod_StopManagingDevice<WithStreamedUnaryMethod_GetManagedDevices<WithSplitStreamingMethod_GetPhysicalInventory<WithSplitStreamingMethod_GetHWComponentInfo<WithStreamedUnaryMethod_SetHWComponentInfo<WithStreamedUnaryMethod_SetLoggingEndpoint<WithStreamedUnaryMethod_GetLoggingEndpoint<WithStreamedUnaryMethod_SetMsgBusEndpoint<WithStreamedUnaryMethod_GetMsgBusEndpoint<WithStreamedUnaryMethod_GetLoggableEntities<WithStreamedUnaryMethod_SetLogLevel<WithStreamedUnaryMethod_GetLogLevel<Service > > > > > > > > > > > > > StreamedService;
+  typedef WithSplitStreamingMethod_StartManagingDevice<WithStreamedUnaryMethod_StopManagingDevice<WithStreamedUnaryMethod_GetManagedDevices<WithSplitStreamingMethod_GetPhysicalInventory<WithSplitStreamingMethod_GetHWComponentInfo<WithStreamedUnaryMethod_SetHWComponentInfo<WithStreamedUnaryMethod_SetLoggingEndpoint<WithStreamedUnaryMethod_GetLoggingEndpoint<WithStreamedUnaryMethod_SetMsgBusEndpoint<WithStreamedUnaryMethod_GetMsgBusEndpoint<WithStreamedUnaryMethod_GetLoggableEntities<WithStreamedUnaryMethod_SetLogLevel<WithStreamedUnaryMethod_GetLogLevel<WithStreamedUnaryMethod_HeartbeatCheck<Service > > > > > > > > > > > > > > StreamedService;
 };
 
 }  // namespace dmi
diff --git a/cpp/dmi/hw_management_service.pb.cc b/cpp/dmi/hw_management_service.pb.cc
index 573645e..c6496a0 100644
--- a/cpp/dmi/hw_management_service.pb.cc
+++ b/cpp/dmi/hw_management_service.pb.cc
@@ -111,6 +111,10 @@
  public:
   ::google::protobuf::internal::ExplicitlyConstructed<GetLoggableEntitiesRequest> _instance;
 } _GetLoggableEntitiesRequest_default_instance_;
+class HeartbeatDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<Heartbeat> _instance;
+} _Heartbeat_default_instance_;
 }  // namespace dmi
 static void InitDefaultsPhysicalInventoryRequest_dmi_2fhw_5fmanagement_5fservice_2eproto() {
   GOOGLE_PROTOBUF_VERIFY_VERSION;
@@ -438,6 +442,20 @@
     {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsGetLoggableEntitiesRequest_dmi_2fhw_5fmanagement_5fservice_2eproto}, {
       &scc_info_Uuid_dmi_2fhw_2eproto.base,}};
 
+static void InitDefaultsHeartbeat_dmi_2fhw_5fmanagement_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_Heartbeat_default_instance_;
+    new (ptr) ::dmi::Heartbeat();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::Heartbeat::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<0> scc_info_Heartbeat_dmi_2fhw_5fmanagement_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsHeartbeat_dmi_2fhw_5fmanagement_5fservice_2eproto}, {}};
+
 void InitDefaults_dmi_2fhw_5fmanagement_5fservice_2eproto() {
   ::google::protobuf::internal::InitSCC(&scc_info_PhysicalInventoryRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_PhysicalInventoryResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
@@ -461,9 +479,10 @@
   ::google::protobuf::internal::InitSCC(&scc_info_GetLogLevelRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_GetLogLevelResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_GetLoggableEntitiesRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_Heartbeat_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
 }
 
-::google::protobuf::Metadata file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[22];
+::google::protobuf::Metadata file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[23];
 const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto[11];
 constexpr ::google::protobuf::ServiceDescriptor const** file_level_service_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto = nullptr;
 
@@ -642,6 +661,12 @@
   ~0u,  // no _oneof_case_
   ~0u,  // no _weak_field_map_
   PROTOBUF_FIELD_OFFSET(::dmi::GetLoggableEntitiesRequest, device_uuid_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::Heartbeat, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::Heartbeat, heartbeat_signature_),
 };
 static const ::google::protobuf::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
   { 0, -1, sizeof(::dmi::PhysicalInventoryRequest)},
@@ -666,6 +691,7 @@
   { 151, -1, sizeof(::dmi::GetLogLevelRequest)},
   { 158, -1, sizeof(::dmi::GetLogLevelResponse)},
   { 168, -1, sizeof(::dmi::GetLoggableEntitiesRequest)},
+  { 174, -1, sizeof(::dmi::Heartbeat)},
 };
 
 static ::google::protobuf::Message const * const file_default_instances[] = {
@@ -691,12 +717,13 @@
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_GetLogLevelRequest_default_instance_),
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_GetLogLevelResponse_default_instance_),
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_GetLoggableEntitiesRequest_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_Heartbeat_default_instance_),
 };
 
 ::google::protobuf::internal::AssignDescriptorsTable assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto = {
   {}, AddDescriptors_dmi_2fhw_5fmanagement_5fservice_2eproto, "dmi/hw_management_service.proto", schemas,
   file_default_instances, TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto::offsets,
-  file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto, 22, file_level_enum_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto, file_level_service_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto,
+  file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto, 23, file_level_enum_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto, file_level_service_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto,
 };
 
 const char descriptor_table_protodef_dmi_2fhw_5fmanagement_5fservice_2eproto[] =
@@ -800,41 +827,43 @@
   "ON\020\000\022\022\n\016UNKNOWN_DEVICE\020\001\022\022\n\016INTERNAL_ERR"
   "OR\020\002\022\026\n\022UNKNOWN_LOG_ENTITY\020\003\022\026\n\022DEVICE_U"
   "NREACHABLE\020\004\"<\n\032GetLoggableEntitiesReque"
-  "st\022\036\n\013device_uuid\030\001 \001(\0132\t.dmi.Uuid2\257\010\n\031N"
-  "ativeHWManagementService\022S\n\023StartManagin"
-  "gDevice\022\030.dmi.ModifiableComponent\032 .dmi."
-  "StartManagingDeviceResponse0\001\022U\n\022StopMan"
-  "agingDevice\022\036.dmi.StopManagingDeviceRequ"
-  "est\032\037.dmi.StopManagingDeviceResponse\022H\n\021"
-  "GetManagedDevices\022\026.google.protobuf.Empt"
-  "y\032\033.dmi.ManagedDevicesResponse\022W\n\024GetPhy"
-  "sicalInventory\022\035.dmi.PhysicalInventoryRe"
-  "quest\032\036.dmi.PhysicalInventoryResponse0\001\022"
-  "W\n\022GetHWComponentInfo\022\036.dmi.HWComponentI"
-  "nfoGetRequest\032\037.dmi.HWComponentInfoGetRe"
-  "sponse0\001\022U\n\022SetHWComponentInfo\022\036.dmi.HWC"
-  "omponentInfoSetRequest\032\037.dmi.HWComponent"
-  "InfoSetResponse\022T\n\022SetLoggingEndpoint\022\036."
-  "dmi.SetLoggingEndpointRequest\032\036.dmi.SetR"
-  "emoteEndpointResponse\022F\n\022GetLoggingEndpo"
-  "int\022\017.dmi.HardwareID\032\037.dmi.GetLoggingEnd"
-  "pointResponse\022R\n\021SetMsgBusEndpoint\022\035.dmi"
-  ".SetMsgBusEndpointRequest\032\036.dmi.SetRemot"
-  "eEndpointResponse\022K\n\021GetMsgBusEndpoint\022\026"
-  ".google.protobuf.Empty\032\036.dmi.GetMsgBusEn"
-  "dpointResponse\022P\n\023GetLoggableEntities\022\037."
-  "dmi.GetLoggableEntitiesRequest\032\030.dmi.Get"
-  "LogLevelResponse\022@\n\013SetLogLevel\022\027.dmi.Se"
-  "tLogLevelRequest\032\030.dmi.SetLogLevelRespon"
-  "se\022@\n\013GetLogLevel\022\027.dmi.GetLogLevelReque"
-  "st\032\030.dmi.GetLogLevelResponseB;Z9github.c"
-  "om/opencord/device-management-interface/"
-  "v3/go/dmib\006proto3"
+  "st\022\036\n\013device_uuid\030\001 \001(\0132\t.dmi.Uuid\"(\n\tHe"
+  "artbeat\022\033\n\023heartbeat_signature\030\001 \001(\0072\351\010\n"
+  "\031NativeHWManagementService\022S\n\023StartManag"
+  "ingDevice\022\030.dmi.ModifiableComponent\032 .dm"
+  "i.StartManagingDeviceResponse0\001\022U\n\022StopM"
+  "anagingDevice\022\036.dmi.StopManagingDeviceRe"
+  "quest\032\037.dmi.StopManagingDeviceResponse\022H"
+  "\n\021GetManagedDevices\022\026.google.protobuf.Em"
+  "pty\032\033.dmi.ManagedDevicesResponse\022W\n\024GetP"
+  "hysicalInventory\022\035.dmi.PhysicalInventory"
+  "Request\032\036.dmi.PhysicalInventoryResponse0"
+  "\001\022W\n\022GetHWComponentInfo\022\036.dmi.HWComponen"
+  "tInfoGetRequest\032\037.dmi.HWComponentInfoGet"
+  "Response0\001\022U\n\022SetHWComponentInfo\022\036.dmi.H"
+  "WComponentInfoSetRequest\032\037.dmi.HWCompone"
+  "ntInfoSetResponse\022T\n\022SetLoggingEndpoint\022"
+  "\036.dmi.SetLoggingEndpointRequest\032\036.dmi.Se"
+  "tRemoteEndpointResponse\022F\n\022GetLoggingEnd"
+  "point\022\017.dmi.HardwareID\032\037.dmi.GetLoggingE"
+  "ndpointResponse\022R\n\021SetMsgBusEndpoint\022\035.d"
+  "mi.SetMsgBusEndpointRequest\032\036.dmi.SetRem"
+  "oteEndpointResponse\022K\n\021GetMsgBusEndpoint"
+  "\022\026.google.protobuf.Empty\032\036.dmi.GetMsgBus"
+  "EndpointResponse\022P\n\023GetLoggableEntities\022"
+  "\037.dmi.GetLoggableEntitiesRequest\032\030.dmi.G"
+  "etLogLevelResponse\022@\n\013SetLogLevel\022\027.dmi."
+  "SetLogLevelRequest\032\030.dmi.SetLogLevelResp"
+  "onse\022@\n\013GetLogLevel\022\027.dmi.GetLogLevelReq"
+  "uest\032\030.dmi.GetLogLevelResponse\0228\n\016Heartb"
+  "eatCheck\022\026.google.protobuf.Empty\032\016.dmi.H"
+  "eartbeatB;Z9github.com/opencord/device-m"
+  "anagement-interface/v3/go/dmib\006proto3"
   ;
 ::google::protobuf::internal::DescriptorTable descriptor_table_dmi_2fhw_5fmanagement_5fservice_2eproto = {
   false, InitDefaults_dmi_2fhw_5fmanagement_5fservice_2eproto, 
   descriptor_table_protodef_dmi_2fhw_5fmanagement_5fservice_2eproto,
-  "dmi/hw_management_service.proto", &assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto, 5177,
+  "dmi/hw_management_service.proto", &assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto, 5277,
 };
 
 void AddDescriptors_dmi_2fhw_5fmanagement_5fservice_2eproto() {
@@ -10120,6 +10149,264 @@
 }
 
 
+// ===================================================================
+
+void Heartbeat::InitAsDefaultInstance() {
+}
+class Heartbeat::HasBitSetters {
+ public:
+};
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int Heartbeat::kHeartbeatSignatureFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+Heartbeat::Heartbeat()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.Heartbeat)
+}
+Heartbeat::Heartbeat(const Heartbeat& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  heartbeat_signature_ = from.heartbeat_signature_;
+  // @@protoc_insertion_point(copy_constructor:dmi.Heartbeat)
+}
+
+void Heartbeat::SharedCtor() {
+  heartbeat_signature_ = 0u;
+}
+
+Heartbeat::~Heartbeat() {
+  // @@protoc_insertion_point(destructor:dmi.Heartbeat)
+  SharedDtor();
+}
+
+void Heartbeat::SharedDtor() {
+}
+
+void Heartbeat::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const Heartbeat& Heartbeat::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_Heartbeat_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void Heartbeat::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.Heartbeat)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  heartbeat_signature_ = 0u;
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* Heartbeat::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<Heartbeat*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // fixed32 heartbeat_signature = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 13) goto handle_unusual;
+        msg->set_heartbeat_signature(::google::protobuf::io::UnalignedLoad<::google::protobuf::uint32>(ptr));
+        ptr += sizeof(::google::protobuf::uint32);
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool Heartbeat::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.Heartbeat)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // fixed32 heartbeat_signature = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (13 & 0xFF)) {
+
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_FIXED32>(
+                 input, &heartbeat_signature_)));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.Heartbeat)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.Heartbeat)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void Heartbeat::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.Heartbeat)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // fixed32 heartbeat_signature = 1;
+  if (this->heartbeat_signature() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteFixed32(1, this->heartbeat_signature(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.Heartbeat)
+}
+
+::google::protobuf::uint8* Heartbeat::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.Heartbeat)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // fixed32 heartbeat_signature = 1;
+  if (this->heartbeat_signature() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteFixed32ToArray(1, this->heartbeat_signature(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.Heartbeat)
+  return target;
+}
+
+size_t Heartbeat::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.Heartbeat)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // fixed32 heartbeat_signature = 1;
+  if (this->heartbeat_signature() != 0) {
+    total_size += 1 + 4;
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void Heartbeat::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.Heartbeat)
+  GOOGLE_DCHECK_NE(&from, this);
+  const Heartbeat* source =
+      ::google::protobuf::DynamicCastToGenerated<Heartbeat>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.Heartbeat)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.Heartbeat)
+    MergeFrom(*source);
+  }
+}
+
+void Heartbeat::MergeFrom(const Heartbeat& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.Heartbeat)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.heartbeat_signature() != 0) {
+    set_heartbeat_signature(from.heartbeat_signature());
+  }
+}
+
+void Heartbeat::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.Heartbeat)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void Heartbeat::CopyFrom(const Heartbeat& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.Heartbeat)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool Heartbeat::IsInitialized() const {
+  return true;
+}
+
+void Heartbeat::Swap(Heartbeat* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void Heartbeat::InternalSwap(Heartbeat* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  swap(heartbeat_signature_, other->heartbeat_signature_);
+}
+
+::google::protobuf::Metadata Heartbeat::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
 // @@protoc_insertion_point(namespace_scope)
 }  // namespace dmi
 namespace google {
@@ -10190,6 +10477,9 @@
 template<> PROTOBUF_NOINLINE ::dmi::GetLoggableEntitiesRequest* Arena::CreateMaybeMessage< ::dmi::GetLoggableEntitiesRequest >(Arena* arena) {
   return Arena::CreateInternal< ::dmi::GetLoggableEntitiesRequest >(arena);
 }
+template<> PROTOBUF_NOINLINE ::dmi::Heartbeat* Arena::CreateMaybeMessage< ::dmi::Heartbeat >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::Heartbeat >(arena);
+}
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/cpp/dmi/hw_management_service.pb.h b/cpp/dmi/hw_management_service.pb.h
index a304aa1..50398d2 100644
--- a/cpp/dmi/hw_management_service.pb.h
+++ b/cpp/dmi/hw_management_service.pb.h
@@ -45,7 +45,7 @@
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::google::protobuf::internal::AuxillaryParseTableField aux[]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
-  static const ::google::protobuf::internal::ParseTable schema[22]
+  static const ::google::protobuf::internal::ParseTable schema[23]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::google::protobuf::internal::FieldMetadata field_metadata[];
   static const ::google::protobuf::internal::SerializationTable serialization_table[];
@@ -83,6 +83,9 @@
 class HWComponentInfoSetResponse;
 class HWComponentInfoSetResponseDefaultTypeInternal;
 extern HWComponentInfoSetResponseDefaultTypeInternal _HWComponentInfoSetResponse_default_instance_;
+class Heartbeat;
+class HeartbeatDefaultTypeInternal;
+extern HeartbeatDefaultTypeInternal _Heartbeat_default_instance_;
 class ManagedDeviceInfo;
 class ManagedDeviceInfoDefaultTypeInternal;
 extern ManagedDeviceInfoDefaultTypeInternal _ManagedDeviceInfo_default_instance_;
@@ -132,6 +135,7 @@
 template<> ::dmi::HWComponentInfoGetResponse* Arena::CreateMaybeMessage<::dmi::HWComponentInfoGetResponse>(Arena*);
 template<> ::dmi::HWComponentInfoSetRequest* Arena::CreateMaybeMessage<::dmi::HWComponentInfoSetRequest>(Arena*);
 template<> ::dmi::HWComponentInfoSetResponse* Arena::CreateMaybeMessage<::dmi::HWComponentInfoSetResponse>(Arena*);
+template<> ::dmi::Heartbeat* Arena::CreateMaybeMessage<::dmi::Heartbeat>(Arena*);
 template<> ::dmi::ManagedDeviceInfo* Arena::CreateMaybeMessage<::dmi::ManagedDeviceInfo>(Arena*);
 template<> ::dmi::ManagedDevicesResponse* Arena::CreateMaybeMessage<::dmi::ManagedDevicesResponse>(Arena*);
 template<> ::dmi::PhysicalInventoryRequest* Arena::CreateMaybeMessage<::dmi::PhysicalInventoryRequest>(Arena*);
@@ -3754,6 +3758,118 @@
   mutable ::google::protobuf::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto;
 };
+// -------------------------------------------------------------------
+
+class Heartbeat final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.Heartbeat) */ {
+ public:
+  Heartbeat();
+  virtual ~Heartbeat();
+
+  Heartbeat(const Heartbeat& from);
+
+  inline Heartbeat& operator=(const Heartbeat& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  Heartbeat(Heartbeat&& from) noexcept
+    : Heartbeat() {
+    *this = ::std::move(from);
+  }
+
+  inline Heartbeat& operator=(Heartbeat&& from) noexcept {
+    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
+      if (this != &from) InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+  #endif
+  static const ::google::protobuf::Descriptor* descriptor() {
+    return default_instance().GetDescriptor();
+  }
+  static const Heartbeat& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const Heartbeat* internal_default_instance() {
+    return reinterpret_cast<const Heartbeat*>(
+               &_Heartbeat_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    22;
+
+  void Swap(Heartbeat* other);
+  friend void swap(Heartbeat& a, Heartbeat& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline Heartbeat* New() const final {
+    return CreateMaybeMessage<Heartbeat>(nullptr);
+  }
+
+  Heartbeat* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<Heartbeat>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const Heartbeat& from);
+  void MergeFrom(const Heartbeat& from);
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+  static const char* _InternalParse(const char* begin, const char* end, void* object, ::google::protobuf::internal::ParseContext* ctx);
+  ::google::protobuf::internal::ParseFunc _ParseFunc() const final { return _InternalParse; }
+  #else
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input) final;
+  #endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const final;
+  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
+      ::google::protobuf::uint8* target) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(Heartbeat* other);
+  private:
+  inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
+    return nullptr;
+  }
+  inline void* MaybeArenaPtr() const {
+    return nullptr;
+  }
+  public:
+
+  ::google::protobuf::Metadata GetMetadata() const final;
+
+  // nested types ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // fixed32 heartbeat_signature = 1;
+  void clear_heartbeat_signature();
+  static const int kHeartbeatSignatureFieldNumber = 1;
+  ::google::protobuf::uint32 heartbeat_signature() const;
+  void set_heartbeat_signature(::google::protobuf::uint32 value);
+
+  // @@protoc_insertion_point(class_scope:dmi.Heartbeat)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::uint32 heartbeat_signature_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto;
+};
 // ===================================================================
 
 
@@ -6171,6 +6287,24 @@
   // @@protoc_insertion_point(field_set_allocated:dmi.GetLoggableEntitiesRequest.device_uuid)
 }
 
+// -------------------------------------------------------------------
+
+// Heartbeat
+
+// fixed32 heartbeat_signature = 1;
+inline void Heartbeat::clear_heartbeat_signature() {
+  heartbeat_signature_ = 0u;
+}
+inline ::google::protobuf::uint32 Heartbeat::heartbeat_signature() const {
+  // @@protoc_insertion_point(field_get:dmi.Heartbeat.heartbeat_signature)
+  return heartbeat_signature_;
+}
+inline void Heartbeat::set_heartbeat_signature(::google::protobuf::uint32 value) {
+  
+  heartbeat_signature_ = value;
+  // @@protoc_insertion_point(field_set:dmi.Heartbeat.heartbeat_signature)
+}
+
 #ifdef __GNUC__
   #pragma GCC diagnostic pop
 #endif  // __GNUC__
@@ -6216,6 +6350,8 @@
 
 // -------------------------------------------------------------------
 
+// -------------------------------------------------------------------
+
 
 // @@protoc_insertion_point(namespace_scope)
 
diff --git a/dmi.pb b/dmi.pb
index 147fe01..6a96852 100644
--- a/dmi.pb
+++ b/dmi.pb
Binary files differ
diff --git a/go/dmi/hw_management_service.pb.go b/go/dmi/hw_management_service.pb.go
index 861755f..f7ee729 100644
--- a/go/dmi/hw_management_service.pb.go
+++ b/go/dmi/hw_management_service.pb.go
@@ -1581,6 +1581,45 @@
 	return nil
 }
 
+type Heartbeat struct {
+	HeartbeatSignature   uint32   `protobuf:"fixed32,1,opt,name=heartbeat_signature,json=heartbeatSignature,proto3" json:"heartbeat_signature,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Heartbeat) Reset()         { *m = Heartbeat{} }
+func (m *Heartbeat) String() string { return proto.CompactTextString(m) }
+func (*Heartbeat) ProtoMessage()    {}
+func (*Heartbeat) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{22}
+}
+
+func (m *Heartbeat) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Heartbeat.Unmarshal(m, b)
+}
+func (m *Heartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Heartbeat.Marshal(b, m, deterministic)
+}
+func (m *Heartbeat) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Heartbeat.Merge(m, src)
+}
+func (m *Heartbeat) XXX_Size() int {
+	return xxx_messageInfo_Heartbeat.Size(m)
+}
+func (m *Heartbeat) XXX_DiscardUnknown() {
+	xxx_messageInfo_Heartbeat.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Heartbeat proto.InternalMessageInfo
+
+func (m *Heartbeat) GetHeartbeatSignature() uint32 {
+	if m != nil {
+		return m.HeartbeatSignature
+	}
+	return 0
+}
+
 func init() {
 	proto.RegisterEnum("dmi.PhysicalInventoryResponse_Reason", PhysicalInventoryResponse_Reason_name, PhysicalInventoryResponse_Reason_value)
 	proto.RegisterEnum("dmi.HWComponentInfoGetResponse_Reason", HWComponentInfoGetResponse_Reason_name, HWComponentInfoGetResponse_Reason_value)
@@ -1615,102 +1654,106 @@
 	proto.RegisterType((*GetLogLevelRequest)(nil), "dmi.GetLogLevelRequest")
 	proto.RegisterType((*GetLogLevelResponse)(nil), "dmi.GetLogLevelResponse")
 	proto.RegisterType((*GetLoggableEntitiesRequest)(nil), "dmi.GetLoggableEntitiesRequest")
+	proto.RegisterType((*Heartbeat)(nil), "dmi.Heartbeat")
 }
 
 func init() { proto.RegisterFile("dmi/hw_management_service.proto", fileDescriptor_eae902e73066286d) }
 
 var fileDescriptor_eae902e73066286d = []byte{
-	// 1432 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcd, 0x6e, 0xdb, 0xc6,
-	0x16, 0xbe, 0x24, 0x65, 0x27, 0x3a, 0x4a, 0x1c, 0x79, 0x92, 0xf8, 0x4a, 0x0c, 0x62, 0xfb, 0x32,
-	0xc8, 0x8d, 0x73, 0x6f, 0x22, 0x19, 0xca, 0xa2, 0x68, 0x8b, 0xfe, 0xc8, 0x16, 0x43, 0xab, 0x91,
-	0x48, 0x61, 0x28, 0xc7, 0x48, 0x51, 0x54, 0xa0, 0xa5, 0xb1, 0x4c, 0x40, 0x24, 0x55, 0x91, 0x52,
-	0xe0, 0x07, 0xe8, 0xa2, 0x8f, 0xd0, 0x45, 0x81, 0xbe, 0x41, 0xd1, 0x2e, 0x8b, 0xbe, 0x41, 0xb7,
-	0x5d, 0x15, 0x05, 0x8a, 0x3e, 0x42, 0xdf, 0xa0, 0xd0, 0x0c, 0xa9, 0x1f, 0x8a, 0x94, 0x64, 0x39,
-	0x45, 0xb3, 0x93, 0x66, 0xce, 0x7c, 0x73, 0xe6, 0x7c, 0xdf, 0x1c, 0x9e, 0x39, 0xb0, 0xd3, 0xb2,
-	0xcc, 0xfc, 0xf9, 0xeb, 0x86, 0x65, 0xd8, 0x46, 0x9b, 0x58, 0xc4, 0xf6, 0x1a, 0x2e, 0xe9, 0x0d,
-	0xcc, 0x26, 0xc9, 0x75, 0x7b, 0x8e, 0xe7, 0x20, 0xa1, 0x65, 0x99, 0xe2, 0xe6, 0xd0, 0xaa, 0xe9,
-	0x58, 0x96, 0x63, 0xbb, 0x6c, 0x5c, 0xbc, 0xc1, 0x16, 0xfa, 0xff, 0xee, 0xb5, 0x1d, 0xa7, 0xdd,
-	0x21, 0x79, 0xfa, 0xef, 0xb4, 0x7f, 0x96, 0x27, 0x56, 0xd7, 0xbb, 0x60, 0x93, 0xd2, 0x73, 0xc8,
-	0xd4, 0xce, 0x2f, 0x5c, 0xb3, 0x69, 0x74, 0xca, 0xf6, 0x80, 0xd8, 0x9e, 0xd3, 0xbb, 0xc0, 0xe4,
-	0x8b, 0x3e, 0x71, 0x3d, 0xf4, 0x3f, 0x48, 0xb5, 0xc8, 0x70, 0xbb, 0x46, 0xbf, 0x6f, 0xb6, 0x32,
-	0xdc, 0x2e, 0xb7, 0x97, 0x2a, 0x24, 0x73, 0x2d, 0xcb, 0xcc, 0x1d, 0xf7, 0xcd, 0x16, 0x06, 0x36,
-	0x3b, 0xfc, 0x2d, 0x7d, 0xcf, 0x43, 0x36, 0x02, 0xc8, 0xed, 0x3a, 0xb6, 0x4b, 0xd0, 0x03, 0x58,
-	0x77, 0x3d, 0xc3, 0xeb, 0xbb, 0x14, 0x64, 0xa3, 0x90, 0xa2, 0x20, 0x3a, 0x1d, 0xc2, 0xfe, 0x14,
-	0xfa, 0x00, 0xd6, 0x7b, 0xc4, 0x70, 0x1d, 0x3b, 0xc3, 0x53, 0xa3, 0x87, 0xd4, 0x28, 0x16, 0x34,
-	0x87, 0xa9, 0x31, 0xf6, 0x17, 0xa1, 0xff, 0x43, 0xd2, 0x0c, 0x6c, 0x32, 0x02, 0xf5, 0xf5, 0x26,
-	0x45, 0x38, 0x32, 0x7a, 0xad, 0xd7, 0x46, 0x8f, 0xe0, 0xf1, 0x3c, 0x7a, 0x00, 0x37, 0xd9, 0xb2,
-	0x46, 0x8b, 0x78, 0x86, 0xd9, 0xc9, 0x24, 0x76, 0xb9, 0xbd, 0x24, 0xbe, 0xc1, 0x06, 0x4b, 0x74,
-	0x4c, 0xfa, 0x1c, 0xd6, 0xd9, 0x1e, 0xe8, 0x0e, 0xa4, 0x8f, 0xd5, 0x92, 0xfc, 0xbc, 0xac, 0xca,
-	0xa5, 0x06, 0x96, 0x8b, 0xba, 0xa6, 0xa6, 0xff, 0x85, 0x10, 0x6c, 0x1c, 0xab, 0x2f, 0x54, 0xed,
-	0x44, 0x6d, 0x94, 0xe4, 0x97, 0xe5, 0x43, 0x39, 0xcd, 0x0d, 0xc7, 0xca, 0x6a, 0x5d, 0xc6, 0x6a,
-	0xb1, 0xd2, 0x90, 0x31, 0xd6, 0x70, 0x9a, 0x47, 0x5b, 0x80, 0xd8, 0x7c, 0xe3, 0x58, 0xc5, 0x72,
-	0xf1, 0xf0, 0xa8, 0x78, 0x50, 0x91, 0xd3, 0x82, 0xf4, 0x2d, 0x07, 0xd9, 0xa3, 0x93, 0x43, 0xc7,
-	0xea, 0x3a, 0x36, 0xb1, 0xbd, 0xb2, 0x7d, 0xe6, 0x28, 0xc4, 0x5b, 0x21, 0xfa, 0x68, 0x1f, 0x36,
-	0x9a, 0x01, 0x0c, 0x33, 0xe7, 0xc3, 0xe6, 0x37, 0x47, 0x06, 0x74, 0xc5, 0xc3, 0xc9, 0x15, 0xb6,
-	0x61, 0x11, 0x1a, 0xb2, 0xe4, 0x84, 0x99, 0x6a, 0x58, 0x44, 0xfa, 0x99, 0x07, 0x31, 0xca, 0xc5,
-	0xcb, 0xf0, 0xfa, 0x61, 0x88, 0xd7, 0xff, 0x32, 0x56, 0x62, 0x51, 0xc3, 0xc4, 0x3e, 0x81, 0xe4,
-	0xc8, 0x29, 0x9f, 0xd8, 0x0d, 0x0a, 0x31, 0x02, 0xc0, 0x63, 0x83, 0xe5, 0x98, 0xed, 0xaf, 0xc0,
-	0xec, 0x5d, 0xd8, 0x0c, 0xc6, 0x0e, 0xb5, 0x6a, 0x4d, 0x53, 0x65, 0xb5, 0x9e, 0xe6, 0x23, 0x08,
-	0x17, 0x62, 0x08, 0x4f, 0x48, 0xbf, 0xcc, 0x12, 0xae, 0xbf, 0x5d, 0x84, 0xa3, 0x02, 0x5c, 0x6b,
-	0x9e, 0x1b, 0x76, 0x9b, 0xb8, 0x34, 0x70, 0xa9, 0x42, 0x86, 0x22, 0x56, 0x9d, 0x96, 0x79, 0x66,
-	0x1a, 0xa7, 0x1d, 0x32, 0x0e, 0x7a, 0x60, 0x28, 0xfd, 0x30, 0x2b, 0x12, 0xfd, 0x6f, 0x11, 0x89,
-	0x1e, 0x2f, 0x92, 0x19, 0xda, 0x85, 0x08, 0xda, 0xbf, 0xe2, 0xde, 0x30, 0xef, 0x2f, 0x8b, 0x95,
-	0x72, 0xa9, 0x51, 0x2b, 0xe2, 0x62, 0x55, 0x4f, 0x0b, 0x11, 0x5a, 0x48, 0xc4, 0x68, 0x61, 0x4d,
-	0xfa, 0x8d, 0x87, 0x7b, 0xba, 0x67, 0xf4, 0xbc, 0xea, 0x30, 0xbb, 0x9b, 0x76, 0xbb, 0x44, 0xd9,
-	0xbd, 0x5c, 0xd4, 0x3e, 0x0a, 0x45, 0xed, 0x51, 0x60, 0x14, 0x07, 0x1b, 0x0e, 0x5b, 0x48, 0x73,
-	0xc2, 0x3c, 0xcd, 0x2d, 0x75, 0xb3, 0xbe, 0x5c, 0x14, 0x62, 0x11, 0xb6, 0xfc, 0x78, 0x14, 0x2b,
-	0x58, 0x2e, 0x96, 0x5e, 0x35, 0xaa, 0x45, 0xb5, 0xa8, 0xc8, 0xa5, 0x34, 0x87, 0xfe, 0x03, 0xf7,
-	0xb5, 0x9a, 0x8c, 0x8b, 0xf5, 0xb2, 0xa6, 0x8e, 0xa6, 0xcb, 0x6a, 0xa3, 0x86, 0x35, 0x05, 0xcb,
-	0xba, 0xbe, 0x7c, 0xd8, 0xa5, 0x3c, 0x64, 0x75, 0xcf, 0xe9, 0x86, 0xa3, 0xc0, 0x6e, 0x1a, 0x82,
-	0x04, 0xbd, 0x01, 0x1c, 0x3d, 0x00, 0xfd, 0x2d, 0xfd, 0xca, 0x81, 0x18, 0xb5, 0xe2, 0xea, 0x22,
-	0x8e, 0x47, 0x5d, 0x49, 0xc4, 0x85, 0xcb, 0x6b, 0x58, 0xb2, 0x60, 0x93, 0x7a, 0x40, 0x5a, 0xcc,
-	0x81, 0xe1, 0x65, 0x42, 0x4f, 0x20, 0x61, 0xda, 0x67, 0x8e, 0x9f, 0x68, 0xe2, 0xef, 0x39, 0xb5,
-	0x0a, 0x2b, 0x85, 0x9f, 0x57, 0x0c, 0xfc, 0xce, 0xc1, 0xd6, 0xd4, 0x7e, 0xee, 0xe5, 0xe2, 0xf8,
-	0x5e, 0x28, 0x8e, 0x12, 0xf3, 0x2d, 0x12, 0x31, 0x1c, 0xc3, 0x7d, 0xb8, 0xc6, 0x3c, 0x71, 0x33,
-	0xc2, 0xae, 0xb0, 0x97, 0x2a, 0x6c, 0xcd, 0x2e, 0x1e, 0x1e, 0x1f, 0x07, 0x66, 0xcb, 0x04, 0x34,
-	0x24, 0x2f, 0x4e, 0xfa, 0x86, 0x83, 0xac, 0x4e, 0xbc, 0x8a, 0xd3, 0x1e, 0xb2, 0x2a, 0xdb, 0xad,
-	0xae, 0x63, 0xda, 0x2b, 0x65, 0xf2, 0xc7, 0x90, 0xee, 0x30, 0x94, 0x06, 0xf1, 0x61, 0xe8, 0xa9,
-	0x93, 0xf8, 0x56, 0x67, 0x1a, 0x7d, 0xd2, 0x94, 0x16, 0x6f, 0x4d, 0x27, 0x50, 0x48, 0x60, 0x5a,
-	0xf3, 0x87, 0xa5, 0x3f, 0x78, 0xea, 0x1f, 0x26, 0x96, 0xe3, 0x91, 0xb1, 0x7b, 0x57, 0x2f, 0xc7,
-	0x62, 0x41, 0x57, 0xd2, 0xf2, 0x8f, 0xdc, 0x1b, 0x2a, 0xb1, 0x44, 0xd8, 0xaa, 0x68, 0x8a, 0x52,
-	0x56, 0x95, 0x86, 0xac, 0x96, 0x6a, 0x5a, 0x59, 0xad, 0x8f, 0xbe, 0xc6, 0x0f, 0x60, 0x67, 0x66,
-	0xae, 0x86, 0xb5, 0xba, 0x76, 0xa8, 0x8d, 0xd3, 0x74, 0x16, 0xee, 0x56, 0x75, 0xe5, 0xe0, 0x58,
-	0x0f, 0xaf, 0x5f, 0x8b, 0xc9, 0xe0, 0xeb, 0xc3, 0x0c, 0x2e, 0x2a, 0x11, 0x1a, 0xb8, 0x7a, 0xc6,
-	0x88, 0x47, 0x0d, 0x47, 0x39, 0x4a, 0x3d, 0xc2, 0xf2, 0xea, 0x49, 0x44, 0xaa, 0x67, 0x96, 0xbb,
-	0xb5, 0x7f, 0xa0, 0x3a, 0x3e, 0x84, 0x8c, 0x4e, 0xbc, 0xaa, 0xdb, 0x3e, 0xe8, 0xbb, 0xe1, 0x0b,
-	0xf6, 0x08, 0x6e, 0x59, 0x6e, 0xfb, 0xb4, 0xef, 0x8e, 0x4f, 0xcd, 0x72, 0xf9, 0x06, 0x1b, 0x0e,
-	0xec, 0xa5, 0xaf, 0x79, 0xc8, 0x2a, 0xb3, 0x28, 0x57, 0xbf, 0x07, 0xb1, 0xa0, 0x61, 0x86, 0x22,
-	0x5c, 0x15, 0xa2, 0x5c, 0x5d, 0xee, 0xf3, 0xfa, 0xc9, 0xe5, 0x73, 0x55, 0x4c, 0x80, 0x79, 0xe9,
-	0x15, 0xa4, 0x65, 0xdb, 0x33, 0x3d, 0x93, 0xb8, 0x15, 0xa7, 0x5d, 0x21, 0x03, 0xd2, 0x41, 0x8f,
-	0xe1, 0x7a, 0xc7, 0xff, 0xed, 0xc7, 0x84, 0xbd, 0xa1, 0x02, 0x03, 0x3c, 0x9a, 0x46, 0x22, 0x5c,
-	0x27, 0xfe, 0xf2, 0x0c, 0xbf, 0x2b, 0xec, 0x25, 0xf1, 0xe8, 0xbf, 0xd4, 0x07, 0xc4, 0xb2, 0x23,
-	0x5b, 0xb4, 0x42, 0x5a, 0x7c, 0x06, 0xc9, 0xce, 0xf0, 0xd5, 0x3a, 0x20, 0x1d, 0x06, 0x9f, 0x2a,
-	0xdc, 0xa5, 0x96, 0x61, 0x97, 0xf1, 0xd8, 0x4e, 0xfa, 0x89, 0x87, 0xdb, 0x53, 0xfb, 0xfa, 0x3c,
-	0x5f, 0x66, 0xe3, 0xb1, 0x26, 0xf8, 0x78, 0x4d, 0xbc, 0x33, 0xd2, 0x84, 0x40, 0x8d, 0x76, 0x82,
-	0xdc, 0x18, 0xde, 0x7a, 0x61, 0x56, 0x8c, 0x22, 0x79, 0xf0, 0xe6, 0x6e, 0x56, 0x60, 0x57, 0xd1,
-	0x86, 0xc9, 0xaf, 0x5e, 0xae, 0xbf, 0x9a, 0xf3, 0x3c, 0xf9, 0x0c, 0x90, 0x72, 0x35, 0xd6, 0xe6,
-	0x69, 0xe2, 0x4f, 0x1e, 0x6e, 0x2b, 0x57, 0x24, 0x87, 0xa9, 0xa2, 0xb2, 0xa4, 0x2a, 0x98, 0xdd,
-	0x04, 0xa3, 0xc2, 0x32, 0x8c, 0x26, 0x26, 0x18, 0x55, 0x56, 0x60, 0x74, 0xed, 0x2d, 0x62, 0xf4,
-	0x68, 0xf4, 0x85, 0x1a, 0x96, 0x74, 0x41, 0x90, 0x56, 0x60, 0xb6, 0xf0, 0xdd, 0x75, 0xc8, 0xaa,
-	0x86, 0x67, 0x0e, 0xc8, 0xd1, 0x49, 0x75, 0xd4, 0x8f, 0xd2, 0x59, 0x3b, 0x0a, 0xe9, 0x70, 0x3b,
-	0xe2, 0xd1, 0x81, 0x62, 0x6b, 0x4a, 0x71, 0x77, 0xd1, 0x43, 0x65, 0x9f, 0x43, 0xc7, 0x80, 0x66,
-	0x4b, 0x67, 0xb4, 0x1d, 0x5b, 0x53, 0xd3, 0x43, 0x89, 0x3b, 0x0b, 0x6a, 0x6e, 0x74, 0x04, 0x9b,
-	0xc3, 0xe4, 0x3d, 0x55, 0x4c, 0xa2, 0xad, 0x1c, 0x6b, 0x92, 0xe5, 0x82, 0x26, 0x59, 0x4e, 0xb6,
-	0xba, 0xde, 0x85, 0x78, 0x6f, 0x4e, 0xe5, 0x89, 0x4e, 0xe0, 0x8e, 0x42, 0xbc, 0x99, 0x06, 0x15,
-	0xba, 0x1f, 0xd7, 0xb8, 0x62, 0x1e, 0x6e, 0xcf, 0xef, 0x6b, 0xed, 0x73, 0xe8, 0x84, 0x5e, 0xc4,
-	0xd0, 0xe3, 0xd7, 0x3f, 0x79, 0x6c, 0xc3, 0xc8, 0x3f, 0x79, 0x7c, 0x5f, 0xc5, 0x0f, 0xe9, 0x92,
-	0xc0, 0xfa, 0x02, 0xe0, 0xc9, 0x17, 0x7e, 0x3d, 0x48, 0xf7, 0x53, 0x05, 0xc7, 0xf6, 0x44, 0x52,
-	0x8c, 0xa8, 0x92, 0xc5, 0xed, 0xf9, 0x05, 0x25, 0x7a, 0x1e, 0xa4, 0xa3, 0x29, 0xd4, 0x5b, 0x53,
-	0x3d, 0xbd, 0x72, 0x49, 0xdc, 0x59, 0x50, 0x32, 0x21, 0x0c, 0x9b, 0x33, 0x85, 0x84, 0xcf, 0x51,
-	0x5c, 0x81, 0xb1, 0xd0, 0xb7, 0x17, 0x4c, 0x44, 0xd3, 0x98, 0x71, 0x22, 0xda, 0x9e, 0x5f, 0x31,
-	0xa0, 0x5a, 0x90, 0x18, 0xa7, 0x6e, 0x29, 0x9a, 0x3a, 0x58, 0xc4, 0xfd, 0x15, 0x33, 0x71, 0x39,
-	0x0a, 0x7d, 0x0c, 0xa9, 0x89, 0x8f, 0x11, 0xfa, 0xf7, 0xec, 0xe7, 0x69, 0x12, 0x41, 0x8f, 0x46,
-	0x50, 0x66, 0x10, 0x94, 0x38, 0x84, 0x08, 0x1f, 0x0e, 0xde, 0xff, 0xf4, 0xdd, 0xb6, 0xe9, 0x9d,
-	0xf7, 0x4f, 0x73, 0x4d, 0xc7, 0xca, 0x3b, 0x5d, 0x62, 0x37, 0x9d, 0x5e, 0x2b, 0xcf, 0x72, 0xca,
-	0xd3, 0x71, 0x4f, 0xfb, 0xa9, 0x69, 0x7b, 0xa4, 0x77, 0x66, 0x34, 0x49, 0x7e, 0xf0, 0x2c, 0xdf,
-	0x76, 0xf2, 0x2d, 0xcb, 0x3c, 0x5d, 0xa7, 0x21, 0x7c, 0xf6, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff,
-	0x54, 0xa0, 0x5f, 0x10, 0x03, 0x17, 0x00, 0x00,
+	// 1477 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x58, 0xcd, 0x6e, 0xdb, 0x46,
+	0x10, 0x2e, 0x49, 0xdb, 0x89, 0xc6, 0x89, 0x23, 0xaf, 0x13, 0x57, 0x66, 0x10, 0xdb, 0x65, 0x90,
+	0xc6, 0x69, 0x13, 0xc9, 0x50, 0x0e, 0xfd, 0xff, 0x91, 0x2d, 0x86, 0x56, 0x23, 0x91, 0xc2, 0x52,
+	0x8e, 0x91, 0xa2, 0x28, 0x41, 0x4b, 0x6b, 0x99, 0xa8, 0x48, 0xaa, 0x22, 0xe5, 0xc0, 0x0f, 0xd0,
+	0x43, 0x1f, 0xa1, 0x87, 0x02, 0x7d, 0x85, 0xf6, 0x58, 0xf4, 0x0d, 0x7a, 0xed, 0xa9, 0x28, 0x50,
+	0xf4, 0xd8, 0x63, 0xdf, 0xa0, 0xd0, 0x2e, 0xa9, 0x1f, 0x8a, 0x94, 0x64, 0x39, 0x45, 0x73, 0x23,
+	0x77, 0x67, 0x3f, 0xce, 0xce, 0xf7, 0xed, 0x70, 0x76, 0x60, 0xab, 0x61, 0x5b, 0xb9, 0xd3, 0x17,
+	0x86, 0x6d, 0x3a, 0x66, 0x93, 0xd8, 0xc4, 0xf1, 0x0d, 0x8f, 0x74, 0xce, 0xac, 0x3a, 0xc9, 0xb6,
+	0x3b, 0xae, 0xef, 0x22, 0xa1, 0x61, 0x5b, 0xe2, 0x6a, 0xcf, 0xaa, 0xee, 0xda, 0xb6, 0xeb, 0x78,
+	0x6c, 0x5c, 0xbc, 0xc6, 0x16, 0x06, 0x6f, 0xb7, 0x9b, 0xae, 0xdb, 0x6c, 0x91, 0x1c, 0x7d, 0x3b,
+	0xee, 0x9e, 0xe4, 0x88, 0xdd, 0xf6, 0xcf, 0xd9, 0xa4, 0xf4, 0x04, 0x32, 0xd5, 0xd3, 0x73, 0xcf,
+	0xaa, 0x9b, 0xad, 0x92, 0x73, 0x46, 0x1c, 0xdf, 0xed, 0x9c, 0x63, 0xf2, 0x75, 0x97, 0x78, 0x3e,
+	0x7a, 0x0b, 0x96, 0x1b, 0xa4, 0xf7, 0x39, 0xa3, 0xdb, 0xb5, 0x1a, 0x19, 0x6e, 0x9b, 0xdb, 0x59,
+	0xce, 0xa7, 0xb2, 0x0d, 0xdb, 0xca, 0x1e, 0x76, 0xad, 0x06, 0x06, 0x36, 0xdb, 0x7b, 0x96, 0x7e,
+	0xe4, 0x61, 0x23, 0x06, 0xc8, 0x6b, 0xbb, 0x8e, 0x47, 0xd0, 0x5d, 0x58, 0xf2, 0x7c, 0xd3, 0xef,
+	0x7a, 0x14, 0x64, 0x25, 0xbf, 0x4c, 0x41, 0x74, 0x3a, 0x84, 0x83, 0x29, 0xf4, 0x11, 0x2c, 0x75,
+	0x88, 0xe9, 0xb9, 0x4e, 0x86, 0xa7, 0x46, 0xf7, 0xa8, 0x51, 0x22, 0x68, 0x16, 0x53, 0x63, 0x1c,
+	0x2c, 0x42, 0x6f, 0x43, 0xca, 0x0a, 0x6d, 0x32, 0x02, 0xf5, 0xf5, 0x3a, 0x45, 0x38, 0x30, 0x3b,
+	0x8d, 0x17, 0x66, 0x87, 0xe0, 0xc1, 0x3c, 0xba, 0x0b, 0xd7, 0xd9, 0x32, 0xa3, 0x41, 0x7c, 0xd3,
+	0x6a, 0x65, 0x16, 0xb6, 0xb9, 0x9d, 0x14, 0xbe, 0xc6, 0x06, 0x8b, 0x74, 0x4c, 0xfa, 0x12, 0x96,
+	0xd8, 0x37, 0xd0, 0x4d, 0x48, 0x1f, 0xaa, 0x45, 0xf9, 0x49, 0x49, 0x95, 0x8b, 0x06, 0x96, 0x0b,
+	0xba, 0xa6, 0xa6, 0x5f, 0x43, 0x08, 0x56, 0x0e, 0xd5, 0xa7, 0xaa, 0x76, 0xa4, 0x1a, 0x45, 0xf9,
+	0x59, 0x69, 0x5f, 0x4e, 0x73, 0xbd, 0xb1, 0x92, 0x5a, 0x93, 0xb1, 0x5a, 0x28, 0x1b, 0x32, 0xc6,
+	0x1a, 0x4e, 0xf3, 0x68, 0x1d, 0x10, 0x9b, 0x37, 0x0e, 0x55, 0x2c, 0x17, 0xf6, 0x0f, 0x0a, 0x7b,
+	0x65, 0x39, 0x2d, 0x48, 0x3f, 0x70, 0xb0, 0x71, 0x70, 0xb4, 0xef, 0xda, 0x6d, 0xd7, 0x21, 0x8e,
+	0x5f, 0x72, 0x4e, 0x5c, 0x85, 0xf8, 0x73, 0x44, 0x1f, 0xed, 0xc2, 0x4a, 0x3d, 0x84, 0x61, 0xe6,
+	0x7c, 0xd4, 0xfc, 0x7a, 0xdf, 0x80, 0xae, 0xb8, 0x37, 0xbc, 0xc2, 0x31, 0x6d, 0x42, 0x43, 0x96,
+	0x1a, 0x32, 0x53, 0x4d, 0x9b, 0x48, 0xbf, 0xf2, 0x20, 0xc6, 0xb9, 0x78, 0x11, 0x5e, 0x3f, 0x8e,
+	0xf0, 0xfa, 0x26, 0x63, 0x25, 0x11, 0x35, 0x4a, 0xec, 0x43, 0x48, 0xf5, 0x9d, 0x0a, 0x88, 0x5d,
+	0xa1, 0x10, 0x7d, 0x00, 0x3c, 0x30, 0x98, 0x8d, 0xd9, 0xee, 0x1c, 0xcc, 0xde, 0x82, 0xd5, 0x70,
+	0x6c, 0x5f, 0xab, 0x54, 0x35, 0x55, 0x56, 0x6b, 0x69, 0x3e, 0x86, 0x70, 0x21, 0x81, 0xf0, 0x05,
+	0xe9, 0xb7, 0x71, 0xc2, 0xf5, 0x57, 0x8b, 0x70, 0x94, 0x87, 0x2b, 0xf5, 0x53, 0xd3, 0x69, 0x12,
+	0x8f, 0x06, 0x6e, 0x39, 0x9f, 0xa1, 0x88, 0x15, 0xb7, 0x61, 0x9d, 0x58, 0xe6, 0x71, 0x8b, 0x0c,
+	0x82, 0x1e, 0x1a, 0x4a, 0x3f, 0x8d, 0x8b, 0x44, 0xff, 0x4f, 0x44, 0xa2, 0x27, 0x8b, 0x64, 0x8c,
+	0x76, 0x21, 0x86, 0xf6, 0x6f, 0xb9, 0x97, 0xcc, 0xfb, 0xb3, 0x42, 0xb9, 0x54, 0x34, 0xaa, 0x05,
+	0x5c, 0xa8, 0xe8, 0x69, 0x21, 0x46, 0x0b, 0x0b, 0x09, 0x5a, 0x58, 0x94, 0xfe, 0xe0, 0xe1, 0xb6,
+	0xee, 0x9b, 0x1d, 0xbf, 0xd2, 0xcb, 0xee, 0x96, 0xd3, 0x2c, 0x52, 0x76, 0x2f, 0x16, 0xb5, 0x4f,
+	0x22, 0x51, 0xbb, 0x1f, 0x1a, 0x25, 0xc1, 0x46, 0xc3, 0x16, 0xd1, 0x9c, 0x30, 0x49, 0x73, 0x33,
+	0x9d, 0xac, 0x6f, 0xa6, 0x85, 0x58, 0x84, 0xf5, 0x20, 0x1e, 0x85, 0x32, 0x96, 0x0b, 0xc5, 0xe7,
+	0x46, 0xa5, 0xa0, 0x16, 0x14, 0xb9, 0x98, 0xe6, 0xd0, 0x1b, 0x70, 0x47, 0xab, 0xca, 0xb8, 0x50,
+	0x2b, 0x69, 0x6a, 0x7f, 0xba, 0xa4, 0x1a, 0x55, 0xac, 0x29, 0x58, 0xd6, 0xf5, 0xd9, 0xc3, 0x2e,
+	0xe5, 0x60, 0x43, 0xf7, 0xdd, 0x76, 0x34, 0x0a, 0xec, 0xa4, 0x21, 0x58, 0xa0, 0x27, 0x80, 0xa3,
+	0x1b, 0xa0, 0xcf, 0xd2, 0xef, 0x1c, 0x88, 0x71, 0x2b, 0x2e, 0x2f, 0xe2, 0x64, 0xd4, 0xb9, 0x44,
+	0x9c, 0xbf, 0xb8, 0x86, 0x25, 0x1b, 0x56, 0xa9, 0x07, 0xa4, 0xc1, 0x1c, 0xe8, 0x1d, 0x26, 0xf4,
+	0x10, 0x16, 0x2c, 0xe7, 0xc4, 0x0d, 0x12, 0x4d, 0xf2, 0x39, 0xa7, 0x56, 0x51, 0xa5, 0xf0, 0x93,
+	0x8a, 0x81, 0x3f, 0x39, 0x58, 0x1f, 0xf9, 0x9e, 0x77, 0xb1, 0x38, 0xbe, 0x1f, 0x89, 0xa3, 0xc4,
+	0x7c, 0x8b, 0x45, 0x8c, 0xc6, 0x70, 0x17, 0xae, 0x30, 0x4f, 0xbc, 0x8c, 0xb0, 0x2d, 0xec, 0x2c,
+	0xe7, 0xd7, 0xc7, 0x17, 0xf7, 0xb6, 0x8f, 0x43, 0xb3, 0x59, 0x02, 0x1a, 0x91, 0x17, 0x27, 0x7d,
+	0xcf, 0xc1, 0x86, 0x4e, 0xfc, 0xb2, 0xdb, 0xec, 0xb1, 0x2a, 0x3b, 0x8d, 0xb6, 0x6b, 0x39, 0x73,
+	0x65, 0xf2, 0x07, 0x90, 0x6e, 0x31, 0x14, 0x83, 0x04, 0x30, 0x74, 0xd7, 0x29, 0x7c, 0xa3, 0x35,
+	0x8a, 0x3e, 0x6c, 0x4a, 0x8b, 0xb7, 0xba, 0x1b, 0x2a, 0x24, 0x34, 0xad, 0x06, 0xc3, 0xd2, 0x5f,
+	0x3c, 0xf5, 0x0f, 0x13, 0xdb, 0xf5, 0xc9, 0xc0, 0xbd, 0xcb, 0x97, 0x63, 0x89, 0xa0, 0x73, 0x69,
+	0xf9, 0x67, 0xee, 0x25, 0x95, 0x58, 0x22, 0xac, 0x97, 0x35, 0x45, 0x29, 0xa9, 0x8a, 0x21, 0xab,
+	0xc5, 0xaa, 0x56, 0x52, 0x6b, 0xfd, 0xbf, 0xf1, 0x5d, 0xd8, 0x1a, 0x9b, 0xab, 0x62, 0xad, 0xa6,
+	0xed, 0x6b, 0x83, 0x34, 0xbd, 0x01, 0xb7, 0x2a, 0xba, 0xb2, 0x77, 0xa8, 0x47, 0xd7, 0x2f, 0x26,
+	0x64, 0xf0, 0xa5, 0x5e, 0x06, 0x17, 0x95, 0x18, 0x0d, 0x5c, 0x3e, 0x63, 0x24, 0xa3, 0x46, 0xa3,
+	0x1c, 0xa7, 0x1e, 0x61, 0x76, 0xf5, 0x2c, 0xc4, 0xaa, 0x67, 0x9c, 0xbb, 0xc5, 0xff, 0xa1, 0x3a,
+	0xde, 0x87, 0x8c, 0x4e, 0xfc, 0x8a, 0xd7, 0xdc, 0xeb, 0x7a, 0xd1, 0x03, 0x76, 0x1f, 0x6e, 0xd8,
+	0x5e, 0xf3, 0xb8, 0xeb, 0x0d, 0x76, 0xcd, 0x72, 0xf9, 0x0a, 0x1b, 0x0e, 0xed, 0xa5, 0xef, 0x78,
+	0xd8, 0x50, 0xc6, 0x51, 0x2e, 0x7f, 0x0e, 0x12, 0x41, 0xa3, 0x0c, 0xc5, 0xb8, 0x2a, 0xc4, 0xb9,
+	0x3a, 0xdb, 0xef, 0xf5, 0xb3, 0x8b, 0xe7, 0xaa, 0x84, 0x00, 0xf3, 0xd2, 0x73, 0x48, 0xcb, 0x8e,
+	0x6f, 0xf9, 0x16, 0xf1, 0xca, 0x6e, 0xb3, 0x4c, 0xce, 0x48, 0x0b, 0x3d, 0x80, 0xab, 0xad, 0xe0,
+	0x39, 0x88, 0x09, 0xbb, 0x43, 0x85, 0x06, 0xb8, 0x3f, 0x8d, 0x44, 0xb8, 0x4a, 0x82, 0xe5, 0x19,
+	0x7e, 0x5b, 0xd8, 0x49, 0xe1, 0xfe, 0xbb, 0xd4, 0x05, 0xc4, 0xb2, 0x23, 0x5b, 0x34, 0x47, 0x5a,
+	0x7c, 0x0c, 0xa9, 0x56, 0xef, 0xd6, 0x7a, 0x46, 0x5a, 0x0c, 0x7e, 0x39, 0x7f, 0x8b, 0x5a, 0x46,
+	0x5d, 0xc6, 0x03, 0x3b, 0xe9, 0x17, 0x1e, 0xd6, 0x46, 0xbe, 0x1b, 0xf0, 0x7c, 0x91, 0x0f, 0x0f,
+	0x34, 0xc1, 0x27, 0x6b, 0xe2, 0x9d, 0xbe, 0x26, 0x04, 0x6a, 0xb4, 0x15, 0xe6, 0xc6, 0xe8, 0xa7,
+	0xa7, 0x66, 0xc5, 0x38, 0x92, 0xcf, 0x5e, 0xde, 0xc9, 0x0a, 0xed, 0xca, 0x5a, 0x2f, 0xf9, 0xd5,
+	0x4a, 0xb5, 0xe7, 0x13, 0xae, 0x27, 0x5f, 0x00, 0x52, 0x2e, 0xc7, 0xda, 0x24, 0x4d, 0xfc, 0xc3,
+	0xc3, 0x9a, 0x72, 0x49, 0x72, 0x98, 0x2a, 0xca, 0x33, 0xaa, 0x82, 0xd9, 0x0d, 0x31, 0x2a, 0xcc,
+	0xc2, 0xe8, 0xc2, 0x10, 0xa3, 0xca, 0x1c, 0x8c, 0x2e, 0xbe, 0x42, 0x8c, 0x1e, 0xf4, 0xff, 0x50,
+	0xbd, 0x92, 0x2e, 0x0c, 0xd2, 0x3c, 0xfd, 0x9d, 0x0f, 0x21, 0x75, 0x40, 0xcc, 0x8e, 0x7f, 0x4c,
+	0x4c, 0x1f, 0xe5, 0x60, 0xed, 0x34, 0x7c, 0x31, 0x3c, 0xab, 0xe9, 0x98, 0x7e, 0xb7, 0xc3, 0xca,
+	0xe9, 0x2b, 0x18, 0xf5, 0xa7, 0xf4, 0x70, 0x26, 0xff, 0xf7, 0x55, 0xd8, 0x50, 0x4d, 0xdf, 0x3a,
+	0x23, 0x07, 0x47, 0x95, 0x7e, 0x37, 0x4b, 0x67, 0xcd, 0x2c, 0xa4, 0xc3, 0x5a, 0xcc, 0x95, 0x05,
+	0x25, 0x56, 0xa4, 0xe2, 0xf6, 0xb4, 0x6b, 0xce, 0x2e, 0x87, 0x0e, 0x01, 0x8d, 0x17, 0xde, 0x68,
+	0x33, 0xb1, 0x22, 0xa7, 0x21, 0x11, 0xb7, 0xa6, 0x54, 0xec, 0xe8, 0x00, 0x56, 0x7b, 0xa9, 0x7f,
+	0xa4, 0x14, 0x45, 0xeb, 0x59, 0xd6, 0x62, 0xcb, 0x86, 0x2d, 0xb6, 0xac, 0x6c, 0xb7, 0xfd, 0x73,
+	0xf1, 0xf6, 0x84, 0xba, 0x15, 0x1d, 0xc1, 0x4d, 0x85, 0xf8, 0x63, 0xed, 0x2d, 0x74, 0x27, 0xa9,
+	0xed, 0xc5, 0x3c, 0xdc, 0x9c, 0xdc, 0x15, 0xdb, 0xe5, 0xd0, 0x11, 0x3d, 0xc6, 0x91, 0xab, 0x73,
+	0xb0, 0xf3, 0xc4, 0x76, 0x53, 0xb0, 0xf3, 0xe4, 0xae, 0x4c, 0x10, 0xd2, 0x19, 0x81, 0xf5, 0x29,
+	0xc0, 0xc3, 0xfd, 0x81, 0x5a, 0xf8, 0xb3, 0x18, 0x29, 0x57, 0x36, 0x87, 0x52, 0x6a, 0x4c, 0x8d,
+	0x2d, 0x6e, 0x4e, 0x2e, 0x47, 0xd1, 0x93, 0x30, 0x99, 0x8d, 0xa0, 0xde, 0x18, 0xe9, 0x08, 0x96,
+	0x8a, 0xe2, 0xd6, 0x94, 0x82, 0x0b, 0x61, 0x58, 0x1d, 0x2b, 0x43, 0x02, 0x8e, 0x92, 0xca, 0x93,
+	0xa9, 0xbe, 0x3d, 0x65, 0x22, 0x1a, 0xc5, 0x4c, 0x12, 0xd1, 0xe6, 0xe4, 0x7a, 0x03, 0x55, 0xc3,
+	0xb4, 0x3a, 0x72, 0xc6, 0xd1, 0xc8, 0xc6, 0x62, 0x4e, 0xbf, 0x98, 0x49, 0xca, 0x70, 0xe8, 0x53,
+	0x58, 0x1e, 0xfa, 0x95, 0xa1, 0xd7, 0xc7, 0x7f, 0x6e, 0xc3, 0x08, 0x7a, 0x3c, 0x82, 0x32, 0x86,
+	0xa0, 0x24, 0x21, 0xc4, 0xf9, 0xf0, 0x2e, 0xac, 0xf4, 0xf3, 0xcd, 0xfe, 0x29, 0xa9, 0x7f, 0x95,
+	0x18, 0x1f, 0xd6, 0x0b, 0xec, 0x1b, 0xef, 0x7d, 0xf0, 0xf9, 0x7b, 0x4d, 0xcb, 0x3f, 0xed, 0x1e,
+	0x67, 0xeb, 0xae, 0x9d, 0x73, 0xdb, 0xc4, 0xa9, 0xbb, 0x9d, 0x46, 0x8e, 0xe5, 0xb2, 0x47, 0x83,
+	0x5e, 0xfa, 0x23, 0xcb, 0xf1, 0x49, 0xe7, 0xc4, 0xac, 0x93, 0xdc, 0xd9, 0xe3, 0x5c, 0xd3, 0xcd,
+	0x35, 0x6c, 0xeb, 0x78, 0x89, 0x82, 0x3f, 0xfe, 0x37, 0x00, 0x00, 0xff, 0xff, 0x9f, 0xef, 0x9c,
+	0xa9, 0x7b, 0x17, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -1766,6 +1809,8 @@
 	// Gets the configured log level for a certain entity on a certain device.
 	// If no entity is specified in the request all the entities with their log level should be returned.
 	GetLogLevel(ctx context.Context, in *GetLogLevelRequest, opts ...grpc.CallOption) (*GetLogLevelResponse, error)
+	// Performs the heartbeat check
+	HeartbeatCheck(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*Heartbeat, error)
 }
 
 type nativeHWManagementServiceClient struct {
@@ -1962,6 +2007,15 @@
 	return out, nil
 }
 
+func (c *nativeHWManagementServiceClient) HeartbeatCheck(ctx context.Context, in *empty.Empty, opts ...grpc.CallOption) (*Heartbeat, error) {
+	out := new(Heartbeat)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/HeartbeatCheck", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // NativeHWManagementServiceServer is the server API for NativeHWManagementService service.
 type NativeHWManagementServiceServer interface {
 	// Initializes context for a device and sets up required states
@@ -2005,6 +2059,8 @@
 	// Gets the configured log level for a certain entity on a certain device.
 	// If no entity is specified in the request all the entities with their log level should be returned.
 	GetLogLevel(context.Context, *GetLogLevelRequest) (*GetLogLevelResponse, error)
+	// Performs the heartbeat check
+	HeartbeatCheck(context.Context, *empty.Empty) (*Heartbeat, error)
 }
 
 // UnimplementedNativeHWManagementServiceServer can be embedded to have forward compatible implementations.
@@ -2050,6 +2106,9 @@
 func (*UnimplementedNativeHWManagementServiceServer) GetLogLevel(ctx context.Context, req *GetLogLevelRequest) (*GetLogLevelResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetLogLevel not implemented")
 }
+func (*UnimplementedNativeHWManagementServiceServer) HeartbeatCheck(ctx context.Context, req *empty.Empty) (*Heartbeat, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method HeartbeatCheck not implemented")
+}
 
 func RegisterNativeHWManagementServiceServer(s *grpc.Server, srv NativeHWManagementServiceServer) {
 	s.RegisterService(&_NativeHWManagementService_serviceDesc, srv)
@@ -2298,6 +2357,24 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _NativeHWManagementService_HeartbeatCheck_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(empty.Empty)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).HeartbeatCheck(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/HeartbeatCheck",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).HeartbeatCheck(ctx, req.(*empty.Empty))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 var _NativeHWManagementService_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "dmi.NativeHWManagementService",
 	HandlerType: (*NativeHWManagementServiceServer)(nil),
@@ -2342,6 +2419,10 @@
 			MethodName: "GetLogLevel",
 			Handler:    _NativeHWManagementService_GetLogLevel_Handler,
 		},
+		{
+			MethodName: "HeartbeatCheck",
+			Handler:    _NativeHWManagementService_HeartbeatCheck_Handler,
+		},
 	},
 	Streams: []grpc.StreamDesc{
 		{
diff --git a/protos/dmi/hw_management_service.proto b/protos/dmi/hw_management_service.proto
index fb2a454..bc6ce8e 100644
--- a/protos/dmi/hw_management_service.proto
+++ b/protos/dmi/hw_management_service.proto
@@ -218,6 +218,10 @@
     Uuid device_uuid = 1;

 }

 

+message Heartbeat {

+    fixed32 heartbeat_signature = 1;

+}

+

 service NativeHWManagementService {

     // Initializes context for a device and sets up required states

     // In the call to StartManagingDevice, the fields of ModifiableComponent which are relevant

@@ -272,4 +276,7 @@
     // Gets the configured log level for a certain entity on a certain device.

     // If no entity is specified in the request all the entities with their log level should be returned.

     rpc GetLogLevel(GetLogLevelRequest) returns(GetLogLevelResponse);

+

+    // Performs the heartbeat check

+    rpc HeartbeatCheck(google.protobuf.Empty) returns (Heartbeat);

 }

diff --git a/python/dmi/hw_management_service_pb2.py b/python/dmi/hw_management_service_pb2.py
index 29e260e..bdf8fcd 100644
--- a/python/dmi/hw_management_service_pb2.py
+++ b/python/dmi/hw_management_service_pb2.py
@@ -22,7 +22,7 @@
   syntax='proto3',
   serialized_options=b'Z9github.com/opencord/device-management-interface/v3/go/dmi',
   create_key=_descriptor._internal_create_key,
-  serialized_pb=b'\n\x1f\x64mi/hw_management_service.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\x1a\x0c\x64mi/hw.proto\x1a\x1bgoogle/protobuf/empty.proto\":\n\x18PhysicalInventoryRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"\x88\x02\n\x19PhysicalInventoryResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.PhysicalInventoryResponse.Reason\x12 \n\tinventory\x18\x03 \x01(\x0b\x32\r.dmi.Hardware\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\"v\n\x19HWComponentInfoGetRequest\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\"\xa2\x02\n\x1aHWComponentInfoGetResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.HWComponentInfoGetResponse.Reason\x12!\n\tcomponent\x18\x03 \x01(\x0b\x32\x0e.dmi.Component\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"u\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\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"\xa1\x01\n\x19HWComponentInfoSetRequest\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\x12)\n\x07\x63hanges\x18\x04 \x01(\x0b\x32\x18.dmi.ModifiableComponent\"\x94\x02\n\x1aHWComponentInfoSetResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.HWComponentInfoSetResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \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\x0eINVALID_PARAMS\x10\x03\x12\x12\n\x0eINTERNAL_ERROR\x10\x04\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x05\"\xb2\x02\n\x1bStartManagingDeviceResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x37\n\x06reason\x18\x02 \x01(\x0e\x32\'.dmi.StartManagingDeviceResponse.Reason\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x03 \x01(\x0b\x32\t.dmi.Uuid\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"\x85\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x1a\n\x16\x44\x45VICE_ALREADY_MANAGED\x10\x01\x12!\n\x1dOPERATION_ALREADY_IN_PROGRESS\x10\x02\x12\x12\n\x0eINVALID_PARAMS\x10\x03\x12\x12\n\x0eINTERNAL_ERROR\x10\x04\")\n\x19StopManagingDeviceRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xbc\x01\n\x1aStopManagingDeviceResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.StopManagingDeviceResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"2\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\"[\n\x11ManagedDeviceInfo\x12&\n\x04info\x18\x01 \x01(\x0b\x32\x18.dmi.ModifiableComponent\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\"\xc6\x01\n\x16ManagedDevicesResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x32\n\x06reason\x18\x02 \x01(\x0e\x32\".dmi.ManagedDevicesResponse.Reason\x12\'\n\x07\x64\x65vices\x18\x03 \x03(\x0b\x32\x16.dmi.ManagedDeviceInfo\"2\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\"o\n\x19SetLoggingEndpointRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x18\n\x10logging_endpoint\x18\x02 \x01(\t\x12\x18\n\x10logging_protocol\x18\x03 \x01(\t\"\xc3\x02\n\x19SetRemoteEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.SetRemoteEndpointResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\xba\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\x1a\n\x16LOGGING_ENDPOINT_ERROR\x10\x03\x12#\n\x1fLOGGING_ENDPOINT_PROTOCOL_ERROR\x10\x04\x12\x19\n\x15MSGBUS_ENDPOINT_ERROR\x10\x05\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x06\"\x9c\x02\n\x1aGetLoggingEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.GetLoggingEndpointResponse.Reason\x12\x18\n\x10logging_endpoint\x18\x03 \x01(\t\x12\x18\n\x10logging_protocol\x18\x04 \x01(\t\x12\x15\n\rreason_detail\x18\x05 \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\"3\n\x18SetMsgBusEndpointRequest\x12\x17\n\x0fmsgbus_endpoint\x18\x01 \x01(\t\"\xeb\x01\n\x19GetMsgBusEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.GetMsgBusEndpointResponse.Reason\x12\x17\n\x0fmsgbus_endpoint\x18\x03 \x01(\t\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"J\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x02\"E\n\x10\x45ntitiesLogLevel\x12\x1f\n\x08logLevel\x18\x01 \x01(\x0e\x32\r.dmi.LogLevel\x12\x10\n\x08\x65ntities\x18\x02 \x03(\t\"^\n\x12SetLogLevelRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12(\n\tloglevels\x18\x02 \x03(\x0b\x32\x15.dmi.EntitiesLogLevel\"\x92\x02\n\x13SetLogLevelResponse\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x1b\n\x06status\x18\x02 \x01(\x0e\x32\x0b.dmi.Status\x12/\n\x06reason\x18\x03 \x01(\x0e\x32\x1f.dmi.SetLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"v\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\x12UNKNOWN_LOG_ENTITY\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"F\n\x12GetLogLevelRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x10\n\x08\x65ntities\x18\x02 \x03(\t\"\xbc\x02\n\x13GetLogLevelResponse\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12(\n\tlogLevels\x18\x02 \x03(\x0b\x32\x15.dmi.EntitiesLogLevel\x12\x1b\n\x06status\x18\x03 \x01(\x0e\x32\x0b.dmi.Status\x12/\n\x06reason\x18\x04 \x01(\x0e\x32\x1f.dmi.GetLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x05 \x01(\t\"v\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\x12UNKNOWN_LOG_ENTITY\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"<\n\x1aGetLoggableEntitiesRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid2\xaf\x08\n\x19NativeHWManagementService\x12S\n\x13StartManagingDevice\x12\x18.dmi.ModifiableComponent\x1a .dmi.StartManagingDeviceResponse0\x01\x12U\n\x12StopManagingDevice\x12\x1e.dmi.StopManagingDeviceRequest\x1a\x1f.dmi.StopManagingDeviceResponse\x12H\n\x11GetManagedDevices\x12\x16.google.protobuf.Empty\x1a\x1b.dmi.ManagedDevicesResponse\x12W\n\x14GetPhysicalInventory\x12\x1d.dmi.PhysicalInventoryRequest\x1a\x1e.dmi.PhysicalInventoryResponse0\x01\x12W\n\x12GetHWComponentInfo\x12\x1e.dmi.HWComponentInfoGetRequest\x1a\x1f.dmi.HWComponentInfoGetResponse0\x01\x12U\n\x12SetHWComponentInfo\x12\x1e.dmi.HWComponentInfoSetRequest\x1a\x1f.dmi.HWComponentInfoSetResponse\x12T\n\x12SetLoggingEndpoint\x12\x1e.dmi.SetLoggingEndpointRequest\x1a\x1e.dmi.SetRemoteEndpointResponse\x12\x46\n\x12GetLoggingEndpoint\x12\x0f.dmi.HardwareID\x1a\x1f.dmi.GetLoggingEndpointResponse\x12R\n\x11SetMsgBusEndpoint\x12\x1d.dmi.SetMsgBusEndpointRequest\x1a\x1e.dmi.SetRemoteEndpointResponse\x12K\n\x11GetMsgBusEndpoint\x12\x16.google.protobuf.Empty\x1a\x1e.dmi.GetMsgBusEndpointResponse\x12P\n\x13GetLoggableEntities\x12\x1f.dmi.GetLoggableEntitiesRequest\x1a\x18.dmi.GetLogLevelResponse\x12@\n\x0bSetLogLevel\x12\x17.dmi.SetLogLevelRequest\x1a\x18.dmi.SetLogLevelResponse\x12@\n\x0bGetLogLevel\x12\x17.dmi.GetLogLevelRequest\x1a\x18.dmi.GetLogLevelResponseB;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3'
+  serialized_pb=b'\n\x1f\x64mi/hw_management_service.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\x1a\x0c\x64mi/hw.proto\x1a\x1bgoogle/protobuf/empty.proto\":\n\x18PhysicalInventoryRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"\x88\x02\n\x19PhysicalInventoryResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.PhysicalInventoryResponse.Reason\x12 \n\tinventory\x18\x03 \x01(\x0b\x32\r.dmi.Hardware\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\"v\n\x19HWComponentInfoGetRequest\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\"\xa2\x02\n\x1aHWComponentInfoGetResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.HWComponentInfoGetResponse.Reason\x12!\n\tcomponent\x18\x03 \x01(\x0b\x32\x0e.dmi.Component\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"u\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\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"\xa1\x01\n\x19HWComponentInfoSetRequest\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\x12)\n\x07\x63hanges\x18\x04 \x01(\x0b\x32\x18.dmi.ModifiableComponent\"\x94\x02\n\x1aHWComponentInfoSetResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.HWComponentInfoSetResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \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\x0eINVALID_PARAMS\x10\x03\x12\x12\n\x0eINTERNAL_ERROR\x10\x04\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x05\"\xb2\x02\n\x1bStartManagingDeviceResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x37\n\x06reason\x18\x02 \x01(\x0e\x32\'.dmi.StartManagingDeviceResponse.Reason\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x03 \x01(\x0b\x32\t.dmi.Uuid\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"\x85\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x1a\n\x16\x44\x45VICE_ALREADY_MANAGED\x10\x01\x12!\n\x1dOPERATION_ALREADY_IN_PROGRESS\x10\x02\x12\x12\n\x0eINVALID_PARAMS\x10\x03\x12\x12\n\x0eINTERNAL_ERROR\x10\x04\")\n\x19StopManagingDeviceRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xbc\x01\n\x1aStopManagingDeviceResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.StopManagingDeviceResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"2\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\"[\n\x11ManagedDeviceInfo\x12&\n\x04info\x18\x01 \x01(\x0b\x32\x18.dmi.ModifiableComponent\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\"\xc6\x01\n\x16ManagedDevicesResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x32\n\x06reason\x18\x02 \x01(\x0e\x32\".dmi.ManagedDevicesResponse.Reason\x12\'\n\x07\x64\x65vices\x18\x03 \x03(\x0b\x32\x16.dmi.ManagedDeviceInfo\"2\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\"o\n\x19SetLoggingEndpointRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x18\n\x10logging_endpoint\x18\x02 \x01(\t\x12\x18\n\x10logging_protocol\x18\x03 \x01(\t\"\xc3\x02\n\x19SetRemoteEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.SetRemoteEndpointResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\xba\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\x1a\n\x16LOGGING_ENDPOINT_ERROR\x10\x03\x12#\n\x1fLOGGING_ENDPOINT_PROTOCOL_ERROR\x10\x04\x12\x19\n\x15MSGBUS_ENDPOINT_ERROR\x10\x05\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x06\"\x9c\x02\n\x1aGetLoggingEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.GetLoggingEndpointResponse.Reason\x12\x18\n\x10logging_endpoint\x18\x03 \x01(\t\x12\x18\n\x10logging_protocol\x18\x04 \x01(\t\x12\x15\n\rreason_detail\x18\x05 \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\"3\n\x18SetMsgBusEndpointRequest\x12\x17\n\x0fmsgbus_endpoint\x18\x01 \x01(\t\"\xeb\x01\n\x19GetMsgBusEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.GetMsgBusEndpointResponse.Reason\x12\x17\n\x0fmsgbus_endpoint\x18\x03 \x01(\t\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"J\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x02\"E\n\x10\x45ntitiesLogLevel\x12\x1f\n\x08logLevel\x18\x01 \x01(\x0e\x32\r.dmi.LogLevel\x12\x10\n\x08\x65ntities\x18\x02 \x03(\t\"^\n\x12SetLogLevelRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12(\n\tloglevels\x18\x02 \x03(\x0b\x32\x15.dmi.EntitiesLogLevel\"\x92\x02\n\x13SetLogLevelResponse\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x1b\n\x06status\x18\x02 \x01(\x0e\x32\x0b.dmi.Status\x12/\n\x06reason\x18\x03 \x01(\x0e\x32\x1f.dmi.SetLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"v\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\x12UNKNOWN_LOG_ENTITY\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"F\n\x12GetLogLevelRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x10\n\x08\x65ntities\x18\x02 \x03(\t\"\xbc\x02\n\x13GetLogLevelResponse\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12(\n\tlogLevels\x18\x02 \x03(\x0b\x32\x15.dmi.EntitiesLogLevel\x12\x1b\n\x06status\x18\x03 \x01(\x0e\x32\x0b.dmi.Status\x12/\n\x06reason\x18\x04 \x01(\x0e\x32\x1f.dmi.GetLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x05 \x01(\t\"v\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\x12UNKNOWN_LOG_ENTITY\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"<\n\x1aGetLoggableEntitiesRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"(\n\tHeartbeat\x12\x1b\n\x13heartbeat_signature\x18\x01 \x01(\x07\x32\xe9\x08\n\x19NativeHWManagementService\x12S\n\x13StartManagingDevice\x12\x18.dmi.ModifiableComponent\x1a .dmi.StartManagingDeviceResponse0\x01\x12U\n\x12StopManagingDevice\x12\x1e.dmi.StopManagingDeviceRequest\x1a\x1f.dmi.StopManagingDeviceResponse\x12H\n\x11GetManagedDevices\x12\x16.google.protobuf.Empty\x1a\x1b.dmi.ManagedDevicesResponse\x12W\n\x14GetPhysicalInventory\x12\x1d.dmi.PhysicalInventoryRequest\x1a\x1e.dmi.PhysicalInventoryResponse0\x01\x12W\n\x12GetHWComponentInfo\x12\x1e.dmi.HWComponentInfoGetRequest\x1a\x1f.dmi.HWComponentInfoGetResponse0\x01\x12U\n\x12SetHWComponentInfo\x12\x1e.dmi.HWComponentInfoSetRequest\x1a\x1f.dmi.HWComponentInfoSetResponse\x12T\n\x12SetLoggingEndpoint\x12\x1e.dmi.SetLoggingEndpointRequest\x1a\x1e.dmi.SetRemoteEndpointResponse\x12\x46\n\x12GetLoggingEndpoint\x12\x0f.dmi.HardwareID\x1a\x1f.dmi.GetLoggingEndpointResponse\x12R\n\x11SetMsgBusEndpoint\x12\x1d.dmi.SetMsgBusEndpointRequest\x1a\x1e.dmi.SetRemoteEndpointResponse\x12K\n\x11GetMsgBusEndpoint\x12\x16.google.protobuf.Empty\x1a\x1e.dmi.GetMsgBusEndpointResponse\x12P\n\x13GetLoggableEntities\x12\x1f.dmi.GetLoggableEntitiesRequest\x1a\x18.dmi.GetLogLevelResponse\x12@\n\x0bSetLogLevel\x12\x17.dmi.SetLogLevelRequest\x1a\x18.dmi.SetLogLevelResponse\x12@\n\x0bGetLogLevel\x12\x17.dmi.GetLogLevelRequest\x1a\x18.dmi.GetLogLevelResponse\x12\x38\n\x0eHeartbeatCheck\x12\x16.google.protobuf.Empty\x1a\x0e.dmi.HeartbeatB;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_empty__pb2.DESCRIPTOR,])
 
@@ -1442,6 +1442,38 @@
   serialized_end=4034,
 )
 
+
+_HEARTBEAT = _descriptor.Descriptor(
+  name='Heartbeat',
+  full_name='dmi.Heartbeat',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='heartbeat_signature', full_name='dmi.Heartbeat.heartbeat_signature', index=0,
+      number=1, type=7, cpp_type=3, label=1,
+      has_default_value=False, default_value=0,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=4036,
+  serialized_end=4076,
+)
+
 _PHYSICALINVENTORYREQUEST.fields_by_name['device_uuid'].message_type = dmi_dot_hw__pb2._UUID
 _PHYSICALINVENTORYRESPONSE.fields_by_name['status'].enum_type = dmi_dot_commons__pb2._STATUS
 _PHYSICALINVENTORYRESPONSE.fields_by_name['reason'].enum_type = _PHYSICALINVENTORYRESPONSE_REASON
@@ -1518,6 +1550,7 @@
 DESCRIPTOR.message_types_by_name['GetLogLevelRequest'] = _GETLOGLEVELREQUEST
 DESCRIPTOR.message_types_by_name['GetLogLevelResponse'] = _GETLOGLEVELRESPONSE
 DESCRIPTOR.message_types_by_name['GetLoggableEntitiesRequest'] = _GETLOGGABLEENTITIESREQUEST
+DESCRIPTOR.message_types_by_name['Heartbeat'] = _HEARTBEAT
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
 PhysicalInventoryRequest = _reflection.GeneratedProtocolMessageType('PhysicalInventoryRequest', (_message.Message,), {
@@ -1674,6 +1707,13 @@
   })
 _sym_db.RegisterMessage(GetLoggableEntitiesRequest)
 
+Heartbeat = _reflection.GeneratedProtocolMessageType('Heartbeat', (_message.Message,), {
+  'DESCRIPTOR' : _HEARTBEAT,
+  '__module__' : 'dmi.hw_management_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.Heartbeat)
+  })
+_sym_db.RegisterMessage(Heartbeat)
+
 
 DESCRIPTOR._options = None
 
@@ -1684,8 +1724,8 @@
   index=0,
   serialized_options=None,
   create_key=_descriptor._internal_create_key,
-  serialized_start=4037,
-  serialized_end=5108,
+  serialized_start=4079,
+  serialized_end=5208,
   methods=[
   _descriptor.MethodDescriptor(
     name='StartManagingDevice',
@@ -1817,6 +1857,16 @@
     serialized_options=None,
     create_key=_descriptor._internal_create_key,
   ),
+  _descriptor.MethodDescriptor(
+    name='HeartbeatCheck',
+    full_name='dmi.NativeHWManagementService.HeartbeatCheck',
+    index=13,
+    containing_service=None,
+    input_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
+    output_type=_HEARTBEAT,
+    serialized_options=None,
+    create_key=_descriptor._internal_create_key,
+  ),
 ])
 _sym_db.RegisterServiceDescriptor(_NATIVEHWMANAGEMENTSERVICE)
 
diff --git a/python/dmi/hw_management_service_pb2_grpc.py b/python/dmi/hw_management_service_pb2_grpc.py
index 9c25fe3..89a08ad 100644
--- a/python/dmi/hw_management_service_pb2_grpc.py
+++ b/python/dmi/hw_management_service_pb2_grpc.py
@@ -81,6 +81,11 @@
                 request_serializer=dmi_dot_hw__management__service__pb2.GetLogLevelRequest.SerializeToString,
                 response_deserializer=dmi_dot_hw__management__service__pb2.GetLogLevelResponse.FromString,
                 )
+        self.HeartbeatCheck = channel.unary_unary(
+                '/dmi.NativeHWManagementService/HeartbeatCheck',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=dmi_dot_hw__management__service__pb2.Heartbeat.FromString,
+                )
 
 
 class NativeHWManagementServiceServicer(object):
@@ -192,6 +197,13 @@
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def HeartbeatCheck(self, request, context):
+        """Performs the heartbeat check

+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
 
 def add_NativeHWManagementServiceServicer_to_server(servicer, server):
     rpc_method_handlers = {
@@ -260,6 +272,11 @@
                     request_deserializer=dmi_dot_hw__management__service__pb2.GetLogLevelRequest.FromString,
                     response_serializer=dmi_dot_hw__management__service__pb2.GetLogLevelResponse.SerializeToString,
             ),
+            'HeartbeatCheck': grpc.unary_unary_rpc_method_handler(
+                    servicer.HeartbeatCheck,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=dmi_dot_hw__management__service__pb2.Heartbeat.SerializeToString,
+            ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
             'dmi.NativeHWManagementService', rpc_method_handlers)
@@ -490,3 +507,20 @@
             dmi_dot_hw__management__service__pb2.GetLogLevelResponse.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def HeartbeatCheck(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_unary(request, target, '/dmi.NativeHWManagementService/HeartbeatCheck',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            dmi_dot_hw__management__service__pb2.Heartbeat.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)