Repository: apecloud/kubeblocks

Issue:
[BUG]KB will override pv's reclaim policy to 'Delete'
Even if `StorageClass` `ReclaimPolicy` is 'Retain', the final pv's `ReclaimPolicy` will be override to `Delete`.

```
 k get pod -owide
NAME                            READY   STATUS    RESTARTS   AGE    IP              NODE             NOMINATED NODE   READINESS GATES
mysql-cluster-mysql-0           4/4     Running   0          115s   x.x.x.x    x.x.x.x   <none>           <none>
mysql-cluster-mysql-1           4/4     Running   0          115s   x.x.x.x    x.x.x.x   <none>           <none>
mysql-cluster-mysql-2           4/4     Running   0          115s   x.x.x.x    x.x.x.x   <none>           <none>
 k get pvc -owide
NAME                                 STATUS   VOLUME                                       CAPACITY   ACCESS MODES   STORAGECLASS            VOLUMEATTRIBUTESCLASS   AGE     VOLUMEMODE
data-mysql-cluster-mysql-0           Bound    local-d63f6b3c-ccc7-4be7-acb2-c26c4eff79b9   50Gi       RWO            open-local-lvm-retain   <unset>                 3m30s   Filesystem
data-mysql-cluster-mysql-1           Bound    local-c4bcbd98-6bbe-47e0-9406-72aad5897874   50Gi       RWO            open-local-lvm-retain   <unset>                 3m30s   Filesystem
data-mysql-cluster-mysql-2           Bound    local-6efeb799-f637-42f4-88f5-12e19ea2e6f6   50Gi       RWO            open-local-lvm-retain   <unset>                 3m30s   Filesystem
 k get pv -owide
NAME                                         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                        STORAGECLASS            VOLUMEATTRIBUTESCLASS   REASON   AGE     VOLUMEMODE
local-6efeb799-f637-42f4-88f5-12e19ea2e6f6   50Gi       RWO            Delete           Bound    default/data-mysql-cluster-mysql-2           open-local-lvm-retain   <unset>                          3m47s   Filesystem
local-c4bcbd98-6bbe-47e0-9406-72aad5897874   50Gi       RWO            Delete           Bound    default/data-mysql-cluster-mysql-1           open-local-lvm-retain   <unset>                          3m47s   Filesystem
local-d63f6b3c-ccc7-4be7-acb2-c26c4eff79b9   50Gi       RWO            Delete           Bound    default/data-mysql-cluster-mysql-0           open-local-lvm-retain   <unset>                          3m47s   Filesystem
 k get sc
NAME                         PROVISIONER            RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
open-local-lvm-retain        local.csi.aliyun.com   Retain          WaitForFirstConsumer   true                   3h24m
```

When kubectl watch pv with `-oyaml`, we can find that when pv is first created, `ReclaimPolicy` is `Retain`, but finally updated to `Delete`.

```
---
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: local.csi.aliyun.com
    volume.kubernetes.io/provisioner-deletion-secret-name: ""
    volume.kubernetes.io/provisioner-deletion-secret-namespace: ""
  creationTimestamp: "2025-02-26T10:09:52Z"
  finalizers:
  - kubernetes.io/pv-protection
  name: local-35c7715c-b23d-4e63-95f9-d377db431f1d
  resourceVersion: "21237271"
  uid: 780edbd6-0ee2-4c05-8fab-627d15d84aa3
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 50Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: data-mysql-cluster-mysql-2
    namespace: default
    resourceVersion: "21237253"
    uid: 35c7715c-b23d-4e63-95f9-d377db431f1d
  csi:
    driver: local.csi.aliyun.com
    fsType: ext4
    volumeAttributes:
      csi.storage.k8s.io/pv/name: local-35c7715c-b23d-4e63-95f9-d377db431f1d
      csi.storage.k8s.io/pvc/name: data-mysql-cluster-mysql-2
      csi.storage.k8s.io/pvc/namespace: default
      storage.kubernetes.io/csiProvisionerIdentity: 1736161734330-1783-local.csi.aliyun.com
      vgName: open-local-pool-0
      volume.kubernetes.io/selected-node: x.x.x.x
      volumeType: LVM
    volumeHandle: local-35c7715c-b23d-4e63-95f9-d377db431f1d
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - x.x.x.x
  persistentVolumeReclaimPolicy: Retain
  storageClassName: open-local-lvm-retain
  volumeMode: Filesystem
status:
  lastPhaseTransitionTime: "2025-02-26T10:09:52Z"
  phase: Pending
---
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: local.csi.aliyun.com
    volume.kubernetes.io/provisioner-deletion-secret-name: ""
    volume.kubernetes.io/provisioner-deletion-secret-namespace: ""
  creationTimestamp: "2025-02-26T10:09:52Z"
  finalizers:
  - kubernetes.io/pv-protection
  name: local-35c7715c-b23d-4e63-95f9-d377db431f1d
  resourceVersion: "21237273"
  uid: 780edbd6-0ee2-4c05-8fab-627d15d84aa3
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 50Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: data-mysql-cluster-mysql-2
    namespace: default
    resourceVersion: "21237253"
    uid: 35c7715c-b23d-4e63-95f9-d377db431f1d
  csi:
    driver: local.csi.aliyun.com
    fsType: ext4
    volumeAttributes:
      csi.storage.k8s.io/pv/name: local-35c7715c-b23d-4e63-95f9-d377db431f1d
      csi.storage.k8s.io/pvc/name: data-mysql-cluster-mysql-2
      csi.storage.k8s.io/pvc/namespace: default
      storage.kubernetes.io/csiProvisionerIdentity: 1736161734330-1783-local.csi.aliyun.com
      vgName: open-local-pool-0
      volume.kubernetes.io/selected-node: x.x.x.x
      volumeType: LVM
    volumeHandle: local-35c7715c-b23d-4e63-95f9-d377db431f1d
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - x.x.x.x
  persistentVolumeReclaimPolicy: Retain
  storageClassName: open-local-lvm-retain
  volumeMode: Filesystem
status:
  lastPhaseTransitionTime: "2025-02-26T10:09:52Z"
  phase: Bound
---
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: local.csi.aliyun.com
    volume.kubernetes.io/provisioner-deletion-secret-name: ""
    volume.kubernetes.io/provisioner-deletion-secret-namespace: ""
  creationTimestamp: "2025-02-26T10:09:52Z"
  finalizers:
  - kubernetes.io/pv-protection
  name: local-35c7715c-b23d-4e63-95f9-d377db431f1d
  resourceVersion: "21237278"
  uid: 780edbd6-0ee2-4c05-8fab-627d15d84aa3
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 50Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: data-mysql-cluster-mysql-2
    namespace: default
    resourceVersion: "21237253"
    uid: 35c7715c-b23d-4e63-95f9-d377db431f1d
  csi:
    driver: local.csi.aliyun.com
    fsType: ext4
    volumeAttributes:
      csi.storage.k8s.io/pv/name: local-35c7715c-b23d-4e63-95f9-d377db431f1d
      csi.storage.k8s.io/pvc/name: data-mysql-cluster-mysql-2
      csi.storage.k8s.io/pvc/namespace: default
      storage.kubernetes.io/csiProvisionerIdentity: 1736161734330-1783-local.csi.aliyun.com
      vgName: open-local-pool-0
      volume.kubernetes.io/selected-node: x.x.x.x
      volumeType: LVM
    volumeHandle: local-35c7715c-b23d-4e63-95f9-d377db431f1d
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - x.x.x.x
  persistentVolumeReclaimPolicy: Delete
  storageClassName: open-local-lvm-retain
  volumeMode: Filesystem
status:
  lastPhaseTransitionTime: "2025-02-26T10:09:52Z"
  phase: Bound
```

With `kubectl get pv -oyaml --show-managed-fields=true` show that `ReclaimPolicy` is updated by kubeblocks.

```
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: local.csi.aliyun.com
    volume.kubernetes.io/provisioner-deletion-secret-name: ""
    volume.kubernetes.io/provisioner-deletion-secret-namespace: ""
  creationTimestamp: "2025-02-26T10:09:52Z"
  finalizers:
  - kubernetes.io/pv-protection
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:pv.kubernetes.io/provisioned-by: {}
          f:volume.kubernetes.io/provisioner-deletion-secret-name: {}
          f:volume.kubernetes.io/provisioner-deletion-secret-namespace: {}
      f:spec:
        f:accessModes: {}
        f:capacity:
          .: {}
          f:storage: {}
        f:claimRef:
          .: {}
          f:apiVersion: {}
          f:kind: {}
          f:name: {}
          f:namespace: {}
          f:resourceVersion: {}
          f:uid: {}
        f:csi:
          .: {}
          f:driver: {}
          f:fsType: {}
          f:volumeAttributes:
            .: {}
            f:csi.storage.k8s.io/pv/name: {}
            f:csi.storage.k8s.io/pvc/name: {}
            f:csi.storage.k8s.io/pvc/namespace: {}
            f:storage.kubernetes.io/csiProvisionerIdentity: {}
            f:vgName: {}
            f:volume.kubernetes.io/selected-node: {}
            f:volumeType: {}
          f:volumeHandle: {}
        f:nodeAffinity:
          .: {}
          f:required: {}
        f:storageClassName: {}
        f:volumeMode: {}
    manager: csi-provisioner
    operation: Update
    time: "2025-02-26T10:09:52Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:status:
        f:phase: {}
    manager: kube-controller-manager
    operation: Update
    subresource: status
    time: "2025-02-26T10:09:52Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:spec:
        f:persistentVolumeReclaimPolicy: {}
    manager: kubeblocks
    operation: Update
    time: "2025-02-26T10:09:52Z"
  name: local-35c7715c-b23d-4e63-95f9-d377db431f1d
  resourceVersion: "21237278"
  uid: 780edbd6-0ee2-4c05-8fab-627d15d84aa3
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 50Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: data-mysql-cluster-mysql-2
    namespace: default
    resourceVersion: "21237253"
    uid: 35c7715c-b23d-4e63-95f9-d377db431f1d
  csi:
    driver: local.csi.aliyun.com
    fsType: ext4
    volumeAttributes:
      csi.storage.k8s.io/pv/name: local-35c7715c-b23d-4e63-95f9-d377db431f1d
      csi.storage.k8s.io/pvc/name: data-mysql-cluster-mysql-2
      csi.storage.k8s.io/pvc/namespace: default
      storage.kubernetes.io/csiProvisionerIdentity: 1736161734330-1783-local.csi.aliyun.com
      vgName: open-local-pool-0
      volume.kubernetes.io/selected-node: x.x.x.x
      volumeType: LVM
    volumeHandle: local-35c7715c-b23d-4e63-95f9-d377db431f1d
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - x.x.x.x
  persistentVolumeReclaimPolicy: Delete
  storageClassName: open-local-lvm-retain
  volumeMode: Filesystem
status:
  lastPhaseTransitionTime: "2025-02-26T10:09:52Z"
  phase: Bound
```

csi driver: open-local
kubeblocks: v1.0.0-beta.21
k8s: v1.30.4

Hints from issue comments:
@shanshanying: @leon-inf PTAL@leon-inf: @openhands-agent Help to cherry-pick the fix in #8980 to the release-0.9 branch.@apecloud-bot: [OpenHands](https://github.com/All-Hands-AI/OpenHands) started fixing the issue! You can monitor the progress [here](https://github.com/apecloud/kubeblocks/actions/runs/14374884252).

Solution patch:
diff --git a/apis/apps/v1/componentdefinition_types.go b/apis/apps/v1/componentdefinition_types.go
index fcdc8c537..3dae6e088 100644
--- a/apis/apps/v1/componentdefinition_types.go
+++ b/apis/apps/v1/componentdefinition_types.go
@@ -336,7 +336,7 @@ type ComponentDefinitionSpec struct {
 	// +listType=map
 	// +listMapKey=name
 	// +optional
-	Configs []ComponentConfigSpec `json:"configs,omitempty"`
+	Configs []ComponentTemplateSpec `json:"configs,omitempty"`
 
 	// Defines the types of logs generated by instances of the Component and their corresponding file paths.
 	// These logs can be collected for further analysis and monitoring.
@@ -1135,115 +1135,6 @@ type ComponentTemplateSpec struct {
 	DefaultMode *int32 `json:"defaultMode,omitempty" protobuf:"varint,3,opt,name=defaultMode"`
 }
 
-type ComponentConfigSpec struct {
-	ComponentTemplateSpec `json:",inline"`
-
-	// Specifies the configuration files within the ConfigMap that support dynamic updates.
-	//
-	// A configuration template (provided in the form of a ConfigMap) may contain templates for multiple
-	// configuration files.
-	// Each configuration file corresponds to a key in the ConfigMap.
-	// Some of these configuration files may support dynamic modification and reloading without requiring
-	// a pod restart.
-	//
-	// If empty or omitted, all configuration files in the ConfigMap are assumed to support dynamic updates,
-	// and ConfigConstraint applies to all keys.
-	//
-	// +listType=set
-	// +optional
-	Keys []string `json:"keys,omitempty"`
-
-	// Specifies the name of the referenced configuration constraints object.
-	//
-	// +kubebuilder:validation:MaxLength=63
-	// +kubebuilder:validation:Pattern:=`^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$`
-	// +optional
-	ConfigConstraintRef string `json:"constraintRef,omitempty"`
-
-	// Specifies the containers to inject the ConfigMap parameters as environment variables.
-	//
-	// This is useful when application images accept parameters through environment variables and
-	// generate the final configuration file in the startup script based on these variables.
-	//
-	// This field allows users to specify a list of container names, and KubeBlocks will inject the environment
-	// variables converted from the ConfigMap into these designated containers. This provides a flexible way to
-	// pass the configuration items from the ConfigMap to the container without modifying the image.
-	//
-	// Deprecated: `asEnvFrom` has been deprecated since 0.9.0 and will be removed in 0.10.0.
-	// Use `injectEnvTo` instead.
-	//
-	// +kubebuilder:deprecatedversion:warning="This field has been deprecated since 0.9.0 and will be removed in 0.10.0"
-	// +listType=set
-	// +optional
-	AsEnvFrom []string `json:"asEnvFrom,omitempty"`
-
-	// Specifies the containers to inject the ConfigMap parameters as environment variables.
-	//
-	// This is useful when application images accept parameters through environment variables and
-	// generate the final configuration file in the startup script based on these variables.
-	//
-	// This field allows users to specify a list of container names, and KubeBlocks will inject the environment
-	// variables converted from the ConfigMap into these designated containers. This provides a flexible way to
-	// pass the configuration items from the ConfigMap to the container without modifying the image.
-	//
-	//
-	// +listType=set
-	// +optional
-	InjectEnvTo []string `json:"injectEnvTo,omitempty"`
-
-	// Specifies whether the configuration needs to be re-rendered after v-scale or h-scale operations to reflect changes.
-	//
-	// In some scenarios, the configuration may need to be updated to reflect the changes in resource allocation
-	// or cluster topology. Examples:
-	//
-	// - Redis: adjust maxmemory after v-scale operation.
-	// - MySQL: increase max connections after v-scale operation.
-	// - Zookeeper: update zoo.cfg with new node addresses after h-scale operation.
-	//
-	// +listType=set
-	// +optional
-	ReRenderResourceTypes []RerenderResourceType `json:"reRenderResourceTypes,omitempty"`
-
-	// Whether to store the final rendered parameters as a secret.
-	//
-	// +optional
-	AsSecret *bool `json:"asSecret,omitempty"`
-}
-
-type ConfigTemplateExtension struct {
-	// Specifies the name of the referenced configuration template ConfigMap object.
-	//
-	// +kubebuilder:validation:Required
-	// +kubebuilder:validation:Pattern:=`^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$`
-	TemplateRef string `json:"templateRef"`
-
-	// Specifies the namespace of the referenced configuration template ConfigMap object.
-	// An empty namespace is equivalent to the "default" namespace.
-	//
-	// +kubebuilder:default="default"
-	// +kubebuilder:validation:Pattern:=`^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$`
-	// +optional
-	Namespace string `json:"namespace,omitempty"`
-
-	// Defines the strategy for merging externally imported templates into component templates.
-	//
-	// +kubebuilder:default="none"
-	// +optional
-	Policy MergedPolicy `json:"policy,omitempty"`
-}
-
-// MergedPolicy defines how to merge external imported templates into component templates.
-// +enum
-// +kubebuilder:validation:Enum={patch,replace,none}
-type MergedPolicy string
-
-const (
-	PatchPolicy     MergedPolicy = "patch"
-	ReplacePolicy   MergedPolicy = "replace"
-	OnlyAddPolicy   MergedPolicy = "add"
-	NoneMergePolicy MergedPolicy = "none"
-)
-
 // RerenderResourceType defines the resource requirements for a component.
 // +enum
 // +kubebuilder:validation:Enum={vscale,hscale,tls}
diff --git a/apis/apps/v1/zz_generated.deepcopy.go b/apis/apps/v1/zz_generated.deepcopy.go
index b3ef440bc..242fc6980 100644
--- a/apis/apps/v1/zz_generated.deepcopy.go
+++ b/apis/apps/v1/zz_generated.deepcopy.go
@@ -1044,47 +1044,6 @@ func (in *ComponentAvailableWithProbe) DeepCopy() *ComponentAvailableWithProbe {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ComponentConfigSpec) DeepCopyInto(out *ComponentConfigSpec) {
-	*out = *in
-	in.ComponentTemplateSpec.DeepCopyInto(&out.ComponentTemplateSpec)
-	if in.Keys != nil {
-		in, out := &in.Keys, &out.Keys
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	if in.AsEnvFrom != nil {
-		in, out := &in.AsEnvFrom, &out.AsEnvFrom
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	if in.InjectEnvTo != nil {
-		in, out := &in.InjectEnvTo, &out.InjectEnvTo
-		*out = make([]string, len(*in))
-		copy(*out, *in)
-	}
-	if in.ReRenderResourceTypes != nil {
-		in, out := &in.ReRenderResourceTypes, &out.ReRenderResourceTypes
-		*out = make([]RerenderResourceType, len(*in))
-		copy(*out, *in)
-	}
-	if in.AsSecret != nil {
-		in, out := &in.AsSecret, &out.AsSecret
-		*out = new(bool)
-		**out = **in
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ComponentConfigSpec.
-func (in *ComponentConfigSpec) DeepCopy() *ComponentConfigSpec {
-	if in == nil {
-		return nil
-	}
-	out := new(ComponentConfigSpec)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ComponentDefinition) DeepCopyInto(out *ComponentDefinition) {
 	*out = *in
@@ -1202,7 +1161,7 @@ func (in *ComponentDefinitionSpec) DeepCopyInto(out *ComponentDefinitionSpec) {
 	}
 	if in.Configs != nil {
 		in, out := &in.Configs, &out.Configs
-		*out = make([]ComponentConfigSpec, len(*in))
+		*out = make([]ComponentTemplateSpec, len(*in))
 		for i := range *in {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
@@ -1912,21 +1871,6 @@ func (in *ComponentVolume) DeepCopy() *ComponentVolume {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ConfigTemplateExtension) DeepCopyInto(out *ConfigTemplateExtension) {
-	*out = *in
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigTemplateExtension.
-func (in *ConfigTemplateExtension) DeepCopy() *ConfigTemplateExtension {
-	if in == nil {
-		return nil
-	}
-	out := new(ConfigTemplateExtension)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ConnectionCredentialAuth) DeepCopyInto(out *ConnectionCredentialAuth) {
 	*out = *in
diff --git a/apis/operations/v1alpha1/opsrequest_types.go b/apis/operations/v1alpha1/opsrequest_types.go
index 9a3fb1ae7..c68ae2bd5 100644
--- a/apis/operations/v1alpha1/opsrequest_types.go
+++ b/apis/operations/v1alpha1/opsrequest_types.go
@@ -23,7 +23,6 @@ import (
 	"k8s.io/apimachinery/pkg/util/intstr"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 )
 
@@ -523,56 +522,12 @@ type Reconfigure struct {
 	// Specifies the name of the Component.
 	ComponentOps `json:",inline"`
 
-	// Contains a list of ConfigurationItem objects, specifying the Component's configuration template name,
-	// upgrade policy, and parameter key-value pairs to be updated.
-	//
-	// +kubebuilder:validation:Required
-	// +kubebuilder:validation:MinItems=1
-	// +patchMergeKey=name
-	// +patchStrategy=merge,retainKeys
-	// +listType=map
-	// +listMapKey=name
-	Configurations []ConfigurationItem `json:"configurations" patchStrategy:"merge,retainKeys" patchMergeKey:"name"`
-
-	// Indicates the duration for which the parameter changes are valid.
-	// +optional
-	// TTL *int64 `json:"ttl,omitempty"`
-
-	// Specifies the time when the parameter changes should be applied.
-	// +kubebuilder:validation:MaxLength=19
-	// +kubebuilder:validation:MinLength=19
-	// +kubebuilder:validation:Pattern:=`^([0-9]{2})/([0-9]{2})/([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$`
-	// +optional
-	// TriggeringTime *string `json:"triggeringTime,omitempty"`
-
-	//  Identifies the component to be reconfigured.
-	// +optional
-	// Selector *metav1.LabelSelector `json:"selector,omitempty"`
-}
-
-type ConfigurationItem struct {
-	// Specifies the name of the configuration template.
-	//
-	// +kubebuilder:validation:Required
-	// +kubebuilder:validation:MaxLength=63
-	// +kubebuilder:validation:Pattern:=`^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$`
-	Name string `json:"name"`
-
-	// Defines the upgrade policy for the configuration.
+	// Specifies a list of key-value pairs representing parameters and their corresponding values
+	// within a single configuration file.
+	// This field is used to override or set the values of parameters without modifying the entire configuration file.
 	//
 	// +optional
-	Policy *appsv1alpha1.UpgradePolicy `json:"policy,omitempty"`
-
-	// Sets the configuration files and their associated parameters that need to be updated.
-	// It should contain at least one item.
-	//
-	// +kubebuilder:validation:Required
-	// +kubebuilder:validation:MinItems=1
-	// +patchMergeKey=key
-	// +patchStrategy=merge,retainKeys
-	// +listType=map
-	// +listMapKey=key
-	Keys []ParameterConfig `json:"keys" patchStrategy:"merge,retainKeys" patchMergeKey:"key"`
+	Parameters []ParameterPair `json:"parameters,omitempty"`
 }
 
 type CustomOps struct {
@@ -660,31 +615,6 @@ type ParameterPair struct {
 	Value *string `json:"value"`
 }
 
-type ParameterConfig struct {
-	// Represents a key in the configuration template(as ConfigMap).
-	// Each key in the ConfigMap corresponds to a specific configuration file.
-	//
-	// +kubebuilder:validation:Required
-	Key string `json:"key"`
-
-	// Specifies a list of key-value pairs representing parameters and their corresponding values
-	// within a single configuration file.
-	// This field is used to override or set the values of parameters without modifying the entire configuration file.
-	//
-	// Either the `parameters` field or the `fileContent` field must be set, but not both.
-	//
-	// +optional
-	Parameters []ParameterPair `json:"parameters,omitempty"`
-
-	// Specifies the content of the entire configuration file.
-	// This field is used to update the complete configuration file.
-	//
-	// Either the `parameters` field or the `fileContent` field must be set, but not both.
-	//
-	// +optional
-	FileContent string `json:"fileContent,omitempty"`
-}
-
 // ExposeSwitch Specifies the switch for the expose operation. This switch can be used to enable or disable the expose operation.
 // +enum
 // +kubebuilder:validation:Enum={Enable, Disable}
@@ -1020,10 +950,6 @@ type OpsRequestStatus struct {
 	// +optional
 	CancelTimestamp metav1.Time `json:"cancelTimestamp,omitempty"`
 
-	// Records the status of a reconfiguring operation if `opsRequest.spec.type` equals to "Reconfiguring".
-	// +optional
-	ReconfiguringStatusAsComponent map[string]*ReconfiguringStatus `json:"reconfiguringStatusAsComponent,omitempty"`
-
 	// Describes the detailed status of the OpsRequest.
 	// Possible condition types include "Cancelled", "WaitForProgressing", "Validated", "Succeed", "Failed", "Restarting",
 	// "VerticalScaling", "HorizontalScaling", "VolumeExpanding", "Reconfigure", "Switchover", "Stopping", "Starting",
@@ -1181,77 +1107,6 @@ type PreCheckResult struct {
 	Message string `json:"message,omitempty"`
 }
 
-type ReconfiguringStatus struct {
-	// Describes the reconfiguring detail status.
-	// Possible condition types include "Creating", "Init", "Running", "Pending", "Merged", "MergeFailed", "FailedAndPause",
-	// "Upgrading", "Deleting", "FailedAndRetry", "Finished", "ReconfigurePersisting", "ReconfigurePersisted".
-	// +optional
-	// +patchMergeKey=type
-	// +patchStrategy=merge
-	// +listType=map
-	// +listMapKey=type
-	Conditions []metav1.Condition `json:"conditions,omitempty"`
-
-	// Describes the status of the component reconfiguring.
-	// +kubebuilder:validation:Required
-	// +patchMergeKey=name
-	// +patchStrategy=merge,retainKeys
-	// +listType=map
-	// +listMapKey=name
-	ConfigurationStatus []ConfigurationItemStatus `json:"configurationStatus"`
-}
-
-type ConfigurationItemStatus struct {
-	// Indicates the name of the configuration template (as ConfigMap).
-	// +kubebuilder:validation:Required
-	// +kubebuilder:validation:MaxLength=63
-	// +kubebuilder:validation:Pattern:=`^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$`
-	Name string `json:"name"`
-
-	// Records the UpgradePolicy of the configuration change operation.
-	// +optional
-	UpdatePolicy appsv1alpha1.UpgradePolicy `json:"updatePolicy,omitempty"`
-
-	// Represents the current state of the reconfiguration state machine.
-	// Possible values include "Creating", "Init", "Running", "Pending", "Merged", "MergeFailed", "FailedAndPause",
-	// "Upgrading", "Deleting", "FailedAndRetry", "Finished", "ReconfigurePersisting", "ReconfigurePersisted".
-	// +optional
-	Status string `json:"status,omitempty"`
-
-	// Provides details about the operation.
-	// +optional
-	Message string `json:"message,omitempty"`
-
-	// Records the number of pods successfully updated following a configuration change.
-	// +kubebuilder:default=0
-	// +optional
-	SucceedCount int32 `json:"succeedCount"`
-
-	// Represents the total count of pods intended to be updated by a configuration change.
-	// +kubebuilder:default=-1
-	// +optional
-	ExpectedCount int32 `json:"expectedCount"`
-
-	// Records the last state of the reconfiguration finite state machine.
-	// Possible values include "None", "Retry", "Failed", "NotSupport", "FailedAndRetry".
-	//
-	// - "None" describes fsm has finished and quit.
-	// - "Retry" describes fsm is running.
-	// - "Failed" describes fsm is failed and exited.
-	// - "NotSupport" describes fsm does not support the feature.
-	// - "FailedAndRetry" describes fsm is failed in current state, but can be retried.
-	// +optional
-	LastAppliedStatus string `json:"lastStatus,omitempty"`
-
-	// Stores the last applied configuration.
-	// +optional
-	LastAppliedConfiguration map[string]string `json:"lastAppliedConfiguration,omitempty"`
-
-	// Contains the updated parameters.
-	// +optional
-	UpdatedParameters UpdatedParameters `json:"updatedParameters"`
-}
-
 // UpdatedParameters holds details about the modifications made to configuration parameters.
 // Example:
 //
diff --git a/apis/operations/v1alpha1/opsrequest_validation.go b/apis/operations/v1alpha1/opsrequest_validation.go
index addd40b99..764f7c040 100644
--- a/apis/operations/v1alpha1/opsrequest_validation.go
+++ b/apis/operations/v1alpha1/opsrequest_validation.go
@@ -139,8 +139,6 @@ func (r *OpsRequest) ValidateOps(ctx context.Context,
 		return r.validateVolumeExpansion(ctx, k8sClient, cluster)
 	case RestartType:
 		return r.validateRestart(cluster)
-	case ReconfiguringType:
-		return r.validateReconfigure(ctx, k8sClient, cluster)
 	case SwitchoverType:
 		return r.validateSwitchover(cluster)
 	case ExposeType:
@@ -245,61 +243,6 @@ func (r *OpsRequest) validateVerticalScaling(cluster *appsv1.Cluster) error {
 	return r.checkComponentExistence(cluster, compOpsList)
 }
 
-// validateVerticalScaling validate api is legal when spec.type is VerticalScaling
-func (r *OpsRequest) validateReconfigure(ctx context.Context,
-	k8sClient client.Client,
-	cluster *appsv1.Cluster) error {
-	if len(r.Spec.Reconfigures) == 0 {
-		return notEmptyError("spec.reconfigures")
-	}
-	for _, reconfigure := range r.Spec.Reconfigures {
-		if err := r.validateReconfigureParams(ctx, k8sClient, cluster, &reconfigure); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func (r *OpsRequest) validateReconfigureParams(ctx context.Context,
-	k8sClient client.Client,
-	cluster *appsv1.Cluster,
-	reconfigure *Reconfigure) error {
-	if cluster.Spec.GetComponentByName(reconfigure.ComponentName) == nil {
-		return fmt.Errorf("component %s not found", reconfigure.ComponentName)
-	}
-	for _, configuration := range reconfigure.Configurations {
-		cmObj, err := r.getConfigMap(ctx, k8sClient, fmt.Sprintf("%s-%s-%s", r.Spec.GetClusterName(), reconfigure.ComponentName, configuration.Name))
-		if err != nil {
-			return err
-		}
-		for _, key := range configuration.Keys {
-			// check add file
-			if _, ok := cmObj.Data[key.Key]; !ok && key.FileContent == "" {
-				return errors.Errorf("key %s not found in configmap %s", key.Key, configuration.Name)
-			}
-			if key.FileContent == "" && len(key.Parameters) == 0 {
-				return errors.New("key.fileContent and key.parameters cannot be empty at the same time")
-			}
-		}
-	}
-	return nil
-}
-
-func (r *OpsRequest) getConfigMap(ctx context.Context,
-	k8sClient client.Client,
-	cmName string) (*corev1.ConfigMap, error) {
-	cmObj := &corev1.ConfigMap{}
-	cmKey := client.ObjectKey{
-		Namespace: r.Namespace,
-		Name:      cmName,
-	}
-
-	if err := k8sClient.Get(ctx, cmKey, cmObj); err != nil {
-		return nil, err
-	}
-	return cmObj, nil
-}
-
 // compareRequestsAndLimits compares the resource requests and limits
 func compareRequestsAndLimits(resources corev1.ResourceRequirements) (string, error) {
 	requests := resources.Requests
diff --git a/apis/operations/v1alpha1/zz_generated.deepcopy.go b/apis/operations/v1alpha1/zz_generated.deepcopy.go
index ad81fecd9..deae3c431 100644
--- a/apis/operations/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/operations/v1alpha1/zz_generated.deepcopy.go
@@ -25,7 +25,6 @@ package v1alpha1
 
 import (
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	dataprotectionv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 	"k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -129,56 +128,6 @@ func (in *ComponentOps) DeepCopy() *ComponentOps {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ConfigurationItem) DeepCopyInto(out *ConfigurationItem) {
-	*out = *in
-	if in.Policy != nil {
-		in, out := &in.Policy, &out.Policy
-		*out = new(appsv1alpha1.UpgradePolicy)
-		**out = **in
-	}
-	if in.Keys != nil {
-		in, out := &in.Keys, &out.Keys
-		*out = make([]ParameterConfig, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigurationItem.
-func (in *ConfigurationItem) DeepCopy() *ConfigurationItem {
-	if in == nil {
-		return nil
-	}
-	out := new(ConfigurationItem)
-	in.DeepCopyInto(out)
-	return out
-}
-
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ConfigurationItemStatus) DeepCopyInto(out *ConfigurationItemStatus) {
-	*out = *in
-	if in.LastAppliedConfiguration != nil {
-		in, out := &in.LastAppliedConfiguration, &out.LastAppliedConfiguration
-		*out = make(map[string]string, len(*in))
-		for key, val := range *in {
-			(*out)[key] = val
-		}
-	}
-	in.UpdatedParameters.DeepCopyInto(&out.UpdatedParameters)
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigurationItemStatus.
-func (in *ConfigurationItemStatus) DeepCopy() *ConfigurationItemStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(ConfigurationItemStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *CustomOps) DeepCopyInto(out *CustomOps) {
 	*out = *in
@@ -840,22 +789,6 @@ func (in *OpsRequestStatus) DeepCopyInto(out *OpsRequestStatus) {
 	in.StartTimestamp.DeepCopyInto(&out.StartTimestamp)
 	in.CompletionTimestamp.DeepCopyInto(&out.CompletionTimestamp)
 	in.CancelTimestamp.DeepCopyInto(&out.CancelTimestamp)
-	if in.ReconfiguringStatusAsComponent != nil {
-		in, out := &in.ReconfiguringStatusAsComponent, &out.ReconfiguringStatusAsComponent
-		*out = make(map[string]*ReconfiguringStatus, len(*in))
-		for key, val := range *in {
-			var outVal *ReconfiguringStatus
-			if val == nil {
-				(*out)[key] = nil
-			} else {
-				inVal := (*in)[key]
-				in, out := &inVal, &outVal
-				*out = new(ReconfiguringStatus)
-				(*in).DeepCopyInto(*out)
-			}
-			(*out)[key] = outVal
-		}
-	}
 	if in.Conditions != nil {
 		in, out := &in.Conditions, &out.Conditions
 		*out = make([]metav1.Condition, len(*in))
@@ -1020,28 +953,6 @@ func (in *Parameter) DeepCopy() *Parameter {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ParameterConfig) DeepCopyInto(out *ParameterConfig) {
-	*out = *in
-	if in.Parameters != nil {
-		in, out := &in.Parameters, &out.Parameters
-		*out = make([]ParameterPair, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ParameterConfig.
-func (in *ParameterConfig) DeepCopy() *ParameterConfig {
-	if in == nil {
-		return nil
-	}
-	out := new(ParameterConfig)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ParameterPair) DeepCopyInto(out *ParameterPair) {
 	*out = *in
@@ -1260,9 +1171,9 @@ func (in *RebuildInstance) DeepCopy() *RebuildInstance {
 func (in *Reconfigure) DeepCopyInto(out *Reconfigure) {
 	*out = *in
 	out.ComponentOps = in.ComponentOps
-	if in.Configurations != nil {
-		in, out := &in.Configurations, &out.Configurations
-		*out = make([]ConfigurationItem, len(*in))
+	if in.Parameters != nil {
+		in, out := &in.Parameters, &out.Parameters
+		*out = make([]ParameterPair, len(*in))
 		for i := range *in {
 			(*in)[i].DeepCopyInto(&(*out)[i])
 		}
@@ -1279,35 +1190,6 @@ func (in *Reconfigure) DeepCopy() *Reconfigure {
 	return out
 }
 
-// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
-func (in *ReconfiguringStatus) DeepCopyInto(out *ReconfiguringStatus) {
-	*out = *in
-	if in.Conditions != nil {
-		in, out := &in.Conditions, &out.Conditions
-		*out = make([]metav1.Condition, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-	if in.ConfigurationStatus != nil {
-		in, out := &in.ConfigurationStatus, &out.ConfigurationStatus
-		*out = make([]ConfigurationItemStatus, len(*in))
-		for i := range *in {
-			(*in)[i].DeepCopyInto(&(*out)[i])
-		}
-	}
-}
-
-// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ReconfiguringStatus.
-func (in *ReconfiguringStatus) DeepCopy() *ReconfiguringStatus {
-	if in == nil {
-		return nil
-	}
-	out := new(ReconfiguringStatus)
-	in.DeepCopyInto(out)
-	return out
-}
-
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *RefNamespaceName) DeepCopyInto(out *RefNamespaceName) {
 	*out = *in
diff --git a/apis/parameters/v1alpha1/componentparameter_types.go b/apis/parameters/v1alpha1/componentparameter_types.go
index f3fd67d43..14f595d87 100644
--- a/apis/parameters/v1alpha1/componentparameter_types.go
+++ b/apis/parameters/v1alpha1/componentparameter_types.go
@@ -56,6 +56,8 @@ func init() {
 	SchemeBuilder.Register(&ComponentParameter{}, &ComponentParameterList{})
 }
 
+// Payload holds the payload data. This field is optional and can contain any type of data.
+// Not included in the JSON representation of the object.
 type Payload map[string]json.RawMessage
 
 // ConfigTemplateItemDetail corresponds to settings of a configuration template (a ConfigMap).
@@ -76,7 +78,9 @@ type ConfigTemplateItemDetail struct {
 	// Note: Currently, the `payload` field is opaque and its content is not interpreted by the system.
 	// Modifying this field will cause a rerender, regardless of the specific content of this field.
 	//
+	// +kubebuilder:validation:Schemaless
 	// +kubebuilder:pruning:PreserveUnknownFields
+	// +kubebuilder:validation:Type=object
 	// +optional
 	Payload Payload `json:"payload,omitempty"`
 
@@ -98,7 +102,7 @@ type ConfigTemplateItemDetail struct {
 	// This allows users to customize the configuration template according to their specific requirements.
 	//
 	// +optional
-	CustomTemplates *appsv1.ConfigTemplateExtension `json:"userConfigTemplates,omitempty"`
+	CustomTemplates *ConfigTemplateExtension `json:"userConfigTemplates,omitempty"`
 
 	// Specifies the user-defined configuration parameters.
 	//
diff --git a/apis/parameters/v1alpha1/parameter_types.go b/apis/parameters/v1alpha1/parameter_types.go
index 2b8f19489..0972dee53 100644
--- a/apis/parameters/v1alpha1/parameter_types.go
+++ b/apis/parameters/v1alpha1/parameter_types.go
@@ -18,8 +18,6 @@ package v1alpha1
 
 import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 )
 
 // +genclient
@@ -109,7 +107,7 @@ type ComponentParametersSpec struct {
 	// This allows users to customize the configuration template according to their specific requirements.
 	//
 	// +optional
-	CustomTemplates map[string]appsv1.ConfigTemplateExtension `json:"userConfigTemplates,omitempty"`
+	CustomTemplates map[string]ConfigTemplateExtension `json:"userConfigTemplates,omitempty"`
 }
 
 type ComponentReconfiguringStatus struct {
@@ -149,5 +147,5 @@ type ReconfiguringStatus struct {
 	// This allows users to customize the configuration template according to their specific requirements.
 	//
 	// +optional
-	CustomTemplate *appsv1.ConfigTemplateExtension `json:"userConfigTemplates,omitempty"`
+	CustomTemplate *ConfigTemplateExtension `json:"userConfigTemplates,omitempty"`
 }
diff --git a/apis/parameters/v1alpha1/types.go b/apis/parameters/v1alpha1/types.go
index 9d2c8a9a2..86a8193cb 100644
--- a/apis/parameters/v1alpha1/types.go
+++ b/apis/parameters/v1alpha1/types.go
@@ -171,6 +171,7 @@ type ReloadPolicy string
 const (
 	NonePolicy                    ReloadPolicy = "none"
 	RestartPolicy                 ReloadPolicy = "restart"
+	RestartContainerPolicy        ReloadPolicy = "restartContainer"
 	RollingPolicy                 ReloadPolicy = "rolling"
 	AsyncDynamicReloadPolicy      ReloadPolicy = "asyncReload"
 	SyncDynamicReloadPolicy       ReloadPolicy = "syncReload"
@@ -178,3 +179,37 @@ const (
 )
 
 type ComponentParameters map[string]*string
+
+// MergedPolicy defines how to merge external imported templates into component templates.
+// +enum
+// +kubebuilder:validation:Enum={patch,replace,none}
+type MergedPolicy string
+
+const (
+	PatchPolicy     MergedPolicy = "patch"
+	ReplacePolicy   MergedPolicy = "replace"
+	OnlyAddPolicy   MergedPolicy = "add"
+	NoneMergePolicy MergedPolicy = "none"
+)
+
+type ConfigTemplateExtension struct {
+	// Specifies the name of the referenced configuration template ConfigMap object.
+	//
+	// +kubebuilder:validation:Required
+	// +kubebuilder:validation:Pattern:=`^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$`
+	TemplateRef string `json:"templateRef"`
+
+	// Specifies the namespace of the referenced configuration template ConfigMap object.
+	// An empty namespace is equivalent to the "default" namespace.
+	//
+	// +kubebuilder:default="default"
+	// +kubebuilder:validation:Pattern:=`^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$`
+	// +optional
+	Namespace string `json:"namespace,omitempty"`
+
+	// Defines the strategy for merging externally imported templates into component templates.
+	//
+	// +kubebuilder:default="none"
+	// +optional
+	Policy MergedPolicy `json:"policy,omitempty"`
+}
diff --git a/apis/parameters/v1alpha1/zz_generated.deepcopy.go b/apis/parameters/v1alpha1/zz_generated.deepcopy.go
index 77d20d69d..da120d7f0 100644
--- a/apis/parameters/v1alpha1/zz_generated.deepcopy.go
+++ b/apis/parameters/v1alpha1/zz_generated.deepcopy.go
@@ -232,7 +232,7 @@ func (in *ComponentParametersSpec) DeepCopyInto(out *ComponentParametersSpec) {
 	}
 	if in.CustomTemplates != nil {
 		in, out := &in.CustomTemplates, &out.CustomTemplates
-		*out = make(map[string]v1.ConfigTemplateExtension, len(*in))
+		*out = make(map[string]ConfigTemplateExtension, len(*in))
 		for key, val := range *in {
 			(*out)[key] = val
 		}
@@ -271,6 +271,21 @@ func (in *ComponentReconfiguringStatus) DeepCopy() *ComponentReconfiguringStatus
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *ConfigTemplateExtension) DeepCopyInto(out *ConfigTemplateExtension) {
+	*out = *in
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ConfigTemplateExtension.
+func (in *ConfigTemplateExtension) DeepCopy() *ConfigTemplateExtension {
+	if in == nil {
+		return nil
+	}
+	out := new(ConfigTemplateExtension)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *ConfigTemplateItemDetail) DeepCopyInto(out *ConfigTemplateItemDetail) {
 	*out = *in
@@ -297,7 +312,7 @@ func (in *ConfigTemplateItemDetail) DeepCopyInto(out *ConfigTemplateItemDetail)
 	}
 	if in.CustomTemplates != nil {
 		in, out := &in.CustomTemplates, &out.CustomTemplates
-		*out = new(v1.ConfigTemplateExtension)
+		*out = new(ConfigTemplateExtension)
 		**out = **in
 	}
 	if in.ConfigFileParams != nil {
@@ -907,7 +922,7 @@ func (in *ReconfiguringStatus) DeepCopyInto(out *ReconfiguringStatus) {
 	}
 	if in.CustomTemplate != nil {
 		in, out := &in.CustomTemplate, &out.CustomTemplate
-		*out = new(v1.ConfigTemplateExtension)
+		*out = new(ConfigTemplateExtension)
 		**out = **in
 	}
 }
diff --git a/cmd/manager/main.go b/cmd/manager/main.go
index ad9278226..9344457dc 100644
--- a/cmd/manager/main.go
+++ b/cmd/manager/main.go
@@ -52,7 +52,6 @@ import (
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 	experimentalv1alpha1 "github.com/apecloud/kubeblocks/apis/experimental/v1alpha1"
 	extensionsv1alpha1 "github.com/apecloud/kubeblocks/apis/extensions/v1alpha1"
@@ -114,7 +113,6 @@ var (
 func init() {
 	utilruntime.Must(clientgoscheme.AddToScheme(scheme))
 	utilruntime.Must(appsv1alpha1.AddToScheme(scheme))
-	utilruntime.Must(appsv1beta1.AddToScheme(scheme))
 	utilruntime.Must(appsv1.AddToScheme(scheme))
 	utilruntime.Must(opsv1alpha1.AddToScheme(scheme))
 	utilruntime.Must(dpv1alpha1.AddToScheme(scheme))
@@ -590,20 +588,36 @@ func main() {
 	}
 
 	if viper.GetBool(parametersFlagKey.viperName()) {
-		if err = (&parameterscontrollers.ConfigConstraintReconciler{
+		if err = (&parameterscontrollers.ParametersDefinitionReconciler{
 			Client:   mgr.GetClient(),
 			Scheme:   mgr.GetScheme(),
-			Recorder: mgr.GetEventRecorderFor("config-constraint-controller"),
+			Recorder: mgr.GetEventRecorderFor("parameters-definition-controller"),
+		}).SetupWithManager(mgr); err != nil {
+			setupLog.Error(err, "unable to create controller", "controller", "ParametersDefinition")
+			os.Exit(1)
+		}
+		if err = (&parameterscontrollers.ParameterReconciler{
+			Client:   client,
+			Scheme:   mgr.GetScheme(),
+			Recorder: mgr.GetEventRecorderFor("parameter-controller"),
+		}).SetupWithManager(mgr); err != nil {
+			setupLog.Error(err, "unable to create controller", "controller", "Parameter")
+			os.Exit(1)
+		}
+		if err = (&parameterscontrollers.ComponentDrivenParameterReconciler{
+			Client:   client,
+			Scheme:   mgr.GetScheme(),
+			Recorder: mgr.GetEventRecorderFor("component-driven-parameter-controller"),
 		}).SetupWithManager(mgr); err != nil {
-			setupLog.Error(err, "unable to create controller", "controller", "ConfigConstraint")
+			setupLog.Error(err, "unable to create controller", "controller", "ComponentParameter")
 			os.Exit(1)
 		}
-		if err = (&parameterscontrollers.ConfigurationReconciler{
+		if err = (&parameterscontrollers.ComponentParameterReconciler{
 			Client:   client,
 			Scheme:   mgr.GetScheme(),
-			Recorder: mgr.GetEventRecorderFor("configuration-controller"),
+			Recorder: mgr.GetEventRecorderFor("component-parameter-controller"),
 		}).SetupWithManager(mgr, multiClusterMgr); err != nil {
-			setupLog.Error(err, "unable to create controller", "controller", "Configuration")
+			setupLog.Error(err, "unable to create controller", "controller", "ComponentParameter")
 			os.Exit(1)
 		}
 		if err = (&parameterscontrollers.ReconfigureReconciler{
diff --git a/cmd/reloader/app/proxy.go b/cmd/reloader/app/proxy.go
index 1ce448a12..4e6ca652e 100644
--- a/cmd/reloader/app/proxy.go
+++ b/cmd/reloader/app/proxy.go
@@ -95,7 +95,11 @@ func (r *reconfigureProxy) OnlineUpgradeParams(ctx context.Context, request *cfg
 	if len(params) == 0 {
 		return nil, cfgcore.MakeError("update params is empty.")
 	}
-	if err := r.updater(ctx, request.ConfigSpec, params); err != nil {
+	key := request.ConfigSpec
+	if request.ConfigFile != nil && *request.ConfigFile != "" {
+		key = key + "/" + *request.ConfigFile
+	}
+	if err := r.updater(ctx, key, params); err != nil {
 		return nil, err
 	}
 	return &cfgproto.OnlineUpgradeParamsResponse{}, nil
diff --git a/config/crd/bases/apps.kubeblocks.io_componentdefinitions.yaml b/config/crd/bases/apps.kubeblocks.io_componentdefinitions.yaml
index 6cca3b425..ef1cbc513 100644
--- a/config/crd/bases/apps.kubeblocks.io_componentdefinitions.yaml
+++ b/config/crd/bases/apps.kubeblocks.io_componentdefinitions.yaml
@@ -4233,36 +4233,6 @@ spec:
                   This field is immutable.
                 items:
                   properties:
-                    asEnvFrom:
-                      description: |-
-                        Specifies the containers to inject the ConfigMap parameters as environment variables.
-
-
-                        This is useful when application images accept parameters through environment variables and
-                        generate the final configuration file in the startup script based on these variables.
-
-
-                        This field allows users to specify a list of container names, and KubeBlocks will inject the environment
-                        variables converted from the ConfigMap into these designated containers. This provides a flexible way to
-                        pass the configuration items from the ConfigMap to the container without modifying the image.
-
-
-                        Deprecated: `asEnvFrom` has been deprecated since 0.9.0 and will be removed in 0.10.0.
-                        Use `injectEnvTo` instead.
-                      items:
-                        type: string
-                      type: array
-                      x-kubernetes-list-type: set
-                    asSecret:
-                      description: Whether to store the final rendered parameters
-                        as a secret.
-                      type: boolean
-                    constraintRef:
-                      description: Specifies the name of the referenced configuration
-                        constraints object.
-                      maxLength: 63
-                      pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
-                      type: string
                     defaultMode:
                       description: |-
                         The operator attempts to set default file permissions for scripts (0555) and configurations (0444).
@@ -4283,40 +4253,6 @@ spec:
                         Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                       format: int32
                       type: integer
-                    injectEnvTo:
-                      description: |-
-                        Specifies the containers to inject the ConfigMap parameters as environment variables.
-
-
-                        This is useful when application images accept parameters through environment variables and
-                        generate the final configuration file in the startup script based on these variables.
-
-
-                        This field allows users to specify a list of container names, and KubeBlocks will inject the environment
-                        variables converted from the ConfigMap into these designated containers. This provides a flexible way to
-                        pass the configuration items from the ConfigMap to the container without modifying the image.
-                      items:
-                        type: string
-                      type: array
-                      x-kubernetes-list-type: set
-                    keys:
-                      description: |-
-                        Specifies the configuration files within the ConfigMap that support dynamic updates.
-
-
-                        A configuration template (provided in the form of a ConfigMap) may contain templates for multiple
-                        configuration files.
-                        Each configuration file corresponds to a key in the ConfigMap.
-                        Some of these configuration files may support dynamic modification and reloading without requiring
-                        a pod restart.
-
-
-                        If empty or omitted, all configuration files in the ConfigMap are assumed to support dynamic updates,
-                        and ConfigConstraint applies to all keys.
-                      items:
-                        type: string
-                      type: array
-                      x-kubernetes-list-type: set
                     name:
                       description: Specifies the name of the configuration template.
                       maxLength: 63
@@ -4330,28 +4266,6 @@ spec:
                       maxLength: 63
                       pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                       type: string
-                    reRenderResourceTypes:
-                      description: |-
-                        Specifies whether the configuration needs to be re-rendered after v-scale or h-scale operations to reflect changes.
-
-
-                        In some scenarios, the configuration may need to be updated to reflect the changes in resource allocation
-                        or cluster topology. Examples:
-
-
-                        - Redis: adjust maxmemory after v-scale operation.
-                        - MySQL: increase max connections after v-scale operation.
-                        - Zookeeper: update zoo.cfg with new node addresses after h-scale operation.
-                      items:
-                        description: RerenderResourceType defines the resource requirements
-                          for a component.
-                        enum:
-                        - vscale
-                        - hscale
-                        - tls
-                        type: string
-                      type: array
-                      x-kubernetes-list-type: set
                     templateRef:
                       description: Specifies the name of the referenced configuration
                         template ConfigMap object.
diff --git a/config/crd/bases/operations.kubeblocks.io_opsrequests.yaml b/config/crd/bases/operations.kubeblocks.io_opsrequests.yaml
index e099379a5..01c0bd11a 100644
--- a/config/crd/bases/operations.kubeblocks.io_opsrequests.yaml
+++ b/config/crd/bases/operations.kubeblocks.io_opsrequests.yaml
@@ -2331,89 +2331,28 @@ spec:
                       description: Specifies the name of the Component as defined
                         in the cluster.spec
                       type: string
-                    configurations:
+                    parameters:
                       description: |-
-                        Contains a list of ConfigurationItem objects, specifying the Component's configuration template name,
-                        upgrade policy, and parameter key-value pairs to be updated.
+                        Specifies a list of key-value pairs representing parameters and their corresponding values
+                        within a single configuration file.
+                        This field is used to override or set the values of parameters without modifying the entire configuration file.
                       items:
                         properties:
-                          keys:
-                            description: |-
-                              Sets the configuration files and their associated parameters that need to be updated.
-                              It should contain at least one item.
-                            items:
-                              properties:
-                                fileContent:
-                                  description: |-
-                                    Specifies the content of the entire configuration file.
-                                    This field is used to update the complete configuration file.
-
-
-                                    Either the `parameters` field or the `fileContent` field must be set, but not both.
-                                  type: string
-                                key:
-                                  description: |-
-                                    Represents a key in the configuration template(as ConfigMap).
-                                    Each key in the ConfigMap corresponds to a specific configuration file.
-                                  type: string
-                                parameters:
-                                  description: |-
-                                    Specifies a list of key-value pairs representing parameters and their corresponding values
-                                    within a single configuration file.
-                                    This field is used to override or set the values of parameters without modifying the entire configuration file.
-
-
-                                    Either the `parameters` field or the `fileContent` field must be set, but not both.
-                                  items:
-                                    properties:
-                                      key:
-                                        description: Represents the name of the parameter
-                                          that is to be updated.
-                                        type: string
-                                      value:
-                                        description: |-
-                                          Represents the parameter values that are to be updated.
-                                          If set to nil, the parameter defined by the Key field will be removed from the configuration file.
-                                        type: string
-                                    required:
-                                    - key
-                                    type: object
-                                  type: array
-                              required:
-                              - key
-                              type: object
-                            minItems: 1
-                            type: array
-                            x-kubernetes-list-map-keys:
-                            - key
-                            x-kubernetes-list-type: map
-                          name:
-                            description: Specifies the name of the configuration template.
-                            maxLength: 63
-                            pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
+                          key:
+                            description: Represents the name of the parameter that
+                              is to be updated.
                             type: string
-                          policy:
-                            description: Defines the upgrade policy for the configuration.
-                            enum:
-                            - simple
-                            - parallel
-                            - rolling
-                            - autoReload
-                            - operatorSyncUpdate
-                            - dynamicReloadBeginRestart
+                          value:
+                            description: |-
+                              Represents the parameter values that are to be updated.
+                              If set to nil, the parameter defined by the Key field will be removed from the configuration file.
                             type: string
                         required:
-                        - keys
-                        - name
+                        - key
                         type: object
-                      minItems: 1
                       type: array
-                      x-kubernetes-list-map-keys:
-                      - name
-                      x-kubernetes-list-type: map
                   required:
                   - componentName
-                  - configurations
                   type: object
                 type: array
                 x-kubernetes-list-map-keys:
@@ -4868,183 +4807,6 @@ spec:
                 description: Represents the progress of the OpsRequest.
                 pattern: ^(\d+|\-)/(\d+|\-)$
                 type: string
-              reconfiguringStatusAsComponent:
-                additionalProperties:
-                  properties:
-                    conditions:
-                      description: |-
-                        Describes the reconfiguring detail status.
-                        Possible condition types include "Creating", "Init", "Running", "Pending", "Merged", "MergeFailed", "FailedAndPause",
-                        "Upgrading", "Deleting", "FailedAndRetry", "Finished", "ReconfigurePersisting", "ReconfigurePersisted".
-                      items:
-                        description: "Condition contains details for one aspect of
-                          the current state of this API Resource.\n---\nThis struct
-                          is intended for direct use as an array at the field path
-                          .status.conditions.  For example,\n\n\n\ttype FooStatus
-                          struct{\n\t    // Represents the observations of a foo's
-                          current state.\n\t    // Known .status.conditions.type are:
-                          \"Available\", \"Progressing\", and \"Degraded\"\n\t    //
-                          +patchMergeKey=type\n\t    // +patchStrategy=merge\n\t    //
-                          +listType=map\n\t    // +listMapKey=type\n\t    Conditions
-                          []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\"
-                          patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t
-                          \   // other fields\n\t}"
-                        properties:
-                          lastTransitionTime:
-                            description: |-
-                              lastTransitionTime is the last time the condition transitioned from one status to another.
-                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.
-                            format: date-time
-                            type: string
-                          message:
-                            description: |-
-                              message is a human readable message indicating details about the transition.
-                              This may be an empty string.
-                            maxLength: 32768
-                            type: string
-                          observedGeneration:
-                            description: |-
-                              observedGeneration represents the .metadata.generation that the condition was set based upon.
-                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
-                              with respect to the current state of the instance.
-                            format: int64
-                            minimum: 0
-                            type: integer
-                          reason:
-                            description: |-
-                              reason contains a programmatic identifier indicating the reason for the condition's last transition.
-                              Producers of specific condition types may define expected values and meanings for this field,
-                              and whether the values are considered a guaranteed API.
-                              The value should be a CamelCase string.
-                              This field may not be empty.
-                            maxLength: 1024
-                            minLength: 1
-                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
-                            type: string
-                          status:
-                            description: status of the condition, one of True, False,
-                              Unknown.
-                            enum:
-                            - "True"
-                            - "False"
-                            - Unknown
-                            type: string
-                          type:
-                            description: |-
-                              type of condition in CamelCase or in foo.example.com/CamelCase.
-                              ---
-                              Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be
-                              useful (see .node.status.conditions), the ability to deconflict is important.
-                              The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
-                            maxLength: 316
-                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-                            type: string
-                        required:
-                        - lastTransitionTime
-                        - message
-                        - reason
-                        - status
-                        - type
-                        type: object
-                      type: array
-                      x-kubernetes-list-map-keys:
-                      - type
-                      x-kubernetes-list-type: map
-                    configurationStatus:
-                      description: Describes the status of the component reconfiguring.
-                      items:
-                        properties:
-                          expectedCount:
-                            default: -1
-                            description: Represents the total count of pods intended
-                              to be updated by a configuration change.
-                            format: int32
-                            type: integer
-                          lastAppliedConfiguration:
-                            additionalProperties:
-                              type: string
-                            description: Stores the last applied configuration.
-                            type: object
-                          lastStatus:
-                            description: |-
-                              Records the last state of the reconfiguration finite state machine.
-                              Possible values include "None", "Retry", "Failed", "NotSupport", "FailedAndRetry".
-
-
-                              - "None" describes fsm has finished and quit.
-                              - "Retry" describes fsm is running.
-                              - "Failed" describes fsm is failed and exited.
-                              - "NotSupport" describes fsm does not support the feature.
-                              - "FailedAndRetry" describes fsm is failed in current state, but can be retried.
-                            type: string
-                          message:
-                            description: Provides details about the operation.
-                            type: string
-                          name:
-                            description: Indicates the name of the configuration template
-                              (as ConfigMap).
-                            maxLength: 63
-                            pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
-                            type: string
-                          status:
-                            description: |-
-                              Represents the current state of the reconfiguration state machine.
-                              Possible values include "Creating", "Init", "Running", "Pending", "Merged", "MergeFailed", "FailedAndPause",
-                              "Upgrading", "Deleting", "FailedAndRetry", "Finished", "ReconfigurePersisting", "ReconfigurePersisted".
-                            type: string
-                          succeedCount:
-                            default: 0
-                            description: Records the number of pods successfully updated
-                              following a configuration change.
-                            format: int32
-                            type: integer
-                          updatePolicy:
-                            description: Records the UpgradePolicy of the configuration
-                              change operation.
-                            enum:
-                            - simple
-                            - parallel
-                            - rolling
-                            - autoReload
-                            - operatorSyncUpdate
-                            - dynamicReloadBeginRestart
-                            type: string
-                          updatedParameters:
-                            description: Contains the updated parameters.
-                            properties:
-                              addedKeys:
-                                additionalProperties:
-                                  type: string
-                                description: Maps newly added configuration files
-                                  to their content.
-                                type: object
-                              deletedKeys:
-                                additionalProperties:
-                                  type: string
-                                description: Lists the name of configuration files
-                                  that have been deleted.
-                                type: object
-                              updatedKeys:
-                                additionalProperties:
-                                  type: string
-                                description: Maps the name of configuration files
-                                  to their updated content, detailing the changes
-                                  made.
-                                type: object
-                            type: object
-                        required:
-                        - name
-                        type: object
-                      type: array
-                      x-kubernetes-list-map-keys:
-                      - name
-                      x-kubernetes-list-type: map
-                  required:
-                  - configurationStatus
-                  type: object
-                description: Records the status of a reconfiguring operation if `opsRequest.spec.type`
-                  equals to "Reconfiguring".
-                type: object
               startTimestamp:
                 description: Records the time when the OpsRequest started processing.
                 format: date-time
diff --git a/config/crd/bases/parameters.kubeblocks.io_componentparameters.yaml b/config/crd/bases/parameters.kubeblocks.io_componentparameters.yaml
index 276f009e4..a36f8a49a 100644
--- a/config/crd/bases/parameters.kubeblocks.io_componentparameters.yaml
+++ b/config/crd/bases/parameters.kubeblocks.io_componentparameters.yaml
@@ -192,13 +192,6 @@ spec:
                       pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
                       type: string
                     payload:
-                      additionalProperties:
-                        description: |-
-                          RawMessage is a raw encoded JSON value.
-                          It implements Marshaler and Unmarshaler and can
-                          be used to delay JSON decoding or precompute a JSON encoding.
-                        format: byte
-                        type: string
                       description: |-
                         External controllers can trigger a configuration rerender by modifying this field.
 
diff --git a/config/rbac/role.yaml b/config/rbac/role.yaml
index c098dd825..1a3635c7b 100644
--- a/config/rbac/role.yaml
+++ b/config/rbac/role.yaml
@@ -175,58 +175,6 @@ rules:
   - get
   - patch
   - update
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configconstraints
-  verbs:
-  - create
-  - delete
-  - get
-  - list
-  - patch
-  - update
-  - watch
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configconstraints/finalizers
-  verbs:
-  - update
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configconstraints/status
-  verbs:
-  - get
-  - patch
-  - update
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configurations
-  verbs:
-  - create
-  - delete
-  - get
-  - list
-  - patch
-  - update
-  - watch
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configurations/finalizers
-  verbs:
-  - update
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configurations/status
-  verbs:
-  - get
-  - patch
-  - update
 - apiGroups:
   - apps.kubeblocks.io
   resources:
@@ -863,6 +811,32 @@ rules:
   - get
   - patch
   - update
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - componentparameters
+  verbs:
+  - create
+  - delete
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - componentparameters/finalizers
+  verbs:
+  - update
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - componentparameters/status
+  verbs:
+  - get
+  - patch
+  - update
 - apiGroups:
   - parameters.kubeblocks.io
   resources:
@@ -889,6 +863,32 @@ rules:
   - get
   - patch
   - update
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - parameters
+  verbs:
+  - create
+  - delete
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - parameters/finalizers
+  verbs:
+  - update
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - parameters/status
+  verbs:
+  - get
+  - patch
+  - update
 - apiGroups:
   - parameters.kubeblocks.io
   resources:
diff --git a/controllers/apps/component/component_controller.go b/controllers/apps/component/component_controller.go
index add05faee..0dbe65303 100644
--- a/controllers/apps/component/component_controller.go
+++ b/controllers/apps/component/component_controller.go
@@ -37,7 +37,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	appsutil "github.com/apecloud/kubeblocks/controllers/apps/util"
@@ -156,8 +155,6 @@ func (r *ComponentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
 			&componentAccountTransformer{},
 			// handle the TLS configuration
 			&componentTLSTransformer{},
-			// rerender parameters after v-scale and h-scale
-			&componentRelatedParametersTransformer{Client: r.Client},
 			// resolve and build vars for template and Env
 			&componentVarsTransformer{},
 			// provision component system accounts, depend on vars
@@ -165,7 +162,7 @@ func (r *ComponentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (
 			// render config/script templates
 			&componentFileTemplateTransformer{},
 			// render component configurations
-			&componentConfigurationTransformer{Client: r.Client},
+			&componentReloadActionSidecarTransformer{Client: r.Client},
 			// handle restore before workloads transform
 			&componentRestoreTransformer{Client: r.Client},
 			// handle the component workload
@@ -217,8 +214,7 @@ func (r *ComponentReconciler) setupWithManager(mgr ctrl.Manager) error {
 		Owns(&corev1.Secret{}).
 		Owns(&corev1.ConfigMap{}).
 		Watches(&dpv1alpha1.Restore{}, handler.EnqueueRequestsFromMapFunc(r.filterComponentResources)).
-		Watches(&corev1.PersistentVolumeClaim{}, handler.EnqueueRequestsFromMapFunc(r.filterComponentResources)).
-		Watches(&appsv1alpha1.Configuration{}, handler.EnqueueRequestsFromMapFunc(r.configurationEventHandler))
+		Watches(&corev1.PersistentVolumeClaim{}, handler.EnqueueRequestsFromMapFunc(r.filterComponentResources))
 
 	if viper.GetBool(constant.EnableRBACManager) {
 		b.Owns(&rbacv1.RoleBinding{}).
@@ -236,8 +232,7 @@ func (r *ComponentReconciler) setupWithMultiClusterManager(mgr ctrl.Manager, mul
 			MaxConcurrentReconciles: viper.GetInt(constant.CfgKBReconcileWorkers),
 		}).
 		Owns(&workloads.InstanceSet{}).
-		Watches(&dpv1alpha1.Restore{}, handler.EnqueueRequestsFromMapFunc(r.filterComponentResources)).
-		Watches(&appsv1alpha1.Configuration{}, handler.EnqueueRequestsFromMapFunc(r.configurationEventHandler))
+		Watches(&dpv1alpha1.Restore{}, handler.EnqueueRequestsFromMapFunc(r.filterComponentResources))
 
 	eventHandler := handler.EnqueueRequestsFromMapFunc(r.filterComponentResources)
 	multiClusterMgr.Watch(b, &corev1.Service{}, eventHandler).
@@ -271,18 +266,3 @@ func (r *ComponentReconciler) filterComponentResources(ctx context.Context, obj
 		},
 	}
 }
-
-func (r *ComponentReconciler) configurationEventHandler(_ context.Context, obj client.Object) []reconcile.Request {
-	cr, ok := obj.(*appsv1alpha1.Configuration)
-	if !ok {
-		return []reconcile.Request{}
-	}
-	return []reconcile.Request{
-		{
-			NamespacedName: types.NamespacedName{
-				Namespace: obj.GetNamespace(),
-				Name:      constant.GenerateClusterComponentName(cr.Spec.ClusterRef, cr.Spec.ComponentName),
-			},
-		},
-	}
-}
diff --git a/controllers/apps/component/scheme.go b/controllers/apps/component/scheme.go
index 6987195a7..c8a7dd1ea 100644
--- a/controllers/apps/component/scheme.go
+++ b/controllers/apps/component/scheme.go
@@ -25,7 +25,6 @@ import (
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	"github.com/apecloud/kubeblocks/pkg/controller/model"
@@ -34,7 +33,6 @@ import (
 func init() {
 	model.AddScheme(clientgoscheme.AddToScheme)
 	model.AddScheme(appsv1alpha1.AddToScheme)
-	model.AddScheme(appsv1beta1.AddToScheme)
 	model.AddScheme(appsv1.AddToScheme)
 	model.AddScheme(dpv1alpha1.AddToScheme)
 	model.AddScheme(snapshotv1.AddToScheme)
diff --git a/controllers/apps/component/transformer_component_configuration.go b/controllers/apps/component/transformer_component_configuration.go
deleted file mode 100644
index f74a9ca25..000000000
--- a/controllers/apps/component/transformer_component_configuration.go
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package component
-
-import (
-	"github.com/pkg/errors"
-	corev1 "k8s.io/api/core/v1"
-	apierrors "k8s.io/apimachinery/pkg/api/errors"
-	"k8s.io/apimachinery/pkg/types"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	"github.com/apecloud/kubeblocks/pkg/common"
-	"github.com/apecloud/kubeblocks/pkg/controller/graph"
-	"github.com/apecloud/kubeblocks/pkg/controller/model"
-	"github.com/apecloud/kubeblocks/pkg/controller/plan"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
-)
-
-// componentConfigurationTransformer handles component configuration render
-type componentConfigurationTransformer struct {
-	client.Client
-}
-
-var _ graph.Transformer = &componentConfigurationTransformer{}
-
-func (t *componentConfigurationTransformer) Transform(ctx graph.TransformContext, dag *graph.DAG) error {
-	transCtx, _ := ctx.(*componentTransformContext)
-
-	comp := transCtx.Component
-	compOrig := transCtx.ComponentOrig
-	synthesizedComp := transCtx.SynthesizeComponent
-
-	if model.IsObjectDeleting(compOrig) {
-		return nil
-	}
-	if common.IsCompactMode(compOrig.Annotations) {
-		transCtx.V(1).Info("Component is in compact mode, no need to create configuration related objects",
-			"component", client.ObjectKeyFromObject(transCtx.ComponentOrig))
-		return nil
-	}
-
-	clusterKey := types.NamespacedName{
-		Namespace: synthesizedComp.Namespace,
-		Name:      synthesizedComp.ClusterName,
-	}
-	cluster := &appsv1.Cluster{}
-	if err := t.Client.Get(transCtx.Context, clusterKey, cluster); err != nil {
-		if apierrors.IsNotFound(err) {
-			return nil
-		}
-		return errors.Wrap(err, "obtain the cluster object error for configuration")
-	}
-
-	// get dependOnObjs which will be used in configuration render
-	var dependOnObjs []client.Object
-	for _, vertex := range dag.Vertices() {
-		v, _ := vertex.(*model.ObjectVertex)
-		if cm, ok := v.Obj.(*corev1.ConfigMap); ok {
-			dependOnObjs = append(dependOnObjs, cm)
-			continue
-		}
-		if secret, ok := v.Obj.(*corev1.Secret); ok {
-			dependOnObjs = append(dependOnObjs, secret)
-			continue
-		}
-	}
-
-	// configuration render
-	if err := plan.RenderConfigNScriptFiles(
-		&render.ResourceCtx{
-			Context:       transCtx.Context,
-			Client:        t.Client,
-			Namespace:     comp.GetNamespace(),
-			ClusterName:   synthesizedComp.ClusterName,
-			ComponentName: synthesizedComp.Name,
-		},
-		cluster,
-		comp,
-		synthesizedComp,
-		synthesizedComp.PodSpec,
-		dependOnObjs); err != nil {
-		return err
-	}
-	return nil
-}
diff --git a/controllers/apps/component/transformer_component_deletion.go b/controllers/apps/component/transformer_component_deletion.go
index af1191cb3..c3d549d5a 100644
--- a/controllers/apps/component/transformer_component_deletion.go
+++ b/controllers/apps/component/transformer_component_deletion.go
@@ -32,7 +32,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client/apiutil"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	appsutil "github.com/apecloud/kubeblocks/controllers/apps/util"
 	"github.com/apecloud/kubeblocks/pkg/constant"
@@ -256,7 +256,7 @@ func compOwnedKinds() []client.ObjectList {
 		&corev1.SecretList{},
 		&corev1.ConfigMapList{},
 		&corev1.PersistentVolumeClaimList{},
-		&appsv1alpha1.ConfigurationList{},
+		&parametersv1alpha1.ComponentParameterList{},
 		&corev1.ServiceAccountList{},
 		&rbacv1.RoleList{},
 		&rbacv1.RoleBindingList{},
diff --git a/controllers/apps/component/transformer_component_parameters.go b/controllers/apps/component/transformer_component_parameters.go
deleted file mode 100644
index 6911082c1..000000000
--- a/controllers/apps/component/transformer_component_parameters.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package component
-
-import (
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/controller/configuration"
-	"github.com/apecloud/kubeblocks/pkg/controller/graph"
-)
-
-type componentRelatedParametersTransformer struct {
-	client.Client
-}
-
-var _ = componentRelatedParametersTransformer{}
-
-func (c *componentRelatedParametersTransformer) Transform(ctx graph.TransformContext, _ *graph.DAG) error {
-	transCtx, _ := ctx.(*componentTransformContext)
-	synthesizedComp := transCtx.SynthesizeComponent
-
-	config := appsv1alpha1.Configuration{}
-	configKey := client.ObjectKey{Namespace: synthesizedComp.Namespace,
-		Name: cfgcore.GenerateComponentConfigurationName(synthesizedComp.ClusterName, synthesizedComp.Name)}
-	if err := c.Get(ctx.GetContext(), configKey, &config); err != nil {
-		return client.IgnoreNotFound(err)
-	}
-
-	configNew := config.DeepCopy()
-	updated, err := configuration.UpdateConfigPayload(&configNew.Spec, synthesizedComp)
-	if err != nil {
-		return err
-	}
-	if !updated {
-		return nil
-	}
-	return c.Patch(ctx.GetContext(), configNew, client.MergeFrom(config.DeepCopy()))
-}
diff --git a/controllers/apps/component/transformer_component_reload_sidecar.go b/controllers/apps/component/transformer_component_reload_sidecar.go
new file mode 100644
index 000000000..ba76c7d42
--- /dev/null
+++ b/controllers/apps/component/transformer_component_reload_sidecar.go
@@ -0,0 +1,156 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package component
+
+import (
+	"context"
+
+	"github.com/pkg/errors"
+	corev1 "k8s.io/api/core/v1"
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/types"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
+	appsutil "github.com/apecloud/kubeblocks/controllers/apps/util"
+	"github.com/apecloud/kubeblocks/pkg/common"
+	"github.com/apecloud/kubeblocks/pkg/configuration/core"
+	"github.com/apecloud/kubeblocks/pkg/controller/component"
+	configctrl "github.com/apecloud/kubeblocks/pkg/controller/configuration"
+	"github.com/apecloud/kubeblocks/pkg/controller/graph"
+	"github.com/apecloud/kubeblocks/pkg/controller/model"
+	"github.com/apecloud/kubeblocks/pkg/controller/render"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+)
+
+// componentReloadActionSidecarTransformer handles component configuration render
+type componentReloadActionSidecarTransformer struct {
+	client.Client
+}
+
+var _ graph.Transformer = &componentReloadActionSidecarTransformer{}
+
+func (t *componentReloadActionSidecarTransformer) Transform(ctx graph.TransformContext, dag *graph.DAG) error {
+	transCtx, _ := ctx.(*componentTransformContext)
+
+	comp := transCtx.Component
+	compOrig := transCtx.ComponentOrig
+	builtinComp := transCtx.SynthesizeComponent
+
+	if model.IsObjectDeleting(compOrig) {
+		return nil
+	}
+	if common.IsCompactMode(compOrig.Annotations) {
+		transCtx.V(1).Info("Component is in compact mode, no need to create configuration related objects",
+			"component", client.ObjectKeyFromObject(transCtx.ComponentOrig))
+		return nil
+	}
+
+	clusterKey := types.NamespacedName{
+		Namespace: builtinComp.Namespace,
+		Name:      builtinComp.ClusterName,
+	}
+	cluster := &appsv1.Cluster{}
+	if err := t.Client.Get(transCtx, clusterKey, cluster); err != nil {
+		if apierrors.IsNotFound(err) {
+			return nil
+		}
+		return errors.Wrap(err, "obtain the cluster object error for restore")
+	}
+
+	reconcileCtx := &render.ResourceCtx{
+		Context:       transCtx.Context,
+		Client:        t.Client,
+		Namespace:     comp.GetNamespace(),
+		ClusterName:   builtinComp.ClusterName,
+		ComponentName: builtinComp.Name,
+	}
+
+	var configmaps []*corev1.ConfigMap
+	cachedObjs := resolveRerenderDependOnObjects(dag)
+	for _, tpls := range [][]appsv1.ComponentTemplateSpec{builtinComp.ScriptTemplates, builtinComp.ConfigTemplates} {
+		objects, err := render.RenderTemplate(reconcileCtx, cluster, builtinComp, comp, cachedObjs, tpls)
+		if err != nil {
+			return err
+		}
+		configmaps = append(configmaps, objects...)
+	}
+
+	graphCli, _ := transCtx.Client.(model.GraphClient)
+	if err := ensureConfigMapsPresence(transCtx, graphCli, dag, configmaps...); err != nil {
+		return err
+	}
+	if err := updatePodVolumes(builtinComp.PodSpec, builtinComp); err != nil {
+		return err
+	}
+	if len(builtinComp.ConfigTemplates) == 0 {
+		return nil
+	}
+
+	return configctrl.BuildReloadActionContainer(reconcileCtx, cluster, builtinComp, transCtx.CompDef, configmaps)
+}
+
+func ensureConfigMapsPresence(ctx context.Context, cli model.GraphClient, dag *graph.DAG, configmaps ...*corev1.ConfigMap) error {
+	for _, configmap := range configmaps {
+		var cm = &corev1.ConfigMap{}
+		if err := cli.Get(ctx, client.ObjectKeyFromObject(configmap), cm); err != nil {
+			if !apierrors.IsNotFound(err) {
+				return err
+			}
+			cli.Create(dag, configmap, appsutil.InDataContext4G())
+		}
+	}
+	return nil
+}
+
+func resolveRerenderDependOnObjects(dag *graph.DAG) []client.Object {
+	var dependOnObjs []client.Object
+	for _, vertex := range dag.Vertices() {
+		v, _ := vertex.(*model.ObjectVertex)
+		if cm, ok := v.Obj.(*corev1.ConfigMap); ok {
+			dependOnObjs = append(dependOnObjs, cm)
+			continue
+		}
+		if secret, ok := v.Obj.(*corev1.Secret); ok {
+			dependOnObjs = append(dependOnObjs, secret)
+			continue
+		}
+	}
+	return dependOnObjs
+}
+
+func updatePodVolumes(podSpec *corev1.PodSpec, component *component.SynthesizedComponent) error {
+	volumes := make(map[string]appsv1.ComponentTemplateSpec, len(component.ConfigTemplates))
+	for _, tpls := range [][]appsv1.ComponentTemplateSpec{component.ConfigTemplates, component.ScriptTemplates} {
+		for _, tpl := range tpls {
+			cmName := core.GetComponentCfgName(component.ClusterName, component.Name, tpl.Name)
+			volumes[cmName] = tpl
+		}
+	}
+	return intctrlutil.CreateOrUpdatePodVolumes(podSpec, volumes, configSetsFromComponent(component.ConfigTemplates))
+}
+
+func configSetsFromComponent(templates []appsv1.ComponentTemplateSpec) []string {
+	configSet := make([]string, 0, len(templates))
+	for _, template := range templates {
+		configSet = append(configSet, template.Name)
+	}
+	return configSet
+}
diff --git a/controllers/apps/component/transformer_component_status.go b/controllers/apps/component/transformer_component_status.go
index ad5801563..ab2e65a29 100644
--- a/controllers/apps/component/transformer_component_status.go
+++ b/controllers/apps/component/transformer_component_status.go
@@ -35,13 +35,10 @@ import (
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
-	appsutil "github.com/apecloud/kubeblocks/controllers/apps/util"
-	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
 	"github.com/apecloud/kubeblocks/pkg/controller/graph"
 	"github.com/apecloud/kubeblocks/pkg/controller/model"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
 
 const (
@@ -130,12 +127,6 @@ func (t *componentStatusTransformer) reconcileStatus(transCtx *componentTransfor
 	// check if the ITS is running
 	isITSUpdatedNRunning := t.isInstanceSetRunning()
 
-	// check if all configTemplates are synced
-	isAllConfigSynced, err := t.isAllConfigSynced(transCtx)
-	if err != nil {
-		return err
-	}
-
 	// check if the component has failed pod
 	hasFailedPod, messages := t.hasFailedPod()
 
@@ -172,8 +163,8 @@ func (t *componentStatusTransformer) reconcileStatus(transCtx *componentTransfor
 	}()
 
 	transCtx.Logger.Info(
-		fmt.Sprintf("status conditions, creating: %v, its running: %v, has failure: %v, updating: %v, config synced: %v",
-			isInCreatingPhase, isITSUpdatedNRunning, hasFailure, hasRunningScaleOut || hasRunningVolumeExpansion, isAllConfigSynced))
+		fmt.Sprintf("status conditions, creating: %v, its running: %v, has failure: %v, updating: %v",
+			isInCreatingPhase, isITSUpdatedNRunning, hasFailure, hasRunningScaleOut || hasRunningVolumeExpansion))
 
 	switch {
 	case isDeleting:
@@ -182,7 +173,7 @@ func (t *componentStatusTransformer) reconcileStatus(transCtx *componentTransfor
 		t.setComponentStatusPhase(transCtx, appsv1.StoppingComponentPhase, nil, "component is Stopping")
 	case stopped:
 		t.setComponentStatusPhase(transCtx, appsv1.StoppedComponentPhase, nil, "component is Stopped")
-	case isITSUpdatedNRunning && isAllConfigSynced && !hasRunningScaleOut && !hasRunningVolumeExpansion:
+	case isITSUpdatedNRunning && !hasRunningScaleOut && !hasRunningVolumeExpansion:
 		t.setComponentStatusPhase(transCtx, appsv1.RunningComponentPhase, nil, "component is Running")
 	case !hasFailure && isInCreatingPhase:
 		t.setComponentStatusPhase(transCtx, appsv1.CreatingComponentPhase, nil, "component is Creating")
@@ -231,46 +222,6 @@ func (t *componentStatusTransformer) isInstanceSetRunning() bool {
 	return t.runningITS.IsInstanceSetReady()
 }
 
-// isAllConfigSynced checks if all configTemplates are synced.
-func (t *componentStatusTransformer) isAllConfigSynced(transCtx *componentTransformContext) (bool, error) {
-	var (
-		cmKey client.ObjectKey
-		cmObj = &corev1.ConfigMap{}
-	)
-
-	if len(t.synthesizeComp.ConfigTemplates) == 0 {
-		return true, nil
-	}
-
-	configurationKey := client.ObjectKey{
-		Namespace: t.synthesizeComp.Namespace,
-		Name:      cfgcore.GenerateComponentConfigurationName(t.synthesizeComp.ClusterName, t.synthesizeComp.Name),
-	}
-	configuration := &appsv1alpha1.Configuration{}
-	if err := t.Client.Get(transCtx.Context, configurationKey, configuration); err != nil {
-		return false, err
-	}
-	for _, configSpec := range t.synthesizeComp.ConfigTemplates {
-		item := configuration.Spec.GetConfigurationItem(configSpec.Name)
-		status := configuration.Status.GetItemStatus(configSpec.Name)
-		// for creating phase
-		if item == nil || status == nil {
-			return false, nil
-		}
-		cmKey = client.ObjectKey{
-			Namespace: t.synthesizeComp.Namespace,
-			Name:      cfgcore.GetComponentCfgName(t.synthesizeComp.ClusterName, t.synthesizeComp.Name, configSpec.Name),
-		}
-		if err := t.Client.Get(transCtx.Context, cmKey, cmObj, appsutil.InDataContext4C()); err != nil {
-			return false, err
-		}
-		if intctrlutil.GetConfigSpecReconcilePhase(cmObj, *item, status) != appsv1alpha1.CFinishedPhase {
-			return false, nil
-		}
-	}
-	return true, nil
-}
-
 // hasScaleOutRunning checks if the scale out is running.
 func (t *componentStatusTransformer) hasScaleOutRunning(transCtx *componentTransformContext) (running bool, failed bool, err error) {
 	if t.runningITS == nil || t.runningITS.Spec.Replicas == nil {
diff --git a/controllers/apps/component/transformer_component_workload.go b/controllers/apps/component/transformer_component_workload.go
index 9c2090e2c..b7c5df864 100644
--- a/controllers/apps/component/transformer_component_workload.go
+++ b/controllers/apps/component/transformer_component_workload.go
@@ -1043,7 +1043,11 @@ func (r *componentWorkloadOps) updatePVCSize(pvcKey types.NamespacedName,
 		// if both pvc and pv not found, do nothing
 		return nil
 	}
-	if reflect.DeepEqual(pvc.Spec.Resources, newPVC.Spec.Resources) && pv.Spec.PersistentVolumeReclaimPolicy == corev1.PersistentVolumeReclaimRetain {
+	if reflect.DeepEqual(pvc.Spec.Resources, newPVC.Spec.Resources) &&
+		pv.Spec.PersistentVolumeReclaimPolicy == corev1.PersistentVolumeReclaimRetain &&
+		pv.Annotations != nil &&
+		len(pv.Annotations[constant.PVLastClaimPolicyAnnotationKey]) > 0 &&
+		pv.Annotations[constant.PVLastClaimPolicyAnnotationKey] != string(corev1.PersistentVolumeReclaimRetain) {
 		// this could happen if create pvc succeeded but last step failed
 		updatePVCByRecreateFromStep(pvRestorePolicyStep)
 		return nil
diff --git a/controllers/apps/componentdefinition_controller.go b/controllers/apps/componentdefinition_controller.go
index a679585aa..1b8995de1 100644
--- a/controllers/apps/componentdefinition_controller.go
+++ b/controllers/apps/componentdefinition_controller.go
@@ -39,7 +39,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsconfig "github.com/apecloud/kubeblocks/controllers/parameters"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
@@ -138,9 +137,6 @@ func (r *ComponentDefinitionReconciler) deletionHandler(rctx intctrlutil.Request
 			recordEvent, &appsv1.ComponentList{}); res != nil || err != nil {
 			return res, err
 		}
-		if err := appsconfig.DeleteConfigMapFinalizer(r.Client, rctx, cmpd); err != nil {
-			return &ctrl.Result{}, err
-		}
 		return nil, nil
 	}
 }
@@ -337,7 +333,7 @@ func (r *ComponentDefinitionReconciler) validateServices(cli client.Client, rctx
 
 func (r *ComponentDefinitionReconciler) validateConfigs(cli client.Client, rctx intctrlutil.RequestCtx,
 	compDef *appsv1.ComponentDefinition) error {
-	return appsconfig.ReconcileConfigSpecsForReferencedCR(cli, rctx, compDef)
+	return validateComponentTemplate(cli, rctx, compDef)
 }
 
 func (r *ComponentDefinitionReconciler) validateSystemAccounts(cli client.Client, rctx intctrlutil.RequestCtx,
diff --git a/controllers/apps/sidecardefinition_controller.go b/controllers/apps/sidecardefinition_controller.go
index aab01c761..55f0aba90 100644
--- a/controllers/apps/sidecardefinition_controller.go
+++ b/controllers/apps/sidecardefinition_controller.go
@@ -40,7 +40,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsconfig "github.com/apecloud/kubeblocks/controllers/parameters"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
@@ -232,25 +231,13 @@ func (r *SidecarDefinitionReconciler) validateConfigNScript(cli client.Client, r
 		return fmt.Errorf("duplicate names of configs/scripts are not allowed")
 	}
 
-	configs := func() []appsv1.ComponentConfigSpec {
-		if len(sidecarDef.Spec.Configs) == 0 {
-			return nil
-		}
-		configs := make([]appsv1.ComponentConfigSpec, 0)
-		for i := range sidecarDef.Spec.Configs {
-			configs = append(configs, appsv1.ComponentConfigSpec{
-				ComponentTemplateSpec: sidecarDef.Spec.Configs[i],
-			})
-		}
-		return configs
-	}
 	compDef := &appsv1.ComponentDefinition{
 		Spec: appsv1.ComponentDefinitionSpec{
-			Configs: configs(),
+			Configs: sidecarDef.Spec.Configs,
 			Scripts: sidecarDef.Spec.Scripts,
 		},
 	}
-	return appsconfig.ReconcileConfigSpecsForReferencedCR(cli, rctx, compDef)
+	return validateComponentTemplate(cli, rctx, compDef)
 }
 
 func (r *SidecarDefinitionReconciler) validateNResolveOwner(_ client.Client, _ intctrlutil.RequestCtx,
@@ -343,18 +330,7 @@ func (r *SidecarDefinitionReconciler) validateMatchedCompDef(sidecarDef *appsv1.
 			return nil
 		}
 
-		templateOfConfig := func(configs []appsv1.ComponentConfigSpec) []appsv1.ComponentTemplateSpec {
-			if len(configs) == 0 {
-				return nil
-			}
-			l := make([]appsv1.ComponentTemplateSpec, 0)
-			for i := range configs {
-				l = append(l, configs[i].ComponentTemplateSpec)
-			}
-			return l
-		}
-
-		if err := validate("config", sidecarDef.Spec.Configs, templateOfConfig(compDef.Spec.Configs)); err != nil {
+		if err := validate("config", sidecarDef.Spec.Configs, compDef.Spec.Configs); err != nil {
 			return err
 		}
 		return validate("script", sidecarDef.Spec.Scripts, compDef.Spec.Scripts)
diff --git a/pkg/controller/plan/prepare.go b/controllers/apps/utils.go
similarity index 52%
rename from pkg/controller/plan/prepare.go
rename to controllers/apps/utils.go
index 8dc37fcc0..eb3584f41 100644
--- a/pkg/controller/plan/prepare.go
+++ b/controllers/apps/utils.go
@@ -17,31 +17,33 @@ You should have received a copy of the GNU Affero General Public License
 along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
-package plan
+package apps
 
 import (
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	"github.com/apecloud/kubeblocks/pkg/controller/configuration"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
 
-// RenderConfigNScriptFiles generates volumes for PodTemplate, volumeMount for container, rendered configTemplate and scriptTemplate,
-// and generates configManager sidecar for the reconfigure operation.
-func RenderConfigNScriptFiles(resourceCtx *render.ResourceCtx,
-	cluster *appsv1.Cluster,
-	component *appsv1.Component,
-	synthesizedComponent *component.SynthesizedComponent,
-	podSpec *corev1.PodSpec,
-	localObjs []client.Object) error {
-	return configuration.NewConfigReconcileTask(
-		resourceCtx,
-		cluster,
-		component,
-		synthesizedComponent,
-		podSpec,
-		localObjs).Reconcile()
+func validateComponentTemplate(cli client.Client, rctx intctrlutil.RequestCtx, compd *appsv1.ComponentDefinition) error {
+	validateObject := func(objectKey client.ObjectKey) error {
+		configObj := &corev1.ConfigMap{}
+		return cli.Get(rctx.Ctx, objectKey, configObj)
+	}
+	validateTemplate := func(tpl appsv1.ComponentTemplateSpec) error {
+		if tpl.TemplateRef != "" {
+			return validateObject(client.ObjectKey{Namespace: tpl.Namespace, Name: tpl.TemplateRef})
+		}
+		return nil
+	}
+	for _, tpls := range [][]appsv1.ComponentTemplateSpec{compd.Spec.Configs, compd.Spec.Scripts} {
+		for _, tpl := range tpls {
+			if err := validateTemplate(tpl); err != nil {
+				return err
+			}
+		}
+	}
+	return nil
 }
diff --git a/controllers/parameters/combine_upgrade_policy.go b/controllers/parameters/combine_upgrade_policy.go
index bb807d5db..1658289a0 100644
--- a/controllers/parameters/combine_upgrade_policy.go
+++ b/controllers/parameters/combine_upgrade_policy.go
@@ -19,26 +19,33 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 package parameters
 
-import appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+import (
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+)
+
+var combineUpgradePolicyInstance = &combineUpgradePolicy{
+	policyExecutors: []reconfigurePolicy{
+		syncPolicyInstance,
+		restartPolicyInstance,
+	},
+}
 
 type combineUpgradePolicy struct {
 	policyExecutors []reconfigurePolicy
 }
 
 func init() {
-	RegisterPolicy(appsv1alpha1.DynamicReloadAndRestartPolicy, &combineUpgradePolicy{
-		policyExecutors: []reconfigurePolicy{&syncPolicy{}, &simplePolicy{}},
-	})
+	registerPolicy(parametersv1alpha1.DynamicReloadAndRestartPolicy, combineUpgradePolicyInstance)
 }
 
 func (h *combineUpgradePolicy) GetPolicyName() string {
-	return string(appsv1alpha1.DynamicReloadAndRestartPolicy)
+	return string(parametersv1alpha1.DynamicReloadAndRestartPolicy)
 }
 
-func (h *combineUpgradePolicy) Upgrade(params reconfigureParams) (ReturnedStatus, error) {
+func (h *combineUpgradePolicy) Upgrade(rctx reconfigureContext) (ReturnedStatus, error) {
 	var ret ReturnedStatus
 	for _, executor := range h.policyExecutors {
-		retStatus, err := executor.Upgrade(params)
+		retStatus, err := executor.Upgrade(rctx)
 		if err != nil {
 			return retStatus, err
 		}
diff --git a/controllers/parameters/componentdrivenparameter_controller.go b/controllers/parameters/componentdrivenparameter_controller.go
new file mode 100644
index 000000000..02001dccc
--- /dev/null
+++ b/controllers/parameters/componentdrivenparameter_controller.go
@@ -0,0 +1,233 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package parameters
+
+import (
+	"context"
+	"fmt"
+	"reflect"
+
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/client-go/tools/record"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/log"
+
+	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	configcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
+	"github.com/apecloud/kubeblocks/pkg/constant"
+	"github.com/apecloud/kubeblocks/pkg/controller/builder"
+	"github.com/apecloud/kubeblocks/pkg/controller/component"
+	configctrl "github.com/apecloud/kubeblocks/pkg/controller/configuration"
+	"github.com/apecloud/kubeblocks/pkg/controller/model"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+)
+
+// ComponentDrivenParameterReconciler reconciles a Parameter object
+type ComponentDrivenParameterReconciler struct {
+	client.Client
+	Scheme   *runtime.Scheme
+	Recorder record.EventRecorder
+}
+
+// +kubebuilder:rbac:groups=apps.kubeblocks.io,resources=components,verbs=get;list;watch;create;update;patch;delete
+// +kubebuilder:rbac:groups=apps.kubeblocks.io,resources=components/status,verbs=get;update;patch
+// +kubebuilder:rbac:groups=apps.kubeblocks.io,resources=components/finalizers,verbs=update
+
+// +kubebuilder:rbac:groups=parameters.kubeblocks.io,resources=componentparameters,verbs=get;list;watch;create;update;patch;delete
+// +kubebuilder:rbac:groups=parameters.kubeblocks.io,resources=componentparameters/status,verbs=get;update;patch
+// +kubebuilder:rbac:groups=parameters.kubeblocks.io,resources=componentparameters/finalizers,verbs=update
+
+// Reconcile is part of the main kubernetes reconciliation loop which aims to
+// move the current state of the cluster closer to the desired state.
+//
+// For more details, check Reconcile and its Result here:
+// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.14.4/pkg/reconcile
+func (r *ComponentDrivenParameterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
+	reqCtx := intctrlutil.RequestCtx{
+		Ctx:      ctx,
+		Req:      req,
+		Recorder: r.Recorder,
+		Log: log.FromContext(ctx).
+			WithName("ComponentParameterReconciler").
+			WithValues("Namespace", req.Namespace, "Parameter", req.Name),
+	}
+
+	comp := &appsv1.Component{}
+	if err := r.Client.Get(reqCtx.Ctx, reqCtx.Req.NamespacedName, comp); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+	}
+	return r.reconcile(reqCtx, comp)
+}
+
+// SetupWithManager sets up the controller with the Manager.
+func (r *ComponentDrivenParameterReconciler) SetupWithManager(mgr ctrl.Manager) error {
+	return ctrl.NewControllerManagedBy(mgr).
+		For(&appsv1.Component{}).
+		Complete(r)
+}
+
+func (r *ComponentDrivenParameterReconciler) reconcile(reqCtx intctrlutil.RequestCtx, component *appsv1.Component) (ctrl.Result, error) {
+	var err error
+	var existingObject *parametersv1alpha1.ComponentParameter
+	var expectedObject *parametersv1alpha1.ComponentParameter
+
+	if existingObject, err = runningComponentParameter(reqCtx, r.Client, component); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+	}
+	if model.IsObjectDeleting(component) {
+		return r.delete(reqCtx, existingObject)
+	}
+	if expectedObject, err = buildComponentParameter(reqCtx, r.Client, component); err != nil {
+		return intctrlutil.RequeueWithError(err, reqCtx.Log, "")
+	}
+
+	switch {
+	case expectedObject == nil:
+		return r.delete(reqCtx, existingObject)
+	case existingObject == nil:
+		return r.create(reqCtx, expectedObject)
+	default:
+		return r.update(reqCtx, expectedObject, existingObject)
+	}
+}
+
+func (r *ComponentDrivenParameterReconciler) create(reqCtx intctrlutil.RequestCtx, object *parametersv1alpha1.ComponentParameter) (ctrl.Result, error) {
+	if err := r.Client.Create(reqCtx.Ctx, object); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+	}
+	reqCtx.Log.Info("ComponentParameter created")
+	intctrlutil.RecordCreatedEvent(r.Recorder, object)
+	return intctrlutil.Reconciled()
+}
+
+func (r *ComponentDrivenParameterReconciler) delete(reqCtx intctrlutil.RequestCtx, object *parametersv1alpha1.ComponentParameter) (ctrl.Result, error) {
+	if object == nil {
+		return intctrlutil.Reconciled()
+	}
+	if err := r.Client.Delete(reqCtx.Ctx, object); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+	}
+	reqCtx.Log.Info("ComponentParameter deleted")
+	return intctrlutil.Reconciled()
+}
+
+func (r *ComponentDrivenParameterReconciler) update(reqCtx intctrlutil.RequestCtx, expected, existing *parametersv1alpha1.ComponentParameter) (ctrl.Result, error) {
+	mergedObject := r.mergeComponentParameter(expected, existing)
+	if reflect.DeepEqual(mergedObject, existing) {
+		return intctrlutil.Reconciled()
+	}
+	if err := r.Client.Patch(reqCtx.Ctx, mergedObject, client.MergeFrom(existing)); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+	}
+	return intctrlutil.Reconciled()
+}
+
+func runningComponentParameter(reqCtx intctrlutil.RequestCtx, reader client.Reader, comp *appsv1.Component) (*parametersv1alpha1.ComponentParameter, error) {
+	var componentParameter = &parametersv1alpha1.ComponentParameter{}
+
+	clusterName, _ := component.GetClusterName(comp)
+	componentName, _ := component.ShortName(clusterName, comp.Name)
+
+	parameterKey := types.NamespacedName{
+		Name:      configcore.GenerateComponentConfigurationName(clusterName, componentName),
+		Namespace: comp.Namespace,
+	}
+	if err := reader.Get(reqCtx.Ctx, parameterKey, componentParameter); err != nil {
+		return nil, client.IgnoreNotFound(err)
+	}
+	return componentParameter, nil
+}
+
+func getCompDefinition(ctx context.Context, cli client.Reader, comp *appsv1.Component) (*appsv1.ComponentDefinition, error) {
+	compKey := types.NamespacedName{
+		Name: comp.Spec.CompDef,
+	}
+	cmpd := &appsv1.ComponentDefinition{}
+	if err := cli.Get(ctx, compKey, cmpd); err != nil {
+		return nil, err
+	}
+	if cmpd.Status.Phase != appsv1.AvailablePhase {
+		return nil, fmt.Errorf("the referenced ComponentDefinition is unavailable: %s", cmpd.Name)
+	}
+	return cmpd, nil
+}
+
+func buildComponentParameter(reqCtx intctrlutil.RequestCtx, reader client.Reader, comp *appsv1.Component) (*parametersv1alpha1.ComponentParameter, error) {
+	var err error
+	var cmpd *appsv1.ComponentDefinition
+
+	if cmpd, err = getCompDefinition(reqCtx.Ctx, reader, comp); err != nil {
+		return nil, err
+	}
+	if len(cmpd.Spec.Configs) == 0 {
+		return nil, nil
+	}
+
+	configRender, paramsDefs, err := intctrlutil.ResolveCmpdParametersDefs(reqCtx.Ctx, reader, cmpd)
+	if err != nil {
+		return nil, err
+	}
+	tpls, err := resolveComponentTemplate(reqCtx.Ctx, reader, cmpd)
+	if err != nil {
+		return nil, err
+	}
+
+	clusterName, _ := component.GetClusterName(comp)
+	componentName, _ := component.ShortName(clusterName, comp.Name)
+	parameterObj := builder.NewComponentParameterBuilder(comp.Namespace,
+		configcore.GenerateComponentConfigurationName(clusterName, componentName)).
+		AddLabelsInMap(constant.GetCompLabelsWithDef(clusterName, componentName, cmpd.Name)).
+		ClusterRef(clusterName).
+		Component(componentName).
+		SetConfigurationItem(configctrl.ClassifyParamsFromConfigTemplate(nil, cmpd, paramsDefs, tpls)).
+		GetObject()
+	if err = intctrlutil.SetOwnerReference(comp, parameterObj); err != nil {
+		return nil, err
+	}
+	if configRender != nil {
+		err = configctrl.UpdateConfigPayload(&parameterObj.Spec, &comp.Spec, &configRender.Spec)
+	}
+	return parameterObj, err
+}
+
+func resolveComponentTemplate(ctx context.Context, reader client.Reader, cmpd *appsv1.ComponentDefinition) (map[string]*corev1.ConfigMap, error) {
+	tpls := make(map[string]*corev1.ConfigMap, len(cmpd.Spec.Configs))
+	for _, config := range cmpd.Spec.Configs {
+		cm := &corev1.ConfigMap{}
+		if err := reader.Get(ctx, client.ObjectKey{Name: config.TemplateRef, Namespace: config.Namespace}, cm); err != nil {
+			return nil, err
+		}
+		tpls[config.Name] = cm
+	}
+	return tpls, nil
+}
+
+func (r *ComponentDrivenParameterReconciler) mergeComponentParameter(expected *parametersv1alpha1.ComponentParameter, existing *parametersv1alpha1.ComponentParameter) *parametersv1alpha1.ComponentParameter {
+	return configctrl.MergeComponentParameter(expected, existing, func(dest, expected *parametersv1alpha1.ConfigTemplateItemDetail) {
+		if len(dest.ConfigFileParams) == 0 && len(expected.ConfigFileParams) != 0 {
+			dest.ConfigFileParams = expected.ConfigFileParams
+		}
+		dest.Payload = expected.Payload
+	})
+}
diff --git a/controllers/parameters/componentparameter_controller.go b/controllers/parameters/componentparameter_controller.go
new file mode 100644
index 000000000..b63c9d3ea
--- /dev/null
+++ b/controllers/parameters/componentparameter_controller.go
@@ -0,0 +1,211 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package parameters
+
+import (
+	"context"
+	"fmt"
+	"math"
+	"strconv"
+
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	utilerrors "k8s.io/apimachinery/pkg/util/errors"
+	"k8s.io/client-go/tools/record"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/controller"
+	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
+	"sigs.k8s.io/controller-runtime/pkg/log"
+	"sigs.k8s.io/controller-runtime/pkg/reconcile"
+
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	"github.com/apecloud/kubeblocks/pkg/constant"
+	"github.com/apecloud/kubeblocks/pkg/controller/multicluster"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+	viper "github.com/apecloud/kubeblocks/pkg/viperx"
+)
+
+// ComponentParameterReconciler reconciles a ComponentParameter object
+type ComponentParameterReconciler struct {
+	client.Client
+	Scheme   *runtime.Scheme
+	Recorder record.EventRecorder
+}
+
+// +kubebuilder:rbac:groups=parameters.kubeblocks.io,resources=componentparameters,verbs=get;list;watch;create;update;patch;delete
+// +kubebuilder:rbac:groups=parameters.kubeblocks.io,resources=componentparameters/status,verbs=get;update;patch
+// +kubebuilder:rbac:groups=parameters.kubeblocks.io,resources=componentparameters/finalizers,verbs=update
+
+// Reconcile is part of the main kubernetes reconciliation loop which aims to
+// move the current state of the cluster closer to the desired state.
+//
+// For more details, check Reconcile and its Result here:
+// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.14.4/pkg/reconcile
+func (r *ComponentParameterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
+	reqCtx := intctrlutil.RequestCtx{
+		Ctx:      ctx,
+		Req:      req,
+		Recorder: r.Recorder,
+		Log: log.FromContext(ctx).
+			WithName("ComponentParameterReconciler").
+			WithValues("Namespace", req.Namespace, "ComponentParameter", req.Name),
+	}
+
+	componentParam := &parametersv1alpha1.ComponentParameter{}
+	if err := r.Client.Get(reqCtx.Ctx, reqCtx.Req.NamespacedName, componentParam); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+	}
+
+	res, err := intctrlutil.HandleCRDeletion(reqCtx, r, componentParam, constant.ConfigFinalizerName, r.deletionHandler(reqCtx, componentParam))
+	if res != nil {
+		return *res, err
+	}
+	return r.reconcile(reqCtx, componentParam)
+}
+
+// SetupWithManager sets up the controller with the Manager.
+func (r *ComponentParameterReconciler) SetupWithManager(mgr ctrl.Manager, multiClusterMgr multicluster.Manager) error {
+	builder := intctrlutil.NewControllerManagedBy(mgr).
+		For(&parametersv1alpha1.ComponentParameter{}).
+		WithOptions(controller.Options{
+			MaxConcurrentReconciles: int(math.Ceil(viper.GetFloat64(constant.CfgKBReconcileWorkers) / 2)),
+		}).
+		Owns(&corev1.ConfigMap{})
+	if multiClusterMgr != nil {
+		multiClusterMgr.Own(builder, &corev1.ConfigMap{}, &parametersv1alpha1.ComponentParameter{})
+	}
+	return builder.Complete(r)
+}
+
+func (r *ComponentParameterReconciler) reconcile(reqCtx intctrlutil.RequestCtx, componentParameter *parametersv1alpha1.ComponentParameter) (ctrl.Result, error) {
+	tasks := generateReconcileTasks(reqCtx, componentParameter)
+	if len(tasks) == 0 {
+		return intctrlutil.Reconciled()
+	}
+
+	fetcherTask, err := prepareReconcileTask(reqCtx, r.Client, componentParameter)
+	if err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "failed to get related object.")
+	}
+	if !fetcherTask.ClusterObj.GetDeletionTimestamp().IsZero() {
+		reqCtx.Log.Info("cluster is deleting, skip reconcile")
+		return intctrlutil.Reconciled()
+	}
+	if fetcherTask.ClusterComObj == nil || fetcherTask.ComponentObj == nil {
+		return r.failWithInvalidComponent(componentParameter, reqCtx)
+	}
+
+	taskCtx, err := NewTaskContext(reqCtx.Ctx, r.Client, componentParameter, fetcherTask)
+	if err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "failed to create task context.")
+	}
+	if err := r.runTasks(taskCtx, tasks, fetcherTask); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "failed to run configuration reconcile task.")
+	}
+	return intctrlutil.Reconciled()
+}
+
+func (r *ComponentParameterReconciler) failWithInvalidComponent(componentParam *parametersv1alpha1.ComponentParameter, reqCtx intctrlutil.RequestCtx) (ctrl.Result, error) {
+	msg := fmt.Sprintf("not found cluster component: [%s]", componentParam.Spec.ComponentName)
+
+	reqCtx.Log.Error(fmt.Errorf("%s", msg), "")
+	patch := client.MergeFrom(componentParam.DeepCopy())
+	componentParam.Status.Message = msg
+	if err := r.Client.Status().Patch(reqCtx.Ctx, componentParam, patch); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "failed to update configuration status.")
+	}
+	return intctrlutil.Reconciled()
+}
+
+func (r *ComponentParameterReconciler) runTasks(taskCtx *TaskContext, tasks []Task, resource *Task) error {
+	var (
+		errs          []error
+		compParameter = taskCtx.componentParameter
+	)
+
+	patch := client.MergeFrom(compParameter.DeepCopy())
+	revision := strconv.FormatInt(compParameter.GetGeneration(), 10)
+	for _, task := range tasks {
+		if err := task.Do(resource, taskCtx, revision); err != nil {
+			errs = append(errs, err)
+			continue
+		}
+	}
+
+	updateCompParamStatus(&compParameter.Status, errs, compParameter.Generation)
+	if err := r.Client.Status().Patch(taskCtx.ctx, compParameter, patch); err != nil {
+		errs = append(errs, err)
+	}
+	if len(errs) == 0 {
+		return nil
+	}
+	return utilerrors.NewAggregate(errs)
+}
+
+func updateCompParamStatus(status *parametersv1alpha1.ComponentParameterStatus, errs []error, generation int64) {
+	aggregatePhase := func(ss []parametersv1alpha1.ConfigTemplateItemDetailStatus) parametersv1alpha1.ParameterPhase {
+		var phase = parametersv1alpha1.CFinishedPhase
+		for _, s := range ss {
+			switch {
+			case intctrlutil.IsFailedPhase(s.Phase):
+				return s.Phase
+			case !intctrlutil.IsParameterFinished(s.Phase):
+				phase = parametersv1alpha1.CRunningPhase
+			}
+		}
+		return phase
+	}
+
+	status.ObservedGeneration = generation
+	status.Message = ""
+	status.Phase = aggregatePhase(status.ConfigurationItemStatus)
+	if len(errs) > 0 {
+		status.Message = utilerrors.NewAggregate(errs).Error()
+	}
+}
+
+func (r *ComponentParameterReconciler) deletionHandler(reqCtx intctrlutil.RequestCtx, componentParameter *parametersv1alpha1.ComponentParameter) func() (*ctrl.Result, error) {
+	return func() (*ctrl.Result, error) {
+		var cms = &corev1.ConfigMapList{}
+		matchLabels := client.MatchingLabels(constant.GetCompLabels(componentParameter.Spec.ClusterName, componentParameter.Spec.ComponentName))
+		if err := r.Client.List(reqCtx.Ctx, cms, client.InNamespace(componentParameter.Namespace), matchLabels); err != nil {
+			return &reconcile.Result{}, err
+		}
+		if err := removeConfigRelatedFinalizer(reqCtx.Ctx, r.Client, cms.Items); err != nil {
+			return &reconcile.Result{}, err
+		}
+		return nil, nil
+	}
+}
+
+func removeConfigRelatedFinalizer(ctx context.Context, cli client.Client, objs []corev1.ConfigMap) error {
+	for _, obj := range objs {
+		if !controllerutil.ContainsFinalizer(&obj, constant.ConfigFinalizerName) {
+			continue
+		}
+		patch := client.MergeFrom(obj.DeepCopy())
+		controllerutil.RemoveFinalizer(&obj, constant.ConfigFinalizerName)
+		if err := cli.Patch(ctx, &obj, patch); err != nil {
+			return err
+		}
+	}
+	return nil
+}
diff --git a/controllers/parameters/config_annotation.go b/controllers/parameters/config_annotation.go
index 10d9146f8..93353faca 100644
--- a/controllers/parameters/config_annotation.go
+++ b/controllers/parameters/config_annotation.go
@@ -28,7 +28,7 @@ import (
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/constant"
@@ -37,7 +37,7 @@ import (
 
 type options = func(*intctrlutil.Result)
 
-func reconciled(status ReturnedStatus, policy string, phase appsv1alpha1.ConfigurationPhase, options ...options) intctrlutil.Result {
+func reconciled(status ReturnedStatus, policy string, phase parametersv1alpha1.ParameterPhase, options ...options) intctrlutil.Result {
 	result := intctrlutil.Result{
 		Policy:        policy,
 		Phase:         phase,
@@ -52,7 +52,7 @@ func reconciled(status ReturnedStatus, policy string, phase appsv1alpha1.Configu
 	return result
 }
 
-func unReconciled(phase appsv1alpha1.ConfigurationPhase, revision string, message string) intctrlutil.Result {
+func unReconciled(phase parametersv1alpha1.ParameterPhase, revision string, message string) intctrlutil.Result {
 	return intctrlutil.Result{
 		Phase:         phase,
 		Revision:      revision,
@@ -95,7 +95,7 @@ func checkEnableCfgUpgrade(object client.Object) bool {
 	return true
 }
 
-func updateConfigPhase(cli client.Client, ctx intctrlutil.RequestCtx, config *corev1.ConfigMap, phase appsv1alpha1.ConfigurationPhase, message string) (ctrl.Result, error) {
+func updateConfigPhase(cli client.Client, ctx intctrlutil.RequestCtx, config *corev1.ConfigMap, phase parametersv1alpha1.ParameterPhase, message string) (ctrl.Result, error) {
 	return updateConfigPhaseWithResult(cli, ctx, config, unReconciled(phase, "", message))
 }
 
@@ -159,7 +159,7 @@ func updateAppliedConfigs(cli client.Client, ctx intctrlutil.RequestCtx, config
 	GcConfigRevision(config)
 	if revision, ok := config.ObjectMeta.Annotations[constant.ConfigurationRevision]; ok && revision != "" {
 		if result == nil {
-			result = util.ToPointer(unReconciled(appsv1alpha1.CFinishedPhase, "", fmt.Sprintf("phase: %s", reconfigurePhase)))
+			result = util.ToPointer(unReconciled(parametersv1alpha1.CFinishedPhase, "", fmt.Sprintf("phase: %s", reconfigurePhase)))
 		}
 		result.Revision = revision
 		b, _ := json.Marshal(result)
@@ -203,17 +203,3 @@ func getLastVersionConfig(cm *corev1.ConfigMap) (map[string]string, error) {
 
 	return data, nil
 }
-
-func getUpgradePolicy(cm *corev1.ConfigMap) appsv1alpha1.UpgradePolicy {
-	const (
-		DefaultUpgradePolicy = appsv1alpha1.NonePolicy
-	)
-
-	annotations := cm.GetAnnotations()
-	value, ok := annotations[constant.UpgradePolicyAnnotationKey]
-	if !ok {
-		return DefaultUpgradePolicy
-	}
-
-	return appsv1alpha1.UpgradePolicy(value)
-}
diff --git a/controllers/parameters/config_reconcile_wrapper.go b/controllers/parameters/config_reconcile_wrapper.go
index b4c1c9a2f..18f20ed25 100644
--- a/controllers/parameters/config_reconcile_wrapper.go
+++ b/controllers/parameters/config_reconcile_wrapper.go
@@ -20,8 +20,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package parameters
 
 import (
-	"context"
-
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
@@ -38,7 +36,6 @@ type ReconcileContext struct {
 	intctrlutil.RequestCtx
 	configctrl.ResourceFetcher[ReconcileContext]
 
-	ctx              context.Context
 	Name             string
 	MatchingLabels   client.MatchingLabels
 	ConfigMap        *corev1.ConfigMap
@@ -51,13 +48,13 @@ type ReconcileContext struct {
 	ParametersDefs map[string]*parametersv1alpha1.ParametersDefinition
 }
 
-func newConfigReconcileContext(ctx context.Context,
+func newParameterReconcileContext(reqCtx intctrlutil.RequestCtx,
 	resourceCtx *render.ResourceCtx,
 	cm *corev1.ConfigMap,
 	configSpecName string,
 	matchingLabels client.MatchingLabels) *ReconcileContext {
 	configContext := ReconcileContext{
-		ctx:            ctx,
+		RequestCtx:     reqCtx,
 		ConfigMap:      cm,
 		Name:           configSpecName,
 		MatchingLabels: matchingLabels,
@@ -71,11 +68,12 @@ func (c *ReconcileContext) GetRelatedObjects() error {
 		ComponentSpec().
 		Workload().
 		SynthesizedComponent().
+		ParametersDefinitions().
 		Complete()
 }
 
 func (c *ReconcileContext) Workload() *ReconcileContext {
-	stsFn := func() (err error) {
+	instanceSetFn := func() (err error) {
 		c.InstanceSetList, c.Containers, err = retrieveRelatedComponentsByConfigmap(
 			c.Client,
 			c.Context,
@@ -86,13 +84,13 @@ func (c *ReconcileContext) Workload() *ReconcileContext {
 			c.MatchingLabels)
 		return
 	}
-	return c.Wrap(stsFn)
+	return c.Wrap(instanceSetFn)
 }
 
 func (c *ReconcileContext) SynthesizedComponent() *ReconcileContext {
 	return c.Wrap(func() (err error) {
 		// build synthesized component for the component
-		c.BuiltinComponent, err = component.BuildSynthesizedComponent(c.ctx, c.Client, c.ComponentDefObj, c.ComponentObj)
+		c.BuiltinComponent, err = component.BuildSynthesizedComponent(c.Ctx, c.Client, c.ComponentDefObj, c.ComponentObj)
 		return err
 	})
 }
diff --git a/controllers/parameters/config_util.go b/controllers/parameters/config_util.go
index 3714bce50..a01e84bfe 100644
--- a/controllers/parameters/config_util.go
+++ b/controllers/parameters/config_util.go
@@ -22,29 +22,22 @@ package parameters
 import (
 	"context"
 	"fmt"
-	"reflect"
+	"strconv"
 
-	"github.com/go-logr/logr"
 	corev1 "k8s.io/api/core/v1"
-	apierrors "k8s.io/apimachinery/pkg/api/errors"
-	"k8s.io/apimachinery/pkg/conversion"
 	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgcm "github.com/apecloud/kubeblocks/pkg/configuration/config_manager"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/configuration/openapi"
-	"github.com/apecloud/kubeblocks/pkg/configuration/validate"
 	"github.com/apecloud/kubeblocks/pkg/constant"
-	"github.com/apecloud/kubeblocks/pkg/controller/configuration"
+	"github.com/apecloud/kubeblocks/pkg/controller/component"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-	"github.com/apecloud/kubeblocks/pkg/generics"
 )
 
-type ValidateConfigMap func(configTpl, ns string) (*corev1.ConfigMap, error)
-type ValidateConfigSchema func(tpl *appsv1beta1.ParametersSchema) (bool, error)
+// type ValidateConfigMap func(configTpl, ns string) (*corev1.ConfigMap, error)
+// type ValidateConfigSchema func(tpl *appsv1beta1.ParametersSchema) (bool, error)
 
 func checkConfigLabels(object client.Object, requiredLabs []string) bool {
 	labels := object.GetLabels()
@@ -66,350 +59,71 @@ func checkConfigLabels(object client.Object, requiredLabs []string) bool {
 	return checkEnableCfgUpgrade(object)
 }
 
-func getConfigMapByTemplateName(cli client.Client, ctx intctrlutil.RequestCtx, templateName, ns string) (*corev1.ConfigMap, error) {
-	if len(templateName) == 0 {
-		return nil, nil
-	}
-
-	configObj := &corev1.ConfigMap{}
-	if err := cli.Get(ctx.Ctx, client.ObjectKey{
-		Namespace: ns,
-		Name:      templateName,
-	}, configObj); err != nil {
-		ctx.Log.Error(err, "failed to get config template cm object!", "configMapName", templateName)
-		return nil, err
-	}
-
-	return configObj, nil
-}
-
-func checkConfigConstraint(ctx intctrlutil.RequestCtx, configConstraint *appsv1beta1.ConfigConstraint) (bool, error) {
-	// validate configuration template
-	validateConfigSchema := func(ccSchema *appsv1beta1.ParametersSchema) (bool, error) {
-		if ccSchema == nil || len(ccSchema.CUE) == 0 {
-			return true, nil
-		}
-
-		err := validate.CueValidate(ccSchema.CUE)
-		return err == nil, err
-	}
-
-	// validate schema
-	if ok, err := validateConfigSchema(configConstraint.Spec.ParametersSchema); !ok || err != nil {
-		ctx.Log.Error(err, "failed to validate template schema!", "configMapName", fmt.Sprintf("%v", configConstraint.Spec.ParametersSchema))
-		return ok, err
-	}
-	return true, nil
-}
-
-func ReconcileConfigSpecsForReferencedCR[T generics.Object, PT generics.PObject[T]](client client.Client, ctx intctrlutil.RequestCtx, obj PT) error {
-	if ok, err := checkConfigTemplate(client, ctx, obj); !ok || err != nil {
-		return fmt.Errorf("failed to check config template: %v", err)
-	}
-	if ok, err := updateLabelsByConfigSpec(client, ctx, obj); !ok || err != nil {
-		return fmt.Errorf("failed to update using config template info: %v", err)
-	}
-	if _, err := updateConfigMapFinalizer(client, ctx, obj); err != nil {
-		return fmt.Errorf("failed to update config map finalizer: %v", err)
-	}
-	return nil
-}
-
-func DeleteConfigMapFinalizer(cli client.Client, ctx intctrlutil.RequestCtx, obj client.Object) error {
-	handler := func(configSpecs []appsv1.ComponentConfigSpec) (bool, error) {
-		return true, batchDeleteConfigMapFinalizer(cli, ctx, configSpecs, obj)
-	}
-	_, err := handleConfigTemplate(obj, handler)
-	return err
-}
-
-func validateConfigMapOwners(cli client.Client, ctx intctrlutil.RequestCtx, labels client.MatchingLabels, check func(obj client.Object) bool, objLists ...client.ObjectList) (bool, error) {
-	for _, objList := range objLists {
-		if err := cli.List(ctx.Ctx, objList, labels, inDataContextUnspecified()); err != nil {
-			return false, err
-		}
-		v, err := conversion.EnforcePtr(objList)
-		if err != nil {
-			return false, err
-		}
-		items := v.FieldByName("Items")
-		if !items.IsValid() || items.Kind() != reflect.Slice {
-			return false, nil
-		}
-		if items.Len() == 0 {
-			continue
-		}
-		if !checkEnabledDelete(items, check) {
-			return false, nil
-		}
+func createConfigPatch(cfg *corev1.ConfigMap, configRender *parametersv1alpha1.ParamConfigRenderer, paramsDefs map[string]*parametersv1alpha1.ParametersDefinition) (*core.ConfigPatchInfo, bool, error) {
+	if configRender == nil || len(configRender.Spec.Configs) == 0 {
+		return nil, true, nil
 	}
-	return true, nil
-}
-
-func checkEnabledDelete(items reflect.Value, check func(obj client.Object) bool) bool {
-	for i := 0; i < items.Len(); i++ {
-		val := items.Index(i)
-		// fetch object pointer
-		if val.CanAddr() {
-			val = val.Addr()
-		}
-		if !val.CanInterface() {
-			return false
-		}
-		obj, ok := val.Interface().(client.Object)
-		if !ok {
-			return false
-		}
-		if obj.GetDeletionTimestamp() != nil {
-			continue
-		}
-		if !check(obj) {
-			return false
-		}
+	lastConfig, err := getLastVersionConfig(cfg)
+	if err != nil {
+		return nil, false, core.WrapError(err, "failed to get last version data. config[%v]", client.ObjectKeyFromObject(cfg))
 	}
-	return true
-}
 
-func batchDeleteConfigMapFinalizer(cli client.Client, ctx intctrlutil.RequestCtx, configSpecs []appsv1.ComponentConfigSpec, cr client.Object) error {
-	validator := func(obj client.Object) bool {
-		return obj.GetName() == cr.GetName() && obj.GetNamespace() == cr.GetNamespace()
-	}
-	for _, configSpec := range configSpecs {
-		labels := client.MatchingLabels{
-			core.GenerateTPLUniqLabelKeyWithConfig(configSpec.Name): configSpec.TemplateRef,
-		}
-		if ok, err := validateConfigMapOwners(cli, ctx, labels, validator, &appsv1.ClusterDefinitionList{}, &appsv1.ComponentDefinitionList{}); err != nil {
-			return err
-		} else if !ok {
-			continue
-		}
-		if err := deleteConfigMapFinalizer(cli, ctx, configSpec); err != nil {
-			return err
-		}
+	patch, restart, err := core.CreateConfigPatch(lastConfig, cfg.Data, configRender.Spec, true)
+	if err != nil {
+		return nil, false, err
 	}
-	return nil
-}
-
-func updateConfigMapFinalizer(client client.Client, ctx intctrlutil.RequestCtx, obj client.Object) (bool, error) {
-	handler := func(configSpecs []appsv1.ComponentConfigSpec) (bool, error) {
-		return true, batchUpdateConfigMapFinalizer(client, ctx, configSpecs)
+	if !restart {
+		restart = cfgcm.NeedRestart(paramsDefs, patch)
 	}
-	return handleConfigTemplate(obj, handler)
+	return patch, restart, nil
 }
 
-func batchUpdateConfigMapFinalizer(cli client.Client, ctx intctrlutil.RequestCtx, configSpecs []appsv1.ComponentConfigSpec) error {
-	for _, configSpec := range configSpecs {
-		if err := updateConfigMapFinalizerImpl(cli, ctx, configSpec); err != nil {
-			return err
+func generateReconcileTasks(reqCtx intctrlutil.RequestCtx, componentParameter *parametersv1alpha1.ComponentParameter) []Task {
+	tasks := make([]Task, 0, len(componentParameter.Spec.ConfigItemDetails))
+	for _, item := range componentParameter.Spec.ConfigItemDetails {
+		if status := fromItemStatus(reqCtx, &componentParameter.Status, item, componentParameter.GetGeneration()); status != nil {
+			tasks = append(tasks, NewTask(item, status))
 		}
 	}
-	return nil
-}
-
-func updateConfigMapFinalizerImpl(cli client.Client, ctx intctrlutil.RequestCtx, configSpec appsv1.ComponentConfigSpec) error {
-	// step1: add finalizer
-	// step2: add labels: CMConfigurationTypeLabelKey
-	// step3: update immutable
-
-	cmObj, err := getConfigMapByTemplateName(cli, ctx, configSpec.TemplateRef, configSpec.Namespace)
-	if err != nil {
-		ctx.Log.Error(err, "failed to get template cm object!", "configMapName", cmObj.Name)
-		return err
-	}
-	if cmObj == nil {
-		return nil
-	}
-
-	if controllerutil.ContainsFinalizer(cmObj, constant.ConfigFinalizerName) {
-		return nil
-	}
-
-	patch := client.MergeFrom(cmObj.DeepCopy())
-
-	if cmObj.Labels == nil {
-		cmObj.Labels = map[string]string{}
-	}
-	cmObj.Labels[constant.CMConfigurationTypeLabelKey] = constant.ConfigTemplateType
-	controllerutil.AddFinalizer(cmObj, constant.ConfigFinalizerName)
-
-	// cmObj.Immutable = &tpl.Spec.Immutable
-	return cli.Patch(ctx.Ctx, cmObj, patch)
+	return tasks
 }
 
-func deleteConfigMapFinalizer(cli client.Client, ctx intctrlutil.RequestCtx, configSpec appsv1.ComponentConfigSpec) error {
-	cmObj, err := getConfigMapByTemplateName(cli, ctx, configSpec.TemplateRef, configSpec.Namespace)
-	if err != nil && apierrors.IsNotFound(err) {
-		return nil
-	} else if err != nil {
-		ctx.Log.Error(err, "failed to get config template cm object!", "configMapName", configSpec.TemplateRef)
-		return err
-	}
-	if cmObj == nil {
-		return nil
-	}
-
-	if !controllerutil.ContainsFinalizer(cmObj, constant.ConfigFinalizerName) {
+func fromItemStatus(ctx intctrlutil.RequestCtx, status *parametersv1alpha1.ComponentParameterStatus, item parametersv1alpha1.ConfigTemplateItemDetail, generation int64) *parametersv1alpha1.ConfigTemplateItemDetailStatus {
+	if item.ConfigSpec == nil {
+		ctx.Log.V(1).WithName(item.Name).Info(fmt.Sprintf("configuration is creating and pass: %s", item.Name))
 		return nil
 	}
-
-	patch := client.MergeFrom(cmObj.DeepCopy())
-	controllerutil.RemoveFinalizer(cmObj, constant.ConfigFinalizerName)
-	return cli.Patch(ctx.Ctx, cmObj, patch)
-}
-
-type ConfigTemplateHandler func([]appsv1.ComponentConfigSpec) (bool, error)
-type componentValidateHandler func(*appsv1.ComponentDefinition) error
-
-func handleConfigTemplate(object client.Object, handler ConfigTemplateHandler, handler2 ...componentValidateHandler) (bool, error) {
-	var (
-		err             error
-		configTemplates []appsv1.ComponentConfigSpec
-	)
-	switch cr := object.(type) {
-	case *appsv1.ComponentDefinition:
-		configTemplates, err = getConfigTemplateFromComponentDef(cr, handler2...)
-	default:
-		return false, core.MakeError("not support CR type: %v", cr)
-	}
-
-	switch {
-	case err != nil:
-		return false, err
-	case len(configTemplates) > 0:
-		return handler(configTemplates)
-	default:
-		return true, nil
-	}
-}
-
-func getConfigTemplateFromComponentDef(componentDef *appsv1.ComponentDefinition,
-	validators ...componentValidateHandler) ([]appsv1.ComponentConfigSpec, error) {
-	configTemplates := make([]appsv1.ComponentConfigSpec, 0)
-	// For compatibility with the previous lifecycle management of configurationSpec.TemplateRef,
-	// it is necessary to convert ScriptSpecs to ConfigSpecs,
-	// ensuring that the script-related configmap is not allowed to be deleted.
-	for _, scriptSpec := range componentDef.Spec.Scripts {
-		configTemplates = append(configTemplates, appsv1.ComponentConfigSpec{
-			ComponentTemplateSpec: scriptSpec,
+	itemStatus := intctrlutil.GetItemStatus(status, item.Name)
+	if itemStatus == nil || itemStatus.Phase == "" {
+		ctx.Log.WithName(item.Name).Info(fmt.Sprintf("ComponentParameters cr is creating: %v", item))
+		status.ConfigurationItemStatus = append(status.ConfigurationItemStatus, parametersv1alpha1.ConfigTemplateItemDetailStatus{
+			Name:           item.Name,
+			Phase:          parametersv1alpha1.CInitPhase,
+			UpdateRevision: strconv.FormatInt(generation, 10),
 		})
+		itemStatus = intctrlutil.GetItemStatus(status, item.Name)
 	}
-	if len(componentDef.Spec.Configs) > 0 {
-		// Check reload configure config template
-		for _, validator := range validators {
-			if err := validator(componentDef); err != nil {
-				return nil, err
-			}
-		}
-	}
-	return append(configTemplates, componentDef.Spec.Configs...), nil
-}
-
-func checkConfigTemplate(client client.Client, ctx intctrlutil.RequestCtx, obj client.Object) (bool, error) {
-	handler := func(configSpecs []appsv1.ComponentConfigSpec) (bool, error) {
-		return validateConfigTemplate(client, ctx, configSpecs)
+	if !isReconcileStatus(itemStatus.Phase) {
+		ctx.Log.V(1).WithName(item.Name).Info(fmt.Sprintf("configuration cr is creating or deleting and pass: %v", itemStatus))
+		return nil
 	}
-	return handleConfigTemplate(obj, handler)
+	return itemStatus
 }
 
-func updateLabelsByConfigSpec[T generics.Object, PT generics.PObject[T]](cli client.Client, ctx intctrlutil.RequestCtx, obj PT) (bool, error) {
-	handler := func(configSpecs []appsv1.ComponentConfigSpec) (bool, error) {
-		patch := client.MergeFrom(PT(obj.DeepCopy()))
-		configuration.BuildConfigConstraintLabels(obj, configSpecs)
-		return true, cli.Patch(ctx.Ctx, obj, patch)
-	}
-	return handleConfigTemplate(obj, handler)
+func isReconcileStatus(phase parametersv1alpha1.ParameterPhase) bool {
+	return phase != "" &&
+		phase != parametersv1alpha1.CCreatingPhase &&
+		phase != parametersv1alpha1.CDeletingPhase
 }
 
-func validateConfigTemplate(cli client.Client, ctx intctrlutil.RequestCtx, configSpecs []appsv1.ComponentConfigSpec) (bool, error) {
-	// validate ConfigTemplate
-	foundAndCheckConfigSpec := func(configSpec appsv1.ComponentConfigSpec, logger logr.Logger) (*appsv1beta1.ConfigConstraint, error) {
-		if _, err := getConfigMapByTemplateName(cli, ctx, configSpec.TemplateRef, configSpec.Namespace); err != nil {
-			logger.Error(err, "failed to get config template cm object!")
-			return nil, err
-		}
-		if configSpec.VolumeName == "" && configuration.InjectEnvEnabled(configSpec) {
-			return nil, core.MakeError("config template volume name and envFrom is empty!")
-		}
-		if configSpec.ConfigConstraintRef == "" {
-			return nil, nil
-		}
-		configKey := client.ObjectKey{
-			Namespace: "",
-			Name:      configSpec.ConfigConstraintRef,
-		}
-		configObj := &appsv1beta1.ConfigConstraint{}
-		if err := cli.Get(ctx.Ctx, configKey, configObj); err != nil {
-			logger.Error(err, "failed to get template cm object!")
-			return nil, err
-		}
-		return configObj, nil
-	}
-
-	for _, templateRef := range configSpecs {
-		logger := ctx.Log.WithValues("templateName", templateRef.Name).WithValues("configMapName", templateRef.TemplateRef)
-		configConstraint, err := foundAndCheckConfigSpec(templateRef, logger)
+func buildTemplateVars(ctx context.Context, cli client.Reader,
+	compDef *appsv1.ComponentDefinition, synthesizedComp *component.SynthesizedComponent) error {
+	if compDef != nil && len(compDef.Spec.Vars) > 0 {
+		templateVars, _, err := component.ResolveTemplateNEnvVars(ctx, cli, synthesizedComp, compDef.Spec.Vars)
 		if err != nil {
-			logger.Error(err, "failed to validate config template!")
-			return false, err
-		}
-		if configConstraint == nil || configConstraint.Spec.ReloadAction == nil {
-			continue
-		}
-		if err := cfgcm.ValidateReloadOptions(configConstraint.Spec.ReloadAction, cli, ctx.Ctx); err != nil {
-			return false, err
-		}
-		if !validateConfigConstraintStatus(configConstraint.Status) {
-			errMsg := fmt.Sprintf("Configuration template CR[%s] status not ready! current status: %s", configConstraint.Name, configConstraint.Status.Phase)
-			logger.V(1).Info(errMsg)
-			return false, fmt.Errorf("%s", errMsg)
+			return err
 		}
+		synthesizedComp.TemplateVars = templateVars
 	}
-	return true, nil
-}
-
-func validateConfigConstraintStatus(ccStatus appsv1beta1.ConfigConstraintStatus) bool {
-	return ccStatus.Phase == appsv1beta1.CCAvailablePhase
-}
-
-func updateConfigConstraintStatus(cli client.Client, ctx intctrlutil.RequestCtx, configConstraint *appsv1beta1.ConfigConstraint, phase appsv1beta1.ConfigConstraintPhase) error {
-	patch := client.MergeFrom(configConstraint.DeepCopy())
-	configConstraint.Status.Phase = phase
-	configConstraint.Status.ObservedGeneration = configConstraint.Generation
-	return cli.Status().Patch(ctx.Ctx, configConstraint, patch)
-}
-
-func createConfigPatch(cfg *corev1.ConfigMap, formatter *appsv1beta1.FileFormatConfig, cmKeys []string) (*core.ConfigPatchInfo, bool, error) {
-	// support full update
-	if formatter == nil {
-		return nil, true, nil
-	}
-	lastConfig, err := getLastVersionConfig(cfg)
-	if err != nil {
-		return nil, false, core.WrapError(err, "failed to get last version data. config[%v]", client.ObjectKeyFromObject(cfg))
-	}
-
-	return core.CreateConfigPatch(lastConfig, cfg.Data, formatter.Format, cmKeys, true)
-}
-
-func updateConfigSchema(cc *appsv1beta1.ConfigConstraint, cli client.Client, ctx context.Context) error {
-	schema := cc.Spec.ParametersSchema
-	if schema == nil || schema.CUE == "" {
-		return nil
-	}
-
-	// Because the conversion of cue to openAPISchema is restricted, and the definition of some cue may not be converted into openAPISchema, and won't return error.
-	openAPISchema, err := openapi.GenerateOpenAPISchema(schema.CUE, schema.TopLevelKey)
-	if err != nil {
-		return err
-	}
-	if openAPISchema == nil {
-		return nil
-	}
-	if reflect.DeepEqual(openAPISchema, schema.SchemaInJSON) {
-		return nil
-	}
-
-	ccPatch := client.MergeFrom(cc.DeepCopy())
-	cc.Spec.ParametersSchema.SchemaInJSON = openAPISchema
-	return cli.Patch(ctx, cc, ccPatch)
+	return nil
 }
diff --git a/controllers/parameters/configconstraint_controller.go b/controllers/parameters/configconstraint_controller.go
deleted file mode 100644
index 817c61b5d..000000000
--- a/controllers/parameters/configconstraint_controller.go
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package parameters
-
-import (
-	"context"
-	"time"
-
-	corev1 "k8s.io/api/core/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	"k8s.io/client-go/tools/record"
-	ctrl "sigs.k8s.io/controller-runtime"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/log"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/constant"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-)
-
-// ConfigConstraintReconciler reconciles a ConfigConstraint object
-type ConfigConstraintReconciler struct {
-	client.Client
-	Scheme   *runtime.Scheme
-	Recorder record.EventRecorder
-}
-
-// +kubebuilder:rbac:groups=apps.kubeblocks.io,resources=configconstraints,verbs=get;list;watch;create;update;patch;delete
-// +kubebuilder:rbac:groups=apps.kubeblocks.io,resources=configconstraints/status,verbs=get;update;patch
-// +kubebuilder:rbac:groups=apps.kubeblocks.io,resources=configconstraints/finalizers,verbs=update
-
-// Reconcile is part of the main kubernetes reconciliation loop which aims to
-// move the current state of the cluster closer to the desired state.
-// TODO(user): Modify the Reconcile function to compare the state specified by
-// the ConfigConstraint object against the actual cluster state, and then
-// perform operations to make the cluster state reflect the state specified by
-// the user.
-//
-// For more details, check Reconcile and its Result here:
-// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.11.2/pkg/reconcile
-func (r *ConfigConstraintReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
-	reqCtx := intctrlutil.RequestCtx{
-		Ctx:      ctx,
-		Req:      req,
-		Log:      log.FromContext(ctx).WithName("ConfigConstraintReconcile").WithValues("ConfigConstraint", req.NamespacedName.Name),
-		Recorder: r.Recorder,
-	}
-
-	configConstraint := &appsv1beta1.ConfigConstraint{}
-	if err := r.Client.Get(reqCtx.Ctx, reqCtx.Req.NamespacedName, configConstraint); err != nil {
-		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
-	}
-
-	res, err := intctrlutil.HandleCRDeletion(reqCtx, r, configConstraint, constant.ConfigFinalizerName, func() (*ctrl.Result, error) {
-		recordEvent := func() {
-			r.Recorder.Event(configConstraint, corev1.EventTypeWarning, "ExistsReferencedResources",
-				"cannot be deleted because of existing referencing of ClusterDefinition.")
-		}
-		if configConstraint.Status.Phase != appsv1beta1.CCDeletingPhase {
-			err := updateConfigConstraintStatus(r.Client, reqCtx, configConstraint, appsv1beta1.CCDeletingPhase)
-			// if fail to update ConfigConstraint status, return error,
-			// so that it can be retried
-			if err != nil {
-				return nil, err
-			}
-		}
-		if res, err := intctrlutil.ValidateReferenceCR(reqCtx, r.Client, configConstraint,
-			cfgcore.GenerateConstraintsUniqLabelKeyWithConfig(configConstraint.GetName()),
-			recordEvent, &appsv1.ClusterDefinitionList{}, &appsv1.ComponentDefinitionList{}); res != nil || err != nil {
-			return res, err
-		}
-		return nil, nil
-	})
-	if res != nil {
-		return *res, err
-	}
-
-	if configConstraint.Status.ObservedGeneration == configConstraint.Generation && configConstraint.Status.ConfigConstraintTerminalPhases() {
-		return intctrlutil.Reconciled()
-	}
-
-	if ok, err := checkConfigConstraint(reqCtx, configConstraint); !ok || err != nil {
-		return intctrlutil.RequeueAfter(time.Second, reqCtx.Log, "ValidateConfigurationTemplate")
-	}
-
-	// Automatically convert cue to openAPISchema.
-	if err := updateConfigSchema(configConstraint, r.Client, ctx); err != nil {
-		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "failed to generate openAPISchema")
-	}
-
-	err = updateConfigConstraintStatus(r.Client, reqCtx, configConstraint, appsv1beta1.CCAvailablePhase)
-	if err != nil {
-		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
-	}
-	intctrlutil.RecordCreatedEvent(r.Recorder, configConstraint)
-	return ctrl.Result{}, nil
-}
-
-// SetupWithManager sets up the controller with the Manager.
-func (r *ConfigConstraintReconciler) SetupWithManager(mgr ctrl.Manager) error {
-	return intctrlutil.NewControllerManagedBy(mgr).
-		For(&appsv1beta1.ConfigConstraint{}).
-		// for other resource
-		Owns(&corev1.ConfigMap{}). // TODO(leon)
-		Complete(r)
-}
diff --git a/controllers/parameters/configuration_controller.go b/controllers/parameters/configuration_controller.go
deleted file mode 100644
index fb94b1780..000000000
--- a/controllers/parameters/configuration_controller.go
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package parameters
-
-import (
-	"context"
-	"fmt"
-	"math"
-	"strconv"
-	"time"
-
-	corev1 "k8s.io/api/core/v1"
-	"k8s.io/apimachinery/pkg/runtime"
-	utilerrors "k8s.io/apimachinery/pkg/util/errors"
-	"k8s.io/client-go/tools/record"
-	ctrl "sigs.k8s.io/controller-runtime"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/controller"
-	"sigs.k8s.io/controller-runtime/pkg/log"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	"github.com/apecloud/kubeblocks/pkg/constant"
-	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	"github.com/apecloud/kubeblocks/pkg/controller/multicluster"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-	viper "github.com/apecloud/kubeblocks/pkg/viperx"
-)
-
-// ConfigurationReconciler reconciles a Configuration object
-type ConfigurationReconciler struct {
-	client.Client
-	Scheme   *runtime.Scheme
-	Recorder record.EventRecorder
-}
-
-const reconcileInterval = time.Second * 2
-
-// +kubebuilder:rbac:groups=apps.kubeblocks.io,resources=configurations,verbs=get;list;watch;create;update;patch;delete
-// +kubebuilder:rbac:groups=apps.kubeblocks.io,resources=configurations/status,verbs=get;update;patch
-// +kubebuilder:rbac:groups=apps.kubeblocks.io,resources=configurations/finalizers,verbs=update
-
-// Reconcile is part of the main kubernetes reconciliation loop which aims to
-// move the current state of the cluster closer to the desired state.
-// TODO(user): Modify the Reconcile function to compare the state specified by
-// the Configuration object against the actual cluster state, and then
-// perform operations to make the cluster state reflect the state specified by
-// the user.
-//
-// For more details, check Reconcile and its Result here:
-// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.14.4/pkg/reconcile
-func (r *ConfigurationReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
-	reqCtx := intctrlutil.RequestCtx{
-		Ctx:      ctx,
-		Req:      req,
-		Log:      log.FromContext(ctx).WithName("ConfigurationReconcile").WithValues("configuration", req.NamespacedName),
-		Recorder: r.Recorder,
-	}
-
-	config := &appsv1alpha1.Configuration{}
-	if err := r.Client.Get(reqCtx.Ctx, reqCtx.Req.NamespacedName, config); err != nil {
-		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "cannot find configuration")
-	}
-
-	res, err := intctrlutil.HandleCRDeletion(reqCtx, r, config, constant.ConfigFinalizerName, nil)
-	if res != nil {
-		return *res, err
-	}
-
-	tasks := make([]Task, 0, len(config.Spec.ConfigItemDetails))
-	for _, item := range config.Spec.ConfigItemDetails {
-		if status := fromItemStatus(reqCtx, &config.Status, item); status != nil {
-			tasks = append(tasks, NewTask(item, status))
-		}
-	}
-	if len(tasks) == 0 {
-		return intctrlutil.Reconciled()
-	}
-
-	fetcherTask := &Task{}
-	err = fetcherTask.Init(&render.ResourceCtx{
-		Context:       ctx,
-		Client:        r.Client,
-		Namespace:     config.Namespace,
-		ClusterName:   config.Spec.ClusterRef,
-		ComponentName: config.Spec.ComponentName,
-	}, fetcherTask).Cluster().
-		ComponentAndComponentDef().
-		ComponentSpec().
-		Complete()
-	if err != nil {
-		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "failed to get related object.")
-	}
-
-	if !fetcherTask.ClusterObj.GetDeletionTimestamp().IsZero() {
-		reqCtx.Log.Info("cluster is deleting, skip reconcile")
-		return intctrlutil.Reconciled()
-	}
-	if fetcherTask.ClusterComObj == nil || fetcherTask.ComponentObj == nil {
-		return r.failWithInvalidComponent(config, reqCtx)
-	}
-	if err := r.runTasks(TaskContext{config, ctx, fetcherTask}, tasks); err != nil {
-		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "failed to run configuration reconcile task.")
-	}
-	if !isAllReady(config) {
-		return intctrlutil.RequeueAfter(reconcileInterval, reqCtx.Log, "")
-	}
-	return intctrlutil.Reconciled()
-}
-
-func (r *ConfigurationReconciler) failWithInvalidComponent(configuration *appsv1alpha1.Configuration, reqCtx intctrlutil.RequestCtx) (ctrl.Result, error) {
-	msg := fmt.Sprintf("not found cluster component or cluster definition component: [%s]", configuration.Spec.ComponentName)
-	reqCtx.Log.Error(fmt.Errorf("%s", msg), "")
-	patch := client.MergeFrom(configuration.DeepCopy())
-	configuration.Status.Message = msg
-	if err := r.Client.Status().Patch(reqCtx.Ctx, configuration, patch); err != nil {
-		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "failed to update configuration status.")
-	}
-	return intctrlutil.Reconciled()
-}
-
-func isAllReady(configuration *appsv1alpha1.Configuration) bool {
-	for _, item := range configuration.Spec.ConfigItemDetails {
-		itemStatus := configuration.Status.GetItemStatus(item.Name)
-		if itemStatus != nil && !isFinishStatus(itemStatus.Phase) {
-			return false
-		}
-	}
-	return true
-}
-
-func (r *ConfigurationReconciler) runTasks(taskCtx TaskContext, tasks []Task) (err error) {
-	var (
-		errs            []error
-		synthesizedComp *component.SynthesizedComponent
-		configuration   = taskCtx.configuration
-	)
-
-	// build synthesized component for the component
-	synthesizedComp, err = component.BuildSynthesizedComponent(taskCtx.ctx, r.Client,
-		taskCtx.fetcher.ComponentDefObj, taskCtx.fetcher.ComponentObj)
-	if err == nil {
-		err = buildTemplateVars(taskCtx.ctx, r.Client, taskCtx.fetcher.ComponentDefObj, synthesizedComp)
-	}
-	if err != nil {
-		return err
-	}
-
-	// TODO manager multiple version
-	patch := client.MergeFrom(configuration.DeepCopy())
-	revision := strconv.FormatInt(configuration.GetGeneration(), 10)
-	for _, task := range tasks {
-		if err := task.Do(taskCtx.fetcher, synthesizedComp, revision); err != nil {
-			errs = append(errs, err)
-			continue
-		}
-	}
-
-	configuration.Status.Message = ""
-	if len(errs) > 0 {
-		configuration.Status.Message = utilerrors.NewAggregate(errs).Error()
-	}
-	if err := r.Client.Status().Patch(taskCtx.ctx, configuration, patch); err != nil {
-		errs = append(errs, err)
-	}
-	if len(errs) == 0 {
-		return nil
-	}
-	return utilerrors.NewAggregate(errs)
-}
-
-// SetupWithManager sets up the controller with the Manager.
-func (r *ConfigurationReconciler) SetupWithManager(mgr ctrl.Manager, multiClusterMgr multicluster.Manager) error {
-	b := intctrlutil.NewControllerManagedBy(mgr).
-		For(&appsv1alpha1.Configuration{}).
-		WithOptions(controller.Options{
-			MaxConcurrentReconciles: int(math.Ceil(viper.GetFloat64(constant.CfgKBReconcileWorkers) / 2)),
-		}).
-		Owns(&corev1.ConfigMap{})
-
-	if multiClusterMgr != nil {
-		multiClusterMgr.Own(b, &corev1.ConfigMap{}, &appsv1alpha1.Configuration{})
-	}
-
-	return b.Complete(r)
-}
-
-func fromItemStatus(ctx intctrlutil.RequestCtx, status *appsv1alpha1.ConfigurationStatus, item appsv1alpha1.ConfigurationItemDetail) *appsv1alpha1.ConfigurationItemDetailStatus {
-	if item.ConfigSpec == nil {
-		ctx.Log.V(1).WithName(item.Name).Info(fmt.Sprintf("configuration is creating and pass: %s", item.Name))
-		return nil
-	}
-	itemStatus := status.GetItemStatus(item.Name)
-	if itemStatus == nil || itemStatus.Phase == "" {
-		ctx.Log.V(1).WithName(item.Name).Info(fmt.Sprintf("configuration cr is creating and pass: %v", item))
-		return nil
-	}
-	if !isReconcileStatus(itemStatus.Phase) {
-		ctx.Log.V(1).WithName(item.Name).Info(fmt.Sprintf("configuration cr is creating or deleting and pass: %v", itemStatus))
-		return nil
-	}
-	return itemStatus
-}
-
-func isReconcileStatus(phase appsv1alpha1.ConfigurationPhase) bool {
-	return phase != "" &&
-		phase != appsv1alpha1.CCreatingPhase &&
-		phase != appsv1alpha1.CDeletingPhase
-}
-
-func isFinishStatus(phase appsv1alpha1.ConfigurationPhase) bool {
-	return phase == appsv1alpha1.CFinishedPhase || phase == appsv1alpha1.CFailedAndPausePhase
-}
-
-func buildTemplateVars(ctx context.Context, cli client.Reader,
-	compDef *appsv1.ComponentDefinition, synthesizedComp *component.SynthesizedComponent) error {
-	if compDef != nil && len(compDef.Spec.Vars) > 0 {
-		templateVars, _, err := component.ResolveTemplateNEnvVars(ctx, cli, synthesizedComp, compDef.Spec.Vars)
-		if err != nil {
-			return err
-		}
-		synthesizedComp.TemplateVars = templateVars
-	}
-	return nil
-}
diff --git a/controllers/parameters/parallel_upgrade_policy.go b/controllers/parameters/parallel_upgrade_policy.go
index 8face6543..f7049199d 100644
--- a/controllers/parameters/parallel_upgrade_policy.go
+++ b/controllers/parameters/parallel_upgrade_policy.go
@@ -22,43 +22,44 @@ package parameters
 import (
 	corev1 "k8s.io/api/core/v1"
 
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	podutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
 
-type parallelUpgradePolicy struct {
-}
+var restartContainerPolicyInstance = &restartContainerUpgradePolicy{}
+
+type restartContainerUpgradePolicy struct{}
 
 func init() {
-	RegisterPolicy(appsv1alpha1.RestartPolicy, &parallelUpgradePolicy{})
+	registerPolicy(parametersv1alpha1.RestartContainerPolicy, restartContainerPolicyInstance)
 }
 
-func (p *parallelUpgradePolicy) Upgrade(params reconfigureParams) (ReturnedStatus, error) {
+func (p *restartContainerUpgradePolicy) Upgrade(rctx reconfigureContext) (ReturnedStatus, error) {
 	funcs := GetInstanceSetRollingUpgradeFuncs()
-	pods, err := funcs.GetPodsFunc(params)
+	pods, err := funcs.GetPodsFunc(rctx)
 	if err != nil {
 		return makeReturnedStatus(ESFailedAndRetry), err
 	}
 
-	return p.restartPods(params, pods, funcs)
+	return p.restartPods(rctx, pods, funcs)
 }
 
-func (p *parallelUpgradePolicy) GetPolicyName() string {
-	return string(appsv1alpha1.RestartPolicy)
+func (p *restartContainerUpgradePolicy) GetPolicyName() string {
+	return string(parametersv1alpha1.RestartContainerPolicy)
 }
 
-func (p *parallelUpgradePolicy) restartPods(params reconfigureParams, pods []corev1.Pod, funcs RollingUpgradeFuncs) (ReturnedStatus, error) {
-	var configKey = params.getConfigKey()
-	var configVersion = params.getTargetVersionHash()
+func (p *restartContainerUpgradePolicy) restartPods(rctx reconfigureContext, pods []corev1.Pod, funcs RollingUpgradeFuncs) (ReturnedStatus, error) {
+	var configKey = rctx.getConfigKey()
+	var configVersion = rctx.getTargetVersionHash()
 
 	for _, pod := range pods {
 		if podutil.IsMatchConfigVersion(&pod, configKey, configVersion) {
 			continue
 		}
-		if err := funcs.RestartContainerFunc(&pod, params.Ctx.Ctx, params.ContainerNames, params.ReconfigureClientFactory); err != nil {
+		if err := funcs.RestartContainerFunc(&pod, rctx.Ctx, rctx.ContainerNames, rctx.ReconfigureClientFactory); err != nil {
 			return makeReturnedStatus(ESFailedAndRetry), err
 		}
-		if err := updatePodLabelsWithConfigVersion(&pod, configKey, configVersion, params.Client, params.Ctx.Ctx); err != nil {
+		if err := updatePodLabelsWithConfigVersion(&pod, configKey, configVersion, rctx.Client, rctx.Ctx); err != nil {
 			return makeReturnedStatus(ESFailedAndRetry), err
 		}
 	}
diff --git a/controllers/parameters/paramconfigrenderer_controller.go b/controllers/parameters/paramconfigrenderer_controller.go
index a4bf1a5d9..f874ff125 100644
--- a/controllers/parameters/paramconfigrenderer_controller.go
+++ b/controllers/parameters/paramconfigrenderer_controller.go
@@ -23,6 +23,7 @@ import (
 	"context"
 	"fmt"
 
+	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 	"k8s.io/client-go/tools/record"
 	ctrl "sigs.k8s.io/controller-runtime"
@@ -32,6 +33,7 @@ import (
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/constant"
+	configctrl "github.com/apecloud/kubeblocks/pkg/controller/configuration"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 	"github.com/apecloud/kubeblocks/pkg/generics"
 )
@@ -85,14 +87,19 @@ func (r *ParameterDrivenConfigRenderReconciler) reconcile(reqCtx intctrlutil.Req
 	if intctrlutil.ParametersDrivenConfigRenderTerminalPhases(parameterTemplate.Status, parameterTemplate.Generation) {
 		return intctrlutil.Reconciled()
 	}
-
-	if err := r.validate(reqCtx, r.Client, &parameterTemplate.Spec); err != nil {
-		if uErr := r.unavailable(reqCtx.Ctx, r.Client, parameterTemplate, err); uErr != nil {
-			return intctrlutil.CheckedRequeueWithError(uErr, reqCtx.Log, "")
+	cmpd := &appsv1.ComponentDefinition{}
+	if err := r.Get(reqCtx.Ctx, client.ObjectKey{Name: parameterTemplate.Spec.ComponentDef}, cmpd); err != nil {
+		return intctrlutil.RequeueWithError(err, reqCtx.Log, "")
+	}
+	if err := fillParameterTemplate(reqCtx, r.Client, parameterTemplate, cmpd); err != nil {
+		return intctrlutil.RequeueWithError(err, reqCtx.Log, "")
+	}
+	if err := r.validate(reqCtx, r.Client, &parameterTemplate.Spec, cmpd); err != nil {
+		if err2 := r.unavailable(reqCtx.Ctx, r.Client, parameterTemplate, err); err2 != nil {
+			return intctrlutil.RequeueWithError(err2, reqCtx.Log, "")
 		}
-		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+		return intctrlutil.RequeueWithError(err, reqCtx.Log, "")
 	}
-
 	if err := r.available(reqCtx.Ctx, r.Client, parameterTemplate); err != nil {
 		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
 	}
@@ -101,20 +108,65 @@ func (r *ParameterDrivenConfigRenderReconciler) reconcile(reqCtx intctrlutil.Req
 	return intctrlutil.Reconciled()
 }
 
-func (r *ParameterDrivenConfigRenderReconciler) validate(ctx intctrlutil.RequestCtx, cli client.Client, parameterTemplate *parametersv1alpha1.ParamConfigRendererSpec) error {
-	cmpd := &appsv1.ComponentDefinition{}
-	if err := cli.Get(ctx.Ctx, client.ObjectKey{Name: parameterTemplate.ComponentDef}, cmpd); err != nil {
-		return err
-	}
+func (r *ParameterDrivenConfigRenderReconciler) validate(ctx intctrlutil.RequestCtx, cli client.Client, parameterTemplate *parametersv1alpha1.ParamConfigRendererSpec, cmpd *appsv1.ComponentDefinition) error {
 	if err := validateParametersDefs(ctx, cli, parameterTemplate.ParametersDefs); err != nil {
 		return err
 	}
-	if err := validateParametersConfigs(parameterTemplate.Configs, intctrlutil.TransformConfigTemplate(cmpd.Spec.Configs)); err != nil {
+	if err := validateParametersConfigs(parameterTemplate.Configs, cmpd.Spec.Configs); err != nil {
 		return err
 	}
 	return nil
 }
 
+func (r *ParameterDrivenConfigRenderReconciler) available(ctx context.Context, cli client.Client, parameterTemplate *parametersv1alpha1.ParamConfigRenderer) error {
+	return r.status(ctx, cli, parameterTemplate, parametersv1alpha1.PDAvailablePhase, nil)
+}
+
+func (r *ParameterDrivenConfigRenderReconciler) unavailable(ctx context.Context, cli client.Client, parameterTemplate *parametersv1alpha1.ParamConfigRenderer, err error) error {
+	return r.status(ctx, cli, parameterTemplate, parametersv1alpha1.PDUnavailablePhase, err)
+}
+
+func (r *ParameterDrivenConfigRenderReconciler) status(ctx context.Context, cli client.Client, parameterRender *parametersv1alpha1.ParamConfigRenderer, phase parametersv1alpha1.ParametersDescPhase, err error) error {
+	patch := client.MergeFrom(parameterRender.DeepCopy())
+	parameterRender.Status.ObservedGeneration = parameterRender.Generation
+	parameterRender.Status.Phase = phase
+	parameterRender.Status.Message = ""
+	if err != nil {
+		parameterRender.Status.Message = err.Error()
+	}
+	return cli.Status().Patch(ctx, parameterRender, patch)
+}
+
+func fillParameterTemplate(reqCtx intctrlutil.RequestCtx, cli client.Client, template *parametersv1alpha1.ParamConfigRenderer, cmpd *appsv1.ComponentDefinition) (err error) {
+	var tpls map[string]*corev1.ConfigMap
+
+	match := func(spec parametersv1alpha1.ComponentConfigDescription) bool {
+		return spec.TemplateName == ""
+	}
+	resolveConfigTemplate := func(config string) string {
+		for name, configTemplate := range tpls {
+			if _, ok := configTemplate.Data[config]; ok {
+				return name
+			}
+		}
+		return ""
+	}
+
+	if generics.CountFunc(template.Spec.Configs, match) == 0 {
+		return nil
+	}
+	if tpls, err = configctrl.ResolveComponentTemplate(reqCtx.Ctx, cli, cmpd); err != nil {
+		return err
+	}
+	deepCopy := template.DeepCopy()
+	for i, config := range deepCopy.Spec.Configs {
+		if tplName := resolveConfigTemplate(config.Name); tplName != "" {
+			deepCopy.Spec.Configs[i].TemplateName = tplName
+		}
+	}
+	return cli.Patch(reqCtx.Ctx, deepCopy, client.MergeFrom(template))
+}
+
 func validateParametersConfigs(configs []parametersv1alpha1.ComponentConfigDescription, templates []appsv1.ComponentTemplateSpec) error {
 	for _, config := range configs {
 		match := func(spec appsv1.ComponentTemplateSpec) bool {
@@ -140,22 +192,3 @@ func validateParametersDefs(reqCtx intctrlutil.RequestCtx, cli client.Client, pa
 	}
 	return nil
 }
-
-func (r *ParameterDrivenConfigRenderReconciler) available(ctx context.Context, cli client.Client, parameterTemplate *parametersv1alpha1.ParamConfigRenderer) error {
-	return r.status(ctx, cli, parameterTemplate, parametersv1alpha1.PDAvailablePhase, nil)
-}
-
-func (r *ParameterDrivenConfigRenderReconciler) unavailable(ctx context.Context, cli client.Client, parameterTemplate *parametersv1alpha1.ParamConfigRenderer, err error) error {
-	return r.status(ctx, cli, parameterTemplate, parametersv1alpha1.PDUnavailablePhase, err)
-}
-
-func (r *ParameterDrivenConfigRenderReconciler) status(ctx context.Context, cli client.Client, parameterRender *parametersv1alpha1.ParamConfigRenderer, phase parametersv1alpha1.ParametersDescPhase, err error) error {
-	patch := client.MergeFrom(parameterRender.DeepCopy())
-	parameterRender.Status.ObservedGeneration = parameterRender.Generation
-	parameterRender.Status.Phase = phase
-	parameterRender.Status.Message = ""
-	if err != nil {
-		parameterRender.Status.Message = err.Error()
-	}
-	return cli.Status().Patch(ctx, parameterRender, patch)
-}
diff --git a/controllers/parameters/parameter_controller.go b/controllers/parameters/parameter_controller.go
new file mode 100644
index 000000000..c889aba26
--- /dev/null
+++ b/controllers/parameters/parameter_controller.go
@@ -0,0 +1,224 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package parameters
+
+import (
+	"context"
+
+	corev1 "k8s.io/api/core/v1"
+	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/client-go/tools/record"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/log"
+
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	"github.com/apecloud/kubeblocks/pkg/constant"
+	"github.com/apecloud/kubeblocks/pkg/controller/render"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+)
+
+// ParameterReconciler reconciles a Parameter object
+type ParameterReconciler struct {
+	client.Client
+	Scheme   *runtime.Scheme
+	Recorder record.EventRecorder
+}
+
+// +kubebuilder:rbac:groups=parameters.kubeblocks.io,resources=parameters,verbs=get;list;watch;create;update;patch;delete
+// +kubebuilder:rbac:groups=parameters.kubeblocks.io,resources=parameters/status,verbs=get;update;patch
+// +kubebuilder:rbac:groups=parameters.kubeblocks.io,resources=parameters/finalizers,verbs=update
+
+// Reconcile is part of the main kubernetes reconciliation loop which aims to
+// move the current state of the cluster closer to the desired state.
+//
+// For more details, check Reconcile and its Result here:
+// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.14.4/pkg/reconcile
+func (r *ParameterReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
+	reqCtx := intctrlutil.RequestCtx{
+		Ctx:      ctx,
+		Req:      req,
+		Recorder: r.Recorder,
+		Log: log.FromContext(ctx).
+			WithName("ParameterReconciler").
+			WithValues("Namespace", req.Namespace, "Parameter", req.Name),
+	}
+
+	parameter := &parametersv1alpha1.Parameter{}
+	if err := r.Client.Get(reqCtx.Ctx, reqCtx.Req.NamespacedName, parameter); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+	}
+
+	res, err := intctrlutil.HandleCRDeletion(reqCtx, r, parameter, constant.ConfigFinalizerName, nil)
+	if res != nil {
+		return *res, err
+	}
+	return r.reconcile(reqCtx, parameter)
+}
+
+// SetupWithManager sets up the controller with the Manager.
+func (r *ParameterReconciler) SetupWithManager(mgr ctrl.Manager) error {
+	return ctrl.NewControllerManagedBy(mgr).
+		For(&parametersv1alpha1.Parameter{}).
+		Complete(r)
+}
+
+func (r *ParameterReconciler) handleComponent(rctx *ReconcileContext, updatedParameters parametersv1alpha1.ComponentParameters, parameter *parametersv1alpha1.Parameter) error {
+	configmaps, err := resolveComponentRefConfigMap(rctx)
+	if err != nil {
+		return err
+	}
+
+	handles := []reconfigureReconcileHandle{
+		prepareResources,
+		syncComponentParameterStatus,
+		classifyParameters(updatedParameters, configmaps),
+		updateCustomTemplates,
+		updateParameters,
+		updateComponentParameterStatus(configmaps),
+	}
+
+	for _, handle := range handles {
+		if err := handle(rctx, parameter); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func (r *ParameterReconciler) reconcile(reqCtx intctrlutil.RequestCtx, parameter *parametersv1alpha1.Parameter) (ctrl.Result, error) {
+	if intctrlutil.ParametersTerminalPhases(parameter.Status, parameter.Generation) {
+		return intctrlutil.Reconciled()
+	}
+
+	if err := r.validate(parameter, reqCtx.Ctx); err != nil {
+		return r.fail(reqCtx, parameter, err)
+	}
+	patch := parameter.DeepCopy()
+	rctxs, params := r.generateParameterTaskContext(reqCtx, parameter)
+	for i, rctx := range rctxs {
+		if err := r.handleComponent(rctx, params[i], parameter); err != nil {
+			return r.fail(reqCtx, parameter, err)
+		}
+	}
+	finished := syncParameterStatus(&parameter.Status)
+	return updateParameterStatus(reqCtx, r.Client, parameter, patch, finished)
+}
+
+func (r *ParameterReconciler) generateParameterTaskContext(reqCtx intctrlutil.RequestCtx, parameter *parametersv1alpha1.Parameter) ([]*ReconcileContext, []parametersv1alpha1.ComponentParameters) {
+	var rctxs []*ReconcileContext
+	var params []parametersv1alpha1.ComponentParameters
+	for _, component := range parameter.Spec.ComponentParameters {
+		params = append(params, component.Parameters)
+		rctxs = append(rctxs, newParameterReconcileContext(reqCtx,
+			&render.ResourceCtx{
+				Context:       reqCtx.Ctx,
+				Client:        r.Client,
+				Namespace:     parameter.Namespace,
+				ClusterName:   parameter.Spec.ClusterName,
+				ComponentName: component.ComponentName,
+			}, nil, "", nil))
+	}
+	return rctxs, params
+}
+
+func (r *ParameterReconciler) validate(parameter *parametersv1alpha1.Parameter, ctx context.Context) error {
+	if len(parameter.Spec.ComponentParameters) == 0 {
+		return intctrlutil.NewFatalError("required component parameters")
+	}
+
+	for _, component := range parameter.Spec.ComponentParameters {
+		if len(component.Parameters) == 0 && len(component.CustomTemplates) == 0 {
+			return intctrlutil.NewErrorf(intctrlutil.ErrorTypeFatal, "required parameters or custom templates for component[%s]", component.ComponentName)
+		}
+		if err := validateCustomTemplate(ctx, r.Client, component.CustomTemplates); err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func (r *ParameterReconciler) failWithTerminalReconcile(reqCtx intctrlutil.RequestCtx, parameter *parametersv1alpha1.Parameter, err error) (ctrl.Result, error) {
+	patch := parameter.DeepCopy()
+	parameter.Status.Phase = parametersv1alpha1.CMergeFailedPhase
+	parameter.Status.Message = err.Error()
+	return updateParameterStatus(reqCtx, r.Client, parameter, patch, true)
+}
+
+func (r *ParameterReconciler) fail(reqCtx intctrlutil.RequestCtx, parameter *parametersv1alpha1.Parameter, err error) (ctrl.Result, error) {
+	if intctrlutil.IsTargetError(err, intctrlutil.ErrorTypeFatal) {
+		return r.failWithTerminalReconcile(reqCtx, parameter, err)
+	}
+	return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+}
+
+func validateCustomTemplate(ctx context.Context, cli client.Client, templates map[string]parametersv1alpha1.ConfigTemplateExtension) error {
+	for configSpec, custom := range templates {
+		cm := &corev1.ConfigMap{}
+		err := cli.Get(ctx, types.NamespacedName{Name: custom.TemplateRef, Namespace: custom.Namespace}, cm)
+		if err != nil {
+			if apierrors.IsNotFound(err) {
+				return intctrlutil.NewErrorf(intctrlutil.ErrorTypeFatal, "not found configmap[%s] for custom template: %s", custom.TemplateRef, configSpec)
+			}
+			return err
+		}
+	}
+	return nil
+}
+
+func updateParameterStatus(reqCtx intctrlutil.RequestCtx, cli client.Client, parameter *parametersv1alpha1.Parameter, patch *parametersv1alpha1.Parameter, finished bool) (ctrl.Result, error) {
+	parameter.Status.ObservedGeneration = parameter.Generation
+	if err := cli.Status().Patch(reqCtx.Ctx, parameter, client.MergeFrom(patch)); err != nil {
+		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "")
+	}
+	if finished {
+		return intctrlutil.Reconciled()
+	}
+	return intctrlutil.RequeueAfter(ConfigReconcileInterval, reqCtx.Log, "")
+}
+
+func syncParameterStatus(parameterStatus *parametersv1alpha1.ParameterStatus) bool {
+	var finished = true
+
+	defer func() {
+		if finished && !intctrlutil.IsFailedPhase(parameterStatus.Phase) {
+			parameterStatus.Phase = parametersv1alpha1.CFinishedPhase
+		}
+	}()
+
+	for _, status := range parameterStatus.ReconfiguringStatus {
+		switch status.Phase {
+		case parametersv1alpha1.CMergeFailedPhase:
+			parameterStatus.Phase = parametersv1alpha1.CMergeFailedPhase
+			return true
+		case parametersv1alpha1.CFailedAndPausePhase:
+			parameterStatus.Phase = parametersv1alpha1.CFailedAndPausePhase
+			return true
+		case parametersv1alpha1.CFinishedPhase:
+			continue
+		default:
+			parameterStatus.Phase = parametersv1alpha1.CRunningPhase
+			finished = false
+		}
+	}
+	return finished
+}
diff --git a/controllers/parameters/parameter_util.go b/controllers/parameters/parameter_util.go
new file mode 100644
index 000000000..b48fd0bd9
--- /dev/null
+++ b/controllers/parameters/parameter_util.go
@@ -0,0 +1,259 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package parameters
+
+import (
+	"fmt"
+	"reflect"
+
+	"github.com/imdario/mergo"
+	corev1 "k8s.io/api/core/v1"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	"github.com/apecloud/kubeblocks/pkg/constant"
+	configctrl "github.com/apecloud/kubeblocks/pkg/controller/configuration"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+)
+
+type reconfigureReconcileHandle func(*ReconcileContext, *parametersv1alpha1.Parameter) error
+
+func updateComponentParameterStatus(configmaps map[string]*corev1.ConfigMap) func(rctx *ReconcileContext, parameter *parametersv1alpha1.Parameter) error {
+	return func(rctx *ReconcileContext, parameter *parametersv1alpha1.Parameter) error {
+		status := safeResolveComponentStatus(&parameter.Status, rctx.ComponentName)
+		if !intctrlutil.IsParameterFinished(status.Phase) {
+			syncReconfiguringPhase(rctx, status, configmaps)
+		}
+		return nil
+	}
+}
+
+func syncReconfiguringPhase(rctx *ReconcileContext, status *parametersv1alpha1.ComponentReconfiguringStatus, configmaps map[string]*corev1.ConfigMap) {
+	var finished = true
+
+	updateStatus := func() {
+		if finished {
+			status.Phase = parametersv1alpha1.CFinishedPhase
+		} else {
+			status.Phase = parametersv1alpha1.CRunningPhase
+		}
+	}
+
+	for _, parameterStatus := range status.ParameterStatus {
+		if parameterStatus.Phase == parametersv1alpha1.CMergeFailedPhase {
+			status.Phase = parametersv1alpha1.CMergeFailedPhase
+			return
+		}
+		cm := configmaps[parameterStatus.Name]
+		compSpec := intctrlutil.GetConfigTemplateItem(&rctx.ComponentParameterObj.Spec, parameterStatus.Name)
+		compStatus := intctrlutil.GetItemStatus(&rctx.ComponentParameterObj.Status, parameterStatus.Name)
+		if compStatus == nil || compSpec == nil || cm == nil {
+			rctx.Log.Info("component status or spec not found", "component", parameterStatus.Name, "template", parameterStatus.Name)
+			continue
+		}
+		parameterStatus.Phase = intctrlutil.GetConfigSpecReconcilePhase(cm, *compSpec, compStatus)
+		if finished {
+			finished = intctrlutil.IsParameterFinished(parameterStatus.Phase)
+		}
+		if parameterStatus.Phase == parametersv1alpha1.CFailedAndPausePhase {
+			status.Phase = parametersv1alpha1.CFailedAndPausePhase
+			return
+		}
+	}
+
+	updateStatus()
+}
+
+func mergeWithOverride(dst, src interface{}) error {
+	return mergo.Merge(dst, src, mergo.WithOverride)
+}
+
+func updateParameters(rctx *ReconcileContext, parameter *parametersv1alpha1.Parameter) error {
+	var updated bool
+
+	compStatus := intctrlutil.GetParameterStatus(&parameter.Status, rctx.ComponentName)
+	if compStatus == nil || intctrlutil.IsParameterFinished(compStatus.Phase) {
+		return nil
+	}
+
+	patch := rctx.ComponentParameterObj.DeepCopy()
+	var item *parametersv1alpha1.ConfigTemplateItemDetail
+	for _, status := range compStatus.ParameterStatus {
+		if item = intctrlutil.GetConfigTemplateItem(&rctx.ComponentParameterObj.Spec, status.Name); item == nil {
+			status.Phase = parametersv1alpha1.CMergeFailedPhase
+			continue
+		}
+		if err := mergeWithOverride(&item.ConfigFileParams, status.UpdatedParameters); err != nil {
+			status.Phase = parametersv1alpha1.CMergeFailedPhase
+			return err
+		}
+		if status.CustomTemplate != nil {
+			item.CustomTemplates = status.CustomTemplate
+		}
+		updated = true
+		status.Phase = parametersv1alpha1.CMergedPhase
+	}
+
+	if updated && !reflect.DeepEqual(patch, rctx.ComponentParameterObj) {
+		return rctx.Client.Patch(rctx.Ctx, rctx.ComponentParameterObj, client.MergeFrom(patch))
+	}
+	return nil
+}
+
+func updateCustomTemplates(rctx *ReconcileContext, parameter *parametersv1alpha1.Parameter) error {
+	component := intctrlutil.GetParameter(&parameter.Spec, rctx.ComponentName)
+	if component == nil || len(component.CustomTemplates) == 0 {
+		return nil
+	}
+
+	for tpl, componentParameter := range component.CustomTemplates {
+		status := safeResolveComponentParameterStatus(&parameter.Status, component.ComponentName, tpl)
+		status.CustomTemplate = componentParameter.DeepCopy()
+	}
+	return nil
+}
+
+func classifyParameters(updatedParameters parametersv1alpha1.ComponentParameters, configmaps map[string]*corev1.ConfigMap) func(*ReconcileContext, *parametersv1alpha1.Parameter) error {
+	return func(rctx *ReconcileContext, parameter *parametersv1alpha1.Parameter) error {
+		classParameters := configctrl.ClassifyComponentParameters(updatedParameters,
+			flatten(rctx.ParametersDefs),
+			rctx.ComponentDefObj.Spec.Configs,
+			configmaps,
+		)
+		for tpl, m := range classParameters {
+			configDescs := intctrlutil.GetComponentConfigDescriptions(&rctx.ConfigRender.Spec, tpl)
+			if len(configDescs) == 0 {
+				return fmt.Errorf("not found config description from pdcr: %s", tpl)
+			}
+			if err := validateComponentParameter(toArray(rctx.ParametersDefs), configDescs, m); err != nil {
+				return intctrlutil.NewFatalError(err.Error())
+			}
+			safeUpdateComponentParameterStatus(&parameter.Status, rctx.ComponentName, tpl, m)
+		}
+		return nil
+	}
+}
+
+func validateComponentParameter(parametersDefs []*parametersv1alpha1.ParametersDefinition, descs []parametersv1alpha1.ComponentConfigDescription, parameters map[string]*parametersv1alpha1.ParametersInFile) error {
+	if len(parametersDefs) == 0 || len(descs) == 0 {
+		return nil
+	}
+	_, err := configctrl.DoMerge(resolveBaseData(parameters), configctrl.DerefMapValues(parameters), parametersDefs, descs)
+	return err
+}
+
+func resolveBaseData(updatedParameters map[string]*parametersv1alpha1.ParametersInFile) map[string]string {
+	baseData := make(map[string]string)
+	for key := range updatedParameters {
+		baseData[key] = ""
+	}
+	return baseData
+}
+
+func toArray(paramsDefs map[string]*parametersv1alpha1.ParametersDefinition) []*parametersv1alpha1.ParametersDefinition {
+	var defs []*parametersv1alpha1.ParametersDefinition
+	for _, def := range paramsDefs {
+		defs = append(defs, def)
+	}
+	return defs
+}
+
+func safeResolveComponentStatus(status *parametersv1alpha1.ParameterStatus, componentName string) *parametersv1alpha1.ComponentReconfiguringStatus {
+	compStatus := intctrlutil.GetParameterStatus(status, componentName)
+	if compStatus != nil {
+		return compStatus
+	}
+
+	status.ReconfiguringStatus = append(status.ReconfiguringStatus,
+		parametersv1alpha1.ComponentReconfiguringStatus{
+			ComponentName: componentName,
+			Phase:         parametersv1alpha1.CInitPhase,
+		})
+	return intctrlutil.GetParameterStatus(status, componentName)
+}
+
+func safeResolveComponentParameterStatus(status *parametersv1alpha1.ParameterStatus, componentName string, tpl string) *parametersv1alpha1.ReconfiguringStatus {
+	compStatus := safeResolveComponentStatus(status, componentName)
+	parameterStatus := intctrlutil.GetParameterReconfiguringStatus(compStatus, tpl)
+	if parameterStatus != nil {
+		return parameterStatus
+	}
+
+	compStatus.ParameterStatus = append(compStatus.ParameterStatus,
+		parametersv1alpha1.ReconfiguringStatus{
+			ConfigTemplateItemDetailStatus: parametersv1alpha1.ConfigTemplateItemDetailStatus{
+				Name: tpl,
+			},
+		})
+	return intctrlutil.GetParameterReconfiguringStatus(compStatus, tpl)
+}
+
+func safeUpdateComponentParameterStatus(status *parametersv1alpha1.ParameterStatus, componentName string, tpl string, updatedParams map[string]*parametersv1alpha1.ParametersInFile) {
+	parameterStatus := safeResolveComponentParameterStatus(status, componentName, tpl)
+	parameterStatus.UpdatedParameters = configctrl.DerefMapValues(updatedParams)
+}
+
+func flatten(parametersDefs map[string]*parametersv1alpha1.ParametersDefinition) []*parametersv1alpha1.ParametersDefinition {
+	var defs []*parametersv1alpha1.ParametersDefinition
+	for _, paramsDef := range parametersDefs {
+		defs = append(defs, paramsDef)
+	}
+	return defs
+}
+
+func resolveComponentRefConfigMap(rctx *ReconcileContext) (map[string]*corev1.ConfigMap, error) {
+	configMapList := &corev1.ConfigMapList{}
+	matchLabels := client.MatchingLabels(constant.GetCompLabels(rctx.ClusterName, rctx.ComponentName))
+	requiredLabels := client.HasLabels(reconfigureRequiredLabels)
+	if err := rctx.Client.List(rctx.Ctx, configMapList, client.InNamespace(rctx.Namespace), matchLabels, requiredLabels); err != nil {
+		return nil, err
+	}
+
+	configs := make(map[string]*corev1.ConfigMap)
+	for i, cm := range configMapList.Items {
+		configs[cm.Labels[constant.CMConfigurationSpecProviderLabelKey]] = &configMapList.Items[i]
+	}
+	return configs, nil
+}
+
+func prepareResources(rctx *ReconcileContext, _ *parametersv1alpha1.Parameter) error {
+	return rctx.Cluster().
+		ComponentAndComponentDef().
+		SynthesizedComponent().
+		ComponentParameter().
+		ParametersDefinitions().
+		Complete()
+}
+
+func syncComponentParameterStatus(rctx *ReconcileContext, parameter *parametersv1alpha1.Parameter) error {
+	syncConfigTemplateStatus := func(status *parametersv1alpha1.ComponentReconfiguringStatus, compParamStatus *parametersv1alpha1.ComponentParameterStatus) {
+		for i, parameterStatus := range status.ParameterStatus {
+			itemStatus := intctrlutil.GetItemStatus(compParamStatus, parameterStatus.Name)
+			if itemStatus != nil {
+				status.ParameterStatus[i].ConfigTemplateItemDetailStatus = *itemStatus
+			}
+		}
+	}
+
+	for i := range parameter.Status.ReconfiguringStatus {
+		syncConfigTemplateStatus(&parameter.Status.ReconfiguringStatus[i], &rctx.ComponentParameterObj.Status)
+	}
+	return nil
+}
diff --git a/controllers/parameters/policy_util.go b/controllers/parameters/policy_util.go
index 1380acaa9..a90628ab0 100644
--- a/controllers/parameters/policy_util.go
+++ b/controllers/parameters/policy_util.go
@@ -27,9 +27,13 @@ import (
 	"strconv"
 
 	corev1 "k8s.io/api/core/v1"
+	"k8s.io/utils/pointer"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
+	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
+	cfgcm "github.com/apecloud/kubeblocks/pkg/configuration/config_manager"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgproto "github.com/apecloud/kubeblocks/pkg/configuration/proto"
 	"github.com/apecloud/kubeblocks/pkg/constant"
@@ -41,10 +45,10 @@ import (
 )
 
 // GetComponentPods gets all pods of the component.
-func GetComponentPods(params reconfigureParams) ([]corev1.Pod, error) {
+func GetComponentPods(params reconfigureContext) ([]corev1.Pod, error) {
 	componentPods := make([]corev1.Pod, 0)
 	for i := range params.InstanceSetUnits {
-		pods, err := intctrlutil.GetPodListByInstanceSet(params.Ctx.Ctx, params.Client, &params.InstanceSetUnits[i])
+		pods, err := intctrlutil.GetPodListByInstanceSet(params.Ctx, params.Client, &params.InstanceSetUnits[i])
 		if err != nil {
 			return nil, err
 		}
@@ -69,7 +73,7 @@ func CheckReconfigureUpdateProgress(pods []corev1.Pod, configKey, version string
 	return readyPods
 }
 
-func getPodsForOnlineUpdate(params reconfigureParams) ([]corev1.Pod, error) {
+func getPodsForOnlineUpdate(params reconfigureContext) ([]corev1.Pod, error) {
 	if len(params.InstanceSetUnits) > 1 {
 		return nil, core.MakeError("component require only one InstanceSet, actual %d components", len(params.InstanceSetUnits))
 	}
@@ -94,8 +98,8 @@ func getPodsForOnlineUpdate(params reconfigureParams) ([]corev1.Pod, error) {
 }
 
 // TODO commonOnlineUpdateWithPod migrate to sql command pipeline
-func commonOnlineUpdateWithPod(pod *corev1.Pod, ctx context.Context, createClient createReconfigureClient, configSpec string, updatedParams map[string]string) error {
-	address, err := cfgManagerGrpcURL(pod)
+func commonOnlineUpdateWithPod(pod *corev1.Pod, ctx context.Context, createClient createReconfigureClient, configSpec string, configFile string, updatedParams map[string]string) error {
+	address, err := resolveReloadServerGrpcURL(pod)
 	if err != nil {
 		return err
 	}
@@ -107,6 +111,7 @@ func commonOnlineUpdateWithPod(pod *corev1.Pod, ctx context.Context, createClien
 	response, err := client.OnlineUpgradeParams(ctx, &cfgproto.OnlineUpgradeParamsRequest{
 		ConfigSpec: configSpec,
 		Params:     updatedParams,
+		ConfigFile: pointer.String(configFile),
 	})
 	if err != nil {
 		return err
@@ -129,7 +134,7 @@ func commonStopContainerWithPod(pod *corev1.Pod, ctx context.Context, containerN
 		containerIDs = append(containerIDs, containerID)
 	}
 
-	address, err := cfgManagerGrpcURL(pod)
+	address, err := resolveReloadServerGrpcURL(pod)
 	if err != nil {
 		return err
 	}
@@ -153,19 +158,19 @@ func commonStopContainerWithPod(pod *corev1.Pod, ctx context.Context, containerN
 	return nil
 }
 
-func cfgManagerGrpcURL(pod *corev1.Pod) (string, error) {
+func resolveReloadServerGrpcURL(pod *corev1.Pod) (string, error) {
 	podPort := viper.GetInt(constant.ConfigManagerGPRCPortEnv)
 	if pod.Spec.HostNetwork {
-		containerPort, err := configuration.GetConfigManagerGRPCPort(pod.Spec.Containers)
+		containerPort, err := configuration.ResolveReloadServerGRPCPort(pod.Spec.Containers)
 		if err != nil {
 			return "", err
 		}
 		podPort = int(containerPort)
 	}
-	return getURLFromPod(pod, podPort)
+	return generateGrpcURL(pod, podPort)
 }
 
-func getURLFromPod(pod *corev1.Pod, portPort int) (string, error) {
+func generateGrpcURL(pod *corev1.Pod, portPort int) (string, error) {
 	ip, err := ipAddressFromPod(pod.Status)
 	if err != nil {
 		return "", err
@@ -239,3 +244,153 @@ func restartComponent(cli client.Client, ctx intctrlutil.RequestCtx, configKey s
 func updatedVersion(podTemplate *corev1.PodTemplateSpec, keyPath, expectedVersion string) bool {
 	return podTemplate.Annotations != nil && podTemplate.Annotations[keyPath] == expectedVersion
 }
+
+type ReloadAction interface {
+	ExecReload() (ReturnedStatus, error)
+	ReloadType() string
+}
+
+type reconfigureTask struct {
+	parametersv1alpha1.ReloadPolicy
+	taskCtx reconfigureContext
+}
+
+func (r reconfigureTask) ReloadType() string {
+	return string(r.ReloadPolicy)
+}
+
+func (r reconfigureTask) ExecReload() (ReturnedStatus, error) {
+	if executor, ok := upgradePolicyMap[r.ReloadPolicy]; ok {
+		return executor.Upgrade(r.taskCtx)
+	}
+
+	return ReturnedStatus{}, fmt.Errorf("not support reload action[%s]", r.ReloadPolicy)
+}
+
+func resolveReloadActionPolicy(jsonPatch string,
+	format *parametersv1alpha1.FileFormatConfig,
+	pd *parametersv1alpha1.ParametersDefinitionSpec) (parametersv1alpha1.ReloadPolicy, error) {
+	var policy = parametersv1alpha1.NonePolicy
+	dynamicUpdate, err := core.CheckUpdateDynamicParameters(format, pd, jsonPatch)
+	if err != nil {
+		return policy, err
+	}
+
+	// make decision
+	switch {
+	case !dynamicUpdate && intctrlutil.NeedDynamicReloadAction(pd): // static parameters update
+		policy = parametersv1alpha1.DynamicReloadAndRestartPolicy
+	case cfgcm.IsAutoReload(pd.ReloadAction): // if core support hot update, don't need to do anything
+		policy = parametersv1alpha1.AsyncDynamicReloadPolicy
+	case enableSyncTrigger(pd.ReloadAction): // sync config-manager exec hot update
+		policy = parametersv1alpha1.SyncDynamicReloadPolicy
+	default: // config-manager auto trigger to hot update
+		policy = parametersv1alpha1.AsyncDynamicReloadPolicy
+	}
+	return policy, nil
+}
+
+// genReconfigureActionTasks generates a list of reconfiguration tasks based on the provided templateSpec,
+// reconfiguration context, configuration patch, and a restart flag.
+func genReconfigureActionTasks(templateSpec *appsv1.ComponentTemplateSpec, rctx *ReconcileContext, patch *core.ConfigPatchInfo, restart bool) ([]ReloadAction, error) {
+	var tasks []ReloadAction
+
+	// If the patch or ConfigRender is nil, return a single restart task.
+	if patch == nil || rctx.ConfigRender == nil {
+		return []ReloadAction{buildRestartTask(templateSpec, rctx)}, nil
+	}
+
+	// needReloadAction determines if a reload action is needed based on the ParametersDefinition and ReloadPolicy.
+	needReloadAction := func(pd *parametersv1alpha1.ParametersDefinition, policy parametersv1alpha1.ReloadPolicy) bool {
+		return !restart || (policy == parametersv1alpha1.SyncDynamicReloadPolicy && intctrlutil.NeedDynamicReloadAction(&pd.Spec))
+	}
+
+	for key, jsonPatch := range patch.UpdateConfig {
+		pd, ok := rctx.ParametersDefs[key]
+		// If the ParametersDefinition or its ReloadAction is nil, continue to the next iteration.
+		if !ok || pd.Spec.ReloadAction == nil {
+			continue
+		}
+		configFormat := intctrlutil.GetComponentConfigDescription(&rctx.ConfigRender.Spec, key)
+		if configFormat == nil || configFormat.FileFormatConfig == nil {
+			continue
+		}
+		// Determine the appropriate ReloadPolicy.
+		policy, err := resolveReloadActionPolicy(string(jsonPatch), configFormat.FileFormatConfig, &pd.Spec)
+		if err != nil {
+			return nil, err
+		}
+		// If a reload action is needed, append a new reload action task to the tasks slice.
+		if needReloadAction(pd, policy) {
+			tasks = append(tasks, buildReloadActionTask(policy, templateSpec, rctx, pd, configFormat, patch))
+		}
+	}
+
+	// If no tasks were added, return a single restart task.
+	if len(tasks) == 0 {
+		return []ReloadAction{buildRestartTask(templateSpec, rctx)}, nil
+	}
+
+	return tasks, nil
+}
+
+func buildReloadActionTask(reloadPolicy parametersv1alpha1.ReloadPolicy, templateSpec *appsv1.ComponentTemplateSpec, rctx *ReconcileContext, pd *parametersv1alpha1.ParametersDefinition, configDescription *parametersv1alpha1.ComponentConfigDescription, patch *core.ConfigPatchInfo) reconfigureTask {
+	reCtx := reconfigureContext{
+		RequestCtx:               rctx.RequestCtx,
+		Client:                   rctx.Client,
+		ConfigTemplate:           *templateSpec,
+		ConfigMap:                rctx.ConfigMap,
+		ParametersDef:            &pd.Spec,
+		ConfigDescription:        configDescription,
+		Cluster:                  rctx.ClusterObj,
+		ContainerNames:           rctx.Containers,
+		InstanceSetUnits:         rctx.InstanceSetList,
+		ClusterComponent:         rctx.ClusterComObj,
+		SynthesizedComponent:     rctx.BuiltinComponent,
+		ReconfigureClientFactory: GetClientFactory(),
+	}
+
+	if reloadPolicy == parametersv1alpha1.SyncDynamicReloadPolicy {
+		reCtx.UpdatedParameters = generateOnlineUpdateParams(patch, &pd.Spec, *configDescription)
+	}
+
+	return reconfigureTask{ReloadPolicy: reloadPolicy, taskCtx: reCtx}
+}
+
+func buildRestartTask(configTemplate *appsv1.ComponentTemplateSpec, rctx *ReconcileContext) reconfigureTask {
+	return reconfigureTask{
+		ReloadPolicy: parametersv1alpha1.RestartPolicy,
+		taskCtx: reconfigureContext{
+			RequestCtx:           rctx.RequestCtx,
+			Client:               rctx.Client,
+			ConfigTemplate:       *configTemplate,
+			ClusterComponent:     rctx.ClusterComObj,
+			Cluster:              rctx.ClusterObj,
+			SynthesizedComponent: rctx.BuiltinComponent,
+			InstanceSetUnits:     rctx.InstanceSetList,
+			ConfigMap:            rctx.ConfigMap,
+		},
+	}
+}
+
+func generateOnlineUpdateParams(configPatch *core.ConfigPatchInfo, paramDef *parametersv1alpha1.ParametersDefinitionSpec, description parametersv1alpha1.ComponentConfigDescription) map[string]string {
+	params := make(map[string]string)
+	dynamicAction := intctrlutil.NeedDynamicReloadAction(paramDef)
+	needReloadStaticParams := intctrlutil.ReloadStaticParameters(paramDef)
+	visualizedParams := core.GenerateVisualizedParamsList(configPatch, []parametersv1alpha1.ComponentConfigDescription{description})
+
+	for _, key := range visualizedParams {
+		if key.UpdateType != core.UpdatedType {
+			continue
+		}
+		for _, p := range key.Parameters {
+			if dynamicAction && !needReloadStaticParams && !core.IsDynamicParameter(p.Key, paramDef) {
+				continue
+			}
+			if p.Value != nil {
+				params[p.Key] = *p.Value
+			}
+		}
+	}
+	return params
+}
diff --git a/controllers/parameters/reconcile_task.go b/controllers/parameters/reconcile_task.go
index 59b6920f5..67ae16fa6 100644
--- a/controllers/parameters/reconcile_task.go
+++ b/controllers/parameters/reconcile_task.go
@@ -21,18 +21,22 @@ package parameters
 
 import (
 	"context"
+	"encoding/json"
+	"reflect"
 	"strconv"
 
 	corev1 "k8s.io/api/core/v1"
-	apierrors "k8s.io/apimachinery/pkg/api/errors"
+	"k8s.io/utils/pointer"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
 
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
-	"github.com/apecloud/kubeblocks/pkg/controller/builder"
+	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
 	configctrl "github.com/apecloud/kubeblocks/pkg/controller/configuration"
+	"github.com/apecloud/kubeblocks/pkg/controller/model"
 	"github.com/apecloud/kubeblocks/pkg/controller/render"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
@@ -40,44 +44,87 @@ import (
 type Task struct {
 	configctrl.ResourceFetcher[Task]
 
-	Status *appsv1alpha1.ConfigurationItemDetailStatus
+	Status *parametersv1alpha1.ConfigTemplateItemDetailStatus
 	Name   string
 
-	Do func(fetcher *Task, component *component.SynthesizedComponent, revision string) error
+	Do func(resource *Task, taskCtx *TaskContext, revision string) error
 }
 
 type TaskContext struct {
-	configuration *appsv1alpha1.Configuration
-	ctx           context.Context
-	fetcher       *Task
+	componentParameter *parametersv1alpha1.ComponentParameter
+	configRender       *parametersv1alpha1.ParamConfigRenderer
+	ctx                context.Context
+	component          *component.SynthesizedComponent
+	paramsDefs         []*parametersv1alpha1.ParametersDefinition
 }
 
-func NewTask(item appsv1alpha1.ConfigurationItemDetail, status *appsv1alpha1.ConfigurationItemDetailStatus) Task {
+func NewTaskContext(ctx context.Context, cli client.Client, componentParameter *parametersv1alpha1.ComponentParameter, fetchTask *Task) (*TaskContext, error) {
+	// build synthesized component for the component
+	cmpd := fetchTask.ComponentDefObj
+	synthesizedComp, err := component.BuildSynthesizedComponent(ctx, cli, cmpd, fetchTask.ComponentObj)
+	if err == nil {
+		err = buildTemplateVars(ctx, cli, fetchTask.ComponentDefObj, synthesizedComp)
+	}
+	if err != nil {
+		return nil, err
+	}
+
+	configDefList := &parametersv1alpha1.ParamConfigRendererList{}
+	if err := cli.List(ctx, configDefList); err != nil {
+		return nil, err
+	}
+
+	var paramsDefs []*parametersv1alpha1.ParametersDefinition
+	var configRender *parametersv1alpha1.ParamConfigRenderer
+	for i, item := range configDefList.Items {
+		if item.Spec.ComponentDef != cmpd.Name {
+			continue
+		}
+		if item.Spec.ServiceVersion == "" || item.Spec.ServiceVersion == cmpd.Spec.ServiceVersion {
+			configRender = &configDefList.Items[i]
+			break
+		}
+	}
+
+	if configRender != nil {
+		for _, paramsDef := range configRender.Spec.ParametersDefs {
+			var param = &parametersv1alpha1.ParametersDefinition{}
+			if err := cli.Get(ctx, client.ObjectKey{Name: paramsDef}, param); err != nil {
+				return nil, err
+			}
+			paramsDefs = append(paramsDefs, param)
+		}
+	}
+
+	return &TaskContext{ctx: ctx,
+		componentParameter: componentParameter,
+		configRender:       configRender,
+		component:          synthesizedComp,
+		paramsDefs:         paramsDefs,
+	}, nil
+}
+
+func NewTask(item parametersv1alpha1.ConfigTemplateItemDetail, status *parametersv1alpha1.ConfigTemplateItemDetailStatus) Task {
 	return Task{
 		Name: item.Name,
-		Do: func(fetcher *Task, synComponent *component.SynthesizedComponent, revision string) error {
+		Do: func(resource *Task, taskCtx *TaskContext, revision string) error {
 			configSpec := item.ConfigSpec
 			if configSpec == nil {
 				return core.MakeError("not found config spec: %s", item.Name)
 			}
-			if err := fetcher.ConfigMap(item.Name).Complete(); err != nil {
-				if !apierrors.IsNotFound(err) {
-					return err
-				}
-				if item.ConfigSpec.InjectEnvEnabled() && item.ConfigSpec.ToSecret() {
-					return syncSecretStatus(status)
-				}
-				return err
+			if err := resource.ConfigMap(item.Name).Complete(); err != nil {
+				return syncImpl(taskCtx, resource, item, status, revision, nil)
 			}
 			// Do reconcile for config template
-			configMap := fetcher.ConfigMapObj
+			configMap := resource.ConfigMapObj
 			switch intctrlutil.GetConfigSpecReconcilePhase(configMap, item, status) {
 			default:
 				return syncStatus(configMap, status)
-			case appsv1alpha1.CPendingPhase,
-				appsv1alpha1.CMergeFailedPhase:
-				return syncImpl(fetcher, item, status, synComponent, revision, builder.ToV1ConfigSpec(configSpec))
-			case appsv1alpha1.CCreatingPhase:
+			case parametersv1alpha1.CInitPhase,
+				parametersv1alpha1.CPendingPhase,
+				parametersv1alpha1.CMergeFailedPhase:
+				return syncImpl(taskCtx, resource, item, status, revision, configMap)
+			case parametersv1alpha1.CCreatingPhase:
 				return nil
 			}
 		},
@@ -85,48 +132,140 @@ func NewTask(item appsv1alpha1.ConfigurationItemDetail, status *appsv1alpha1.Con
 	}
 }
 
-func syncSecretStatus(status *appsv1alpha1.ConfigurationItemDetailStatus) error {
-	status.Phase = appsv1alpha1.CFinishedPhase
-	if status.LastDoneRevision == "" {
-		status.LastDoneRevision = status.UpdateRevision
+func syncImpl(taskCtx *TaskContext,
+	fetcher *Task,
+	item parametersv1alpha1.ConfigTemplateItemDetail,
+	status *parametersv1alpha1.ConfigTemplateItemDetailStatus,
+	revision string,
+	configMap *corev1.ConfigMap) (err error) {
+	if intctrlutil.IsApplyConfigChanged(configMap, item) {
+		return syncStatus(configMap, status)
 	}
-	return nil
-}
 
-func syncImpl(fetcher *Task,
-	item appsv1alpha1.ConfigurationItemDetail,
-	status *appsv1alpha1.ConfigurationItemDetailStatus,
-	synthesizedComponent *component.SynthesizedComponent,
-	revision string,
-	configSpec *appsv1.ComponentConfigSpec) (err error) {
-	err = configctrl.NewReconcilePipeline(render.ReconcileCtx{
+	failStatus := func(err error) error {
+		status.Message = pointer.String(err.Error())
+		status.Phase = parametersv1alpha1.CMergeFailedPhase
+		return err
+	}
+
+	reconcileCtx := &render.ReconcileCtx{
 		ResourceCtx:          fetcher.ResourceCtx,
 		Cluster:              fetcher.ClusterObj,
 		Component:            fetcher.ComponentObj,
-		SynthesizedComponent: synthesizedComponent,
-		PodSpec:              synthesizedComponent.PodSpec,
-	}, item, status, configSpec).
-		ConfigMap(item.Name).
-		ConfigConstraints(configSpec.ConfigConstraintRef).
-		PrepareForTemplate().
-		RerenderTemplate().
-		ApplyParameters().
-		UpdateConfigVersion(revision).
-		Sync().
-		Complete()
+		SynthesizedComponent: taskCtx.component,
+		PodSpec:              taskCtx.component.PodSpec,
+	}
 
-	if err != nil {
-		status.Message = cfgutil.ToPointer(err.Error())
-		status.Phase = appsv1alpha1.CMergeFailedPhase
-	} else {
-		status.Message = nil
-		status.Phase = appsv1alpha1.CMergedPhase
+	var baseConfig = configMap
+	var updatedConfig *corev1.ConfigMap
+	if intctrlutil.IsRerender(configMap, item) {
+		if baseConfig, err = configctrl.RerenderParametersTemplate(reconcileCtx, item, taskCtx.configRender, taskCtx.paramsDefs); err != nil {
+			return failStatus(err)
+		}
+		updatedConfig = baseConfig
+	}
+	if len(item.ConfigFileParams) != 0 {
+		if updatedConfig, err = configctrl.ApplyParameters(item, baseConfig, taskCtx.configRender, taskCtx.paramsDefs); err != nil {
+			return failStatus(err)
+		}
+	}
+	if err = mergeAndApplyConfig(fetcher.ResourceCtx, updatedConfig, configMap, fetcher.ComponentParameterObj, item, revision); err != nil {
+		return failStatus(err)
 	}
+
+	status.Message = nil
+	status.Phase = parametersv1alpha1.CMergedPhase
 	status.UpdateRevision = revision
-	return err
+	return nil
 }
 
-func syncStatus(configMap *corev1.ConfigMap, status *appsv1alpha1.ConfigurationItemDetailStatus) (err error) {
+func mergeAndApplyConfig(resourceCtx *render.ResourceCtx,
+	expected *corev1.ConfigMap,
+	running *corev1.ConfigMap,
+	owner client.Object,
+	item parametersv1alpha1.ConfigTemplateItemDetail,
+	revision string) error {
+	switch {
+	case expected == nil: // not update
+		return update(resourceCtx.Context, resourceCtx.Client, running, running, updateReconcileObject(item, owner, revision))
+	case running == nil: // cm been deleted
+		return create(resourceCtx.Context, resourceCtx.Client, expected, updateReconcileObject(item, owner, revision))
+	default:
+		return update(resourceCtx.Context, resourceCtx.Client, running, running, mergedConfigmap(expected, updateReconcileObject(item, owner, revision)))
+	}
+}
+
+func mergedConfigmap(expected *corev1.ConfigMap, setter func(*corev1.ConfigMap) error) func(*corev1.ConfigMap) error {
+	return func(cmObj *corev1.ConfigMap) error {
+		cmObj.Data = expected.Data
+		cmObj.Labels = intctrlutil.MergeMetadataMaps(expected.Labels, cmObj.Labels)
+		cmObj.Annotations = intctrlutil.MergeMetadataMaps(expected.Annotations, cmObj.Annotations)
+		return setter(cmObj)
+	}
+}
+
+func update(ctx context.Context, cli client.Client, expected, origin *corev1.ConfigMap, setter func(*corev1.ConfigMap) error) error {
+	objectDeep := expected.DeepCopy()
+	if err := setter(objectDeep); err != nil {
+		return err
+	}
+	if reflect.DeepEqual(objectDeep.Data, origin.Data) &&
+		reflect.DeepEqual(objectDeep.Annotations, origin.Annotations) &&
+		reflect.DeepEqual(objectDeep.Labels, origin.Labels) &&
+		reflect.DeepEqual(objectDeep.Finalizers, origin.Finalizers) &&
+		reflect.DeepEqual(objectDeep.OwnerReferences, origin.OwnerReferences) {
+		return nil
+	}
+	return cli.Patch(ctx, objectDeep, client.MergeFrom(origin))
+}
+
+func create(ctx context.Context, cli client.Client, expected *corev1.ConfigMap, setter func(*corev1.ConfigMap) error) error {
+	if err := setter(expected); err != nil {
+		return err
+	}
+	return cli.Create(ctx, expected)
+}
+
+func updateReconcileObject(item parametersv1alpha1.ConfigTemplateItemDetail,
+	owner client.Object,
+	revision string) func(*corev1.ConfigMap) error {
+	return func(cmObj *corev1.ConfigMap) error {
+		if !controllerutil.ContainsFinalizer(cmObj, constant.ConfigFinalizerName) {
+			controllerutil.AddFinalizer(cmObj, constant.ConfigFinalizerName)
+		}
+		if !model.IsOwnerOf(owner, cmObj) {
+			if err := intctrlutil.SetControllerReference(owner, cmObj); err != nil {
+				return err
+			}
+		}
+		return updateConfigLabels(cmObj, item, revision)
+	}
+}
+
+func updateConfigLabels(obj *corev1.ConfigMap,
+	item parametersv1alpha1.ConfigTemplateItemDetail,
+	revision string) error {
+	if obj.Annotations == nil {
+		obj.Annotations = make(map[string]string)
+	}
+	b, err := json.Marshal(&item)
+	if err != nil {
+		return err
+	}
+	obj.Annotations[constant.ConfigAppliedVersionAnnotationKey] = string(b)
+	obj.Annotations[constant.ConfigurationRevision] = revision
+
+	if obj.Labels == nil {
+		obj.Labels = make(map[string]string)
+	}
+	hash, _ := cfgutil.ComputeHash(obj.Data)
+	obj.Labels[constant.CMInsConfigurationHashLabelKey] = hash
+	obj.Labels[constant.CMConfigurationSpecProviderLabelKey] = item.Name
+	obj.Labels[constant.CMConfigurationTemplateNameLabelKey] = item.ConfigSpec.TemplateRef
+	return nil
+}
+
+func syncStatus(configMap *corev1.ConfigMap, status *parametersv1alpha1.ConfigTemplateItemDetailStatus) (err error) {
 	annotations := configMap.GetAnnotations()
 	// status.CurrentRevision = GetCurrentRevision(annotations)
 	revisions := RetrieveRevision(annotations)
@@ -142,16 +281,16 @@ func syncStatus(configMap *corev1.ConfigMap, status *appsv1alpha1.ConfigurationI
 	return
 }
 
-func updateLastDoneRevision(revision ConfigurationRevision, status *appsv1alpha1.ConfigurationItemDetailStatus) {
-	if revision.Phase == appsv1alpha1.CFinishedPhase {
+func updateLastDoneRevision(revision ConfigurationRevision, status *parametersv1alpha1.ConfigTemplateItemDetailStatus) {
+	if revision.Phase == parametersv1alpha1.CFinishedPhase {
 		status.LastDoneRevision = strconv.FormatInt(revision.Revision, 10)
 	}
 }
 
-func updateRevision(revision ConfigurationRevision, status *appsv1alpha1.ConfigurationItemDetailStatus) {
+func updateRevision(revision ConfigurationRevision, status *parametersv1alpha1.ConfigTemplateItemDetailStatus) {
 	if revision.StrRevision == status.UpdateRevision {
 		status.Phase = revision.Phase
-		status.ReconcileDetail = &appsv1alpha1.ReconcileDetail{
+		status.ReconcileDetail = &parametersv1alpha1.ReconcileDetail{
 			CurrentRevision: revision.StrRevision,
 			Policy:          revision.Result.Policy,
 			SucceedCount:    revision.Result.SucceedCount,
@@ -161,3 +300,19 @@ func updateRevision(revision ConfigurationRevision, status *appsv1alpha1.Configu
 		}
 	}
 }
+
+func prepareReconcileTask(reqCtx intctrlutil.RequestCtx, cli client.Client, componentParameter *parametersv1alpha1.ComponentParameter) (*Task, error) {
+	fetcherTask := &Task{}
+	err := fetcherTask.Init(&render.ResourceCtx{
+		Context:       reqCtx.Ctx,
+		Client:        cli,
+		Namespace:     componentParameter.Namespace,
+		ClusterName:   componentParameter.Spec.ClusterName,
+		ComponentName: componentParameter.Spec.ComponentName,
+	}, fetcherTask).Cluster().
+		ComponentAndComponentDef().
+		ComponentSpec().
+		Complete()
+	fetcherTask.ComponentParameterObj = componentParameter
+	return fetcherTask, err
+}
diff --git a/controllers/parameters/reconfigure_controller.go b/controllers/parameters/reconfigure_controller.go
index 134317d51..2955cec3d 100644
--- a/controllers/parameters/reconfigure_controller.go
+++ b/controllers/parameters/reconfigure_controller.go
@@ -39,7 +39,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	cfgcm "github.com/apecloud/kubeblocks/pkg/configuration/config_manager"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/multicluster"
@@ -106,15 +106,13 @@ func (r *ReconfigureReconciler) Reconcile(ctx context.Context, req ctrl.Request)
 	reqCtx.Log = reqCtx.Log.
 		WithValues("ClusterName", config.Labels[constant.AppInstanceLabelKey]).
 		WithValues("ComponentName", config.Labels[constant.KBAppComponentLabelKey])
-	if hash, ok := config.Labels[constant.CMInsConfigurationHashLabelKey]; ok && hash == config.ResourceVersion {
-		return intctrlutil.Reconciled()
-	}
 
 	isAppliedConfigs, err := checkAndApplyConfigsChanged(r.Client, reqCtx, config)
 	if err != nil {
 		return intctrlutil.CheckedRequeueWithError(err, reqCtx.Log, "failed to check last-applied-configuration")
-	} else if isAppliedConfigs {
-		return updateConfigPhase(r.Client, reqCtx, config, appsv1alpha1.CFinishedPhase, configurationNoChangedMessage)
+	}
+	if isAppliedConfigs {
+		return updateConfigPhase(r.Client, reqCtx, config, parametersv1alpha1.CFinishedPhase, configurationNoChangedMessage)
 	}
 
 	resources, err := prepareRelatedResource(reqCtx, r.Client, config)
@@ -128,7 +126,7 @@ func (r *ReconfigureReconciler) Reconcile(ctx context.Context, req ctrl.Request)
 			corev1.EventTypeWarning,
 			appsv1alpha1.ReasonReconfigureFailed,
 			configurationNotRelatedComponentMessage)
-		return updateConfigPhase(r.Client, reqCtx, config, appsv1alpha1.CFinishedPhase, configurationNotRelatedComponentMessage)
+		return updateConfigPhase(r.Client, reqCtx, config, parametersv1alpha1.CFinishedPhase, configurationNotRelatedComponentMessage)
 	}
 
 	return r.sync(reqCtx, config, resources)
@@ -164,27 +162,7 @@ func checkConfigurationObject(object client.Object) bool {
 }
 
 func (r *ReconfigureReconciler) sync(reqCtx intctrlutil.RequestCtx, configMap *corev1.ConfigMap, resources *reconfigureRelatedResource) (ctrl.Result, error) {
-	configPatch, forceRestart, err := createConfigPatch(configMap, resources.configConstraintObj.Spec.FileFormatConfig, resources.configSpec.Keys)
-	if err != nil {
-		return intctrlutil.RequeueWithErrorAndRecordEvent(configMap, r.Recorder, err, reqCtx.Log)
-	}
-
-	// No parameters updated
-	if configPatch != nil && !configPatch.IsModify {
-		reqCtx.Recorder.Event(configMap, corev1.EventTypeNormal, appsv1alpha1.ReasonReconfigureRunning, "nothing changed, skip reconfigure")
-		return r.updateConfigCMStatus(reqCtx, configMap, core.ReconfigureNoChangeType, nil)
-	}
-
-	if configPatch != nil {
-		reqCtx.Log.V(1).Info(fmt.Sprintf(
-			"reconfigure params: \n\tadd: %s\n\tdelete: %s\n\tupdate: %s",
-			configPatch.AddConfig,
-			configPatch.DeleteConfig,
-			configPatch.UpdateConfig))
-	}
-
-	reconcileContext := newConfigReconcileContext(
-		reqCtx.Ctx,
+	rctx := newParameterReconcileContext(reqCtx,
 		&render.ResourceCtx{
 			Context:       reqCtx.Ctx,
 			Client:        r.Client,
@@ -195,37 +173,46 @@ func (r *ReconfigureReconciler) sync(reqCtx intctrlutil.RequestCtx, configMap *c
 		configMap,
 		resources.configSpec.Name,
 		resources.componentMatchLabels())
-	if err := reconcileContext.GetRelatedObjects(); err != nil {
+	if err := rctx.GetRelatedObjects(); err != nil {
 		return intctrlutil.RequeueWithErrorAndRecordEvent(configMap, r.Recorder, err, reqCtx.Log)
 	}
 
 	// Assumption: It is required that the cluster must have a component.
-	if reconcileContext.ClusterComObj == nil {
+	if rctx.ClusterComObj == nil {
 		reqCtx.Log.Info("not found component.")
 		return intctrlutil.Reconciled()
 	}
 
-	if len(reconcileContext.InstanceSetList) == 0 {
+	if len(rctx.InstanceSetList) == 0 {
 		reqCtx.Recorder.Event(configMap, corev1.EventTypeWarning, appsv1alpha1.ReasonReconfigureFailed,
 			"the configmap is not used by any container, skip reconfigure")
-		return updateConfigPhase(r.Client, reqCtx, configMap, appsv1alpha1.CFinishedPhase, configurationNotUsingMessage)
+		return updateConfigPhase(r.Client, reqCtx, configMap, parametersv1alpha1.CFinishedPhase, configurationNotUsingMessage)
+	}
+
+	configPatch, forceRestart, err := createConfigPatch(configMap, rctx.ConfigRender, rctx.ParametersDefs)
+	if err != nil {
+		return intctrlutil.RequeueWithErrorAndRecordEvent(configMap, r.Recorder, err, reqCtx.Log)
 	}
 
-	return r.performUpgrade(reconfigureParams{
-		ConfigSpecName:           resources.configSpec.Name,
-		ConfigPatch:              configPatch,
-		ConfigMap:                configMap,
-		ConfigConstraint:         &resources.configConstraintObj.Spec,
-		Client:                   r.Client,
-		Ctx:                      reqCtx,
-		Cluster:                  reconcileContext.ClusterObj,
-		ContainerNames:           reconcileContext.Containers,
-		InstanceSetUnits:         reconcileContext.InstanceSetList,
-		ClusterComponent:         reconcileContext.ClusterComObj,
-		SynthesizedComponent:     reconcileContext.BuiltinComponent,
-		Restart:                  forceRestart || !cfgcm.IsSupportReload(resources.configConstraintObj.Spec.ReloadAction),
-		ReconfigureClientFactory: GetClientFactory(),
-	})
+	// No parameters updated
+	if configPatch != nil && !configPatch.IsModify {
+		reqCtx.Recorder.Event(configMap, corev1.EventTypeNormal, appsv1alpha1.ReasonReconfigureRunning, "nothing changed, skip reconfigure")
+		return r.updateConfigCMStatus(reqCtx, configMap, core.ReconfigureNoChangeType, nil)
+	}
+
+	if configPatch != nil {
+		reqCtx.Log.V(1).Info(fmt.Sprintf(
+			"reconfigure params: \n\tadd: %s\n\tdelete: %s\n\tupdate: %s",
+			configPatch.AddConfig,
+			configPatch.DeleteConfig,
+			configPatch.UpdateConfig))
+	}
+
+	tasks, err := genReconfigureActionTasks(resources.configSpec, rctx, configPatch, forceRestart)
+	if err != nil {
+		return intctrlutil.RequeueWithErrorAndRecordEvent(configMap, r.Recorder, err, reqCtx.Log)
+	}
+	return r.performUpgrade(rctx, tasks)
 }
 
 func (r *ReconfigureReconciler) updateConfigCMStatus(reqCtx intctrlutil.RequestCtx, cfg *corev1.ConfigMap, reconfigureType string, result *intctrlutil.Result) (ctrl.Result, error) {
@@ -241,65 +228,47 @@ func (r *ReconfigureReconciler) updateConfigCMStatus(reqCtx intctrlutil.RequestC
 	return intctrlutil.Reconciled()
 }
 
-func (r *ReconfigureReconciler) performUpgrade(params reconfigureParams) (ctrl.Result, error) {
-	policy, err := NewReconfigurePolicy(params.ConfigConstraint, params.ConfigPatch, getUpgradePolicy(params.ConfigMap), params.Restart)
-	if err != nil {
-		return intctrlutil.RequeueWithErrorAndRecordEvent(params.ConfigMap, r.Recorder, err, params.Ctx.Log)
+func (r *ReconfigureReconciler) performUpgrade(rctx *ReconcileContext, reloadTasks []ReloadAction) (ctrl.Result, error) {
+	var err error
+	var returnedStatus ReturnedStatus
+	var reloadType string
+
+	for _, task := range reloadTasks {
+		reloadType = task.ReloadType()
+		returnedStatus, err = task.ExecReload()
+		if err != nil || returnedStatus.Status != ESNone {
+			return r.status(rctx, returnedStatus, reloadType, err)
+		}
 	}
+	return r.succeed(rctx, reloadType, returnedStatus)
+}
 
-	returnedStatus, err := policy.Upgrade(params)
-	if err != nil {
-		params.Ctx.Log.Error(err, "failed to update engine parameters")
+func (r *ReconfigureReconciler) status(rctx *ReconcileContext, returnedStatus ReturnedStatus, policy string, err error) (ctrl.Result, error) {
+	updatePhase := func(phase parametersv1alpha1.ParameterPhase, options ...options) (ctrl.Result, error) {
+		return updateConfigPhaseWithResult(rctx.Client, rctx.RequestCtx, rctx.ConfigMap, reconciled(returnedStatus, policy, phase, options...))
 	}
 
 	switch returnedStatus.Status {
-	default:
-		return updateConfigPhaseWithResult(
-			params.Client,
-			params.Ctx,
-			params.ConfigMap,
-			reconciled(returnedStatus, policy.GetPolicyName(), appsv1alpha1.CFailedAndPausePhase,
-				withFailed(core.MakeError("unknown status"), false)),
-		)
 	case ESFailedAndRetry:
-		return updateConfigPhaseWithResult(
-			params.Client,
-			params.Ctx,
-			params.ConfigMap,
-			reconciled(returnedStatus, policy.GetPolicyName(), appsv1alpha1.CFailedPhase,
-				withFailed(err, true)),
-		)
+		return updatePhase(parametersv1alpha1.CFailedPhase, withFailed(err, true))
 	case ESRetry:
-		return updateConfigPhaseWithResult(
-			params.Client,
-			params.Ctx,
-			params.ConfigMap,
-			reconciled(returnedStatus, policy.GetPolicyName(), appsv1alpha1.CUpgradingPhase),
-		)
+		return updatePhase(parametersv1alpha1.CUpgradingPhase)
 	case ESFailed:
-		return updateConfigPhaseWithResult(
-			params.Client,
-			params.Ctx,
-			params.ConfigMap,
-			reconciled(returnedStatus, policy.GetPolicyName(), appsv1alpha1.CFailedAndPausePhase,
-				withFailed(err, false)),
-		)
+		return updatePhase(parametersv1alpha1.CFailedAndPausePhase, withFailed(err, false))
 	case ESNone:
-		params.Ctx.Recorder.Eventf(
-			params.ConfigMap,
-			corev1.EventTypeNormal,
-			appsv1alpha1.ReasonReconfigureSucceed,
-			"the reconfigure[%s] request[%s] has been processed successfully",
-			policy.GetPolicyName(),
-			getOpsRequestID(params.ConfigMap))
-		result := reconciled(returnedStatus, policy.GetPolicyName(), appsv1alpha1.CFinishedPhase)
-		return r.updateConfigCMStatus(params.Ctx, params.ConfigMap, policy.GetPolicyName(), &result)
+		return r.succeed(rctx, policy, returnedStatus)
+	default:
+		return updatePhase(parametersv1alpha1.CFailedAndPausePhase, withFailed(core.MakeError("unknown status"), false))
 	}
 }
 
-func getOpsRequestID(cm *corev1.ConfigMap) string {
-	if len(cm.Annotations) != 0 {
-		return cm.Annotations[constant.LastAppliedOpsCRAnnotationKey]
-	}
-	return ""
+func (r *ReconfigureReconciler) succeed(rctx *ReconcileContext, reloadType string, returnedStatus ReturnedStatus) (ctrl.Result, error) {
+	rctx.Recorder.Eventf(rctx.ConfigMap,
+		corev1.EventTypeNormal,
+		appsv1alpha1.ReasonReconfigureSucceed,
+		"the reconfigure[%s] has been processed successfully",
+		reloadType)
+
+	result := reconciled(returnedStatus, reloadType, parametersv1alpha1.CFinishedPhase)
+	return r.updateConfigCMStatus(rctx.RequestCtx, rctx.ConfigMap, reloadType, &result)
 }
diff --git a/controllers/parameters/reconfigure_policy.go b/controllers/parameters/reconfigure_policy.go
index 8f63c5b99..6d6684ede 100644
--- a/controllers/parameters/reconfigure_policy.go
+++ b/controllers/parameters/reconfigure_policy.go
@@ -29,10 +29,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
-	configmanager "github.com/apecloud/kubeblocks/pkg/configuration/config_manager"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgproto "github.com/apecloud/kubeblocks/pkg/configuration/proto"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
@@ -67,7 +65,7 @@ type ReturnedStatus struct {
 
 type reconfigurePolicy interface {
 	// Upgrade is to enable the configuration to take effect.
-	Upgrade(params reconfigureParams) (ReturnedStatus, error)
+	Upgrade(rctx reconfigureContext) (ReturnedStatus, error)
 
 	// GetPolicyName returns name of policy.
 	GetPolicyName() string
@@ -75,21 +73,27 @@ type reconfigurePolicy interface {
 
 type AutoReloadPolicy struct{}
 
-type reconfigureParams struct {
-	// Only supports restart pod or container.
-	Restart bool
+type reconfigureContext struct {
+	intctrlutil.RequestCtx
+	Client client.Client
+
+	Cluster        *appsv1.Cluster
+	ConfigTemplate appsv1.ComponentTemplateSpec
+
+	// Associated component for cluster.
+	ClusterComponent *appsv1.ClusterComponentSpec
 
-	// Name is a config template name.
-	ConfigSpecName string
+	// Associated component for component and component definition.
+	SynthesizedComponent *component.SynthesizedComponent
 
-	// Configuration files patch.
-	ConfigPatch *core.ConfigPatchInfo
+	// List of InstanceSet using this config template.
+	InstanceSetUnits []workloads.InstanceSet
 
 	// Configmap object of the configuration template instance in the component.
 	ConfigMap *corev1.ConfigMap
 
 	// ConfigConstraint pointer
-	ConfigConstraint *appsv1beta1.ConfigConstraintSpec
+	// ConfigConstraint *appsv1beta1.ConfigConstraintSpec
 
 	// For grpc factory
 	ReconfigureClientFactory createReconfigureClient
@@ -97,19 +101,9 @@ type reconfigureParams struct {
 	// List of containers using this config volume.
 	ContainerNames []string
 
-	Client client.Client
-	Ctx    intctrlutil.RequestCtx
-
-	Cluster *appsv1.Cluster
-
-	// Associated component for cluster.
-	ClusterComponent *appsv1.ClusterComponentSpec
-
-	// Associated component for component and component definition.
-	SynthesizedComponent *component.SynthesizedComponent
-
-	// List of InstanceSet using this config template.
-	InstanceSetUnits []workloads.InstanceSet
+	ConfigDescription *parametersv1alpha1.ComponentConfigDescription
+	ParametersDef     *parametersv1alpha1.ParametersDefinitionSpec
+	UpdatedParameters map[string]string
 }
 
 var (
@@ -124,10 +118,10 @@ var (
 	}
 )
 
-var upgradePolicyMap = map[appsv1alpha1.UpgradePolicy]reconfigurePolicy{}
+var upgradePolicyMap = map[parametersv1alpha1.ReloadPolicy]reconfigurePolicy{}
 
 func init() {
-	RegisterPolicy(appsv1alpha1.AsyncDynamicReloadPolicy, &AutoReloadPolicy{})
+	registerPolicy(parametersv1alpha1.AsyncDynamicReloadPolicy, &AutoReloadPolicy{})
 }
 
 // GetClientFactory support ut mock
@@ -135,21 +129,26 @@ func GetClientFactory() createReconfigureClient {
 	return newGRPCClient
 }
 
-func (param *reconfigureParams) getConfigKey() string {
-	return param.ConfigSpecName
+func (param *reconfigureContext) getConfigKey() string {
+	key := param.ConfigTemplate.Name
+	if param.ConfigDescription != nil && param.ConfigDescription.Name != "" {
+		hash, _ := util.ComputeHash(param.ConfigDescription.Name)
+		key = key + "/" + hash
+	}
+	return key
 }
 
-func (param *reconfigureParams) getTargetVersionHash() string {
+func (param *reconfigureContext) getTargetVersionHash() string {
 	hash, err := util.ComputeHash(param.ConfigMap.Data)
 	if err != nil {
-		param.Ctx.Log.Error(err, "failed to get configuration version!")
+		param.Log.Error(err, "failed to get configuration version!")
 		return ""
 	}
 
 	return hash
 }
 
-func (param *reconfigureParams) maxRollingReplicas() int32 {
+func (param *reconfigureContext) maxRollingReplicas() int32 {
 	var (
 		defaultRolling int32 = 1
 		r              int32
@@ -162,7 +161,7 @@ func (param *reconfigureParams) maxRollingReplicas() int32 {
 
 	var maxUnavailable *intstr.IntOrString
 	for _, its := range param.InstanceSetUnits {
-		if its.Spec.InstanceUpdateStrategy.RollingUpdate != nil {
+		if its.Spec.InstanceUpdateStrategy != nil && its.Spec.InstanceUpdateStrategy.RollingUpdate != nil {
 			maxUnavailable = its.Spec.InstanceUpdateStrategy.RollingUpdate.MaxUnavailable
 		}
 		if maxUnavailable != nil {
@@ -174,10 +173,9 @@ func (param *reconfigureParams) maxRollingReplicas() int32 {
 		return defaultRolling
 	}
 
-	// TODO(xingran&zhangtao): review this logic, set to nil in new API version
 	v, isPercentage, err := intctrlutil.GetIntOrPercentValue(maxUnavailable)
 	if err != nil {
-		param.Ctx.Log.Error(err, "failed to get maxUnavailable!")
+		param.Log.Error(err, "failed to get maxUnavailable!")
 		return defaultRolling
 	}
 
@@ -189,72 +187,29 @@ func (param *reconfigureParams) maxRollingReplicas() int32 {
 	return max(r, defaultRolling)
 }
 
-func (param *reconfigureParams) getTargetReplicas() int {
+func (param *reconfigureContext) getTargetReplicas() int {
 	return int(param.ClusterComponent.Replicas)
 }
 
-func (param *reconfigureParams) podMinReadySeconds() int32 {
+func (param *reconfigureContext) podMinReadySeconds() int32 {
 	minReadySeconds := param.SynthesizedComponent.MinReadySeconds
 	return max(minReadySeconds, viper.GetInt32(constant.PodMinReadySecondsEnv))
 }
 
-func RegisterPolicy(policy appsv1alpha1.UpgradePolicy, action reconfigurePolicy) {
+func registerPolicy(policy parametersv1alpha1.ReloadPolicy, action reconfigurePolicy) {
 	upgradePolicyMap[policy] = action
 }
 
-func (receiver AutoReloadPolicy) Upgrade(params reconfigureParams) (ReturnedStatus, error) {
+func (receiver AutoReloadPolicy) Upgrade(params reconfigureContext) (ReturnedStatus, error) {
 	_ = params
 	return makeReturnedStatus(ESNone), nil
 }
 
 func (receiver AutoReloadPolicy) GetPolicyName() string {
-	return string(appsv1alpha1.AsyncDynamicReloadPolicy)
-}
-
-func NewReconfigurePolicy(cc *appsv1beta1.ConfigConstraintSpec, cfgPatch *core.ConfigPatchInfo, policy appsv1alpha1.UpgradePolicy, restart bool) (reconfigurePolicy, error) {
-	if cfgPatch != nil && !cfgPatch.IsModify {
-		// not walk here
-		return nil, core.MakeError("cfg not modify. [%v]", cfgPatch)
-	}
-
-	// if not specify policy, auto decision reconfiguring policy.
-	if enableAutoDecision(restart, policy) {
-		dynamicUpdate, err := core.IsUpdateDynamicParameters(cc, cfgPatch)
-		if err != nil {
-			return nil, err
-		}
-
-		// make decision
-		switch {
-		case !dynamicUpdate: // static parameters update
-		case configmanager.IsAutoReload(cc.ReloadAction): // if core support hot update, don't need to do anything
-			policy = appsv1alpha1.AsyncDynamicReloadPolicy
-		case enableSyncTrigger(cc.ReloadAction): // sync config-manager exec hot update
-			policy = appsv1alpha1.SyncDynamicReloadPolicy
-		default: // config-manager auto trigger to hot update
-			policy = appsv1alpha1.AsyncDynamicReloadPolicy
-		}
-	}
-
-	// if not specify policy, or cannot decision policy, use default policy.
-	if policy == appsv1alpha1.NonePolicy {
-		policy = appsv1alpha1.NormalPolicy
-		if cc.NeedDynamicReloadAction() && enableSyncTrigger(cc.ReloadAction) {
-			policy = appsv1alpha1.DynamicReloadAndRestartPolicy
-		}
-	}
-
-	if action, ok := upgradePolicyMap[policy]; ok {
-		return action, nil
-	}
-	return nil, core.MakeError("not supported upgrade policy:[%s]", policy)
-}
-
-func enableAutoDecision(restart bool, policy appsv1alpha1.UpgradePolicy) bool {
-	return !restart && policy == appsv1alpha1.NonePolicy
+	return string(parametersv1alpha1.AsyncDynamicReloadPolicy)
 }
 
-func enableSyncTrigger(reloadAction *appsv1beta1.ReloadAction) bool {
+func enableSyncTrigger(reloadAction *parametersv1alpha1.ReloadAction) bool {
 	if reloadAction == nil {
 		return false
 	}
@@ -293,7 +248,7 @@ func makeReturnedStatus(status ExecStatus, ops ...func(status *ReturnedStatus))
 	return ret
 }
 
-func fromWorkloadObjects(params reconfigureParams) []client.Object {
+func fromWorkloadObjects(params reconfigureContext) []client.Object {
 	r := make([]client.Object, 0)
 	for _, unit := range params.InstanceSetUnits {
 		r = append(r, &unit)
diff --git a/controllers/parameters/relatedresource.go b/controllers/parameters/relatedresource.go
index e44a664c1..7f11aa9aa 100644
--- a/controllers/parameters/relatedresource.go
+++ b/controllers/parameters/relatedresource.go
@@ -26,8 +26,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	configctrl "github.com/apecloud/kubeblocks/pkg/controller/configuration"
 	"github.com/apecloud/kubeblocks/pkg/controller/render"
@@ -37,23 +36,21 @@ import (
 type reconfigureRelatedResource struct {
 	ctx        context.Context
 	client     client.Client
-	configSpec *appsv1alpha1.ComponentConfigSpec
+	configSpec *appsv1.ComponentTemplateSpec
 
 	clusterName   string
 	componentName string
 
-	configMapObj        *corev1.ConfigMap
-	configConstraintObj *appsv1beta1.ConfigConstraint
+	configMapObj *corev1.ConfigMap
 }
 
 func prepareRelatedResource(reqCtx intctrlutil.RequestCtx, client client.Client, cm *corev1.ConfigMap) (*reconfigureRelatedResource, error) {
 	configResources := reconfigureRelatedResource{
-		configConstraintObj: &appsv1beta1.ConfigConstraint{},
-		configMapObj:        cm,
-		ctx:                 reqCtx.Ctx,
-		client:              client,
-		clusterName:         cm.Labels[constant.AppInstanceLabelKey],
-		componentName:       cm.Labels[constant.KBAppComponentLabelKey],
+		configMapObj:  cm,
+		ctx:           reqCtx.Ctx,
+		client:        client,
+		clusterName:   cm.Labels[constant.AppInstanceLabelKey],
+		componentName: cm.Labels[constant.KBAppComponentLabelKey],
 	}
 
 	fetcher := configctrl.NewResourceFetcher(&render.ResourceCtx{
@@ -63,35 +60,30 @@ func prepareRelatedResource(reqCtx intctrlutil.RequestCtx, client client.Client,
 		ClusterName:   configResources.clusterName,
 		ComponentName: configResources.componentName,
 	})
-	if fetcher.Configuration(); fetcher.Err != nil {
+	if fetcher.ComponentParameter(); fetcher.Err != nil {
 		return nil, fetcher.Err
 	}
-	if fetcher.ConfigurationObj == nil {
+	if fetcher.ComponentParameterObj == nil {
 		return nil, fmt.Errorf("not found configuration object for configmap: %s", cm.Name)
 	}
-	if err := prepareCC(&configResources, fetcher, cm); err != nil {
+	if err := resolveComponentTemplateSpec(&configResources, fetcher, cm); err != nil {
 		return nil, fetcher.Err
 	}
 	return &configResources, nil
 }
 
-func prepareCC(resources *reconfigureRelatedResource, fetcher *configctrl.Fetcher, cm *corev1.ConfigMap) error {
+func resolveComponentTemplateSpec(resources *reconfigureRelatedResource, fetcher *configctrl.Fetcher, cm *corev1.ConfigMap) error {
 	configSpecName, ok := cm.Labels[constant.CMConfigurationSpecProviderLabelKey]
 	if !ok {
 		return nil
 	}
 
-	configSpec := fetcher.ConfigurationObj.Spec.GetConfigSpec(configSpecName)
+	configSpec := intctrlutil.GetConfigTemplateItem(&fetcher.ComponentParameterObj.Spec, configSpecName)
 	if configSpec == nil {
-		return fmt.Errorf("not found config spec: %s in configuration[%s]", configSpecName, fetcher.ConfigurationObj.Name)
+		return fmt.Errorf("not found config spec: %s in configuration[%s]", configSpecName, fetcher.ComponentParameterObj.Name)
 	}
-	if configSpec.ConfigConstraintRef == "" {
-		return nil
-	}
-	fetcher.ConfigConstraints(configSpec.ConfigConstraintRef)
-	resources.configSpec = configSpec
-	resources.configConstraintObj = fetcher.ConfigConstraintObj
-	return fetcher.Err
+	resources.configSpec = configSpec.ConfigSpec
+	return nil
 }
 
 func (r *reconfigureRelatedResource) componentMatchLabels() map[string]string {
diff --git a/controllers/parameters/simple_policy.go b/controllers/parameters/restart_policy.go
similarity index 59%
rename from controllers/parameters/simple_policy.go
rename to controllers/parameters/restart_policy.go
index 654894488..05d9a46c0 100644
--- a/controllers/parameters/simple_policy.go
+++ b/controllers/parameters/restart_policy.go
@@ -24,48 +24,50 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 )
 
-type simplePolicy struct {
-}
+var restartPolicyInstance = &restartPolicy{}
+
+type restartPolicy struct{}
 
 func init() {
-	RegisterPolicy(appsv1alpha1.NormalPolicy, &simplePolicy{})
+	registerPolicy(parametersv1alpha1.RestartPolicy, restartPolicyInstance)
 }
 
-func (s *simplePolicy) Upgrade(params reconfigureParams) (ReturnedStatus, error) {
-	params.Ctx.Log.V(1).Info("simple policy begin....")
+func (s *restartPolicy) Upgrade(rctx reconfigureContext) (ReturnedStatus, error) {
+	rctx.Log.V(1).Info("simple policy begin....")
 
-	return restartAndCheckComponent(params, GetInstanceSetRollingUpgradeFuncs(), fromWorkloadObjects(params))
+	return restartAndVerifyComponent(rctx, GetInstanceSetRollingUpgradeFuncs(), fromWorkloadObjects(rctx))
 }
 
-func (s *simplePolicy) GetPolicyName() string {
-	return string(appsv1alpha1.NormalPolicy)
+func (s *restartPolicy) GetPolicyName() string {
+	return string(parametersv1alpha1.RestartPolicy)
 }
 
-func restartAndCheckComponent(param reconfigureParams, funcs RollingUpgradeFuncs, objs []client.Object) (ReturnedStatus, error) {
+func restartAndVerifyComponent(rctx reconfigureContext, funcs RollingUpgradeFuncs, objs []client.Object) (ReturnedStatus, error) {
 	var (
-		newVersion = param.getTargetVersionHash()
-		configKey  = param.getConfigKey()
+		newVersion = rctx.getTargetVersionHash()
+		configKey  = rctx.getConfigKey()
 
 		retStatus = ESRetry
 		progress  = core.NotStarted
 	)
 
 	recordEvent := func(obj client.Object) {
-		param.Ctx.Recorder.Eventf(obj,
+		rctx.Recorder.Eventf(obj,
 			corev1.EventTypeNormal, appsv1alpha1.ReasonReconfigureRestart,
-			"restarting component[%s] in cluster[%s], version: %s", param.ClusterComponent.Name, param.Cluster.Name, newVersion)
+			"restarting component[%s] in cluster[%s], version: %s", rctx.ClusterComponent.Name, rctx.Cluster.Name, newVersion)
 	}
-	if obj, err := funcs.RestartComponent(param.Client, param.Ctx, configKey, newVersion, objs, recordEvent); err != nil {
-		param.Ctx.Recorder.Eventf(obj,
+	if obj, err := funcs.RestartComponent(rctx.Client, rctx.RequestCtx, configKey, newVersion, objs, recordEvent); err != nil {
+		rctx.Recorder.Eventf(obj,
 			corev1.EventTypeWarning, appsv1alpha1.ReasonReconfigureRestartFailed,
-			"failed to  restart component[%s] in cluster[%s], version: %s", client.ObjectKeyFromObject(obj), param.Cluster.Name, newVersion)
+			"failed to  restart component[%s] in cluster[%s], version: %s", client.ObjectKeyFromObject(obj), rctx.Cluster.Name, newVersion)
 		return makeReturnedStatus(ESFailedAndRetry), err
 	}
 
-	pods, err := funcs.GetPodsFunc(param)
+	pods, err := funcs.GetPodsFunc(rctx)
 	if err != nil {
 		return makeReturnedStatus(ESFailedAndRetry), err
 	}
diff --git a/controllers/parameters/revision.go b/controllers/parameters/revision.go
index d30fd47ce..58b5f0716 100644
--- a/controllers/parameters/revision.go
+++ b/controllers/parameters/revision.go
@@ -27,7 +27,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
@@ -36,7 +36,7 @@ import (
 type ConfigurationRevision struct {
 	Revision    int64
 	StrRevision string
-	Phase       appsv1alpha1.ConfigurationPhase
+	Phase       parametersv1alpha1.ParameterPhase
 	Result      intctrlutil.Result
 }
 
@@ -115,7 +115,7 @@ func parseResult(data string, revision string) intctrlutil.Result {
 	}
 	err := json.Unmarshal([]byte(data), &result)
 	if err != nil {
-		result.Phase = appsv1alpha1.ConfigurationPhase(data)
+		result.Phase = parametersv1alpha1.ParameterPhase(data)
 	}
 	return result
 }
diff --git a/controllers/parameters/rolling_upgrade_policy.go b/controllers/parameters/rolling_upgrade_policy.go
index f2b55e499..92acea8b2 100644
--- a/controllers/parameters/rolling_upgrade_policy.go
+++ b/controllers/parameters/rolling_upgrade_policy.go
@@ -21,103 +21,93 @@ package parameters
 
 import (
 	"context"
-	"os"
+	"log"
 
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	podutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 	viper "github.com/apecloud/kubeblocks/pkg/viperx"
 )
 
 const (
-	// StatefulSetSpec.Spec.MinReadySeconds
-	// units: s
 	defaultMinReadySeconds = 10
 )
 
-type rollingUpgradePolicy struct {
-}
+var rollingUpgradePolicyInstance = &rollingUpgradePolicy{}
+
+type rollingUpgradePolicy struct{}
 
 func init() {
-	RegisterPolicy(appsv1alpha1.RollingPolicy, &rollingUpgradePolicy{})
+	registerPolicy(parametersv1alpha1.RollingPolicy, rollingUpgradePolicyInstance)
 	if err := viper.BindEnv(constant.PodMinReadySecondsEnv); err != nil {
-		os.Exit(-1)
+		log.Fatalf("failed to bind environment variable: %v", err)
 	}
 	viper.SetDefault(constant.PodMinReadySecondsEnv, defaultMinReadySeconds)
 }
 
-func (r *rollingUpgradePolicy) Upgrade(params reconfigureParams) (ReturnedStatus, error) {
-	return performRollingUpgrade(params, GetInstanceSetRollingUpgradeFuncs())
+// Upgrade performs a rolling upgrade based on the provided parameters.
+func (r *rollingUpgradePolicy) Upgrade(rctx reconfigureContext) (ReturnedStatus, error) {
+	return performRollingUpgrade(rctx, GetInstanceSetRollingUpgradeFuncs())
 }
 
 func (r *rollingUpgradePolicy) GetPolicyName() string {
-	return string(appsv1alpha1.RollingPolicy)
+	return string(parametersv1alpha1.RollingPolicy)
 }
 
-func canPerformUpgrade(pods []corev1.Pod, params reconfigureParams) bool {
-	target := params.getTargetReplicas()
-	// TODO(xingran&zhangtao): review this logic
-	return len(pods) == target
-
-	/*
-		if len(pods) < target {
-			params.Ctx.Log.Info(fmt.Sprintf("component pods are not all ready, %d pods are ready, which is less than the expected replicas(%d).", len(pods), target))
-			return false
-		}
-		return true
-	*/
+func canPerformUpgrade(pods []corev1.Pod, params reconfigureContext) bool {
+	return len(pods) == params.getTargetReplicas()
 }
 
-func performRollingUpgrade(params reconfigureParams, funcs RollingUpgradeFuncs) (ReturnedStatus, error) {
-	pods, err := funcs.GetPodsFunc(params)
+func performRollingUpgrade(rctx reconfigureContext, funcs RollingUpgradeFuncs) (ReturnedStatus, error) {
+	pods, err := funcs.GetPodsFunc(rctx)
 	if err != nil {
 		return makeReturnedStatus(ESFailedAndRetry), err
 	}
 
 	var (
-		rollingReplicas = params.maxRollingReplicas()
-		configKey       = params.getConfigKey()
-		configVersion   = params.getTargetVersionHash()
+		rollingReplicas = rctx.maxRollingReplicas()
+		configKey       = rctx.getConfigKey()
+		configVersion   = rctx.getTargetVersionHash()
 	)
 
-	if !canPerformUpgrade(pods, params) {
+	if !canPerformUpgrade(pods, rctx) {
 		return makeReturnedStatus(ESRetry), nil
 	}
 
-	podStats := staticPodStats(pods, params.getTargetReplicas(), params.podMinReadySeconds())
-	podWins := markDynamicCursor(pods, podStats, configKey, configVersion, rollingReplicas)
-	if !validPodState(podWins) {
-		params.Ctx.Log.Info("wait for pod stat ready.")
+	podStatus := classifyPodByStats(pods, rctx.getTargetReplicas(), rctx.podMinReadySeconds())
+	updateWindow := markDynamicSwitchWindow(pods, podStatus, configKey, configVersion, rollingReplicas)
+	if !canSafeUpdatePods(updateWindow) {
+		rctx.Log.Info("wait for pod stat ready.")
 		return makeReturnedStatus(ESRetry), nil
 	}
 
-	waitRollingPods := podWins.getWaitRollingPods()
-	if len(waitRollingPods) == 0 {
-		return makeReturnedStatus(ESNone, withSucceed(int32(podStats.targetReplica)), withExpected(int32(podStats.targetReplica))), nil
+	podsToUpgrade := updateWindow.getPendingUpgradePods()
+	if len(podsToUpgrade) == 0 {
+		return makeReturnedStatus(ESNone, withSucceed(int32(podStatus.targetReplica)), withExpected(int32(podStatus.targetReplica))), nil
 	}
 
-	for _, pod := range waitRollingPods {
-		if podStats.isUpdating(&pod) {
-			params.Ctx.Log.Info("pod is in rolling update.", "pod name", pod.Name)
+	for _, pod := range podsToUpgrade {
+		if podStatus.isUpdating(&pod) {
+			rctx.Log.Info("pod is in rolling update.", "pod name", pod.Name)
 			continue
 		}
-		if err := funcs.RestartContainerFunc(&pod, params.Ctx.Ctx, params.ContainerNames, params.ReconfigureClientFactory); err != nil {
+		if err := funcs.RestartContainerFunc(&pod, rctx.Ctx, rctx.ContainerNames, rctx.ReconfigureClientFactory); err != nil {
 			return makeReturnedStatus(ESFailedAndRetry), err
 		}
-		if err := updatePodLabelsWithConfigVersion(&pod, configKey, configVersion, params.Client, params.Ctx.Ctx); err != nil {
+		if err := updatePodLabelsWithConfigVersion(&pod, configKey, configVersion, rctx.Client, rctx.Ctx); err != nil {
 			return makeReturnedStatus(ESFailedAndRetry), err
 		}
 	}
 
 	return makeReturnedStatus(ESRetry,
-		withExpected(int32(podStats.targetReplica)),
-		withSucceed(int32(len(podStats.updated)+len(podStats.updating)))), nil
+		withExpected(int32(podStatus.targetReplica)),
+		withSucceed(int32(len(podStatus.updated)+len(podStatus.updating)))), nil
 }
 
-func validPodState(wind switchWindow) bool {
+func canSafeUpdatePods(wind switchWindow) bool {
 	for i := 0; i < wind.begin; i++ {
 		pod := &wind.pods[i]
 		if !wind.isReady(pod) {
@@ -127,7 +117,7 @@ func validPodState(wind switchWindow) bool {
 	return true
 }
 
-func markDynamicCursor(pods []corev1.Pod, podsStats *componentPodStats, configKey, currentVersion string, rollingReplicas int32) switchWindow {
+func markDynamicSwitchWindow(pods []corev1.Pod, podsStats *componentPodStats, configKey, currentVersion string, rollingReplicas int32) switchWindow {
 	podWindows := switchWindow{
 		end:               0,
 		begin:             len(pods),
@@ -135,7 +125,6 @@ func markDynamicCursor(pods []corev1.Pod, podsStats *componentPodStats, configKe
 		componentPodStats: podsStats,
 	}
 
-	// find update last
 	for i := podsStats.targetReplica - 1; i >= 0; i-- {
 		pod := &pods[i]
 		if !podutil.IsMatchConfigVersion(pod, configKey, currentVersion) {
@@ -160,7 +149,7 @@ func markDynamicCursor(pods []corev1.Pod, podsStats *componentPodStats, configKe
 	return podWindows
 }
 
-func staticPodStats(pods []corev1.Pod, targetReplicas int, minReadySeconds int32) *componentPodStats {
+func classifyPodByStats(pods []corev1.Pod, targetReplicas int, minReadySeconds int32) *componentPodStats {
 	podsStats := &componentPodStats{
 		updated:       make(map[string]*corev1.Pod),
 		updating:      make(map[string]*corev1.Pod),
@@ -183,15 +172,10 @@ func staticPodStats(pods []corev1.Pod, targetReplicas int, minReadySeconds int32
 }
 
 type componentPodStats struct {
-	// failed to start pod
-	ready     map[string]*corev1.Pod
-	available map[string]*corev1.Pod
-
-	// updated pod count
-	updated  map[string]*corev1.Pod
-	updating map[string]*corev1.Pod
-
-	// expected pod
+	ready         map[string]*corev1.Pod
+	available     map[string]*corev1.Pod
+	updated       map[string]*corev1.Pod
+	updating      map[string]*corev1.Pod
 	targetReplica int
 }
 
@@ -213,12 +197,11 @@ func (s *componentPodStats) isUpdating(pod *corev1.Pod) bool {
 type switchWindow struct {
 	begin int
 	end   int
-
-	pods []corev1.Pod
+	pods  []corev1.Pod
 	*componentPodStats
 }
 
-func (w *switchWindow) getWaitRollingPods() []corev1.Pod {
+func (w *switchWindow) getPendingUpgradePods() []corev1.Pod {
 	return w.pods[w.begin:w.end]
 }
 
diff --git a/controllers/parameters/sync_upgrade_policy.go b/controllers/parameters/sync_upgrade_policy.go
index a5cad557c..175e3319a 100644
--- a/controllers/parameters/sync_upgrade_policy.go
+++ b/controllers/parameters/sync_upgrade_policy.go
@@ -26,40 +26,35 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
 
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	podutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
 
-type syncPolicy struct {
-}
+var syncPolicyInstance = &syncPolicy{}
+
+type syncPolicy struct{}
 
 func init() {
-	RegisterPolicy(appsv1alpha1.SyncDynamicReloadPolicy, &syncPolicy{})
+	registerPolicy(parametersv1alpha1.SyncDynamicReloadPolicy, syncPolicyInstance)
 }
 
 func (o *syncPolicy) GetPolicyName() string {
-	return string(appsv1alpha1.SyncDynamicReloadPolicy)
+	return string(parametersv1alpha1.SyncDynamicReloadPolicy)
 }
 
-func (o *syncPolicy) Upgrade(params reconfigureParams) (ReturnedStatus, error) {
-	configPatch := params.ConfigPatch
-	if !configPatch.IsModify {
-		return makeReturnedStatus(ESNone), nil
-	}
-
-	updatedParameters := getOnlineUpdateParams(configPatch, params.ConfigConstraint)
+func (o *syncPolicy) Upgrade(rctx reconfigureContext) (ReturnedStatus, error) {
+	updatedParameters := rctx.UpdatedParameters
 	if len(updatedParameters) == 0 {
 		return makeReturnedStatus(ESNone), nil
 	}
 
 	funcs := GetInstanceSetRollingUpgradeFuncs()
-	pods, err := funcs.GetPodsFunc(params)
+	pods, err := funcs.GetPodsFunc(rctx)
 	if err != nil {
 		return makeReturnedStatus(ESFailedAndRetry), err
 	}
-	return sync(params, updatedParameters, pods, funcs)
+	return sync(rctx, updatedParameters, pods, funcs)
 }
 
 func matchLabel(pods []corev1.Pod, selector *metav1.LabelSelector) ([]corev1.Pod, error) {
@@ -77,18 +72,19 @@ func matchLabel(pods []corev1.Pod, selector *metav1.LabelSelector) ([]corev1.Pod
 	return result, nil
 }
 
-func sync(params reconfigureParams, updatedParameters map[string]string, pods []corev1.Pod, funcs RollingUpgradeFuncs) (ReturnedStatus, error) {
+func sync(rctx reconfigureContext, updatedParameters map[string]string, pods []corev1.Pod, funcs RollingUpgradeFuncs) (ReturnedStatus, error) {
 	var (
 		r        = ESNone
 		total    = int32(len(pods))
-		replicas = int32(params.getTargetReplicas())
+		replicas = int32(rctx.getTargetReplicas())
 		progress = core.NotStarted
 
 		err         error
-		ctx         = params.Ctx.Ctx
-		configKey   = params.getConfigKey()
-		versionHash = params.getTargetVersionHash()
-		selector    = params.ConfigConstraint.GetPodSelector()
+		ctx         = rctx.Ctx
+		configKey   = rctx.getConfigKey()
+		versionHash = rctx.getTargetVersionHash()
+		selector    = intctrlutil.GetPodSelector(rctx.ParametersDef)
+		fileName    string
 	)
 
 	if selector != nil {
@@ -98,26 +94,27 @@ func sync(params reconfigureParams, updatedParameters map[string]string, pods []
 		return makeReturnedStatus(ESFailedAndRetry), err
 	}
 	if len(pods) == 0 {
-		params.Ctx.Log.Info(fmt.Sprintf("no pods to update, and retry, selector: %v", selector))
+		rctx.Log.Info(fmt.Sprintf("no pods to update, and retry, selector: %v", selector))
 		return makeReturnedStatus(ESRetry), nil
 	}
+	if rctx.ConfigDescription != nil {
+		fileName = rctx.ConfigDescription.Name
+	}
 
 	requireUpdatedCount := int32(len(pods))
 	for _, pod := range pods {
-		params.Ctx.Log.V(1).Info(fmt.Sprintf("sync pod: %s", pod.Name))
-		if podutil.IsMatchConfigVersion(&pod, configKey, versionHash) {
+		rctx.Log.V(1).Info(fmt.Sprintf("sync pod: %s", pod.Name))
+		if intctrlutil.IsMatchConfigVersion(&pod, configKey, versionHash) {
 			progress++
 			continue
 		}
-		if !podutil.PodIsReady(&pod) {
+		if !intctrlutil.PodIsReady(&pod) {
 			continue
 		}
-		err = funcs.OnlineUpdatePodFunc(&pod, ctx, params.ReconfigureClientFactory, params.ConfigSpecName, updatedParameters)
-		if err != nil {
+		if err = funcs.OnlineUpdatePodFunc(&pod, ctx, rctx.ReconfigureClientFactory, rctx.ConfigTemplate.Name, fileName, updatedParameters); err != nil {
 			return makeReturnedStatus(ESFailedAndRetry), err
 		}
-		err = updatePodLabelsWithConfigVersion(&pod, configKey, versionHash, params.Client, ctx)
-		if err != nil {
+		if err = updatePodLabelsWithConfigVersion(&pod, configKey, versionHash, rctx.Client, ctx); err != nil {
 			return makeReturnedStatus(ESFailedAndRetry), err
 		}
 		progress++
@@ -128,23 +125,3 @@ func sync(params reconfigureParams, updatedParameters map[string]string, pods []
 	}
 	return makeReturnedStatus(r, withExpected(requireUpdatedCount), withSucceed(progress)), nil
 }
-
-func getOnlineUpdateParams(configPatch *core.ConfigPatchInfo, cc *appsv1beta1.ConfigConstraintSpec) map[string]string {
-	r := make(map[string]string)
-	dynamicAction := cc.NeedDynamicReloadAction()
-	needReloadStaticParameters := cc.ReloadStaticParameters()
-	parameters := core.GenerateVisualizedParamsList(configPatch, cc.FileFormatConfig, nil)
-	for _, key := range parameters {
-		if key.UpdateType == core.UpdatedType {
-			for _, p := range key.Parameters {
-				if dynamicAction && !needReloadStaticParameters && !core.IsDynamicParameter(p.Key, cc) {
-					continue
-				}
-				if p.Value != nil {
-					r[p.Key] = *p.Value
-				}
-			}
-		}
-	}
-	return r
-}
diff --git a/controllers/parameters/types.go b/controllers/parameters/types.go
index 9674b9fb2..f20a04973 100644
--- a/controllers/parameters/types.go
+++ b/controllers/parameters/types.go
@@ -31,11 +31,11 @@ import (
 
 type createReconfigureClient func(addr string) (cfgproto.ReconfigureClient, error)
 
-type GetPodsFunc func(params reconfigureParams) ([]corev1.Pod, error)
+type GetPodsFunc func(params reconfigureContext) ([]corev1.Pod, error)
 type RestartComponent func(client client.Client, ctx intctrlutil.RequestCtx, key string, version string, objs []client.Object, recordEvent func(obj client.Object)) (client.Object, error)
 
 type RestartContainerFunc func(pod *corev1.Pod, ctx context.Context, containerName []string, createConnFn createReconfigureClient) error
-type OnlineUpdatePodFunc func(pod *corev1.Pod, ctx context.Context, createClient createReconfigureClient, configSpec string, updatedParams map[string]string) error
+type OnlineUpdatePodFunc func(pod *corev1.Pod, ctx context.Context, createClient createReconfigureClient, configSpec string, configFile string, updatedParams map[string]string) error
 
 // Node: Distinguish between implementation and interface.
 
diff --git a/controllers/trace/reconciler_tree.go b/controllers/trace/reconciler_tree.go
index 51110121b..d182c12ad 100644
--- a/controllers/trace/reconciler_tree.go
+++ b/controllers/trace/reconciler_tree.go
@@ -41,8 +41,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	tracev1 "github.com/apecloud/kubeblocks/apis/trace/v1"
 	workloadsAPI "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	"github.com/apecloud/kubeblocks/controllers/apps/cluster"
@@ -65,24 +65,24 @@ type ReconcilerTree interface {
 type reconcilerFunc func(client.Client, record.EventRecorder) reconcile.Reconciler
 
 var reconcilerFuncMap = map[tracev1.ObjectType]reconcilerFunc{
-	objectType(kbappsv1.SchemeGroupVersion.String(), kbappsv1.ClusterKind):             newClusterReconciler,
-	objectType(kbappsv1.SchemeGroupVersion.String(), kbappsv1.ComponentKind):           newComponentReconciler,
-	objectType(corev1.SchemeGroupVersion.String(), constant.SecretKind):                newSecretReconciler,
-	objectType(corev1.SchemeGroupVersion.String(), constant.ServiceKind):               newServiceReconciler,
-	objectType(workloadsAPI.SchemeGroupVersion.String(), workloadsAPI.InstanceSetKind): newInstanceSetReconciler,
-	objectType(corev1.SchemeGroupVersion.String(), constant.ConfigMapKind):             newConfigMapReconciler,
-	objectType(corev1.SchemeGroupVersion.String(), constant.PersistentVolumeClaimKind): newPVCReconciler,
-	objectType(rbacv1.SchemeGroupVersion.String(), constant.RoleBindingKind):           newRoleBindingReconciler,
-	objectType(corev1.SchemeGroupVersion.String(), constant.ServiceAccountKind):        newSAReconciler,
-	objectType(batchv1.SchemeGroupVersion.String(), constant.JobKind):                  newJobReconciler,
-	objectType(dpv1alpha1.SchemeGroupVersion.String(), types.BackupKind):               newBackupReconciler,
-	objectType(dpv1alpha1.SchemeGroupVersion.String(), types.RestoreKind):              newRestoreReconciler,
-	objectType(appsv1alpha1.SchemeGroupVersion.String(), constant.ConfigurationKind):   newConfigurationReconciler,
-	objectType(corev1.SchemeGroupVersion.String(), constant.PodKind):                   newPodReconciler,
-	objectType(appsv1.SchemeGroupVersion.String(), constant.StatefulSetKind):           newSTSReconciler,
-	objectType(vsv1.SchemeGroupVersion.String(), constant.VolumeSnapshotKind):          newVolumeSnapshotV1Reconciler,
-	objectType(vsv1beta1.SchemeGroupVersion.String(), constant.VolumeSnapshotKind):     newVolumeSnapshotV1Beta1Reconciler,
-	objectType(corev1.SchemeGroupVersion.String(), constant.PersistentVolumeKind):      newPVReconciler,
+	objectType(kbappsv1.SchemeGroupVersion.String(), kbappsv1.ClusterKind):                      newClusterReconciler,
+	objectType(kbappsv1.SchemeGroupVersion.String(), kbappsv1.ComponentKind):                    newComponentReconciler,
+	objectType(corev1.SchemeGroupVersion.String(), constant.SecretKind):                         newSecretReconciler,
+	objectType(corev1.SchemeGroupVersion.String(), constant.ServiceKind):                        newServiceReconciler,
+	objectType(workloadsAPI.SchemeGroupVersion.String(), workloadsAPI.InstanceSetKind):          newInstanceSetReconciler,
+	objectType(corev1.SchemeGroupVersion.String(), constant.ConfigMapKind):                      newConfigMapReconciler,
+	objectType(corev1.SchemeGroupVersion.String(), constant.PersistentVolumeClaimKind):          newPVCReconciler,
+	objectType(rbacv1.SchemeGroupVersion.String(), constant.RoleBindingKind):                    newRoleBindingReconciler,
+	objectType(corev1.SchemeGroupVersion.String(), constant.ServiceAccountKind):                 newSAReconciler,
+	objectType(batchv1.SchemeGroupVersion.String(), constant.JobKind):                           newJobReconciler,
+	objectType(dpv1alpha1.SchemeGroupVersion.String(), types.BackupKind):                        newBackupReconciler,
+	objectType(dpv1alpha1.SchemeGroupVersion.String(), types.RestoreKind):                       newRestoreReconciler,
+	objectType(parametersv1alpha1.SchemeGroupVersion.String(), constant.ComponentParameterKind): newConfigurationReconciler,
+	objectType(corev1.SchemeGroupVersion.String(), constant.PodKind):                            newPodReconciler,
+	objectType(appsv1.SchemeGroupVersion.String(), constant.StatefulSetKind):                    newSTSReconciler,
+	objectType(vsv1.SchemeGroupVersion.String(), constant.VolumeSnapshotKind):                   newVolumeSnapshotV1Reconciler,
+	objectType(vsv1beta1.SchemeGroupVersion.String(), constant.VolumeSnapshotKind):              newVolumeSnapshotV1Beta1Reconciler,
+	objectType(corev1.SchemeGroupVersion.String(), constant.PersistentVolumeKind):               newPVReconciler,
 }
 
 type reconcilerTree struct {
@@ -179,7 +179,7 @@ func newComponentReconciler(cli client.Client, recorder record.EventRecorder) re
 }
 
 func newConfigurationReconciler(cli client.Client, recorder record.EventRecorder) reconcile.Reconciler {
-	return &parameters.ConfigurationReconciler{
+	return &parameters.ComponentParameterReconciler{
 		Client:   cli,
 		Scheme:   cli.Scheme(),
 		Recorder: recorder,
diff --git a/controllers/trace/type.go b/controllers/trace/type.go
index 83278f973..408acedbf 100644
--- a/controllers/trace/type.go
+++ b/controllers/trace/type.go
@@ -39,8 +39,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	tracev1 "github.com/apecloud/kubeblocks/apis/trace/v1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	"github.com/apecloud/kubeblocks/pkg/constant"
@@ -159,7 +159,7 @@ var (
 					Criteria:  componentCriteria,
 				},
 				{
-					Secondary: objectType(appsv1alpha1.SchemeGroupVersion.String(), constant.ConfigurationKind),
+					Secondary: objectType(parametersv1alpha1.SchemeGroupVersion.String(), constant.ComponentParameterKind),
 					Criteria:  componentCriteria,
 				},
 			},
@@ -186,7 +186,7 @@ var (
 			},
 		},
 		{
-			Primary: objectType(kbappsv1.SchemeGroupVersion.String(), constant.ConfigurationKind),
+			Primary: objectType(parametersv1alpha1.SchemeGroupVersion.String(), constant.ComponentParameterKind),
 			OwnedResources: []OwnedResource{
 				{
 					Secondary: objectType(corev1.SchemeGroupVersion.String(), constant.ConfigMapKind),
diff --git a/deploy/helm/config/rbac/role.yaml b/deploy/helm/config/rbac/role.yaml
index c098dd825..1a3635c7b 100644
--- a/deploy/helm/config/rbac/role.yaml
+++ b/deploy/helm/config/rbac/role.yaml
@@ -175,58 +175,6 @@ rules:
   - get
   - patch
   - update
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configconstraints
-  verbs:
-  - create
-  - delete
-  - get
-  - list
-  - patch
-  - update
-  - watch
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configconstraints/finalizers
-  verbs:
-  - update
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configconstraints/status
-  verbs:
-  - get
-  - patch
-  - update
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configurations
-  verbs:
-  - create
-  - delete
-  - get
-  - list
-  - patch
-  - update
-  - watch
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configurations/finalizers
-  verbs:
-  - update
-- apiGroups:
-  - apps.kubeblocks.io
-  resources:
-  - configurations/status
-  verbs:
-  - get
-  - patch
-  - update
 - apiGroups:
   - apps.kubeblocks.io
   resources:
@@ -863,6 +811,32 @@ rules:
   - get
   - patch
   - update
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - componentparameters
+  verbs:
+  - create
+  - delete
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - componentparameters/finalizers
+  verbs:
+  - update
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - componentparameters/status
+  verbs:
+  - get
+  - patch
+  - update
 - apiGroups:
   - parameters.kubeblocks.io
   resources:
@@ -889,6 +863,32 @@ rules:
   - get
   - patch
   - update
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - parameters
+  verbs:
+  - create
+  - delete
+  - get
+  - list
+  - patch
+  - update
+  - watch
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - parameters/finalizers
+  verbs:
+  - update
+- apiGroups:
+  - parameters.kubeblocks.io
+  resources:
+  - parameters/status
+  verbs:
+  - get
+  - patch
+  - update
 - apiGroups:
   - parameters.kubeblocks.io
   resources:
diff --git a/deploy/helm/crds/apps.kubeblocks.io_componentdefinitions.yaml b/deploy/helm/crds/apps.kubeblocks.io_componentdefinitions.yaml
index 6cca3b425..ef1cbc513 100644
--- a/deploy/helm/crds/apps.kubeblocks.io_componentdefinitions.yaml
+++ b/deploy/helm/crds/apps.kubeblocks.io_componentdefinitions.yaml
@@ -4233,36 +4233,6 @@ spec:
                   This field is immutable.
                 items:
                   properties:
-                    asEnvFrom:
-                      description: |-
-                        Specifies the containers to inject the ConfigMap parameters as environment variables.
-
-
-                        This is useful when application images accept parameters through environment variables and
-                        generate the final configuration file in the startup script based on these variables.
-
-
-                        This field allows users to specify a list of container names, and KubeBlocks will inject the environment
-                        variables converted from the ConfigMap into these designated containers. This provides a flexible way to
-                        pass the configuration items from the ConfigMap to the container without modifying the image.
-
-
-                        Deprecated: `asEnvFrom` has been deprecated since 0.9.0 and will be removed in 0.10.0.
-                        Use `injectEnvTo` instead.
-                      items:
-                        type: string
-                      type: array
-                      x-kubernetes-list-type: set
-                    asSecret:
-                      description: Whether to store the final rendered parameters
-                        as a secret.
-                      type: boolean
-                    constraintRef:
-                      description: Specifies the name of the referenced configuration
-                        constraints object.
-                      maxLength: 63
-                      pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
-                      type: string
                     defaultMode:
                       description: |-
                         The operator attempts to set default file permissions for scripts (0555) and configurations (0444).
@@ -4283,40 +4253,6 @@ spec:
                         Refers to documents of k8s.ConfigMapVolumeSource.defaultMode for more information.
                       format: int32
                       type: integer
-                    injectEnvTo:
-                      description: |-
-                        Specifies the containers to inject the ConfigMap parameters as environment variables.
-
-
-                        This is useful when application images accept parameters through environment variables and
-                        generate the final configuration file in the startup script based on these variables.
-
-
-                        This field allows users to specify a list of container names, and KubeBlocks will inject the environment
-                        variables converted from the ConfigMap into these designated containers. This provides a flexible way to
-                        pass the configuration items from the ConfigMap to the container without modifying the image.
-                      items:
-                        type: string
-                      type: array
-                      x-kubernetes-list-type: set
-                    keys:
-                      description: |-
-                        Specifies the configuration files within the ConfigMap that support dynamic updates.
-
-
-                        A configuration template (provided in the form of a ConfigMap) may contain templates for multiple
-                        configuration files.
-                        Each configuration file corresponds to a key in the ConfigMap.
-                        Some of these configuration files may support dynamic modification and reloading without requiring
-                        a pod restart.
-
-
-                        If empty or omitted, all configuration files in the ConfigMap are assumed to support dynamic updates,
-                        and ConfigConstraint applies to all keys.
-                      items:
-                        type: string
-                      type: array
-                      x-kubernetes-list-type: set
                     name:
                       description: Specifies the name of the configuration template.
                       maxLength: 63
@@ -4330,28 +4266,6 @@ spec:
                       maxLength: 63
                       pattern: ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$
                       type: string
-                    reRenderResourceTypes:
-                      description: |-
-                        Specifies whether the configuration needs to be re-rendered after v-scale or h-scale operations to reflect changes.
-
-
-                        In some scenarios, the configuration may need to be updated to reflect the changes in resource allocation
-                        or cluster topology. Examples:
-
-
-                        - Redis: adjust maxmemory after v-scale operation.
-                        - MySQL: increase max connections after v-scale operation.
-                        - Zookeeper: update zoo.cfg with new node addresses after h-scale operation.
-                      items:
-                        description: RerenderResourceType defines the resource requirements
-                          for a component.
-                        enum:
-                        - vscale
-                        - hscale
-                        - tls
-                        type: string
-                      type: array
-                      x-kubernetes-list-type: set
                     templateRef:
                       description: Specifies the name of the referenced configuration
                         template ConfigMap object.
diff --git a/deploy/helm/crds/operations.kubeblocks.io_opsrequests.yaml b/deploy/helm/crds/operations.kubeblocks.io_opsrequests.yaml
index e099379a5..01c0bd11a 100755
--- a/deploy/helm/crds/operations.kubeblocks.io_opsrequests.yaml
+++ b/deploy/helm/crds/operations.kubeblocks.io_opsrequests.yaml
@@ -2331,89 +2331,28 @@ spec:
                       description: Specifies the name of the Component as defined
                         in the cluster.spec
                       type: string
-                    configurations:
+                    parameters:
                       description: |-
-                        Contains a list of ConfigurationItem objects, specifying the Component's configuration template name,
-                        upgrade policy, and parameter key-value pairs to be updated.
+                        Specifies a list of key-value pairs representing parameters and their corresponding values
+                        within a single configuration file.
+                        This field is used to override or set the values of parameters without modifying the entire configuration file.
                       items:
                         properties:
-                          keys:
-                            description: |-
-                              Sets the configuration files and their associated parameters that need to be updated.
-                              It should contain at least one item.
-                            items:
-                              properties:
-                                fileContent:
-                                  description: |-
-                                    Specifies the content of the entire configuration file.
-                                    This field is used to update the complete configuration file.
-
-
-                                    Either the `parameters` field or the `fileContent` field must be set, but not both.
-                                  type: string
-                                key:
-                                  description: |-
-                                    Represents a key in the configuration template(as ConfigMap).
-                                    Each key in the ConfigMap corresponds to a specific configuration file.
-                                  type: string
-                                parameters:
-                                  description: |-
-                                    Specifies a list of key-value pairs representing parameters and their corresponding values
-                                    within a single configuration file.
-                                    This field is used to override or set the values of parameters without modifying the entire configuration file.
-
-
-                                    Either the `parameters` field or the `fileContent` field must be set, but not both.
-                                  items:
-                                    properties:
-                                      key:
-                                        description: Represents the name of the parameter
-                                          that is to be updated.
-                                        type: string
-                                      value:
-                                        description: |-
-                                          Represents the parameter values that are to be updated.
-                                          If set to nil, the parameter defined by the Key field will be removed from the configuration file.
-                                        type: string
-                                    required:
-                                    - key
-                                    type: object
-                                  type: array
-                              required:
-                              - key
-                              type: object
-                            minItems: 1
-                            type: array
-                            x-kubernetes-list-map-keys:
-                            - key
-                            x-kubernetes-list-type: map
-                          name:
-                            description: Specifies the name of the configuration template.
-                            maxLength: 63
-                            pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
+                          key:
+                            description: Represents the name of the parameter that
+                              is to be updated.
                             type: string
-                          policy:
-                            description: Defines the upgrade policy for the configuration.
-                            enum:
-                            - simple
-                            - parallel
-                            - rolling
-                            - autoReload
-                            - operatorSyncUpdate
-                            - dynamicReloadBeginRestart
+                          value:
+                            description: |-
+                              Represents the parameter values that are to be updated.
+                              If set to nil, the parameter defined by the Key field will be removed from the configuration file.
                             type: string
                         required:
-                        - keys
-                        - name
+                        - key
                         type: object
-                      minItems: 1
                       type: array
-                      x-kubernetes-list-map-keys:
-                      - name
-                      x-kubernetes-list-type: map
                   required:
                   - componentName
-                  - configurations
                   type: object
                 type: array
                 x-kubernetes-list-map-keys:
@@ -4868,183 +4807,6 @@ spec:
                 description: Represents the progress of the OpsRequest.
                 pattern: ^(\d+|\-)/(\d+|\-)$
                 type: string
-              reconfiguringStatusAsComponent:
-                additionalProperties:
-                  properties:
-                    conditions:
-                      description: |-
-                        Describes the reconfiguring detail status.
-                        Possible condition types include "Creating", "Init", "Running", "Pending", "Merged", "MergeFailed", "FailedAndPause",
-                        "Upgrading", "Deleting", "FailedAndRetry", "Finished", "ReconfigurePersisting", "ReconfigurePersisted".
-                      items:
-                        description: "Condition contains details for one aspect of
-                          the current state of this API Resource.\n---\nThis struct
-                          is intended for direct use as an array at the field path
-                          .status.conditions.  For example,\n\n\n\ttype FooStatus
-                          struct{\n\t    // Represents the observations of a foo's
-                          current state.\n\t    // Known .status.conditions.type are:
-                          \"Available\", \"Progressing\", and \"Degraded\"\n\t    //
-                          +patchMergeKey=type\n\t    // +patchStrategy=merge\n\t    //
-                          +listType=map\n\t    // +listMapKey=type\n\t    Conditions
-                          []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\"
-                          patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"`\n\n\n\t
-                          \   // other fields\n\t}"
-                        properties:
-                          lastTransitionTime:
-                            description: |-
-                              lastTransitionTime is the last time the condition transitioned from one status to another.
-                              This should be when the underlying condition changed.  If that is not known, then using the time when the API field changed is acceptable.
-                            format: date-time
-                            type: string
-                          message:
-                            description: |-
-                              message is a human readable message indicating details about the transition.
-                              This may be an empty string.
-                            maxLength: 32768
-                            type: string
-                          observedGeneration:
-                            description: |-
-                              observedGeneration represents the .metadata.generation that the condition was set based upon.
-                              For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date
-                              with respect to the current state of the instance.
-                            format: int64
-                            minimum: 0
-                            type: integer
-                          reason:
-                            description: |-
-                              reason contains a programmatic identifier indicating the reason for the condition's last transition.
-                              Producers of specific condition types may define expected values and meanings for this field,
-                              and whether the values are considered a guaranteed API.
-                              The value should be a CamelCase string.
-                              This field may not be empty.
-                            maxLength: 1024
-                            minLength: 1
-                            pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
-                            type: string
-                          status:
-                            description: status of the condition, one of True, False,
-                              Unknown.
-                            enum:
-                            - "True"
-                            - "False"
-                            - Unknown
-                            type: string
-                          type:
-                            description: |-
-                              type of condition in CamelCase or in foo.example.com/CamelCase.
-                              ---
-                              Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be
-                              useful (see .node.status.conditions), the ability to deconflict is important.
-                              The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
-                            maxLength: 316
-                            pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
-                            type: string
-                        required:
-                        - lastTransitionTime
-                        - message
-                        - reason
-                        - status
-                        - type
-                        type: object
-                      type: array
-                      x-kubernetes-list-map-keys:
-                      - type
-                      x-kubernetes-list-type: map
-                    configurationStatus:
-                      description: Describes the status of the component reconfiguring.
-                      items:
-                        properties:
-                          expectedCount:
-                            default: -1
-                            description: Represents the total count of pods intended
-                              to be updated by a configuration change.
-                            format: int32
-                            type: integer
-                          lastAppliedConfiguration:
-                            additionalProperties:
-                              type: string
-                            description: Stores the last applied configuration.
-                            type: object
-                          lastStatus:
-                            description: |-
-                              Records the last state of the reconfiguration finite state machine.
-                              Possible values include "None", "Retry", "Failed", "NotSupport", "FailedAndRetry".
-
-
-                              - "None" describes fsm has finished and quit.
-                              - "Retry" describes fsm is running.
-                              - "Failed" describes fsm is failed and exited.
-                              - "NotSupport" describes fsm does not support the feature.
-                              - "FailedAndRetry" describes fsm is failed in current state, but can be retried.
-                            type: string
-                          message:
-                            description: Provides details about the operation.
-                            type: string
-                          name:
-                            description: Indicates the name of the configuration template
-                              (as ConfigMap).
-                            maxLength: 63
-                            pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
-                            type: string
-                          status:
-                            description: |-
-                              Represents the current state of the reconfiguration state machine.
-                              Possible values include "Creating", "Init", "Running", "Pending", "Merged", "MergeFailed", "FailedAndPause",
-                              "Upgrading", "Deleting", "FailedAndRetry", "Finished", "ReconfigurePersisting", "ReconfigurePersisted".
-                            type: string
-                          succeedCount:
-                            default: 0
-                            description: Records the number of pods successfully updated
-                              following a configuration change.
-                            format: int32
-                            type: integer
-                          updatePolicy:
-                            description: Records the UpgradePolicy of the configuration
-                              change operation.
-                            enum:
-                            - simple
-                            - parallel
-                            - rolling
-                            - autoReload
-                            - operatorSyncUpdate
-                            - dynamicReloadBeginRestart
-                            type: string
-                          updatedParameters:
-                            description: Contains the updated parameters.
-                            properties:
-                              addedKeys:
-                                additionalProperties:
-                                  type: string
-                                description: Maps newly added configuration files
-                                  to their content.
-                                type: object
-                              deletedKeys:
-                                additionalProperties:
-                                  type: string
-                                description: Lists the name of configuration files
-                                  that have been deleted.
-                                type: object
-                              updatedKeys:
-                                additionalProperties:
-                                  type: string
-                                description: Maps the name of configuration files
-                                  to their updated content, detailing the changes
-                                  made.
-                                type: object
-                            type: object
-                        required:
-                        - name
-                        type: object
-                      type: array
-                      x-kubernetes-list-map-keys:
-                      - name
-                      x-kubernetes-list-type: map
-                  required:
-                  - configurationStatus
-                  type: object
-                description: Records the status of a reconfiguring operation if `opsRequest.spec.type`
-                  equals to "Reconfiguring".
-                type: object
               startTimestamp:
                 description: Records the time when the OpsRequest started processing.
                 format: date-time
diff --git a/deploy/helm/crds/parameters.kubeblocks.io_componentparameters.yaml b/deploy/helm/crds/parameters.kubeblocks.io_componentparameters.yaml
index 276f009e4..a36f8a49a 100644
--- a/deploy/helm/crds/parameters.kubeblocks.io_componentparameters.yaml
+++ b/deploy/helm/crds/parameters.kubeblocks.io_componentparameters.yaml
@@ -192,13 +192,6 @@ spec:
                       pattern: ^[a-z0-9]([a-z0-9\.\-]*[a-z0-9])?$
                       type: string
                     payload:
-                      additionalProperties:
-                        description: |-
-                          RawMessage is a raw encoded JSON value.
-                          It implements Marshaler and Unmarshaler and can
-                          be used to delay JSON decoding or precompute a JSON encoding.
-                        format: byte
-                        type: string
                       description: |-
                         External controllers can trigger a configuration rerender by modifying this field.
 
diff --git a/docs/developer_docs/api-reference/cluster.md b/docs/developer_docs/api-reference/cluster.md
index 384912c2a..4e9a1e8e2 100644
--- a/docs/developer_docs/api-reference/cluster.md
+++ b/docs/developer_docs/api-reference/cluster.md
@@ -1288,8 +1288,8 @@ These scripts can be executed during container startup or via specific actions.<
 <td>
 <code>configs</code><br/>
 <em>
-<a href="#apps.kubeblocks.io/v1.ComponentConfigSpec">
-[]ComponentConfigSpec
+<a href="#apps.kubeblocks.io/v1.ComponentTemplateSpec">
+[]ComponentTemplateSpec
 </a>
 </em>
 </td>
@@ -4826,138 +4826,6 @@ string
 </tr>
 </tbody>
 </table>
-<h3 id="apps.kubeblocks.io/v1.ComponentConfigSpec">ComponentConfigSpec
-</h3>
-<p>
-(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ComponentDefinitionSpec">ComponentDefinitionSpec</a>)
-</p>
-<div>
-</div>
-<table>
-<thead>
-<tr>
-<th>Field</th>
-<th>Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>
-<code>ComponentTemplateSpec</code><br/>
-<em>
-<a href="#apps.kubeblocks.io/v1.ComponentTemplateSpec">
-ComponentTemplateSpec
-</a>
-</em>
-</td>
-<td>
-<p>
-(Members of <code>ComponentTemplateSpec</code> are embedded into this type.)
-</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>keys</code><br/>
-<em>
-[]string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Specifies the configuration files within the ConfigMap that support dynamic updates.</p>
-<p>A configuration template (provided in the form of a ConfigMap) may contain templates for multiple
-configuration files.
-Each configuration file corresponds to a key in the ConfigMap.
-Some of these configuration files may support dynamic modification and reloading without requiring
-a pod restart.</p>
-<p>If empty or omitted, all configuration files in the ConfigMap are assumed to support dynamic updates,
-and ConfigConstraint applies to all keys.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>constraintRef</code><br/>
-<em>
-string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Specifies the name of the referenced configuration constraints object.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>asEnvFrom</code><br/>
-<em>
-[]string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Specifies the containers to inject the ConfigMap parameters as environment variables.</p>
-<p>This is useful when application images accept parameters through environment variables and
-generate the final configuration file in the startup script based on these variables.</p>
-<p>This field allows users to specify a list of container names, and KubeBlocks will inject the environment
-variables converted from the ConfigMap into these designated containers. This provides a flexible way to
-pass the configuration items from the ConfigMap to the container without modifying the image.</p>
-<p>Deprecated: <code>asEnvFrom</code> has been deprecated since 0.9.0 and will be removed in 0.10.0.
-Use <code>injectEnvTo</code> instead.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>injectEnvTo</code><br/>
-<em>
-[]string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Specifies the containers to inject the ConfigMap parameters as environment variables.</p>
-<p>This is useful when application images accept parameters through environment variables and
-generate the final configuration file in the startup script based on these variables.</p>
-<p>This field allows users to specify a list of container names, and KubeBlocks will inject the environment
-variables converted from the ConfigMap into these designated containers. This provides a flexible way to
-pass the configuration items from the ConfigMap to the container without modifying the image.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>reRenderResourceTypes</code><br/>
-<em>
-<a href="#apps.kubeblocks.io/v1.RerenderResourceType">
-[]RerenderResourceType
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Specifies whether the configuration needs to be re-rendered after v-scale or h-scale operations to reflect changes.</p>
-<p>In some scenarios, the configuration may need to be updated to reflect the changes in resource allocation
-or cluster topology. Examples:</p>
-<ul>
-<li>Redis: adjust maxmemory after v-scale operation.</li>
-<li>MySQL: increase max connections after v-scale operation.</li>
-<li>Zookeeper: update zoo.cfg with new node addresses after h-scale operation.</li>
-</ul>
-</td>
-</tr>
-<tr>
-<td>
-<code>asSecret</code><br/>
-<em>
-bool
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Whether to store the final rendered parameters as a secret.</p>
-</td>
-</tr>
-</tbody>
-</table>
 <h3 id="apps.kubeblocks.io/v1.ComponentDefinitionSpec">ComponentDefinitionSpec
 </h3>
 <p>
@@ -5287,8 +5155,8 @@ These scripts can be executed during container startup or via specific actions.<
 <td>
 <code>configs</code><br/>
 <em>
-<a href="#apps.kubeblocks.io/v1.ComponentConfigSpec">
-[]ComponentConfigSpec
+<a href="#apps.kubeblocks.io/v1.ComponentTemplateSpec">
+[]ComponentTemplateSpec
 </a>
 </em>
 </td>
@@ -6822,7 +6690,7 @@ ProvisionSecretRef
 <h3 id="apps.kubeblocks.io/v1.ComponentTemplateSpec">ComponentTemplateSpec
 </h3>
 <p>
-(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ComponentConfigSpec">ComponentConfigSpec</a>, <a href="#apps.kubeblocks.io/v1.ComponentDefinitionSpec">ComponentDefinitionSpec</a>, <a href="#apps.kubeblocks.io/v1.SidecarDefinitionSpec">SidecarDefinitionSpec</a>)
+(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ComponentDefinitionSpec">ComponentDefinitionSpec</a>, <a href="#apps.kubeblocks.io/v1.SidecarDefinitionSpec">SidecarDefinitionSpec</a>)
 </p>
 <div>
 </div>
@@ -7368,58 +7236,6 @@ as defined in <code>componentDefinition.spec.lifecycleActions.readWrite</code>,
 </tr>
 </tbody>
 </table>
-<h3 id="apps.kubeblocks.io/v1.ConfigTemplateExtension">ConfigTemplateExtension
-</h3>
-<div>
-</div>
-<table>
-<thead>
-<tr>
-<th>Field</th>
-<th>Description</th>
-</tr>
-</thead>
-<tbody>
-<tr>
-<td>
-<code>templateRef</code><br/>
-<em>
-string
-</em>
-</td>
-<td>
-<p>Specifies the name of the referenced configuration template ConfigMap object.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>namespace</code><br/>
-<em>
-string
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Specifies the namespace of the referenced configuration template ConfigMap object.
-An empty namespace is equivalent to the &ldquo;default&rdquo; namespace.</p>
-</td>
-</tr>
-<tr>
-<td>
-<code>policy</code><br/>
-<em>
-<a href="#apps.kubeblocks.io/v1.MergedPolicy">
-MergedPolicy
-</a>
-</em>
-</td>
-<td>
-<em>(Optional)</em>
-<p>Defines the strategy for merging externally imported templates into component templates.</p>
-</td>
-</tr>
-</tbody>
-</table>
 <h3 id="apps.kubeblocks.io/v1.ConnectionCredentialAuth">ConnectionCredentialAuth
 </h3>
 <p>
@@ -8455,31 +8271,6 @@ This field allows the system to locate and manage log files effectively.</p>
 </tr>
 </tbody>
 </table>
-<h3 id="apps.kubeblocks.io/v1.MergedPolicy">MergedPolicy
-(<code>string</code> alias)</h3>
-<p>
-(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ConfigTemplateExtension">ConfigTemplateExtension</a>)
-</p>
-<div>
-<p>MergedPolicy defines how to merge external imported templates into component templates.</p>
-</div>
-<table>
-<thead>
-<tr>
-<th>Value</th>
-<th>Description</th>
-</tr>
-</thead>
-<tbody><tr><td><p>&#34;none&#34;</p></td>
-<td></td>
-</tr><tr><td><p>&#34;add&#34;</p></td>
-<td></td>
-</tr><tr><td><p>&#34;patch&#34;</p></td>
-<td></td>
-</tr><tr><td><p>&#34;replace&#34;</p></td>
-<td></td>
-</tr></tbody>
-</table>
 <h3 id="apps.kubeblocks.io/v1.MultipleClusterObjectCombinedOption">MultipleClusterObjectCombinedOption
 </h3>
 <p>
@@ -9324,9 +9115,6 @@ int32
 </table>
 <h3 id="apps.kubeblocks.io/v1.RerenderResourceType">RerenderResourceType
 (<code>string</code> alias)</h3>
-<p>
-(<em>Appears on:</em><a href="#apps.kubeblocks.io/v1.ComponentConfigSpec">ComponentConfigSpec</a>)
-</p>
 <div>
 <p>RerenderResourceType defines the resource requirements for a component.</p>
 </div>
diff --git a/pkg/configuration/config_manager/builder.go b/pkg/configuration/config_manager/builder.go
index 0df468a23..914515e21 100644
--- a/pkg/configuration/config_manager/builder.go
+++ b/pkg/configuration/config_manager/builder.go
@@ -38,7 +38,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/constant"
@@ -98,9 +98,9 @@ func getWatchedVolume(volumeDirs []corev1.VolumeMount, buildParams []ConfigSpecM
 				continue
 			}
 			switch param.ReloadType {
-			case appsv1beta1.TPLScriptType:
+			case parametersv1alpha1.TPLScriptType:
 				return core.IsWatchModuleForTplTrigger(param.ReloadAction.TPLScriptTrigger)
-			case appsv1beta1.ShellType:
+			case parametersv1alpha1.ShellType:
 				return core.IsWatchModuleForShellTrigger(param.ReloadAction.ShellTrigger)
 			default:
 				return true
@@ -224,7 +224,7 @@ func buildConfigSpecHandleMeta(cli client.Client, ctx context.Context, buildPara
 			return err
 		}
 	}
-	if buildParam.ReloadType == appsv1beta1.TPLScriptType {
+	if buildParam.ReloadType == parametersv1alpha1.TPLScriptType {
 		return buildTPLScriptCM(buildParam, cmBuildParam, cli, ctx)
 	}
 	return nil
@@ -262,7 +262,7 @@ func buildTPLScriptCM(configSpecBuildMeta *ConfigSpecMeta, manager *CfgManagerBu
 	return nil
 }
 
-func buildDownwardAPIVolume(manager *CfgManagerBuildParams, fieldInfo appsv1beta1.DownwardAPIChangeTriggeredAction) {
+func buildDownwardAPIVolume(manager *CfgManagerBuildParams, fieldInfo parametersv1alpha1.DownwardAPIChangeTriggeredAction) {
 	manager.DownwardAPIVolumes = append(manager.DownwardAPIVolumes, corev1.VolumeMount{
 		Name:      fieldInfo.Name,
 		MountPath: fieldInfo.MountPoint,
@@ -353,7 +353,7 @@ func mergeWithOverride(dst, src interface{}) {
 	_ = mergo.Merge(dst, src, mergo.WithOverride)
 }
 
-func checkAndUpdateReloadYaml(data map[string]string, reloadConfig string, formatterConfig appsv1beta1.FileFormatConfig) (map[string]string, error) {
+func checkAndUpdateReloadYaml(data map[string]string, reloadConfig string, formatterConfig parametersv1alpha1.FileFormatConfig) (map[string]string, error) {
 	configObject := make(map[string]interface{})
 	if content, ok := data[reloadConfig]; ok {
 		if err := yaml.Unmarshal([]byte(content), &configObject); err != nil {
@@ -379,7 +379,7 @@ func checkAndUpdateReloadYaml(data map[string]string, reloadConfig string, forma
 	return data, nil
 }
 
-func buildCfgManagerScripts(options appsv1beta1.ScriptConfig, manager *CfgManagerBuildParams, cli client.Client, ctx context.Context, configSpec appsv1.ComponentConfigSpec) error {
+func buildCfgManagerScripts(options parametersv1alpha1.ScriptConfig, manager *CfgManagerBuildParams, cli client.Client, ctx context.Context, configSpec appsv1.ComponentTemplateSpec) error {
 	mountPoint := filepath.Join(KBScriptVolumePath, configSpec.Name)
 	referenceCMKey := client.ObjectKey{
 		Namespace: options.Namespace,
@@ -396,19 +396,15 @@ func buildCfgManagerScripts(options appsv1beta1.ScriptConfig, manager *CfgManage
 	return nil
 }
 
-func GetConfigMountPoint(configSpec appsv1.ComponentConfigSpec) string {
-	return filepath.Join(KBConfigVolumePath, configSpec.Name)
-}
-
-func GetScriptsMountPoint(configSpec appsv1.ComponentConfigSpec) string {
+func GetScriptsMountPoint(configSpec appsv1.ComponentTemplateSpec) string {
 	return filepath.Join(KBScriptVolumePath, configSpec.Name)
 }
 
-func GetScriptsVolumeName(configSpec appsv1.ComponentConfigSpec) string {
+func GetScriptsVolumeName(configSpec appsv1.ComponentTemplateSpec) string {
 	return fmt.Sprintf("%s%s", scriptVolumePrefix, configSpec.Name)
 }
 
-func GetConfigVolumeName(configSpec appsv1.ComponentConfigSpec) string {
+func GetConfigVolumeName(configSpec appsv1.ComponentTemplateSpec) string {
 	return fmt.Sprintf("%s%s", configVolumePrefix, configSpec.Name)
 }
 
diff --git a/pkg/configuration/config_manager/config_handler.go b/pkg/configuration/config_manager/config_handler.go
index cd1fb775b..ba59fb7a7 100644
--- a/pkg/configuration/config_manager/config_handler.go
+++ b/pkg/configuration/config_manager/config_handler.go
@@ -33,7 +33,7 @@ import (
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/gotemplate"
@@ -43,10 +43,10 @@ type configVolumeHandleMeta struct {
 	ConfigHandler
 
 	mountPoint []string
-	reloadType appsv1beta1.DynamicReloadType
+	reloadType parametersv1alpha1.DynamicReloadType
 	configSpec appsv1alpha1.ComponentTemplateSpec
 
-	formatterConfig *appsv1beta1.FileFormatConfig
+	formatterConfig *parametersv1alpha1.FileFormatConfig
 }
 
 func (s *configVolumeHandleMeta) OnlineUpdate(_ context.Context, _ string, _ map[string]string) error {
@@ -148,7 +148,7 @@ func (u *unixSignalHandler) MountPoint() []string {
 	return []string{u.mountPoint}
 }
 
-func CreateSignalHandler(sig appsv1beta1.SignalType, processName string, mountPoint string) (ConfigHandler, error) {
+func CreateSignalHandler(sig parametersv1alpha1.SignalType, processName string, mountPoint string) (ConfigHandler, error) {
 	signal, ok := allUnixSignals[sig]
 	if !ok {
 		err := cfgcore.MakeError("not supported unix signal: %s", sig)
@@ -347,7 +347,7 @@ func (s *shellCommandHandler) isDownwardAPITrigger() bool {
 	return s.downwardAPITrigger
 }
 
-func createConfigVolumeMeta(configSpecName string, reloadType appsv1beta1.DynamicReloadType, mountPoint []string, formatterConfig *appsv1beta1.FileFormatConfig) configVolumeHandleMeta {
+func createConfigVolumeMeta(configSpecName string, reloadType parametersv1alpha1.DynamicReloadType, mountPoint []string, formatterConfig *parametersv1alpha1.FileFormatConfig) configVolumeHandleMeta {
 	return configVolumeHandleMeta{
 		reloadType: reloadType,
 		mountPoint: mountPoint,
@@ -364,11 +364,11 @@ func isShellCommand(configMeta *ConfigSpecInfo) bool {
 		configMeta.ReloadAction.ShellTrigger != nil
 }
 
-func isBatchReloadMode(shellAction *appsv1beta1.ShellTrigger) bool {
+func isBatchReloadMode(shellAction *parametersv1alpha1.ShellTrigger) bool {
 	return shellAction.BatchReload != nil && *shellAction.BatchReload
 }
 
-func isValidBatchReload(shellAction *appsv1beta1.ShellTrigger) bool {
+func isValidBatchReload(shellAction *parametersv1alpha1.ShellTrigger) bool {
 	return isBatchReloadMode(shellAction) && len(shellAction.BatchParamsFormatterTemplate) > 0
 }
 
@@ -397,7 +397,7 @@ func CreateExecHandler(command []string, mountPoint string, configMeta *ConfigSp
 		return nil, err
 	}
 
-	var formatterConfig *appsv1beta1.FileFormatConfig
+	var formatterConfig *parametersv1alpha1.FileFormatConfig
 	if backupPath != "" && configMeta != nil && configMeta.ReloadAction != nil {
 		if err := checkAndBackup(*configMeta, []string{configMeta.MountPoint}, filter, backupPath); err != nil {
 			return nil, err
@@ -418,7 +418,7 @@ func CreateExecHandler(command []string, mountPoint string, configMeta *ConfigSp
 		// for downward api watch
 		downwardAPIMountPoint:  cfgutil.ToSet(handler).AsSlice(),
 		downwardAPIHandler:     handler,
-		configVolumeHandleMeta: createConfigVolumeMeta(configMeta.ConfigSpec.Name, appsv1beta1.ShellType, []string{mountPoint}, formatterConfig),
+		configVolumeHandleMeta: createConfigVolumeMeta(configMeta.ConfigSpec.Name, parametersv1alpha1.ShellType, []string{mountPoint}, formatterConfig),
 		isBatchReload:          isBatchReload(configMeta),
 		batchInputTemplate:     getBatchInputTemplate(configMeta),
 	}
@@ -436,13 +436,10 @@ func checkAndBackup(configMeta ConfigSpecInfo, dirs []string, filter regexFilter
 }
 
 func fromConfigSpecInfo(meta *ConfigSpecInfo) string {
-	if meta == nil || len(meta.ConfigSpec.Keys) == 0 {
+	if meta == nil || len(meta.ConfigFile) == 0 {
 		return ""
 	}
-	if len(meta.ConfigSpec.Keys) == 1 {
-		return meta.ConfigSpec.Keys[0]
-	}
-	return "( " + strings.Join(meta.ConfigSpec.Keys, " | ") + " )"
+	return meta.ConfigFile
 }
 
 func createDownwardHandler(meta *ConfigSpecInfo) (map[string]ConfigHandler, error) {
@@ -452,11 +449,10 @@ func createDownwardHandler(meta *ConfigSpecInfo) (map[string]ConfigHandler, erro
 
 	handlers := make(map[string]ConfigHandler)
 	for _, field := range meta.DownwardAPIOptions {
-		mockConfigSpec := &ConfigSpecInfo{ConfigSpec: appsv1.ComponentConfigSpec{
-			ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-				Name:       strings.Join([]string{meta.ConfigSpec.Name, field.Name}, "."),
-				VolumeName: field.MountPoint,
-			}}}
+		mockConfigSpec := &ConfigSpecInfo{ConfigSpec: appsv1.ComponentTemplateSpec{
+			Name:       strings.Join([]string{meta.ConfigSpec.Name, field.Name}, "."),
+			VolumeName: field.MountPoint,
+		}}
 		h, err := CreateExecHandler(field.Command, field.MountPoint, mockConfigSpec, "")
 		if err != nil {
 			return nil, err
@@ -481,7 +477,7 @@ type tplScriptHandler struct {
 }
 
 func (u *tplScriptHandler) OnlineUpdate(ctx context.Context, name string, updatedParams map[string]string) error {
-	logger.V(1).Info(fmt.Sprintf("online update[%v]", updatedParams))
+	logger.V(1).Info(fmt.Sprintf("online update[%v]", updatedParams), "file", name)
 	return wrapGoTemplateRun(ctx,
 		u.tplScripts,
 		u.tplContent,
@@ -534,7 +530,7 @@ func CreateTPLScriptHandler(name, configPath string, dirs []string, backupPath s
 		return nil, err
 	}
 	tplHandler := &tplScriptHandler{
-		configVolumeHandleMeta: createConfigVolumeMeta(name, appsv1beta1.TPLScriptType, dirs, &tplConfig.FormatterConfig),
+		configVolumeHandleMeta: createConfigVolumeMeta(name, parametersv1alpha1.TPLScriptType, dirs, &tplConfig.FormatterConfig),
 		tplContent:             string(tplContent),
 		tplScripts:             tplScripts,
 		fileFilter:             filter,
@@ -553,13 +549,13 @@ func CreateCombinedHandler(config string, backupPath string) (ConfigHandler, err
 		shellTrigger := configMeta.ShellTrigger
 		return CreateExecHandler(shellTrigger.Command, configMeta.MountPoint, &configMeta, filepath.Join(backupPath, configMeta.ConfigSpec.Name))
 	}
-	signalHandler := func(signalTrigger *appsv1beta1.UnixSignalTrigger, mountPoint string) (ConfigHandler, error) {
+	signalHandler := func(signalTrigger *parametersv1alpha1.UnixSignalTrigger, mountPoint string) (ConfigHandler, error) {
 		if signalTrigger == nil {
 			return nil, cfgcore.MakeError("signal trigger is nil")
 		}
 		return CreateSignalHandler(signalTrigger.Signal, signalTrigger.ProcessName, mountPoint)
 	}
-	tplHandler := func(tplTrigger *appsv1beta1.TPLScriptTrigger, configMeta ConfigSpecInfo, backupPath string) (ConfigHandler, error) {
+	tplHandler := func(tplTrigger *parametersv1alpha1.TPLScriptTrigger, configMeta ConfigSpecInfo, backupPath string) (ConfigHandler, error) {
 		if tplTrigger == nil {
 			return nil, cfgcore.MakeError("tpl trigger is nil")
 		}
@@ -589,17 +585,21 @@ func CreateCombinedHandler(config string, backupPath string) (ConfigHandler, err
 		switch configMeta.ReloadType {
 		default:
 			return nil, fmt.Errorf("not support reload type: %s", configMeta.ReloadType)
-		case appsv1beta1.ShellType:
+		case parametersv1alpha1.ShellType:
 			h, err = shellHandler(configMeta, tmpPath)
-		case appsv1beta1.UnixSignalType:
+		case parametersv1alpha1.UnixSignalType:
 			h, err = signalHandler(configMeta.ReloadAction.UnixSignalTrigger, configMeta.MountPoint)
-		case appsv1beta1.TPLScriptType:
+		case parametersv1alpha1.TPLScriptType:
 			h, err = tplHandler(configMeta.ReloadAction.TPLScriptTrigger, configMeta, tmpPath)
 		}
 		if err != nil {
 			return nil, err
 		}
-		mHandler.handlers[configMeta.ConfigSpec.Name] = h
+		hkey := configMeta.ConfigSpec.Name
+		if configMeta.ConfigFile != "" {
+			hkey = hkey + "/" + configMeta.ConfigFile
+		}
+		mHandler.handlers[hkey] = h
 	}
 	return mHandler, nil
 }
diff --git a/pkg/configuration/config_manager/handler_util.go b/pkg/configuration/config_manager/handler_util.go
index beb9b58df..f1cc3b8a7 100644
--- a/pkg/configuration/config_manager/handler_util.go
+++ b/pkg/configuration/config_manager/handler_util.go
@@ -23,13 +23,14 @@ import (
 	"context"
 	"path/filepath"
 	"regexp"
+	"slices"
 
 	"github.com/fsnotify/fsnotify"
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 )
 
@@ -52,10 +53,10 @@ type CfgManagerBuildParams struct {
 	ConfigSpecsBuildParams []ConfigSpecMeta
 
 	// init tools container
-	ToolsContainers           []corev1.Container
-	DownwardAPIVolumes        []corev1.VolumeMount
-	CMConfigVolumes           []corev1.Volume
-	ConfigLazyRenderedVolumes map[string]corev1.VolumeMount
+	ToolsContainers    []corev1.Container
+	DownwardAPIVolumes []corev1.VolumeMount
+	CMConfigVolumes    []corev1.Volume
+	// ConfigLazyRenderedVolumes map[string]corev1.VolumeMount
 
 	// support custom config manager sidecar
 	ConfigManagerReloadPath string `json:"configManagerReloadPath"`
@@ -64,36 +65,48 @@ type CfgManagerBuildParams struct {
 	ContainerPort int32 `json:"containerPort"`
 }
 
-func IsSupportReload(reload *appsv1beta1.ReloadAction) bool {
+func NeedRestart(paramsDefs map[string]*parametersv1alpha1.ParametersDefinition, patch *core.ConfigPatchInfo) bool {
+	if patch == nil {
+		return false
+	}
+	for key := range patch.UpdateConfig {
+		if paramsDef, ok := paramsDefs[key]; !ok || !IsSupportReload(paramsDef.Spec.ReloadAction) {
+			return true
+		}
+	}
+	return false
+}
+
+func IsSupportReload(reload *parametersv1alpha1.ReloadAction) bool {
 	return reload != nil && isValidReloadPolicy(*reload)
 }
 
-func isValidReloadPolicy(reload appsv1beta1.ReloadAction) bool {
+func isValidReloadPolicy(reload parametersv1alpha1.ReloadAction) bool {
 	return reload.AutoTrigger != nil ||
 		reload.ShellTrigger != nil ||
 		reload.TPLScriptTrigger != nil ||
 		reload.UnixSignalTrigger != nil
 }
 
-func IsAutoReload(reload *appsv1beta1.ReloadAction) bool {
+func IsAutoReload(reload *parametersv1alpha1.ReloadAction) bool {
 	return reload != nil && reload.AutoTrigger != nil
 }
 
-func FromReloadTypeConfig(reloadAction *appsv1beta1.ReloadAction) appsv1beta1.DynamicReloadType {
+func FromReloadTypeConfig(reloadAction *parametersv1alpha1.ReloadAction) parametersv1alpha1.DynamicReloadType {
 	switch {
 	case reloadAction.UnixSignalTrigger != nil:
-		return appsv1beta1.UnixSignalType
+		return parametersv1alpha1.UnixSignalType
 	case reloadAction.ShellTrigger != nil:
-		return appsv1beta1.ShellType
+		return parametersv1alpha1.ShellType
 	case reloadAction.TPLScriptTrigger != nil:
-		return appsv1beta1.TPLScriptType
+		return parametersv1alpha1.TPLScriptType
 	case reloadAction.AutoTrigger != nil:
-		return appsv1beta1.AutoType
+		return parametersv1alpha1.AutoType
 	}
 	return ""
 }
 
-func ValidateReloadOptions(reloadAction *appsv1beta1.ReloadAction, cli client.Client, ctx context.Context) error {
+func ValidateReloadOptions(reloadAction *parametersv1alpha1.ReloadAction, cli client.Client, ctx context.Context) error {
 	switch {
 	case reloadAction.UnixSignalTrigger != nil:
 		return checkSignalTrigger(reloadAction.UnixSignalTrigger)
@@ -107,7 +120,7 @@ func ValidateReloadOptions(reloadAction *appsv1beta1.ReloadAction, cli client.Cl
 	return core.MakeError("require special reload type!")
 }
 
-func checkTPLScriptTrigger(options *appsv1beta1.TPLScriptTrigger, cli client.Client, ctx context.Context) error {
+func checkTPLScriptTrigger(options *parametersv1alpha1.TPLScriptTrigger, cli client.Client, ctx context.Context) error {
 	cm := corev1.ConfigMap{}
 	return cli.Get(ctx, client.ObjectKey{
 		Namespace: options.Namespace,
@@ -115,14 +128,14 @@ func checkTPLScriptTrigger(options *appsv1beta1.TPLScriptTrigger, cli client.Cli
 	}, &cm)
 }
 
-func checkShellTrigger(options *appsv1beta1.ShellTrigger) error {
+func checkShellTrigger(options *parametersv1alpha1.ShellTrigger) error {
 	if len(options.Command) == 0 {
 		return core.MakeError("required shell trigger")
 	}
 	return nil
 }
 
-func checkSignalTrigger(options *appsv1beta1.UnixSignalTrigger) error {
+func checkSignalTrigger(options *parametersv1alpha1.UnixSignalTrigger) error {
 	signal := options.Signal
 	if !IsValidUnixSignal(signal) {
 		return core.MakeError("this special signal [%s] is not supported now.", signal)
@@ -155,34 +168,83 @@ func CreateValidConfigMapFilter() NotifyEventFilter {
 	}
 }
 
-func GetSupportReloadConfigSpecs(configSpecs []appsv1.ComponentConfigSpec, cli client.Client, ctx context.Context) ([]ConfigSpecMeta, error) {
+func actionToolsImage(reloadAction *parametersv1alpha1.ReloadAction) *parametersv1alpha1.ToolsSetup {
+	if reloadAction != nil && reloadAction.ShellTrigger != nil {
+		return reloadAction.ShellTrigger.ToolsSetup
+	}
+	return nil
+}
+
+func actionToolsScripts(paramDef parametersv1alpha1.ParametersDefinitionSpec) []parametersv1alpha1.ScriptConfig {
+	uniqueSlice := func(items []parametersv1alpha1.ScriptConfig) []parametersv1alpha1.ScriptConfig {
+		var uniqItems []parametersv1alpha1.ScriptConfig
+		for _, item := range items {
+			if !slices.Contains(uniqItems, item) {
+				uniqItems = append(uniqItems, item)
+			}
+		}
+		return uniqItems
+	}
+
+	scriptConfigs := make([]parametersv1alpha1.ScriptConfig, 0)
+	for _, action := range paramDef.DownwardAPIChangeTriggeredActions {
+		if action.ScriptConfig != nil {
+			scriptConfigs = append(scriptConfigs, *action.ScriptConfig)
+		}
+	}
+	if paramDef.ReloadAction == nil {
+		return uniqueSlice(scriptConfigs)
+	}
+	if paramDef.ReloadAction.ShellTrigger != nil && paramDef.ReloadAction.ShellTrigger.ScriptConfig != nil {
+		scriptConfigs = append(scriptConfigs, *paramDef.ReloadAction.ShellTrigger.ScriptConfig)
+	}
+	return uniqueSlice(scriptConfigs)
+}
+
+func GetSupportReloadConfigSpecs(configSpecs []appsv1.ComponentTemplateSpec,
+	configDescs []parametersv1alpha1.ComponentConfigDescription,
+	paramsDefs []*parametersv1alpha1.ParametersDefinition) ([]ConfigSpecMeta, error) {
+	resolveReloadAction := func(fileName string) *parametersv1alpha1.ParametersDefinition {
+		for _, paramsDef := range paramsDefs {
+			if paramsDef.Spec.FileName == fileName {
+				return paramsDef
+			}
+		}
+		return nil
+	}
+	resolveConfigTemplate := func(name string) *appsv1.ComponentTemplateSpec {
+		for i, configSpec := range configSpecs {
+			if configSpec.Name == name {
+				return &configSpecs[i]
+			}
+		}
+		return nil
+	}
+
 	var reloadConfigSpecMeta []ConfigSpecMeta
-	for _, configSpec := range configSpecs {
-		// pass if support change and reload ConfigMap when parameters change
-		if !core.NeedReloadVolume(configSpec) {
+	for _, desc := range configDescs {
+		paramsDef := resolveReloadAction(desc.Name)
+		if paramsDef == nil || paramsDef.Spec.ReloadAction == nil || desc.FileFormatConfig == nil {
 			continue
 		}
-		ccKey := client.ObjectKey{
-			Namespace: "",
-			Name:      configSpec.ConfigConstraintRef,
-		}
-		cc := &appsv1beta1.ConfigConstraint{}
-		if err := cli.Get(ctx, ccKey, cc); err != nil {
-			return nil, core.WrapError(err, "failed to get ConfigConstraint, key[%v]", ccKey)
+		configSpec := resolveConfigTemplate(desc.TemplateName)
+		if configSpec == nil {
+			continue
 		}
-		reloadOptions := cc.Spec.ReloadAction
-		if !IsSupportReload(reloadOptions) || IsAutoReload(reloadOptions) {
+		action := paramsDef.Spec.ReloadAction
+		if !IsSupportReload(action) || IsAutoReload(action) {
 			continue
 		}
 		reloadConfigSpecMeta = append(reloadConfigSpecMeta, ConfigSpecMeta{
-			ToolsImageSpec: cc.Spec.GetToolsSetup(),
-			ScriptConfig:   cc.Spec.GetScriptConfigs(),
+			ToolsImageSpec: actionToolsImage(action),
+			ScriptConfig:   actionToolsScripts(paramsDef.Spec),
 			ConfigSpecInfo: ConfigSpecInfo{
-				ReloadAction:       cc.Spec.ReloadAction,
-				ConfigSpec:         configSpec,
-				ReloadType:         FromReloadTypeConfig(reloadOptions),
-				DownwardAPIOptions: cc.Spec.DownwardAPIChangeTriggeredActions,
-				FormatterConfig:    *cc.Spec.FileFormatConfig,
+				ReloadAction:       action,
+				FormatterConfig:    *desc.FileFormatConfig,
+				ConfigSpec:         *configSpec,
+				ReloadType:         FromReloadTypeConfig(action),
+				ConfigFile:         desc.Name,
+				DownwardAPIOptions: paramsDef.Spec.DownwardAPIChangeTriggeredActions,
 			},
 		})
 	}
@@ -223,6 +285,6 @@ func isSubPathMount(v *corev1.VolumeMount) bool {
 
 func isSyncReloadAction(meta ConfigSpecInfo) bool {
 	// If synchronous reloadAction is supported, kubelet limitations can be ignored.
-	return meta.ReloadType == appsv1beta1.TPLScriptType && !core.IsWatchModuleForTplTrigger(meta.TPLScriptTrigger) ||
-		meta.ReloadType == appsv1beta1.ShellType && !core.IsWatchModuleForShellTrigger(meta.ShellTrigger)
+	return meta.ReloadType == parametersv1alpha1.TPLScriptType && !core.IsWatchModuleForTplTrigger(meta.TPLScriptTrigger) ||
+		meta.ReloadType == parametersv1alpha1.ShellType && !core.IsWatchModuleForShellTrigger(meta.ShellTrigger)
 }
diff --git a/pkg/configuration/config_manager/proc_util.go b/pkg/configuration/config_manager/proc_util.go
index 602728c2c..ed7807012 100644
--- a/pkg/configuration/config_manager/proc_util.go
+++ b/pkg/configuration/config_manager/proc_util.go
@@ -25,7 +25,7 @@ import (
 
 	"github.com/shirou/gopsutil/v3/process"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
 )
 
@@ -71,7 +71,7 @@ func findParentPIDByProcessName(processName string, ctx ...context.Context) (PID
 	return InvalidPID, cfgcore.MakeError("cannot find pid of process name: [%s]", processName)
 }
 
-func IsValidUnixSignal(sig appsv1beta1.SignalType) bool {
+func IsValidUnixSignal(sig parametersv1alpha1.SignalType) bool {
 	_, ok := allUnixSignals[sig]
 	return ok
 }
diff --git a/pkg/configuration/config_manager/reload_util.go b/pkg/configuration/config_manager/reload_util.go
index 91fd635c7..e6ff67e11 100644
--- a/pkg/configuration/config_manager/reload_util.go
+++ b/pkg/configuration/config_manager/reload_util.go
@@ -31,7 +31,7 @@ import (
 	"strings"
 	"text/template/parse"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/gotemplate"
@@ -51,7 +51,7 @@ const (
 // for testing
 var newCommandChannel = NewCommandChannel
 
-func OnlineUpdateParamsHandle(tplScriptPath string, formatConfig *appsv1beta1.FileFormatConfig, dataType, dsn string) (DynamicUpdater, error) {
+func OnlineUpdateParamsHandle(tplScriptPath string, formatConfig *parametersv1alpha1.FileFormatConfig, dataType, dsn string) (DynamicUpdater, error) {
 	tplContent, err := os.ReadFile(tplScriptPath)
 	if err != nil {
 		return nil, err
@@ -81,7 +81,7 @@ func checkTPLScript(tplName string, tplContent string) error {
 	return err
 }
 
-func wrapGoTemplateRun(ctx context.Context, tplScriptPath string, tplContent string, updatedParams map[string]string, formatConfig *appsv1beta1.FileFormatConfig, dataType string, dsn string) error {
+func wrapGoTemplateRun(ctx context.Context, tplScriptPath string, tplContent string, updatedParams map[string]string, formatConfig *parametersv1alpha1.FileFormatConfig, dataType string, dsn string) error {
 	var (
 		err            error
 		commandChannel DynamicParamUpdater
@@ -103,7 +103,7 @@ func wrapGoTemplateRun(ctx context.Context, tplScriptPath string, tplContent str
 	return err
 }
 
-func constructReloadBuiltinFuncs(ctx context.Context, cc DynamicParamUpdater, formatConfig *appsv1beta1.FileFormatConfig) *gotemplate.BuiltInObjectsFunc {
+func constructReloadBuiltinFuncs(ctx context.Context, cc DynamicParamUpdater, formatConfig *parametersv1alpha1.FileFormatConfig) *gotemplate.BuiltInObjectsFunc {
 	return &gotemplate.BuiltInObjectsFunc{
 		builtInExecFunctionName: func(command string, args ...string) (string, error) {
 			execCommand := exec.CommandContext(ctx, command, args...)
@@ -137,7 +137,7 @@ func constructReloadBuiltinFuncs(ctx context.Context, cc DynamicParamUpdater, fo
 	}
 }
 
-func createUpdatedParamsPatch(newVersion []string, oldVersion []string, formatCfg *appsv1beta1.FileFormatConfig) (map[string]string, error) {
+func createUpdatedParamsPatch(newVersion []string, oldVersion []string, formatCfg *parametersv1alpha1.FileFormatConfig) (map[string]string, error) {
 	patchOption := core.CfgOption{
 		Type:    core.CfgTplType,
 		CfgType: formatCfg.Format,
@@ -158,7 +158,7 @@ func createUpdatedParamsPatch(newVersion []string, oldVersion []string, formatCf
 		return nil, err
 	}
 
-	params := core.GenerateVisualizedParamsList(patch, formatCfg, nil)
+	params := core.GenerateVisualizedParamsList(patch, core.ToV1ConfigDescription(newVersion, formatCfg))
 	r := make(map[string]string)
 	for _, key := range params {
 		if key.UpdateType != core.DeletedType {
@@ -317,10 +317,7 @@ func copyFileContents(src, dst string) error {
 
 func NeedSharedProcessNamespace(configSpecs []ConfigSpecMeta) bool {
 	for _, configSpec := range configSpecs {
-		if configSpec.ConfigSpec.ConfigConstraintRef == "" {
-			continue
-		}
-		if configSpec.ReloadType == appsv1beta1.UnixSignalType {
+		if configSpec.ReloadType == parametersv1alpha1.UnixSignalType {
 			return true
 		}
 	}
diff --git a/pkg/configuration/config_manager/signal_darwin.go b/pkg/configuration/config_manager/signal_darwin.go
index 2417cedca..7842a776e 100644
--- a/pkg/configuration/config_manager/signal_darwin.go
+++ b/pkg/configuration/config_manager/signal_darwin.go
@@ -25,39 +25,39 @@ import (
 	"os"
 	"syscall"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
-var allUnixSignals = map[appsv1beta1.SignalType]os.Signal{
-	appsv1beta1.SIGHUP:  syscall.SIGHUP, // reload signal for mysql 8.x.xxx
-	appsv1beta1.SIGINT:  syscall.SIGINT,
-	appsv1beta1.SIGQUIT: syscall.SIGQUIT,
-	appsv1beta1.SIGILL:  syscall.SIGILL,
-	appsv1beta1.SIGTRAP: syscall.SIGTRAP,
-	appsv1beta1.SIGABRT: syscall.SIGABRT,
-	appsv1beta1.SIGBUS:  syscall.SIGBUS,
-	appsv1beta1.SIGFPE:  syscall.SIGFPE,
-	appsv1beta1.SIGKILL: syscall.SIGKILL,
-	appsv1beta1.SIGUSR1: syscall.SIGUSR1,
-	appsv1beta1.SIGSEGV: syscall.SIGSEGV,
-	appsv1beta1.SIGUSR2: syscall.SIGUSR2,
-	appsv1beta1.SIGPIPE: syscall.SIGPIPE,
-	appsv1beta1.SIGALRM: syscall.SIGALRM,
-	appsv1beta1.SIGTERM: syscall.SIGTERM,
-	// appsv1beta1.SIGSTKFLT: syscall.SIGSTKFLT,
-	appsv1beta1.SIGCHLD:   syscall.SIGCHLD,
-	appsv1beta1.SIGCONT:   syscall.SIGCONT,
-	appsv1beta1.SIGSTOP:   syscall.SIGSTOP,
-	appsv1beta1.SIGTSTP:   syscall.SIGTSTP,
-	appsv1beta1.SIGTTIN:   syscall.SIGTTIN,
-	appsv1beta1.SIGTTOU:   syscall.SIGTTOU,
-	appsv1beta1.SIGURG:    syscall.SIGURG,
-	appsv1beta1.SIGXCPU:   syscall.SIGXCPU,
-	appsv1beta1.SIGXFSZ:   syscall.SIGXFSZ,
-	appsv1beta1.SIGVTALRM: syscall.SIGVTALRM,
-	appsv1beta1.SIGPROF:   syscall.SIGPROF,
-	appsv1beta1.SIGWINCH:  syscall.SIGWINCH,
-	appsv1beta1.SIGIO:     syscall.SIGIO,
-	// appsv1beta1.SIGPWR:    syscall.SIGPWR,
-	appsv1beta1.SIGSYS: syscall.SIGSYS,
+var allUnixSignals = map[parametersv1alpha1.SignalType]os.Signal{
+	parametersv1alpha1.SIGHUP:  syscall.SIGHUP, // reload signal for mysql 8.x.xxx
+	parametersv1alpha1.SIGINT:  syscall.SIGINT,
+	parametersv1alpha1.SIGQUIT: syscall.SIGQUIT,
+	parametersv1alpha1.SIGILL:  syscall.SIGILL,
+	parametersv1alpha1.SIGTRAP: syscall.SIGTRAP,
+	parametersv1alpha1.SIGABRT: syscall.SIGABRT,
+	parametersv1alpha1.SIGBUS:  syscall.SIGBUS,
+	parametersv1alpha1.SIGFPE:  syscall.SIGFPE,
+	parametersv1alpha1.SIGKILL: syscall.SIGKILL,
+	parametersv1alpha1.SIGUSR1: syscall.SIGUSR1,
+	parametersv1alpha1.SIGSEGV: syscall.SIGSEGV,
+	parametersv1alpha1.SIGUSR2: syscall.SIGUSR2,
+	parametersv1alpha1.SIGPIPE: syscall.SIGPIPE,
+	parametersv1alpha1.SIGALRM: syscall.SIGALRM,
+	parametersv1alpha1.SIGTERM: syscall.SIGTERM,
+	// parametersv1alpha1.SIGSTKFLT: syscall.SIGSTKFLT,
+	parametersv1alpha1.SIGCHLD:   syscall.SIGCHLD,
+	parametersv1alpha1.SIGCONT:   syscall.SIGCONT,
+	parametersv1alpha1.SIGSTOP:   syscall.SIGSTOP,
+	parametersv1alpha1.SIGTSTP:   syscall.SIGTSTP,
+	parametersv1alpha1.SIGTTIN:   syscall.SIGTTIN,
+	parametersv1alpha1.SIGTTOU:   syscall.SIGTTOU,
+	parametersv1alpha1.SIGURG:    syscall.SIGURG,
+	parametersv1alpha1.SIGXCPU:   syscall.SIGXCPU,
+	parametersv1alpha1.SIGXFSZ:   syscall.SIGXFSZ,
+	parametersv1alpha1.SIGVTALRM: syscall.SIGVTALRM,
+	parametersv1alpha1.SIGPROF:   syscall.SIGPROF,
+	parametersv1alpha1.SIGWINCH:  syscall.SIGWINCH,
+	parametersv1alpha1.SIGIO:     syscall.SIGIO,
+	// parametersv1alpha1.SIGPWR:    syscall.SIGPWR,
+	parametersv1alpha1.SIGSYS: syscall.SIGSYS,
 }
diff --git a/pkg/configuration/config_manager/signal_linux.go b/pkg/configuration/config_manager/signal_linux.go
index ce0380815..0d1e8c5c3 100644
--- a/pkg/configuration/config_manager/signal_linux.go
+++ b/pkg/configuration/config_manager/signal_linux.go
@@ -25,39 +25,39 @@ import (
 	"os"
 	"syscall"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
-var allUnixSignals = map[appsv1beta1.SignalType]os.Signal{
-	appsv1beta1.SIGHUP:    syscall.SIGHUP, // reload signal for mysql 8.x.xxx
-	appsv1beta1.SIGINT:    syscall.SIGINT,
-	appsv1beta1.SIGQUIT:   syscall.SIGQUIT,
-	appsv1beta1.SIGILL:    syscall.SIGILL,
-	appsv1beta1.SIGTRAP:   syscall.SIGTRAP,
-	appsv1beta1.SIGABRT:   syscall.SIGABRT,
-	appsv1beta1.SIGBUS:    syscall.SIGBUS,
-	appsv1beta1.SIGFPE:    syscall.SIGFPE,
-	appsv1beta1.SIGKILL:   syscall.SIGKILL,
-	appsv1beta1.SIGUSR1:   syscall.SIGUSR1,
-	appsv1beta1.SIGSEGV:   syscall.SIGSEGV,
-	appsv1beta1.SIGUSR2:   syscall.SIGUSR2,
-	appsv1beta1.SIGPIPE:   syscall.SIGPIPE,
-	appsv1beta1.SIGALRM:   syscall.SIGALRM,
-	appsv1beta1.SIGTERM:   syscall.SIGTERM,
-	appsv1beta1.SIGSTKFLT: syscall.SIGSTKFLT,
-	appsv1beta1.SIGCHLD:   syscall.SIGCHLD,
-	appsv1beta1.SIGCONT:   syscall.SIGCONT,
-	appsv1beta1.SIGSTOP:   syscall.SIGSTOP,
-	appsv1beta1.SIGTSTP:   syscall.SIGTSTP,
-	appsv1beta1.SIGTTIN:   syscall.SIGTTIN,
-	appsv1beta1.SIGTTOU:   syscall.SIGTTOU,
-	appsv1beta1.SIGURG:    syscall.SIGURG,
-	appsv1beta1.SIGXCPU:   syscall.SIGXCPU,
-	appsv1beta1.SIGXFSZ:   syscall.SIGXFSZ,
-	appsv1beta1.SIGVTALRM: syscall.SIGVTALRM,
-	appsv1beta1.SIGPROF:   syscall.SIGPROF,
-	appsv1beta1.SIGWINCH:  syscall.SIGWINCH,
-	appsv1beta1.SIGIO:     syscall.SIGIO,
-	appsv1beta1.SIGPWR:    syscall.SIGPWR,
-	appsv1beta1.SIGSYS:    syscall.SIGSYS,
+var allUnixSignals = map[parametersv1alpha1.SignalType]os.Signal{
+	parametersv1alpha1.SIGHUP:    syscall.SIGHUP, // reload signal for mysql 8.x.xxx
+	parametersv1alpha1.SIGINT:    syscall.SIGINT,
+	parametersv1alpha1.SIGQUIT:   syscall.SIGQUIT,
+	parametersv1alpha1.SIGILL:    syscall.SIGILL,
+	parametersv1alpha1.SIGTRAP:   syscall.SIGTRAP,
+	parametersv1alpha1.SIGABRT:   syscall.SIGABRT,
+	parametersv1alpha1.SIGBUS:    syscall.SIGBUS,
+	parametersv1alpha1.SIGFPE:    syscall.SIGFPE,
+	parametersv1alpha1.SIGKILL:   syscall.SIGKILL,
+	parametersv1alpha1.SIGUSR1:   syscall.SIGUSR1,
+	parametersv1alpha1.SIGSEGV:   syscall.SIGSEGV,
+	parametersv1alpha1.SIGUSR2:   syscall.SIGUSR2,
+	parametersv1alpha1.SIGPIPE:   syscall.SIGPIPE,
+	parametersv1alpha1.SIGALRM:   syscall.SIGALRM,
+	parametersv1alpha1.SIGTERM:   syscall.SIGTERM,
+	parametersv1alpha1.SIGSTKFLT: syscall.SIGSTKFLT,
+	parametersv1alpha1.SIGCHLD:   syscall.SIGCHLD,
+	parametersv1alpha1.SIGCONT:   syscall.SIGCONT,
+	parametersv1alpha1.SIGSTOP:   syscall.SIGSTOP,
+	parametersv1alpha1.SIGTSTP:   syscall.SIGTSTP,
+	parametersv1alpha1.SIGTTIN:   syscall.SIGTTIN,
+	parametersv1alpha1.SIGTTOU:   syscall.SIGTTOU,
+	parametersv1alpha1.SIGURG:    syscall.SIGURG,
+	parametersv1alpha1.SIGXCPU:   syscall.SIGXCPU,
+	parametersv1alpha1.SIGXFSZ:   syscall.SIGXFSZ,
+	parametersv1alpha1.SIGVTALRM: syscall.SIGVTALRM,
+	parametersv1alpha1.SIGPROF:   syscall.SIGPROF,
+	parametersv1alpha1.SIGWINCH:  syscall.SIGWINCH,
+	parametersv1alpha1.SIGIO:     syscall.SIGIO,
+	parametersv1alpha1.SIGPWR:    syscall.SIGPWR,
+	parametersv1alpha1.SIGSYS:    syscall.SIGSYS,
 }
diff --git a/pkg/configuration/config_manager/type.go b/pkg/configuration/config_manager/type.go
index f3022f06b..578056e33 100644
--- a/pkg/configuration/config_manager/type.go
+++ b/pkg/configuration/config_manager/type.go
@@ -25,7 +25,7 @@ import (
 	"github.com/fsnotify/fsnotify"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 type ConfigHandler interface {
@@ -35,13 +35,14 @@ type ConfigHandler interface {
 }
 
 type ConfigSpecInfo struct {
-	*appsv1beta1.ReloadAction `json:",inline"`
+	*parametersv1alpha1.ReloadAction `json:",inline"`
 
-	ReloadType      appsv1beta1.DynamicReloadType `json:"reloadType"`
-	ConfigSpec      appsv1.ComponentConfigSpec    `json:"configSpec"`
-	FormatterConfig appsv1beta1.FileFormatConfig  `json:"formatterConfig"`
+	ReloadType      parametersv1alpha1.DynamicReloadType `json:"reloadType"`
+	ConfigSpec      appsv1.ComponentTemplateSpec         `json:"configSpec"`
+	FormatterConfig parametersv1alpha1.FileFormatConfig  `json:"formatterConfig"`
+	ConfigFile      string                               `json:"configFile"`
 
-	DownwardAPIOptions []appsv1beta1.DownwardAPIChangeTriggeredAction `json:"downwardAPIOptions"`
+	DownwardAPIOptions []parametersv1alpha1.DownwardAPIChangeTriggeredAction `json:"downwardAPIOptions"`
 
 	// config volume mount path
 	MountPoint string `json:"mountPoint"`
@@ -51,8 +52,8 @@ type ConfigSpecInfo struct {
 type ConfigSpecMeta struct {
 	ConfigSpecInfo `json:",inline"`
 
-	ScriptConfig   []appsv1beta1.ScriptConfig
-	ToolsImageSpec *appsv1beta1.ToolsSetup
+	ScriptConfig   []parametersv1alpha1.ScriptConfig
+	ToolsImageSpec *parametersv1alpha1.ToolsSetup
 }
 
 type TPLScriptConfig struct {
@@ -61,13 +62,5 @@ type TPLScriptConfig struct {
 	DataType  string `json:"dataType"`
 	DSN       string `json:"dsn"`
 
-	FormatterConfig appsv1beta1.FileFormatConfig `json:"formatterConfig"`
-}
-
-type ConfigLazyRenderedMeta struct {
-	*appsv1.ComponentConfigSpec `json:",inline"`
-
-	// secondary template path
-	Templates       []string                     `json:"templates"`
-	FormatterConfig appsv1beta1.FileFormatConfig `json:"formatterConfig"`
+	FormatterConfig parametersv1alpha1.FileFormatConfig `json:"formatterConfig"`
 }
diff --git a/pkg/configuration/core/config.go b/pkg/configuration/core/config.go
index 0e65bb958..fe41ab4ae 100644
--- a/pkg/configuration/core/config.go
+++ b/pkg/configuration/core/config.go
@@ -27,7 +27,7 @@ import (
 	"github.com/StudioSol/set"
 	"github.com/spf13/cast"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/unstructured"
 )
@@ -108,15 +108,30 @@ func init() {
 			indexer:   make(map[string]unstructured.ConfigObject, 1),
 		}
 
+		configType := func(fileName string) parametersv1alpha1.CfgFileFormat {
+			fileType := option.CfgType
+			if option.FileFormatFn == nil {
+				return fileType
+			}
+			if fileConfig := option.FileFormatFn(fileName); fileConfig != nil {
+				fileType = fileConfig.Format
+			}
+			return fileType
+		}
+
 		var err error
 		var index = 0
 		var v unstructured.ConfigObject
+		var format parametersv1alpha1.CfgFileFormat
 		for fileName, content := range ctx.ConfigData {
 			if ctx.CMKeys != nil && !ctx.CMKeys.InArray(fileName) {
 				continue
 			}
-			if v, err = unstructured.LoadConfig(fileName, content, option.CfgType); err != nil {
-				return nil, WrapError(err, "failed to load config: filename[%s], type[%s]", fileName, option.CfgType)
+			if format = configType(fileName); format == "" {
+				continue
+			}
+			if v, err = unstructured.LoadConfig(fileName, content, format); err != nil {
+				return nil, WrapError(err, "failed to load config: filename[%s], type[%s]", fileName, format)
 			}
 			meta.indexer[fileName] = v
 			meta.v[index] = v
@@ -229,9 +244,9 @@ func NewCfgOptions(filename string, options ...Option) CfgOpOption {
 	return context
 }
 
-func WithFormatterConfig(formatConfig *appsv1beta1.FileFormatConfig) Option {
+func WithFormatterConfig(formatConfig *parametersv1alpha1.FileFormatConfig) Option {
 	return func(ctx *CfgOpOption) {
-		if formatConfig.Format == appsv1beta1.Ini && formatConfig.IniConfig != nil {
+		if formatConfig.Format == parametersv1alpha1.Ini && formatConfig.IniConfig != nil {
 			ctx.IniContext = &IniContext{
 				SectionName: formatConfig.IniConfig.SectionName,
 			}
@@ -239,8 +254,8 @@ func WithFormatterConfig(formatConfig *appsv1beta1.FileFormatConfig) Option {
 	}
 }
 
-func NestedPrefixField(formatConfig *appsv1beta1.FileFormatConfig) string {
-	if formatConfig != nil && formatConfig.Format == appsv1beta1.Ini && formatConfig.IniConfig != nil {
+func NestedPrefixField(formatConfig *parametersv1alpha1.FileFormatConfig) string {
+	if formatConfig != nil && formatConfig.Format == parametersv1alpha1.Ini && formatConfig.IniConfig != nil {
 		return formatConfig.IniConfig.SectionName
 	}
 	return ""
@@ -304,25 +319,31 @@ func FromCMKeysSelector(keys []string) *set.LinkedHashSetString {
 	return cmKeySet
 }
 
-func GenerateVisualizedParamsList(configPatch *ConfigPatchInfo, formatConfig *appsv1beta1.FileFormatConfig, sets *set.LinkedHashSetString) []VisualizedParam {
+func GenerateVisualizedParamsList(configPatch *ConfigPatchInfo, configDescs []parametersv1alpha1.ComponentConfigDescription) []VisualizedParam {
 	if !configPatch.IsModify {
 		return nil
 	}
 
-	var trimPrefix = NestedPrefixField(formatConfig)
+	sets := NewConfigFileFilter(configDescs)
+	resolveParameterPrefix := func(file string) string {
+		fileConfig := ResolveConfigFormat(configDescs, file)
+		if fileConfig == nil {
+			return ""
+		}
+		return NestedPrefixField(fileConfig)
+	}
 
 	r := make([]VisualizedParam, 0)
-	r = append(r, generateUpdateParam(configPatch.UpdateConfig, trimPrefix, sets)...)
-	r = append(r, generateUpdateKeyParam(configPatch.AddConfig, trimPrefix, AddedType, sets)...)
-	r = append(r, generateUpdateKeyParam(configPatch.DeleteConfig, trimPrefix, DeletedType, sets)...)
+	r = append(r, generateUpdateParam(configPatch.UpdateConfig, resolveParameterPrefix, sets)...)
+	r = append(r, generateUpdateKeyParam(configPatch.AddConfig, resolveParameterPrefix, AddedType, sets)...)
+	r = append(r, generateUpdateKeyParam(configPatch.DeleteConfig, resolveParameterPrefix, DeletedType, sets)...)
 	return r
 }
 
-func generateUpdateParam(updatedParams map[string][]byte, trimPrefix string, sets *set.LinkedHashSetString) []VisualizedParam {
+func generateUpdateParam(updatedParams map[string][]byte, trimPrefix func(string) string, sets *set.LinkedHashSetString) []VisualizedParam {
 	r := make([]VisualizedParam, 0, len(updatedParams))
 
 	for key, b := range updatedParams {
-		// TODO support keys
 		if sets != nil && sets.Length() > 0 && !sets.InArray(key) {
 			continue
 		}
@@ -330,7 +351,7 @@ func generateUpdateParam(updatedParams map[string][]byte, trimPrefix string, set
 		if err := json.Unmarshal(b, &v); err != nil {
 			return nil
 		}
-		if params := checkAndFlattenMap(v, trimPrefix); params != nil {
+		if params := checkAndFlattenMap(v, trimPrefix(key)); params != nil {
 			r = append(r, VisualizedParam{
 				Key:        key,
 				Parameters: params,
@@ -382,14 +403,14 @@ func flattenMap(m map[string]interface{}, prefix string) []ParameterPair {
 	return r
 }
 
-func generateUpdateKeyParam(files map[string]interface{}, trimPrefix string, updatedType ParameterUpdateType, sets *set.LinkedHashSetString) []VisualizedParam {
+func generateUpdateKeyParam(files map[string]interface{}, trimPrefix func(string) string, updatedType ParameterUpdateType, sets *set.LinkedHashSetString) []VisualizedParam {
 	r := make([]VisualizedParam, 0, len(files))
 
 	for key, params := range files {
 		if sets != nil && sets.Length() > 0 && !sets.InArray(key) {
 			continue
 		}
-		if params := checkAndFlattenMap(params, trimPrefix); params != nil {
+		if params := checkAndFlattenMap(params, trimPrefix(key)); params != nil {
 			r = append(r, VisualizedParam{
 				Key:        key,
 				Parameters: params,
diff --git a/pkg/configuration/core/config_patch.go b/pkg/configuration/core/config_patch.go
index 952e75b5b..8187dd659 100644
--- a/pkg/configuration/core/config_patch.go
+++ b/pkg/configuration/core/config_patch.go
@@ -20,7 +20,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package core
 
 import (
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 )
 
@@ -90,7 +90,7 @@ func difference(base *cfgWrapper, target *cfgWrapper) (*ConfigPatchInfo, error)
 	return reconfigureInfo, nil
 }
 
-func TransformConfigPatchFromData(data map[string]string, format appsv1beta1.CfgFileFormat, keys []string) (*ConfigPatchInfo, error) {
+func TransformConfigPatchFromData(data map[string]string, configRender parametersv1alpha1.ParamConfigRendererSpec) (*ConfigPatchInfo, error) {
 	emptyData := func(m map[string]string) map[string]string {
 		r := make(map[string]string, len(m))
 		for key := range m {
@@ -98,6 +98,6 @@ func TransformConfigPatchFromData(data map[string]string, format appsv1beta1.Cfg
 		}
 		return r
 	}
-	patch, _, err := CreateConfigPatch(emptyData(data), data, format, keys, false)
+	patch, _, err := CreateConfigPatch(emptyData(data), data, configRender, false)
 	return patch, err
 }
diff --git a/pkg/configuration/core/config_patch_util.go b/pkg/configuration/core/config_patch_util.go
index 349e2de96..9da73a9a0 100644
--- a/pkg/configuration/core/config_patch_util.go
+++ b/pkg/configuration/core/config_patch_util.go
@@ -21,31 +21,33 @@ package core
 
 import (
 	"context"
+	"fmt"
 
 	"github.com/StudioSol/set"
 	"sigs.k8s.io/controller-runtime/pkg/log"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/unstructured"
 )
 
 // CreateConfigPatch creates a patch for configuration files with different version.
-func CreateConfigPatch(oldVersion, newVersion map[string]string, format appsv1beta1.CfgFileFormat, keys []string, comparableAllFiles bool) (*ConfigPatchInfo, bool, error) {
+func CreateConfigPatch(oldVersion, newVersion map[string]string, configRender parametersv1alpha1.ParamConfigRendererSpec, comparableAllFiles bool) (*ConfigPatchInfo, bool, error) {
 	var hasFilesUpdated = false
+	var keys = ResolveConfigFiles(configRender.Configs)
 
 	if comparableAllFiles && len(keys) > 0 {
 		hasFilesUpdated = checkExcludeConfigDifference(oldVersion, newVersion, keys)
 	}
 
-	cmKeySet := FromCMKeysSelector(keys)
+	cmKeyFilter := NewConfigFileFilter(configRender.Configs)
 	patch, err := CreateMergePatch(
-		FromConfigData(oldVersion, cmKeySet),
-		FromConfigData(newVersion, cmKeySet),
+		FromConfigData(oldVersion, cmKeyFilter),
+		FromConfigData(newVersion, cmKeyFilter),
 		CfgOption{
-			CfgType: format,
-			Type:    CfgTplType,
-			Log:     log.FromContext(context.TODO()),
+			FileFormatFn: WithConfigFileFormat(configRender.Configs),
+			Type:         CfgTplType,
+			Log:          log.FromContext(context.TODO()),
 		})
 	return patch, hasFilesUpdated, err
 }
@@ -67,7 +69,7 @@ func checkExcludeConfigDifference(oldVersion map[string]string, newVersion map[s
 	return false
 }
 
-func LoadRawConfigObject(data map[string]string, formatConfig *appsv1beta1.FileFormatConfig, keys []string) (map[string]unstructured.ConfigObject, error) {
+func LoadRawConfigObject(data map[string]string, formatConfig *parametersv1alpha1.FileFormatConfig, keys []string) (map[string]unstructured.ConfigObject, error) {
 	r := make(map[string]unstructured.ConfigObject)
 	cmKeySet := FromCMKeysSelector(keys)
 	for key, val := range data {
@@ -83,7 +85,7 @@ func LoadRawConfigObject(data map[string]string, formatConfig *appsv1beta1.FileF
 	return r, nil
 }
 
-func FromConfigObject(name, config string, formatConfig *appsv1beta1.FileFormatConfig) (unstructured.ConfigObject, error) {
+func FromConfigObject(name, config string, formatConfig *parametersv1alpha1.FileFormatConfig) (unstructured.ConfigObject, error) {
 	configObject, err := unstructured.LoadConfig(name, config, formatConfig.Format)
 	if err != nil {
 		return nil, err
@@ -97,19 +99,23 @@ func FromConfigObject(name, config string, formatConfig *appsv1beta1.FileFormatC
 // TransformConfigFileToKeyValueMap transforms a config file in appsv1alpha1.CfgFileFormat format to a map in which the key is config name and the value is config value
 // sectionName means the desired section of config file, such as [mysqld] section.
 // If config file has no section structure, sectionName should be default to get all values in this config file.
-func TransformConfigFileToKeyValueMap(fileName string, formatterConfig *appsv1beta1.FileFormatConfig, configData []byte) (map[string]string, error) {
+func TransformConfigFileToKeyValueMap(fileName string, configRender parametersv1alpha1.ParamConfigRendererSpec, configData []byte) (map[string]string, error) {
+	formatterConfig := ResolveConfigFormat(configRender.Configs, fileName)
+	if formatterConfig == nil {
+		return nil, fmt.Errorf("not found file formatter config: [%s]", fileName)
+	}
+
 	oldData := map[string]string{
 		fileName: "",
 	}
 	newData := map[string]string{
 		fileName: string(configData),
 	}
-	keys := []string{fileName}
-	patchInfo, _, err := CreateConfigPatch(oldData, newData, formatterConfig.Format, keys, false)
+	patchInfo, _, err := CreateConfigPatch(oldData, newData, configRender, false)
 	if err != nil {
 		return nil, err
 	}
-	params := GenerateVisualizedParamsList(patchInfo, formatterConfig, nil)
+	params := GenerateVisualizedParamsList(patchInfo, configRender.Configs)
 	result := make(map[string]string)
 	for _, param := range params {
 		if param.Key != fileName {
@@ -123,3 +129,30 @@ func TransformConfigFileToKeyValueMap(fileName string, formatterConfig *appsv1be
 	}
 	return result, nil
 }
+
+func ResolveConfigFormat(descriptions []parametersv1alpha1.ComponentConfigDescription, file string) *parametersv1alpha1.FileFormatConfig {
+	for _, config := range descriptions {
+		if config.Name == file {
+			return config.FileFormatConfig
+		}
+	}
+	return nil
+}
+
+func WithConfigFileFormat(descriptions []parametersv1alpha1.ComponentConfigDescription) func(file string) *parametersv1alpha1.FileFormatConfig {
+	return func(file string) *parametersv1alpha1.FileFormatConfig {
+		return ResolveConfigFormat(descriptions, file)
+	}
+}
+
+func ResolveConfigFiles(descriptions []parametersv1alpha1.ComponentConfigDescription) []string {
+	var keys []string
+	for _, config := range descriptions {
+		keys = append(keys, config.Name)
+	}
+	return keys
+}
+
+func NewConfigFileFilter(descriptions []parametersv1alpha1.ComponentConfigDescription) *util.Sets {
+	return util.NewSet(ResolveConfigFiles(descriptions)...)
+}
diff --git a/pkg/configuration/core/config_query.go b/pkg/configuration/core/config_query.go
index 384548812..ad8c70edd 100644
--- a/pkg/configuration/core/config_query.go
+++ b/pkg/configuration/core/config_query.go
@@ -25,7 +25,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"sigs.k8s.io/controller-runtime/pkg/log"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 // GetParameterFromConfiguration gets configure parameter
@@ -42,7 +42,7 @@ func GetParameterFromConfiguration(configMap *corev1.ConfigMap, allFiles bool, f
 	wrapCfg, err := NewConfigLoader(CfgOption{
 		Type:           CfgCmType,
 		Log:            log.FromContext(context.Background()),
-		CfgType:        appsv1beta1.Ini,
+		CfgType:        parametersv1alpha1.Ini,
 		ConfigResource: FromConfigData(configMap.Data, nil),
 	})
 	if err != nil {
diff --git a/pkg/configuration/core/config_util.go b/pkg/configuration/core/config_util.go
index 27bff5a53..75632e051 100644
--- a/pkg/configuration/core/config_util.go
+++ b/pkg/configuration/core/config_util.go
@@ -21,15 +21,14 @@ package core
 
 import (
 	"context"
+	"path/filepath"
 	"regexp"
 	"strings"
 
 	"github.com/spf13/cast"
-	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/log"
 
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
 )
 
@@ -96,7 +95,7 @@ func FromStringPointerMap(m map[string]string) map[string]*string {
 	return r
 }
 
-func ApplyConfigPatch(baseCfg []byte, updatedParameters map[string]*string, formatConfig *appsv1beta1.FileFormatConfig) (string, error) {
+func ApplyConfigPatch(baseCfg []byte, updatedParameters map[string]*string, formatConfig *parametersv1alpha1.FileFormatConfig) (string, error) {
 	configLoaderOption := CfgOption{
 		Type:    CfgRawType,
 		Log:     log.FromContext(context.TODO()),
@@ -117,41 +116,27 @@ func ApplyConfigPatch(baseCfg []byte, updatedParameters map[string]*string, form
 	return mergedConfig.Marshal()
 }
 
-func NeedReloadVolume(config appsv1.ComponentConfigSpec) bool {
-	// TODO distinguish between scripts and configuration
-	return config.ConfigConstraintRef != ""
-}
-
-func GetReloadOptions(cli client.Client, ctx context.Context, configSpecs []appsv1.ComponentConfigSpec) (*appsv1beta1.ReloadAction, *appsv1beta1.FileFormatConfig, error) {
-	for _, configSpec := range configSpecs {
-		if !NeedReloadVolume(configSpec) {
-			continue
-		}
-		ccKey := client.ObjectKey{
-			Namespace: "",
-			Name:      configSpec.ConfigConstraintRef,
-		}
-		cfgConst := &appsv1beta1.ConfigConstraint{}
-		if err := cli.Get(ctx, ccKey, cfgConst); err != nil {
-			return nil, nil, WrapError(err, "failed to get ConfigConstraint, key[%v]", ccKey)
-		}
-		if cfgConst.Spec.ReloadAction != nil {
-			return cfgConst.Spec.ReloadAction, cfgConst.Spec.FileFormatConfig, nil
-		}
-	}
-	return nil, nil, nil
-}
-
-func IsWatchModuleForShellTrigger(trigger *appsv1beta1.ShellTrigger) bool {
+func IsWatchModuleForShellTrigger(trigger *parametersv1alpha1.ShellTrigger) bool {
 	if trigger == nil || trigger.Sync == nil {
 		return true
 	}
 	return !*trigger.Sync
 }
 
-func IsWatchModuleForTplTrigger(trigger *appsv1beta1.TPLScriptTrigger) bool {
+func IsWatchModuleForTplTrigger(trigger *parametersv1alpha1.TPLScriptTrigger) bool {
 	if trigger == nil || trigger.Sync == nil {
 		return true
 	}
 	return !*trigger.Sync
 }
+
+func ToV1ConfigDescription(keys []string, format *parametersv1alpha1.FileFormatConfig) []parametersv1alpha1.ComponentConfigDescription {
+	var configs []parametersv1alpha1.ComponentConfigDescription
+	for _, key := range keys {
+		configs = append(configs, parametersv1alpha1.ComponentConfigDescription{
+			Name:             filepath.Base(key),
+			FileFormatConfig: format,
+		})
+	}
+	return configs
+}
diff --git a/pkg/configuration/core/reconfigure_util.go b/pkg/configuration/core/reconfigure_util.go
index b267afd0c..8357345aa 100644
--- a/pkg/configuration/core/reconfigure_util.go
+++ b/pkg/configuration/core/reconfigure_util.go
@@ -28,12 +28,24 @@ import (
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 )
 
 func getUpdateParameterList(cfg *ConfigPatchInfo, trimField string) ([]string, error) {
+	var params []string
+	for _, diff := range cfg.UpdateConfig {
+		r, err := resolveUpdateParameter(diff, trimField)
+		if err != nil {
+			return nil, err
+		}
+		params = append(params, r...)
+	}
+	return params, nil
+}
+
+func resolveUpdateParameter(diff []byte, trimField string) ([]string, error) {
 	params := make([]string, 0)
 	walkFn := func(parent, cur string, v reflect.Value, fn util.UpdateFn) error {
 		if cur != "" {
@@ -45,18 +57,16 @@ func getUpdateParameterList(cfg *ConfigPatchInfo, trimField string) ([]string, e
 		return nil
 	}
 
-	for _, diff := range cfg.UpdateConfig {
-		var err error
-		var updatedParams any
-		if err = json.Unmarshal(diff, &updatedParams); err != nil {
-			return nil, err
-		}
-		if updatedParams, err = trimNestedField(updatedParams, trimField); err != nil {
-			return nil, err
-		}
-		if err := util.UnstructuredObjectWalk(updatedParams, walkFn, true); err != nil {
-			return nil, WrapError(err, "failed to walk params: [%s]", diff)
-		}
+	var err error
+	var updatedParams any
+	if err = json.Unmarshal(diff, &updatedParams); err != nil {
+		return nil, err
+	}
+	if updatedParams, err = trimNestedField(updatedParams, trimField); err != nil {
+		return nil, err
+	}
+	if err := util.UnstructuredObjectWalk(updatedParams, walkFn, true); err != nil {
+		return nil, WrapError(err, "failed to walk params: [%s]", diff)
 	}
 	return params, nil
 }
@@ -78,12 +88,12 @@ func trimNestedField(updatedParams any, trimField string) (any, error) {
 }
 
 // ValidateConfigPatch Verifies if the changed parameters have been removed
-func ValidateConfigPatch(patch *ConfigPatchInfo, formatCfg *appsv1beta1.FileFormatConfig) error {
+func ValidateConfigPatch(patch *ConfigPatchInfo, configRender parametersv1alpha1.ParamConfigRendererSpec) error {
 	if !patch.IsModify || len(patch.UpdateConfig) == 0 {
 		return nil
 	}
 
-	vParams := GenerateVisualizedParamsList(patch, formatCfg, nil)
+	vParams := GenerateVisualizedParamsList(patch, configRender.Configs)
 	for _, param := range vParams {
 		for _, p := range param.Parameters {
 			if p.Value == nil {
@@ -95,12 +105,51 @@ func ValidateConfigPatch(patch *ConfigPatchInfo, formatCfg *appsv1beta1.FileForm
 }
 
 // IsUpdateDynamicParameters checks if the changed parameters require a restart
-func IsUpdateDynamicParameters(cc *appsv1beta1.ConfigConstraintSpec, cfg *ConfigPatchInfo) (bool, error) {
+func IsUpdateDynamicParameters(config *parametersv1alpha1.FileFormatConfig, paramsDef *parametersv1alpha1.ParametersDefinitionSpec, cfg *ConfigPatchInfo) (bool, error) {
 	if len(cfg.DeleteConfig) > 0 || len(cfg.AddConfig) > 0 {
 		return false, nil
 	}
 
-	updatedParams, err := getUpdateParameterList(cfg, NestedPrefixField(cc.FileFormatConfig))
+	updatedParams, err := getUpdateParameterList(cfg, NestedPrefixField(config))
+	if err != nil {
+		return false, err
+	}
+	if len(updatedParams) == 0 {
+		return true, nil
+	}
+	updatedParamsSet := util.NewSet(updatedParams...)
+
+	// if ConfigConstraint has StaticParameters, check updated parameter
+	if len(paramsDef.StaticParameters) > 0 {
+		staticParams := util.NewSet(paramsDef.StaticParameters...)
+		union := util.Union(staticParams, updatedParamsSet)
+		if union.Length() > 0 {
+			return false, nil
+		}
+		// if no dynamicParameters is configured, reload is the default behavior
+		if len(paramsDef.DynamicParameters) == 0 {
+			return true, nil
+		}
+	}
+
+	// if ConfigConstraint has DynamicParameter, and all updated params are dynamic
+	if len(paramsDef.DynamicParameters) > 0 {
+		dynamicParams := util.NewSet(paramsDef.DynamicParameters...)
+		diff := util.Difference(updatedParamsSet, dynamicParams)
+		return diff.Length() == 0, nil
+	}
+
+	// if the updated parameter is not in list of DynamicParameter,
+	// it is StaticParameter by default, and restart is the default behavior.
+	return false, nil
+}
+
+func CheckUpdateDynamicParameters(config *parametersv1alpha1.FileFormatConfig, paramsDef *parametersv1alpha1.ParametersDefinitionSpec, patch string) (bool, error) {
+	if patch == "" {
+		return true, nil
+	}
+
+	updatedParams, err := resolveUpdateParameter([]byte(patch), NestedPrefixField(config))
 	if err != nil {
 		return false, err
 	}
@@ -110,21 +159,21 @@ func IsUpdateDynamicParameters(cc *appsv1beta1.ConfigConstraintSpec, cfg *Config
 	updatedParamsSet := util.NewSet(updatedParams...)
 
 	// if ConfigConstraint has StaticParameters, check updated parameter
-	if len(cc.StaticParameters) > 0 {
-		staticParams := util.NewSet(cc.StaticParameters...)
+	if len(paramsDef.StaticParameters) > 0 {
+		staticParams := util.NewSet(paramsDef.StaticParameters...)
 		union := util.Union(staticParams, updatedParamsSet)
 		if union.Length() > 0 {
 			return false, nil
 		}
 		// if no dynamicParameters is configured, reload is the default behavior
-		if len(cc.DynamicParameters) == 0 {
+		if len(paramsDef.DynamicParameters) == 0 {
 			return true, nil
 		}
 	}
 
 	// if ConfigConstraint has DynamicParameter, and all updated params are dynamic
-	if len(cc.DynamicParameters) > 0 {
-		dynamicParams := util.NewSet(cc.DynamicParameters...)
+	if len(paramsDef.DynamicParameters) > 0 {
+		dynamicParams := util.NewSet(paramsDef.DynamicParameters...)
 		diff := util.Difference(updatedParamsSet, dynamicParams)
 		return diff.Length() == 0, nil
 	}
@@ -135,12 +184,12 @@ func IsUpdateDynamicParameters(cc *appsv1beta1.ConfigConstraintSpec, cfg *Config
 }
 
 // IsDynamicParameter checks if the parameter supports hot update
-func IsDynamicParameter(paramName string, cc *appsv1beta1.ConfigConstraintSpec) bool {
-	if len(cc.DynamicParameters) != 0 {
-		return slices.Contains(cc.DynamicParameters, paramName)
+func IsDynamicParameter(paramName string, paramsDef *parametersv1alpha1.ParametersDefinitionSpec) bool {
+	if len(paramsDef.DynamicParameters) != 0 {
+		return slices.Contains(paramsDef.DynamicParameters, paramName)
 	}
-	if len(cc.StaticParameters) != 0 {
-		return !slices.Contains(cc.StaticParameters, paramName)
+	if len(paramsDef.StaticParameters) != 0 {
+		return !slices.Contains(paramsDef.StaticParameters, paramName)
 	}
 	return false
 }
diff --git a/pkg/configuration/core/type.go b/pkg/configuration/core/type.go
index c520ce505..83a62fefd 100644
--- a/pkg/configuration/core/type.go
+++ b/pkg/configuration/core/type.go
@@ -28,7 +28,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 )
 
@@ -43,7 +43,7 @@ const (
 
 type RawConfig struct {
 	// formatter
-	Type appsv1beta1.CfgFileFormat
+	Type parametersv1alpha1.CfgFileFormat
 
 	RawData string
 }
@@ -124,7 +124,9 @@ type CfgOption struct {
 	Log  logr.Logger
 
 	// formatter
-	CfgType appsv1beta1.CfgFileFormat
+	CfgType parametersv1alpha1.CfgFileFormat
+
+	FileFormatFn func(file string) *parametersv1alpha1.FileFormatConfig
 
 	// Path for CfgLocalType test
 	Path    string
diff --git a/pkg/configuration/proto/reconfigure.pb.go b/pkg/configuration/proto/reconfigure.pb.go
index 1bac00e76..47f273cfd 100644
--- a/pkg/configuration/proto/reconfigure.pb.go
+++ b/pkg/configuration/proto/reconfigure.pb.go
@@ -1,17 +1,16 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.28.1
-// 	protoc        v3.21.9
+// 	protoc        v4.24.3
 // source: reconfigure.proto
 
 package proto
 
 import (
-	reflect "reflect"
-	sync "sync"
-
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
 const (
@@ -122,6 +121,7 @@ type OnlineUpgradeParamsRequest struct {
 
 	ConfigSpec string            `protobuf:"bytes,1,opt,name=configSpec,proto3" json:"configSpec,omitempty"`
 	Params     map[string]string `protobuf:"bytes,2,rep,name=params,proto3" json:"params,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	ConfigFile *string           `protobuf:"bytes,3,opt,name=configFile,proto3,oneof" json:"configFile,omitempty"`
 }
 
 func (x *OnlineUpgradeParamsRequest) Reset() {
@@ -170,6 +170,13 @@ func (x *OnlineUpgradeParamsRequest) GetParams() map[string]string {
 	return nil
 }
 
+func (x *OnlineUpgradeParamsRequest) GetConfigFile() string {
+	if x != nil && x.ConfigFile != nil {
+		return *x.ConfigFile
+	}
+	return ""
+}
+
 type OnlineUpgradeParamsResponse struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
@@ -229,7 +236,7 @@ var file_reconfigure_proto_rawDesc = []byte{
 	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
 	0x1e, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20,
 	0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x72, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
-	0xbe, 0x01, 0x0a, 0x1a, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64,
+	0xf2, 0x01, 0x0a, 0x1a, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64,
 	0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e,
 	0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01,
 	0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x45,
@@ -237,31 +244,34 @@ var file_reconfigure_proto_rawDesc = []byte{
 	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x67,
 	0x72, 0x61, 0x64, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
 	0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x70,
-	0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45,
-	0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01,
-	0x22, 0x3d, 0x0a, 0x1b, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64,
-	0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
-	0x1e, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x72, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32,
-	0xbb, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12,
-	0x4c, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72,
-	0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e,
-	0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e,
-	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69,
-	0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a,
-	0x13, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x61,
-	0x72, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x6e, 0x6c,
-	0x69, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e,
-	0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x61, 0x72,
-	0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x3d, 0x5a,
-	0x3b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x61, 0x70, 0x65, 0x63,
-	0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x2f,
-	0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75,
-	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x33,
+	0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x23, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x46,
+	0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x63, 0x6f, 0x6e,
+	0x66, 0x69, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x50, 0x61,
+	0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76,
+	0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75,
+	0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x46, 0x69, 0x6c, 0x65, 0x22, 0x3d, 0x0a, 0x1b, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70,
+	0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f,
+	0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x72, 0x72, 0x4d, 0x65, 0x73, 0x73,
+	0x61, 0x67, 0x65, 0x32, 0xbb, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x75, 0x72, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61,
+	0x69, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x6f,
+	0x70, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+	0x74, 0x1a, 0x1c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x43, 0x6f,
+	0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x00, 0x12, 0x5e, 0x0a, 0x13, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61,
+	0x64, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x61,
+	0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64,
+	0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x00, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+	0x61, 0x70, 0x65, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6b, 0x75, 0x62, 0x65, 0x62, 0x6c, 0x6f,
+	0x63, 0x6b, 0x73, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f,
+	0x74, 0x6f, 0x33,
 }
 
 var (
@@ -352,6 +362,7 @@ func file_reconfigure_proto_init() {
 			}
 		}
 	}
+	file_reconfigure_proto_msgTypes[2].OneofWrappers = []interface{}{}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
diff --git a/pkg/configuration/proto/reconfigure.proto b/pkg/configuration/proto/reconfigure.proto
index 43e1d2b84..f949b84e5 100644
--- a/pkg/configuration/proto/reconfigure.proto
+++ b/pkg/configuration/proto/reconfigure.proto
@@ -21,6 +21,7 @@ message StopContainerResponse {
 message OnlineUpgradeParamsRequest {
   string configSpec = 1;
   map<string, string> params = 2;
+  optional string configFile = 3;
 }
 
 message OnlineUpgradeParamsResponse {
diff --git a/pkg/configuration/proto/reconfigure_grpc.pb.go b/pkg/configuration/proto/reconfigure_grpc.pb.go
index a3371018a..59849da90 100644
--- a/pkg/configuration/proto/reconfigure_grpc.pb.go
+++ b/pkg/configuration/proto/reconfigure_grpc.pb.go
@@ -1,14 +1,13 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.2.0
-// - protoc             v3.21.9
+// - protoc             v4.24.3
 // source: reconfigure.proto
 
 package proto
 
 import (
 	context "context"
-
 	grpc "google.golang.org/grpc"
 	codes "google.golang.org/grpc/codes"
 	status "google.golang.org/grpc/status"
diff --git a/pkg/configuration/validate/config_validate.go b/pkg/configuration/validate/config_validate.go
index c28717cae..c3f779ad1 100644
--- a/pkg/configuration/validate/config_validate.go
+++ b/pkg/configuration/validate/config_validate.go
@@ -20,90 +20,52 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package validate
 
 import (
-	"github.com/StudioSol/set"
 	apiext "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
 	"k8s.io/kube-openapi/pkg/validation/errors"
 	kubeopenapispec "k8s.io/kube-openapi/pkg/validation/spec"
 	"k8s.io/kube-openapi/pkg/validation/strfmt"
 	"k8s.io/kube-openapi/pkg/validation/validate"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 )
 
 type ValidatorOptions = func(key string) bool
 
 type ConfigValidator interface {
-	Validate(data map[string]string) error
-}
-
-type cmKeySelector struct {
-	// A ConfigMap object may contain multiple configuration files and only some of them can be parsed and verified by kubeblocks,
-	// such as postgresql, there are two files pg_hba.conf & postgresql.conf in the ConfigMap, and we can only validate postgresql.conf,
-	// so pg_hba.conf file needs to be ignored during when doing verification.
-	// keySelector filters the keys in the configmap.
-	keySelector []ValidatorOptions
+	Validate(data string) error
 }
 
 type configCueValidator struct {
-	cmKeySelector
-
 	// cue describes configuration template
 	cueScript string
-	cfgType   appsv1beta1.CfgFileFormat
-}
-
-func (s *cmKeySelector) filter(key string) bool {
-	if len(s.keySelector) == 0 {
-		return false
-	}
-
-	for _, option := range s.keySelector {
-		if !option(key) {
-			return true
-		}
-	}
-	return false
+	cfgType   parametersv1alpha1.CfgFileFormat
 }
 
-func (c *configCueValidator) Validate(data map[string]string) error {
+func (c *configCueValidator) Validate(content string) error {
 	if c.cueScript == "" {
 		return nil
 	}
-	for key, content := range data {
-		if c.filter(key) {
-			continue
-		}
-		if err := ValidateConfigurationWithCue(c.cueScript, c.cfgType, content); err != nil {
-			return err
-		}
-	}
-	return nil
+	return ValidateConfigWithCue(c.cueScript, c.cfgType, content)
 }
 
 type schemaValidator struct {
-	cmKeySelector
-
 	typeName string
 	schema   *apiext.JSONSchemaProps
-	cfgType  appsv1beta1.CfgFileFormat
+	cfgType  parametersv1alpha1.CfgFileFormat
 }
 
-func (s *schemaValidator) Validate(data map[string]string) error {
+func (s *schemaValidator) Validate(content string) error {
+	var err error
+	var parameters map[string]interface{}
+
 	openAPITypes := &kubeopenapispec.Schema{}
 	validator := validate.NewSchemaValidator(openAPITypes, nil, "", strfmt.Default)
-	for key, data := range data {
-		if s.filter(key) {
-			continue
-		}
-		cfg, err := LoadConfigObjectFromContent(s.cfgType, data)
-		if err != nil {
-			return err
-		}
-		res := validator.Validate(cfg)
-		if res.HasErrors() {
-			return core.WrapError(errors.CompositeValidationError(res.Errors...), "failed to schema validate for cfg: %s", key)
-		}
+	if parameters, err = LoadConfigObjectFromContent(s.cfgType, content); err != nil {
+		return err
+	}
+	if res := validator.Validate(parameters); res.HasErrors() {
+		return core.WrapError(errors.CompositeValidationError(res.Errors...), "failed to schema validate for config file")
 	}
 	return nil
 }
@@ -111,49 +73,29 @@ func (s *schemaValidator) Validate(data map[string]string) error {
 type emptyValidator struct {
 }
 
-func (e emptyValidator) Validate(_ map[string]string) error {
+func (e emptyValidator) Validate(_ string) error {
 	return nil
 }
 
-func WithKeySelector(keys []string) ValidatorOptions {
-	var sets *set.LinkedHashSetString
-	if len(keys) > 0 {
-		sets = core.FromCMKeysSelector(keys)
-	}
-	return func(key string) bool {
-		return sets == nil || sets.InArray(key)
-	}
-}
-
-func NewConfigValidator(configConstraint *appsv1beta1.ConfigConstraintSpec, options ...ValidatorOptions) ConfigValidator {
-	if configConstraint == nil || configConstraint.FileFormatConfig == nil {
+func NewConfigValidator(paramsSchema *parametersv1alpha1.ParametersSchema, fileFormat *parametersv1alpha1.FileFormatConfig) ConfigValidator {
+	if fileFormat == nil {
 		return &emptyValidator{}
 	}
 
-	var (
-		validator    ConfigValidator
-		configSchema = configConstraint.ParametersSchema
-	)
-
+	var validator ConfigValidator
 	switch {
-	case configSchema == nil:
+	case paramsSchema == nil:
 		validator = &emptyValidator{}
-	case len(configSchema.CUE) != 0:
+	case len(paramsSchema.CUE) != 0:
 		validator = &configCueValidator{
-			cmKeySelector: cmKeySelector{
-				keySelector: options,
-			},
-			cfgType:   configConstraint.FileFormatConfig.Format,
-			cueScript: configSchema.CUE,
+			cfgType:   fileFormat.Format,
+			cueScript: paramsSchema.CUE,
 		}
-	case configSchema.SchemaInJSON != nil:
+	case paramsSchema.SchemaInJSON != nil:
 		validator = &schemaValidator{
-			cmKeySelector: cmKeySelector{
-				keySelector: options,
-			},
-			typeName: configSchema.TopLevelKey,
-			cfgType:  configConstraint.FileFormatConfig.Format,
-			schema:   configSchema.SchemaInJSON,
+			typeName: paramsSchema.TopLevelKey,
+			cfgType:  fileFormat.Format,
+			schema:   paramsSchema.SchemaInJSON,
 		}
 	default:
 		validator = &emptyValidator{}
diff --git a/pkg/configuration/validate/cue_util.go b/pkg/configuration/validate/cue_util.go
index 5d3dc9d20..b45856a90 100644
--- a/pkg/configuration/validate/cue_util.go
+++ b/pkg/configuration/validate/cue_util.go
@@ -23,7 +23,7 @@ import (
 	"cuelang.org/go/cue"
 	"cuelang.org/go/cue/cuecontext"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/unstructured"
 )
@@ -56,16 +56,16 @@ func CueValidate(cueTpl string) error {
 	return tpl.Validate()
 }
 
-func ValidateConfigurationWithCue(cueString string, cfgType appsv1beta1.CfgFileFormat, rawData string) error {
+func ValidateConfigWithCue(cueString string, cfgType parametersv1alpha1.CfgFileFormat, rawData string) error {
 	parameters, err := LoadConfigObjectFromContent(cfgType, rawData)
 	if err != nil {
 		return core.WrapError(err, "failed to load configuration [%s]", rawData)
 	}
 
-	return unstructuredDataValidateByCue(cueString, parameters, cfgType == appsv1beta1.Properties || cfgType == appsv1beta1.PropertiesPlus)
+	return unstructuredDataValidateByCue(cueString, parameters, cfgType == parametersv1alpha1.Properties || cfgType == parametersv1alpha1.PropertiesPlus)
 }
 
-func LoadConfigObjectFromContent(cfgType appsv1beta1.CfgFileFormat, rawData string) (map[string]interface{}, error) {
+func LoadConfigObjectFromContent(cfgType parametersv1alpha1.CfgFileFormat, rawData string) (map[string]interface{}, error) {
 	configObject, err := unstructured.LoadConfig("validate", rawData, cfgType)
 	if err != nil {
 		return nil, err
diff --git a/pkg/constant/const.go b/pkg/constant/const.go
index 0e1f93428..e8d0fd0a0 100644
--- a/pkg/constant/const.go
+++ b/pkg/constant/const.go
@@ -43,7 +43,7 @@ const (
 	ConfigMapKind             = "ConfigMap"
 	PersistentVolumeClaimKind = "PersistentVolumeClaim"
 	PersistentVolumeKind      = "PersistentVolume"
-	ConfigurationKind         = "Configuration"
+	ComponentParameterKind    = "ComponentParameter"
 	RoleBindingKind           = "RoleBinding"
 	ServiceAccountKind        = "ServiceAccount"
 	EventKind                 = "Event"
diff --git a/pkg/constant/payload.go b/pkg/constant/payload.go
index e93f296c7..6e0e85fd8 100644
--- a/pkg/constant/payload.go
+++ b/pkg/constant/payload.go
@@ -20,6 +20,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package constant
 
 const (
+	TLSPayload               = "tls"
 	ComponentResourcePayload = "component-resource"
 	ReplicasPayload          = "replicas"
 	BinaryVersionPayload     = "binary-version"
diff --git a/pkg/controller/builder/builder_component_definition.go b/pkg/controller/builder/builder_component_definition.go
index 84f09963d..beb8f4db3 100644
--- a/pkg/controller/builder/builder_component_definition.go
+++ b/pkg/controller/builder/builder_component_definition.go
@@ -127,20 +127,16 @@ func (builder *ComponentDefinitionBuilder) AddServiceExt(name, serviceName strin
 	return builder
 }
 
-func (builder *ComponentDefinitionBuilder) AddConfigTemplate(name, configTemplateRef, configConstraintRef,
-	namespace, volumeName string, injectEnvTo ...string) *ComponentDefinitionBuilder {
-	config := appsv1.ComponentConfigSpec{
-		ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-			Name:        name,
-			TemplateRef: configTemplateRef,
-			Namespace:   namespace,
-			VolumeName:  volumeName,
-		},
-		ConfigConstraintRef: configConstraintRef,
-		InjectEnvTo:         injectEnvTo,
+func (builder *ComponentDefinitionBuilder) AddConfigTemplate(name, configTemplateRef,
+	namespace, volumeName string) *ComponentDefinitionBuilder {
+	config := appsv1.ComponentTemplateSpec{
+		Name:        name,
+		TemplateRef: configTemplateRef,
+		Namespace:   namespace,
+		VolumeName:  volumeName,
 	}
 	if builder.get().Spec.Configs == nil {
-		builder.get().Spec.Configs = make([]appsv1.ComponentConfigSpec, 0)
+		builder.get().Spec.Configs = make([]appsv1.ComponentTemplateSpec, 0)
 	}
 	builder.get().Spec.Configs = append(builder.get().Spec.Configs, config)
 	return builder
diff --git a/pkg/controller/builder/builder_configuration.go b/pkg/controller/builder/builder_configuration.go
deleted file mode 100644
index 4f2550035..000000000
--- a/pkg/controller/builder/builder_configuration.go
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package builder
-
-import (
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-)
-
-type ConfigurationBuilder struct {
-	BaseBuilder[appsv1alpha1.Configuration, *appsv1alpha1.Configuration, ConfigurationBuilder]
-}
-
-func NewConfigurationBuilder(namespace, name string) *ConfigurationBuilder {
-	builder := &ConfigurationBuilder{}
-	builder.init(namespace, name, &appsv1alpha1.Configuration{}, builder)
-	return builder
-}
-
-func (c *ConfigurationBuilder) ClusterRef(clusterName string) *ConfigurationBuilder {
-	c.get().Spec.ClusterRef = clusterName
-	return c
-}
-
-func (c *ConfigurationBuilder) Component(component string) *ConfigurationBuilder {
-	c.get().Spec.ComponentName = component
-	return c
-}
-
-func (c *ConfigurationBuilder) AddConfigurationItem(configSpec appsv1.ComponentConfigSpec) *ConfigurationBuilder {
-	c.get().Spec.ConfigItemDetails = append(c.get().Spec.ConfigItemDetails,
-		appsv1alpha1.ConfigurationItemDetail{
-			Name:       configSpec.Name,
-			ConfigSpec: ToV1alpha1ConfigSpec(configSpec.DeepCopy()),
-		})
-	return c
-}
-
-func ToV1ConfigSpec(spec *appsv1alpha1.ComponentConfigSpec) *appsv1.ComponentConfigSpec {
-	v1 := &appsv1.ComponentConfigSpec{
-		ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-			Name:        spec.Name,
-			TemplateRef: spec.TemplateRef,
-			Namespace:   spec.Namespace,
-			VolumeName:  spec.VolumeName,
-			DefaultMode: spec.DefaultMode,
-		},
-		Keys:                spec.Keys,
-		ConfigConstraintRef: spec.ConfigConstraintRef,
-		AsEnvFrom:           spec.AsEnvFrom,
-		InjectEnvTo:         spec.InjectEnvTo,
-		AsSecret:            spec.AsSecret,
-	}
-	if spec.ReRenderResourceTypes != nil {
-		v1.ReRenderResourceTypes = make([]appsv1.RerenderResourceType, 0)
-		for _, r := range spec.ReRenderResourceTypes {
-			v1.ReRenderResourceTypes = append(v1.ReRenderResourceTypes, appsv1.RerenderResourceType(r))
-		}
-	}
-	return v1
-}
-
-func ToV1alpha1ConfigSpec(spec *appsv1.ComponentConfigSpec) *appsv1alpha1.ComponentConfigSpec {
-	v1 := &appsv1alpha1.ComponentConfigSpec{
-		ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{
-			Name:        spec.Name,
-			TemplateRef: spec.TemplateRef,
-			Namespace:   spec.Namespace,
-			VolumeName:  spec.VolumeName,
-			DefaultMode: spec.DefaultMode,
-		},
-		Keys:                spec.Keys,
-		ConfigConstraintRef: spec.ConfigConstraintRef,
-		AsEnvFrom:           spec.AsEnvFrom,
-		InjectEnvTo:         spec.InjectEnvTo,
-		AsSecret:            spec.AsSecret,
-	}
-	if spec.ReRenderResourceTypes != nil {
-		v1.ReRenderResourceTypes = make([]appsv1alpha1.RerenderResourceType, 0)
-		for _, r := range spec.ReRenderResourceTypes {
-			v1.ReRenderResourceTypes = append(v1.ReRenderResourceTypes, appsv1alpha1.RerenderResourceType(r))
-		}
-	}
-	return v1
-}
diff --git a/pkg/controller/builder/builder_parameter.go b/pkg/controller/builder/builder_parameter.go
index 4cb438991..132e546ba 100644
--- a/pkg/controller/builder/builder_parameter.go
+++ b/pkg/controller/builder/builder_parameter.go
@@ -20,7 +20,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package builder
 
 import (
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
@@ -45,10 +44,10 @@ func (c *ParameterBuilder) SetComponentParameters(component string, parameters p
 	return c
 }
 
-func (c *ParameterBuilder) AddCustomTemplate(component string, tpl string, customTemplates appsv1.ConfigTemplateExtension) *ParameterBuilder {
+func (c *ParameterBuilder) AddCustomTemplate(component string, tpl string, customTemplates parametersv1alpha1.ConfigTemplateExtension) *ParameterBuilder {
 	componentSpec := safeGetComponentSpec(&c.get().Spec, component)
 	if componentSpec.CustomTemplates == nil {
-		componentSpec.CustomTemplates = make(map[string]appsv1.ConfigTemplateExtension)
+		componentSpec.CustomTemplates = make(map[string]parametersv1alpha1.ConfigTemplateExtension)
 	}
 	componentSpec.CustomTemplates[tpl] = customTemplates
 	return c
diff --git a/pkg/controller/component/sidecar.go b/pkg/controller/component/sidecar.go
index c175ce2fe..1d062ba7e 100644
--- a/pkg/controller/component/sidecar.go
+++ b/pkg/controller/component/sidecar.go
@@ -91,17 +91,7 @@ func buildSidecarVars(sidecarDef *appsv1.SidecarDefinition, synthesizedComp *Syn
 
 func buildSidecarConfigs(sidecarDef *appsv1.SidecarDefinition, synthesizedComp *SynthesizedComponent) error {
 	if sidecarDef.Spec.Configs != nil {
-		templateToConfig := func() []appsv1.ComponentConfigSpec {
-			if len(sidecarDef.Spec.Configs) == 0 {
-				return nil
-			}
-			l := make([]appsv1.ComponentConfigSpec, 0)
-			for i := range sidecarDef.Spec.Configs {
-				l = append(l, appsv1.ComponentConfigSpec{ComponentTemplateSpec: sidecarDef.Spec.Configs[i]})
-			}
-			return l
-		}
-		synthesizedComp.ConfigTemplates = append(synthesizedComp.ConfigTemplates, templateToConfig()...)
+		synthesizedComp.ConfigTemplates = append(synthesizedComp.ConfigTemplates, sidecarDef.Spec.Configs...)
 	}
 	return nil
 }
diff --git a/pkg/controller/component/synthesize_component.go b/pkg/controller/component/synthesize_component.go
index b2f914195..ecae73eb9 100644
--- a/pkg/controller/component/synthesize_component.go
+++ b/pkg/controller/component/synthesize_component.go
@@ -292,7 +292,7 @@ func mergeUserDefinedVolumes(synthesizedComp *SynthesizedComponent, comp *appsv1
 		return nil
 	}
 	for _, tpl := range synthesizedComp.ConfigTemplates {
-		if err := checkConfigNScriptTemplate(tpl.ComponentTemplateSpec); err != nil {
+		if err := checkConfigNScriptTemplate(tpl); err != nil {
 			return err
 		}
 	}
@@ -371,7 +371,7 @@ func overrideNCheckConfigTemplates(synthesizedComp *SynthesizedComponent, comp *
 		return checkConfigTemplates(synthesizedComp)
 	}
 
-	templates := make(map[string]*appsv1.ComponentConfigSpec)
+	templates := make(map[string]*appsv1.ComponentTemplateSpec)
 	for i, template := range synthesizedComp.ConfigTemplates {
 		templates[template.Name] = &synthesizedComp.ConfigTemplates[i]
 	}
@@ -477,13 +477,3 @@ func buildRuntimeClassName(synthesizeComp *SynthesizedComponent, comp *appsv1.Co
 	}
 	synthesizeComp.PodSpec.RuntimeClassName = comp.Spec.RuntimeClassName
 }
-
-func GetConfigSpecByName(synthesizedComp *SynthesizedComponent, configSpec string) *appsv1.ComponentConfigSpec {
-	for i := range synthesizedComp.ConfigTemplates {
-		template := &synthesizedComp.ConfigTemplates[i]
-		if template.Name == configSpec {
-			return template
-		}
-	}
-	return nil
-}
diff --git a/pkg/controller/component/type.go b/pkg/controller/component/type.go
index ba474bc1c..ec7a45773 100644
--- a/pkg/controller/component/type.go
+++ b/pkg/controller/component/type.go
@@ -47,7 +47,7 @@ type SynthesizedComponent struct {
 	VolumeClaimTemplates             []corev1.PersistentVolumeClaimTemplate `json:"volumeClaimTemplates,omitempty"`
 	LogConfigs                       []kbappsv1.LogConfig                   `json:"logConfigs,omitempty"`
 	FileTemplates                    []SynthesizedFileTemplate
-	ConfigTemplates                  []kbappsv1.ComponentConfigSpec         `json:"configTemplates,omitempty"`
+	ConfigTemplates                  []kbappsv1.ComponentTemplateSpec       `json:"configTemplates,omitempty"`
 	ScriptTemplates                  []kbappsv1.ComponentTemplateSpec       `json:"scriptTemplates,omitempty"`
 	TLSConfig                        *kbappsv1.TLSConfig                    `json:"tlsConfig"`
 	ServiceAccountName               string                                 `json:"serviceAccountName,omitempty"`
diff --git a/pkg/controller/configuration/annotation_utils.go b/pkg/controller/configuration/annotation_utils.go
index 066ddedec..bc47767c0 100644
--- a/pkg/controller/configuration/annotation_utils.go
+++ b/pkg/controller/configuration/annotation_utils.go
@@ -21,25 +21,12 @@ import (
 
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
 )
 
-// BuildConfigConstraintLabels builds config constraints labels for object
-func BuildConfigConstraintLabels(object client.Object, configSpecs []appsv1.ComponentConfigSpec) {
-	asMapLabels := make(map[string]string)
-	for _, configSpec := range configSpecs {
-		asMapLabels[core.GenerateTPLUniqLabelKeyWithConfig(configSpec.Name)] = configSpec.TemplateRef
-		if len(configSpec.ConfigConstraintRef) != 0 {
-			asMapLabels[core.GenerateConstraintsUniqLabelKeyWithConfig(configSpec.ConfigConstraintRef)] = configSpec.ConfigConstraintRef
-		}
-	}
-	updateLabelsOrAnnotations(asMapLabels, object.GetLabels, object.SetLabels, constant.ConfigurationConstraintsLabelPrefixKey, constant.ConfigurationTplLabelPrefixKey)
-}
-
 // BuildConfigTemplateAnnotations builds config template annotations for object
 func BuildConfigTemplateAnnotations(object client.Object, synthesizedComp *component.SynthesizedComponent) {
 	asMapAnnotations := make(map[string]string)
diff --git a/pkg/controller/configuration/config_utils.go b/pkg/controller/configuration/config_utils.go
index cb640db6a..2ba923e91 100644
--- a/pkg/controller/configuration/config_utils.go
+++ b/pkg/controller/configuration/config_utils.go
@@ -26,56 +26,47 @@ import (
 	"strings"
 
 	corev1 "k8s.io/api/core/v1"
-	apierrors "k8s.io/apimachinery/pkg/api/errors"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/log"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgcm "github.com/apecloud/kubeblocks/pkg/configuration/config_manager"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
 	"github.com/apecloud/kubeblocks/pkg/controller/factory"
+	"github.com/apecloud/kubeblocks/pkg/controller/render"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 	viper "github.com/apecloud/kubeblocks/pkg/viperx"
 )
 
-func createConfigObjects(cli client.Client, ctx context.Context, objs []client.Object, excludeObjs []client.Object) error {
-	for _, obj := range objs {
-		if slices.Contains(excludeObjs, obj) {
-			continue
-		}
-		if err := cli.Create(ctx, obj, inDataContext()); err != nil {
-
-			if !apierrors.IsAlreadyExists(err) {
-				return err
-			}
-			// for update script cm
-			if core.IsSchedulableConfigResource(obj) {
-				continue
-			}
-			if err := cli.Update(ctx, obj, inDataContext()); err != nil {
-				return err
-			}
-		}
-	}
-	return nil
-}
-
-// buildConfigManagerWithComponent build the configmgr sidecar container and update it
+// BuildReloadActionContainer build the configmgr sidecar container and update it
 // into PodSpec if configuration reload option is on
-func buildConfigManagerWithComponent(podSpec *corev1.PodSpec, configSpecs []appsv1.ComponentConfigSpec,
-	ctx context.Context, cli client.Client, cluster *appsv1.Cluster, synthesizedComp *component.SynthesizedComponent) error {
-	var err error
-	var buildParams *cfgcm.CfgManagerBuildParams
+func BuildReloadActionContainer(resourceCtx *render.ResourceCtx, cluster *appsv1.Cluster, synthesizedComp *component.SynthesizedComponent, cmpd *appsv1.ComponentDefinition, configmaps []*corev1.ConfigMap) error {
+	var (
+		err         error
+		buildParams *cfgcm.CfgManagerBuildParams
+
+		podSpec      = synthesizedComp.PodSpec
+		configSpecs  = synthesizedComp.ConfigTemplates
+		configRender *parametersv1alpha1.ParamConfigRenderer
+		paramsDefs   []*parametersv1alpha1.ParametersDefinition
+	)
 
 	volumeDirs, usingConfigSpecs := getUsingVolumesByConfigSpecs(podSpec, configSpecs)
 	if len(volumeDirs) == 0 {
 		return nil
 	}
-	configSpecMetas, err := cfgcm.GetSupportReloadConfigSpecs(usingConfigSpecs, cli, ctx)
+	if configRender, paramsDefs, err = intctrlutil.ResolveCmpdParametersDefs(resourceCtx.Context, resourceCtx.Client, cmpd); err != nil {
+		return err
+	}
+	if configRender == nil || len(configRender.Spec.Configs) == 0 {
+		return nil
+	}
+
+	configSpecMetas, err := cfgcm.GetSupportReloadConfigSpecs(usingConfigSpecs, configRender.Spec.Configs, paramsDefs)
 	if err != nil {
 		return err
 	}
@@ -85,7 +76,7 @@ func buildConfigManagerWithComponent(podSpec *corev1.PodSpec, configSpecs []apps
 	if len(configSpecMetas) == 0 {
 		return nil
 	}
-	if buildParams, err = buildConfigManagerParams(cli, ctx, cluster, synthesizedComp, configSpecMetas, volumeDirs, podSpec); err != nil {
+	if buildParams, err = buildConfigManagerParams(resourceCtx.Client, resourceCtx.Context, cluster, synthesizedComp, configSpecMetas, volumeDirs, podSpec); err != nil {
 		return err
 	}
 	if buildParams == nil {
@@ -161,18 +152,11 @@ func updateCfgManagerVolumes(podSpec *corev1.PodSpec, configManager *cfgcm.CfgMa
 		}
 	}
 	podSpec.Volumes = podVolumes
-
-	for volumeName, volume := range configManager.ConfigLazyRenderedVolumes {
-		usingContainers := intctrlutil.GetPodContainerWithVolumeMount(podSpec, volumeName)
-		for _, container := range usingContainers {
-			container.VolumeMounts = append(container.VolumeMounts, volume)
-		}
-	}
 }
 
-func getUsingVolumesByConfigSpecs(podSpec *corev1.PodSpec, configSpecs []appsv1.ComponentConfigSpec) ([]corev1.VolumeMount, []appsv1.ComponentConfigSpec) {
+func getUsingVolumesByConfigSpecs(podSpec *corev1.PodSpec, configSpecs []appsv1.ComponentTemplateSpec) ([]corev1.VolumeMount, []appsv1.ComponentTemplateSpec) {
 	// Ignore useless configTemplate
-	usingConfigSpecs := make([]appsv1.ComponentConfigSpec, 0, len(configSpecs))
+	usingConfigSpecs := make([]appsv1.ComponentTemplateSpec, 0, len(configSpecs))
 	config2Containers := make(map[string][]*corev1.Container)
 	for _, configSpec := range configSpecs {
 		usingContainers := intctrlutil.GetPodContainerWithVolumeMount(podSpec, configSpec.VolumeName)
@@ -192,10 +176,6 @@ func getUsingVolumesByConfigSpecs(podSpec *corev1.PodSpec, configSpecs []appsv1.
 	// Find out which configurations are used by the container
 	volumeDirs := make([]corev1.VolumeMount, 0, len(configSpecs)+1)
 	for _, configSpec := range usingConfigSpecs {
-		// Ignore config template, e.g scripts configmap
-		if !core.NeedReloadVolume(configSpec) {
-			continue
-		}
 		sets := cfgutil.NewSet()
 		for _, container := range config2Containers[configSpec.Name] {
 			volume := intctrlutil.GetVolumeMountByVolume(container, configSpec.VolumeName)
@@ -210,14 +190,13 @@ func getUsingVolumesByConfigSpecs(podSpec *corev1.PodSpec, configSpecs []appsv1.
 
 func buildConfigManagerParams(cli client.Client, ctx context.Context, cluster *appsv1.Cluster, comp *component.SynthesizedComponent, configSpecBuildParams []cfgcm.ConfigSpecMeta, volumeDirs []corev1.VolumeMount, podSpec *corev1.PodSpec) (*cfgcm.CfgManagerBuildParams, error) {
 	cfgManagerParams := &cfgcm.CfgManagerBuildParams{
-		ManagerName:               constant.ConfigSidecarName,
-		ComponentName:             comp.Name,
-		Image:                     viper.GetString(constant.KBToolsImage),
-		Volumes:                   volumeDirs,
-		Cluster:                   cluster,
-		ConfigSpecsBuildParams:    configSpecBuildParams,
-		ConfigLazyRenderedVolumes: make(map[string]corev1.VolumeMount),
-		ContainerPort:             viper.GetInt32(constant.ConfigManagerGPRCPortEnv),
+		ManagerName:            constant.ConfigSidecarName,
+		ComponentName:          comp.Name,
+		Image:                  viper.GetString(constant.KBToolsImage),
+		Volumes:                volumeDirs,
+		Cluster:                cluster,
+		ConfigSpecsBuildParams: configSpecBuildParams,
+		ContainerPort:          viper.GetInt32(constant.ConfigManagerGPRCPortEnv),
 	}
 
 	if podSpec.HostNetwork {
@@ -237,7 +216,7 @@ func buildConfigManagerParams(cli client.Client, ctx context.Context, cluster *a
 	return cfgManagerParams, nil
 }
 
-func GetConfigManagerGRPCPort(containers []corev1.Container) (int32, error) {
+func ResolveReloadServerGRPCPort(containers []corev1.Container) (int32, error) {
 	for _, container := range containers {
 		if container.Name != constant.ConfigSidecarName {
 			continue
@@ -269,47 +248,69 @@ func findPortByPortName(container corev1.Container) (int32, bool) {
 }
 
 // UpdateConfigPayload updates the configuration payload
-func UpdateConfigPayload(config *appsv1alpha1.ConfigurationSpec, component *component.SynthesizedComponent) (bool, error) {
-	updated := false
-	for i := range config.ConfigItemDetails {
+func UpdateConfigPayload(config *parametersv1alpha1.ComponentParameterSpec, component *appsv1.ComponentSpec, configRender *parametersv1alpha1.ParamConfigRendererSpec) error {
+	if len(configRender.Configs) == 0 {
+		return nil
+	}
+
+	for i, item := range config.ConfigItemDetails {
+		configDescs := intctrlutil.GetComponentConfigDescriptions(configRender, item.Name)
 		configSpec := &config.ConfigItemDetails[i]
 		// check v-scale operation
-		if enableVScaleTrigger(configSpec.ConfigSpec) {
+		if enableVScaleTrigger(configDescs) {
 			resourcePayload := intctrlutil.ResourcesPayloadForComponent(component.Resources)
-			ret, err := intctrlutil.CheckAndPatchPayload(configSpec, constant.ComponentResourcePayload, resourcePayload)
-			if err != nil {
-				return false, err
+			if _, err := intctrlutil.CheckAndPatchPayload(configSpec, constant.ComponentResourcePayload, resourcePayload); err != nil {
+				return err
 			}
-			updated = updated || ret
 		}
 		// check h-scale operation
-		if enableHScaleTrigger(configSpec.ConfigSpec) {
-			ret, err := intctrlutil.CheckAndPatchPayload(configSpec, constant.ReplicasPayload, component.Replicas)
-			if err != nil {
-				return false, err
+		if enableHScaleTrigger(configDescs) {
+			if _, err := intctrlutil.CheckAndPatchPayload(configSpec, constant.ReplicasPayload, component.Replicas); err != nil {
+				return err
 			}
-			updated = updated || ret
+		}
+		// check tls
+		if enableTLSTrigger(configDescs) {
+			if component.TLSConfig == nil {
+				continue
+			}
+			if _, err := intctrlutil.CheckAndPatchPayload(configSpec, constant.TLSPayload, component.TLSConfig); err != nil {
+				return err
+			}
+		}
+	}
+	return nil
+}
+
+func rerenderConfigEnabled(configDescs []parametersv1alpha1.ComponentConfigDescription, rerenderType parametersv1alpha1.RerenderResourceType) bool {
+	for _, desc := range configDescs {
+		if slices.Contains(desc.ReRenderResourceTypes, rerenderType) {
+			return true
 		}
 	}
-	return updated, nil
+	return false
 }
 
-func validRerenderResources(configSpec *appsv1alpha1.ComponentConfigSpec) bool {
-	return configSpec != nil && len(configSpec.ReRenderResourceTypes) != 0
+func enableHScaleTrigger(configDescs []parametersv1alpha1.ComponentConfigDescription) bool {
+	return rerenderConfigEnabled(configDescs, parametersv1alpha1.ComponentHScaleType)
 }
 
-func enableHScaleTrigger(configSpec *appsv1alpha1.ComponentConfigSpec) bool {
-	return validRerenderResources(configSpec) && slices.Contains(configSpec.ReRenderResourceTypes, appsv1alpha1.ComponentHScaleType)
+func enableVScaleTrigger(configDescs []parametersv1alpha1.ComponentConfigDescription) bool {
+	return rerenderConfigEnabled(configDescs, parametersv1alpha1.ComponentVScaleType)
 }
 
-func enableVScaleTrigger(configSpec *appsv1alpha1.ComponentConfigSpec) bool {
-	return validRerenderResources(configSpec) && slices.Contains(configSpec.ReRenderResourceTypes, appsv1alpha1.ComponentVScaleType)
+func enableTLSTrigger(configDescs []parametersv1alpha1.ComponentConfigDescription) bool {
+	return rerenderConfigEnabled(configDescs, parametersv1alpha1.ComponentTLSType)
 }
 
-func configSetFromComponent(templates []appsv1.ComponentConfigSpec) []string {
-	configSet := make([]string, 0)
-	for _, template := range templates {
-		configSet = append(configSet, template.Name)
+func ResolveComponentTemplate(ctx context.Context, reader client.Reader, cmpd *appsv1.ComponentDefinition) (map[string]*corev1.ConfigMap, error) {
+	tpls := make(map[string]*corev1.ConfigMap, len(cmpd.Spec.Configs))
+	for _, config := range cmpd.Spec.Configs {
+		cm := &corev1.ConfigMap{}
+		if err := reader.Get(ctx, client.ObjectKey{Name: config.TemplateRef, Namespace: config.Namespace}, cm); err != nil {
+			return nil, err
+		}
+		tpls[config.Name] = cm
 	}
-	return configSet
+	return tpls, nil
 }
diff --git a/pkg/controller/configuration/envfrom_utils.go b/pkg/controller/configuration/envfrom_utils.go
deleted file mode 100644
index 78c766b3c..000000000
--- a/pkg/controller/configuration/envfrom_utils.go
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package configuration
-
-import (
-	"context"
-
-	"github.com/spf13/cast"
-	corev1 "k8s.io/api/core/v1"
-	apierrors "k8s.io/apimachinery/pkg/api/errors"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
-	"github.com/apecloud/kubeblocks/pkg/configuration/validate"
-	"github.com/apecloud/kubeblocks/pkg/constant"
-	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-	"github.com/apecloud/kubeblocks/pkg/generics"
-)
-
-func injectTemplateEnvFrom(cluster *appsv1.Cluster, component *component.SynthesizedComponent, podSpec *corev1.PodSpec, cli client.Client, ctx context.Context, localObjs []client.Object) error {
-	var err error
-	var cm *corev1.ConfigMap
-
-	withEnvSource := func(asSecret bool) func(name string) corev1.EnvFromSource {
-		return func(name string) corev1.EnvFromSource {
-			if asSecret {
-				return corev1.EnvFromSource{
-					SecretRef: &corev1.SecretEnvSource{
-						LocalObjectReference: corev1.LocalObjectReference{
-							Name: name,
-						}}}
-			}
-			return corev1.EnvFromSource{
-				ConfigMapRef: &corev1.ConfigMapEnvSource{
-					LocalObjectReference: corev1.LocalObjectReference{
-						Name: name,
-					}}}
-		}
-	}
-
-	injectConfigmap := func(envMap map[string]string, configSpec appsv1.ComponentConfigSpec, cmName string) error {
-		envSourceObject, err := createOrUpdateResourceFromConfigTemplate(cluster, component, configSpec, client.ObjectKeyFromObject(cm), envMap, ctx, cli, true)
-		if err != nil {
-			return core.WrapError(err, "failed to generate env configmap[%s]", cmName)
-		}
-		if toSecret(configSpec) && configSpec.VolumeName != "" {
-			podSpec.Volumes = updateSecretVolumes(podSpec.Volumes, configSpec, envSourceObject, component)
-		} else {
-			injectEnvFrom(podSpec.Containers, containersInjectedTo(configSpec), envSourceObject.GetName(), withEnvSource(toSecret(configSpec)))
-			injectEnvFrom(podSpec.InitContainers, containersInjectedTo(configSpec), envSourceObject.GetName(), withEnvSource(toSecret(configSpec)))
-		}
-		return nil
-	}
-
-	for _, template := range component.ConfigTemplates {
-		if !InjectEnvEnabled(template) || template.ConfigConstraintRef == "" {
-			continue
-		}
-		cmName := core.GetComponentCfgName(cluster.Name, component.Name, template.Name)
-		if cm, err = fetchConfigmap(localObjs, cmName, cluster.Namespace, cli, ctx); err != nil {
-			return err
-		}
-		cc, err := getConfigConstraint(template, cli, ctx)
-		if err != nil {
-			return err
-		}
-		envMap, err := fromConfigmapFiles(fromConfigSpec(template, cm), cm, cc.FileFormatConfig)
-		if err != nil {
-			return err
-		}
-		if len(envMap) == 0 {
-			continue
-		}
-		if err := injectConfigmap(envMap, template, cmName); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func updateSecretVolumes(volumes []corev1.Volume, configSpec appsv1.ComponentConfigSpec, secret client.Object, component *component.SynthesizedComponent) []corev1.Volume {
-	sets := configSetFromComponent(component.ConfigTemplates)
-	createFn := func(_ string) corev1.Volume {
-		return corev1.Volume{
-			VolumeSource: corev1.VolumeSource{
-				Secret: &corev1.SecretVolumeSource{
-					SecretName:  secret.GetName(),
-					DefaultMode: intctrlutil.BuildVolumeMode(sets, configSpec.ComponentTemplateSpec),
-				},
-			},
-			Name: configSpec.VolumeName,
-		}
-	}
-	volumes, _ = intctrlutil.CreateOrUpdateVolume(volumes, configSpec.VolumeName, createFn, nil)
-	return volumes
-}
-
-func getConfigConstraint(template appsv1.ComponentConfigSpec, cli client.Client, ctx context.Context) (*appsv1beta1.ConfigConstraintSpec, error) {
-	ccKey := client.ObjectKey{
-		Namespace: "",
-		Name:      template.ConfigConstraintRef,
-	}
-	cc := &appsv1beta1.ConfigConstraint{}
-	if err := cli.Get(ctx, ccKey, cc); err != nil {
-		return nil, core.WrapError(err, "failed to get ConfigConstraint, key[%v]", ccKey)
-	}
-	if cc.Spec.FileFormatConfig == nil {
-		return nil, core.MakeError("ConfigConstraint[%v] is not a formatter", cc.Name)
-	}
-	return &cc.Spec, nil
-}
-
-func fromConfigmapFiles(keys []string, cm *corev1.ConfigMap, formatter *appsv1beta1.FileFormatConfig) (map[string]string, error) {
-	mergeMap := func(dst, src map[string]string) {
-		for key, val := range src {
-			dst[key] = val
-		}
-	}
-
-	gEnvMap := make(map[string]string)
-	for _, file := range keys {
-		envMap, err := fromFileContent(formatter, cm.Data[file])
-		if err != nil {
-			return nil, err
-		}
-		mergeMap(gEnvMap, envMap)
-	}
-	return gEnvMap, nil
-}
-
-func fetchConfigmap(localObjs []client.Object, cmName, namespace string, cli client.Client, ctx context.Context) (*corev1.ConfigMap, error) {
-	var (
-		cmObj = &corev1.ConfigMap{}
-		cmKey = client.ObjectKey{Name: cmName, Namespace: namespace}
-	)
-
-	localObject := findMatchedLocalObject(localObjs, cmKey, generics.ToGVK(cmObj))
-	if localObject != nil {
-		return localObject.(*corev1.ConfigMap), nil
-	}
-	if err := cli.Get(ctx, cmKey, cmObj, inDataContext()); err != nil {
-		return nil, err
-	}
-	return cmObj, nil
-}
-
-func createOrUpdateResourceFromConfigTemplate(cluster *appsv1.Cluster, component *component.SynthesizedComponent, template appsv1.ComponentConfigSpec, originKey client.ObjectKey, envMap map[string]string, ctx context.Context, cli client.Client, createOnly bool) (client.Object, error) {
-	cmKey := client.ObjectKey{
-		Name:      core.GenerateEnvFromName(originKey.Name),
-		Namespace: originKey.Namespace,
-	}
-
-	updateObjectMeta := func(obj client.Object) {
-		obj.SetLabels(constant.GetConfigurationLabels(component.ClusterName, component.Name, template.Name))
-		_ = intctrlutil.SetOwnerReference(cluster, obj)
-	}
-
-	if toSecret(template) {
-		return updateOrCreateEnvObject(ctx, cli, &corev1.Secret{}, cmKey, func(c *corev1.Secret) {
-			c.StringData = envMap
-			updateObjectMeta(c)
-		}, createOnly)
-	}
-	return updateOrCreateEnvObject(ctx, cli, &corev1.ConfigMap{}, cmKey, func(c *corev1.ConfigMap) {
-		c.Data = envMap
-		updateObjectMeta(c)
-	}, createOnly)
-}
-
-func updateOrCreateEnvObject[T generics.Object, PT generics.PObject[T]](ctx context.Context, cli client.Client, obj PT, objKey client.ObjectKey, updater func(PT), createOnly bool) (client.Object, error) {
-	err := cli.Get(ctx, objKey, obj, inDataContext())
-	switch {
-	case err != nil:
-		if !apierrors.IsNotFound(err) {
-			return nil, err
-		}
-		obj.SetName(objKey.Name)
-		obj.SetNamespace(objKey.Namespace)
-		updater(obj)
-		return obj, cli.Create(ctx, obj, inDataContext())
-	case createOnly:
-		return obj, nil
-	default:
-		updater(obj)
-		return obj, cli.Update(ctx, obj, inDataContext())
-	}
-}
-
-func CheckEnvFrom(container *corev1.Container, cmName string) bool {
-	for i := range container.EnvFrom {
-		source := &container.EnvFrom[i]
-		if source.ConfigMapRef != nil && source.ConfigMapRef.Name == cmName {
-			return true
-		}
-		if source.SecretRef != nil && source.SecretRef.Name == cmName {
-			return true
-		}
-	}
-	return false
-}
-
-func injectEnvFrom(containers []corev1.Container, injectEnvTo []string, cmName string, fn func(string) corev1.EnvFromSource) {
-	sets := cfgutil.NewSet(injectEnvTo...)
-	for i := range containers {
-		container := &containers[i]
-		if sets.InArray(container.Name) && !CheckEnvFrom(container, cmName) {
-			container.EnvFrom = append(container.EnvFrom, fn(cmName))
-		}
-	}
-}
-
-func fromFileContent(format *appsv1beta1.FileFormatConfig, configContext string) (map[string]string, error) {
-	keyValue, err := validate.LoadConfigObjectFromContent(format.Format, configContext)
-	if err != nil {
-		return nil, err
-	}
-	envMap := make(map[string]string, len(keyValue))
-	for key, v := range keyValue {
-		envMap[key] = cast.ToString(v)
-	}
-	return envMap, nil
-}
-
-func fromConfigSpec(configSpec appsv1.ComponentConfigSpec, cm *corev1.ConfigMap) []string {
-	keys := configSpec.Keys
-	if len(keys) == 0 {
-		keys = cfgutil.ToSet(cm.Data).AsSlice()
-	}
-	return keys
-}
-
-func SyncEnvSourceObject(configSpec appsv1.ComponentConfigSpec, cmObj *corev1.ConfigMap, cc *appsv1beta1.ConfigConstraintSpec, cli client.Client, ctx context.Context, cluster *appsv1.Cluster, component *component.SynthesizedComponent) error {
-	if !InjectEnvEnabled(configSpec) || cc == nil || cc.FileFormatConfig == nil {
-		return nil
-	}
-	envMap, err := fromConfigmapFiles(fromConfigSpec(configSpec, cmObj), cmObj, cc.FileFormatConfig)
-	if err != nil {
-		return err
-	}
-	if len(envMap) != 0 {
-		_, err = createOrUpdateResourceFromConfigTemplate(cluster, component, configSpec, client.ObjectKeyFromObject(cmObj), envMap, ctx, cli, false)
-	}
-	return err
-}
-
-func InjectEnvEnabled(spec appsv1.ComponentConfigSpec) bool {
-	return len(spec.AsEnvFrom) > 0 || len(spec.InjectEnvTo) > 0
-}
-
-func toSecret(spec appsv1.ComponentConfigSpec) bool {
-	return spec.AsSecret != nil && *spec.AsSecret
-}
-
-func containersInjectedTo(spec appsv1.ComponentConfigSpec) []string {
-	if len(spec.InjectEnvTo) != 0 {
-		return spec.InjectEnvTo
-	}
-	return spec.AsEnvFrom
-}
diff --git a/pkg/controller/configuration/mutation.go b/pkg/controller/configuration/mutation.go
new file mode 100644
index 000000000..98bd74c35
--- /dev/null
+++ b/pkg/controller/configuration/mutation.go
@@ -0,0 +1,74 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package configuration
+
+import (
+	"k8s.io/apimachinery/pkg/util/sets"
+
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+)
+
+type MutateFunc func(dest, expected *parametersv1alpha1.ConfigTemplateItemDetail)
+
+func MergeComponentParameter(expected *parametersv1alpha1.ComponentParameter, existing *parametersv1alpha1.ComponentParameter, mutate MutateFunc) *parametersv1alpha1.ComponentParameter {
+	fromList := func(items []parametersv1alpha1.ConfigTemplateItemDetail) sets.Set[string] {
+		itemSet := sets.New[string]()
+		for _, item := range items {
+			itemSet.Insert(item.Name)
+		}
+		return itemSet
+	}
+
+	// update cluster.spec.shardingSpecs[*].template.componentConfigItems.*
+	updateConfigSpec := func(item parametersv1alpha1.ConfigTemplateItemDetail) parametersv1alpha1.ConfigTemplateItemDetail {
+		if newItem := intctrlutil.GetConfigTemplateItem(&expected.Spec, item.Name); newItem != nil {
+			updated := item.DeepCopy()
+			mutate(updated, newItem)
+			return *updated
+		}
+		return item
+	}
+
+	oldSets := fromList(existing.Spec.ConfigItemDetails)
+	newSets := fromList(expected.Spec.ConfigItemDetails)
+	addSets := newSets.Difference(oldSets)
+	delSets := oldSets.Difference(newSets)
+
+	newConfigItems := make([]parametersv1alpha1.ConfigTemplateItemDetail, 0)
+	for _, item := range existing.Spec.ConfigItemDetails {
+		if !delSets.Has(item.Name) {
+			newConfigItems = append(newConfigItems, updateConfigSpec(item))
+		}
+	}
+	for _, item := range expected.Spec.ConfigItemDetails {
+		if addSets.Has(item.Name) {
+			newConfigItems = append(newConfigItems, item)
+		}
+	}
+
+	updated := existing.DeepCopy()
+	updated.SetLabels(intctrlutil.MergeMetadataMaps(expected.GetLabels(), updated.GetLabels()))
+	if len(expected.GetOwnerReferences()) != 0 {
+		updated.SetOwnerReferences(expected.GetOwnerReferences())
+	}
+	updated.Spec.ConfigItemDetails = newConfigItems
+	return updated
+}
diff --git a/pkg/controller/configuration/operator.go b/pkg/controller/configuration/operator.go
deleted file mode 100644
index f86470857..000000000
--- a/pkg/controller/configuration/operator.go
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package configuration
-
-import (
-	corev1 "k8s.io/api/core/v1"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
-)
-
-type configOperator struct {
-	render.ReconcileCtx
-}
-
-func NewConfigReconcileTask(resourceCtx *render.ResourceCtx,
-	cluster *appsv1.Cluster,
-	component *appsv1.Component,
-	synthesizedComponent *component.SynthesizedComponent,
-	podSpec *corev1.PodSpec,
-	localObjs []client.Object,
-) *configOperator {
-	return &configOperator{
-		render.ReconcileCtx{
-			ResourceCtx:          resourceCtx,
-			Cluster:              cluster,
-			Component:            component,
-			SynthesizedComponent: synthesizedComponent,
-			PodSpec:              podSpec,
-			Cache:                localObjs,
-		},
-	}
-}
-
-func (c *configOperator) Reconcile() error {
-	var synthesizedComponent = c.SynthesizedComponent
-
-	if len(synthesizedComponent.ConfigTemplates) == 0 && len(synthesizedComponent.ScriptTemplates) == 0 {
-		return c.UpdateConfiguration()
-	}
-
-	return NewCreatePipeline(c.ReconcileCtx).
-		Prepare().
-		RenderScriptTemplate().      // render scriptTemplate into ConfigMap
-		UpdateConfiguration().       // create or update Configuration
-		Configuration().             // fetch the latest Configuration
-		CreateConfigTemplate().      // render configTemplate into ConfigMap (only for the first time)
-		UpdatePodVolumes().          // update podSpec.Volumes
-		BuildConfigManagerSidecar(). // build configManager sidecar and update podSpec.Containers and podSpec.InitContainers
-		UpdateConfigRelatedObject(). // handle InjectEnvTo, and create or update ConfigMaps
-		UpdateConfigurationStatus(). // update ConfigurationItemStatus revision and phase etc.
-		Complete()
-}
-
-func (c *configOperator) UpdateConfiguration() error {
-	return NewCreatePipeline(c.ReconcileCtx).
-		UpdateConfiguration().
-		UpdateConfigRelatedObject().
-		Complete()
-}
diff --git a/pkg/controller/configuration/parameter_utils.go b/pkg/controller/configuration/parameter_utils.go
index 52a7f20e3..3b0d09110 100644
--- a/pkg/controller/configuration/parameter_utils.go
+++ b/pkg/controller/configuration/parameter_utils.go
@@ -37,9 +37,8 @@ func ClassifyParamsFromConfigTemplate(params parametersv1alpha1.ComponentParamet
 	tpls map[string]*corev1.ConfigMap) []parametersv1alpha1.ConfigTemplateItemDetail {
 	var itemDetails []parametersv1alpha1.ConfigTemplateItemDetail
 
-	configs := intctrlutil.TransformConfigTemplate(cmpd.Spec.Configs)
-	classifyParams := ClassifyComponentParameters(params, paramsDefs, configs, tpls)
-	for _, template := range configs {
+	classifyParams := ClassifyComponentParameters(params, paramsDefs, cmpd.Spec.Configs, tpls)
+	for _, template := range cmpd.Spec.Configs {
 		itemDetails = append(itemDetails, generateConfigTemplateItem(classifyParams, template))
 	}
 	return itemDetails
diff --git a/pkg/controller/configuration/patch_merger.go b/pkg/controller/configuration/patch_merger.go
index bb7cf06be..dd2047d19 100644
--- a/pkg/controller/configuration/patch_merger.go
+++ b/pkg/controller/configuration/patch_merger.go
@@ -20,14 +20,15 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package configuration
 
 import (
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
 
-func DoMerge(baseData map[string]string, patch map[string]appsv1alpha1.ConfigParams, cc *appsv1beta1.ConfigConstraint, configSpec appsv1.ComponentConfigSpec) (map[string]string, error) {
+func DoMerge(baseData map[string]string,
+	patch map[string]parametersv1alpha1.ParametersInFile,
+	paramsDefs []*parametersv1alpha1.ParametersDefinition,
+	configDescs []parametersv1alpha1.ComponentConfigDescription) (map[string]string, error) {
 	var (
 		updatedFiles  = make(map[string]string, len(patch))
 		updatedParams = make([]core.ParamPairs, 0, len(patch))
@@ -44,22 +45,22 @@ func DoMerge(baseData map[string]string, patch map[string]appsv1alpha1.ConfigPar
 			})
 		}
 	}
-	return mergeUpdatedParams(baseData, updatedFiles, updatedParams, cc, configSpec)
+	return mergeUpdatedParams(baseData, updatedFiles, updatedParams, paramsDefs, configDescs)
 }
 
 func mergeUpdatedParams(base map[string]string,
 	updatedFiles map[string]string,
 	updatedParams []core.ParamPairs,
-	cc *appsv1beta1.ConfigConstraint,
-	tpl appsv1.ComponentConfigSpec) (map[string]string, error) {
+	paramsDefs []*parametersv1alpha1.ParametersDefinition,
+	configDescs []parametersv1alpha1.ComponentConfigDescription) (map[string]string, error) {
 	updatedConfig := base
 
 	// merge updated files into configmap
 	if len(updatedFiles) != 0 {
 		updatedConfig = core.MergeUpdatedConfig(base, updatedFiles)
 	}
-	if cc == nil {
+	if len(configDescs) == 0 {
 		return updatedConfig, nil
 	}
-	return intctrlutil.MergeAndValidateConfigs(cc.Spec, updatedConfig, tpl.Keys, updatedParams)
+	return intctrlutil.MergeAndValidateConfigs(updatedConfig, updatedParams, paramsDefs, configDescs)
 }
diff --git a/pkg/controller/configuration/pipeline.go b/pkg/controller/configuration/pipeline.go
deleted file mode 100644
index 1ee7d3453..000000000
--- a/pkg/controller/configuration/pipeline.go
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package configuration
-
-import (
-	"strconv"
-
-	corev1 "k8s.io/api/core/v1"
-	apierrors "k8s.io/apimachinery/pkg/api/errors"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
-	"github.com/apecloud/kubeblocks/pkg/constant"
-	"github.com/apecloud/kubeblocks/pkg/controller/builder"
-	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-)
-
-type pipeline struct {
-	// configuration *appsv1alpha1.Configuration
-	renderWrapper renderWrapper
-
-	ctx render.ReconcileCtx
-	ResourceFetcher[pipeline]
-}
-
-type updatePipeline struct {
-	renderWrapper renderWrapper
-
-	reconcile  bool
-	item       appsv1alpha1.ConfigurationItemDetail
-	itemStatus *appsv1alpha1.ConfigurationItemDetailStatus
-	configSpec *appsv1.ComponentConfigSpec
-	// replace of ConfigMapObj
-	// originalCM  *corev1.ConfigMap
-	newCM       *corev1.ConfigMap
-	configPatch *core.ConfigPatchInfo
-
-	ctx render.ReconcileCtx
-	ResourceFetcher[updatePipeline]
-}
-
-func NewCreatePipeline(ctx render.ReconcileCtx) *pipeline {
-	p := &pipeline{ctx: ctx}
-	return p.Init(ctx.ResourceCtx, p)
-}
-
-func NewReconcilePipeline(ctx render.ReconcileCtx, item appsv1alpha1.ConfigurationItemDetail, itemStatus *appsv1alpha1.ConfigurationItemDetailStatus, configSpec *appsv1.ComponentConfigSpec) *updatePipeline {
-	p := &updatePipeline{
-		reconcile:  true,
-		item:       item,
-		itemStatus: itemStatus,
-		ctx:        ctx,
-		configSpec: configSpec,
-	}
-	return p.Init(ctx.ResourceCtx, p)
-}
-
-func (p *pipeline) Prepare() *pipeline {
-	buildTemplate := func() (err error) {
-		ctx := p.ctx
-		p.renderWrapper = newTemplateRenderWrapper(p.Context, ctx.Client, render.NewTemplateBuilder(&ctx), ctx.Cluster, ctx.Component)
-		return
-	}
-
-	return p.Wrap(buildTemplate)
-}
-
-func (p *pipeline) RenderScriptTemplate() *pipeline {
-	return p.Wrap(func() error {
-		ctx := p.ctx
-		return p.renderWrapper.renderScriptTemplate(ctx.Cluster, ctx.SynthesizedComponent, ctx.Cache)
-	})
-}
-
-func (p *pipeline) UpdateConfiguration() *pipeline {
-	buildConfiguration := func() (err error) {
-		expectedConfiguration := p.createConfiguration()
-		if intctrlutil.SetControllerReference(p.ctx.Component, expectedConfiguration) != nil {
-			return
-		}
-		_, _ = UpdateConfigPayload(&expectedConfiguration.Spec, p.ctx.SynthesizedComponent)
-
-		existingConfiguration := appsv1alpha1.Configuration{}
-		err = p.ResourceFetcher.Client.Get(p.Context, client.ObjectKeyFromObject(expectedConfiguration), &existingConfiguration)
-		switch {
-		case err == nil:
-			return p.updateConfiguration(expectedConfiguration, &existingConfiguration)
-		case apierrors.IsNotFound(err):
-			return p.ResourceFetcher.Client.Create(p.Context, expectedConfiguration)
-		default:
-			return err
-		}
-	}
-	return p.Wrap(buildConfiguration)
-}
-
-func (p *pipeline) CreateConfigTemplate() *pipeline {
-	return p.Wrap(func() error {
-		ctx := p.ctx
-		return p.renderWrapper.renderConfigTemplate(ctx.Cluster, ctx.SynthesizedComponent, ctx.Cache, p.ConfigurationObj)
-	})
-}
-
-func (p *pipeline) UpdateConfigurationStatus() *pipeline {
-	return p.Wrap(func() error {
-		if p.ConfigurationObj == nil {
-			return nil
-		}
-
-		existing := p.ConfigurationObj
-		reversion := fromConfiguration(existing)
-		patch := client.MergeFrom(existing)
-		updated := existing.DeepCopy()
-		for _, item := range existing.Spec.ConfigItemDetails {
-			CheckAndUpdateItemStatus(updated, item, reversion)
-		}
-		return p.ResourceFetcher.Client.Status().Patch(p.Context, updated, patch)
-	})
-}
-
-func CheckAndUpdateItemStatus(updated *appsv1alpha1.Configuration, item appsv1alpha1.ConfigurationItemDetail, reversion string) {
-	foundStatus := func(name string) *appsv1alpha1.ConfigurationItemDetailStatus {
-		for i := range updated.Status.ConfigurationItemStatus {
-			status := &updated.Status.ConfigurationItemStatus[i]
-			if status.Name == name {
-				return status
-			}
-		}
-		return nil
-	}
-
-	status := foundStatus(item.Name)
-	if status != nil && status.Phase == "" {
-		status.Phase = appsv1alpha1.CInitPhase
-	}
-	if status == nil {
-		updated.Status.ConfigurationItemStatus = append(updated.Status.ConfigurationItemStatus,
-			appsv1alpha1.ConfigurationItemDetailStatus{
-				Name:           item.Name,
-				Phase:          appsv1alpha1.CInitPhase,
-				UpdateRevision: reversion,
-			})
-	}
-}
-
-func (p *pipeline) UpdatePodVolumes() *pipeline {
-	return p.Wrap(func() error {
-		return intctrlutil.CreateOrUpdatePodVolumes(p.ctx.PodSpec,
-			p.renderWrapper.volumes,
-			configSetFromComponent(p.ctx.SynthesizedComponent.ConfigTemplates))
-	})
-}
-
-func (p *pipeline) BuildConfigManagerSidecar() *pipeline {
-	return p.Wrap(func() error {
-		return buildConfigManagerWithComponent(p.ctx.PodSpec, p.ctx.SynthesizedComponent.ConfigTemplates, p.Context, p.Client, p.ctx.Cluster, p.ctx.SynthesizedComponent)
-	})
-}
-
-func (p *pipeline) UpdateConfigRelatedObject() *pipeline {
-	updateMeta := func() error {
-		if err := injectTemplateEnvFrom(p.ctx.Cluster, p.ctx.SynthesizedComponent, p.ctx.PodSpec, p.Client, p.Context, p.renderWrapper.renderedObjs); err != nil {
-			return err
-		}
-		return createConfigObjects(p.Client, p.Context, p.renderWrapper.renderedObjs, p.renderWrapper.renderedSecretObjs)
-	}
-
-	return p.Wrap(updateMeta)
-}
-
-func (p *pipeline) createConfiguration() *appsv1alpha1.Configuration {
-	builder := builder.NewConfigurationBuilder(p.Namespace,
-		core.GenerateComponentConfigurationName(p.ClusterName, p.ComponentName),
-	)
-	for _, template := range p.ctx.SynthesizedComponent.ConfigTemplates {
-		builder.AddConfigurationItem(template)
-	}
-	return builder.Component(p.ComponentName).
-		ClusterRef(p.ClusterName).
-		AddLabelsInMap(constant.GetCompLabels(p.ClusterName, p.ComponentName)).
-		GetObject()
-}
-
-func (p *pipeline) updateConfiguration(expected *appsv1alpha1.Configuration, existing *appsv1alpha1.Configuration) error {
-	fromMap := func(items []appsv1alpha1.ConfigurationItemDetail) *cfgutil.Sets {
-		sets := cfgutil.NewSet()
-		for _, item := range items {
-			sets.Add(item.Name)
-		}
-		return sets
-	}
-
-	updateConfigSpec := func(item appsv1alpha1.ConfigurationItemDetail) appsv1alpha1.ConfigurationItemDetail {
-		if newItem := expected.Spec.GetConfigurationItem(item.Name); newItem != nil {
-			item.ConfigSpec = newItem.ConfigSpec
-		}
-		return item
-	}
-
-	oldSets := fromMap(existing.Spec.ConfigItemDetails)
-	newSets := fromMap(expected.Spec.ConfigItemDetails)
-
-	addSets := cfgutil.Difference(newSets, oldSets)
-	delSets := cfgutil.Difference(oldSets, newSets)
-
-	newConfigItems := make([]appsv1alpha1.ConfigurationItemDetail, 0)
-	for _, item := range existing.Spec.ConfigItemDetails {
-		if !delSets.InArray(item.Name) {
-			newConfigItems = append(newConfigItems, updateConfigSpec(item))
-		}
-	}
-	for _, item := range expected.Spec.ConfigItemDetails {
-		if addSets.InArray(item.Name) {
-			newConfigItems = append(newConfigItems, item)
-		}
-	}
-
-	patch := client.MergeFrom(existing)
-	updated := existing.DeepCopy()
-	updated.Spec.ConfigItemDetails = newConfigItems
-	return p.Client.Patch(p.Context, updated, patch)
-}
-
-func (p *updatePipeline) isDone() bool {
-	return !p.reconcile
-}
-
-func (p *updatePipeline) PrepareForTemplate() *updatePipeline {
-	buildTemplate := func() (err error) {
-		p.reconcile = !intctrlutil.IsApplyConfigChanged(p.ConfigMapObj, p.item)
-		if p.isDone() {
-			return
-		}
-		p.renderWrapper = newTemplateRenderWrapper(p.Context, p.Client, render.NewTemplateBuilder(&p.ctx), p.ctx.Cluster, p.ctx.Component)
-		return
-	}
-	return p.Wrap(buildTemplate)
-}
-
-func (p *updatePipeline) ConfigSpec() *appsv1.ComponentConfigSpec {
-	return p.configSpec
-}
-
-func (p *updatePipeline) InitConfigSpec() *updatePipeline {
-	return p.Wrap(func() (err error) {
-		if p.configSpec == nil {
-			p.configSpec = component.GetConfigSpecByName(p.ctx.SynthesizedComponent, p.item.Name)
-			if p.configSpec == nil {
-				return core.MakeError("not found config spec: %s", p.item.Name)
-			}
-		}
-		return
-	})
-}
-
-func (p *updatePipeline) RerenderTemplate() *updatePipeline {
-	return p.Wrap(func() (err error) {
-		if p.isDone() {
-			return
-		}
-		if intctrlutil.IsRerender(p.ConfigMapObj, p.item) {
-			p.newCM, err = p.renderWrapper.rerenderConfigTemplate(p.ctx.Cluster, p.ctx.SynthesizedComponent, *p.configSpec, &p.item)
-		} else {
-			p.newCM = p.ConfigMapObj.DeepCopy()
-		}
-		return
-	})
-}
-
-func (p *updatePipeline) ApplyParameters() *updatePipeline {
-	patchMerge := func(p *updatePipeline, spec appsv1.ComponentConfigSpec, cm *corev1.ConfigMap, item appsv1alpha1.ConfigurationItemDetail) error {
-		if p.isDone() || len(item.ConfigFileParams) == 0 {
-			return nil
-		}
-		newData, err := DoMerge(cm.Data, item.ConfigFileParams, p.ConfigConstraintObj, spec)
-		if err != nil {
-			return err
-		}
-		if p.ConfigConstraintObj == nil {
-			cm.Data = newData
-			return nil
-		}
-
-		p.configPatch, _, err = core.CreateConfigPatch(cm.Data,
-			newData,
-			p.ConfigConstraintObj.Spec.FileFormatConfig.Format,
-			p.configSpec.Keys,
-			false)
-		if err != nil {
-			return err
-		}
-		cm.Data = newData
-		return nil
-	}
-
-	return p.Wrap(func() error {
-		if p.isDone() {
-			return nil
-		}
-		return patchMerge(p, *p.configSpec, p.newCM, p.item)
-	})
-}
-
-func (p *updatePipeline) UpdateConfigVersion(revision string) *updatePipeline {
-	return p.Wrap(func() error {
-		if p.isDone() {
-			return nil
-		}
-
-		if err := updateConfigMetaForCM(p.newCM, &p.item, revision); err != nil {
-			return err
-		}
-		annotations := p.newCM.Annotations
-		if annotations == nil {
-			annotations = make(map[string]string)
-		}
-
-		// delete disable reconcile annotation
-		if _, ok := annotations[constant.DisableUpgradeInsConfigurationAnnotationKey]; ok {
-			annotations[constant.DisableUpgradeInsConfigurationAnnotationKey] = strconv.FormatBool(false)
-		}
-		p.newCM.Annotations = annotations
-		// p.itemStatus.UpdateRevision = revision
-		return nil
-	})
-}
-
-// TODO(leon)
-func (p *updatePipeline) Sync() *updatePipeline {
-	return p.Wrap(func() error {
-		if p.ConfigConstraintObj != nil && !p.isDone() {
-			if err := SyncEnvSourceObject(*p.configSpec, p.newCM, &p.ConfigConstraintObj.Spec, p.Client, p.Context, p.ctx.Cluster, p.ctx.SynthesizedComponent); err != nil {
-				return err
-			}
-		}
-		if InjectEnvEnabled(*p.configSpec) && toSecret(*p.configSpec) {
-			return nil
-		}
-		switch {
-		case p.isDone():
-			return nil
-		case p.ConfigMapObj == nil && p.newCM != nil:
-			return p.Client.Create(p.Context, p.newCM)
-		case p.ConfigMapObj != nil:
-			patch := client.MergeFrom(p.ConfigMapObj)
-			if p.ConfigMapObj != nil {
-				p.newCM.Labels = intctrlutil.MergeMetadataMaps(p.newCM.Labels, p.ConfigMapObj.Labels)
-				p.newCM.Annotations = intctrlutil.MergeMetadataMaps(p.newCM.Annotations, p.ConfigMapObj.Annotations)
-			}
-			return p.Client.Patch(p.Context, p.newCM, patch)
-		}
-		return core.MakeError("unexpected condition")
-	})
-}
-
-func (p *updatePipeline) SyncStatus() *updatePipeline {
-	return p.Wrap(func() (err error) {
-		if p.isDone() {
-			return
-		}
-		if p.configSpec == nil || p.itemStatus == nil {
-			return
-		}
-		p.itemStatus.Phase = appsv1alpha1.CMergedPhase
-		return
-	})
-}
diff --git a/pkg/controller/configuration/resource_wrapper.go b/pkg/controller/configuration/resource_wrapper.go
index f67faa2c3..18d186b64 100644
--- a/pkg/controller/configuration/resource_wrapper.go
+++ b/pkg/controller/configuration/resource_wrapper.go
@@ -23,18 +23,15 @@ import (
 	"fmt"
 
 	corev1 "k8s.io/api/core/v1"
-	apierrors "k8s.io/apimachinery/pkg/api/errors"
 	"k8s.io/apimachinery/pkg/types"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/render"
-	"github.com/apecloud/kubeblocks/pkg/controllerutil"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
 
 type ResourceFetcher[T any] struct {
@@ -46,10 +43,7 @@ type ResourceFetcher[T any] struct {
 	ComponentDefObj *appsv1.ComponentDefinition
 	ClusterComObj   *appsv1.ClusterComponentSpec
 
-	ConfigMapObj        *corev1.ConfigMap
-	ConfigurationObj    *appsv1alpha1.Configuration
-	ConfigConstraintObj *appsv1beta1.ConfigConstraint
-
+	ConfigMapObj          *corev1.ConfigMap
 	ComponentParameterObj *parametersv1alpha1.ComponentParameter
 }
 
@@ -86,22 +80,18 @@ func (r *ResourceFetcher[T]) ComponentAndComponentDef() *T {
 	}
 	return r.Wrap(func() error {
 		r.ComponentObj = &appsv1.Component{}
-		err := r.Client.Get(r.Context, componentKey, r.ComponentObj)
-		if apierrors.IsNotFound(err) {
-			return nil
-		} else if err != nil {
+		if err := r.Client.Get(r.Context, componentKey, r.ComponentObj, inDataContext()); err != nil {
 			return err
 		}
-
 		if len(r.ComponentObj.Spec.CompDef) == 0 {
-			return nil
+			return fmt.Errorf("componentDefinition not found in component: %s", r.ComponentObj.Name)
 		}
 
 		compDefKey := types.NamespacedName{
 			Name: r.ComponentObj.Spec.CompDef,
 		}
 		r.ComponentDefObj = &appsv1.ComponentDefinition{}
-		if err := r.Client.Get(r.Context, compDefKey, r.ComponentDefObj); err != nil {
+		if err := r.Client.Get(r.Context, compDefKey, r.ComponentDefObj, inDataContext()); err != nil {
 			return err
 		}
 		if r.ComponentDefObj.Status.Phase != appsv1.AvailablePhase {
@@ -113,7 +103,7 @@ func (r *ResourceFetcher[T]) ComponentAndComponentDef() *T {
 
 func (r *ResourceFetcher[T]) ComponentSpec() *T {
 	return r.Wrap(func() (err error) {
-		r.ClusterComObj, err = controllerutil.GetComponentSpecByName(r.Context, r.Client, r.ClusterObj, r.ComponentName)
+		r.ClusterComObj, err = intctrlutil.GetComponentSpecByName(r.Context, r.Client, r.ClusterObj, r.ComponentName)
 		if err != nil {
 			return err
 		}
@@ -121,22 +111,6 @@ func (r *ResourceFetcher[T]) ComponentSpec() *T {
 	})
 }
 
-func (r *ResourceFetcher[T]) Configuration() *T {
-	configKey := client.ObjectKey{
-		Name:      cfgcore.GenerateComponentConfigurationName(r.ClusterName, r.ComponentName),
-		Namespace: r.Namespace,
-	}
-	return r.Wrap(func() (err error) {
-		configuration := appsv1alpha1.Configuration{}
-		err = r.Client.Get(r.Context, configKey, &configuration)
-		if err != nil {
-			return client.IgnoreNotFound(err)
-		}
-		r.ConfigurationObj = &configuration
-		return
-	})
-}
-
 func (r *ResourceFetcher[T]) ConfigMap(configSpec string) *T {
 	cmKey := client.ObjectKey{
 		Name:      cfgcore.GetComponentCfgName(r.ClusterName, r.ComponentName, configSpec),
@@ -149,16 +123,6 @@ func (r *ResourceFetcher[T]) ConfigMap(configSpec string) *T {
 	})
 }
 
-func (r *ResourceFetcher[T]) ConfigConstraints(ccName string) *T {
-	return r.Wrap(func() error {
-		if ccName != "" {
-			r.ConfigConstraintObj = &appsv1beta1.ConfigConstraint{}
-			return r.Client.Get(r.Context, client.ObjectKey{Name: ccName}, r.ConfigConstraintObj)
-		}
-		return nil
-	})
-}
-
 func (r *ResourceFetcher[T]) ComponentParameter() *T {
 	configKey := client.ObjectKey{
 		Name:      cfgcore.GenerateComponentConfigurationName(r.ClusterName, r.ComponentName),
diff --git a/pkg/controller/configuration/template_merger.go b/pkg/controller/configuration/template_merger.go
index e0a11d056..a66ddc08d 100644
--- a/pkg/controller/configuration/template_merger.go
+++ b/pkg/controller/configuration/template_merger.go
@@ -20,12 +20,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package configuration
 
 import (
-	"context"
-
-	"sigs.k8s.io/controller-runtime/pkg/client"
+	"fmt"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/controller/render"
 )
@@ -40,11 +38,12 @@ type TemplateMerger interface {
 }
 
 type mergeContext struct {
-	template   appsv1.ConfigTemplateExtension
-	configSpec appsv1.ComponentConfigSpec
-	ccSpec     *appsv1beta1.ConfigConstraintSpec
-
 	render.TemplateRender
+
+	template     parametersv1alpha1.ConfigTemplateExtension
+	configSpec   appsv1.ComponentTemplateSpec
+	paramsDefs   []*parametersv1alpha1.ParametersDefinition
+	configRender *parametersv1alpha1.ParamConfigRenderer
 }
 
 func (m *mergeContext) renderTemplate() (map[string]string, error) {
@@ -57,7 +56,7 @@ func (m *mergeContext) renderTemplate() (map[string]string, error) {
 	if err != nil {
 		return nil, err
 	}
-	if err := validateRawData(configs, m.configSpec, m.ccSpec); err != nil {
+	if err := validateRenderedData(configs, m.paramsDefs, m.configRender); err != nil {
 		return nil, err
 	}
 	return configs, nil
@@ -84,8 +83,10 @@ type configOnlyAddMerger struct {
 }
 
 func (c *configPatcher) Merge(baseData map[string]string, updatedData map[string]string) (map[string]string, error) {
-	formatter := c.ccSpec.FileFormatConfig
-	configPatch, err := core.TransformConfigPatchFromData(updatedData, formatter.Format, c.configSpec.Keys)
+	if c.configRender == nil || len(c.configRender.Spec.Configs) == 0 {
+		return nil, fmt.Errorf("not support patch merge policy")
+	}
+	configPatch, err := core.TransformConfigPatchFromData(updatedData, c.configRender.Spec)
 	if err != nil {
 		return nil, err
 	}
@@ -93,20 +94,26 @@ func (c *configPatcher) Merge(baseData map[string]string, updatedData map[string
 		return baseData, nil
 	}
 
+	params := core.GenerateVisualizedParamsList(configPatch, c.configRender.Spec.Configs)
 	mergedData := copyMap(baseData)
-	params := core.GenerateVisualizedParamsList(configPatch, formatter, nil)
 	for key, patch := range splitParameters(params) {
 		v, ok := baseData[key]
 		if !ok {
 			mergedData[key] = updatedData[key]
 			continue
 		}
-		newConfig, err := core.ApplyConfigPatch([]byte(v), patch, formatter)
+		newConfig, err := core.ApplyConfigPatch([]byte(v), patch, core.ResolveConfigFormat(c.configRender.Spec.Configs, key))
 		if err != nil {
 			return nil, err
 		}
 		mergedData[key] = newConfig
 	}
+
+	for key, content := range updatedData {
+		if _, ok := mergedData[key]; !ok {
+			mergedData[key] = content
+		}
+	}
 	return mergedData, err
 }
 
@@ -118,55 +125,43 @@ func (c *configOnlyAddMerger) Merge(baseData map[string]string, updatedData map[
 	return nil, core.MakeError("not implemented")
 }
 
-func NewTemplateMerger(template appsv1.ConfigTemplateExtension,
+func NewTemplateMerger(template parametersv1alpha1.ConfigTemplateExtension,
 	templateRender render.TemplateRender,
-	configSpec appsv1.ComponentConfigSpec,
-	ccSpec *appsv1beta1.ConfigConstraintSpec) (TemplateMerger, error) {
+	configSpec appsv1.ComponentTemplateSpec,
+	paramsDefs []*parametersv1alpha1.ParametersDefinition,
+	configRender *parametersv1alpha1.ParamConfigRenderer,
+) (TemplateMerger, error) {
 	templateData := &mergeContext{
-		configSpec: configSpec,
-		template:   template,
-		ccSpec:     ccSpec,
-
+		configSpec:     configSpec,
+		template:       template,
 		TemplateRender: templateRender,
+		paramsDefs:     paramsDefs,
+		configRender:   configRender,
 	}
 
 	var merger TemplateMerger
 	switch template.Policy {
 	default:
 		return nil, core.MakeError("unknown template policy: %s", template.Policy)
-	case appsv1.NoneMergePolicy:
+	case parametersv1alpha1.NoneMergePolicy:
 		merger = &noneOp{templateData}
-	case appsv1.PatchPolicy:
+	case parametersv1alpha1.PatchPolicy:
 		merger = &configPatcher{templateData}
-	case appsv1.OnlyAddPolicy:
+	case parametersv1alpha1.OnlyAddPolicy:
 		merger = &configOnlyAddMerger{templateData}
-	case appsv1.ReplacePolicy:
+	case parametersv1alpha1.ReplacePolicy:
 		merger = &configReplaceMerger{templateData}
 	}
 	return merger, nil
 }
 
-func mergerConfigTemplate(template appsv1.ConfigTemplateExtension,
+func mergerConfigTemplate(template parametersv1alpha1.ConfigTemplateExtension,
 	templateRender render.TemplateRender,
-	configSpec appsv1.ComponentConfigSpec,
+	configSpec appsv1.ComponentTemplateSpec,
 	baseData map[string]string,
-	ctx context.Context, cli client.Client) (map[string]string, error) {
-	if configSpec.ConfigConstraintRef == "" {
-		return nil, core.MakeError("ConfigConstraintRef require not empty, configSpec[%v]", configSpec.Name)
-	}
-	ccObj := &appsv1beta1.ConfigConstraint{}
-	ccKey := client.ObjectKey{
-		Namespace: "",
-		Name:      configSpec.ConfigConstraintRef,
-	}
-	if err := cli.Get(ctx, ccKey, ccObj); err != nil {
-		return nil, core.WrapError(err, "failed to get ConfigConstraint, key[%v]", configSpec)
-	}
-	if ccObj.Spec.FileFormatConfig == nil {
-		return nil, core.MakeError("importedConfigTemplate require ConfigConstraint.Spec.FileFormatConfig, configSpec[%v]", configSpec)
-	}
-
-	templateMerger, err := NewTemplateMerger(template, templateRender, configSpec, &ccObj.Spec)
+	paramsDefs []*parametersv1alpha1.ParametersDefinition,
+	configRender *parametersv1alpha1.ParamConfigRenderer) (map[string]string, error) {
+	templateMerger, err := NewTemplateMerger(template, templateRender, configSpec, paramsDefs, configRender)
 	if err != nil {
 		return nil, err
 	}
diff --git a/pkg/controller/configuration/template_render.go b/pkg/controller/configuration/template_render.go
new file mode 100644
index 000000000..8b9e66c6f
--- /dev/null
+++ b/pkg/controller/configuration/template_render.go
@@ -0,0 +1,83 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package configuration
+
+import (
+	"fmt"
+
+	corev1 "k8s.io/api/core/v1"
+
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	configcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
+	"github.com/apecloud/kubeblocks/pkg/controller/render"
+)
+
+func RerenderParametersTemplate(reconcileCtx *render.ReconcileCtx,
+	item parametersv1alpha1.ConfigTemplateItemDetail,
+	configRender *parametersv1alpha1.ParamConfigRenderer,
+	parametersDefs []*parametersv1alpha1.ParametersDefinition) (*corev1.ConfigMap, error) {
+	parametersValidate := func(m map[string]string) error {
+		return validateRenderedData(m, parametersDefs, configRender)
+	}
+
+	configSpec := *item.ConfigSpec
+	templateRender := render.NewTemplateBuilder(reconcileCtx)
+	rerenderCMObj, err := templateRender.RenderComponentTemplate(configSpec,
+		configcore.GetComponentCfgName(reconcileCtx.SynthesizedComponent.ClusterName,
+			reconcileCtx.SynthesizedComponent.Name,
+			item.ConfigSpec.Name),
+		parametersValidate)
+	if err != nil {
+		return nil, err
+	}
+	if item.CustomTemplates == nil {
+		return rerenderCMObj, nil
+	}
+
+	mergedData, err := mergerConfigTemplate(*item.CustomTemplates,
+		templateRender,
+		configSpec,
+		rerenderCMObj.Data,
+		parametersDefs,
+		configRender)
+	if err != nil {
+		return nil, err
+	}
+	rerenderCMObj.Data = mergedData
+	return rerenderCMObj, nil
+}
+
+func ApplyParameters(item parametersv1alpha1.ConfigTemplateItemDetail,
+	baseConfig *corev1.ConfigMap,
+	configRender *parametersv1alpha1.ParamConfigRenderer,
+	paramsDefs []*parametersv1alpha1.ParametersDefinition) (*corev1.ConfigMap, error) {
+	if configRender == nil || len(configRender.Spec.Configs) == 0 {
+		return nil, fmt.Errorf("not support parameter reconfigure")
+	}
+
+	newData, err := DoMerge(baseConfig.Data, item.ConfigFileParams, paramsDefs, configRender.Spec.Configs)
+	if err != nil {
+		return nil, err
+	}
+
+	expected := baseConfig.DeepCopy()
+	expected.Data = newData
+	return expected, nil
+}
diff --git a/pkg/controller/configuration/template_validate.go b/pkg/controller/configuration/template_validate.go
new file mode 100644
index 000000000..62dcc6c20
--- /dev/null
+++ b/pkg/controller/configuration/template_validate.go
@@ -0,0 +1,66 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package configuration
+
+import (
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	"github.com/apecloud/kubeblocks/pkg/configuration/core"
+	"github.com/apecloud/kubeblocks/pkg/configuration/validate"
+)
+
+// validateRenderedData validates config file against constraint
+func validateRenderedData(renderedData map[string]string, paramsDefs []*parametersv1alpha1.ParametersDefinition, configRender *parametersv1alpha1.ParamConfigRenderer) error {
+	if len(paramsDefs) == 0 || configRender == nil || len(configRender.Spec.Configs) == 0 {
+		return nil
+	}
+	for _, paramsDef := range paramsDefs {
+		fileName := paramsDef.Spec.FileName
+		if paramsDef.Spec.ParametersSchema == nil {
+			continue
+		}
+		if _, ok := renderedData[fileName]; !ok {
+			continue
+		}
+		if fileConfig := resolveFileFormatConfig(configRender.Spec.Configs, fileName); fileConfig != nil {
+			if err := validateConfigContent(renderedData[fileName], &paramsDef.Spec, fileConfig); err != nil {
+				return err
+			}
+		}
+	}
+	return nil
+}
+
+func resolveFileFormatConfig(configDescs []parametersv1alpha1.ComponentConfigDescription, fileName string) *parametersv1alpha1.FileFormatConfig {
+	for i, configDesc := range configDescs {
+		if fileName == configDesc.Name {
+			return configDescs[i].FileFormatConfig
+		}
+	}
+	return nil
+}
+
+func validateConfigContent(renderedData string, paramsDef *parametersv1alpha1.ParametersDefinitionSpec, fileFormat *parametersv1alpha1.FileFormatConfig) error {
+	configChecker := validate.NewConfigValidator(paramsDef.ParametersSchema, fileFormat)
+	// NOTE: It is necessary to verify the correctness of the data
+	if err := configChecker.Validate(renderedData); err != nil {
+		return core.WrapError(err, "failed to validate configmap")
+	}
+	return nil
+}
diff --git a/pkg/controller/configuration/template_wrapper.go b/pkg/controller/configuration/template_wrapper.go
deleted file mode 100644
index d54ed01c3..000000000
--- a/pkg/controller/configuration/template_wrapper.go
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package configuration
-
-import (
-	"context"
-	"encoding/json"
-	"reflect"
-	"strconv"
-	"strings"
-
-	corev1 "k8s.io/api/core/v1"
-	apierrors "k8s.io/apimachinery/pkg/api/errors"
-	"k8s.io/apimachinery/pkg/runtime/schema"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
-	"github.com/apecloud/kubeblocks/pkg/configuration/validate"
-	"github.com/apecloud/kubeblocks/pkg/constant"
-	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-	"github.com/apecloud/kubeblocks/pkg/generics"
-)
-
-type renderWrapper struct {
-	render.TemplateRender
-
-	volumes             map[string]appsv1.ComponentTemplateSpec
-	templateAnnotations map[string]string
-	renderedObjs        []client.Object
-
-	renderedSecretObjs []client.Object
-
-	ctx       context.Context
-	cli       client.Client
-	cluster   *appsv1.Cluster
-	component *appsv1.Component
-}
-
-func newTemplateRenderWrapper(ctx context.Context, cli client.Client, templateBuilder render.TemplateRender,
-	cluster *appsv1.Cluster, component *appsv1.Component) renderWrapper {
-
-	return renderWrapper{
-		ctx:       ctx,
-		cli:       cli,
-		cluster:   cluster,
-		component: component,
-
-		TemplateRender:      templateBuilder,
-		templateAnnotations: make(map[string]string),
-		volumes:             make(map[string]appsv1.ComponentTemplateSpec),
-	}
-}
-
-func (wrapper *renderWrapper) checkRerenderTemplateSpec(cfgCMName string, localObjs []client.Object) (*corev1.ConfigMap, error) {
-	cmKey := client.ObjectKey{
-		Name:      cfgCMName,
-		Namespace: wrapper.cluster.Namespace,
-	}
-
-	cmObj := &corev1.ConfigMap{}
-	localObject := findMatchedLocalObject(localObjs, cmKey, generics.ToGVK(cmObj))
-	if localObject != nil {
-		if cm, ok := localObject.(*corev1.ConfigMap); ok {
-			return cm, nil
-		}
-	}
-
-	cmErr := wrapper.cli.Get(wrapper.ctx, cmKey, cmObj, inDataContext())
-	if cmErr != nil && !apierrors.IsNotFound(cmErr) {
-		// An unexpected error occurs
-		return nil, cmErr
-	}
-	if cmErr != nil {
-		// Config is not exists
-		return nil, nil
-	}
-
-	return cmObj, nil
-}
-
-func (wrapper *renderWrapper) renderConfigTemplate(cluster *appsv1.Cluster,
-	component *component.SynthesizedComponent, localObjs []client.Object, configuration *appsv1alpha1.Configuration) error {
-	revision := fromConfiguration(configuration)
-	for _, configSpec := range component.ConfigTemplates {
-		var item *appsv1alpha1.ConfigurationItemDetail
-		cmName := core.GetComponentCfgName(cluster.Name, component.Name, configSpec.Name)
-		origCMObj, err := wrapper.checkRerenderTemplateSpec(cmName, localObjs)
-		if err != nil {
-			return err
-		}
-		// If ConfigMap already exists, skip the rendering process.
-		// In this way, the Component controller only creates ConfigMap objects for the first time,
-		// and does not update the ConfigMap objects in the subsequent reconfiguration process.
-		// The subsequent reconfiguration process is handled by the Configuration controller.
-		if origCMObj != nil {
-			wrapper.addVolumeMountMeta(configSpec.ComponentTemplateSpec, origCMObj, false, !toSecret(configSpec))
-			continue
-		}
-		if configuration != nil {
-			item = configuration.Spec.GetConfigurationItem(configSpec.Name)
-		}
-		newCMObj, err := wrapper.rerenderConfigTemplate(cluster, component, configSpec, item)
-		if err != nil {
-			return err
-		}
-		if err := applyUpdatedParameters(item, newCMObj, configSpec, wrapper.cli, wrapper.ctx); err != nil {
-			return err
-		}
-		if err := wrapper.addRenderedObject(configSpec.ComponentTemplateSpec, newCMObj, configuration, !toSecret(configSpec)); err != nil {
-			return err
-		}
-		if err := updateConfigMetaForCM(newCMObj, item, revision); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func fromConfiguration(configuration *appsv1alpha1.Configuration) string {
-	if configuration == nil {
-		return ""
-	}
-	return strconv.FormatInt(configuration.GetGeneration(), 10)
-}
-
-func updateConfigMetaForCM(newCMObj *corev1.ConfigMap, item *appsv1alpha1.ConfigurationItemDetail, revision string) (err error) {
-	if item == nil {
-		return
-	}
-
-	annotations := newCMObj.GetAnnotations()
-	if annotations == nil {
-		annotations = make(map[string]string)
-	}
-	b, err := json.Marshal(item)
-	if err != nil {
-		return err
-	}
-	annotations[constant.ConfigAppliedVersionAnnotationKey] = string(b)
-	hash, _ := cfgutil.ComputeHash(newCMObj.Data)
-	annotations[constant.CMInsCurrentConfigurationHashLabelKey] = hash
-	annotations[constant.ConfigurationRevision] = revision
-	annotations[constant.CMConfigurationTemplateVersion] = item.Version
-	newCMObj.Annotations = annotations
-	return
-}
-
-func applyUpdatedParameters(item *appsv1alpha1.ConfigurationItemDetail, cm *corev1.ConfigMap, configSpec appsv1.ComponentConfigSpec, cli client.Client, ctx context.Context) (err error) {
-	var newData map[string]string
-	var configConstraint *appsv1beta1.ConfigConstraint
-
-	if item == nil || len(item.ConfigFileParams) == 0 {
-		return
-	}
-	if configSpec.ConfigConstraintRef != "" {
-		configConstraint, err = fetchConfigConstraint(configSpec.ConfigConstraintRef, ctx, cli)
-	}
-	if err != nil {
-		return
-	}
-	newData, err = DoMerge(cm.Data, item.ConfigFileParams, configConstraint, configSpec)
-	if err != nil {
-		return
-	}
-	cm.Data = newData
-	return
-}
-
-func (wrapper *renderWrapper) rerenderConfigTemplate(cluster *appsv1.Cluster,
-	component *component.SynthesizedComponent,
-	configSpec appsv1.ComponentConfigSpec,
-	item *appsv1alpha1.ConfigurationItemDetail,
-) (*corev1.ConfigMap, error) {
-	cmName := core.GetComponentCfgName(cluster.Name, component.Name, configSpec.Name)
-	newCMObj, err := wrapper.RenderComponentTemplate(configSpec.ComponentTemplateSpec, cmName, func(m map[string]string) error {
-		return validateRenderedData(m, configSpec, wrapper.ctx, wrapper.cli)
-	})
-	if err != nil {
-		return nil, err
-	}
-	// render user specified template
-	if item != nil && item.ImportTemplateRef != nil {
-		newData, err := mergerConfigTemplate(
-			appsv1.ConfigTemplateExtension{
-				TemplateRef: item.ImportTemplateRef.TemplateRef,
-				Namespace:   item.ImportTemplateRef.Namespace,
-				Policy:      appsv1.MergedPolicy(item.ImportTemplateRef.Policy),
-			},
-			wrapper.TemplateRender,
-			configSpec,
-			newCMObj.Data,
-			wrapper.ctx,
-			wrapper.cli)
-		if err != nil {
-			return nil, err
-		}
-		newCMObj.Data = newData
-	}
-	UpdateCMConfigSpecLabels(newCMObj, configSpec)
-	if InjectEnvEnabled(configSpec) && toSecret(configSpec) {
-		wrapper.renderedSecretObjs = append(wrapper.renderedSecretObjs, newCMObj)
-	}
-	return newCMObj, nil
-}
-
-func (wrapper *renderWrapper) renderScriptTemplate(cluster *appsv1.Cluster, component *component.SynthesizedComponent,
-	localObjs []client.Object) error {
-	for _, templateSpec := range component.ScriptTemplates {
-		cmName := core.GetComponentCfgName(cluster.Name, component.Name, templateSpec.Name)
-		object := findMatchedLocalObject(localObjs, client.ObjectKey{
-			Name:      cmName,
-			Namespace: wrapper.cluster.Namespace}, generics.ToGVK(&corev1.ConfigMap{}))
-		if object != nil {
-			wrapper.addVolumeMountMeta(templateSpec, object, false, true)
-			continue
-		}
-
-		// Generate ConfigMap objects for config files
-		cm, err := wrapper.RenderComponentTemplate(templateSpec, cmName, nil)
-		if err != nil {
-			return err
-		}
-		if err := wrapper.addRenderedObject(templateSpec, cm, nil, true); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
-func (wrapper *renderWrapper) addRenderedObject(templateSpec appsv1.ComponentTemplateSpec, cm *corev1.ConfigMap, configuration *appsv1alpha1.Configuration, asVolume bool) (err error) {
-	// The owner of the configmap object is a cluster,
-	// in order to manage the life cycle of configmap
-	if configuration != nil {
-		err = intctrlutil.SetControllerReference(configuration, cm)
-	} else {
-		err = intctrlutil.SetControllerReference(wrapper.component, cm)
-	}
-	if err != nil {
-		return err
-	}
-
-	core.SetParametersUpdateSource(cm, constant.ReconfigureManagerSource)
-	wrapper.addVolumeMountMeta(templateSpec, cm, true, asVolume)
-	return nil
-}
-
-func (wrapper *renderWrapper) addVolumeMountMeta(templateSpec appsv1.ComponentTemplateSpec, object client.Object, rendered bool, asVolume bool) {
-	if asVolume {
-		wrapper.volumes[object.GetName()] = templateSpec
-	}
-	if rendered {
-		wrapper.renderedObjs = append(wrapper.renderedObjs, object)
-	}
-	wrapper.templateAnnotations[core.GenerateTPLUniqLabelKeyWithConfig(templateSpec.Name)] = object.GetName()
-}
-
-func (wrapper *renderWrapper) CheckAndPatchConfigResource(origCMObj *corev1.ConfigMap, newData map[string]string) error {
-	if origCMObj == nil {
-		return nil
-	}
-	if reflect.DeepEqual(origCMObj.Data, newData) {
-		return nil
-	}
-
-	patch := client.MergeFrom(origCMObj.DeepCopy())
-	origCMObj.Data = newData
-	if origCMObj.Annotations == nil {
-		origCMObj.Annotations = make(map[string]string)
-	}
-	core.SetParametersUpdateSource(origCMObj, constant.ReconfigureManagerSource)
-	rawData, err := json.Marshal(origCMObj.Data)
-	if err != nil {
-		return err
-	}
-
-	origCMObj.Annotations[corev1.LastAppliedConfigAnnotation] = string(rawData)
-	return wrapper.cli.Patch(wrapper.ctx, origCMObj, patch)
-}
-
-func findMatchedLocalObject(localObjs []client.Object, objKey client.ObjectKey, gvk schema.GroupVersionKind) client.Object {
-	for _, obj := range localObjs {
-		if obj.GetName() == objKey.Name && obj.GetNamespace() == objKey.Namespace {
-			if generics.ToGVK(obj) == gvk {
-				return obj
-			}
-		}
-	}
-	return nil
-}
-
-func UpdateCMConfigSpecLabels(cm *corev1.ConfigMap, configSpec appsv1.ComponentConfigSpec) {
-	if cm.Labels == nil {
-		cm.Labels = make(map[string]string)
-	}
-
-	cm.Labels[constant.CMConfigurationSpecProviderLabelKey] = configSpec.Name
-	cm.Labels[constant.CMConfigurationTemplateNameLabelKey] = configSpec.TemplateRef
-	if configSpec.ConfigConstraintRef != "" {
-		cm.Labels[constant.CMConfigurationConstraintsNameLabelKey] = configSpec.ConfigConstraintRef
-	}
-
-	if len(configSpec.Keys) != 0 {
-		cm.Labels[constant.CMConfigurationCMKeysLabelKey] = strings.Join(configSpec.Keys, ",")
-	}
-}
-
-func fetchConfigConstraint(ccName string, ctx context.Context, cli client.Client) (*appsv1beta1.ConfigConstraint, error) {
-	ccKey := client.ObjectKey{
-		Name: ccName,
-	}
-	configConstraint := &appsv1beta1.ConfigConstraint{}
-	if err := cli.Get(ctx, ccKey, configConstraint); err != nil {
-		return nil, core.WrapError(err, "failed to get ConfigConstraint, key[%s]", ccName)
-	}
-	return configConstraint, nil
-}
-
-// validateRenderedData validates config file against constraint
-func validateRenderedData(
-	renderedData map[string]string,
-	configSpec appsv1.ComponentConfigSpec,
-	ctx context.Context,
-	cli client.Client) error {
-	if configSpec.ConfigConstraintRef == "" {
-		return nil
-	}
-	configConstraint, err := fetchConfigConstraint(configSpec.ConfigConstraintRef, ctx, cli)
-	if err != nil {
-		return err
-	}
-	return validateRawData(renderedData, configSpec, &configConstraint.Spec)
-}
-
-func validateRawData(renderedData map[string]string, configSpec appsv1.ComponentConfigSpec, cc *appsv1beta1.ConfigConstraintSpec) error {
-	configChecker := validate.NewConfigValidator(cc, validate.WithKeySelector(configSpec.Keys))
-	// NOTE: It is necessary to verify the correctness of the data
-	if err := configChecker.Validate(renderedData); err != nil {
-		return core.WrapError(err, "failed to validate configmap")
-	}
-	return nil
-}
diff --git a/pkg/controller/configuration/tool_image_builder.go b/pkg/controller/configuration/tool_image_builder.go
index 4529e6400..6d67f6f19 100644
--- a/pkg/controller/configuration/tool_image_builder.go
+++ b/pkg/controller/configuration/tool_image_builder.go
@@ -24,7 +24,7 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgcm "github.com/apecloud/kubeblocks/pkg/configuration/config_manager"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/factory"
@@ -49,7 +49,7 @@ func buildReloadToolsContainer(cfgManagerParams *cfgcm.CfgManagerBuildParams, po
 
 	var toolsPath string
 	var sidecarImage string
-	var toolContainers []appsv1beta1.ToolConfig
+	var toolContainers []parametersv1alpha1.ToolConfig
 	for _, buildParam := range cfgManagerParams.ConfigSpecsBuildParams {
 		if buildParam.ToolsImageSpec == nil {
 			continue
@@ -60,7 +60,7 @@ func buildReloadToolsContainer(cfgManagerParams *cfgcm.CfgManagerBuildParams, po
 			}
 			toolsImageMap[toolImage.Name] = buildParam
 			replaceToolsImageHolder(&toolImage, podSpec, buildParam.ConfigSpec.VolumeName)
-			if toolImage.AsSidecarContainerImage() && sidecarImage == "" {
+			if intctrlutil.AsSidecarContainerImage(toolImage) && sidecarImage == "" {
 				sidecarImage = toolImage.Image
 			} else {
 				toolContainers = append(toolContainers, toolImage)
@@ -87,7 +87,7 @@ func buildReloadToolsContainer(cfgManagerParams *cfgcm.CfgManagerBuildParams, po
 	return err
 }
 
-func checkAndInstallToolsImageVolume(toolContainers []appsv1beta1.ToolConfig, buildParams []cfgcm.ConfigSpecMeta, useBuiltinSidecarImage bool) ([]appsv1beta1.ToolConfig, string) {
+func checkAndInstallToolsImageVolume(toolContainers []parametersv1alpha1.ToolConfig, buildParams []cfgcm.ConfigSpecMeta, useBuiltinSidecarImage bool) ([]parametersv1alpha1.ToolConfig, string) {
 	var configManagerBinaryPath string
 	for _, buildParam := range buildParams {
 		if buildParam.ToolsImageSpec == nil {
@@ -101,19 +101,19 @@ func checkAndInstallToolsImageVolume(toolContainers []appsv1beta1.ToolConfig, bu
 	return toolContainers, configManagerBinaryPath
 }
 
-func containerExists(containers []appsv1beta1.ToolConfig, containerName string) bool {
-	return generics.CountFunc(containers, func(container appsv1beta1.ToolConfig) bool {
+func containerExists(containers []parametersv1alpha1.ToolConfig, containerName string) bool {
+	return generics.CountFunc(containers, func(container parametersv1alpha1.ToolConfig) bool {
 		return container.Name == containerName
 	}) != 0
 }
 
-func checkAndCreateConfigManagerToolsContainer(toolContainers []appsv1beta1.ToolConfig, mountPoint string) []appsv1beta1.ToolConfig {
+func checkAndCreateConfigManagerToolsContainer(toolContainers []parametersv1alpha1.ToolConfig, mountPoint string) []parametersv1alpha1.ToolConfig {
 	if containerExists(toolContainers, installConfigMangerToolContainerName) {
 		return toolContainers
 	}
 
 	kbToolsImage := viper.GetString(constant.KBToolsImage)
-	toolContainers = append(toolContainers, appsv1beta1.ToolConfig{
+	toolContainers = append(toolContainers, parametersv1alpha1.ToolConfig{
 		Name:    installConfigMangerToolContainerName,
 		Image:   kbToolsImage,
 		Command: []string{"cp", constant.ConfigManagerToolPath, mountPoint},
@@ -121,7 +121,7 @@ func checkAndCreateConfigManagerToolsContainer(toolContainers []appsv1beta1.Tool
 	return toolContainers
 }
 
-func replaceToolsImageHolder(toolConfig *appsv1beta1.ToolConfig, podSpec *corev1.PodSpec, volumeName string) {
+func replaceToolsImageHolder(toolConfig *parametersv1alpha1.ToolConfig, podSpec *corev1.PodSpec, volumeName string) {
 	switch {
 	case toolConfig.Image == kbToolsImagePlaceHolder:
 		toolConfig.Image = viper.GetString(constant.KBToolsImage)
diff --git a/pkg/controller/factory/builder.go b/pkg/controller/factory/builder.go
index 1f7a57f2b..c5e91ab4b 100644
--- a/pkg/controller/factory/builder.go
+++ b/pkg/controller/factory/builder.go
@@ -31,7 +31,7 @@ import (
 	"k8s.io/klog/v2"
 
 	kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	"github.com/apecloud/kubeblocks/pkg/common"
 	cfgcm "github.com/apecloud/kubeblocks/pkg/configuration/config_manager"
@@ -340,7 +340,7 @@ func getSidecarBinaryPath(buildParams *cfgcm.CfgManagerBuildParams) string {
 	return constant.ConfigManagerToolPath
 }
 
-func BuildCfgManagerToolsContainer(sidecarRenderedParam *cfgcm.CfgManagerBuildParams, toolsMetas []appsv1beta1.ToolConfig, toolsMap map[string]cfgcm.ConfigSpecMeta) ([]corev1.Container, error) {
+func BuildCfgManagerToolsContainer(sidecarRenderedParam *cfgcm.CfgManagerBuildParams, toolsMetas []parametersv1alpha1.ToolConfig, toolsMap map[string]cfgcm.ConfigSpecMeta) ([]corev1.Container, error) {
 	toolContainers := make([]corev1.Container, 0, len(toolsMetas))
 	for _, toolConfig := range toolsMetas {
 		toolContainerBuilder := builder.NewContainerBuilder(toolConfig.Name).
diff --git a/pkg/controller/render/render_utils.go b/pkg/controller/render/render_utils.go
new file mode 100644
index 000000000..1546c7e5e
--- /dev/null
+++ b/pkg/controller/render/render_utils.go
@@ -0,0 +1,76 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package render
+
+import (
+	corev1 "k8s.io/api/core/v1"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
+	"github.com/apecloud/kubeblocks/pkg/configuration/core"
+	"github.com/apecloud/kubeblocks/pkg/controller/component"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+)
+
+// RenderTemplate renders multiple component templates into Kubernetes ConfigMap objects.
+//
+// Parameters:
+// - resourceCtx: The context for resource operations.
+// - cluster: The cluster being reconciled.
+// - synthesizedComponent: Details of the synthesized component.
+// - comp: The component being reconciled.
+// - localObjs: A cache of client objects.
+// - tpls: A list of component template specifications.
+//
+// Returns:
+// - A slice of pointers to the rendered ConfigMap objects.
+// - An error if the rendering or validation fails.
+func RenderTemplate(resourceCtx *ResourceCtx,
+	cluster *appsv1.Cluster,
+	synthesizedComponent *component.SynthesizedComponent,
+	comp *appsv1.Component,
+	localObjs []client.Object,
+	tpls []appsv1.ComponentTemplateSpec) ([]*corev1.ConfigMap, error) {
+	var err error
+	var configMap *corev1.ConfigMap
+
+	reconcileCtx := &ReconcileCtx{
+		ResourceCtx:          resourceCtx,
+		Cluster:              cluster,
+		Component:            comp,
+		SynthesizedComponent: synthesizedComponent,
+		PodSpec:              synthesizedComponent.PodSpec,
+		Cache:                localObjs,
+	}
+
+	tplBuilder := NewTemplateBuilder(reconcileCtx)
+	configMaps := make([]*corev1.ConfigMap, 0, len(tpls))
+	for _, template := range tpls {
+		cmName := core.GetComponentCfgName(cluster.Name, synthesizedComponent.Name, template.Name)
+		if configMap, err = tplBuilder.RenderComponentTemplate(template, cmName, nil); err != nil {
+			return nil, err
+		}
+		if err = intctrlutil.SetOwnerReference(comp, configMap); err != nil {
+			return nil, err
+		}
+		configMaps = append(configMaps, configMap)
+	}
+	return configMaps, nil
+}
diff --git a/pkg/controllerutil/config_util.go b/pkg/controllerutil/config_util.go
index 98b34f54d..ad62986e6 100644
--- a/pkg/controllerutil/config_util.go
+++ b/pkg/controllerutil/config_util.go
@@ -32,20 +32,19 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	"github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/configuration/validate"
 	"github.com/apecloud/kubeblocks/pkg/constant"
+	"github.com/apecloud/kubeblocks/pkg/generics"
 )
 
 type Result struct {
-	Phase      v1alpha1.ConfigurationPhase `json:"phase"`
-	Revision   string                      `json:"revision"`
-	Policy     string                      `json:"policy"`
-	ExecResult string                      `json:"execResult"`
+	Phase      parametersv1alpha1.ParameterPhase `json:"phase"`
+	Revision   string                            `json:"revision"`
+	Policy     string                            `json:"policy"`
+	ExecResult string                            `json:"execResult"`
 
 	SucceedCount  int32 `json:"succeedCount"`
 	ExpectedCount int32 `json:"expectedCount"`
@@ -56,22 +55,22 @@ type Result struct {
 }
 
 // MergeAndValidateConfigs merges and validates configuration files
-func MergeAndValidateConfigs(configConstraint appsv1beta1.ConfigConstraintSpec, baseConfigs map[string]string, cmKey []string, updatedParams []core.ParamPairs) (map[string]string, error) {
+func MergeAndValidateConfigs(baseConfigs map[string]string,
+	updatedParams []core.ParamPairs,
+	paramsDefs []*parametersv1alpha1.ParametersDefinition,
+	configDescs []parametersv1alpha1.ComponentConfigDescription) (map[string]string, error) {
 	var (
-		err error
-		fc  = configConstraint.FileFormatConfig
-
-		newCfg         map[string]string
-		configOperator core.ConfigOperator
-		updatedKeys    = util.NewSet()
+		err             error
+		newCfg          map[string]string
+		configOperator  core.ConfigOperator
+		updatedFileList []string
 	)
 
-	cmKeySet := core.FromCMKeysSelector(cmKey)
 	configLoaderOption := core.CfgOption{
 		Type:           core.CfgCmType,
 		Log:            log.FromContext(context.TODO()),
-		CfgType:        fc.Format,
-		ConfigResource: core.FromConfigData(baseConfigs, cmKeySet),
+		FileFormatFn:   core.WithConfigFileFormat(configDescs),
+		ConfigResource: core.FromConfigData(baseConfigs, core.NewConfigFileFilter(configDescs)),
 	}
 	if configOperator, err = core.NewConfigLoader(configLoaderOption); err != nil {
 		return nil, err
@@ -79,14 +78,18 @@ func MergeAndValidateConfigs(configConstraint appsv1beta1.ConfigConstraintSpec,
 
 	// merge param to config file
 	for _, params := range updatedParams {
-		validUpdatedParameters := filterImmutableParameters(params.UpdatedParams, configConstraint.ImmutableParameters)
+		validUpdatedParameters := filterImmutableParameters(params.UpdatedParams, params.Key, paramsDefs)
 		if len(validUpdatedParameters) == 0 {
 			continue
 		}
-		if err := configOperator.MergeFrom(validUpdatedParameters, core.NewCfgOptions(params.Key, core.WithFormatterConfig(fc))); err != nil {
+		fc := core.ResolveConfigFormat(configDescs, params.Key)
+		if fc == nil {
+			return nil, fmt.Errorf("not support the config updated: %s", params.Key)
+		}
+		if err = configOperator.MergeFrom(validUpdatedParameters, core.NewCfgOptions(params.Key, core.WithFormatterConfig(fc))); err != nil {
 			return nil, err
 		}
-		updatedKeys.Add(params.Key)
+		updatedFileList = append(updatedFileList, params.Key)
 	}
 
 	if newCfg, err = configOperator.ToCfgContent(); err != nil {
@@ -96,11 +99,23 @@ func MergeAndValidateConfigs(configConstraint appsv1beta1.ConfigConstraintSpec,
 	// The ToCfgContent interface returns the file contents of all keys, the configuration file is encoded and decoded into keys,
 	// the content may be different with the original file, such as comments, blank lines, etc,
 	// in order to minimize the impact on the original file, only update the changed part.
-	updatedCfg := fromUpdatedConfig(newCfg, updatedKeys)
-	if err = validate.NewConfigValidator(&configConstraint, validate.WithKeySelector(cmKey)).Validate(updatedCfg); err != nil {
-		return nil, core.WrapError(err, "failed to validate updated config")
+	updatedCfgFiles := make(map[string]string, len(updatedFileList))
+	for _, key := range updatedFileList {
+		updatedCfgFiles[key] = newCfg[key]
+		paramsDef := resolveParametersDef(paramsDefs, key)
+		if paramsDef == nil {
+			continue
+		}
+		fc := core.ResolveConfigFormat(configDescs, key)
+		if fc == nil {
+			continue
+		}
+		if err = validate.NewConfigValidator(paramsDef.Spec.ParametersSchema, fc).Validate(updatedCfgFiles[key]); err != nil {
+			return nil, core.WrapError(err, "failed to validate updated config")
+		}
 	}
-	return core.MergeUpdatedConfig(baseConfigs, updatedCfg), nil
+
+	return core.MergeUpdatedConfig(baseConfigs, updatedCfgFiles), nil
 }
 
 // fromUpdatedConfig filters out changed file contents.
@@ -119,7 +134,7 @@ func fromUpdatedConfig(m map[string]string, sets *set.LinkedHashSetString) map[s
 }
 
 // IsApplyConfigChanged checks if the configuration is changed
-func IsApplyConfigChanged(configMap *corev1.ConfigMap, item v1alpha1.ConfigurationItemDetail) bool {
+func IsApplyConfigChanged(configMap *corev1.ConfigMap, item parametersv1alpha1.ConfigTemplateItemDetail) bool {
 	if configMap == nil {
 		return false
 	}
@@ -128,27 +143,23 @@ func IsApplyConfigChanged(configMap *corev1.ConfigMap, item v1alpha1.Configurati
 	if !ok {
 		return false
 	}
-	var target v1alpha1.ConfigurationItemDetail
-	if err := json.Unmarshal([]byte(lastAppliedVersion), &target); err != nil {
+	lastItem := parametersv1alpha1.ConfigTemplateItemDetail{}
+	if err := json.Unmarshal([]byte(lastAppliedVersion), &lastItem); err != nil {
 		return false
 	}
-
-	return reflect.DeepEqual(target, item)
+	return reflect.DeepEqual(lastItem, item)
 }
 
 // IsRerender checks if the configuration template is changed
-func IsRerender(configMap *corev1.ConfigMap, item v1alpha1.ConfigurationItemDetail) bool {
+func IsRerender(configMap *corev1.ConfigMap, item parametersv1alpha1.ConfigTemplateItemDetail) bool {
 	if configMap == nil {
 		return true
 	}
-	if item.Version == "" && item.Payload.Data == nil && item.ImportTemplateRef == nil {
+	if len(item.Payload) == 0 && item.CustomTemplates == nil {
 		return false
 	}
-	if version := configMap.Annotations[constant.CMConfigurationTemplateVersion]; version != item.Version {
-		return true
-	}
 
-	var updatedVersion v1alpha1.ConfigurationItemDetail
+	var updatedVersion parametersv1alpha1.ConfigTemplateItemDetail
 	updatedVersionStr, ok := configMap.Annotations[constant.ConfigAppliedVersionAnnotationKey]
 	if ok && updatedVersionStr != "" {
 		if err := json.Unmarshal([]byte(updatedVersionStr), &updatedVersion); err != nil {
@@ -156,35 +167,35 @@ func IsRerender(configMap *corev1.ConfigMap, item v1alpha1.ConfigurationItemDeta
 		}
 	}
 	return !reflect.DeepEqual(updatedVersion.Payload, item.Payload) ||
-		!reflect.DeepEqual(updatedVersion.ImportTemplateRef, item.ImportTemplateRef)
+		!reflect.DeepEqual(updatedVersion.CustomTemplates, item.CustomTemplates)
 }
 
 // GetConfigSpecReconcilePhase gets the configuration phase
 func GetConfigSpecReconcilePhase(configMap *corev1.ConfigMap,
-	item v1alpha1.ConfigurationItemDetail,
-	status *v1alpha1.ConfigurationItemDetailStatus) v1alpha1.ConfigurationPhase {
+	item parametersv1alpha1.ConfigTemplateItemDetail,
+	status *parametersv1alpha1.ConfigTemplateItemDetailStatus) parametersv1alpha1.ParameterPhase {
 	if status == nil || status.Phase == "" {
-		return v1alpha1.CCreatingPhase
+		return parametersv1alpha1.CCreatingPhase
 	}
 	if !IsApplyConfigChanged(configMap, item) {
-		return v1alpha1.CPendingPhase
+		return parametersv1alpha1.CPendingPhase
 	}
 	return status.Phase
 }
 
-func CheckAndPatchPayload(item *v1alpha1.ConfigurationItemDetail, payloadID string, payload interface{}) (bool, error) {
+func CheckAndPatchPayload(item *parametersv1alpha1.ConfigTemplateItemDetail, payloadID string, payload interface{}) (bool, error) {
 	if item == nil {
 		return false, nil
 	}
-	if item.Payload.Data == nil {
-		item.Payload.Data = make(map[string]interface{})
+	if item.Payload == nil {
+		item.Payload = make(map[string]json.RawMessage)
 	}
-	oldPayload, ok := item.Payload.Data[payloadID]
+	oldPayload, ok := item.Payload[payloadID]
 	if !ok && payload == nil {
 		return false, nil
 	}
 	if payload == nil {
-		delete(item.Payload.Data, payloadID)
+		delete(item.Payload, payloadID)
 		return true, nil
 	}
 	newPayload, err := buildPayloadAsUnstructuredObject(payload)
@@ -194,20 +205,16 @@ func CheckAndPatchPayload(item *v1alpha1.ConfigurationItemDetail, payloadID stri
 	if oldPayload != nil && reflect.DeepEqual(oldPayload, newPayload) {
 		return false, nil
 	}
-	item.Payload.Data[payloadID] = newPayload
+	item.Payload[payloadID] = newPayload
 	return true, nil
 }
 
-func buildPayloadAsUnstructuredObject(payload interface{}) (interface{}, error) {
+func buildPayloadAsUnstructuredObject(payload interface{}) (json.RawMessage, error) {
 	b, err := json.Marshal(payload)
 	if err != nil {
 		return nil, err
 	}
-	var unstructuredObj any
-	if err = json.Unmarshal(b, &unstructuredObj); err != nil {
-		return nil, err
-	}
-	return unstructuredObj, nil
+	return b, nil
 }
 
 func ResourcesPayloadForComponent(resources corev1.ResourceRequirements) any {
@@ -221,11 +228,23 @@ func ResourcesPayloadForComponent(resources corev1.ResourceRequirements) any {
 	}
 }
 
-func filterImmutableParameters(parameters map[string]any, immutableParams []string) map[string]any {
-	if len(immutableParams) == 0 || len(parameters) == 0 {
+func resolveParametersDef(paramsDefs []*parametersv1alpha1.ParametersDefinition, fileName string) *parametersv1alpha1.ParametersDefinition {
+	pos := generics.FindFirstFunc(paramsDefs, func(paramsDef *parametersv1alpha1.ParametersDefinition) bool {
+		return paramsDef.Spec.FileName == fileName
+	})
+	if pos >= 0 {
+		return paramsDefs[pos]
+	}
+	return nil
+}
+
+func filterImmutableParameters(parameters map[string]any, fileName string, paramsDefs []*parametersv1alpha1.ParametersDefinition) map[string]any {
+	paramsDef := resolveParametersDef(paramsDefs, fileName)
+	if paramsDef == nil || len(paramsDef.Spec.ImmutableParameters) == 0 {
 		return parameters
 	}
 
+	immutableParams := paramsDef.Spec.ImmutableParameters
 	validParameters := make(map[string]any, len(parameters))
 	for key, val := range parameters {
 		if !slices.Contains(immutableParams, key) {
@@ -235,14 +254,6 @@ func filterImmutableParameters(parameters map[string]any, immutableParams []stri
 	return validParameters
 }
 
-func TransformConfigTemplate(configs []appsv1.ComponentConfigSpec) []appsv1.ComponentTemplateSpec {
-	arr := make([]appsv1.ComponentTemplateSpec, 0, len(configs))
-	for _, config := range configs {
-		arr = append(arr, config.ComponentTemplateSpec)
-	}
-	return arr
-}
-
 func ResolveCmpdParametersDefs(ctx context.Context, reader client.Reader, cmpd *appsv1.ComponentDefinition) (*parametersv1alpha1.ParamConfigRenderer, []*parametersv1alpha1.ParametersDefinition, error) {
 	var paramsDefs []*parametersv1alpha1.ParametersDefinition
 
@@ -289,3 +300,25 @@ func ResolveComponentConfigRender(ctx context.Context, reader client.Reader, cmp
 	}
 	return nil, nil
 }
+
+func NeedDynamicReloadAction(pd *parametersv1alpha1.ParametersDefinitionSpec) bool {
+	if pd.MergeReloadAndRestart != nil {
+		return !*pd.MergeReloadAndRestart
+	}
+	return false
+}
+
+func ReloadStaticParameters(pd *parametersv1alpha1.ParametersDefinitionSpec) bool {
+	if pd.ReloadStaticParamsBeforeRestart != nil {
+		return *pd.ReloadStaticParamsBeforeRestart
+	}
+	return false
+}
+
+func TransformComponentParameters(params []opsv1alpha1.ParameterPair) parametersv1alpha1.ComponentParameters {
+	ret := make(parametersv1alpha1.ComponentParameters, len(params))
+	for _, param := range params {
+		ret[param.Key] = param.Value
+	}
+	return ret
+}
diff --git a/pkg/controllerutil/util.go b/pkg/controllerutil/util.go
index 820eda013..98612c410 100644
--- a/pkg/controllerutil/util.go
+++ b/pkg/controllerutil/util.go
@@ -79,7 +79,6 @@ func GetUncachedObjects() []client.Object {
 		&corev1.ConfigMap{},
 		&corev1.Secret{},
 		&appsv1.Cluster{},
-		&appsv1alpha1.Configuration{},
 	}
 }
 
diff --git a/pkg/dataprotection/backup/scheduler.go b/pkg/dataprotection/backup/scheduler.go
index 642cdf2b0..3184b6ab6 100644
--- a/pkg/dataprotection/backup/scheduler.go
+++ b/pkg/dataprotection/backup/scheduler.go
@@ -493,17 +493,7 @@ func (s *Scheduler) reconfigure(schedulePolicy *dpv1alpha1.SchedulePolicy) error
 						ComponentOps: opsv1alpha1.ComponentOps{
 							ComponentName: targetPodSelector.MatchLabels[constant.KBAppComponentLabelKey],
 						},
-						Configurations: []opsv1alpha1.ConfigurationItem{
-							{
-								Name: configRef.Name,
-								Keys: []opsv1alpha1.ParameterConfig{
-									{
-										Key:        configRef.Key,
-										Parameters: parameters,
-									},
-								},
-							},
-						},
+						Parameters: parameters,
 					},
 				},
 			},
diff --git a/pkg/generics/slices.go b/pkg/generics/slices.go
index 8d1d170c6..491de8a9b 100644
--- a/pkg/generics/slices.go
+++ b/pkg/generics/slices.go
@@ -47,3 +47,11 @@ func FindFirstFunc[S ~[]E, E any](s S, f func(E) bool) int {
 	}
 	return -1
 }
+
+func Map[E any, F any](s []E, f func(E) F) []F {
+	var arr []F
+	for _, e := range s {
+		arr = append(arr, f(e))
+	}
+	return arr
+}
diff --git a/pkg/generics/type.go b/pkg/generics/type.go
index 9f166fc21..8f4c8cd33 100644
--- a/pkg/generics/type.go
+++ b/pkg/generics/type.go
@@ -31,8 +31,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 	extensionsv1alpha1 "github.com/apecloud/kubeblocks/apis/extensions/v1alpha1"
 	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
@@ -112,11 +110,6 @@ var OpsDefinitionSignature = func(_ opsv1alpha1.OpsDefinition, _ *opsv1alpha1.Op
 }
 var OpsRequestSignature = func(_ opsv1alpha1.OpsRequest, _ *opsv1alpha1.OpsRequest, _ opsv1alpha1.OpsRequestList, _ *opsv1alpha1.OpsRequestList) {
 }
-var ConfigConstraintSignature = func(_ appsv1beta1.ConfigConstraint, _ *appsv1beta1.ConfigConstraint, _ appsv1beta1.ConfigConstraintList, _ *appsv1beta1.ConfigConstraintList) {
-}
-var ConfigurationSignature = func(_ appsv1alpha1.Configuration, _ *appsv1alpha1.Configuration, _ appsv1alpha1.ConfigurationList, _ *appsv1alpha1.ConfigurationList) {
-}
-
 var BackupPolicyTemplateSignature = func(_ dpv1alpha1.BackupPolicyTemplate, _ *dpv1alpha1.BackupPolicyTemplate, _ dpv1alpha1.BackupPolicyTemplateList, _ *dpv1alpha1.BackupPolicyTemplateList) {
 }
 var BackupPolicySignature = func(_ dpv1alpha1.BackupPolicy, _ *dpv1alpha1.BackupPolicy, _ dpv1alpha1.BackupPolicyList, _ *dpv1alpha1.BackupPolicyList) {
diff --git a/pkg/operations/ops_util.go b/pkg/operations/ops_util.go
index e6f4ab90f..280f973be 100644
--- a/pkg/operations/ops_util.go
+++ b/pkg/operations/ops_util.go
@@ -31,9 +31,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 	opsutil "github.com/apecloud/kubeblocks/pkg/operations/util"
@@ -57,8 +55,6 @@ type handleStatusProgressWithComponent func(reqCtx intctrlutil.RequestCtx,
 	pgRes *progressResource,
 	compStatus *opsv1alpha1.OpsRequestComponentStatus) (expectProgressCount int32, succeedCount int32, err error)
 
-type handleReconfigureOpsStatus func(cmStatus *opsv1alpha1.ConfigurationItemStatus) error
-
 // getClusterDefByName gets the ClusterDefinition object by the name.
 func getClusterDefByName(ctx context.Context, cli client.Client, clusterDefName string) (*appsv1.ClusterDefinition, error) {
 	clusterDef := &appsv1.ClusterDefinition{}
@@ -175,32 +171,6 @@ func isOpsRequestFailedPhase(opsRequestPhase opsv1alpha1.OpsPhase) bool {
 	return opsRequestPhase == opsv1alpha1.OpsFailedPhase
 }
 
-// patchReconfigureOpsStatus when Reconfigure is running, we should update status to OpsRequest.Status.ConfigurationStatus.
-//
-// NOTES:
-// opsStatus describes status of OpsRequest.
-// reconfiguringStatus describes status of reconfiguring operation, which contains multiple configuration templates.
-// cmStatus describes status of configmap, it is uniquely associated with a configuration template, which contains multiple keys, each key is name of a configuration file.
-// execStatus describes the result of the execution of the state machine, which is designed to solve how to conduct the reconfiguring operation, such as whether to restart, how to send a signal to the process.
-func updateReconfigureStatusByCM(reconfiguringStatus *opsv1alpha1.ReconfiguringStatus, tplName string,
-	handleReconfigureStatus handleReconfigureOpsStatus) error {
-	for i, cmStatus := range reconfiguringStatus.ConfigurationStatus {
-		if cmStatus.Name == tplName {
-			// update cmStatus
-			return handleReconfigureStatus(&reconfiguringStatus.ConfigurationStatus[i])
-		}
-	}
-	cmCount := len(reconfiguringStatus.ConfigurationStatus)
-	reconfiguringStatus.ConfigurationStatus = append(reconfiguringStatus.ConfigurationStatus, opsv1alpha1.ConfigurationItemStatus{
-		Name:          tplName,
-		Status:        appsv1alpha1.ReasonReconfigurePersisting,
-		SucceedCount:  core.NotStarted,
-		ExpectedCount: core.Unconfirmed,
-	})
-	cmStatus := &reconfiguringStatus.ConfigurationStatus[cmCount]
-	return handleReconfigureStatus(cmStatus)
-}
-
 // validateOpsWaitingPhase validates whether the current cluster phase is expected, and whether the waiting time exceeds the limit.
 // only requests with `Pending` phase will be validated.
 func validateOpsNeedWaitingClusterPhase(cluster *appsv1.Cluster, ops *opsv1alpha1.OpsRequest, opsBehaviour OpsBehaviour) error {
diff --git a/pkg/operations/reconfigure.go b/pkg/operations/reconfigure.go
index d84ecb3f9..6ae8c50a5 100644
--- a/pkg/operations/reconfigure.go
+++ b/pkg/operations/reconfigure.go
@@ -20,20 +20,15 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package operations
 
 import (
-	"fmt"
 	"time"
 
-	corev1 "k8s.io/api/core/v1"
-	"k8s.io/apimachinery/pkg/api/meta"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	configctrl "github.com/apecloud/kubeblocks/pkg/controller/configuration"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	"github.com/apecloud/kubeblocks/pkg/controller/builder"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
 
@@ -63,266 +58,60 @@ func (r *reconfigureAction) SaveLastConfiguration(reqCtx intctrlutil.RequestCtx,
 	return nil
 }
 
-func handleReconfigureStatusProgress(result *appsv1alpha1.ReconcileDetail, opsStatus *opsv1alpha1.OpsRequestStatus, phase appsv1alpha1.ConfigurationPhase) handleReconfigureOpsStatus {
-	return func(cmStatus *opsv1alpha1.ConfigurationItemStatus) (err error) {
-		// the Pending phase is waiting to be executed, and there is currently no valid ReconcileDetail information.
-		if result != nil && phase != appsv1alpha1.CPendingPhase {
-			cmStatus.LastAppliedStatus = result.ExecResult
-			cmStatus.UpdatePolicy = appsv1alpha1.UpgradePolicy(result.Policy)
-			cmStatus.SucceedCount = result.SucceedCount
-			cmStatus.ExpectedCount = result.ExpectedCount
-			cmStatus.Message = result.ErrMessage
-			cmStatus.Status = string(phase)
-		}
-		return
-	}
-}
-
-func handleNewReconfigureRequest(configPatch *core.ConfigPatchInfo, lastAppliedConfigs map[string]string) handleReconfigureOpsStatus {
-	return func(cmStatus *opsv1alpha1.ConfigurationItemStatus) (err error) {
-		cmStatus.Status = appsv1alpha1.ReasonReconfigurePersisted
-		cmStatus.LastAppliedConfiguration = lastAppliedConfigs
-		if configPatch != nil {
-			cmStatus.UpdatedParameters = opsv1alpha1.UpdatedParameters{
-				AddedKeys:   i2sMap(configPatch.AddConfig),
-				UpdatedKeys: b2sMap(configPatch.UpdateConfig),
-				DeletedKeys: i2sMap(configPatch.DeleteConfig),
-			}
-		}
-		return
-	}
-}
-
-func (r *reconfigureAction) syncDependResources(reqCtx intctrlutil.RequestCtx, cli client.Client, opsRes *OpsResource, configSpec opsv1alpha1.ConfigurationItem, componentName string) (*configctrl.Fetcher, error) {
-	fetcher := configctrl.NewResourceFetcher(&render.ResourceCtx{
-		Context:       reqCtx.Ctx,
-		Client:        cli,
-		Namespace:     opsRes.Cluster.Namespace,
-		ClusterName:   opsRes.Cluster.Name,
-		ComponentName: componentName,
-	})
+func (r *reconfigureAction) ReconcileAction(reqCtx intctrlutil.RequestCtx, cli client.Client, resource *OpsResource) (opsv1alpha1.OpsPhase, time.Duration, error) {
 
-	fetcher.ClusterObj = opsRes.Cluster
-	err := fetcher.
-		Configuration().
-		ConfigMap(configSpec.Name).
-		Complete()
-	if err != nil {
-		return nil, err
+	var parameters = &parametersv1alpha1.Parameter{}
+	if err := cli.Get(reqCtx.Ctx, client.ObjectKeyFromObject(resource.OpsRequest), parameters); err != nil {
+		return "", 30 * time.Second, err
 	}
-	return fetcher, nil
-}
-
-func (r *reconfigureAction) ReconcileAction(reqCtx intctrlutil.RequestCtx, cli client.Client, resource *OpsResource) (opsv1alpha1.OpsPhase, time.Duration, error) {
-	var (
-		isFinished = true
-		opsRequest = resource.OpsRequest.Spec
-	)
 
-	// Node: support multiple component
 	opsDeepCopy := resource.OpsRequest.DeepCopy()
-	statusAsComponents := make([]opsv1alpha1.ConfigurationItemStatus, 0)
-	for _, reconfigureParams := range fromReconfigureOperations(opsRequest, reqCtx, cli, resource) {
-		phase, err := r.doSyncReconfigureStatus(reconfigureParams)
-		switch {
-		case err != nil:
-			return "", 30 * time.Second, err
-		case phase == opsv1alpha1.OpsFailedPhase:
-			return opsv1alpha1.OpsFailedPhase, 0, nil
-		case phase != opsv1alpha1.OpsSucceedPhase:
-			isFinished = false
-		}
-		statusAsComponents = append(statusAsComponents, reconfigureParams.configurationStatus.ConfigurationStatus[0])
+	if !intctrlutil.IsParameterFinished(parameters.Status.Phase) {
+		return syncReconfigureForOps(reqCtx, cli, resource, opsDeepCopy, opsv1alpha1.OpsRunningPhase)
 	}
 
-	phase := opsv1alpha1.OpsRunningPhase
-	if isFinished {
-		phase = opsv1alpha1.OpsSucceedPhase
+	if parameters.Status.Phase == parametersv1alpha1.CFinishedPhase {
+		return syncReconfigureForOps(reqCtx, cli, resource, opsDeepCopy, opsv1alpha1.OpsSucceedPhase)
 	}
-	return syncReconfigureForOps(reqCtx, cli, resource, statusAsComponents, opsDeepCopy, phase)
-}
-
-func fromReconfigureOperations(request opsv1alpha1.OpsRequestSpec, reqCtx intctrlutil.RequestCtx, cli client.Client, resource *OpsResource) (reconfigures []reconfigureParams) {
-	var operations []opsv1alpha1.Reconfigure
-	operations = append(operations, request.Reconfigures...)
 
-	for _, reconfigure := range operations {
-		if len(reconfigure.Configurations) == 0 {
-			continue
-		}
-		reconfigures = append(reconfigures, reconfigureParams{
-			resource:            resource,
-			reqCtx:              reqCtx,
-			cli:                 cli,
-			clusterName:         resource.Cluster.Name,
-			componentName:       reconfigure.ComponentName,
-			opsRequest:          resource.OpsRequest,
-			configurationItem:   reconfigure.Configurations[0],
-			configurationStatus: initReconfigureStatus(resource.OpsRequest, reconfigure.ComponentName),
-		})
-	}
-	return reconfigures
+	return syncReconfigureForOps(reqCtx, cli, resource, opsDeepCopy, opsv1alpha1.OpsFailedPhase)
 }
 
-func syncReconfigureForOps(reqCtx intctrlutil.RequestCtx, cli client.Client, resource *OpsResource, statusAsComponents []opsv1alpha1.ConfigurationItemStatus, opsDeepCopy *opsv1alpha1.OpsRequest, phase opsv1alpha1.OpsPhase) (opsv1alpha1.OpsPhase, time.Duration, error) {
-	succeedCount := 0
-	expectedCount := 0
-	opsRequest := resource.OpsRequest
-	invalidProgress := false
-	for _, status := range statusAsComponents {
-		if status.SucceedCount < 0 || status.ExpectedCount < 0 {
-			invalidProgress = true
-			break
-		}
-		succeedCount += int(status.SucceedCount)
-		expectedCount += int(status.ExpectedCount)
-	}
-	if !invalidProgress {
-		opsRequest.Status.Progress = fmt.Sprintf("%d/%d", succeedCount, expectedCount)
-	}
+func syncReconfigureForOps(reqCtx intctrlutil.RequestCtx, cli client.Client, resource *OpsResource, opsDeepCopy *opsv1alpha1.OpsRequest, phase opsv1alpha1.OpsPhase) (opsv1alpha1.OpsPhase, time.Duration, error) {
 	if err := PatchOpsStatusWithOpsDeepCopy(reqCtx.Ctx, cli, resource, opsDeepCopy, phase); err != nil {
 		return "", 30 * time.Second, err
 	}
 	return phase, 30 * time.Second, nil
 }
 
-func (r *reconfigureAction) doSyncReconfigureStatus(params reconfigureParams) (opsv1alpha1.OpsPhase, error) {
-	configSpec := params.configurationItem
-	resource, err := r.syncDependResources(params.reqCtx,
-		params.cli, params.resource, configSpec, params.componentName)
+func (r *reconfigureAction) Action(reqCtx intctrlutil.RequestCtx, cli client.Client, resource *OpsResource) (err error) {
+	parameter, err := buildReconfigureParameter(resource.OpsRequest)
 	if err != nil {
-		return "", err
-	}
-
-	item := resource.ConfigurationObj.Spec.GetConfigurationItem(configSpec.Name)
-	itemStatus := resource.ConfigurationObj.Status.GetItemStatus(configSpec.Name)
-	if item == nil || itemStatus == nil {
-		return opsv1alpha1.OpsRunningPhase, nil
-	}
-
-	switch phase := reconfiguringPhase(resource, *item, itemStatus); phase {
-	case appsv1alpha1.CCreatingPhase, appsv1alpha1.CInitPhase:
-		return opsv1alpha1.OpsFailedPhase, core.MakeError("the configuration is creating or initializing, is not ready to reconfigure")
-	case appsv1alpha1.CFailedAndPausePhase:
-		return opsv1alpha1.OpsFailedPhase,
-			syncStatus(params.configurationStatus, params.resource, itemStatus, phase)
-	case appsv1alpha1.CFinishedPhase:
-		return opsv1alpha1.OpsSucceedPhase,
-			syncStatus(params.configurationStatus, params.resource, itemStatus, phase)
-	default:
-		return opsv1alpha1.OpsRunningPhase,
-			syncStatus(params.configurationStatus, params.resource, itemStatus, phase)
+		return err
 	}
-}
 
-func (r *reconfigureAction) Action(reqCtx intctrlutil.RequestCtx, cli client.Client, resource *OpsResource) error {
-	opsRequest := resource.OpsRequest.Spec
-	// Node: support multiple component
-	for _, reconfigureParams := range fromReconfigureOperations(opsRequest, reqCtx, cli, resource) {
-		if err := r.doReconfiguring(reconfigureParams); err != nil {
-			return err
+	var param = &parametersv1alpha1.Parameter{}
+	if err = cli.Get(reqCtx.Ctx, client.ObjectKeyFromObject(parameter), param); err != nil {
+		if client.IgnoreNotFound(err) == nil {
+			return cli.Create(reqCtx.Ctx, parameter)
 		}
-	}
-	return nil
-}
-
-func (r *reconfigureAction) doReconfiguring(params reconfigureParams) error {
-	if !needReconfigure(params.opsRequest, params.configurationStatus) {
-		return nil
-	}
-
-	item := params.configurationItem
-	opsPipeline := newPipeline(reconfigureContext{
-		cli:           params.cli,
-		reqCtx:        params.reqCtx,
-		resource:      params.resource,
-		config:        item,
-		clusterName:   params.clusterName,
-		componentName: params.componentName,
-	})
-
-	result := opsPipeline.
-		Configuration().
-		Validate().
-		ConfigMap(item.Name).
-		ConfigConstraints().
-		Merge().
-		UpdateOpsLabel().
-		Sync().
-		Complete()
-
-	if result.err != nil {
-		return processMergedFailed(params.resource, result.failed, result.err)
-	}
-
-	params.reqCtx.Recorder.Eventf(params.resource.OpsRequest,
-		corev1.EventTypeNormal,
-		appsv1alpha1.ReasonReconfigurePersisted,
-		"the reconfiguring operation of component[%s] in cluster[%s] merged successfully", params.componentName, params.clusterName)
-
-	// merged successfully
-	if err := updateReconfigureStatusByCM(params.configurationStatus, opsPipeline.configSpec.Name,
-		handleNewReconfigureRequest(result.configPatch, result.lastAppliedConfigs)); err != nil {
 		return err
 	}
-	condition := constructReconfiguringConditions(result, params.resource, opsPipeline.configSpec)
-	meta.SetStatusCondition(&params.configurationStatus.Conditions, *condition)
 	return nil
 }
 
-func needReconfigure(request *opsv1alpha1.OpsRequest, status *opsv1alpha1.ReconfiguringStatus) bool {
-	// Update params to configmap
-	if request.Spec.Type != opsv1alpha1.ReconfiguringType {
-		return false
+func buildReconfigureParameter(ops *opsv1alpha1.OpsRequest) (*parametersv1alpha1.Parameter, error) {
+	if len(ops.Spec.Reconfigures) == 0 {
+		return nil, intctrlutil.NewErrorf(intctrlutil.ErrorTypeFatal, `invalid reconfigure request: %s`, ops.GetName())
 	}
 
-	// Check if the reconfiguring operation has been processed.
-	for _, condition := range status.Conditions {
-		if isExpectedPhase(condition, []string{appsv1alpha1.ReasonReconfigurePersisted, appsv1alpha1.ReasonReconfigureNoChanged}, metav1.ConditionTrue) {
-			return false
+	paramBuilder := builder.NewParameterBuilder(ops.Namespace, ops.GetName()).
+		ClusterRef(ops.Spec.ClusterName)
+	for _, reconfigure := range ops.Spec.Reconfigures {
+		if len(reconfigure.Parameters) != 0 {
+			paramBuilder.SetComponentParameters(reconfigure.ComponentName, intctrlutil.TransformComponentParameters(reconfigure.Parameters))
 		}
 	}
-	return true
-}
-
-func syncStatus(reconfiguringStatus *opsv1alpha1.ReconfiguringStatus,
-	opsRes *OpsResource,
-	status *appsv1alpha1.ConfigurationItemDetailStatus,
-	phase appsv1alpha1.ConfigurationPhase) error {
-	err := updateReconfigureStatusByCM(reconfiguringStatus, status.Name,
-		handleReconfigureStatusProgress(status.ReconcileDetail, &opsRes.OpsRequest.Status, phase))
-	meta.SetStatusCondition(&reconfiguringStatus.Conditions, *opsv1alpha1.NewReconfigureRunningCondition(
-		opsRes.OpsRequest, string(phase), status.Name))
-	return err
-}
 
-func reconfiguringPhase(resource *configctrl.Fetcher,
-	detail appsv1alpha1.ConfigurationItemDetail,
-	status *appsv1alpha1.ConfigurationItemDetailStatus) appsv1alpha1.ConfigurationPhase {
-	if status.ReconcileDetail == nil || status.ReconcileDetail.CurrentRevision != status.UpdateRevision {
-		return appsv1alpha1.CPendingPhase
-	}
-	return intctrlutil.GetConfigSpecReconcilePhase(resource.ConfigMapObj, detail, status)
-}
-
-func isExpectedPhase(condition metav1.Condition, expectedTypes []string, expectedStatus metav1.ConditionStatus) bool {
-	for _, t := range expectedTypes {
-		if t == condition.Type && condition.Status == expectedStatus {
-			return true
-		}
-	}
-	return false
-}
-
-func initReconfigureStatus(opsRequest *opsv1alpha1.OpsRequest, componentName string) *opsv1alpha1.ReconfiguringStatus {
-	status := &opsRequest.Status
-	if status.ReconfiguringStatusAsComponent == nil {
-		status.ReconfiguringStatusAsComponent = make(map[string]*opsv1alpha1.ReconfiguringStatus)
-	}
-	if _, ok := status.ReconfiguringStatusAsComponent[componentName]; !ok {
-		status.ReconfiguringStatusAsComponent[componentName] = &opsv1alpha1.ReconfiguringStatus{
-			ConfigurationStatus: make([]opsv1alpha1.ConfigurationItemStatus, 0),
-		}
-	}
-	return status.ReconfiguringStatusAsComponent[componentName]
+	return paramBuilder.GetObject(), nil
 }
diff --git a/pkg/operations/reconfigure_pipeline.go b/pkg/operations/reconfigure_pipeline.go
deleted file mode 100644
index 1eaa4b3c2..000000000
--- a/pkg/operations/reconfigure_pipeline.go
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package operations
-
-import (
-	"fmt"
-	"slices"
-
-	"github.com/pkg/errors"
-	"k8s.io/apimachinery/pkg/util/validation/field"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
-	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/configuration/validate"
-	"github.com/apecloud/kubeblocks/pkg/controller/builder"
-	configctrl "github.com/apecloud/kubeblocks/pkg/controller/configuration"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-)
-
-type reconfigureContext struct {
-	// reconfiguring request
-	config opsv1alpha1.ConfigurationItem
-
-	cli      client.Client
-	reqCtx   intctrlutil.RequestCtx
-	resource *OpsResource
-
-	clusterName   string
-	componentName string
-}
-
-type pipeline struct {
-	isFailed bool
-
-	updatedParameters []cfgcore.ParamPairs
-	mergedConfig      map[string]string
-	configPatch       *cfgcore.ConfigPatchInfo
-	isFileUpdated     bool
-
-	updatedObject    *appsv1alpha1.Configuration
-	configConstraint *appsv1beta1.ConfigConstraint
-	configSpec       *appsv1.ComponentConfigSpec
-
-	reconfigureContext
-	configctrl.ResourceFetcher[pipeline]
-}
-
-func newPipeline(ctx reconfigureContext) *pipeline {
-	pipeline := &pipeline{reconfigureContext: ctx}
-	pipeline.Init(&render.ResourceCtx{
-		Client:        ctx.cli,
-		Context:       ctx.reqCtx.Ctx,
-		Namespace:     ctx.resource.OpsRequest.Namespace,
-		ClusterName:   ctx.clusterName,
-		ComponentName: ctx.componentName,
-	}, pipeline)
-	pipeline.ClusterObj = ctx.resource.Cluster
-	return pipeline
-}
-
-func (p *pipeline) Validate() *pipeline {
-	validateFn := func() error {
-		if p.ConfigurationObj == nil {
-			return cfgcore.MakeError("failed to found configuration of component[%s] in the cluster[%s]",
-				p.reconfigureContext.componentName,
-				p.reconfigureContext.clusterName,
-			)
-		}
-
-		item := p.ConfigurationObj.Spec.GetConfigurationItem(p.config.Name)
-		if item == nil || item.ConfigSpec == nil {
-			p.isFailed = true
-			return cfgcore.MakeError("failed to reconfigure, not existed config[%s]", p.config.Name)
-		}
-
-		p.configSpec = builder.ToV1ConfigSpec(item.ConfigSpec)
-		return nil
-	}
-
-	return p.Wrap(validateFn)
-}
-
-func (p *pipeline) ConfigConstraints() *pipeline {
-	validateFn := func() (err error) {
-		if !hasFileUpdate(p.config) {
-			p.isFailed = true
-			err = cfgcore.MakeError(
-				"current configSpec not support reconfigure, configSpec: %v",
-				p.configSpec.Name)
-		}
-		return
-	}
-
-	fetchCCFn := func() error {
-		ccKey := client.ObjectKey{
-			Name: p.configSpec.ConfigConstraintRef,
-		}
-		p.configConstraint = &appsv1beta1.ConfigConstraint{}
-		if err := p.cli.Get(p.reqCtx.Ctx, ccKey, p.configConstraint); err != nil {
-			return err
-		}
-		if p.configConstraint.Spec.FileFormatConfig == nil {
-			return errors.Wrap(field.Invalid(field.NewPath("spec.fileFormatConfig"), nil,
-				"fileFormatConfig is empty"),
-				fmt.Sprintf("invalid configconstraint: %s", p.configSpec.ConfigConstraintRef))
-		}
-		return nil
-	}
-
-	return p.Wrap(func() error {
-		if p.configSpec.ConfigConstraintRef == "" {
-			return validateFn()
-		} else {
-			return fetchCCFn()
-		}
-	})
-}
-
-func (p *pipeline) doMergeImpl(parameters opsv1alpha1.ConfigurationItem) error {
-	newConfigObj := p.ConfigurationObj.DeepCopy()
-
-	item := newConfigObj.Spec.GetConfigurationItem(p.config.Name)
-	if item == nil {
-		return cfgcore.MakeError("not found config item: %s", parameters.Name)
-	}
-
-	configSpec := p.configSpec
-	if item.ConfigFileParams == nil {
-		item.ConfigFileParams = make(map[string]appsv1alpha1.ConfigParams)
-	}
-	filter := validate.WithKeySelector(configSpec.Keys)
-	paramFilter := createImmutableParamsFilter(p.configConstraint)
-	for _, key := range parameters.Keys {
-		// patch parameters
-		if configSpec.ConfigConstraintRef != "" && filter(key.Key) {
-			if key.FileContent != "" {
-				return cfgcore.MakeError("not allowed to update file content: %s", key.Key)
-			}
-			updateParameters(item, key.Key, key.Parameters, paramFilter)
-			p.updatedParameters = append(p.updatedParameters, cfgcore.ParamPairs{
-				Key:           key.Key,
-				UpdatedParams: fromKeyValuePair(key.Parameters),
-			})
-			continue
-		}
-		// update file content
-		if len(key.Parameters) != 0 {
-			return cfgcore.MakeError("not allowed to patch parameters: %s", key.Key)
-		}
-		updateFileContent(item, key.Key, key.FileContent)
-		p.isFileUpdated = true
-	}
-	p.updatedObject = newConfigObj
-	return p.createUpdatePatch(item, configSpec)
-}
-
-func (p *pipeline) createUpdatePatch(item *appsv1alpha1.ConfigurationItemDetail, configSpec *appsv1.ComponentConfigSpec) error {
-	if p.configConstraint == nil {
-		return nil
-	}
-
-	updatedData, err := configctrl.DoMerge(p.ConfigMapObj.Data, item.ConfigFileParams, p.configConstraint, *configSpec)
-	if err != nil {
-		p.isFailed = true
-		return err
-	}
-	p.configPatch, _, err = cfgcore.CreateConfigPatch(p.ConfigMapObj.Data,
-		updatedData,
-		p.configConstraint.Spec.FileFormatConfig.Format,
-		p.configSpec.Keys,
-		false)
-	return err
-}
-
-func (p *pipeline) doMerge() error {
-	if p.ConfigurationObj == nil {
-		return cfgcore.MakeError("not found config: %s",
-			cfgcore.GenerateComponentConfigurationName(p.clusterName, p.componentName))
-	}
-	return p.doMergeImpl(p.config)
-}
-
-func (p *pipeline) Merge() *pipeline {
-	return p.Wrap(p.doMerge)
-}
-
-func (p *pipeline) UpdateOpsLabel() *pipeline {
-	updateFn := func() error {
-		if len(p.updatedParameters) == 0 ||
-			p.configConstraint == nil ||
-			p.configConstraint.Spec.FileFormatConfig == nil {
-			return nil
-		}
-
-		request := p.resource.OpsRequest
-		newRequest := request.DeepCopy()
-		deepObject := client.MergeFrom(newRequest.DeepCopy())
-		formatter := p.configConstraint.Spec.FileFormatConfig
-		updateOpsLabelWithReconfigure(newRequest, p.updatedParameters, p.ConfigMapObj.Data, formatter)
-		return p.cli.Patch(p.reqCtx.Ctx, newRequest, deepObject)
-	}
-
-	return p.Wrap(updateFn)
-}
-
-func (p *pipeline) Sync() *pipeline {
-	return p.Wrap(func() error {
-		return p.Client.Patch(p.reqCtx.Ctx, p.updatedObject, client.MergeFrom(p.ConfigurationObj))
-	})
-}
-
-func (p *pipeline) Complete() reconfiguringResult {
-	if p.Err != nil {
-		return makeReconfiguringResult(p.Err, withFailed(p.isFailed))
-	}
-
-	return makeReconfiguringResult(nil,
-		withReturned(p.mergedConfig, p.configPatch),
-		withNoFormatFilesUpdated(p.isFileUpdated),
-	)
-}
-
-func createImmutableParamsFilter(cc *appsv1beta1.ConfigConstraint) validate.ValidatorOptions {
-	var immutableParams []string
-	if cc != nil {
-		immutableParams = cc.Spec.ImmutableParameters
-	}
-	return func(key string) bool {
-		return len(immutableParams) == 0 || !slices.Contains(immutableParams, key)
-	}
-}
diff --git a/pkg/operations/reconfigure_util.go b/pkg/operations/reconfigure_util.go
deleted file mode 100644
index 898d8253b..000000000
--- a/pkg/operations/reconfigure_util.go
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package operations
-
-import (
-	"encoding/json"
-	"fmt"
-
-	"github.com/spf13/cast"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"sigs.k8s.io/controller-runtime/pkg/log"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/configuration/validate"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-)
-
-type reconfiguringResult struct {
-	failed               bool
-	noFormatFilesUpdated bool
-	configPatch          *core.ConfigPatchInfo
-	lastAppliedConfigs   map[string]string
-	err                  error
-}
-
-func updateOpsLabelWithReconfigure(obj *opsv1alpha1.OpsRequest, params []core.ParamPairs, orinalData map[string]string, formatter *appsv1beta1.FileFormatConfig) {
-	var maxLabelCount = 16
-	updateLabel := func(param map[string]interface{}) {
-		if obj.Labels == nil {
-			obj.Labels = make(map[string]string)
-		}
-		for key, val := range param {
-			if maxLabelCount <= 0 {
-				return
-			}
-			paramName := core.GetValidFieldName(key)
-			if core.IsValidLabelKeyOrValue(paramName) {
-				obj.Labels[paramName] = core.FromValueToString(val)
-			}
-			maxLabelCount--
-		}
-	}
-	updateAnnotation := func(keyFile string, param map[string]interface{}) {
-		data, ok := orinalData[keyFile]
-		if !ok {
-			return
-		}
-		if obj.Annotations == nil {
-			obj.Annotations = make(map[string]string)
-		}
-		oldValue, err := fetchOriginalValue(keyFile, data, param, formatter)
-		if err != nil {
-			log.Log.Error(err, "failed to fetch original value")
-			return
-		}
-		obj.Annotations[keyFile] = oldValue
-	}
-
-	for _, param := range params {
-		updateLabel(param.UpdatedParams)
-		if maxLabelCount <= 0 {
-			return
-		}
-		updateAnnotation(param.Key, param.UpdatedParams)
-	}
-}
-
-func fetchOriginalValue(keyFile, data string, params map[string]interface{}, formatter *appsv1beta1.FileFormatConfig) (string, error) {
-	baseConfigObj, err := core.FromConfigObject(keyFile, data, formatter)
-	if err != nil {
-		return "", err
-	}
-	r := make(map[string]string, len(params))
-	for key := range params {
-		oldVal := baseConfigObj.Get(key)
-		if oldVal != nil {
-			r[key] = cast.ToString(oldVal)
-		}
-	}
-	b, err := json.Marshal(r)
-	return string(b), err
-}
-
-func fromKeyValuePair(parameters []opsv1alpha1.ParameterPair) map[string]interface{} {
-	m := make(map[string]interface{}, len(parameters))
-	for _, param := range parameters {
-		if param.Value != nil {
-			m[param.Key] = *param.Value
-		} else {
-			m[param.Key] = nil
-		}
-	}
-	return m
-}
-
-func withFailed(failed bool) func(result *reconfiguringResult) {
-	return func(result *reconfiguringResult) {
-		result.failed = failed
-	}
-}
-
-func withReturned(configs map[string]string, patch *core.ConfigPatchInfo) func(result *reconfiguringResult) {
-	return func(result *reconfiguringResult) {
-		result.lastAppliedConfigs = configs
-		result.configPatch = patch
-	}
-}
-
-func withNoFormatFilesUpdated(changed bool) func(result *reconfiguringResult) {
-	return func(result *reconfiguringResult) {
-		result.noFormatFilesUpdated = changed
-	}
-}
-
-func makeReconfiguringResult(err error, ops ...func(*reconfiguringResult)) reconfiguringResult {
-	result := reconfiguringResult{
-		failed: false,
-		err:    err,
-	}
-	for _, o := range ops {
-		o(&result)
-	}
-	return result
-}
-
-func constructReconfiguringConditions(result reconfiguringResult, resource *OpsResource, configSpec *appsv1.ComponentConfigSpec) *metav1.Condition {
-	if result.noFormatFilesUpdated || (result.configPatch != nil && result.configPatch.IsModify) {
-		return opsv1alpha1.NewReconfigureRunningCondition(
-			resource.OpsRequest,
-			appsv1alpha1.ReasonReconfigurePersisted,
-			configSpec.Name,
-			formatConfigPatchToMessage(result.configPatch, nil))
-	}
-	return opsv1alpha1.NewReconfigureRunningCondition(
-		resource.OpsRequest,
-		appsv1alpha1.ReasonReconfigureNoChanged,
-		configSpec.Name,
-		formatConfigPatchToMessage(result.configPatch, nil))
-}
-
-func i2sMap(config map[string]interface{}) map[string]string {
-	if len(config) == 0 {
-		return nil
-	}
-	m := make(map[string]string, len(config))
-	for key, value := range config {
-		data, _ := json.Marshal(value)
-		m[key] = string(data)
-	}
-	return m
-}
-
-func b2sMap(config map[string][]byte) map[string]string {
-	if len(config) == 0 {
-		return nil
-	}
-	m := make(map[string]string, len(config))
-	for key, value := range config {
-		m[key] = string(value)
-	}
-	return m
-}
-
-func processMergedFailed(resource *OpsResource, isInvalid bool, err error) error {
-	if !isInvalid {
-		return core.WrapError(err, "failed to update param!")
-	}
-
-	// if failed to validate configure, set opsRequest to failed and return
-	failedCondition := opsv1alpha1.NewReconfigureFailedCondition(resource.OpsRequest, err)
-	resource.OpsRequest.SetStatusCondition(*failedCondition)
-	return intctrlutil.NewFatalError(err.Error())
-}
-
-func formatConfigPatchToMessage(configPatch *core.ConfigPatchInfo, execStatus *core.PolicyExecStatus) string {
-	policyName := ""
-	if execStatus != nil {
-		policyName = fmt.Sprintf("updated policy: <%s>, ", execStatus.PolicyName)
-	}
-	if configPatch == nil {
-		return fmt.Sprintf("%supdated full config files.", policyName)
-	}
-	return fmt.Sprintf("%supdated: %s, added: %s, deleted:%s",
-		policyName,
-		configPatch.UpdateConfig,
-		configPatch.AddConfig,
-		configPatch.DeleteConfig)
-}
-
-func updateFileContent(item *appsv1alpha1.ConfigurationItemDetail, key string, content string) {
-	params, ok := item.ConfigFileParams[key]
-	if !ok {
-		item.ConfigFileParams[key] = appsv1alpha1.ConfigParams{
-			Content: &content,
-		}
-		return
-	}
-	item.ConfigFileParams[key] = appsv1alpha1.ConfigParams{
-		Parameters: params.Parameters,
-		Content:    &content,
-	}
-}
-
-func updateParameters(item *appsv1alpha1.ConfigurationItemDetail, key string, parameters []opsv1alpha1.ParameterPair, filter validate.ValidatorOptions) {
-	updatedParams := make(map[string]*string, len(parameters))
-	for _, parameter := range parameters {
-		if filter(parameter.Key) {
-			updatedParams[parameter.Key] = parameter.Value
-		}
-	}
-
-	params, ok := item.ConfigFileParams[key]
-	if !ok {
-		item.ConfigFileParams[key] = appsv1alpha1.ConfigParams{
-			Parameters: updatedParams,
-		}
-		return
-	}
-
-	item.ConfigFileParams[key] = appsv1alpha1.ConfigParams{
-		Content:    params.Content,
-		Parameters: mergeMaps(params.Parameters, updatedParams),
-	}
-}
-
-func mergeMaps(m1 map[string]*string, m2 map[string]*string) map[string]*string {
-	merged := make(map[string]*string)
-	for key, value := range m1 {
-		merged[key] = value
-	}
-	for key, value := range m2 {
-		merged[key] = value
-	}
-	return merged
-}
-
-func hasFileUpdate(config opsv1alpha1.ConfigurationItem) bool {
-	for _, key := range config.Keys {
-		if key.FileContent != "" {
-			return true
-		}
-	}
-	return false
-}
diff --git a/pkg/operations/type.go b/pkg/operations/type.go
index e570091f4..e5a3bee2d 100644
--- a/pkg/operations/type.go
+++ b/pkg/operations/type.go
@@ -72,18 +72,6 @@ type OpsBehaviour struct {
 	OpsHandler OpsHandler
 }
 
-type reconfigureParams struct {
-	resource *OpsResource
-	reqCtx   intctrlutil.RequestCtx
-	cli      client.Client
-
-	clusterName         string
-	componentName       string
-	opsRequest          *opsv1alpha1.OpsRequest
-	configurationItem   opsv1alpha1.ConfigurationItem
-	configurationStatus *opsv1alpha1.ReconfiguringStatus
-}
-
 type OpsResource struct {
 	OpsDef         *opsv1alpha1.OpsDefinition
 	OpsRequest     *opsv1alpha1.OpsRequest
diff --git a/pkg/unstructured/config_object.go b/pkg/unstructured/config_object.go
index 764a27cf1..3e6f95871 100644
--- a/pkg/unstructured/config_object.go
+++ b/pkg/unstructured/config_object.go
@@ -23,13 +23,13 @@ import (
 	"fmt"
 	"sync"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 type ConfigObjectCreator = func(name string) ConfigObject
 
 type ConfigObjectRegistry struct {
-	objectCreator map[appsv1beta1.CfgFileFormat]ConfigObjectCreator
+	objectCreator map[parametersv1alpha1.CfgFileFormat]ConfigObjectCreator
 }
 
 var (
@@ -39,16 +39,16 @@ var (
 
 func CfgObjectRegistry() *ConfigObjectRegistry {
 	ConfigRegistryOnce.Do(func() {
-		configObjectRegistry = &ConfigObjectRegistry{objectCreator: make(map[appsv1beta1.CfgFileFormat]ConfigObjectCreator)}
+		configObjectRegistry = &ConfigObjectRegistry{objectCreator: make(map[parametersv1alpha1.CfgFileFormat]ConfigObjectCreator)}
 	})
 	return configObjectRegistry
 }
 
-func (c *ConfigObjectRegistry) RegisterConfigCreator(format appsv1beta1.CfgFileFormat, creator ConfigObjectCreator) {
+func (c *ConfigObjectRegistry) RegisterConfigCreator(format parametersv1alpha1.CfgFileFormat, creator ConfigObjectCreator) {
 	c.objectCreator[format] = creator
 }
 
-func (c *ConfigObjectRegistry) GetConfigObject(name string, format appsv1beta1.CfgFileFormat) (ConfigObject, error) {
+func (c *ConfigObjectRegistry) GetConfigObject(name string, format parametersv1alpha1.CfgFileFormat) (ConfigObject, error) {
 	creator, ok := c.objectCreator[format]
 	if !ok {
 		return nil, fmt.Errorf("not supported type[%s]", format)
@@ -56,7 +56,7 @@ func (c *ConfigObjectRegistry) GetConfigObject(name string, format appsv1beta1.C
 	return creator(name), nil
 }
 
-func LoadConfig(name string, content string, format appsv1beta1.CfgFileFormat) (ConfigObject, error) {
+func LoadConfig(name string, content string, format parametersv1alpha1.CfgFileFormat) (ConfigObject, error) {
 	configObject, err := CfgObjectRegistry().GetConfigObject(name, format)
 	if err != nil {
 		return nil, err
diff --git a/pkg/unstructured/properties.go b/pkg/unstructured/properties.go
index 2f9f4bebe..5e01b30c5 100644
--- a/pkg/unstructured/properties.go
+++ b/pkg/unstructured/properties.go
@@ -25,7 +25,7 @@ import (
 	"github.com/magiconair/properties"
 	"github.com/spf13/cast"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 type propertiesConfig struct {
@@ -36,7 +36,7 @@ type propertiesConfig struct {
 const commentPrefix = "# "
 
 func init() {
-	CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.PropertiesPlus, func(name string) ConfigObject {
+	CfgObjectRegistry().RegisterConfigCreator(parametersv1alpha1.PropertiesPlus, func(name string) ConfigObject {
 		return &propertiesConfig{name: name}
 	})
 }
diff --git a/pkg/unstructured/redis_config.go b/pkg/unstructured/redis_config.go
index 9080a3712..d88310732 100644
--- a/pkg/unstructured/redis_config.go
+++ b/pkg/unstructured/redis_config.go
@@ -28,7 +28,7 @@ import (
 	"github.com/StudioSol/set"
 	"github.com/spf13/cast"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 type redisConfig struct {
@@ -39,7 +39,7 @@ type redisConfig struct {
 }
 
 func init() {
-	CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.RedisCfg, func(name string) ConfigObject {
+	CfgObjectRegistry().RegisterConfigCreator(parametersv1alpha1.RedisCfg, func(name string) ConfigObject {
 		return &redisConfig{name: name}
 	})
 }
diff --git a/pkg/unstructured/viper_wrap.go b/pkg/unstructured/viper_wrap.go
index a696ea7c7..434f42b38 100644
--- a/pkg/unstructured/viper_wrap.go
+++ b/pkg/unstructured/viper_wrap.go
@@ -29,24 +29,23 @@ import (
 	oviper "github.com/spf13/viper"
 	"gopkg.in/ini.v1"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 type viperWrap struct {
 	*oviper.Viper
 
 	name   string
-	format appsv1beta1.CfgFileFormat
+	format parametersv1alpha1.CfgFileFormat
 }
 
 func init() {
-	CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.Ini, createViper(appsv1beta1.Ini))
-	// CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.YAML, createViper(appsv1beta1.YAML))
-	CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.JSON, createViper(appsv1beta1.JSON))
-	CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.Dotenv, createViper(appsv1beta1.Dotenv))
-	CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.HCL, createViper(appsv1beta1.HCL))
-	CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.TOML, createViper(appsv1beta1.TOML))
-	CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.Properties, createViper(appsv1beta1.Properties))
+	CfgObjectRegistry().RegisterConfigCreator(parametersv1alpha1.Ini, createViper(parametersv1alpha1.Ini))
+	CfgObjectRegistry().RegisterConfigCreator(parametersv1alpha1.JSON, createViper(parametersv1alpha1.JSON))
+	CfgObjectRegistry().RegisterConfigCreator(parametersv1alpha1.Dotenv, createViper(parametersv1alpha1.Dotenv))
+	CfgObjectRegistry().RegisterConfigCreator(parametersv1alpha1.HCL, createViper(parametersv1alpha1.HCL))
+	CfgObjectRegistry().RegisterConfigCreator(parametersv1alpha1.TOML, createViper(parametersv1alpha1.TOML))
+	CfgObjectRegistry().RegisterConfigCreator(parametersv1alpha1.Properties, createViper(parametersv1alpha1.Properties))
 }
 
 func (v *viperWrap) GetString(key string) (string, error) {
@@ -95,9 +94,9 @@ func (v viperWrap) Unmarshal(str string) error {
 	return v.ReadConfig(bytes.NewReader([]byte(str)))
 }
 
-func newCfgViper(cfgType appsv1beta1.CfgFileFormat) *oviper.Viper {
+func newCfgViper(cfgType parametersv1alpha1.CfgFileFormat) *oviper.Viper {
 	defaultKeySep := DelimiterDot
-	if cfgType == appsv1beta1.Properties || cfgType == appsv1beta1.Dotenv {
+	if cfgType == parametersv1alpha1.Properties || cfgType == parametersv1alpha1.Dotenv {
 		defaultKeySep = CfgDelimiterPlaceholder
 	}
 	// TODO config constraint support LoadOptions
@@ -109,7 +108,7 @@ func newCfgViper(cfgType appsv1beta1.CfgFileFormat) *oviper.Viper {
 	return v
 }
 
-func createViper(format appsv1beta1.CfgFileFormat) ConfigObjectCreator {
+func createViper(format parametersv1alpha1.CfgFileFormat) ConfigObjectCreator {
 	return func(name string) ConfigObject {
 		return &viperWrap{
 			name:   name,
diff --git a/pkg/unstructured/xml_config.go b/pkg/unstructured/xml_config.go
index 94ddb9857..9ed76286d 100644
--- a/pkg/unstructured/xml_config.go
+++ b/pkg/unstructured/xml_config.go
@@ -26,7 +26,7 @@ import (
 	mxjv2 "github.com/clbanning/mxj/v2"
 	"github.com/spf13/cast"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 type xmlConfig struct {
@@ -42,7 +42,7 @@ func init() {
 	// enable cast to int
 	mxjv2.CastValuesToInt(true)
 
-	CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.XML, func(name string) ConfigObject {
+	CfgObjectRegistry().RegisterConfigCreator(parametersv1alpha1.XML, func(name string) ConfigObject {
 		return &xmlConfig{name: name}
 	})
 }
diff --git a/pkg/unstructured/yaml_config.go b/pkg/unstructured/yaml_config.go
index 2ee02db1f..67667a116 100644
--- a/pkg/unstructured/yaml_config.go
+++ b/pkg/unstructured/yaml_config.go
@@ -26,7 +26,7 @@ import (
 	"github.com/spf13/cast"
 	"gopkg.in/yaml.v2"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 type yamlConfig struct {
@@ -35,7 +35,7 @@ type yamlConfig struct {
 }
 
 func init() {
-	CfgObjectRegistry().RegisterConfigCreator(appsv1beta1.YAML, func(name string) ConfigObject {
+	CfgObjectRegistry().RegisterConfigCreator(parametersv1alpha1.YAML, func(name string) ConfigObject {
 		return &yamlConfig{name: name}
 	})
 }



Test patch:
diff --git a/controllers/apps/clusterdefinition_controller_test.go b/controllers/apps/clusterdefinition_controller_test.go
index e12e10cb1..9b9b19884 100644
--- a/controllers/apps/clusterdefinition_controller_test.go
+++ b/controllers/apps/clusterdefinition_controller_test.go
@@ -58,7 +58,6 @@ var _ = Describe("ClusterDefinition Controller", func() {
 		testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, intctrlutil.ClusterDefinitionSignature, true, ml)
 		testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, intctrlutil.ShardingDefinitionSignature, true, ml)
 		testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, intctrlutil.ComponentDefinitionSignature, true, ml)
-		testapps.ClearResources(&testCtx, intctrlutil.ConfigConstraintSignature, ml)
 
 		// namespaced
 		testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, intctrlutil.ConfigMapSignature, true, inNS, ml)
diff --git a/controllers/apps/component/suite_test.go b/controllers/apps/component/suite_test.go
index bb3f72316..9ae057800 100644
--- a/controllers/apps/component/suite_test.go
+++ b/controllers/apps/component/suite_test.go
@@ -46,10 +46,10 @@ import (
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloadsv1 "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	"github.com/apecloud/kubeblocks/controllers/apps"
 	"github.com/apecloud/kubeblocks/controllers/k8score"
-	"github.com/apecloud/kubeblocks/controllers/parameters"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/model"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
@@ -129,6 +129,10 @@ var _ = BeforeSuite(func() {
 	Expect(err).NotTo(HaveOccurred())
 	model.AddScheme(appsv1beta1.AddToScheme)
 
+	err = parametersv1alpha1.AddToScheme(scheme.Scheme)
+	Expect(err).NotTo(HaveOccurred())
+	model.AddScheme(parametersv1alpha1.AddToScheme)
+
 	err = appsv1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 	model.AddScheme(appsv1.AddToScheme)
@@ -195,20 +199,6 @@ var _ = BeforeSuite(func() {
 	}).SetupWithManager(k8sManager, nil)
 	Expect(err).ToNot(HaveOccurred())
 
-	err = (&parameters.ConfigConstraintReconciler{
-		Client:   k8sManager.GetClient(),
-		Scheme:   k8sManager.GetScheme(),
-		Recorder: k8sManager.GetEventRecorderFor("configuration-template-controller"),
-	}).SetupWithManager(k8sManager)
-	Expect(err).ToNot(HaveOccurred())
-
-	err = (&parameters.ConfigurationReconciler{
-		Client:   k8sManager.GetClient(),
-		Scheme:   k8sManager.GetScheme(),
-		Recorder: k8sManager.GetEventRecorderFor("configuration-controller"),
-	}).SetupWithManager(k8sManager, nil)
-	Expect(err).ToNot(HaveOccurred())
-
 	err = (&k8score.EventReconciler{
 		Client:   k8sManager.GetClient(),
 		Scheme:   k8sManager.GetScheme(),
diff --git a/controllers/apps/componentdefinition_controller_test.go b/controllers/apps/componentdefinition_controller_test.go
index 58be0a38f..ff3ceb344 100644
--- a/controllers/apps/componentdefinition_controller_test.go
+++ b/controllers/apps/componentdefinition_controller_test.go
@@ -62,7 +62,6 @@ var _ = Describe("ComponentDefinition Controller", func() {
 
 		// non-namespaced
 		testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, intctrlutil.ComponentDefinitionSignature, true, ml)
-		testapps.ClearResources(&testCtx, intctrlutil.ConfigConstraintSignature, ml)
 
 		// namespaced
 		testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, intctrlutil.ConfigMapSignature, true, inNS, ml)
diff --git a/controllers/operations/suite_test.go b/controllers/operations/suite_test.go
index 2fe33db7e..795367734 100644
--- a/controllers/operations/suite_test.go
+++ b/controllers/operations/suite_test.go
@@ -44,9 +44,9 @@ import (
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloadsv1 "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	"github.com/apecloud/kubeblocks/controllers/apps"
 	"github.com/apecloud/kubeblocks/controllers/apps/cluster"
@@ -129,10 +129,6 @@ var _ = BeforeSuite(func() {
 	Expect(err).NotTo(HaveOccurred())
 	model.AddScheme(appsv1alpha1.AddToScheme)
 
-	err = appsv1beta1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
-	model.AddScheme(appsv1beta1.AddToScheme)
-
 	err = appsv1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 	model.AddScheme(appsv1.AddToScheme)
@@ -153,6 +149,10 @@ var _ = BeforeSuite(func() {
 	Expect(err).NotTo(HaveOccurred())
 	model.AddScheme(workloadsv1.AddToScheme)
 
+	err = parametersv1alpha1.AddToScheme(scheme.Scheme)
+	Expect(err).NotTo(HaveOccurred())
+	model.AddScheme(parametersv1alpha1.AddToScheme)
+
 	// +kubebuilder:scaffold:rscheme
 
 	k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
@@ -240,17 +240,10 @@ var _ = BeforeSuite(func() {
 	}).SetupWithManager(k8sManager, nil)
 	Expect(err).ToNot(HaveOccurred())
 
-	err = (&parameters.ConfigConstraintReconciler{
-		Client:   k8sManager.GetClient(),
-		Scheme:   k8sManager.GetScheme(),
-		Recorder: k8sManager.GetEventRecorderFor("configuration-template-controller"),
-	}).SetupWithManager(k8sManager)
-	Expect(err).ToNot(HaveOccurred())
-
-	err = (&parameters.ConfigurationReconciler{
+	err = (&parameters.ComponentParameterReconciler{
 		Client:   k8sManager.GetClient(),
 		Scheme:   k8sManager.GetScheme(),
-		Recorder: k8sManager.GetEventRecorderFor("configuration-controller"),
+		Recorder: k8sManager.GetEventRecorderFor("component-parameter"),
 	}).SetupWithManager(k8sManager, nil)
 	Expect(err).ToNot(HaveOccurred())
 
diff --git a/controllers/parameters/combine_upgrade_policy_test.go b/controllers/parameters/combine_upgrade_policy_test.go
index a0cd7645b..9faf1ace5 100644
--- a/controllers/parameters/combine_upgrade_policy_test.go
+++ b/controllers/parameters/combine_upgrade_policy_test.go
@@ -25,7 +25,7 @@ import (
 	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
 )
 
@@ -50,16 +50,16 @@ var _ = Describe("Reconfigure CombineSyncPolicy", func() {
 				policyExecutors: []reconfigurePolicy{&testPolicy{}},
 			}
 
-			Expect(upgradePolicyMap[appsv1alpha1.DynamicReloadAndRestartPolicy]).ShouldNot(BeNil())
+			Expect(upgradePolicyMap[parametersv1alpha1.DynamicReloadAndRestartPolicy]).ShouldNot(BeNil())
 
-			mockParam := newMockReconfigureParams("simplePolicy", k8sMockClient.Client(),
+			mockParam := newMockReconfigureParams("restartPolicy", k8sMockClient.Client(),
 				withMockInstanceSet(2, nil),
 				withConfigSpec("for_test", map[string]string{
 					"key": "value",
 				}),
 				withClusterComponent(2))
 
-			Expect(testPolicyExecs.GetPolicyName()).Should(BeEquivalentTo(appsv1alpha1.DynamicReloadAndRestartPolicy))
+			Expect(testPolicyExecs.GetPolicyName()).Should(BeEquivalentTo(parametersv1alpha1.DynamicReloadAndRestartPolicy))
 			status, err := testPolicyExecs.Upgrade(mockParam)
 			Expect(err).Should(Succeed())
 			Expect(status.Status).Should(BeEquivalentTo(ESNone))
@@ -71,14 +71,14 @@ var _ = Describe("Reconfigure CombineSyncPolicy", func() {
 				policyExecutors: []reconfigurePolicy{&testErrorPolicy{}},
 			}
 
-			mockParam := newMockReconfigureParams("simplePolicy", k8sMockClient.Client(),
+			mockParam := newMockReconfigureParams("restartPolicy", k8sMockClient.Client(),
 				withMockInstanceSet(2, nil),
 				withConfigSpec("for_test", map[string]string{
 					"key": "value",
 				}),
 				withClusterComponent(2))
 
-			Expect(testPolicyExecs.GetPolicyName()).Should(BeEquivalentTo(appsv1alpha1.DynamicReloadAndRestartPolicy))
+			Expect(testPolicyExecs.GetPolicyName()).Should(BeEquivalentTo(parametersv1alpha1.DynamicReloadAndRestartPolicy))
 			status, err := testPolicyExecs.Upgrade(mockParam)
 			Expect(err).ShouldNot(Succeed())
 			Expect(status.Status).Should(BeEquivalentTo(ESFailedAndRetry))
@@ -92,7 +92,7 @@ type testPolicy struct {
 type testErrorPolicy struct {
 }
 
-func (t testErrorPolicy) Upgrade(params reconfigureParams) (ReturnedStatus, error) {
+func (t testErrorPolicy) Upgrade(params reconfigureContext) (ReturnedStatus, error) {
 	return makeReturnedStatus(ESFailedAndRetry), fmt.Errorf("testErrorPolicy failed")
 }
 
@@ -100,7 +100,7 @@ func (t testErrorPolicy) GetPolicyName() string {
 	return "testErrorPolicy"
 }
 
-func (t testPolicy) Upgrade(params reconfigureParams) (ReturnedStatus, error) {
+func (t testPolicy) Upgrade(params reconfigureContext) (ReturnedStatus, error) {
 	return makeReturnedStatus(ESNone), nil
 }
 
diff --git a/controllers/parameters/componentdrivenparameter_controller_test.go b/controllers/parameters/componentdrivenparameter_controller_test.go
new file mode 100644
index 000000000..65529be7a
--- /dev/null
+++ b/controllers/parameters/componentdrivenparameter_controller_test.go
@@ -0,0 +1,114 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package parameters
+
+import (
+	. "github.com/onsi/ginkgo/v2"
+	. "github.com/onsi/gomega"
+
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/resource"
+	"k8s.io/apimachinery/pkg/types"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	configcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
+	"github.com/apecloud/kubeblocks/pkg/constant"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
+	testparameters "github.com/apecloud/kubeblocks/pkg/testutil/parameters"
+)
+
+var _ = Describe("ComponentParameterGenerator Controller", func() {
+
+	BeforeEach(cleanEnv)
+
+	AfterEach(cleanEnv)
+
+	initTestResource := func() *appsv1.Component {
+		By("Create a config template obj")
+		configmap := testparameters.NewComponentTemplateFactory(configSpecName, testCtx.DefaultNamespace).
+			Create(&testCtx).
+			GetObject()
+
+		By("Create a parameters definition obj")
+		paramsDef := testparameters.NewParametersDefinitionFactory(paramsDefName).
+			SetReloadAction(testparameters.WithNoneAction()).
+			Create(&testCtx).
+			GetObject()
+		Expect(testapps.GetAndChangeObjStatus(&testCtx, client.ObjectKeyFromObject(paramsDef), func(obj *parametersv1alpha1.ParametersDefinition) {
+			obj.Status.Phase = parametersv1alpha1.PDAvailablePhase
+		})()).Should(Succeed())
+
+		By("Create a component definition obj and mock to available")
+		compDefObj := testapps.NewComponentDefinitionFactory(compDefName).
+			WithRandomName().
+			SetDefaultSpec().
+			AddConfigTemplate(configSpecName, configmap.Name, testCtx.DefaultNamespace, configVolumeName).
+			Create(&testCtx).
+			GetObject()
+		Expect(testapps.GetAndChangeObjStatus(&testCtx, client.ObjectKeyFromObject(compDefObj), func(obj *appsv1.ComponentDefinition) {
+			obj.Status.Phase = appsv1.AvailablePhase
+		})()).Should(Succeed())
+
+		pdcr := testparameters.NewParamConfigRendererFactory(pdcrName).
+			SetParametersDefs(paramsDef.Name).
+			SetComponentDefinition(compDefObj.GetName()).
+			SetTemplateName(configSpecName).
+			HScaleEnabled().
+			VScaleEnabled().
+			TLSEnabled().
+			Create(&testCtx).
+			GetObject()
+		Expect(testapps.GetAndChangeObjStatus(&testCtx, client.ObjectKeyFromObject(pdcr), func(obj *parametersv1alpha1.ParamConfigRenderer) {
+			obj.Status.Phase = parametersv1alpha1.PDAvailablePhase
+		})()).Should(Succeed())
+
+		By("Create a component obj")
+		fullCompName := constant.GenerateClusterComponentName(clusterName, defaultCompName)
+		compObj := testapps.NewComponentFactory(testCtx.DefaultNamespace, fullCompName, compDefObj.Name).
+			AddLabels(constant.AppInstanceLabelKey, clusterName).
+			SetUID(types.UID("test-uid")).
+			SetReplicas(1).
+			SetResources(corev1.ResourceRequirements{Limits: corev1.ResourceList{"memory": resource.MustParse("2Gi")}}).
+			Create(&testCtx).
+			GetObject()
+
+		return compObj
+	}
+
+	Context("Generate ComponentParameter", func() {
+		It("Should reconcile success", func() {
+			component := initTestResource()
+			parameterKey := types.NamespacedName{
+				Namespace: component.Namespace,
+				Name:      configcore.GenerateComponentConfigurationName(clusterName, defaultCompName),
+			}
+
+			Eventually(testapps.CheckObj(&testCtx, parameterKey, func(g Gomega, parameter *parametersv1alpha1.ComponentParameter) {
+				item := intctrlutil.GetConfigTemplateItem(&parameter.Spec, configSpecName)
+				g.Expect(item).ShouldNot(BeNil())
+				g.Expect(item.Payload).Should(HaveKey(constant.ReplicasPayload))
+				g.Expect(item.Payload).Should(HaveKey(constant.ComponentResourcePayload))
+			})).Should(Succeed())
+		})
+	})
+})
diff --git a/controllers/parameters/componentparameter_controller_test.go b/controllers/parameters/componentparameter_controller_test.go
new file mode 100644
index 000000000..ff89082df
--- /dev/null
+++ b/controllers/parameters/componentparameter_controller_test.go
@@ -0,0 +1,78 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package parameters
+
+import (
+	. "github.com/onsi/ginkgo/v2"
+	. "github.com/onsi/gomega"
+
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	"github.com/apecloud/kubeblocks/pkg/configuration/core"
+	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
+	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
+	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
+)
+
+var _ = Describe("ComponentParameter Controller", func() {
+
+	BeforeEach(cleanEnv)
+
+	AfterEach(cleanEnv)
+
+	Context("When updating configuration", func() {
+		It("Should reconcile success", func() {
+			mockReconcileResource()
+
+			cfgKey := client.ObjectKey{
+				Name:      core.GenerateComponentConfigurationName(clusterName, defaultCompName),
+				Namespace: testCtx.DefaultNamespace,
+			}
+
+			Eventually(testapps.CheckObj(&testCtx, cfgKey, func(g Gomega, componentParameter *parametersv1alpha1.ComponentParameter) {
+				g.Expect(componentParameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+				itemStatus := intctrlutil.GetItemStatus(&componentParameter.Status, configSpecName)
+				g.Expect(itemStatus.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+			})).Should(Succeed())
+
+			By("reconfiguring parameters.")
+			Eventually(testapps.GetAndChangeObj(&testCtx, cfgKey, func(cfg *parametersv1alpha1.ComponentParameter) {
+				item := intctrlutil.GetConfigTemplateItem(&cfg.Spec, configSpecName)
+				item.ConfigFileParams = map[string]parametersv1alpha1.ParametersInFile{
+					"my.cnf": {
+						Parameters: map[string]*string{
+							"max_connections": cfgutil.ToPointer("1000"),
+							"gtid_mode":       cfgutil.ToPointer("ON"),
+						},
+					},
+				}
+			})).Should(Succeed())
+
+			Eventually(testapps.CheckObj(&testCtx, cfgKey, func(g Gomega, cfg *parametersv1alpha1.ComponentParameter) {
+				itemStatus := intctrlutil.GetItemStatus(&cfg.Status, configSpecName)
+				g.Expect(itemStatus).ShouldNot(BeNil())
+				g.Expect(itemStatus.UpdateRevision).Should(BeEquivalentTo("2"))
+				g.Expect(itemStatus.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+			})).Should(Succeed())
+		})
+
+	})
+})
diff --git a/controllers/parameters/config_util_test.go b/controllers/parameters/config_util_test.go
deleted file mode 100644
index dbc713810..000000000
--- a/controllers/parameters/config_util_test.go
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package parameters
-
-import (
-	. "github.com/onsi/ginkgo/v2"
-	. "github.com/onsi/gomega"
-
-	corev1 "k8s.io/api/core/v1"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/log"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-	"github.com/apecloud/kubeblocks/pkg/generics"
-	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
-	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
-)
-
-var _ = Describe("ConfigWrapper util test", func() {
-	var (
-		// ctrl       *gomock.Controller
-		// mockClient *mock_client.MockClient
-		k8sMockClient *testutil.K8sClientMockHelper
-
-		reqCtx = intctrlutil.RequestCtx{
-			Ctx: ctx,
-			Log: log.FromContext(ctx).WithValues("reconfigure_for_test", testCtx.DefaultNamespace),
-		}
-	)
-
-	var (
-		configMapObj        *corev1.ConfigMap
-		configConstraintObj *appsv1beta1.ConfigConstraint
-		compDefObj          *appsv1.ComponentDefinition
-	)
-
-	cleanEnv := func() {
-		// must wait till resources deleted and no longer existed before the testcases start,
-		// otherwise if later it needs to create some new resource objects with the same name,
-		// in race conditions, it will find the existence of old objects, resulting failure to
-		// create the new objects.
-		By("clean resources")
-
-		// delete rest mocked objects
-		inNS := client.InNamespace(testCtx.DefaultNamespace)
-		ml := client.HasLabels{testCtx.TestObjLabelKey}
-		// namespaced
-		testapps.ClearResources(&testCtx, generics.ConfigMapSignature, inNS, ml)
-		// non-namespaced
-		testapps.ClearResources(&testCtx, generics.ComponentDefinitionSignature, ml)
-		testapps.ClearResources(&testCtx, generics.ConfigConstraintSignature, ml)
-	}
-
-	BeforeEach(func() {
-		cleanEnv()
-
-		// Add any setup steps that needs to be executed before each test
-		k8sMockClient = testutil.NewK8sMockClient()
-
-		By("creating a cluster")
-		configMapObj = testapps.CreateCustomizedObj(&testCtx,
-			"resources/mysql-config-template.yaml", &corev1.ConfigMap{},
-			testCtx.UseDefaultNamespace())
-
-		configConstraintObj = testapps.CreateCustomizedObj(&testCtx,
-			"resources/mysql-config-constraint.yaml",
-			&appsv1beta1.ConfigConstraint{})
-
-		By("Create a componentDefinition obj")
-		compDefObj = testapps.NewComponentDefinitionFactory(compDefName).
-			WithRandomName().
-			SetDefaultSpec().
-			AddConfigTemplate(configSpecName, configMapObj.Name, configConstraintObj.Name, testCtx.DefaultNamespace, configVolumeName).
-			Create(&testCtx).
-			GetObject()
-	})
-
-	AfterEach(func() {
-		// Add any teardown steps that needs to be executed after each test
-		cleanEnv()
-
-		k8sMockClient.Finish()
-	})
-
-	Context("ComponentDefinition CR test", func() {
-		It("Should success without error", func() {
-			availableTPL := configConstraintObj.DeepCopy()
-			availableTPL.Status.Phase = appsv1beta1.CCAvailablePhase
-
-			k8sMockClient.MockPatchMethod(testutil.WithSucceed())
-			k8sMockClient.MockListMethod(testutil.WithSucceed())
-			k8sMockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSequenceResult(
-				map[client.ObjectKey][]testutil.MockGetReturned{
-					client.ObjectKeyFromObject(configMapObj): {{
-						Object: nil,
-						Err:    cfgcore.MakeError("failed to get cc object"),
-					}, {
-						Object: configMapObj,
-						Err:    nil,
-					}},
-					client.ObjectKeyFromObject(configConstraintObj): {{
-						Object: nil,
-						Err:    cfgcore.MakeError("failed to get cc object"),
-					}, {
-						Object: configConstraintObj,
-						Err:    nil,
-					}, {
-						Object: availableTPL,
-						Err:    nil,
-					}},
-				},
-			), testutil.WithAnyTimes()))
-
-			_, err := checkConfigTemplate(k8sMockClient.Client(), reqCtx, compDefObj)
-			Expect(err).ShouldNot(Succeed())
-			Expect(err.Error()).Should(ContainSubstring("failed to get cc object"))
-
-			_, err = checkConfigTemplate(k8sMockClient.Client(), reqCtx, compDefObj)
-			Expect(err).ShouldNot(Succeed())
-			Expect(err.Error()).Should(ContainSubstring("failed to get cc object"))
-
-			_, err = checkConfigTemplate(k8sMockClient.Client(), reqCtx, compDefObj)
-			Expect(err).ShouldNot(Succeed())
-			Expect(err.Error()).Should(ContainSubstring("status not ready"))
-
-			ok, err := checkConfigTemplate(k8sMockClient.Client(), reqCtx, compDefObj)
-			Expect(err).Should(Succeed())
-			Expect(ok).Should(BeTrue())
-
-			ok, err = updateLabelsByConfigSpec(k8sMockClient.Client(), reqCtx, compDefObj)
-			Expect(err).Should(Succeed())
-			Expect(ok).Should(BeTrue())
-
-			_, err = updateLabelsByConfigSpec(k8sMockClient.Client(), reqCtx, compDefObj)
-			Expect(err).Should(Succeed())
-
-			err = DeleteConfigMapFinalizer(k8sMockClient.Client(), reqCtx, compDefObj)
-			Expect(err).Should(Succeed())
-		})
-	})
-
-	Context("ComponentDefinition CR test without config Constraints", func() {
-		It("Should success without error", func() {
-			// remove ConfigConstraintRef
-			_, err := handleConfigTemplate(compDefObj, func(templates []appsv1.ComponentConfigSpec) (bool, error) {
-				return true, nil
-			}, func(compDef *appsv1.ComponentDefinition) error {
-				if len(compDef.Spec.Configs) == 0 {
-					return nil
-				}
-				for i := range compDef.Spec.Configs {
-					tpl := &compDef.Spec.Configs[i]
-					tpl.ConfigConstraintRef = ""
-				}
-				return nil
-			})
-			Expect(err).Should(Succeed())
-
-			availableTPL := configConstraintObj.DeepCopy()
-			availableTPL.Status.Phase = appsv1beta1.CCAvailablePhase
-
-			k8sMockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSequenceResult(
-				map[client.ObjectKey][]testutil.MockGetReturned{
-					client.ObjectKeyFromObject(configMapObj): {{
-						Object: nil,
-						Err:    cfgcore.MakeError("failed to get cc object"),
-					}, {
-						Object: configMapObj,
-						Err:    nil,
-					}}},
-			), testutil.WithAnyTimes()))
-
-			_, err = checkConfigTemplate(k8sMockClient.Client(), reqCtx, compDefObj)
-			Expect(err).ShouldNot(Succeed())
-			Expect(err.Error()).Should(ContainSubstring("failed to get cc object"))
-
-			ok, err := checkConfigTemplate(k8sMockClient.Client(), reqCtx, compDefObj)
-			Expect(err).Should(Succeed())
-			Expect(ok).Should(BeTrue())
-		})
-	})
-})
diff --git a/controllers/parameters/configconstraint_controller_test.go b/controllers/parameters/configconstraint_controller_test.go
deleted file mode 100644
index 88486b008..000000000
--- a/controllers/parameters/configconstraint_controller_test.go
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package parameters
-
-import (
-	"time"
-
-	. "github.com/onsi/ginkgo/v2"
-	. "github.com/onsi/gomega"
-
-	corev1 "k8s.io/api/core/v1"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/log"
-
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/constant"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/generics"
-	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
-)
-
-var _ = Describe("ConfigConstraint Controller", func() {
-	cleanEnv := func() {
-		// must wait till resources deleted and no longer existed before the testcases start,
-		// otherwise if later it needs to create some new resource objects with the same name,
-		// in race conditions, it will find the existence of old objects, resulting failure to
-		// create the new objects.
-		By("clean resources")
-
-		// delete cluster(and all dependent sub-resources), cluster definition
-		testapps.ClearClusterResources(&testCtx)
-
-		// delete rest mocked objects
-		inNS := client.InNamespace(testCtx.DefaultNamespace)
-		ml := client.HasLabels{testCtx.TestObjLabelKey}
-		// non-namespaced
-		testapps.ClearResources(&testCtx, intctrlutil.ConfigConstraintSignature, ml)
-		// namespaced
-		testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, intctrlutil.ConfigMapSignature, true, inNS, ml)
-	}
-
-	BeforeEach(cleanEnv)
-
-	AfterEach(cleanEnv)
-
-	Context("Create config constraint with cue validate", func() {
-		It("Should ready", func() {
-			By("creating a configmap and a config constraint")
-			configmap := testapps.CreateCustomizedObj(&testCtx,
-				"resources/mysql-config-template.yaml", &corev1.ConfigMap{},
-				testCtx.UseDefaultNamespace())
-			constraint := testapps.CreateCustomizedObj(&testCtx,
-				"resources/mysql-config-constraint.yaml",
-				&appsv1beta1.ConfigConstraint{})
-			constraintKey := client.ObjectKeyFromObject(constraint)
-
-			By("Create a componentDefinition obj")
-			compDefObj := testapps.NewComponentDefinitionFactory(compDefName).
-				WithRandomName().
-				SetDefaultSpec().
-				AddConfigTemplate(configSpecName, configmap.Name, constraint.Name, testCtx.DefaultNamespace, configVolumeName).
-				AddLabels(cfgcore.GenerateTPLUniqLabelKeyWithConfig(configSpecName), configmap.Name,
-					cfgcore.GenerateConstraintsUniqLabelKeyWithConfig(constraint.Name), constraint.Name).
-				Create(&testCtx).
-				GetObject()
-
-			By("check ConfigConstraint(template) status and finalizer")
-			Eventually(testapps.CheckObj(&testCtx, constraintKey,
-				func(g Gomega, tpl *appsv1beta1.ConfigConstraint) {
-					g.Expect(tpl.Status.Phase).To(BeEquivalentTo(appsv1alpha1.AvailablePhase))
-					g.Expect(tpl.Finalizers).To(ContainElement(constant.ConfigFinalizerName))
-				})).Should(Succeed())
-
-			By("By delete ConfigConstraint")
-			Expect(k8sClient.Delete(testCtx.Ctx, constraint)).Should(Succeed())
-
-			By("check ConfigConstraint should not be deleted")
-			log.Log.Info("expect that ConfigConstraint is not deleted.")
-			Consistently(testapps.CheckObjExists(&testCtx, constraintKey, &appsv1beta1.ConfigConstraint{}, true)).Should(Succeed())
-
-			By("check ConfigConstraint status should be deleting")
-			Eventually(testapps.CheckObj(&testCtx, constraintKey,
-				func(g Gomega, tpl *appsv1beta1.ConfigConstraint) {
-					g.Expect(tpl.Status.Phase).To(BeEquivalentTo(appsv1beta1.CCDeletingPhase))
-				})).Should(Succeed())
-
-			By("By delete referencing componentdefinition")
-			Expect(k8sClient.Delete(testCtx.Ctx, compDefObj)).Should(Succeed())
-
-			By("check ConfigConstraint should be deleted")
-			Eventually(testapps.CheckObjExists(&testCtx, constraintKey, &appsv1beta1.ConfigConstraint{}, false), time.Second*60, time.Second*1).Should(Succeed())
-		})
-	})
-
-	Context("Create config constraint without cue validate", func() {
-		It("Should ready", func() {
-			By("creating a configmap and a config constraint")
-
-			_ = testapps.CreateCustomizedObj(&testCtx, "resources/mysql-config-template.yaml", &corev1.ConfigMap{},
-				testCtx.UseDefaultNamespace())
-
-			constraint := testapps.CreateCustomizedObj(&testCtx, "resources/mysql-config-constraint-not-validate.yaml",
-				&appsv1beta1.ConfigConstraint{})
-
-			By("check config constraint status")
-			Eventually(testapps.CheckObj(&testCtx, client.ObjectKeyFromObject(constraint),
-				func(g Gomega, tpl *appsv1beta1.ConfigConstraint) {
-					g.Expect(tpl.Status.Phase).Should(BeEquivalentTo(appsv1alpha1.AvailablePhase))
-				})).Should(Succeed())
-		})
-	})
-})
diff --git a/controllers/parameters/configuration_controller_test.go b/controllers/parameters/configuration_controller_test.go
deleted file mode 100644
index 0832ba98a..000000000
--- a/controllers/parameters/configuration_controller_test.go
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package parameters
-
-import (
-	"time"
-
-	. "github.com/onsi/ginkgo/v2"
-	. "github.com/onsi/gomega"
-	corev1 "k8s.io/api/core/v1"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
-	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
-)
-
-var _ = Describe("Configuration Controller", func() {
-
-	BeforeEach(cleanEnv)
-
-	AfterEach(cleanEnv)
-
-	Context("When updating configuration", func() {
-		It("Should reconcile success", func() {
-			_, _, clusterObj, componentObj, synthesizedComp := mockReconcileResource()
-
-			cfgKey := client.ObjectKey{
-				Name:      core.GenerateComponentConfigurationName(clusterName, defaultCompName),
-				Namespace: testCtx.DefaultNamespace,
-			}
-			checkCfgStatus := func(phase appsv1alpha1.ConfigurationPhase) func() bool {
-				return func() bool {
-					cfg := &appsv1alpha1.Configuration{}
-					Expect(k8sClient.Get(ctx, cfgKey, cfg)).Should(Succeed())
-					itemStatus := cfg.Status.GetItemStatus(configSpecName)
-					return itemStatus != nil && itemStatus.Phase == phase
-				}
-			}
-
-			By("wait for configuration status to be init phase.")
-			Eventually(checkCfgStatus(appsv1alpha1.CInitPhase)).Should(BeFalse())
-			Expect(initConfiguration(&render.ResourceCtx{
-				Client:        k8sClient,
-				Context:       ctx,
-				Namespace:     testCtx.DefaultNamespace,
-				ClusterName:   clusterName,
-				ComponentName: defaultCompName,
-			}, synthesizedComp, clusterObj, componentObj)).Should(Succeed())
-
-			Eventually(checkCfgStatus(appsv1alpha1.CFinishedPhase)).Should(BeTrue())
-
-			By("reconfiguring parameters.")
-			Eventually(testapps.GetAndChangeObj(&testCtx, cfgKey, func(cfg *appsv1alpha1.Configuration) {
-				cfg.Spec.GetConfigurationItem(configSpecName).ConfigFileParams = map[string]appsv1alpha1.ConfigParams{
-					"my.cnf": {
-						Parameters: map[string]*string{
-							"max_connections": cfgutil.ToPointer("1000"),
-							"gtid_mode":       cfgutil.ToPointer("ON"),
-						},
-					},
-				}
-			})).Should(Succeed())
-
-			Eventually(func(g Gomega) {
-				cfg := &appsv1alpha1.Configuration{}
-				g.Expect(k8sClient.Get(ctx, cfgKey, cfg)).Should(Succeed())
-				itemStatus := cfg.Status.GetItemStatus(configSpecName)
-				g.Expect(itemStatus).ShouldNot(BeNil())
-				g.Expect(itemStatus.UpdateRevision).Should(BeEquivalentTo("2"))
-				g.Expect(itemStatus.Phase).Should(BeEquivalentTo(appsv1alpha1.CFinishedPhase))
-			}, time.Second*60, time.Second*1).Should(Succeed())
-		})
-
-		It("Invalid component test", func() {
-			_, _, clusterObj, componentObj, synthesizedComp := mockReconcileResource()
-
-			cfgKey := client.ObjectKey{
-				Name:      core.GenerateComponentConfigurationName(clusterName, "invalid-component"),
-				Namespace: testCtx.DefaultNamespace,
-			}
-
-			Expect(initConfiguration(&render.ResourceCtx{
-				Client:        k8sClient,
-				Context:       ctx,
-				Namespace:     testCtx.DefaultNamespace,
-				ClusterName:   clusterName,
-				ComponentName: "invalid-component",
-			}, synthesizedComp, clusterObj, componentObj)).Should(Succeed())
-
-			Eventually(func(g Gomega) {
-				cfg := &appsv1alpha1.Configuration{}
-				g.Expect(k8sClient.Get(ctx, cfgKey, cfg)).Should(Succeed())
-				g.Expect(cfg.Status.Message).Should(ContainSubstring("not found cluster component"))
-			}, time.Second*60, time.Second*1).Should(Succeed())
-		})
-	})
-
-	Context("When updating configuration with injectEnvTo", func() {
-		It("Should reconcile success", func() {
-			_, _, clusterObj, componentObj, synthesizedComp := mockReconcileResource()
-			synthesizedComp.ConfigTemplates[0].AsSecret = cfgutil.ToPointer(true)
-			synthesizedComp.ConfigTemplates[0].InjectEnvTo = []string{"mock-container"}
-
-			cfgKey := client.ObjectKey{
-				Name:      core.GenerateComponentConfigurationName(clusterName, defaultCompName),
-				Namespace: testCtx.DefaultNamespace,
-			}
-			renderedKey := client.ObjectKey{
-				Name:      core.GetComponentCfgName(synthesizedComp.ClusterName, synthesizedComp.Name, synthesizedComp.ConfigTemplates[0].Name),
-				Namespace: testCtx.DefaultNamespace,
-			}
-			checkCfgStatus := func(phase appsv1alpha1.ConfigurationPhase) func() bool {
-				return func() bool {
-					cfg := &appsv1alpha1.Configuration{}
-					Expect(k8sClient.Get(ctx, cfgKey, cfg)).Should(Succeed())
-					itemStatus := cfg.Status.GetItemStatus(configSpecName)
-					return itemStatus != nil && itemStatus.Phase == phase
-				}
-			}
-
-			By("wait for configuration status to be init phase.")
-			Eventually(checkCfgStatus(appsv1alpha1.CInitPhase)).Should(BeFalse())
-			Expect(initConfiguration(&render.ResourceCtx{
-				Client:        k8sClient,
-				Context:       ctx,
-				Namespace:     testCtx.DefaultNamespace,
-				ClusterName:   clusterName,
-				ComponentName: defaultCompName,
-			}, synthesizedComp, clusterObj, componentObj)).Should(Succeed())
-
-			Eventually(checkCfgStatus(appsv1alpha1.CFinishedPhase)).Should(BeTrue())
-
-			Eventually(testapps.CheckObjExists(&testCtx, renderedKey, &corev1.ConfigMap{}, false)).Should(Succeed())
-			Eventually(testapps.CheckObjExists(&testCtx, client.ObjectKey{
-				Name:      core.GenerateEnvFromName(renderedKey.Name),
-				Namespace: renderedKey.Namespace,
-			}, &corev1.Secret{}, true)).Should(Succeed())
-
-			By("reconfiguring parameters.")
-			Eventually(testapps.GetAndChangeObj(&testCtx, cfgKey, func(cfg *appsv1alpha1.Configuration) {
-				cfg.Spec.GetConfigurationItem(configSpecName).ConfigFileParams = map[string]appsv1alpha1.ConfigParams{
-					"my.cnf": {
-						Parameters: map[string]*string{
-							"max_connections": cfgutil.ToPointer("1000"),
-							"gtid_mode":       cfgutil.ToPointer("ON"),
-						},
-					},
-				}
-			})).Should(Succeed())
-
-			Eventually(func(g Gomega) {
-				cfg := &appsv1alpha1.Configuration{}
-				g.Expect(k8sClient.Get(ctx, cfgKey, cfg)).Should(Succeed())
-				itemStatus := cfg.Status.GetItemStatus(configSpecName)
-				g.Expect(itemStatus).ShouldNot(BeNil())
-				g.Expect(itemStatus.UpdateRevision).Should(BeEquivalentTo("2"))
-				g.Expect(itemStatus.Phase).Should(BeEquivalentTo(appsv1alpha1.CFinishedPhase))
-			}, time.Second*60, time.Second*1).Should(Succeed())
-
-			Eventually(testapps.CheckObjExists(&testCtx, renderedKey, &corev1.ConfigMap{}, false)).Should(Succeed())
-			Eventually(testapps.CheckObjExists(&testCtx, client.ObjectKey{
-				Name:      core.GenerateEnvFromName(renderedKey.Name),
-				Namespace: renderedKey.Namespace,
-			}, &corev1.Secret{}, true)).Should(Succeed())
-		})
-
-	})
-})
diff --git a/controllers/parameters/configuration_test.go b/controllers/parameters/configuration_test.go
index 8aad8822e..2e20afb6b 100644
--- a/controllers/parameters/configuration_test.go
+++ b/controllers/parameters/configuration_test.go
@@ -30,16 +30,15 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/builder"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	configctrl "github.com/apecloud/kubeblocks/pkg/controller/configuration"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
 	"github.com/apecloud/kubeblocks/pkg/generics"
 	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
+	testparameters "github.com/apecloud/kubeblocks/pkg/testutil/parameters"
+	"github.com/apecloud/kubeblocks/test/testdata"
 )
 
 const (
@@ -52,14 +51,18 @@ const (
 	cmName           = "mysql-tree-node-template-8.0"
 	paramsDefName    = "mysql-params-def"
 	pdcrName         = "config-test-pdcr"
+	envTestFileKey   = "env_test"
 )
 
-func mockConfigResource() (*corev1.ConfigMap, *appsv1beta1.ConfigConstraint) {
+func mockSchemaData() string {
+	cue, _ := testdata.GetTestDataFileContent("cue_testdata/wesql.cue")
+	return string(cue)
+}
+
+func mockConfigResource() (*corev1.ConfigMap, *parametersv1alpha1.ParametersDefinition) {
 	By("Create a config template obj")
-	configmap := testapps.CreateCustomizedObj(&testCtx,
-		"resources/mysql-config-template.yaml", &corev1.ConfigMap{},
-		testCtx.UseDefaultNamespace(),
-		testapps.WithLabels(
+	configmap := testparameters.NewComponentTemplateFactory(configSpecName, testCtx.DefaultNamespace).
+		AddLabels(
 			constant.AppNameLabelKey, clusterName,
 			constant.AppInstanceLabelKey, clusterName,
 			constant.KBAppComponentLabelKey, defaultCompName,
@@ -67,58 +70,52 @@ func mockConfigResource() (*corev1.ConfigMap, *appsv1beta1.ConfigConstraint) {
 			constant.CMConfigurationConstraintsNameLabelKey, cmName,
 			constant.CMConfigurationSpecProviderLabelKey, configSpecName,
 			constant.CMConfigurationTypeLabelKey, constant.ConfigInstanceType,
-		),
-		testapps.WithAnnotations(
+		).
+		AddAnnotations(
 			constant.KBParameterUpdateSourceAnnotationKey, constant.ReconfigureManagerSource,
 			constant.ConfigurationRevision, "1",
-			constant.CMInsEnableRerenderTemplateKey, "true"))
-
-	By("Create a config constraint obj")
-	constraint := testapps.CreateCustomizedObj(&testCtx,
-		"resources/mysql-config-constraint.yaml",
-		&appsv1beta1.ConfigConstraint{})
-
-	By("check config constraint")
-	Eventually(testapps.CheckObj(&testCtx, client.ObjectKeyFromObject(constraint), func(g Gomega, tpl *appsv1beta1.ConfigConstraint) {
-		g.Expect(tpl.Status.Phase).Should(BeEquivalentTo(appsv1alpha1.AvailablePhase))
-	})).Should(Succeed())
+			constant.CMInsEnableRerenderTemplateKey, "true").
+		AddConfigFile(envTestFileKey, "abcde=1234").
+		Create(&testCtx).
+		GetObject()
 
-	By("Create a configuration obj")
-	// test-cluster-mysql-mysql-config-tpl
-	configuration := builder.NewConfigurationBuilder(testCtx.DefaultNamespace, core.GenerateComponentConfigurationName(clusterName, defaultCompName)).
-		ClusterRef(clusterName).
-		Component(defaultCompName).
-		AddConfigurationItem(appsv1.ComponentConfigSpec{
-			ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-				Name:        configSpecName,
-				TemplateRef: configmap.Name,
-				Namespace:   configmap.Namespace,
-				VolumeName:  configVolumeName,
-			},
-			ConfigConstraintRef: constraint.Name,
-		}).
+	By("Create a parameters definition obj")
+	paramsdef := testparameters.NewParametersDefinitionFactory(paramsDefName).
+		SetReloadAction(testparameters.WithNoneAction()).
+		Schema(mockSchemaData()).
+		Create(&testCtx).
 		GetObject()
-	Expect(testCtx.CreateObj(testCtx.Ctx, configuration)).Should(Succeed())
 
-	return configmap, constraint
+	Eventually(testapps.CheckObj(&testCtx, client.ObjectKeyFromObject(paramsdef), func(g Gomega, def *parametersv1alpha1.ParametersDefinition) {
+		g.Expect(def.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.PDAvailablePhase))
+	})).Should(Succeed())
+	return configmap, paramsdef
 }
 
-func mockReconcileResource() (*corev1.ConfigMap, *appsv1beta1.ConfigConstraint, *appsv1.Cluster, *appsv1.Component, *component.SynthesizedComponent) {
-	configmap, constraint := mockConfigResource()
+func mockReconcileResource() (*corev1.ConfigMap, *parametersv1alpha1.ParametersDefinition, *appsv1.Cluster, *appsv1.Component, *component.SynthesizedComponent) {
+	configmap, paramsDef := mockConfigResource()
 
 	By("Create a component definition obj and mock to available")
 	compDefObj := testapps.NewComponentDefinitionFactory(compDefName).
 		WithRandomName().
 		SetDefaultSpec().
-		AddConfigTemplate(configSpecName, configmap.Name, constraint.Name, testCtx.DefaultNamespace, configVolumeName).
-		AddLabels(core.GenerateTPLUniqLabelKeyWithConfig(configSpecName), configmap.Name,
-			core.GenerateConstraintsUniqLabelKeyWithConfig(constraint.Name), constraint.Name).
+		AddConfigTemplate(configSpecName, configmap.Name, testCtx.DefaultNamespace, configVolumeName).
 		Create(&testCtx).
 		GetObject()
 	Expect(testapps.GetAndChangeObjStatus(&testCtx, client.ObjectKeyFromObject(compDefObj), func(obj *appsv1.ComponentDefinition) {
 		obj.Status.Phase = appsv1.AvailablePhase
 	})()).Should(Succeed())
 
+	pdcr := testparameters.NewParamConfigRendererFactory(pdcrName).
+		SetParametersDefs(paramsDef.GetName()).
+		SetComponentDefinition(compDefObj.GetName()).
+		SetTemplateName(configSpecName).
+		Create(&testCtx).
+		GetObject()
+	Expect(testapps.GetAndChangeObjStatus(&testCtx, client.ObjectKeyFromObject(pdcr), func(obj *parametersv1alpha1.ParamConfigRenderer) {
+		obj.Status.Phase = parametersv1alpha1.PDAvailablePhase
+	})()).Should(Succeed())
+
 	By("Creating a cluster")
 	clusterObj := testapps.NewClusterFactory(testCtx.DefaultNamespace, clusterName, "").
 		AddComponent(defaultCompName, compDefObj.GetName()).
@@ -132,7 +129,8 @@ func mockReconcileResource() (*corev1.ConfigMap, *appsv1beta1.ConfigConstraint,
 		AddLabels(constant.AppInstanceLabelKey, clusterName).
 		SetUID(types.UID(fmt.Sprintf("%s-%s", clusterObj.Name, "test-uid"))).
 		SetReplicas(1).
-		Create(&testCtx).GetObject()
+		Create(&testCtx).
+		GetObject()
 
 	container := *builder.NewContainerBuilder("mock-container").
 		AddVolumeMounts(corev1.VolumeMount{
@@ -151,27 +149,7 @@ func mockReconcileResource() (*corev1.ConfigMap, *appsv1beta1.ConfigConstraint,
 	synthesizedComp, err := component.BuildSynthesizedComponent(testCtx.Ctx, testCtx.Cli, compDefObj, compObj)
 	Expect(err).ShouldNot(HaveOccurred())
 
-	return configmap, constraint, clusterObj, compObj, synthesizedComp
-}
-
-func initConfiguration(resourceCtx *render.ResourceCtx,
-	synthesizedComponent *component.SynthesizedComponent,
-	clusterObj *appsv1.Cluster,
-	componentObj *appsv1.Component) error {
-	return configctrl.NewCreatePipeline(render.ReconcileCtx{
-		ResourceCtx:          resourceCtx,
-		Component:            componentObj,
-		SynthesizedComponent: synthesizedComponent,
-		Cluster:              clusterObj,
-		PodSpec:              synthesizedComponent.PodSpec,
-	}).
-		Prepare().
-		UpdateConfiguration(). // reconcile Configuration
-		Configuration().       // sync Configuration
-		CreateConfigTemplate().
-		UpdateConfigRelatedObject().
-		UpdateConfigurationStatus().
-		Complete()
+	return configmap, paramsDef, clusterObj, compObj, synthesizedComp
 }
 
 func cleanEnv() {
@@ -188,7 +166,6 @@ func cleanEnv() {
 	inNS := client.InNamespace(testCtx.DefaultNamespace)
 	ml := client.HasLabels{testCtx.TestObjLabelKey}
 	// non-namespaced
-	testapps.ClearResources(&testCtx, generics.ConfigConstraintSignature, ml)
 	testapps.ClearResources(&testCtx, generics.ParametersDefinitionSignature, ml)
 	testapps.ClearResources(&testCtx, generics.ParamConfigRendererSignature, ml)
 	// namespaced
@@ -196,7 +173,6 @@ func cleanEnv() {
 	testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, generics.ConfigMapSignature, true, inNS)
 	testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, generics.SecretSignature, true, inNS)
 	testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, generics.InstanceSetSignature, true, inNS, ml)
-	testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, generics.ConfigurationSignature, false, inNS, ml)
 	testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, generics.ComponentParameterSignature, true, inNS)
 	testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, generics.ParameterSignature, true, inNS, ml)
 }
diff --git a/controllers/parameters/parallel_upgrade_policy_test.go b/controllers/parameters/parallel_upgrade_policy_test.go
index 8004a396b..503060f67 100644
--- a/controllers/parameters/parallel_upgrade_policy_test.go
+++ b/controllers/parameters/parallel_upgrade_policy_test.go
@@ -27,22 +27,22 @@ import (
 
 	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgproto "github.com/apecloud/kubeblocks/pkg/configuration/proto"
-	mock_proto "github.com/apecloud/kubeblocks/pkg/configuration/proto/mocks"
+	mockproto "github.com/apecloud/kubeblocks/pkg/configuration/proto/mocks"
 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
 )
 
-var parallelPolicy = parallelUpgradePolicy{}
+var parallelPolicy = restartContainerUpgradePolicy{}
 
 var _ = Describe("Reconfigure ParallelPolicy", func() {
 
 	var (
 		k8sMockClient     *testutil.K8sClientMockHelper
-		reconfigureClient *mock_proto.MockReconfigureClient
+		reconfigureClient *mockproto.MockReconfigureClient
 	)
 
 	BeforeEach(func() {
 		k8sMockClient = testutil.NewK8sMockClient()
-		reconfigureClient = mock_proto.NewMockReconfigureClient(k8sMockClient.Controller())
+		reconfigureClient = mockproto.NewMockReconfigureClient(k8sMockClient.Controller())
 	})
 
 	AfterEach(func() {
@@ -51,7 +51,7 @@ var _ = Describe("Reconfigure ParallelPolicy", func() {
 
 	Context("parallel reconfigure policy test", func() {
 		It("Should success without error", func() {
-			Expect(parallelPolicy.GetPolicyName()).Should(BeEquivalentTo("parallel"))
+			Expect(parallelPolicy.GetPolicyName()).Should(BeEquivalentTo("restartContainer"))
 
 			// mock client update caller
 			k8sMockClient.MockPatchMethod(testutil.WithSucceed(testutil.WithTimes(3)))
diff --git a/controllers/parameters/paramconfigrenderer_controller_test.go b/controllers/parameters/paramconfigrenderer_controller_test.go
index 1a355f8ba..c632cb761 100644
--- a/controllers/parameters/paramconfigrenderer_controller_test.go
+++ b/controllers/parameters/paramconfigrenderer_controller_test.go
@@ -55,7 +55,7 @@ var _ = Describe("ParamConfigRenderer Controller", func() {
 		By("Create a component definition obj and mock to available")
 		compDefObj := testapps.NewComponentDefinitionFactory(compDefName).
 			SetDefaultSpec().
-			AddConfigTemplate(configSpecName, configmap.Name, "", testCtx.DefaultNamespace, configVolumeName).
+			AddConfigTemplate(configSpecName, configmap.Name, testCtx.DefaultNamespace, configVolumeName).
 			Create(&testCtx).
 			GetObject()
 		Expect(testapps.GetAndChangeObjStatus(&testCtx, client.ObjectKeyFromObject(compDefObj), func(obj *appsv1.ComponentDefinition) {
diff --git a/controllers/parameters/parameter_controller_test.go b/controllers/parameters/parameter_controller_test.go
new file mode 100644
index 000000000..75ee46860
--- /dev/null
+++ b/controllers/parameters/parameter_controller_test.go
@@ -0,0 +1,146 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package parameters
+
+import (
+	"time"
+
+	. "github.com/onsi/ginkgo/v2"
+	. "github.com/onsi/gomega"
+
+	"k8s.io/apimachinery/pkg/types"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	configcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
+	"github.com/apecloud/kubeblocks/pkg/controller/component"
+	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
+	testparameters "github.com/apecloud/kubeblocks/pkg/testutil/parameters"
+)
+
+var _ = Describe("Parameter Controller", func() {
+
+	var compParamKey types.NamespacedName
+	var comp *component.SynthesizedComponent
+
+	BeforeEach(cleanEnv)
+
+	AfterEach(cleanEnv)
+
+	prepareTestEnv := func() {
+		_, _, _, _, comp = mockReconcileResource()
+		compParamKey = types.NamespacedName{
+			Namespace: testCtx.DefaultNamespace,
+			Name:      configcore.GenerateComponentConfigurationName(comp.ClusterName, comp.Name),
+		}
+
+		Eventually(testapps.CheckObj(&testCtx, compParamKey, func(g Gomega, compParameter *parametersv1alpha1.ComponentParameter) {
+			g.Expect(compParameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+			g.Expect(compParameter.Status.ObservedGeneration).Should(BeEquivalentTo(int64(1)))
+		})).Should(Succeed())
+	}
+
+	Context("parameter update", func() {
+		It("Should reconcile success", func() {
+			prepareTestEnv()
+
+			By("submit the parameter update request")
+			key := testapps.GetRandomizedKey(comp.Namespace, comp.FullCompName)
+			parameterObj := testparameters.NewParameterFactory(key.Name, key.Namespace, comp.ClusterName, comp.Name).
+				AddParameters("innodb-buffer-pool-size", "1024M").
+				AddParameters("max_connections", "100").
+				Create(&testCtx).
+				GetObject()
+
+			By("check component parameter status")
+			Eventually(testapps.CheckObj(&testCtx, compParamKey, func(g Gomega, compParameter *parametersv1alpha1.ComponentParameter) {
+				g.Expect(compParameter.Status.ObservedGeneration).Should(BeEquivalentTo(int64(2)))
+				g.Expect(compParameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+			}), time.Second*10).Should(Succeed())
+
+			By("check parameter status")
+			Eventually(testapps.CheckObj(&testCtx, client.ObjectKeyFromObject(parameterObj), func(g Gomega, parameter *parametersv1alpha1.Parameter) {
+				g.Expect(parameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+			})).Should(Succeed())
+		})
+
+		It("parameters validate fails", func() {
+			prepareTestEnv()
+
+			By("submit the parameter update request with invalid max_connection")
+			key := testapps.GetRandomizedKey(comp.Namespace, comp.FullCompName)
+			parameterObj := testparameters.NewParameterFactory(key.Name, key.Namespace, comp.ClusterName, comp.Name).
+				AddParameters("max_connections", "-100").
+				Create(&testCtx).
+				GetObject()
+
+			By("check parameter status")
+			Eventually(testapps.CheckObj(&testCtx, client.ObjectKeyFromObject(parameterObj), func(g Gomega, parameter *parametersv1alpha1.Parameter) {
+				g.Expect(parameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CMergeFailedPhase))
+			})).Should(Succeed())
+		})
+	})
+
+	Context("custom template update", func() {
+		It("update user template", func() {
+			prepareTestEnv()
+
+			By("create custom template object")
+			configmap := testparameters.NewComponentTemplateFactory(configSpecName, testCtx.DefaultNamespace).
+				WithRandomName().
+				Create(&testCtx).
+				GetObject()
+
+			By("submit the custom template request")
+			key := testapps.GetRandomizedKey(comp.Namespace, comp.FullCompName)
+			parameterObj := testparameters.NewParameterFactory(key.Name, key.Namespace, comp.ClusterName, comp.Name).
+				AddCustomTemplate(configSpecName, configmap.Name, configmap.Namespace).
+				Create(&testCtx).
+				GetObject()
+
+			By("check component parameter status")
+			Eventually(testapps.CheckObj(&testCtx, compParamKey, func(g Gomega, compParameter *parametersv1alpha1.ComponentParameter) {
+				g.Expect(compParameter.Status.ObservedGeneration).Should(BeEquivalentTo(int64(2)))
+				g.Expect(compParameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+			}), time.Second*10).Should(Succeed())
+
+			By("check parameter status")
+			Eventually(testapps.CheckObj(&testCtx, client.ObjectKeyFromObject(parameterObj), func(g Gomega, parameter *parametersv1alpha1.Parameter) {
+				g.Expect(parameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CFinishedPhase))
+			})).Should(Succeed())
+		})
+
+		It("custom template failed", func() {
+			prepareTestEnv()
+
+			By("submit the custom template request")
+			key := testapps.GetRandomizedKey(comp.Namespace, comp.FullCompName)
+			parameterObj := testparameters.NewParameterFactory(key.Name, key.Namespace, comp.ClusterName, comp.Name).
+				AddCustomTemplate(configSpecName, "not-exist-tpl", testCtx.DefaultNamespace).
+				Create(&testCtx).
+				GetObject()
+
+			By("check parameter status")
+			Eventually(testapps.CheckObj(&testCtx, client.ObjectKeyFromObject(parameterObj), func(g Gomega, parameter *parametersv1alpha1.Parameter) {
+				g.Expect(parameter.Status.Phase).Should(BeEquivalentTo(parametersv1alpha1.CMergeFailedPhase))
+			})).Should(Succeed())
+		})
+	})
+})
diff --git a/controllers/parameters/policy_util_test.go b/controllers/parameters/policy_util_test.go
index cc1dd7742..bf7f1148b 100644
--- a/controllers/parameters/policy_util_test.go
+++ b/controllers/parameters/policy_util_test.go
@@ -21,6 +21,7 @@ package parameters
 
 import (
 	"fmt"
+	"time"
 
 	"github.com/sethvargo/go-password/password"
 	corev1 "k8s.io/api/core/v1"
@@ -33,9 +34,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 )
@@ -81,10 +81,10 @@ func newMockInstanceSet(replicas int, name string, labels map[string]string) wor
 	}
 }
 
-type ParamsOps func(params *reconfigureParams)
+type ParamsOps func(params *reconfigureContext)
 
 func withMockInstanceSet(replicas int, labels map[string]string) ParamsOps {
-	return func(params *reconfigureParams) {
+	return func(params *reconfigureContext) {
 		rand, _ := password.Generate(12, 8, 0, true, false)
 		itsName := "test_" + rand
 		params.InstanceSetUnits = []workloads.InstanceSet{
@@ -94,7 +94,7 @@ func withMockInstanceSet(replicas int, labels map[string]string) ParamsOps {
 }
 
 func withClusterComponent(replicas int) ParamsOps {
-	return func(params *reconfigureParams) {
+	return func(params *reconfigureContext) {
 		params.ClusterComponent = &appsv1.ClusterComponentSpec{
 			Name:     "test",
 			Replicas: func() int32 { rep := int32(replicas); return rep }(),
@@ -103,59 +103,39 @@ func withClusterComponent(replicas int) ParamsOps {
 }
 
 func withGRPCClient(clientFactory createReconfigureClient) ParamsOps {
-	return func(params *reconfigureParams) {
+	return func(params *reconfigureContext) {
 		params.ReconfigureClientFactory = clientFactory
 	}
 }
 
 func withConfigSpec(configSpecName string, data map[string]string) ParamsOps {
-	return func(params *reconfigureParams) {
+	return func(params *reconfigureContext) {
 		params.ConfigMap = &corev1.ConfigMap{
 			Data: data,
 		}
-		params.ConfigSpecName = configSpecName
+		params.ConfigTemplate.Name = configSpecName
 	}
 }
 
-func withConfigConstraintSpec(formatter *appsv1beta1.FileFormatConfig) ParamsOps {
-	return func(params *reconfigureParams) {
-		params.ConfigConstraint = &appsv1beta1.ConfigConstraintSpec{
+func withConfigDescription(formatter *parametersv1alpha1.FileFormatConfig) ParamsOps {
+	return func(params *reconfigureContext) {
+		params.ConfigDescription = &parametersv1alpha1.ComponentConfigDescription{
+			Name:             "for-test",
 			FileFormatConfig: formatter,
 		}
 	}
 }
 
-func withConfigPatch(patch map[string]string) ParamsOps {
-	mockEmptyData := func(m map[string]string) map[string]string {
-		r := make(map[string]string, len(patch))
-		for key := range m {
-			r[key] = ""
-		}
-		return r
-	}
-	transKeyPair := func(pts map[string]string) map[string]interface{} {
-		m := make(map[string]interface{}, len(pts))
-		for key, value := range pts {
-			m[key] = value
-		}
-		return m
-	}
-	return func(params *reconfigureParams) {
-		cc := params.ConfigConstraint
-		newConfigData, _ := intctrlutil.MergeAndValidateConfigs(*cc, map[string]string{"for_test": ""}, nil, []core.ParamPairs{{
-			Key:           "for_test",
-			UpdatedParams: transKeyPair(patch),
-		}})
-		configPatch, _, _ := core.CreateConfigPatch(mockEmptyData(newConfigData), newConfigData, cc.FileFormatConfig.Format, nil, false)
-		params.ConfigPatch = configPatch
+func withUpdatedParameters(patch map[string]string) ParamsOps {
+	return func(params *reconfigureContext) {
+		params.UpdatedParameters = patch
 	}
 }
 
-func newMockReconfigureParams(testName string, cli client.Client, paramOps ...ParamsOps) reconfigureParams {
-	params := reconfigureParams{
-		Restart: true,
-		Client:  cli,
-		Ctx: intctrlutil.RequestCtx{
+func newMockReconfigureParams(testName string, cli client.Client, paramOps ...ParamsOps) reconfigureContext {
+	params := reconfigureContext{
+		Client: cli,
+		RequestCtx: intctrlutil.RequestCtx{
 			Ctx:      ctx,
 			Log:      log.FromContext(ctx).WithValues("policy_test", testName),
 			Recorder: record.NewFakeRecorder(100),
@@ -179,6 +159,7 @@ func newMockReconfigureParams(testName string, cli client.Client, paramOps ...Pa
 			ObjectMeta: metav1.ObjectMeta{
 				Name: "test",
 			}},
+		ParametersDef: &parametersv1alpha1.ParametersDefinitionSpec{},
 	}
 	for _, customFn := range paramOps {
 		customFn(&params)
@@ -221,6 +202,26 @@ func withReadyPod(rMin, rMax int) PodOptions {
 	}
 }
 
+func withAvailablePod(rMin, rMax int) PodOptions {
+	return func(pod *corev1.Pod, index int) {
+		if index < rMin || index >= rMax {
+			return
+		}
+
+		if pod.Status.Conditions == nil {
+			pod.Status.Conditions = make([]corev1.PodCondition, 0)
+		}
+
+		h, _ := time.ParseDuration("-1h")
+		pod.Status.Conditions = append(pod.Status.Conditions, corev1.PodCondition{
+			Type:               corev1.PodReady,
+			Status:             corev1.ConditionTrue,
+			LastTransitionTime: metav1.NewTime(time.Now().Add(h)),
+		})
+		pod.Status.Phase = corev1.PodRunning
+	}
+}
+
 func fromPodObjectList(pods []corev1.Pod) []runtime.Object {
 	objs := make([]runtime.Object, len(pods))
 	for i := 0; i < len(pods); i++ {
diff --git a/controllers/parameters/simple_policy_test.go b/controllers/parameters/restart_policy_test.go
similarity index 92%
rename from controllers/parameters/simple_policy_test.go
rename to controllers/parameters/restart_policy_test.go
index 5d5b030d6..c7b4da424 100644
--- a/controllers/parameters/simple_policy_test.go
+++ b/controllers/parameters/restart_policy_test.go
@@ -26,17 +26,17 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
 )
 
-var _ = Describe("Reconfigure simplePolicy", func() {
+var _ = Describe("Reconfigure restartPolicy", func() {
 
 	var (
 		k8sMockClient *testutil.K8sClientMockHelper
-		simplePolicy  = upgradePolicyMap[appsv1alpha1.NormalPolicy]
+		simplePolicy  = upgradePolicyMap[parametersv1alpha1.RestartPolicy]
 	)
 
 	BeforeEach(func() {
@@ -56,9 +56,9 @@ var _ = Describe("Reconfigure simplePolicy", func() {
 
 	Context("simple reconfigure policy test", func() {
 		It("Should success without error", func() {
-			Expect(simplePolicy.GetPolicyName()).Should(BeEquivalentTo("simple"))
+			Expect(simplePolicy.GetPolicyName()).Should(BeEquivalentTo("restart"))
 
-			mockParam := newMockReconfigureParams("simplePolicy", k8sMockClient.Client(),
+			mockParam := newMockReconfigureParams("restartPolicy", k8sMockClient.Client(),
 				withMockInstanceSet(2, nil),
 				withConfigSpec("for_test", map[string]string{
 					"key": "value",
@@ -116,7 +116,7 @@ var _ = Describe("Reconfigure simplePolicy", func() {
 
 	Context("simple reconfigure policy test with Replication", func() {
 		It("Should success", func() {
-			mockParam := newMockReconfigureParams("simplePolicy", k8sMockClient.Client(),
+			mockParam := newMockReconfigureParams("restartPolicy", k8sMockClient.Client(),
 				withMockInstanceSet(2, nil),
 				withConfigSpec("for_test", map[string]string{
 					"key": "value",
@@ -149,7 +149,7 @@ var _ = Describe("Reconfigure simplePolicy", func() {
 	Context("simple reconfigure policy test for not supported component", func() {
 		It("Should failed", func() {
 			// not support type
-			mockParam := newMockReconfigureParams("simplePolicy", k8sMockClient.Client(),
+			mockParam := newMockReconfigureParams("restartPolicy", k8sMockClient.Client(),
 				withMockInstanceSet(2, nil),
 				withConfigSpec("for_test", map[string]string{
 					"key": "value",
@@ -208,7 +208,7 @@ var _ = Describe("Reconfigure simplePolicy", func() {
 	// Context("simple reconfigure policy test without not configmap volume", func() {
 	//	It("Should failed", func() {
 	//		// mock not cc
-	//		mockParam := newMockReconfigureParams("simplePolicy", nil,
+	//		mockParam := newMockReconfigureParams("restartPolicy", nil,
 	//			withMockInstanceSet(2, nil),
 	//			withConfigSpec("not_tpl_name", map[string]string{
 	//				"key": "value",
@@ -218,7 +218,7 @@ var _ = Describe("Reconfigure simplePolicy", func() {
 	//					Name:       "for_test",
 	//					VolumeName: "test_volume",
 	//				}}}))
-	//		status, err := simplePolicy.Upgrade(mockParam)
+	//		status, err := restartPolicy.Upgrade(mockParam)
 	//		Expect(err).ShouldNot(Succeed())
 	//		Expect(err.Error()).Should(ContainSubstring("failed to find config meta"))
 	//		Expect(status.Status).Should(BeEquivalentTo(ESFailed))
diff --git a/controllers/parameters/revision_test.go b/controllers/parameters/revision_test.go
index afa574338..2d19386e7 100644
--- a/controllers/parameters/revision_test.go
+++ b/controllers/parameters/revision_test.go
@@ -26,6 +26,7 @@ import (
 	"github.com/stretchr/testify/assert"
 
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/builder"
@@ -95,9 +96,9 @@ func TestParseRevision(t *testing.T) {
 		want: ConfigurationRevision{
 			StrRevision: "120000",
 			Revision:    120000,
-			Phase:       appsv1alpha1.CPendingPhase,
+			Phase:       parametersv1alpha1.CPendingPhase,
 			Result: intctrlutil.Result{
-				Phase:    appsv1alpha1.CPendingPhase,
+				Phase:    parametersv1alpha1.CPendingPhase,
 				Revision: "120000",
 			},
 		},
@@ -179,9 +180,9 @@ func TestGetLastRevision(t *testing.T) {
 		want: ConfigurationRevision{
 			Revision:    2,
 			StrRevision: "2",
-			Phase:       appsv1alpha1.CRunningPhase,
+			Phase:       parametersv1alpha1.CRunningPhase,
 			Result: intctrlutil.Result{
-				Phase:    appsv1alpha1.CRunningPhase,
+				Phase:    parametersv1alpha1.CRunningPhase,
 				Revision: "2",
 			},
 		},
diff --git a/controllers/parameters/rolling_upgrade_policy_test.go b/controllers/parameters/rolling_upgrade_policy_test.go
new file mode 100644
index 000000000..7ee441fce
--- /dev/null
+++ b/controllers/parameters/rolling_upgrade_policy_test.go
@@ -0,0 +1,172 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package parameters
+
+import (
+	. "github.com/onsi/ginkgo/v2"
+	. "github.com/onsi/gomega"
+
+	"github.com/golang/mock/gomock"
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	cfgproto "github.com/apecloud/kubeblocks/pkg/configuration/proto"
+	mockproto "github.com/apecloud/kubeblocks/pkg/configuration/proto/mocks"
+	"github.com/apecloud/kubeblocks/pkg/constant"
+	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
+)
+
+var _ = Describe("Reconfigure RollingPolicy", func() {
+
+	var (
+		k8sMockClient     *testutil.K8sClientMockHelper
+		mockParam         reconfigureContext
+		reconfigureClient *mockproto.MockReconfigureClient
+
+		defaultReplica = 3
+		rollingPolicy  = upgradePolicyMap[parametersv1alpha1.RollingPolicy]
+	)
+
+	updateLabelPatch := func(pods []corev1.Pod, patch *corev1.Pod) {
+		patchKey := client.ObjectKeyFromObject(patch)
+		for i := range pods {
+			orgPod := &pods[i]
+			if client.ObjectKeyFromObject(orgPod) == patchKey {
+				orgPod.Labels = patch.Labels
+				break
+			}
+		}
+	}
+
+	createReconfigureParam := func(replicas int) reconfigureContext {
+		return newMockReconfigureParams("rollingPolicy", k8sMockClient.Client(),
+			withMockInstanceSet(replicas, nil),
+			withConfigSpec("for_test", map[string]string{
+				"key": "value",
+			}),
+			withConfigDescription(&parametersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.Properties}),
+			withGRPCClient(func(addr string) (cfgproto.ReconfigureClient, error) {
+				return reconfigureClient, nil
+			}),
+			withClusterComponent(replicas),
+			// withCDComponent(compType, []appsv1alpha1.ComponentConfigSpec{{
+			// 	ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{
+			// 		Name:       "for_test",
+			// 		VolumeName: "test_volume",
+			// 	}}})
+		)
+	}
+
+	BeforeEach(func() {
+		k8sMockClient = testutil.NewK8sMockClient()
+		reconfigureClient = mockproto.NewMockReconfigureClient(k8sMockClient.Controller())
+		mockParam = createReconfigureParam(defaultReplica)
+	})
+
+	AfterEach(func() {
+		// Add any teardown steps that needs to be executed after each test
+		k8sMockClient.Finish()
+	})
+
+	// TODO(component)
+	Context("consensus rolling reconfigure policy test", func() {
+		It("Should success without error", func() {
+			Expect(rollingPolicy.GetPolicyName()).Should(BeEquivalentTo("rolling"))
+
+			mockLeaderLabel := func(pod *corev1.Pod, i int) {
+				if pod.Labels == nil {
+					pod.Labels = make(map[string]string, 1)
+				}
+				if i == 1 {
+					pod.Labels[constant.RoleLabelKey] = "leader"
+				} else {
+					pod.Labels[constant.RoleLabelKey] = "follower"
+				}
+			}
+
+			acc := 0
+			mockPods := [][]corev1.Pod{
+				newMockPodsWithInstanceSet(&mockParam.InstanceSetUnits[0], 2),
+				newMockPodsWithInstanceSet(&mockParam.InstanceSetUnits[0], 5,
+					mockLeaderLabel),
+				newMockPodsWithInstanceSet(&mockParam.InstanceSetUnits[0], 3,
+					withReadyPod(0, 0),
+					withAvailablePod(0, 3),
+					mockLeaderLabel),
+			}
+
+			k8sMockClient.MockListMethod(testutil.WithListReturned(
+				testutil.WithConstructListSequenceResult([][]runtime.Object{
+					fromPodObjectList(mockPods[0]),
+					fromPodObjectList(mockPods[1]),
+					fromPodObjectList(mockPods[2]),
+				}, func(sequence int, r []runtime.Object) { acc = sequence }), testutil.WithAnyTimes()))
+
+			k8sMockClient.MockPatchMethod(testutil.WithPatchReturned(func(obj client.Object, patch client.Patch) error {
+				pod, _ := obj.(*corev1.Pod)
+				// mock patch
+				updateLabelPatch(mockPods[acc], pod)
+				return nil
+			}, testutil.WithAnyTimes()))
+
+			reconfigureClient.EXPECT().StopContainer(gomock.Any(), gomock.Any()).
+				Return(&cfgproto.StopContainerResponse{}, nil).
+				AnyTimes()
+
+			// mock wait the number of pods to target replicas
+			status, err := rollingPolicy.Upgrade(mockParam)
+			Expect(err).Should(Succeed())
+			Expect(status.Status).Should(BeEquivalentTo(ESRetry))
+
+			// mock wait the number of pods to ready status
+			status, err = rollingPolicy.Upgrade(mockParam)
+			Expect(err).Should(Succeed())
+			Expect(status.Status).Should(BeEquivalentTo(ESRetry))
+
+			// upgrade pod-0
+			status, err = rollingPolicy.Upgrade(mockParam)
+			Expect(err).Should(Succeed())
+			Expect(status.Status).Should(BeEquivalentTo(ESRetry))
+			Expect(mockPods[acc][2].Labels[mockParam.getConfigKey()]).Should(BeEquivalentTo(mockParam.getTargetVersionHash()))
+			Expect(mockPods[acc][1].Labels[mockParam.getConfigKey()]).ShouldNot(BeEquivalentTo(mockParam.getTargetVersionHash()))
+			Expect(mockPods[acc][0].Labels[mockParam.getConfigKey()]).ShouldNot(BeEquivalentTo(mockParam.getTargetVersionHash()))
+
+			// upgrade pod-2
+			status, err = rollingPolicy.Upgrade(mockParam)
+			Expect(err).Should(Succeed())
+			Expect(status.Status).Should(BeEquivalentTo(ESRetry))
+			Expect(mockPods[acc][0].Labels[mockParam.getConfigKey()]).Should(BeEquivalentTo(mockParam.getTargetVersionHash()))
+			Expect(mockPods[acc][1].Labels[mockParam.getConfigKey()]).ShouldNot(BeEquivalentTo(mockParam.getTargetVersionHash()))
+
+			// upgrade pod-1
+			status, err = rollingPolicy.Upgrade(mockParam)
+			Expect(err).Should(Succeed())
+			Expect(status.Status).Should(BeEquivalentTo(ESRetry))
+			Expect(mockPods[acc][1].Labels[mockParam.getConfigKey()]).Should(BeEquivalentTo(mockParam.getTargetVersionHash()))
+
+			// finish check, not upgrade
+			status, err = rollingPolicy.Upgrade(mockParam)
+			Expect(err).Should(Succeed())
+			Expect(status.Status).Should(BeEquivalentTo(ESNone))
+		})
+	})
+})
diff --git a/controllers/parameters/suite_test.go b/controllers/parameters/suite_test.go
index 768f31381..713baf854 100644
--- a/controllers/parameters/suite_test.go
+++ b/controllers/parameters/suite_test.go
@@ -29,25 +29,29 @@ import (
 
 	"github.com/go-logr/logr"
 	"go.uber.org/zap/zapcore"
+	ctrl "sigs.k8s.io/controller-runtime"
+	"sigs.k8s.io/controller-runtime/pkg/metrics/server"
+
 	"k8s.io/client-go/kubernetes/scheme"
 	"k8s.io/client-go/rest"
-	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/envtest"
 	logf "sigs.k8s.io/controller-runtime/pkg/log"
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
-	"sigs.k8s.io/controller-runtime/pkg/metrics/server"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloadsv1 "github.com/apecloud/kubeblocks/apis/workloads/v1"
+	"github.com/apecloud/kubeblocks/pkg/controller/model"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 	"github.com/apecloud/kubeblocks/pkg/testutil"
 	viper "github.com/apecloud/kubeblocks/pkg/viperx"
 )
 
+// These tests use Ginkgo (BDD-style Go testing framework). Refer to
+// http://onsi.github.io/ginkgo/ to learn more about Ginkgo.
+
 var cfg *rest.Config
 var k8sClient client.Client
 var testEnv *envtest.Environment
@@ -55,10 +59,10 @@ var ctx context.Context
 var cancel context.CancelFunc
 var testCtx testutil.TestContext
 
-func TestReconfigure(t *testing.T) {
+func TestAPIs(t *testing.T) {
 	RegisterFailHandler(Fail)
 
-	RunSpecs(t, "Configuration Suite")
+	RunSpecs(t, "Controller Suite")
 }
 
 var _ = BeforeSuite(func() {
@@ -84,16 +88,15 @@ var _ = BeforeSuite(func() {
 	Expect(err).NotTo(HaveOccurred())
 	Expect(cfg).NotTo(BeNil())
 
-	err = appsv1alpha1.AddToScheme(scheme.Scheme)
+	err = parametersv1alpha1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
-	err = appsv1beta1.AddToScheme(scheme.Scheme)
+	err = appsv1alpha1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 	err = appsv1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 	err = workloadsv1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
-	err = parametersv1alpha1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
+	model.AddScheme(parametersv1alpha1.AddToScheme)
 
 	// +kubebuilder:scaffold:scheme
 
@@ -107,30 +110,23 @@ var _ = BeforeSuite(func() {
 		Metrics: server.Options{BindAddress: "0"},
 		Client: client.Options{
 			Cache: &client.CacheOptions{
-				DisableFor: intctrlutil.GetUncachedObjects(),
+				DisableFor: append(intctrlutil.GetUncachedObjects(), &parametersv1alpha1.ComponentParameter{}),
 			},
 		},
 	})
 	Expect(err).ToNot(HaveOccurred())
 
-	err = (&ReconfigureReconciler{
-		Client:   k8sManager.GetClient(),
-		Scheme:   k8sManager.GetScheme(),
-		Recorder: k8sManager.GetEventRecorderFor("reconfigure-controller"),
-	}).SetupWithManager(k8sManager, nil)
-	Expect(err).ToNot(HaveOccurred())
-
-	err = (&ConfigConstraintReconciler{
+	err = (&ParameterReconciler{
 		Client:   k8sManager.GetClient(),
 		Scheme:   k8sManager.GetScheme(),
-		Recorder: k8sManager.GetEventRecorderFor("configuration-cc-controller"),
+		Recorder: k8sManager.GetEventRecorderFor("parameter-controller"),
 	}).SetupWithManager(k8sManager)
 	Expect(err).ToNot(HaveOccurred())
 
-	err = (&ConfigurationReconciler{
+	err = (&ComponentParameterReconciler{
 		Client:   k8sManager.GetClient(),
 		Scheme:   k8sManager.GetScheme(),
-		Recorder: k8sManager.GetEventRecorderFor("configuration-controller"),
+		Recorder: k8sManager.GetEventRecorderFor("component-parameter-controller"),
 	}).SetupWithManager(k8sManager, nil)
 	Expect(err).ToNot(HaveOccurred())
 
@@ -148,6 +144,20 @@ var _ = BeforeSuite(func() {
 	}).SetupWithManager(k8sManager)
 	Expect(err).ToNot(HaveOccurred())
 
+	err = (&ReconfigureReconciler{
+		Client:   k8sManager.GetClient(),
+		Scheme:   k8sManager.GetScheme(),
+		Recorder: k8sManager.GetEventRecorderFor("reconfigure-controller"),
+	}).SetupWithManager(k8sManager, nil)
+	Expect(err).ToNot(HaveOccurred())
+
+	err = (&ComponentDrivenParameterReconciler{
+		Client:   k8sManager.GetClient(),
+		Scheme:   k8sManager.GetScheme(),
+		Recorder: k8sManager.GetEventRecorderFor("component-parameter-controller"),
+	}).SetupWithManager(k8sManager)
+	Expect(err).ToNot(HaveOccurred())
+
 	testCtx = testutil.NewDefaultTestContext(ctx, k8sClient, testEnv)
 
 	go func() {
@@ -155,12 +165,12 @@ var _ = BeforeSuite(func() {
 		err = k8sManager.Start(ctx)
 		Expect(err).ToNot(HaveOccurred(), "failed to run manager")
 	}()
+
 })
 
 var _ = AfterSuite(func() {
 	cancel()
 	By("tearing down the test environment")
-
 	err := testEnv.Stop()
 	Expect(err).NotTo(HaveOccurred())
 })
diff --git a/controllers/parameters/sync_upgrade_policy_test.go b/controllers/parameters/sync_upgrade_policy_test.go
index ef20e9daf..1bc53d583 100644
--- a/controllers/parameters/sync_upgrade_policy_test.go
+++ b/controllers/parameters/sync_upgrade_policy_test.go
@@ -28,9 +28,9 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/runtime"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgproto "github.com/apecloud/kubeblocks/pkg/configuration/proto"
-	mock_proto "github.com/apecloud/kubeblocks/pkg/configuration/proto/mocks"
+	mockproto "github.com/apecloud/kubeblocks/pkg/configuration/proto/mocks"
 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
 )
 
@@ -40,12 +40,12 @@ var _ = Describe("Reconfigure OperatorSyncPolicy", func() {
 
 	var (
 		k8sMockClient     *testutil.K8sClientMockHelper
-		reconfigureClient *mock_proto.MockReconfigureClient
+		reconfigureClient *mockproto.MockReconfigureClient
 	)
 
 	BeforeEach(func() {
 		k8sMockClient = testutil.NewK8sMockClient()
-		reconfigureClient = mock_proto.NewMockReconfigureClient(k8sMockClient.Controller())
+		reconfigureClient = mockproto.NewMockReconfigureClient(k8sMockClient.Controller())
 	})
 
 	AfterEach(func() {
@@ -55,7 +55,7 @@ var _ = Describe("Reconfigure OperatorSyncPolicy", func() {
 	Context("sync reconfigure policy test", func() {
 		It("Should success without error", func() {
 			By("check policy name")
-			Expect(operatorSyncPolicy.GetPolicyName()).Should(BeEquivalentTo("operatorSyncUpdate"))
+			Expect(operatorSyncPolicy.GetPolicyName()).Should(BeEquivalentTo("syncReload"))
 
 			By("prepare reconfigure policy params")
 			mockParam := newMockReconfigureParams("operatorSyncPolicy", k8sMockClient.Client(),
@@ -64,8 +64,8 @@ var _ = Describe("Reconfigure OperatorSyncPolicy", func() {
 				}),
 				withMockInstanceSet(3, nil),
 				withConfigSpec("for_test", map[string]string{"a": "c b e f"}),
-				withConfigConstraintSpec(&appsv1beta1.FileFormatConfig{Format: appsv1beta1.RedisCfg}),
-				withConfigPatch(map[string]string{
+				withConfigDescription(&parametersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.RedisCfg}),
+				withUpdatedParameters(map[string]string{
 					"a": "c b e f",
 				}),
 				withClusterComponent(3))
@@ -106,7 +106,7 @@ var _ = Describe("Reconfigure OperatorSyncPolicy", func() {
 	Context("sync reconfigure policy with selector test", func() {
 		It("Should success without error", func() {
 			By("check policy name")
-			Expect(operatorSyncPolicy.GetPolicyName()).Should(BeEquivalentTo("operatorSyncUpdate"))
+			Expect(operatorSyncPolicy.GetPolicyName()).Should(BeEquivalentTo("syncReload"))
 
 			By("prepare reconfigure policy params")
 			mockParam := newMockReconfigureParams("operatorSyncPolicy", k8sMockClient.Client(),
@@ -115,17 +115,19 @@ var _ = Describe("Reconfigure OperatorSyncPolicy", func() {
 				}),
 				withMockInstanceSet(3, nil),
 				withConfigSpec("for_test", map[string]string{"a": "c b e f"}),
-				withConfigConstraintSpec(&appsv1beta1.FileFormatConfig{Format: appsv1beta1.RedisCfg}),
-				withConfigPatch(map[string]string{
+				withConfigDescription(&parametersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.RedisCfg}),
+				withUpdatedParameters(map[string]string{
 					"a": "c b e f",
 				}),
 				withClusterComponent(3))
 
 			// add selector
-			mockParam.ConfigConstraint.ReloadAction = &appsv1beta1.ReloadAction{
-				TargetPodSelector: &metav1.LabelSelector{
-					MatchLabels: map[string]string{
-						"primary": "true",
+			mockParam.ParametersDef = &parametersv1alpha1.ParametersDefinitionSpec{
+				ReloadAction: &parametersv1alpha1.ReloadAction{
+					TargetPodSelector: &metav1.LabelSelector{
+						MatchLabels: map[string]string{
+							"primary": "true",
+						},
 					},
 				},
 			}
diff --git a/controllers/trace/desired_state_handler_test.go b/controllers/trace/desired_state_handler_test.go
index 583e75637..c499d049e 100644
--- a/controllers/trace/desired_state_handler_test.go
+++ b/controllers/trace/desired_state_handler_test.go
@@ -34,8 +34,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	tracev1 "github.com/apecloud/kubeblocks/apis/trace/v1"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/kubebuilderx"
@@ -271,9 +271,9 @@ var _ = Describe("desired_state_handler test", func() {
 					return apierrors.NewNotFound(kbappsv1.Resource(kbappsv1.ComponentKind), objKey.Name)
 				}).AnyTimes()
 			k8sMock.EXPECT().
-				Get(gomock.Any(), gomock.Any(), &appsv1alpha1.Configuration{}, gomock.Any()).
-				DoAndReturn(func(_ context.Context, objKey client.ObjectKey, obj *appsv1alpha1.Configuration, _ ...client.GetOption) error {
-					return apierrors.NewNotFound(appsv1alpha1.Resource(constant.ConfigurationKind), objKey.Name)
+				Get(gomock.Any(), gomock.Any(), &parametersv1alpha1.ComponentParameter{}, gomock.Any()).
+				DoAndReturn(func(_ context.Context, objKey client.ObjectKey, obj *parametersv1alpha1.ComponentParameter, _ ...client.GetOption) error {
+					return apierrors.NewNotFound(parametersv1alpha1.Resource(constant.ComponentParameterKind), objKey.Name)
 				}).AnyTimes()
 			k8sMock.EXPECT().
 				Get(gomock.Any(), gomock.Any(), &corev1.ConfigMap{}, gomock.Any()).
diff --git a/controllers/trace/dry_run_handler_test.go b/controllers/trace/dry_run_handler_test.go
index cf17df234..c4cf0727a 100644
--- a/controllers/trace/dry_run_handler_test.go
+++ b/controllers/trace/dry_run_handler_test.go
@@ -36,8 +36,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	tracev1 "github.com/apecloud/kubeblocks/apis/trace/v1"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/kubebuilderx"
@@ -264,9 +264,9 @@ var _ = Describe("dry_run_handler test", func() {
 					return apierrors.NewNotFound(kbappsv1.Resource(kbappsv1.ComponentKind), objKey.Name)
 				}).AnyTimes()
 			k8sMock.EXPECT().
-				Get(gomock.Any(), gomock.Any(), &appsv1alpha1.Configuration{}, gomock.Any()).
-				DoAndReturn(func(_ context.Context, objKey client.ObjectKey, obj *appsv1alpha1.Configuration, _ ...client.GetOption) error {
-					return apierrors.NewNotFound(appsv1alpha1.Resource(constant.ConfigurationKind), objKey.Name)
+				Get(gomock.Any(), gomock.Any(), &parametersv1alpha1.ComponentParameter{}, gomock.Any()).
+				DoAndReturn(func(_ context.Context, objKey client.ObjectKey, obj *parametersv1alpha1.ComponentParameter, _ ...client.GetOption) error {
+					return apierrors.NewNotFound(parametersv1alpha1.Resource(constant.ComponentParameterKind), objKey.Name)
 				}).AnyTimes()
 			k8sMock.EXPECT().
 				Get(gomock.Any(), gomock.Any(), &corev1.ConfigMap{}, gomock.Any()).
diff --git a/controllers/trace/suite_test.go b/controllers/trace/suite_test.go
index 4562bfc9e..788d482d7 100644
--- a/controllers/trace/suite_test.go
+++ b/controllers/trace/suite_test.go
@@ -42,10 +42,9 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 
 	kbappsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	tracev1 "github.com/apecloud/kubeblocks/apis/trace/v1"
 	workloadsv1 "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	"github.com/apecloud/kubeblocks/pkg/controller/builder"
@@ -93,17 +92,13 @@ var _ = BeforeSuite(func() {
 
 	initKBOwnershipRulesForTest(cfg)
 
-	err = appsv1alpha1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
-	model.AddScheme(appsv1alpha1.AddToScheme)
-
 	err = opsv1alpha1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 	model.AddScheme(opsv1alpha1.AddToScheme)
 
-	err = appsv1beta1.AddToScheme(scheme.Scheme)
+	err = parametersv1alpha1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
-	model.AddScheme(appsv1beta1.AddToScheme)
+	model.AddScheme(parametersv1alpha1.AddToScheme)
 
 	err = kbappsv1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
@@ -178,7 +173,7 @@ func mockObjects(k8sMock *mocks.MockClient) (*kbappsv1.Cluster, []kbappsv1.Compo
 		&batchv1.JobList{},
 		&dpv1alpha1.BackupList{},
 		&dpv1alpha1.RestoreList{},
-		&appsv1alpha1.ConfigurationList{},
+		&parametersv1alpha1.ComponentParameterList{},
 	}
 	for _, secondary := range componentSecondaries {
 		k8sMock.EXPECT().
diff --git a/pkg/configuration/config_manager/builder_test.go b/pkg/configuration/config_manager/builder_test.go
index d53bbb20f..726d3dda4 100644
--- a/pkg/configuration/config_manager/builder_test.go
+++ b/pkg/configuration/config_manager/builder_test.go
@@ -34,7 +34,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
 )
 
@@ -78,39 +78,39 @@ var _ = Describe("Config Builder Test", func() {
 				Name:      "pg_config",
 			}}
 	}
-	newReloadOptions := func(t appsv1beta1.DynamicReloadType, sync *bool) *appsv1beta1.ReloadAction {
-		signalHandle := &appsv1beta1.UnixSignalTrigger{
+	newReloadOptions := func(t parametersv1alpha1.DynamicReloadType, sync *bool) *parametersv1alpha1.ReloadAction {
+		signalHandle := &parametersv1alpha1.UnixSignalTrigger{
 			ProcessName: "postgres",
-			Signal:      appsv1beta1.SIGHUP,
+			Signal:      parametersv1alpha1.SIGHUP,
 		}
-		shellHandle := &appsv1beta1.ShellTrigger{
+		shellHandle := &parametersv1alpha1.ShellTrigger{
 			Command: []string{"pwd"},
 		}
-		scriptHandle := &appsv1beta1.TPLScriptTrigger{
+		scriptHandle := &parametersv1alpha1.TPLScriptTrigger{
 			Sync: sync,
-			ScriptConfig: appsv1beta1.ScriptConfig{
+			ScriptConfig: parametersv1alpha1.ScriptConfig{
 				ScriptConfigMapRef: "reload-script",
 				Namespace:          scriptsNS,
 			},
 		}
-		autoHandle := &appsv1beta1.AutoTrigger{
+		autoHandle := &parametersv1alpha1.AutoTrigger{
 			ProcessName: "postgres",
 		}
 
 		switch t {
 		default:
 			return nil
-		case appsv1beta1.UnixSignalType:
-			return &appsv1beta1.ReloadAction{
+		case parametersv1alpha1.UnixSignalType:
+			return &parametersv1alpha1.ReloadAction{
 				UnixSignalTrigger: signalHandle}
-		case appsv1beta1.ShellType:
-			return &appsv1beta1.ReloadAction{
+		case parametersv1alpha1.ShellType:
+			return &parametersv1alpha1.ReloadAction{
 				ShellTrigger: shellHandle}
-		case appsv1beta1.TPLScriptType:
-			return &appsv1beta1.ReloadAction{
+		case parametersv1alpha1.TPLScriptType:
+			return &parametersv1alpha1.ReloadAction{
 				TPLScriptTrigger: scriptHandle}
-		case appsv1beta1.AutoType:
-			return &appsv1beta1.ReloadAction{
+		case parametersv1alpha1.AutoType:
+			return &parametersv1alpha1.ReloadAction{
 				AutoTrigger: autoHandle}
 		}
 	}
@@ -118,11 +118,9 @@ var _ = Describe("Config Builder Test", func() {
 		return []ConfigSpecMeta{
 			{
 				ConfigSpecInfo: ConfigSpecInfo{
-					ConfigSpec: appsv1.ComponentConfigSpec{
-						ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-							Name:       "pg_config",
-							VolumeName: "pg_config",
-						},
+					ConfigSpec: appsv1.ComponentTemplateSpec{
+						Name:       "pg_config",
+						VolumeName: "pg_config",
 					},
 				},
 			},
@@ -137,14 +135,13 @@ var _ = Describe("Config Builder Test", func() {
 					Namespace: "default",
 				},
 			},
-			ComponentName:             "test",
-			Volumes:                   newVolumeMounts(),
-			ConfigSpecsBuildParams:    newConfigSpecMeta(),
-			ConfigLazyRenderedVolumes: make(map[string]corev1.VolumeMount),
-			DownwardAPIVolumes:        make([]corev1.VolumeMount, 0),
+			ComponentName:          "test",
+			Volumes:                newVolumeMounts(),
+			ConfigSpecsBuildParams: newConfigSpecMeta(),
+			DownwardAPIVolumes:     make([]corev1.VolumeMount, 0),
 		}
 		if hasScripts {
-			param.ConfigSpecsBuildParams[0].ScriptConfig = []appsv1beta1.ScriptConfig{
+			param.ConfigSpecsBuildParams[0].ScriptConfig = []parametersv1alpha1.ScriptConfig{
 				{
 					Namespace:          scriptsNS,
 					ScriptConfigMapRef: scriptsName,
@@ -181,8 +178,8 @@ formatterConfig:
 		mockK8sCli.MockCreateMethod(testutil.WithCreateReturned(testutil.WithCreatedSucceedResult(), testutil.WithAnyTimes()))
 	}
 
-	newDownwardAPIVolumes := func() []appsv1beta1.DownwardAPIChangeTriggeredAction {
-		return []appsv1beta1.DownwardAPIChangeTriggeredAction{
+	newDownwardAPIVolumes := func() []parametersv1alpha1.DownwardAPIChangeTriggeredAction {
+		return []parametersv1alpha1.DownwardAPIChangeTriggeredAction{
 			{
 				Name:       "downward-api",
 				MountPoint: "/etc/podinfo",
@@ -203,11 +200,11 @@ formatterConfig:
 		It("builds unixSignal reloader correctly", func() {
 			param := newCMBuildParams(false)
 			mockTplScriptCM()
-			reloadOptions := newReloadOptions(appsv1beta1.UnixSignalType, nil)
+			reloadOptions := newReloadOptions(parametersv1alpha1.UnixSignalType, nil)
 			for i := range param.ConfigSpecsBuildParams {
 				buildParam := &param.ConfigSpecsBuildParams[i]
 				buildParam.ReloadAction = reloadOptions
-				buildParam.ReloadType = appsv1beta1.UnixSignalType
+				buildParam.ReloadType = parametersv1alpha1.UnixSignalType
 			}
 			Expect(BuildConfigManagerContainerParams(mockK8sCli.Client(), ctx, param, newVolumeMounts2())).Should(Succeed())
 			for _, arg := range []string{`--volume-dir`, `/postgresql/conf`, `--volume-dir`, `/postgresql/conf2`} {
@@ -227,11 +224,11 @@ formatterConfig:
 			mockK8sCli.MockCreateMethod(testutil.WithCreateReturned(testutil.WithCreatedSucceedResult(), testutil.WithTimes(2)))
 
 			param := newCMBuildParams(true)
-			reloadOptions := newReloadOptions(appsv1beta1.ShellType, nil)
+			reloadOptions := newReloadOptions(parametersv1alpha1.ShellType, nil)
 			for i := range param.ConfigSpecsBuildParams {
 				buildParam := &param.ConfigSpecsBuildParams[i]
 				buildParam.ReloadAction = reloadOptions
-				buildParam.ReloadType = appsv1beta1.ShellType
+				buildParam.ReloadType = parametersv1alpha1.ShellType
 			}
 			Expect(BuildConfigManagerContainerParams(mockK8sCli.Client(), context.TODO(), param, newVolumeMounts())).Should(Succeed())
 			for _, arg := range []string{`--volume-dir`, `/postgresql/conf`} {
@@ -242,11 +239,11 @@ formatterConfig:
 		It("builds tplScriptsTrigger reloader correctly", func() {
 			mockTplScriptCM()
 			param := newCMBuildParams(false)
-			reloadOptions := newReloadOptions(appsv1beta1.TPLScriptType, syncFn(true))
+			reloadOptions := newReloadOptions(parametersv1alpha1.TPLScriptType, syncFn(true))
 			for i := range param.ConfigSpecsBuildParams {
 				buildParam := &param.ConfigSpecsBuildParams[i]
 				buildParam.ReloadAction = reloadOptions
-				buildParam.ReloadType = appsv1beta1.TPLScriptType
+				buildParam.ReloadType = parametersv1alpha1.TPLScriptType
 			}
 			Expect(BuildConfigManagerContainerParams(mockK8sCli.Client(), context.TODO(), param, newVolumeMounts())).Should(Succeed())
 			for _, arg := range []string{`--operator-update-enable`} {
@@ -257,11 +254,11 @@ formatterConfig:
 		It("builds tplScriptsTrigger reloader correctly with sync", func() {
 			mockTplScriptCM()
 			param := newCMBuildParams(false)
-			reloadOptions := newReloadOptions(appsv1beta1.TPLScriptType, syncFn(false))
+			reloadOptions := newReloadOptions(parametersv1alpha1.TPLScriptType, syncFn(false))
 			for i := range param.ConfigSpecsBuildParams {
 				buildParam := &param.ConfigSpecsBuildParams[i]
 				buildParam.ReloadAction = reloadOptions
-				buildParam.ReloadType = appsv1beta1.TPLScriptType
+				buildParam.ReloadType = parametersv1alpha1.TPLScriptType
 			}
 			Expect(BuildConfigManagerContainerParams(mockK8sCli.Client(), context.TODO(), param, newVolumeMounts())).Should(Succeed())
 			for _, arg := range []string{`--volume-dir`, `/postgresql/conf`} {
@@ -274,7 +271,7 @@ formatterConfig:
 			param := newCMBuildParams(false)
 			buildParam := &param.ConfigSpecsBuildParams[0]
 			buildParam.DownwardAPIOptions = newDownwardAPIVolumes()
-			buildParam.ReloadAction = newReloadOptions(appsv1beta1.TPLScriptType, syncFn(true))
+			buildParam.ReloadAction = newReloadOptions(parametersv1alpha1.TPLScriptType, syncFn(true))
 			Expect(BuildConfigManagerContainerParams(mockK8sCli.Client(), context.TODO(), param, newVolumeMounts())).Should(Succeed())
 			Expect(FindVolumeMount(param.DownwardAPIVolumes, buildParam.DownwardAPIOptions[0].Name)).ShouldNot(BeNil())
 		})
@@ -305,7 +302,7 @@ func TestCheckAndUpdateReloadYaml(t *testing.T) {
 	type args struct {
 		data            map[string]string
 		reloadConfig    string
-		formatterConfig *appsv1beta1.FileFormatConfig
+		formatterConfig *parametersv1alpha1.FileFormatConfig
 	}
 	tests := []struct {
 		name    string
@@ -320,8 +317,8 @@ fileRegex: my.cnf
 scripts: reload.tpl
 `},
 			reloadConfig: "reload.yaml",
-			formatterConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Ini,
+			formatterConfig: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.Ini,
 			},
 		},
 		wantErr: false,
@@ -337,7 +334,7 @@ formatterConfig:
 		args: args{
 			data:            map[string]string{},
 			reloadConfig:    "reload.yaml",
-			formatterConfig: &appsv1beta1.FileFormatConfig{Format: appsv1beta1.Ini},
+			formatterConfig: &parametersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.Ini},
 		},
 		wantErr: true,
 		want:    map[string]string{},
diff --git a/pkg/configuration/config_manager/config_handler_test.go b/pkg/configuration/config_manager/config_handler_test.go
index c91df2320..dfb420ce1 100644
--- a/pkg/configuration/config_manager/config_handler_test.go
+++ b/pkg/configuration/config_manager/config_handler_test.go
@@ -37,7 +37,7 @@ import (
 	"github.com/fsnotify/fsnotify"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
 )
@@ -67,44 +67,41 @@ var _ = Describe("Config Handler Test", func() {
 		DeferCleanup(mockK8sCli.Finish)
 	})
 
-	newConfigSpec := func() appsv1.ComponentConfigSpec {
-		return appsv1.ComponentConfigSpec{
-			ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-				Name:        "config",
-				TemplateRef: "config-template",
-				VolumeName:  "/opt/config",
-				Namespace:   "default",
-			},
-			ConfigConstraintRef: "config-constraint",
+	newConfigSpec := func() appsv1.ComponentTemplateSpec {
+		return appsv1.ComponentTemplateSpec{
+			Name:        "config",
+			TemplateRef: "config-template",
+			VolumeName:  "/opt/config",
+			Namespace:   "default",
 		}
 	}
 
-	newFormatter := func() appsv1beta1.FileFormatConfig {
-		return appsv1beta1.FileFormatConfig{
-			FormatterAction: appsv1beta1.FormatterAction{
-				IniConfig: &appsv1beta1.IniConfig{
+	newFormatter := func() parametersv1alpha1.FileFormatConfig {
+		return parametersv1alpha1.FileFormatConfig{
+			FormatterAction: parametersv1alpha1.FormatterAction{
+				IniConfig: &parametersv1alpha1.IniConfig{
 					SectionName: "test",
 				},
 			},
-			Format: appsv1beta1.Ini,
+			Format: parametersv1alpha1.Ini,
 		}
 	}
 
 	newUnixSignalConfig := func() ConfigSpecInfo {
 		return ConfigSpecInfo{
-			ReloadAction: &appsv1beta1.ReloadAction{
-				UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{
+			ReloadAction: &parametersv1alpha1.ReloadAction{
+				UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{
 					ProcessName: findCurrProcName(),
-					Signal:      appsv1beta1.SIGHUP,
+					Signal:      parametersv1alpha1.SIGHUP,
 				}},
-			ReloadType: appsv1beta1.UnixSignalType,
+			ReloadType: parametersv1alpha1.UnixSignalType,
 			MountPoint: "/tmp/test",
 			ConfigSpec: newConfigSpec(),
 		}
 	}
 
-	newDownwardAPIOptions := func() []appsv1beta1.DownwardAPIChangeTriggeredAction {
-		return []appsv1beta1.DownwardAPIChangeTriggeredAction{
+	newDownwardAPIOptions := func() []parametersv1alpha1.DownwardAPIChangeTriggeredAction {
+		return []parametersv1alpha1.DownwardAPIChangeTriggeredAction{
 			{
 				Name:       "labels",
 				MountPoint: filepath.Join(tmpWorkDir, "labels"),
@@ -120,12 +117,12 @@ var _ = Describe("Config Handler Test", func() {
 
 	newDownwardAPIConfig := func() ConfigSpecInfo {
 		return ConfigSpecInfo{
-			ReloadAction: &appsv1beta1.ReloadAction{
-				ShellTrigger: &appsv1beta1.ShellTrigger{
+			ReloadAction: &parametersv1alpha1.ReloadAction{
+				ShellTrigger: &parametersv1alpha1.ShellTrigger{
 					Command: []string{"sh", "-c", `echo "hello world" "$@"`},
 				},
 			},
-			ReloadType:         appsv1beta1.ShellType,
+			ReloadType:         parametersv1alpha1.ShellType,
 			MountPoint:         tmpWorkDir,
 			ConfigSpec:         newConfigSpec(),
 			FormatterConfig:    newFormatter(),
@@ -135,10 +132,10 @@ var _ = Describe("Config Handler Test", func() {
 
 	newTPLScriptsConfig := func(configPath string) ConfigSpecInfo {
 		return ConfigSpecInfo{
-			ReloadAction: &appsv1beta1.ReloadAction{
-				TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{},
+			ReloadAction: &parametersv1alpha1.ReloadAction{
+				TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{},
 			},
-			ReloadType:      appsv1beta1.TPLScriptType,
+			ReloadType:      parametersv1alpha1.TPLScriptType,
 			MountPoint:      "/tmp/test",
 			ConfigSpec:      newConfigSpec(),
 			FormatterConfig: newFormatter(),
@@ -167,7 +164,7 @@ var _ = Describe("Config Handler Test", func() {
 
 	Context("TestSimpleHandler", func() {
 		It("CreateSignalHandler", func() {
-			_, err := CreateSignalHandler(appsv1beta1.SIGALRM, "test", "")
+			_, err := CreateSignalHandler(parametersv1alpha1.SIGALRM, "test", "")
 			Expect(err).Should(Succeed())
 			_, err = CreateSignalHandler("NOSIGNAL", "test", "")
 			Expect(err.Error()).To(ContainSubstring("not supported unix signal: NOSIGNAL"))
@@ -179,10 +176,9 @@ var _ = Describe("Config Handler Test", func() {
 			_, err = CreateExecHandler([]string{}, "", nil, "")
 			Expect(err.Error()).To(ContainSubstring("invalid command"))
 			c, err := CreateExecHandler([]string{"go", "version"}, "", &ConfigSpecInfo{
-				ConfigSpec: appsv1.ComponentConfigSpec{
-					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-						Name: "for_test",
-					}}},
+				ConfigSpec: appsv1.ComponentTemplateSpec{
+					Name: "for_test",
+				}},
 				"")
 			Expect(err).Should(Succeed())
 			Expect(c.VolumeHandle(context.Background(), fsnotify.Event{})).Should(Succeed())
@@ -273,11 +269,11 @@ var _ = Describe("Config Handler Test", func() {
 			})
 			It("should succeed on reload individually", func() {
 				configSpec := ConfigSpecInfo{
-					ReloadAction: &appsv1beta1.ReloadAction{
-						ShellTrigger: &appsv1beta1.ShellTrigger{
+					ReloadAction: &parametersv1alpha1.ReloadAction{
+						ShellTrigger: &parametersv1alpha1.ShellTrigger{
 							Command: []string{"sh", "-c", `echo "hello world" "$@"`, "sh"},
 						}},
-					ReloadType:      appsv1beta1.ShellType,
+					ReloadType:      parametersv1alpha1.ShellType,
 					MountPoint:      configPath,
 					ConfigSpec:      newConfigSpec(),
 					FormatterConfig: newFormatter(),
@@ -287,15 +283,15 @@ var _ = Describe("Config Handler Test", func() {
 			Describe("Test reload in a batch", func() {
 				It("should succeed on the default batch input format", func() {
 					configSpec := ConfigSpecInfo{
-						ReloadAction: &appsv1beta1.ReloadAction{
-							ShellTrigger: &appsv1beta1.ShellTrigger{
+						ReloadAction: &parametersv1alpha1.ReloadAction{
+							ShellTrigger: &parametersv1alpha1.ShellTrigger{
 								Command: []string{"sh", "-c",
 									`while IFS="=" read -r the_key the_val; do echo "key='$the_key'; val='$the_val'"; done`,
 								},
 								BatchReload:                  util.ToPointer(true),
 								BatchParamsFormatterTemplate: defaultBatchInputTemplate,
 							}},
-						ReloadType:      appsv1beta1.ShellType,
+						ReloadType:      parametersv1alpha1.ShellType,
 						MountPoint:      configPath,
 						ConfigSpec:      newConfigSpec(),
 						FormatterConfig: newFormatter(),
@@ -307,15 +303,15 @@ var _ = Describe("Config Handler Test", func() {
 {{ printf "%s:%s" $pKey $pValue }}
 {{- end }}`
 					configSpec := ConfigSpecInfo{
-						ReloadAction: &appsv1beta1.ReloadAction{
-							ShellTrigger: &appsv1beta1.ShellTrigger{
+						ReloadAction: &parametersv1alpha1.ReloadAction{
+							ShellTrigger: &parametersv1alpha1.ShellTrigger{
 								Command: []string{"sh", "-c",
 									`while IFS=":" read -r the_key the_val; do echo "key='$the_key'; val='$the_val'"; done`,
 								},
 								BatchReload:                  util.ToPointer(true),
 								BatchParamsFormatterTemplate: customBatchInputTemplate,
 							}},
-						ReloadType:      appsv1beta1.ShellType,
+						ReloadType:      parametersv1alpha1.ShellType,
 						MountPoint:      configPath,
 						ConfigSpec:      newConfigSpec(),
 						FormatterConfig: newFormatter(),
diff --git a/pkg/configuration/config_manager/handler_util_test.go b/pkg/configuration/config_manager/handler_util_test.go
index e567e8489..e302d86a6 100644
--- a/pkg/configuration/config_manager/handler_util_test.go
+++ b/pkg/configuration/config_manager/handler_util_test.go
@@ -33,7 +33,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
@@ -41,7 +41,7 @@ import (
 
 func TestIsSupportReload(t *testing.T) {
 	type args struct {
-		reload *appsv1beta1.ReloadAction
+		reload *parametersv1alpha1.ReloadAction
 	}
 	tests := []struct {
 		name string
@@ -56,16 +56,16 @@ func TestIsSupportReload(t *testing.T) {
 	}, {
 		name: "reload_test_with_empty_reload_options",
 		args: args{
-			reload: &appsv1beta1.ReloadAction{},
+			reload: &parametersv1alpha1.ReloadAction{},
 		},
 		want: false,
 	}, {
 		name: "reload_test_with_unix_signal",
 		args: args{
-			reload: &appsv1beta1.ReloadAction{
-				UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{
+			reload: &parametersv1alpha1.ReloadAction{
+				UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{
 					ProcessName: "test",
-					Signal:      appsv1beta1.SIGHUP,
+					Signal:      parametersv1alpha1.SIGHUP,
 				},
 			},
 		},
@@ -73,8 +73,8 @@ func TestIsSupportReload(t *testing.T) {
 	}, {
 		name: "reload_test_with_shell",
 		args: args{
-			reload: &appsv1beta1.ReloadAction{
-				ShellTrigger: &appsv1beta1.ShellTrigger{
+			reload: &parametersv1alpha1.ReloadAction{
+				ShellTrigger: &parametersv1alpha1.ShellTrigger{
 					Command: strings.Fields("pg_ctl reload"),
 				},
 			},
@@ -83,9 +83,9 @@ func TestIsSupportReload(t *testing.T) {
 	}, {
 		name: "reload_test_with_tpl_script",
 		args: args{
-			reload: &appsv1beta1.ReloadAction{
-				TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{
-					ScriptConfig: appsv1beta1.ScriptConfig{
+			reload: &parametersv1alpha1.ReloadAction{
+				TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{
+					ScriptConfig: parametersv1alpha1.ScriptConfig{
 						ScriptConfigMapRef: "cm",
 						Namespace:          "default",
 					},
@@ -96,8 +96,8 @@ func TestIsSupportReload(t *testing.T) {
 	}, {
 		name: "auto_trigger_reload_test_with_process_name",
 		args: args{
-			reload: &appsv1beta1.ReloadAction{
-				AutoTrigger: &appsv1beta1.AutoTrigger{
+			reload: &parametersv1alpha1.ReloadAction{
+				AutoTrigger: &parametersv1alpha1.AutoTrigger{
 					ProcessName: "test",
 				},
 			},
@@ -106,8 +106,8 @@ func TestIsSupportReload(t *testing.T) {
 	}, {
 		name: "auto_trigger_reload_test",
 		args: args{
-			reload: &appsv1beta1.ReloadAction{
-				AutoTrigger: &appsv1beta1.AutoTrigger{},
+			reload: &parametersv1alpha1.ReloadAction{
+				AutoTrigger: &parametersv1alpha1.AutoTrigger{},
 			},
 		},
 		want: true,
@@ -134,28 +134,34 @@ var _ = Describe("Handler Util Test", func() {
 		DeferCleanup(mockK8sCli.Finish)
 	})
 
-	mockConfigConstraint := func(ccName string, reloadOptions *appsv1beta1.ReloadAction) *appsv1beta1.ConfigConstraint {
-		return &appsv1beta1.ConfigConstraint{
+	mockParametersDef := func(ccName string, reloadOptions *parametersv1alpha1.ReloadAction) *parametersv1alpha1.ParametersDefinition {
+		return &parametersv1alpha1.ParametersDefinition{
 			ObjectMeta: metav1.ObjectMeta{
 				Name: ccName,
 			},
-			Spec: appsv1beta1.ConfigConstraintSpec{
+			Spec: parametersv1alpha1.ParametersDefinitionSpec{
+				FileName:     "test",
 				ReloadAction: reloadOptions,
-				FileFormatConfig: &appsv1beta1.FileFormatConfig{
-					Format: appsv1beta1.Properties,
-				},
 			}}
 	}
-
-	mockConfigSpec := func(ccName string) appsv1.ComponentConfigSpec {
-		return appsv1.ComponentConfigSpec{
-			ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-				Name:        "test",
-				TemplateRef: "config_template",
-				Namespace:   "default",
-				VolumeName:  "for_test",
+	mockConfigDescription := func(tplName string, format parametersv1alpha1.CfgFileFormat) []parametersv1alpha1.ComponentConfigDescription {
+		return []parametersv1alpha1.ComponentConfigDescription{
+			{
+				Name:         "test",
+				TemplateName: tplName,
+				FileFormatConfig: &parametersv1alpha1.FileFormatConfig{
+					Format: format,
+				},
 			},
-			ConfigConstraintRef: ccName,
+		}
+	}
+
+	mockConfigSpec := func(tplName string) appsv1.ComponentTemplateSpec {
+		return appsv1.ComponentTemplateSpec{
+			Name:        tplName,
+			TemplateRef: "config_template",
+			Namespace:   "default",
+			VolumeName:  "for_test",
 		}
 	}
 
@@ -167,7 +173,7 @@ var _ = Describe("Handler Util Test", func() {
 			)
 
 			type args struct {
-				reloadAction *appsv1beta1.ReloadAction
+				reloadAction *parametersv1alpha1.ReloadAction
 				cli          client.Client
 				ctx          context.Context
 			}
@@ -178,17 +184,17 @@ var _ = Describe("Handler Util Test", func() {
 			}{{
 				name: "unixSignalTest",
 				args: args{
-					reloadAction: &appsv1beta1.ReloadAction{
-						UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{
-							Signal: appsv1beta1.SIGHUP,
+					reloadAction: &parametersv1alpha1.ReloadAction{
+						UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{
+							Signal: parametersv1alpha1.SIGHUP,
 						}},
 				},
 				wantErr: false,
 			}, {
 				name: "unixSignalTest",
 				args: args{
-					reloadAction: &appsv1beta1.ReloadAction{
-						UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{
+					reloadAction: &parametersv1alpha1.ReloadAction{
+						UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{
 							Signal: "SIGNOEXIST",
 						}},
 				},
@@ -196,8 +202,8 @@ var _ = Describe("Handler Util Test", func() {
 			}, {
 				name: "shellTest",
 				args: args{
-					reloadAction: &appsv1beta1.ReloadAction{
-						ShellTrigger: &appsv1beta1.ShellTrigger{
+					reloadAction: &parametersv1alpha1.ReloadAction{
+						ShellTrigger: &parametersv1alpha1.ShellTrigger{
 							Command: nil,
 						}},
 				},
@@ -205,8 +211,8 @@ var _ = Describe("Handler Util Test", func() {
 			}, {
 				name: "shellTest",
 				args: args{
-					reloadAction: &appsv1beta1.ReloadAction{
-						ShellTrigger: &appsv1beta1.ShellTrigger{
+					reloadAction: &parametersv1alpha1.ReloadAction{
+						ShellTrigger: &parametersv1alpha1.ShellTrigger{
 							Command: strings.Fields("go"),
 						}},
 				},
@@ -214,9 +220,9 @@ var _ = Describe("Handler Util Test", func() {
 			}, {
 				name: "TPLScriptTest",
 				args: args{
-					reloadAction: &appsv1beta1.ReloadAction{
-						TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{
-							ScriptConfig: appsv1beta1.ScriptConfig{
+					reloadAction: &parametersv1alpha1.ReloadAction{
+						TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{
+							ScriptConfig: parametersv1alpha1.ScriptConfig{
 								ScriptConfigMapRef: "test",
 							},
 						}},
@@ -227,9 +233,9 @@ var _ = Describe("Handler Util Test", func() {
 			}, {
 				name: "TPLScriptTest",
 				args: args{
-					reloadAction: &appsv1beta1.ReloadAction{
-						TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{
-							ScriptConfig: appsv1beta1.ScriptConfig{
+					reloadAction: &parametersv1alpha1.ReloadAction{
+						TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{
+							ScriptConfig: parametersv1alpha1.ScriptConfig{
 								ScriptConfigMapRef: "test",
 							},
 						}},
@@ -240,8 +246,8 @@ var _ = Describe("Handler Util Test", func() {
 			}, {
 				name: "autoTriggerTest",
 				args: args{
-					reloadAction: &appsv1beta1.ReloadAction{
-						AutoTrigger: &appsv1beta1.AutoTrigger{
+					reloadAction: &parametersv1alpha1.ReloadAction{
+						AutoTrigger: &parametersv1alpha1.AutoTrigger{
 							ProcessName: "test",
 						}},
 				},
@@ -249,8 +255,8 @@ var _ = Describe("Handler Util Test", func() {
 			}, {
 				name: "autoTriggerTest",
 				args: args{
-					reloadAction: &appsv1beta1.ReloadAction{
-						AutoTrigger: &appsv1beta1.AutoTrigger{}},
+					reloadAction: &parametersv1alpha1.ReloadAction{
+						AutoTrigger: &parametersv1alpha1.AutoTrigger{}},
 				},
 				wantErr: false,
 			}}
@@ -264,34 +270,31 @@ var _ = Describe("Handler Util Test", func() {
 
 	Context("TestGetSupportReloadConfigSpecs", func() {
 		It("not support reload", func() {
-			configSpecs, err := GetSupportReloadConfigSpecs([]appsv1.ComponentConfigSpec{{
-				ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-					Name: "test",
-				}}}, nil, nil)
+			configSpecs, err := GetSupportReloadConfigSpecs([]appsv1.ComponentTemplateSpec{{
+				Name: "test",
+			}}, nil, nil)
 			Expect(err).Should(Succeed())
 			Expect(len(configSpecs)).Should(BeEquivalentTo(0))
 		})
 
-		It("not ConfigConstraint ", func() {
-			configSpecs, err := GetSupportReloadConfigSpecs([]appsv1.ComponentConfigSpec{{
-				ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-					Name:        "test",
-					TemplateRef: "config_template",
-					Namespace:   "default",
-				}}}, nil, nil)
+		It("not ComponentConfigDescription", func() {
+			configSpecs, err := GetSupportReloadConfigSpecs([]appsv1.ComponentTemplateSpec{{
+				Name:        "test",
+				TemplateRef: "config_template",
+				Namespace:   "default",
+			}}, nil, []*parametersv1alpha1.ParametersDefinition{mockParametersDef("test", nil)})
 			Expect(err).Should(Succeed())
 			Expect(len(configSpecs)).Should(BeEquivalentTo(0))
 		})
 
-		It("not support reload", func() {
+		It("not support reload for paramsDef", func() {
 			ccName := "config_constraint"
-			mockK8sCli.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult([]client.Object{
-				mockConfigConstraint(ccName, nil),
-			}), testutil.WithTimes(1)))
-
+			configtpl := mockConfigSpec(ccName)
 			configSpecs, err := GetSupportReloadConfigSpecs(
-				[]appsv1.ComponentConfigSpec{mockConfigSpec(ccName)},
-				mockK8sCli.Client(), ctx)
+				[]appsv1.ComponentTemplateSpec{configtpl},
+				mockConfigDescription(configtpl.Name, parametersv1alpha1.Ini),
+				nil,
+			)
 
 			Expect(err).Should(Succeed())
 			Expect(len(configSpecs)).Should(BeEquivalentTo(0))
@@ -299,74 +302,55 @@ var _ = Describe("Handler Util Test", func() {
 
 		It("normal test", func() {
 			ccName := "config_constraint"
-			cc := mockConfigConstraint(ccName, &appsv1beta1.ReloadAction{
-				UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{
+			pd := mockParametersDef(ccName, &parametersv1alpha1.ReloadAction{
+				UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{
 					ProcessName: "test",
-					Signal:      appsv1beta1.SIGHUP,
+					Signal:      parametersv1alpha1.SIGHUP,
 				},
 			})
-			mockK8sCli.MockGetMethod(testutil.WithGetReturned(
-				testutil.WithConstructSimpleGetResult([]client.Object{cc}),
-				testutil.WithTimes(1)))
 
+			cd := mockConfigDescription(ccName, parametersv1alpha1.Ini)
 			configSpecs, err := GetSupportReloadConfigSpecs(
-				[]appsv1.ComponentConfigSpec{mockConfigSpec(ccName)},
-				mockK8sCli.Client(), ctx)
+				[]appsv1.ComponentTemplateSpec{mockConfigSpec(ccName)},
+				cd,
+				[]*parametersv1alpha1.ParametersDefinition{pd},
+			)
 
 			Expect(err).Should(Succeed())
 			Expect(len(configSpecs)).Should(BeEquivalentTo(1))
 			Expect(configSpecs[0].ConfigSpec).Should(BeEquivalentTo(mockConfigSpec(ccName)))
-			Expect(configSpecs[0].ReloadType).Should(BeEquivalentTo(appsv1beta1.UnixSignalType))
-			Expect(configSpecs[0].FormatterConfig).Should(BeEquivalentTo(*cc.Spec.FileFormatConfig))
-		})
-
-		It("auto trigger test", func() {
-			ccName := "auto_trigger_config_constraint"
-			cc := mockConfigConstraint(ccName, &appsv1beta1.ReloadAction{
-				AutoTrigger: &appsv1beta1.AutoTrigger{
-					ProcessName: "test",
-				},
-			})
-			mockK8sCli.MockGetMethod(testutil.WithGetReturned(
-				testutil.WithConstructSimpleGetResult([]client.Object{cc}),
-				testutil.WithTimes(1)))
-
-			configSpecs, err := GetSupportReloadConfigSpecs(
-				[]appsv1.ComponentConfigSpec{mockConfigSpec(ccName)},
-				mockK8sCli.Client(), ctx)
-
-			Expect(err).Should(Succeed())
-			Expect(len(configSpecs)).Should(BeEquivalentTo(0))
+			Expect(configSpecs[0].ReloadType).Should(BeEquivalentTo(parametersv1alpha1.UnixSignalType))
+			Expect(&configSpecs[0].FormatterConfig).Should(BeEquivalentTo(cd[0].FileFormatConfig))
 		})
 	})
 
 	Context("TestFromReloadTypeConfig", func() {
 		It("TestSignalTrigger", func() {
-			Expect(appsv1beta1.UnixSignalType).Should(BeEquivalentTo(FromReloadTypeConfig(&appsv1beta1.ReloadAction{
-				UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{
+			Expect(parametersv1alpha1.UnixSignalType).Should(BeEquivalentTo(FromReloadTypeConfig(&parametersv1alpha1.ReloadAction{
+				UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{
 					ProcessName: "test",
-					Signal:      appsv1beta1.SIGHUP,
+					Signal:      parametersv1alpha1.SIGHUP,
 				}})))
 		})
 
 		It("TestAutoTrigger", func() {
-			Expect(appsv1beta1.AutoType).Should(BeEquivalentTo(FromReloadTypeConfig(&appsv1beta1.ReloadAction{
-				AutoTrigger: &appsv1beta1.AutoTrigger{
+			Expect(parametersv1alpha1.AutoType).Should(BeEquivalentTo(FromReloadTypeConfig(&parametersv1alpha1.ReloadAction{
+				AutoTrigger: &parametersv1alpha1.AutoTrigger{
 					ProcessName: "test",
 				}})))
 		})
 
 		It("TestShellTrigger", func() {
-			Expect(appsv1beta1.ShellType).Should(BeEquivalentTo(FromReloadTypeConfig(&appsv1beta1.ReloadAction{
-				ShellTrigger: &appsv1beta1.ShellTrigger{
+			Expect(parametersv1alpha1.ShellType).Should(BeEquivalentTo(FromReloadTypeConfig(&parametersv1alpha1.ReloadAction{
+				ShellTrigger: &parametersv1alpha1.ShellTrigger{
 					Command: []string{"/bin/true"},
 				}})))
 		})
 
 		It("TestTplScriptsTrigger", func() {
-			Expect(appsv1beta1.TPLScriptType).Should(BeEquivalentTo(FromReloadTypeConfig(&appsv1beta1.ReloadAction{
-				TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{
-					ScriptConfig: appsv1beta1.ScriptConfig{
+			Expect(parametersv1alpha1.TPLScriptType).Should(BeEquivalentTo(FromReloadTypeConfig(&parametersv1alpha1.ReloadAction{
+				TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{
+					ScriptConfig: parametersv1alpha1.ScriptConfig{
 						ScriptConfigMapRef: "test",
 						Namespace:          "default",
 					},
@@ -374,31 +358,31 @@ var _ = Describe("Handler Util Test", func() {
 		})
 
 		It("TestInvalidTrigger", func() {
-			Expect("").Should(BeEquivalentTo(FromReloadTypeConfig(&appsv1beta1.ReloadAction{})))
+			Expect("").Should(BeEquivalentTo(FromReloadTypeConfig(&parametersv1alpha1.ReloadAction{})))
 		})
 	})
 
 	Context("TestValidateReloadOptions", func() {
 		It("TestSignalTrigger", func() {
-			Expect(ValidateReloadOptions(&appsv1beta1.ReloadAction{
-				UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{
+			Expect(ValidateReloadOptions(&parametersv1alpha1.ReloadAction{
+				UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{
 					ProcessName: "test",
-					Signal:      appsv1beta1.SIGHUP,
+					Signal:      parametersv1alpha1.SIGHUP,
 				}}, nil, nil),
 			).Should(Succeed())
 		})
 
 		It("TestSignalTrigger", func() {
-			Expect(ValidateReloadOptions(&appsv1beta1.ReloadAction{
-				AutoTrigger: &appsv1beta1.AutoTrigger{
+			Expect(ValidateReloadOptions(&parametersv1alpha1.ReloadAction{
+				AutoTrigger: &parametersv1alpha1.AutoTrigger{
 					ProcessName: "test",
 				}}, nil, nil),
 			).Should(Succeed())
 		})
 
 		It("TestShellTrigger", func() {
-			Expect(ValidateReloadOptions(&appsv1beta1.ReloadAction{
-				ShellTrigger: &appsv1beta1.ShellTrigger{
+			Expect(ValidateReloadOptions(&parametersv1alpha1.ReloadAction{
+				ShellTrigger: &parametersv1alpha1.ShellTrigger{
 					Command: []string{"/bin/true"},
 				}}, nil, nil),
 			).Should(Succeed())
@@ -418,9 +402,9 @@ var _ = Describe("Handler Util Test", func() {
 			}), testutil.WithTimes(2)))
 
 			By("Test valid")
-			Expect(ValidateReloadOptions(&appsv1beta1.ReloadAction{
-				TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{
-					ScriptConfig: appsv1beta1.ScriptConfig{
+			Expect(ValidateReloadOptions(&parametersv1alpha1.ReloadAction{
+				TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{
+					ScriptConfig: parametersv1alpha1.ScriptConfig{
 						ScriptConfigMapRef: testName1,
 						Namespace:          ns,
 					},
@@ -428,9 +412,9 @@ var _ = Describe("Handler Util Test", func() {
 			).Should(Succeed())
 
 			By("Test invalid")
-			Expect(ValidateReloadOptions(&appsv1beta1.ReloadAction{
-				TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{
-					ScriptConfig: appsv1beta1.ScriptConfig{
+			Expect(ValidateReloadOptions(&parametersv1alpha1.ReloadAction{
+				TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{
+					ScriptConfig: parametersv1alpha1.ScriptConfig{
 						ScriptConfigMapRef: testName2,
 						Namespace:          ns,
 					},
@@ -439,20 +423,19 @@ var _ = Describe("Handler Util Test", func() {
 		})
 
 		It("TestInvalidTrigger", func() {
-			Expect(ValidateReloadOptions(&appsv1beta1.ReloadAction{}, nil, nil)).ShouldNot(Succeed())
+			Expect(ValidateReloadOptions(&parametersv1alpha1.ReloadAction{}, nil, nil)).ShouldNot(Succeed())
 		})
 	})
 })
 
 func TestFilterSubPathVolumeMount(t *testing.T) {
-	createConfigMeta := func(volumeName string, reloadType appsv1beta1.DynamicReloadType, reloadAction *appsv1beta1.ReloadAction) ConfigSpecMeta {
+	createConfigMeta := func(volumeName string, reloadType parametersv1alpha1.DynamicReloadType, reloadAction *parametersv1alpha1.ReloadAction) ConfigSpecMeta {
 		return ConfigSpecMeta{ConfigSpecInfo: ConfigSpecInfo{
 			ReloadAction: reloadAction,
 			ReloadType:   reloadType,
-			ConfigSpec: appsv1.ComponentConfigSpec{
-				ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-					VolumeName: volumeName,
-				}}}}
+			ConfigSpec: appsv1.ComponentTemplateSpec{
+				VolumeName: volumeName,
+			}}}
 	}
 
 	type args struct {
@@ -467,16 +450,16 @@ func TestFilterSubPathVolumeMount(t *testing.T) {
 		name: "test1",
 		args: args{
 			metas: []ConfigSpecMeta{
-				createConfigMeta("test1", appsv1beta1.UnixSignalType, &appsv1beta1.ReloadAction{
-					UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{},
+				createConfigMeta("test1", parametersv1alpha1.UnixSignalType, &parametersv1alpha1.ReloadAction{
+					UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{},
 				}),
-				createConfigMeta("test2", appsv1beta1.ShellType, &appsv1beta1.ReloadAction{
-					ShellTrigger: &appsv1beta1.ShellTrigger{
+				createConfigMeta("test2", parametersv1alpha1.ShellType, &parametersv1alpha1.ReloadAction{
+					ShellTrigger: &parametersv1alpha1.ShellTrigger{
 						Sync: cfgutil.ToPointer(true),
 					},
 				}),
-				createConfigMeta("test3", appsv1beta1.TPLScriptType, &appsv1beta1.ReloadAction{
-					TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{
+				createConfigMeta("test3", parametersv1alpha1.TPLScriptType, &parametersv1alpha1.ReloadAction{
+					TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{
 						Sync: cfgutil.ToPointer(true),
 					},
 				}),
@@ -488,13 +471,13 @@ func TestFilterSubPathVolumeMount(t *testing.T) {
 			},
 		},
 		want: []ConfigSpecMeta{
-			createConfigMeta("test2", appsv1beta1.ShellType, &appsv1beta1.ReloadAction{
-				ShellTrigger: &appsv1beta1.ShellTrigger{
+			createConfigMeta("test2", parametersv1alpha1.ShellType, &parametersv1alpha1.ReloadAction{
+				ShellTrigger: &parametersv1alpha1.ShellTrigger{
 					Sync: cfgutil.ToPointer(true),
 				},
 			}),
-			createConfigMeta("test3", appsv1beta1.TPLScriptType, &appsv1beta1.ReloadAction{
-				TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{
+			createConfigMeta("test3", parametersv1alpha1.TPLScriptType, &parametersv1alpha1.ReloadAction{
+				TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{
 					Sync: cfgutil.ToPointer(true),
 				},
 			}),
@@ -503,14 +486,14 @@ func TestFilterSubPathVolumeMount(t *testing.T) {
 		name: "test2",
 		args: args{
 			metas: []ConfigSpecMeta{
-				createConfigMeta("test1", appsv1beta1.UnixSignalType, &appsv1beta1.ReloadAction{
-					UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{},
+				createConfigMeta("test1", parametersv1alpha1.UnixSignalType, &parametersv1alpha1.ReloadAction{
+					UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{},
 				}),
-				createConfigMeta("test2", appsv1beta1.ShellType, &appsv1beta1.ReloadAction{
-					ShellTrigger: &appsv1beta1.ShellTrigger{},
+				createConfigMeta("test2", parametersv1alpha1.ShellType, &parametersv1alpha1.ReloadAction{
+					ShellTrigger: &parametersv1alpha1.ShellTrigger{},
 				}),
-				createConfigMeta("test3", appsv1beta1.TPLScriptType, &appsv1beta1.ReloadAction{
-					TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{},
+				createConfigMeta("test3", parametersv1alpha1.TPLScriptType, &parametersv1alpha1.ReloadAction{
+					TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{},
 				}),
 			},
 			volumes: []corev1.VolumeMount{
@@ -520,57 +503,57 @@ func TestFilterSubPathVolumeMount(t *testing.T) {
 			},
 		},
 		want: []ConfigSpecMeta{
-			createConfigMeta("test1", appsv1beta1.UnixSignalType, &appsv1beta1.ReloadAction{
-				UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{},
+			createConfigMeta("test1", parametersv1alpha1.UnixSignalType, &parametersv1alpha1.ReloadAction{
+				UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{},
 			}),
-			createConfigMeta("test2", appsv1beta1.ShellType, &appsv1beta1.ReloadAction{
-				ShellTrigger: &appsv1beta1.ShellTrigger{},
+			createConfigMeta("test2", parametersv1alpha1.ShellType, &parametersv1alpha1.ReloadAction{
+				ShellTrigger: &parametersv1alpha1.ShellTrigger{},
 			}),
-			createConfigMeta("test3", appsv1beta1.TPLScriptType, &appsv1beta1.ReloadAction{
-				TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{},
+			createConfigMeta("test3", parametersv1alpha1.TPLScriptType, &parametersv1alpha1.ReloadAction{
+				TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{},
 			}),
 		},
 	}, {
 		name: "test3",
 		args: args{
 			metas: []ConfigSpecMeta{
-				createConfigMeta("test1", appsv1beta1.UnixSignalType, &appsv1beta1.ReloadAction{
-					UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{},
+				createConfigMeta("test1", parametersv1alpha1.UnixSignalType, &parametersv1alpha1.ReloadAction{
+					UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{},
 				}),
-				createConfigMeta("test2", appsv1beta1.ShellType, &appsv1beta1.ReloadAction{
-					ShellTrigger: &appsv1beta1.ShellTrigger{},
+				createConfigMeta("test2", parametersv1alpha1.ShellType, &parametersv1alpha1.ReloadAction{
+					ShellTrigger: &parametersv1alpha1.ShellTrigger{},
 				}),
-				createConfigMeta("test3", appsv1beta1.TPLScriptType, &appsv1beta1.ReloadAction{
-					TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{},
+				createConfigMeta("test3", parametersv1alpha1.TPLScriptType, &parametersv1alpha1.ReloadAction{
+					TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{},
 				}),
 			},
 			volumes: []corev1.VolumeMount{},
 		},
 		want: []ConfigSpecMeta{
-			createConfigMeta("test1", appsv1beta1.UnixSignalType, &appsv1beta1.ReloadAction{
-				UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{},
+			createConfigMeta("test1", parametersv1alpha1.UnixSignalType, &parametersv1alpha1.ReloadAction{
+				UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{},
 			}),
-			createConfigMeta("test2", appsv1beta1.ShellType, &appsv1beta1.ReloadAction{
-				ShellTrigger: &appsv1beta1.ShellTrigger{},
+			createConfigMeta("test2", parametersv1alpha1.ShellType, &parametersv1alpha1.ReloadAction{
+				ShellTrigger: &parametersv1alpha1.ShellTrigger{},
 			}),
-			createConfigMeta("test3", appsv1beta1.TPLScriptType, &appsv1beta1.ReloadAction{
-				TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{},
+			createConfigMeta("test3", parametersv1alpha1.TPLScriptType, &parametersv1alpha1.ReloadAction{
+				TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{},
 			}),
 		},
 	}, {
 		name: "test4",
 		args: args{
 			metas: []ConfigSpecMeta{
-				createConfigMeta("test1", appsv1beta1.UnixSignalType, &appsv1beta1.ReloadAction{
-					UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{},
+				createConfigMeta("test1", parametersv1alpha1.UnixSignalType, &parametersv1alpha1.ReloadAction{
+					UnixSignalTrigger: &parametersv1alpha1.UnixSignalTrigger{},
 				}),
-				createConfigMeta("test2", appsv1beta1.ShellType, &appsv1beta1.ReloadAction{
-					ShellTrigger: &appsv1beta1.ShellTrigger{
+				createConfigMeta("test2", parametersv1alpha1.ShellType, &parametersv1alpha1.ReloadAction{
+					ShellTrigger: &parametersv1alpha1.ShellTrigger{
 						Sync: cfgutil.ToPointer(false),
 					},
 				}),
-				createConfigMeta("test3", appsv1beta1.TPLScriptType, &appsv1beta1.ReloadAction{
-					TPLScriptTrigger: &appsv1beta1.TPLScriptTrigger{
+				createConfigMeta("test3", parametersv1alpha1.TPLScriptType, &parametersv1alpha1.ReloadAction{
+					TPLScriptTrigger: &parametersv1alpha1.TPLScriptTrigger{
 						Sync: cfgutil.ToPointer(false),
 					},
 				}),
diff --git a/pkg/configuration/config_manager/reload_util_test.go b/pkg/configuration/config_manager/reload_util_test.go
index dd198c7da..bfa87185e 100644
--- a/pkg/configuration/config_manager/reload_util_test.go
+++ b/pkg/configuration/config_manager/reload_util_test.go
@@ -38,7 +38,7 @@ import (
 	"go.uber.org/zap"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/gotemplate"
 	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
 )
@@ -53,7 +53,7 @@ func TestCreateUpdatedParamsPatch(t *testing.T) {
 	type args struct {
 		newVersion string
 		oldVersion string
-		formatCfg  *appsv1beta1.FileFormatConfig
+		formatCfg  *parametersv1alpha1.FileFormatConfig
 	}
 	tests := []struct {
 		name    string
@@ -65,9 +65,9 @@ func TestCreateUpdatedParamsPatch(t *testing.T) {
 		args: args{
 			newVersion: filepath.Join(rootPath, "currentVersion"),
 			oldVersion: filepath.Join(rootPath, "lastVersion"),
-			formatCfg: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Ini,
-				FormatterAction: appsv1beta1.FormatterAction{IniConfig: &appsv1beta1.IniConfig{
+			formatCfg: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.Ini,
+				FormatterAction: parametersv1alpha1.FormatterAction{IniConfig: &parametersv1alpha1.IniConfig{
 					SectionName: "mysqld",
 				}},
 			}},
@@ -139,7 +139,7 @@ func TestOnlineUpdateParamsHandle(t *testing.T) {
 
 	type args struct {
 		tplScriptPath string
-		formatConfig  *appsv1beta1.FileFormatConfig
+		formatConfig  *parametersv1alpha1.FileFormatConfig
 		dataType      string
 		dsn           string
 	}
@@ -152,8 +152,8 @@ func TestOnlineUpdateParamsHandle(t *testing.T) {
 		name: "online_update_params_handle_test",
 		args: args{
 			tplScriptPath: filepath.Join(tmpTestData, partroniPath),
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Properties,
+			formatConfig: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.Properties,
 			},
 			dsn:      server.URL,
 			dataType: "patroni",
@@ -238,13 +238,13 @@ var _ = Describe("ReloadUtil Test", func() {
 	AfterEach(func() {
 	})
 
-	createIniFormatter := func(sectionName string) *appsv1beta1.FileFormatConfig {
-		return &appsv1beta1.FileFormatConfig{
-			FormatterAction: appsv1beta1.FormatterAction{
-				IniConfig: &appsv1beta1.IniConfig{
+	createIniFormatter := func(sectionName string) *parametersv1alpha1.FileFormatConfig {
+		return &parametersv1alpha1.FileFormatConfig{
+			FormatterAction: parametersv1alpha1.FormatterAction{
+				IniConfig: &parametersv1alpha1.IniConfig{
 					SectionName: sectionName,
 				}},
-			Format: appsv1beta1.Ini,
+			Format: parametersv1alpha1.Ini,
 		}
 	}
 
@@ -335,11 +335,10 @@ var _ = Describe("ReloadUtil Test", func() {
 				name: "test2",
 				args: []ConfigSpecMeta{{
 					ConfigSpecInfo: ConfigSpecInfo{
-						ConfigSpec: appsv1.ComponentConfigSpec{
-							ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-								Name:        "test",
-								TemplateRef: "test_cm",
-							}},
+						ConfigSpec: appsv1.ComponentTemplateSpec{
+							Name:        "test",
+							TemplateRef: "test_cm",
+						},
 					}},
 				},
 				want: false,
@@ -347,50 +346,38 @@ var _ = Describe("ReloadUtil Test", func() {
 				name: "test3",
 				args: []ConfigSpecMeta{{
 					ConfigSpecInfo: ConfigSpecInfo{
-						ConfigSpec: appsv1.ComponentConfigSpec{
-							ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-								Name:        "test",
-								TemplateRef: "test_cm",
-							},
-							ConfigConstraintRef: "cc2",
+						ConfigSpec: appsv1.ComponentTemplateSpec{
+							Name:        "test",
+							TemplateRef: "test_cm",
 						},
-						ReloadType: appsv1beta1.ShellType,
+						ReloadType: parametersv1alpha1.ShellType,
 					},
 				}, {
 					ConfigSpecInfo: ConfigSpecInfo{
-						ConfigSpec: appsv1.ComponentConfigSpec{
-							ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-								Name:        "test2",
-								TemplateRef: "test_cm",
-							},
-							ConfigConstraintRef: "cc3",
+						ConfigSpec: appsv1.ComponentTemplateSpec{
+							Name:        "test2",
+							TemplateRef: "test_cm",
 						},
-						ReloadType: appsv1beta1.TPLScriptType,
+						ReloadType: parametersv1alpha1.TPLScriptType,
 					}}},
 				want: false,
 			}, {
 				name: "test4",
 				args: []ConfigSpecMeta{{
 					ConfigSpecInfo: ConfigSpecInfo{
-						ConfigSpec: appsv1.ComponentConfigSpec{
-							ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-								Name:        "test",
-								TemplateRef: "test_cm",
-							},
-							ConfigConstraintRef: "cc1",
+						ConfigSpec: appsv1.ComponentTemplateSpec{
+							Name:        "test",
+							TemplateRef: "test_cm",
 						},
-						ReloadType: appsv1beta1.UnixSignalType,
+						ReloadType: parametersv1alpha1.UnixSignalType,
 					},
 				}, {
 					ConfigSpecInfo: ConfigSpecInfo{
-						ConfigSpec: appsv1.ComponentConfigSpec{
-							ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-								Name:        "test2",
-								TemplateRef: "test_cm",
-							},
-							ConfigConstraintRef: "cc3",
+						ConfigSpec: appsv1.ComponentTemplateSpec{
+							Name:        "test2",
+							TemplateRef: "test_cm",
 						},
-						ReloadType: appsv1beta1.TPLScriptType,
+						ReloadType: parametersv1alpha1.TPLScriptType,
 					}}},
 				want: true,
 			}}
diff --git a/pkg/configuration/core/config_patch_test.go b/pkg/configuration/core/config_patch_test.go
index cd8e9fdeb..bccc57b09 100644
--- a/pkg/configuration/core/config_patch_test.go
+++ b/pkg/configuration/core/config_patch_test.go
@@ -29,7 +29,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log"
 	"sigs.k8s.io/yaml"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 )
 
@@ -38,7 +38,7 @@ func TestConfigPatch(t *testing.T) {
 	cfg, err := NewConfigLoader(CfgOption{
 		Type:    CfgRawType,
 		Log:     log.FromContext(context.Background()),
-		CfgType: appsv1beta1.Ini,
+		CfgType: parametersv1alpha1.Ini,
 		RawData: []byte(iniConfig),
 	})
 
@@ -114,7 +114,7 @@ net:
 
 	patchOption := CfgOption{
 		Type:    CfgTplType,
-		CfgType: appsv1beta1.YAML,
+		CfgType: parametersv1alpha1.YAML,
 	}
 	patch, err := CreateMergePatch(&ConfigResource{ConfigData: map[string]string{"test": ""}}, &ConfigResource{ConfigData: map[string]string{"test": yamlContext}}, patchOption)
 	require.Nil(t, err)
@@ -131,7 +131,11 @@ func TestTransformConfigPatchFromData(t *testing.T) {
 	testData := "[mysqld]\nmax_connections = 2000\ngeneral_log = OFF"
 
 	t.Run("testConfigPatch", func(t *testing.T) {
-		got, err := TransformConfigPatchFromData(map[string]string{configFile: testData}, appsv1beta1.Ini, nil)
+		got, err := TransformConfigPatchFromData(map[string]string{configFile: testData}, parametersv1alpha1.ParamConfigRendererSpec{
+			Configs: []parametersv1alpha1.ComponentConfigDescription{{
+				Name:             "my.cnf",
+				FileFormatConfig: &parametersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.Ini},
+			}}})
 		require.Nil(t, err)
 		require.True(t, got.IsModify)
 		require.NotNil(t, got.UpdateConfig[configFile])
diff --git a/pkg/configuration/core/config_patch_util_test.go b/pkg/configuration/core/config_patch_util_test.go
index 331f8a9a2..eeb492852 100644
--- a/pkg/configuration/core/config_patch_util_test.go
+++ b/pkg/configuration/core/config_patch_util_test.go
@@ -20,10 +20,10 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package core
 
 import (
-	"reflect"
+	"slices"
 	"testing"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/test/testdata"
 )
 
@@ -196,7 +196,7 @@ max_connections=666
 	type args struct {
 		oldVersion        map[string]string
 		newVersion        map[string]string
-		format            appsv1beta1.CfgFileFormat
+		format            parametersv1alpha1.CfgFileFormat
 		keys              []string
 		enableExcludeDiff bool
 	}
@@ -215,7 +215,7 @@ max_connections=666
 			newVersion: map[string]string{
 				"my.cnf": v2,
 			},
-			format:            appsv1beta1.Ini,
+			format:            parametersv1alpha1.Ini,
 			enableExcludeDiff: true,
 		},
 		want:        &ConfigPatchInfo{IsModify: true},
@@ -231,7 +231,7 @@ max_connections=666
 				"my.cnf":    v2,
 				"other.cnf": "context",
 			},
-			format:            appsv1beta1.Ini,
+			format:            parametersv1alpha1.Ini,
 			enableExcludeDiff: true,
 		},
 		want:        &ConfigPatchInfo{IsModify: true},
@@ -249,7 +249,7 @@ max_connections=666
 				"other.cnf": "context",
 			},
 			keys:              []string{"my.cnf"},
-			format:            appsv1beta1.Ini,
+			format:            parametersv1alpha1.Ini,
 			enableExcludeDiff: true,
 		},
 		want:        &ConfigPatchInfo{IsModify: true},
@@ -266,7 +266,7 @@ max_connections=666
 				"other.cnf": "context difference",
 			},
 			keys:              []string{"my.cnf"},
-			format:            appsv1beta1.Ini,
+			format:            parametersv1alpha1.Ini,
 			enableExcludeDiff: true,
 		},
 		want:        &ConfigPatchInfo{IsModify: false},
@@ -283,7 +283,7 @@ max_connections=666
 				"other.cnf": "context difference",
 			},
 			keys:              []string{"my.cnf"},
-			format:            appsv1beta1.Ini,
+			format:            parametersv1alpha1.Ini,
 			enableExcludeDiff: false,
 		},
 		want:        &ConfigPatchInfo{IsModify: true},
@@ -291,7 +291,19 @@ max_connections=666
 	}}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got, excludeDiff, err := CreateConfigPatch(tt.args.oldVersion, tt.args.newVersion, tt.args.format, tt.args.keys, tt.args.enableExcludeDiff)
+			var configs []parametersv1alpha1.ComponentConfigDescription
+			for k := range tt.args.oldVersion {
+				if len(tt.args.keys) == 0 || slices.Contains(tt.args.keys, k) {
+					configs = append(configs, parametersv1alpha1.ComponentConfigDescription{
+						Name: k,
+						FileFormatConfig: &parametersv1alpha1.FileFormatConfig{
+							Format: tt.args.format,
+						},
+					})
+				}
+			}
+			configRender := parametersv1alpha1.ParamConfigRendererSpec{Configs: configs}
+			got, excludeDiff, err := CreateConfigPatch(tt.args.oldVersion, tt.args.newVersion, configRender, tt.args.enableExcludeDiff)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("CreateConfigPatch() error = %v, wantErr %v", err, tt.wantErr)
 				return
@@ -314,7 +326,7 @@ func TestLoadRawConfigObject(t *testing.T) {
 
 	type args struct {
 		data         map[string]string
-		formatConfig *appsv1beta1.FileFormatConfig
+		formatConfig *parametersv1alpha1.FileFormatConfig
 		keys         []string
 	}
 	tests := []struct {
@@ -325,10 +337,10 @@ func TestLoadRawConfigObject(t *testing.T) {
 		name: "test",
 		args: args{
 			data: map[string]string{"key": getFileContentFn("cue_testdata/mysql.cnf")},
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Ini,
-				FormatterAction: appsv1beta1.FormatterAction{
-					IniConfig: &appsv1beta1.IniConfig{
+			formatConfig: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.Ini,
+				FormatterAction: parametersv1alpha1.FormatterAction{
+					IniConfig: &parametersv1alpha1.IniConfig{
 						SectionName: "mysqld",
 					}},
 			}},
@@ -337,8 +349,8 @@ func TestLoadRawConfigObject(t *testing.T) {
 		name: "test",
 		args: args{
 			data: map[string]string{"key": getFileContentFn("cue_testdata/pg14.conf")},
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Properties,
+			formatConfig: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.Properties,
 			}},
 		wantErr: false,
 	}, {
@@ -349,8 +361,8 @@ func TestLoadRawConfigObject(t *testing.T) {
 				"key2": getFileContentFn("cue_testdata/mysql.cnf"),
 			},
 			keys: []string{"key"},
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Properties,
+			formatConfig: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.Properties,
 			}},
 		wantErr: false,
 	}, {
@@ -360,8 +372,8 @@ func TestLoadRawConfigObject(t *testing.T) {
 				"key": getFileContentFn("cue_testdata/pg14.conf"),
 			},
 			keys: []string{"key"},
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.XML,
+			formatConfig: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.XML,
 			}},
 		wantErr: true,
 	}}
@@ -376,65 +388,65 @@ func TestLoadRawConfigObject(t *testing.T) {
 	}
 }
 
-func TestTransformConfigFileToKeyValueMap(t *testing.T) {
-	mysqlConfig := `
-[mysqld]
-key_buffer_size=16777216
-log_error=/data/mysql/logs/mysql.log
-`
-	mongodbConfig := `
-systemLog:
-  logRotate: reopen
-  path: /data/mongodb/logs/mongodb.log
-  verbosity: 0
-`
-	tests := []struct {
-		name         string
-		fileName     string
-		formatConfig *appsv1beta1.FileFormatConfig
-		configData   []byte
-		expected     map[string]string
-	}{{
-		name:     "mysql-test",
-		fileName: "my.cnf",
-		formatConfig: &appsv1beta1.FileFormatConfig{
-			Format: appsv1beta1.Ini,
-			FormatterAction: appsv1beta1.FormatterAction{
-				IniConfig: &appsv1beta1.IniConfig{
-					SectionName: "mysqld",
-				},
-			},
-		},
-		configData: []byte(mysqlConfig),
-		expected: map[string]string{
-			"key_buffer_size": "16777216",
-			"log_error":       "/data/mysql/logs/mysql.log",
-		},
-	}, {
-		name:     "mongodb-test",
-		fileName: "mongodb.conf",
-		formatConfig: &appsv1beta1.FileFormatConfig{
-			Format: appsv1beta1.YAML,
-			FormatterAction: appsv1beta1.FormatterAction{
-				IniConfig: &appsv1beta1.IniConfig{
-					SectionName: "default",
-				},
-			},
-		},
-		configData: []byte(mongodbConfig),
-		expected: map[string]string{
-			"systemLog.logRotate": "reopen",
-			"systemLog.path":      "/data/mongodb/logs/mongodb.log",
-			"systemLog.verbosity": "0",
-		},
-	}}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			res, _ := TransformConfigFileToKeyValueMap(tt.fileName, tt.formatConfig, tt.configData)
-			if !reflect.DeepEqual(res, tt.expected) {
-				t.Errorf("TransformConfigFileToKeyValueMap() res = %v, res %v", res, tt.expected)
-				return
-			}
-		})
-	}
-}
+// func TestTransformConfigFileToKeyValueMap(t *testing.T) {
+// 	mysqlConfig := `
+// [mysqld]
+// key_buffer_size=16777216
+// log_error=/data/mysql/logs/mysql.log
+// `
+// 	mongodbConfig := `
+// systemLog:
+//   logRotate: reopen
+//   path: /data/mongodb/logs/mongodb.log
+//   verbosity: 0
+// `
+// 	tests := []struct {
+// 		name         string
+// 		fileName     string
+// 		formatConfig *parametersv1alpha1.FileFormatConfig
+// 		configData   []byte
+// 		expected     map[string]string
+// 	}{{
+// 		name:     "mysql-test",
+// 		fileName: "my.cnf",
+// 		formatConfig: &parametersv1alpha1.FileFormatConfig{
+// 			Format: parametersv1alpha1.Ini,
+// 			FormatterAction: parametersv1alpha1.FormatterAction{
+// 				IniConfig: &parametersv1alpha1.IniConfig{
+// 					SectionName: "mysqld",
+// 				},
+// 			},
+// 		},
+// 		configData: []byte(mysqlConfig),
+// 		expected: map[string]string{
+// 			"key_buffer_size": "16777216",
+// 			"log_error":       "/data/mysql/logs/mysql.log",
+// 		},
+// 	}, {
+// 		name:     "mongodb-test",
+// 		fileName: "mongodb.conf",
+// 		formatConfig: &parametersv1alpha1.FileFormatConfig{
+// 			Format: parametersv1alpha1.YAML,
+// 			FormatterAction: parametersv1alpha1.FormatterAction{
+// 				IniConfig: &parametersv1alpha1.IniConfig{
+// 					SectionName: "default",
+// 				},
+// 			},
+// 		},
+// 		configData: []byte(mongodbConfig),
+// 		expected: map[string]string{
+// 			"systemLog.logRotate": "reopen",
+// 			"systemLog.path":      "/data/mongodb/logs/mongodb.log",
+// 			"systemLog.verbosity": "0",
+// 		},
+// 	}}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			res, _ := TransformConfigFileToKeyValueMap(tt.fileName, tt.formatConfig, tt.configData)
+// 			if !reflect.DeepEqual(res, tt.expected) {
+// 				t.Errorf("TransformConfigFileToKeyValueMap() res = %v, res %v", res, tt.expected)
+// 				return
+// 			}
+// 		})
+// 	}
+// }
diff --git a/pkg/configuration/core/config_test.go b/pkg/configuration/core/config_test.go
index 044f1fb6d..fa045d092 100644
--- a/pkg/configuration/core/config_test.go
+++ b/pkg/configuration/core/config_test.go
@@ -27,13 +27,12 @@ import (
 	"strings"
 	"testing"
 
-	"github.com/StudioSol/set"
 	"github.com/bhmj/jsonslice"
 	"github.com/stretchr/testify/require"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 	"sigs.k8s.io/controller-runtime/pkg/log"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 )
 
@@ -73,7 +72,7 @@ func TestConfigMapConfig(t *testing.T) {
 	cfg, err := NewConfigLoader(CfgOption{
 		Type:    CfgCmType,
 		Log:     log.FromContext(context.Background()),
-		CfgType: appsv1beta1.Ini,
+		CfgType: parametersv1alpha1.Ini,
 		ConfigResource: &ConfigResource{
 			CfgKey: client.ObjectKey{
 				Name:      "xxxx",    // set cm name
@@ -154,8 +153,7 @@ func TestConfigMapConfig(t *testing.T) {
 func TestGenerateVisualizedParamsList(t *testing.T) {
 	type args struct {
 		configPatch  *ConfigPatchInfo
-		formatConfig *appsv1beta1.FileFormatConfig
-		sets         *set.LinkedHashSetString
+		formatConfig *parametersv1alpha1.FileFormatConfig
 	}
 
 	var (
@@ -205,9 +203,9 @@ func TestGenerateVisualizedParamsList(t *testing.T) {
 			configPatch: &ConfigPatchInfo{
 				IsModify:     true,
 				UpdateConfig: map[string][]byte{"key": testUpdatedParams}},
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Ini,
-				FormatterAction: appsv1beta1.FormatterAction{IniConfig: &appsv1beta1.IniConfig{
+			formatConfig: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.Ini,
+				FormatterAction: parametersv1alpha1.FormatterAction{IniConfig: &parametersv1alpha1.IniConfig{
 					SectionName: "mysqld",
 				}},
 			},
@@ -234,9 +232,9 @@ func TestGenerateVisualizedParamsList(t *testing.T) {
 				IsModify:  true,
 				AddConfig: map[string]interface{}{"key": testJSON},
 			},
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Ini,
-				FormatterAction: appsv1beta1.FormatterAction{IniConfig: &appsv1beta1.IniConfig{
+			formatConfig: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.Ini,
+				FormatterAction: parametersv1alpha1.FormatterAction{IniConfig: &parametersv1alpha1.IniConfig{
 					SectionName: "mysqld",
 				}},
 			},
@@ -260,9 +258,9 @@ func TestGenerateVisualizedParamsList(t *testing.T) {
 				IsModify:     true,
 				DeleteConfig: map[string]interface{}{"key": testJSON},
 			},
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Ini,
-				FormatterAction: appsv1beta1.FormatterAction{IniConfig: &appsv1beta1.IniConfig{
+			formatConfig: &parametersv1alpha1.FileFormatConfig{
+				Format: parametersv1alpha1.Ini,
+				FormatterAction: parametersv1alpha1.FormatterAction{IniConfig: &parametersv1alpha1.IniConfig{
 					SectionName: "mysqld",
 				}},
 			},
@@ -282,7 +280,7 @@ func TestGenerateVisualizedParamsList(t *testing.T) {
 	}}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			got := GenerateVisualizedParamsList(tt.args.configPatch, tt.args.formatConfig, tt.args.sets)
+			got := GenerateVisualizedParamsList(tt.args.configPatch, ToV1ConfigDescription(resolveKey(tt.args.configPatch), tt.args.formatConfig))
 			sortParams(got)
 			sortParams(tt.want)
 			require.Equal(t, got, tt.want)
@@ -290,6 +288,20 @@ func TestGenerateVisualizedParamsList(t *testing.T) {
 	}
 }
 
+func resolveKey(patch *ConfigPatchInfo) []string {
+	var keys []string
+	if len(patch.AddConfig) != 0 {
+		keys = append(keys, util.ToSet(patch.AddConfig).AsSlice()...)
+	}
+	if len(patch.UpdateConfig) != 0 {
+		keys = append(keys, util.ToSet(patch.UpdateConfig).AsSlice()...)
+	}
+	if len(patch.DeleteConfig) != 0 {
+		keys = append(keys, util.ToSet(patch.DeleteConfig).AsSlice()...)
+	}
+	return keys
+}
+
 func sortParams(param []VisualizedParam) {
 	for _, v := range param {
 		sort.SliceStable(v.Parameters, func(i, j int) bool {
diff --git a/pkg/configuration/core/config_util_test.go b/pkg/configuration/core/config_util_test.go
index 88f35fafd..26fae266d 100644
--- a/pkg/configuration/core/config_util_test.go
+++ b/pkg/configuration/core/config_util_test.go
@@ -19,333 +19,333 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 package core
 
-import (
-	"reflect"
-	"strings"
-	"testing"
-
-	. "github.com/onsi/ginkgo/v2"
-	. "github.com/onsi/gomega"
-
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
-	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
-)
-
-var _ = Describe("config_util", func() {
-
-	var k8sMockClient *testutil.K8sClientMockHelper
-
-	BeforeEach(func() {
-		// Add any setup steps that needs to be executed before each test
-		k8sMockClient = testutil.NewK8sMockClient()
-	})
-
-	AfterEach(func() {
-		// Add any teardown steps that needs to be executed after each test
-		k8sMockClient.Finish()
-	})
-
-	Context("common funcs test", func() {
-		It("GetReloadOptions Should success without error", func() {
-			mockTpl := appsv1beta1.ConfigConstraint{
-				Spec: appsv1beta1.ConfigConstraintSpec{
-					ReloadAction: &appsv1beta1.ReloadAction{
-						UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{
-							Signal:      "HUB",
-							ProcessName: "for_test",
-						},
-					},
-				},
-			}
-			tests := []struct {
-				name    string
-				tpls    []appsv1.ComponentConfigSpec
-				want    *appsv1beta1.ReloadAction
-				wantErr bool
-			}{{
-				// empty config templates
-				name:    "test",
-				tpls:    nil,
-				want:    nil,
-				wantErr: false,
-			}, {
-				// empty config templates
-				name:    "test",
-				tpls:    []appsv1.ComponentConfigSpec{},
-				want:    nil,
-				wantErr: false,
-			}, {
-				// config templates without configConstraintObj
-				name: "test",
-				tpls: []appsv1.ComponentConfigSpec{{
-					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-						Name: "for_test",
-					},
-				}, {
-					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-						Name: "for_test2",
-					},
-				}},
-				want:    nil,
-				wantErr: false,
-			}, {
-				// normal
-				name: "test",
-				tpls: []appsv1.ComponentConfigSpec{{
-					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-						Name: "for_test",
-					},
-					ConfigConstraintRef: "eg_v1",
-				}},
-				want:    mockTpl.Spec.ReloadAction,
-				wantErr: false,
-			}, {
-				// not exist config constraint
-				name: "test",
-				tpls: []appsv1.ComponentConfigSpec{{
-					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-						Name: "for_test",
-					},
-					ConfigConstraintRef: "not_exist",
-				}},
-				want:    nil,
-				wantErr: true,
-			}}
-
-			k8sMockClient.MockGetMethod(testutil.WithGetReturned(func(key client.ObjectKey, obj client.Object) error {
-				if strings.Contains(key.Name, "not_exist") {
-					return MakeError("not exist config!")
-				}
-				testutil.SetGetReturnedObject(obj, &mockTpl)
-				return nil
-			}, testutil.WithMaxTimes(len(tests))))
-
-			for _, tt := range tests {
-				got, _, err := GetReloadOptions(k8sMockClient.Client(), ctx, tt.tpls)
-				Expect(err != nil).Should(BeEquivalentTo(tt.wantErr))
-				Expect(reflect.DeepEqual(got, tt.want)).Should(BeTrue())
-			}
-		})
-	})
-
-})
-
-func TestMergeUpdatedConfig(t *testing.T) {
-	type args struct {
-		baseMap    map[string]string
-		updatedMap map[string]string
-	}
-	tests := []struct {
-		name string
-		args args
-		want map[string]string
-	}{{
-		name: "normal_test",
-		args: args{
-			baseMap: map[string]string{
-				"key1": "context1",
-				"key2": "context2",
-				"key3": "context3",
-			},
-			updatedMap: map[string]string{
-				"key2": "new context",
-			},
-		},
-		want: map[string]string{
-			"key1": "context1",
-			"key2": "new context",
-			"key3": "context3",
-		},
-	}, {
-		name: "not_expected_update_test",
-		args: args{
-			baseMap: map[string]string{
-				"key1": "context1",
-				"key2": "context2",
-				"key3": "context3",
-			},
-			updatedMap: map[string]string{
-				"key6": "context6",
-			},
-		},
-		want: map[string]string{
-			"key1": "context1",
-			"key2": "context2",
-			"key3": "context3",
-		},
-	}}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if got := MergeUpdatedConfig(tt.args.baseMap, tt.args.updatedMap); !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("MergeUpdatedConfig() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
-
-func TestApplyConfigPatch(t *testing.T) {
-	type args struct {
-		baseCfg           []byte
-		updatedParameters map[string]string
-		formatConfig      *appsv1beta1.FileFormatConfig
-	}
-	tests := []struct {
-		name    string
-		args    args
-		want    string
-		wantErr bool
-	}{{
-		name: "normal_test",
-		args: args{
-			baseCfg: []byte(`[test]
-test=test`),
-			updatedParameters: map[string]string{
-				"a":               "b",
-				"max_connections": "600",
-			},
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Ini,
-				FormatterAction: appsv1beta1.FormatterAction{
-					IniConfig: &appsv1beta1.IniConfig{
-						SectionName: "test",
-					}}},
-		},
-		want: `[test]
-a=b
-max_connections=600
-test=test
-`,
-		wantErr: false,
-	}, {
-		name: "normal_test",
-		args: args{
-			baseCfg: []byte(` `),
-			updatedParameters: map[string]string{
-				"a": "b",
-				"c": "d e f g",
-			},
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.RedisCfg,
-			},
-		},
-		want:    "a b\nc d e f g",
-		wantErr: false,
-	}, {
-		name: "badcase_test",
-		args: args{
-			baseCfg: []byte(` `),
-			updatedParameters: map[string]string{
-				"ENABLE_MODULES":     "true",
-				"HUGGINGFACE_APIKEY": "kssdlsdjskwssl",
-			},
-			formatConfig: &appsv1beta1.FileFormatConfig{
-				Format: appsv1beta1.Dotenv,
-			},
-		},
-		// fix begin
-		// ENABLE_MODULES=0x1400004f130
-		// HUGGINGFACE_APIKEY=0x1400004f140
-		want:    "ENABLE_MODULES=true\nHUGGINGFACE_APIKEY=kssdlsdjskwssl\n",
-		wantErr: false,
-	}}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			got, err := ApplyConfigPatch(tt.args.baseCfg, FromStringPointerMap(tt.args.updatedParameters), tt.args.formatConfig)
-			if (err != nil) != tt.wantErr {
-				t.Errorf("ApplyConfigPatch() error = %v, wantErr %v", err, tt.wantErr)
-				return
-			}
-			if got != tt.want {
-				t.Errorf("ApplyConfigPatch() got = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
-
-func TestFromValueToString(t *testing.T) {
-	type args struct {
-		val interface{}
-	}
-	tests := []struct {
-		name string
-		args args
-		want string
-	}{{
-		name: "test",
-		args: args{
-			val: "testTest",
-		},
-		want: "testTest",
-	}, {
-		name: "test",
-		args: args{
-			val: "",
-		},
-		want: "",
-	}, {
-		name: "test",
-		args: args{
-			val: nil,
-		},
-		want: "",
-	}, {
-		name: "test",
-		args: args{
-			val: "/abdet/sds",
-		},
-		want: "",
-	}, {
-		name: "test",
-		args: args{
-			val: "abdet/sds-",
-		},
-		want: "",
-	}, {
-		name: "test",
-		args: args{
-			val: "abcdASls-sda_102.382",
-		},
-		want: "abcdASls-sda_102.382",
-	}}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if got := FromValueToString(tt.args.val); got != tt.want {
-				t.Errorf("FromValueToString() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
-
-func TestFromStringMap(t *testing.T) {
-	type args struct {
-		m map[string]*string
-	}
-	tests := []struct {
-		name string
-		args args
-		want map[string]interface{}
-	}{{
-		name: "test",
-		args: args{
-			m: map[string]*string{
-				"abcd":       cfgutil.ToPointer("test"),
-				"null_field": nil,
-			},
-		},
-		want: map[string]interface{}{
-			"abcd":       "test",
-			"null_field": nil,
-		},
-	}}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if got := FromStringMap(tt.args.m); !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("FromStringMap() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
+// import (
+// 	"reflect"
+// 	"strings"
+// 	"testing"
+//
+// 	. "github.com/onsi/ginkgo/v2"
+// 	. "github.com/onsi/gomega"
+//
+// 	"sigs.k8s.io/controller-runtime/pkg/client"
+//
+// 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
+// 	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+// 	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
+// 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
+// )
+//
+// var _ = Describe("config_util", func() {
+//
+// 	var k8sMockClient *testutil.K8sClientMockHelper
+//
+// 	BeforeEach(func() {
+// 		// Add any setup steps that needs to be executed before each test
+// 		k8sMockClient = testutil.NewK8sMockClient()
+// 	})
+//
+// 	AfterEach(func() {
+// 		// Add any teardown steps that needs to be executed after each test
+// 		k8sMockClient.Finish()
+// 	})
+//
+// 	Context("common funcs test", func() {
+// 		It("GetReloadOptions Should success without error", func() {
+// 			mockTpl := appsv1beta1.ConfigConstraint{
+// 				Spec: appsv1beta1.ConfigConstraintSpec{
+// 					ReloadAction: &appsv1beta1.ReloadAction{
+// 						UnixSignalTrigger: &appsv1beta1.UnixSignalTrigger{
+// 							Signal:      "HUB",
+// 							ProcessName: "for_test",
+// 						},
+// 					},
+// 				},
+// 			}
+// 			tests := []struct {
+// 				name    string
+// 				tpls    []appsv1.ComponentConfigSpec
+// 				want    *appsv1beta1.ReloadAction
+// 				wantErr bool
+// 			}{{
+// 				// empty config templates
+// 				name:    "test",
+// 				tpls:    nil,
+// 				want:    nil,
+// 				wantErr: false,
+// 			}, {
+// 				// empty config templates
+// 				name:    "test",
+// 				tpls:    []appsv1.ComponentConfigSpec{},
+// 				want:    nil,
+// 				wantErr: false,
+// 			}, {
+// 				// config templates without configConstraintObj
+// 				name: "test",
+// 				tpls: []appsv1.ComponentConfigSpec{{
+// 					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
+// 						Name: "for_test",
+// 					},
+// 				}, {
+// 					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
+// 						Name: "for_test2",
+// 					},
+// 				}},
+// 				want:    nil,
+// 				wantErr: false,
+// 			}, {
+// 				// normal
+// 				name: "test",
+// 				tpls: []appsv1.ComponentConfigSpec{{
+// 					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
+// 						Name: "for_test",
+// 					},
+// 					ConfigConstraintRef: "eg_v1",
+// 				}},
+// 				want:    mockTpl.Spec.ReloadAction,
+// 				wantErr: false,
+// 			}, {
+// 				// not exist config constraint
+// 				name: "test",
+// 				tpls: []appsv1.ComponentConfigSpec{{
+// 					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
+// 						Name: "for_test",
+// 					},
+// 					ConfigConstraintRef: "not_exist",
+// 				}},
+// 				want:    nil,
+// 				wantErr: true,
+// 			}}
+//
+// 			k8sMockClient.MockGetMethod(testutil.WithGetReturned(func(key client.ObjectKey, obj client.Object) error {
+// 				if strings.Contains(key.Name, "not_exist") {
+// 					return MakeError("not exist config!")
+// 				}
+// 				testutil.SetGetReturnedObject(obj, &mockTpl)
+// 				return nil
+// 			}, testutil.WithMaxTimes(len(tests))))
+//
+// 			for _, tt := range tests {
+// 				got, _, err := GetReloadOptions(k8sMockClient.Client(), ctx, tt.tpls)
+// 				Expect(err != nil).Should(BeEquivalentTo(tt.wantErr))
+// 				Expect(reflect.DeepEqual(got, tt.want)).Should(BeTrue())
+// 			}
+// 		})
+// 	})
+//
+// })
+//
+// func TestMergeUpdatedConfig(t *testing.T) {
+// 	type args struct {
+// 		baseMap    map[string]string
+// 		updatedMap map[string]string
+// 	}
+// 	tests := []struct {
+// 		name string
+// 		args args
+// 		want map[string]string
+// 	}{{
+// 		name: "normal_test",
+// 		args: args{
+// 			baseMap: map[string]string{
+// 				"key1": "context1",
+// 				"key2": "context2",
+// 				"key3": "context3",
+// 			},
+// 			updatedMap: map[string]string{
+// 				"key2": "new context",
+// 			},
+// 		},
+// 		want: map[string]string{
+// 			"key1": "context1",
+// 			"key2": "new context",
+// 			"key3": "context3",
+// 		},
+// 	}, {
+// 		name: "not_expected_update_test",
+// 		args: args{
+// 			baseMap: map[string]string{
+// 				"key1": "context1",
+// 				"key2": "context2",
+// 				"key3": "context3",
+// 			},
+// 			updatedMap: map[string]string{
+// 				"key6": "context6",
+// 			},
+// 		},
+// 		want: map[string]string{
+// 			"key1": "context1",
+// 			"key2": "context2",
+// 			"key3": "context3",
+// 		},
+// 	}}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			if got := MergeUpdatedConfig(tt.args.baseMap, tt.args.updatedMap); !reflect.DeepEqual(got, tt.want) {
+// 				t.Errorf("MergeUpdatedConfig() = %v, want %v", got, tt.want)
+// 			}
+// 		})
+// 	}
+// }
+//
+// func TestApplyConfigPatch(t *testing.T) {
+// 	type args struct {
+// 		baseCfg           []byte
+// 		updatedParameters map[string]string
+// 		formatConfig      *appsv1beta1.FileFormatConfig
+// 	}
+// 	tests := []struct {
+// 		name    string
+// 		args    args
+// 		want    string
+// 		wantErr bool
+// 	}{{
+// 		name: "normal_test",
+// 		args: args{
+// 			baseCfg: []byte(`[test]
+// test=test`),
+// 			updatedParameters: map[string]string{
+// 				"a":               "b",
+// 				"max_connections": "600",
+// 			},
+// 			formatConfig: &appsv1beta1.FileFormatConfig{
+// 				Format: appsv1beta1.Ini,
+// 				FormatterAction: appsv1beta1.FormatterAction{
+// 					IniConfig: &appsv1beta1.IniConfig{
+// 						SectionName: "test",
+// 					}}},
+// 		},
+// 		want: `[test]
+// a=b
+// max_connections=600
+// test=test
+// `,
+// 		wantErr: false,
+// 	}, {
+// 		name: "normal_test",
+// 		args: args{
+// 			baseCfg: []byte(` `),
+// 			updatedParameters: map[string]string{
+// 				"a": "b",
+// 				"c": "d e f g",
+// 			},
+// 			formatConfig: &appsv1beta1.FileFormatConfig{
+// 				Format: appsv1beta1.RedisCfg,
+// 			},
+// 		},
+// 		want:    "a b\nc d e f g",
+// 		wantErr: false,
+// 	}, {
+// 		name: "badcase_test",
+// 		args: args{
+// 			baseCfg: []byte(` `),
+// 			updatedParameters: map[string]string{
+// 				"ENABLE_MODULES":     "true",
+// 				"HUGGINGFACE_APIKEY": "kssdlsdjskwssl",
+// 			},
+// 			formatConfig: &appsv1beta1.FileFormatConfig{
+// 				Format: appsv1beta1.Dotenv,
+// 			},
+// 		},
+// 		// fix begin
+// 		// ENABLE_MODULES=0x1400004f130
+// 		// HUGGINGFACE_APIKEY=0x1400004f140
+// 		want:    "ENABLE_MODULES=true\nHUGGINGFACE_APIKEY=kssdlsdjskwssl\n",
+// 		wantErr: false,
+// 	}}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			got, err := ApplyConfigPatch(tt.args.baseCfg, FromStringPointerMap(tt.args.updatedParameters), tt.args.formatConfig)
+// 			if (err != nil) != tt.wantErr {
+// 				t.Errorf("ApplyConfigPatch() error = %v, wantErr %v", err, tt.wantErr)
+// 				return
+// 			}
+// 			if got != tt.want {
+// 				t.Errorf("ApplyConfigPatch() got = %v, want %v", got, tt.want)
+// 			}
+// 		})
+// 	}
+// }
+//
+// func TestFromValueToString(t *testing.T) {
+// 	type args struct {
+// 		val interface{}
+// 	}
+// 	tests := []struct {
+// 		name string
+// 		args args
+// 		want string
+// 	}{{
+// 		name: "test",
+// 		args: args{
+// 			val: "testTest",
+// 		},
+// 		want: "testTest",
+// 	}, {
+// 		name: "test",
+// 		args: args{
+// 			val: "",
+// 		},
+// 		want: "",
+// 	}, {
+// 		name: "test",
+// 		args: args{
+// 			val: nil,
+// 		},
+// 		want: "",
+// 	}, {
+// 		name: "test",
+// 		args: args{
+// 			val: "/abdet/sds",
+// 		},
+// 		want: "",
+// 	}, {
+// 		name: "test",
+// 		args: args{
+// 			val: "abdet/sds-",
+// 		},
+// 		want: "",
+// 	}, {
+// 		name: "test",
+// 		args: args{
+// 			val: "abcdASls-sda_102.382",
+// 		},
+// 		want: "abcdASls-sda_102.382",
+// 	}}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			if got := FromValueToString(tt.args.val); got != tt.want {
+// 				t.Errorf("FromValueToString() = %v, want %v", got, tt.want)
+// 			}
+// 		})
+// 	}
+// }
+//
+// func TestFromStringMap(t *testing.T) {
+// 	type args struct {
+// 		m map[string]*string
+// 	}
+// 	tests := []struct {
+// 		name string
+// 		args args
+// 		want map[string]interface{}
+// 	}{{
+// 		name: "test",
+// 		args: args{
+// 			m: map[string]*string{
+// 				"abcd":       cfgutil.ToPointer("test"),
+// 				"null_field": nil,
+// 			},
+// 		},
+// 		want: map[string]interface{}{
+// 			"abcd":       "test",
+// 			"null_field": nil,
+// 		},
+// 	}}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			if got := FromStringMap(tt.args.m); !reflect.DeepEqual(got, tt.want) {
+// 				t.Errorf("FromStringMap() = %v, want %v", got, tt.want)
+// 			}
+// 		})
+// 	}
+// }
diff --git a/pkg/configuration/core/reconfigure_util_test.go b/pkg/configuration/core/reconfigure_util_test.go
index a8b7e27fd..7266f76bc 100644
--- a/pkg/configuration/core/reconfigure_util_test.go
+++ b/pkg/configuration/core/reconfigure_util_test.go
@@ -28,7 +28,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 )
@@ -82,134 +82,134 @@ func newCfgDiffMeta(testData string, add, delete map[string]interface{}) *Config
 	}
 }
 
-func TestIsUpdateDynamicParameters(t *testing.T) {
-	type args struct {
-		ccSpec *appsv1beta1.ConfigConstraintSpec
-		diff   *ConfigPatchInfo
-	}
-	tests := []struct {
-		name    string
-		args    args
-		want    bool
-		wantErr bool
-	}{{
-		name: "test",
-		// null
-		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{},
-			diff:   newCfgDiffMeta(`null`, nil, nil),
-		},
-		want:    true,
-		wantErr: false,
-	}, {
-		name: "test",
-		// error
-		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{},
-			diff:   newCfgDiffMeta(`invalid json formatter`, nil, nil),
-		},
-		want:    false,
-		wantErr: true,
-	}, {
-		name: "test",
-		// add/delete config file
-		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{},
-			diff:   newCfgDiffMeta(`{}`, map[string]interface{}{"a": "b"}, nil),
-		},
-		want:    false,
-		wantErr: false,
-	}, {
-		name: "test",
-		// not set static or dynamic parameters
-		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{},
-			diff:   newCfgDiffMeta(`{"a":"b"}`, nil, nil),
-		},
-		want:    false,
-		wantErr: false,
-	}, {
-		name: "test",
-		// static parameters contains
-		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{
-				StaticParameters: []string{"param1", "param2", "param3"},
-			},
-			diff: newCfgDiffMeta(`{"param3":"b"}`, nil, nil),
-		},
-		want:    false,
-		wantErr: false,
-	}, {
-		name: "test",
-		// static parameters not contains
-		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{
-				StaticParameters: []string{"param1", "param2", "param3"},
-			},
-			diff: newCfgDiffMeta(`{"param4":"b"}`, nil, nil),
-		},
-		want:    true,
-		wantErr: false,
-	}, {
-		name: "test",
-		// dynamic parameters contains
-		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{
-				DynamicParameters: []string{"param1", "param2", "param3"},
-			},
-			diff: newCfgDiffMeta(`{"param1":"b", "param3": 20}`, nil, nil),
-		},
-		want:    true,
-		wantErr: false,
-	}, {
-		name: "test",
-		// dynamic parameters not contains
-		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{
-				DynamicParameters: []string{"param1", "param2", "param3"},
-			},
-			diff: newCfgDiffMeta(`{"param1":"b", "param4": 20}`, nil, nil),
-		},
-		want:    false,
-		wantErr: false,
-	}, {
-		name: "test",
-		// dynamic/static parameters not contains
-		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{
-				DynamicParameters: []string{"dparam1", "dparam2", "dparam3"},
-				StaticParameters:  []string{"sparam1", "sparam2", "sparam3"},
-			},
-			diff: newCfgDiffMeta(`{"a":"b"}`, nil, nil),
-		},
-		want:    false,
-		wantErr: false,
-	}, {
-		name: "empty-test",
-		// dynamic/static parameters not contains
-		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{
-				DynamicParameters: []string{},
-				StaticParameters:  []string{},
-			},
-			diff: newCfgDiffMeta(`{}`, nil, nil),
-		},
-		want:    true,
-		wantErr: false,
-	}}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			got, err := IsUpdateDynamicParameters(tt.args.ccSpec, tt.args.diff)
-			if (err != nil) != tt.wantErr {
-				t.Errorf("IsUpdateDynamicParameters() error = %v, wantErr %v", err, tt.wantErr)
-				return
-			}
-			if got != tt.want {
-				t.Errorf("IsUpdateDynamicParameters() got = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
+// func TestIsUpdateDynamicParameters(t *testing.T) {
+// 	type args struct {
+// 		ccSpec *parametersv1alpha1.ParametersDefinitionSpec
+// 		diff   *ConfigPatchInfo
+// 	}
+// 	tests := []struct {
+// 		name    string
+// 		args    args
+// 		want    bool
+// 		wantErr bool
+// 	}{{
+// 		name: "test",
+// 		// null
+// 		args: args{
+// 			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{},
+// 			diff:   newCfgDiffMeta(`null`, nil, nil),
+// 		},
+// 		want:    true,
+// 		wantErr: false,
+// 	}, {
+// 		name: "test",
+// 		// error
+// 		args: args{
+// 			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{},
+// 			diff:   newCfgDiffMeta(`invalid json formatter`, nil, nil),
+// 		},
+// 		want:    false,
+// 		wantErr: true,
+// 	}, {
+// 		name: "test",
+// 		// add/delete config file
+// 		args: args{
+// 			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{},
+// 			diff:   newCfgDiffMeta(`{}`, map[string]interface{}{"a": "b"}, nil),
+// 		},
+// 		want:    false,
+// 		wantErr: false,
+// 	}, {
+// 		name: "test",
+// 		// not set static or dynamic parameters
+// 		args: args{
+// 			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{},
+// 			diff:   newCfgDiffMeta(`{"a":"b"}`, nil, nil),
+// 		},
+// 		want:    false,
+// 		wantErr: false,
+// 	}, {
+// 		name: "test",
+// 		// static parameters contains
+// 		args: args{
+// 			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{
+// 				StaticParameters: []string{"param1", "param2", "param3"},
+// 			},
+// 			diff: newCfgDiffMeta(`{"param3":"b"}`, nil, nil),
+// 		},
+// 		want:    false,
+// 		wantErr: false,
+// 	}, {
+// 		name: "test",
+// 		// static parameters not contains
+// 		args: args{
+// 			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{
+// 				StaticParameters: []string{"param1", "param2", "param3"},
+// 			},
+// 			diff: newCfgDiffMeta(`{"param4":"b"}`, nil, nil),
+// 		},
+// 		want:    true,
+// 		wantErr: false,
+// 	}, {
+// 		name: "test",
+// 		// dynamic parameters contains
+// 		args: args{
+// 			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{
+// 				DynamicParameters: []string{"param1", "param2", "param3"},
+// 			},
+// 			diff: newCfgDiffMeta(`{"param1":"b", "param3": 20}`, nil, nil),
+// 		},
+// 		want:    true,
+// 		wantErr: false,
+// 	}, {
+// 		name: "test",
+// 		// dynamic parameters not contains
+// 		args: args{
+// 			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{
+// 				DynamicParameters: []string{"param1", "param2", "param3"},
+// 			},
+// 			diff: newCfgDiffMeta(`{"param1":"b", "param4": 20}`, nil, nil),
+// 		},
+// 		want:    false,
+// 		wantErr: false,
+// 	}, {
+// 		name: "test",
+// 		// dynamic/static parameters not contains
+// 		args: args{
+// 			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{
+// 				DynamicParameters: []string{"dparam1", "dparam2", "dparam3"},
+// 				StaticParameters:  []string{"sparam1", "sparam2", "sparam3"},
+// 			},
+// 			diff: newCfgDiffMeta(`{"a":"b"}`, nil, nil),
+// 		},
+// 		want:    false,
+// 		wantErr: false,
+// 	}, {
+// 		name: "empty-test",
+// 		// dynamic/static parameters not contains
+// 		args: args{
+// 			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{
+// 				DynamicParameters: []string{},
+// 				StaticParameters:  []string{},
+// 			},
+// 			diff: newCfgDiffMeta(`{}`, nil, nil),
+// 		},
+// 		want:    true,
+// 		wantErr: false,
+// 	}}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			got, err := IsUpdateDynamicParameters(tt.args.ccSpec, tt.args.diff)
+// 			if (err != nil) != tt.wantErr {
+// 				t.Errorf("IsUpdateDynamicParameters() error = %v, wantErr %v", err, tt.wantErr)
+// 				return
+// 			}
+// 			if got != tt.want {
+// 				t.Errorf("IsUpdateDynamicParameters() got = %v, want %v", got, tt.want)
+// 			}
+// 		})
+// 	}
+// }
 
 func TestIsSchedulableConfigResource(t *testing.T) {
 	tests := []struct {
@@ -285,60 +285,60 @@ func TestSetParametersUpdateSource(t *testing.T) {
 	require.False(t, IsNotUserReconfigureOperation(cm))
 }
 
-func TestValidateConfigPatch(t *testing.T) {
-	type args struct {
-		patch     *ConfigPatchInfo
-		formatCfg *appsv1beta1.FileFormatConfig
-	}
-	tests := []struct {
-		name    string
-		args    args
-		wantErr bool
-	}{{
-		name: "test",
-		args: args{
-			patch:     &ConfigPatchInfo{},
-			formatCfg: &appsv1beta1.FileFormatConfig{Format: appsv1beta1.YAML},
-		},
-		wantErr: false,
-	}, {
-		name: "test",
-		args: args{
-			patch: &ConfigPatchInfo{
-				IsModify: true,
-				UpdateConfig: map[string][]byte{
-					"file1": []byte(`{"a":"b"}`),
-				},
-			},
-			formatCfg: &appsv1beta1.FileFormatConfig{Format: appsv1beta1.YAML},
-		},
-		wantErr: false,
-	}, {
-		name: "test-failed",
-		args: args{
-			patch: &ConfigPatchInfo{
-				IsModify: true,
-				UpdateConfig: map[string][]byte{
-					"file1": []byte(`{"a":null}`),
-				},
-			},
-			formatCfg: &appsv1beta1.FileFormatConfig{Format: appsv1beta1.YAML},
-		},
-		wantErr: true,
-	}}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if err := ValidateConfigPatch(tt.args.patch, tt.args.formatCfg); (err != nil) != tt.wantErr {
-				t.Errorf("ValidateConfigPatch() error = %v, wantErr %v", err, tt.wantErr)
-			}
-		})
-	}
-}
+// func TestValidateConfigPatch(t *testing.T) {
+// 	type args struct {
+// 		patch     *ConfigPatchInfo
+// 		formatCfg *appsv1beta1.FileFormatConfig
+// 	}
+// 	tests := []struct {
+// 		name    string
+// 		args    args
+// 		wantErr bool
+// 	}{{
+// 		name: "test",
+// 		args: args{
+// 			patch:     &ConfigPatchInfo{},
+// 			formatCfg: &appsv1beta1.FileFormatConfig{Format: appsv1beta1.YAML},
+// 		},
+// 		wantErr: false,
+// 	}, {
+// 		name: "test",
+// 		args: args{
+// 			patch: &ConfigPatchInfo{
+// 				IsModify: true,
+// 				UpdateConfig: map[string][]byte{
+// 					"file1": []byte(`{"a":"b"}`),
+// 				},
+// 			},
+// 			formatCfg: &appsv1beta1.FileFormatConfig{Format: appsv1beta1.YAML},
+// 		},
+// 		wantErr: false,
+// 	}, {
+// 		name: "test-failed",
+// 		args: args{
+// 			patch: &ConfigPatchInfo{
+// 				IsModify: true,
+// 				UpdateConfig: map[string][]byte{
+// 					"file1": []byte(`{"a":null}`),
+// 				},
+// 			},
+// 			formatCfg: &appsv1beta1.FileFormatConfig{Format: appsv1beta1.YAML},
+// 		},
+// 		wantErr: true,
+// 	}}
+// 	for _, tt := range tests {
+// 		t.Run(tt.name, func(t *testing.T) {
+// 			if err := ValidateConfigPatch(tt.args.patch, tt.args.formatCfg); (err != nil) != tt.wantErr {
+// 				t.Errorf("ValidateConfigPatch() error = %v, wantErr %v", err, tt.wantErr)
+// 			}
+// 		})
+// 	}
+// }
 
 func TestIsDynamicParameter(t *testing.T) {
 	type args struct {
 		paramName string
-		ccSpec    *appsv1beta1.ConfigConstraintSpec
+		ccSpec    *parametersv1alpha1.ParametersDefinitionSpec
 	}
 	tests := []struct {
 		name string
@@ -349,14 +349,14 @@ func TestIsDynamicParameter(t *testing.T) {
 		// null
 		args: args{
 			paramName: "test",
-			ccSpec:    &appsv1beta1.ConfigConstraintSpec{},
+			ccSpec:    &parametersv1alpha1.ParametersDefinitionSpec{},
 		},
 		want: false,
 	}, {
 		name: "test",
 		// static parameters contains
 		args: args{
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{
+			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{
 				StaticParameters: []string{"param1", "param2", "param3"},
 			},
 			paramName: "param3",
@@ -367,7 +367,7 @@ func TestIsDynamicParameter(t *testing.T) {
 		// static parameters not contains
 		args: args{
 			paramName: "param4",
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{
+			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{
 				StaticParameters: []string{"param1", "param2", "param3"},
 			},
 		},
@@ -377,7 +377,7 @@ func TestIsDynamicParameter(t *testing.T) {
 		// dynamic parameters contains
 		args: args{
 			paramName: "param1",
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{
+			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{
 				DynamicParameters: []string{"param1", "param2", "param3"},
 			},
 		},
@@ -387,7 +387,7 @@ func TestIsDynamicParameter(t *testing.T) {
 		// dynamic/static parameters not contains
 		args: args{
 			paramName: "test",
-			ccSpec: &appsv1beta1.ConfigConstraintSpec{
+			ccSpec: &parametersv1alpha1.ParametersDefinitionSpec{
 				DynamicParameters: []string{"dparam1", "dparam2", "dparam3"},
 				StaticParameters:  []string{"sparam1", "sparam2", "sparam3"},
 			},
diff --git a/pkg/configuration/core/suite_test.go b/pkg/configuration/core/suite_test.go
index 07f9e5ec4..2eb7e1fd3 100644
--- a/pkg/configuration/core/suite_test.go
+++ b/pkg/configuration/core/suite_test.go
@@ -36,7 +36,7 @@ import (
 var ctx context.Context
 var cancel context.CancelFunc
 
-func TestNetwork(t *testing.T) {
+func TestConfigCore(t *testing.T) {
 	RegisterFailHandler(Fail)
 
 	RunSpecs(t, "TPL Test Suite")
diff --git a/pkg/configuration/validate/config_validate_test.go b/pkg/configuration/validate/config_validate_test.go
index 6ef6ead3c..a16fc7376 100644
--- a/pkg/configuration/validate/config_validate_test.go
+++ b/pkg/configuration/validate/config_validate_test.go
@@ -25,7 +25,7 @@ import (
 
 	"github.com/stretchr/testify/require"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/test/testdata"
 )
 
@@ -37,14 +37,9 @@ var fromTestData = func(fileName string) string {
 	return string(content)
 }
 
-var newFakeConfConstraint = func(cueFile string, cfgFormatter appsv1beta1.CfgFileFormat) *appsv1beta1.ConfigConstraintSpec {
-	return &appsv1beta1.ConfigConstraintSpec{
-		ParametersSchema: &appsv1beta1.ParametersSchema{
-			CUE: fromTestData(cueFile),
-		},
-		FileFormatConfig: &appsv1beta1.FileFormatConfig{
-			Format: cfgFormatter,
-		},
+var newFakeConfigSchema = func(cueFile string) *parametersv1alpha1.ParametersSchema {
+	return &parametersv1alpha1.ParametersSchema{
+		CUE: fromTestData(cueFile),
 	}
 }
 
@@ -52,8 +47,7 @@ func TestSchemaValidatorWithCue(t *testing.T) {
 	type args struct {
 		cueFile    string
 		configFile string
-		format     appsv1beta1.CfgFileFormat
-		options    []ValidatorOptions
+		format     parametersv1alpha1.CfgFileFormat
 	}
 	tests := []struct {
 		name string
@@ -64,7 +58,7 @@ func TestSchemaValidatorWithCue(t *testing.T) {
 		args: args{
 			cueFile:    "cue_testdata/mongod.cue",
 			configFile: "cue_testdata/mongod.conf",
-			format:     appsv1beta1.YAML,
+			format:     parametersv1alpha1.YAML,
 		},
 		err: nil,
 	}, {
@@ -72,7 +66,7 @@ func TestSchemaValidatorWithCue(t *testing.T) {
 		args: args{
 			cueFile:    "cue_testdata/wesql.cue",
 			configFile: "cue_testdata/wesql.cnf",
-			format:     appsv1beta1.Ini,
+			format:     parametersv1alpha1.Ini,
 		},
 		err: nil,
 	}, {
@@ -80,7 +74,7 @@ func TestSchemaValidatorWithCue(t *testing.T) {
 		args: args{
 			cueFile:    "cue_testdata/pg14.cue",
 			configFile: "cue_testdata/pg14.conf",
-			format:     appsv1beta1.Properties,
+			format:     parametersv1alpha1.Properties,
 		},
 		err: nil,
 	}, {
@@ -88,7 +82,7 @@ func TestSchemaValidatorWithCue(t *testing.T) {
 		args: args{
 			cueFile:    "cue_testdata/clickhouse.cue",
 			configFile: "cue_testdata/clickhouse.xml",
-			format:     appsv1beta1.XML,
+			format:     parametersv1alpha1.XML,
 		},
 		err: nil,
 	}, {
@@ -96,7 +90,7 @@ func TestSchemaValidatorWithCue(t *testing.T) {
 		args: args{
 			cueFile:    "cue_testdata/mysql.cue",
 			configFile: "cue_testdata/mysql.cnf",
-			format:     appsv1beta1.Ini,
+			format:     parametersv1alpha1.Ini,
 		},
 		err: nil,
 	}, {
@@ -104,7 +98,7 @@ func TestSchemaValidatorWithCue(t *testing.T) {
 		args: args{
 			cueFile:    "cue_testdata/mysql.cue",
 			configFile: "cue_testdata/mysql_err.cnf",
-			format:     appsv1beta1.Ini,
+			format:     parametersv1alpha1.Ini,
 		},
 		err: errors.New(`failed to render cue template configure: [mysqld.innodb_autoinc_lock_mode: 3 errors in empty disjunction:
 mysqld.innodb_autoinc_lock_mode: conflicting values 0 and 100:
@@ -117,55 +111,33 @@ mysqld.innodb_autoinc_lock_mode: conflicting values 2 and 100:
 		name: "configmap_key_filter",
 		args: args{
 			cueFile:    "cue_testdata/mysql.cue",
-			configFile: "cue_testdata/mysql_err.cnf",
-			format:     appsv1beta1.Ini,
-			options:    []ValidatorOptions{WithKeySelector([]string{"key2", "key3"})},
+			configFile: "cue_testdata/mysql.cnf",
+			format:     parametersv1alpha1.Ini,
 		},
 	}}
 
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			validator := NewConfigValidator(newFakeConfConstraint(tt.args.cueFile, tt.args.format), tt.args.options...)
+			validator := NewConfigValidator(newFakeConfigSchema(tt.args.cueFile), &parametersv1alpha1.FileFormatConfig{Format: tt.args.format})
 			require.NotNil(t, validator)
-			require.Equal(t, tt.err, validator.Validate(
-				map[string]string{
-					"key": fromTestData(tt.args.configFile),
-				}))
+			require.Equal(t, tt.err, validator.Validate(fromTestData(tt.args.configFile)))
 		})
 	}
 }
 
 func TestSchemaValidatorWithSelector(t *testing.T) {
-	validator := NewConfigValidator(newFakeConfConstraint("cue_testdata/mysql.cue", appsv1beta1.Ini))
+	validator := NewConfigValidator(newFakeConfigSchema("cue_testdata/mysql.cue"), &parametersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.Ini})
 	require.NotNil(t, validator)
 	require.ErrorContains(t, validator.Validate(
-		map[string]string{
-			"normal_key":   fromTestData("cue_testdata/mysql.cnf"),
-			"abnormal_key": fromTestData("cue_testdata/mysql_err.cnf"),
-		}), "[mysqld.innodb_autoinc_lock_mode: 3 errors in empty disjunction")
-
-	validator = NewConfigValidator(newFakeConfConstraint("cue_testdata/mysql.cue", appsv1beta1.Ini), WithKeySelector([]string{}))
-	require.NotNil(t, validator)
-	require.ErrorContains(t, validator.Validate(
-		map[string]string{
-			"normal_key":   fromTestData("cue_testdata/mysql.cnf"),
-			"abnormal_key": fromTestData("cue_testdata/mysql_err.cnf"),
-		}), "[mysqld.innodb_autoinc_lock_mode: 3 errors in empty disjunction")
-
-	validator = NewConfigValidator(newFakeConfConstraint("cue_testdata/mysql.cue", appsv1beta1.Ini), WithKeySelector([]string{"normal_key"}))
-	require.NotNil(t, validator)
-	require.Nil(t, validator.Validate(
-		map[string]string{
-			"normal_key":   fromTestData("cue_testdata/mysql.cnf"),
-			"abnormal_key": fromTestData("cue_testdata/mysql_err.cnf"),
-		}))
+		fromTestData("cue_testdata/mysql_err.cnf"),
+	), "[mysqld.innodb_autoinc_lock_mode: 3 errors in empty disjunction")
 }
 
 func TestSchemaValidatorWithOpenSchema(t *testing.T) {
 	type args struct {
 		cueFile        string
 		configFile     string
-		format         appsv1beta1.CfgFileFormat
+		format         parametersv1alpha1.CfgFileFormat
 		SchemaTypeName string
 	}
 	tests := []struct {
@@ -177,23 +149,20 @@ func TestSchemaValidatorWithOpenSchema(t *testing.T) {
 		args: args{
 			cueFile:    "cue_testdata/mysql.cue",
 			configFile: "cue_testdata/mysql.cnf",
-			format:     appsv1beta1.Ini,
+			format:     parametersv1alpha1.Ini,
 		},
 		err: nil,
 	}}
 
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			tplConstraint := newFakeConfConstraint(tt.args.cueFile, tt.args.format)
+			configSchema := newFakeConfigSchema(tt.args.cueFile)
 			validator := &schemaValidator{
 				typeName: tt.args.SchemaTypeName,
-				cfgType:  tplConstraint.FileFormatConfig.Format,
-				schema:   tplConstraint.ParametersSchema.SchemaInJSON,
+				cfgType:  tt.args.format,
+				schema:   configSchema.SchemaInJSON,
 			}
-			require.Equal(t, tt.err, validator.Validate(
-				map[string]string{
-					"key": fromTestData(tt.args.configFile),
-				}))
+			require.Equal(t, tt.err, validator.Validate(fromTestData(tt.args.configFile)))
 		})
 	}
 }
diff --git a/pkg/controller/builder/builder_component_parameter_test.go b/pkg/controller/builder/builder_component_parameter_test.go
index 5e97a02fe..fd8f2b331 100644
--- a/pkg/controller/builder/builder_component_parameter_test.go
+++ b/pkg/controller/builder/builder_component_parameter_test.go
@@ -24,7 +24,7 @@ import (
 	. "github.com/onsi/gomega"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
+	configcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
 )
 
 var _ = Describe("configuration builder", func() {
@@ -34,7 +34,7 @@ var _ = Describe("configuration builder", func() {
 			componentName = "mysql"
 			ns            = "default"
 		)
-		name := core.GenerateComponentConfigurationName(clusterName, componentName)
+		name := configcore.GenerateComponentConfigurationName(clusterName, componentName)
 		config := NewComponentParameterBuilder(ns, name).
 			ClusterRef(clusterName).
 			Component(componentName).
diff --git a/pkg/controller/builder/builder_configuration_test.go b/pkg/controller/builder/builder_configuration_test.go
deleted file mode 100644
index 26a6954e6..000000000
--- a/pkg/controller/builder/builder_configuration_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package builder
-
-import (
-	. "github.com/onsi/ginkgo/v2"
-	. "github.com/onsi/gomega"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-)
-
-var _ = Describe("configuration builder", func() {
-	It("should work well", func() {
-		const (
-			clusterName   = "test"
-			componentName = "mysql"
-			ns            = "default"
-		)
-		name := core.GenerateComponentConfigurationName(clusterName, componentName)
-		config := NewConfigurationBuilder(ns, name).
-			ClusterRef(clusterName).
-			Component(componentName).
-			AddConfigurationItem(appsv1.ComponentConfigSpec{
-				ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-					Name: "mysql-config",
-				},
-			}).
-			AddConfigurationItem(appsv1.ComponentConfigSpec{
-				ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-					Name: "mysql-oteld-config",
-				},
-			}).
-			GetObject()
-
-		Expect(config.Name).Should(BeEquivalentTo(name))
-		Expect(config.Spec.ClusterRef).Should(BeEquivalentTo(clusterName))
-		Expect(config.Spec.ComponentName).Should(BeEquivalentTo(componentName))
-		Expect(len(config.Spec.ConfigItemDetails)).Should(Equal(2))
-	})
-})
diff --git a/pkg/controller/builder/builder_parameter_test.go b/pkg/controller/builder/builder_parameter_test.go
index fb1d6c2ec..872c9526f 100644
--- a/pkg/controller/builder/builder_parameter_test.go
+++ b/pkg/controller/builder/builder_parameter_test.go
@@ -24,7 +24,6 @@ import (
 	. "github.com/onsi/gomega"
 	"k8s.io/utils/pointer"
 
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 )
@@ -43,11 +42,11 @@ var _ = Describe("parameter builder", func() {
 				"param1": pointer.String("value1"),
 				"param2": pointer.String("value2"),
 			}).
-			AddCustomTemplate(componentName, "mysql-config", appsv1.ConfigTemplateExtension{
+			AddCustomTemplate(componentName, "mysql-config", parametersv1alpha1.ConfigTemplateExtension{
 				TemplateRef: "mysql-config-tpl",
 				Namespace:   "default",
 			}).
-			AddCustomTemplate(componentName, "mysql-config2", appsv1.ConfigTemplateExtension{
+			AddCustomTemplate(componentName, "mysql-config2", parametersv1alpha1.ConfigTemplateExtension{
 				TemplateRef: "mysql-config-tpl2",
 				Namespace:   "default",
 			}).
diff --git a/pkg/controller/component/component_test.go b/pkg/controller/component/component_test.go
index 25798390e..8f11317fc 100644
--- a/pkg/controller/component/component_test.go
+++ b/pkg/controller/component/component_test.go
@@ -20,9 +20,6 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package component
 
 import (
-	"reflect"
-	"testing"
-
 	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
@@ -191,56 +188,3 @@ var _ = Describe("Component", func() {
 		})
 	})
 })
-
-func TestGetConfigSpecByName(t *testing.T) {
-	type args struct {
-		component  *SynthesizedComponent
-		configSpec string
-	}
-	tests := []struct {
-		name string
-		args args
-		want *appsv1.ComponentConfigSpec
-	}{{
-		name: "test",
-		args: args{
-			component:  &SynthesizedComponent{},
-			configSpec: "for_test",
-		},
-		want: nil,
-	}, {
-		name: "test",
-		args: args{
-			component: &SynthesizedComponent{
-				ConfigTemplates: []appsv1.ComponentConfigSpec{{
-					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-						Name: "test",
-					}}},
-			},
-			configSpec: "for-test",
-		},
-		want: nil,
-	}, {
-		name: "test",
-		args: args{
-			component: &SynthesizedComponent{
-				ConfigTemplates: []appsv1.ComponentConfigSpec{{
-					ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-						Name: "for-test",
-					}}},
-			},
-			configSpec: "for-test",
-		},
-		want: &appsv1.ComponentConfigSpec{
-			ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-				Name: "for-test",
-			}},
-	}}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			if got := GetConfigSpecByName(tt.args.component, tt.args.configSpec); !reflect.DeepEqual(got, tt.want) {
-				t.Errorf("GetConfigSpecByName() = %v, want %v", got, tt.want)
-			}
-		})
-	}
-}
diff --git a/pkg/controller/component/service_reference_test.go b/pkg/controller/component/service_reference_test.go
index ec2c375b1..d04ad74fc 100644
--- a/pkg/controller/component/service_reference_test.go
+++ b/pkg/controller/component/service_reference_test.go
@@ -52,7 +52,6 @@ var _ = Describe("service references", func() {
 		// resources should be released in following order
 		// non-namespaced
 		testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, generics.ClusterDefinitionSignature, true, ml)
-		testapps.ClearResources(&testCtx, generics.ConfigConstraintSignature, ml)
 
 		// namespaced
 		testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, generics.ConfigMapSignature, true, inNS, ml)
diff --git a/pkg/controller/component/suite_test.go b/pkg/controller/component/suite_test.go
index 889ee85b7..4d4794240 100644
--- a/pkg/controller/component/suite_test.go
+++ b/pkg/controller/component/suite_test.go
@@ -42,7 +42,6 @@ import (
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/model"
@@ -109,9 +108,6 @@ var _ = BeforeSuite(func() {
 	err = appsv1alpha1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 
-	err = appsv1beta1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
-
 	err = appsv1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 
diff --git a/pkg/controller/component/synthesize_component_test.go b/pkg/controller/component/synthesize_component_test.go
index 149c63575..3a64836fc 100644
--- a/pkg/controller/component/synthesize_component_test.go
+++ b/pkg/controller/component/synthesize_component_test.go
@@ -75,19 +75,15 @@ var _ = Describe("synthesized component", func() {
 						},
 					},
 					// TODO: remove me
-					Configs: []appsv1.ComponentConfigSpec{
+					Configs: []appsv1.ComponentTemplateSpec{
 						{
-							ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-								Name:        "logConf",
-								TemplateRef: "logConf",
-								VolumeName:  "logConf",
-							},
+							Name:        "logConf",
+							TemplateRef: "logConf",
+							VolumeName:  "logConf",
 						},
 						{
-							ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-								Name:       "serverConf",
-								VolumeName: "serverConf",
-							},
+							Name:       "serverConf",
+							VolumeName: "serverConf",
 						},
 					},
 				},
@@ -234,19 +230,15 @@ var _ = Describe("synthesized component", func() {
 					Name: "test-compdef",
 				},
 				Spec: appsv1.ComponentDefinitionSpec{
-					Configs: []appsv1.ComponentConfigSpec{
+					Configs: []appsv1.ComponentTemplateSpec{
 						{
-							ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-								Name:        "app",
-								TemplateRef: "app",
-								VolumeName:  "app",
-							},
+							Name:        "app",
+							TemplateRef: "app",
+							VolumeName:  "app",
 						},
 						{
-							ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-								Name:       "external",
-								VolumeName: "external",
-							},
+							Name:       "external",
+							VolumeName: "external",
 						},
 					},
 				},
diff --git a/pkg/controller/configuration/configuration_test.go b/pkg/controller/configuration/configuration_test.go
index a5c2fa99a..798b99e8d 100644
--- a/pkg/controller/configuration/configuration_test.go
+++ b/pkg/controller/configuration/configuration_test.go
@@ -34,25 +34,27 @@ import (
 )
 
 const (
-	compDefName               = "test-compdef"
-	clusterName               = "test-cluster"
-	configTemplateName        = "test-config-template"
-	scriptTemplateName        = "test-script-template"
-	mysqlCompName             = "mysql"
-	mysqlConfigName           = "mysql-component-config"
-	mysqlConfigConstraintName = "mysql8.0-config-constraints"
-	mysqlScriptsTemplateName  = "apecloud-mysql-scripts"
+	compDefName              = "test-compdef"
+	clusterName              = "test-cluster"
+	paramsDefName            = "mysql-params-def"
+	pdcrName                 = "mysql-pdcr"
+	configTemplateName       = "test-config-template"
+	scriptTemplateName       = "test-script-template"
+	mysqlCompName            = "mysql"
+	mysqlConfigName          = "mysql-component-config"
+	mysqlScriptsTemplateName = "apecloud-mysql-scripts"
 )
 
 func allFieldsCompDefObj(create bool) *appsv1.ComponentDefinition {
 	compDef := testapps.NewComponentDefinitionFactory(compDefName).
 		SetDefaultSpec().
-		AddConfigTemplate(configTemplateName, mysqlConfigName, mysqlConfigConstraintName, testCtx.DefaultNamespace, testapps.ConfVolumeName).
+		AddConfigTemplate(configTemplateName, mysqlConfigName, testCtx.DefaultNamespace, testapps.ConfVolumeName).
 		AddScriptTemplate(scriptTemplateName, mysqlScriptsTemplateName, testCtx.DefaultNamespace, testapps.ScriptsVolumeName, nil).
 		GetObject()
 	if create {
 		Expect(testCtx.CreateObj(testCtx.Ctx, compDef)).Should(Succeed())
 	}
+	compDef.Status.Phase = appsv1.AvailablePhase
 	return compDef
 }
 
@@ -85,18 +87,9 @@ func newAllFieldsSynthesizedComponent(compDef *appsv1.ComponentDefinition, clust
 	Expect(err).Should(Succeed())
 	Expect(synthesizeComp).ShouldNot(BeNil())
 	addTestVolumeMount(synthesizeComp.PodSpec, mysqlCompName)
-	if len(synthesizeComp.ConfigTemplates) > 0 {
-		configSpec := &synthesizeComp.ConfigTemplates[0]
-		configSpec.ReRenderResourceTypes = []appsv1.RerenderResourceType{appsv1.ComponentVScaleType, appsv1.ComponentHScaleType}
-	}
 	return synthesizeComp
 }
 
-func newAllFieldsComponent(cluster *appsv1.Cluster) *appsv1.Component {
-	comp, _ := component.BuildComponent(cluster, &cluster.Spec.ComponentSpecs[0], nil, nil)
-	return comp
-}
-
 func addTestVolumeMount(spec *corev1.PodSpec, containerName string) {
 	for i := range spec.Containers {
 		container := &spec.Containers[i]
diff --git a/pkg/controller/configuration/envfrom_utils_test.go b/pkg/controller/configuration/envfrom_utils_test.go
deleted file mode 100644
index 67de6d1a7..000000000
--- a/pkg/controller/configuration/envfrom_utils_test.go
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package configuration
-
-import (
-	. "github.com/onsi/ginkgo/v2"
-	. "github.com/onsi/gomega"
-
-	corev1 "k8s.io/api/core/v1"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
-	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
-	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
-)
-
-var _ = Describe("ConfigEnvFrom test", func() {
-	const (
-		compDefName   = "test-compdef"
-		clusterName   = "test-cluster"
-		mysqlCompName = "mysql"
-	)
-
-	var (
-		compDef *appsv1.ComponentDefinition
-		cluster *appsv1.Cluster
-
-		k8sMockClient    *testutil.K8sClientMockHelper
-		origCMObject     *corev1.ConfigMap
-		configConstraint *appsv1beta1.ConfigConstraint
-	)
-
-	BeforeEach(func() {
-		k8sMockClient = testutil.NewK8sMockClient()
-
-		cm := testapps.NewCustomizedObj("config/envfrom-config.yaml", &corev1.ConfigMap{},
-			testCtx.UseDefaultNamespace())
-
-		configConstraint = testapps.NewCustomizedObj("config/envfrom-constraint.yaml",
-			&appsv1beta1.ConfigConstraint{})
-
-		compDef = testapps.NewComponentDefinitionFactory(compDefName).
-			SetDefaultSpec().
-			AddConfigTemplate(cm.Name, cm.Name, configConstraint.Name, testCtx.DefaultNamespace, "mysql-config", testapps.DefaultMySQLContainerName).
-			GetObject()
-
-		pvcSpec := testapps.NewPVCSpec("1Gi")
-		cluster = testapps.NewClusterFactory(testCtx.DefaultNamespace, clusterName, "").
-			AddComponent(mysqlCompName, compDef.Name).
-			AddVolumeClaimTemplate(testapps.DataVolumeName, pvcSpec).
-			GetObject()
-
-		origCMObject = cm.DeepCopy()
-		origCMObject.Name = core.GetComponentCfgName(clusterName, mysqlCompName, cm.Name)
-	})
-
-	AfterEach(func() {
-		k8sMockClient.Finish()
-	})
-
-	Context("test config template inject envfrom", func() {
-		It("should inject success", func() {
-			comp, err := component.BuildComponent(cluster, &cluster.Spec.ComponentSpecs[0], nil, nil)
-			Expect(err).Should(Succeed())
-
-			synthesizeComp, err := component.BuildSynthesizedComponent(ctx, testCtx.Cli, compDef, comp)
-			Expect(err).Should(Succeed())
-
-			podSpec := &corev1.PodSpec{
-				Containers: []corev1.Container{
-					{
-						Name: testapps.DefaultMySQLContainerName,
-					},
-				},
-			}
-			k8sMockClient.MockGetMethod(
-				testutil.WithGetReturned(testutil.WithConstructSimpleGetResult([]client.Object{
-					origCMObject,
-					configConstraint,
-				}), testutil.WithAnyTimes()))
-			k8sMockClient.MockCreateMethod(
-				testutil.WithCreateReturned(testutil.WithCreatedFailedResult(), testutil.WithTimes(1)),
-				testutil.WithCreateReturned(testutil.WithCreatedSucceedResult(), testutil.WithAnyTimes()),
-			)
-
-			synthesizeComp.ConfigTemplates[0].AsSecret = cfgutil.ToPointer(true)
-			Expect(injectTemplateEnvFrom(cluster, synthesizeComp, podSpec, k8sMockClient.Client(), ctx, nil)).ShouldNot(Succeed())
-			Expect(injectTemplateEnvFrom(cluster, synthesizeComp, podSpec, k8sMockClient.Client(), ctx, nil)).Should(Succeed())
-		})
-
-		It("should SyncEnvSourceObject success", func() {
-			configSpec := compDef.Spec.Configs[0]
-			configSpec.Keys = []string{"env-config"}
-
-			comp, err := component.BuildComponent(cluster, &cluster.Spec.ComponentSpecs[0], nil, nil)
-			Expect(err).Should(Succeed())
-
-			synthesizeComp, err := component.BuildSynthesizedComponent(ctx, testCtx.Cli, compDef, comp)
-			Expect(err).Should(Succeed())
-
-			cmObj := origCMObject.DeepCopy()
-			cmObj.SetName(core.GenerateEnvFromName(origCMObject.Name))
-			k8sMockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult([]client.Object{
-				cmObj,
-				configConstraint,
-			}), testutil.WithAnyTimes()))
-			k8sMockClient.MockUpdateMethod(testutil.WithFailed(core.MakeError("failed to patch"), testutil.WithTimes(1)),
-				testutil.WithSucceed(), testutil.WithAnyTimes())
-
-			Expect(SyncEnvSourceObject(configSpec, origCMObject, &configConstraint.Spec, k8sMockClient.Client(), ctx, cluster, synthesizeComp)).ShouldNot(Succeed())
-			Expect(SyncEnvSourceObject(configSpec, origCMObject, &configConstraint.Spec, k8sMockClient.Client(), ctx, cluster, synthesizeComp)).Should(Succeed())
-		})
-
-		It("SyncEnvSourceObject abnormal test", func() {
-			comp, err := component.BuildComponent(cluster, &cluster.Spec.ComponentSpecs[0], nil, nil)
-			Expect(err).Should(Succeed())
-
-			synthesizeComp, err := component.BuildSynthesizedComponent(ctx, testCtx.Cli, compDef, comp)
-			Expect(err).Should(Succeed())
-
-			configSpec := compDef.Spec.Configs[0]
-			configSpec.InjectEnvTo = nil
-			Expect(SyncEnvSourceObject(configSpec, origCMObject, &configConstraint.Spec, k8sMockClient.Client(), ctx, cluster, synthesizeComp)).Should(Succeed())
-
-			configSpec.InjectEnvTo = nil
-			cmObj := origCMObject.DeepCopy()
-			cmObj.SetName(core.GenerateEnvFromName(origCMObject.Name))
-			k8sMockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult([]client.Object{
-				cmObj,
-				configConstraint,
-			}), testutil.WithAnyTimes()))
-			k8sMockClient.MockUpdateMethod(testutil.WithSucceed(testutil.WithAnyTimes()))
-
-			configSpec = compDef.Spec.Configs[0]
-			configSpec.Keys = []string{"env-config", "not-exist"}
-			Expect(SyncEnvSourceObject(configSpec, origCMObject, &configConstraint.Spec, k8sMockClient.Client(), ctx, cluster, synthesizeComp)).Should(Succeed())
-		})
-	})
-})
diff --git a/pkg/controller/configuration/operator_test.go b/pkg/controller/configuration/operator_test.go
deleted file mode 100644
index 93ece4731..000000000
--- a/pkg/controller/configuration/operator_test.go
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package configuration
-
-import (
-	. "github.com/onsi/ginkgo/v2"
-	. "github.com/onsi/gomega"
-
-	"github.com/golang/mock/gomock"
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"k8s.io/utils/pointer"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/controller/builder"
-	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
-	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
-	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
-)
-
-var _ = Describe("ConfigurationOperatorTest", func() {
-	var clusterObj *appsv1.Cluster
-	var compDefObj *appsv1.ComponentDefinition
-	var componentObj *appsv1.Component
-	var synthesizedComponent *component.SynthesizedComponent
-	var configMapObj *corev1.ConfigMap
-	var scriptsObj *corev1.ConfigMap
-	var configConstraint *appsv1beta1.ConfigConstraint
-	var configurationObj *appsv1alpha1.Configuration
-	var k8sMockClient *testutil.K8sClientMockHelper
-
-	createConfigReconcileTask := func() *configOperator {
-		task := NewConfigReconcileTask(&render.ResourceCtx{
-			Client:        k8sMockClient.Client(),
-			Context:       ctx,
-			Namespace:     testCtx.DefaultNamespace,
-			ClusterName:   clusterName,
-			ComponentName: mysqlCompName,
-		},
-			clusterObj,
-			componentObj,
-			synthesizedComponent,
-			synthesizedComponent.PodSpec,
-			nil)
-		return task
-	}
-
-	BeforeEach(func() {
-		// Add any setup steps that needs to be executed before each test
-		k8sMockClient = testutil.NewK8sMockClient()
-		clusterObj, compDefObj, _ = newAllFieldsClusterObj(nil, false)
-		synthesizedComponent = newAllFieldsSynthesizedComponent(compDefObj, clusterObj)
-		componentObj = newAllFieldsComponent(clusterObj)
-		configMapObj = testapps.NewConfigMap("default", mysqlConfigName,
-			testapps.SetConfigMapData("test", "test"))
-		scriptsObj = testapps.NewConfigMap("default", mysqlScriptsTemplateName,
-			testapps.SetConfigMapData("script.sh", "echo \"hello\""))
-		configurationObj = builder.NewConfigurationBuilder(testCtx.DefaultNamespace,
-			cfgcore.GenerateComponentConfigurationName(clusterName, mysqlCompName)).
-			ClusterRef(clusterName).
-			Component(mysqlCompName).
-			GetObject()
-		configConstraint = &appsv1beta1.ConfigConstraint{
-			ObjectMeta: metav1.ObjectMeta{
-				Name: mysqlConfigConstraintName,
-			},
-			Spec: appsv1beta1.ConfigConstraintSpec{
-				ReloadAction: &appsv1beta1.ReloadAction{
-					ShellTrigger: &appsv1beta1.ShellTrigger{
-						Command: []string{"echo", "hello"},
-						Sync:    pointer.Bool(true),
-					},
-				},
-				FileFormatConfig: &appsv1beta1.FileFormatConfig{
-					Format: appsv1beta1.Ini,
-					FormatterAction: appsv1beta1.FormatterAction{
-						IniConfig: &appsv1beta1.IniConfig{
-							SectionName: "mysqld",
-						},
-					},
-				},
-			},
-		}
-	})
-
-	AfterEach(func() {
-		k8sMockClient.Finish()
-	})
-
-	Context("ConfigOperatorTest", func() {
-		It("NormalTest", func() {
-			k8sMockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult(
-				[]client.Object{
-					compDefObj,
-					clusterObj,
-					clusterObj,
-					scriptsObj,
-					configMapObj,
-					configConstraint,
-					configurationObj,
-				},
-			), testutil.WithAnyTimes()))
-			k8sMockClient.MockCreateMethod(testutil.WithCreateReturned(testutil.WithCreatedSucceedResult(), testutil.WithAnyTimes()))
-			k8sMockClient.MockPatchMethod(testutil.WithPatchReturned(func(obj client.Object, patch client.Patch) error {
-				switch v := obj.(type) {
-				case *appsv1alpha1.Configuration:
-					if client.ObjectKeyFromObject(obj) == client.ObjectKeyFromObject(configurationObj) {
-						configurationObj.Spec = *v.Spec.DeepCopy()
-						configurationObj.Status = *v.Status.DeepCopy()
-					}
-				}
-				return nil
-			}))
-			k8sMockClient.MockStatusMethod().
-				EXPECT().
-				Patch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).
-				Return(nil)
-			Expect(createConfigReconcileTask().Reconcile()).Should(Succeed())
-		})
-
-		It("BuildConfigManagerNPETest", func() {
-			configConstraintNpe := &appsv1beta1.ConfigConstraint{
-				ObjectMeta: metav1.ObjectMeta{
-					Name: mysqlConfigConstraintName + "_npe_test",
-				},
-				Spec: appsv1beta1.ConfigConstraintSpec{
-					ReloadAction: &appsv1beta1.ReloadAction{
-						ShellTrigger: &appsv1beta1.ShellTrigger{
-							Command: []string{"echo", "hello"},
-							Sync:    pointer.Bool(true),
-							ToolsSetup: &appsv1beta1.ToolsSetup{
-								MountPoint: "/kb_tools",
-								ToolConfigs: []appsv1beta1.ToolConfig{
-									{
-										Name:             "tools_name",
-										AsContainerImage: pointer.Bool(true),
-										Image:            "apecloud/tools:1234",
-									},
-								},
-							},
-						},
-					},
-					FileFormatConfig: &appsv1beta1.FileFormatConfig{
-						Format: appsv1beta1.Ini,
-					},
-				},
-			}
-			synthesizedComponent.ConfigTemplates = append(synthesizedComponent.ConfigTemplates, synthesizedComponent.ConfigTemplates[0])
-			synthesizedComponent.ConfigTemplates[1].Name = "npe_test"
-			synthesizedComponent.ConfigTemplates[1].ConfigConstraintRef = configConstraintNpe.Name
-
-			k8sMockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult(
-				[]client.Object{
-					compDefObj,
-					clusterObj,
-					clusterObj,
-					scriptsObj,
-					configMapObj,
-					configConstraint,
-					configurationObj,
-					configConstraintNpe,
-				},
-			), testutil.WithAnyTimes()))
-			k8sMockClient.MockCreateMethod(testutil.WithCreateReturned(testutil.WithCreatedSucceedResult(), testutil.WithAnyTimes()))
-			k8sMockClient.MockPatchMethod(testutil.WithPatchReturned(func(obj client.Object, patch client.Patch) error {
-				switch v := obj.(type) {
-				case *appsv1alpha1.Configuration:
-					if client.ObjectKeyFromObject(obj) == client.ObjectKeyFromObject(configurationObj) {
-						configurationObj.Spec = *v.Spec.DeepCopy()
-						configurationObj.Status = *v.Status.DeepCopy()
-					}
-				}
-				return nil
-			}))
-			k8sMockClient.MockStatusMethod().
-				EXPECT().
-				Patch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).
-				Return(nil)
-			Expect(createConfigReconcileTask().Reconcile()).Should(Succeed())
-		})
-
-		It("EmptyConfigSpecTest", func() {
-
-			k8sMockClient.MockCreateMethod(testutil.WithCreateReturned(testutil.WithCreatedSucceedResult(), testutil.WithTimes(1)))
-			k8sMockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult(
-				[]client.Object{
-					compDefObj,
-					clusterObj,
-					clusterObj,
-				},
-			), testutil.WithAnyTimes()))
-
-			synthesizedComponent.ConfigTemplates = nil
-			synthesizedComponent.ScriptTemplates = nil
-			Expect(createConfigReconcileTask().Reconcile()).Should(Succeed())
-		})
-
-	})
-
-})
diff --git a/pkg/controller/configuration/pipeline_test.go b/pkg/controller/configuration/pipeline_test.go
deleted file mode 100644
index f3ed2d7a8..000000000
--- a/pkg/controller/configuration/pipeline_test.go
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package configuration
-
-import (
-	"context"
-	"strconv"
-
-	. "github.com/onsi/ginkgo/v2"
-	. "github.com/onsi/gomega"
-
-	"github.com/golang/mock/gomock"
-	corev1 "k8s.io/api/core/v1"
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
-	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
-	"github.com/apecloud/kubeblocks/pkg/controller/builder"
-	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
-	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
-	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
-)
-
-var _ = Describe("ConfigurationPipelineTest", func() {
-	const testConfigFile = "postgresql.conf"
-
-	var clusterObj *appsv1.Cluster
-	var componentObj *appsv1.Component
-	var compDefObj *appsv1.ComponentDefinition
-	var synthesizedComponent *component.SynthesizedComponent
-	var configMapObj *corev1.ConfigMap
-	var configConstraint *appsv1beta1.ConfigConstraint
-	var configurationObj *appsv1alpha1.Configuration
-	var k8sMockClient *testutil.K8sClientMockHelper
-
-	mockAPIResource := func(lazyFetcher testutil.Getter) {
-		k8sMockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult(
-			[]client.Object{
-				compDefObj,
-				clusterObj,
-				clusterObj,
-				configMapObj,
-				configConstraint,
-				configurationObj,
-			}, lazyFetcher), testutil.WithAnyTimes()))
-		k8sMockClient.MockCreateMethod(testutil.WithCreateReturned(testutil.WithCreatedSucceedResult(), testutil.WithAnyTimes()))
-		k8sMockClient.MockPatchMethod(testutil.WithPatchReturned(func(obj client.Object, patch client.Patch) error {
-			switch v := obj.(type) {
-			case *appsv1alpha1.Configuration:
-				if client.ObjectKeyFromObject(obj) == client.ObjectKeyFromObject(configurationObj) {
-					configurationObj.Spec = *v.Spec.DeepCopy()
-					configurationObj.Status = *v.Status.DeepCopy()
-				}
-			}
-			return nil
-		}, testutil.WithAnyTimes()))
-		k8sMockClient.MockStatusMethod().
-			EXPECT().
-			Patch(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).
-			DoAndReturn(func(ctx context.Context, obj client.Object, patch client.Patch, opts ...client.SubResourcePatchOption) error {
-				switch v := obj.(type) {
-				case *appsv1alpha1.Configuration:
-					if client.ObjectKeyFromObject(obj) == client.ObjectKeyFromObject(configurationObj) {
-						configurationObj.Status = *v.Status.DeepCopy()
-					}
-				}
-				return nil
-			}).AnyTimes()
-	}
-
-	BeforeEach(func() {
-		// Add any setup steps that needs to be executed before each test
-		k8sMockClient = testutil.NewK8sMockClient()
-		clusterObj, compDefObj, _ = newAllFieldsClusterObj(nil, false)
-		componentObj = newAllFieldsComponent(clusterObj)
-		synthesizedComponent = newAllFieldsSynthesizedComponent(compDefObj, clusterObj)
-		configMapObj = testapps.NewConfigMap("default", mysqlConfigName,
-			testapps.SetConfigMapData(testConfigFile, `
-bgwriter_delay = '200ms'
-bgwriter_flush_after = '64'
-bgwriter_lru_maxpages = '1000'
-bgwriter_lru_multiplier = '10.0'
-bytea_output = 'hex'
-check_function_bodies = 'True'
-checkpoint_completion_target = '0.9'
-checkpoint_flush_after = '32'
-checkpoint_timeout = '15min'
-max_connections = '1000'
-`))
-		configurationObj = builder.NewConfigurationBuilder(testCtx.DefaultNamespace,
-			cfgcore.GenerateComponentConfigurationName(clusterName, mysqlCompName)).
-			ClusterRef(clusterName).
-			Component(mysqlCompName).
-			GetObject()
-		configConstraint = &appsv1beta1.ConfigConstraint{
-			ObjectMeta: metav1.ObjectMeta{
-				Name: mysqlConfigConstraintName,
-			},
-			Spec: appsv1beta1.ConfigConstraintSpec{
-				FileFormatConfig: &appsv1beta1.FileFormatConfig{
-					Format: appsv1beta1.Properties,
-				},
-			}}
-	})
-
-	AfterEach(func() {
-		k8sMockClient.Finish()
-	})
-
-	Context("ConfigPipelineTest", func() {
-		It("NormalTest", func() {
-			By("mock configSpec keys")
-			synthesizedComponent.ConfigTemplates[0].Keys = []string{testConfigFile}
-
-			By("create configuration resource")
-			createPipeline := NewCreatePipeline(render.ReconcileCtx{
-				ResourceCtx: &render.ResourceCtx{
-					Client:        k8sMockClient.Client(),
-					Context:       ctx,
-					Namespace:     testCtx.DefaultNamespace,
-					ClusterName:   clusterName,
-					ComponentName: mysqlCompName,
-				},
-				Cluster:              clusterObj,
-				Component:            componentObj,
-				SynthesizedComponent: synthesizedComponent,
-				PodSpec:              synthesizedComponent.PodSpec,
-			})
-
-			By("mock api resource for configuration")
-			mockAPIResource(func(key client.ObjectKey, obj client.Object) (bool, error) {
-				switch obj.(type) {
-				case *corev1.ConfigMap:
-					for _, renderedObj := range createPipeline.renderWrapper.renderedObjs {
-						if client.ObjectKeyFromObject(renderedObj) == key {
-							testutil.SetGetReturnedObject(obj, renderedObj)
-							return true, nil
-						}
-					}
-				}
-				return false, nil
-			})
-
-			err := createPipeline.Prepare().
-				UpdateConfiguration(). // reconcile Configuration
-				Configuration().       // sync Configuration
-				CreateConfigTemplate().
-				UpdatePodVolumes().
-				BuildConfigManagerSidecar().
-				UpdateConfigRelatedObject().
-				UpdateConfigurationStatus().
-				Complete()
-			Expect(err).Should(Succeed())
-
-			By("update configuration resource for mocking reconfiguring")
-			item := configurationObj.Spec.ConfigItemDetails[0]
-			item.ConfigFileParams = map[string]appsv1alpha1.ConfigParams{
-				testConfigFile: {
-					Parameters: map[string]*string{
-						"max_connections": cfgutil.ToPointer("2000"),
-					},
-				},
-				"other.conf": {
-					Content: cfgutil.ToPointer(`for test`),
-				},
-			}
-			reconcileTask := NewReconcilePipeline(render.ReconcileCtx{
-				ResourceCtx:          createPipeline.ResourceCtx,
-				Cluster:              clusterObj,
-				Component:            componentObj,
-				SynthesizedComponent: synthesizedComponent,
-				PodSpec:              synthesizedComponent.PodSpec,
-			}, item, &configurationObj.Status.ConfigurationItemStatus[0], nil)
-
-			By("update configuration resource")
-			err = reconcileTask.InitConfigSpec().
-				Configuration().
-				ConfigMap(configTemplateName).
-				ConfigConstraints(reconcileTask.ConfigSpec().ConfigConstraintRef).
-				PrepareForTemplate().
-				RerenderTemplate().
-				ApplyParameters().
-				UpdateConfigVersion(strconv.FormatInt(reconcileTask.ConfigurationObj.GetGeneration(), 10)).
-				Sync().
-				SyncStatus().
-				Complete()
-			Expect(err).Should(Succeed())
-
-			By("rerender configuration template")
-			reconcileTask.item.Version = "v2"
-			err = reconcileTask.InitConfigSpec().
-				Configuration().
-				ConfigMap(configTemplateName).
-				ConfigConstraints(reconcileTask.ConfigSpec().ConfigConstraintRef).
-				PrepareForTemplate().
-				RerenderTemplate().
-				ApplyParameters().
-				UpdateConfigVersion(strconv.FormatInt(reconcileTask.ConfigurationObj.GetGeneration(), 10)).
-				Sync().
-				SyncStatus().
-				Complete()
-			Expect(err).Should(Succeed())
-		})
-	})
-
-})
diff --git a/pkg/controller/configuration/resource_wrapper_test.go b/pkg/controller/configuration/resource_wrapper_test.go
index f454cf117..d1412f9f2 100644
--- a/pkg/controller/configuration/resource_wrapper_test.go
+++ b/pkg/controller/configuration/resource_wrapper_test.go
@@ -25,12 +25,11 @@ import (
 	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
-	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
+	"github.com/apecloud/kubeblocks/pkg/controller/builder"
 	"github.com/apecloud/kubeblocks/pkg/controller/render"
 	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
@@ -71,19 +70,14 @@ var _ = Describe("resource Fetcher", func() {
 				[]client.Object{
 					cluster,
 					testapps.NewConfigMap("default", cfgcore.GetComponentCfgName(clusterName, mysqlCompName, mysqlConfigName)),
-					&appsv1beta1.ConfigConstraint{
-						ObjectMeta: metav1.ObjectMeta{
-							Name: mysqlConfigName,
-						},
-					},
+					builder.NewComponentParameterBuilder(testCtx.DefaultNamespace, cfgcore.GenerateComponentConfigurationName(clusterName, mysqlCompName)).GetObject(),
 				},
 			), testutil.WithAnyTimes()))
 			err := NewTest(k8sMockClient.Client(), ctx).
 				Cluster().
 				ComponentSpec().
 				ConfigMap(mysqlConfigName).
-				ConfigConstraints(mysqlConfigName).
-				Configuration().
+				ComponentParameter().
 				Complete()
 			Expect(err).Should(Succeed())
 		})
diff --git a/pkg/controller/configuration/suite_test.go b/pkg/controller/configuration/suite_test.go
index 0cad6d4f2..5727507c0 100644
--- a/pkg/controller/configuration/suite_test.go
+++ b/pkg/controller/configuration/suite_test.go
@@ -40,9 +40,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/metrics/server"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 	"github.com/apecloud/kubeblocks/pkg/testutil"
 	viper "github.com/apecloud/kubeblocks/pkg/viperx"
@@ -100,10 +99,7 @@ var _ = BeforeSuite(func() {
 	Expect(err).NotTo(HaveOccurred())
 	Expect(cfg).NotTo(BeNil())
 
-	err = appsv1alpha1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
-
-	err = appsv1beta1.AddToScheme(scheme.Scheme)
+	err = parametersv1alpha1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 
 	err = appsv1.AddToScheme(scheme.Scheme)
diff --git a/pkg/controller/configuration/template_merger_test.go b/pkg/controller/configuration/template_merger_test.go
index 34ea507a8..f2b94b47e 100644
--- a/pkg/controller/configuration/template_merger_test.go
+++ b/pkg/controller/configuration/template_merger_test.go
@@ -27,15 +27,16 @@ import (
 
 	corev1 "k8s.io/api/core/v1"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
 	"github.com/apecloud/kubeblocks/pkg/controller/render"
-	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
+	testparameters "github.com/apecloud/kubeblocks/pkg/testutil/parameters"
 )
 
 var _ = Describe("TemplateMergerTest", func() {
@@ -71,10 +72,11 @@ max_connections=666
 	)
 
 	var (
-		mockClient          *testutil.K8sClientMockHelper
-		templateBuilder     render.TemplateRender
-		configSpec          appsv1.ComponentConfigSpec
-		configConstraintObj *appsv1beta1.ConfigConstraint
+		mockClient      *testutil.K8sClientMockHelper
+		templateBuilder render.TemplateRender
+		configSpec      appsv1.ComponentTemplateSpec
+		paramsDefs      *parametersv1alpha1.ParametersDefinition
+		pdcr            *parametersv1alpha1.ParamConfigRenderer
 
 		baseCMObject    *corev1.ConfigMap
 		updatedCMObject *corev1.ConfigMap
@@ -82,9 +84,13 @@ max_connections=666
 
 	BeforeEach(func() {
 		mockClient = testutil.NewK8sMockClient()
-		configConstraintObj = testapps.CheckedCreateCustomizedObj(&testCtx,
-			"resources/mysql-config-constraint.yaml",
-			&appsv1beta1.ConfigConstraint{})
+		paramsDefs = testparameters.NewParametersDefinitionFactory("test-pd").
+			SetConfigFile(testConfigName).
+			GetObject()
+		pdcr = testparameters.NewParamConfigRendererFactory("test-pdcr").
+			SetTemplateName(testConfigSpecName).
+			GetObject()
+
 		baseCMObject = &corev1.ConfigMap{
 			Data: map[string]string{
 				testConfigName:  baseConfig,
@@ -102,22 +108,18 @@ max_connections=666
 		updatedCMObject.SetName(updatedCMName)
 		updatedCMObject.SetNamespace("default")
 
-		configSpec = appsv1.ComponentConfigSpec{
-			ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-				Name:        testConfigSpecName,
-				TemplateRef: baseCMObject.GetName(),
-				Namespace:   "default",
-			},
-			Keys:                []string{"my.cnf"},
-			ConfigConstraintRef: configConstraintObj.GetName(),
+		configSpec = appsv1.ComponentTemplateSpec{
+			Name:        testConfigSpecName,
+			TemplateRef: baseCMObject.GetName(),
+			Namespace:   "default",
 		}
 
 		templateBuilder = render.NewTemplateBuilder(&render.ReconcileCtx{
 			ResourceCtx: &render.ResourceCtx{
 				Context:     ctx,
 				Client:      mockClient.Client(),
+				Namespace:   testCtx.DefaultNamespace,
 				ClusterName: testClusterName,
-				Namespace:   "default",
 			},
 			Cluster: &appsv1.Cluster{
 				ObjectMeta: metav1.ObjectMeta{
@@ -132,8 +134,11 @@ max_connections=666
 		mockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult([]client.Object{
 			baseCMObject,
 			updatedCMObject,
-			configConstraintObj,
 		}), testutil.WithAnyTimes()))
+		mockClient.MockNListMethod(0, testutil.WithListReturned(
+			testutil.WithConstructListReturnedResult([]runtime.Object{pdcr}),
+			testutil.WithAnyTimes(),
+		))
 	})
 
 	AfterEach(func() {
@@ -142,19 +147,19 @@ max_connections=666
 
 	Context("with patch Merge", func() {
 		It("mergerConfigTemplate patch policy", func() {
-			importedTemplate := appsv1.ConfigTemplateExtension{
+			importedTemplate := parametersv1alpha1.ConfigTemplateExtension{
 				Namespace: "default",
 				// Name:        configSpec.Name,
 				TemplateRef: updatedCMObject.GetName(),
-				Policy:      appsv1.PatchPolicy,
+				Policy:      parametersv1alpha1.PatchPolicy,
 			}
 
 			tmpCM := baseCMObject.DeepCopy()
-			mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, ctx, mockClient.Client())
+			mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, pdcr)
 			Expect(err).To(Succeed())
 			Expect(mergedData).Should(HaveLen(2))
 
-			configReaders, err := cfgcore.LoadRawConfigObject(mergedData, configConstraintObj.Spec.FileFormatConfig, configSpec.Keys)
+			configReaders, err := cfgcore.LoadRawConfigObject(mergedData, pdcr.Spec.Configs[0].FileFormatConfig, []string{testConfigName})
 			Expect(err).Should(Succeed())
 			Expect(configReaders).Should(HaveLen(1))
 			configObject := configReaders[testConfigName]
@@ -170,19 +175,19 @@ max_connections=666
 
 	Context("with replace Merge", func() {
 		It("test mergerConfigTemplate replace policy", func() {
-			importedTemplate := appsv1.ConfigTemplateExtension{
+			importedTemplate := parametersv1alpha1.ConfigTemplateExtension{
 				Namespace:   "default",
 				TemplateRef: updatedCMObject.GetName(),
-				Policy:      appsv1.ReplacePolicy,
+				Policy:      parametersv1alpha1.ReplacePolicy,
 			}
 
 			tmpCM := baseCMObject.DeepCopy()
-			mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, ctx, mockClient.Client())
+			mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, pdcr)
 			Expect(err).Should(Succeed())
 			Expect(mergedData).Should(HaveLen(2))
 			Expect(reflect.DeepEqual(mergedData, updatedCMObject.Data)).Should(BeTrue())
 
-			configReaders, err := cfgcore.LoadRawConfigObject(mergedData, configConstraintObj.Spec.FileFormatConfig, configSpec.Keys)
+			configReaders, err := cfgcore.LoadRawConfigObject(mergedData, pdcr.Spec.Configs[0].FileFormatConfig, []string{testConfigName})
 			Expect(err).Should(Succeed())
 			Expect(configReaders).Should(HaveLen(1))
 			configObject := configReaders[testConfigName]
@@ -195,28 +200,28 @@ max_connections=666
 
 	Context("with only add Merge", func() {
 		It("test mergerConfigTemplate add policy", func() {
-			importedTemplate := appsv1.ConfigTemplateExtension{
+			importedTemplate := parametersv1alpha1.ConfigTemplateExtension{
 				Namespace:   "default",
 				TemplateRef: updatedCMObject.GetName(),
-				Policy:      appsv1.OnlyAddPolicy,
+				Policy:      parametersv1alpha1.OnlyAddPolicy,
 			}
 
 			tmpCM := baseCMObject.DeepCopy()
-			_, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, ctx, mockClient.Client())
+			_, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, pdcr)
 			Expect(err).ShouldNot(Succeed())
 		})
 	})
 
 	Context("with none Merge", func() {
 		It("test mergerConfigTemplate none policy", func() {
-			importedTemplate := appsv1.ConfigTemplateExtension{
+			importedTemplate := parametersv1alpha1.ConfigTemplateExtension{
 				Namespace:   "default",
 				TemplateRef: updatedCMObject.GetName(),
-				Policy:      appsv1.NoneMergePolicy,
+				Policy:      parametersv1alpha1.NoneMergePolicy,
 			}
 
 			tmpCM := baseCMObject.DeepCopy()
-			mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, ctx, mockClient.Client())
+			mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, pdcr)
 			Expect(err).Should(Succeed())
 			Expect(reflect.DeepEqual(mergedData, updatedCMObject.Data)).Should(BeTrue())
 		})
@@ -224,43 +229,27 @@ max_connections=666
 
 	Context("failed test", func() {
 		It("test mergerConfigTemplate function", func() {
-			importedTemplate := appsv1.ConfigTemplateExtension{
+			importedTemplate := parametersv1alpha1.ConfigTemplateExtension{
 				Namespace:   "default",
 				TemplateRef: updatedCMObject.GetName(),
 				Policy:      "",
 			}
 
 			tmpCM := baseCMObject.DeepCopy()
-			_, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, ctx, mockClient.Client())
+			_, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, pdcr)
 			Expect(err).ShouldNot(Succeed())
 		})
 
-		It("not configconstraint", func() {
-			importedTemplate := appsv1.ConfigTemplateExtension{
+		It("not parameterDrivenConfigRender", func() {
+			importedTemplate := parametersv1alpha1.ConfigTemplateExtension{
 				Namespace:   "default",
 				TemplateRef: updatedCMObject.GetName(),
 				Policy:      "none",
 			}
 
 			tmpCM := baseCMObject.DeepCopy()
-			tmpConfigSpec := configSpec.DeepCopy()
-			tmpConfigSpec.ConfigConstraintRef = ""
-			_, err := mergerConfigTemplate(importedTemplate, templateBuilder, *tmpConfigSpec, tmpCM.Data, ctx, mockClient.Client())
-			Expect(err).ShouldNot(Succeed())
-		})
-
-		It("not formatter", func() {
-			importedTemplate := appsv1.ConfigTemplateExtension{
-				Namespace:   "default",
-				TemplateRef: updatedCMObject.GetName(),
-				Policy:      "none",
-			}
-
-			tmpCM := baseCMObject.DeepCopy()
-			tmpConfigSpec := configSpec.DeepCopy()
-			tmpConfigSpec.ConfigConstraintRef = "not_exist"
-			_, err := mergerConfigTemplate(importedTemplate, templateBuilder, *tmpConfigSpec, tmpCM.Data, ctx, mockClient.Client())
-			Expect(err).ShouldNot(Succeed())
+			_, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, &parametersv1alpha1.ParamConfigRenderer{})
+			Expect(err).Should(Succeed())
 		})
 	})
 })
diff --git a/pkg/controller/configuration/template_render_test.go b/pkg/controller/configuration/template_render_test.go
new file mode 100644
index 000000000..1b5d7861f
--- /dev/null
+++ b/pkg/controller/configuration/template_render_test.go
@@ -0,0 +1,168 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+package configuration
+
+import (
+	. "github.com/onsi/ginkgo/v2"
+	. "github.com/onsi/gomega"
+
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/utils/pointer"
+	"sigs.k8s.io/controller-runtime/pkg/client"
+
+	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
+	"github.com/apecloud/kubeblocks/pkg/controller/component"
+	"github.com/apecloud/kubeblocks/pkg/controller/render"
+	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
+	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
+	testparameters "github.com/apecloud/kubeblocks/pkg/testutil/parameters"
+	"github.com/apecloud/kubeblocks/pkg/unstructured"
+)
+
+var _ = Describe("ToolsImageBuilderTest", func() {
+
+	var mockK8sCli *testutil.K8sClientMockHelper
+	var clusterObj *appsv1.Cluster
+	var compDefObj *appsv1.ComponentDefinition
+	var clusterComponent *component.SynthesizedComponent
+	var paramsDef *parametersv1alpha1.ParametersDefinition
+	var pdcr *parametersv1alpha1.ParamConfigRenderer
+
+	BeforeEach(func() {
+		mockK8sCli = testutil.NewK8sMockClient()
+
+		// Add any setup steps that needs to be executed before each test
+		clusterObj, compDefObj, _ = newAllFieldsClusterObj(nil, false)
+		paramsDef = testparameters.NewParametersDefinitionFactory(paramsDefName).
+			SetReloadAction(testparameters.WithNoneAction()).
+			GetObject()
+		clusterComponent = newAllFieldsSynthesizedComponent(compDefObj, clusterObj)
+
+		pdcr = testparameters.NewParamConfigRendererFactory(pdcrName).
+			SetParametersDefs(paramsDef.Name).
+			SetComponentDefinition(compDefObj.GetName()).
+			SetTemplateName(configTemplateName).
+			GetObject()
+	})
+
+	AfterEach(func() {
+		// Add any teardown steps that needs to be executed after each test
+		mockK8sCli.Finish()
+	})
+
+	deRef := func(m map[string]*parametersv1alpha1.ParametersInFile) map[string]parametersv1alpha1.ParametersInFile {
+		r := make(map[string]parametersv1alpha1.ParametersInFile, len(m))
+		for key, param := range m {
+			r[key] = *param
+		}
+		return r
+	}
+
+	rerender := func(parameters parametersv1alpha1.ComponentParameters, tpl *corev1.ConfigMap, customTemplate *parametersv1alpha1.ConfigTemplateExtension) unstructured.ConfigObject {
+		rctx := &render.ReconcileCtx{
+			ResourceCtx: &render.ResourceCtx{
+				Context:       testCtx.Ctx,
+				Client:        mockK8sCli.Client(),
+				ClusterName:   clusterObj.Name,
+				ComponentName: mysqlCompName,
+			},
+			Cluster:              clusterObj,
+			SynthesizedComponent: clusterComponent,
+			PodSpec:              &corev1.PodSpec{},
+		}
+		item := parametersv1alpha1.ConfigTemplateItemDetail{
+			Name: configTemplateName,
+			ConfigSpec: &appsv1.ComponentTemplateSpec{
+				Name:        configTemplateName,
+				Namespace:   testCtx.DefaultNamespace,
+				TemplateRef: mysqlConfigName,
+				VolumeName:  testapps.ConfVolumeName,
+			},
+			CustomTemplates: customTemplate,
+		}
+		pds := []*parametersv1alpha1.ParametersDefinition{paramsDef}
+		cmObj, err := RerenderParametersTemplate(rctx, item, pdcr, pds)
+		Expect(err).Should(Succeed())
+		configdesc := pdcr.Spec.Configs[0]
+		if len(parameters) == 0 {
+			configReaders, err := cfgcore.LoadRawConfigObject(cmObj.Data, configdesc.FileFormatConfig, []string{configdesc.Name})
+			Expect(err).Should(Succeed())
+			return configReaders[configdesc.Name]
+		}
+		params := ClassifyComponentParameters(parameters, pds, []appsv1.ComponentTemplateSpec{*item.ConfigSpec}, map[string]*corev1.ConfigMap{configTemplateName: tpl})
+
+		tplParams, ok := params[configTemplateName]
+		Expect(ok).Should(BeTrue())
+		item.ConfigFileParams = deRef(tplParams)
+		result, err := ApplyParameters(item, cmObj, pdcr, pds)
+		Expect(err).Should(Succeed())
+		configReaders, err := cfgcore.LoadRawConfigObject(result.Data, configdesc.FileFormatConfig, []string{configdesc.Name})
+		Expect(err).Should(Succeed())
+		return configReaders[configdesc.Name]
+	}
+
+	Context("RerenderParametersTemplateTest", func() {
+		It("Render config with parameters", func() {
+			configMapObj := testparameters.NewComponentTemplateFactory(mysqlConfigName, testCtx.DefaultNamespace).
+				GetObject()
+
+			mockK8sCli.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult([]client.Object{
+				configMapObj,
+			}), testutil.WithAnyTimes()))
+
+			renderedObj := rerender(map[string]*string{
+				"max_connections":  pointer.String("100"),
+				"read_buffer_size": pointer.String("55288"),
+			}, configMapObj, nil)
+			Expect(renderedObj).ShouldNot(BeNil())
+			Expect(renderedObj.Get("max_connections")).Should(BeEquivalentTo("100"))
+			Expect(renderedObj.Get("read_buffer_size")).Should(BeEquivalentTo("55288"))
+		})
+
+		It("Render config with custom template", func() {
+			configMapObj := testparameters.NewComponentTemplateFactory(mysqlConfigName, testCtx.DefaultNamespace).
+				GetObject()
+			customTemplate := testparameters.NewComponentTemplateFactory(mysqlConfigName, testCtx.DefaultNamespace).
+				AddConfigFile(testparameters.MysqlConfigFile, `
+[mysqld]
+innodb_buffer_pool_size=512M
+gtid_mode=OFF
+`).
+				GetObject()
+
+			mockK8sCli.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult([]client.Object{
+				configMapObj,
+				customTemplate,
+			}), testutil.WithAnyTimes()))
+
+			renderedObj := rerender(nil, nil, &parametersv1alpha1.ConfigTemplateExtension{
+				TemplateRef: customTemplate.Name,
+				Namespace:   testCtx.DefaultNamespace,
+				Policy:      parametersv1alpha1.ReplacePolicy,
+			})
+			Expect(renderedObj).ShouldNot(BeNil())
+			Expect(renderedObj.Get("innodb_buffer_pool_size")).Should(BeEquivalentTo("512M"))
+			Expect(renderedObj.Get("gtid_mode")).Should(BeEquivalentTo("OFF"))
+			Expect(renderedObj.Get("max_connections")).Should(BeNil())
+		})
+	})
+})
diff --git a/pkg/controller/configuration/tool_image_builder_test.go b/pkg/controller/configuration/tool_image_builder_test.go
index ea8cff72a..98ea91758 100644
--- a/pkg/controller/configuration/tool_image_builder_test.go
+++ b/pkg/controller/configuration/tool_image_builder_test.go
@@ -26,7 +26,7 @@ import (
 	corev1 "k8s.io/api/core/v1"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	cfgcm "github.com/apecloud/kubeblocks/pkg/configuration/config_manager"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/component"
@@ -67,12 +67,12 @@ var _ = Describe("ToolsImageBuilderTest", func() {
 				ConfigSpecsBuildParams: []cfgcm.ConfigSpecMeta{{
 					ConfigSpecInfo: cfgcm.ConfigSpecInfo{
 						ConfigSpec:      clusterComponent.ConfigTemplates[0],
-						ReloadType:      appsv1beta1.TPLScriptType,
-						FormatterConfig: appsv1beta1.FileFormatConfig{},
+						ReloadType:      parametersv1alpha1.TPLScriptType,
+						FormatterConfig: parametersv1alpha1.FileFormatConfig{},
 					},
-					ToolsImageSpec: &appsv1beta1.ToolsSetup{
+					ToolsImageSpec: &parametersv1alpha1.ToolsSetup{
 						MountPoint: "/opt/tools",
-						ToolConfigs: []appsv1beta1.ToolConfig{
+						ToolConfigs: []parametersv1alpha1.ToolConfig{
 							{
 								Name:    "test",
 								Image:   "test_images",
@@ -92,7 +92,6 @@ var _ = Describe("ToolsImageBuilderTest", func() {
 						},
 					},
 				}},
-				ConfigLazyRenderedVolumes: make(map[string]corev1.VolumeMount),
 			}
 			cfgManagerParams.ConfigSpecsBuildParams[0].ConfigSpec.VolumeName = "data"
 			Expect(buildReloadToolsContainer(cfgManagerParams, &its.Spec.Template.Spec)).Should(Succeed())
diff --git a/pkg/controller/factory/builder_test.go b/pkg/controller/factory/builder_test.go
index f50530370..1175be86e 100644
--- a/pkg/controller/factory/builder_test.go
+++ b/pkg/controller/factory/builder_test.go
@@ -31,7 +31,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	cfgcm "github.com/apecloud/kubeblocks/pkg/configuration/config_manager"
 	"github.com/apecloud/kubeblocks/pkg/constant"
@@ -133,15 +133,12 @@ var _ = Describe("builder", func() {
 		It("builds ConfigMap with template correctly", func() {
 			config := map[string]string{}
 			_, cluster, synthesizedComponent := newClusterObjs(nil)
-			tplCfg := appsv1.ComponentConfigSpec{
-				ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-					Name:        "test-config-tpl",
-					TemplateRef: "test-config-tpl",
-				},
-				ConfigConstraintRef: "test-config-constraint",
+			tplCfg := appsv1.ComponentTemplateSpec{
+				Name:        "test-config-tpl",
+				TemplateRef: "test-config-tpl",
 			}
 			configmap := BuildConfigMapWithTemplate(cluster, synthesizedComponent, config,
-				"test-cm", tplCfg.ComponentTemplateSpec)
+				"test-cm", tplCfg)
 			Expect(configmap).ShouldNot(BeNil())
 		})
 
@@ -184,12 +181,11 @@ var _ = Describe("builder", func() {
 		It("builds cfg manager tools  correctly", func() {
 			_, cluster, _ := newClusterObjs(nil)
 			cfgManagerParams := &cfgcm.CfgManagerBuildParams{
-				ManagerName:               constant.ConfigSidecarName,
-				Image:                     viper.GetString(constant.KBToolsImage),
-				Cluster:                   cluster,
-				ConfigLazyRenderedVolumes: make(map[string]corev1.VolumeMount),
+				ManagerName: constant.ConfigSidecarName,
+				Image:       viper.GetString(constant.KBToolsImage),
+				Cluster:     cluster,
 			}
-			toolContainers := []appsv1beta1.ToolConfig{
+			toolContainers := []parametersv1alpha1.ToolConfig{
 				{Name: "test-tool", Image: "test-image", Command: []string{"sh"}},
 			}
 
diff --git a/pkg/controller/factory/suite_test.go b/pkg/controller/factory/suite_test.go
index 587a81f82..aea73befa 100644
--- a/pkg/controller/factory/suite_test.go
+++ b/pkg/controller/factory/suite_test.go
@@ -41,8 +41,6 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/metrics/server"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 	"github.com/apecloud/kubeblocks/pkg/testutil"
@@ -98,12 +96,6 @@ var _ = BeforeSuite(func() {
 	Expect(err).NotTo(HaveOccurred())
 	Expect(cfg).NotTo(BeNil())
 
-	err = appsv1alpha1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
-
-	err = appsv1beta1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
-
 	err = appsv1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 
diff --git a/pkg/controller/plan/prepare_test.go b/pkg/controller/plan/prepare_test.go
deleted file mode 100644
index 1525de093..000000000
--- a/pkg/controller/plan/prepare_test.go
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package plan
-
-import (
-	. "github.com/onsi/ginkgo/v2"
-	. "github.com/onsi/gomega"
-
-	corev1 "k8s.io/api/core/v1"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	cfgcore "github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/controller/component"
-	"github.com/apecloud/kubeblocks/pkg/controller/configuration"
-	"github.com/apecloud/kubeblocks/pkg/controller/render"
-	"github.com/apecloud/kubeblocks/pkg/generics"
-	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
-)
-
-var _ = Describe("Prepare Test", func() {
-	cleanEnv := func() {
-		// must wait until resources deleted and no longer exist before the testcases start,
-		// otherwise if later it needs to create some new resource objects with the same name,
-		// in race conditions, it will find the existence of old objects, resulting failure to
-		// create the new objects.
-		By("clean resources")
-
-		inNS := client.InNamespace(testCtx.DefaultNamespace)
-		ml := client.HasLabels{testCtx.TestObjLabelKey}
-
-		// non-namespaced
-		testapps.ClearResources(&testCtx, generics.ConfigConstraintSignature, ml)
-
-		// namespaced
-		testapps.ClearResources(&testCtx, generics.ConfigMapSignature, inNS, ml)
-	}
-
-	BeforeEach(func() {
-		cleanEnv()
-	})
-
-	AfterEach(func() {
-		cleanEnv()
-	})
-
-	const (
-		compDefName   = "test-compdef"
-		clusterName   = "test-cluster"
-		mysqlCompName = "mysql"
-	)
-
-	var (
-		compDefObj     *appsv1.ComponentDefinition
-		cluster        *appsv1.Cluster
-		comp           *appsv1.Component
-		configSpecName string
-	)
-
-	Context("create cluster with component and component definition API, testing render configuration", func() {
-		createAllTypesClusterDef := func() {
-			By("Create a componentDefinition obj")
-			compDefObj = testapps.NewComponentDefinitionFactory(compDefName).
-				WithRandomName().
-				SetDefaultSpec().
-				AddConfigs(testapps.DefaultCompDefConfigs).
-				AddScripts(testapps.DefaultCompDefScripts).
-				AddVolumeMounts("mysql", []corev1.VolumeMount{{Name: testapps.DefaultConfigSpecVolumeName, MountPath: "/mnt/config"}}).
-				Create(&testCtx).
-				GetObject()
-		}
-
-		BeforeEach(func() {
-			createAllTypesClusterDef()
-
-			testapps.CreateCustomizedObj(&testCtx, "config/envfrom-config.yaml", &corev1.ConfigMap{}, testCtx.UseDefaultNamespace())
-			tpl := testapps.CreateCustomizedObj(&testCtx, "config/envfrom-constraint.yaml", &appsv1beta1.ConfigConstraint{})
-			configSpecName = tpl.Name
-
-			pvcSpec := testapps.NewPVCSpec("1Gi")
-			cluster = testapps.NewClusterFactory(testCtx.DefaultNamespace, clusterName, "").
-				AddComponent(mysqlCompName, compDefObj.Name).
-				SetReplicas(1).
-				AddVolumeClaimTemplate(testapps.DataVolumeName, pvcSpec).
-				Create(&testCtx).
-				GetObject()
-
-			var err error
-			comp, err = component.BuildComponent(cluster, &cluster.Spec.ComponentSpecs[0], nil, nil)
-			Expect(err).Should(Succeed())
-			comp.SetUID("test-uid")
-		})
-
-		It("render configuration should success", func() {
-			synthesizeComp, err := component.BuildSynthesizedComponent(ctx, testCtx.Cli, compDefObj, comp)
-			Expect(err).Should(Succeed())
-			Expect(synthesizeComp.PodSpec).ShouldNot(BeNil())
-			resCtx := &render.ResourceCtx{
-				Context:       testCtx.Ctx,
-				Client:        testCtx.Cli,
-				Namespace:     synthesizeComp.Namespace,
-				ClusterName:   synthesizeComp.ClusterName,
-				ComponentName: synthesizeComp.Name,
-			}
-			err = RenderConfigNScriptFiles(resCtx, cluster, comp, synthesizeComp, synthesizeComp.PodSpec, nil)
-			Expect(err).Should(Succeed())
-			Expect(configuration.CheckEnvFrom(&synthesizeComp.PodSpec.Containers[0], cfgcore.GenerateEnvFromName(cfgcore.GetComponentCfgName(cluster.Name, synthesizeComp.Name, configSpecName)))).Should(BeFalse())
-		})
-	})
-})
diff --git a/pkg/controller/plan/suite_test.go b/pkg/controller/plan/suite_test.go
index 13a105a34..f2f65e1f4 100644
--- a/pkg/controller/plan/suite_test.go
+++ b/pkg/controller/plan/suite_test.go
@@ -40,9 +40,8 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/metrics/server"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 	"github.com/apecloud/kubeblocks/pkg/testutil"
 	viper "github.com/apecloud/kubeblocks/pkg/viperx"
@@ -100,12 +99,6 @@ var _ = BeforeSuite(func() {
 	Expect(err).NotTo(HaveOccurred())
 	Expect(cfg).NotTo(BeNil())
 
-	err = appsv1alpha1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
-
-	err = appsv1beta1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
-
 	err = appsv1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 
@@ -115,6 +108,9 @@ var _ = BeforeSuite(func() {
 	err = snapshotv1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 
+	err = parametersv1alpha1.AddToScheme(scheme.Scheme)
+	Expect(err).NotTo(HaveOccurred())
+
 	// +kubebuilder:scaffold:scheme
 
 	k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
diff --git a/pkg/controllerutil/config_util_test.go b/pkg/controllerutil/config_util_test.go
index 36e1b1506..2283dd493 100644
--- a/pkg/controllerutil/config_util_test.go
+++ b/pkg/controllerutil/config_util_test.go
@@ -31,13 +31,11 @@ import (
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/resource"
 
-	"github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/core"
 	cfgutil "github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	"github.com/apecloud/kubeblocks/pkg/controller/builder"
-	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
 	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
 	"github.com/apecloud/kubeblocks/test/testdata"
 )
@@ -89,7 +87,7 @@ func TestFromUpdatedConfig(t *testing.T) {
 func TestIsRerender(t *testing.T) {
 	type args struct {
 		cm   *corev1.ConfigMap
-		item v1alpha1.ConfigurationItemDetail
+		item parametersv1alpha1.ConfigTemplateItemDetail
 	}
 	tests := []struct {
 		name string
@@ -100,7 +98,7 @@ func TestIsRerender(t *testing.T) {
 		name: "test",
 		args: args{
 			cm: nil,
-			item: v1alpha1.ConfigurationItemDetail{
+			item: parametersv1alpha1.ConfigTemplateItemDetail{
 				Name: "test",
 			},
 		},
@@ -109,58 +107,23 @@ func TestIsRerender(t *testing.T) {
 		name: "test",
 		args: args{
 			cm: builder.NewConfigMapBuilder("default", "test").GetObject(),
-			item: v1alpha1.ConfigurationItemDetail{
+			item: parametersv1alpha1.ConfigTemplateItemDetail{
 				Name: "test",
 			},
 		},
 		want: false,
-	}, {
-		name: "test",
-		args: args{
-			cm: builder.NewConfigMapBuilder("default", "test").
-				GetObject(),
-			item: v1alpha1.ConfigurationItemDetail{
-				Name:    "test",
-				Version: "v1",
-			},
-		},
-		want: true,
-	}, {
-		name: "test",
-		args: args{
-			cm: builder.NewConfigMapBuilder("default", "test").
-				AddAnnotations(constant.CMConfigurationTemplateVersion, "v1").
-				GetObject(),
-			item: v1alpha1.ConfigurationItemDetail{
-				Name:    "test",
-				Version: "v2",
-			},
-		},
-		want: true,
-	}, {
-		name: "test",
-		args: args{
-			cm: builder.NewConfigMapBuilder("default", "test").
-				AddAnnotations(constant.CMConfigurationTemplateVersion, "v1").
-				GetObject(),
-			item: v1alpha1.ConfigurationItemDetail{
-				Name:    "test",
-				Version: "v1",
-			},
-		},
-		want: false,
 	}, {
 		name: "import-template-test",
 		args: args{
 			cm: builder.NewConfigMapBuilder("default", "test").
 				AddAnnotations(constant.ConfigAppliedVersionAnnotationKey, "").
 				GetObject(),
-			item: v1alpha1.ConfigurationItemDetail{
+			item: parametersv1alpha1.ConfigTemplateItemDetail{
 				Name: "test",
-				ImportTemplateRef: &v1alpha1.ConfigTemplateExtension{
+				CustomTemplates: &parametersv1alpha1.ConfigTemplateExtension{
 					TemplateRef: "contig-test-template",
 					Namespace:   "default",
-					Policy:      v1alpha1.PatchPolicy,
+					Policy:      parametersv1alpha1.PatchPolicy,
 				},
 			},
 		},
@@ -171,7 +134,7 @@ func TestIsRerender(t *testing.T) {
 			cm: builder.NewConfigMapBuilder("default", "test").
 				AddAnnotations(constant.ConfigAppliedVersionAnnotationKey, `
 {
-  "importTemplateRef": {
+  "userConfigTemplates": {
     "templateRef": "contig-test-template",
     "namespace": "default",
     "policy": "patch"
@@ -179,12 +142,12 @@ func TestIsRerender(t *testing.T) {
 }
 `).
 				GetObject(),
-			item: v1alpha1.ConfigurationItemDetail{
+			item: parametersv1alpha1.ConfigTemplateItemDetail{
 				Name: "test",
-				ImportTemplateRef: &v1alpha1.ConfigTemplateExtension{
+				CustomTemplates: &parametersv1alpha1.ConfigTemplateExtension{
 					TemplateRef: "contig-test-template",
 					Namespace:   "default",
-					Policy:      v1alpha1.PatchPolicy,
+					Policy:      parametersv1alpha1.PatchPolicy,
 				},
 			},
 		},
@@ -195,28 +158,22 @@ func TestIsRerender(t *testing.T) {
 			cm: builder.NewConfigMapBuilder("default", "test").
 				AddAnnotations(constant.ConfigAppliedVersionAnnotationKey, "").
 				GetObject(),
-			item: v1alpha1.ConfigurationItemDetail{
-				Name: "test",
-				Payload: v1alpha1.Payload{
-					Data: map[string]any{
-						"key": "value",
-					},
-				},
+			item: parametersv1alpha1.ConfigTemplateItemDetail{
+				Name:    "test",
+				Payload: parametersv1alpha1.Payload{},
 			},
 		},
-		want: true,
+		want: false,
 	}, {
 		name: "payload-test",
 		args: args{
 			cm: builder.NewConfigMapBuilder("default", "test").
 				AddAnnotations(constant.ConfigAppliedVersionAnnotationKey, ` {"payload":{"key":"value"}} `).
 				GetObject(),
-			item: v1alpha1.ConfigurationItemDetail{
+			item: parametersv1alpha1.ConfigTemplateItemDetail{
 				Name: "test",
-				Payload: v1alpha1.Payload{
-					Data: map[string]any{
-						"key": "value",
-					},
+				Payload: parametersv1alpha1.Payload{
+					"key": transformPayload("value"),
 				},
 			},
 		},
@@ -234,48 +191,48 @@ func TestIsRerender(t *testing.T) {
 func TestGetConfigSpecReconcilePhase(t *testing.T) {
 	type args struct {
 		cm     *corev1.ConfigMap
-		item   v1alpha1.ConfigurationItemDetail
-		status *v1alpha1.ConfigurationItemDetailStatus
+		item   parametersv1alpha1.ConfigTemplateItemDetail
+		status *parametersv1alpha1.ConfigTemplateItemDetailStatus
 	}
 	tests := []struct {
 		name string
 		args args
-		want v1alpha1.ConfigurationPhase
+		want parametersv1alpha1.ParameterPhase
 	}{{
 		name: "test",
 		args: args{
 			cm: nil,
-			item: v1alpha1.ConfigurationItemDetail{
+			item: parametersv1alpha1.ConfigTemplateItemDetail{
 				Name: "test",
 			},
 		},
-		want: v1alpha1.CCreatingPhase,
+		want: parametersv1alpha1.CCreatingPhase,
 	}, {
 		name: "test",
 		args: args{
 			cm: builder.NewConfigMapBuilder("default", "test").GetObject(),
-			item: v1alpha1.ConfigurationItemDetail{
+			item: parametersv1alpha1.ConfigTemplateItemDetail{
 				Name: "test",
 			},
-			status: &v1alpha1.ConfigurationItemDetailStatus{
-				Phase: v1alpha1.CInitPhase,
+			status: &parametersv1alpha1.ConfigTemplateItemDetailStatus{
+				Phase: parametersv1alpha1.CInitPhase,
 			},
 		},
-		want: v1alpha1.CPendingPhase,
+		want: parametersv1alpha1.CPendingPhase,
 	}, {
 		name: "test",
 		args: args{
 			cm: builder.NewConfigMapBuilder("default", "test").
 				AddAnnotations(constant.ConfigAppliedVersionAnnotationKey, `{"name":"test"}`).
 				GetObject(),
-			item: v1alpha1.ConfigurationItemDetail{
+			item: parametersv1alpha1.ConfigTemplateItemDetail{
 				Name: "test",
 			},
-			status: &v1alpha1.ConfigurationItemDetailStatus{
-				Phase: v1alpha1.CUpgradingPhase,
+			status: &parametersv1alpha1.ConfigTemplateItemDetailStatus{
+				Phase: parametersv1alpha1.CUpgradingPhase,
 			},
 		},
-		want: v1alpha1.CUpgradingPhase,
+		want: parametersv1alpha1.CUpgradingPhase,
 	}}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
@@ -303,26 +260,22 @@ var _ = Describe("config_util", func() {
 	Context("MergeAndValidateConfigs", func() {
 		It("Should succeed with no error", func() {
 			type args struct {
-				configConstraint appsv1beta1.ConfigConstraintSpec
-				baseCfg          map[string]string
-				updatedParams    []core.ParamPairs
-				cmKeys           []string
+				parametersDef parametersv1alpha1.ParametersDefinition
+				baseCfg       map[string]string
+				updatedParams []core.ParamPairs
+				configs       []parametersv1alpha1.ComponentConfigDescription
 			}
 
-			configConstraintObj := testapps.NewCustomizedObj("resources/mysql-config-constraint.yaml",
-				&appsv1beta1.ConfigConstraint{}, func(cc *appsv1beta1.ConfigConstraint) {
-					if ccContext, err := testdata.GetTestDataFileContent("cue_testdata/pg14.cue"); err == nil {
-						cc.Spec.ParametersSchema = &appsv1beta1.ParametersSchema{
-							CUE: string(ccContext),
-						}
-					}
-					cc.Spec.FileFormatConfig = &appsv1beta1.FileFormatConfig{
-						Format: appsv1beta1.Properties,
-					}
-				})
-
-			cfgContext, err := testdata.GetTestDataFileContent("cue_testdata/pg14.conf")
-			Expect(err).Should(Succeed())
+			cfgContext, _ := testdata.GetTestDataFileContent("cue_testdata/pg14.conf")
+			ccContext, _ := testdata.GetTestDataFileContent("cue_testdata/pg14.cue")
+			paramsDef := parametersv1alpha1.ParametersDefinition{
+				Spec: parametersv1alpha1.ParametersDefinitionSpec{
+					FileName: "key",
+					ParametersSchema: &parametersv1alpha1.ParametersSchema{
+						CUE: string(ccContext),
+					},
+				},
+			}
 
 			tests := []struct {
 				name    string
@@ -332,7 +285,7 @@ var _ = Describe("config_util", func() {
 			}{{
 				name: "pg1_merge",
 				args: args{
-					configConstraint: configConstraintObj.Spec,
+					parametersDef: paramsDef,
 					baseCfg: map[string]string{
 						"key":  string(cfgContext),
 						"key2": "not support context",
@@ -346,7 +299,7 @@ var _ = Describe("config_util", func() {
 							},
 						},
 					},
-					cmKeys: []string{"key", "key3"},
+					configs: []parametersv1alpha1.ComponentConfigDescription{{Name: "key", FileFormatConfig: &parametersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.Properties}}},
 				},
 				want: map[string]string{
 					"max_connections": "200",
@@ -355,7 +308,7 @@ var _ = Describe("config_util", func() {
 			}, {
 				name: "not_support_key_updated",
 				args: args{
-					configConstraint: configConstraintObj.Spec,
+					parametersDef: paramsDef,
 					baseCfg: map[string]string{
 						"key":  string(cfgContext),
 						"key2": "not_support_context",
@@ -369,20 +322,20 @@ var _ = Describe("config_util", func() {
 							},
 						},
 					},
-					cmKeys: []string{"key1", "key2"},
+					configs: []parametersv1alpha1.ComponentConfigDescription{{Name: "key2", FileFormatConfig: &parametersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.Properties}}},
 				},
 				wantErr: true,
 			}}
 			for _, tt := range tests {
-				got, err := MergeAndValidateConfigs(tt.args.configConstraint, tt.args.baseCfg, tt.args.cmKeys, tt.args.updatedParams)
+				got, err := MergeAndValidateConfigs(tt.args.baseCfg, tt.args.updatedParams, []*parametersv1alpha1.ParametersDefinition{&tt.args.parametersDef}, tt.args.configs)
 				Expect(err != nil).Should(BeEquivalentTo(tt.wantErr))
 				if tt.wantErr {
 					continue
 				}
 
 				option := core.CfgOption{
-					Type:    core.CfgTplType,
-					CfgType: tt.args.configConstraint.FileFormatConfig.Format,
+					Type:         core.CfgTplType,
+					FileFormatFn: core.WithConfigFileFormat(tt.args.configs),
 				}
 
 				patch, err := core.CreateMergePatch(&core.ConfigResource{
@@ -403,7 +356,7 @@ var _ = Describe("config_util", func() {
 
 func TestCheckAndPatchPayload(t *testing.T) {
 	type args struct {
-		item      *v1alpha1.ConfigurationItemDetail
+		item      *parametersv1alpha1.ConfigTemplateItemDetail
 		payloadID string
 		payload   interface{}
 	}
@@ -415,7 +368,7 @@ func TestCheckAndPatchPayload(t *testing.T) {
 	}{{
 		name: "test",
 		args: args{
-			item:      &v1alpha1.ConfigurationItemDetail{},
+			item:      &parametersv1alpha1.ConfigTemplateItemDetail{},
 			payloadID: constant.BinaryVersionPayload,
 			payload:   "md5-12912uy1232o9y2",
 		},
@@ -430,11 +383,9 @@ func TestCheckAndPatchPayload(t *testing.T) {
 	}, {
 		name: "test-delete-payload",
 		args: args{
-			item: &v1alpha1.ConfigurationItemDetail{
-				Payload: v1alpha1.Payload{
-					Data: map[string]any{
-						constant.BinaryVersionPayload: "md5-12912uy1232o9y2",
-					},
+			item: &parametersv1alpha1.ConfigTemplateItemDetail{
+				Payload: parametersv1alpha1.Payload{
+					constant.BinaryVersionPayload: json.RawMessage("md5-12912uy1232o9y2"),
 				},
 			},
 			payloadID: constant.BinaryVersionPayload,
@@ -444,17 +395,15 @@ func TestCheckAndPatchPayload(t *testing.T) {
 	}, {
 		name: "test-update-payload",
 		args: args{
-			item: &v1alpha1.ConfigurationItemDetail{
-				Payload: v1alpha1.Payload{
-					Data: map[string]any{
-						constant.BinaryVersionPayload: "md5-12912uy1232o9y2",
-						constant.ComponentResourcePayload: map[string]any{
-							"limit": map[string]string{
-								"cpu":    "100m",
-								"memory": "100Mi",
-							},
+			item: &parametersv1alpha1.ConfigTemplateItemDetail{
+				Payload: parametersv1alpha1.Payload{
+					constant.BinaryVersionPayload: json.RawMessage("md5-12912uy1232o9y2"),
+					constant.ComponentResourcePayload: transformPayload(map[string]any{
+						"limit": map[string]string{
+							"cpu":    "100m",
+							"memory": "100Mi",
 						},
-					},
+					}),
 				},
 			},
 			payloadID: constant.ComponentResourcePayload,
@@ -526,9 +475,20 @@ func Test_filterImmutableParameters(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			if got := filterImmutableParameters(tt.args.parameters, tt.args.immutableParams); !reflect.DeepEqual(got, tt.want) {
+			paramsDefs := []*parametersv1alpha1.ParametersDefinition{{
+				Spec: parametersv1alpha1.ParametersDefinitionSpec{
+					FileName:            "test",
+					ImmutableParameters: tt.args.immutableParams,
+				},
+			}}
+			if got := filterImmutableParameters(tt.args.parameters, "test", paramsDefs); !reflect.DeepEqual(got, tt.want) {
 				t.Errorf("filterImmutableParameters() = %v, want %v", got, tt.want)
 			}
 		})
 	}
 }
+
+func transformPayload(data interface{}) json.RawMessage {
+	raw, _ := buildPayloadAsUnstructuredObject(data)
+	return raw
+}
diff --git a/pkg/controllerutil/suite_test.go b/pkg/controllerutil/suite_test.go
index cda571eae..966ad240f 100644
--- a/pkg/controllerutil/suite_test.go
+++ b/pkg/controllerutil/suite_test.go
@@ -39,8 +39,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/testutil"
 	viper "github.com/apecloud/kubeblocks/pkg/viperx"
 )
@@ -98,10 +97,7 @@ var _ = BeforeSuite(func() {
 	// +kubebuilder:scaffold:scheme
 	scheme := scheme.Scheme
 
-	err = appsv1alpha1.AddToScheme(scheme)
-	Expect(err).NotTo(HaveOccurred())
-
-	err = appsv1beta1.AddToScheme(scheme)
+	err = parametersv1alpha1.AddToScheme(scheme)
 	Expect(err).NotTo(HaveOccurred())
 
 	err = appsv1.AddToScheme(scheme)
diff --git a/pkg/operations/reconfigure_pipeline_test.go b/pkg/operations/reconfigure_pipeline_test.go
deleted file mode 100644
index 94f13fb3b..000000000
--- a/pkg/operations/reconfigure_pipeline_test.go
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package operations
-
-import (
-	"reflect"
-	"testing"
-
-	. "github.com/onsi/ginkgo/v2"
-	. "github.com/onsi/gomega"
-
-	corev1 "k8s.io/api/core/v1"
-	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/log"
-
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
-	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/controller/builder"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
-	testutil "github.com/apecloud/kubeblocks/pkg/testutil/k8s"
-	testops "github.com/apecloud/kubeblocks/pkg/testutil/operations"
-)
-
-var _ = Describe("Reconfigure util test", func() {
-
-	var (
-		k8sMockClient *testutil.K8sClientMockHelper
-		tpl           appsv1.ComponentConfigSpec
-		tpl2          appsv1.ComponentConfigSpec
-		updatedCfg    opsv1alpha1.ConfigurationItem
-	)
-
-	const (
-		clusterName   = "mysql-test"
-		componentName = "mysql"
-	)
-
-	mockCfgTplObj := func(tpl appsv1.ComponentConfigSpec) (*corev1.ConfigMap, *appsv1beta1.ConfigConstraint, *appsv1alpha1.Configuration) {
-		By("By assure an cm obj")
-
-		cfgCM := testapps.NewCustomizedObj("operations_config/config-template.yaml",
-			&corev1.ConfigMap{},
-			testapps.WithNamespacedName(core.GetComponentCfgName(clusterName, componentName, tpl.Name), testCtx.DefaultNamespace))
-		cfgTpl := testapps.NewCustomizedObj("operations_config/config-constraint.yaml",
-			&appsv1beta1.ConfigConstraint{},
-			testapps.WithNamespacedName(tpl.ConfigConstraintRef, tpl.Namespace))
-
-		configuration := builder.NewConfigurationBuilder(testCtx.DefaultNamespace,
-			core.GenerateComponentConfigurationName(clusterName, componentName)).
-			ClusterRef(clusterName).
-			Component(componentName).
-			AddConfigurationItem(tpl).
-			AddConfigurationItem(tpl2)
-		return cfgCM, cfgTpl, configuration.GetObject()
-	}
-
-	BeforeEach(func() {
-		k8sMockClient = testutil.NewK8sMockClient()
-		tpl = appsv1.ComponentConfigSpec{
-			ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-				Name:        "for_test",
-				TemplateRef: "cm_obj",
-			},
-			ConfigConstraintRef: "cfg_constraint_obj",
-			Keys:                []string{"my.cnf"},
-		}
-		tpl2 = appsv1.ComponentConfigSpec{
-			ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-				Name:        "for_test2",
-				TemplateRef: "cm_obj",
-			},
-		}
-		updatedCfg = opsv1alpha1.ConfigurationItem{
-			Name: tpl.Name,
-			Keys: []opsv1alpha1.ParameterConfig{{
-				Key: "my.cnf",
-				Parameters: []opsv1alpha1.ParameterPair{
-					{
-						Key:   "x1",
-						Value: func() *string { v := "y1"; return &v }(),
-					},
-					{
-						Key:   "x2",
-						Value: func() *string { v := "y2"; return &v }(),
-					},
-					{
-						Key:   "server-id",
-						Value: nil, // delete parameter
-					}},
-			}},
-		}
-	})
-
-	AfterEach(func() {
-		// Add any teardown steps that needs to be executed after each test
-		k8sMockClient.Finish()
-	})
-
-	Context("updateConfigConfigmapResource test", func() {
-		It("Should success without error", func() {
-			diffCfg := `{"mysqld":{"x1":"y1","x2":"y2"}}`
-
-			cmObj, tplObj, configObj := mockCfgTplObj(tpl)
-			tpl2Key := client.ObjectKey{
-				Namespace: cmObj.Namespace,
-				Name:      core.GetComponentCfgName(clusterName, componentName, tpl2.Name),
-			}
-			k8sMockClient.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSequenceResult(map[client.ObjectKey][]testutil.MockGetReturned{
-				// for cm
-				client.ObjectKeyFromObject(cmObj): {{
-					Object: nil,
-					Err:    core.MakeError("failed to get cm object"),
-				}, {
-					Object: cmObj,
-					Err:    nil,
-				}},
-				tpl2Key: {{
-					Object: cmObj,
-					Err:    nil,
-				}},
-				// for tpl
-				client.ObjectKeyFromObject(tplObj): {{
-					Object: nil,
-					Err:    core.MakeError("failed to get tpl object"),
-				}, {
-					Object: tplObj,
-					Err:    nil,
-				}},
-				// for configuration
-				client.ObjectKeyFromObject(configObj): {{
-					Object: nil,
-					// Err:    core.MakeError("failed to get configuration object"),
-				}, {
-					Object: configObj,
-				}},
-			}), testutil.WithAnyTimes()))
-
-			k8sMockClient.MockPatchMethod(testutil.WithPatchReturned(func(obj client.Object, patch client.Patch) error {
-				if cm, ok := obj.(*corev1.ConfigMap); ok {
-					cmObj.Data = cm.Data
-				}
-				return nil
-			}, testutil.WithAnyTimes()))
-
-			opsRes := &OpsResource{
-				Recorder: k8sManager.GetEventRecorderFor("Reconfiguring"),
-				OpsRequest: testops.NewOpsRequestObj("reconfigure-ops-"+testCtx.GetRandomStr(), testCtx.DefaultNamespace, //nolint:goconst
-					clusterName, opsv1alpha1.ReconfiguringType),
-			}
-			reqCtx := intctrlutil.RequestCtx{
-				Ctx:      testCtx.Ctx,
-				Log:      log.FromContext(ctx).WithName("Reconfiguring"),
-				Recorder: opsRes.Recorder,
-			}
-
-			By("Configuration object failed.")
-			// mock failed
-			// r := updateConfigConfigmapResource(updatedCfg, tpl, client.ObjectKeyFromObject(cmObj), ctx, k8sMockClient.Client(), "test", mockUpdate)
-			r := testUpdateConfigConfigmapResource(reqCtx, k8sMockClient.Client(), opsRes, updatedCfg, clusterName, componentName)
-			Expect(r.err).ShouldNot(Succeed())
-			Expect(r.err.Error()).Should(ContainSubstring("failed to found configuration of component"))
-
-			By("CM object failed.")
-			// mock failed
-			// r := updateConfigConfigmapResource(updatedCfg, tpl, client.ObjectKeyFromObject(cmObj), ctx, k8sMockClient.Client(), "test", mockUpdate)
-			r = testUpdateConfigConfigmapResource(reqCtx, k8sMockClient.Client(), opsRes, updatedCfg, clusterName, componentName)
-			Expect(r.err).ShouldNot(Succeed())
-			Expect(r.err.Error()).Should(ContainSubstring("failed to get cm object"))
-
-			By("TPL object failed.")
-			// mock failed
-			r = testUpdateConfigConfigmapResource(reqCtx, k8sMockClient.Client(), opsRes, updatedCfg, clusterName, componentName)
-			Expect(r.err).ShouldNot(Succeed())
-			Expect(r.err.Error()).Should(ContainSubstring("failed to get tpl object"))
-
-			By("update validate failed.")
-			r = testUpdateConfigConfigmapResource(reqCtx, k8sMockClient.Client(), opsRes, opsv1alpha1.ConfigurationItem{
-				Name: tpl.Name,
-				Keys: []opsv1alpha1.ParameterConfig{{
-					Key: "my.cnf",
-					Parameters: []opsv1alpha1.ParameterPair{
-						{
-							Key:   "innodb_autoinc_lock_mode",
-							Value: func() *string { v := "100"; return &v }(), // invalid value
-						},
-					},
-				}},
-			}, clusterName, componentName)
-			Expect(r.failed).Should(BeTrue())
-			Expect(r.err).ShouldNot(Succeed())
-			Expect(r.err.Error()).Should(ContainSubstring(`
-mysqld.innodb_autoinc_lock_mode: conflicting values 0 and 100:
-    9:36
-    12:18
-mysqld.innodb_autoinc_lock_mode: conflicting values 1 and 100:
-    9:40
-    12:18
-mysqld.innodb_autoinc_lock_mode: conflicting values 2 and 100:
-    9:44
-    12:18`))
-
-			By("normal params update")
-			{
-				// r := updateConfigConfigmapResource(updatedCfg, tpl, client.ObjectKeyFromObject(cmObj), ctx, k8sMockClient.Client(), "test", mockUpdate)
-				r := testUpdateConfigConfigmapResource(reqCtx, k8sMockClient.Client(), opsRes, updatedCfg, clusterName, componentName)
-				Expect(r.err).Should(Succeed())
-				Expect(r.noFormatFilesUpdated).Should(BeFalse())
-				Expect(r.configPatch).ShouldNot(BeNil())
-				diff := r.configPatch
-				Expect(diff.IsModify).Should(BeTrue())
-				Expect(diff.UpdateConfig["my.cnf"]).Should(BeEquivalentTo(diffCfg))
-			}
-
-			// normal params update
-			By("normal file update with configSpec keys")
-			{
-				updatedFiles := opsv1alpha1.ConfigurationItem{
-					Name: tpl2.Name,
-					Keys: []opsv1alpha1.ParameterConfig{{
-						Key: "my.cnf",
-						FileContent: `
-[mysqld]
-x1=y1
-z2=y2
-`,
-					}},
-				}
-
-				_ = updatedFiles
-				// r := updateConfigConfigmapResource(updatedFiles, tpl, client.ObjectKeyFromObject(cmObj), ctx, k8sMockClient.Client(), "test", mockUpdate)
-				r := testUpdateConfigConfigmapResource(reqCtx, k8sMockClient.Client(), opsRes, updatedFiles, clusterName, componentName)
-				Expect(r.err).Should(Succeed())
-			}
-
-			// not params update, but file update
-			By("normal file update with configSpec keys")
-			{
-				oldConfig := cmObj.Data
-				newMyCfg := oldConfig["my.cnf"]
-				newMyCfg += `
-# for test
-# not valid parameter
-`
-				updatedFiles := opsv1alpha1.ConfigurationItem{
-					Name: tpl2.Name,
-					Keys: []opsv1alpha1.ParameterConfig{{
-						Key:         "my.cnf",
-						FileContent: newMyCfg,
-					}},
-				}
-
-				_ = updatedFiles
-				// r := updateConfigConfigmapResource(updatedFiles, tpl, client.ObjectKeyFromObject(cmObj), ctx, k8sMockClient.Client(), "test", mockUpdate)
-				r := testUpdateConfigConfigmapResource(reqCtx, k8sMockClient.Client(), opsRes, updatedFiles, clusterName, componentName)
-				Expect(r.err).Should(Succeed())
-				Expect(r.configPatch).Should(BeNil())
-				Expect(r.noFormatFilesUpdated).Should(BeTrue())
-			}
-
-			By("normal file update without configSpec keys")
-			{
-				updatedFiles := opsv1alpha1.ConfigurationItem{
-					Name: tpl.Name,
-					Keys: []opsv1alpha1.ParameterConfig{{
-						Key:         "config2.txt",
-						FileContent: `# for test`,
-					}},
-				}
-
-				_ = updatedFiles
-				r := testUpdateConfigConfigmapResource(reqCtx, k8sMockClient.Client(), opsRes, updatedFiles, clusterName, componentName)
-				Expect(r.err).Should(Succeed())
-				diff := r.configPatch
-				Expect(diff.IsModify).Should(BeFalse())
-			}
-		})
-	})
-
-})
-
-func Test_createImmutableParamsFilter(t *testing.T) {
-	type args struct {
-		cc     *appsv1beta1.ConfigConstraint
-		inputs []string
-	}
-	tests := []struct {
-		name string
-		args args
-		want []bool
-	}{{
-		name: "test",
-		args: args{
-			inputs: []string{"abcd", "ef"},
-		},
-		want: []bool{true, true},
-	}, {
-		name: "test",
-		args: args{
-			cc: &appsv1beta1.ConfigConstraint{
-				Spec: appsv1beta1.ConfigConstraintSpec{
-					ImmutableParameters: []string{"a", "b", "c", "d"},
-				},
-			},
-			inputs: []string{"a", "ef", "efg", "d"},
-		},
-		want: []bool{false, true, true, false},
-	}, {
-		name: "test",
-		args: args{
-			cc:     &appsv1beta1.ConfigConstraint{},
-			inputs: []string{"a", "ef", "efg", "d"},
-		},
-		want: []bool{true, true, true, true},
-	},
-	}
-	for _, tt := range tests {
-		t.Run(tt.name, func(t *testing.T) {
-			filter := createImmutableParamsFilter(tt.args.cc)
-			for i, key := range tt.args.inputs {
-				if got := filter(key); !reflect.DeepEqual(got, tt.want[i]) {
-					t.Errorf("createImmutableParamsFilter() = %v, want %v", got, tt.want)
-				}
-			}
-		})
-	}
-}
diff --git a/pkg/operations/reconfigure_test.go b/pkg/operations/reconfigure_test.go
index 8c63a5328..50c4d031f 100644
--- a/pkg/operations/reconfigure_test.go
+++ b/pkg/operations/reconfigure_test.go
@@ -20,24 +20,14 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 package operations
 
 import (
-	"encoding/json"
-
 	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 
-	"github.com/spf13/cast"
-	corev1 "k8s.io/api/core/v1"
+	"k8s.io/utils/pointer"
 	"sigs.k8s.io/controller-runtime/pkg/client"
-	"sigs.k8s.io/controller-runtime/pkg/log"
 
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
-	"github.com/apecloud/kubeblocks/pkg/configuration/core"
-	"github.com/apecloud/kubeblocks/pkg/constant"
-	"github.com/apecloud/kubeblocks/pkg/controller/builder"
-	configutil "github.com/apecloud/kubeblocks/pkg/controller/configuration"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
 	"github.com/apecloud/kubeblocks/pkg/generics"
 	opsutil "github.com/apecloud/kubeblocks/pkg/operations/util"
@@ -68,285 +58,65 @@ var _ = Describe("Reconfigure OpsRequest", func() {
 		// namespaced
 		testapps.ClearResources(&testCtx, generics.OpsRequestSignature, inNS, ml)
 		testapps.ClearResources(&testCtx, generics.ConfigMapSignature, inNS, ml)
-		// non-namespaced
-		testapps.ClearResources(&testCtx, generics.ConfigConstraintSignature, ml)
 	}
 
 	BeforeEach(cleanEnv)
 
 	AfterEach(cleanEnv)
 
-	initClusterForOps := func(opsRes *OpsResource) {
-		Expect(opsutil.UpdateClusterOpsAnnotations(ctx, k8sClient, opsRes.Cluster, nil)).Should(Succeed())
-		opsRes.Cluster.Status.Phase = appsv1.RunningClusterPhase
-	}
-
-	assureCfgTplObj := func(tplName, cmName, ns string) (*corev1.ConfigMap, *appsv1beta1.ConfigConstraint) {
-		By("Assuring an cm obj")
-		cfgCM := testapps.NewCustomizedObj("operations_config/config-template.yaml",
-			&corev1.ConfigMap{}, testapps.WithNamespacedName(cmName, ns))
-		cfgTpl := testapps.NewCustomizedObj("operations_config/config-constraint.yaml",
-			&appsv1beta1.ConfigConstraint{}, testapps.WithNamespacedName(tplName, ns))
-		Expect(testCtx.CheckedCreateObj(ctx, cfgCM)).Should(Succeed())
-		Expect(testCtx.CheckedCreateObj(ctx, cfgTpl)).Should(Succeed())
-
-		return cfgCM, cfgTpl
-	}
-
-	assureConfigInstanceObj := func(clusterName, componentName, ns string, compDef *appsv1.ComponentDefinition) (*appsv1alpha1.Configuration, *corev1.ConfigMap) {
-		if len(compDef.Spec.Configs) == 0 {
-			return nil, nil
-		}
-
-		By("create configuration cr")
-		configuration := builder.NewConfigurationBuilder(testCtx.DefaultNamespace, core.GenerateComponentConfigurationName(clusterName, componentName)).
-			ClusterRef(clusterName).
-			Component(componentName)
-		for _, configSpec := range compDef.Spec.Configs {
-			configuration.AddConfigurationItem(configSpec)
-		}
-		Expect(testCtx.CheckedCreateObj(ctx, configuration.GetObject())).Should(Succeed())
-
-		// update status
-		By("update configuration status")
-		revision := "1"
-		Eventually(testapps.GetAndChangeObjStatus(&testCtx, client.ObjectKeyFromObject(configuration.GetObject()),
-			func(config *appsv1alpha1.Configuration) {
-				revision = cast.ToString(config.GetGeneration())
-				for _, item := range config.Spec.ConfigItemDetails {
-					configutil.CheckAndUpdateItemStatus(config, item, revision)
-				}
-			})).Should(Succeed())
-
-		By("create configmap for configSpecs")
-		var cmObj *corev1.ConfigMap
-		for _, configSpec := range compDef.Spec.Configs {
-			cmInsName := core.GetComponentCfgName(clusterName, componentName, configSpec.Name)
-			By("create configmap: " + cmInsName)
-			cfgCM := testapps.NewCustomizedObj("operations_config/config-template.yaml",
-				&corev1.ConfigMap{},
-				testapps.WithNamespacedName(cmInsName, ns),
-				testapps.WithLabels(
-					constant.AppNameLabelKey, clusterName,
-					constant.ConfigurationRevision, revision,
-					constant.AppInstanceLabelKey, clusterName,
-					constant.KBAppComponentLabelKey, componentName,
-					constant.CMConfigurationTemplateNameLabelKey, configSpec.TemplateRef,
-					constant.CMConfigurationConstraintsNameLabelKey, configSpec.ConfigConstraintRef,
-					constant.CMConfigurationSpecProviderLabelKey, configSpec.Name,
-					constant.CMConfigurationTypeLabelKey, constant.ConfigInstanceType,
-				),
-			)
-			Expect(testCtx.CheckedCreateObj(ctx, cfgCM)).Should(Succeed())
-			cmObj = cfgCM
-		}
-		return configuration.GetObject(), cmObj
-	}
-
-	assureMockReconfigureData := func(policyName string) (*OpsResource, *appsv1alpha1.Configuration, *corev1.ConfigMap) {
-		By("init operations resources ")
-		opsRes, compDef, clusterObject := initOperationsResources(compDefName, clusterName)
-
-		By("Test Reconfigure")
-		{
-			// mock cluster is Running to support reconfiguring ops
-			By("mock cluster status")
-			patch := client.MergeFrom(clusterObject.DeepCopy())
-			clusterObject.Status.Phase = appsv1.RunningClusterPhase
-			Expect(k8sClient.Status().Patch(ctx, clusterObject, patch)).Should(Succeed())
-		}
-
-		By("mock config tpl")
-		cmObj, tplObj := assureCfgTplObj("mysql-tpl-test", "mysql-cm-test", testCtx.DefaultNamespace)
-
-		By("update clusterdefinition tpl")
-		patch := client.MergeFrom(compDef.DeepCopy())
-		compDef.Spec.Configs = []appsv1.ComponentConfigSpec{{
-			ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-				Name:        "mysql-test",
-				TemplateRef: cmObj.Name,
-				VolumeName:  "mysql-config",
-				Namespace:   testCtx.DefaultNamespace,
-			},
-			ConfigConstraintRef: tplObj.Name,
-		}}
-		Expect(k8sClient.Patch(ctx, compDef, patch)).Should(Succeed())
-
-		By("mock config cm object")
-		config, cfgObj := assureConfigInstanceObj(clusterName, defaultCompName, testCtx.DefaultNamespace, compDef)
-
-		return opsRes, config, cfgObj
-	}
-
 	Context("Test Reconfigure", func() {
-		It("Test Reconfigure OpsRequest with restart", func() {
-			opsRes, configuration, _ := assureMockReconfigureData("simple")
-			reqCtx := intctrlutil.RequestCtx{
-				Ctx:      testCtx.Ctx,
-				Log:      log.FromContext(ctx).WithName("Reconfigure"),
-				Recorder: opsRes.Recorder,
-			}
-
-			By("mock reconfigure success")
-			ops := testops.NewOpsRequestObj("reconfigure-ops-"+randomStr, testCtx.DefaultNamespace,
+		It("Test Reconfigure OpsRequest", func() {
+			By("init operations resources ")
+			reqCtx := intctrlutil.RequestCtx{Ctx: ctx}
+			opsRes, _, _ := initOperationsResources(compDefName, clusterName)
+			testapps.MockInstanceSetComponent(&testCtx, clusterName, defaultCompName)
+			By("create Start opsRequest")
+			ops := testops.NewOpsRequestObj("start-ops-"+randomStr, testCtx.DefaultNamespace,
 				clusterName, opsv1alpha1.ReconfiguringType)
 			ops.Spec.Reconfigures = []opsv1alpha1.Reconfigure{
 				{
-					Configurations: []opsv1alpha1.ConfigurationItem{{
-						Name: "mysql-test",
-						Keys: []opsv1alpha1.ParameterConfig{{
-							Key: "my.cnf",
-							Parameters: []opsv1alpha1.ParameterPair{
-								{
-									Key:   "binlog_stmt_cache_size",
-									Value: func() *string { v := "4096"; return &v }(),
-								},
-								{
-									Key:   "key",
-									Value: func() *string { v := "abcd"; return &v }(),
-								},
-							},
-						}},
-					}},
 					ComponentOps: opsv1alpha1.ComponentOps{ComponentName: defaultCompName},
+					Parameters: []opsv1alpha1.ParameterPair{
+						{
+							Key:   "max_connections",
+							Value: pointer.String("200"),
+						}, {
+							Key:   "key",
+							Value: pointer.String("abcd"),
+						}},
 				},
 			}
+			opsRes.OpsRequest = testops.CreateOpsRequest(ctx, testCtx, ops)
 
-			By("Init Reconfiguring opsrequest")
-			opsRes.OpsRequest = ops
-			Expect(testCtx.CheckedCreateObj(ctx, ops)).Should(Succeed())
-			initClusterForOps(opsRes)
+			By("test start action and reconcile function")
+			Expect(opsutil.UpdateClusterOpsAnnotations(ctx, k8sClient, opsRes.Cluster, nil)).Should(Succeed())
 
-			opsManager := GetOpsManager()
-			By("init ops phase")
 			opsRes.OpsRequest.Status.Phase = opsv1alpha1.OpsPendingPhase
-			_, err := opsManager.Do(reqCtx, k8sClient, opsRes)
+			_, err := GetOpsManager().Do(reqCtx, k8sClient, opsRes)
 			Expect(err).ShouldNot(HaveOccurred())
-
-			By("Reconfigure configure")
-			_, err = opsManager.Do(reqCtx, k8sClient, opsRes)
+			Eventually(testops.GetOpsRequestPhase(&testCtx, client.ObjectKeyFromObject(opsRes.OpsRequest))).Should(Equal(opsv1alpha1.OpsCreatingPhase))
+			// do start action
+			_, err = GetOpsManager().Do(reqCtx, k8sClient, opsRes)
+			Expect(err).ShouldNot(HaveOccurred())
+			_, err = GetOpsManager().Reconcile(reqCtx, k8sClient, opsRes)
 			Expect(err).ShouldNot(HaveOccurred())
 
-			Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(opsRes.OpsRequest), opsRes.OpsRequest)).Should(Succeed())
-			_, _ = opsManager.Reconcile(reqCtx, k8sClient, opsRes)
-			Expect(opsRes.OpsRequest.Status.Phase).Should(Equal(opsv1alpha1.OpsRunningPhase))
-
-			By("mock configuration.status.phase to Finished")
-			var item *appsv1alpha1.ConfigurationItemDetail
-			Eventually(testapps.GetAndChangeObjStatus(&testCtx, client.ObjectKeyFromObject(configuration),
-				func(config *appsv1alpha1.Configuration) {
-					item = config.Spec.GetConfigurationItem("mysql-test")
-					for i := 0; i < len(config.Status.ConfigurationItemStatus); i++ {
-						config.Status.ConfigurationItemStatus[i].Phase = appsv1alpha1.CFinishedPhase
-						if config.Status.ConfigurationItemStatus[i].Name == item.Name {
-							config.Status.ConfigurationItemStatus[i].ReconcileDetail = &appsv1alpha1.ReconcileDetail{
-								Policy:          "simple",
-								CurrentRevision: config.Status.ConfigurationItemStatus[i].UpdateRevision,
-								SucceedCount:    2,
-								ExpectedCount:   2,
-							}
-						}
-					}
-				})).Should(Succeed())
-
-			By("mock configmap controller to updated")
-			Eventually(testapps.GetAndChangeObj(&testCtx, client.ObjectKey{
-				Name:      core.GetComponentCfgName(clusterName, defaultCompName, "mysql-test"),
-				Namespace: testCtx.DefaultNamespace},
-				func(cm *corev1.ConfigMap) {
-					b, err := json.Marshal(item)
-					Expect(err).ShouldNot(HaveOccurred())
-					if cm.Annotations == nil {
-						cm.Annotations = make(map[string]string)
-					}
-					cm.Annotations[constant.ConfigAppliedVersionAnnotationKey] = string(b)
-					b, err = json.Marshal(intctrlutil.Result{
-						Phase:      appsv1alpha1.CFinishedPhase,
-						Policy:     "simple",
-						ExecResult: "none",
-					})
-					Expect(err).ShouldNot(HaveOccurred())
-					cm.Annotations[core.GenerateRevisionPhaseKey("1")] = string(b)
-				})).Should(Succeed())
-
-			By("Reconfigure operation success")
-			// Expect(reAction.Handle(eventContext, ops.Name, opsv1alpha1.OpsSucceedPhase, nil)).Should(Succeed())
-			Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(opsRes.OpsRequest), opsRes.OpsRequest)).Should(Succeed())
-			_, _ = opsManager.Reconcile(reqCtx, k8sClient, opsRes)
-			Expect(opsRes.OpsRequest.Status.Phase).Should(Equal(opsv1alpha1.OpsSucceedPhase))
-		})
+			Eventually(testops.GetOpsRequestPhase(&testCtx, client.ObjectKeyFromObject(opsRes.OpsRequest))).Should(Equal(opsv1alpha1.OpsRunningPhase))
 
-		It("Test Reconfigure OpsRequest with autoReload", func() {
-			opsRes, _, _ := assureMockReconfigureData("autoReload")
-			reqCtx := intctrlutil.RequestCtx{
-				Ctx:      testCtx.Ctx,
-				Log:      log.FromContext(ctx).WithName("Reconfigure"),
-				Recorder: opsRes.Recorder,
-			}
+			var param = &parametersv1alpha1.Parameter{}
+			err = k8sClient.Get(testCtx.Ctx, client.ObjectKeyFromObject(opsRes.OpsRequest), param)
+			Expect(err).Should(BeNil())
 
-			By("mock reconfigure success")
-			ops := testops.NewOpsRequestObj("reconfigure-ops-"+randomStr+"-reload", testCtx.DefaultNamespace,
-				clusterName, opsv1alpha1.ReconfiguringType)
-			ops.Spec.Reconfigures = []opsv1alpha1.Reconfigure{
-				{
-					Configurations: []opsv1alpha1.ConfigurationItem{{
-						Name: "mysql-test",
-						Keys: []opsv1alpha1.ParameterConfig{{
-							Key: "my.cnf",
-							Parameters: []opsv1alpha1.ParameterPair{
-								{
-									Key:   "binlog_stmt_cache_size",
-									Value: func() *string { v := "4096"; return &v }(),
-								}},
-						}},
-					}},
-					ComponentOps: opsv1alpha1.ComponentOps{ComponentName: defaultCompName},
-				},
-			}
-
-			By("Init Reconfiguring opsrequest")
-			opsRes.OpsRequest = ops
-			Expect(testCtx.CheckedCreateObj(ctx, ops)).Should(Succeed())
-			initClusterForOps(opsRes)
-
-			opsManager := GetOpsManager()
-			// reAction := reconfigureAction{}
-			By("Reconfigure configure")
-			opsRes.OpsRequest.Status.Phase = opsv1alpha1.OpsPendingPhase
-			_, err := opsManager.Do(reqCtx, k8sClient, opsRes)
-			Expect(err).ShouldNot(HaveOccurred())
-			Eventually(testops.GetOpsRequestPhase(&testCtx, client.ObjectKeyFromObject(opsRes.OpsRequest))).Should(Equal(opsv1alpha1.OpsCreatingPhase))
-			// do reconfigure
-			_, err = opsManager.Do(reqCtx, k8sClient, opsRes)
-			Expect(err).ShouldNot(HaveOccurred())
-			By("configuration Reconcile callback")
+			// mock parameter phase to reconfiguring
+			Expect(testapps.ChangeObjStatus(&testCtx, param, func() {
+				param.Status.Phase = parametersv1alpha1.CFinishedPhase
+			})).Should(Succeed())
 
-			// Expect(reAction.Handle(eventContext, ops.Name, opsv1alpha1.OpsSucceedPhase, nil)).Should(Succeed())
-			By("Reconfigure configure")
-			_, _ = opsManager.Reconcile(reqCtx, k8sClient, opsRes)
-			// mock cluster.status.component.phase to Updating
-			mockClusterCompPhase := func(clusterObj *appsv1.Cluster, phase appsv1.ComponentPhase) {
-				clusterObject := clusterObj.DeepCopy()
-				patch := client.MergeFrom(clusterObject.DeepCopy())
-				compStatus := clusterObject.Status.Components[defaultCompName]
-				compStatus.Phase = phase
-				clusterObject.Status.Components[defaultCompName] = compStatus
-				Expect(k8sClient.Status().Patch(ctx, clusterObject, patch)).Should(Succeed())
-			}
-			mockClusterCompPhase(opsRes.Cluster, appsv1.UpdatingComponentPhase)
-			Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(opsRes.Cluster), opsRes.Cluster)).Should(Succeed())
+			_, err = GetOpsManager().Reconcile(reqCtx, k8sClient, opsRes)
+			Eventually(testops.GetOpsRequestPhase(&testCtx, client.ObjectKeyFromObject(opsRes.OpsRequest))).Should(Equal(opsv1alpha1.OpsSucceedPhase))
 
-			By("check cluster.status.components[*].phase == Reconfiguring")
-			Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(opsRes.OpsRequest), opsRes.OpsRequest)).Should(Succeed())
-			Expect(opsRes.Cluster.Status.Components[defaultCompName].Phase).Should(Equal(appsv1.UpdatingComponentPhase)) // appsv1.ReconfiguringPhase
-			// TODO: add status condition expect
-			_, _ = opsManager.Reconcile(reqCtx, k8sClient, opsRes)
-			// mock cluster.status.component.phase to Running
-			mockClusterCompPhase(opsRes.Cluster, appsv1.RunningComponentPhase)
+			Expect(err).Should(BeNil())
 
-			By("check cluster.status.components[*].phase == Running")
-			Expect(k8sClient.Get(ctx, client.ObjectKeyFromObject(opsRes.Cluster), opsRes.Cluster)).Should(Succeed())
-			Expect(opsRes.Cluster.Status.Components[defaultCompName].Phase).Should(Equal(appsv1.RunningComponentPhase))
 		})
 	})
 })
diff --git a/pkg/operations/reconfigure_util_test.go b/pkg/operations/reconfigure_util_test.go
deleted file mode 100644
index 9c9a8c27a..000000000
--- a/pkg/operations/reconfigure_util_test.go
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program.  If not, see <http://www.gnu.org/licenses/>.
-*/
-
-package operations
-
-import (
-	"sigs.k8s.io/controller-runtime/pkg/client"
-
-	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
-	intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
-)
-
-func testUpdateConfigConfigmapResource(
-	reqCtx intctrlutil.RequestCtx,
-	cli client.Client,
-	resource *OpsResource,
-	config opsv1alpha1.ConfigurationItem,
-	clusterName, componentName string) reconfiguringResult {
-
-	return newPipeline(reconfigureContext{
-		cli:           cli,
-		reqCtx:        reqCtx,
-		resource:      resource,
-		config:        config,
-		clusterName:   clusterName,
-		componentName: componentName,
-	}).Configuration().
-		Validate().
-		ConfigMap(config.Name).
-		ConfigConstraints().
-		Merge().
-		UpdateOpsLabel().
-		Sync().
-		Complete()
-}
diff --git a/pkg/operations/suite_test.go b/pkg/operations/suite_test.go
index 7e8d3fa98..bf01631cb 100644
--- a/pkg/operations/suite_test.go
+++ b/pkg/operations/suite_test.go
@@ -41,10 +41,9 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/metrics/server"
 
 	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
-	appsv1alpha1 "github.com/apecloud/kubeblocks/apis/apps/v1alpha1"
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
 	dpv1alpha1 "github.com/apecloud/kubeblocks/apis/dataprotection/v1alpha1"
 	opsv1alpha1 "github.com/apecloud/kubeblocks/apis/operations/v1alpha1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
 	"github.com/apecloud/kubeblocks/pkg/constant"
 	intctrlcomp "github.com/apecloud/kubeblocks/pkg/controller/component"
@@ -105,10 +104,6 @@ var _ = BeforeSuite(func() {
 	Expect(err).NotTo(HaveOccurred())
 	Expect(cfg).NotTo(BeNil())
 
-	err = appsv1alpha1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
-	err = appsv1beta1.AddToScheme(scheme.Scheme)
-	Expect(err).NotTo(HaveOccurred())
 	err = opsv1alpha1.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
 	err = appsv1.AddToScheme(scheme.Scheme)
@@ -117,6 +112,8 @@ var _ = BeforeSuite(func() {
 	Expect(err).NotTo(HaveOccurred())
 	err = workloads.AddToScheme(scheme.Scheme)
 	Expect(err).NotTo(HaveOccurred())
+	err = parametersv1alpha1.AddToScheme(scheme.Scheme)
+	Expect(err).NotTo(HaveOccurred())
 
 	// +kubebuilder:scaffold:scheme
 
diff --git a/pkg/testutil/apps/componentdefinition_factory.go b/pkg/testutil/apps/componentdefinition_factory.go
index 4dfab70bf..f376f7edd 100644
--- a/pkg/testutil/apps/componentdefinition_factory.go
+++ b/pkg/testutil/apps/componentdefinition_factory.go
@@ -171,28 +171,24 @@ func (f *MockComponentDefinitionFactory) AddServiceExt(name, serviceName string,
 	return f
 }
 
-func (f *MockComponentDefinitionFactory) AddConfigTemplate(name, configTemplateRef, configConstraintRef,
-	namespace, volumeName string, injectEnvTo ...string) *MockComponentDefinitionFactory {
-	config := kbappsv1.ComponentConfigSpec{
-		ComponentTemplateSpec: kbappsv1.ComponentTemplateSpec{
-			Name:        name,
-			TemplateRef: configTemplateRef,
-			Namespace:   namespace,
-			VolumeName:  volumeName,
-		},
-		ConfigConstraintRef: configConstraintRef,
-		InjectEnvTo:         injectEnvTo,
+func (f *MockComponentDefinitionFactory) AddConfigTemplate(name, configTemplateRef,
+	namespace, volumeName string) *MockComponentDefinitionFactory {
+	config := kbappsv1.ComponentTemplateSpec{
+		Name:        name,
+		TemplateRef: configTemplateRef,
+		Namespace:   namespace,
+		VolumeName:  volumeName,
 	}
 	if f.Get().Spec.Configs == nil {
-		f.Get().Spec.Configs = make([]kbappsv1.ComponentConfigSpec, 0)
+		f.Get().Spec.Configs = make([]kbappsv1.ComponentTemplateSpec, 0)
 	}
 	f.Get().Spec.Configs = append(f.Get().Spec.Configs, config)
 	return f
 }
 
-func (f *MockComponentDefinitionFactory) AddConfigs(configs []kbappsv1.ComponentConfigSpec) *MockComponentDefinitionFactory {
+func (f *MockComponentDefinitionFactory) AddConfigs(configs []kbappsv1.ComponentTemplateSpec) *MockComponentDefinitionFactory {
 	if f.Get().Spec.Configs == nil {
-		f.Get().Spec.Configs = make([]kbappsv1.ComponentConfigSpec, 0)
+		f.Get().Spec.Configs = make([]kbappsv1.ComponentTemplateSpec, 0)
 	}
 	f.Get().Spec.Configs = append(f.Get().Spec.Configs, configs...)
 	return f
diff --git a/pkg/testutil/apps/constant.go b/pkg/testutil/apps/constant.go
index e3366e64d..5e0048dea 100644
--- a/pkg/testutil/apps/constant.go
+++ b/pkg/testutil/apps/constant.go
@@ -253,14 +253,11 @@ var (
 		},
 	}
 
-	DefaultCompDefConfigs = []appsv1.ComponentConfigSpec{
+	DefaultCompDefConfigs = []appsv1.ComponentTemplateSpec{
 		{
-			ComponentTemplateSpec: appsv1.ComponentTemplateSpec{
-				Name:        DefaultConfigSpecName,
-				TemplateRef: DefaultConfigSpecTplRef,
-				VolumeName:  DefaultConfigSpecVolumeName,
-			},
-			ConfigConstraintRef: DefaultConfigSpecConstraintRef,
+			Name:        DefaultConfigSpecName,
+			TemplateRef: DefaultConfigSpecTplRef,
+			VolumeName:  DefaultConfigSpecVolumeName,
 		},
 	}
 
diff --git a/pkg/testutil/k8s/k8sclient_util.go b/pkg/testutil/k8s/k8sclient_util.go
index 0861f662b..33cd366c4 100644
--- a/pkg/testutil/k8s/k8sclient_util.go
+++ b/pkg/testutil/k8s/k8sclient_util.go
@@ -33,6 +33,7 @@ import (
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
+	"github.com/apecloud/kubeblocks/pkg/generics"
 	mock_client "github.com/apecloud/kubeblocks/pkg/testutil/k8s/mocks"
 )
 
@@ -172,6 +173,29 @@ func (helper *K8sClientMockHelper) MockDeleteMethod(options ...any) {
 	helper.mockMethod(&helper.updateCaller, options...)
 }
 
+func WithArgsNum(num int) []any {
+	matchers := make([]any, num)
+	for i := 0; i < num; i++ {
+		matchers[i] = gomock.Any()
+	}
+	return matchers
+}
+
+func (helper *K8sClientMockHelper) MockNListMethod(argsN int, options ...any) {
+	helper.listCaller.Caller(func() (CallerFunction, DoReturnedFunction) {
+		caller := func() *gomock.Call {
+			return helper.k8sClient.EXPECT().List(gomock.Any(), gomock.Any(), WithArgsNum(argsN)...)
+		}
+		doAndReturn := func(caller *gomock.Call, fnWrap HandleListReturnedObject) {
+			caller.DoAndReturn(func(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error {
+				return fnWrap(list)
+			})
+		}
+		return caller, doAndReturn
+	})
+	helper.mockMethod(&helper.listCaller, options...)
+}
+
 func (helper *K8sClientMockHelper) MockListMethod(options ...any) {
 	helper.listCaller.Caller(func() (CallerFunction, DoReturnedFunction) {
 		caller := func() *gomock.Call {
@@ -344,14 +368,21 @@ func WithCreatedFailedResult() HandleCreateReturnedObject {
 type Getter = func(key client.ObjectKey, obj client.Object) (bool, error)
 
 func WithConstructSimpleGetResult(mockObjs []client.Object, get ...Getter) HandleGetReturnedObject {
-	mockMap := make(map[client.ObjectKey]client.Object, len(mockObjs))
+	mockMap := make(map[schema.GroupVersionKind]map[client.ObjectKey]client.Object, len(mockObjs))
 	for _, obj := range mockObjs {
-		mockMap[client.ObjectKeyFromObject(obj)] = obj
+		kind := generics.ToGVK(obj)
+		if _, ok := mockMap[kind]; !ok {
+			mockMap[kind] = make(map[client.ObjectKey]client.Object)
+		}
+		mockMap[kind][client.ObjectKeyFromObject(obj)] = obj
 	}
 	return func(key client.ObjectKey, obj client.Object) error {
-		if mockObj, ok := mockMap[key]; ok {
-			SetGetReturnedObject(obj, mockObj)
-			return nil
+		kind := generics.ToGVK(obj)
+		if mockMap[kind] != nil {
+			if mockObj, ok := mockMap[kind][key]; ok {
+				SetGetReturnedObject(obj, mockObj)
+				return nil
+			}
 		}
 		if len(get) > 0 {
 			processed, err := get[0](key, obj)
diff --git a/pkg/testutil/parameters/componenttemplate_factory.go b/pkg/testutil/parameters/componenttemplate_factory.go
index ff2919c1c..076cccdf6 100644
--- a/pkg/testutil/parameters/componenttemplate_factory.go
+++ b/pkg/testutil/parameters/componenttemplate_factory.go
@@ -63,14 +63,4 @@ slow_query_log=0
 [client]
 socket=/var/run/mysqld/mysqld.sock
 host=localhost
-{{- if $.component.tlsConfig }}
-{{- $ca_file := getCAFile }}
-{{- $cert_file := getCertFile }}
-{{- $key_file := getKeyFile }}
-# tls
-require_secure_transport=ON
-ssl_ca={{ $ca_file }}
-ssl_cert={{ $cert_file }}
-ssl_key={{ $key_file }}
-{{- end }}
 `
diff --git a/pkg/testutil/parameters/parameter_factory.go b/pkg/testutil/parameters/parameter_factory.go
index 54741f1af..c8b53be01 100644
--- a/pkg/testutil/parameters/parameter_factory.go
+++ b/pkg/testutil/parameters/parameter_factory.go
@@ -22,7 +22,6 @@ package parameters
 import (
 	"k8s.io/utils/pointer"
 
-	appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
 	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
 )
@@ -58,12 +57,12 @@ func (f *MockParameterFactory) AddParameters(paramName, paramValue string) *Mock
 func (f *MockParameterFactory) AddCustomTemplate(tpl string, templateName, ns string) *MockParameterFactory {
 	param := &f.Get().Spec.ComponentParameters[0]
 	if param.CustomTemplates == nil {
-		param.CustomTemplates = make(map[string]appsv1.ConfigTemplateExtension)
+		param.CustomTemplates = make(map[string]parametersv1alpha1.ConfigTemplateExtension)
 	}
-	param.CustomTemplates[tpl] = appsv1.ConfigTemplateExtension{
+	param.CustomTemplates[tpl] = parametersv1alpha1.ConfigTemplateExtension{
 		TemplateRef: templateName,
 		Namespace:   ns,
-		Policy:      appsv1.PatchPolicy,
+		Policy:      parametersv1alpha1.PatchPolicy,
 	}
 	return f
 }
diff --git a/pkg/unstructured/properties_test.go b/pkg/unstructured/properties_test.go
index 96e037040..189c3939e 100644
--- a/pkg/unstructured/properties_test.go
+++ b/pkg/unstructured/properties_test.go
@@ -24,7 +24,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 func TestPropertiesFormat(t *testing.T) {
@@ -53,7 +53,7 @@ brokerMaxConnections=0
 # The maximum number of connections per IP. If it exceeds, new connections are rejected.
 brokerMaxConnectionsPerIp=0
 `
-	propsConfigObj, err := LoadConfig("props_test", propsContext, appsv1beta1.PropertiesPlus)
+	propsConfigObj, err := LoadConfig("props_test", propsContext, parametersv1alpha1.PropertiesPlus)
 	assert.Nil(t, err)
 
 	assert.EqualValues(t, propsConfigObj.Get("brokerDeduplicationProducerInactivityTimeoutMinutes"), "360")
@@ -70,7 +70,7 @@ brokerMaxConnectionsPerIp=0
 
 	dumpContext, err := propsConfigObj.Marshal()
 	assert.Nil(t, err)
-	newObj, err := LoadConfig("props_test", dumpContext, appsv1beta1.PropertiesPlus)
+	newObj, err := LoadConfig("props_test", dumpContext, parametersv1alpha1.PropertiesPlus)
 	assert.Nil(t, err)
 	assert.EqualValues(t, newObj.GetAllParameters(), propsConfigObj.GetAllParameters())
 
@@ -84,7 +84,7 @@ brokerMaxConnectionsPerIp=0
 }
 
 func TestPropertiesEmpty(t *testing.T) {
-	propsConfigObj, err := LoadConfig("props_test", "", appsv1beta1.PropertiesPlus)
+	propsConfigObj, err := LoadConfig("props_test", "", parametersv1alpha1.PropertiesPlus)
 	assert.Nil(t, err)
 
 	v, err := propsConfigObj.Marshal()
diff --git a/pkg/unstructured/redis_config_test.go b/pkg/unstructured/redis_config_test.go
index 7a5a6b672..04a7d7453 100644
--- a/pkg/unstructured/redis_config_test.go
+++ b/pkg/unstructured/redis_config_test.go
@@ -26,12 +26,12 @@ import (
 
 	"github.com/stretchr/testify/require"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/test/testdata"
 )
 
 func TestRedisConfig(t *testing.T) {
-	c, err := LoadConfig("test", "", appsv1beta1.RedisCfg)
+	c, err := LoadConfig("test", "", parametersv1alpha1.RedisCfg)
 	require.Nil(t, err)
 
 	tests := []struct {
@@ -96,7 +96,7 @@ func TestRedisConfigGetAllParameters(t *testing.T) {
 	}{{
 		name: "multi field update test",
 		fn: func() ConfigObject {
-			c, _ := LoadConfig("test", "", appsv1beta1.RedisCfg)
+			c, _ := LoadConfig("test", "", parametersv1alpha1.RedisCfg)
 			_ = c.Update("port", "123")
 			_ = c.Update("a b", "123 234")
 			_ = c.Update("a c", "345")
@@ -114,7 +114,7 @@ func TestRedisConfigGetAllParameters(t *testing.T) {
 	}, {
 		name: "multi field update and delete test",
 		fn: func() ConfigObject {
-			c, _ := LoadConfig("test", "", appsv1beta1.RedisCfg)
+			c, _ := LoadConfig("test", "", parametersv1alpha1.RedisCfg)
 			_ = c.Update("port", "123")
 			_ = c.Update("a b", "123 234")
 			_ = c.Update("a c", "345")
@@ -195,7 +195,7 @@ zset-max-listpack-value 64`
 	}}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
-			config, err := LoadConfig(tt.name, tt.input, appsv1beta1.RedisCfg)
+			config, err := LoadConfig(tt.name, tt.input, parametersv1alpha1.RedisCfg)
 			if (err != nil) != tt.wantErr {
 				t.Errorf("Marshal() error = %v, wantErr %v", err, tt.wantErr)
 				return
diff --git a/pkg/unstructured/viper_wrap_test.go b/pkg/unstructured/viper_wrap_test.go
index a6c439461..4bbf92b73 100644
--- a/pkg/unstructured/viper_wrap_test.go
+++ b/pkg/unstructured/viper_wrap_test.go
@@ -24,7 +24,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 func TestIniFormat(t *testing.T) {
@@ -41,7 +41,7 @@ plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semis
 port=3306
 `
 
-	iniConfigObj, err := LoadConfig("ini_test", iniContext, appsv1beta1.Ini)
+	iniConfigObj, err := LoadConfig("ini_test", iniContext, parametersv1alpha1.Ini)
 	assert.Nil(t, err)
 
 	assert.EqualValues(t, iniConfigObj.Get("mysqld.gtid_mode"), "OFF")
@@ -77,7 +77,7 @@ autovacuum_freeze_max_age = '100000000'
 autovacuum_max_workers = '1'
 autovacuum_naptime = '1min'
 `
-	propConfigObj, err := LoadConfig("prop_test", propertiesContext, appsv1beta1.Properties)
+	propConfigObj, err := LoadConfig("prop_test", propertiesContext, parametersv1alpha1.Properties)
 	assert.Nil(t, err)
 
 	assert.EqualValues(t, propConfigObj.Get("auto_explain.log_nested_statements"), "'True'")
@@ -107,7 +107,7 @@ func TestJSONFormat(t *testing.T) {
   "type": "student"
 }`
 
-	jsonConfigObj, err := LoadConfig("json_test", jsonContext, appsv1beta1.JSON)
+	jsonConfigObj, err := LoadConfig("json_test", jsonContext, parametersv1alpha1.JSON)
 	assert.Nil(t, err)
 
 	assert.EqualValues(t, jsonConfigObj.Get("id"), "0001")
diff --git a/pkg/unstructured/xml_config_test.go b/pkg/unstructured/xml_config_test.go
index 24ef27f49..b188acf23 100644
--- a/pkg/unstructured/xml_config_test.go
+++ b/pkg/unstructured/xml_config_test.go
@@ -24,7 +24,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 )
 
 func TestXMLFormat(t *testing.T) {
@@ -47,7 +47,7 @@ func TestXMLFormat(t *testing.T) {
     </web>
 </profiles>
 `
-	xmlConfigObj, err := LoadConfig("xml_test", xmlContext, appsv1beta1.XML)
+	xmlConfigObj, err := LoadConfig("xml_test", xmlContext, parametersv1alpha1.XML)
 	assert.Nil(t, err)
 
 	assert.EqualValues(t, xmlConfigObj.Get("profiles.default.max_threads"), 8)
@@ -64,7 +64,7 @@ func TestXMLFormat(t *testing.T) {
 
 	dumpContext, err := xmlConfigObj.Marshal()
 	assert.Nil(t, err)
-	newObj, err := LoadConfig("xml_test", dumpContext, appsv1beta1.XML)
+	newObj, err := LoadConfig("xml_test", dumpContext, parametersv1alpha1.XML)
 	assert.Nil(t, err)
 	assert.EqualValues(t, newObj.GetAllParameters(), xmlConfigObj.GetAllParameters())
 
diff --git a/pkg/unstructured/yaml_config_test.go b/pkg/unstructured/yaml_config_test.go
index 4df88d103..7aaa2bed7 100644
--- a/pkg/unstructured/yaml_config_test.go
+++ b/pkg/unstructured/yaml_config_test.go
@@ -24,7 +24,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 
-	appsv1beta1 "github.com/apecloud/kubeblocks/apis/apps/v1beta1"
+	parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
 	"github.com/apecloud/kubeblocks/pkg/configuration/util"
 	"github.com/apecloud/kubeblocks/test/testdata"
 )
@@ -44,7 +44,7 @@ spec:
       name: postgresql-configuration
 `
 
-	yamlConfigObj, err := LoadConfig("yaml_test", yamlContext, appsv1beta1.YAML)
+	yamlConfigObj, err := LoadConfig("yaml_test", yamlContext, parametersv1alpha1.YAML)
 	assert.Nil(t, err)
 
 	assert.EqualValues(t, yamlConfigObj.Get("spec.clusterRef"), "pg")
@@ -65,7 +65,7 @@ func TestYAMLFormatForBadCase(t *testing.T) {
 	b, err := testdata.GetTestDataFileContent("config_encoding/prometheus.yaml")
 	assert.Nil(t, err)
 
-	yamlConfigObj, err := LoadConfig("yaml_test", string(b), appsv1beta1.YAML)
+	yamlConfigObj, err := LoadConfig("yaml_test", string(b), parametersv1alpha1.YAML)
 	assert.Nil(t, err)
 	assert.NotNil(t, yamlConfigObj)
 	yamlConfigObj.GetAllParameters()
diff --git a/test/testdata/config/config-constraint.yaml b/test/testdata/config/config-constraint.yaml
deleted file mode 100644
index 48452da60..000000000
--- a/test/testdata/config/config-constraint.yaml
+++ /dev/null
@@ -1,41 +0,0 @@
-apiVersion: apps.kubeblocks.io/v1beta1
-kind: ConfigConstraint
-metadata:
-  name: mysql-tree-node-template-8.0
-  namespace: default
-spec:
-  reloadAction:
-    unixSignalTrigger:
-      signal: SIGHUP
-      processName: mysqld
-
-
-  # ConfigurationSchema that impose restrictions on engine parameter's rule
-  parametersSchema:
-    # top level mysql configuration type
-    topLevelKey: MysqlParameter
-
-    # schema: auto generate from cue scripts
-    # example: ../../pkg/configuration/testdata/mysql_openapi.json
-    cue: |-
-      [SectionName=_]: {
-        // [OFF|ON] default ON
-        automatic_sp_privileges: string & "OFF" | "ON" | *"ON"
-        // [1~65535] default ON
-        auto_increment_increment: int & >= 1 & <= 65535 | *1
-        // [4096~16777216] default 2G
-        binlog_stmt_cache_size?: int & >= 4096 & <= 16777216 | *2097152
-        // [0|1|2] default: 2
-        innodb_autoinc_lock_mode?: int & 0 | 1 | 2 | *2
-        ...
-      }
-
-  #  require db instance restart
-  staticParameters:
-    - automatic_sp_privileges
-
-  # mysql configuration file format
-  fileFormatConfig:
-    format: ini
-    iniConfig:
-      sectionName: mysqld
\ No newline at end of file
diff --git a/test/testdata/config/config-template.yaml b/test/testdata/config/config-template.yaml
deleted file mode 100644
index 08774cf62..000000000
--- a/test/testdata/config/config-template.yaml
+++ /dev/null
@@ -1,24 +0,0 @@
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: mysql-tree-node-template-8.0
-  namespace: default
-data:
-  my.cnf: |-
-    [mysqld]
-    innodb-buffer-pool-size=512M
-    log-bin=master-bin
-    gtid_mode=OFF
-    consensus_auto_leader_transfer=ON
-
-    pid-file=/var/run/mysqld/mysqld.pid
-    socket=/var/run/mysqld/mysqld.sock
-
-    port=3306
-    general_log=0
-    server-id=1
-    slow_query_log=0
-
-    [client]
-    socket=/var/run/mysqld/mysqld.sock
-    host=localhost
\ No newline at end of file
diff --git a/test/testdata/config/envfrom-config.yaml b/test/testdata/config/envfrom-config.yaml
deleted file mode 100644
index 9c2a56d51..000000000
--- a/test/testdata/config/envfrom-config.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: env-from-config-tpl
-  namespace: default
-data:
-  env-config: |-
-    dbStorage_rocksDB_writeBufferSizeMB=8
-    dbStorage_rocksDB_sstSizeInMB=64
-    dbStorage_rocksDB_blockSize=65536
-    dbStorage_rocksDB_bloomFilterBitsPerKey=10
-    dbStorage_rocksDB_numLevels=-1
-    dbStorage_rocksDB_numFilesInLevel0=4
-    dbStorage_rocksDB_maxSizeInLevel1MB=256
\ No newline at end of file
diff --git a/test/testdata/config/envfrom-constraint.yaml b/test/testdata/config/envfrom-constraint.yaml
deleted file mode 100644
index 1b215bf56..000000000
--- a/test/testdata/config/envfrom-constraint.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-apiVersion: apps.kubeblocks.io/v1beta1
-kind: ConfigConstraint
-metadata:
-  name: env-from-config-test
-spec:
-  fileFormatConfig:
-    format: properties
\ No newline at end of file
diff --git a/test/testdata/operations_config/config-constraint.yaml b/test/testdata/operations_config/config-constraint.yaml
deleted file mode 100644
index bcd4b12e5..000000000
--- a/test/testdata/operations_config/config-constraint.yaml
+++ /dev/null
@@ -1,33 +0,0 @@
-apiVersion: apps.kubeblocks.io/v1beta1
-kind: ConfigConstraint
-metadata:
-  name: mysql-tree-node-template-8.0
-spec:
-  # ConfigurationSchema that impose restrictions on engine parameter's rule
-  parametersSchema:
-    # schema: auto generate from cue scripts
-    # example: ../../pkg/configuration/testdata/mysql_openapi.json
-    cue: |-
-      #PARAM: {
-        // [OFF|ON] default ON
-        automatic_sp_privileges: string & "OFF" | "ON" | *"ON"
-        // [1~65535] default ON
-        auto_increment_increment: int & >= 1 & <= 65535 | *1
-        // [4096~16777216] default 2G
-        binlog_stmt_cache_size?: int & >= 4096 & <= 16777216 | *2097152
-        // [0|1|2] default: 2
-        innodb_autoinc_lock_mode?: int & 0 | 1 | 2 | *2
-        ...
-      }
-      [SectionName=_]: #PARAM
-
-  dynamicParameters:
-    - binlog_stmt_cache_size
-    - x
-    - y
-
-  # mysql configuration file format
-  fileFormatConfig:
-    format: ini
-    iniConfig:
-      sectionName: mysqld
\ No newline at end of file
diff --git a/test/testdata/operations_config/config-template.yaml b/test/testdata/operations_config/config-template.yaml
deleted file mode 100644
index 3f6bf005d..000000000
--- a/test/testdata/operations_config/config-template.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-apiVersion: v1
-kind: ConfigMap
-metadata:
-  name: mysql-tree-node-template-8.0
-data:
-  my.cnf: |-
-    [mysqld]
-    innodb-buffer-pool-size=512M
-    log-bin=master-bin
-    gtid_mode=OFF
-    consensus_auto_leader_transfer=ON
-
-    pid-file=/var/run/mysqld/mysqld.pid
-    socket=/var/run/mysqld/mysqld.sock
-
-    port=3306
-    general_log=0
-    server-id=1
-    slow_query_log=0
-
-    [client]
-    socket=/var/run/mysqld/mysqld.sock
-    host=localhost
\ No newline at end of file