diff --git a/cpp/dmi/hw_events_mgmt_service.pb.cc b/cpp/dmi/hw_events_mgmt_service.pb.cc
index 9a534e6..26a87ad 100644
--- a/cpp/dmi/hw_events_mgmt_service.pb.cc
+++ b/cpp/dmi/hw_events_mgmt_service.pb.cc
@@ -19,6 +19,7 @@
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_Uuid_dmi_2fhw_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_AdminStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_AlarmStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_GenericEventInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_OperStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_StandbyStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_UsageStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
@@ -108,6 +109,10 @@
   const ::dmi::UsageStateChange* usage_state_change_;
   const ::dmi::StandbyStateChange* standby_state_change_;
 } _StateChangeInfo_default_instance_;
+class GenericEventInfoDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<GenericEventInfo> _instance;
+} _GenericEventInfo_default_instance_;
 class EventDefaultTypeInternal {
  public:
   ::google::protobuf::internal::ExplicitlyConstructed<Event> _instance;
@@ -353,6 +358,20 @@
       &scc_info_UsageStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,
       &scc_info_StandbyStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,}};
 
+static void InitDefaultsGenericEventInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_GenericEventInfo_default_instance_;
+    new (ptr) ::dmi::GenericEventInfo();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::GenericEventInfo::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<0> scc_info_GenericEventInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsGenericEventInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {}};
+
 static void InitDefaultsEvent_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
   GOOGLE_PROTOBUF_VERIFY_VERSION;
 
@@ -364,12 +383,13 @@
   ::dmi::Event::InitAsDefaultInstance();
 }
 
-::google::protobuf::internal::SCCInfo<4> scc_info_Event_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
-    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 4, InitDefaultsEvent_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {
+::google::protobuf::internal::SCCInfo<5> scc_info_Event_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 5, InitDefaultsEvent_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {
       &scc_info_EventMetaData_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,
       &scc_info_Timestamp_google_2fprotobuf_2ftimestamp_2eproto.base,
       &scc_info_ThresholdInformation_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,
-      &scc_info_StateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,}};
+      &scc_info_StateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,
+      &scc_info_GenericEventInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,}};
 
 void InitDefaults_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
   ::google::protobuf::internal::InitSCC(&scc_info_ValueType_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
@@ -388,11 +408,12 @@
   ::google::protobuf::internal::InitSCC(&scc_info_UsageStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_StandbyStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_StateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_GenericEventInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_Event_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
 }
 
-::google::protobuf::Metadata file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[17];
-const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[3];
+::google::protobuf::Metadata file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[18];
+const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[4];
 constexpr ::google::protobuf::ServiceDescriptor const** file_level_service_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto = nullptr;
 
 const ::google::protobuf::uint32 TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
@@ -524,6 +545,14 @@
   offsetof(::dmi::StateChangeInfoDefaultTypeInternal, standby_state_change_),
   PROTOBUF_FIELD_OFFSET(::dmi::StateChangeInfo, state_change_),
   ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::GenericEventInfo, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::GenericEventInfo, message_),
+  PROTOBUF_FIELD_OFFSET(::dmi::GenericEventInfo, message_code_),
+  PROTOBUF_FIELD_OFFSET(::dmi::GenericEventInfo, severity_),
+  ~0u,  // no _has_bits_
   PROTOBUF_FIELD_OFFSET(::dmi::Event, _internal_metadata_),
   ~0u,  // no _extensions_
   ~0u,  // no _oneof_case_
@@ -534,6 +563,7 @@
   PROTOBUF_FIELD_OFFSET(::dmi::Event, threshold_info_),
   PROTOBUF_FIELD_OFFSET(::dmi::Event, add_info_),
   PROTOBUF_FIELD_OFFSET(::dmi::Event, state_change_info_),
+  PROTOBUF_FIELD_OFFSET(::dmi::Event, generic_event_info_),
 };
 static const ::google::protobuf::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
   { 0, -1, sizeof(::dmi::ValueType)},
@@ -552,7 +582,8 @@
   { 102, -1, sizeof(::dmi::UsageStateChange)},
   { 109, -1, sizeof(::dmi::StandbyStateChange)},
   { 116, -1, sizeof(::dmi::StateChangeInfo)},
-  { 127, -1, sizeof(::dmi::Event)},
+  { 127, -1, sizeof(::dmi::GenericEventInfo)},
+  { 135, -1, sizeof(::dmi::Event)},
 };
 
 static ::google::protobuf::Message const * const file_default_instances[] = {
@@ -572,13 +603,14 @@
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_UsageStateChange_default_instance_),
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_StandbyStateChange_default_instance_),
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_StateChangeInfo_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_GenericEventInfo_default_instance_),
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_Event_default_instance_),
 };
 
 ::google::protobuf::internal::AssignDescriptorsTable assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto = {
   {}, AddDescriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, "dmi/hw_events_mgmt_service.proto", schemas,
   file_default_instances, TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto::offsets,
-  file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 17, file_level_enum_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, file_level_service_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto,
+  file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 18, file_level_enum_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, file_level_service_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto,
 };
 
 const char descriptor_table_protodef_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[] =
@@ -638,91 +670,99 @@
   "ateChangeH\000\0223\n\022usage_state_change\030\004 \001(\0132"
   "\025.dmi.UsageStateChangeH\000\0227\n\024standby_stat"
   "e_change\030\005 \001(\0132\027.dmi.StandbyStateChangeH"
