diff --git a/src/main/java/org/etsi/osl/tmf/am651/model/Agreement.java b/src/main/java/org/etsi/osl/tmf/am651/model/Agreement.java
index 9dd3e97092120a576b480efaa8957f9c4a42f9d2..113259c06b764c6cc3e1083ca718d826e01e2987 100644
--- a/src/main/java/org/etsi/osl/tmf/am651/model/Agreement.java
+++ b/src/main/java/org/etsi/osl/tmf/am651/model/Agreement.java
@@ -26,6 +26,7 @@ import java.util.Objects;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import org.etsi.osl.tmf.common.model.TimePeriod;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
 import org.springframework.validation.annotation.Validated;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.Valid;
diff --git a/src/main/java/org/etsi/osl/tmf/am651/model/AgreementCreate.java b/src/main/java/org/etsi/osl/tmf/am651/model/AgreementCreate.java
index 841688a9cf84e16e3c7756af5644b1dfbfe28c3c..02f5906d63b5dda4c31c6fc826bf320766ebd146 100644
--- a/src/main/java/org/etsi/osl/tmf/am651/model/AgreementCreate.java
+++ b/src/main/java/org/etsi/osl/tmf/am651/model/AgreementCreate.java
@@ -26,6 +26,7 @@ import java.util.Objects;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import org.etsi.osl.tmf.common.model.TimePeriod;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
 import org.springframework.validation.annotation.Validated;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.Valid;
diff --git a/src/main/java/org/etsi/osl/tmf/am651/model/AgreementUpdate.java b/src/main/java/org/etsi/osl/tmf/am651/model/AgreementUpdate.java
index b98ce9b6f5106c869a2bf53c4ecd93fdb5a0f813..c3a349813d041a6a425896a9d7ba3a9b20496286 100644
--- a/src/main/java/org/etsi/osl/tmf/am651/model/AgreementUpdate.java
+++ b/src/main/java/org/etsi/osl/tmf/am651/model/AgreementUpdate.java
@@ -26,6 +26,7 @@ import java.util.Objects;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import org.etsi.osl.tmf.common.model.TimePeriod;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
 import org.springframework.validation.annotation.Validated;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.Valid;
