diff --git a/cpp/dmi/hw.pb.h b/cpp/dmi/hw.pb.h
index cff4653..78ebca2 100644
--- a/cpp/dmi/hw.pb.h
+++ b/cpp/dmi/hw.pb.h
@@ -43,7 +43,7 @@
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::google::protobuf::internal::AuxillaryParseTableField aux[]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
-  static const ::google::protobuf::internal::ParseTable schema[15]
+  static const ::google::protobuf::internal::ParseTable schema[16]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::google::protobuf::internal::FieldMetadata field_metadata[];
   static const ::google::protobuf::internal::SerializationTable serialization_table[];
@@ -72,6 +72,9 @@
 class ModifiableComponent;
 class ModifiableComponentDefaultTypeInternal;
 extern ModifiableComponentDefaultTypeInternal _ModifiableComponent_default_instance_;
+class PonDistance;
+class PonDistanceDefaultTypeInternal;
+extern PonDistanceDefaultTypeInternal _PonDistance_default_instance_;
 class PonIdConfig;
 class PonIdConfigDefaultTypeInternal;
 extern PonIdConfigDefaultTypeInternal _PonIdConfig_default_instance_;
@@ -106,6 +109,7 @@
 template<> ::dmi::Hardware* Arena::CreateMaybeMessage<::dmi::Hardware>(Arena*);
 template<> ::dmi::HardwareID* Arena::CreateMaybeMessage<::dmi::HardwareID>(Arena*);
 template<> ::dmi::ModifiableComponent* Arena::CreateMaybeMessage<::dmi::ModifiableComponent>(Arena*);
+template<> ::dmi::PonDistance* Arena::CreateMaybeMessage<::dmi::PonDistance>(Arena*);
 template<> ::dmi::PonIdConfig* Arena::CreateMaybeMessage<::dmi::PonIdConfig>(Arena*);
 template<> ::dmi::PortComponentAttributes* Arena::CreateMaybeMessage<::dmi::PortComponentAttributes>(Arena*);
 template<> ::dmi::PortComponentChangeAttributes* Arena::CreateMaybeMessage<::dmi::PortComponentChangeAttributes>(Arena*);
@@ -1481,6 +1485,15 @@
   ::dmi::PonIdConfig* mutable_pon_id_config();
   void set_allocated_pon_id_config(::dmi::PonIdConfig* pon_id_config);
 
+  // .dmi.PonDistance distance = 8;
+  bool has_distance() const;
+  void clear_distance();
+  static const int kDistanceFieldNumber = 8;
+  const ::dmi::PonDistance& distance() const;
+  ::dmi::PonDistance* release_distance();
+  ::dmi::PonDistance* mutable_distance();
+  void set_allocated_distance(::dmi::PonDistance* distance);
+
   // .dmi.PortComponentAttributes.ConnectorType connector_type = 1;
   void clear_connector_type();
   static const int kConnectorTypeFieldNumber = 1;
@@ -1513,6 +1526,7 @@
   ::google::protobuf::internal::ArenaStringPtr physical_label_;
   ::google::protobuf::internal::ArenaStringPtr mapping_label_;
   ::dmi::PonIdConfig* pon_id_config_;
+  ::dmi::PonDistance* distance_;
   int connector_type_;
   int speed_;
   int protocol_;
@@ -1522,6 +1536,125 @@
 };
 // -------------------------------------------------------------------
 