-  "\000B\016\n\014state_change\"\371\001\n\005Event\022*\n\016event_met"
-  "adata\030\001 \001(\0132\022.dmi.EventMetaData\022\037\n\010event"
-  "_id\030\002 \001(\0162\r.dmi.EventIds\022-\n\traised_ts\030\003 "
-  "\001(\0132\032.google.protobuf.Timestamp\0221\n\016thres"
-  "hold_info\030\004 \001(\0132\031.dmi.ThresholdInformati"
-  "on\022\020\n\010add_info\030\005 \001(\t\022/\n\021state_change_inf"
-  "o\030\006 \001(\0132\024.dmi.StateChangeInfo*\265\024\n\010EventI"
-  "ds\022\030\n\024EVENT_NAME_UNDEFINED\020\000\022\036\n\032EVENT_TR"
-  "ANSCEIVER_PLUG_OUT\020d\022\035\n\031EVENT_TRANSCEIVE"
-  "R_PLUG_IN\020e\022-\n)EVENT_TRANSCEIVER_VOLTAGE"
-  "_ABOVE_THRESHOLD\020f\022-\n)EVENT_TRANSCEIVER_"
-  "VOLTAGE_BELOW_THRESHOLD\020g\0221\n-EVENT_TRANS"
-  "CEIVER_TEMPERATURE_ABOVE_THRESHOLD\020h\0221\n-"
-  "EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRE"
-  "SHOLD\020i\022-\n)EVENT_TRANSCEIVER_CURRENT_ABO"
-  "VE_THRESHOLD\020j\022-\n)EVENT_TRANSCEIVER_CURR"
-  "ENT_BELOW_THRESHOLD\020k\022.\n*EVENT_TRANSCEIV"
-  "ER_RX_POWER_ABOVE_THRESHOLD\020l\022.\n*EVENT_T"
-  "RANSCEIVER_RX_POWER_BELOW_THRESHOLD\020m\022.\n"
-  "*EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESH"
-  "OLD\020n\022.\n*EVENT_TRANSCEIVER_TX_POWER_BELO"
-  "W_THRESHOLD\020o\022\035\n\031EVENT_TRANSCEIVER_FAILU"
-  "RE\020p\0227\n3EVENT_TRANSCEIVER_VOLTAGE_ABOVE_"
-  "THRESHOLD_RECOVERED\020q\0227\n3EVENT_TRANSCEIV"
-  "ER_VOLTAGE_BELOW_THRESHOLD_RECOVERED\020r\022;"
-  "\n7EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_TH"
-  "RESHOLD_RECOVERED\020s\022;\n7EVENT_TRANSCEIVER"
-  "_TEMPERATURE_BELOW_THRESHOLD_RECOVERED\020t"
-  "\0227\n3EVENT_TRANSCEIVER_CURRENT_ABOVE_THRE"
-  "SHOLD_RECOVERED\020u\0227\n3EVENT_TRANSCEIVER_C"
-  "URRENT_BELOW_THRESHOLD_RECOVERED\020v\0228\n4EV"
-  "ENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD"
-  "_RECOVERED\020w\0228\n4EVENT_TRANSCEIVER_RX_POW"
-  "ER_BELOW_THRESHOLD_RECOVERED\020x\0228\n4EVENT_"
-  "TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD_REC"
-  "OVERED\020y\0228\n4EVENT_TRANSCEIVER_TX_POWER_B"
-  "ELOW_THRESHOLD_RECOVERED\020z\022\'\n#EVENT_TRAN"
-  "SCEIVER_FAILURE_RECOVERED\020{\022\027\n\022EVENT_PSU"
-  "_PLUG_OUT\020\310\001\022\026\n\021EVENT_PSU_PLUG_IN\020\311\001\022\026\n\021"
-  "EVENT_PSU_FAILURE\020\312\001\022 \n\033EVENT_PSU_FAILUR"
-  "E_RECOVERED\020\313\001\022\026\n\021EVENT_FAN_FAILURE\020\254\002\022\027"
-  "\n\022EVENT_FAN_PLUG_OUT\020\255\002\022\026\n\021EVENT_FAN_PLU"
-  "G_IN\020\256\002\022 \n\033EVENT_FAN_FAILURE_RECOVERED\020\257"
-  "\002\022)\n$EVENT_CPU_TEMPERATURE_ABOVE_CRITICA"
-  "L\020\220\003\022&\n!EVENT_CPU_TEMPERATURE_ABOVE_FATA"
-  "L\020\221\003\0223\n.EVENT_CPU_TEMPERATURE_ABOVE_CRIT"
-  "ICAL_RECOVERED\020\222\003\0220\n+EVENT_CPU_TEMPERATU"
-  "RE_ABOVE_FATAL_RECOVERED\020\223\003\022$\n\037EVENT_CPU"
-  "_USAGE_ABOVE_THRESHOLD\020\224\003\022.\n)EVENT_CPU_U"
-  "SAGE_ABOVE_THRESHOLD_RECOVERED\020\225\003\022\032\n\025EVE"
-  "NT_HW_DEVICE_RESET\020\364\003\022/\n*EVENT_HW_DEVICE"
-  "_TEMPERATURE_ABOVE_CRITICAL\020\365\003\022,\n\'EVENT_"
-  "HW_DEVICE_TEMPERATURE_ABOVE_FATAL\020\366\003\0229\n4"
-  "EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITIC"
-  "AL_RECOVERED\020\367\003\0226\n1EVENT_HW_DEVICE_TEMPE"
-  "RATURE_ABOVE_FATAL_RECOVERED\020\370\003\022\033\n\026EVENT"
-  "_HW_DEVICE_REBOOT\020\371\003\022\'\n\"EVENT_HW_TEMPERA"
-  "TURE_SENSOR_FAILED\020\372\003\022,\n\'EVENT_HW_ALL_TE"
-  "MPERATURE_SENSORS_FAILED\020\373\003\022(\n#EVENT_HW_"
-  "DISK_USAGE_ABOVE_THRESHOLD\020\374\003\0222\n-EVENT_H"
-  "W_DISK_USAGE_ABOVE_THRESHOLD_RECOVERED\020\375"
-  "\003\022*\n%EVENT_HW_MEMORY_USAGE_ABOVE_THRESHO"
-  "LD\020\376\003\0224\n/EVENT_HW_MEMORY_USAGE_ABOVE_THR"
-  "ESHOLD_RECOVERED\020\377\003\022\036\n\031EVENT_HW_NTP_SYNC"
-  "_FAILURE\020\200\004\022(\n#EVENT_HW_NTP_SYNC_FAILURE"
-  "_RECOVERED\020\201\004\022\035\n\030EVENT_LINE_CARD_PLUG_OU"
-  "T\020\330\004\022\034\n\027EVENT_LINE_CARD_PLUG_IN\020\331\004\022(\n#EV"
-  "ENT_COMPONENT_ADMIN_STATE_CHANGED\020\274\005\022\'\n\""
-  "EVENT_COMPONENT_OPER_STATE_CHANGED\020\275\005\022(\n"
-  "#EVENT_COMPONENT_ALARM_STATE_CHANGED\020\276\005\022"
-  "(\n#EVENT_COMPONENT_USAGE_STATE_CHANGED\020\277"
-  "\005\022*\n%EVENT_COMPONENT_STANDBY_STATE_CHANG"
-  "ED\020\300\0052\355\001\n\035NativeEventsManagementService\022"
-  "6\n\nListEvents\022\017.dmi.HardwareID\032\027.dmi.Lis"
-  "tEventsResponse\022^\n\031UpdateEventsConfigura"
-  "tion\022\037.dmi.EventsConfigurationRequest\032 ."
-  "dmi.EventsConfigurationResponse\0224\n\014Strea"
-  "mEvents\022\026.google.protobuf.Empty\032\n.dmi.Ev"
-  "ent0\001B;Z9github.com/opencord/device-mana"
-  "gement-interface/v3/go/dmib\006proto3"
+  "\000B\016\n\014state_change\"\333\001\n\020GenericEventInfo\022\017"
+  "\n\007message\030\001 \001(\t\022\024\n\014message_code\030\002 \001(\t\0225\n"
+  "\010severity\030\003 \001(\0162#.dmi.GenericEventInfo.E"
+  "ventSeverity\"i\n\rEventSeverity\022\036\n\032EVENT_S"
+  "EVERITY_UNSPECIFIED\020\000\022\014\n\010CRITICAL\020\001\022\t\n\005M"
+  "AJOR\020\002\022\t\n\005MINOR\020\003\022\n\n\006NORMAL\020\004\022\010\n\004INFO\020\005\""
+  "\254\002\n\005Event\022*\n\016event_metadata\030\001 \001(\0132\022.dmi."
+  "EventMetaData\022\037\n\010event_id\030\002 \001(\0162\r.dmi.Ev"
+  "entIds\022-\n\traised_ts\030\003 \001(\0132\032.google.proto"
+  "buf.Timestamp\0221\n\016threshold_info\030\004 \001(\0132\031."
+  "dmi.ThresholdInformation\022\020\n\010add_info\030\005 \001"
+  "(\t\022/\n\021state_change_info\030\006 \001(\0132\024.dmi.Stat"
+  "eChangeInfo\0221\n\022generic_event_info\030\007 \001(\0132"
+  "\025.dmi.GenericEventInfo*\331\024\n\010EventIds\022\030\n\024E"
+  "VENT_NAME_UNDEFINED\020\000\022\036\n\032EVENT_TRANSCEIV"
+  "ER_PLUG_OUT\020d\022\035\n\031EVENT_TRANSCEIVER_PLUG_"
+  "IN\020e\022-\n)EVENT_TRANSCEIVER_VOLTAGE_ABOVE_"
+  "THRESHOLD\020f\022-\n)EVENT_TRANSCEIVER_VOLTAGE"
+  "_BELOW_THRESHOLD\020g\0221\n-EVENT_TRANSCEIVER_"
+  "TEMPERATURE_ABOVE_THRESHOLD\020h\0221\n-EVENT_T"
+  "RANSCEIVER_TEMPERATURE_BELOW_THRESHOLD\020i"
+  "\022-\n)EVENT_TRANSCEIVER_CURRENT_ABOVE_THRE"
+  "SHOLD\020j\022-\n)EVENT_TRANSCEIVER_CURRENT_BEL"
+  "OW_THRESHOLD\020k\022.\n*EVENT_TRANSCEIVER_RX_P"
+  "OWER_ABOVE_THRESHOLD\020l\022.\n*EVENT_TRANSCEI"
+  "VER_RX_POWER_BELOW_THRESHOLD\020m\022.\n*EVENT_"
+  "TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD\020n\022."
+  "\n*EVENT_TRANSCEIVER_TX_POWER_BELOW_THRES"
+  "HOLD\020o\022\035\n\031EVENT_TRANSCEIVER_FAILURE\020p\0227\n"
+  "3EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHO"
+  "LD_RECOVERED\020q\0227\n3EVENT_TRANSCEIVER_VOLT"
+  "AGE_BELOW_THRESHOLD_RECOVERED\020r\022;\n7EVENT"
+  "_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD"
+  "_RECOVERED\020s\022;\n7EVENT_TRANSCEIVER_TEMPER"
+  "ATURE_BELOW_THRESHOLD_RECOVERED\020t\0227\n3EVE"
+  "NT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD_R"
+  "ECOVERED\020u\0227\n3EVENT_TRANSCEIVER_CURRENT_"
+  "BELOW_THRESHOLD_RECOVERED\020v\0228\n4EVENT_TRA"
+  "NSCEIVER_RX_POWER_ABOVE_THRESHOLD_RECOVE"
+  "RED\020w\0228\n4EVENT_TRANSCEIVER_RX_POWER_BELO"
+  "W_THRESHOLD_RECOVERED\020x\0228\n4EVENT_TRANSCE"
+  "IVER_TX_POWER_ABOVE_THRESHOLD_RECOVERED\020"
+  "y\0228\n4EVENT_TRANSCEIVER_TX_POWER_BELOW_TH"
+  "RESHOLD_RECOVERED\020z\022\'\n#EVENT_TRANSCEIVER"
+  "_FAILURE_RECOVERED\020{\022\027\n\022EVENT_PSU_PLUG_O"
+  "UT\020\310\001\022\026\n\021EVENT_PSU_PLUG_IN\020\311\001\022\026\n\021EVENT_P"
+  "SU_FAILURE\020\312\001\022 \n\033EVENT_PSU_FAILURE_RECOV"
+  "ERED\020\313\001\022\026\n\021EVENT_FAN_FAILURE\020\254\002\022\027\n\022EVENT"
+  "_FAN_PLUG_OUT\020\255\002\022\026\n\021EVENT_FAN_PLUG_IN\020\256\002"
+  "\022 \n\033EVENT_FAN_FAILURE_RECOVERED\020\257\002\022)\n$EV"
+  "ENT_CPU_TEMPERATURE_ABOVE_CRITICAL\020\220\003\022&\n"
+  "!EVENT_CPU_TEMPERATURE_ABOVE_FATAL\020\221\003\0223\n"
+  ".EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL_RE"
+  "COVERED\020\222\003\0220\n+EVENT_CPU_TEMPERATURE_ABOV"
+  "E_FATAL_RECOVERED\020\223\003\022$\n\037EVENT_CPU_USAGE_"
+  "ABOVE_THRESHOLD\020\224\003\022.\n)EVENT_CPU_USAGE_AB"
+  "OVE_THRESHOLD_RECOVERED\020\225\003\022\032\n\025EVENT_HW_D"
+  "EVICE_RESET\020\364\003\022/\n*EVENT_HW_DEVICE_TEMPER"
+  "ATURE_ABOVE_CRITICAL\020\365\003\022,\n\'EVENT_HW_DEVI"
+  "CE_TEMPERATURE_ABOVE_FATAL\020\366\003\0229\n4EVENT_H"
+  "W_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECO"
+  "VERED\020\367\003\0226\n1EVENT_HW_DEVICE_TEMPERATURE_"
+  "ABOVE_FATAL_RECOVERED\020\370\003\022\033\n\026EVENT_HW_DEV"
+  "ICE_REBOOT\020\371\003\022\'\n\"EVENT_HW_TEMPERATURE_SE"
+  "NSOR_FAILED\020\372\003\022,\n\'EVENT_HW_ALL_TEMPERATU"
+  "RE_SENSORS_FAILED\020\373\003\022(\n#EVENT_HW_DISK_US"
+  "AGE_ABOVE_THRESHOLD\020\374\003\0222\n-EVENT_HW_DISK_"
+  "USAGE_ABOVE_THRESHOLD_RECOVERED\020\375\003\022*\n%EV"
+  "ENT_HW_MEMORY_USAGE_ABOVE_THRESHOLD\020\376\003\0224"
+  "\n/EVENT_HW_MEMORY_USAGE_ABOVE_THRESHOLD_"
+  "RECOVERED\020\377\003\022\036\n\031EVENT_HW_NTP_SYNC_FAILUR"
+  "E\020\200\004\022(\n#EVENT_HW_NTP_SYNC_FAILURE_RECOVE"
+  "RED\020\201\004\022\035\n\030EVENT_LINE_CARD_PLUG_OUT\020\330\004\022\034\n"
+  "\027EVENT_LINE_CARD_PLUG_IN\020\331\004\022(\n#EVENT_COM"
+  "PONENT_ADMIN_STATE_CHANGED\020\274\005\022\'\n\"EVENT_C"
+  "OMPONENT_OPER_STATE_CHANGED\020\275\005\022(\n#EVENT_"
+  "COMPONENT_ALARM_STATE_CHANGED\020\276\005\022(\n#EVEN"
+  "T_COMPONENT_USAGE_STATE_CHANGED\020\277\005\022*\n%EV"
+  "ENT_COMPONENT_STANDBY_STATE_CHANGED\020\300\005\022\""
+  "\n\035EVENT_COMPONENT_GENERIC_EVENT\020\301\0052\355\001\n\035N"
+  "ativeEventsManagementService\0226\n\nListEven"
+  "ts\022\017.dmi.HardwareID\032\027.dmi.ListEventsResp"
+  "onse\022^\n\031UpdateEventsConfiguration\022\037.dmi."
+  "EventsConfigurationRequest\032 .dmi.EventsC"
+  "onfigurationResponse\0224\n\014StreamEvents\022\026.g"
+  "oogle.protobuf.Empty\032\n.dmi.Event0\001B;Z9gi"
+  "thub.com/opencord/device-management-inte"
+  "rface/v3/go/dmib\006proto3"
   ;
 ::google::protobuf::internal::DescriptorTable descriptor_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto = {
   false, InitDefaults_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 
   descriptor_table_protodef_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto,
-  "dmi/hw_events_mgmt_service.proto", &assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 5434,
+  "dmi/hw_events_mgmt_service.proto", &assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 5743,
 };
 
 void AddDescriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
