diff --git a/CRM/Contribute/BAO/Product.php b/CRM/Contribute/BAO/Product.php
index 5d0a6ff42dde6cb7443654a8e431fcf8677679c5..f39e4e124fcbbce7d343cc44509594771e9de7e2 100644
--- a/CRM/Contribute/BAO/Product.php
+++ b/CRM/Contribute/BAO/Product.php
@@ -79,6 +79,7 @@ class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product {
    */
   public static function create($params) {
     $id = $params['id'] ?? NULL;
+    $op = !empty($id) ? 'edit' : 'create';
     if (empty($id)) {
       $defaultParams = [
         'id' => $id,
@@ -90,7 +91,7 @@ class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product {
       ];
       $params = array_merge($defaultParams, $params);
     }
-
+    CRM_Utils_Hook::pre($op, 'Product', $id, $params);
     // Modify the submitted values for 'image' and 'thumbnail' so that we use
     // local URLs for these images when possible.
     if (isset($params['image'])) {
@@ -104,6 +105,7 @@ class CRM_Contribute_BAO_Product extends CRM_Contribute_DAO_Product {
     $premium = new CRM_Contribute_DAO_Product();
     $premium->copyValues($params);
     $premium->save();
+    CRM_Utils_Hook::post($op, 'Product', $id, $premium);
     return $premium;
   }
 
diff --git a/CRM/Contribute/Form/ManagePremiums.php b/CRM/Contribute/Form/ManagePremiums.php
index 45904ea49f2d114aa79026729bac73fb019aa9d8..9939eddc4dda01d7ef9d80b9c512603c2ecef644 100644
--- a/CRM/Contribute/Form/ManagePremiums.php
+++ b/CRM/Contribute/Form/ManagePremiums.php
@@ -15,6 +15,8 @@
  * @copyright CiviCRM LLC https://civicrm.org/licensing
  */
 
+use Civi\Api4\Product;
+
 /**
  * This class generates form components for Premiums.
  */
@@ -35,8 +37,7 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
   public function setDefaultValues() {
     $defaults = parent::setDefaultValues();
     if ($this->_id) {
-      $params = ['id' => $this->_id];
-      CRM_Contribute_BAO_Product::retrieve($params, $tempDefaults);
+      $tempDefaults = Product::get()->addWhere('id', '=', $this->_id)->execute()->first();
       if (isset($tempDefaults['image']) && isset($tempDefaults['thumbnail'])) {
         $defaults['imageUrl'] = $tempDefaults['image'];
         $defaults['thumbnailUrl'] = $tempDefaults['thumbnail'];
@@ -291,10 +292,10 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
     $this->_processImages($params);
 
     // Save the premium product to database
-    $premium = CRM_Contribute_BAO_Product::create($params);
+    $premium = Product::save()->addRecord($params)->execute()->first();
 
     CRM_Core_Session::setStatus(
-      ts("The Premium '%1' has been saved.", [1 => $premium->name]),
+      ts("The Premium '%1' has been saved.", [1 => $premium['name']]),
       ts('Saved'), 'success');
   }
 
diff --git a/CRM/Core/Permission.php b/CRM/Core/Permission.php
index 6e167ea48aea38c91d31e196ce79a3076b1dea03..5166b65466ae5de3ecd95d480532ca427ae925d4 100644
--- a/CRM/Core/Permission.php
+++ b/CRM/Core/Permission.php
@@ -1135,6 +1135,7 @@ class CRM_Core_Permission {
       ],
     ];
     $permissions['line_item'] = $permissions['contribution'];
+    $permissions['product'] = $permissions['contribution'];
 
     $permissions['financial_item'] = $permissions['contribution'];