diff --git a/dmi.pb b/dmi.pb
new file mode 100644
index 0000000..f0a74e5
--- /dev/null
+++ b/dmi.pb
Binary files differ
diff --git a/go/dmi/commons.pb.go b/go/dmi/commons.pb.go
new file mode 100644
index 0000000..eec2c1d
--- /dev/null
+++ b/go/dmi/commons.pb.go
@@ -0,0 +1,110 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/commons.proto
+
+package dmi
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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 Status int32
+
+const (
+	Status_UNDEFINED_STATUS Status = 0
+	Status_OK               Status = 1
+	Status_ERROR            Status = 2
+)
+
+var Status_name = map[int32]string{
+	0: "UNDEFINED_STATUS",
+	1: "OK",
+	2: "ERROR",
+}
+
+var Status_value = map[string]int32{
+	"UNDEFINED_STATUS": 0,
+	"OK":               1,
+	"ERROR":            2,
+}
+
+func (x Status) String() string {
+	return proto.EnumName(Status_name, int32(x))
+}
+
+func (Status) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_74aedf0dda1205d8, []int{0}
+}
+
+// Reason for the failure of request
+type Reason int32
+
+const (
+	Reason_UNDEFINED_REASON Reason = 0
+	Reason_UNKNOWN_DEVICE   Reason = 1
+	Reason_INTERNAL_ERROR   Reason = 2
+	Reason_WRONG_METRIC     Reason = 3
+	Reason_WRONG_EVENT      Reason = 4
+)
+
+var Reason_name = map[int32]string{
+	0: "UNDEFINED_REASON",
+	1: "UNKNOWN_DEVICE",
+	2: "INTERNAL_ERROR",
+	3: "WRONG_METRIC",
+	4: "WRONG_EVENT",
+}
+
+var Reason_value = map[string]int32{
+	"UNDEFINED_REASON": 0,
+	"UNKNOWN_DEVICE":   1,
+	"INTERNAL_ERROR":   2,
+	"WRONG_METRIC":     3,
+	"WRONG_EVENT":      4,
+}
+
+func (x Reason) String() string {
+	return proto.EnumName(Reason_name, int32(x))
+}
+
+func (Reason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_74aedf0dda1205d8, []int{1}
+}
+
+func init() {
+	proto.RegisterEnum("dmi.Status", Status_name, Status_value)
+	proto.RegisterEnum("dmi.Reason", Reason_name, Reason_value)
+}
+
+func init() { proto.RegisterFile("dmi/commons.proto", fileDescriptor_74aedf0dda1205d8) }
+
+var fileDescriptor_74aedf0dda1205d8 = []byte{
+	// 235 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0xcf, 0xcb, 0x4a, 0x03, 0x31,
+	0x14, 0xc6, 0xf1, 0x5e, 0x74, 0xc0, 0x28, 0x1a, 0x83, 0x4f, 0x51, 0x68, 0x83, 0x74, 0x25, 0xae,
+	0x6a, 0xe7, 0x28, 0x43, 0xf5, 0x04, 0x32, 0x99, 0x16, 0xdc, 0x0c, 0x69, 0x12, 0xc7, 0x2c, 0x92,
+	0x94, 0x99, 0xb4, 0xcf, 0x2f, 0x5e, 0x36, 0x6e, 0x7f, 0xf0, 0x7d, 0xf0, 0x27, 0xb7, 0x36, 0x78,
+	0x6e, 0x52, 0x08, 0x29, 0x0e, 0x8b, 0x43, 0x9f, 0x72, 0x62, 0x53, 0x1b, 0xfc, 0xec, 0x9e, 0x14,
+	0x75, 0xd6, 0xf9, 0x38, 0xb0, 0x3b, 0x42, 0x1b, 0x2c, 0xe1, 0xb9, 0x42, 0x28, 0xdb, 0x5a, 0xad,
+	0x54, 0x53, 0xd3, 0x11, 0x2b, 0xc8, 0x44, 0x6c, 0xe8, 0x98, 0x5d, 0x90, 0x73, 0x90, 0x52, 0x48,
+	0x3a, 0x99, 0x79, 0x52, 0x48, 0xa7, 0x87, 0x14, 0xff, 0x4f, 0x24, 0xac, 0x6a, 0x81, 0x74, 0xc4,
+	0x18, 0xb9, 0x6e, 0x70, 0x83, 0x62, 0x87, 0x6d, 0x09, 0xdb, 0x6a, 0x0d, 0x74, 0xfc, 0x6d, 0x15,
+	0x2a, 0x90, 0xb8, 0x7a, 0x6d, 0xff, 0x7e, 0x18, 0x25, 0x57, 0x3b, 0x29, 0xf0, 0xa5, 0x7d, 0x03,
+	0x25, 0xab, 0x35, 0x9d, 0xb2, 0x1b, 0x72, 0xf9, 0x2b, 0xb0, 0x05, 0x54, 0xf4, 0xec, 0xe9, 0xf1,
+	0xfd, 0xa1, 0xf3, 0xf9, 0xf3, 0xb8, 0x5f, 0x98, 0x14, 0x78, 0x3a, 0xb8, 0x68, 0x52, 0x6f, 0xb9,
+	0x75, 0x27, 0x6f, 0xdc, 0x3c, 0xe8, 0xa8, 0x3b, 0x17, 0x5c, 0xcc, 0x73, 0x1f, 0xb3, 0xeb, 0x3f,
+	0xb4, 0x71, 0xfc, 0xb4, 0xe4, 0x5d, 0xe2, 0x36, 0xf8, 0x7d, 0xf1, 0x93, 0xb9, 0xfc, 0x0a, 0x00,
+	0x00, 0xff, 0xff, 0xc1, 0xa1, 0x42, 0x40, 0xfb, 0x00, 0x00, 0x00,
+}
diff --git a/go/dmi/hw.pb.go b/go/dmi/hw.pb.go
new file mode 100644
index 0000000..ff57303
--- /dev/null
+++ b/go/dmi/hw.pb.go
@@ -0,0 +1,1202 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/hw.proto
+
+package dmi
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	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 ComponentType int32
+
+const (
+	ComponentType_COMPONENT_TYPE_UNDEFINED    ComponentType = 0
+	ComponentType_COMPONENT_TYPE_UNKNOWN      ComponentType = 1
+	ComponentType_COMPONENT_TYPE_CHASSIS      ComponentType = 2
+	ComponentType_COMPONENT_TYPE_BACKPLANE    ComponentType = 3
+	ComponentType_COMPONENT_TYPE_CONTAINER    ComponentType = 4
+	ComponentType_COMPONENT_TYPE_POWER_SUPPLY ComponentType = 5
+	ComponentType_COMPONENT_TYPE_FAN          ComponentType = 6
+	ComponentType_COMPONENT_TYPE_SENSOR       ComponentType = 7
+	ComponentType_COMPONENT_TYPE_MODULE       ComponentType = 8
+	ComponentType_COMPONENT_TYPE_PORT         ComponentType = 9
+	ComponentType_COMPONENT_TYPE_CPU          ComponentType = 10
+	ComponentType_COMPONENT_TYPE_BATTERY      ComponentType = 11
+	ComponentType_COMPONENT_TYPE_STORAGE      ComponentType = 12
+	ComponentType_COMPONENT_TYPE_MEMORY       ComponentType = 13
+	ComponentType_COMPONENT_TYPE_TRANSCEIVER  ComponentType = 14
+)
+
+var ComponentType_name = map[int32]string{
+	0:  "COMPONENT_TYPE_UNDEFINED",
+	1:  "COMPONENT_TYPE_UNKNOWN",
+	2:  "COMPONENT_TYPE_CHASSIS",
+	3:  "COMPONENT_TYPE_BACKPLANE",
+	4:  "COMPONENT_TYPE_CONTAINER",
+	5:  "COMPONENT_TYPE_POWER_SUPPLY",
+	6:  "COMPONENT_TYPE_FAN",
+	7:  "COMPONENT_TYPE_SENSOR",
+	8:  "COMPONENT_TYPE_MODULE",
+	9:  "COMPONENT_TYPE_PORT",
+	10: "COMPONENT_TYPE_CPU",
+	11: "COMPONENT_TYPE_BATTERY",
+	12: "COMPONENT_TYPE_STORAGE",
+	13: "COMPONENT_TYPE_MEMORY",
+	14: "COMPONENT_TYPE_TRANSCEIVER",
+}
+
+var ComponentType_value = map[string]int32{
+	"COMPONENT_TYPE_UNDEFINED":    0,
+	"COMPONENT_TYPE_UNKNOWN":      1,
+	"COMPONENT_TYPE_CHASSIS":      2,
+	"COMPONENT_TYPE_BACKPLANE":    3,
+	"COMPONENT_TYPE_CONTAINER":    4,
+	"COMPONENT_TYPE_POWER_SUPPLY": 5,
+	"COMPONENT_TYPE_FAN":          6,
+	"COMPONENT_TYPE_SENSOR":       7,
+	"COMPONENT_TYPE_MODULE":       8,
+	"COMPONENT_TYPE_PORT":         9,
+	"COMPONENT_TYPE_CPU":          10,
+	"COMPONENT_TYPE_BATTERY":      11,
+	"COMPONENT_TYPE_STORAGE":      12,
+	"COMPONENT_TYPE_MEMORY":       13,
+	"COMPONENT_TYPE_TRANSCEIVER":  14,
+}
+
+func (x ComponentType) String() string {
+	return proto.EnumName(ComponentType_name, int32(x))
+}
+
+func (ComponentType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{0}
+}
+
+type ComponentAdminState int32
+
+const (
+	ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED     ComponentAdminState = 0
+	ComponentAdminState_COMP_ADMIN_STATE_UNKNOWN       ComponentAdminState = 1
+	ComponentAdminState_COMP_ADMIN_STATE_LOCKED        ComponentAdminState = 2
+	ComponentAdminState_COMP_ADMIN_STATE_SHUTTING_DOWN ComponentAdminState = 3
+	ComponentAdminState_COMP_ADMIN_STATE_UNLOCKED      ComponentAdminState = 4
+)
+
+var ComponentAdminState_name = map[int32]string{
+	0: "COMP_ADMIN_STATE_UNDEFINED",
+	1: "COMP_ADMIN_STATE_UNKNOWN",
+	2: "COMP_ADMIN_STATE_LOCKED",
+	3: "COMP_ADMIN_STATE_SHUTTING_DOWN",
+	4: "COMP_ADMIN_STATE_UNLOCKED",
+}
+
+var ComponentAdminState_value = map[string]int32{
+	"COMP_ADMIN_STATE_UNDEFINED":     0,
+	"COMP_ADMIN_STATE_UNKNOWN":       1,
+	"COMP_ADMIN_STATE_LOCKED":        2,
+	"COMP_ADMIN_STATE_SHUTTING_DOWN": 3,
+	"COMP_ADMIN_STATE_UNLOCKED":      4,
+}
+
+func (x ComponentAdminState) String() string {
+	return proto.EnumName(ComponentAdminState_name, int32(x))
+}
+
+func (ComponentAdminState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{1}
+}
+
+type ComponentOperState int32
+
+const (
+	ComponentOperState_COMP_OPER_STATE_UNDEFINED ComponentOperState = 0
+	ComponentOperState_COMP_OPER_STATE_UNKNOWN   ComponentOperState = 1
+	ComponentOperState_COMP_OPER_STATE_DISABLED  ComponentOperState = 2
+	ComponentOperState_COMP_OPER_STATE_ENABLED   ComponentOperState = 3
+	ComponentOperState_COMP_OPER_STATE_TESTING   ComponentOperState = 4
+)
+
+var ComponentOperState_name = map[int32]string{
+	0: "COMP_OPER_STATE_UNDEFINED",
+	1: "COMP_OPER_STATE_UNKNOWN",
+	2: "COMP_OPER_STATE_DISABLED",
+	3: "COMP_OPER_STATE_ENABLED",
+	4: "COMP_OPER_STATE_TESTING",
+}
+
+var ComponentOperState_value = map[string]int32{
+	"COMP_OPER_STATE_UNDEFINED": 0,
+	"COMP_OPER_STATE_UNKNOWN":   1,
+	"COMP_OPER_STATE_DISABLED":  2,
+	"COMP_OPER_STATE_ENABLED":   3,
+	"COMP_OPER_STATE_TESTING":   4,
+}
+
+func (x ComponentOperState) String() string {
+	return proto.EnumName(ComponentOperState_name, int32(x))
+}
+
+func (ComponentOperState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{2}
+}
+
+type ComponentUsageState int32
+
+const (
+	ComponentUsageState_COMP_USAGE_STATE_UNDEFINED ComponentUsageState = 0
+	ComponentUsageState_COMP_USAGE_STATE_UNKNOWN   ComponentUsageState = 1
+	ComponentUsageState_COMP_USAGE_STATE_IDLE      ComponentUsageState = 2
+	ComponentUsageState_COMP_USAGE_STATE_ACTIVE    ComponentUsageState = 3
+	ComponentUsageState_COMP_USAGE_STATE_BUSY      ComponentUsageState = 4
+)
+
+var ComponentUsageState_name = map[int32]string{
+	0: "COMP_USAGE_STATE_UNDEFINED",
+	1: "COMP_USAGE_STATE_UNKNOWN",
+	2: "COMP_USAGE_STATE_IDLE",
+	3: "COMP_USAGE_STATE_ACTIVE",
+	4: "COMP_USAGE_STATE_BUSY",
+}
+
+var ComponentUsageState_value = map[string]int32{
+	"COMP_USAGE_STATE_UNDEFINED": 0,
+	"COMP_USAGE_STATE_UNKNOWN":   1,
+	"COMP_USAGE_STATE_IDLE":      2,
+	"COMP_USAGE_STATE_ACTIVE":    3,
+	"COMP_USAGE_STATE_BUSY":      4,
+}
+
+func (x ComponentUsageState) String() string {
+	return proto.EnumName(ComponentUsageState_name, int32(x))
+}
+
+func (ComponentUsageState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{3}
+}
+
+type ComponentAlarmState int32
+
+const (
+	ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED    ComponentAlarmState = 0
+	ComponentAlarmState_COMP_ALARM_STATE_UNKNOWN      ComponentAlarmState = 1
+	ComponentAlarmState_COMP_ALARM_STATE_UNDER_REPAIR ComponentAlarmState = 2
+	ComponentAlarmState_COMP_ALARM_STATE_CRITICAL     ComponentAlarmState = 3
+	ComponentAlarmState_COMP_ALARM_STATE_MAJOR        ComponentAlarmState = 4
+	ComponentAlarmState_COMP_ALARM_STATE_MINOR        ComponentAlarmState = 5
+	ComponentAlarmState_COMP_ALARM_STATE_WARNING      ComponentAlarmState = 6
+	ComponentAlarmState_COMP_ALARM_STATE_INTERMEDIATE ComponentAlarmState = 7
+)
+
+var ComponentAlarmState_name = map[int32]string{
+	0: "COMP_ALARM_STATE_UNDEFINED",
+	1: "COMP_ALARM_STATE_UNKNOWN",
+	2: "COMP_ALARM_STATE_UNDER_REPAIR",
+	3: "COMP_ALARM_STATE_CRITICAL",
+	4: "COMP_ALARM_STATE_MAJOR",
+	5: "COMP_ALARM_STATE_MINOR",
+	6: "COMP_ALARM_STATE_WARNING",
+	7: "COMP_ALARM_STATE_INTERMEDIATE",
+}
+
+var ComponentAlarmState_value = map[string]int32{
+	"COMP_ALARM_STATE_UNDEFINED":    0,
+	"COMP_ALARM_STATE_UNKNOWN":      1,
+	"COMP_ALARM_STATE_UNDER_REPAIR": 2,
+	"COMP_ALARM_STATE_CRITICAL":     3,
+	"COMP_ALARM_STATE_MAJOR":        4,
+	"COMP_ALARM_STATE_MINOR":        5,
+	"COMP_ALARM_STATE_WARNING":      6,
+	"COMP_ALARM_STATE_INTERMEDIATE": 7,
+}
+
+func (x ComponentAlarmState) String() string {
+	return proto.EnumName(ComponentAlarmState_name, int32(x))
+}
+
+func (ComponentAlarmState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{4}
+}
+
+type ComponentStandbyState int32
+
+const (
+	ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED         ComponentStandbyState = 0
+	ComponentStandbyState_COMP_STANDBY_STATE_UNKNOWN           ComponentStandbyState = 1
+	ComponentStandbyState_COMP_STANDBY_STATE_HOT               ComponentStandbyState = 2
+	ComponentStandbyState_COMP_STANDBY_STATE_COLD              ComponentStandbyState = 3
+	ComponentStandbyState_COMP_STANDBY_STATE_PROVIDING_SERVICE ComponentStandbyState = 4
+)
+
+var ComponentStandbyState_name = map[int32]string{
+	0: "COMP_STANDBY_STATE_UNDEFINED",
+	1: "COMP_STANDBY_STATE_UNKNOWN",
+	2: "COMP_STANDBY_STATE_HOT",
+	3: "COMP_STANDBY_STATE_COLD",
+	4: "COMP_STANDBY_STATE_PROVIDING_SERVICE",
+}
+
+var ComponentStandbyState_value = map[string]int32{
+	"COMP_STANDBY_STATE_UNDEFINED":         0,
+	"COMP_STANDBY_STATE_UNKNOWN":           1,
+	"COMP_STANDBY_STATE_HOT":               2,
+	"COMP_STANDBY_STATE_COLD":              3,
+	"COMP_STANDBY_STATE_PROVIDING_SERVICE": 4,
+}
+
+func (x ComponentStandbyState) String() string {
+	return proto.EnumName(ComponentStandbyState_name, int32(x))
+}
+
+func (ComponentStandbyState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{5}
+}
+
+type SensorValueType int32
+
+const (
+	SensorValueType_SENSOR_VALUE_TYPE_UNDEFINED   SensorValueType = 0
+	SensorValueType_SENSOR_VALUE_TYPE_OTHER       SensorValueType = 1
+	SensorValueType_SENSOR_VALUE_TYPE_UNKNOWN     SensorValueType = 2
+	SensorValueType_SENSOR_VALUE_TYPE_VOLTS_AC    SensorValueType = 3
+	SensorValueType_SENSOR_VALUE_TYPE_VOLTS_DC    SensorValueType = 4
+	SensorValueType_SENSOR_VALUE_TYPE_AMPERES     SensorValueType = 5
+	SensorValueType_SENSOR_VALUE_TYPE_WATTS       SensorValueType = 6
+	SensorValueType_SENSOR_VALUE_TYPE_HERTZ       SensorValueType = 7
+	SensorValueType_SENSOR_VALUE_TYPE_CELSIUS     SensorValueType = 8
+	SensorValueType_SENSOR_VALUE_TYPE_PERCENT_RH  SensorValueType = 9
+	SensorValueType_SENSOR_VALUE_TYPE_RPM         SensorValueType = 10
+	SensorValueType_SENSOR_VALUE_TYPE_CMM         SensorValueType = 11
+	SensorValueType_SENSOR_VALUE_TYPE_TRUTH_VALUE SensorValueType = 12
+)
+
+var SensorValueType_name = map[int32]string{
+	0:  "SENSOR_VALUE_TYPE_UNDEFINED",
+	1:  "SENSOR_VALUE_TYPE_OTHER",
+	2:  "SENSOR_VALUE_TYPE_UNKNOWN",
+	3:  "SENSOR_VALUE_TYPE_VOLTS_AC",
+	4:  "SENSOR_VALUE_TYPE_VOLTS_DC",
+	5:  "SENSOR_VALUE_TYPE_AMPERES",
+	6:  "SENSOR_VALUE_TYPE_WATTS",
+	7:  "SENSOR_VALUE_TYPE_HERTZ",
+	8:  "SENSOR_VALUE_TYPE_CELSIUS",
+	9:  "SENSOR_VALUE_TYPE_PERCENT_RH",
+	10: "SENSOR_VALUE_TYPE_RPM",
+	11: "SENSOR_VALUE_TYPE_CMM",
+	12: "SENSOR_VALUE_TYPE_TRUTH_VALUE",
+}
+
+var SensorValueType_value = map[string]int32{
+	"SENSOR_VALUE_TYPE_UNDEFINED":   0,
+	"SENSOR_VALUE_TYPE_OTHER":       1,
+	"SENSOR_VALUE_TYPE_UNKNOWN":     2,
+	"SENSOR_VALUE_TYPE_VOLTS_AC":    3,
+	"SENSOR_VALUE_TYPE_VOLTS_DC":    4,
+	"SENSOR_VALUE_TYPE_AMPERES":     5,
+	"SENSOR_VALUE_TYPE_WATTS":       6,
+	"SENSOR_VALUE_TYPE_HERTZ":       7,
+	"SENSOR_VALUE_TYPE_CELSIUS":     8,
+	"SENSOR_VALUE_TYPE_PERCENT_RH":  9,
+	"SENSOR_VALUE_TYPE_RPM":         10,
+	"SENSOR_VALUE_TYPE_CMM":         11,
+	"SENSOR_VALUE_TYPE_TRUTH_VALUE": 12,
+}
+
+func (x SensorValueType) String() string {
+	return proto.EnumName(SensorValueType_name, int32(x))
+}
+
+func (SensorValueType) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{6}
+}
+
+type SensorValueScale int32
+
+const (
+	SensorValueScale_SENSOR_VALUE_SCALE_UNDEFINED SensorValueScale = 0
+	SensorValueScale_SENSOR_VALUE_SCALE_YOCTO     SensorValueScale = 1
+	SensorValueScale_SENSOR_VALUE_SCALE_ZEPTO     SensorValueScale = 2
+	SensorValueScale_SENSOR_VALUE_SCALE_ATTO      SensorValueScale = 3
+	SensorValueScale_SENSOR_VALUE_SCALE_FEMTO     SensorValueScale = 4
+	SensorValueScale_SENSOR_VALUE_SCALE_PICO      SensorValueScale = 5
+	SensorValueScale_SENSOR_VALUE_SCALE_NANO      SensorValueScale = 6
+	SensorValueScale_SENSOR_VALUE_SCALE_MICRO     SensorValueScale = 7
+	SensorValueScale_SENSOR_VALUE_SCALE_MILLI     SensorValueScale = 8
+	SensorValueScale_SENSOR_VALUE_SCALE_UNITS     SensorValueScale = 9
+	SensorValueScale_SENSOR_VALUE_SCALE_KILO      SensorValueScale = 10
+	SensorValueScale_SENSOR_VALUE_SCALE_MEGA      SensorValueScale = 11
+	SensorValueScale_SENSOR_VALUE_SCALE_GIGA      SensorValueScale = 12
+	SensorValueScale_SENSOR_VALUE_SCALE_TERA      SensorValueScale = 13
+	SensorValueScale_SENSOR_VALUE_SCALE_PETA      SensorValueScale = 14
+	SensorValueScale_SENSOR_VALUE_SCALE_EXA       SensorValueScale = 15
+	SensorValueScale_SENSOR_VALUE_SCALE_ZETTA     SensorValueScale = 16
+	SensorValueScale_SENSOR_VALUE_SCALE_YOTTA     SensorValueScale = 17
+)
+
+var SensorValueScale_name = map[int32]string{
+	0:  "SENSOR_VALUE_SCALE_UNDEFINED",
+	1:  "SENSOR_VALUE_SCALE_YOCTO",
+	2:  "SENSOR_VALUE_SCALE_ZEPTO",
+	3:  "SENSOR_VALUE_SCALE_ATTO",
+	4:  "SENSOR_VALUE_SCALE_FEMTO",
+	5:  "SENSOR_VALUE_SCALE_PICO",
+	6:  "SENSOR_VALUE_SCALE_NANO",
+	7:  "SENSOR_VALUE_SCALE_MICRO",
+	8:  "SENSOR_VALUE_SCALE_MILLI",
+	9:  "SENSOR_VALUE_SCALE_UNITS",
+	10: "SENSOR_VALUE_SCALE_KILO",
+	11: "SENSOR_VALUE_SCALE_MEGA",
+	12: "SENSOR_VALUE_SCALE_GIGA",
+	13: "SENSOR_VALUE_SCALE_TERA",
+	14: "SENSOR_VALUE_SCALE_PETA",
+	15: "SENSOR_VALUE_SCALE_EXA",
+	16: "SENSOR_VALUE_SCALE_ZETTA",
+	17: "SENSOR_VALUE_SCALE_YOTTA",
+}
+
+var SensorValueScale_value = map[string]int32{
+	"SENSOR_VALUE_SCALE_UNDEFINED": 0,
+	"SENSOR_VALUE_SCALE_YOCTO":     1,
+	"SENSOR_VALUE_SCALE_ZEPTO":     2,
+	"SENSOR_VALUE_SCALE_ATTO":      3,
+	"SENSOR_VALUE_SCALE_FEMTO":     4,
+	"SENSOR_VALUE_SCALE_PICO":      5,
+	"SENSOR_VALUE_SCALE_NANO":      6,
+	"SENSOR_VALUE_SCALE_MICRO":     7,
+	"SENSOR_VALUE_SCALE_MILLI":     8,
+	"SENSOR_VALUE_SCALE_UNITS":     9,
+	"SENSOR_VALUE_SCALE_KILO":      10,
+	"SENSOR_VALUE_SCALE_MEGA":      11,
+	"SENSOR_VALUE_SCALE_GIGA":      12,
+	"SENSOR_VALUE_SCALE_TERA":      13,
+	"SENSOR_VALUE_SCALE_PETA":      14,
+	"SENSOR_VALUE_SCALE_EXA":       15,
+	"SENSOR_VALUE_SCALE_ZETTA":     16,
+	"SENSOR_VALUE_SCALE_YOTTA":     17,
+}
+
+func (x SensorValueScale) String() string {
+	return proto.EnumName(SensorValueScale_name, int32(x))
+}
+
+func (SensorValueScale) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{7}
+}
+
+type SensorStatus int32
+
+const (
+	SensorStatus_SENSOR_STATUS_UNDEFINED      SensorStatus = 0
+	SensorStatus_SENSOR_STATUS_OK             SensorStatus = 1
+	SensorStatus_SENSOR_STATUS_UNAVAILABLE    SensorStatus = 2
+	SensorStatus_SENSOR_STATUS_NONOPERATIONAL SensorStatus = 3
+)
+
+var SensorStatus_name = map[int32]string{
+	0: "SENSOR_STATUS_UNDEFINED",
+	1: "SENSOR_STATUS_OK",
+	2: "SENSOR_STATUS_UNAVAILABLE",
+	3: "SENSOR_STATUS_NONOPERATIONAL",
+}
+
+var SensorStatus_value = map[string]int32{
+	"SENSOR_STATUS_UNDEFINED":      0,
+	"SENSOR_STATUS_OK":             1,
+	"SENSOR_STATUS_UNAVAILABLE":    2,
+	"SENSOR_STATUS_NONOPERATIONAL": 3,
+}
+
+func (x SensorStatus) String() string {
+	return proto.EnumName(SensorStatus_name, int32(x))
+}
+
+func (SensorStatus) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{8}
+}
+
+type Uuid struct {
+	Uuid                 string   `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Uuid) Reset()         { *m = Uuid{} }
+func (m *Uuid) String() string { return proto.CompactTextString(m) }
+func (*Uuid) ProtoMessage()    {}
+func (*Uuid) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{0}
+}
+
+func (m *Uuid) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Uuid.Unmarshal(m, b)
+}
+func (m *Uuid) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Uuid.Marshal(b, m, deterministic)
+}
+func (m *Uuid) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Uuid.Merge(m, src)
+}
+func (m *Uuid) XXX_Size() int {
+	return xxx_messageInfo_Uuid.Size(m)
+}
+func (m *Uuid) XXX_DiscardUnknown() {
+	xxx_messageInfo_Uuid.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Uuid proto.InternalMessageInfo
+
+func (m *Uuid) GetUuid() string {
+	if m != nil {
+		return m.Uuid
+	}
+	return ""
+}
+
+type HardwareID struct {
+	Uuid                 *Uuid    `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *HardwareID) Reset()         { *m = HardwareID{} }
+func (m *HardwareID) String() string { return proto.CompactTextString(m) }
+func (*HardwareID) ProtoMessage()    {}
+func (*HardwareID) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{1}
+}
+
+func (m *HardwareID) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HardwareID.Unmarshal(m, b)
+}
+func (m *HardwareID) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HardwareID.Marshal(b, m, deterministic)
+}
+func (m *HardwareID) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HardwareID.Merge(m, src)
+}
+func (m *HardwareID) XXX_Size() int {
+	return xxx_messageInfo_HardwareID.Size(m)
+}
+func (m *HardwareID) XXX_DiscardUnknown() {
+	xxx_messageInfo_HardwareID.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HardwareID proto.InternalMessageInfo
+
+func (m *HardwareID) GetUuid() *Uuid {
+	if m != nil {
+		return m.Uuid
+	}
+	return nil
+}
+
+type Uri struct {
+	Uri                  string   `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Uri) Reset()         { *m = Uri{} }
+func (m *Uri) String() string { return proto.CompactTextString(m) }
+func (*Uri) ProtoMessage()    {}
+func (*Uri) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{2}
+}
+
+func (m *Uri) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Uri.Unmarshal(m, b)
+}
+func (m *Uri) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Uri.Marshal(b, m, deterministic)
+}
+func (m *Uri) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Uri.Merge(m, src)
+}
+func (m *Uri) XXX_Size() int {
+	return xxx_messageInfo_Uri.Size(m)
+}
+func (m *Uri) XXX_DiscardUnknown() {
+	xxx_messageInfo_Uri.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Uri proto.InternalMessageInfo
+
+func (m *Uri) GetUri() string {
+	if m != nil {
+		return m.Uri
+	}
+	return ""
+}
+
+type ComponentState struct {
+	StateLastChanged     *timestamp.Timestamp  `protobuf:"bytes,1,opt,name=state_last_changed,json=stateLastChanged,proto3" json:"state_last_changed,omitempty"`
+	AdminState           ComponentAdminState   `protobuf:"varint,2,opt,name=admin_state,json=adminState,proto3,enum=dmi.ComponentAdminState" json:"admin_state,omitempty"`
+	OperState            ComponentOperState    `protobuf:"varint,3,opt,name=oper_state,json=operState,proto3,enum=dmi.ComponentOperState" json:"oper_state,omitempty"`
+	UsageState           ComponentUsageState   `protobuf:"varint,4,opt,name=usage_state,json=usageState,proto3,enum=dmi.ComponentUsageState" json:"usage_state,omitempty"`
+	AlarmState           ComponentAlarmState   `protobuf:"varint,5,opt,name=alarm_state,json=alarmState,proto3,enum=dmi.ComponentAlarmState" json:"alarm_state,omitempty"`
+	StandbyState         ComponentStandbyState `protobuf:"varint,6,opt,name=standby_state,json=standbyState,proto3,enum=dmi.ComponentStandbyState" json:"standby_state,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *ComponentState) Reset()         { *m = ComponentState{} }
+func (m *ComponentState) String() string { return proto.CompactTextString(m) }
+func (*ComponentState) ProtoMessage()    {}
+func (*ComponentState) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{3}
+}
+
+func (m *ComponentState) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ComponentState.Unmarshal(m, b)
+}
+func (m *ComponentState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ComponentState.Marshal(b, m, deterministic)
+}
+func (m *ComponentState) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ComponentState.Merge(m, src)
+}
+func (m *ComponentState) XXX_Size() int {
+	return xxx_messageInfo_ComponentState.Size(m)
+}
+func (m *ComponentState) XXX_DiscardUnknown() {
+	xxx_messageInfo_ComponentState.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ComponentState proto.InternalMessageInfo
+
+func (m *ComponentState) GetStateLastChanged() *timestamp.Timestamp {
+	if m != nil {
+		return m.StateLastChanged
+	}
+	return nil
+}
+
+func (m *ComponentState) GetAdminState() ComponentAdminState {
+	if m != nil {
+		return m.AdminState
+	}
+	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
+}
+
+func (m *ComponentState) GetOperState() ComponentOperState {
+	if m != nil {
+		return m.OperState
+	}
+	return ComponentOperState_COMP_OPER_STATE_UNDEFINED
+}
+
+func (m *ComponentState) GetUsageState() ComponentUsageState {
+	if m != nil {
+		return m.UsageState
+	}
+	return ComponentUsageState_COMP_USAGE_STATE_UNDEFINED
+}
+
+func (m *ComponentState) GetAlarmState() ComponentAlarmState {
+	if m != nil {
+		return m.AlarmState
+	}
+	return ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED
+}
+
+func (m *ComponentState) GetStandbyState() ComponentStandbyState {
+	if m != nil {
+		return m.StandbyState
+	}
+	return ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED
+}
+
+type ComponentSensorData struct {
+	Value           int32                `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
+	Type            SensorValueType      `protobuf:"varint,2,opt,name=type,proto3,enum=dmi.SensorValueType" json:"type,omitempty"`
+	Scale           SensorValueScale     `protobuf:"varint,3,opt,name=scale,proto3,enum=dmi.SensorValueScale" json:"scale,omitempty"`
+	Precision       int32                `protobuf:"varint,4,opt,name=precision,proto3" json:"precision,omitempty"`
+	Status          SensorStatus         `protobuf:"varint,5,opt,name=status,proto3,enum=dmi.SensorStatus" json:"status,omitempty"`
+	UnitsDisplay    string               `protobuf:"bytes,6,opt,name=units_display,json=unitsDisplay,proto3" json:"units_display,omitempty"`
+	Timestamp       *timestamp.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	ValueUpdateRate uint32               `protobuf:"varint,8,opt,name=value_update_rate,json=valueUpdateRate,proto3" json:"value_update_rate,omitempty"`
+	// data_type can be of the string representation of MetricNames or something else as well
+	DataType             string   `protobuf:"bytes,9,opt,name=data_type,json=dataType,proto3" json:"data_type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ComponentSensorData) Reset()         { *m = ComponentSensorData{} }
+func (m *ComponentSensorData) String() string { return proto.CompactTextString(m) }
+func (*ComponentSensorData) ProtoMessage()    {}
+func (*ComponentSensorData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{4}
+}
+
+func (m *ComponentSensorData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ComponentSensorData.Unmarshal(m, b)
+}
+func (m *ComponentSensorData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ComponentSensorData.Marshal(b, m, deterministic)
+}
+func (m *ComponentSensorData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ComponentSensorData.Merge(m, src)
+}
+func (m *ComponentSensorData) XXX_Size() int {
+	return xxx_messageInfo_ComponentSensorData.Size(m)
+}
+func (m *ComponentSensorData) XXX_DiscardUnknown() {
+	xxx_messageInfo_ComponentSensorData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ComponentSensorData proto.InternalMessageInfo
+
+func (m *ComponentSensorData) GetValue() int32 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+func (m *ComponentSensorData) GetType() SensorValueType {
+	if m != nil {
+		return m.Type
+	}
+	return SensorValueType_SENSOR_VALUE_TYPE_UNDEFINED
+}
+
+func (m *ComponentSensorData) GetScale() SensorValueScale {
+	if m != nil {
+		return m.Scale
+	}
+	return SensorValueScale_SENSOR_VALUE_SCALE_UNDEFINED
+}
+
+func (m *ComponentSensorData) GetPrecision() int32 {
+	if m != nil {
+		return m.Precision
+	}
+	return 0
+}
+
+func (m *ComponentSensorData) GetStatus() SensorStatus {
+	if m != nil {
+		return m.Status
+	}
+	return SensorStatus_SENSOR_STATUS_UNDEFINED
+}
+
+func (m *ComponentSensorData) GetUnitsDisplay() string {
+	if m != nil {
+		return m.UnitsDisplay
+	}
+	return ""
+}
+
+func (m *ComponentSensorData) GetTimestamp() *timestamp.Timestamp {
+	if m != nil {
+		return m.Timestamp
+	}
+	return nil
+}
+
+func (m *ComponentSensorData) GetValueUpdateRate() uint32 {
+	if m != nil {
+		return m.ValueUpdateRate
+	}
+	return 0
+}
+
+func (m *ComponentSensorData) GetDataType() string {
+	if m != nil {
+		return m.DataType
+	}
+	return ""
+}
+
+type Component struct {
+	// The name of a component uniquely identifies an component within the Hardware
+	Name         string               `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Class        ComponentType        `protobuf:"varint,2,opt,name=class,proto3,enum=dmi.ComponentType" json:"class,omitempty"`
+	Description  string               `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
+	Parent       *Component           `protobuf:"bytes,4,opt,name=parent,proto3" json:"parent,omitempty"`
+	ParentRelPos int32                `protobuf:"varint,5,opt,name=parent_rel_pos,json=parentRelPos,proto3" json:"parent_rel_pos,omitempty"`
+	Children     []*Component         `protobuf:"bytes,6,rep,name=children,proto3" json:"children,omitempty"`
+	HardwareRev  string               `protobuf:"bytes,7,opt,name=hardware_rev,json=hardwareRev,proto3" json:"hardware_rev,omitempty"`
+	FirmwareRev  string               `protobuf:"bytes,8,opt,name=firmware_rev,json=firmwareRev,proto3" json:"firmware_rev,omitempty"`
+	SoftwareRev  string               `protobuf:"bytes,9,opt,name=software_rev,json=softwareRev,proto3" json:"software_rev,omitempty"`
+	SerialNum    string               `protobuf:"bytes,10,opt,name=serial_num,json=serialNum,proto3" json:"serial_num,omitempty"`
+	MfgName      string               `protobuf:"bytes,11,opt,name=mfg_name,json=mfgName,proto3" json:"mfg_name,omitempty"`
+	ModelName    string               `protobuf:"bytes,12,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"`
+	Alias        string               `protobuf:"bytes,13,opt,name=alias,proto3" json:"alias,omitempty"`
+	AssetId      string               `protobuf:"bytes,14,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
+	IsFru        bool                 `protobuf:"varint,15,opt,name=is_fru,json=isFru,proto3" json:"is_fru,omitempty"`
+	MfgDate      *timestamp.Timestamp `protobuf:"bytes,16,opt,name=mfg_date,json=mfgDate,proto3" json:"mfg_date,omitempty"`
+	Uri          *Uri                 `protobuf:"bytes,17,opt,name=uri,proto3" json:"uri,omitempty"`
+	// The uuid of the component uniquely identifies the component across the entire system
+	Uuid                 *Uuid                  `protobuf:"bytes,18,opt,name=uuid,proto3" json:"uuid,omitempty"`
+	State                *ComponentState        `protobuf:"bytes,19,opt,name=state,proto3" json:"state,omitempty"`
+	SensorData           []*ComponentSensorData `protobuf:"bytes,20,rep,name=sensor_data,json=sensorData,proto3" json:"sensor_data,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *Component) Reset()         { *m = Component{} }
+func (m *Component) String() string { return proto.CompactTextString(m) }
+func (*Component) ProtoMessage()    {}
+func (*Component) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{5}
+}
+
+func (m *Component) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Component.Unmarshal(m, b)
+}
+func (m *Component) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Component.Marshal(b, m, deterministic)
+}
+func (m *Component) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Component.Merge(m, src)
+}
+func (m *Component) XXX_Size() int {
+	return xxx_messageInfo_Component.Size(m)
+}
+func (m *Component) XXX_DiscardUnknown() {
+	xxx_messageInfo_Component.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Component proto.InternalMessageInfo
+
+func (m *Component) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Component) GetClass() ComponentType {
+	if m != nil {
+		return m.Class
+	}
+	return ComponentType_COMPONENT_TYPE_UNDEFINED
+}
+
+func (m *Component) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+func (m *Component) GetParent() *Component {
+	if m != nil {
+		return m.Parent
+	}
+	return nil
+}
+
+func (m *Component) GetParentRelPos() int32 {
+	if m != nil {
+		return m.ParentRelPos
+	}
+	return 0
+}
+
+func (m *Component) GetChildren() []*Component {
+	if m != nil {
+		return m.Children
+	}
+	return nil
+}
+
+func (m *Component) GetHardwareRev() string {
+	if m != nil {
+		return m.HardwareRev
+	}
+	return ""
+}
+
+func (m *Component) GetFirmwareRev() string {
+	if m != nil {
+		return m.FirmwareRev
+	}
+	return ""
+}
+
+func (m *Component) GetSoftwareRev() string {
+	if m != nil {
+		return m.SoftwareRev
+	}
+	return ""
+}
+
+func (m *Component) GetSerialNum() string {
+	if m != nil {
+		return m.SerialNum
+	}
+	return ""
+}
+
+func (m *Component) GetMfgName() string {
+	if m != nil {
+		return m.MfgName
+	}
+	return ""
+}
+
+func (m *Component) GetModelName() string {
+	if m != nil {
+		return m.ModelName
+	}
+	return ""
+}
+
+func (m *Component) GetAlias() string {
+	if m != nil {
+		return m.Alias
+	}
+	return ""
+}
+
+func (m *Component) GetAssetId() string {
+	if m != nil {
+		return m.AssetId
+	}
+	return ""
+}
+
+func (m *Component) GetIsFru() bool {
+	if m != nil {
+		return m.IsFru
+	}
+	return false
+}
+
+func (m *Component) GetMfgDate() *timestamp.Timestamp {
+	if m != nil {
+		return m.MfgDate
+	}
+	return nil
+}
+
+func (m *Component) GetUri() *Uri {
+	if m != nil {
+		return m.Uri
+	}
+	return nil
+}
+
+func (m *Component) GetUuid() *Uuid {
+	if m != nil {
+		return m.Uuid
+	}
+	return nil
+}
+
+func (m *Component) GetState() *ComponentState {
+	if m != nil {
+		return m.State
+	}
+	return nil
+}
+
+func (m *Component) GetSensorData() []*ComponentSensorData {
+	if m != nil {
+		return m.SensorData
+	}
+	return nil
+}
+
+type Hardware struct {
+	LastChange *timestamp.Timestamp `protobuf:"bytes,1,opt,name=last_change,json=lastChange,proto3" json:"last_change,omitempty"`
+	// Each HW has one parent/root and all other components are children of this
+	// The class of the root component would be set as UNDEFINED
+	Root                 *Component `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
+	XXX_unrecognized     []byte     `json:"-"`
+	XXX_sizecache        int32      `json:"-"`
+}
+
+func (m *Hardware) Reset()         { *m = Hardware{} }
+func (m *Hardware) String() string { return proto.CompactTextString(m) }
+func (*Hardware) ProtoMessage()    {}
+func (*Hardware) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{6}
+}
+
+func (m *Hardware) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Hardware.Unmarshal(m, b)
+}
+func (m *Hardware) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Hardware.Marshal(b, m, deterministic)
+}
+func (m *Hardware) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Hardware.Merge(m, src)
+}
+func (m *Hardware) XXX_Size() int {
+	return xxx_messageInfo_Hardware.Size(m)
+}
+func (m *Hardware) XXX_DiscardUnknown() {
+	xxx_messageInfo_Hardware.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Hardware proto.InternalMessageInfo
+
+func (m *Hardware) GetLastChange() *timestamp.Timestamp {
+	if m != nil {
+		return m.LastChange
+	}
+	return nil
+}
+
+func (m *Hardware) GetRoot() *Component {
+	if m != nil {
+		return m.Root
+	}
+	return nil
+}
+
+// The attributes of a component which are modifiable from the client side
+type ModifiableComponent struct {
+	// The name has to be unique for each component within the hardware and implementations need to
+	// ascertain this when modifying the name
+	Name                 string              `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	Class                ComponentType       `protobuf:"varint,2,opt,name=class,proto3,enum=dmi.ComponentType" json:"class,omitempty"`
+	Parent               *Component          `protobuf:"bytes,3,opt,name=parent,proto3" json:"parent,omitempty"`
+	ParentRelPos         int32               `protobuf:"varint,4,opt,name=parent_rel_pos,json=parentRelPos,proto3" json:"parent_rel_pos,omitempty"`
+	Alias                string              `protobuf:"bytes,5,opt,name=alias,proto3" json:"alias,omitempty"`
+	AssetId              string              `protobuf:"bytes,6,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
+	Uri                  *Uri                `protobuf:"bytes,7,opt,name=uri,proto3" json:"uri,omitempty"`
+	AdminState           ComponentAdminState `protobuf:"varint,8,opt,name=admin_state,json=adminState,proto3,enum=dmi.ComponentAdminState" json:"admin_state,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *ModifiableComponent) Reset()         { *m = ModifiableComponent{} }
+func (m *ModifiableComponent) String() string { return proto.CompactTextString(m) }
+func (*ModifiableComponent) ProtoMessage()    {}
+func (*ModifiableComponent) Descriptor() ([]byte, []int) {
+	return fileDescriptor_d7c33d745c4ab367, []int{7}
+}
+
+func (m *ModifiableComponent) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ModifiableComponent.Unmarshal(m, b)
+}
+func (m *ModifiableComponent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ModifiableComponent.Marshal(b, m, deterministic)
+}
+func (m *ModifiableComponent) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ModifiableComponent.Merge(m, src)
+}
+func (m *ModifiableComponent) XXX_Size() int {
+	return xxx_messageInfo_ModifiableComponent.Size(m)
+}
+func (m *ModifiableComponent) XXX_DiscardUnknown() {
+	xxx_messageInfo_ModifiableComponent.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ModifiableComponent proto.InternalMessageInfo
+
+func (m *ModifiableComponent) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *ModifiableComponent) GetClass() ComponentType {
+	if m != nil {
+		return m.Class
+	}
+	return ComponentType_COMPONENT_TYPE_UNDEFINED
+}
+
+func (m *ModifiableComponent) GetParent() *Component {
+	if m != nil {
+		return m.Parent
+	}
+	return nil
+}
+
+func (m *ModifiableComponent) GetParentRelPos() int32 {
+	if m != nil {
+		return m.ParentRelPos
+	}
+	return 0
+}
+
+func (m *ModifiableComponent) GetAlias() string {
+	if m != nil {
+		return m.Alias
+	}
+	return ""
+}
+
+func (m *ModifiableComponent) GetAssetId() string {
+	if m != nil {
+		return m.AssetId
+	}
+	return ""
+}
+
+func (m *ModifiableComponent) GetUri() *Uri {
+	if m != nil {
+		return m.Uri
+	}
+	return nil
+}
+
+func (m *ModifiableComponent) GetAdminState() ComponentAdminState {
+	if m != nil {
+		return m.AdminState
+	}
+	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
+}
+
+func init() {
+	proto.RegisterEnum("dmi.ComponentType", ComponentType_name, ComponentType_value)
+	proto.RegisterEnum("dmi.ComponentAdminState", ComponentAdminState_name, ComponentAdminState_value)
+	proto.RegisterEnum("dmi.ComponentOperState", ComponentOperState_name, ComponentOperState_value)
+	proto.RegisterEnum("dmi.ComponentUsageState", ComponentUsageState_name, ComponentUsageState_value)
+	proto.RegisterEnum("dmi.ComponentAlarmState", ComponentAlarmState_name, ComponentAlarmState_value)
+	proto.RegisterEnum("dmi.ComponentStandbyState", ComponentStandbyState_name, ComponentStandbyState_value)
+	proto.RegisterEnum("dmi.SensorValueType", SensorValueType_name, SensorValueType_value)
+	proto.RegisterEnum("dmi.SensorValueScale", SensorValueScale_name, SensorValueScale_value)
+	proto.RegisterEnum("dmi.SensorStatus", SensorStatus_name, SensorStatus_value)
+	proto.RegisterType((*Uuid)(nil), "dmi.Uuid")
+	proto.RegisterType((*HardwareID)(nil), "dmi.HardwareID")
+	proto.RegisterType((*Uri)(nil), "dmi.Uri")
+	proto.RegisterType((*ComponentState)(nil), "dmi.ComponentState")
+	proto.RegisterType((*ComponentSensorData)(nil), "dmi.ComponentSensorData")
+	proto.RegisterType((*Component)(nil), "dmi.Component")
+	proto.RegisterType((*Hardware)(nil), "dmi.Hardware")
+	proto.RegisterType((*ModifiableComponent)(nil), "dmi.ModifiableComponent")
+}
+
+func init() { proto.RegisterFile("dmi/hw.proto", fileDescriptor_d7c33d745c4ab367) }
+
+var fileDescriptor_d7c33d745c4ab367 = []byte{
+	// 1734 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x97, 0x4f, 0x6f, 0xe3, 0xc6,
+	0x15, 0xc0, 0x2b, 0xeb, 0x8f, 0xa5, 0x27, 0xd9, 0x3b, 0x3b, 0xf6, 0xc6, 0x5a, 0xef, 0x3a, 0x71,
+	0xdc, 0xa0, 0x70, 0x14, 0xc4, 0x06, 0x36, 0x68, 0xd1, 0x20, 0x87, 0x62, 0x4c, 0xcd, 0xda, 0xac,
+	0x29, 0x52, 0x18, 0x8e, 0xbc, 0xf5, 0x5e, 0x08, 0x5a, 0xa4, 0x6d, 0xa2, 0xa2, 0x28, 0x90, 0x94,
+	0x83, 0xbd, 0x16, 0x3d, 0xf7, 0x3b, 0xf4, 0x52, 0xa4, 0xe7, 0xf6, 0xd8, 0x7b, 0x3f, 0x50, 0xbf,
+	0x40, 0x31, 0x43, 0x52, 0x7f, 0x47, 0x9b, 0x2d, 0xd0, 0xdb, 0xe8, 0xfd, 0xde, 0x7b, 0xf3, 0xf8,
+	0xfe, 0x91, 0x82, 0x96, 0x17, 0x06, 0xe7, 0x8f, 0x3f, 0x9e, 0x4d, 0xe2, 0x28, 0x8d, 0x70, 0xd9,
+	0x0b, 0x83, 0xc3, 0x2f, 0x1e, 0xa2, 0xe8, 0x61, 0xe4, 0x9f, 0x4b, 0xd1, 0xdd, 0xf4, 0xfe, 0x3c,
+	0x0d, 0x42, 0x3f, 0x49, 0xdd, 0x70, 0x92, 0x69, 0x9d, 0x1c, 0x42, 0x65, 0x30, 0x0d, 0x3c, 0x8c,
+	0xa1, 0x32, 0x9d, 0x06, 0x5e, 0xbb, 0x74, 0x5c, 0x3a, 0x6d, 0x30, 0x79, 0x3e, 0xf9, 0x06, 0xe0,
+	0xca, 0x8d, 0xbd, 0x1f, 0xdd, 0xd8, 0xd7, 0xbb, 0xf8, 0x68, 0x41, 0xa3, 0xf9, 0xa6, 0x71, 0xe6,
+	0x85, 0xc1, 0x99, 0x30, 0xcd, 0x95, 0x0f, 0xa0, 0x3c, 0x88, 0x03, 0x8c, 0xa0, 0x3c, 0x8d, 0x83,
+	0xdc, 0x8d, 0x38, 0x9e, 0xfc, 0xb9, 0x0c, 0xbb, 0x5a, 0x14, 0x4e, 0xa2, 0xb1, 0x3f, 0x4e, 0xed,
+	0xd4, 0x4d, 0x7d, 0x7c, 0x05, 0x38, 0x11, 0x07, 0x67, 0xe4, 0x26, 0xa9, 0x33, 0x7c, 0x74, 0xc7,
+	0x0f, 0x7e, 0xe1, 0xf8, 0xf0, 0x2c, 0x0b, 0xf9, 0xac, 0x08, 0xf9, 0x8c, 0x17, 0x21, 0x33, 0x24,
+	0xad, 0x0c, 0x37, 0x49, 0xb5, 0xcc, 0x06, 0x7f, 0x0f, 0x4d, 0xd7, 0x0b, 0x83, 0xb1, 0x23, 0x49,
+	0x7b, 0xeb, 0xb8, 0x74, 0xba, 0xfb, 0xa6, 0x2d, 0x63, 0x9b, 0xdd, 0x49, 0x84, 0x82, 0xbc, 0x98,
+	0x81, 0x3b, 0x3b, 0xe3, 0xdf, 0x00, 0x44, 0x13, 0x3f, 0xce, 0x2d, 0xcb, 0xd2, 0xf2, 0x60, 0xd9,
+	0xd2, 0x9a, 0xf8, 0x71, 0x66, 0xd8, 0x88, 0x8a, 0xa3, 0xb8, 0x72, 0x9a, 0xb8, 0x0f, 0x7e, 0x6e,
+	0x58, 0x51, 0x5d, 0x39, 0x10, 0x0a, 0xf9, 0x95, 0xd3, 0xd9, 0x59, 0x46, 0x3b, 0x72, 0xe3, 0x30,
+	0x37, 0xad, 0x2a, 0xa3, 0x15, 0x0a, 0x45, 0xb4, 0xb3, 0x33, 0xfe, 0x1d, 0xec, 0x24, 0xa9, 0x3b,
+	0xf6, 0xee, 0x3e, 0xe4, 0xc6, 0x35, 0x69, 0x7c, 0xb8, 0x6c, 0x6c, 0x67, 0x2a, 0x99, 0x79, 0x2b,
+	0x59, 0xf8, 0x75, 0xf2, 0x9f, 0x2d, 0xd8, 0x9b, 0xeb, 0xf9, 0xe3, 0x24, 0x8a, 0xbb, 0x6e, 0xea,
+	0xe2, 0x7d, 0xa8, 0x3e, 0xb9, 0xa3, 0xa9, 0x2f, 0xd3, 0x5f, 0x65, 0xd9, 0x0f, 0x7c, 0x0a, 0x95,
+	0xf4, 0xc3, 0xa4, 0x48, 0xe8, 0xbe, 0xbc, 0x25, 0x33, 0xba, 0x11, 0x9c, 0x7f, 0x98, 0xf8, 0x4c,
+	0x6a, 0xe0, 0x6f, 0xa0, 0x9a, 0x0c, 0xdd, 0x51, 0x91, 0xc1, 0x17, 0xab, 0xaa, 0xb6, 0x80, 0x2c,
+	0xd3, 0xc1, 0xaf, 0xa1, 0x31, 0x89, 0xfd, 0x61, 0x90, 0x04, 0xd1, 0x58, 0x66, 0xae, 0xca, 0xe6,
+	0x02, 0xfc, 0x35, 0xd4, 0xc4, 0xb3, 0x4d, 0x93, 0x3c, 0x33, 0xcf, 0x17, 0x7c, 0xd9, 0x12, 0xb0,
+	0x5c, 0x01, 0xff, 0x12, 0x76, 0xa6, 0xe3, 0x20, 0x4d, 0x1c, 0x2f, 0x48, 0x26, 0x23, 0xf7, 0x83,
+	0x4c, 0x47, 0x83, 0xb5, 0xa4, 0xb0, 0x9b, 0xc9, 0xf0, 0x6f, 0xa1, 0x31, 0x6b, 0xf7, 0xf6, 0xf6,
+	0xcf, 0x76, 0xd7, 0x5c, 0x19, 0x77, 0xe0, 0xb9, 0xcc, 0x83, 0x33, 0x9d, 0x78, 0xa2, 0x4f, 0x63,
+	0x91, 0xf1, 0xfa, 0x71, 0xe9, 0x74, 0x87, 0x3d, 0x93, 0x60, 0x20, 0xe5, 0x4c, 0x54, 0xe6, 0x15,
+	0x34, 0x3c, 0x37, 0x75, 0x1d, 0x99, 0xaf, 0x86, 0x0c, 0xa3, 0x2e, 0x04, 0x22, 0x47, 0x27, 0xff,
+	0xae, 0x42, 0x63, 0x96, 0x75, 0x31, 0x64, 0x63, 0x37, 0xf4, 0x8b, 0x21, 0x13, 0x67, 0x7c, 0x0a,
+	0xd5, 0xe1, 0xc8, 0x4d, 0x92, 0x3c, 0xd5, 0x78, 0xb9, 0xa0, 0x32, 0xd1, 0x99, 0x02, 0x3e, 0x86,
+	0xa6, 0xe7, 0x27, 0xc3, 0x38, 0x98, 0xa4, 0x22, 0x7d, 0x65, 0xe9, 0x64, 0x51, 0x84, 0x7f, 0x05,
+	0xb5, 0x89, 0x1b, 0xfb, 0xe3, 0x54, 0xe6, 0xb6, 0xf9, 0x66, 0x77, 0xd9, 0x19, 0xcb, 0x29, 0xfe,
+	0x0a, 0x76, 0xb3, 0x93, 0x13, 0xfb, 0x23, 0x67, 0x12, 0x65, 0x09, 0xaf, 0xb2, 0x56, 0x26, 0x65,
+	0xfe, 0xa8, 0x1f, 0x25, 0xb8, 0x03, 0xf5, 0xe1, 0x63, 0x30, 0xf2, 0x62, 0x7f, 0xdc, 0xae, 0x1d,
+	0x97, 0x15, 0xfe, 0x66, 0x1c, 0x7f, 0x09, 0xad, 0xc7, 0x7c, 0x55, 0x38, 0xb1, 0xff, 0x24, 0xb3,
+	0xdd, 0x60, 0xcd, 0x42, 0xc6, 0xfc, 0x27, 0xa1, 0x72, 0x1f, 0xc4, 0xe1, 0x4c, 0xa5, 0x9e, 0xa9,
+	0x14, 0xb2, 0x5c, 0x25, 0x89, 0xee, 0xd3, 0x99, 0x4a, 0x96, 0xcd, 0x66, 0x21, 0x13, 0x2a, 0x47,
+	0x00, 0x89, 0x1f, 0x07, 0xee, 0xc8, 0x19, 0x4f, 0xc3, 0x36, 0x48, 0x85, 0x46, 0x26, 0x31, 0xa7,
+	0x21, 0x7e, 0x09, 0xf5, 0xf0, 0xfe, 0xc1, 0x91, 0x59, 0x6e, 0x4a, 0xb8, 0x1d, 0xde, 0x3f, 0x98,
+	0x22, 0xd1, 0x47, 0x00, 0x61, 0xe4, 0xf9, 0xa3, 0x0c, 0xb6, 0x32, 0x4b, 0x29, 0x91, 0x78, 0x1f,
+	0xaa, 0xee, 0x28, 0x70, 0x93, 0xf6, 0x8e, 0x24, 0xd9, 0x0f, 0xe1, 0xcf, 0x4d, 0x12, 0x3f, 0x75,
+	0x02, 0xaf, 0xbd, 0x9b, 0xf9, 0x93, 0xbf, 0x75, 0x0f, 0xbf, 0x80, 0x5a, 0x90, 0x38, 0xf7, 0xf1,
+	0xb4, 0xfd, 0xec, 0xb8, 0x74, 0x5a, 0x67, 0xd5, 0x20, 0x79, 0x1b, 0x4f, 0xf1, 0xaf, 0xb3, 0x08,
+	0x44, 0x7b, 0xb4, 0xd1, 0xcf, 0xf6, 0x9c, 0x88, 0xae, 0x2b, 0xba, 0xe8, 0x30, 0xdb, 0x9b, 0xcf,
+	0xa5, 0x45, 0x3d, 0x5b, 0xae, 0x71, 0x20, 0x37, 0xe8, 0x6c, 0xf3, 0x62, 0xe5, 0xe6, 0xc5, 0x5f,
+	0x43, 0x35, 0x5b, 0x09, 0x7b, 0x92, 0xef, 0xad, 0xad, 0x84, 0x54, 0xcc, 0x5f, 0xb1, 0x80, 0x12,
+	0x39, 0x4e, 0x22, 0x3e, 0xb7, 0xbd, 0x2f, 0xab, 0xba, 0xb2, 0x80, 0xe6, 0xbb, 0x81, 0x41, 0x32,
+	0x3b, 0x9f, 0xfc, 0x11, 0xea, 0xc5, 0xcb, 0x00, 0xff, 0x00, 0xcd, 0x85, 0xcd, 0xfd, 0x09, 0x8b,
+	0x1b, 0x46, 0xb3, 0x9d, 0x8d, 0x4f, 0xa0, 0x12, 0x47, 0x51, 0x2a, 0xfb, 0x7d, 0xbd, 0xa5, 0x24,
+	0x3b, 0xf9, 0xfb, 0x16, 0xec, 0xf5, 0x22, 0x2f, 0xb8, 0x0f, 0xdc, 0xbb, 0x91, 0xff, 0xff, 0x1a,
+	0xa0, 0xf9, 0x78, 0x94, 0xff, 0xc7, 0xf1, 0xa8, 0x28, 0xc6, 0x63, 0xd6, 0x30, 0xd5, 0x4d, 0x0d,
+	0x53, 0x5b, 0x6e, 0x98, 0xbc, 0xc4, 0xdb, 0xaa, 0x12, 0xaf, 0xbc, 0xc7, 0xea, 0x9f, 0xfe, 0x1e,
+	0xeb, 0xfc, 0xb3, 0x0c, 0x3b, 0x4b, 0x8f, 0x8b, 0x5f, 0x43, 0x5b, 0xb3, 0x7a, 0x7d, 0xcb, 0xa4,
+	0x26, 0x77, 0xf8, 0x6d, 0x9f, 0x3a, 0x03, 0xb3, 0x4b, 0xdf, 0xea, 0x26, 0xed, 0xa2, 0x5f, 0xe0,
+	0x43, 0xf8, 0x6c, 0x8d, 0x5e, 0x9b, 0xd6, 0x3b, 0x13, 0x95, 0x14, 0x4c, 0xbb, 0x22, 0xb6, 0xad,
+	0xdb, 0x68, 0x4b, 0xe1, 0xf5, 0x82, 0x68, 0xd7, 0x7d, 0x83, 0x98, 0x14, 0x95, 0x15, 0x54, 0xb3,
+	0x4c, 0x4e, 0x74, 0x93, 0x32, 0x54, 0xc1, 0x5f, 0xc0, 0xab, 0x15, 0xda, 0xb7, 0xde, 0x51, 0xe6,
+	0xd8, 0x83, 0x7e, 0xdf, 0xb8, 0x45, 0x55, 0xfc, 0x19, 0xe0, 0x15, 0x85, 0xb7, 0xc4, 0x44, 0x35,
+	0xfc, 0x12, 0x5e, 0xac, 0xc8, 0x6d, 0x6a, 0xda, 0x16, 0x43, 0xdb, 0x0a, 0xd4, 0xb3, 0xba, 0x03,
+	0x83, 0xa2, 0x3a, 0x3e, 0x80, 0xbd, 0xb5, 0xeb, 0x18, 0x47, 0x0d, 0xc5, 0x35, 0x5a, 0x7f, 0x80,
+	0x40, 0xf1, 0xdc, 0x17, 0x84, 0x73, 0xca, 0x6e, 0x51, 0x53, 0xc1, 0x6c, 0x6e, 0x31, 0x72, 0x49,
+	0x51, 0x4b, 0x15, 0x03, 0xed, 0x59, 0xec, 0x16, 0xed, 0xe0, 0xcf, 0xe1, 0x70, 0x05, 0x71, 0x46,
+	0x4c, 0x5b, 0xa3, 0xfa, 0x0d, 0x65, 0x68, 0xb7, 0xf3, 0x8f, 0xd2, 0xc2, 0xfb, 0x78, 0x5e, 0xda,
+	0xc2, 0xce, 0x21, 0xdd, 0x9e, 0x6e, 0x3a, 0x36, 0x27, 0x7c, 0xb9, 0x7c, 0x79, 0xa2, 0x57, 0x78,
+	0x51, 0xc0, 0x57, 0x70, 0xb0, 0x46, 0x0d, 0x4b, 0xbb, 0xa6, 0x5d, 0xb4, 0x85, 0x4f, 0xe0, 0xf3,
+	0x35, 0x68, 0x5f, 0x0d, 0x38, 0xd7, 0xcd, 0x4b, 0xa7, 0x2b, 0x1c, 0x94, 0xf1, 0x11, 0xbc, 0x54,
+	0xb8, 0xcf, 0x5d, 0x54, 0x3a, 0x3f, 0x95, 0x00, 0xaf, 0x7f, 0x1e, 0xcd, 0xac, 0xac, 0xbe, 0x28,
+	0xea, 0x5a, 0xcc, 0x45, 0x54, 0x4b, 0xb8, 0x08, 0xb9, 0x78, 0xa0, 0x05, 0xd8, 0xd5, 0x6d, 0x72,
+	0x61, 0xc8, 0x98, 0x15, 0xa6, 0xd4, 0xcc, 0x60, 0x59, 0x05, 0x39, 0xb5, 0xc5, 0xe3, 0xa0, 0x4a,
+	0xe7, 0x6f, 0x8b, 0x09, 0x9e, 0x7f, 0x90, 0xcd, 0x12, 0x3c, 0xb0, 0xc9, 0x25, 0xfd, 0x48, 0x82,
+	0x97, 0x79, 0x11, 0x6d, 0x5e, 0xf1, 0x25, 0xaa, 0x77, 0x0d, 0xba, 0x10, 0xea, 0x22, 0x22, 0x1a,
+	0xd7, 0x6f, 0xc4, 0x7c, 0xa8, 0xec, 0x2e, 0x06, 0xf6, 0x2d, 0xaa, 0x74, 0xfe, 0xb2, 0xf8, 0x65,
+	0x36, 0xff, 0xfc, 0x9b, 0x77, 0x82, 0x41, 0x58, 0xef, 0x63, 0x9d, 0xb0, 0xc4, 0x8b, 0x40, 0xbf,
+	0x84, 0x23, 0xa5, 0x35, 0x73, 0x18, 0xed, 0x13, 0x9d, 0xa1, 0xad, 0x79, 0xad, 0x17, 0x54, 0x34,
+	0xa6, 0x73, 0x5d, 0x23, 0x06, 0x2a, 0x17, 0x8d, 0xbf, 0x84, 0x7b, 0xe4, 0xf7, 0x96, 0x18, 0x68,
+	0x25, 0xd3, 0x4d, 0x8b, 0xa1, 0xaa, 0x32, 0xae, 0x77, 0x84, 0x99, 0xa2, 0x2c, 0x35, 0x65, 0x5c,
+	0xba, 0xc9, 0x29, 0xeb, 0xd1, 0xae, 0x4e, 0x38, 0x45, 0xdb, 0x9d, 0x7f, 0x95, 0xe0, 0x85, 0xf2,
+	0x93, 0x16, 0x1f, 0xc3, 0x6b, 0x69, 0x6c, 0x73, 0x62, 0x76, 0x2f, 0x6e, 0x15, 0x49, 0x29, 0x92,
+	0xb6, 0xaa, 0xb1, 0xb2, 0xe1, 0x56, 0xf8, 0x95, 0xc5, 0x17, 0x0a, 0xb8, 0xcc, 0x34, 0xcb, 0x10,
+	0xbd, 0x76, 0x0a, 0x5f, 0x29, 0x60, 0x9f, 0x59, 0x37, 0x7a, 0x57, 0xcc, 0x8f, 0x4d, 0xd9, 0x8d,
+	0xae, 0x51, 0x54, 0xe9, 0xfc, 0xb5, 0x0c, 0xcf, 0x56, 0xbe, 0x95, 0xc5, 0x02, 0xcc, 0x16, 0x97,
+	0x73, 0x43, 0x8c, 0x01, 0x5d, 0xdf, 0xca, 0xaf, 0xe0, 0x60, 0x5d, 0xc1, 0xe2, 0x57, 0x94, 0xa1,
+	0x92, 0x28, 0x94, 0xca, 0x3a, 0x7b, 0xa6, 0x2d, 0xf1, 0xcc, 0xeb, 0xf8, 0xc6, 0x32, 0xb8, 0xed,
+	0x10, 0x0d, 0x95, 0x3f, 0xc6, 0xbb, 0x1a, 0xaa, 0xa8, 0xdd, 0x93, 0x5e, 0x9f, 0x32, 0x6a, 0xa3,
+	0xaa, 0x3a, 0xb4, 0x77, 0x84, 0x73, 0x1b, 0xd5, 0xd4, 0xf0, 0x8a, 0x32, 0xfe, 0x1e, 0x6d, 0xab,
+	0x1d, 0x6b, 0xd4, 0xb0, 0xf5, 0x81, 0x8d, 0xea, 0xa2, 0x9a, 0xeb, 0xb8, 0x4f, 0x99, 0x26, 0x56,
+	0x26, 0xbb, 0x42, 0x0d, 0x31, 0x35, 0xeb, 0x1a, 0xac, 0xdf, 0x43, 0xa0, 0x46, 0x5a, 0xaf, 0x87,
+	0x9a, 0xa2, 0xc5, 0xd6, 0x11, 0x67, 0x03, 0x7e, 0x95, 0x09, 0x50, 0xab, 0xf3, 0x53, 0x05, 0xd0,
+	0xea, 0x9f, 0x94, 0xb5, 0x78, 0x6c, 0x8d, 0x18, 0x6b, 0x23, 0xa7, 0xd0, 0xb8, 0xb5, 0x34, 0x6e,
+	0x65, 0x9b, 0x4c, 0x41, 0xdf, 0xd3, 0x3e, 0xb7, 0xb2, 0xee, 0x52, 0x50, 0xc2, 0xb9, 0x95, 0xbd,
+	0x3e, 0x15, 0xf0, 0x2d, 0xed, 0x71, 0x0b, 0x55, 0x36, 0x98, 0xf6, 0x75, 0xcd, 0x52, 0x94, 0x27,
+	0x83, 0x26, 0x31, 0x2d, 0x54, 0xdb, 0xe0, 0xb7, 0xa7, 0x6b, 0xcc, 0x42, 0xdb, 0x1b, 0xa9, 0x61,
+	0xe8, 0xa8, 0xbe, 0x81, 0x0e, 0x4c, 0x9d, 0xdb, 0xa8, 0xb1, 0xe1, 0xda, 0x6b, 0xdd, 0xb0, 0x10,
+	0x6c, 0x80, 0x3d, 0x7a, 0x49, 0x50, 0x73, 0x03, 0xbc, 0xd4, 0x2f, 0x09, 0x6a, 0x6d, 0x80, 0x9c,
+	0x32, 0x82, 0x76, 0x36, 0xe5, 0x81, 0x72, 0x82, 0x76, 0xc5, 0x64, 0x2b, 0x20, 0xfd, 0x03, 0x41,
+	0xcf, 0x36, 0x56, 0x86, 0x73, 0x82, 0xd0, 0xc6, 0xaa, 0x0a, 0xfa, 0xbc, 0xf3, 0xa7, 0x12, 0xb4,
+	0x16, 0xff, 0x83, 0x2e, 0x44, 0x21, 0x76, 0xc0, 0xc0, 0x5e, 0xea, 0x90, 0x7d, 0x40, 0xcb, 0xd0,
+	0xba, 0x5e, 0x1a, 0xe0, 0x99, 0x09, 0xb9, 0x21, 0xba, 0x21, 0x5e, 0x64, 0x68, 0x6b, 0xa1, 0xf1,
+	0x72, 0x6c, 0x5a, 0xa6, 0x78, 0xa7, 0x11, 0xae, 0x5b, 0xa6, 0xd8, 0xc5, 0x17, 0x3f, 0xbc, 0xff,
+	0xfe, 0x21, 0x48, 0x1f, 0xa7, 0x77, 0x67, 0xc3, 0x28, 0x3c, 0x8f, 0x26, 0xfe, 0x78, 0x18, 0xc5,
+	0xde, 0xb9, 0xe7, 0x3f, 0x05, 0x43, 0xff, 0xdb, 0xd0, 0x1d, 0xbb, 0x0f, 0x7e, 0xe8, 0x8f, 0xd3,
+	0x6f, 0x83, 0x71, 0xea, 0xc7, 0xf7, 0xee, 0xd0, 0x3f, 0x7f, 0xfa, 0xee, 0xfc, 0x21, 0x3a, 0xf7,
+	0xc2, 0xe0, 0xae, 0x26, 0xbf, 0xc8, 0xbf, 0xfb, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe5, 0xf1,
+	0x4c, 0x2e, 0x20, 0x12, 0x00, 0x00,
+}
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",
+}
diff --git a/go/dmi/hw_management_service.pb.go b/go/dmi/hw_management_service.pb.go
new file mode 100644
index 0000000..65206c9
--- /dev/null
+++ b/go/dmi/hw_management_service.pb.go
@@ -0,0 +1,644 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/hw_management_service.proto
+
+package dmi
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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 PhysicalInventoryRequest struct {
+	DeviceUuid           *Uuid    `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *PhysicalInventoryRequest) Reset()         { *m = PhysicalInventoryRequest{} }
+func (m *PhysicalInventoryRequest) String() string { return proto.CompactTextString(m) }
+func (*PhysicalInventoryRequest) ProtoMessage()    {}
+func (*PhysicalInventoryRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{0}
+}
+
+func (m *PhysicalInventoryRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PhysicalInventoryRequest.Unmarshal(m, b)
+}
+func (m *PhysicalInventoryRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PhysicalInventoryRequest.Marshal(b, m, deterministic)
+}
+func (m *PhysicalInventoryRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PhysicalInventoryRequest.Merge(m, src)
+}
+func (m *PhysicalInventoryRequest) XXX_Size() int {
+	return xxx_messageInfo_PhysicalInventoryRequest.Size(m)
+}
+func (m *PhysicalInventoryRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_PhysicalInventoryRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PhysicalInventoryRequest proto.InternalMessageInfo
+
+func (m *PhysicalInventoryRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+type PhysicalInventoryResponse 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"`
+	Inventory            *Hardware `protobuf:"bytes,3,opt,name=inventory,proto3" json:"inventory,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
+	XXX_unrecognized     []byte    `json:"-"`
+	XXX_sizecache        int32     `json:"-"`
+}
+
+func (m *PhysicalInventoryResponse) Reset()         { *m = PhysicalInventoryResponse{} }
+func (m *PhysicalInventoryResponse) String() string { return proto.CompactTextString(m) }
+func (*PhysicalInventoryResponse) ProtoMessage()    {}
+func (*PhysicalInventoryResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{1}
+}
+
+func (m *PhysicalInventoryResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_PhysicalInventoryResponse.Unmarshal(m, b)
+}
+func (m *PhysicalInventoryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_PhysicalInventoryResponse.Marshal(b, m, deterministic)
+}
+func (m *PhysicalInventoryResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PhysicalInventoryResponse.Merge(m, src)
+}
+func (m *PhysicalInventoryResponse) XXX_Size() int {
+	return xxx_messageInfo_PhysicalInventoryResponse.Size(m)
+}
+func (m *PhysicalInventoryResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_PhysicalInventoryResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PhysicalInventoryResponse proto.InternalMessageInfo
+
+func (m *PhysicalInventoryResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *PhysicalInventoryResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *PhysicalInventoryResponse) GetInventory() *Hardware {
+	if m != nil {
+		return m.Inventory
+	}
+	return nil
+}
+
+type HWComponentInfoGetRequest struct {
+	DeviceUuid           *Uuid    `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	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 *HWComponentInfoGetRequest) Reset()         { *m = HWComponentInfoGetRequest{} }
+func (m *HWComponentInfoGetRequest) String() string { return proto.CompactTextString(m) }
+func (*HWComponentInfoGetRequest) ProtoMessage()    {}
+func (*HWComponentInfoGetRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{2}
+}
+
+func (m *HWComponentInfoGetRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HWComponentInfoGetRequest.Unmarshal(m, b)
+}
+func (m *HWComponentInfoGetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HWComponentInfoGetRequest.Marshal(b, m, deterministic)
+}
+func (m *HWComponentInfoGetRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HWComponentInfoGetRequest.Merge(m, src)
+}
+func (m *HWComponentInfoGetRequest) XXX_Size() int {
+	return xxx_messageInfo_HWComponentInfoGetRequest.Size(m)
+}
+func (m *HWComponentInfoGetRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_HWComponentInfoGetRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HWComponentInfoGetRequest proto.InternalMessageInfo
+
+func (m *HWComponentInfoGetRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *HWComponentInfoGetRequest) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *HWComponentInfoGetRequest) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+type HWComponentInfoSetRequest struct {
+	DeviceUuid           *Uuid                `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	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"`
+	Changes              *ModifiableComponent `protobuf:"bytes,4,opt,name=changes,proto3" json:"changes,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *HWComponentInfoSetRequest) Reset()         { *m = HWComponentInfoSetRequest{} }
+func (m *HWComponentInfoSetRequest) String() string { return proto.CompactTextString(m) }
+func (*HWComponentInfoSetRequest) ProtoMessage()    {}
+func (*HWComponentInfoSetRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{3}
+}
+
+func (m *HWComponentInfoSetRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HWComponentInfoSetRequest.Unmarshal(m, b)
+}
+func (m *HWComponentInfoSetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HWComponentInfoSetRequest.Marshal(b, m, deterministic)
+}
+func (m *HWComponentInfoSetRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HWComponentInfoSetRequest.Merge(m, src)
+}
+func (m *HWComponentInfoSetRequest) XXX_Size() int {
+	return xxx_messageInfo_HWComponentInfoSetRequest.Size(m)
+}
+func (m *HWComponentInfoSetRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_HWComponentInfoSetRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HWComponentInfoSetRequest proto.InternalMessageInfo
+
+func (m *HWComponentInfoSetRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *HWComponentInfoSetRequest) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *HWComponentInfoSetRequest) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+func (m *HWComponentInfoSetRequest) GetChanges() *ModifiableComponent {
+	if m != nil {
+		return m.Changes
+	}
+	return nil
+}
+
+type HWComponentInfoSetResponse 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 *HWComponentInfoSetResponse) Reset()         { *m = HWComponentInfoSetResponse{} }
+func (m *HWComponentInfoSetResponse) String() string { return proto.CompactTextString(m) }
+func (*HWComponentInfoSetResponse) ProtoMessage()    {}
+func (*HWComponentInfoSetResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{4}
+}
+
+func (m *HWComponentInfoSetResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_HWComponentInfoSetResponse.Unmarshal(m, b)
+}
+func (m *HWComponentInfoSetResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_HWComponentInfoSetResponse.Marshal(b, m, deterministic)
+}
+func (m *HWComponentInfoSetResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_HWComponentInfoSetResponse.Merge(m, src)
+}
+func (m *HWComponentInfoSetResponse) XXX_Size() int {
+	return xxx_messageInfo_HWComponentInfoSetResponse.Size(m)
+}
+func (m *HWComponentInfoSetResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_HWComponentInfoSetResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_HWComponentInfoSetResponse proto.InternalMessageInfo
+
+func (m *HWComponentInfoSetResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *HWComponentInfoSetResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+type StartManagingDeviceResponse 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"`
+	DeviceUuid           *Uuid    `protobuf:"bytes,3,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StartManagingDeviceResponse) Reset()         { *m = StartManagingDeviceResponse{} }
+func (m *StartManagingDeviceResponse) String() string { return proto.CompactTextString(m) }
+func (*StartManagingDeviceResponse) ProtoMessage()    {}
+func (*StartManagingDeviceResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{5}
+}
+
+func (m *StartManagingDeviceResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StartManagingDeviceResponse.Unmarshal(m, b)
+}
+func (m *StartManagingDeviceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StartManagingDeviceResponse.Marshal(b, m, deterministic)
+}
+func (m *StartManagingDeviceResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StartManagingDeviceResponse.Merge(m, src)
+}
+func (m *StartManagingDeviceResponse) XXX_Size() int {
+	return xxx_messageInfo_StartManagingDeviceResponse.Size(m)
+}
+func (m *StartManagingDeviceResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_StartManagingDeviceResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StartManagingDeviceResponse proto.InternalMessageInfo
+
+func (m *StartManagingDeviceResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *StartManagingDeviceResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *StartManagingDeviceResponse) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*PhysicalInventoryRequest)(nil), "dmi.PhysicalInventoryRequest")
+	proto.RegisterType((*PhysicalInventoryResponse)(nil), "dmi.PhysicalInventoryResponse")
+	proto.RegisterType((*HWComponentInfoGetRequest)(nil), "dmi.HWComponentInfoGetRequest")
+	proto.RegisterType((*HWComponentInfoSetRequest)(nil), "dmi.HWComponentInfoSetRequest")
+	proto.RegisterType((*HWComponentInfoSetResponse)(nil), "dmi.HWComponentInfoSetResponse")
+	proto.RegisterType((*StartManagingDeviceResponse)(nil), "dmi.StartManagingDeviceResponse")
+}
+
+func init() { proto.RegisterFile("dmi/hw_management_service.proto", fileDescriptor_eae902e73066286d) }
+
+var fileDescriptor_eae902e73066286d = []byte{
+	// 488 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x54, 0xd1, 0x6a, 0x13, 0x41,
+	0x14, 0x65, 0x13, 0xa9, 0x64, 0x62, 0x03, 0x8e, 0x3e, 0x6c, 0x56, 0xb4, 0x65, 0x45, 0x10, 0xa5,
+	0xd9, 0x90, 0x3e, 0x89, 0x6f, 0x2a, 0x4d, 0xfa, 0x90, 0x22, 0xbb, 0x94, 0x80, 0x2f, 0x61, 0xb2,
+	0x73, 0xb3, 0x19, 0xe8, 0xcc, 0xc4, 0x99, 0xd9, 0x94, 0xfe, 0x86, 0xfe, 0x80, 0x1f, 0xe5, 0xab,
+	0xff, 0x22, 0x3b, 0xd3, 0xdd, 0xc4, 0x24, 0x2b, 0x22, 0x0a, 0x7d, 0x4b, 0xee, 0x39, 0xf7, 0x70,
+	0xee, 0xde, 0x7b, 0x06, 0x1d, 0x51, 0xce, 0xa2, 0xc5, 0xf5, 0x94, 0x13, 0x41, 0x32, 0xe0, 0x20,
+	0xcc, 0x54, 0x83, 0x5a, 0xb1, 0x14, 0x7a, 0x4b, 0x25, 0x8d, 0xc4, 0x4d, 0xca, 0x59, 0xf0, 0xb0,
+	0x60, 0xa5, 0x92, 0x73, 0x29, 0xb4, 0xab, 0x07, 0x0f, 0x5c, 0xa3, 0xfb, 0x17, 0x9e, 0x21, 0xff,
+	0xe3, 0xe2, 0x46, 0xb3, 0x94, 0x5c, 0x9d, 0x8b, 0x15, 0x08, 0x23, 0xd5, 0x4d, 0x0c, 0x9f, 0x73,
+	0xd0, 0x06, 0xbf, 0x42, 0x6d, 0x0a, 0x85, 0xe2, 0x34, 0xcf, 0x19, 0xf5, 0xbd, 0x63, 0xef, 0x65,
+	0x7b, 0xd0, 0xea, 0x51, 0xce, 0x7a, 0x97, 0x39, 0xa3, 0x31, 0x72, 0x68, 0xf1, 0x3b, 0xfc, 0xe2,
+	0xa1, 0xee, 0x1e, 0x21, 0xbd, 0x94, 0x42, 0x03, 0x7e, 0x8e, 0x0e, 0xb4, 0x21, 0x26, 0xd7, 0x56,
+	0xa4, 0x33, 0x68, 0x5b, 0x91, 0xc4, 0x96, 0xe2, 0x5b, 0xa8, 0x20, 0x29, 0x20, 0x5a, 0x0a, 0xbf,
+	0xb1, 0x41, 0x8a, 0x6d, 0x29, 0xbe, 0x85, 0xf0, 0x6b, 0xd4, 0x62, 0xa5, 0xbc, 0xdf, 0xb4, 0x8e,
+	0x0e, 0x2d, 0x6f, 0x44, 0x14, 0xbd, 0x26, 0x0a, 0xe2, 0x35, 0x1e, 0x7e, 0xf3, 0x50, 0x77, 0x34,
+	0x79, 0x2f, 0xf9, 0x52, 0x0a, 0x10, 0xe6, 0x5c, 0xcc, 0xe5, 0x10, 0xcc, 0x5f, 0x8c, 0x87, 0xfb,
+	0xa8, 0x93, 0x96, 0x32, 0x8e, 0xde, 0xd8, 0xa6, 0x1f, 0x56, 0x04, 0xdb, 0xf1, 0x62, 0xb3, 0x43,
+	0x10, 0x0e, 0xd6, 0x6d, 0x6b, 0x83, 0x76, 0x41, 0x38, 0x84, 0xdf, 0x77, 0x2d, 0x26, 0x77, 0xcb,
+	0x22, 0x1e, 0xa0, 0xfb, 0xe9, 0x82, 0x88, 0x0c, 0xb4, 0x7f, 0xcf, 0x2a, 0xfa, 0x56, 0x71, 0x2c,
+	0x29, 0x9b, 0x33, 0x32, 0xbb, 0x82, 0xca, 0x7d, 0x5c, 0x12, 0xc3, 0x39, 0x0a, 0xf6, 0x4d, 0xf5,
+	0xaf, 0xcf, 0x21, 0xfc, 0xea, 0xa1, 0x27, 0x89, 0x21, 0xca, 0x8c, 0x8b, 0x18, 0x30, 0x91, 0x7d,
+	0xb0, 0x1f, 0xe4, 0x3f, 0x1c, 0xde, 0xd6, 0x2a, 0x9a, 0xbf, 0x59, 0xc5, 0xe0, 0x47, 0x03, 0x75,
+	0x2f, 0x88, 0x61, 0x2b, 0x18, 0x4d, 0xc6, 0x55, 0x3e, 0x13, 0x17, 0x4f, 0x3c, 0x42, 0x8f, 0xf6,
+	0x58, 0xc6, 0xbf, 0x9e, 0x71, 0x70, 0x5c, 0x3a, 0xad, 0x9b, 0xad, 0xef, 0xe1, 0x09, 0x7a, 0x3c,
+	0x04, 0xb3, 0x13, 0x3b, 0xfc, 0xd4, 0xf6, 0xd6, 0xe5, 0x3a, 0x78, 0x56, 0x07, 0x57, 0xc2, 0x67,
+	0x08, 0x0f, 0xc1, 0x6c, 0x6d, 0x10, 0xbb, 0xbe, 0xda, 0x40, 0x05, 0x1d, 0x8b, 0x57, 0x68, 0xdf,
+	0xc3, 0x97, 0x08, 0x27, 0x7f, 0xa8, 0xb3, 0xbe, 0xfa, 0xe0, 0xa8, 0x16, 0x77, 0x06, 0xdf, 0xbd,
+	0xfd, 0xf4, 0x26, 0x63, 0x66, 0x91, 0xcf, 0x7a, 0xa9, 0xe4, 0x91, 0x5c, 0x82, 0x48, 0xa5, 0xa2,
+	0x91, 0xdb, 0xc0, 0xc9, 0xfa, 0x45, 0x3c, 0x61, 0xc2, 0x80, 0x9a, 0x93, 0x14, 0xa2, 0xd5, 0x69,
+	0x94, 0xc9, 0x88, 0x72, 0x36, 0x3b, 0xb0, 0x0f, 0xdf, 0xe9, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff,
+	0x23, 0x94, 0xd9, 0x06, 0x41, 0x05, 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
+
+// NativeHWManagementServiceClient is the client API for NativeHWManagementService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type NativeHWManagementServiceClient interface {
+	// Initializes context for a device and sets up required states
+	StartManagingDevice(ctx context.Context, in *Hardware, opts ...grpc.CallOption) (NativeHWManagementService_StartManagingDeviceClient, error)
+	// Get the HW inventory details of the Device
+	GetPhysicalInventory(ctx context.Context, in *PhysicalInventoryRequest, opts ...grpc.CallOption) (NativeHWManagementService_GetPhysicalInventoryClient, error)
+	// Get the details of a particular HW component
+	GetHWComponentInfo(ctx context.Context, in *HWComponentInfoGetRequest, opts ...grpc.CallOption) (NativeHWManagementService_GetHWComponentInfoClient, error)
+	// Sets the permissible attributes of a HW component
+	SetHWComponentInfo(ctx context.Context, in *HWComponentInfoSetRequest, opts ...grpc.CallOption) (*HWComponentInfoSetResponse, error)
+}
+
+type nativeHWManagementServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewNativeHWManagementServiceClient(cc *grpc.ClientConn) NativeHWManagementServiceClient {
+	return &nativeHWManagementServiceClient{cc}
+}
+
+func (c *nativeHWManagementServiceClient) StartManagingDevice(ctx context.Context, in *Hardware, opts ...grpc.CallOption) (NativeHWManagementService_StartManagingDeviceClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeHWManagementService_serviceDesc.Streams[0], "/dmi.NativeHWManagementService/StartManagingDevice", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeHWManagementServiceStartManagingDeviceClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeHWManagementService_StartManagingDeviceClient interface {
+	Recv() (*StartManagingDeviceResponse, error)
+	grpc.ClientStream
+}
+
+type nativeHWManagementServiceStartManagingDeviceClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeHWManagementServiceStartManagingDeviceClient) Recv() (*StartManagingDeviceResponse, error) {
+	m := new(StartManagingDeviceResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *nativeHWManagementServiceClient) GetPhysicalInventory(ctx context.Context, in *PhysicalInventoryRequest, opts ...grpc.CallOption) (NativeHWManagementService_GetPhysicalInventoryClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeHWManagementService_serviceDesc.Streams[1], "/dmi.NativeHWManagementService/GetPhysicalInventory", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeHWManagementServiceGetPhysicalInventoryClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeHWManagementService_GetPhysicalInventoryClient interface {
+	Recv() (*PhysicalInventoryResponse, error)
+	grpc.ClientStream
+}
+
+type nativeHWManagementServiceGetPhysicalInventoryClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeHWManagementServiceGetPhysicalInventoryClient) Recv() (*PhysicalInventoryResponse, error) {
+	m := new(PhysicalInventoryResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *nativeHWManagementServiceClient) GetHWComponentInfo(ctx context.Context, in *HWComponentInfoGetRequest, opts ...grpc.CallOption) (NativeHWManagementService_GetHWComponentInfoClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeHWManagementService_serviceDesc.Streams[2], "/dmi.NativeHWManagementService/GetHWComponentInfo", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeHWManagementServiceGetHWComponentInfoClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeHWManagementService_GetHWComponentInfoClient interface {
+	Recv() (*Component, error)
+	grpc.ClientStream
+}
+
+type nativeHWManagementServiceGetHWComponentInfoClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeHWManagementServiceGetHWComponentInfoClient) Recv() (*Component, error) {
+	m := new(Component)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *nativeHWManagementServiceClient) SetHWComponentInfo(ctx context.Context, in *HWComponentInfoSetRequest, opts ...grpc.CallOption) (*HWComponentInfoSetResponse, error) {
+	out := new(HWComponentInfoSetResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/SetHWComponentInfo", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// NativeHWManagementServiceServer is the server API for NativeHWManagementService service.
+type NativeHWManagementServiceServer interface {
+	// Initializes context for a device and sets up required states
+	StartManagingDevice(*Hardware, NativeHWManagementService_StartManagingDeviceServer) error
+	// Get the HW inventory details of the Device
+	GetPhysicalInventory(*PhysicalInventoryRequest, NativeHWManagementService_GetPhysicalInventoryServer) error
+	// Get the details of a particular HW component
+	GetHWComponentInfo(*HWComponentInfoGetRequest, NativeHWManagementService_GetHWComponentInfoServer) error
+	// Sets the permissible attributes of a HW component
+	SetHWComponentInfo(context.Context, *HWComponentInfoSetRequest) (*HWComponentInfoSetResponse, error)
+}
+
+func RegisterNativeHWManagementServiceServer(s *grpc.Server, srv NativeHWManagementServiceServer) {
+	s.RegisterService(&_NativeHWManagementService_serviceDesc, srv)
+}
+
+func _NativeHWManagementService_StartManagingDevice_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(Hardware)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeHWManagementServiceServer).StartManagingDevice(m, &nativeHWManagementServiceStartManagingDeviceServer{stream})
+}
+
+type NativeHWManagementService_StartManagingDeviceServer interface {
+	Send(*StartManagingDeviceResponse) error
+	grpc.ServerStream
+}
+
+type nativeHWManagementServiceStartManagingDeviceServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeHWManagementServiceStartManagingDeviceServer) Send(m *StartManagingDeviceResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _NativeHWManagementService_GetPhysicalInventory_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(PhysicalInventoryRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeHWManagementServiceServer).GetPhysicalInventory(m, &nativeHWManagementServiceGetPhysicalInventoryServer{stream})
+}
+
+type NativeHWManagementService_GetPhysicalInventoryServer interface {
+	Send(*PhysicalInventoryResponse) error
+	grpc.ServerStream
+}
+
+type nativeHWManagementServiceGetPhysicalInventoryServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeHWManagementServiceGetPhysicalInventoryServer) Send(m *PhysicalInventoryResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _NativeHWManagementService_GetHWComponentInfo_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(HWComponentInfoGetRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeHWManagementServiceServer).GetHWComponentInfo(m, &nativeHWManagementServiceGetHWComponentInfoServer{stream})
+}
+
+type NativeHWManagementService_GetHWComponentInfoServer interface {
+	Send(*Component) error
+	grpc.ServerStream
+}
+
+type nativeHWManagementServiceGetHWComponentInfoServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeHWManagementServiceGetHWComponentInfoServer) Send(m *Component) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _NativeHWManagementService_SetHWComponentInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(HWComponentInfoSetRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).SetHWComponentInfo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/SetHWComponentInfo",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).SetHWComponentInfo(ctx, req.(*HWComponentInfoSetRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _NativeHWManagementService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "dmi.NativeHWManagementService",
+	HandlerType: (*NativeHWManagementServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "SetHWComponentInfo",
+			Handler:    _NativeHWManagementService_SetHWComponentInfo_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "StartManagingDevice",
+			Handler:       _NativeHWManagementService_StartManagingDevice_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "GetPhysicalInventory",
+			Handler:       _NativeHWManagementService_GetPhysicalInventory_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "GetHWComponentInfo",
+			Handler:       _NativeHWManagementService_GetHWComponentInfo_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "dmi/hw_management_service.proto",
+}
diff --git a/go/dmi/hw_metrics_mgmt_service.pb.go b/go/dmi/hw_metrics_mgmt_service.pb.go
new file mode 100644
index 0000000..7bddd75
--- /dev/null
+++ b/go/dmi/hw_metrics_mgmt_service.pb.go
@@ -0,0 +1,806 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/hw_metrics_mgmt_service.proto
+
+package dmi
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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 MetricNames int32
+
+const (
+	MetricNames_METRIC_NAME_UNDEFINED MetricNames = 0
+	// FAN related metrics
+	MetricNames_METRIC_FAN_SPEED MetricNames = 1
+	// CPU related metrics
+	MetricNames_METRIC_CPU_TEMP             MetricNames = 100
+	MetricNames_METRIC_CPU_USAGE_PERCENTAGE MetricNames = 101
+	// Transceiver related metrics
+	MetricNames_METRIC_TRANSCEIVER_TEMP       MetricNames = 200
+	MetricNames_METRIC_TRANSCEIVER_VOLTAGE    MetricNames = 201
+	MetricNames_METRIC_TRANSCEIVER_BIAS       MetricNames = 202
+	MetricNames_METRIC_TRANSCEIVER_RX_POWER   MetricNames = 203
+	MetricNames_METRIC_TRANSCEIVER_TX_POWER   MetricNames = 204
+	MetricNames_METRIC_TRANSCEIVER_WAVELENGTH MetricNames = 205
+	// Disk related metrics
+	MetricNames_METRIC_DISK_TEMP                    MetricNames = 300
+	MetricNames_METRIC_DISK_CAPACITY                MetricNames = 301
+	MetricNames_METRIC_DISK_USAGE                   MetricNames = 302
+	MetricNames_METRIC_DISK_USAGE_PERCENTAGE        MetricNames = 303
+	MetricNames_METRIC_DISK_READ_WRITE_PERCENTAGE   MetricNames = 304
+	MetricNames_METRIC_DISK_FAULTY_CELLS_PERCENTAGE MetricNames = 305
+	// RAM related metrics
+	MetricNames_METRIC_RAM_TEMP             MetricNames = 400
+	MetricNames_METRIC_RAM_CAPACITY         MetricNames = 401
+	MetricNames_METRIC_RAM_USAGE            MetricNames = 402
+	MetricNames_METRIC_RAM_USAGE_PERCENTAGE MetricNames = 403
+	// Power related metrics
+	MetricNames_METRIC_POWER_MAX              MetricNames = 500
+	MetricNames_METRIC_POWER_USAGE            MetricNames = 501
+	MetricNames_METRIC_POWER_USAGE_PERCENTAGE MetricNames = 502
+	// Chassis related metrics
+	MetricNames_METRIC_INNER_SURROUNDING_TEMP MetricNames = 600
+)
+
+var MetricNames_name = map[int32]string{
+	0:   "METRIC_NAME_UNDEFINED",
+	1:   "METRIC_FAN_SPEED",
+	100: "METRIC_CPU_TEMP",
+	101: "METRIC_CPU_USAGE_PERCENTAGE",
+	200: "METRIC_TRANSCEIVER_TEMP",
+	201: "METRIC_TRANSCEIVER_VOLTAGE",
+	202: "METRIC_TRANSCEIVER_BIAS",
+	203: "METRIC_TRANSCEIVER_RX_POWER",
+	204: "METRIC_TRANSCEIVER_TX_POWER",
+	205: "METRIC_TRANSCEIVER_WAVELENGTH",
+	300: "METRIC_DISK_TEMP",
+	301: "METRIC_DISK_CAPACITY",
+	302: "METRIC_DISK_USAGE",
+	303: "METRIC_DISK_USAGE_PERCENTAGE",
+	304: "METRIC_DISK_READ_WRITE_PERCENTAGE",
+	305: "METRIC_DISK_FAULTY_CELLS_PERCENTAGE",
+	400: "METRIC_RAM_TEMP",
+	401: "METRIC_RAM_CAPACITY",
+	402: "METRIC_RAM_USAGE",
+	403: "METRIC_RAM_USAGE_PERCENTAGE",
+	500: "METRIC_POWER_MAX",
+	501: "METRIC_POWER_USAGE",
+	502: "METRIC_POWER_USAGE_PERCENTAGE",
+	600: "METRIC_INNER_SURROUNDING_TEMP",
+}
+
+var MetricNames_value = map[string]int32{
+	"METRIC_NAME_UNDEFINED":               0,
+	"METRIC_FAN_SPEED":                    1,
+	"METRIC_CPU_TEMP":                     100,
+	"METRIC_CPU_USAGE_PERCENTAGE":         101,
+	"METRIC_TRANSCEIVER_TEMP":             200,
+	"METRIC_TRANSCEIVER_VOLTAGE":          201,
+	"METRIC_TRANSCEIVER_BIAS":             202,
+	"METRIC_TRANSCEIVER_RX_POWER":         203,
+	"METRIC_TRANSCEIVER_TX_POWER":         204,
+	"METRIC_TRANSCEIVER_WAVELENGTH":       205,
+	"METRIC_DISK_TEMP":                    300,
+	"METRIC_DISK_CAPACITY":                301,
+	"METRIC_DISK_USAGE":                   302,
+	"METRIC_DISK_USAGE_PERCENTAGE":        303,
+	"METRIC_DISK_READ_WRITE_PERCENTAGE":   304,
+	"METRIC_DISK_FAULTY_CELLS_PERCENTAGE": 305,
+	"METRIC_RAM_TEMP":                     400,
+	"METRIC_RAM_CAPACITY":                 401,
+	"METRIC_RAM_USAGE":                    402,
+	"METRIC_RAM_USAGE_PERCENTAGE":         403,
+	"METRIC_POWER_MAX":                    500,
+	"METRIC_POWER_USAGE":                  501,
+	"METRIC_POWER_USAGE_PERCENTAGE":       502,
+	"METRIC_INNER_SURROUNDING_TEMP":       600,
+}
+
+func (x MetricNames) String() string {
+	return proto.EnumName(MetricNames_name, int32(x))
+}
+
+func (MetricNames) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{0}
+}
+
+type MetricConfig struct {
+	MetricId MetricNames `protobuf:"varint,1,opt,name=metric_id,json=metricId,proto3,enum=dmi.MetricNames" json:"metric_id,omitempty"`
+	// Whether the device manager is collecting and reporting this metric or not
+	IsConfigured bool `protobuf:"varint,2,opt,name=is_configured,json=isConfigured,proto3" json:"is_configured,omitempty"`
+	// Number of seconds between two consecutive polls of the particular metric
+	// Each device manager implemenation could have it's per metric default poll frequency which
+	// can be requested to be changed using this value
+	PollInterval         uint32   `protobuf:"varint,3,opt,name=poll_interval,json=pollInterval,proto3" json:"poll_interval,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *MetricConfig) Reset()         { *m = MetricConfig{} }
+func (m *MetricConfig) String() string { return proto.CompactTextString(m) }
+func (*MetricConfig) ProtoMessage()    {}
+func (*MetricConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{0}
+}
+
+func (m *MetricConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricConfig.Unmarshal(m, b)
+}
+func (m *MetricConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricConfig.Marshal(b, m, deterministic)
+}
+func (m *MetricConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricConfig.Merge(m, src)
+}
+func (m *MetricConfig) XXX_Size() int {
+	return xxx_messageInfo_MetricConfig.Size(m)
+}
+func (m *MetricConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricConfig proto.InternalMessageInfo
+
+func (m *MetricConfig) GetMetricId() MetricNames {
+	if m != nil {
+		return m.MetricId
+	}
+	return MetricNames_METRIC_NAME_UNDEFINED
+}
+
+func (m *MetricConfig) GetIsConfigured() bool {
+	if m != nil {
+		return m.IsConfigured
+	}
+	return false
+}
+
+func (m *MetricConfig) GetPollInterval() uint32 {
+	if m != nil {
+		return m.PollInterval
+	}
+	return 0
+}
+
+type MetricsConfig struct {
+	Metrics              []*MetricConfig `protobuf:"bytes,1,rep,name=metrics,proto3" json:"metrics,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *MetricsConfig) Reset()         { *m = MetricsConfig{} }
+func (m *MetricsConfig) String() string { return proto.CompactTextString(m) }
+func (*MetricsConfig) ProtoMessage()    {}
+func (*MetricsConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{1}
+}
+
+func (m *MetricsConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricsConfig.Unmarshal(m, b)
+}
+func (m *MetricsConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricsConfig.Marshal(b, m, deterministic)
+}
+func (m *MetricsConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricsConfig.Merge(m, src)
+}
+func (m *MetricsConfig) XXX_Size() int {
+	return xxx_messageInfo_MetricsConfig.Size(m)
+}
+func (m *MetricsConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricsConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricsConfig proto.InternalMessageInfo
+
+func (m *MetricsConfig) GetMetrics() []*MetricConfig {
+	if m != nil {
+		return m.Metrics
+	}
+	return nil
+}
+
+type ListMetricsResponse 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"`
+	Metrics              *MetricsConfig `protobuf:"bytes,3,opt,name=metrics,proto3" json:"metrics,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
+	XXX_unrecognized     []byte         `json:"-"`
+	XXX_sizecache        int32          `json:"-"`
+}
+
+func (m *ListMetricsResponse) Reset()         { *m = ListMetricsResponse{} }
+func (m *ListMetricsResponse) String() string { return proto.CompactTextString(m) }
+func (*ListMetricsResponse) ProtoMessage()    {}
+func (*ListMetricsResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{2}
+}
+
+func (m *ListMetricsResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ListMetricsResponse.Unmarshal(m, b)
+}
+func (m *ListMetricsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ListMetricsResponse.Marshal(b, m, deterministic)
+}
+func (m *ListMetricsResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ListMetricsResponse.Merge(m, src)
+}
+func (m *ListMetricsResponse) XXX_Size() int {
+	return xxx_messageInfo_ListMetricsResponse.Size(m)
+}
+func (m *ListMetricsResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ListMetricsResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListMetricsResponse proto.InternalMessageInfo
+
+func (m *ListMetricsResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *ListMetricsResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+func (m *ListMetricsResponse) GetMetrics() *MetricsConfig {
+	if m != nil {
+		return m.Metrics
+	}
+	return nil
+}
+
+type MetricsConfigurationRequest 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:
+	//	*MetricsConfigurationRequest_Changes
+	//	*MetricsConfigurationRequest_ResetToDefault
+	Operation            isMetricsConfigurationRequest_Operation `protobuf_oneof:"operation"`
+	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
+	XXX_unrecognized     []byte                                  `json:"-"`
+	XXX_sizecache        int32                                   `json:"-"`
+}
+
+func (m *MetricsConfigurationRequest) Reset()         { *m = MetricsConfigurationRequest{} }
+func (m *MetricsConfigurationRequest) String() string { return proto.CompactTextString(m) }
+func (*MetricsConfigurationRequest) ProtoMessage()    {}
+func (*MetricsConfigurationRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{3}
+}
+
+func (m *MetricsConfigurationRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricsConfigurationRequest.Unmarshal(m, b)
+}
+func (m *MetricsConfigurationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricsConfigurationRequest.Marshal(b, m, deterministic)
+}
+func (m *MetricsConfigurationRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricsConfigurationRequest.Merge(m, src)
+}
+func (m *MetricsConfigurationRequest) XXX_Size() int {
+	return xxx_messageInfo_MetricsConfigurationRequest.Size(m)
+}
+func (m *MetricsConfigurationRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricsConfigurationRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricsConfigurationRequest proto.InternalMessageInfo
+
+func (m *MetricsConfigurationRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+type isMetricsConfigurationRequest_Operation interface {
+	isMetricsConfigurationRequest_Operation()
+}
+
+type MetricsConfigurationRequest_Changes struct {
+	Changes *MetricsConfig `protobuf:"bytes,2,opt,name=changes,proto3,oneof"`
+}
+
+type MetricsConfigurationRequest_ResetToDefault struct {
+	ResetToDefault bool `protobuf:"varint,3,opt,name=reset_to_default,json=resetToDefault,proto3,oneof"`
+}
+
+func (*MetricsConfigurationRequest_Changes) isMetricsConfigurationRequest_Operation() {}
+
+func (*MetricsConfigurationRequest_ResetToDefault) isMetricsConfigurationRequest_Operation() {}
+
+func (m *MetricsConfigurationRequest) GetOperation() isMetricsConfigurationRequest_Operation {
+	if m != nil {
+		return m.Operation
+	}
+	return nil
+}
+
+func (m *MetricsConfigurationRequest) GetChanges() *MetricsConfig {
+	if x, ok := m.GetOperation().(*MetricsConfigurationRequest_Changes); ok {
+		return x.Changes
+	}
+	return nil
+}
+
+func (m *MetricsConfigurationRequest) GetResetToDefault() bool {
+	if x, ok := m.GetOperation().(*MetricsConfigurationRequest_ResetToDefault); ok {
+		return x.ResetToDefault
+	}
+	return false
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*MetricsConfigurationRequest) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*MetricsConfigurationRequest_Changes)(nil),
+		(*MetricsConfigurationRequest_ResetToDefault)(nil),
+	}
+}
+
+type MetricsConfigurationResponse 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 *MetricsConfigurationResponse) Reset()         { *m = MetricsConfigurationResponse{} }
+func (m *MetricsConfigurationResponse) String() string { return proto.CompactTextString(m) }
+func (*MetricsConfigurationResponse) ProtoMessage()    {}
+func (*MetricsConfigurationResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{4}
+}
+
+func (m *MetricsConfigurationResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricsConfigurationResponse.Unmarshal(m, b)
+}
+func (m *MetricsConfigurationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricsConfigurationResponse.Marshal(b, m, deterministic)
+}
+func (m *MetricsConfigurationResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricsConfigurationResponse.Merge(m, src)
+}
+func (m *MetricsConfigurationResponse) XXX_Size() int {
+	return xxx_messageInfo_MetricsConfigurationResponse.Size(m)
+}
+func (m *MetricsConfigurationResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricsConfigurationResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricsConfigurationResponse proto.InternalMessageInfo
+
+func (m *MetricsConfigurationResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *MetricsConfigurationResponse) GetReason() Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return Reason_UNDEFINED_REASON
+}
+
+type MetricMetaData 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 *MetricMetaData) Reset()         { *m = MetricMetaData{} }
+func (m *MetricMetaData) String() string { return proto.CompactTextString(m) }
+func (*MetricMetaData) ProtoMessage()    {}
+func (*MetricMetaData) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{5}
+}
+
+func (m *MetricMetaData) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricMetaData.Unmarshal(m, b)
+}
+func (m *MetricMetaData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricMetaData.Marshal(b, m, deterministic)
+}
+func (m *MetricMetaData) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricMetaData.Merge(m, src)
+}
+func (m *MetricMetaData) XXX_Size() int {
+	return xxx_messageInfo_MetricMetaData.Size(m)
+}
+func (m *MetricMetaData) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricMetaData.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricMetaData proto.InternalMessageInfo
+
+func (m *MetricMetaData) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *MetricMetaData) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *MetricMetaData) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+// The Metrics are conveyed to external systems by submitting them on a kafka bus.
+// The topic to which are Metrics are submitted would be configured as startup
+// configuration of the components
+type Metric struct {
+	MetricId             MetricNames          `protobuf:"varint,1,opt,name=metric_id,json=metricId,proto3,enum=dmi.MetricNames" json:"metric_id,omitempty"`
+	MetricMetadata       *MetricMetaData      `protobuf:"bytes,2,opt,name=metric_metadata,json=metricMetadata,proto3" json:"metric_metadata,omitempty"`
+	Value                *ComponentSensorData `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *Metric) Reset()         { *m = Metric{} }
+func (m *Metric) String() string { return proto.CompactTextString(m) }
+func (*Metric) ProtoMessage()    {}
+func (*Metric) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{6}
+}
+
+func (m *Metric) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Metric.Unmarshal(m, b)
+}
+func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Metric.Marshal(b, m, deterministic)
+}
+func (m *Metric) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Metric.Merge(m, src)
+}
+func (m *Metric) XXX_Size() int {
+	return xxx_messageInfo_Metric.Size(m)
+}
+func (m *Metric) XXX_DiscardUnknown() {
+	xxx_messageInfo_Metric.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Metric proto.InternalMessageInfo
+
+func (m *Metric) GetMetricId() MetricNames {
+	if m != nil {
+		return m.MetricId
+	}
+	return MetricNames_METRIC_NAME_UNDEFINED
+}
+
+func (m *Metric) GetMetricMetadata() *MetricMetaData {
+	if m != nil {
+		return m.MetricMetadata
+	}
+	return nil
+}
+
+func (m *Metric) GetValue() *ComponentSensorData {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+type GetMetricRequest struct {
+	MetaData             *MetricMetaData `protobuf:"bytes,1,opt,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty"`
+	MetricId             MetricNames     `protobuf:"varint,2,opt,name=metric_id,json=metricId,proto3,enum=dmi.MetricNames" json:"metric_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *GetMetricRequest) Reset()         { *m = GetMetricRequest{} }
+func (m *GetMetricRequest) String() string { return proto.CompactTextString(m) }
+func (*GetMetricRequest) ProtoMessage()    {}
+func (*GetMetricRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_6b6c2f1384c11ff5, []int{7}
+}
+
+func (m *GetMetricRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_GetMetricRequest.Unmarshal(m, b)
+}
+func (m *GetMetricRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_GetMetricRequest.Marshal(b, m, deterministic)
+}
+func (m *GetMetricRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_GetMetricRequest.Merge(m, src)
+}
+func (m *GetMetricRequest) XXX_Size() int {
+	return xxx_messageInfo_GetMetricRequest.Size(m)
+}
+func (m *GetMetricRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_GetMetricRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetMetricRequest proto.InternalMessageInfo
+
+func (m *GetMetricRequest) GetMetaData() *MetricMetaData {
+	if m != nil {
+		return m.MetaData
+	}
+	return nil
+}
+
+func (m *GetMetricRequest) GetMetricId() MetricNames {
+	if m != nil {
+		return m.MetricId
+	}
+	return MetricNames_METRIC_NAME_UNDEFINED
+}
+
+func init() {
+	proto.RegisterEnum("dmi.MetricNames", MetricNames_name, MetricNames_value)
+	proto.RegisterType((*MetricConfig)(nil), "dmi.MetricConfig")
+	proto.RegisterType((*MetricsConfig)(nil), "dmi.MetricsConfig")
+	proto.RegisterType((*ListMetricsResponse)(nil), "dmi.ListMetricsResponse")
+	proto.RegisterType((*MetricsConfigurationRequest)(nil), "dmi.MetricsConfigurationRequest")
+	proto.RegisterType((*MetricsConfigurationResponse)(nil), "dmi.MetricsConfigurationResponse")
+	proto.RegisterType((*MetricMetaData)(nil), "dmi.MetricMetaData")
+	proto.RegisterType((*Metric)(nil), "dmi.Metric")
+	proto.RegisterType((*GetMetricRequest)(nil), "dmi.GetMetricRequest")
+}
+
+func init() { proto.RegisterFile("dmi/hw_metrics_mgmt_service.proto", fileDescriptor_6b6c2f1384c11ff5) }
+
+var fileDescriptor_6b6c2f1384c11ff5 = []byte{
+	// 984 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x96, 0xdd, 0x6e, 0xe3, 0x44,
+	0x14, 0xc7, 0xeb, 0x84, 0xed, 0xb6, 0x27, 0xfd, 0x70, 0xa7, 0x2d, 0x9b, 0xcd, 0x16, 0x36, 0x4d,
+	0x05, 0xaa, 0x0a, 0x4d, 0x56, 0xdd, 0x1b, 0x10, 0x7b, 0xe3, 0x3a, 0x6e, 0x6b, 0x91, 0xb8, 0xd1,
+	0xc4, 0x69, 0x77, 0xb9, 0x19, 0xcd, 0xc6, 0xd3, 0xd4, 0x52, 0x6d, 0x07, 0x7b, 0xdc, 0x7d, 0x04,
+	0xae, 0x90, 0xf8, 0x10, 0x8f, 0xc0, 0x1d, 0xdf, 0x4f, 0xc1, 0xe7, 0x3d, 0xbc, 0x04, 0x57, 0xc0,
+	0x35, 0xf2, 0x8c, 0x63, 0xa6, 0xdd, 0x14, 0xb4, 0x12, 0x77, 0xcd, 0xff, 0xfc, 0xce, 0x39, 0xff,
+	0x73, 0x6c, 0xcf, 0x14, 0x36, 0xbd, 0xc0, 0x6f, 0x9d, 0x3f, 0x23, 0x01, 0xe3, 0xb1, 0x3f, 0x4c,
+	0x48, 0x30, 0x0a, 0x38, 0x49, 0x58, 0x7c, 0xe9, 0x0f, 0x59, 0x73, 0x1c, 0x47, 0x3c, 0x42, 0x65,
+	0x2f, 0xf0, 0x6b, 0x2b, 0x19, 0x37, 0x8c, 0x82, 0x20, 0x0a, 0x13, 0xa9, 0xd7, 0x16, 0x64, 0xaa,
+	0xfc, 0xd5, 0xf8, 0x40, 0x83, 0x85, 0xae, 0x28, 0x62, 0x46, 0xe1, 0x99, 0x3f, 0x42, 0xbb, 0x30,
+	0x2f, 0x8b, 0x12, 0xdf, 0xab, 0x6a, 0x75, 0x6d, 0x7b, 0x69, 0x4f, 0x6f, 0x7a, 0x81, 0xdf, 0x94,
+	0x94, 0x43, 0x03, 0x96, 0xe0, 0x39, 0x89, 0xd8, 0x1e, 0xda, 0x82, 0x45, 0x3f, 0x21, 0x43, 0x91,
+	0x9b, 0xc6, 0xcc, 0xab, 0x96, 0xea, 0xda, 0xf6, 0x1c, 0x5e, 0xf0, 0x13, 0xb3, 0xd0, 0x32, 0x68,
+	0x1c, 0x5d, 0x5c, 0x10, 0x3f, 0xe4, 0x2c, 0xbe, 0xa4, 0x17, 0xd5, 0x72, 0x5d, 0xdb, 0x5e, 0xc4,
+	0x0b, 0x99, 0x68, 0xe7, 0x5a, 0xe3, 0x11, 0x2c, 0xca, 0x16, 0x79, 0x26, 0x7a, 0x03, 0x6e, 0xe7,
+	0xe3, 0x55, 0xb5, 0x7a, 0x79, 0xbb, 0xb2, 0xb7, 0xa2, 0xf8, 0x90, 0x0c, 0x9e, 0x10, 0x8d, 0x0f,
+	0x35, 0x58, 0xed, 0xf8, 0x09, 0xcf, 0x4b, 0x60, 0x96, 0x8c, 0xa3, 0x30, 0x61, 0x68, 0x0b, 0x66,
+	0x13, 0x4e, 0x79, 0x9a, 0xe4, 0xb3, 0x54, 0x44, 0x8d, 0xbe, 0x90, 0x70, 0x1e, 0xca, 0xa0, 0x98,
+	0xd1, 0x24, 0x0a, 0x85, 0xfb, 0x09, 0x84, 0x85, 0x84, 0xf3, 0x10, 0x7a, 0xf3, 0x1f, 0x3b, 0x99,
+	0xfd, 0xca, 0x1e, 0x52, 0xec, 0x24, 0xd7, 0xfd, 0x7c, 0xa7, 0xc1, 0xbd, 0x2b, 0xa1, 0x34, 0xa6,
+	0xdc, 0x8f, 0x42, 0xcc, 0xde, 0x4f, 0x59, 0xc2, 0xd1, 0x0e, 0x54, 0x3c, 0x96, 0x3d, 0x2d, 0x92,
+	0xa6, 0xf9, 0xa2, 0x2b, 0x7b, 0xf3, 0xa2, 0xe2, 0x20, 0xf5, 0x3d, 0x0c, 0x32, 0x9a, 0xfd, 0x8d,
+	0x9a, 0x70, 0x7b, 0x78, 0x4e, 0xc3, 0x11, 0x4b, 0x84, 0xbf, 0xa9, 0x9d, 0x8f, 0x66, 0xf0, 0x04,
+	0x42, 0x3b, 0xa0, 0xc7, 0x2c, 0x61, 0x9c, 0xf0, 0x88, 0x78, 0xec, 0x8c, 0xa6, 0x17, 0x5c, 0x58,
+	0x9e, 0x3b, 0x9a, 0xc1, 0x4b, 0x22, 0xe2, 0x46, 0x6d, 0xa9, 0xef, 0x57, 0x60, 0x3e, 0x1a, 0x33,
+	0xe9, 0xad, 0x71, 0x0e, 0x1b, 0xd3, 0x3d, 0xff, 0xdf, 0xcb, 0x6c, 0x7c, 0xa6, 0xc1, 0x92, 0x6c,
+	0xd5, 0x65, 0x9c, 0xb6, 0x29, 0xa7, 0x2f, 0xb4, 0x91, 0x07, 0xb0, 0x34, 0x8c, 0x82, 0x71, 0x14,
+	0xb2, 0x90, 0x4b, 0xbc, 0x74, 0x1d, 0x5f, 0x2c, 0x00, 0x91, 0xf1, 0x9a, 0x9a, 0x11, 0xd2, 0x80,
+	0x89, 0x8d, 0xcc, 0x2b, 0x58, 0xf6, 0x66, 0x37, 0x3e, 0xd7, 0x60, 0x56, 0xfa, 0x7a, 0xd1, 0x0f,
+	0xe1, 0x11, 0x2c, 0xe7, 0x78, 0xc0, 0x38, 0xf5, 0x28, 0xa7, 0xb9, 0xa7, 0x55, 0x25, 0x69, 0x32,
+	0x2c, 0x5e, 0x0a, 0x8a, 0xdf, 0x19, 0x8a, 0x9a, 0x70, 0xeb, 0x92, 0x5e, 0xa4, 0x2c, 0x7f, 0xb5,
+	0xaa, 0x22, 0xc7, 0x9c, 0x58, 0xeb, 0xb3, 0x30, 0x89, 0x62, 0x91, 0x28, 0xb1, 0x46, 0x02, 0xfa,
+	0x21, 0xcb, 0x5f, 0xf6, 0xc9, 0x2b, 0xf5, 0x40, 0x18, 0xa6, 0x44, 0xf4, 0xd6, 0x6e, 0xee, 0x9d,
+	0x79, 0x96, 0x2b, 0xbf, 0x32, 0x62, 0xe9, 0xbf, 0x46, 0xdc, 0xf9, 0xed, 0x16, 0x54, 0x94, 0x08,
+	0xba, 0x0b, 0xeb, 0x5d, 0xcb, 0xc5, 0xb6, 0x49, 0x1c, 0xa3, 0x6b, 0x91, 0x81, 0xd3, 0xb6, 0x0e,
+	0x6c, 0xc7, 0x6a, 0xeb, 0x33, 0x68, 0x0d, 0xf4, 0x3c, 0x74, 0x60, 0x38, 0xa4, 0xdf, 0xb3, 0xac,
+	0xb6, 0xae, 0xa1, 0x55, 0x58, 0xce, 0x55, 0xb3, 0x37, 0x20, 0xae, 0xd5, 0xed, 0xe9, 0x1e, 0xba,
+	0x0f, 0xf7, 0x14, 0x71, 0xd0, 0x37, 0x0e, 0x2d, 0xd2, 0xb3, 0xb0, 0x69, 0x39, 0xae, 0x71, 0x68,
+	0xe9, 0x0c, 0x6d, 0xc0, 0x9d, 0x1c, 0x70, 0xb1, 0xe1, 0xf4, 0x4d, 0xcb, 0x3e, 0xb1, 0xb0, 0xcc,
+	0xfe, 0x5e, 0x43, 0xf7, 0xa1, 0x36, 0x25, 0x7a, 0x72, 0xdc, 0x11, 0xd9, 0x3f, 0x68, 0x37, 0xa4,
+	0xef, 0xdb, 0x46, 0x5f, 0xff, 0x51, 0x43, 0xf5, 0xa2, 0xbb, 0x1a, 0xc5, 0x8f, 0x49, 0xef, 0xf8,
+	0xd4, 0xc2, 0xfa, 0x4f, 0x37, 0x11, 0xee, 0x84, 0xf8, 0x59, 0x43, 0x0d, 0x78, 0x65, 0x0a, 0x71,
+	0x6a, 0x9c, 0x58, 0x1d, 0xcb, 0x39, 0x74, 0x8f, 0xf4, 0x5f, 0x34, 0xb4, 0x5e, 0x2c, 0xa4, 0x6d,
+	0xf7, 0xdf, 0x95, 0xee, 0xbf, 0x28, 0xa1, 0xbb, 0xb0, 0xa6, 0xca, 0xa6, 0xd1, 0x33, 0x4c, 0xdb,
+	0x7d, 0xa2, 0x7f, 0x59, 0x42, 0x2f, 0xc3, 0x8a, 0x1a, 0x12, 0x8b, 0xd1, 0xbf, 0x2a, 0xa1, 0x4d,
+	0xd8, 0x78, 0x4e, 0x57, 0x17, 0xf6, 0x75, 0x09, 0xbd, 0x0e, 0x9b, 0x2a, 0x82, 0x2d, 0xa3, 0x4d,
+	0x4e, 0xb1, 0xed, 0x5e, 0xe1, 0xbe, 0x29, 0xa1, 0x6d, 0xd8, 0x52, 0xb9, 0x03, 0x63, 0xd0, 0x71,
+	0x9f, 0x10, 0xd3, 0xea, 0x74, 0xfa, 0x2a, 0xf9, 0x6d, 0x09, 0xad, 0x15, 0x4f, 0x0e, 0x1b, 0x5d,
+	0xe9, 0xfe, 0xa3, 0x32, 0xaa, 0xc2, 0xaa, 0xa2, 0x16, 0xe6, 0x3f, 0x2e, 0x2b, 0xe3, 0x66, 0x11,
+	0xe9, 0xfd, 0x93, 0xb2, 0xb2, 0xcb, 0x42, 0x56, 0x1b, 0x7d, 0xaa, 0x26, 0x8a, 0xf5, 0x92, 0xae,
+	0xf1, 0x58, 0xff, 0xa3, 0x8c, 0xee, 0x00, 0xba, 0x22, 0xcb, 0x8a, 0x7f, 0x96, 0x95, 0xdd, 0x2b,
+	0x01, 0xb5, 0xe6, 0x5f, 0x2a, 0x63, 0x3b, 0x8e, 0x85, 0x49, 0x7f, 0x80, 0xf1, 0xf1, 0xc0, 0x69,
+	0xdb, 0xce, 0xa1, 0x1c, 0xe5, 0xd7, 0x97, 0xf6, 0x7e, 0xd7, 0xe0, 0x55, 0x87, 0x72, 0xff, 0x92,
+	0xe5, 0x27, 0x60, 0x97, 0x86, 0x74, 0xc4, 0x02, 0xf1, 0xf5, 0x89, 0x6b, 0x15, 0xbd, 0x05, 0x15,
+	0xe5, 0x86, 0x41, 0xcb, 0xe2, 0x4b, 0x39, 0xa2, 0xb1, 0xf7, 0x8c, 0xc6, 0xcc, 0x6e, 0xd7, 0xe4,
+	0x47, 0x3b, 0xed, 0x12, 0xa2, 0x50, 0x1b, 0x8c, 0x3d, 0xca, 0xd9, 0xb4, 0xd3, 0x15, 0xd5, 0x9f,
+	0x3f, 0xcd, 0xaf, 0x5e, 0x16, 0xb5, 0xcd, 0x7f, 0x21, 0xf2, 0x16, 0x2d, 0x98, 0x2f, 0x0e, 0x04,
+	0xb4, 0x2e, 0xf8, 0xeb, 0x07, 0x44, 0xad, 0xa2, 0x94, 0xd9, 0x7f, 0xe7, 0xbd, 0xb7, 0x47, 0x3e,
+	0x3f, 0x4f, 0x9f, 0x36, 0x87, 0x51, 0xd0, 0x8a, 0xc6, 0x2c, 0x1c, 0x46, 0xb1, 0xd7, 0x92, 0x87,
+	0xec, 0x6e, 0x50, 0x4c, 0xbf, 0x2b, 0x2e, 0xed, 0x33, 0x3a, 0x64, 0xad, 0xcb, 0x87, 0xad, 0x51,
+	0xd4, 0xf2, 0x02, 0xff, 0xe9, 0xac, 0xf8, 0xe7, 0xe1, 0xe1, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff,
+	0xe0, 0xe9, 0x64, 0x8e, 0x87, 0x08, 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
+
+// NativeMetricsManagementServiceClient is the client API for NativeMetricsManagementService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type NativeMetricsManagementServiceClient interface {
+	// List the supported metrics for the passed device.
+	// This would be the first call that you make to know about the metrics that a particular device supports and
+	// then use the UpdateMetricsConfiguration API to monitor only the required metrics.
+	ListMetrics(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*ListMetricsResponse, error)
+	// Updates the configuration of the list of metrics in the request
+	// Acts upon single metric configuration, collection of a single metric can be started/stopped
+	// by changing its configuration.
+	//
+	// This configuration is persisted across restart of the device or the device manager
+	UpdateMetricsConfiguration(ctx context.Context, in *MetricsConfigurationRequest, opts ...grpc.CallOption) (*MetricsConfigurationResponse, error)
+	// Get the instantenous value of a metric
+	GetMetric(ctx context.Context, in *GetMetricRequest, opts ...grpc.CallOption) (*Metric, error)
+}
+
+type nativeMetricsManagementServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewNativeMetricsManagementServiceClient(cc *grpc.ClientConn) NativeMetricsManagementServiceClient {
+	return &nativeMetricsManagementServiceClient{cc}
+}
+
+func (c *nativeMetricsManagementServiceClient) ListMetrics(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*ListMetricsResponse, error) {
+	out := new(ListMetricsResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeMetricsManagementService/ListMetrics", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeMetricsManagementServiceClient) UpdateMetricsConfiguration(ctx context.Context, in *MetricsConfigurationRequest, opts ...grpc.CallOption) (*MetricsConfigurationResponse, error) {
+	out := new(MetricsConfigurationResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeMetricsManagementService/UpdateMetricsConfiguration", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeMetricsManagementServiceClient) GetMetric(ctx context.Context, in *GetMetricRequest, opts ...grpc.CallOption) (*Metric, error) {
+	out := new(Metric)
+	err := c.cc.Invoke(ctx, "/dmi.NativeMetricsManagementService/GetMetric", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// NativeMetricsManagementServiceServer is the server API for NativeMetricsManagementService service.
+type NativeMetricsManagementServiceServer interface {
+	// List the supported metrics for the passed device.
+	// This would be the first call that you make to know about the metrics that a particular device supports and
+	// then use the UpdateMetricsConfiguration API to monitor only the required metrics.
+	ListMetrics(context.Context, *HardwareID) (*ListMetricsResponse, error)
+	// Updates the configuration of the list of metrics in the request
+	// Acts upon single metric configuration, collection of a single metric can be started/stopped
+	// by changing its configuration.
+	//
+	// This configuration is persisted across restart of the device or the device manager
+	UpdateMetricsConfiguration(context.Context, *MetricsConfigurationRequest) (*MetricsConfigurationResponse, error)
+	// Get the instantenous value of a metric
+	GetMetric(context.Context, *GetMetricRequest) (*Metric, error)
+}
+
+func RegisterNativeMetricsManagementServiceServer(s *grpc.Server, srv NativeMetricsManagementServiceServer) {
+	s.RegisterService(&_NativeMetricsManagementService_serviceDesc, srv)
+}
+
+func _NativeMetricsManagementService_ListMetrics_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.(NativeMetricsManagementServiceServer).ListMetrics(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeMetricsManagementService/ListMetrics",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeMetricsManagementServiceServer).ListMetrics(ctx, req.(*HardwareID))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeMetricsManagementService_UpdateMetricsConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MetricsConfigurationRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeMetricsManagementServiceServer).UpdateMetricsConfiguration(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeMetricsManagementService/UpdateMetricsConfiguration",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeMetricsManagementServiceServer).UpdateMetricsConfiguration(ctx, req.(*MetricsConfigurationRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeMetricsManagementService_GetMetric_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(GetMetricRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeMetricsManagementServiceServer).GetMetric(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeMetricsManagementService/GetMetric",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeMetricsManagementServiceServer).GetMetric(ctx, req.(*GetMetricRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+var _NativeMetricsManagementService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "dmi.NativeMetricsManagementService",
+	HandlerType: (*NativeMetricsManagementServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "ListMetrics",
+			Handler:    _NativeMetricsManagementService_ListMetrics_Handler,
+		},
+		{
+			MethodName: "UpdateMetricsConfiguration",
+			Handler:    _NativeMetricsManagementService_UpdateMetricsConfiguration_Handler,
+		},
+		{
+			MethodName: "GetMetric",
+			Handler:    _NativeMetricsManagementService_GetMetric_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "dmi/hw_metrics_mgmt_service.proto",
+}
diff --git a/go/dmi/sw_image.pb.go b/go/dmi/sw_image.pb.go
new file mode 100644
index 0000000..e8136f8
--- /dev/null
+++ b/go/dmi/sw_image.pb.go
@@ -0,0 +1,332 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/sw_image.proto
+
+package dmi
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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 ImageStatus_ImageState int32
+
+const (
+	ImageStatus_UNDEFINED_STATE     ImageStatus_ImageState = 0
+	ImageStatus_COPYING_IMAGE       ImageStatus_ImageState = 1
+	ImageStatus_INSTALLING_IMAGE    ImageStatus_ImageState = 2
+	ImageStatus_COMMITING_IMAGE     ImageStatus_ImageState = 3
+	ImageStatus_REBOOTING_DEVICE    ImageStatus_ImageState = 4
+	ImageStatus_UPGRADE_COMPLETE    ImageStatus_ImageState = 5
+	ImageStatus_UPGRADE_FAILED      ImageStatus_ImageState = 6
+	ImageStatus_ACTIVATION_COMPLETE ImageStatus_ImageState = 7
+	ImageStatus_ACTIVATION_FAILED   ImageStatus_ImageState = 8
+)
+
+var ImageStatus_ImageState_name = map[int32]string{
+	0: "UNDEFINED_STATE",
+	1: "COPYING_IMAGE",
+	2: "INSTALLING_IMAGE",
+	3: "COMMITING_IMAGE",
+	4: "REBOOTING_DEVICE",
+	5: "UPGRADE_COMPLETE",
+	6: "UPGRADE_FAILED",
+	7: "ACTIVATION_COMPLETE",
+	8: "ACTIVATION_FAILED",
+}
+
+var ImageStatus_ImageState_value = map[string]int32{
+	"UNDEFINED_STATE":     0,
+	"COPYING_IMAGE":       1,
+	"INSTALLING_IMAGE":    2,
+	"COMMITING_IMAGE":     3,
+	"REBOOTING_DEVICE":    4,
+	"UPGRADE_COMPLETE":    5,
+	"UPGRADE_FAILED":      6,
+	"ACTIVATION_COMPLETE": 7,
+	"ACTIVATION_FAILED":   8,
+}
+
+func (x ImageStatus_ImageState) String() string {
+	return proto.EnumName(ImageStatus_ImageState_name, int32(x))
+}
+
+func (ImageStatus_ImageState) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3d058607a829baf4, []int{2, 0}
+}
+
+type ImageStatus_Reason int32
+
+const (
+	ImageStatus_UNDEFINED_READON      ImageStatus_Reason = 0
+	ImageStatus_ERROR_IN_REQUEST      ImageStatus_Reason = 1
+	ImageStatus_INTERNAL_ERROR        ImageStatus_Reason = 2
+	ImageStatus_DEVICE_IN_WRONG_STATE ImageStatus_Reason = 3
+	ImageStatus_INVALID_IMAGE         ImageStatus_Reason = 4
+	ImageStatus_WRONG_IMAGE_CHECKSUM  ImageStatus_Reason = 5
+)
+
+var ImageStatus_Reason_name = map[int32]string{
+	0: "UNDEFINED_READON",
+	1: "ERROR_IN_REQUEST",
+	2: "INTERNAL_ERROR",
+	3: "DEVICE_IN_WRONG_STATE",
+	4: "INVALID_IMAGE",
+	5: "WRONG_IMAGE_CHECKSUM",
+}
+
+var ImageStatus_Reason_value = map[string]int32{
+	"UNDEFINED_READON":      0,
+	"ERROR_IN_REQUEST":      1,
+	"INTERNAL_ERROR":        2,
+	"DEVICE_IN_WRONG_STATE": 3,
+	"INVALID_IMAGE":         4,
+	"WRONG_IMAGE_CHECKSUM":  5,
+}
+
+func (x ImageStatus_Reason) String() string {
+	return proto.EnumName(ImageStatus_Reason_name, int32(x))
+}
+
+func (ImageStatus_Reason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_3d058607a829baf4, []int{2, 1}
+}
+
+type ImageVersion struct {
+	ImageName            string   `protobuf:"bytes,1,opt,name=image_name,json=imageName,proto3" json:"image_name,omitempty"`
+	Version              string   `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ImageVersion) Reset()         { *m = ImageVersion{} }
+func (m *ImageVersion) String() string { return proto.CompactTextString(m) }
+func (*ImageVersion) ProtoMessage()    {}
+func (*ImageVersion) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3d058607a829baf4, []int{0}
+}
+
+func (m *ImageVersion) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ImageVersion.Unmarshal(m, b)
+}
+func (m *ImageVersion) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ImageVersion.Marshal(b, m, deterministic)
+}
+func (m *ImageVersion) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ImageVersion.Merge(m, src)
+}
+func (m *ImageVersion) XXX_Size() int {
+	return xxx_messageInfo_ImageVersion.Size(m)
+}
+func (m *ImageVersion) XXX_DiscardUnknown() {
+	xxx_messageInfo_ImageVersion.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ImageVersion proto.InternalMessageInfo
+
+func (m *ImageVersion) GetImageName() string {
+	if m != nil {
+		return m.ImageName
+	}
+	return ""
+}
+
+func (m *ImageVersion) GetVersion() string {
+	if m != nil {
+		return m.Version
+	}
+	return ""
+}
+
+type ImageInformation struct {
+	Image *ImageVersion `protobuf:"bytes,1,opt,name=image,proto3" json:"image,omitempty"`
+	// Script used by the device specific managers to install the image.
+	// Script must be included in the object downloaded from the image_url
+	ImageInstallScript string `protobuf:"bytes,2,opt,name=image_install_script,json=imageInstallScript,proto3" json:"image_install_script,omitempty"`
+	// Location of the image and installation script, authentication (user/pass) if any should be in the url string
+	ImageUrl string `protobuf:"bytes,3,opt,name=image_url,json=imageUrl,proto3" json:"image_url,omitempty"`
+	// SHA-256 sum of the image (sha256sum on Linux)
+	Sha256Sum            string   `protobuf:"bytes,5,opt,name=sha256sum,proto3" json:"sha256sum,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ImageInformation) Reset()         { *m = ImageInformation{} }
+func (m *ImageInformation) String() string { return proto.CompactTextString(m) }
+func (*ImageInformation) ProtoMessage()    {}
+func (*ImageInformation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3d058607a829baf4, []int{1}
+}
+
+func (m *ImageInformation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ImageInformation.Unmarshal(m, b)
+}
+func (m *ImageInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ImageInformation.Marshal(b, m, deterministic)
+}
+func (m *ImageInformation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ImageInformation.Merge(m, src)
+}
+func (m *ImageInformation) XXX_Size() int {
+	return xxx_messageInfo_ImageInformation.Size(m)
+}
+func (m *ImageInformation) XXX_DiscardUnknown() {
+	xxx_messageInfo_ImageInformation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ImageInformation proto.InternalMessageInfo
+
+func (m *ImageInformation) GetImage() *ImageVersion {
+	if m != nil {
+		return m.Image
+	}
+	return nil
+}
+
+func (m *ImageInformation) GetImageInstallScript() string {
+	if m != nil {
+		return m.ImageInstallScript
+	}
+	return ""
+}
+
+func (m *ImageInformation) GetImageUrl() string {
+	if m != nil {
+		return m.ImageUrl
+	}
+	return ""
+}
+
+func (m *ImageInformation) GetSha256Sum() string {
+	if m != nil {
+		return m.Sha256Sum
+	}
+	return ""
+}
+
+type ImageStatus struct {
+	Status Status                 `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	Reason ImageStatus_Reason     `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.ImageStatus_Reason" json:"reason,omitempty"`
+	State  ImageStatus_ImageState `protobuf:"varint,3,opt,name=state,proto3,enum=dmi.ImageStatus_ImageState" json:"state,omitempty"`
+	// description contains more information about the current state of the procedure and is device dependant
+	Description          string   `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ImageStatus) Reset()         { *m = ImageStatus{} }
+func (m *ImageStatus) String() string { return proto.CompactTextString(m) }
+func (*ImageStatus) ProtoMessage()    {}
+func (*ImageStatus) Descriptor() ([]byte, []int) {
+	return fileDescriptor_3d058607a829baf4, []int{2}
+}
+
+func (m *ImageStatus) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ImageStatus.Unmarshal(m, b)
+}
+func (m *ImageStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ImageStatus.Marshal(b, m, deterministic)
+}
+func (m *ImageStatus) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ImageStatus.Merge(m, src)
+}
+func (m *ImageStatus) XXX_Size() int {
+	return xxx_messageInfo_ImageStatus.Size(m)
+}
+func (m *ImageStatus) XXX_DiscardUnknown() {
+	xxx_messageInfo_ImageStatus.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ImageStatus proto.InternalMessageInfo
+
+func (m *ImageStatus) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *ImageStatus) GetReason() ImageStatus_Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return ImageStatus_UNDEFINED_READON
+}
+
+func (m *ImageStatus) GetState() ImageStatus_ImageState {
+	if m != nil {
+		return m.State
+	}
+	return ImageStatus_UNDEFINED_STATE
+}
+
+func (m *ImageStatus) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterEnum("dmi.ImageStatus_ImageState", ImageStatus_ImageState_name, ImageStatus_ImageState_value)
+	proto.RegisterEnum("dmi.ImageStatus_Reason", ImageStatus_Reason_name, ImageStatus_Reason_value)
+	proto.RegisterType((*ImageVersion)(nil), "dmi.ImageVersion")
+	proto.RegisterType((*ImageInformation)(nil), "dmi.ImageInformation")
+	proto.RegisterType((*ImageStatus)(nil), "dmi.ImageStatus")
+}
+
+func init() { proto.RegisterFile("dmi/sw_image.proto", fileDescriptor_3d058607a829baf4) }
+
+var fileDescriptor_3d058607a829baf4 = []byte{
+	// 572 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x93, 0xcf, 0x6e, 0xd3, 0x4c,
+	0x14, 0xc5, 0xeb, 0xe6, 0x4f, 0xdb, 0x9b, 0xef, 0x0b, 0xce, 0xb4, 0x55, 0x03, 0x05, 0xa9, 0x0a,
+	0x0b, 0xd8, 0x34, 0x86, 0x54, 0x20, 0x21, 0x56, 0xae, 0x3d, 0x0d, 0x23, 0x92, 0x71, 0x99, 0x38,
+	0x41, 0xb0, 0xb1, 0x5c, 0x7b, 0x9a, 0x8e, 0x94, 0xb1, 0x2b, 0xdb, 0x29, 0xaf, 0xc1, 0x0b, 0xb0,
+	0xe7, 0x6d, 0x78, 0x25, 0x34, 0x33, 0x6e, 0x53, 0x89, 0xdd, 0xf8, 0x9c, 0xdf, 0xbd, 0xf7, 0xdc,
+	0x2b, 0x19, 0x50, 0x2a, 0x85, 0x53, 0xfe, 0x88, 0x84, 0x8c, 0x97, 0x7c, 0x78, 0x5b, 0xe4, 0x55,
+	0x8e, 0x1a, 0xa9, 0x14, 0xcf, 0x7a, 0xca, 0x48, 0x72, 0x29, 0xf3, 0xac, 0x34, 0xfa, 0x60, 0x0c,
+	0xff, 0x11, 0x85, 0x2d, 0x78, 0x51, 0x8a, 0x3c, 0x43, 0x2f, 0x00, 0x74, 0x59, 0x94, 0xc5, 0x92,
+	0xf7, 0xad, 0x13, 0xeb, 0xf5, 0x1e, 0xdb, 0xd3, 0x0a, 0x8d, 0x25, 0x47, 0x7d, 0xd8, 0xb9, 0x33,
+	0x64, 0x7f, 0x5b, 0x7b, 0xf7, 0x9f, 0x83, 0xdf, 0x16, 0xd8, 0xba, 0x13, 0xc9, 0xae, 0xf3, 0x42,
+	0xc6, 0x95, 0xea, 0xf6, 0x0a, 0x5a, 0xba, 0x56, 0x37, 0xea, 0x8c, 0x7a, 0xc3, 0x54, 0x8a, 0xe1,
+	0xe3, 0x79, 0xcc, 0xf8, 0xe8, 0x0d, 0x1c, 0x98, 0xb1, 0x22, 0x2b, 0xab, 0x78, 0xb5, 0x8a, 0xca,
+	0xa4, 0x10, 0xb7, 0x55, 0x3d, 0x04, 0x09, 0xd3, 0x58, 0x5b, 0x33, 0xed, 0xa0, 0x63, 0x30, 0xb1,
+	0xa2, 0x75, 0xb1, 0xea, 0x37, 0x34, 0xb6, 0xab, 0x85, 0x79, 0xb1, 0x42, 0xcf, 0x61, 0xaf, 0xbc,
+	0x89, 0x47, 0xef, 0xde, 0x97, 0x6b, 0xd9, 0x6f, 0x99, 0x25, 0x1e, 0x84, 0xc1, 0xaf, 0x26, 0x74,
+	0x74, 0x88, 0x59, 0x15, 0x57, 0xeb, 0x12, 0xbd, 0x84, 0x76, 0xa9, 0x5f, 0x3a, 0x66, 0x77, 0xd4,
+	0xd1, 0x31, 0x8d, 0xc9, 0x6a, 0x0b, 0x39, 0xd0, 0x2e, 0x78, 0x5c, 0xd6, 0x8b, 0x77, 0x47, 0x47,
+	0x9b, 0x5d, 0x0c, 0x39, 0x64, 0xda, 0x66, 0x35, 0x86, 0xde, 0x42, 0x4b, 0x95, 0x72, 0x1d, 0xae,
+	0x3b, 0x3a, 0xfe, 0x87, 0x7f, 0x78, 0x73, 0x66, 0x48, 0x74, 0x02, 0x9d, 0x94, 0x9b, 0xcd, 0xd5,
+	0x85, 0x9b, 0x3a, 0xf8, 0x63, 0x69, 0xf0, 0xc7, 0x02, 0xd8, 0xd4, 0xa1, 0x7d, 0x78, 0x32, 0xa7,
+	0x3e, 0xbe, 0x20, 0x14, 0xfb, 0xd1, 0x2c, 0x74, 0x43, 0x6c, 0x6f, 0xa1, 0x1e, 0xfc, 0xef, 0x05,
+	0x97, 0xdf, 0x08, 0x1d, 0x47, 0x64, 0xea, 0x8e, 0xb1, 0x6d, 0xa1, 0x03, 0xb0, 0x09, 0x9d, 0x85,
+	0xee, 0x64, 0xb2, 0x51, 0xb7, 0x55, 0xb5, 0x17, 0x4c, 0xa7, 0x24, 0xdc, 0x88, 0x0d, 0x85, 0x32,
+	0x7c, 0x1e, 0x04, 0x5a, 0xf4, 0xf1, 0x82, 0x78, 0xd8, 0x6e, 0x2a, 0x75, 0x7e, 0x39, 0x66, 0xae,
+	0x8f, 0x23, 0x2f, 0x98, 0x5e, 0x4e, 0x70, 0x88, 0xed, 0x16, 0x42, 0xd0, 0xbd, 0x57, 0x2f, 0x5c,
+	0x32, 0xc1, 0xbe, 0xdd, 0x46, 0x47, 0xb0, 0xef, 0x7a, 0x21, 0x59, 0xb8, 0x21, 0x09, 0xe8, 0x06,
+	0xde, 0x41, 0x87, 0xd0, 0x7b, 0x64, 0xd4, 0xfc, 0xee, 0xe0, 0xa7, 0x05, 0x6d, 0x73, 0x39, 0x3d,
+	0xe4, 0x61, 0x1b, 0x86, 0x5d, 0x3f, 0xa0, 0xf6, 0x96, 0x52, 0x31, 0x63, 0x01, 0x8b, 0x08, 0x8d,
+	0x18, 0xfe, 0x32, 0xc7, 0xb3, 0xd0, 0xb6, 0xd4, 0x68, 0x42, 0x43, 0xcc, 0xa8, 0x3b, 0x89, 0xb4,
+	0x6d, 0x6f, 0xa3, 0xa7, 0x70, 0x68, 0x02, 0x2b, 0xf4, 0x2b, 0x0b, 0xe8, 0xb8, 0xbe, 0x49, 0x43,
+	0xdd, 0x84, 0xd0, 0x85, 0x3b, 0x21, 0x7e, 0xbd, 0x68, 0x13, 0xf5, 0xe1, 0xc0, 0x30, 0x5a, 0x88,
+	0xbc, 0x4f, 0xd8, 0xfb, 0x3c, 0x9b, 0x4f, 0xed, 0xd6, 0xf9, 0xc7, 0xef, 0x1f, 0x96, 0xa2, 0xba,
+	0x59, 0x5f, 0x0d, 0x93, 0x5c, 0x3a, 0xf9, 0x2d, 0xcf, 0x92, 0xbc, 0x48, 0x9d, 0x94, 0xdf, 0x89,
+	0x84, 0x9f, 0xca, 0x38, 0x8b, 0x97, 0x5c, 0xf2, 0xac, 0x3a, 0x15, 0x59, 0xc5, 0x8b, 0xeb, 0x38,
+	0xe1, 0xce, 0xdd, 0x99, 0xb3, 0xcc, 0x9d, 0x54, 0x8a, 0xab, 0xb6, 0xfe, 0xaf, 0xce, 0xfe, 0x06,
+	0x00, 0x00, 0xff, 0xff, 0xbe, 0x44, 0x10, 0x9d, 0x85, 0x03, 0x00, 0x00,
+}
diff --git a/go/dmi/sw_management_service.pb.go b/go/dmi/sw_management_service.pb.go
new file mode 100644
index 0000000..382bf2a
--- /dev/null
+++ b/go/dmi/sw_management_service.pb.go
@@ -0,0 +1,420 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: dmi/sw_management_service.proto
+
+package dmi
+
+import (
+	context "context"
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	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 SoftwareVersionInformation struct {
+	ActiveVersions       []*ImageVersion `protobuf:"bytes,1,rep,name=active_versions,json=activeVersions,proto3" json:"active_versions,omitempty"`
+	StandbyVersions      []*ImageVersion `protobuf:"bytes,2,rep,name=standby_versions,json=standbyVersions,proto3" json:"standby_versions,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
+	XXX_unrecognized     []byte          `json:"-"`
+	XXX_sizecache        int32           `json:"-"`
+}
+
+func (m *SoftwareVersionInformation) Reset()         { *m = SoftwareVersionInformation{} }
+func (m *SoftwareVersionInformation) String() string { return proto.CompactTextString(m) }
+func (*SoftwareVersionInformation) ProtoMessage()    {}
+func (*SoftwareVersionInformation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_000929e4bec891d7, []int{0}
+}
+
+func (m *SoftwareVersionInformation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SoftwareVersionInformation.Unmarshal(m, b)
+}
+func (m *SoftwareVersionInformation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SoftwareVersionInformation.Marshal(b, m, deterministic)
+}
+func (m *SoftwareVersionInformation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SoftwareVersionInformation.Merge(m, src)
+}
+func (m *SoftwareVersionInformation) XXX_Size() int {
+	return xxx_messageInfo_SoftwareVersionInformation.Size(m)
+}
+func (m *SoftwareVersionInformation) XXX_DiscardUnknown() {
+	xxx_messageInfo_SoftwareVersionInformation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SoftwareVersionInformation proto.InternalMessageInfo
+
+func (m *SoftwareVersionInformation) GetActiveVersions() []*ImageVersion {
+	if m != nil {
+		return m.ActiveVersions
+	}
+	return nil
+}
+
+func (m *SoftwareVersionInformation) GetStandbyVersions() []*ImageVersion {
+	if m != nil {
+		return m.StandbyVersions
+	}
+	return nil
+}
+
+type DownloadImageRequest struct {
+	DeviceUuid           *Uuid             `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	ImageInfo            *ImageInformation `protobuf:"bytes,2,opt,name=image_info,json=imageInfo,proto3" json:"image_info,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *DownloadImageRequest) Reset()         { *m = DownloadImageRequest{} }
+func (m *DownloadImageRequest) String() string { return proto.CompactTextString(m) }
+func (*DownloadImageRequest) ProtoMessage()    {}
+func (*DownloadImageRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_000929e4bec891d7, []int{1}
+}
+
+func (m *DownloadImageRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DownloadImageRequest.Unmarshal(m, b)
+}
+func (m *DownloadImageRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DownloadImageRequest.Marshal(b, m, deterministic)
+}
+func (m *DownloadImageRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DownloadImageRequest.Merge(m, src)
+}
+func (m *DownloadImageRequest) XXX_Size() int {
+	return xxx_messageInfo_DownloadImageRequest.Size(m)
+}
+func (m *DownloadImageRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DownloadImageRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DownloadImageRequest proto.InternalMessageInfo
+
+func (m *DownloadImageRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *DownloadImageRequest) GetImageInfo() *ImageInformation {
+	if m != nil {
+		return m.ImageInfo
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*SoftwareVersionInformation)(nil), "dmi.SoftwareVersionInformation")
+	proto.RegisterType((*DownloadImageRequest)(nil), "dmi.DownloadImageRequest")
+}
+
+func init() { proto.RegisterFile("dmi/sw_management_service.proto", fileDescriptor_000929e4bec891d7) }
+
+var fileDescriptor_000929e4bec891d7 = []byte{
+	// 387 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xd1, 0xaf, 0xd2, 0x30,
+	0x18, 0xc5, 0x33, 0x48, 0x4c, 0x28, 0x22, 0xd8, 0x60, 0x82, 0x7b, 0x81, 0xf0, 0x44, 0x4c, 0xd8,
+	0x0c, 0xf0, 0xa2, 0x18, 0x13, 0x0d, 0x51, 0x79, 0xd0, 0x87, 0x4d, 0x7d, 0xf0, 0x65, 0x29, 0xeb,
+	0xb7, 0xd1, 0xc4, 0xb6, 0xd8, 0x76, 0x9b, 0xfe, 0x23, 0x3e, 0xf9, 0xc7, 0x9a, 0xb5, 0xc3, 0x79,
+	0xef, 0xe5, 0xde, 0xdc, 0xb7, 0xed, 0xf4, 0xfc, 0xbe, 0xf6, 0x9c, 0x7c, 0x68, 0x4a, 0x39, 0x0b,
+	0x75, 0x95, 0x70, 0x22, 0x48, 0x0e, 0x1c, 0x84, 0x49, 0x34, 0xa8, 0x92, 0xa5, 0x10, 0x9c, 0x94,
+	0x34, 0x12, 0x77, 0x29, 0x67, 0xfe, 0xc3, 0xda, 0x75, 0xac, 0x9c, 0xe4, 0xe3, 0x86, 0x61, 0x9c,
+	0xe4, 0x8d, 0x6d, 0xfe, 0xdb, 0x43, 0x7e, 0x2c, 0x33, 0x53, 0x11, 0x05, 0x5f, 0x41, 0x69, 0x26,
+	0xc5, 0x5e, 0x64, 0x52, 0x71, 0x62, 0x98, 0x14, 0xf8, 0x25, 0x1a, 0x92, 0xd4, 0xb0, 0x12, 0x92,
+	0xd2, 0x1d, 0xea, 0x89, 0x37, 0xeb, 0x2e, 0xfa, 0xab, 0xc7, 0x01, 0xe5, 0x2c, 0xd8, 0xd7, 0x93,
+	0x1a, 0x2c, 0x7a, 0xe4, 0x9c, 0xcd, 0xaf, 0xc6, 0xaf, 0xd0, 0x48, 0x1b, 0x22, 0xe8, 0xe1, 0x57,
+	0x0b, 0x77, 0x6e, 0x83, 0x87, 0x8d, 0xf5, 0x4c, 0xcf, 0x7f, 0xa2, 0xf1, 0x4e, 0x56, 0xe2, 0xbb,
+	0x24, 0xd4, 0x1a, 0x23, 0xf8, 0x51, 0x80, 0x36, 0xf8, 0x19, 0xea, 0x53, 0xa8, 0x73, 0x26, 0x45,
+	0xc1, 0xe8, 0xc4, 0x9b, 0x79, 0x8b, 0xfe, 0xaa, 0x67, 0x07, 0x7e, 0x29, 0x18, 0x8d, 0x90, 0x3b,
+	0xad, 0xbf, 0xf1, 0x06, 0x21, 0x9b, 0x35, 0x61, 0x22, 0x93, 0x93, 0x8e, 0xb5, 0x3e, 0x69, 0xef,
+	0xfe, 0x2f, 0x68, 0xd4, 0x63, 0x67, 0x65, 0xf5, 0xa7, 0x83, 0xa6, 0x9f, 0x48, 0x1d, 0xe5, 0x5c,
+	0xcc, 0xc7, 0x7f, 0x25, 0xc7, 0xae, 0x63, 0xfc, 0x0e, 0xe1, 0xf7, 0x60, 0xae, 0x15, 0x87, 0x87,
+	0x76, 0xf6, 0x07, 0xa2, 0x68, 0xad, 0xee, 0x77, 0xfe, 0xd4, 0x0a, 0x77, 0xf4, 0xfb, 0x1a, 0x0d,
+	0xae, 0xa4, 0xc4, 0x4f, 0x2d, 0x71, 0x29, 0xb9, 0x3f, 0x6a, 0x5f, 0x1e, 0x1b, 0x62, 0x0a, 0xfd,
+	0xdc, 0xc3, 0x1b, 0x34, 0x78, 0x53, 0xb7, 0x4e, 0x0c, 0x38, 0xfe, 0xc6, 0x13, 0x2e, 0x51, 0x5b,
+	0x34, 0x8e, 0xa0, 0x04, 0x65, 0x3e, 0xcb, 0xd8, 0xd5, 0x7e, 0x7f, 0xf8, 0xed, 0xf6, 0xdb, 0x8b,
+	0x9c, 0x99, 0x63, 0x71, 0x08, 0x52, 0xc9, 0x43, 0x79, 0x02, 0x91, 0x4a, 0x45, 0x43, 0x57, 0xfb,
+	0xb2, 0xdd, 0xc7, 0x25, 0x13, 0x06, 0x54, 0x46, 0x52, 0x08, 0xcb, 0x75, 0x98, 0xcb, 0x90, 0x72,
+	0x76, 0x78, 0x60, 0xb7, 0x6e, 0xfd, 0x37, 0x00, 0x00, 0xff, 0xff, 0xd5, 0x4a, 0xed, 0x39, 0xbf,
+	0x02, 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
+
+// NativeSoftwareManagementServiceClient is the client API for NativeSoftwareManagementService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type NativeSoftwareManagementServiceClient interface {
+	// Get the software version information of the Active and Standby images
+	GetSoftwareVersion(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*SoftwareVersionInformation, error)
+	// Downloads and installs the image in the standby partition, returns the status/progress of the Install
+	DownloadImage(ctx context.Context, in *DownloadImageRequest, opts ...grpc.CallOption) (NativeSoftwareManagementService_DownloadImageClient, error)
+	// Activates and runs the OLT with the image in the standby partition. If things are fine this image will
+	// henceforth be marked as the Active Partition. The old working image would remain on the Standby partition.
+	// Any possibly required (sub-)steps like "commit" are left to the "Device Manager"
+	ActivateImage(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (NativeSoftwareManagementService_ActivateImageClient, error)
+	// Marks the image in the Standby as Active and reboots the device, so that it boots from that image which was in the standby.
+	// This API is to be used if operator wants to go back to the pervious software
+	RevertToStandbyImage(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (NativeSoftwareManagementService_RevertToStandbyImageClient, error)
+}
+
+type nativeSoftwareManagementServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewNativeSoftwareManagementServiceClient(cc *grpc.ClientConn) NativeSoftwareManagementServiceClient {
+	return &nativeSoftwareManagementServiceClient{cc}
+}
+
+func (c *nativeSoftwareManagementServiceClient) GetSoftwareVersion(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (*SoftwareVersionInformation, error) {
+	out := new(SoftwareVersionInformation)
+	err := c.cc.Invoke(ctx, "/dmi.NativeSoftwareManagementService/GetSoftwareVersion", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeSoftwareManagementServiceClient) DownloadImage(ctx context.Context, in *DownloadImageRequest, opts ...grpc.CallOption) (NativeSoftwareManagementService_DownloadImageClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeSoftwareManagementService_serviceDesc.Streams[0], "/dmi.NativeSoftwareManagementService/DownloadImage", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeSoftwareManagementServiceDownloadImageClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeSoftwareManagementService_DownloadImageClient interface {
+	Recv() (*ImageStatus, error)
+	grpc.ClientStream
+}
+
+type nativeSoftwareManagementServiceDownloadImageClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeSoftwareManagementServiceDownloadImageClient) Recv() (*ImageStatus, error) {
+	m := new(ImageStatus)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *nativeSoftwareManagementServiceClient) ActivateImage(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (NativeSoftwareManagementService_ActivateImageClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeSoftwareManagementService_serviceDesc.Streams[1], "/dmi.NativeSoftwareManagementService/ActivateImage", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeSoftwareManagementServiceActivateImageClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeSoftwareManagementService_ActivateImageClient interface {
+	Recv() (*ImageStatus, error)
+	grpc.ClientStream
+}
+
+type nativeSoftwareManagementServiceActivateImageClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeSoftwareManagementServiceActivateImageClient) Recv() (*ImageStatus, error) {
+	m := new(ImageStatus)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *nativeSoftwareManagementServiceClient) RevertToStandbyImage(ctx context.Context, in *HardwareID, opts ...grpc.CallOption) (NativeSoftwareManagementService_RevertToStandbyImageClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_NativeSoftwareManagementService_serviceDesc.Streams[2], "/dmi.NativeSoftwareManagementService/RevertToStandbyImage", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &nativeSoftwareManagementServiceRevertToStandbyImageClient{stream}
+	if err := x.ClientStream.SendMsg(in); err != nil {
+		return nil, err
+	}
+	if err := x.ClientStream.CloseSend(); err != nil {
+		return nil, err
+	}
+	return x, nil
+}
+
+type NativeSoftwareManagementService_RevertToStandbyImageClient interface {
+	Recv() (*ImageStatus, error)
+	grpc.ClientStream
+}
+
+type nativeSoftwareManagementServiceRevertToStandbyImageClient struct {
+	grpc.ClientStream
+}
+
+func (x *nativeSoftwareManagementServiceRevertToStandbyImageClient) Recv() (*ImageStatus, error) {
+	m := new(ImageStatus)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// NativeSoftwareManagementServiceServer is the server API for NativeSoftwareManagementService service.
+type NativeSoftwareManagementServiceServer interface {
+	// Get the software version information of the Active and Standby images
+	GetSoftwareVersion(context.Context, *HardwareID) (*SoftwareVersionInformation, error)
+	// Downloads and installs the image in the standby partition, returns the status/progress of the Install
+	DownloadImage(*DownloadImageRequest, NativeSoftwareManagementService_DownloadImageServer) error
+	// Activates and runs the OLT with the image in the standby partition. If things are fine this image will
+	// henceforth be marked as the Active Partition. The old working image would remain on the Standby partition.
+	// Any possibly required (sub-)steps like "commit" are left to the "Device Manager"
+	ActivateImage(*HardwareID, NativeSoftwareManagementService_ActivateImageServer) error
+	// Marks the image in the Standby as Active and reboots the device, so that it boots from that image which was in the standby.
+	// This API is to be used if operator wants to go back to the pervious software
+	RevertToStandbyImage(*HardwareID, NativeSoftwareManagementService_RevertToStandbyImageServer) error
+}
+
+func RegisterNativeSoftwareManagementServiceServer(s *grpc.Server, srv NativeSoftwareManagementServiceServer) {
+	s.RegisterService(&_NativeSoftwareManagementService_serviceDesc, srv)
+}
+
+func _NativeSoftwareManagementService_GetSoftwareVersion_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.(NativeSoftwareManagementServiceServer).GetSoftwareVersion(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeSoftwareManagementService/GetSoftwareVersion",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeSoftwareManagementServiceServer).GetSoftwareVersion(ctx, req.(*HardwareID))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeSoftwareManagementService_DownloadImage_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(DownloadImageRequest)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeSoftwareManagementServiceServer).DownloadImage(m, &nativeSoftwareManagementServiceDownloadImageServer{stream})
+}
+
+type NativeSoftwareManagementService_DownloadImageServer interface {
+	Send(*ImageStatus) error
+	grpc.ServerStream
+}
+
+type nativeSoftwareManagementServiceDownloadImageServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeSoftwareManagementServiceDownloadImageServer) Send(m *ImageStatus) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _NativeSoftwareManagementService_ActivateImage_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(HardwareID)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeSoftwareManagementServiceServer).ActivateImage(m, &nativeSoftwareManagementServiceActivateImageServer{stream})
+}
+
+type NativeSoftwareManagementService_ActivateImageServer interface {
+	Send(*ImageStatus) error
+	grpc.ServerStream
+}
+
+type nativeSoftwareManagementServiceActivateImageServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeSoftwareManagementServiceActivateImageServer) Send(m *ImageStatus) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func _NativeSoftwareManagementService_RevertToStandbyImage_Handler(srv interface{}, stream grpc.ServerStream) error {
+	m := new(HardwareID)
+	if err := stream.RecvMsg(m); err != nil {
+		return err
+	}
+	return srv.(NativeSoftwareManagementServiceServer).RevertToStandbyImage(m, &nativeSoftwareManagementServiceRevertToStandbyImageServer{stream})
+}
+
+type NativeSoftwareManagementService_RevertToStandbyImageServer interface {
+	Send(*ImageStatus) error
+	grpc.ServerStream
+}
+
+type nativeSoftwareManagementServiceRevertToStandbyImageServer struct {
+	grpc.ServerStream
+}
+
+func (x *nativeSoftwareManagementServiceRevertToStandbyImageServer) Send(m *ImageStatus) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+var _NativeSoftwareManagementService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "dmi.NativeSoftwareManagementService",
+	HandlerType: (*NativeSoftwareManagementServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "GetSoftwareVersion",
+			Handler:    _NativeSoftwareManagementService_GetSoftwareVersion_Handler,
+		},
+	},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "DownloadImage",
+			Handler:       _NativeSoftwareManagementService_DownloadImage_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "ActivateImage",
+			Handler:       _NativeSoftwareManagementService_ActivateImage_Handler,
+			ServerStreams: true,
+		},
+		{
+			StreamName:    "RevertToStandbyImage",
+			Handler:       _NativeSoftwareManagementService_RevertToStandbyImage_Handler,
+			ServerStreams: true,
+		},
+	},
+	Metadata: "dmi/sw_management_service.proto",
+}
diff --git a/protos/dmi/commons.proto b/protos/dmi/commons.proto
new file mode 100644
index 0000000..828f5cf
--- /dev/null
+++ b/protos/dmi/commons.proto
@@ -0,0 +1,21 @@
+syntax = "proto3";
+
+option go_package = "github.com/opencord/device-management-interface/v3/go/dmi";
+package dmi;
+
+// Common structures used across the different Device Management services
+
+enum Status {
+    UNDEFINED_STATUS = 0;
+    OK = 1;
+    ERROR = 2;
+}
+
+// Reason for the failure of request
+enum Reason {
+    UNDEFINED_REASON = 0;
+    UNKNOWN_DEVICE = 1;
+    INTERNAL_ERROR = 2;
+    WRONG_METRIC = 3;
+    WRONG_EVENT = 4;
+}
diff --git a/protos/dmi/hw.proto b/protos/dmi/hw.proto
new file mode 100644
index 0000000..efc1400
--- /dev/null
+++ b/protos/dmi/hw.proto
@@ -0,0 +1,194 @@
+syntax = "proto3";
+
+option go_package = "github.com/opencord/device-management-interface/v3/go/dmi";
+package dmi;
+
+import "google/protobuf/timestamp.proto";
+
+// The model used to represent a HW is based on RFC8348 (https://tools.ietf.org/html/rfc8348)
+
+message Uuid {
+    string uuid = 1;
+}
+
+message HardwareID {
+    Uuid uuid = 1;
+}
+
+message Uri {
+    string uri = 1;
+}
+
+enum ComponentType {
+    COMPONENT_TYPE_UNDEFINED = 0;
+    COMPONENT_TYPE_UNKNOWN = 1;
+    COMPONENT_TYPE_CHASSIS = 2;
+    COMPONENT_TYPE_BACKPLANE = 3;
+    COMPONENT_TYPE_CONTAINER = 4;
+    COMPONENT_TYPE_POWER_SUPPLY = 5;
+    COMPONENT_TYPE_FAN = 6;
+    COMPONENT_TYPE_SENSOR = 7;
+    COMPONENT_TYPE_MODULE = 8;
+    COMPONENT_TYPE_PORT = 9;
+    COMPONENT_TYPE_CPU = 10;
+    COMPONENT_TYPE_BATTERY = 11;
+    COMPONENT_TYPE_STORAGE = 12;
+    COMPONENT_TYPE_MEMORY = 13;
+    COMPONENT_TYPE_TRANSCEIVER = 14;
+}
+
+enum ComponentAdminState {
+    COMP_ADMIN_STATE_UNDEFINED = 0;
+    COMP_ADMIN_STATE_UNKNOWN = 1;
+    COMP_ADMIN_STATE_LOCKED = 2;
+    COMP_ADMIN_STATE_SHUTTING_DOWN = 3;
+    COMP_ADMIN_STATE_UNLOCKED = 4;
+}
+
+enum ComponentOperState {
+    COMP_OPER_STATE_UNDEFINED = 0;
+    COMP_OPER_STATE_UNKNOWN = 1;
+    COMP_OPER_STATE_DISABLED = 2;
+    COMP_OPER_STATE_ENABLED = 3;
+    COMP_OPER_STATE_TESTING = 4;
+}
+
+enum ComponentUsageState {
+    COMP_USAGE_STATE_UNDEFINED = 0;
+    COMP_USAGE_STATE_UNKNOWN = 1;
+    COMP_USAGE_STATE_IDLE = 2;
+    COMP_USAGE_STATE_ACTIVE = 3;
+    COMP_USAGE_STATE_BUSY = 4;
+}
+
+enum ComponentAlarmState {
+    COMP_ALARM_STATE_UNDEFINED = 0;
+    COMP_ALARM_STATE_UNKNOWN = 1;
+    COMP_ALARM_STATE_UNDER_REPAIR= 2;
+    COMP_ALARM_STATE_CRITICAL = 3;
+    COMP_ALARM_STATE_MAJOR = 4;
+    COMP_ALARM_STATE_MINOR = 5;
+    COMP_ALARM_STATE_WARNING = 6;
+    COMP_ALARM_STATE_INTERMEDIATE = 7;
+}
+
+enum ComponentStandbyState {
+    COMP_STANDBY_STATE_UNDEFINED = 0;
+    COMP_STANDBY_STATE_UNKNOWN = 1;
+    COMP_STANDBY_STATE_HOT = 2;
+    COMP_STANDBY_STATE_COLD = 3;
+    COMP_STANDBY_STATE_PROVIDING_SERVICE = 4;
+}
+
+message ComponentState {
+    google.protobuf.Timestamp state_last_changed = 1;
+    ComponentAdminState admin_state = 2;
+    ComponentOperState oper_state = 3;
+    ComponentUsageState usage_state = 4;
+    ComponentAlarmState alarm_state = 5;
+    ComponentStandbyState standby_state = 6;
+}
+
+enum SensorValueType {
+    SENSOR_VALUE_TYPE_UNDEFINED = 0;
+    SENSOR_VALUE_TYPE_OTHER = 1;
+    SENSOR_VALUE_TYPE_UNKNOWN = 2;
+    SENSOR_VALUE_TYPE_VOLTS_AC = 3;
+    SENSOR_VALUE_TYPE_VOLTS_DC = 4;
+    SENSOR_VALUE_TYPE_AMPERES = 5;
+    SENSOR_VALUE_TYPE_WATTS = 6;
+    SENSOR_VALUE_TYPE_HERTZ = 7;
+    SENSOR_VALUE_TYPE_CELSIUS = 8;
+    SENSOR_VALUE_TYPE_PERCENT_RH = 9;
+    SENSOR_VALUE_TYPE_RPM = 10;
+    SENSOR_VALUE_TYPE_CMM = 11;
+    SENSOR_VALUE_TYPE_TRUTH_VALUE = 12;
+}
+
+enum SensorValueScale {
+    SENSOR_VALUE_SCALE_UNDEFINED = 0;
+    SENSOR_VALUE_SCALE_YOCTO = 1;
+    SENSOR_VALUE_SCALE_ZEPTO = 2;
+    SENSOR_VALUE_SCALE_ATTO = 3;
+    SENSOR_VALUE_SCALE_FEMTO = 4;
+    SENSOR_VALUE_SCALE_PICO = 5;
+    SENSOR_VALUE_SCALE_NANO = 6;
+    SENSOR_VALUE_SCALE_MICRO = 7;
+    SENSOR_VALUE_SCALE_MILLI = 8;
+    SENSOR_VALUE_SCALE_UNITS = 9;
+    SENSOR_VALUE_SCALE_KILO = 10;
+    SENSOR_VALUE_SCALE_MEGA = 11;
+    SENSOR_VALUE_SCALE_GIGA = 12;
+    SENSOR_VALUE_SCALE_TERA = 13;
+    SENSOR_VALUE_SCALE_PETA = 14;
+    SENSOR_VALUE_SCALE_EXA = 15;
+    SENSOR_VALUE_SCALE_ZETTA = 16;
+    SENSOR_VALUE_SCALE_YOTTA =17;
+}
+
+enum SensorStatus {
+    SENSOR_STATUS_UNDEFINED = 0;
+    SENSOR_STATUS_OK = 1;
+    SENSOR_STATUS_UNAVAILABLE = 2;
+    SENSOR_STATUS_NONOPERATIONAL = 3;
+}
+
+message ComponentSensorData {
+    int32 value = 1;
+    SensorValueType type = 2;
+    SensorValueScale scale = 3;
+    int32 precision = 4;
+    SensorStatus status = 5;
+    string units_display = 6;
+    google.protobuf.Timestamp timestamp = 7;
+    uint32 value_update_rate = 8;
+    // data_type can be of the string representation of MetricNames or something else as well
+    string data_type = 9;
+}
+
+message Component {
+    // The name of a component uniquely identifies an component within the Hardware
+    string name = 1;
+    ComponentType class = 2;
+    string description = 3;
+    Component parent = 4;
+    int32 parent_rel_pos = 5;
+    repeated Component children = 6;
+    string hardware_rev = 7;
+    string firmware_rev = 8;
+    string software_rev = 9;
+    string serial_num = 10;
+    string mfg_name = 11;
+    string model_name = 12;
+    string alias = 13;
+    string asset_id = 14;
+    bool is_fru = 15;
+    google.protobuf.Timestamp mfg_date = 16;
+    Uri uri = 17;
+    // The uuid of the component uniquely identifies the component across the entire system
+    Uuid uuid= 18;
+    ComponentState state = 19;
+    repeated ComponentSensorData sensor_data = 20;
+}
+
+message Hardware {
+    google.protobuf.Timestamp last_change = 1;
+    // Each HW has one parent/root and all other components are children of this
+    // The class of the root component would be set as UNDEFINED
+    Component root = 2;
+    // TODO: Authetication?
+}
+
+// The attributes of a component which are modifiable from the client side
+message ModifiableComponent {
+    // The name has to be unique for each component within the hardware and implementations need to
+    // ascertain this when modifying the name
+    string name = 1;
+    ComponentType class = 2;
+    Component parent = 3;
+    int32 parent_rel_pos = 4;
+    string alias = 5;
+    string asset_id = 6;
+    Uri uri = 7;
+    ComponentAdminState admin_state = 8;
+}
diff --git a/protos/dmi/hw_events_mgmt_service.proto b/protos/dmi/hw_events_mgmt_service.proto
new file mode 100644
index 0000000..6911df3
--- /dev/null
+++ b/protos/dmi/hw_events_mgmt_service.proto
@@ -0,0 +1,137 @@
+syntax = "proto3";
+
+option go_package = "github.com/opencord/device-management-interface/v3/go/dmi";
+package dmi;
+
+import "dmi/commons.proto";
+import "dmi/hw.proto";
+import "google/protobuf/timestamp.proto";
+
+// Management of Events and protos for encoding of Events
+
+enum EventIds {
+    EVENT_NAME_UNDEFINED = 0;
+
+    // Events from the Transceivers
+    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;
+
+    // Events from the PSU
+    EVENT_PSU_PLUG_OUT = 200;
+    EVENT_PSU_PLUG_IN = 201;
+    EVENT_PSU_FAILURE = 202;
+
+    // Events for the Fans
+    EVENT_FAN_FAILURE = 300;
+    EVENT_FAN_PLUG_OUT = 301;
+    EVENT_FAN_PLUG_IN = 302;
+
+    // Events for the CPUs
+    EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL = 400;
+    EVENT_CPU_TEMPERATURE_ABOVE_FATAL = 401;
+
+    // Events for the complete HW Device
+    EVENT_HW_DEVICE_RESET = 500;
+    EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL = 501;
+    EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL = 502;
+
+    // More to be added
+}
+
+message ValueType {
+    oneof val{
+        int64 int_val = 1;
+        uint64 uint_val = 2;
+        float float_val = 3;
+    }
+}
+
+message WaterMarks {
+    ValueType high = 1;
+    ValueType low = 2;
+}
+
+message Thresholds {
+    oneof threshold {
+        WaterMarks upper = 1;
+        WaterMarks lower = 2;
+    }
+}
+
+message ThresholdInformation {
+    ValueType observed_value = 1;
+    Thresholds thresholds = 2;
+}
+
+message EventCfg {
+    EventIds event_id = 1;
+    bool is_configured = 2;
+    // Optional threshold values, applicable only for some specific events
+    Thresholds thresholds = 3;
+}
+
+message EventsCfg {
+    repeated EventCfg items = 1;
+}
+
+message ListEventsResponse {
+    Status status = 1;
+    Reason reason = 2;
+    EventsCfg events = 3;
+}
+
+message EventsConfigurationRequest {
+    Uuid device_uuid = 1;
+    oneof operation {
+        EventsCfg changes = 2;
+        bool reset_to_default = 3;
+    }
+}
+
+message EventsConfigurationResponse {
+    Status status = 1;
+    Reason reason = 2;
+}
+
+message EventMetaData {
+    Uuid device_uuid = 1;
+    // uuid of the component
+    Uuid component_uuid = 2;
+    string component_name = 3;
+}
+
+// The Events are conveyed to external systems by submitting them on a kafka bus.
+// The topic to which are Events are submitted would be configured as startup
+// configuration of the components
+
+message Event {
+    EventMetaData event_metadata = 1;
+    EventIds event_id = 2;
+    google.protobuf.Timestamp raised_ts = 3;
+    // Optional threshold information for an event
+    ThresholdInformation threshold_info = 4;
+    // Any additional info regarding the event
+    string add_info = 5;
+}
+
+service NativeEventsManagementService {
+
+    // List the supported events for the passed device
+    rpc ListEvents(HardwareID) returns(ListEventsResponse);
+
+    // 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
+    rpc UpdateEventsConfiguration(EventsConfigurationRequest) returns(EventsConfigurationResponse);
+}
diff --git a/protos/dmi/hw_management_service.proto b/protos/dmi/hw_management_service.proto
new file mode 100644
index 0000000..5b780e7
--- /dev/null
+++ b/protos/dmi/hw_management_service.proto
@@ -0,0 +1,57 @@
+syntax = "proto3";
+
+option go_package = "github.com/opencord/device-management-interface/v3/go/dmi";
+package dmi;
+
+import "dmi/commons.proto";
+import "dmi/hw.proto";
+
+// Protos for the management of a hardware and it's components
+
+message PhysicalInventoryRequest {
+    Uuid device_uuid = 1;
+}
+
+message PhysicalInventoryResponse {
+    Status status = 1;
+    Reason reason = 2;
+    Hardware inventory = 3;
+}
+
+message HWComponentInfoGetRequest {
+    Uuid device_uuid = 1;
+    Uuid component_uuid = 2;
+    string component_name = 3;
+}
+
+message HWComponentInfoSetRequest {
+    Uuid device_uuid = 1;
+    Uuid component_uuid = 2;
+    string component_name = 3;
+    ModifiableComponent changes = 4;
+}
+
+message HWComponentInfoSetResponse {
+    Status status = 1;
+    Reason reason = 2;
+}
+
+message StartManagingDeviceResponse {
+    Status status = 1;
+    Reason reason = 2;
+    Uuid device_uuid = 3;
+}
+
+service NativeHWManagementService {
+    // Initializes context for a device and sets up required states
+    rpc StartManagingDevice(Hardware) returns(stream StartManagingDeviceResponse);
+
+    // Get the HW inventory details of the Device
+    rpc GetPhysicalInventory(PhysicalInventoryRequest) returns(stream PhysicalInventoryResponse);
+
+    // Get the details of a particular HW component
+    rpc GetHWComponentInfo(HWComponentInfoGetRequest) returns(stream Component);
+
+    // Sets the permissible attributes of a HW component
+    rpc SetHWComponentInfo(HWComponentInfoSetRequest) returns(HWComponentInfoSetResponse);
+}
diff --git a/protos/dmi/hw_metrics_mgmt_service.proto b/protos/dmi/hw_metrics_mgmt_service.proto
new file mode 100644
index 0000000..a30199f
--- /dev/null
+++ b/protos/dmi/hw_metrics_mgmt_service.proto
@@ -0,0 +1,125 @@
+syntax = "proto3";
+
+option go_package = "github.com/opencord/device-management-interface/v3/go/dmi";
+package dmi;
+
+import "dmi/commons.proto";
+import "dmi/hw.proto";
+
+// The model used to represent the event data on the SensorData of a component as described
+// in RFC8348 (https://tools.ietf.org/html/rfc8348)
+
+// Management of Metrics and protos for encoding of Metrics
+
+enum MetricNames {
+    METRIC_NAME_UNDEFINED = 0;
+
+    // FAN related metrics
+    METRIC_FAN_SPEED = 1;
+
+    // CPU related metrics
+    METRIC_CPU_TEMP = 100;
+    METRIC_CPU_USAGE_PERCENTAGE = 101;
+
+    // Transceiver related metrics
+    METRIC_TRANSCEIVER_TEMP = 200;
+    METRIC_TRANSCEIVER_VOLTAGE = 201;
+    METRIC_TRANSCEIVER_BIAS = 202;
+    METRIC_TRANSCEIVER_RX_POWER = 203;
+    METRIC_TRANSCEIVER_TX_POWER = 204;
+    METRIC_TRANSCEIVER_WAVELENGTH = 205;
+
+    // Disk related metrics
+    METRIC_DISK_TEMP = 300;
+    METRIC_DISK_CAPACITY = 301;
+    METRIC_DISK_USAGE = 302;
+    METRIC_DISK_USAGE_PERCENTAGE = 303;
+    METRIC_DISK_READ_WRITE_PERCENTAGE = 304;
+    METRIC_DISK_FAULTY_CELLS_PERCENTAGE = 305;
+
+    // RAM related metrics
+    METRIC_RAM_TEMP = 400;
+    METRIC_RAM_CAPACITY = 401;
+    METRIC_RAM_USAGE = 402;
+    METRIC_RAM_USAGE_PERCENTAGE = 403;
+
+    // Power related metrics
+    METRIC_POWER_MAX = 500;
+    METRIC_POWER_USAGE = 501;
+    METRIC_POWER_USAGE_PERCENTAGE = 502;
+
+    // Chassis related metrics
+    METRIC_INNER_SURROUNDING_TEMP = 600;
+}
+
+message MetricConfig {
+    MetricNames metric_id = 1;
+    // Whether the device manager is collecting and reporting this metric or not
+    bool is_configured = 2;
+    // Number of seconds between two consecutive polls of the particular metric
+    // Each device manager implemenation could have it's per metric default poll frequency which
+    // can be requested to be changed using this value
+    uint32 poll_interval = 3;
+}
+
+message MetricsConfig {
+    repeated MetricConfig metrics = 1;
+}
+
+message ListMetricsResponse {
+    Status status = 1;
+    Reason reason = 2;
+    MetricsConfig metrics = 3;
+}
+
+message MetricsConfigurationRequest {
+    Uuid device_uuid = 1;
+    oneof operation {
+        MetricsConfig changes = 2;
+        bool reset_to_default = 3;
+    }
+}
+
+message MetricsConfigurationResponse {
+    Status status = 1;
+    Reason reason = 2;
+}
+
+message MetricMetaData {
+    Uuid device_uuid = 1;
+    // uuid of the component
+    Uuid component_uuid = 2;
+    string component_name = 3;
+}
+
+// The Metrics are conveyed to external systems by submitting them on a kafka bus.
+// The topic to which are Metrics are submitted would be configured as startup
+// configuration of the components
+message Metric {
+    MetricNames metric_id = 1;
+    MetricMetaData metric_metadata = 2;
+    ComponentSensorData value = 3;
+}
+
+message GetMetricRequest {
+    MetricMetaData meta_data = 1;
+    MetricNames metric_id = 2;
+}
+
+service NativeMetricsManagementService {
+
+    // List the supported metrics for the passed device.
+    // This would be the first call that you make to know about the metrics that a particular device supports and
+    // then use the UpdateMetricsConfiguration API to monitor only the required metrics.
+    rpc ListMetrics(HardwareID) returns(ListMetricsResponse);
+
+    // Updates the configuration of the list of metrics in the request
+    // Acts upon single metric configuration, collection of a single metric can be started/stopped
+    // by changing its configuration.
+    //
+    // This configuration is persisted across restart of the device or the device manager
+    rpc UpdateMetricsConfiguration(MetricsConfigurationRequest) returns(MetricsConfigurationResponse);
+
+    // Get the instantenous value of a metric
+    rpc GetMetric(GetMetricRequest) returns(Metric);
+}
diff --git a/protos/dmi/sw_image.proto b/protos/dmi/sw_image.proto
new file mode 100644
index 0000000..e85767e
--- /dev/null
+++ b/protos/dmi/sw_image.proto
@@ -0,0 +1,53 @@
+syntax = "proto3";
+
+option go_package = "github.com/opencord/device-management-interface/v3/go/dmi";
+package dmi;
+
+import "dmi/commons.proto";
+
+// Protos for modeling a software image and it's status
+
+message ImageVersion {
+    string image_name = 1;
+    string version = 2;
+}
+
+message ImageInformation {
+    ImageVersion image = 1;
+    // Script used by the device specific managers to install the image.
+    // Script must be included in the object downloaded from the image_url
+    string image_install_script = 2;
+    // Location of the image and installation script, authentication (user/pass) if any should be in the url string
+    string image_url = 3;
+    // SHA-256 sum of the image (sha256sum on Linux)
+    string sha256sum = 5;
+}
+
+message ImageStatus {
+    enum ImageState {
+        UNDEFINED_STATE = 0;
+        COPYING_IMAGE = 1;
+        INSTALLING_IMAGE = 2;
+        COMMITING_IMAGE = 3;
+        REBOOTING_DEVICE = 4;
+        UPGRADE_COMPLETE = 5;
+        UPGRADE_FAILED = 6;
+        ACTIVATION_COMPLETE = 7;
+        ACTIVATION_FAILED = 8;
+    }
+
+    enum Reason {
+        UNDEFINED_READON = 0;
+        ERROR_IN_REQUEST = 1;
+        INTERNAL_ERROR = 2;
+        DEVICE_IN_WRONG_STATE = 3;
+        INVALID_IMAGE = 4;
+        WRONG_IMAGE_CHECKSUM = 5;
+    }
+
+    Status status  = 1;
+    Reason reason = 2;
+    ImageState state = 3;
+    // description contains more information about the current state of the procedure and is device dependant
+    string description = 4;
+}
diff --git a/protos/dmi/sw_management_service.proto b/protos/dmi/sw_management_service.proto
new file mode 100644
index 0000000..3a935d0
--- /dev/null
+++ b/protos/dmi/sw_management_service.proto
@@ -0,0 +1,43 @@
+syntax = "proto3";
+
+option go_package = "github.com/opencord/device-management-interface/v3/go/dmi";
+package dmi;
+
+import "dmi/hw.proto";
+import "dmi/sw_image.proto";
+
+// The software management concept described here is aligned with WT-383a3 (Revision: 06 April 2020).
+// In particular Section 11 Software management
+// TODO check model
+
+// Protos for managing the software on a hardware device
+
+message SoftwareVersionInformation {
+    repeated ImageVersion active_versions = 1;
+    repeated ImageVersion standby_versions = 2;
+}
+
+message DownloadImageRequest {
+    Uuid device_uuid = 1;
+    ImageInformation image_info = 2;
+}
+
+service NativeSoftwareManagementService {
+    // Get the software version information of the Active and Standby images
+    rpc GetSoftwareVersion(HardwareID) returns(SoftwareVersionInformation);
+
+    // Downloads and installs the image in the standby partition, returns the status/progress of the Install
+    rpc DownloadImage(DownloadImageRequest) returns(stream ImageStatus);
+
+    // Activates and runs the OLT with the image in the standby partition. If things are fine this image will
+    // henceforth be marked as the Active Partition. The old working image would remain on the Standby partition.
+    // Any possibly required (sub-)steps like "commit" are left to the "Device Manager"
+    rpc ActivateImage(HardwareID) returns(stream ImageStatus);
+
+    // Marks the image in the Standby as Active and reboots the device, so that it boots from that image which was in the standby.
+    // This API is to be used if operator wants to go back to the pervious software
+    rpc RevertToStandbyImage(HardwareID) returns(stream ImageStatus);
+
+    // If needed we can add this later
+    //rpc SubscribeToEvents() returns (stream );
+}