@@ -791,10 +831,39 @@
 const EventsConfigurationResponse_Reason EventsConfigurationResponse::Reason_MAX;
 const int EventsConfigurationResponse::Reason_ARRAYSIZE;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
-const ::google::protobuf::EnumDescriptor* EventIds_descriptor() {
+const ::google::protobuf::EnumDescriptor* GenericEventInfo_EventSeverity_descriptor() {
   ::google::protobuf::internal::AssignDescriptors(&assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto);
   return file_level_enum_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[2];
 }
+bool GenericEventInfo_EventSeverity_IsValid(int value) {
+  switch (value) {
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+    case 5:
+      return true;
+    default:
+      return false;
+  }
+}
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const GenericEventInfo_EventSeverity GenericEventInfo::EVENT_SEVERITY_UNSPECIFIED;
+const GenericEventInfo_EventSeverity GenericEventInfo::CRITICAL;
+const GenericEventInfo_EventSeverity GenericEventInfo::MAJOR;
+const GenericEventInfo_EventSeverity GenericEventInfo::MINOR;
+const GenericEventInfo_EventSeverity GenericEventInfo::NORMAL;
+const GenericEventInfo_EventSeverity GenericEventInfo::INFO;
+const GenericEventInfo_EventSeverity GenericEventInfo::EventSeverity_MIN;
+const GenericEventInfo_EventSeverity GenericEventInfo::EventSeverity_MAX;
+const int GenericEventInfo::EventSeverity_ARRAYSIZE;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+const ::google::protobuf::EnumDescriptor* EventIds_descriptor() {
+  ::google::protobuf::internal::AssignDescriptors(&assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto);
+  return file_level_enum_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[3];
+}
 bool EventIds_IsValid(int value) {
   switch (value) {
     case 0:
@@ -857,6 +926,7 @@
     case 702:
     case 703:
     case 704:
+    case 705:
       return true;
     default:
       return false;
@@ -7140,6 +7210,424 @@
 
 // ===================================================================
 
+void GenericEventInfo::InitAsDefaultInstance() {
+}
+class GenericEventInfo::HasBitSetters {
+ public:
+};
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int GenericEventInfo::kMessageFieldNumber;
+const int GenericEventInfo::kMessageCodeFieldNumber;
+const int GenericEventInfo::kSeverityFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+GenericEventInfo::GenericEventInfo()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.GenericEventInfo)
+}
+GenericEventInfo::GenericEventInfo(const GenericEventInfo& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  message_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (from.message().size() > 0) {
+    message_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.message_);
+  }
+  message_code_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (from.message_code().size() > 0) {
+    message_code_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.message_code_);
+  }
+  severity_ = from.severity_;
+  // @@protoc_insertion_point(copy_constructor:dmi.GenericEventInfo)
+}
+
+void GenericEventInfo::SharedCtor() {
+  ::google::protobuf::internal::InitSCC(
+      &scc_info_GenericEventInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  message_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  message_code_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  severity_ = 0;
+}
+
+GenericEventInfo::~GenericEventInfo() {
+  // @@protoc_insertion_point(destructor:dmi.GenericEventInfo)
+  SharedDtor();
+}
+
+void GenericEventInfo::SharedDtor() {
+  message_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  message_code_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+
+void GenericEventInfo::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const GenericEventInfo& GenericEventInfo::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_GenericEventInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void GenericEventInfo::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.GenericEventInfo)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  message_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  message_code_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  severity_ = 0;
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* GenericEventInfo::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<GenericEventInfo*>(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) {
+      // string message = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 10) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        ctx->extra_parse_data().SetFieldName("dmi.GenericEventInfo.message");
+        object = msg->mutable_message();
+        if (size > end - ptr + ::google::protobuf::internal::ParseContext::kSlopBytes) {
+          parser_till_end = ::google::protobuf::internal::GreedyStringParserUTF8;
+          goto string_till_end;
+        }
+        GOOGLE_PROTOBUF_PARSER_ASSERT(::google::protobuf::internal::StringCheckUTF8(ptr, size, ctx));
+        ::google::protobuf::internal::InlineGreedyStringParser(object, ptr, size, ctx);
+        ptr += size;
+        break;
+      }
+      // string message_code = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 18) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        ctx->extra_parse_data().SetFieldName("dmi.GenericEventInfo.message_code");
+        object = msg->mutable_message_code();
+        if (size > end - ptr + ::google::protobuf::internal::ParseContext::kSlopBytes) {
+          parser_till_end = ::google::protobuf::internal::GreedyStringParserUTF8;
+          goto string_till_end;
+        }
+        GOOGLE_PROTOBUF_PARSER_ASSERT(::google::protobuf::internal::StringCheckUTF8(ptr, size, ctx));
+        ::google::protobuf::internal::InlineGreedyStringParser(object, ptr, size, ctx);
+        ptr += size;
+        break;
+      }
+      // .dmi.GenericEventInfo.EventSeverity severity = 3;
+      case 3: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 24) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_severity(static_cast<::dmi::GenericEventInfo_EventSeverity>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        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;
+string_till_end:
+  static_cast<::std::string*>(object)->clear();
+  static_cast<::std::string*>(object)->reserve(size);
+  goto len_delim_till_end;
+len_delim_till_end:
+  return ctx->StoreAndTailCall(ptr, end, {_InternalParse, msg},
+                               {parser_till_end, object}, size);
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool GenericEventInfo::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.GenericEventInfo)
+  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)) {
+      // string message = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (10 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_message()));
+          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+            this->message().data(), static_cast<int>(this->message().length()),
+            ::google::protobuf::internal::WireFormatLite::PARSE,
+            "dmi.GenericEventInfo.message"));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // string message_code = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (18 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_message_code()));
+          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+            this->message_code().data(), static_cast<int>(this->message_code().length()),
+            ::google::protobuf::internal::WireFormatLite::PARSE,
+            "dmi.GenericEventInfo.message_code"));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.GenericEventInfo.EventSeverity severity = 3;
+      case 3: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (24 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_severity(static_cast< ::dmi::GenericEventInfo_EventSeverity >(value));
+        } 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.GenericEventInfo)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.GenericEventInfo)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void GenericEventInfo::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.GenericEventInfo)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // string message = 1;
+  if (this->message().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->message().data(), static_cast<int>(this->message().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.GenericEventInfo.message");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      1, this->message(), output);
+  }
+
+  // string message_code = 2;
+  if (this->message_code().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->message_code().data(), static_cast<int>(this->message_code().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.GenericEventInfo.message_code");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      2, this->message_code(), output);
+  }
+
+  // .dmi.GenericEventInfo.EventSeverity severity = 3;
+  if (this->severity() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      3, this->severity(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.GenericEventInfo)
+}
+
+::google::protobuf::uint8* GenericEventInfo::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.GenericEventInfo)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // string message = 1;
+  if (this->message().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->message().data(), static_cast<int>(this->message().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.GenericEventInfo.message");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->message(), target);
+  }
+
+  // string message_code = 2;
+  if (this->message_code().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->message_code().data(), static_cast<int>(this->message_code().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.GenericEventInfo.message_code");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        2, this->message_code(), target);
+  }
+
+  // .dmi.GenericEventInfo.EventSeverity severity = 3;
+  if (this->severity() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      3, this->severity(), 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.GenericEventInfo)
+  return target;
+}
+
+size_t GenericEventInfo::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.GenericEventInfo)
+  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;
+
+  // string message = 1;
+  if (this->message().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->message());
+  }
+
+  // string message_code = 2;
+  if (this->message_code().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->message_code());
+  }
+
+  // .dmi.GenericEventInfo.EventSeverity severity = 3;
+  if (this->severity() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->severity());
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void GenericEventInfo::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.GenericEventInfo)
+  GOOGLE_DCHECK_NE(&from, this);
+  const GenericEventInfo* source =
+      ::google::protobuf::DynamicCastToGenerated<GenericEventInfo>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.GenericEventInfo)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.GenericEventInfo)
+    MergeFrom(*source);
+  }
+}
+
+void GenericEventInfo::MergeFrom(const GenericEventInfo& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.GenericEventInfo)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.message().size() > 0) {
+
+    message_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.message_);
+  }
+  if (from.message_code().size() > 0) {
+
+    message_code_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.message_code_);
+  }
+  if (from.severity() != 0) {
+    set_severity(from.severity());
+  }
+}
+
+void GenericEventInfo::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.GenericEventInfo)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void GenericEventInfo::CopyFrom(const GenericEventInfo& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.GenericEventInfo)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool GenericEventInfo::IsInitialized() const {
+  return true;
+}
+
+void GenericEventInfo::Swap(GenericEventInfo* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void GenericEventInfo::InternalSwap(GenericEventInfo* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  message_.Swap(&other->message_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+    GetArenaNoVirtual());
+  message_code_.Swap(&other->message_code_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+    GetArenaNoVirtual());
+  swap(severity_, other->severity_);
+}
+
+::google::protobuf::Metadata GenericEventInfo::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
 void Event::InitAsDefaultInstance() {
   ::dmi::_Event_default_instance_._instance.get_mutable()->event_metadata_ = const_cast< ::dmi::EventMetaData*>(
       ::dmi::EventMetaData::internal_default_instance());
@@ -7149,6 +7637,8 @@
       ::dmi::ThresholdInformation::internal_default_instance());
   ::dmi::_Event_default_instance_._instance.get_mutable()->state_change_info_ = const_cast< ::dmi::StateChangeInfo*>(
       ::dmi::StateChangeInfo::internal_default_instance());
+  ::dmi::_Event_default_instance_._instance.get_mutable()->generic_event_info_ = const_cast< ::dmi::GenericEventInfo*>(
+      ::dmi::GenericEventInfo::internal_default_instance());
 }
 class Event::HasBitSetters {
  public:
@@ -7156,6 +7646,7 @@
   static const ::google::protobuf::Timestamp& raised_ts(const Event* msg);
   static const ::dmi::ThresholdInformation& threshold_info(const Event* msg);
   static const ::dmi::StateChangeInfo& state_change_info(const Event* msg);
+  static const ::dmi::GenericEventInfo& generic_event_info(const Event* msg);
 };
 
 const ::dmi::EventMetaData&