+class PonDistance final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.PonDistance) */ {
+ public:
+  PonDistance();
+  virtual ~PonDistance();
+
+  PonDistance(const PonDistance& from);
+
+  inline PonDistance& operator=(const PonDistance& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  PonDistance(PonDistance&& from) noexcept
+    : PonDistance() {
+    *this = ::std::move(from);
+  }
+
+  inline PonDistance& operator=(PonDistance&& from) noexcept {
+    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
+      if (this != &from) InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+  #endif
+  static const ::google::protobuf::Descriptor* descriptor() {
+    return default_instance().GetDescriptor();
+  }
+  static const PonDistance& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const PonDistance* internal_default_instance() {
+    return reinterpret_cast<const PonDistance*>(
+               &_PonDistance_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    6;
+
+  void Swap(PonDistance* other);
+  friend void swap(PonDistance& a, PonDistance& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline PonDistance* New() const final {
+    return CreateMaybeMessage<PonDistance>(nullptr);
+  }
+
+  PonDistance* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<PonDistance>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const PonDistance& from);
+  void MergeFrom(const PonDistance& from);
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+  static const char* _InternalParse(const char* begin, const char* end, void* object, ::google::protobuf::internal::ParseContext* ctx);
+  ::google::protobuf::internal::ParseFunc _ParseFunc() const final { return _InternalParse; }
+  #else
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input) final;
+  #endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const final;
+  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
+      ::google::protobuf::uint8* target) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(PonDistance* other);
+  private:
+  inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
+    return nullptr;
+  }
+  inline void* MaybeArenaPtr() const {
+    return nullptr;
+  }
+  public:
+
+  ::google::protobuf::Metadata GetMetadata() const final;
+
+  // nested types ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // uint32 max_distance = 1;
+  void clear_max_distance();
+  static const int kMaxDistanceFieldNumber = 1;
+  ::google::protobuf::uint32 max_distance() const;
+  void set_max_distance(::google::protobuf::uint32 value);
+
+  // uint32 max_differential_distance = 2;
+  void clear_max_differential_distance();
+  static const int kMaxDifferentialDistanceFieldNumber = 2;
+  ::google::protobuf::uint32 max_differential_distance() const;
+  void set_max_differential_distance(::google::protobuf::uint32 value);
+
+  // @@protoc_insertion_point(class_scope:dmi.PonDistance)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::uint32 max_distance_;
+  ::google::protobuf::uint32 max_differential_distance_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_2eproto;
+};
+// -------------------------------------------------------------------
+
 class PortComponentChangeAttributes final :
     public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.PortComponentChangeAttributes) */ {
  public:
@@ -1560,7 +1693,7 @@
                &_PortComponentChangeAttributes_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    6;
+    7;
 
   void Swap(PortComponentChangeAttributes* other);
   friend void swap(PortComponentChangeAttributes& a, PortComponentChangeAttributes& b) {
@@ -1626,12 +1759,22 @@
   ::dmi::PonIdConfig* mutable_pon_id_config();
   void set_allocated_pon_id_config(::dmi::PonIdConfig* pon_id_config);
 
+  // .dmi.PonDistance distance = 2;
+  bool has_distance() const;
+  void clear_distance();
+  static const int kDistanceFieldNumber = 2;
+  const ::dmi::PonDistance& distance() const;
+  ::dmi::PonDistance* release_distance();
+  ::dmi::PonDistance* mutable_distance();
+  void set_allocated_distance(::dmi::PonDistance* distance);
+
   // @@protoc_insertion_point(class_scope:dmi.PortComponentChangeAttributes)
  private:
   class HasBitSetters;
 
   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
   ::dmi::PonIdConfig* pon_id_config_;
+  ::dmi::PonDistance* distance_;
   mutable ::google::protobuf::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_dmi_2fhw_2eproto;
 };
@@ -1675,7 +1818,7 @@
                &_TransceiverComponentChangeAttributes_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    7;
+    8;
 
   void Swap(TransceiverComponentChangeAttributes* other);
   friend void swap(TransceiverComponentChangeAttributes& a, TransceiverComponentChangeAttributes& b) {
@@ -1787,7 +1930,7 @@
                &_PonIdConfig_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    8;
+    9;
 
   void Swap(PonIdConfig* other);
   friend void swap(PonIdConfig& a, PonIdConfig& b) {
@@ -1914,7 +2057,7 @@
                &_ContainerComponentAttributes_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    9;
+    10;
 
   void Swap(ContainerComponentAttributes* other);
   friend void swap(ContainerComponentAttributes& a, ContainerComponentAttributes& b) {
@@ -2034,7 +2177,7 @@
                &_PsuComponentAttributes_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    10;
+    11;
 
   void Swap(PsuComponentAttributes* other);
   friend void swap(PsuComponentAttributes& a, PsuComponentAttributes& b) {
@@ -2176,7 +2319,7 @@
                &_TransceiverComponentsAttributes_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    11;
+    12;
 
   void Swap(TransceiverComponentsAttributes* other);
   friend void swap(TransceiverComponentsAttributes& a, TransceiverComponentsAttributes& b) {
@@ -2425,7 +2568,7 @@
                &_Component_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    12;
+    13;
 
   void Swap(Component* other);
   friend void swap(Component& a, Component& b) {
@@ -2836,7 +2979,7 @@
                &_Hardware_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    13;
+    14;
 
   void Swap(Hardware* other);
   friend void swap(Hardware& a, Hardware& b) {
@@ -2977,7 +3120,7 @@
                &_ModifiableComponent_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    14;
+    15;
 
   void Swap(ModifiableComponent* other);
   friend void swap(ModifiableComponent& a, ModifiableComponent& b) {
@@ -3913,6 +4056,89 @@
   // @@protoc_insertion_point(field_set:dmi.PortComponentAttributes.speed_autonegotiation)
 }
 
+// .dmi.PonDistance distance = 8;
+inline bool PortComponentAttributes::has_distance() const {
+  return this != internal_default_instance() && distance_ != nullptr;
+}
+inline void PortComponentAttributes::clear_distance() {
+  if (GetArenaNoVirtual() == nullptr && distance_ != nullptr) {
+    delete distance_;
+  }
+  distance_ = nullptr;
+}
+inline const ::dmi::PonDistance& PortComponentAttributes::distance() const {
+  const ::dmi::PonDistance* p = distance_;
+  // @@protoc_insertion_point(field_get:dmi.PortComponentAttributes.distance)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::PonDistance*>(
+      &::dmi::_PonDistance_default_instance_);
+}
+inline ::dmi::PonDistance* PortComponentAttributes::release_distance() {
+  // @@protoc_insertion_point(field_release:dmi.PortComponentAttributes.distance)
+  
+  ::dmi::PonDistance* temp = distance_;
+  distance_ = nullptr;
+  return temp;
+}
+inline ::dmi::PonDistance* PortComponentAttributes::mutable_distance() {
+  
+  if (distance_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::PonDistance>(GetArenaNoVirtual());
+    distance_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.PortComponentAttributes.distance)
+  return distance_;
+}
+inline void PortComponentAttributes::set_allocated_distance(::dmi::PonDistance* distance) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete distance_;
+  }
+  if (distance) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      distance = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, distance, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  distance_ = distance;
+  // @@protoc_insertion_point(field_set_allocated:dmi.PortComponentAttributes.distance)
+}
+
+// -------------------------------------------------------------------
+
+// PonDistance
+
+// uint32 max_distance = 1;
+inline void PonDistance::clear_max_distance() {
+  max_distance_ = 0u;
+}
+inline ::google::protobuf::uint32 PonDistance::max_distance() const {
+  // @@protoc_insertion_point(field_get:dmi.PonDistance.max_distance)
+  return max_distance_;
+}
+inline void PonDistance::set_max_distance(::google::protobuf::uint32 value) {
+  
+  max_distance_ = value;
+  // @@protoc_insertion_point(field_set:dmi.PonDistance.max_distance)
+}
+
+// uint32 max_differential_distance = 2;
+inline void PonDistance::clear_max_differential_distance() {
+  max_differential_distance_ = 0u;
+}
+inline ::google::protobuf::uint32 PonDistance::max_differential_distance() const {
+  // @@protoc_insertion_point(field_get:dmi.PonDistance.max_differential_distance)
+  return max_differential_distance_;
+}
+inline void PonDistance::set_max_differential_distance(::google::protobuf::uint32 value) {
+  
+  max_differential_distance_ = value;
+  // @@protoc_insertion_point(field_set:dmi.PonDistance.max_differential_distance)
+}
+
 // -------------------------------------------------------------------
 
 // PortComponentChangeAttributes
@@ -3968,6 +4194,57 @@
   // @@protoc_insertion_point(field_set_allocated:dmi.PortComponentChangeAttributes.pon_id_config)
 }
 
+// .dmi.PonDistance distance = 2;
+inline bool PortComponentChangeAttributes::has_distance() const {
+  return this != internal_default_instance() && distance_ != nullptr;
+}
+inline void PortComponentChangeAttributes::clear_distance() {
+  if (GetArenaNoVirtual() == nullptr && distance_ != nullptr) {
+    delete distance_;
+  }
+  distance_ = nullptr;
+}
+inline const ::dmi::PonDistance& PortComponentChangeAttributes::distance() const {
+  const ::dmi::PonDistance* p = distance_;
+  // @@protoc_insertion_point(field_get:dmi.PortComponentChangeAttributes.distance)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::PonDistance*>(
+      &::dmi::_PonDistance_default_instance_);
+}
+inline ::dmi::PonDistance* PortComponentChangeAttributes::release_distance() {
+  // @@protoc_insertion_point(field_release:dmi.PortComponentChangeAttributes.distance)
+  
+  ::dmi::PonDistance* temp = distance_;
+  distance_ = nullptr;
+  return temp;
+}
+inline ::dmi::PonDistance* PortComponentChangeAttributes::mutable_distance() {
+  
+  if (distance_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::PonDistance>(GetArenaNoVirtual());
+    distance_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.PortComponentChangeAttributes.distance)
+  return distance_;
+}
+inline void PortComponentChangeAttributes::set_allocated_distance(::dmi::PonDistance* distance) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete distance_;
+  }
+  if (distance) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      distance = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, distance, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  distance_ = distance;
+  // @@protoc_insertion_point(field_set_allocated:dmi.PortComponentChangeAttributes.distance)
+}
+
 // -------------------------------------------------------------------
 
 // TransceiverComponentChangeAttributes
@@ -5947,6 +6224,8 @@
 
 // -------------------------------------------------------------------
 
+// -------------------------------------------------------------------
+
 
 // @@protoc_insertion_point(namespace_scope)
 
