diff --git a/pkg/extension/action.go b/pkg/extension/action.go
index a8062d3ddda18f6a7990eb122262aac336d3a919..55827d81e6c5b2237b1f2ee188f88293ea22c08b 100644
--- a/pkg/extension/action.go
+++ b/pkg/extension/action.go
@@ -1,6 +1,8 @@
 package extension
 
 import (
+	"strings"
+
 	"git.perx.ru/perxis/perxis-go/pkg/references"
 	pb "git.perx.ru/perxis/perxis-go/proto/extensions"
 	"github.com/mitchellh/mapstructure"
@@ -116,7 +118,7 @@ func ActionToMap(action *Action) map[string]interface{} {
 	if action == nil {
 		return nil
 	}
-	
+
 	res := make(map[string]interface{})
 	if err := mapstructure.Decode(action, &res); err != nil {
 		return nil
@@ -274,3 +276,28 @@ func ActionToPB(a *Action) *pb.Action {
 		Order:            a.Order,
 	}
 }
+
+func (r *ActionRequest) NewSubRequest() *ActionRequest {
+	md := map[string]string{
+		"request_extension":     r.Extension,
+		"request_action":        r.Action,
+		"request_space_id":      r.SpaceID,
+		"request_env_id":        r.EnvID,
+		"request_collection_id": r.CollectionID,
+		"request_item_id":       r.ItemID,
+		"request_item_ids":      strings.Join(r.ItemIDs, ","),
+		"request_fields":        strings.Join(r.Fields, ","),
+		"request_refs":          references.ReferenceListToString(r.Refs),
+		"request_params":        r.Params.String(),
+	}
+
+	for k, v := range r.Metadata {
+		if _, exist := md[k]; !exist {
+			md[k] = v
+		}
+	}
+
+	return &ActionRequest{
+		Metadata: md,
+	}
+}
diff --git a/pkg/references/reference.go b/pkg/references/reference.go
index 171ded420c3fd5601cac9ad9f74ad69883f964ea..75b9bc745d430ed0984ceedd07cf877adcb643e3 100644
--- a/pkg/references/reference.go
+++ b/pkg/references/reference.go
@@ -1,6 +1,8 @@
 package references
 
 import (
+	"strings"
+
 	"git.perx.ru/perxis/perxis-go/pkg/items"
 	pb "git.perx.ru/perxis/perxis-go/proto/references"
 	"go.mongodb.org/mongo-driver/bson"
@@ -82,6 +84,22 @@ func ReferenceListToPB(refs []*Reference) []*pb.Reference {
 	return list
 }
 
+func ReferenceListToString(refs []*Reference) string {
+	var res strings.Builder
+
+	for _, ref := range refs {
+		res.WriteString(ref.String())
+	}
+	return res.String()
+}
+
+func ReferenceListToStrings(refs []*Reference) (res []string) {
+	for _, ref := range refs {
+		res = append(res, ref.String())
+	}
+	return
+}
+
 func (r *Reference) String() string {
 	if r == nil {
 		return ""