@@ -7174,6 +7665,10 @@
 Event::HasBitSetters::state_change_info(const Event* msg) {
   return *msg->state_change_info_;
 }
+const ::dmi::GenericEventInfo&
+Event::HasBitSetters::generic_event_info(const Event* msg) {
+  return *msg->generic_event_info_;
+}
 void Event::clear_raised_ts() {
   if (GetArenaNoVirtual() == nullptr && raised_ts_ != nullptr) {
     delete raised_ts_;
@@ -7187,6 +7682,7 @@
 const int Event::kThresholdInfoFieldNumber;
 const int Event::kAddInfoFieldNumber;
 const int Event::kStateChangeInfoFieldNumber;
+const int Event::kGenericEventInfoFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 Event::Event()
@@ -7222,6 +7718,11 @@
   } else {
     state_change_info_ = nullptr;
   }
+  if (from.has_generic_event_info()) {
+    generic_event_info_ = new ::dmi::GenericEventInfo(*from.generic_event_info_);
+  } else {
+    generic_event_info_ = nullptr;
+  }
   event_id_ = from.event_id_;
   // @@protoc_insertion_point(copy_constructor:dmi.Event)
 }
@@ -7246,6 +7747,7 @@
   if (this != internal_default_instance()) delete raised_ts_;
   if (this != internal_default_instance()) delete threshold_info_;
   if (this != internal_default_instance()) delete state_change_info_;