diff --git a/src/main/java/org/etsi/osl/tmf/am651/model/Characteristic.java b/src/main/java/org/etsi/osl/tmf/am651/model/Characteristic.java
deleted file mode 100644
index b00b36d00f59c54925af803122ee4bf98a09f6ff..0000000000000000000000000000000000000000
--- a/src/main/java/org/etsi/osl/tmf/am651/model/Characteristic.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*-
- * ========================LICENSE_START=================================
- * org.etsi.osl.tmf.api
- * %%
- * Copyright (C) 2019 openslice.io
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================LICENSE_END==================================
- */
-package org.etsi.osl.tmf.am651.model;
-
-import java.util.Objects;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import org.springframework.validation.annotation.Validated;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-/**
- * Describes a given characteristic of an object or entity through a name/value pair.
- */
-@Schema(description = "Describes a given characteristic of an object or entity through a name/value pair.")
-@Validated
-@jakarta.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2019-10-19T23:51:58.660+03:00")
-
-public class Characteristic   {
-  @JsonProperty("name")
-  private String name = null;
-
-  @JsonProperty("value")
-  private String value = null;
-
-  @JsonProperty("@type")
-  private String type = null;
-
-  @JsonProperty("@schemaLocation")
-  private String schemaLocation = null;
-
-  public Characteristic name(String name) {
-    this.name = name;
-    return this;
-  }
-
-  /**
-   * Name of the characteristic
-   * @return name
-  **/
-  @Schema(description = "Name of the characteristic")
-
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public Characteristic value(String value) {
-    this.value = value;
-    return this;
-  }
-
-  /**
-   * Value of the characteristic
-   * @return value
-  **/
-  @Schema(description = "Value of the characteristic")
-
-
-  public String getValue() {
-    return value;
-  }
-
-  public void setValue(String value) {
-    this.value = value;
-  }
-
-  public Characteristic type(String type) {
-    this.type = type;
-    return this;
-  }
-
-  /**
-   * The class type of the actual resource (for type extension).
-   * @return type
-  **/
-  @Schema(description = "The class type of the actual resource (for type extension).")
-
-
-  public String getType() {
-    return type;
-  }
-
-  public void setType(String type) {
-    this.type = type;
-  }
-
-  public Characteristic schemaLocation(String schemaLocation) {
-    this.schemaLocation = schemaLocation;
-    return this;
-  }
-
-  /**
-   * A link to the schema describing a resource (for type extension).
-   * @return schemaLocation
-  **/
-  @Schema(description = "A link to the schema describing a resource (for type extension).")
-
-
-  public String getSchemaLocation() {
-    return schemaLocation;
-  }
-
-  public void setSchemaLocation(String schemaLocation) {
-    this.schemaLocation = schemaLocation;
-  }
-
-
-  @Override
-  public boolean equals(java.lang.Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-    Characteristic characteristic = (Characteristic) o;
-    return Objects.equals(this.name, characteristic.name) &&
-        Objects.equals(this.value, characteristic.value) &&
-        Objects.equals(this.type, characteristic.type) &&
-        Objects.equals(this.schemaLocation, characteristic.schemaLocation);
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(name, value, type, schemaLocation);
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder sb = new StringBuilder();
-    sb.append("class Characteristic {\n");
-    
-    sb.append("    name: ").append(toIndentedString(name)).append("\n");
-    sb.append("    value: ").append(toIndentedString(value)).append("\n");
-    sb.append("    type: ").append(toIndentedString(type)).append("\n");
-    sb.append("    schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
-    sb.append("}");
-    return sb.toString();
-  }
-
-  /**
-   * Convert the given object to string with each line indented by 4 spaces
-   * (except the first line).
-   */
-  private String toIndentedString(java.lang.Object o) {
-    if (o == null) {
-      return "null";
-    }
-    return o.toString().replace("\n", "\n    ");
-  }
-}
-
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/BillingAccountRef.java b/src/main/java/org/etsi/osl/tmf/pim637/model/BillingAccountRef.java
new file mode 100644
index 0000000000000000000000000000000000000000..fed78010cea801c864f7eb9c529ba5f9ce3f3a04
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/BillingAccountRef.java
@@ -0,0 +1,229 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * BillingAccount reference. A BillingAccount is a detailed description of a bill structure.
+ */
+@Schema(description = "BillingAccount reference. A BillingAccount is a detailed description of a bill structure.")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class BillingAccountRef   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  @JsonProperty("@referredType")
+  private String _atReferredType = null;
+
+  public BillingAccountRef id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Unique identifier of the billing account
+   * @return id
+   **/
+  @Schema(required = true, description = "Unique identifier of the billing account")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public BillingAccountRef href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the billing account
+   * @return href
+   **/
+  @Schema(description = "Reference of the billing account")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public BillingAccountRef name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the billing account
+   * @return name
+   **/
+  @Schema(description = "Name of the billing account")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public BillingAccountRef _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public BillingAccountRef _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public BillingAccountRef _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+  public BillingAccountRef _atReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+    return this;
+  }
+
+  /**
+   * The actual type of the target instance when needed for disambiguation.
+   * @return _atReferredType
+   **/
+  @Schema(description = "The actual type of the target instance when needed for disambiguation.")
+      @NotNull
+
+    public String getAtReferredType() {
+    return _atReferredType;
+  }
+
+  public void setAtReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    BillingAccountRef billingAccountRef = (BillingAccountRef) o;
+    return Objects.equals(this.id, billingAccountRef.id) &&
+        Objects.equals(this.href, billingAccountRef.href) &&
+        Objects.equals(this.name, billingAccountRef.name) &&
+        Objects.equals(this._atBaseType, billingAccountRef._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, billingAccountRef._atSchemaLocation) &&
+        Objects.equals(this._atType, billingAccountRef._atType) &&
+        Objects.equals(this._atReferredType, billingAccountRef._atReferredType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, name, _atBaseType, _atSchemaLocation, _atType, _atReferredType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class BillingAccountRef {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("    _atReferredType: ").append(toIndentedString(_atReferredType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/EntityRef.java b/src/main/java/org/etsi/osl/tmf/pim637/model/EntityRef.java
new file mode 100644
index 0000000000000000000000000000000000000000..600dbe9af461bc4c3d5379dfe2960c5369f7a0c4
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/EntityRef.java
@@ -0,0 +1,229 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * Entity reference schema to be use for all entityRef class.
+ */
+@Schema(description = "Entity reference schema to be use for all entityRef class.")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class EntityRef   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  @JsonProperty("@referredType")
+  private String _atReferredType = null;
+
+  public EntityRef id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Unique identifier of a related entity.
+   * @return id
+   **/
+  @Schema(required = true, description = "Unique identifier of a related entity.")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public EntityRef href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the related entity.
+   * @return href
+   **/
+  @Schema(description = "Reference of the related entity.")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public EntityRef name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the related entity.
+   * @return name
+   **/
+  @Schema(description = "Name of the related entity.")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public EntityRef _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public EntityRef _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public EntityRef _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+  public EntityRef _atReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+    return this;
+  }
+
+  /**
+   * The actual type of the target instance when needed for disambiguation.
+   * @return _atReferredType
+   **/
+  @Schema(description = "The actual type of the target instance when needed for disambiguation.")
+      @NotNull
+
+    public String getAtReferredType() {
+    return _atReferredType;
+  }
+
+  public void setAtReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    EntityRef entityRef = (EntityRef) o;
+    return Objects.equals(this.id, entityRef.id) &&
+        Objects.equals(this.href, entityRef.href) &&
+        Objects.equals(this.name, entityRef.name) &&
+        Objects.equals(this._atBaseType, entityRef._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, entityRef._atSchemaLocation) &&
+        Objects.equals(this._atType, entityRef._atType) &&
+        Objects.equals(this._atReferredType, entityRef._atReferredType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, name, _atBaseType, _atSchemaLocation, _atType, _atReferredType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class EntityRef {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("    _atReferredType: ").append(toIndentedString(_atReferredType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/Error.java b/src/main/java/org/etsi/osl/tmf/pim637/model/Error.java
new file mode 100644
index 0000000000000000000000000000000000000000..e13ea9a4bec6ec5f7dc740f16212dfa2b1134ece
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/Error.java
@@ -0,0 +1,254 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * Used when an API throws an Error, typically with a HTTP error response-code (3xx, 4xx, 5xx)
+ */
+@Schema(description = "Used when an API throws an Error, typically with a HTTP error response-code (3xx, 4xx, 5xx)")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class Error   {
+  @JsonProperty("code")
+  private String code = null;
+
+  @JsonProperty("reason")
+  private String reason = null;
+
+  @JsonProperty("message")
+  private String message = null;
+
+  @JsonProperty("status")
+  private String status = null;
+
+  @JsonProperty("referenceError")
+  private String referenceError = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public Error code(String code) {
+    this.code = code;
+    return this;
+  }
+
+  /**
+   * Application relevant detail, defined in the API or a common list.
+   * @return code
+   **/
+  @Schema(required = true, description = "Application relevant detail, defined in the API or a common list.")
+      @NotNull
+
+    public String getCode() {
+    return code;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  public Error reason(String reason) {
+    this.reason = reason;
+    return this;
+  }
+
+  /**
+   * Explanation of the reason for the error which can be shown to a client user.
+   * @return reason
+   **/
+  @Schema(required = true, description = "Explanation of the reason for the error which can be shown to a client user.")
+      @NotNull
+
+    public String getReason() {
+    return reason;
+  }
+
+  public void setReason(String reason) {
+    this.reason = reason;
+  }
+
+  public Error message(String message) {
+    this.message = message;
+    return this;
+  }
+
+  /**
+   * More details and corrective actions related to the error which can be shown to a client user.
+   * @return message
+   **/
+  @Schema(description = "More details and corrective actions related to the error which can be shown to a client user.")
+      @NotNull
+
+    public String getMessage() {
+    return message;
+  }
+
+  public void setMessage(String message) {
+    this.message = message;
+  }
+
+  public Error status(String status) {
+    this.status = status;
+    return this;
+  }
+
+  /**
+   * HTTP Error code extension
+   * @return status
+   **/
+  @Schema(description = "HTTP Error code extension")
+      @NotNull
+
+    public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public Error referenceError(String referenceError) {
+    this.referenceError = referenceError;
+    return this;
+  }
+
+  /**
+   * URI of documentation describing the error.
+   * @return referenceError
+   **/
+  @Schema(description = "URI of documentation describing the error.")
+      @NotNull
+
+    public String getReferenceError() {
+    return referenceError;
+  }
+
+  public void setReferenceError(String referenceError) {
+    this.referenceError = referenceError;
+  }
+
+  public Error _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class.
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class.")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public Error _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public Error _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name.
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name.")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    Error error = (Error) o;
+    return Objects.equals(this.code, error.code) &&
+        Objects.equals(this.reason, error.reason) &&
+        Objects.equals(this.message, error.message) &&
+        Objects.equals(this.status, error.status) &&
+        Objects.equals(this.referenceError, error.referenceError) &&
+        Objects.equals(this._atBaseType, error._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, error._atSchemaLocation) &&
+        Objects.equals(this._atType, error._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(code, reason, message, status, referenceError, _atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class Error {\n");
+    
+    sb.append("    code: ").append(toIndentedString(code)).append("\n");
+    sb.append("    reason: ").append(toIndentedString(reason)).append("\n");
+    sb.append("    message: ").append(toIndentedString(message)).append("\n");
+    sb.append("    status: ").append(toIndentedString(status)).append("\n");
+    sb.append("    referenceError: ").append(toIndentedString(referenceError)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/EventSubscription.java b/src/main/java/org/etsi/osl/tmf/pim637/model/EventSubscription.java
new file mode 100644
index 0000000000000000000000000000000000000000..1d272920e640fe22b0834c4f176dca7aa4516c5a
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/EventSubscription.java
@@ -0,0 +1,129 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * Sets the communication endpoint address the service instance must use to deliver notification information
+ */
+@Schema(description = "Sets the communication endpoint address the service instance must use to deliver notification information")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class EventSubscription   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("callback")
+  private String callback = null;
+
+  @JsonProperty("query")
+  private String query = null;
+
+  public EventSubscription id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Id of the listener
+   * @return id
+   **/
+  @Schema(required = true, description = "Id of the listener")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public EventSubscription callback(String callback) {
+    this.callback = callback;
+    return this;
+  }
+
+  /**
+   * The callback being registered.
+   * @return callback
+   **/
+  @Schema(required = true, description = "The callback being registered.")
+      @NotNull
+
+    public String getCallback() {
+    return callback;
+  }
+
+  public void setCallback(String callback) {
+    this.callback = callback;
+  }
+
+  public EventSubscription query(String query) {
+    this.query = query;
+    return this;
+  }
+
+  /**
+   * additional data to be passed
+   * @return query
+   **/
+  @Schema(description = "additional data to be passed")
+      @NotNull
+
+    public String getQuery() {
+    return query;
+  }
+
+  public void setQuery(String query) {
+    this.query = query;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    EventSubscription eventSubscription = (EventSubscription) o;
+    return Objects.equals(this.id, eventSubscription.id) &&
+        Objects.equals(this.callback, eventSubscription.callback) &&
+        Objects.equals(this.query, eventSubscription.query);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, callback, query);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class EventSubscription {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    callback: ").append(toIndentedString(callback)).append("\n");
+    sb.append("    query: ").append(toIndentedString(query)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/EventSubscriptionInput.java b/src/main/java/org/etsi/osl/tmf/pim637/model/EventSubscriptionInput.java
new file mode 100644
index 0000000000000000000000000000000000000000..2561f945670ca1178b490e411fbdf41c6132bf85
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/EventSubscriptionInput.java
@@ -0,0 +1,104 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * Sets the communication endpoint address the service instance must use to deliver notification information
+ */
+@Schema(description = "Sets the communication endpoint address the service instance must use to deliver notification information")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class EventSubscriptionInput   {
+  @JsonProperty("callback")
+  private String callback = null;
+
+  @JsonProperty("query")
+  private String query = null;
+
+  public EventSubscriptionInput callback(String callback) {
+    this.callback = callback;
+    return this;
+  }
+
+  /**
+   * The callback being registered.
+   * @return callback
+   **/
+  @Schema(required = true, description = "The callback being registered.")
+      @NotNull
+
+    public String getCallback() {
+    return callback;
+  }
+
+  public void setCallback(String callback) {
+    this.callback = callback;
+  }
+
+  public EventSubscriptionInput query(String query) {
+    this.query = query;
+    return this;
+  }
+
+  /**
+   * additional data to be passed
+   * @return query
+   **/
+  @Schema(description = "additional data to be passed")
+      @NotNull
+
+    public String getQuery() {
+    return query;
+  }
+
+  public void setQuery(String query) {
+    this.query = query;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    EventSubscriptionInput eventSubscriptionInput = (EventSubscriptionInput) o;
+    return Objects.equals(this.callback, eventSubscriptionInput.callback) &&
+        Objects.equals(this.query, eventSubscriptionInput.query);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(callback, query);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class EventSubscriptionInput {\n");
+    
+    sb.append("    callback: ").append(toIndentedString(callback)).append("\n");
+    sb.append("    query: ").append(toIndentedString(query)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/Money.java b/src/main/java/org/etsi/osl/tmf/pim637/model/Money.java
new file mode 100644
index 0000000000000000000000000000000000000000..3dba051ba85661bdfba0d9fecbb8e9420c076223
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/Money.java
@@ -0,0 +1,104 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * A base / value business entity used to represent money
+ */
+@Schema(description = "A base / value business entity used to represent money")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class Money   {
+  @JsonProperty("unit")
+  private String unit = null;
+
+  @JsonProperty("value")
+  private Float value = null;
+
+  public Money unit(String unit) {
+    this.unit = unit;
+    return this;
+  }
+
+  /**
+   * Currency (ISO4217 norm uses 3 letters to define the currency)
+   * @return unit
+   **/
+  @Schema(description = "Currency (ISO4217 norm uses 3 letters to define the currency)")
+      @NotNull
+
+    public String getUnit() {
+    return unit;
+  }
+
+  public void setUnit(String unit) {
+    this.unit = unit;
+  }
+
+  public Money value(Float value) {
+    this.value = value;
+    return this;
+  }
+
+  /**
+   * A positive floating point number
+   * @return value
+   **/
+  @Schema(description = "A positive floating point number")
+      @NotNull
+
+    public Float getValue() {
+    return value;
+  }
+
+  public void setValue(Float value) {
+    this.value = value;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    Money money = (Money) o;
+    return Objects.equals(this.unit, money.unit) &&
+        Objects.equals(this.value, money.value);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(unit, value);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class Money {\n");
+    
+    sb.append("    unit: ").append(toIndentedString(unit)).append("\n");
+    sb.append("    value: ").append(toIndentedString(value)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/Place.java b/src/main/java/org/etsi/osl/tmf/pim637/model/Place.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b98f7dc6bd27f8ae12d0a109cb5efc14cdba467
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/Place.java
@@ -0,0 +1,204 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * Place reference. Place defines the places where the products are sold or delivered.
+ */
+@Schema(description = "Place reference. Place defines the places where the products are sold or delivered.")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class Place   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public Place id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Unique identifier of the place
+   * @return id
+   **/
+  @Schema(description = "Unique identifier of the place")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public Place href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Unique reference of the place
+   * @return href
+   **/
+  @Schema(description = "Unique reference of the place")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public Place name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * A user-friendly name for the place, such as [Paris Store], [London Store], [Main Home]
+   * @return name
+   **/
+  @Schema(description = "A user-friendly name for the place, such as [Paris Store], [London Store], [Main Home]")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public Place _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public Place _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public Place _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    Place place = (Place) o;
+    return Objects.equals(this.id, place.id) &&
+        Objects.equals(this.href, place.href) &&
+        Objects.equals(this.name, place.name) &&
+        Objects.equals(this._atBaseType, place._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, place._atSchemaLocation) &&
+        Objects.equals(this._atType, place._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, name, _atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class Place {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/Price.java b/src/main/java/org/etsi/osl/tmf/pim637/model/Price.java
new file mode 100644
index 0000000000000000000000000000000000000000..0642c80684277ccbae0326de7757c738438054f1
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/Price.java
@@ -0,0 +1,232 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * Provides all amounts (tax included, duty free, tax rate), used currency and percentage to apply for Price Alteration.
+ */
+@Schema(description = "Provides all amounts (tax included, duty free, tax rate), used currency and percentage to apply for Price Alteration.")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class Price   {
+  @JsonProperty("percentage")
+  private Float percentage = null;
+
+  @JsonProperty("taxRate")
+  private Float taxRate = null;
+
+  @JsonProperty("dutyFreeAmount")
+  private Money dutyFreeAmount = null;
+
+  @JsonProperty("taxIncludedAmount")
+  private Money taxIncludedAmount = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public Price percentage(Float percentage) {
+    this.percentage = percentage;
+    return this;
+  }
+
+  /**
+   * Percentage to apply for ProdOfferPriceAlteration
+   * @return percentage
+   **/
+  @Schema(description = "Percentage to apply for ProdOfferPriceAlteration")
+      @NotNull
+
+    public Float getPercentage() {
+    return percentage;
+  }
+
+  public void setPercentage(Float percentage) {
+    this.percentage = percentage;
+  }
+
+  public Price taxRate(Float taxRate) {
+    this.taxRate = taxRate;
+    return this;
+  }
+
+  /**
+   * Tax rate
+   * @return taxRate
+   **/
+  @Schema(description = "Tax rate")
+      @NotNull
+
+    public Float getTaxRate() {
+    return taxRate;
+  }
+
+  public void setTaxRate(Float taxRate) {
+    this.taxRate = taxRate;
+  }
+
+  public Price dutyFreeAmount(Money dutyFreeAmount) {
+    this.dutyFreeAmount = dutyFreeAmount;
+    return this;
+  }
+
+  /**
+   * Get dutyFreeAmount
+   * @return dutyFreeAmount
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public Money getDutyFreeAmount() {
+    return dutyFreeAmount;
+  }
+
+  public void setDutyFreeAmount(Money dutyFreeAmount) {
+    this.dutyFreeAmount = dutyFreeAmount;
+  }
+
+  public Price taxIncludedAmount(Money taxIncludedAmount) {
+    this.taxIncludedAmount = taxIncludedAmount;
+    return this;
+  }
+
+  /**
+   * Get taxIncludedAmount
+   * @return taxIncludedAmount
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public Money getTaxIncludedAmount() {
+    return taxIncludedAmount;
+  }
+
+  public void setTaxIncludedAmount(Money taxIncludedAmount) {
+    this.taxIncludedAmount = taxIncludedAmount;
+  }
+
+  public Price _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public Price _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public Price _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    Price price = (Price) o;
+    return Objects.equals(this.percentage, price.percentage) &&
+        Objects.equals(this.taxRate, price.taxRate) &&
+        Objects.equals(this.dutyFreeAmount, price.dutyFreeAmount) &&
+        Objects.equals(this.taxIncludedAmount, price.taxIncludedAmount) &&
+        Objects.equals(this._atBaseType, price._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, price._atSchemaLocation) &&
+        Objects.equals(this._atType, price._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(percentage, taxRate, dutyFreeAmount, taxIncludedAmount, _atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class Price {\n");
+    
+    sb.append("    percentage: ").append(toIndentedString(percentage)).append("\n");
+    sb.append("    taxRate: ").append(toIndentedString(taxRate)).append("\n");
+    sb.append("    dutyFreeAmount: ").append(toIndentedString(dutyFreeAmount)).append("\n");
+    sb.append("    taxIncludedAmount: ").append(toIndentedString(taxIncludedAmount)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/PriceAlteration.java b/src/main/java/org/etsi/osl/tmf/pim637/model/PriceAlteration.java
new file mode 100644
index 0000000000000000000000000000000000000000..efa04041411e57e9aa321936d867589ef1ab8a5d
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/PriceAlteration.java
@@ -0,0 +1,357 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * Is an amount, usually of money, that modifies the price charged for an order item.
+ */
+@Schema(description = "Is an amount, usually of money, that modifies the price charged for an order item.")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class PriceAlteration   {
+  @JsonProperty("applicationDuration")
+  private Integer applicationDuration = null;
+
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("priceType")
+  private String priceType = null;
+
+  @JsonProperty("priority")
+  private Integer priority = null;
+
+  @JsonProperty("recurringChargePeriod")
+  private String recurringChargePeriod = null;
+
+  @JsonProperty("unitOfMeasure")
+  private String unitOfMeasure = null;
+
+  @JsonProperty("price")
+  private Price price = null;
+
+  @JsonProperty("productOfferingPrice")
+  private ProductOfferingPriceRef productOfferingPrice = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public PriceAlteration applicationDuration(Integer applicationDuration) {
+    this.applicationDuration = applicationDuration;
+    return this;
+  }
+
+  /**
+   * Duration during which the alteration applies on the order item price (for instance 2 months free of charge for the recurring charge)
+   * @return applicationDuration
+   **/
+  @Schema(description = "Duration during which the alteration applies on the order item price (for instance 2 months free of charge for the recurring charge)")
+      @NotNull
+
+    public Integer getApplicationDuration() {
+    return applicationDuration;
+  }
+
+  public void setApplicationDuration(Integer applicationDuration) {
+    this.applicationDuration = applicationDuration;
+  }
+
+  public PriceAlteration description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * A narrative that explains in detail the semantics of this order item price alteration
+   * @return description
+   **/
+  @Schema(description = "A narrative that explains in detail the semantics of this order item price alteration")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public PriceAlteration name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the order item price alteration
+   * @return name
+   **/
+  @Schema(description = "Name of the order item price alteration")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public PriceAlteration priceType(String priceType) {
+    this.priceType = priceType;
+    return this;
+  }
+
+  /**
+   * A category that describes the price such as recurring, one time and usage.
+   * @return priceType
+   **/
+  @Schema(required = true, description = "A category that describes the price such as recurring, one time and usage.")
+      @NotNull
+
+    public String getPriceType() {
+    return priceType;
+  }
+
+  public void setPriceType(String priceType) {
+    this.priceType = priceType;
+  }
+
+  public PriceAlteration priority(Integer priority) {
+    this.priority = priority;
+    return this;
+  }
+
+  /**
+   * Priority level for applying this alteration among all the defined alterations on the order item price
+   * @return priority
+   **/
+  @Schema(description = "Priority level for applying this alteration among all the defined alterations on the order item price")
+      @NotNull
+
+    public Integer getPriority() {
+    return priority;
+  }
+
+  public void setPriority(Integer priority) {
+    this.priority = priority;
+  }
+
+  public PriceAlteration recurringChargePeriod(String recurringChargePeriod) {
+    this.recurringChargePeriod = recurringChargePeriod;
+    return this;
+  }
+
+  /**
+   * Could be month, week...
+   * @return recurringChargePeriod
+   **/
+  @Schema(description = "Could be month, week...")
+      @NotNull
+
+    public String getRecurringChargePeriod() {
+    return recurringChargePeriod;
+  }
+
+  public void setRecurringChargePeriod(String recurringChargePeriod) {
+    this.recurringChargePeriod = recurringChargePeriod;
+  }
+
+  public PriceAlteration unitOfMeasure(String unitOfMeasure) {
+    this.unitOfMeasure = unitOfMeasure;
+    return this;
+  }
+
+  /**
+   * Could be minutes, GB...
+   * @return unitOfMeasure
+   **/
+  @Schema(description = "Could be minutes, GB...")
+      @NotNull
+
+    public String getUnitOfMeasure() {
+    return unitOfMeasure;
+  }
+
+  public void setUnitOfMeasure(String unitOfMeasure) {
+    this.unitOfMeasure = unitOfMeasure;
+  }
+
+  public PriceAlteration price(Price price) {
+    this.price = price;
+    return this;
+  }
+
+  /**
+   * Get price
+   * @return price
+   **/
+  @Schema(required = true, description = "")
+      @NotNull
+
+    @Valid
+    public Price getPrice() {
+    return price;
+  }
+
+  public void setPrice(Price price) {
+    this.price = price;
+  }
+
+  public PriceAlteration productOfferingPrice(ProductOfferingPriceRef productOfferingPrice) {
+    this.productOfferingPrice = productOfferingPrice;
+    return this;
+  }
+
+  /**
+   * Get productOfferingPrice
+   * @return productOfferingPrice
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductOfferingPriceRef getProductOfferingPrice() {
+    return productOfferingPrice;
+  }
+
+  public void setProductOfferingPrice(ProductOfferingPriceRef productOfferingPrice) {
+    this.productOfferingPrice = productOfferingPrice;
+  }
+
+  public PriceAlteration _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public PriceAlteration _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public PriceAlteration _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    PriceAlteration priceAlteration = (PriceAlteration) o;
+    return Objects.equals(this.applicationDuration, priceAlteration.applicationDuration) &&
+        Objects.equals(this.description, priceAlteration.description) &&
+        Objects.equals(this.name, priceAlteration.name) &&
+        Objects.equals(this.priceType, priceAlteration.priceType) &&
+        Objects.equals(this.priority, priceAlteration.priority) &&
+        Objects.equals(this.recurringChargePeriod, priceAlteration.recurringChargePeriod) &&
+        Objects.equals(this.unitOfMeasure, priceAlteration.unitOfMeasure) &&
+        Objects.equals(this.price, priceAlteration.price) &&
+        Objects.equals(this.productOfferingPrice, priceAlteration.productOfferingPrice) &&
+        Objects.equals(this._atBaseType, priceAlteration._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, priceAlteration._atSchemaLocation) &&
+        Objects.equals(this._atType, priceAlteration._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(applicationDuration, description, name, priceType, priority, recurringChargePeriod, unitOfMeasure, price, productOfferingPrice, _atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class PriceAlteration {\n");
+    
+    sb.append("    applicationDuration: ").append(toIndentedString(applicationDuration)).append("\n");
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    priceType: ").append(toIndentedString(priceType)).append("\n");
+    sb.append("    priority: ").append(toIndentedString(priority)).append("\n");
+    sb.append("    recurringChargePeriod: ").append(toIndentedString(recurringChargePeriod)).append("\n");
+    sb.append("    unitOfMeasure: ").append(toIndentedString(unitOfMeasure)).append("\n");
+    sb.append("    price: ").append(toIndentedString(price)).append("\n");
+    sb.append("    productOfferingPrice: ").append(toIndentedString(productOfferingPrice)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/Product.java b/src/main/java/org/etsi/osl/tmf/pim637/model/Product.java
new file mode 100644
index 0000000000000000000000000000000000000000..edb686b64b15c58b23e0b3952cea349eefa75c32
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/Product.java
@@ -0,0 +1,869 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
+import org.etsi.osl.tmf.common.model.service.ResourceRef;
+import org.etsi.osl.tmf.common.model.service.ServiceRef;
+import org.etsi.osl.tmf.po622.model.AgreementItemRef;
+import org.etsi.osl.tmf.prm669.model.RelatedParty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * A product offering procured by a customer or other interested party playing a party role. A product is realized as one or more service(s) and / or resource(s).
+ */
+@Schema(description = "A product offering procured by a customer or other interested party playing a party role. A product is realized as one or more service(s) and / or resource(s).")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class Product   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("isBundle")
+  private Boolean isBundle = null;
+
+  @JsonProperty("isCustomerVisible")
+  private Boolean isCustomerVisible = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("orderDate")
+  private Date orderDate = null;
+
+  @JsonProperty("productSerialNumber")
+  private String productSerialNumber = null;
+
+  @JsonProperty("startDate")
+  private Date startDate = null;
+
+  @JsonProperty("terminationDate")
+  private Date terminationDate = null;
+
+  @JsonProperty("agreement")
+  @Valid
+  private List<AgreementItemRef> agreement = null;
+
+  @JsonProperty("billingAccount")
+  private BillingAccountRef billingAccount = null;
+
+  @JsonProperty("place")
+  @Valid
+  private List<RelatedPlaceRefOrValue> place = null;
+
+  @JsonProperty("product")
+  @Valid
+  private List<ProductRefOrValue> product = null;
+
+  @JsonProperty("productCharacteristic")
+  @Valid
+  private List<Characteristic> productCharacteristic = null;
+
+  @JsonProperty("productOffering")
+  private ProductOfferingRef productOffering = null;
+
+  @JsonProperty("productOrderItem")
+  @Valid
+  private List<RelatedProductOrderItem> productOrderItem = null;
+
+  @JsonProperty("productPrice")
+  @Valid
+  private List<ProductPrice> productPrice = null;
+
+  @JsonProperty("productRelationship")
+  @Valid
+  private List<ProductRelationship> productRelationship = null;
+
+  @JsonProperty("productSpecification")
+  private ProductSpecificationRef productSpecification = null;
+
+  @JsonProperty("productTerm")
+  @Valid
+  private List<ProductTerm> productTerm = null;
+
+  @JsonProperty("realizingResource")
+  @Valid
+  private List<ResourceRef> realizingResource = null;
+
+  @JsonProperty("realizingService")
+  @Valid
+  private List<ServiceRef> realizingService = null;
+
+  @JsonProperty("relatedParty")
+  @Valid
+  private List<RelatedParty> relatedParty = null;
+
+  @JsonProperty("status")
+  private ProductStatusType status = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public Product id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Unique identifier of the product
+   * @return id
+   **/
+  @Schema(description = "Unique identifier of the product")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public Product href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the product
+   * @return href
+   **/
+  @Schema(description = "Reference of the product")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public Product description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * Is the description of the product. It could be copied from the description of the Product Offering.
+   * @return description
+   **/
+  @Schema(description = "Is the description of the product. It could be copied from the description of the Product Offering.")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public Product isBundle(Boolean isBundle) {
+    this.isBundle = isBundle;
+    return this;
+  }
+
+  /**
+   * If true, the product is a ProductBundle which is an instantiation of a BundledProductOffering. If false, the product is a ProductComponent which is an instantiation of a SimpleProductOffering.
+   * @return isBundle
+   **/
+  @Schema(description = "If true, the product is a ProductBundle which is an instantiation of a BundledProductOffering. If false, the product is a ProductComponent which is an instantiation of a SimpleProductOffering.")
+      @NotNull
+
+    public Boolean isIsBundle() {
+    return isBundle;
+  }
+
+  public void setIsBundle(Boolean isBundle) {
+    this.isBundle = isBundle;
+  }
+
+  public Product isCustomerVisible(Boolean isCustomerVisible) {
+    this.isCustomerVisible = isCustomerVisible;
+    return this;
+  }
+
+  /**
+   * If true, the product is visible by the customer.
+   * @return isCustomerVisible
+   **/
+  @Schema(description = "If true, the product is visible by the customer.")
+      @NotNull
+
+    public Boolean isIsCustomerVisible() {
+    return isCustomerVisible;
+  }
+
+  public void setIsCustomerVisible(Boolean isCustomerVisible) {
+    this.isCustomerVisible = isCustomerVisible;
+  }
+
+  public Product name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the product. It could be the same as the name of the product offering
+   * @return name
+   **/
+  @Schema(description = "Name of the product. It could be the same as the name of the product offering")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public Product orderDate(Date orderDate) {
+    this.orderDate = orderDate;
+    return this;
+  }
+
+  /**
+   * Is the date when the product was ordered
+   * @return orderDate
+   **/
+  @Schema(description = "Is the date when the product was ordered")
+      @NotNull
+
+    @Valid
+    public Date getOrderDate() {
+    return orderDate;
+  }
+
+  public void setOrderDate(Date orderDate) {
+    this.orderDate = orderDate;
+  }
+
+  public Product productSerialNumber(String productSerialNumber) {
+    this.productSerialNumber = productSerialNumber;
+    return this;
+  }
+
+  /**
+   * Is the serial number for the product. This is typically applicable to tangible products e.g. Broadband Router.
+   * @return productSerialNumber
+   **/
+  @Schema(description = "Is the serial number for the product. This is typically applicable to tangible products e.g. Broadband Router.")
+      @NotNull
+
+    public String getProductSerialNumber() {
+    return productSerialNumber;
+  }
+
+  public void setProductSerialNumber(String productSerialNumber) {
+    this.productSerialNumber = productSerialNumber;
+  }
+
+  public Product startDate(Date startDate) {
+    this.startDate = startDate;
+    return this;
+  }
+
+  /**
+   * Is the date from which the product starts
+   * @return startDate
+   **/
+  @Schema(description = "Is the date from which the product starts")
+      @NotNull
+
+    @Valid
+    public Date getStartDate() {
+    return startDate;
+  }
+
+  public void setStartDate(Date startDate) {
+    this.startDate = startDate;
+  }
+
+  public Product terminationDate(Date terminationDate) {
+    this.terminationDate = terminationDate;
+    return this;
+  }
+
+  /**
+   * Is the date when the product was terminated
+   * @return terminationDate
+   **/
+  @Schema(description = "Is the date when the product was terminated")
+      @NotNull
+
+    @Valid
+    public Date getTerminationDate() {
+    return terminationDate;
+  }
+
+  public void setTerminationDate(Date terminationDate) {
+    this.terminationDate = terminationDate;
+  }
+
+  public Product agreement(List<AgreementItemRef> agreement) {
+    this.agreement = agreement;
+    return this;
+  }
+
+  public Product addAgreementItem(AgreementItemRef agreementItem) {
+    if (this.agreement == null) {
+      this.agreement = new ArrayList<AgreementItemRef>();
+    }
+    this.agreement.add(agreementItem);
+    return this;
+  }
+
+  /**
+   * Get agreement
+   * @return agreement
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<AgreementItemRef> getAgreement() {
+    return agreement;
+  }
+
+  public void setAgreement(List<AgreementItemRef> agreement) {
+    this.agreement = agreement;
+  }
+
+  public Product billingAccount(BillingAccountRef billingAccount) {
+    this.billingAccount = billingAccount;
+    return this;
+  }
+
+  /**
+   * Get billingAccount
+   * @return billingAccount
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public BillingAccountRef getBillingAccount() {
+    return billingAccount;
+  }
+
+  public void setBillingAccount(BillingAccountRef billingAccount) {
+    this.billingAccount = billingAccount;
+  }
+
+  public Product place(List<RelatedPlaceRefOrValue> place) {
+    this.place = place;
+    return this;
+  }
+
+  public Product addPlaceItem(RelatedPlaceRefOrValue placeItem) {
+    if (this.place == null) {
+      this.place = new ArrayList<RelatedPlaceRefOrValue>();
+    }
+    this.place.add(placeItem);
+    return this;
+  }
+
+  /**
+   * Get place
+   * @return place
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedPlaceRefOrValue> getPlace() {
+    return place;
+  }
+
+  public void setPlace(List<RelatedPlaceRefOrValue> place) {
+    this.place = place;
+  }
+
+  public Product product(List<ProductRefOrValue> product) {
+    this.product = product;
+    return this;
+  }
+
+  public Product addProductItem(ProductRefOrValue productItem) {
+    if (this.product == null) {
+      this.product = new ArrayList<ProductRefOrValue>();
+    }
+    this.product.add(productItem);
+    return this;
+  }
+
+  /**
+   * Get product
+   * @return product
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductRefOrValue> getProduct() {
+    return product;
+  }
+
+  public void setProduct(List<ProductRefOrValue> product) {
+    this.product = product;
+  }
+
+  public Product productCharacteristic(List<Characteristic> productCharacteristic) {
+    this.productCharacteristic = productCharacteristic;
+    return this;
+  }
+
+  public Product addProductCharacteristicItem(Characteristic productCharacteristicItem) {
+    if (this.productCharacteristic == null) {
+      this.productCharacteristic = new ArrayList<Characteristic>();
+    }
+    this.productCharacteristic.add(productCharacteristicItem);
+    return this;
+  }
+
+  /**
+   * Get productCharacteristic
+   * @return productCharacteristic
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<Characteristic> getProductCharacteristic() {
+    return productCharacteristic;
+  }
+
+  public void setProductCharacteristic(List<Characteristic> productCharacteristic) {
+    this.productCharacteristic = productCharacteristic;
+  }
+
+  public Product productOffering(ProductOfferingRef productOffering) {
+    this.productOffering = productOffering;
+    return this;
+  }
+
+  /**
+   * Get productOffering
+   * @return productOffering
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductOfferingRef getProductOffering() {
+    return productOffering;
+  }
+
+  public void setProductOffering(ProductOfferingRef productOffering) {
+    this.productOffering = productOffering;
+  }
+
+  public Product productOrderItem(List<RelatedProductOrderItem> productOrderItem) {
+    this.productOrderItem = productOrderItem;
+    return this;
+  }
+
+  public Product addProductOrderItemItem(RelatedProductOrderItem productOrderItemItem) {
+    if (this.productOrderItem == null) {
+      this.productOrderItem = new ArrayList<RelatedProductOrderItem>();
+    }
+    this.productOrderItem.add(productOrderItemItem);
+    return this;
+  }
+
+  /**
+   * Get productOrderItem
+   * @return productOrderItem
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedProductOrderItem> getProductOrderItem() {
+    return productOrderItem;
+  }
+
+  public void setProductOrderItem(List<RelatedProductOrderItem> productOrderItem) {
+    this.productOrderItem = productOrderItem;
+  }
+
+  public Product productPrice(List<ProductPrice> productPrice) {
+    this.productPrice = productPrice;
+    return this;
+  }
+
+  public Product addProductPriceItem(ProductPrice productPriceItem) {
+    if (this.productPrice == null) {
+      this.productPrice = new ArrayList<ProductPrice>();
+    }
+    this.productPrice.add(productPriceItem);
+    return this;
+  }
+
+  /**
+   * Get productPrice
+   * @return productPrice
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductPrice> getProductPrice() {
+    return productPrice;
+  }
+
+  public void setProductPrice(List<ProductPrice> productPrice) {
+    this.productPrice = productPrice;
+  }
+
+  public Product productRelationship(List<ProductRelationship> productRelationship) {
+    this.productRelationship = productRelationship;
+    return this;
+  }
+
+  public Product addProductRelationshipItem(ProductRelationship productRelationshipItem) {
+    if (this.productRelationship == null) {
+      this.productRelationship = new ArrayList<ProductRelationship>();
+    }
+    this.productRelationship.add(productRelationshipItem);
+    return this;
+  }
+
+  /**
+   * Get productRelationship
+   * @return productRelationship
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductRelationship> getProductRelationship() {
+    return productRelationship;
+  }
+
+  public void setProductRelationship(List<ProductRelationship> productRelationship) {
+    this.productRelationship = productRelationship;
+  }
+
+  public Product productSpecification(ProductSpecificationRef productSpecification) {
+    this.productSpecification = productSpecification;
+    return this;
+  }
+
+  /**
+   * Get productSpecification
+   * @return productSpecification
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductSpecificationRef getProductSpecification() {
+    return productSpecification;
+  }
+
+  public void setProductSpecification(ProductSpecificationRef productSpecification) {
+    this.productSpecification = productSpecification;
+  }
+
+  public Product productTerm(List<ProductTerm> productTerm) {
+    this.productTerm = productTerm;
+    return this;
+  }
+
+  public Product addProductTermItem(ProductTerm productTermItem) {
+    if (this.productTerm == null) {
+      this.productTerm = new ArrayList<ProductTerm>();
+    }
+    this.productTerm.add(productTermItem);
+    return this;
+  }
+
+  /**
+   * Get productTerm
+   * @return productTerm
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductTerm> getProductTerm() {
+    return productTerm;
+  }
+
+  public void setProductTerm(List<ProductTerm> productTerm) {
+    this.productTerm = productTerm;
+  }
+
+  public Product realizingResource(List<ResourceRef> realizingResource) {
+    this.realizingResource = realizingResource;
+    return this;
+  }
+
+  public Product addRealizingResourceItem(ResourceRef realizingResourceItem) {
+    if (this.realizingResource == null) {
+      this.realizingResource = new ArrayList<ResourceRef>();
+    }
+    this.realizingResource.add(realizingResourceItem);
+    return this;
+  }
+
+  /**
+   * Get realizingResource
+   * @return realizingResource
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ResourceRef> getRealizingResource() {
+    return realizingResource;
+  }
+
+  public void setRealizingResource(List<ResourceRef> realizingResource) {
+    this.realizingResource = realizingResource;
+  }
+
+  public Product realizingService(List<ServiceRef> realizingService) {
+    this.realizingService = realizingService;
+    return this;
+  }
+
+  public Product addRealizingServiceItem(ServiceRef realizingServiceItem) {
+    if (this.realizingService == null) {
+      this.realizingService = new ArrayList<ServiceRef>();
+    }
+    this.realizingService.add(realizingServiceItem);
+    return this;
+  }
+
+  /**
+   * Get realizingService
+   * @return realizingService
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ServiceRef> getRealizingService() {
+    return realizingService;
+  }
+
+  public void setRealizingService(List<ServiceRef> realizingService) {
+    this.realizingService = realizingService;
+  }
+
+  public Product relatedParty(List<RelatedParty> relatedParty) {
+    this.relatedParty = relatedParty;
+    return this;
+  }
+
+  public Product addRelatedPartyItem(RelatedParty relatedPartyItem) {
+    if (this.relatedParty == null) {
+      this.relatedParty = new ArrayList<RelatedParty>();
+    }
+    this.relatedParty.add(relatedPartyItem);
+    return this;
+  }
+
+  /**
+   * Get relatedParty
+   * @return relatedParty
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedParty> getRelatedParty() {
+    return relatedParty;
+  }
+
+  public void setRelatedParty(List<RelatedParty> relatedParty) {
+    this.relatedParty = relatedParty;
+  }
+
+  public Product status(ProductStatusType status) {
+    this.status = status;
+    return this;
+  }
+
+  /**
+   * Get status
+   * @return status
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductStatusType getStatus() {
+    return status;
+  }
+
+  public void setStatus(ProductStatusType status) {
+    this.status = status;
+  }
+
+  public Product _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public Product _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public Product _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    Product product = (Product) o;
+    return Objects.equals(this.id, product.id) &&
+        Objects.equals(this.href, product.href) &&
+        Objects.equals(this.description, product.description) &&
+        Objects.equals(this.isBundle, product.isBundle) &&
+        Objects.equals(this.isCustomerVisible, product.isCustomerVisible) &&
+        Objects.equals(this.name, product.name) &&
+        Objects.equals(this.orderDate, product.orderDate) &&
+        Objects.equals(this.productSerialNumber, product.productSerialNumber) &&
+        Objects.equals(this.startDate, product.startDate) &&
+        Objects.equals(this.terminationDate, product.terminationDate) &&
+        Objects.equals(this.agreement, product.agreement) &&
+        Objects.equals(this.billingAccount, product.billingAccount) &&
+        Objects.equals(this.place, product.place) &&
+        Objects.equals(this.product, product.product) &&
+        Objects.equals(this.productCharacteristic, product.productCharacteristic) &&
+        Objects.equals(this.productOffering, product.productOffering) &&
+        Objects.equals(this.productOrderItem, product.productOrderItem) &&
+        Objects.equals(this.productPrice, product.productPrice) &&
+        Objects.equals(this.productRelationship, product.productRelationship) &&
+        Objects.equals(this.productSpecification, product.productSpecification) &&
+        Objects.equals(this.productTerm, product.productTerm) &&
+        Objects.equals(this.realizingResource, product.realizingResource) &&
+        Objects.equals(this.realizingService, product.realizingService) &&
+        Objects.equals(this.relatedParty, product.relatedParty) &&
+        Objects.equals(this.status, product.status) &&
+        Objects.equals(this._atBaseType, product._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, product._atSchemaLocation) &&
+        Objects.equals(this._atType, product._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, description, isBundle, isCustomerVisible, name, orderDate, productSerialNumber, startDate, terminationDate, agreement, billingAccount, place, product, productCharacteristic, productOffering, productOrderItem, productPrice, productRelationship, productSpecification, productTerm, realizingResource, realizingService, relatedParty, status, _atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class Product {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    isBundle: ").append(toIndentedString(isBundle)).append("\n");
+    sb.append("    isCustomerVisible: ").append(toIndentedString(isCustomerVisible)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    orderDate: ").append(toIndentedString(orderDate)).append("\n");
+    sb.append("    productSerialNumber: ").append(toIndentedString(productSerialNumber)).append("\n");
+    sb.append("    startDate: ").append(toIndentedString(startDate)).append("\n");
+    sb.append("    terminationDate: ").append(toIndentedString(terminationDate)).append("\n");
+    sb.append("    agreement: ").append(toIndentedString(agreement)).append("\n");
+    sb.append("    billingAccount: ").append(toIndentedString(billingAccount)).append("\n");
+    sb.append("    place: ").append(toIndentedString(place)).append("\n");
+    sb.append("    product: ").append(toIndentedString(product)).append("\n");
+    sb.append("    productCharacteristic: ").append(toIndentedString(productCharacteristic)).append("\n");
+    sb.append("    productOffering: ").append(toIndentedString(productOffering)).append("\n");
+    sb.append("    productOrderItem: ").append(toIndentedString(productOrderItem)).append("\n");
+    sb.append("    productPrice: ").append(toIndentedString(productPrice)).append("\n");
+    sb.append("    productRelationship: ").append(toIndentedString(productRelationship)).append("\n");
+    sb.append("    productSpecification: ").append(toIndentedString(productSpecification)).append("\n");
+    sb.append("    productTerm: ").append(toIndentedString(productTerm)).append("\n");
+    sb.append("    realizingResource: ").append(toIndentedString(realizingResource)).append("\n");
+    sb.append("    realizingService: ").append(toIndentedString(realizingService)).append("\n");
+    sb.append("    relatedParty: ").append(toIndentedString(relatedParty)).append("\n");
+    sb.append("    status: ").append(toIndentedString(status)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductAttributeValueChangeEvent.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductAttributeValueChangeEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..3511cd102a2deaba2a14284dcce462b629004f37
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductAttributeValueChangeEvent.java
@@ -0,0 +1,334 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Date;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The notification data structure
+ */
+@Schema(description = "The notification data structure")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductAttributeValueChangeEvent   {
+  @JsonProperty("eventId")
+  private String eventId = null;
+
+  @JsonProperty("eventTime")
+  private Date eventTime = null;
+
+  @JsonProperty("eventType")
+  private String eventType = null;
+
+  @JsonProperty("correlationId")
+  private String correlationId = null;
+
+  @JsonProperty("domain")
+  private String domain = null;
+
+  @JsonProperty("title")
+  private String title = null;
+
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("priority")
+  private String priority = null;
+
+  @JsonProperty("timeOcurred")
+  private Date timeOcurred = null;
+
+  @JsonProperty("fieldPath")
+  private String fieldPath = null;
+
+  @JsonProperty("event")
+  private ProductAttributeValueChangeEventPayload event = null;
+
+  public ProductAttributeValueChangeEvent eventId(String eventId) {
+    this.eventId = eventId;
+    return this;
+  }
+
+  /**
+   * The identifier of the notification.
+   * @return eventId
+   **/
+  @Schema(description = "The identifier of the notification.")
+      @NotNull
+
+    public String getEventId() {
+    return eventId;
+  }
+
+  public void setEventId(String eventId) {
+    this.eventId = eventId;
+  }
+
+  public ProductAttributeValueChangeEvent eventTime(Date eventTime) {
+    this.eventTime = eventTime;
+    return this;
+  }
+
+  /**
+   * Time of the event occurrence.
+   * @return eventTime
+   **/
+  @Schema(description = "Time of the event occurrence.")
+      @NotNull
+
+    @Valid
+    public Date getEventTime() {
+    return eventTime;
+  }
+
+  public void setEventTime(Date eventTime) {
+    this.eventTime = eventTime;
+  }
+
+  public ProductAttributeValueChangeEvent eventType(String eventType) {
+    this.eventType = eventType;
+    return this;
+  }
+
+  /**
+   * The type of the notification.
+   * @return eventType
+   **/
+  @Schema(description = "The type of the notification.")
+      @NotNull
+
+    public String getEventType() {
+    return eventType;
+  }
+
+  public void setEventType(String eventType) {
+    this.eventType = eventType;
+  }
+
+  public ProductAttributeValueChangeEvent correlationId(String correlationId) {
+    this.correlationId = correlationId;
+    return this;
+  }
+
+  /**
+   * The correlation id for this event.
+   * @return correlationId
+   **/
+  @Schema(description = "The correlation id for this event.")
+      @NotNull
+
+    public String getCorrelationId() {
+    return correlationId;
+  }
+
+  public void setCorrelationId(String correlationId) {
+    this.correlationId = correlationId;
+  }
+
+  public ProductAttributeValueChangeEvent domain(String domain) {
+    this.domain = domain;
+    return this;
+  }
+
+  /**
+   * The domain of the event.
+   * @return domain
+   **/
+  @Schema(description = "The domain of the event.")
+      @NotNull
+
+    public String getDomain() {
+    return domain;
+  }
+
+  public void setDomain(String domain) {
+    this.domain = domain;
+  }
+
+  public ProductAttributeValueChangeEvent title(String title) {
+    this.title = title;
+    return this;
+  }
+
+  /**
+   * The title of the event.
+   * @return title
+   **/
+  @Schema(description = "The title of the event.")
+      @NotNull
+
+    public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  public ProductAttributeValueChangeEvent description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * An explnatory of the event.
+   * @return description
+   **/
+  @Schema(description = "An explnatory of the event.")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public ProductAttributeValueChangeEvent priority(String priority) {
+    this.priority = priority;
+    return this;
+  }
+
+  /**
+   * A priority.
+   * @return priority
+   **/
+  @Schema(description = "A priority.")
+      @NotNull
+
+    public String getPriority() {
+    return priority;
+  }
+
+  public void setPriority(String priority) {
+    this.priority = priority;
+  }
+
+  public ProductAttributeValueChangeEvent timeOcurred(Date timeOcurred) {
+    this.timeOcurred = timeOcurred;
+    return this;
+  }
+
+  /**
+   * The time the event occured.
+   * @return timeOcurred
+   **/
+  @Schema(description = "The time the event occured.")
+      @NotNull
+
+    @Valid
+    public Date getTimeOcurred() {
+    return timeOcurred;
+  }
+
+  public void setTimeOcurred(Date timeOcurred) {
+    this.timeOcurred = timeOcurred;
+  }
+
+  public ProductAttributeValueChangeEvent fieldPath(String fieldPath) {
+    this.fieldPath = fieldPath;
+    return this;
+  }
+
+  /**
+   * The path identifying the object field concerned by this notification.
+   * @return fieldPath
+   **/
+  @Schema(description = "The path identifying the object field concerned by this notification.")
+      @NotNull
+
+    public String getFieldPath() {
+    return fieldPath;
+  }
+
+  public void setFieldPath(String fieldPath) {
+    this.fieldPath = fieldPath;
+  }
+
+  public ProductAttributeValueChangeEvent event(ProductAttributeValueChangeEventPayload event) {
+    this.event = event;
+    return this;
+  }
+
+  /**
+   * Get event
+   * @return event
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductAttributeValueChangeEventPayload getEvent() {
+    return event;
+  }
+
+  public void setEvent(ProductAttributeValueChangeEventPayload event) {
+    this.event = event;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductAttributeValueChangeEvent productAttributeValueChangeEvent = (ProductAttributeValueChangeEvent) o;
+    return Objects.equals(this.eventId, productAttributeValueChangeEvent.eventId) &&
+        Objects.equals(this.eventTime, productAttributeValueChangeEvent.eventTime) &&
+        Objects.equals(this.eventType, productAttributeValueChangeEvent.eventType) &&
+        Objects.equals(this.correlationId, productAttributeValueChangeEvent.correlationId) &&
+        Objects.equals(this.domain, productAttributeValueChangeEvent.domain) &&
+        Objects.equals(this.title, productAttributeValueChangeEvent.title) &&
+        Objects.equals(this.description, productAttributeValueChangeEvent.description) &&
+        Objects.equals(this.priority, productAttributeValueChangeEvent.priority) &&
+        Objects.equals(this.timeOcurred, productAttributeValueChangeEvent.timeOcurred) &&
+        Objects.equals(this.fieldPath, productAttributeValueChangeEvent.fieldPath) &&
+        Objects.equals(this.event, productAttributeValueChangeEvent.event);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(eventId, eventTime, eventType, correlationId, domain, title, description, priority, timeOcurred, fieldPath, event);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductAttributeValueChangeEvent {\n");
+    
+    sb.append("    eventId: ").append(toIndentedString(eventId)).append("\n");
+    sb.append("    eventTime: ").append(toIndentedString(eventTime)).append("\n");
+    sb.append("    eventType: ").append(toIndentedString(eventType)).append("\n");
+    sb.append("    correlationId: ").append(toIndentedString(correlationId)).append("\n");
+    sb.append("    domain: ").append(toIndentedString(domain)).append("\n");
+    sb.append("    title: ").append(toIndentedString(title)).append("\n");
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    priority: ").append(toIndentedString(priority)).append("\n");
+    sb.append("    timeOcurred: ").append(toIndentedString(timeOcurred)).append("\n");
+    sb.append("    fieldPath: ").append(toIndentedString(fieldPath)).append("\n");
+    sb.append("    event: ").append(toIndentedString(event)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductAttributeValueChangeEventPayload.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductAttributeValueChangeEventPayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..50b4c3a7e50f08d4d7cfc69eebf07b154b359375
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductAttributeValueChangeEventPayload.java
@@ -0,0 +1,81 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The event data structure
+ */
+@Schema(description = "The event data structure")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductAttributeValueChangeEventPayload   {
+  @JsonProperty("product")
+  private Product product = null;
+
+  public ProductAttributeValueChangeEventPayload product(Product product) {
+    this.product = product;
+    return this;
+  }
+
+  /**
+   * Get product
+   * @return product
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public Product getProduct() {
+    return product;
+  }
+
+  public void setProduct(Product product) {
+    this.product = product;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductAttributeValueChangeEventPayload productAttributeValueChangeEventPayload = (ProductAttributeValueChangeEventPayload) o;
+    return Objects.equals(this.product, productAttributeValueChangeEventPayload.product);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(product);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductAttributeValueChangeEventPayload {\n");
+    
+    sb.append("    product: ").append(toIndentedString(product)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductBatchEvent.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductBatchEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..f1a1186c6e1ff9f101236083098a156bd358208b
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductBatchEvent.java
@@ -0,0 +1,359 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Date;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The notification data structure
+ */
+@Schema(description = "The notification data structure")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductBatchEvent   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("eventId")
+  private String eventId = null;
+
+  @JsonProperty("eventTime")
+  private Date eventTime = null;
+
+  @JsonProperty("eventType")
+  private String eventType = null;
+
+  @JsonProperty("correlationId")
+  private String correlationId = null;
+
+  @JsonProperty("domain")
+  private String domain = null;
+
+  @JsonProperty("title")
+  private String title = null;
+
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("priority")
+  private String priority = null;
+
+  @JsonProperty("timeOcurred")
+  private Date timeOcurred = null;
+
+  @JsonProperty("event")
+  private ProductBatchEventPayload event = null;
+
+  public ProductBatchEvent id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Identifier of the Process flow
+   * @return id
+   **/
+  @Schema(description = "Identifier of the Process flow")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public ProductBatchEvent href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the ProcessFlow
+   * @return href
+   **/
+  @Schema(description = "Reference of the ProcessFlow")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public ProductBatchEvent eventId(String eventId) {
+    this.eventId = eventId;
+    return this;
+  }
+
+  /**
+   * The identifier of the notification.
+   * @return eventId
+   **/
+  @Schema(description = "The identifier of the notification.")
+      @NotNull
+
+    public String getEventId() {
+    return eventId;
+  }
+
+  public void setEventId(String eventId) {
+    this.eventId = eventId;
+  }
+
+  public ProductBatchEvent eventTime(Date eventTime) {
+    this.eventTime = eventTime;
+    return this;
+  }
+
+  /**
+   * Time of the event occurrence.
+   * @return eventTime
+   **/
+  @Schema(description = "Time of the event occurrence.")
+      @NotNull
+
+    @Valid
+    public Date getEventTime() {
+    return eventTime;
+  }
+
+  public void setEventTime(Date eventTime) {
+    this.eventTime = eventTime;
+  }
+
+  public ProductBatchEvent eventType(String eventType) {
+    this.eventType = eventType;
+    return this;
+  }
+
+  /**
+   * The type of the notification.
+   * @return eventType
+   **/
+  @Schema(description = "The type of the notification.")
+      @NotNull
+
+    public String getEventType() {
+    return eventType;
+  }
+
+  public void setEventType(String eventType) {
+    this.eventType = eventType;
+  }
+
+  public ProductBatchEvent correlationId(String correlationId) {
+    this.correlationId = correlationId;
+    return this;
+  }
+
+  /**
+   * The correlation id for this event.
+   * @return correlationId
+   **/
+  @Schema(description = "The correlation id for this event.")
+      @NotNull
+
+    public String getCorrelationId() {
+    return correlationId;
+  }
+
+  public void setCorrelationId(String correlationId) {
+    this.correlationId = correlationId;
+  }
+
+  public ProductBatchEvent domain(String domain) {
+    this.domain = domain;
+    return this;
+  }
+
+  /**
+   * The domain of the event.
+   * @return domain
+   **/
+  @Schema(description = "The domain of the event.")
+      @NotNull
+
+    public String getDomain() {
+    return domain;
+  }
+
+  public void setDomain(String domain) {
+    this.domain = domain;
+  }
+
+  public ProductBatchEvent title(String title) {
+    this.title = title;
+    return this;
+  }
+
+  /**
+   * The title of the event.
+   * @return title
+   **/
+  @Schema(description = "The title of the event.")
+      @NotNull
+
+    public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  public ProductBatchEvent description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * An explnatory of the event.
+   * @return description
+   **/
+  @Schema(description = "An explnatory of the event.")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public ProductBatchEvent priority(String priority) {
+    this.priority = priority;
+    return this;
+  }
+
+  /**
+   * A priority.
+   * @return priority
+   **/
+  @Schema(description = "A priority.")
+      @NotNull
+
+    public String getPriority() {
+    return priority;
+  }
+
+  public void setPriority(String priority) {
+    this.priority = priority;
+  }
+
+  public ProductBatchEvent timeOcurred(Date timeOcurred) {
+    this.timeOcurred = timeOcurred;
+    return this;
+  }
+
+  /**
+   * The time the event occured.
+   * @return timeOcurred
+   **/
+  @Schema(description = "The time the event occured.")
+      @NotNull
+
+    @Valid
+    public Date getTimeOcurred() {
+    return timeOcurred;
+  }
+
+  public void setTimeOcurred(Date timeOcurred) {
+    this.timeOcurred = timeOcurred;
+  }
+
+  public ProductBatchEvent event(ProductBatchEventPayload event) {
+    this.event = event;
+    return this;
+  }
+
+  /**
+   * Get event
+   * @return event
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductBatchEventPayload getEvent() {
+    return event;
+  }
+
+  public void setEvent(ProductBatchEventPayload event) {
+    this.event = event;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductBatchEvent productBatchEvent = (ProductBatchEvent) o;
+    return Objects.equals(this.id, productBatchEvent.id) &&
+        Objects.equals(this.href, productBatchEvent.href) &&
+        Objects.equals(this.eventId, productBatchEvent.eventId) &&
+        Objects.equals(this.eventTime, productBatchEvent.eventTime) &&
+        Objects.equals(this.eventType, productBatchEvent.eventType) &&
+        Objects.equals(this.correlationId, productBatchEvent.correlationId) &&
+        Objects.equals(this.domain, productBatchEvent.domain) &&
+        Objects.equals(this.title, productBatchEvent.title) &&
+        Objects.equals(this.description, productBatchEvent.description) &&
+        Objects.equals(this.priority, productBatchEvent.priority) &&
+        Objects.equals(this.timeOcurred, productBatchEvent.timeOcurred) &&
+        Objects.equals(this.event, productBatchEvent.event);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, eventId, eventTime, eventType, correlationId, domain, title, description, priority, timeOcurred, event);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductBatchEvent {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    eventId: ").append(toIndentedString(eventId)).append("\n");
+    sb.append("    eventTime: ").append(toIndentedString(eventTime)).append("\n");
+    sb.append("    eventType: ").append(toIndentedString(eventType)).append("\n");
+    sb.append("    correlationId: ").append(toIndentedString(correlationId)).append("\n");
+    sb.append("    domain: ").append(toIndentedString(domain)).append("\n");
+    sb.append("    title: ").append(toIndentedString(title)).append("\n");
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    priority: ").append(toIndentedString(priority)).append("\n");
+    sb.append("    timeOcurred: ").append(toIndentedString(timeOcurred)).append("\n");
+    sb.append("    event: ").append(toIndentedString(event)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductBatchEventPayload.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductBatchEventPayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..e90831cb7692e047a22b32a00dc85deb485e546f
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductBatchEventPayload.java
@@ -0,0 +1,81 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The event data structure
+ */
+@Schema(description = "The event data structure")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductBatchEventPayload   {
+  @JsonProperty("product")
+  private Product product = null;
+
+  public ProductBatchEventPayload product(Product product) {
+    this.product = product;
+    return this;
+  }
+
+  /**
+   * Get product
+   * @return product
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public Product getProduct() {
+    return product;
+  }
+
+  public void setProduct(Product product) {
+    this.product = product;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductBatchEventPayload productBatchEventPayload = (ProductBatchEventPayload) o;
+    return Objects.equals(this.product, productBatchEventPayload.product);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(product);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductBatchEventPayload {\n");
+    
+    sb.append("    product: ").append(toIndentedString(product)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductCreate.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductCreate.java
new file mode 100644
index 0000000000000000000000000000000000000000..571957c84db23548bc76e1d4b4293864824f2417
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductCreate.java
@@ -0,0 +1,819 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
+import org.etsi.osl.tmf.common.model.service.ResourceRef;
+import org.etsi.osl.tmf.common.model.service.ServiceRef;
+import org.etsi.osl.tmf.po622.model.AgreementItemRef;
+import org.etsi.osl.tmf.prm669.model.RelatedParty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * A product offering procured by a customer or other interested party playing a party role. A product is realized as one or more service(s) and / or resource(s). Skipped properties: id,href
+ */
+@Schema(description = "A product offering procured by a customer or other interested party playing a party role. A product is realized as one or more service(s) and / or resource(s). Skipped properties: id,href")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductCreate   {
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("isBundle")
+  private Boolean isBundle = null;
+
+  @JsonProperty("isCustomerVisible")
+  private Boolean isCustomerVisible = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("orderDate")
+  private Date orderDate = null;
+
+  @JsonProperty("productSerialNumber")
+  private String productSerialNumber = null;
+
+  @JsonProperty("startDate")
+  private Date startDate = null;
+
+  @JsonProperty("terminationDate")
+  private Date terminationDate = null;
+
+  @JsonProperty("agreement")
+  @Valid
+  private List<AgreementItemRef> agreement = null;
+
+  @JsonProperty("billingAccount")
+  private BillingAccountRef billingAccount = null;
+
+  @JsonProperty("place")
+  @Valid
+  private List<RelatedPlaceRefOrValue> place = null;
+
+  @JsonProperty("product")
+  @Valid
+  private List<ProductRefOrValue> product = null;
+
+  @JsonProperty("productCharacteristic")
+  @Valid
+  private List<Characteristic> productCharacteristic = null;
+
+  @JsonProperty("productOffering")
+  private ProductOfferingRef productOffering = null;
+
+  @JsonProperty("productOrderItem")
+  @Valid
+  private List<RelatedProductOrderItem> productOrderItem = null;
+
+  @JsonProperty("productPrice")
+  @Valid
+  private List<ProductPrice> productPrice = null;
+
+  @JsonProperty("productRelationship")
+  @Valid
+  private List<ProductRelationship> productRelationship = null;
+
+  @JsonProperty("productSpecification")
+  private ProductSpecificationRef productSpecification = null;
+
+  @JsonProperty("productTerm")
+  @Valid
+  private List<ProductTerm> productTerm = null;
+
+  @JsonProperty("realizingResource")
+  @Valid
+  private List<ResourceRef> realizingResource = null;
+
+  @JsonProperty("realizingService")
+  @Valid
+  private List<ServiceRef> realizingService = null;
+
+  @JsonProperty("relatedParty")
+  @Valid
+  private List<RelatedParty> relatedParty = null;
+
+  @JsonProperty("status")
+  private ProductStatusType status = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public ProductCreate description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * Is the description of the product. It could be copied from the description of the Product Offering.
+   * @return description
+   **/
+  @Schema(description = "Is the description of the product. It could be copied from the description of the Product Offering.")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public ProductCreate isBundle(Boolean isBundle) {
+    this.isBundle = isBundle;
+    return this;
+  }
+
+  /**
+   * If true, the product is a ProductBundle which is an instantiation of a BundledProductOffering. If false, the product is a ProductComponent which is an instantiation of a SimpleProductOffering.
+   * @return isBundle
+   **/
+  @Schema(description = "If true, the product is a ProductBundle which is an instantiation of a BundledProductOffering. If false, the product is a ProductComponent which is an instantiation of a SimpleProductOffering.")
+      @NotNull
+
+    public Boolean isIsBundle() {
+    return isBundle;
+  }
+
+  public void setIsBundle(Boolean isBundle) {
+    this.isBundle = isBundle;
+  }
+
+  public ProductCreate isCustomerVisible(Boolean isCustomerVisible) {
+    this.isCustomerVisible = isCustomerVisible;
+    return this;
+  }
+
+  /**
+   * If true, the product is visible by the customer.
+   * @return isCustomerVisible
+   **/
+  @Schema(description = "If true, the product is visible by the customer.")
+      @NotNull
+
+    public Boolean isIsCustomerVisible() {
+    return isCustomerVisible;
+  }
+
+  public void setIsCustomerVisible(Boolean isCustomerVisible) {
+    this.isCustomerVisible = isCustomerVisible;
+  }
+
+  public ProductCreate name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the product. It could be the same as the name of the product offering
+   * @return name
+   **/
+  @Schema(description = "Name of the product. It could be the same as the name of the product offering")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public ProductCreate orderDate(Date orderDate) {
+    this.orderDate = orderDate;
+    return this;
+  }
+
+  /**
+   * Is the date when the product was ordered
+   * @return orderDate
+   **/
+  @Schema(description = "Is the date when the product was ordered")
+      @NotNull
+
+    @Valid
+    public Date getOrderDate() {
+    return orderDate;
+  }
+
+  public void setOrderDate(Date orderDate) {
+    this.orderDate = orderDate;
+  }
+
+  public ProductCreate productSerialNumber(String productSerialNumber) {
+    this.productSerialNumber = productSerialNumber;
+    return this;
+  }
+
+  /**
+   * Is the serial number for the product. This is typically applicable to tangible products e.g. Broadband Router.
+   * @return productSerialNumber
+   **/
+  @Schema(description = "Is the serial number for the product. This is typically applicable to tangible products e.g. Broadband Router.")
+      @NotNull
+
+    public String getProductSerialNumber() {
+    return productSerialNumber;
+  }
+
+  public void setProductSerialNumber(String productSerialNumber) {
+    this.productSerialNumber = productSerialNumber;
+  }
+
+  public ProductCreate startDate(Date startDate) {
+    this.startDate = startDate;
+    return this;
+  }
+
+  /**
+   * Is the date from which the product starts
+   * @return startDate
+   **/
+  @Schema(description = "Is the date from which the product starts")
+      @NotNull
+
+    @Valid
+    public Date getStartDate() {
+    return startDate;
+  }
+
+  public void setStartDate(Date startDate) {
+    this.startDate = startDate;
+  }
+
+  public ProductCreate terminationDate(Date terminationDate) {
+    this.terminationDate = terminationDate;
+    return this;
+  }
+
+  /**
+   * Is the date when the product was terminated
+   * @return terminationDate
+   **/
+  @Schema(description = "Is the date when the product was terminated")
+      @NotNull
+
+    @Valid
+    public Date getTerminationDate() {
+    return terminationDate;
+  }
+
+  public void setTerminationDate(Date terminationDate) {
+    this.terminationDate = terminationDate;
+  }
+
+  public ProductCreate agreement(List<AgreementItemRef> agreement) {
+    this.agreement = agreement;
+    return this;
+  }
+
+  public ProductCreate addAgreementItem(AgreementItemRef agreementItem) {
+    if (this.agreement == null) {
+      this.agreement = new ArrayList<AgreementItemRef>();
+    }
+    this.agreement.add(agreementItem);
+    return this;
+  }
+
+  /**
+   * Get agreement
+   * @return agreement
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<AgreementItemRef> getAgreement() {
+    return agreement;
+  }
+
+  public void setAgreement(List<AgreementItemRef> agreement) {
+    this.agreement = agreement;
+  }
+
+  public ProductCreate billingAccount(BillingAccountRef billingAccount) {
+    this.billingAccount = billingAccount;
+    return this;
+  }
+
+  /**
+   * Get billingAccount
+   * @return billingAccount
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public BillingAccountRef getBillingAccount() {
+    return billingAccount;
+  }
+
+  public void setBillingAccount(BillingAccountRef billingAccount) {
+    this.billingAccount = billingAccount;
+  }
+
+  public ProductCreate place(List<RelatedPlaceRefOrValue> place) {
+    this.place = place;
+    return this;
+  }
+
+  public ProductCreate addPlaceItem(RelatedPlaceRefOrValue placeItem) {
+    if (this.place == null) {
+      this.place = new ArrayList<RelatedPlaceRefOrValue>();
+    }
+    this.place.add(placeItem);
+    return this;
+  }
+
+  /**
+   * Get place
+   * @return place
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedPlaceRefOrValue> getPlace() {
+    return place;
+  }
+
+  public void setPlace(List<RelatedPlaceRefOrValue> place) {
+    this.place = place;
+  }
+
+  public ProductCreate product(List<ProductRefOrValue> product) {
+    this.product = product;
+    return this;
+  }
+
+  public ProductCreate addProductItem(ProductRefOrValue productItem) {
+    if (this.product == null) {
+      this.product = new ArrayList<ProductRefOrValue>();
+    }
+    this.product.add(productItem);
+    return this;
+  }
+
+  /**
+   * Get product
+   * @return product
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductRefOrValue> getProduct() {
+    return product;
+  }
+
+  public void setProduct(List<ProductRefOrValue> product) {
+    this.product = product;
+  }
+
+  public ProductCreate productCharacteristic(List<Characteristic> productCharacteristic) {
+    this.productCharacteristic = productCharacteristic;
+    return this;
+  }
+
+  public ProductCreate addProductCharacteristicItem(Characteristic productCharacteristicItem) {
+    if (this.productCharacteristic == null) {
+      this.productCharacteristic = new ArrayList<Characteristic>();
+    }
+    this.productCharacteristic.add(productCharacteristicItem);
+    return this;
+  }
+
+  /**
+   * Get productCharacteristic
+   * @return productCharacteristic
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<Characteristic> getProductCharacteristic() {
+    return productCharacteristic;
+  }
+
+  public void setProductCharacteristic(List<Characteristic> productCharacteristic) {
+    this.productCharacteristic = productCharacteristic;
+  }
+
+  public ProductCreate productOffering(ProductOfferingRef productOffering) {
+    this.productOffering = productOffering;
+    return this;
+  }
+
+  /**
+   * Get productOffering
+   * @return productOffering
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductOfferingRef getProductOffering() {
+    return productOffering;
+  }
+
+  public void setProductOffering(ProductOfferingRef productOffering) {
+    this.productOffering = productOffering;
+  }
+
+  public ProductCreate productOrderItem(List<RelatedProductOrderItem> productOrderItem) {
+    this.productOrderItem = productOrderItem;
+    return this;
+  }
+
+  public ProductCreate addProductOrderItemItem(RelatedProductOrderItem productOrderItemItem) {
+    if (this.productOrderItem == null) {
+      this.productOrderItem = new ArrayList<RelatedProductOrderItem>();
+    }
+    this.productOrderItem.add(productOrderItemItem);
+    return this;
+  }
+
+  /**
+   * Get productOrderItem
+   * @return productOrderItem
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedProductOrderItem> getProductOrderItem() {
+    return productOrderItem;
+  }
+
+  public void setProductOrderItem(List<RelatedProductOrderItem> productOrderItem) {
+    this.productOrderItem = productOrderItem;
+  }
+
+  public ProductCreate productPrice(List<ProductPrice> productPrice) {
+    this.productPrice = productPrice;
+    return this;
+  }
+
+  public ProductCreate addProductPriceItem(ProductPrice productPriceItem) {
+    if (this.productPrice == null) {
+      this.productPrice = new ArrayList<ProductPrice>();
+    }
+    this.productPrice.add(productPriceItem);
+    return this;
+  }
+
+  /**
+   * Get productPrice
+   * @return productPrice
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductPrice> getProductPrice() {
+    return productPrice;
+  }
+
+  public void setProductPrice(List<ProductPrice> productPrice) {
+    this.productPrice = productPrice;
+  }
+
+  public ProductCreate productRelationship(List<ProductRelationship> productRelationship) {
+    this.productRelationship = productRelationship;
+    return this;
+  }
+
+  public ProductCreate addProductRelationshipItem(ProductRelationship productRelationshipItem) {
+    if (this.productRelationship == null) {
+      this.productRelationship = new ArrayList<ProductRelationship>();
+    }
+    this.productRelationship.add(productRelationshipItem);
+    return this;
+  }
+
+  /**
+   * Get productRelationship
+   * @return productRelationship
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductRelationship> getProductRelationship() {
+    return productRelationship;
+  }
+
+  public void setProductRelationship(List<ProductRelationship> productRelationship) {
+    this.productRelationship = productRelationship;
+  }
+
+  public ProductCreate productSpecification(ProductSpecificationRef productSpecification) {
+    this.productSpecification = productSpecification;
+    return this;
+  }
+
+  /**
+   * Get productSpecification
+   * @return productSpecification
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductSpecificationRef getProductSpecification() {
+    return productSpecification;
+  }
+
+  public void setProductSpecification(ProductSpecificationRef productSpecification) {
+    this.productSpecification = productSpecification;
+  }
+
+  public ProductCreate productTerm(List<ProductTerm> productTerm) {
+    this.productTerm = productTerm;
+    return this;
+  }
+
+  public ProductCreate addProductTermItem(ProductTerm productTermItem) {
+    if (this.productTerm == null) {
+      this.productTerm = new ArrayList<ProductTerm>();
+    }
+    this.productTerm.add(productTermItem);
+    return this;
+  }
+
+  /**
+   * Get productTerm
+   * @return productTerm
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductTerm> getProductTerm() {
+    return productTerm;
+  }
+
+  public void setProductTerm(List<ProductTerm> productTerm) {
+    this.productTerm = productTerm;
+  }
+
+  public ProductCreate realizingResource(List<ResourceRef> realizingResource) {
+    this.realizingResource = realizingResource;
+    return this;
+  }
+
+  public ProductCreate addRealizingResourceItem(ResourceRef realizingResourceItem) {
+    if (this.realizingResource == null) {
+      this.realizingResource = new ArrayList<ResourceRef>();
+    }
+    this.realizingResource.add(realizingResourceItem);
+    return this;
+  }
+
+  /**
+   * Get realizingResource
+   * @return realizingResource
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ResourceRef> getRealizingResource() {
+    return realizingResource;
+  }
+
+  public void setRealizingResource(List<ResourceRef> realizingResource) {
+    this.realizingResource = realizingResource;
+  }
+
+  public ProductCreate realizingService(List<ServiceRef> realizingService) {
+    this.realizingService = realizingService;
+    return this;
+  }
+
+  public ProductCreate addRealizingServiceItem(ServiceRef realizingServiceItem) {
+    if (this.realizingService == null) {
+      this.realizingService = new ArrayList<ServiceRef>();
+    }
+    this.realizingService.add(realizingServiceItem);
+    return this;
+  }
+
+  /**
+   * Get realizingService
+   * @return realizingService
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ServiceRef> getRealizingService() {
+    return realizingService;
+  }
+
+  public void setRealizingService(List<ServiceRef> realizingService) {
+    this.realizingService = realizingService;
+  }
+
+  public ProductCreate relatedParty(List<RelatedParty> relatedParty) {
+    this.relatedParty = relatedParty;
+    return this;
+  }
+
+  public ProductCreate addRelatedPartyItem(RelatedParty relatedPartyItem) {
+    if (this.relatedParty == null) {
+      this.relatedParty = new ArrayList<RelatedParty>();
+    }
+    this.relatedParty.add(relatedPartyItem);
+    return this;
+  }
+
+  /**
+   * Get relatedParty
+   * @return relatedParty
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedParty> getRelatedParty() {
+    return relatedParty;
+  }
+
+  public void setRelatedParty(List<RelatedParty> relatedParty) {
+    this.relatedParty = relatedParty;
+  }
+
+  public ProductCreate status(ProductStatusType status) {
+    this.status = status;
+    return this;
+  }
+
+  /**
+   * Get status
+   * @return status
+   **/
+  @Schema(required = true, description = "")
+      @NotNull
+
+    @Valid
+    public ProductStatusType getStatus() {
+    return status;
+  }
+
+  public void setStatus(ProductStatusType status) {
+    this.status = status;
+  }
+
+  public ProductCreate _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public ProductCreate _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public ProductCreate _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductCreate productCreate = (ProductCreate) o;
+    return Objects.equals(this.description, productCreate.description) &&
+        Objects.equals(this.isBundle, productCreate.isBundle) &&
+        Objects.equals(this.isCustomerVisible, productCreate.isCustomerVisible) &&
+        Objects.equals(this.name, productCreate.name) &&
+        Objects.equals(this.orderDate, productCreate.orderDate) &&
+        Objects.equals(this.productSerialNumber, productCreate.productSerialNumber) &&
+        Objects.equals(this.startDate, productCreate.startDate) &&
+        Objects.equals(this.terminationDate, productCreate.terminationDate) &&
+        Objects.equals(this.agreement, productCreate.agreement) &&
+        Objects.equals(this.billingAccount, productCreate.billingAccount) &&
+        Objects.equals(this.place, productCreate.place) &&
+        Objects.equals(this.product, productCreate.product) &&
+        Objects.equals(this.productCharacteristic, productCreate.productCharacteristic) &&
+        Objects.equals(this.productOffering, productCreate.productOffering) &&
+        Objects.equals(this.productOrderItem, productCreate.productOrderItem) &&
+        Objects.equals(this.productPrice, productCreate.productPrice) &&
+        Objects.equals(this.productRelationship, productCreate.productRelationship) &&
+        Objects.equals(this.productSpecification, productCreate.productSpecification) &&
+        Objects.equals(this.productTerm, productCreate.productTerm) &&
+        Objects.equals(this.realizingResource, productCreate.realizingResource) &&
+        Objects.equals(this.realizingService, productCreate.realizingService) &&
+        Objects.equals(this.relatedParty, productCreate.relatedParty) &&
+        Objects.equals(this.status, productCreate.status) &&
+        Objects.equals(this._atBaseType, productCreate._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, productCreate._atSchemaLocation) &&
+        Objects.equals(this._atType, productCreate._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(description, isBundle, isCustomerVisible, name, orderDate, productSerialNumber, startDate, terminationDate, agreement, billingAccount, place, product, productCharacteristic, productOffering, productOrderItem, productPrice, productRelationship, productSpecification, productTerm, realizingResource, realizingService, relatedParty, status, _atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductCreate {\n");
+    
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    isBundle: ").append(toIndentedString(isBundle)).append("\n");
+    sb.append("    isCustomerVisible: ").append(toIndentedString(isCustomerVisible)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    orderDate: ").append(toIndentedString(orderDate)).append("\n");
+    sb.append("    productSerialNumber: ").append(toIndentedString(productSerialNumber)).append("\n");
+    sb.append("    startDate: ").append(toIndentedString(startDate)).append("\n");
+    sb.append("    terminationDate: ").append(toIndentedString(terminationDate)).append("\n");
+    sb.append("    agreement: ").append(toIndentedString(agreement)).append("\n");
+    sb.append("    billingAccount: ").append(toIndentedString(billingAccount)).append("\n");
+    sb.append("    place: ").append(toIndentedString(place)).append("\n");
+    sb.append("    product: ").append(toIndentedString(product)).append("\n");
+    sb.append("    productCharacteristic: ").append(toIndentedString(productCharacteristic)).append("\n");
+    sb.append("    productOffering: ").append(toIndentedString(productOffering)).append("\n");
+    sb.append("    productOrderItem: ").append(toIndentedString(productOrderItem)).append("\n");
+    sb.append("    productPrice: ").append(toIndentedString(productPrice)).append("\n");
+    sb.append("    productRelationship: ").append(toIndentedString(productRelationship)).append("\n");
+    sb.append("    productSpecification: ").append(toIndentedString(productSpecification)).append("\n");
+    sb.append("    productTerm: ").append(toIndentedString(productTerm)).append("\n");
+    sb.append("    realizingResource: ").append(toIndentedString(realizingResource)).append("\n");
+    sb.append("    realizingService: ").append(toIndentedString(realizingService)).append("\n");
+    sb.append("    relatedParty: ").append(toIndentedString(relatedParty)).append("\n");
+    sb.append("    status: ").append(toIndentedString(status)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductCreateEvent.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductCreateEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..74731e4281f8abc8e9f7ffeb892e033f717f09fe
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductCreateEvent.java
@@ -0,0 +1,359 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Date;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The notification data structure
+ */
+@Schema(description = "The notification data structure")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductCreateEvent   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("eventId")
+  private String eventId = null;
+
+  @JsonProperty("eventTime")
+  private Date eventTime = null;
+
+  @JsonProperty("eventType")
+  private String eventType = null;
+
+  @JsonProperty("correlationId")
+  private String correlationId = null;
+
+  @JsonProperty("domain")
+  private String domain = null;
+
+  @JsonProperty("title")
+  private String title = null;
+
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("priority")
+  private String priority = null;
+
+  @JsonProperty("timeOcurred")
+  private Date timeOcurred = null;
+
+  @JsonProperty("event")
+  private ProductCreateEventPayload event = null;
+
+  public ProductCreateEvent id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Identifier of the Process flow
+   * @return id
+   **/
+  @Schema(description = "Identifier of the Process flow")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public ProductCreateEvent href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the ProcessFlow
+   * @return href
+   **/
+  @Schema(description = "Reference of the ProcessFlow")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public ProductCreateEvent eventId(String eventId) {
+    this.eventId = eventId;
+    return this;
+  }
+
+  /**
+   * The identifier of the notification.
+   * @return eventId
+   **/
+  @Schema(description = "The identifier of the notification.")
+      @NotNull
+
+    public String getEventId() {
+    return eventId;
+  }
+
+  public void setEventId(String eventId) {
+    this.eventId = eventId;
+  }
+
+  public ProductCreateEvent eventTime(Date eventTime) {
+    this.eventTime = eventTime;
+    return this;
+  }
+
+  /**
+   * Time of the event occurrence.
+   * @return eventTime
+   **/
+  @Schema(description = "Time of the event occurrence.")
+      @NotNull
+
+    @Valid
+    public Date getEventTime() {
+    return eventTime;
+  }
+
+  public void setEventTime(Date eventTime) {
+    this.eventTime = eventTime;
+  }
+
+  public ProductCreateEvent eventType(String eventType) {
+    this.eventType = eventType;
+    return this;
+  }
+
+  /**
+   * The type of the notification.
+   * @return eventType
+   **/
+  @Schema(description = "The type of the notification.")
+      @NotNull
+
+    public String getEventType() {
+    return eventType;
+  }
+
+  public void setEventType(String eventType) {
+    this.eventType = eventType;
+  }
+
+  public ProductCreateEvent correlationId(String correlationId) {
+    this.correlationId = correlationId;
+    return this;
+  }
+
+  /**
+   * The correlation id for this event.
+   * @return correlationId
+   **/
+  @Schema(description = "The correlation id for this event.")
+      @NotNull
+
+    public String getCorrelationId() {
+    return correlationId;
+  }
+
+  public void setCorrelationId(String correlationId) {
+    this.correlationId = correlationId;
+  }
+
+  public ProductCreateEvent domain(String domain) {
+    this.domain = domain;
+    return this;
+  }
+
+  /**
+   * The domain of the event.
+   * @return domain
+   **/
+  @Schema(description = "The domain of the event.")
+      @NotNull
+
+    public String getDomain() {
+    return domain;
+  }
+
+  public void setDomain(String domain) {
+    this.domain = domain;
+  }
+
+  public ProductCreateEvent title(String title) {
+    this.title = title;
+    return this;
+  }
+
+  /**
+   * The title of the event.
+   * @return title
+   **/
+  @Schema(description = "The title of the event.")
+      @NotNull
+
+    public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  public ProductCreateEvent description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * An explnatory of the event.
+   * @return description
+   **/
+  @Schema(description = "An explnatory of the event.")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public ProductCreateEvent priority(String priority) {
+    this.priority = priority;
+    return this;
+  }
+
+  /**
+   * A priority.
+   * @return priority
+   **/
+  @Schema(description = "A priority.")
+      @NotNull
+
+    public String getPriority() {
+    return priority;
+  }
+
+  public void setPriority(String priority) {
+    this.priority = priority;
+  }
+
+  public ProductCreateEvent timeOcurred(Date timeOcurred) {
+    this.timeOcurred = timeOcurred;
+    return this;
+  }
+
+  /**
+   * The time the event occured.
+   * @return timeOcurred
+   **/
+  @Schema(description = "The time the event occured.")
+      @NotNull
+
+    @Valid
+    public Date getTimeOcurred() {
+    return timeOcurred;
+  }
+
+  public void setTimeOcurred(Date timeOcurred) {
+    this.timeOcurred = timeOcurred;
+  }
+
+  public ProductCreateEvent event(ProductCreateEventPayload event) {
+    this.event = event;
+    return this;
+  }
+
+  /**
+   * Get event
+   * @return event
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductCreateEventPayload getEvent() {
+    return event;
+  }
+
+  public void setEvent(ProductCreateEventPayload event) {
+    this.event = event;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductCreateEvent productCreateEvent = (ProductCreateEvent) o;
+    return Objects.equals(this.id, productCreateEvent.id) &&
+        Objects.equals(this.href, productCreateEvent.href) &&
+        Objects.equals(this.eventId, productCreateEvent.eventId) &&
+        Objects.equals(this.eventTime, productCreateEvent.eventTime) &&
+        Objects.equals(this.eventType, productCreateEvent.eventType) &&
+        Objects.equals(this.correlationId, productCreateEvent.correlationId) &&
+        Objects.equals(this.domain, productCreateEvent.domain) &&
+        Objects.equals(this.title, productCreateEvent.title) &&
+        Objects.equals(this.description, productCreateEvent.description) &&
+        Objects.equals(this.priority, productCreateEvent.priority) &&
+        Objects.equals(this.timeOcurred, productCreateEvent.timeOcurred) &&
+        Objects.equals(this.event, productCreateEvent.event);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, eventId, eventTime, eventType, correlationId, domain, title, description, priority, timeOcurred, event);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductCreateEvent {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    eventId: ").append(toIndentedString(eventId)).append("\n");
+    sb.append("    eventTime: ").append(toIndentedString(eventTime)).append("\n");
+    sb.append("    eventType: ").append(toIndentedString(eventType)).append("\n");
+    sb.append("    correlationId: ").append(toIndentedString(correlationId)).append("\n");
+    sb.append("    domain: ").append(toIndentedString(domain)).append("\n");
+    sb.append("    title: ").append(toIndentedString(title)).append("\n");
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    priority: ").append(toIndentedString(priority)).append("\n");
+    sb.append("    timeOcurred: ").append(toIndentedString(timeOcurred)).append("\n");
+    sb.append("    event: ").append(toIndentedString(event)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductCreateEventPayload.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductCreateEventPayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..e292e83fcf4c0212ad78aead0e4f777c28d03d1b
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductCreateEventPayload.java
@@ -0,0 +1,81 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The event data structure
+ */
+@Schema(description = "The event data structure")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductCreateEventPayload   {
+  @JsonProperty("product")
+  private Product product = null;
+
+  public ProductCreateEventPayload product(Product product) {
+    this.product = product;
+    return this;
+  }
+
+  /**
+   * Get product
+   * @return product
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public Product getProduct() {
+    return product;
+  }
+
+  public void setProduct(Product product) {
+    this.product = product;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductCreateEventPayload productCreateEventPayload = (ProductCreateEventPayload) o;
+    return Objects.equals(this.product, productCreateEventPayload.product);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(product);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductCreateEventPayload {\n");
+    
+    sb.append("    product: ").append(toIndentedString(product)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductDeleteEvent.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductDeleteEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..6637c5ca12bb718ad4ed99305489bf908f08da8a
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductDeleteEvent.java
@@ -0,0 +1,359 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Date;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The notification data structure
+ */
+@Schema(description = "The notification data structure")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductDeleteEvent   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("eventId")
+  private String eventId = null;
+
+  @JsonProperty("eventTime")
+  private Date eventTime = null;
+
+  @JsonProperty("eventType")
+  private String eventType = null;
+
+  @JsonProperty("correlationId")
+  private String correlationId = null;
+
+  @JsonProperty("domain")
+  private String domain = null;
+
+  @JsonProperty("title")
+  private String title = null;
+
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("priority")
+  private String priority = null;
+
+  @JsonProperty("timeOcurred")
+  private Date timeOcurred = null;
+
+  @JsonProperty("event")
+  private ProductDeleteEventPayload event = null;
+
+  public ProductDeleteEvent id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Identifier of the Process flow
+   * @return id
+   **/
+  @Schema(description = "Identifier of the Process flow")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public ProductDeleteEvent href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the ProcessFlow
+   * @return href
+   **/
+  @Schema(description = "Reference of the ProcessFlow")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public ProductDeleteEvent eventId(String eventId) {
+    this.eventId = eventId;
+    return this;
+  }
+
+  /**
+   * The identifier of the notification.
+   * @return eventId
+   **/
+  @Schema(description = "The identifier of the notification.")
+      @NotNull
+
+    public String getEventId() {
+    return eventId;
+  }
+
+  public void setEventId(String eventId) {
+    this.eventId = eventId;
+  }
+
+  public ProductDeleteEvent eventTime(Date eventTime) {
+    this.eventTime = eventTime;
+    return this;
+  }
+
+  /**
+   * Time of the event occurrence.
+   * @return eventTime
+   **/
+  @Schema(description = "Time of the event occurrence.")
+      @NotNull
+
+    @Valid
+    public Date getEventTime() {
+    return eventTime;
+  }
+
+  public void setEventTime(Date eventTime) {
+    this.eventTime = eventTime;
+  }
+
+  public ProductDeleteEvent eventType(String eventType) {
+    this.eventType = eventType;
+    return this;
+  }
+
+  /**
+   * The type of the notification.
+   * @return eventType
+   **/
+  @Schema(description = "The type of the notification.")
+      @NotNull
+
+    public String getEventType() {
+    return eventType;
+  }
+
+  public void setEventType(String eventType) {
+    this.eventType = eventType;
+  }
+
+  public ProductDeleteEvent correlationId(String correlationId) {
+    this.correlationId = correlationId;
+    return this;
+  }
+
+  /**
+   * The correlation id for this event.
+   * @return correlationId
+   **/
+  @Schema(description = "The correlation id for this event.")
+      @NotNull
+
+    public String getCorrelationId() {
+    return correlationId;
+  }
+
+  public void setCorrelationId(String correlationId) {
+    this.correlationId = correlationId;
+  }
+
+  public ProductDeleteEvent domain(String domain) {
+    this.domain = domain;
+    return this;
+  }
+
+  /**
+   * The domain of the event.
+   * @return domain
+   **/
+  @Schema(description = "The domain of the event.")
+      @NotNull
+
+    public String getDomain() {
+    return domain;
+  }
+
+  public void setDomain(String domain) {
+    this.domain = domain;
+  }
+
+  public ProductDeleteEvent title(String title) {
+    this.title = title;
+    return this;
+  }
+
+  /**
+   * The title of the event.
+   * @return title
+   **/
+  @Schema(description = "The title of the event.")
+      @NotNull
+
+    public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  public ProductDeleteEvent description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * An explnatory of the event.
+   * @return description
+   **/
+  @Schema(description = "An explnatory of the event.")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public ProductDeleteEvent priority(String priority) {
+    this.priority = priority;
+    return this;
+  }
+
+  /**
+   * A priority.
+   * @return priority
+   **/
+  @Schema(description = "A priority.")
+      @NotNull
+
+    public String getPriority() {
+    return priority;
+  }
+
+  public void setPriority(String priority) {
+    this.priority = priority;
+  }
+
+  public ProductDeleteEvent timeOcurred(Date timeOcurred) {
+    this.timeOcurred = timeOcurred;
+    return this;
+  }
+
+  /**
+   * The time the event occured.
+   * @return timeOcurred
+   **/
+  @Schema(description = "The time the event occured.")
+      @NotNull
+
+    @Valid
+    public Date getTimeOcurred() {
+    return timeOcurred;
+  }
+
+  public void setTimeOcurred(Date timeOcurred) {
+    this.timeOcurred = timeOcurred;
+  }
+
+  public ProductDeleteEvent event(ProductDeleteEventPayload event) {
+    this.event = event;
+    return this;
+  }
+
+  /**
+   * Get event
+   * @return event
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductDeleteEventPayload getEvent() {
+    return event;
+  }
+
+  public void setEvent(ProductDeleteEventPayload event) {
+    this.event = event;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductDeleteEvent productDeleteEvent = (ProductDeleteEvent) o;
+    return Objects.equals(this.id, productDeleteEvent.id) &&
+        Objects.equals(this.href, productDeleteEvent.href) &&
+        Objects.equals(this.eventId, productDeleteEvent.eventId) &&
+        Objects.equals(this.eventTime, productDeleteEvent.eventTime) &&
+        Objects.equals(this.eventType, productDeleteEvent.eventType) &&
+        Objects.equals(this.correlationId, productDeleteEvent.correlationId) &&
+        Objects.equals(this.domain, productDeleteEvent.domain) &&
+        Objects.equals(this.title, productDeleteEvent.title) &&
+        Objects.equals(this.description, productDeleteEvent.description) &&
+        Objects.equals(this.priority, productDeleteEvent.priority) &&
+        Objects.equals(this.timeOcurred, productDeleteEvent.timeOcurred) &&
+        Objects.equals(this.event, productDeleteEvent.event);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, eventId, eventTime, eventType, correlationId, domain, title, description, priority, timeOcurred, event);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductDeleteEvent {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    eventId: ").append(toIndentedString(eventId)).append("\n");
+    sb.append("    eventTime: ").append(toIndentedString(eventTime)).append("\n");
+    sb.append("    eventType: ").append(toIndentedString(eventType)).append("\n");
+    sb.append("    correlationId: ").append(toIndentedString(correlationId)).append("\n");
+    sb.append("    domain: ").append(toIndentedString(domain)).append("\n");
+    sb.append("    title: ").append(toIndentedString(title)).append("\n");
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    priority: ").append(toIndentedString(priority)).append("\n");
+    sb.append("    timeOcurred: ").append(toIndentedString(timeOcurred)).append("\n");
+    sb.append("    event: ").append(toIndentedString(event)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductDeleteEventPayload.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductDeleteEventPayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..fbe073e74da567fa7cedcf72502ed1b3b91be0bc
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductDeleteEventPayload.java
@@ -0,0 +1,81 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The event data structure
+ */
+@Schema(description = "The event data structure")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductDeleteEventPayload   {
+  @JsonProperty("product")
+  private Product product = null;
+
+  public ProductDeleteEventPayload product(Product product) {
+    this.product = product;
+    return this;
+  }
+
+  /**
+   * Get product
+   * @return product
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public Product getProduct() {
+    return product;
+  }
+
+  public void setProduct(Product product) {
+    this.product = product;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductDeleteEventPayload productDeleteEventPayload = (ProductDeleteEventPayload) o;
+    return Objects.equals(this.product, productDeleteEventPayload.product);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(product);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductDeleteEventPayload {\n");
+    
+    sb.append("    product: ").append(toIndentedString(product)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductOfferingPriceRef.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductOfferingPriceRef.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7fada70f667f3d10ec2d261c8deee0379616edf
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductOfferingPriceRef.java
@@ -0,0 +1,229 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * ProductPriceOffering reference. An amount, usually of money, that is asked for or allowed when a ProductOffering is bought, rented, or leased
+ */
+@Schema(description = "ProductPriceOffering reference. An amount, usually of money, that is asked for or allowed when a ProductOffering is bought, rented, or leased")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductOfferingPriceRef   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  @JsonProperty("@referredType")
+  private String _atReferredType = null;
+
+  public ProductOfferingPriceRef id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Unique identifier of a related entity.
+   * @return id
+   **/
+  @Schema(required = true, description = "Unique identifier of a related entity.")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public ProductOfferingPriceRef href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the related entity.
+   * @return href
+   **/
+  @Schema(description = "Reference of the related entity.")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public ProductOfferingPriceRef name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the related entity.
+   * @return name
+   **/
+  @Schema(description = "Name of the related entity.")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public ProductOfferingPriceRef _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public ProductOfferingPriceRef _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public ProductOfferingPriceRef _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+  public ProductOfferingPriceRef _atReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+    return this;
+  }
+
+  /**
+   * The actual type of the target instance when needed for disambiguation.
+   * @return _atReferredType
+   **/
+  @Schema(description = "The actual type of the target instance when needed for disambiguation.")
+      @NotNull
+
+    public String getAtReferredType() {
+    return _atReferredType;
+  }
+
+  public void setAtReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductOfferingPriceRef productOfferingPriceRef = (ProductOfferingPriceRef) o;
+    return Objects.equals(this.id, productOfferingPriceRef.id) &&
+        Objects.equals(this.href, productOfferingPriceRef.href) &&
+        Objects.equals(this.name, productOfferingPriceRef.name) &&
+        Objects.equals(this._atBaseType, productOfferingPriceRef._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, productOfferingPriceRef._atSchemaLocation) &&
+        Objects.equals(this._atType, productOfferingPriceRef._atType) &&
+        Objects.equals(this._atReferredType, productOfferingPriceRef._atReferredType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, name, _atBaseType, _atSchemaLocation, _atType, _atReferredType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductOfferingPriceRef {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("    _atReferredType: ").append(toIndentedString(_atReferredType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductOfferingRef.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductOfferingRef.java
new file mode 100644
index 0000000000000000000000000000000000000000..e9933e86cc8b87456b33754050da64847d56851b
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductOfferingRef.java
@@ -0,0 +1,229 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * ProductOffering reference. A product offering represents entities that are orderable from the provider of the catalog, this resource includes pricing information.
+ */
+@Schema(description = "ProductOffering reference. A product offering represents entities that are orderable from the provider of the catalog, this resource includes pricing information.")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductOfferingRef   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  @JsonProperty("@referredType")
+  private String _atReferredType = null;
+
+  public ProductOfferingRef id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Unique identifier of a related entity.
+   * @return id
+   **/
+  @Schema(required = true, description = "Unique identifier of a related entity.")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public ProductOfferingRef href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the related entity.
+   * @return href
+   **/
+  @Schema(description = "Reference of the related entity.")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public ProductOfferingRef name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the related entity.
+   * @return name
+   **/
+  @Schema(description = "Name of the related entity.")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public ProductOfferingRef _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public ProductOfferingRef _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public ProductOfferingRef _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+  public ProductOfferingRef _atReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+    return this;
+  }
+
+  /**
+   * The actual type of the target instance when needed for disambiguation.
+   * @return _atReferredType
+   **/
+  @Schema(description = "The actual type of the target instance when needed for disambiguation.")
+      @NotNull
+
+    public String getAtReferredType() {
+    return _atReferredType;
+  }
+
+  public void setAtReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductOfferingRef productOfferingRef = (ProductOfferingRef) o;
+    return Objects.equals(this.id, productOfferingRef.id) &&
+        Objects.equals(this.href, productOfferingRef.href) &&
+        Objects.equals(this.name, productOfferingRef.name) &&
+        Objects.equals(this._atBaseType, productOfferingRef._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, productOfferingRef._atSchemaLocation) &&
+        Objects.equals(this._atType, productOfferingRef._atType) &&
+        Objects.equals(this._atReferredType, productOfferingRef._atReferredType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, name, _atBaseType, _atSchemaLocation, _atType, _atReferredType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductOfferingRef {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("    _atReferredType: ").append(toIndentedString(_atReferredType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductPrice.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductPrice.java
new file mode 100644
index 0000000000000000000000000000000000000000..e233652ce0698a72742ab4b3a790cab87b83ed9d
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductPrice.java
@@ -0,0 +1,369 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * An amount, usually of money, that represents the actual price paid by a Customer for a purchase, a rent or a lease of a Product. The price is valid for a defined period of time.
+ */
+@Schema(description = "An amount, usually of money, that represents the actual price paid by a Customer for a purchase, a rent or a lease of a Product. The price is valid for a defined period of time.")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductPrice   {
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("priceType")
+  private String priceType = null;
+
+  @JsonProperty("recurringChargePeriod")
+  private String recurringChargePeriod = null;
+
+  @JsonProperty("unitOfMeasure")
+  private String unitOfMeasure = null;
+
+  @JsonProperty("billingAccount")
+  private BillingAccountRef billingAccount = null;
+
+  @JsonProperty("price")
+  private Price price = null;
+
+  @JsonProperty("productOfferingPrice")
+  private ProductOfferingPriceRef productOfferingPrice = null;
+
+  @JsonProperty("productPriceAlteration")
+  @Valid
+  private List<PriceAlteration> productPriceAlteration = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public ProductPrice description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * A narrative that explains in detail the semantics of this product price.
+   * @return description
+   **/
+  @Schema(description = "A narrative that explains in detail the semantics of this product price.")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public ProductPrice name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * A short descriptive name such as \"Subscription price\".
+   * @return name
+   **/
+  @Schema(description = "A short descriptive name such as \"Subscription price\".")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public ProductPrice priceType(String priceType) {
+    this.priceType = priceType;
+    return this;
+  }
+
+  /**
+   * A category that describes the price, such as recurring, discount, allowance, penalty, and so forth.
+   * @return priceType
+   **/
+  @Schema(required = true, description = "A category that describes the price, such as recurring, discount, allowance, penalty, and so forth.")
+      @NotNull
+
+    public String getPriceType() {
+    return priceType;
+  }
+
+  public void setPriceType(String priceType) {
+    this.priceType = priceType;
+  }
+
+  public ProductPrice recurringChargePeriod(String recurringChargePeriod) {
+    this.recurringChargePeriod = recurringChargePeriod;
+    return this;
+  }
+
+  /**
+   * Could be month, week...
+   * @return recurringChargePeriod
+   **/
+  @Schema(description = "Could be month, week...")
+      @NotNull
+
+    public String getRecurringChargePeriod() {
+    return recurringChargePeriod;
+  }
+
+  public void setRecurringChargePeriod(String recurringChargePeriod) {
+    this.recurringChargePeriod = recurringChargePeriod;
+  }
+
+  public ProductPrice unitOfMeasure(String unitOfMeasure) {
+    this.unitOfMeasure = unitOfMeasure;
+    return this;
+  }
+
+  /**
+   * Could be minutes, GB...
+   * @return unitOfMeasure
+   **/
+  @Schema(description = "Could be minutes, GB...")
+      @NotNull
+
+    public String getUnitOfMeasure() {
+    return unitOfMeasure;
+  }
+
+  public void setUnitOfMeasure(String unitOfMeasure) {
+    this.unitOfMeasure = unitOfMeasure;
+  }
+
+  public ProductPrice billingAccount(BillingAccountRef billingAccount) {
+    this.billingAccount = billingAccount;
+    return this;
+  }
+
+  /**
+   * Get billingAccount
+   * @return billingAccount
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public BillingAccountRef getBillingAccount() {
+    return billingAccount;
+  }
+
+  public void setBillingAccount(BillingAccountRef billingAccount) {
+    this.billingAccount = billingAccount;
+  }
+
+  public ProductPrice price(Price price) {
+    this.price = price;
+    return this;
+  }
+
+  /**
+   * Get price
+   * @return price
+   **/
+  @Schema(required = true, description = "")
+      @NotNull
+
+    @Valid
+    public Price getPrice() {
+    return price;
+  }
+
+  public void setPrice(Price price) {
+    this.price = price;
+  }
+
+  public ProductPrice productOfferingPrice(ProductOfferingPriceRef productOfferingPrice) {
+    this.productOfferingPrice = productOfferingPrice;
+    return this;
+  }
+
+  /**
+   * Get productOfferingPrice
+   * @return productOfferingPrice
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductOfferingPriceRef getProductOfferingPrice() {
+    return productOfferingPrice;
+  }
+
+  public void setProductOfferingPrice(ProductOfferingPriceRef productOfferingPrice) {
+    this.productOfferingPrice = productOfferingPrice;
+  }
+
+  public ProductPrice productPriceAlteration(List<PriceAlteration> productPriceAlteration) {
+    this.productPriceAlteration = productPriceAlteration;
+    return this;
+  }
+
+  public ProductPrice addProductPriceAlterationItem(PriceAlteration productPriceAlterationItem) {
+    if (this.productPriceAlteration == null) {
+      this.productPriceAlteration = new ArrayList<PriceAlteration>();
+    }
+    this.productPriceAlteration.add(productPriceAlterationItem);
+    return this;
+  }
+
+  /**
+   * Get productPriceAlteration
+   * @return productPriceAlteration
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<PriceAlteration> getProductPriceAlteration() {
+    return productPriceAlteration;
+  }
+
+  public void setProductPriceAlteration(List<PriceAlteration> productPriceAlteration) {
+    this.productPriceAlteration = productPriceAlteration;
+  }
+
+  public ProductPrice _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public ProductPrice _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public ProductPrice _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductPrice productPrice = (ProductPrice) o;
+    return Objects.equals(this.description, productPrice.description) &&
+        Objects.equals(this.name, productPrice.name) &&
+        Objects.equals(this.priceType, productPrice.priceType) &&
+        Objects.equals(this.recurringChargePeriod, productPrice.recurringChargePeriod) &&
+        Objects.equals(this.unitOfMeasure, productPrice.unitOfMeasure) &&
+        Objects.equals(this.billingAccount, productPrice.billingAccount) &&
+        Objects.equals(this.price, productPrice.price) &&
+        Objects.equals(this.productOfferingPrice, productPrice.productOfferingPrice) &&
+        Objects.equals(this.productPriceAlteration, productPrice.productPriceAlteration) &&
+        Objects.equals(this._atBaseType, productPrice._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, productPrice._atSchemaLocation) &&
+        Objects.equals(this._atType, productPrice._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(description, name, priceType, recurringChargePeriod, unitOfMeasure, billingAccount, price, productOfferingPrice, productPriceAlteration, _atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductPrice {\n");
+    
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    priceType: ").append(toIndentedString(priceType)).append("\n");
+    sb.append("    recurringChargePeriod: ").append(toIndentedString(recurringChargePeriod)).append("\n");
+    sb.append("    unitOfMeasure: ").append(toIndentedString(unitOfMeasure)).append("\n");
+    sb.append("    billingAccount: ").append(toIndentedString(billingAccount)).append("\n");
+    sb.append("    price: ").append(toIndentedString(price)).append("\n");
+    sb.append("    productOfferingPrice: ").append(toIndentedString(productOfferingPrice)).append("\n");
+    sb.append("    productPriceAlteration: ").append(toIndentedString(productPriceAlteration)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductRef.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductRef.java
new file mode 100644
index 0000000000000000000000000000000000000000..4f0fca5465cdf134ce9acbcffab9396c498f93b4
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductRef.java
@@ -0,0 +1,228 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * ProductRef
+ */
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductRef   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  @JsonProperty("@referredType")
+  private String _atReferredType = null;
+
+  public ProductRef id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Unique identifier of a related entity.
+   * @return id
+   **/
+  @Schema(required = true, description = "Unique identifier of a related entity.")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public ProductRef href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the related entity.
+   * @return href
+   **/
+  @Schema(description = "Reference of the related entity.")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public ProductRef name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the related entity.
+   * @return name
+   **/
+  @Schema(description = "Name of the related entity.")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public ProductRef _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public ProductRef _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public ProductRef _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+  public ProductRef _atReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+    return this;
+  }
+
+  /**
+   * The actual type of the target instance when needed for disambiguation.
+   * @return _atReferredType
+   **/
+  @Schema(description = "The actual type of the target instance when needed for disambiguation.")
+      @NotNull
+
+    public String getAtReferredType() {
+    return _atReferredType;
+  }
+
+  public void setAtReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductRef productRef = (ProductRef) o;
+    return Objects.equals(this.id, productRef.id) &&
+        Objects.equals(this.href, productRef.href) &&
+        Objects.equals(this.name, productRef.name) &&
+        Objects.equals(this._atBaseType, productRef._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, productRef._atSchemaLocation) &&
+        Objects.equals(this._atType, productRef._atType) &&
+        Objects.equals(this._atReferredType, productRef._atReferredType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, name, _atBaseType, _atSchemaLocation, _atType, _atReferredType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductRef {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("    _atReferredType: ").append(toIndentedString(_atReferredType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductRefOrValue.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductRefOrValue.java
new file mode 100644
index 0000000000000000000000000000000000000000..e4b1308c6b07e6f8fe7727e8011ef72d81251f0a
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductRefOrValue.java
@@ -0,0 +1,894 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
+import org.etsi.osl.tmf.common.model.service.ResourceRef;
+import org.etsi.osl.tmf.common.model.service.ServiceRef;
+import org.etsi.osl.tmf.po622.model.AgreementItemRef;
+import org.etsi.osl.tmf.prm669.model.RelatedParty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * A product to be created defined by value or existing defined by reference. The polymorphic attributes @type, @schemaLocation &amp; @referredType are related to the product entity and not the RelatedProductRefOrValue class itself
+ */
+@Schema(description = "A product to be created defined by value or existing defined by reference. The polymorphic attributes @type, @schemaLocation & @referredType are related to the product entity and not the RelatedProductRefOrValue class itself")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductRefOrValue   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("isBundle")
+  private Boolean isBundle = null;
+
+  @JsonProperty("isCustomerVisible")
+  private Boolean isCustomerVisible = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("orderDate")
+  private Date orderDate = null;
+
+  @JsonProperty("productSerialNumber")
+  private String productSerialNumber = null;
+
+  @JsonProperty("startDate")
+  private Date startDate = null;
+
+  @JsonProperty("terminationDate")
+  private Date terminationDate = null;
+
+  @JsonProperty("agreement")
+  @Valid
+  private List<AgreementItemRef> agreement = null;
+
+  @JsonProperty("billingAccount")
+  private BillingAccountRef billingAccount = null;
+
+  @JsonProperty("place")
+  @Valid
+  private List<RelatedPlaceRefOrValue> place = null;
+
+  @JsonProperty("product")
+  @Valid
+  private List<ProductRefOrValue> product = null;
+
+  @JsonProperty("productCharacteristic")
+  @Valid
+  private List<Characteristic> productCharacteristic = null;
+
+  @JsonProperty("productOffering")
+  private ProductOfferingRef productOffering = null;
+
+  @JsonProperty("productOrderItem")
+  @Valid
+  private List<RelatedProductOrderItem> productOrderItem = null;
+
+  @JsonProperty("productPrice")
+  @Valid
+  private List<ProductPrice> productPrice = null;
+
+  @JsonProperty("productRelationship")
+  @Valid
+  private List<ProductRelationship> productRelationship = null;
+
+  @JsonProperty("productSpecification")
+  private ProductSpecificationRef productSpecification = null;
+
+  @JsonProperty("productTerm")
+  @Valid
+  private List<ProductTerm> productTerm = null;
+
+  @JsonProperty("realizingResource")
+  @Valid
+  private List<ResourceRef> realizingResource = null;
+
+  @JsonProperty("realizingService")
+  @Valid
+  private List<ServiceRef> realizingService = null;
+
+  @JsonProperty("relatedParty")
+  @Valid
+  private List<RelatedParty> relatedParty = null;
+
+  @JsonProperty("status")
+  private ProductStatusType status = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  @JsonProperty("@referredType")
+  private String _atReferredType = null;
+
+  public ProductRefOrValue id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Unique identifier of the product
+   * @return id
+   **/
+  @Schema(description = "Unique identifier of the product")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public ProductRefOrValue href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the product
+   * @return href
+   **/
+  @Schema(description = "Reference of the product")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public ProductRefOrValue description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * Is the description of the product. It could be copied from the description of the Product Offering.
+   * @return description
+   **/
+  @Schema(description = "Is the description of the product. It could be copied from the description of the Product Offering.")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public ProductRefOrValue isBundle(Boolean isBundle) {
+    this.isBundle = isBundle;
+    return this;
+  }
+
+  /**
+   * If true, the product is a ProductBundle which is an instantiation of a BundledProductOffering. If false, the product is a ProductComponent which is an instantiation of a SimpleProductOffering.
+   * @return isBundle
+   **/
+  @Schema(description = "If true, the product is a ProductBundle which is an instantiation of a BundledProductOffering. If false, the product is a ProductComponent which is an instantiation of a SimpleProductOffering.")
+      @NotNull
+
+    public Boolean isIsBundle() {
+    return isBundle;
+  }
+
+  public void setIsBundle(Boolean isBundle) {
+    this.isBundle = isBundle;
+  }
+
+  public ProductRefOrValue isCustomerVisible(Boolean isCustomerVisible) {
+    this.isCustomerVisible = isCustomerVisible;
+    return this;
+  }
+
+  /**
+   * If true, the product is visible by the customer.
+   * @return isCustomerVisible
+   **/
+  @Schema(description = "If true, the product is visible by the customer.")
+      @NotNull
+
+    public Boolean isIsCustomerVisible() {
+    return isCustomerVisible;
+  }
+
+  public void setIsCustomerVisible(Boolean isCustomerVisible) {
+    this.isCustomerVisible = isCustomerVisible;
+  }
+
+  public ProductRefOrValue name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the product. It could be the same as the name of the product offering
+   * @return name
+   **/
+  @Schema(description = "Name of the product. It could be the same as the name of the product offering")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public ProductRefOrValue orderDate(Date orderDate) {
+    this.orderDate = orderDate;
+    return this;
+  }
+
+  /**
+   * Is the date when the product was ordered
+   * @return orderDate
+   **/
+  @Schema(description = "Is the date when the product was ordered")
+      @NotNull
+
+    @Valid
+    public Date getOrderDate() {
+    return orderDate;
+  }
+
+  public void setOrderDate(Date orderDate) {
+    this.orderDate = orderDate;
+  }
+
+  public ProductRefOrValue productSerialNumber(String productSerialNumber) {
+    this.productSerialNumber = productSerialNumber;
+    return this;
+  }
+
+  /**
+   * Is the serial number for the product. This is typically applicable to tangible products e.g. Broadband Router.
+   * @return productSerialNumber
+   **/
+  @Schema(description = "Is the serial number for the product. This is typically applicable to tangible products e.g. Broadband Router.")
+      @NotNull
+
+    public String getProductSerialNumber() {
+    return productSerialNumber;
+  }
+
+  public void setProductSerialNumber(String productSerialNumber) {
+    this.productSerialNumber = productSerialNumber;
+  }
+
+  public ProductRefOrValue startDate(Date startDate) {
+    this.startDate = startDate;
+    return this;
+  }
+
+  /**
+   * Is the date from which the product starts
+   * @return startDate
+   **/
+  @Schema(description = "Is the date from which the product starts")
+      @NotNull
+
+    @Valid
+    public Date getStartDate() {
+    return startDate;
+  }
+
+  public void setStartDate(Date startDate) {
+    this.startDate = startDate;
+  }
+
+  public ProductRefOrValue terminationDate(Date terminationDate) {
+    this.terminationDate = terminationDate;
+    return this;
+  }
+
+  /**
+   * Is the date when the product was terminated
+   * @return terminationDate
+   **/
+  @Schema(description = "Is the date when the product was terminated")
+      @NotNull
+
+    @Valid
+    public Date getTerminationDate() {
+    return terminationDate;
+  }
+
+  public void setTerminationDate(Date terminationDate) {
+    this.terminationDate = terminationDate;
+  }
+
+  public ProductRefOrValue agreement(List<AgreementItemRef> agreement) {
+    this.agreement = agreement;
+    return this;
+  }
+
+  public ProductRefOrValue addAgreementItem(AgreementItemRef agreementItem) {
+    if (this.agreement == null) {
+      this.agreement = new ArrayList<AgreementItemRef>();
+    }
+    this.agreement.add(agreementItem);
+    return this;
+  }
+
+  /**
+   * Get agreement
+   * @return agreement
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<AgreementItemRef> getAgreement() {
+    return agreement;
+  }
+
+  public void setAgreement(List<AgreementItemRef> agreement) {
+    this.agreement = agreement;
+  }
+
+  public ProductRefOrValue billingAccount(BillingAccountRef billingAccount) {
+    this.billingAccount = billingAccount;
+    return this;
+  }
+
+  /**
+   * Get billingAccount
+   * @return billingAccount
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public BillingAccountRef getBillingAccount() {
+    return billingAccount;
+  }
+
+  public void setBillingAccount(BillingAccountRef billingAccount) {
+    this.billingAccount = billingAccount;
+  }
+
+  public ProductRefOrValue place(List<RelatedPlaceRefOrValue> place) {
+    this.place = place;
+    return this;
+  }
+
+  public ProductRefOrValue addPlaceItem(RelatedPlaceRefOrValue placeItem) {
+    if (this.place == null) {
+      this.place = new ArrayList<RelatedPlaceRefOrValue>();
+    }
+    this.place.add(placeItem);
+    return this;
+  }
+
+  /**
+   * Get place
+   * @return place
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedPlaceRefOrValue> getPlace() {
+    return place;
+  }
+
+  public void setPlace(List<RelatedPlaceRefOrValue> place) {
+    this.place = place;
+  }
+
+  public ProductRefOrValue product(List<ProductRefOrValue> product) {
+    this.product = product;
+    return this;
+  }
+
+  public ProductRefOrValue addProductItem(ProductRefOrValue productItem) {
+    if (this.product == null) {
+      this.product = new ArrayList<ProductRefOrValue>();
+    }
+    this.product.add(productItem);
+    return this;
+  }
+
+  /**
+   * Get product
+   * @return product
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductRefOrValue> getProduct() {
+    return product;
+  }
+
+  public void setProduct(List<ProductRefOrValue> product) {
+    this.product = product;
+  }
+
+  public ProductRefOrValue productCharacteristic(List<Characteristic> productCharacteristic) {
+    this.productCharacteristic = productCharacteristic;
+    return this;
+  }
+
+  public ProductRefOrValue addProductCharacteristicItem(Characteristic productCharacteristicItem) {
+    if (this.productCharacteristic == null) {
+      this.productCharacteristic = new ArrayList<Characteristic>();
+    }
+    this.productCharacteristic.add(productCharacteristicItem);
+    return this;
+  }
+
+  /**
+   * Get productCharacteristic
+   * @return productCharacteristic
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<Characteristic> getProductCharacteristic() {
+    return productCharacteristic;
+  }
+
+  public void setProductCharacteristic(List<Characteristic> productCharacteristic) {
+    this.productCharacteristic = productCharacteristic;
+  }
+
+  public ProductRefOrValue productOffering(ProductOfferingRef productOffering) {
+    this.productOffering = productOffering;
+    return this;
+  }
+
+  /**
+   * Get productOffering
+   * @return productOffering
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductOfferingRef getProductOffering() {
+    return productOffering;
+  }
+
+  public void setProductOffering(ProductOfferingRef productOffering) {
+    this.productOffering = productOffering;
+  }
+
+  public ProductRefOrValue productOrderItem(List<RelatedProductOrderItem> productOrderItem) {
+    this.productOrderItem = productOrderItem;
+    return this;
+  }
+
+  public ProductRefOrValue addProductOrderItemItem(RelatedProductOrderItem productOrderItemItem) {
+    if (this.productOrderItem == null) {
+      this.productOrderItem = new ArrayList<RelatedProductOrderItem>();
+    }
+    this.productOrderItem.add(productOrderItemItem);
+    return this;
+  }
+
+  /**
+   * Get productOrderItem
+   * @return productOrderItem
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedProductOrderItem> getProductOrderItem() {
+    return productOrderItem;
+  }
+
+  public void setProductOrderItem(List<RelatedProductOrderItem> productOrderItem) {
+    this.productOrderItem = productOrderItem;
+  }
+
+  public ProductRefOrValue productPrice(List<ProductPrice> productPrice) {
+    this.productPrice = productPrice;
+    return this;
+  }
+
+  public ProductRefOrValue addProductPriceItem(ProductPrice productPriceItem) {
+    if (this.productPrice == null) {
+      this.productPrice = new ArrayList<ProductPrice>();
+    }
+    this.productPrice.add(productPriceItem);
+    return this;
+  }
+
+  /**
+   * Get productPrice
+   * @return productPrice
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductPrice> getProductPrice() {
+    return productPrice;
+  }
+
+  public void setProductPrice(List<ProductPrice> productPrice) {
+    this.productPrice = productPrice;
+  }
+
+  public ProductRefOrValue productRelationship(List<ProductRelationship> productRelationship) {
+    this.productRelationship = productRelationship;
+    return this;
+  }
+
+  public ProductRefOrValue addProductRelationshipItem(ProductRelationship productRelationshipItem) {
+    if (this.productRelationship == null) {
+      this.productRelationship = new ArrayList<ProductRelationship>();
+    }
+    this.productRelationship.add(productRelationshipItem);
+    return this;
+  }
+
+  /**
+   * Get productRelationship
+   * @return productRelationship
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductRelationship> getProductRelationship() {
+    return productRelationship;
+  }
+
+  public void setProductRelationship(List<ProductRelationship> productRelationship) {
+    this.productRelationship = productRelationship;
+  }
+
+  public ProductRefOrValue productSpecification(ProductSpecificationRef productSpecification) {
+    this.productSpecification = productSpecification;
+    return this;
+  }
+
+  /**
+   * Get productSpecification
+   * @return productSpecification
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductSpecificationRef getProductSpecification() {
+    return productSpecification;
+  }
+
+  public void setProductSpecification(ProductSpecificationRef productSpecification) {
+    this.productSpecification = productSpecification;
+  }
+
+  public ProductRefOrValue productTerm(List<ProductTerm> productTerm) {
+    this.productTerm = productTerm;
+    return this;
+  }
+
+  public ProductRefOrValue addProductTermItem(ProductTerm productTermItem) {
+    if (this.productTerm == null) {
+      this.productTerm = new ArrayList<ProductTerm>();
+    }
+    this.productTerm.add(productTermItem);
+    return this;
+  }
+
+  /**
+   * Get productTerm
+   * @return productTerm
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductTerm> getProductTerm() {
+    return productTerm;
+  }
+
+  public void setProductTerm(List<ProductTerm> productTerm) {
+    this.productTerm = productTerm;
+  }
+
+  public ProductRefOrValue realizingResource(List<ResourceRef> realizingResource) {
+    this.realizingResource = realizingResource;
+    return this;
+  }
+
+  public ProductRefOrValue addRealizingResourceItem(ResourceRef realizingResourceItem) {
+    if (this.realizingResource == null) {
+      this.realizingResource = new ArrayList<ResourceRef>();
+    }
+    this.realizingResource.add(realizingResourceItem);
+    return this;
+  }
+
+  /**
+   * Get realizingResource
+   * @return realizingResource
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ResourceRef> getRealizingResource() {
+    return realizingResource;
+  }
+
+  public void setRealizingResource(List<ResourceRef> realizingResource) {
+    this.realizingResource = realizingResource;
+  }
+
+  public ProductRefOrValue realizingService(List<ServiceRef> realizingService) {
+    this.realizingService = realizingService;
+    return this;
+  }
+
+  public ProductRefOrValue addRealizingServiceItem(ServiceRef realizingServiceItem) {
+    if (this.realizingService == null) {
+      this.realizingService = new ArrayList<ServiceRef>();
+    }
+    this.realizingService.add(realizingServiceItem);
+    return this;
+  }
+
+  /**
+   * Get realizingService
+   * @return realizingService
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ServiceRef> getRealizingService() {
+    return realizingService;
+  }
+
+  public void setRealizingService(List<ServiceRef> realizingService) {
+    this.realizingService = realizingService;
+  }
+
+  public ProductRefOrValue relatedParty(List<RelatedParty> relatedParty) {
+    this.relatedParty = relatedParty;
+    return this;
+  }
+
+  public ProductRefOrValue addRelatedPartyItem(RelatedParty relatedPartyItem) {
+    if (this.relatedParty == null) {
+      this.relatedParty = new ArrayList<RelatedParty>();
+    }
+    this.relatedParty.add(relatedPartyItem);
+    return this;
+  }
+
+  /**
+   * Get relatedParty
+   * @return relatedParty
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedParty> getRelatedParty() {
+    return relatedParty;
+  }
+
+  public void setRelatedParty(List<RelatedParty> relatedParty) {
+    this.relatedParty = relatedParty;
+  }
+
+  public ProductRefOrValue status(ProductStatusType status) {
+    this.status = status;
+    return this;
+  }
+
+  /**
+   * Get status
+   * @return status
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductStatusType getStatus() {
+    return status;
+  }
+
+  public void setStatus(ProductStatusType status) {
+    this.status = status;
+  }
+
+  public ProductRefOrValue _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public ProductRefOrValue _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public ProductRefOrValue _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+  public ProductRefOrValue _atReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+    return this;
+  }
+
+  /**
+   * The actual type of the target instance when needed for disambiguation.
+   * @return _atReferredType
+   **/
+  @Schema(description = "The actual type of the target instance when needed for disambiguation.")
+      @NotNull
+
+    public String getAtReferredType() {
+    return _atReferredType;
+  }
+
+  public void setAtReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductRefOrValue productRefOrValue = (ProductRefOrValue) o;
+    return Objects.equals(this.id, productRefOrValue.id) &&
+        Objects.equals(this.href, productRefOrValue.href) &&
+        Objects.equals(this.description, productRefOrValue.description) &&
+        Objects.equals(this.isBundle, productRefOrValue.isBundle) &&
+        Objects.equals(this.isCustomerVisible, productRefOrValue.isCustomerVisible) &&
+        Objects.equals(this.name, productRefOrValue.name) &&
+        Objects.equals(this.orderDate, productRefOrValue.orderDate) &&
+        Objects.equals(this.productSerialNumber, productRefOrValue.productSerialNumber) &&
+        Objects.equals(this.startDate, productRefOrValue.startDate) &&
+        Objects.equals(this.terminationDate, productRefOrValue.terminationDate) &&
+        Objects.equals(this.agreement, productRefOrValue.agreement) &&
+        Objects.equals(this.billingAccount, productRefOrValue.billingAccount) &&
+        Objects.equals(this.place, productRefOrValue.place) &&
+        Objects.equals(this.product, productRefOrValue.product) &&
+        Objects.equals(this.productCharacteristic, productRefOrValue.productCharacteristic) &&
+        Objects.equals(this.productOffering, productRefOrValue.productOffering) &&
+        Objects.equals(this.productOrderItem, productRefOrValue.productOrderItem) &&
+        Objects.equals(this.productPrice, productRefOrValue.productPrice) &&
+        Objects.equals(this.productRelationship, productRefOrValue.productRelationship) &&
+        Objects.equals(this.productSpecification, productRefOrValue.productSpecification) &&
+        Objects.equals(this.productTerm, productRefOrValue.productTerm) &&
+        Objects.equals(this.realizingResource, productRefOrValue.realizingResource) &&
+        Objects.equals(this.realizingService, productRefOrValue.realizingService) &&
+        Objects.equals(this.relatedParty, productRefOrValue.relatedParty) &&
+        Objects.equals(this.status, productRefOrValue.status) &&
+        Objects.equals(this._atBaseType, productRefOrValue._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, productRefOrValue._atSchemaLocation) &&
+        Objects.equals(this._atType, productRefOrValue._atType) &&
+        Objects.equals(this._atReferredType, productRefOrValue._atReferredType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, description, isBundle, isCustomerVisible, name, orderDate, productSerialNumber, startDate, terminationDate, agreement, billingAccount, place, product, productCharacteristic, productOffering, productOrderItem, productPrice, productRelationship, productSpecification, productTerm, realizingResource, realizingService, relatedParty, status, _atBaseType, _atSchemaLocation, _atType, _atReferredType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductRefOrValue {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    isBundle: ").append(toIndentedString(isBundle)).append("\n");
+    sb.append("    isCustomerVisible: ").append(toIndentedString(isCustomerVisible)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    orderDate: ").append(toIndentedString(orderDate)).append("\n");
+    sb.append("    productSerialNumber: ").append(toIndentedString(productSerialNumber)).append("\n");
+    sb.append("    startDate: ").append(toIndentedString(startDate)).append("\n");
+    sb.append("    terminationDate: ").append(toIndentedString(terminationDate)).append("\n");
+    sb.append("    agreement: ").append(toIndentedString(agreement)).append("\n");
+    sb.append("    billingAccount: ").append(toIndentedString(billingAccount)).append("\n");
+    sb.append("    place: ").append(toIndentedString(place)).append("\n");
+    sb.append("    product: ").append(toIndentedString(product)).append("\n");
+    sb.append("    productCharacteristic: ").append(toIndentedString(productCharacteristic)).append("\n");
+    sb.append("    productOffering: ").append(toIndentedString(productOffering)).append("\n");
+    sb.append("    productOrderItem: ").append(toIndentedString(productOrderItem)).append("\n");
+    sb.append("    productPrice: ").append(toIndentedString(productPrice)).append("\n");
+    sb.append("    productRelationship: ").append(toIndentedString(productRelationship)).append("\n");
+    sb.append("    productSpecification: ").append(toIndentedString(productSpecification)).append("\n");
+    sb.append("    productTerm: ").append(toIndentedString(productTerm)).append("\n");
+    sb.append("    realizingResource: ").append(toIndentedString(realizingResource)).append("\n");
+    sb.append("    realizingService: ").append(toIndentedString(realizingService)).append("\n");
+    sb.append("    relatedParty: ").append(toIndentedString(relatedParty)).append("\n");
+    sb.append("    status: ").append(toIndentedString(status)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("    _atReferredType: ").append(toIndentedString(_atReferredType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductRelationship.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductRelationship.java
new file mode 100644
index 0000000000000000000000000000000000000000..e0da3dfb99a817bfb0a394634a26869ae16a9d69
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductRelationship.java
@@ -0,0 +1,181 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * Linked products to the one instantiate, such as [bundled] if the product is a bundle and you want to describe the bundled products inside this bundle; [reliesOn] if the product needs another already owned product to rely on (e.g. an option on an already owned mobile access product) [targets] or [isTargeted] (depending on the way of expressing the link) for any other kind of links that may be useful
+ */
+@Schema(description = "Linked products to the one instantiate, such as [bundled] if the product is a bundle and you want to describe the bundled products inside this bundle; [reliesOn] if the product needs another already owned product to rely on (e.g. an option on an already owned mobile access product) [targets] or [isTargeted] (depending on the way of expressing the link) for any other kind of links that may be useful")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductRelationship   {
+  @JsonProperty("relationshipType")
+  private String relationshipType = null;
+
+  @JsonProperty("product")
+  private ProductRefOrValue product = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public ProductRelationship relationshipType(String relationshipType) {
+    this.relationshipType = relationshipType;
+    return this;
+  }
+
+  /**
+   * Type of the product relationship, such as [bundled] if the product is a bundle and you want to describe the bundled products inside this bundle; [reliesOn] if the product needs another already owned product to rely on (e.g. an option on an already owned mobile access product) [targets] or [isTargeted] (depending on the way of expressing the link) for any other kind of links that may be useful
+   * @return relationshipType
+   **/
+  @Schema(required = true, description = "Type of the product relationship, such as [bundled] if the product is a bundle and you want to describe the bundled products inside this bundle; [reliesOn] if the product needs another already owned product to rely on (e.g. an option on an already owned mobile access product) [targets] or [isTargeted] (depending on the way of expressing the link) for any other kind of links that may be useful")
+      @NotNull
+
+    public String getRelationshipType() {
+    return relationshipType;
+  }
+
+  public void setRelationshipType(String relationshipType) {
+    this.relationshipType = relationshipType;
+  }
+
+  public ProductRelationship product(ProductRefOrValue product) {
+    this.product = product;
+    return this;
+  }
+
+  /**
+   * Get product
+   * @return product
+   **/
+  @Schema(required = true, description = "")
+      @NotNull
+
+    @Valid
+    public ProductRefOrValue getProduct() {
+    return product;
+  }
+
+  public void setProduct(ProductRefOrValue product) {
+    this.product = product;
+  }
+
+  public ProductRelationship _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public ProductRelationship _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public ProductRelationship _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductRelationship productRelationship = (ProductRelationship) o;
+    return Objects.equals(this.relationshipType, productRelationship.relationshipType) &&
+        Objects.equals(this.product, productRelationship.product) &&
+        Objects.equals(this._atBaseType, productRelationship._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, productRelationship._atSchemaLocation) &&
+        Objects.equals(this._atType, productRelationship._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(relationshipType, product, _atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductRelationship {\n");
+    
+    sb.append("    relationshipType: ").append(toIndentedString(relationshipType)).append("\n");
+    sb.append("    product: ").append(toIndentedString(product)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductSpecificationRef.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductSpecificationRef.java
new file mode 100644
index 0000000000000000000000000000000000000000..6139e53ddc272bd961006176c902afc6af32a4cf
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductSpecificationRef.java
@@ -0,0 +1,281 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * Product specification reference: A ProductSpecification is a detailed description of a tangible or intangible object made available externally in the form of a ProductOffering to customers or other parties playing a party role.
+ */
+@Schema(description = "Product specification reference: A ProductSpecification is a detailed description of a tangible or intangible object made available externally in the form of a ProductOffering to customers or other parties playing a party role.")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductSpecificationRef   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("version")
+  private String version = null;
+
+  @JsonProperty("targetProductSchema")
+  private TargetProductSchema targetProductSchema = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  @JsonProperty("@referredType")
+  private String _atReferredType = null;
+
+  public ProductSpecificationRef id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Unique identifier of a related entity.
+   * @return id
+   **/
+  @Schema(required = true, description = "Unique identifier of a related entity.")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public ProductSpecificationRef href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the related entity.
+   * @return href
+   **/
+  @Schema(description = "Reference of the related entity.")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public ProductSpecificationRef name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the related entity.
+   * @return name
+   **/
+  @Schema(description = "Name of the related entity.")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public ProductSpecificationRef version(String version) {
+    this.version = version;
+    return this;
+  }
+
+  /**
+   * Version of the product specification
+   * @return version
+   **/
+  @Schema(description = "Version of the product specification")
+      @NotNull
+
+    public String getVersion() {
+    return version;
+  }
+
+  public void setVersion(String version) {
+    this.version = version;
+  }
+
+  public ProductSpecificationRef targetProductSchema(TargetProductSchema targetProductSchema) {
+    this.targetProductSchema = targetProductSchema;
+    return this;
+  }
+
+  /**
+   * Get targetProductSchema
+   * @return targetProductSchema
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public TargetProductSchema getTargetProductSchema() {
+    return targetProductSchema;
+  }
+
+  public void setTargetProductSchema(TargetProductSchema targetProductSchema) {
+    this.targetProductSchema = targetProductSchema;
+  }
+
+  public ProductSpecificationRef _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public ProductSpecificationRef _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public ProductSpecificationRef _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+  public ProductSpecificationRef _atReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+    return this;
+  }
+
+  /**
+   * The actual type of the target instance when needed for disambiguation.
+   * @return _atReferredType
+   **/
+  @Schema(description = "The actual type of the target instance when needed for disambiguation.")
+      @NotNull
+
+    public String getAtReferredType() {
+    return _atReferredType;
+  }
+
+  public void setAtReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductSpecificationRef productSpecificationRef = (ProductSpecificationRef) o;
+    return Objects.equals(this.id, productSpecificationRef.id) &&
+        Objects.equals(this.href, productSpecificationRef.href) &&
+        Objects.equals(this.name, productSpecificationRef.name) &&
+        Objects.equals(this.version, productSpecificationRef.version) &&
+        Objects.equals(this.targetProductSchema, productSpecificationRef.targetProductSchema) &&
+        Objects.equals(this._atBaseType, productSpecificationRef._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, productSpecificationRef._atSchemaLocation) &&
+        Objects.equals(this._atType, productSpecificationRef._atType) &&
+        Objects.equals(this._atReferredType, productSpecificationRef._atReferredType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, name, version, targetProductSchema, _atBaseType, _atSchemaLocation, _atType, _atReferredType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductSpecificationRef {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    version: ").append(toIndentedString(version)).append("\n");
+    sb.append("    targetProductSchema: ").append(toIndentedString(targetProductSchema)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("    _atReferredType: ").append(toIndentedString(_atReferredType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductStateChangeEvent.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductStateChangeEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5aa7f6af06ea4e8d869fdd2da77fcb3a77a252b
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductStateChangeEvent.java
@@ -0,0 +1,359 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Date;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The notification data structure
+ */
+@Schema(description = "The notification data structure")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductStateChangeEvent   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("eventId")
+  private String eventId = null;
+
+  @JsonProperty("eventTime")
+  private Date eventTime = null;
+
+  @JsonProperty("eventType")
+  private String eventType = null;
+
+  @JsonProperty("correlationId")
+  private String correlationId = null;
+
+  @JsonProperty("domain")
+  private String domain = null;
+
+  @JsonProperty("title")
+  private String title = null;
+
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("priority")
+  private String priority = null;
+
+  @JsonProperty("timeOcurred")
+  private Date timeOcurred = null;
+
+  @JsonProperty("event")
+  private ProductStateChangeEventPayload event = null;
+
+  public ProductStateChangeEvent id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Identifier of the Process flow
+   * @return id
+   **/
+  @Schema(description = "Identifier of the Process flow")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public ProductStateChangeEvent href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Reference of the ProcessFlow
+   * @return href
+   **/
+  @Schema(description = "Reference of the ProcessFlow")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public ProductStateChangeEvent eventId(String eventId) {
+    this.eventId = eventId;
+    return this;
+  }
+
+  /**
+   * The identifier of the notification.
+   * @return eventId
+   **/
+  @Schema(description = "The identifier of the notification.")
+      @NotNull
+
+    public String getEventId() {
+    return eventId;
+  }
+
+  public void setEventId(String eventId) {
+    this.eventId = eventId;
+  }
+
+  public ProductStateChangeEvent eventTime(Date eventTime) {
+    this.eventTime = eventTime;
+    return this;
+  }
+
+  /**
+   * Time of the event occurrence.
+   * @return eventTime
+   **/
+  @Schema(description = "Time of the event occurrence.")
+      @NotNull
+
+    @Valid
+    public Date getEventTime() {
+    return eventTime;
+  }
+
+  public void setEventTime(Date eventTime) {
+    this.eventTime = eventTime;
+  }
+
+  public ProductStateChangeEvent eventType(String eventType) {
+    this.eventType = eventType;
+    return this;
+  }
+
+  /**
+   * The type of the notification.
+   * @return eventType
+   **/
+  @Schema(description = "The type of the notification.")
+      @NotNull
+
+    public String getEventType() {
+    return eventType;
+  }
+
+  public void setEventType(String eventType) {
+    this.eventType = eventType;
+  }
+
+  public ProductStateChangeEvent correlationId(String correlationId) {
+    this.correlationId = correlationId;
+    return this;
+  }
+
+  /**
+   * The correlation id for this event.
+   * @return correlationId
+   **/
+  @Schema(description = "The correlation id for this event.")
+      @NotNull
+
+    public String getCorrelationId() {
+    return correlationId;
+  }
+
+  public void setCorrelationId(String correlationId) {
+    this.correlationId = correlationId;
+  }
+
+  public ProductStateChangeEvent domain(String domain) {
+    this.domain = domain;
+    return this;
+  }
+
+  /**
+   * The domain of the event.
+   * @return domain
+   **/
+  @Schema(description = "The domain of the event.")
+      @NotNull
+
+    public String getDomain() {
+    return domain;
+  }
+
+  public void setDomain(String domain) {
+    this.domain = domain;
+  }
+
+  public ProductStateChangeEvent title(String title) {
+    this.title = title;
+    return this;
+  }
+
+  /**
+   * The title of the event.
+   * @return title
+   **/
+  @Schema(description = "The title of the event.")
+      @NotNull
+
+    public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  public ProductStateChangeEvent description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * An explnatory of the event.
+   * @return description
+   **/
+  @Schema(description = "An explnatory of the event.")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public ProductStateChangeEvent priority(String priority) {
+    this.priority = priority;
+    return this;
+  }
+
+  /**
+   * A priority.
+   * @return priority
+   **/
+  @Schema(description = "A priority.")
+      @NotNull
+
+    public String getPriority() {
+    return priority;
+  }
+
+  public void setPriority(String priority) {
+    this.priority = priority;
+  }
+
+  public ProductStateChangeEvent timeOcurred(Date timeOcurred) {
+    this.timeOcurred = timeOcurred;
+    return this;
+  }
+
+  /**
+   * The time the event occured.
+   * @return timeOcurred
+   **/
+  @Schema(description = "The time the event occured.")
+      @NotNull
+
+    @Valid
+    public Date getTimeOcurred() {
+    return timeOcurred;
+  }
+
+  public void setTimeOcurred(Date timeOcurred) {
+    this.timeOcurred = timeOcurred;
+  }
+
+  public ProductStateChangeEvent event(ProductStateChangeEventPayload event) {
+    this.event = event;
+    return this;
+  }
+
+  /**
+   * Get event
+   * @return event
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductStateChangeEventPayload getEvent() {
+    return event;
+  }
+
+  public void setEvent(ProductStateChangeEventPayload event) {
+    this.event = event;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductStateChangeEvent productStateChangeEvent = (ProductStateChangeEvent) o;
+    return Objects.equals(this.id, productStateChangeEvent.id) &&
+        Objects.equals(this.href, productStateChangeEvent.href) &&
+        Objects.equals(this.eventId, productStateChangeEvent.eventId) &&
+        Objects.equals(this.eventTime, productStateChangeEvent.eventTime) &&
+        Objects.equals(this.eventType, productStateChangeEvent.eventType) &&
+        Objects.equals(this.correlationId, productStateChangeEvent.correlationId) &&
+        Objects.equals(this.domain, productStateChangeEvent.domain) &&
+        Objects.equals(this.title, productStateChangeEvent.title) &&
+        Objects.equals(this.description, productStateChangeEvent.description) &&
+        Objects.equals(this.priority, productStateChangeEvent.priority) &&
+        Objects.equals(this.timeOcurred, productStateChangeEvent.timeOcurred) &&
+        Objects.equals(this.event, productStateChangeEvent.event);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, eventId, eventTime, eventType, correlationId, domain, title, description, priority, timeOcurred, event);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductStateChangeEvent {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    eventId: ").append(toIndentedString(eventId)).append("\n");
+    sb.append("    eventTime: ").append(toIndentedString(eventTime)).append("\n");
+    sb.append("    eventType: ").append(toIndentedString(eventType)).append("\n");
+    sb.append("    correlationId: ").append(toIndentedString(correlationId)).append("\n");
+    sb.append("    domain: ").append(toIndentedString(domain)).append("\n");
+    sb.append("    title: ").append(toIndentedString(title)).append("\n");
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    priority: ").append(toIndentedString(priority)).append("\n");
+    sb.append("    timeOcurred: ").append(toIndentedString(timeOcurred)).append("\n");
+    sb.append("    event: ").append(toIndentedString(event)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductStateChangeEventPayload.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductStateChangeEventPayload.java
new file mode 100644
index 0000000000000000000000000000000000000000..a492a3f7a49db34af09a948afd38d280f77316c7
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductStateChangeEventPayload.java
@@ -0,0 +1,81 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The event data structure
+ */
+@Schema(description = "The event data structure")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductStateChangeEventPayload   {
+  @JsonProperty("product")
+  private Product product = null;
+
+  public ProductStateChangeEventPayload product(Product product) {
+    this.product = product;
+    return this;
+  }
+
+  /**
+   * Get product
+   * @return product
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public Product getProduct() {
+    return product;
+  }
+
+  public void setProduct(Product product) {
+    this.product = product;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductStateChangeEventPayload productStateChangeEventPayload = (ProductStateChangeEventPayload) o;
+    return Objects.equals(this.product, productStateChangeEventPayload.product);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(product);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductStateChangeEventPayload {\n");
+    
+    sb.append("    product: ").append(toIndentedString(product)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductStatusType.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductStatusType.java
new file mode 100644
index 0000000000000000000000000000000000000000..3623cfc29e09082713301d1da96fa59c5cfb7c55
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductStatusType.java
@@ -0,0 +1,40 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Possible values for the status of the product
+ */
+public enum ProductStatusType {
+  CREATED("created"),
+    PENDINGACTIVE("pendingActive"),
+    CANCELLED("cancelled"),
+    ACTIVE("active"),
+    PENDINGTERMINATE("pendingTerminate"),
+    TERMINATED("terminated"),
+    SUSPENDED("suspended"),
+    ABORTED_("aborted ");
+
+  private String value;
+
+  ProductStatusType(String value) {
+    this.value = value;
+  }
+
+  @Override
+  @JsonValue
+  public String toString() {
+    return String.valueOf(value);
+  }
+
+  @JsonCreator
+  public static ProductStatusType fromValue(String text) {
+    for (ProductStatusType b : ProductStatusType.values()) {
+      if (String.valueOf(b.value).equals(text)) {
+        return b;
+      }
+    }
+    return null;
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductTerm.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductTerm.java
new file mode 100644
index 0000000000000000000000000000000000000000..be680b159b57a8a502844b3ffb8341f1b06c4c55
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductTerm.java
@@ -0,0 +1,233 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.etsi.osl.tmf.common.model.Quantity;
+import org.etsi.osl.tmf.common.model.TimePeriod;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+/**
+ * Description of a productTerm linked to this product. This represent a commitment with a duration
+ */
+@Schema(description = "Description of a productTerm linked to this product. This represent a commitment with a duration")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductTerm   {
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("duration")
+  private Quantity duration = null;
+
+  @JsonProperty("validFor")
+  private TimePeriod validFor = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public ProductTerm description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * Description of the productTerm
+   * @return description
+   **/
+  @Schema(description = "Description of the productTerm")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public ProductTerm name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the productTerm
+   * @return name
+   **/
+  @Schema(description = "Name of the productTerm")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public ProductTerm duration(Quantity duration) {
+    this.duration = duration;
+    return this;
+  }
+
+  /**
+   * Get duration
+   * @return duration
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public Quantity getDuration() {
+    return duration;
+  }
+
+  public void setDuration(Quantity duration) {
+    this.duration = duration;
+  }
+
+  public ProductTerm validFor(TimePeriod validFor) {
+    this.validFor = validFor;
+    return this;
+  }
+
+  /**
+   * Get validFor
+   * @return validFor
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public TimePeriod getValidFor() {
+    return validFor;
+  }
+
+  public void setValidFor(TimePeriod validFor) {
+    this.validFor = validFor;
+  }
+
+  public ProductTerm _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public ProductTerm _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public ProductTerm _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductTerm productTerm = (ProductTerm) o;
+    return Objects.equals(this.description, productTerm.description) &&
+        Objects.equals(this.name, productTerm.name) &&
+        Objects.equals(this.duration, productTerm.duration) &&
+        Objects.equals(this.validFor, productTerm.validFor) &&
+        Objects.equals(this._atBaseType, productTerm._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, productTerm._atSchemaLocation) &&
+        Objects.equals(this._atType, productTerm._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(description, name, duration, validFor, _atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductTerm {\n");
+    
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    duration: ").append(toIndentedString(duration)).append("\n");
+    sb.append("    validFor: ").append(toIndentedString(validFor)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/ProductUpdate.java b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductUpdate.java
new file mode 100644
index 0000000000000000000000000000000000000000..a83911732416c5c821162012f837590aea298399
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/ProductUpdate.java
@@ -0,0 +1,819 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
+import org.etsi.osl.tmf.common.model.service.ResourceRef;
+import org.etsi.osl.tmf.common.model.service.ServiceRef;
+import org.etsi.osl.tmf.po622.model.AgreementItemRef;
+import org.etsi.osl.tmf.prm669.model.RelatedParty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * A product offering procured by a customer or other interested party playing a party role. A product is realized as one or more service(s) and / or resource(s). Skipped properties: id,href
+ */
+@Schema(description = "A product offering procured by a customer or other interested party playing a party role. A product is realized as one or more service(s) and / or resource(s). Skipped properties: id,href")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class ProductUpdate   {
+  @JsonProperty("description")
+  private String description = null;
+
+  @JsonProperty("isBundle")
+  private Boolean isBundle = null;
+
+  @JsonProperty("isCustomerVisible")
+  private Boolean isCustomerVisible = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("orderDate")
+  private Date orderDate = null;
+
+  @JsonProperty("productSerialNumber")
+  private String productSerialNumber = null;
+
+  @JsonProperty("startDate")
+  private Date startDate = null;
+
+  @JsonProperty("terminationDate")
+  private Date terminationDate = null;
+
+  @JsonProperty("agreement")
+  @Valid
+  private List<AgreementItemRef> agreement = null;
+
+  @JsonProperty("billingAccount")
+  private BillingAccountRef billingAccount = null;
+
+  @JsonProperty("place")
+  @Valid
+  private List<RelatedPlaceRefOrValue> place = null;
+
+  @JsonProperty("product")
+  @Valid
+  private List<ProductRefOrValue> product = null;
+
+  @JsonProperty("productCharacteristic")
+  @Valid
+  private List<Characteristic> productCharacteristic = null;
+
+  @JsonProperty("productOffering")
+  private ProductOfferingRef productOffering = null;
+
+  @JsonProperty("productOrderItem")
+  @Valid
+  private List<RelatedProductOrderItem> productOrderItem = null;
+
+  @JsonProperty("productPrice")
+  @Valid
+  private List<ProductPrice> productPrice = null;
+
+  @JsonProperty("productRelationship")
+  @Valid
+  private List<ProductRelationship> productRelationship = null;
+
+  @JsonProperty("productSpecification")
+  private ProductSpecificationRef productSpecification = null;
+
+  @JsonProperty("productTerm")
+  @Valid
+  private List<ProductTerm> productTerm = null;
+
+  @JsonProperty("realizingResource")
+  @Valid
+  private List<ResourceRef> realizingResource = null;
+
+  @JsonProperty("realizingService")
+  @Valid
+  private List<ServiceRef> realizingService = null;
+
+  @JsonProperty("relatedParty")
+  @Valid
+  private List<RelatedParty> relatedParty = null;
+
+  @JsonProperty("status")
+  private ProductStatusType status = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public ProductUpdate description(String description) {
+    this.description = description;
+    return this;
+  }
+
+  /**
+   * Is the description of the product. It could be copied from the description of the Product Offering.
+   * @return description
+   **/
+  @Schema(description = "Is the description of the product. It could be copied from the description of the Product Offering.")
+      @NotNull
+
+    public String getDescription() {
+    return description;
+  }
+
+  public void setDescription(String description) {
+    this.description = description;
+  }
+
+  public ProductUpdate isBundle(Boolean isBundle) {
+    this.isBundle = isBundle;
+    return this;
+  }
+
+  /**
+   * If true, the product is a ProductBundle which is an instantiation of a BundledProductOffering. If false, the product is a ProductComponent which is an instantiation of a SimpleProductOffering.
+   * @return isBundle
+   **/
+  @Schema(description = "If true, the product is a ProductBundle which is an instantiation of a BundledProductOffering. If false, the product is a ProductComponent which is an instantiation of a SimpleProductOffering.")
+      @NotNull
+
+    public Boolean isIsBundle() {
+    return isBundle;
+  }
+
+  public void setIsBundle(Boolean isBundle) {
+    this.isBundle = isBundle;
+  }
+
+  public ProductUpdate isCustomerVisible(Boolean isCustomerVisible) {
+    this.isCustomerVisible = isCustomerVisible;
+    return this;
+  }
+
+  /**
+   * If true, the product is visible by the customer.
+   * @return isCustomerVisible
+   **/
+  @Schema(description = "If true, the product is visible by the customer.")
+      @NotNull
+
+    public Boolean isIsCustomerVisible() {
+    return isCustomerVisible;
+  }
+
+  public void setIsCustomerVisible(Boolean isCustomerVisible) {
+    this.isCustomerVisible = isCustomerVisible;
+  }
+
+  public ProductUpdate name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * Name of the product. It could be the same as the name of the product offering
+   * @return name
+   **/
+  @Schema(description = "Name of the product. It could be the same as the name of the product offering")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public ProductUpdate orderDate(Date orderDate) {
+    this.orderDate = orderDate;
+    return this;
+  }
+
+  /**
+   * Is the date when the product was ordered
+   * @return orderDate
+   **/
+  @Schema(description = "Is the date when the product was ordered")
+      @NotNull
+
+    @Valid
+    public Date getOrderDate() {
+    return orderDate;
+  }
+
+  public void setOrderDate(Date orderDate) {
+    this.orderDate = orderDate;
+  }
+
+  public ProductUpdate productSerialNumber(String productSerialNumber) {
+    this.productSerialNumber = productSerialNumber;
+    return this;
+  }
+
+  /**
+   * Is the serial number for the product. This is typically applicable to tangible products e.g. Broadband Router.
+   * @return productSerialNumber
+   **/
+  @Schema(description = "Is the serial number for the product. This is typically applicable to tangible products e.g. Broadband Router.")
+      @NotNull
+
+    public String getProductSerialNumber() {
+    return productSerialNumber;
+  }
+
+  public void setProductSerialNumber(String productSerialNumber) {
+    this.productSerialNumber = productSerialNumber;
+  }
+
+  public ProductUpdate startDate(Date startDate) {
+    this.startDate = startDate;
+    return this;
+  }
+
+  /**
+   * Is the date from which the product starts
+   * @return startDate
+   **/
+  @Schema(description = "Is the date from which the product starts")
+      @NotNull
+
+    @Valid
+    public Date getStartDate() {
+    return startDate;
+  }
+
+  public void setStartDate(Date startDate) {
+    this.startDate = startDate;
+  }
+
+  public ProductUpdate terminationDate(Date terminationDate) {
+    this.terminationDate = terminationDate;
+    return this;
+  }
+
+  /**
+   * Is the date when the product was terminated
+   * @return terminationDate
+   **/
+  @Schema(description = "Is the date when the product was terminated")
+      @NotNull
+
+    @Valid
+    public Date getTerminationDate() {
+    return terminationDate;
+  }
+
+  public void setTerminationDate(Date terminationDate) {
+    this.terminationDate = terminationDate;
+  }
+
+  public ProductUpdate agreement(List<AgreementItemRef> agreement) {
+    this.agreement = agreement;
+    return this;
+  }
+
+  public ProductUpdate addAgreementItem(AgreementItemRef agreementItem) {
+    if (this.agreement == null) {
+      this.agreement = new ArrayList<AgreementItemRef>();
+    }
+    this.agreement.add(agreementItem);
+    return this;
+  }
+
+  /**
+   * Get agreement
+   * @return agreement
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<AgreementItemRef> getAgreement() {
+    return agreement;
+  }
+
+  public void setAgreement(List<AgreementItemRef> agreement) {
+    this.agreement = agreement;
+  }
+
+  public ProductUpdate billingAccount(BillingAccountRef billingAccount) {
+    this.billingAccount = billingAccount;
+    return this;
+  }
+
+  /**
+   * Get billingAccount
+   * @return billingAccount
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public BillingAccountRef getBillingAccount() {
+    return billingAccount;
+  }
+
+  public void setBillingAccount(BillingAccountRef billingAccount) {
+    this.billingAccount = billingAccount;
+  }
+
+  public ProductUpdate place(List<RelatedPlaceRefOrValue> place) {
+    this.place = place;
+    return this;
+  }
+
+  public ProductUpdate addPlaceItem(RelatedPlaceRefOrValue placeItem) {
+    if (this.place == null) {
+      this.place = new ArrayList<RelatedPlaceRefOrValue>();
+    }
+    this.place.add(placeItem);
+    return this;
+  }
+
+  /**
+   * Get place
+   * @return place
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedPlaceRefOrValue> getPlace() {
+    return place;
+  }
+
+  public void setPlace(List<RelatedPlaceRefOrValue> place) {
+    this.place = place;
+  }
+
+  public ProductUpdate product(List<ProductRefOrValue> product) {
+    this.product = product;
+    return this;
+  }
+
+  public ProductUpdate addProductItem(ProductRefOrValue productItem) {
+    if (this.product == null) {
+      this.product = new ArrayList<ProductRefOrValue>();
+    }
+    this.product.add(productItem);
+    return this;
+  }
+
+  /**
+   * Get product
+   * @return product
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductRefOrValue> getProduct() {
+    return product;
+  }
+
+  public void setProduct(List<ProductRefOrValue> product) {
+    this.product = product;
+  }
+
+  public ProductUpdate productCharacteristic(List<Characteristic> productCharacteristic) {
+    this.productCharacteristic = productCharacteristic;
+    return this;
+  }
+
+  public ProductUpdate addProductCharacteristicItem(Characteristic productCharacteristicItem) {
+    if (this.productCharacteristic == null) {
+      this.productCharacteristic = new ArrayList<Characteristic>();
+    }
+    this.productCharacteristic.add(productCharacteristicItem);
+    return this;
+  }
+
+  /**
+   * Get productCharacteristic
+   * @return productCharacteristic
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<Characteristic> getProductCharacteristic() {
+    return productCharacteristic;
+  }
+
+  public void setProductCharacteristic(List<Characteristic> productCharacteristic) {
+    this.productCharacteristic = productCharacteristic;
+  }
+
+  public ProductUpdate productOffering(ProductOfferingRef productOffering) {
+    this.productOffering = productOffering;
+    return this;
+  }
+
+  /**
+   * Get productOffering
+   * @return productOffering
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductOfferingRef getProductOffering() {
+    return productOffering;
+  }
+
+  public void setProductOffering(ProductOfferingRef productOffering) {
+    this.productOffering = productOffering;
+  }
+
+  public ProductUpdate productOrderItem(List<RelatedProductOrderItem> productOrderItem) {
+    this.productOrderItem = productOrderItem;
+    return this;
+  }
+
+  public ProductUpdate addProductOrderItemItem(RelatedProductOrderItem productOrderItemItem) {
+    if (this.productOrderItem == null) {
+      this.productOrderItem = new ArrayList<RelatedProductOrderItem>();
+    }
+    this.productOrderItem.add(productOrderItemItem);
+    return this;
+  }
+
+  /**
+   * Get productOrderItem
+   * @return productOrderItem
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedProductOrderItem> getProductOrderItem() {
+    return productOrderItem;
+  }
+
+  public void setProductOrderItem(List<RelatedProductOrderItem> productOrderItem) {
+    this.productOrderItem = productOrderItem;
+  }
+
+  public ProductUpdate productPrice(List<ProductPrice> productPrice) {
+    this.productPrice = productPrice;
+    return this;
+  }
+
+  public ProductUpdate addProductPriceItem(ProductPrice productPriceItem) {
+    if (this.productPrice == null) {
+      this.productPrice = new ArrayList<ProductPrice>();
+    }
+    this.productPrice.add(productPriceItem);
+    return this;
+  }
+
+  /**
+   * Get productPrice
+   * @return productPrice
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductPrice> getProductPrice() {
+    return productPrice;
+  }
+
+  public void setProductPrice(List<ProductPrice> productPrice) {
+    this.productPrice = productPrice;
+  }
+
+  public ProductUpdate productRelationship(List<ProductRelationship> productRelationship) {
+    this.productRelationship = productRelationship;
+    return this;
+  }
+
+  public ProductUpdate addProductRelationshipItem(ProductRelationship productRelationshipItem) {
+    if (this.productRelationship == null) {
+      this.productRelationship = new ArrayList<ProductRelationship>();
+    }
+    this.productRelationship.add(productRelationshipItem);
+    return this;
+  }
+
+  /**
+   * Get productRelationship
+   * @return productRelationship
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductRelationship> getProductRelationship() {
+    return productRelationship;
+  }
+
+  public void setProductRelationship(List<ProductRelationship> productRelationship) {
+    this.productRelationship = productRelationship;
+  }
+
+  public ProductUpdate productSpecification(ProductSpecificationRef productSpecification) {
+    this.productSpecification = productSpecification;
+    return this;
+  }
+
+  /**
+   * Get productSpecification
+   * @return productSpecification
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductSpecificationRef getProductSpecification() {
+    return productSpecification;
+  }
+
+  public void setProductSpecification(ProductSpecificationRef productSpecification) {
+    this.productSpecification = productSpecification;
+  }
+
+  public ProductUpdate productTerm(List<ProductTerm> productTerm) {
+    this.productTerm = productTerm;
+    return this;
+  }
+
+  public ProductUpdate addProductTermItem(ProductTerm productTermItem) {
+    if (this.productTerm == null) {
+      this.productTerm = new ArrayList<ProductTerm>();
+    }
+    this.productTerm.add(productTermItem);
+    return this;
+  }
+
+  /**
+   * Get productTerm
+   * @return productTerm
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ProductTerm> getProductTerm() {
+    return productTerm;
+  }
+
+  public void setProductTerm(List<ProductTerm> productTerm) {
+    this.productTerm = productTerm;
+  }
+
+  public ProductUpdate realizingResource(List<ResourceRef> realizingResource) {
+    this.realizingResource = realizingResource;
+    return this;
+  }
+
+  public ProductUpdate addRealizingResourceItem(ResourceRef realizingResourceItem) {
+    if (this.realizingResource == null) {
+      this.realizingResource = new ArrayList<ResourceRef>();
+    }
+    this.realizingResource.add(realizingResourceItem);
+    return this;
+  }
+
+  /**
+   * Get realizingResource
+   * @return realizingResource
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ResourceRef> getRealizingResource() {
+    return realizingResource;
+  }
+
+  public void setRealizingResource(List<ResourceRef> realizingResource) {
+    this.realizingResource = realizingResource;
+  }
+
+  public ProductUpdate realizingService(List<ServiceRef> realizingService) {
+    this.realizingService = realizingService;
+    return this;
+  }
+
+  public ProductUpdate addRealizingServiceItem(ServiceRef realizingServiceItem) {
+    if (this.realizingService == null) {
+      this.realizingService = new ArrayList<ServiceRef>();
+    }
+    this.realizingService.add(realizingServiceItem);
+    return this;
+  }
+
+  /**
+   * Get realizingService
+   * @return realizingService
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<ServiceRef> getRealizingService() {
+    return realizingService;
+  }
+
+  public void setRealizingService(List<ServiceRef> realizingService) {
+    this.realizingService = realizingService;
+  }
+
+  public ProductUpdate relatedParty(List<RelatedParty> relatedParty) {
+    this.relatedParty = relatedParty;
+    return this;
+  }
+
+  public ProductUpdate addRelatedPartyItem(RelatedParty relatedPartyItem) {
+    if (this.relatedParty == null) {
+      this.relatedParty = new ArrayList<RelatedParty>();
+    }
+    this.relatedParty.add(relatedPartyItem);
+    return this;
+  }
+
+  /**
+   * Get relatedParty
+   * @return relatedParty
+   **/
+  @Schema(description = "")
+      @NotNull
+    @Valid
+    public List<RelatedParty> getRelatedParty() {
+    return relatedParty;
+  }
+
+  public void setRelatedParty(List<RelatedParty> relatedParty) {
+    this.relatedParty = relatedParty;
+  }
+
+  public ProductUpdate status(ProductStatusType status) {
+    this.status = status;
+    return this;
+  }
+
+  /**
+   * Get status
+   * @return status
+   **/
+  @Schema(description = "")
+      @NotNull
+
+    @Valid
+    public ProductStatusType getStatus() {
+    return status;
+  }
+
+  public void setStatus(ProductStatusType status) {
+    this.status = status;
+  }
+
+  public ProductUpdate _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public ProductUpdate _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public ProductUpdate _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProductUpdate productUpdate = (ProductUpdate) o;
+    return Objects.equals(this.description, productUpdate.description) &&
+        Objects.equals(this.isBundle, productUpdate.isBundle) &&
+        Objects.equals(this.isCustomerVisible, productUpdate.isCustomerVisible) &&
+        Objects.equals(this.name, productUpdate.name) &&
+        Objects.equals(this.orderDate, productUpdate.orderDate) &&
+        Objects.equals(this.productSerialNumber, productUpdate.productSerialNumber) &&
+        Objects.equals(this.startDate, productUpdate.startDate) &&
+        Objects.equals(this.terminationDate, productUpdate.terminationDate) &&
+        Objects.equals(this.agreement, productUpdate.agreement) &&
+        Objects.equals(this.billingAccount, productUpdate.billingAccount) &&
+        Objects.equals(this.place, productUpdate.place) &&
+        Objects.equals(this.product, productUpdate.product) &&
+        Objects.equals(this.productCharacteristic, productUpdate.productCharacteristic) &&
+        Objects.equals(this.productOffering, productUpdate.productOffering) &&
+        Objects.equals(this.productOrderItem, productUpdate.productOrderItem) &&
+        Objects.equals(this.productPrice, productUpdate.productPrice) &&
+        Objects.equals(this.productRelationship, productUpdate.productRelationship) &&
+        Objects.equals(this.productSpecification, productUpdate.productSpecification) &&
+        Objects.equals(this.productTerm, productUpdate.productTerm) &&
+        Objects.equals(this.realizingResource, productUpdate.realizingResource) &&
+        Objects.equals(this.realizingService, productUpdate.realizingService) &&
+        Objects.equals(this.relatedParty, productUpdate.relatedParty) &&
+        Objects.equals(this.status, productUpdate.status) &&
+        Objects.equals(this._atBaseType, productUpdate._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, productUpdate._atSchemaLocation) &&
+        Objects.equals(this._atType, productUpdate._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(description, isBundle, isCustomerVisible, name, orderDate, productSerialNumber, startDate, terminationDate, agreement, billingAccount, place, product, productCharacteristic, productOffering, productOrderItem, productPrice, productRelationship, productSpecification, productTerm, realizingResource, realizingService, relatedParty, status, _atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ProductUpdate {\n");
+    
+    sb.append("    description: ").append(toIndentedString(description)).append("\n");
+    sb.append("    isBundle: ").append(toIndentedString(isBundle)).append("\n");
+    sb.append("    isCustomerVisible: ").append(toIndentedString(isCustomerVisible)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    orderDate: ").append(toIndentedString(orderDate)).append("\n");
+    sb.append("    productSerialNumber: ").append(toIndentedString(productSerialNumber)).append("\n");
+    sb.append("    startDate: ").append(toIndentedString(startDate)).append("\n");
+    sb.append("    terminationDate: ").append(toIndentedString(terminationDate)).append("\n");
+    sb.append("    agreement: ").append(toIndentedString(agreement)).append("\n");
+    sb.append("    billingAccount: ").append(toIndentedString(billingAccount)).append("\n");
+    sb.append("    place: ").append(toIndentedString(place)).append("\n");
+    sb.append("    product: ").append(toIndentedString(product)).append("\n");
+    sb.append("    productCharacteristic: ").append(toIndentedString(productCharacteristic)).append("\n");
+    sb.append("    productOffering: ").append(toIndentedString(productOffering)).append("\n");
+    sb.append("    productOrderItem: ").append(toIndentedString(productOrderItem)).append("\n");
+    sb.append("    productPrice: ").append(toIndentedString(productPrice)).append("\n");
+    sb.append("    productRelationship: ").append(toIndentedString(productRelationship)).append("\n");
+    sb.append("    productSpecification: ").append(toIndentedString(productSpecification)).append("\n");
+    sb.append("    productTerm: ").append(toIndentedString(productTerm)).append("\n");
+    sb.append("    realizingResource: ").append(toIndentedString(realizingResource)).append("\n");
+    sb.append("    realizingService: ").append(toIndentedString(realizingService)).append("\n");
+    sb.append("    relatedParty: ").append(toIndentedString(relatedParty)).append("\n");
+    sb.append("    status: ").append(toIndentedString(status)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/RelatedPlaceRefOrValue.java b/src/main/java/org/etsi/osl/tmf/pim637/model/RelatedPlaceRefOrValue.java
new file mode 100644
index 0000000000000000000000000000000000000000..7aebfcb217de1f70f0ccc9eab74657b219cad427
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/RelatedPlaceRefOrValue.java
@@ -0,0 +1,254 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * Related Entity reference. A related place defines a place described by reference or by value linked to a specific entity. The polymorphic attributes @type, @schemaLocation &amp; @referredType are related to the place entity and not the RelatedPlaceRefOrValue class itself
+ */
+@Schema(description = "Related Entity reference. A related place defines a place described by reference or by value linked to a specific entity. The polymorphic attributes @type, @schemaLocation & @referredType are related to the place entity and not the RelatedPlaceRefOrValue class itself")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class RelatedPlaceRefOrValue   {
+  @JsonProperty("id")
+  private String id = null;
+
+  @JsonProperty("href")
+  private String href = null;
+
+  @JsonProperty("name")
+  private String name = null;
+
+  @JsonProperty("role")
+  private String role = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  @JsonProperty("@referredType")
+  private String _atReferredType = null;
+
+  public RelatedPlaceRefOrValue id(String id) {
+    this.id = id;
+    return this;
+  }
+
+  /**
+   * Unique identifier of the place
+   * @return id
+   **/
+  @Schema(description = "Unique identifier of the place")
+      @NotNull
+
+    public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
+  public RelatedPlaceRefOrValue href(String href) {
+    this.href = href;
+    return this;
+  }
+
+  /**
+   * Unique reference of the place
+   * @return href
+   **/
+  @Schema(description = "Unique reference of the place")
+      @NotNull
+
+    public String getHref() {
+    return href;
+  }
+
+  public void setHref(String href) {
+    this.href = href;
+  }
+
+  public RelatedPlaceRefOrValue name(String name) {
+    this.name = name;
+    return this;
+  }
+
+  /**
+   * A user-friendly name for the place, such as [Paris Store], [London Store], [Main Home]
+   * @return name
+   **/
+  @Schema(description = "A user-friendly name for the place, such as [Paris Store], [London Store], [Main Home]")
+      @NotNull
+
+    public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+  public RelatedPlaceRefOrValue role(String role) {
+    this.role = role;
+    return this;
+  }
+
+  /**
+   * Get role
+   * @return role
+   **/
+  @Schema(required = true, description = "")
+      @NotNull
+
+    public String getRole() {
+    return role;
+  }
+
+  public void setRole(String role) {
+    this.role = role;
+  }
+
+  public RelatedPlaceRefOrValue _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public RelatedPlaceRefOrValue _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public RelatedPlaceRefOrValue _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+  public RelatedPlaceRefOrValue _atReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+    return this;
+  }
+
+  /**
+   * The actual type of the target instance when needed for disambiguation.
+   * @return _atReferredType
+   **/
+  @Schema(description = "The actual type of the target instance when needed for disambiguation.")
+      @NotNull
+
+    public String getAtReferredType() {
+    return _atReferredType;
+  }
+
+  public void setAtReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    RelatedPlaceRefOrValue relatedPlaceRefOrValue = (RelatedPlaceRefOrValue) o;
+    return Objects.equals(this.id, relatedPlaceRefOrValue.id) &&
+        Objects.equals(this.href, relatedPlaceRefOrValue.href) &&
+        Objects.equals(this.name, relatedPlaceRefOrValue.name) &&
+        Objects.equals(this.role, relatedPlaceRefOrValue.role) &&
+        Objects.equals(this._atBaseType, relatedPlaceRefOrValue._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, relatedPlaceRefOrValue._atSchemaLocation) &&
+        Objects.equals(this._atType, relatedPlaceRefOrValue._atType) &&
+        Objects.equals(this._atReferredType, relatedPlaceRefOrValue._atReferredType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, href, name, role, _atBaseType, _atSchemaLocation, _atType, _atReferredType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class RelatedPlaceRefOrValue {\n");
+    
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    href: ").append(toIndentedString(href)).append("\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    role: ").append(toIndentedString(role)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("    _atReferredType: ").append(toIndentedString(_atReferredType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/RelatedProductOrderItem.java b/src/main/java/org/etsi/osl/tmf/pim637/model/RelatedProductOrderItem.java
new file mode 100644
index 0000000000000000000000000000000000000000..3e52de617d3a47570713f4953cae2e46219621fb
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/RelatedProductOrderItem.java
@@ -0,0 +1,279 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * RelatedProductOrderItem (ProductOrder item) .The product order item which triggered product creation/change/termination.
+ */
+@Schema(description = "RelatedProductOrderItem (ProductOrder item) .The product order item which triggered product creation/change/termination.")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class RelatedProductOrderItem   {
+  @JsonProperty("orderItemAction")
+  private String orderItemAction = null;
+
+  @JsonProperty("orderItemId")
+  private String orderItemId = null;
+
+  @JsonProperty("productOrderHref")
+  private String productOrderHref = null;
+
+  @JsonProperty("productOrderId")
+  private String productOrderId = null;
+
+  @JsonProperty("role")
+  private String role = null;
+
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  @JsonProperty("@referredType")
+  private String _atReferredType = null;
+
+  public RelatedProductOrderItem orderItemAction(String orderItemAction) {
+    this.orderItemAction = orderItemAction;
+    return this;
+  }
+
+  /**
+   * Action of the order item for this product
+   * @return orderItemAction
+   **/
+  @Schema(description = "Action of the order item for this product")
+      @NotNull
+
+    public String getOrderItemAction() {
+    return orderItemAction;
+  }
+
+  public void setOrderItemAction(String orderItemAction) {
+    this.orderItemAction = orderItemAction;
+  }
+
+  public RelatedProductOrderItem orderItemId(String orderItemId) {
+    this.orderItemId = orderItemId;
+    return this;
+  }
+
+  /**
+   * Identifier of the order item where the product was managed
+   * @return orderItemId
+   **/
+  @Schema(required = true, description = "Identifier of the order item where the product was managed")
+      @NotNull
+
+    public String getOrderItemId() {
+    return orderItemId;
+  }
+
+  public void setOrderItemId(String orderItemId) {
+    this.orderItemId = orderItemId;
+  }
+
+  public RelatedProductOrderItem productOrderHref(String productOrderHref) {
+    this.productOrderHref = productOrderHref;
+    return this;
+  }
+
+  /**
+   * Reference of the related entity.
+   * @return productOrderHref
+   **/
+  @Schema(description = "Reference of the related entity.")
+      @NotNull
+
+    public String getProductOrderHref() {
+    return productOrderHref;
+  }
+
+  public void setProductOrderHref(String productOrderHref) {
+    this.productOrderHref = productOrderHref;
+  }
+
+  public RelatedProductOrderItem productOrderId(String productOrderId) {
+    this.productOrderId = productOrderId;
+    return this;
+  }
+
+  /**
+   * Unique identifier of a related entity.
+   * @return productOrderId
+   **/
+  @Schema(required = true, description = "Unique identifier of a related entity.")
+      @NotNull
+
+    public String getProductOrderId() {
+    return productOrderId;
+  }
+
+  public void setProductOrderId(String productOrderId) {
+    this.productOrderId = productOrderId;
+  }
+
+  public RelatedProductOrderItem role(String role) {
+    this.role = role;
+    return this;
+  }
+
+  /**
+   * role of the product order item for this product
+   * @return role
+   **/
+  @Schema(description = "role of the product order item for this product")
+      @NotNull
+
+    public String getRole() {
+    return role;
+  }
+
+  public void setRole(String role) {
+    this.role = role;
+  }
+
+  public RelatedProductOrderItem _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public RelatedProductOrderItem _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * A URI to a JSON-Schema file that defines additional attributes and relationships
+   * @return _atSchemaLocation
+   **/
+  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public RelatedProductOrderItem _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the sub-class entity name
+   * @return _atType
+   **/
+  @Schema(description = "When sub-classing, this defines the sub-class entity name")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+  public RelatedProductOrderItem _atReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+    return this;
+  }
+
+  /**
+   * The actual type of the target instance when needed for disambiguation.
+   * @return _atReferredType
+   **/
+  @Schema(description = "The actual type of the target instance when needed for disambiguation.")
+      @NotNull
+
+    public String getAtReferredType() {
+    return _atReferredType;
+  }
+
+  public void setAtReferredType(String _atReferredType) {
+    this._atReferredType = _atReferredType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    RelatedProductOrderItem relatedProductOrderItem = (RelatedProductOrderItem) o;
+    return Objects.equals(this.orderItemAction, relatedProductOrderItem.orderItemAction) &&
+        Objects.equals(this.orderItemId, relatedProductOrderItem.orderItemId) &&
+        Objects.equals(this.productOrderHref, relatedProductOrderItem.productOrderHref) &&
+        Objects.equals(this.productOrderId, relatedProductOrderItem.productOrderId) &&
+        Objects.equals(this.role, relatedProductOrderItem.role) &&
+        Objects.equals(this._atBaseType, relatedProductOrderItem._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, relatedProductOrderItem._atSchemaLocation) &&
+        Objects.equals(this._atType, relatedProductOrderItem._atType) &&
+        Objects.equals(this._atReferredType, relatedProductOrderItem._atReferredType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(orderItemAction, orderItemId, productOrderHref, productOrderId, role, _atBaseType, _atSchemaLocation, _atType, _atReferredType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class RelatedProductOrderItem {\n");
+    
+    sb.append("    orderItemAction: ").append(toIndentedString(orderItemAction)).append("\n");
+    sb.append("    orderItemId: ").append(toIndentedString(orderItemId)).append("\n");
+    sb.append("    productOrderHref: ").append(toIndentedString(productOrderHref)).append("\n");
+    sb.append("    productOrderId: ").append(toIndentedString(productOrderId)).append("\n");
+    sb.append("    role: ").append(toIndentedString(role)).append("\n");
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("    _atReferredType: ").append(toIndentedString(_atReferredType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/pim637/model/TargetProductSchema.java b/src/main/java/org/etsi/osl/tmf/pim637/model/TargetProductSchema.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0659e59482c6bc65814294b46cae1aa99d396e6
--- /dev/null
+++ b/src/main/java/org/etsi/osl/tmf/pim637/model/TargetProductSchema.java
@@ -0,0 +1,129 @@
+package org.etsi.osl.tmf.pim637.model;
+
+import java.util.Objects;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.springframework.validation.annotation.Validated;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * The reference object to the schema and type of target product which is described by product specification
+ */
+@Schema(description = "The reference object to the schema and type of target product which is described by product specification")
+@Validated
+@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-08-04T00:27:07.324017400+03:00[Europe/Athens]")
+
+
+public class TargetProductSchema   {
+  @JsonProperty("@baseType")
+  private String _atBaseType = null;
+
+  @JsonProperty("@schemaLocation")
+  private String _atSchemaLocation = null;
+
+  @JsonProperty("@type")
+  private String _atType = null;
+
+  public TargetProductSchema _atBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+    return this;
+  }
+
+  /**
+   * When sub-classing, this defines the super-class
+   * @return _atBaseType
+   **/
+  @Schema(description = "When sub-classing, this defines the super-class")
+      @NotNull
+
+    public String getAtBaseType() {
+    return _atBaseType;
+  }
+
+  public void setAtBaseType(String _atBaseType) {
+    this._atBaseType = _atBaseType;
+  }
+
+  public TargetProductSchema _atSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+    return this;
+  }
+
+  /**
+   * This field provides a link to the schema describing the target product
+   * @return _atSchemaLocation
+   **/
+  @Schema(required = true, description = "This field provides a link to the schema describing the target product")
+      @NotNull
+
+    public String getAtSchemaLocation() {
+    return _atSchemaLocation;
+  }
+
+  public void setAtSchemaLocation(String _atSchemaLocation) {
+    this._atSchemaLocation = _atSchemaLocation;
+  }
+
+  public TargetProductSchema _atType(String _atType) {
+    this._atType = _atType;
+    return this;
+  }
+
+  /**
+   * Class type of the target product
+   * @return _atType
+   **/
+  @Schema(required = true, description = "Class type of the target product")
+      @NotNull
+
+    public String getAtType() {
+    return _atType;
+  }
+
+  public void setAtType(String _atType) {
+    this._atType = _atType;
+  }
+
+
+  @Override
+  public boolean equals(java.lang.Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    TargetProductSchema targetProductSchema = (TargetProductSchema) o;
+    return Objects.equals(this._atBaseType, targetProductSchema._atBaseType) &&
+        Objects.equals(this._atSchemaLocation, targetProductSchema._atSchemaLocation) &&
+        Objects.equals(this._atType, targetProductSchema._atType);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(_atBaseType, _atSchemaLocation, _atType);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class TargetProductSchema {\n");
+    
+    sb.append("    _atBaseType: ").append(toIndentedString(_atBaseType)).append("\n");
+    sb.append("    _atSchemaLocation: ").append(toIndentedString(_atSchemaLocation)).append("\n");
+    sb.append("    _atType: ").append(toIndentedString(_atType)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(java.lang.Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+}
diff --git a/src/main/java/org/etsi/osl/tmf/po622/model/Characteristic.java b/src/main/java/org/etsi/osl/tmf/po622/model/Characteristic.java
deleted file mode 100644
index d709b73f6509d496f47936f3bea84dec2350548e..0000000000000000000000000000000000000000
--- a/src/main/java/org/etsi/osl/tmf/po622/model/Characteristic.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*-
- * ========================LICENSE_START=================================
- * org.etsi.osl.tmf.api
- * %%
- * Copyright (C) 2019 - 2021 openslice.io
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================LICENSE_END==================================
- */
-package org.etsi.osl.tmf.po622.model;
-
-import java.util.Objects;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import org.springframework.validation.annotation.Validated;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.Valid;
-import jakarta.validation.constraints.NotNull;
-
-/**
- * Describes a given characteristic of an object or entity through a name/value pair.
- */
-@Schema(description = "Describes a given characteristic of an object or entity through a name/value pair.")
-@Validated
-@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2020-10-30T10:29:21.184964400+02:00[Europe/Athens]")
-public class Characteristic   {
-  @JsonProperty("name")
-  private String name = null;
-
-  @JsonProperty("valueType")
-  private String valueType = null;
-
-  @JsonProperty("value")
-  private Any value = null;
-
-  @JsonProperty("@baseType")
-  private String baseType = null;
-
-  @JsonProperty("@schemaLocation")
-  private String schemaLocation = null;
-
-  @JsonProperty("@type")
-  private String type = null;
-
-  public Characteristic name(String name) {
-    this.name = name;
-    return this;
-  }
-
-  /**
-   * Name of the characteristic
-   * @return name
-  **/
-  @Schema(description = "Name of the characteristic")
-      @NotNull
-
-    public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public Characteristic valueType(String valueType) {
-    this.valueType = valueType;
-    return this;
-  }
-
-  /**
-   * Data type of the value of the characteristic
-   * @return valueType
-  **/
-  @Schema(description = "Data type of the value of the characteristic")
-  
-    public String getValueType() {
-    return valueType;
-  }
-
-  public void setValueType(String valueType) {
-    this.valueType = valueType;
-  }
-
-  public Characteristic value(Any value) {
-    this.value = value;
-    return this;
-  }
-
-  /**
-   * Get value
-   * @return value
-  **/
-  @Schema(description = "")
-      @NotNull
-
-    @Valid
-    public Any getValue() {
-    return value;
-  }
-
-  public void setValue(Any value) {
-    this.value = value;
-  }
-
-  public Characteristic baseType(String baseType) {
-    this.baseType = baseType;
-    return this;
-  }
-
-  /**
-   * When sub-classing, this defines the super-class
-   * @return baseType
-  **/
-  @Schema(description = "When sub-classing, this defines the super-class")
-  
-    public String getAtBaseType() {
-    return baseType;
-  }
-
-  public void setAtBaseType(String baseType) {
-    this.baseType = baseType;
-  }
-
-  public Characteristic schemaLocation(String schemaLocation) {
-    this.schemaLocation = schemaLocation;
-    return this;
-  }
-
-  /**
-   * A URI to a JSON-Schema file that defines additional attributes and relationships
-   * @return schemaLocation
-  **/
-  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
-  
-    public String getAtSchemaLocation() {
-    return schemaLocation;
-  }
-
-  public void setAtSchemaLocation(String schemaLocation) {
-    this.schemaLocation = schemaLocation;
-  }
-
-  public Characteristic type(String type) {
-    this.type = type;
-    return this;
-  }
-
-  /**
-   * When sub-classing, this defines the sub-class entity name
-   * @return type
-  **/
-  @Schema(description = "When sub-classing, this defines the sub-class entity name")
-  
-    public String getAtType() {
-    return type;
-  }
-
-  public void setAtType(String type) {
-    this.type = type;
-  }
-
-
-  @Override
-  public boolean equals(java.lang.Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-    Characteristic characteristic = (Characteristic) o;
-    return Objects.equals(this.name, characteristic.name) &&
-        Objects.equals(this.valueType, characteristic.valueType) &&
-        Objects.equals(this.value, characteristic.value) &&
-        Objects.equals(this.baseType, characteristic.baseType) &&
-        Objects.equals(this.schemaLocation, characteristic.schemaLocation) &&
-        Objects.equals(this.type, characteristic.type);
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(name, valueType, value, baseType, schemaLocation, type);
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder sb = new StringBuilder();
-    sb.append("class Characteristic {\n");
-    
-    sb.append("    name: ").append(toIndentedString(name)).append("\n");
-    sb.append("    valueType: ").append(toIndentedString(valueType)).append("\n");
-    sb.append("    value: ").append(toIndentedString(value)).append("\n");
-    sb.append("    baseType: ").append(toIndentedString(baseType)).append("\n");
-    sb.append("    schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
-    sb.append("    type: ").append(toIndentedString(type)).append("\n");
-    sb.append("}");
-    return sb.toString();
-  }
-
-  /**
-   * Convert the given object to string with each line indented by 4 spaces
-   * (except the first line).
-   */
-  private String toIndentedString(java.lang.Object o) {
-    if (o == null) {
-      return "null";
-    }
-    return o.toString().replace("\n", "\n    ");
-  }
-}
diff --git a/src/main/java/org/etsi/osl/tmf/po622/model/Product.java b/src/main/java/org/etsi/osl/tmf/po622/model/Product.java
index ee4c02bd2fe8e7b724a442d82d235c4929d458a0..30ee6d17d80e572f8260c684e5c1a6b37a7ae864 100644
--- a/src/main/java/org/etsi/osl/tmf/po622/model/Product.java
+++ b/src/main/java/org/etsi/osl/tmf/po622/model/Product.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Objects;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
 import org.etsi.osl.tmf.common.model.service.ResourceRef;
 import org.etsi.osl.tmf.common.model.service.ServiceRef;
 import org.etsi.osl.tmf.prm669.model.RelatedParty;
diff --git a/src/main/java/org/etsi/osl/tmf/po622/model/ProductRefOrValue.java b/src/main/java/org/etsi/osl/tmf/po622/model/ProductRefOrValue.java
index c77a6ed7d9376834d228c4e10263436d31d12a96..d4195004498a27fd5ebb3673ef96159897b0c344 100644
--- a/src/main/java/org/etsi/osl/tmf/po622/model/ProductRefOrValue.java
+++ b/src/main/java/org/etsi/osl/tmf/po622/model/ProductRefOrValue.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Objects;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
 import org.etsi.osl.tmf.common.model.service.ResourceRef;
 import org.etsi.osl.tmf.common.model.service.ServiceRef;
 import org.etsi.osl.tmf.prm669.model.RelatedParty;
diff --git a/src/main/java/org/etsi/osl/tmf/prm669/model/Characteristic.java b/src/main/java/org/etsi/osl/tmf/prm669/model/Characteristic.java
deleted file mode 100644
index c0ca3cf990a1c82da38ddc388ca43dc04d3e0d72..0000000000000000000000000000000000000000
--- a/src/main/java/org/etsi/osl/tmf/prm669/model/Characteristic.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*-
- * ========================LICENSE_START=================================
- * org.etsi.osl.tmf.api
- * %%
- * Copyright (C) 2019 openslice.io
- * %%
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- * 
- *      http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * =========================LICENSE_END==================================
- */
-package org.etsi.osl.tmf.prm669.model;
-
-import java.util.Objects;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import org.etsi.osl.tmf.common.model.Any;
-import org.springframework.validation.annotation.Validated;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.Valid;
-import jakarta.validation.constraints.NotNull;
-
-/**
- * Describes a given characteristic of an object or entity through a name/value pair.
- */
-@Schema(description = "Describes a given characteristic of an object or entity through a name/value pair.")
-@Validated
-@jakarta.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2019-10-19T23:20:50.154+03:00")
-
-public class Characteristic   {
-  @JsonProperty("name")
-  private String name = null;
-
-  @JsonProperty("valueType")
-  private String valueType = null;
-
-  @JsonProperty("value")
-  private Any value = null;
-
-  @JsonProperty("@baseType")
-  private String baseType = null;
-
-  @JsonProperty("@schemaLocation")
-  private String schemaLocation = null;
-
-  @JsonProperty("@type")
-  private String type = null;
-
-  public Characteristic name(String name) {
-    this.name = name;
-    return this;
-  }
-
-  /**
-   * Name of the characteristic
-   * @return name
-  **/
-  @Schema(description = "Name of the characteristic")
-  @NotNull
-
-
-  public String getName() {
-    return name;
-  }
-
-  public void setName(String name) {
-    this.name = name;
-  }
-
-  public Characteristic valueType(String valueType) {
-    this.valueType = valueType;
-    return this;
-  }
-
-  /**
-   * Data type of the value of the characteristic
-   * @return valueType
-  **/
-  @Schema(description = "Data type of the value of the characteristic")
-
-
-  public String getValueType() {
-    return valueType;
-  }
-
-  public void setValueType(String valueType) {
-    this.valueType = valueType;
-  }
-
-  public Characteristic value(Any value) {
-    this.value = value;
-    return this;
-  }
-
-  /**
-   * The value of the characteristic
-   * @return value
-  **/
-  @Schema(description = "The value of the characteristic")
-  @NotNull
-
-  @Valid
-
-  public Any getValue() {
-    return value;
-  }
-
-  public void setValue(Any value) {
-    this.value = value;
-  }
-
-  public Characteristic baseType(String baseType) {
-    this.baseType = baseType;
-    return this;
-  }
-
-  /**
-   * When sub-classing, this defines the super-class
-   * @return baseType
-  **/
-  @Schema(description = "When sub-classing, this defines the super-class")
-
-
-  public String getBaseType() {
-    return baseType;
-  }
-
-  public void setBaseType(String baseType) {
-    this.baseType = baseType;
-  }
-
-  public Characteristic schemaLocation(String schemaLocation) {
-    this.schemaLocation = schemaLocation;
-    return this;
-  }
-
-  /**
-   * A URI to a JSON-Schema file that defines additional attributes and relationships
-   * @return schemaLocation
-  **/
-  @Schema(description = "A URI to a JSON-Schema file that defines additional attributes and relationships")
-
-
-  public String getSchemaLocation() {
-    return schemaLocation;
-  }
-
-  public void setSchemaLocation(String schemaLocation) {
-    this.schemaLocation = schemaLocation;
-  }
-
-  public Characteristic type(String type) {
-    this.type = type;
-    return this;
-  }
-
-  /**
-   * When sub-classing, this defines the sub-class entity name
-   * @return type
-  **/
-  @Schema(description = "When sub-classing, this defines the sub-class entity name")
-
-
-  public String getType() {
-    return type;
-  }
-
-  public void setType(String type) {
-    this.type = type;
-  }
-
-
-  @Override
-  public boolean equals(java.lang.Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-    Characteristic characteristic = (Characteristic) o;
-    return Objects.equals(this.name, characteristic.name) &&
-        Objects.equals(this.valueType, characteristic.valueType) &&
-        Objects.equals(this.value, characteristic.value) &&
-        Objects.equals(this.baseType, characteristic.baseType) &&
-        Objects.equals(this.schemaLocation, characteristic.schemaLocation) &&
-        Objects.equals(this.type, characteristic.type);
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(name, valueType, value, baseType, schemaLocation, type);
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder sb = new StringBuilder();
-    sb.append("class Characteristic {\n");
-    
-    sb.append("    name: ").append(toIndentedString(name)).append("\n");
-    sb.append("    valueType: ").append(toIndentedString(valueType)).append("\n");
-    sb.append("    value: ").append(toIndentedString(value)).append("\n");
-    sb.append("    baseType: ").append(toIndentedString(baseType)).append("\n");
-    sb.append("    schemaLocation: ").append(toIndentedString(schemaLocation)).append("\n");
-    sb.append("    type: ").append(toIndentedString(type)).append("\n");
-    sb.append("}");
-    return sb.toString();
-  }
-
-  /**
-   * Convert the given object to string with each line indented by 4 spaces
-   * (except the first line).
-   */
-  private String toIndentedString(java.lang.Object o) {
-    if (o == null) {
-      return "null";
-    }
-    return o.toString().replace("\n", "\n    ");
-  }
-}
-
diff --git a/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRole.java b/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRole.java
index db0583cccc103506a61ec66e44adb7d3ed4229ea..b972197d63778e1551442c40814a4de812d2faf8 100644
--- a/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRole.java
+++ b/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRole.java
@@ -28,6 +28,7 @@ import org.etsi.osl.tmf.am651.model.AgreementRef;
 import org.etsi.osl.tmf.am666.model.AccountRef;
 import org.etsi.osl.tmf.am666.model.PaymentMethodRef;
 import org.etsi.osl.tmf.common.model.TimePeriod;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
 import org.springframework.validation.annotation.Validated;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.Valid;
diff --git a/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRoleCreate.java b/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRoleCreate.java
index 436574c9e6bca7691ab55647f47bbf53643963f8..5b4435971dac31ebe2a4cfe73b53c255b9a945f0 100644
--- a/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRoleCreate.java
+++ b/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRoleCreate.java
@@ -28,6 +28,7 @@ import org.etsi.osl.tmf.am651.model.AgreementRef;
 import org.etsi.osl.tmf.am666.model.AccountRef;
 import org.etsi.osl.tmf.am666.model.PaymentMethodRef;
 import org.etsi.osl.tmf.common.model.TimePeriod;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
 import org.springframework.validation.annotation.Validated;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.Valid;
diff --git a/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRoleUpdate.java b/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRoleUpdate.java
index 560acbf57d3d663530af95c02abcb01228744bce..3a890cb9930ce0c3dbf991aa3dc4e3c33c35600a 100644
--- a/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRoleUpdate.java
+++ b/src/main/java/org/etsi/osl/tmf/prm669/model/PartyRoleUpdate.java
@@ -28,6 +28,7 @@ import org.etsi.osl.tmf.am651.model.AgreementRef;
 import org.etsi.osl.tmf.am666.model.AccountRef;
 import org.etsi.osl.tmf.am666.model.PaymentMethodRef;
 import org.etsi.osl.tmf.common.model.TimePeriod;
+import org.etsi.osl.tmf.common.model.service.Characteristic;
 import org.springframework.validation.annotation.Validated;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.Valid;
diff --git a/src/main/java/org/etsi/osl/tmf/ro652/model/Quantity.java b/src/main/java/org/etsi/osl/tmf/ro652/model/Quantity.java
deleted file mode 100644
index 4b6899d742f0de03775539f85c409e309541dd1d..0000000000000000000000000000000000000000
--- a/src/main/java/org/etsi/osl/tmf/ro652/model/Quantity.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package org.etsi.osl.tmf.ro652.model;
-
-import java.util.Objects;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-
-import org.springframework.validation.annotation.Validated;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-
-/**
- * An amount in a given unit
- */
-@Schema(description = "An amount in a given unit")
-@Validated
-@jakarta.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2022-09-28T23:39:08.914219800+03:00[Europe/Athens]")
-public class Quantity   {
-  @JsonProperty("amount")
-  private Float amount = 1.0f;
-
-  @JsonProperty("units")
-  private String units = null;
-
-  public Quantity amount(Float amount) {
-    this.amount = amount;
-    return this;
-  }
-
-  /**
-   * Numeric value in a given unit
-   * @return amount
-  **/
-  @Schema(description = "Numeric value in a given unit")
-  
-    public Float getAmount() {
-    return amount;
-  }
-
-  public void setAmount(Float amount) {
-    this.amount = amount;
-  }
-
-  public Quantity units(String units) {
-    this.units = units;
-    return this;
-  }
-
-  /**
-   * Unit
-   * @return units
-  **/
-  @Schema(description = "Unit")
-  
-    public String getUnits() {
-    return units;
-  }
-
-  public void setUnits(String units) {
-    this.units = units;
-  }
-
-
-  @Override
-  public boolean equals(java.lang.Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (o == null || getClass() != o.getClass()) {
-      return false;
-    }
-    Quantity quantity = (Quantity) o;
-    return Objects.equals(this.amount, quantity.amount) &&
-        Objects.equals(this.units, quantity.units);
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(amount, units);
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder sb = new StringBuilder();
-    sb.append("class Quantity {\n");
-    
-    sb.append("    amount: ").append(toIndentedString(amount)).append("\n");
-    sb.append("    units: ").append(toIndentedString(units)).append("\n");
-    sb.append("}");
-    return sb.toString();
-  }
-
-  /**
-   * Convert the given object to string with each line indented by 4 spaces
-   * (except the first line).
-   */
-  private String toIndentedString(java.lang.Object o) {
-    if (o == null) {
-      return "null";
-    }
-    return o.toString().replace("\n", "\n    ");
-  }
-}