diff --git a/go/dmi/hw_events_mgmt_service.pb.go b/go/dmi/hw_events_mgmt_service.pb.go
new file mode 100644
index 0000000..996b735
--- /dev/null
+++ b/go/dmi/hw_events_mgmt_service.pb.go
@@ -0,0 +1,1013 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/hw_events_mgmt_service.proto
+
+package dmi
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	grpc "google.golang.org/grpc"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type EventIds int32
+
+const (
+	EventIds_EVENT_NAME_UNDEFINED EventIds = 0
+	// Events from the Transceivers
+	EventIds_EVENT_TRANSCEIVER_PLUG_OUT                    EventIds = 100
+	EventIds_EVENT_TRANSCEIVER_PLUG_IN                     EventIds = 101
+	EventIds_EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD     EventIds = 102
+	EventIds_EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD     EventIds = 103
+	EventIds_EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD EventIds = 104
+	EventIds_EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD EventIds = 105
+	EventIds_EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD     EventIds = 106
+	EventIds_EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD     EventIds = 107
+	EventIds_EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD    EventIds = 108
+	EventIds_EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD    EventIds = 109
+	EventIds_EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD    EventIds = 110
+	EventIds_EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD    EventIds = 111
+	EventIds_EVENT_TRANSCEIVER_FAILURE                     EventIds = 112
+	// Events from the PSU
+	EventIds_EVENT_PSU_PLUG_OUT EventIds = 200
+	EventIds_EVENT_PSU_PLUG_IN  EventIds = 201
+	EventIds_EVENT_PSU_FAILURE  EventIds = 202
+	// Events for the Fans
+	EventIds_EVENT_FAN_FAILURE  EventIds = 300
+	EventIds_EVENT_FAN_PLUG_OUT EventIds = 301
+	EventIds_EVENT_FAN_PLUG_IN  EventIds = 302
+	// Events for the CPUs
+	EventIds_EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL EventIds = 400
+	EventIds_EVENT_CPU_TEMPERATURE_ABOVE_FATAL    EventIds = 401
+	// Events for the complete HW Device
+	EventIds_EVENT_HW_DEVICE_RESET                      EventIds = 500
+	EventIds_EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL EventIds = 501
+	EventIds_EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL    EventIds = 502
+)
+
+var EventIds_name = map[int32]string{
+	0:   "EVENT_NAME_UNDEFINED",
+	100: "EVENT_TRANSCEIVER_PLUG_OUT",
+	101: "EVENT_TRANSCEIVER_PLUG_IN",
+	102: "EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD",
+	103: "EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD",
+	104: "EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD",
+	105: "EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD",
+	106: "EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD",
+	107: "EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD",
+	108: "EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD",
+	109: "EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD",
+	110: "EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD",
+	111: "EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD",
+	112: "EVENT_TRANSCEIVER_FAILURE",
+	200: "EVENT_PSU_PLUG_OUT",
+	201: "EVENT_PSU_PLUG_IN",
+	202: "EVENT_PSU_FAILURE",
+	300: "EVENT_FAN_FAILURE",
+	301: "EVENT_FAN_PLUG_OUT",
+	302: "EVENT_FAN_PLUG_IN",
+	400: "EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL",
+	401: "EVENT_CPU_TEMPERATURE_ABOVE_FATAL",
+	500: "EVENT_HW_DEVICE_RESET",
+	501: "EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL",
+	502: "EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL",
+}
+
+var EventIds_value = map[string]int32{
+	"EVENT_NAME_UNDEFINED":                          0,
+	"EVENT_TRANSCEIVER_PLUG_OUT":                    100,
+	"EVENT_TRANSCEIVER_PLUG_IN":                     101,
+	"EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD":     102,
+	"EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD":     103,
+	"EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD": 104,
+	"EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD": 105,
+	"EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD":     106,
+	"EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD":     107,
+	"EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD":    108,
+	"EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD":    109,
+	"EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD":    110,
+	"EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD":    111,
+	"EVENT_TRANSCEIVER_FAILURE":                     112,
+	"EVENT_PSU_PLUG_OUT":                            200,
+	"EVENT_PSU_PLUG_IN":                             201,
+	"EVENT_PSU_FAILURE":                             202,
+	"EVENT_FAN_FAILURE":                             300,
+	"EVENT_FAN_PLUG_OUT":                            301,
+	"EVENT_FAN_PLUG_IN":                             302,
+	"EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL":          400,
+	"EVENT_CPU_TEMPERATURE_ABOVE_FATAL":             401,
+	"EVENT_HW_DEVICE_RESET":                         500,
+	"EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL":    501,
+	"EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL":       502,
+}
+
+func (x EventIds) String() string {
+	return proto.EnumName(EventIds_name, int32(x))
+}
+
+func (EventIds) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{0}
+}
+
+type ValueType struct {
+	// Types that are valid to be assigned to Val:
+	//	*ValueType_IntVal
+	//	*ValueType_UintVal
+	//	*ValueType_FloatVal
+	Val                  isValueType_Val `protobuf_oneof:"val"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *ValueType) Reset()         { *m = ValueType{} }
+func (m *ValueType) String() string { return proto.CompactTextString(m) }
+func (*ValueType) ProtoMessage()    {}
+func (*ValueType) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{0}
+}
+
+func (m *ValueType) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ValueType.Unmarshal(m, b)
+}
+func (m *ValueType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ValueType.Marshal(b, m, deterministic)
+}
+func (m *ValueType) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ValueType.Merge(m, src)
+}
+func (m *ValueType) XXX_Size() int {
+	return xxx_messageInfo_ValueType.Size(m)
+}
+func (m *ValueType) XXX_DiscardUnknown() {
+	xxx_messageInfo_ValueType.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ValueType proto.InternalMessageInfo
+
+type isValueType_Val interface {
+	isValueType_Val()
+}
+
+type ValueType_IntVal struct {
+	IntVal int64 `protobuf:"varint,1,opt,name=int_val,json=intVal,proto3,oneof"`
+}
+
+type ValueType_UintVal struct {
+	UintVal uint64 `protobuf:"varint,2,opt,name=uint_val,json=uintVal,proto3,oneof"`
+}
+
+type ValueType_FloatVal struct {
+	FloatVal float32 `protobuf:"fixed32,3,opt,name=float_val,json=floatVal,proto3,oneof"`
+}
+
+func (*ValueType_IntVal) isValueType_Val() {}
+
+func (*ValueType_UintVal) isValueType_Val() {}
+
+func (*ValueType_FloatVal) isValueType_Val() {}
+
+func (m *ValueType) GetVal() isValueType_Val {
+	if m != nil {
+		return m.Val
+	}
+	return nil
+}
+
+func (m *ValueType) GetIntVal() int64 {
+	if x, ok := m.GetVal().(*ValueType_IntVal); ok {
+		return x.IntVal
+	}
+	return 0
+}
+
+func (m *ValueType) GetUintVal() uint64 {
+	if x, ok := m.GetVal().(*ValueType_UintVal); ok {
+		return x.UintVal
+	}
+	return 0
+}
+
+func (m *ValueType) GetFloatVal() float32 {
+	if x, ok := m.GetVal().(*ValueType_FloatVal); ok {
+		return x.FloatVal
+	}
+	return 0
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*ValueType) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*ValueType_IntVal)(nil),
+		(*ValueType_UintVal)(nil),
+		(*ValueType_FloatVal)(nil),
+	}
+}
+
+type WaterMarks struct {
+	High                 *ValueType `protobuf:"bytes,1,opt,name=high,proto3" json:"high,omitempty"`
+	Low                  *ValueType `protobuf:"bytes,2,opt,name=low,proto3" json:"low,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *WaterMarks) Reset()         { *m = WaterMarks{} }
+func (m *WaterMarks) String() string { return proto.CompactTextString(m) }
+func (*WaterMarks) ProtoMessage()    {}
+func (*WaterMarks) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{1}
+}
+
+func (m *WaterMarks) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_WaterMarks.Unmarshal(m, b)
+}
+func (m *WaterMarks) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_WaterMarks.Marshal(b, m, deterministic)
+}
+func (m *WaterMarks) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_WaterMarks.Merge(m, src)
+}
+func (m *WaterMarks) XXX_Size() int {
+	return xxx_messageInfo_WaterMarks.Size(m)
+}
+func (m *WaterMarks) XXX_DiscardUnknown() {
+	xxx_messageInfo_WaterMarks.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_WaterMarks proto.InternalMessageInfo
+
+func (m *WaterMarks) GetHigh() *ValueType {
+	if m != nil {
+		return m.High
+	}
+	return nil
+}
+
+func (m *WaterMarks) GetLow() *ValueType {
+	if m != nil {
+		return m.Low
+	}
+	return nil
+}
+
+type Thresholds struct {
+	// Types that are valid to be assigned to Threshold:
+	//	*Thresholds_Upper
+	//	*Thresholds_Lower
+	Threshold            isThresholds_Threshold `protobuf_oneof:"threshold"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *Thresholds) Reset()         { *m = Thresholds{} }
+func (m *Thresholds) String() string { return proto.CompactTextString(m) }
+func (*Thresholds) ProtoMessage()    {}
+func (*Thresholds) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{2}
+}
+
+func (m *Thresholds) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Thresholds.Unmarshal(m, b)
+}
+func (m *Thresholds) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Thresholds.Marshal(b, m, deterministic)
+}
+func (m *Thresholds) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Thresholds.Merge(m, src)
+}
+func (m *Thresholds) XXX_Size() int {
+	return xxx_messageInfo_Thresholds.Size(m)
+}
+func (m *Thresholds) XXX_DiscardUnknown() {
+	xxx_messageInfo_Thresholds.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Thresholds proto.InternalMessageInfo
+
+type isThresholds_Threshold interface {
+	isThresholds_Threshold()
+}
+
+type Thresholds_Upper struct {
+	Upper *WaterMarks `protobuf:"bytes,1,opt,name=upper,proto3,oneof"`
+}
+
+type Thresholds_Lower struct {
+	Lower *WaterMarks `protobuf:"bytes,2,opt,name=lower,proto3,oneof"`
+}
+
+func (*Thresholds_Upper) isThresholds_Threshold() {}
+
+func (*Thresholds_Lower) isThresholds_Threshold() {}
+
+func (m *Thresholds) GetThreshold() isThresholds_Threshold {
+	if m != nil {
+		return m.Threshold
+	}
+	return nil
+}
+
+func (m *Thresholds) GetUpper() *WaterMarks {
+	if x, ok := m.GetThreshold().(*Thresholds_Upper); ok {
+		return x.Upper
+	}
+	return nil
+}
+
+func (m *Thresholds) GetLower() *WaterMarks {
+	if x, ok := m.GetThreshold().(*Thresholds_Lower); ok {
+		return x.Lower
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Thresholds) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Thresholds_Upper)(nil),
+		(*Thresholds_Lower)(nil),
+	}
+}
+
+type ThresholdInformation struct {
+	ObservedValue        *ValueType  `protobuf:"bytes,1,opt,name=observed_value,json=observedValue,proto3" json:"observed_value,omitempty"`
+	Thresholds           *Thresholds `protobuf:"bytes,2,opt,name=thresholds,proto3" json:"thresholds,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *ThresholdInformation) Reset()         { *m = ThresholdInformation{} }
+func (m *ThresholdInformation) String() string { return proto.CompactTextString(m) }
+func (*ThresholdInformation) ProtoMessage()    {}
+func (*ThresholdInformation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{3}
+}
+
+func (m *ThresholdInformation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ThresholdInformation.Unmarshal(m, b)
+}
+func (m *ThresholdInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ThresholdInformation.Marshal(b, m, deterministic)
+}
+func (m *ThresholdInformation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ThresholdInformation.Merge(m, src)
+}
+func (m *ThresholdInformation) XXX_Size() int {
+	return xxx_messageInfo_ThresholdInformation.Size(m)
+}
+func (m *ThresholdInformation) XXX_DiscardUnknown() {
+	xxx_messageInfo_ThresholdInformation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ThresholdInformation proto.InternalMessageInfo
+
+func (m *ThresholdInformation) GetObservedValue() *ValueType {
+	if m != nil {
+		return m.ObservedValue
+	}
+	return nil
+}
+
+func (m *ThresholdInformation) GetThresholds() *Thresholds {
+	if m != nil {
+		return m.Thresholds
+	}
+	return nil
+}
+
+type EventCfg struct {
+	EventId      EventIds `protobuf:"varint,1,opt,name=event_id,json=eventId,proto3,enum=dmi.EventIds" json:"event_id,omitempty"`
+	IsConfigured bool     `protobuf:"varint,2,opt,name=is_configured,json=isConfigured,proto3" json:"is_configured,omitempty"`
+	// Optional threshold values, applicable only for some specific events
+	Thresholds           *Thresholds `protobuf:"bytes,3,opt,name=thresholds,proto3" json:"thresholds,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *EventCfg) Reset()         { *m = EventCfg{} }
+func (m *EventCfg) String() string { return proto.CompactTextString(m) }
+func (*EventCfg) ProtoMessage()    {}
+func (*EventCfg) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{4}
+}
+
+func (m *EventCfg) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EventCfg.Unmarshal(m, b)
+}
+func (m *EventCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EventCfg.Marshal(b, m, deterministic)
+}
+func (m *EventCfg) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EventCfg.Merge(m, src)
+}
+func (m *EventCfg) XXX_Size() int {
+	return xxx_messageInfo_EventCfg.Size(m)
+}
+func (m *EventCfg) XXX_DiscardUnknown() {
+	xxx_messageInfo_EventCfg.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EventCfg proto.InternalMessageInfo
+
+func (m *EventCfg) GetEventId() EventIds {
+	if m != nil {
+		return m.EventId
+	}
+	return EventIds_EVENT_NAME_UNDEFINED
+}
+
+func (m *EventCfg) GetIsConfigured() bool {
+	if m != nil {
+		return m.IsConfigured
+	}
+	return false
+}
+
+func (m *EventCfg) GetThresholds() *Thresholds {
+	if m != nil {
+		return m.Thresholds
+	}
+	return nil
+}
+
+type EventsCfg struct {
+	Items                []*EventCfg `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *EventsCfg) Reset()         { *m = EventsCfg{} }
+func (m *EventsCfg) String() string { return proto.CompactTextString(m) }
+func (*EventsCfg) ProtoMessage()    {}
+func (*EventsCfg) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{5}
+}
+
+func (m *EventsCfg) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EventsCfg.Unmarshal(m, b)
+}
+func (m *EventsCfg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EventsCfg.Marshal(b, m, deterministic)
+}
+func (m *EventsCfg) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EventsCfg.Merge(m, src)
+}
+func (m *EventsCfg) XXX_Size() int {
+	return xxx_messageInfo_EventsCfg.Size(m)
+}
+func (m *EventsCfg) XXX_DiscardUnknown() {
+	xxx_messageInfo_EventsCfg.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EventsCfg proto.InternalMessageInfo
+
+func (m *EventsCfg) GetItems() []*EventCfg {
+	if m != nil {
+		return m.Items
+	}
+	return nil
+}
+
+type ListEventsResponse struct {
+	Status               Status     `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason     `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	Events               *EventsCfg `protobuf:"bytes,3,opt,name=events,proto3" json:"events,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *ListEventsResponse) Reset()         { *m = ListEventsResponse{} }
+func (m *ListEventsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListEventsResponse) ProtoMessage()    {}
+func (*ListEventsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{6}
+}
+
+func (m *ListEventsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListEventsResponse.Unmarshal(m, b)
+}
+func (m *ListEventsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListEventsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListEventsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListEventsResponse.Merge(m, src)
+}
+func (m *ListEventsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListEventsResponse.Size(m)
+}
+func (m *ListEventsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListEventsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListEventsResponse proto.InternalMessageInfo
+
+func (m *ListEventsResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *ListEventsResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *ListEventsResponse) GetEvents() *EventsCfg {
+	if m != nil {
+		return m.Events
+	}
+	return nil
+}
+
+type EventsConfigurationRequest struct {
+	DeviceUuid *Uuid `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	// Types that are valid to be assigned to Operation:
+	//	*EventsConfigurationRequest_Changes
+	//	*EventsConfigurationRequest_ResetToDefault
+	Operation            isEventsConfigurationRequest_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *EventsConfigurationRequest) Reset()         { *m = EventsConfigurationRequest{} }
+func (m *EventsConfigurationRequest) String() string { return proto.CompactTextString(m) }
+func (*EventsConfigurationRequest) ProtoMessage()    {}
+func (*EventsConfigurationRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{7}
+}
+
+func (m *EventsConfigurationRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EventsConfigurationRequest.Unmarshal(m, b)
+}
+func (m *EventsConfigurationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EventsConfigurationRequest.Marshal(b, m, deterministic)
+}
+func (m *EventsConfigurationRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EventsConfigurationRequest.Merge(m, src)
+}
+func (m *EventsConfigurationRequest) XXX_Size() int {
+	return xxx_messageInfo_EventsConfigurationRequest.Size(m)
+}
+func (m *EventsConfigurationRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_EventsConfigurationRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EventsConfigurationRequest proto.InternalMessageInfo
+
+func (m *EventsConfigurationRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+type isEventsConfigurationRequest_Operation interface {
+	isEventsConfigurationRequest_Operation()
+}
+
+type EventsConfigurationRequest_Changes struct {
+	Changes *EventsCfg `protobuf:"bytes,2,opt,name=changes,proto3,oneof"`
+}
+
+type EventsConfigurationRequest_ResetToDefault struct {
+	ResetToDefault bool `protobuf:"varint,3,opt,name=reset_to_default,json=resetToDefault,proto3,oneof"`
+}
+
+func (*EventsConfigurationRequest_Changes) isEventsConfigurationRequest_Operation() {}
+
+func (*EventsConfigurationRequest_ResetToDefault) isEventsConfigurationRequest_Operation() {}
+
+func (m *EventsConfigurationRequest) GetOperation() isEventsConfigurationRequest_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *EventsConfigurationRequest) GetChanges() *EventsCfg {
+	if x, ok := m.GetOperation().(*EventsConfigurationRequest_Changes); ok {
+		return x.Changes
+	}
+	return nil
+}
+
+func (m *EventsConfigurationRequest) GetResetToDefault() bool {
+	if x, ok := m.GetOperation().(*EventsConfigurationRequest_ResetToDefault); ok {
+		return x.ResetToDefault
+	}
+	return false
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*EventsConfigurationRequest) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*EventsConfigurationRequest_Changes)(nil),
+		(*EventsConfigurationRequest_ResetToDefault)(nil),
+	}
+}
+
+type EventsConfigurationResponse struct {
+	Status               Status   `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason               Reason   `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.Reason" json:"reason,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EventsConfigurationResponse) Reset()         { *m = EventsConfigurationResponse{} }
+func (m *EventsConfigurationResponse) String() string { return proto.CompactTextString(m) }
+func (*EventsConfigurationResponse) ProtoMessage()    {}
+func (*EventsConfigurationResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{8}
+}
+
+func (m *EventsConfigurationResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EventsConfigurationResponse.Unmarshal(m, b)
+}
+func (m *EventsConfigurationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EventsConfigurationResponse.Marshal(b, m, deterministic)
+}
+func (m *EventsConfigurationResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EventsConfigurationResponse.Merge(m, src)
+}
+func (m *EventsConfigurationResponse) XXX_Size() int {
+	return xxx_messageInfo_EventsConfigurationResponse.Size(m)
+}
+func (m *EventsConfigurationResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_EventsConfigurationResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EventsConfigurationResponse proto.InternalMessageInfo
+
+func (m *EventsConfigurationResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *EventsConfigurationResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+type EventMetaData struct {
+	DeviceUuid *Uuid `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	// uuid of the component
+	ComponentUuid        *Uuid    `protobuf:"bytes,2,opt,name=component_uuid,json=componentUuid,proto3" json:"component_uuid,omitempty"`
+	ComponentName        string   `protobuf:"bytes,3,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EventMetaData) Reset()         { *m = EventMetaData{} }
+func (m *EventMetaData) String() string { return proto.CompactTextString(m) }
+func (*EventMetaData) ProtoMessage()    {}
+func (*EventMetaData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{9}
+}
+
+func (m *EventMetaData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EventMetaData.Unmarshal(m, b)
+}
+func (m *EventMetaData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EventMetaData.Marshal(b, m, deterministic)
+}
+func (m *EventMetaData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EventMetaData.Merge(m, src)
+}
+func (m *EventMetaData) XXX_Size() int {
+	return xxx_messageInfo_EventMetaData.Size(m)
+}
+func (m *EventMetaData) XXX_DiscardUnknown() {
+	xxx_messageInfo_EventMetaData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EventMetaData proto.InternalMessageInfo
+
+func (m *EventMetaData) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *EventMetaData) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *EventMetaData) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+type Event struct {
+	EventMetadata *EventMetaData       `protobuf:"bytes,1,opt,name=event_metadata,json=eventMetadata,proto3" json:"event_metadata,omitempty"`
+	EventId       EventIds             `protobuf:"varint,2,opt,name=event_id,json=eventId,proto3,enum=dmi.EventIds" json:"event_id,omitempty"`
+	RaisedTs      *timestamp.Timestamp `protobuf:"bytes,3,opt,name=raised_ts,json=raisedTs,proto3" json:"raised_ts,omitempty"`
+	// Optional threshold information for an event
+	ThresholdInfo *ThresholdInformation `protobuf:"bytes,4,opt,name=threshold_info,json=thresholdInfo,proto3" json:"threshold_info,omitempty"`
+	// Any additional info regarding the event
+	AddInfo              string   `protobuf:"bytes,5,opt,name=add_info,json=addInfo,proto3" json:"add_info,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Event) Reset()         { *m = Event{} }
+func (m *Event) String() string { return proto.CompactTextString(m) }
+func (*Event) ProtoMessage()    {}
+func (*Event) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{10}
+}
+
+func (m *Event) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Event.Unmarshal(m, b)
+}
+func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Event.Marshal(b, m, deterministic)
+}
+func (m *Event) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Event.Merge(m, src)
+}
+func (m *Event) XXX_Size() int {
+	return xxx_messageInfo_Event.Size(m)
+}
+func (m *Event) XXX_DiscardUnknown() {
+	xxx_messageInfo_Event.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Event proto.InternalMessageInfo
+
+func (m *Event) GetEventMetadata() *EventMetaData {
+	if m != nil {
+		return m.EventMetadata
+	}
+	return nil
+}
+
+func (m *Event) GetEventId() EventIds {
+	if m != nil {
+		return m.EventId
+	}
+	return EventIds_EVENT_NAME_UNDEFINED
+}
+
+func (m *Event) GetRaisedTs() *timestamp.Timestamp {
+	if m != nil {
+		return m.RaisedTs
+	}
+	return nil
+}
+
+func (m *Event) GetThresholdInfo() *ThresholdInformation {
+	if m != nil {
+		return m.ThresholdInfo
+	}
+	return nil
+}
+
+func (m *Event) GetAddInfo() string {
+	if m != nil {
+		return m.AddInfo
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterEnum("dmi.EventIds", EventIds_name, EventIds_value)
+	proto.RegisterType((*ValueType)(nil), "dmi.ValueType")
+	proto.RegisterType((*WaterMarks)(nil), "dmi.WaterMarks")
+	proto.RegisterType((*Thresholds)(nil), "dmi.Thresholds")
+	proto.RegisterType((*ThresholdInformation)(nil), "dmi.ThresholdInformation")
+	proto.RegisterType((*EventCfg)(nil), "dmi.EventCfg")
+	proto.RegisterType((*EventsCfg)(nil), "dmi.EventsCfg")
+	proto.RegisterType((*ListEventsResponse)(nil), "dmi.ListEventsResponse")
+	proto.RegisterType((*EventsConfigurationRequest)(nil), "dmi.EventsConfigurationRequest")
+	proto.RegisterType((*EventsConfigurationResponse)(nil), "dmi.EventsConfigurationResponse")
+	proto.RegisterType((*EventMetaData)(nil), "dmi.EventMetaData")
+	proto.RegisterType((*Event)(nil), "dmi.Event")
+}
+
+func init() { proto.RegisterFile("dmi/hw_events_mgmt_service.proto", fileDescriptor_8962d785556e9979) }
+
+var fileDescriptor_8962d785556e9979 = []byte{
+	// 1163 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcf, 0x6f, 0x1b, 0x45,
+	0x14, 0x8e, 0xed, 0x26, 0xb1, 0x5f, 0x6a, 0xe3, 0x8e, 0x0a, 0x4d, 0x5c, 0x95, 0x1a, 0x17, 0xda,
+	0x34, 0x22, 0x76, 0x49, 0x05, 0xa8, 0xe2, 0x82, 0x63, 0x6f, 0xea, 0x95, 0x1c, 0x27, 0x9a, 0xac,
+	0x1d, 0xc4, 0x81, 0xd5, 0xc4, 0x3b, 0x5e, 0x0f, 0xdd, 0xdd, 0x31, 0x3b, 0xb3, 0x89, 0xb8, 0x70,
+	0xe0, 0xc0, 0x81, 0x13, 0x48, 0xfc, 0x19, 0x94, 0x2b, 0xff, 0x00, 0x07, 0xe0, 0xef, 0x01, 0xce,
+	0x68, 0x67, 0xd6, 0x3f, 0x62, 0x3b, 0x89, 0x90, 0xb8, 0x79, 0xdf, 0xf7, 0xbd, 0xf7, 0x7d, 0xfb,
+	0xf6, 0xbd, 0x19, 0x43, 0xd9, 0xf1, 0x59, 0x6d, 0x78, 0x61, 0xd3, 0x73, 0x1a, 0x48, 0x61, 0xfb,
+	0xae, 0x2f, 0x6d, 0x41, 0xc3, 0x73, 0xd6, 0xa7, 0xd5, 0x51, 0xc8, 0x25, 0x47, 0x19, 0xc7, 0x67,
+	0xa5, 0x3b, 0x31, 0xad, 0xcf, 0x7d, 0x9f, 0x07, 0x42, 0xc7, 0x4b, 0xb7, 0x75, 0x66, 0xf2, 0xf4,
+	0xd0, 0xe5, 0xdc, 0xf5, 0x68, 0x4d, 0x3d, 0x9d, 0x45, 0x83, 0x9a, 0x64, 0x3e, 0x15, 0x92, 0xf8,
+	0x23, 0x4d, 0xa8, 0x30, 0xc8, 0xf5, 0x88, 0x17, 0x51, 0xeb, 0xeb, 0x11, 0x45, 0x5b, 0xb0, 0xce,
+	0x02, 0x69, 0x9f, 0x13, 0x6f, 0x33, 0x55, 0x4e, 0x6d, 0x67, 0x5a, 0x2b, 0x78, 0x8d, 0x05, 0xb2,
+	0x47, 0x3c, 0x74, 0x1f, 0xb2, 0xd1, 0x18, 0x4b, 0x97, 0x53, 0xdb, 0xb7, 0x5a, 0x2b, 0x78, 0x3d,
+	0x4a, 0xc0, 0x07, 0x90, 0x1b, 0x78, 0x9c, 0x68, 0x34, 0x53, 0x4e, 0x6d, 0xa7, 0x5b, 0x2b, 0x38,
+	0xab, 0x42, 0x3d, 0xe2, 0xed, 0xaf, 0x42, 0xe6, 0x9c, 0x78, 0x15, 0x0c, 0x70, 0x4a, 0x24, 0x0d,
+	0x0f, 0x49, 0xf8, 0x4a, 0xa0, 0x0a, 0xdc, 0x1a, 0x32, 0x77, 0xa8, 0x84, 0x36, 0xf6, 0x0a, 0x55,
+	0xc7, 0x67, 0xd5, 0x89, 0x13, 0xac, 0x30, 0x54, 0x86, 0x8c, 0xc7, 0x2f, 0x94, 0xde, 0x22, 0x25,
+	0x86, 0x2a, 0xaf, 0x00, 0xac, 0x61, 0x48, 0xc5, 0x90, 0x7b, 0x8e, 0x40, 0x4f, 0x60, 0x35, 0x1a,
+	0x8d, 0x68, 0x98, 0x14, 0x7d, 0x43, 0x65, 0x4c, 0x35, 0x5b, 0x2b, 0x58, 0xe3, 0x31, 0xd1, 0xe3,
+	0x17, 0x34, 0x4c, 0x4a, 0x2f, 0x23, 0x2a, 0x7c, 0x7f, 0x03, 0x72, 0x72, 0x5c, 0xbf, 0xf2, 0x0d,
+	0xdc, 0x9d, 0x88, 0x99, 0xc1, 0x80, 0x87, 0x3e, 0x91, 0x8c, 0x07, 0xe8, 0x43, 0x28, 0xf0, 0xb3,
+	0xf8, 0xeb, 0x50, 0x27, 0xee, 0x40, 0x44, 0xaf, 0x78, 0xa9, 0xfc, 0x98, 0xa5, 0x42, 0xa8, 0x06,
+	0x30, 0xa9, 0x2d, 0x2e, 0x39, 0x99, 0xbe, 0x12, 0x9e, 0xa1, 0x54, 0xbe, 0x4f, 0x41, 0xd6, 0x88,
+	0x07, 0xa2, 0x31, 0x70, 0xd1, 0x36, 0x64, 0xd5, 0x70, 0xd8, 0xcc, 0x51, 0x72, 0x85, 0xbd, 0xbc,
+	0xca, 0x55, 0x04, 0xd3, 0x11, 0x78, 0x9d, 0xea, 0x5f, 0xe8, 0x11, 0xe4, 0x99, 0xb0, 0xfb, 0x3c,
+	0x18, 0x30, 0x37, 0x0a, 0xa9, 0xa3, 0xa4, 0xb2, 0xf8, 0x36, 0x13, 0x8d, 0x49, 0x6c, 0xce, 0x4c,
+	0xe6, 0x66, 0x33, 0xcf, 0x20, 0xa7, 0xa4, 0x44, 0x6c, 0xe6, 0x11, 0xac, 0x32, 0x49, 0x7d, 0xb1,
+	0x99, 0x2a, 0x67, 0xb6, 0x37, 0x66, 0x9d, 0x34, 0x06, 0x2e, 0xd6, 0x58, 0xe5, 0xbb, 0x14, 0xa0,
+	0x36, 0x13, 0x52, 0xa7, 0x61, 0x2a, 0x46, 0x3c, 0x10, 0x14, 0x3d, 0x82, 0x35, 0x21, 0x89, 0x8c,
+	0x44, 0xf2, 0x1a, 0x1b, 0x2a, 0xf9, 0x44, 0x85, 0x70, 0x02, 0xc5, 0xa4, 0x90, 0x12, 0xc1, 0x03,
+	0x65, 0x7e, 0x4c, 0xc2, 0x2a, 0x84, 0x13, 0x08, 0x3d, 0x86, 0x35, 0xbd, 0x2f, 0x89, 0xff, 0xc2,
+	0xd4, 0x46, 0xec, 0x12, 0x27, 0x68, 0xe5, 0x75, 0x0a, 0x4a, 0x49, 0x34, 0x69, 0x80, 0xfa, 0x8e,
+	0x98, 0x7e, 0x15, 0x51, 0x21, 0xd1, 0x0e, 0x6c, 0x38, 0x34, 0xde, 0x34, 0x3b, 0x8a, 0x92, 0xe6,
+	0x6e, 0xec, 0xe5, 0x54, 0xad, 0x6e, 0xc4, 0x1c, 0x0c, 0x1a, 0x8d, 0x7f, 0xa3, 0x1d, 0x58, 0xef,
+	0x0f, 0x49, 0xe0, 0x52, 0x71, 0x69, 0x4a, 0x27, 0x9a, 0xf1, 0x96, 0x24, 0x04, 0xb4, 0x03, 0xc5,
+	0x90, 0x0a, 0x2a, 0x6d, 0xc9, 0x6d, 0x87, 0x0e, 0x48, 0xe4, 0x49, 0x65, 0x34, 0xdb, 0x5a, 0xc1,
+	0x05, 0x85, 0x58, 0xbc, 0xa9, 0xe3, 0xf1, 0xdc, 0xf1, 0x11, 0xd5, 0xbe, 0x2a, 0x2e, 0xdc, 0x5f,
+	0x6a, 0xf7, 0xff, 0x6e, 0x60, 0xe5, 0xa7, 0x14, 0xe4, 0x95, 0xd2, 0x21, 0x95, 0xa4, 0x49, 0x24,
+	0xf9, 0x4f, 0xbd, 0x78, 0x06, 0x85, 0x3e, 0xf7, 0x47, 0x3c, 0x88, 0xa7, 0x52, 0xd1, 0xd3, 0xf3,
+	0xf4, 0xfc, 0x84, 0xa0, 0x32, 0xde, 0x9b, 0xcd, 0x08, 0x88, 0x4f, 0x55, 0x3f, 0x72, 0x33, 0xb4,
+	0x0e, 0xf1, 0x69, 0xe5, 0xdb, 0x34, 0xac, 0x2a, 0x5b, 0xe8, 0x05, 0x14, 0xf4, 0xd0, 0xfb, 0x54,
+	0x12, 0x87, 0x48, 0x92, 0x38, 0x42, 0xd3, 0xae, 0x8f, 0xad, 0xe3, 0x3c, 0x1d, 0x3f, 0xc6, 0xc4,
+	0x4b, 0xfb, 0x92, 0xbe, 0x76, 0x5f, 0x3e, 0x86, 0x5c, 0x48, 0x98, 0xa0, 0x8e, 0x3d, 0x99, 0xa4,
+	0x52, 0x55, 0x9f, 0xa3, 0xd5, 0xf1, 0x39, 0x5a, 0xb5, 0xc6, 0xe7, 0x28, 0xce, 0x6a, 0xb2, 0x25,
+	0xd0, 0xa7, 0x50, 0x98, 0x2c, 0x88, 0xcd, 0x82, 0x01, 0xdf, 0xbc, 0xa5, 0xb2, 0xb7, 0x2e, 0xef,
+	0xd1, 0xcc, 0xd1, 0x81, 0xf3, 0x72, 0x36, 0x8a, 0xb6, 0x20, 0x4b, 0x9c, 0x24, 0x77, 0x55, 0xb5,
+	0x62, 0x9d, 0x38, 0x0a, 0xda, 0xf9, 0x6d, 0x3d, 0x59, 0x7e, 0xd3, 0x11, 0x68, 0x13, 0xee, 0x1a,
+	0x3d, 0xa3, 0x63, 0xd9, 0x9d, 0xfa, 0xa1, 0x61, 0x77, 0x3b, 0x4d, 0xe3, 0xc0, 0xec, 0x18, 0xcd,
+	0xe2, 0x0a, 0x7a, 0x1b, 0x4a, 0x1a, 0xb1, 0x70, 0xbd, 0x73, 0xd2, 0x30, 0xcc, 0x9e, 0x81, 0xed,
+	0xe3, 0x76, 0xf7, 0xa5, 0x7d, 0xd4, 0xb5, 0x8a, 0x0e, 0x7a, 0x00, 0x5b, 0x57, 0xe0, 0x66, 0xa7,
+	0x48, 0xd1, 0x2e, 0x3c, 0x5d, 0x84, 0x7b, 0x47, 0x6d, 0xab, 0xfe, 0xd2, 0xb0, 0xeb, 0xfb, 0x47,
+	0x3d, 0xc3, 0xb6, 0x5a, 0xd8, 0x38, 0x69, 0x1d, 0xb5, 0x9b, 0xc5, 0xc1, 0xf5, 0xf4, 0x7d, 0xa3,
+	0x7d, 0x74, 0x3a, 0x43, 0x77, 0xd1, 0x07, 0xb0, 0xbb, 0x48, 0xb7, 0x8c, 0xc3, 0x63, 0x03, 0xd7,
+	0xad, 0x2e, 0x5e, 0x54, 0x18, 0xde, 0x9c, 0x32, 0xaf, 0xc2, 0x96, 0x9b, 0x6a, 0x74, 0x31, 0x8e,
+	0x63, 0xf3, 0x0a, 0x5f, 0x5e, 0x4f, 0x9f, 0xaf, 0xfe, 0x0a, 0x55, 0x61, 0x67, 0x91, 0x8e, 0x3f,
+	0xb3, 0x8f, 0x8f, 0x4e, 0x0d, 0xbc, 0x50, 0xde, 0xbb, 0x81, 0x3f, 0x5f, 0xdf, 0x5f, 0xce, 0xb7,
+	0xae, 0xaa, 0x1f, 0xdc, 0xc0, 0x9f, 0xaf, 0xcf, 0x97, 0x0f, 0xc0, 0x41, 0xdd, 0x6c, 0x77, 0xb1,
+	0x51, 0x1c, 0xa1, 0x7b, 0x80, 0x34, 0x7c, 0x7c, 0xd2, 0x9d, 0xce, 0xcd, 0xef, 0x29, 0xf4, 0x16,
+	0xdc, 0x99, 0x03, 0xcc, 0x4e, 0xf1, 0x8f, 0xb9, 0xf8, 0xb8, 0xce, 0x9f, 0x33, 0xf1, 0x83, 0x7a,
+	0x67, 0x12, 0xff, 0x39, 0x3d, 0x15, 0x88, 0xe3, 0x13, 0x81, 0xd7, 0xe9, 0xcb, 0x09, 0x63, 0x81,
+	0x5f, 0xd2, 0xe8, 0x29, 0xbc, 0xab, 0xe3, 0x8d, 0xe3, 0xee, 0x92, 0x61, 0x69, 0x60, 0xd3, 0x32,
+	0x1b, 0xf5, 0x76, 0xf1, 0x87, 0x0c, 0x7a, 0x0c, 0xef, 0x5c, 0x47, 0x3d, 0xa8, 0x5b, 0xf5, 0x76,
+	0xf1, 0xc7, 0x0c, 0x2a, 0xc1, 0x9b, 0x9a, 0xd7, 0x3a, 0xb5, 0x9b, 0x46, 0xcf, 0x6c, 0x18, 0x36,
+	0x36, 0x4e, 0x0c, 0xab, 0xf8, 0x57, 0x06, 0xd5, 0xc6, 0xfd, 0x9c, 0x62, 0xd7, 0x88, 0xfe, 0x9d,
+	0x41, 0xef, 0xc3, 0x93, 0x9b, 0x13, 0xb4, 0xf4, 0x3f, 0x99, 0xbd, 0x5f, 0x53, 0xf0, 0xa0, 0x43,
+	0x24, 0x3b, 0xa7, 0xfa, 0x48, 0x3f, 0x24, 0x01, 0x71, 0xa9, 0x4f, 0x03, 0x79, 0xa2, 0xff, 0xde,
+	0xa1, 0x8f, 0x00, 0xa6, 0xb7, 0x24, 0xd2, 0x77, 0x70, 0x8b, 0x84, 0xce, 0x05, 0x09, 0xa9, 0xd9,
+	0x2c, 0xdd, 0x53, 0x81, 0x25, 0xf7, 0xe8, 0x17, 0xb0, 0xd5, 0x1d, 0x39, 0x44, 0xd2, 0x25, 0x77,
+	0x05, 0x7a, 0x38, 0x7b, 0x2d, 0x2d, 0xb9, 0xf4, 0x4a, 0xe5, 0xab, 0x09, 0xba, 0xfe, 0xfe, 0x27,
+	0x9f, 0xbf, 0x70, 0x99, 0x1c, 0x46, 0x67, 0xd5, 0x3e, 0xf7, 0x6b, 0x7c, 0x44, 0x83, 0x3e, 0x0f,
+	0x9d, 0x9a, 0xbe, 0x00, 0x76, 0xfd, 0xc9, 0x7b, 0xec, 0xb2, 0x40, 0xd2, 0x70, 0x40, 0xfa, 0xb4,
+	0x76, 0xfe, 0xbc, 0xe6, 0xf2, 0x9a, 0xe3, 0xb3, 0xb3, 0x35, 0x75, 0x70, 0x3e, 0xff, 0x37, 0x00,
+	0x00, 0xff, 0xff, 0xf6, 0xe8, 0x88, 0x80, 0xd8, 0x0a, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// NativeEventsManagementServiceClient is the client API for NativeEventsManagementService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type NativeEventsManagementServiceClient interface {
+	// List the supported events for the passed device
+	ListEvents(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*ListEventsResponse, error)
+	// Updates the configuration of the list of events in the request
+	// The default behaviour of the device is to report all the supported events
+	// This configuration is persisted across reboots of the device or the device manager
+	UpdateEventsConfiguration(ctx context.Context, in *EventsConfigurationRequest, opts ...grpc.CallOption) (*EventsConfigurationResponse, error)
+}
+
+type nativeEventsManagementServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewNativeEventsManagementServiceClient(cc *grpc.ClientConn) NativeEventsManagementServiceClient {
+	return &nativeEventsManagementServiceClient{cc}
+}
+
+func (c *nativeEventsManagementServiceClient) ListEvents(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*ListEventsResponse, error) {
+	out := new(ListEventsResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeEventsManagementService/ListEvents", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeEventsManagementServiceClient) UpdateEventsConfiguration(ctx context.Context, in *EventsConfigurationRequest, opts ...grpc.CallOption) (*EventsConfigurationResponse, error) {
+	out := new(EventsConfigurationResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeEventsManagementService/UpdateEventsConfiguration", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// NativeEventsManagementServiceServer is the server API for NativeEventsManagementService service.
+type NativeEventsManagementServiceServer interface {
+	// List the supported events for the passed device
+	ListEvents(context.Context, *HardwareID) (*ListEventsResponse, error)
+	// Updates the configuration of the list of events in the request
+	// The default behaviour of the device is to report all the supported events
+	// This configuration is persisted across reboots of the device or the device manager
+	UpdateEventsConfiguration(context.Context, *EventsConfigurationRequest) (*EventsConfigurationResponse, error)
+}
+
+func RegisterNativeEventsManagementServiceServer(s *grpc.Server, srv NativeEventsManagementServiceServer) {
+	s.RegisterService(&_NativeEventsManagementService_serviceDesc, srv)
+}
+
+func _NativeEventsManagementService_ListEvents_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(HardwareID)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeEventsManagementServiceServer).ListEvents(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeEventsManagementService/ListEvents",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeEventsManagementServiceServer).ListEvents(ctx, req.(*HardwareID))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeEventsManagementService_UpdateEventsConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EventsConfigurationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeEventsManagementServiceServer).UpdateEventsConfiguration(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeEventsManagementService/UpdateEventsConfiguration",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeEventsManagementServiceServer).UpdateEventsConfiguration(ctx, req.(*EventsConfigurationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _NativeEventsManagementService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "dmi.NativeEventsManagementService",
+	HandlerType: (*NativeEventsManagementServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListEvents",
+			Handler:    _NativeEventsManagementService_ListEvents_Handler,
+		},
+		{
+			MethodName: "UpdateEventsConfiguration",
+			Handler:    _NativeEventsManagementService_UpdateEventsConfiguration_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "dmi/hw_events_mgmt_service.proto",
+}