+  if (this != internal_default_instance()) delete generic_event_info_;
 }
 
 void Event::SetCachedSize(int size) const {
@@ -7280,6 +7782,10 @@
     delete state_change_info_;
   }
   state_change_info_ = nullptr;
+  if (GetArenaNoVirtual() == nullptr && generic_event_info_ != nullptr) {
+    delete generic_event_info_;
+  }
+  generic_event_info_ = nullptr;
   event_id_ = 0;
   _internal_metadata_.Clear();
 }
@@ -7373,6 +7879,19 @@
             {parser_till_end, object}, ptr - size, ptr));
         break;
       }
+      // .dmi.GenericEventInfo generic_event_info = 7;
+      case 7: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 58) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::GenericEventInfo::_InternalParse;
+        object = msg->mutable_generic_event_info();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
@@ -7480,6 +7999,17 @@
         break;
       }
 
+      // .dmi.GenericEventInfo generic_event_info = 7;
+      case 7: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (58 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_generic_event_info()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
       default: {
       handle_unusual:
         if (tag == 0) {
@@ -7547,6 +8077,12 @@
       6, HasBitSetters::state_change_info(this), output);
   }
 
+  // .dmi.GenericEventInfo generic_event_info = 7;
+  if (this->has_generic_event_info()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      7, HasBitSetters::generic_event_info(this), output);
+  }
+
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
         _internal_metadata_.unknown_fields(), output);
@@ -7605,6 +8141,13 @@
         6, HasBitSetters::state_change_info(this), target);
   }
 
+  // .dmi.GenericEventInfo generic_event_info = 7;
+  if (this->has_generic_event_info()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        7, HasBitSetters::generic_event_info(this), target);
+  }
+
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields(), target);
@@ -7661,6 +8204,13 @@
         *state_change_info_);
   }
 
+  // .dmi.GenericEventInfo generic_event_info = 7;
+  if (this->has_generic_event_info()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::MessageSize(
+        *generic_event_info_);
+  }
+
   // .dmi.EventIds event_id = 2;
   if (this->event_id() != 0) {
     total_size += 1 +
@@ -7710,6 +8260,9 @@
   if (from.has_state_change_info()) {
     mutable_state_change_info()->::dmi::StateChangeInfo::MergeFrom(from.state_change_info());
   }
+  if (from.has_generic_event_info()) {
+    mutable_generic_event_info()->::dmi::GenericEventInfo::MergeFrom(from.generic_event_info());
+  }
   if (from.event_id() != 0) {
     set_event_id(from.event_id());
   }
@@ -7746,6 +8299,7 @@
   swap(raised_ts_, other->raised_ts_);
   swap(threshold_info_, other->threshold_info_);
   swap(state_change_info_, other->state_change_info_);
+  swap(generic_event_info_, other->generic_event_info_);
   swap(event_id_, other->event_id_);
 }
 
@@ -7807,6 +8361,9 @@
 template<> PROTOBUF_NOINLINE ::dmi::StateChangeInfo* Arena::CreateMaybeMessage< ::dmi::StateChangeInfo >(Arena* arena) {
   return Arena::CreateInternal< ::dmi::StateChangeInfo >(arena);
 }
+template<> PROTOBUF_NOINLINE ::dmi::GenericEventInfo* Arena::CreateMaybeMessage< ::dmi::GenericEventInfo >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::GenericEventInfo >(arena);
+}
 template<> PROTOBUF_NOINLINE ::dmi::Event* Arena::CreateMaybeMessage< ::dmi::Event >(Arena* arena) {
   return Arena::CreateInternal< ::dmi::Event >(arena);
 }
diff --git a/cpp/dmi/hw_events_mgmt_service.pb.h b/cpp/dmi/hw_events_mgmt_service.pb.h
index 7e3e8bd..b4e0463 100644
--- a/cpp/dmi/hw_events_mgmt_service.pb.h
+++ b/cpp/dmi/hw_events_mgmt_service.pb.h
@@ -46,7 +46,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[17]
+  static const ::google::protobuf::internal::ParseTable schema[18]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::google::protobuf::internal::FieldMetadata field_metadata[];
   static const ::google::protobuf::internal::SerializationTable serialization_table[];
@@ -78,6 +78,9 @@
 class EventsConfigurationResponse;
 class EventsConfigurationResponseDefaultTypeInternal;
 extern EventsConfigurationResponseDefaultTypeInternal _EventsConfigurationResponse_default_instance_;
+class GenericEventInfo;
+class GenericEventInfoDefaultTypeInternal;
+extern GenericEventInfoDefaultTypeInternal _GenericEventInfo_default_instance_;
 class ListEventsResponse;
 class ListEventsResponseDefaultTypeInternal;
 extern ListEventsResponseDefaultTypeInternal _ListEventsResponse_default_instance_;
@@ -116,6 +119,7 @@
 template<> ::dmi::EventsCfg* Arena::CreateMaybeMessage<::dmi::EventsCfg>(Arena*);
 template<> ::dmi::EventsConfigurationRequest* Arena::CreateMaybeMessage<::dmi::EventsConfigurationRequest>(Arena*);
 template<> ::dmi::EventsConfigurationResponse* Arena::CreateMaybeMessage<::dmi::EventsConfigurationResponse>(Arena*);
+template<> ::dmi::GenericEventInfo* Arena::CreateMaybeMessage<::dmi::GenericEventInfo>(Arena*);
 template<> ::dmi::ListEventsResponse* Arena::CreateMaybeMessage<::dmi::ListEventsResponse>(Arena*);
 template<> ::dmi::OperStateChange* Arena::CreateMaybeMessage<::dmi::OperStateChange>(Arena*);
 template<> ::dmi::StandbyStateChange* Arena::CreateMaybeMessage<::dmi::StandbyStateChange>(Arena*);
@@ -176,6 +180,31 @@
   return ::google::protobuf::internal::ParseNamedEnum<EventsConfigurationResponse_Reason>(
     EventsConfigurationResponse_Reason_descriptor(), name, value);
 }
+enum GenericEventInfo_EventSeverity {
+  GenericEventInfo_EventSeverity_EVENT_SEVERITY_UNSPECIFIED = 0,
+  GenericEventInfo_EventSeverity_CRITICAL = 1,
+  GenericEventInfo_EventSeverity_MAJOR = 2,
+  GenericEventInfo_EventSeverity_MINOR = 3,
+  GenericEventInfo_EventSeverity_NORMAL = 4,
+  GenericEventInfo_EventSeverity_INFO = 5,
+  GenericEventInfo_EventSeverity_GenericEventInfo_EventSeverity_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::min(),
+  GenericEventInfo_EventSeverity_GenericEventInfo_EventSeverity_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::max()
+};
+bool GenericEventInfo_EventSeverity_IsValid(int value);
+const GenericEventInfo_EventSeverity GenericEventInfo_EventSeverity_EventSeverity_MIN = GenericEventInfo_EventSeverity_EVENT_SEVERITY_UNSPECIFIED;
+const GenericEventInfo_EventSeverity GenericEventInfo_EventSeverity_EventSeverity_MAX = GenericEventInfo_EventSeverity_INFO;
+const int GenericEventInfo_EventSeverity_EventSeverity_ARRAYSIZE = GenericEventInfo_EventSeverity_EventSeverity_MAX + 1;
+
+const ::google::protobuf::EnumDescriptor* GenericEventInfo_EventSeverity_descriptor();
+inline const ::std::string& GenericEventInfo_EventSeverity_Name(GenericEventInfo_EventSeverity value) {
+  return ::google::protobuf::internal::NameOfEnum(
+    GenericEventInfo_EventSeverity_descriptor(), value);
+}
+inline bool GenericEventInfo_EventSeverity_Parse(
+    const ::std::string& name, GenericEventInfo_EventSeverity* value) {
+  return ::google::protobuf::internal::ParseNamedEnum<GenericEventInfo_EventSeverity>(
+    GenericEventInfo_EventSeverity_descriptor(), name, value);
+}
 enum EventIds {
   EVENT_NAME_UNDEFINED = 0,
   EVENT_TRANSCEIVER_PLUG_OUT = 100,
@@ -237,12 +266,13 @@
   EVENT_COMPONENT_ALARM_STATE_CHANGED = 702,
   EVENT_COMPONENT_USAGE_STATE_CHANGED = 703,
   EVENT_COMPONENT_STANDBY_STATE_CHANGED = 704,
+  EVENT_COMPONENT_GENERIC_EVENT = 705,
   EventIds_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::min(),
   EventIds_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::max()
 };
 bool EventIds_IsValid(int value);
 const EventIds EventIds_MIN = EVENT_NAME_UNDEFINED;
-const EventIds EventIds_MAX = EVENT_COMPONENT_STANDBY_STATE_CHANGED;
+const EventIds EventIds_MAX = EVENT_COMPONENT_GENERIC_EVENT;
 const int EventIds_ARRAYSIZE = EventIds_MAX + 1;
 
 const ::google::protobuf::EnumDescriptor* EventIds_descriptor();
@@ -2476,6 +2506,182 @@
 };
 // -------------------------------------------------------------------
 
+class GenericEventInfo final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.GenericEventInfo) */ {
+ public:
+  GenericEventInfo();
+  virtual ~GenericEventInfo();
+
+  GenericEventInfo(const GenericEventInfo& from);
+
+  inline GenericEventInfo& operator=(const GenericEventInfo& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  GenericEventInfo(GenericEventInfo&& from) noexcept
+    : GenericEventInfo() {
+    *this = ::std::move(from);
+  }
+
+  inline GenericEventInfo& operator=(GenericEventInfo&& 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 GenericEventInfo& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const GenericEventInfo* internal_default_instance() {
+    return reinterpret_cast<const GenericEventInfo*>(
+               &_GenericEventInfo_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    16;
+
+  void Swap(GenericEventInfo* other);
+  friend void swap(GenericEventInfo& a, GenericEventInfo& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline GenericEventInfo* New() const final {
+    return CreateMaybeMessage<GenericEventInfo>(nullptr);
+  }
+
+  GenericEventInfo* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<GenericEventInfo>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const GenericEventInfo& from);
+  void MergeFrom(const GenericEventInfo& 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(GenericEventInfo* 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 ----------------------------------------------------
+
+  typedef GenericEventInfo_EventSeverity EventSeverity;
+  static const EventSeverity EVENT_SEVERITY_UNSPECIFIED =
+    GenericEventInfo_EventSeverity_EVENT_SEVERITY_UNSPECIFIED;
+  static const EventSeverity CRITICAL =
+    GenericEventInfo_EventSeverity_CRITICAL;
+  static const EventSeverity MAJOR =
+    GenericEventInfo_EventSeverity_MAJOR;
+  static const EventSeverity MINOR =
+    GenericEventInfo_EventSeverity_MINOR;
+  static const EventSeverity NORMAL =
+    GenericEventInfo_EventSeverity_NORMAL;
+  static const EventSeverity INFO =
+    GenericEventInfo_EventSeverity_INFO;
+  static inline bool EventSeverity_IsValid(int value) {
+    return GenericEventInfo_EventSeverity_IsValid(value);
+  }
+  static const EventSeverity EventSeverity_MIN =
+    GenericEventInfo_EventSeverity_EventSeverity_MIN;
+  static const EventSeverity EventSeverity_MAX =
+    GenericEventInfo_EventSeverity_EventSeverity_MAX;
+  static const int EventSeverity_ARRAYSIZE =
+    GenericEventInfo_EventSeverity_EventSeverity_ARRAYSIZE;
+  static inline const ::google::protobuf::EnumDescriptor*
+  EventSeverity_descriptor() {
+    return GenericEventInfo_EventSeverity_descriptor();
+  }
+  static inline const ::std::string& EventSeverity_Name(EventSeverity value) {
+    return GenericEventInfo_EventSeverity_Name(value);
+  }
+  static inline bool EventSeverity_Parse(const ::std::string& name,
+      EventSeverity* value) {
+    return GenericEventInfo_EventSeverity_Parse(name, value);
+  }
+
+  // accessors -------------------------------------------------------
+
+  // string message = 1;
+  void clear_message();
+  static const int kMessageFieldNumber = 1;
+  const ::std::string& message() const;
+  void set_message(const ::std::string& value);
+  #if LANG_CXX11
+  void set_message(::std::string&& value);
+  #endif
+  void set_message(const char* value);
+  void set_message(const char* value, size_t size);
+  ::std::string* mutable_message();
+  ::std::string* release_message();
+  void set_allocated_message(::std::string* message);
+
+  // string message_code = 2;
+  void clear_message_code();
+  static const int kMessageCodeFieldNumber = 2;
+  const ::std::string& message_code() const;
+  void set_message_code(const ::std::string& value);
+  #if LANG_CXX11
+  void set_message_code(::std::string&& value);
+  #endif
+  void set_message_code(const char* value);
+  void set_message_code(const char* value, size_t size);
+  ::std::string* mutable_message_code();
+  ::std::string* release_message_code();
+  void set_allocated_message_code(::std::string* message_code);
+
+  // .dmi.GenericEventInfo.EventSeverity severity = 3;
+  void clear_severity();
+  static const int kSeverityFieldNumber = 3;
+  ::dmi::GenericEventInfo_EventSeverity severity() const;
+  void set_severity(::dmi::GenericEventInfo_EventSeverity value);
+
+  // @@protoc_insertion_point(class_scope:dmi.GenericEventInfo)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::internal::ArenaStringPtr message_;
+  ::google::protobuf::internal::ArenaStringPtr message_code_;
+  int severity_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
 class Event final :
     public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.Event) */ {
  public:
@@ -2514,7 +2720,7 @@
                &_Event_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    16;
+    17;
 
   void Swap(Event* other);
   friend void swap(Event& a, Event& b) {
@@ -2621,6 +2827,15 @@
   ::dmi::StateChangeInfo* mutable_state_change_info();
   void set_allocated_state_change_info(::dmi::StateChangeInfo* state_change_info);
 
+  // .dmi.GenericEventInfo generic_event_info = 7;
+  bool has_generic_event_info() const;
+  void clear_generic_event_info();
+  static const int kGenericEventInfoFieldNumber = 7;
+  const ::dmi::GenericEventInfo& generic_event_info() const;
+  ::dmi::GenericEventInfo* release_generic_event_info();
+  ::dmi::GenericEventInfo* mutable_generic_event_info();
+  void set_allocated_generic_event_info(::dmi::GenericEventInfo* generic_event_info);
+
   // .dmi.EventIds event_id = 2;
   void clear_event_id();
   static const int kEventIdFieldNumber = 2;
@@ -2637,6 +2852,7 @@
   ::google::protobuf::Timestamp* raised_ts_;
   ::dmi::ThresholdInformation* threshold_info_;
   ::dmi::StateChangeInfo* state_change_info_;
+  ::dmi::GenericEventInfo* generic_event_info_;
   int event_id_;
   mutable ::google::protobuf::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
@@ -4107,6 +4323,130 @@
 }
 // -------------------------------------------------------------------
 
+// GenericEventInfo
+
+// string message = 1;
+inline void GenericEventInfo::clear_message() {
+  message_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline const ::std::string& GenericEventInfo::message() const {
+  // @@protoc_insertion_point(field_get:dmi.GenericEventInfo.message)
+  return message_.GetNoArena();
+}
+inline void GenericEventInfo::set_message(const ::std::string& value) {
+  
+  message_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:dmi.GenericEventInfo.message)
+}
+#if LANG_CXX11
+inline void GenericEventInfo::set_message(::std::string&& value) {
+  
+  message_.SetNoArena(
+    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:dmi.GenericEventInfo.message)
+}
+#endif
+inline void GenericEventInfo::set_message(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  message_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:dmi.GenericEventInfo.message)
+}
+inline void GenericEventInfo::set_message(const char* value, size_t size) {
+  
+  message_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:dmi.GenericEventInfo.message)
+}
+inline ::std::string* GenericEventInfo::mutable_message() {
+  
+  // @@protoc_insertion_point(field_mutable:dmi.GenericEventInfo.message)
+  return message_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline ::std::string* GenericEventInfo::release_message() {
+  // @@protoc_insertion_point(field_release:dmi.GenericEventInfo.message)
+  
+  return message_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline void GenericEventInfo::set_allocated_message(::std::string* message) {
+  if (message != nullptr) {
+    
+  } else {
+    
+  }
+  message_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), message);
+  // @@protoc_insertion_point(field_set_allocated:dmi.GenericEventInfo.message)
+}
+
+// string message_code = 2;
+inline void GenericEventInfo::clear_message_code() {
+  message_code_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline const ::std::string& GenericEventInfo::message_code() const {
+  // @@protoc_insertion_point(field_get:dmi.GenericEventInfo.message_code)
+  return message_code_.GetNoArena();
+}
+inline void GenericEventInfo::set_message_code(const ::std::string& value) {
+  
+  message_code_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:dmi.GenericEventInfo.message_code)
+}
+#if LANG_CXX11
+inline void GenericEventInfo::set_message_code(::std::string&& value) {
+  
+  message_code_.SetNoArena(
+    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:dmi.GenericEventInfo.message_code)
+}
+#endif
+inline void GenericEventInfo::set_message_code(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  message_code_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:dmi.GenericEventInfo.message_code)
+}
+inline void GenericEventInfo::set_message_code(const char* value, size_t size) {
+  
+  message_code_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:dmi.GenericEventInfo.message_code)
+}
+inline ::std::string* GenericEventInfo::mutable_message_code() {
+  
+  // @@protoc_insertion_point(field_mutable:dmi.GenericEventInfo.message_code)
+  return message_code_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline ::std::string* GenericEventInfo::release_message_code() {
+  // @@protoc_insertion_point(field_release:dmi.GenericEventInfo.message_code)
+  
+  return message_code_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline void GenericEventInfo::set_allocated_message_code(::std::string* message_code) {
+  if (message_code != nullptr) {
+    
+  } else {
+    
+  }
+  message_code_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), message_code);
+  // @@protoc_insertion_point(field_set_allocated:dmi.GenericEventInfo.message_code)
+}
+
+// .dmi.GenericEventInfo.EventSeverity severity = 3;
+inline void GenericEventInfo::clear_severity() {
+  severity_ = 0;
+}
+inline ::dmi::GenericEventInfo_EventSeverity GenericEventInfo::severity() const {
+  // @@protoc_insertion_point(field_get:dmi.GenericEventInfo.severity)
+  return static_cast< ::dmi::GenericEventInfo_EventSeverity >(severity_);
+}
+inline void GenericEventInfo::set_severity(::dmi::GenericEventInfo_EventSeverity value) {
+  
+  severity_ = value;
+  // @@protoc_insertion_point(field_set:dmi.GenericEventInfo.severity)
+}
+
+// -------------------------------------------------------------------
+
 // Event
 
 // .dmi.EventMetaData event_metadata = 1;
@@ -4375,6 +4715,57 @@
   // @@protoc_insertion_point(field_set_allocated:dmi.Event.state_change_info)
 }
 
+// .dmi.GenericEventInfo generic_event_info = 7;
+inline bool Event::has_generic_event_info() const {
+  return this != internal_default_instance() && generic_event_info_ != nullptr;
+}
+inline void Event::clear_generic_event_info() {
+  if (GetArenaNoVirtual() == nullptr && generic_event_info_ != nullptr) {
+    delete generic_event_info_;
+  }
+  generic_event_info_ = nullptr;
+}
+inline const ::dmi::GenericEventInfo& Event::generic_event_info() const {
+  const ::dmi::GenericEventInfo* p = generic_event_info_;
+  // @@protoc_insertion_point(field_get:dmi.Event.generic_event_info)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::GenericEventInfo*>(
+      &::dmi::_GenericEventInfo_default_instance_);
+}
+inline ::dmi::GenericEventInfo* Event::release_generic_event_info() {
+  // @@protoc_insertion_point(field_release:dmi.Event.generic_event_info)
+  
+  ::dmi::GenericEventInfo* temp = generic_event_info_;
+  generic_event_info_ = nullptr;
+  return temp;
+}
+inline ::dmi::GenericEventInfo* Event::mutable_generic_event_info() {
+  
+  if (generic_event_info_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::GenericEventInfo>(GetArenaNoVirtual());
+    generic_event_info_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.Event.generic_event_info)
+  return generic_event_info_;
+}
+inline void Event::set_allocated_generic_event_info(::dmi::GenericEventInfo* generic_event_info) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete generic_event_info_;
+  }
+  if (generic_event_info) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      generic_event_info = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, generic_event_info, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  generic_event_info_ = generic_event_info;
+  // @@protoc_insertion_point(field_set_allocated:dmi.Event.generic_event_info)
+}
+
 #ifdef __GNUC__
   #pragma GCC diagnostic pop
 #endif  // __GNUC__
@@ -4410,6 +4801,8 @@
 
 // -------------------------------------------------------------------
 
+// -------------------------------------------------------------------
+
 
 // @@protoc_insertion_point(namespace_scope)
 
@@ -4428,6 +4821,11 @@
 inline const EnumDescriptor* GetEnumDescriptor< ::dmi::EventsConfigurationResponse_Reason>() {
   return ::dmi::EventsConfigurationResponse_Reason_descriptor();
 }
+template <> struct is_proto_enum< ::dmi::GenericEventInfo_EventSeverity> : ::std::true_type {};
+template <>
+inline const EnumDescriptor* GetEnumDescriptor< ::dmi::GenericEventInfo_EventSeverity>() {
+  return ::dmi::GenericEventInfo_EventSeverity_descriptor();
+}
 template <> struct is_proto_enum< ::dmi::EventIds> : ::std::true_type {};
 template <>
 inline const EnumDescriptor* GetEnumDescriptor< ::dmi::EventIds>() {
