diff --git a/pkg/references/middleware/client_encode_middleware.go b/pkg/references/middleware/client_encode_middleware.go
index b37e3ff95fc901061440f3bd34159739004d1c56..33ca79610896926be3679920a6cd96c8afd6c73b 100644
--- a/pkg/references/middleware/client_encode_middleware.go
+++ b/pkg/references/middleware/client_encode_middleware.go
@@ -40,3 +40,7 @@ func (m *encodeDecodeMiddleware) Get(ctx context.Context, spaceId, envId string,
 	}
 	return
 }
+
+func (m *encodeDecodeMiddleware) Publish(ctx context.Context, spaceId string, envId string, references []*references.Reference, recursive bool, force bool) (published []*references.Reference, notfound []*references.Reference, unpublished []*references.Reference, err error) {
+	return m.next.Publish(ctx, spaceId, envId, references, recursive, force)
+}
diff --git a/pkg/references/middleware/error_logging_middleware.go b/pkg/references/middleware/error_logging_middleware.go
index b5bae4d8eb4e5904be12a90b54e03f83a0002916..0cfbf919e5acd70dc453494d15e9e8778afcca85 100644
--- a/pkg/references/middleware/error_logging_middleware.go
+++ b/pkg/references/middleware/error_logging_middleware.go
@@ -1,10 +1,10 @@
 package middleware
 
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/error_log
-// gowrap: http://github.com/hexdigest/gowrap
+// DO NOT EDIT!
+// This code is generated with http://github.com/hexdigest/gowrap tool
+// using ../../../assets/templates/middleware/error_log template
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go
 
 import (
 	"context"
@@ -39,3 +39,13 @@ func (m *errorLoggingMiddleware) Get(ctx context.Context, spaceId string, envId
 	}()
 	return m.next.Get(ctx, spaceId, envId, references)
 }
+
+func (m *errorLoggingMiddleware) Publish(ctx context.Context, spaceId string, envId string, references []*references.Reference, recursive bool, force bool) (published []*references.Reference, notfound []*references.Reference, unpublished []*references.Reference, err error) {
+	logger := m.logger
+	defer func() {
+		if err != nil {
+			logger.Warn("response error", zap.Error(err))
+		}
+	}()
+	return m.next.Publish(ctx, spaceId, envId, references, recursive, force)
+}
diff --git a/pkg/references/middleware/logging_middleware.go b/pkg/references/middleware/logging_middleware.go
index 7c64ad139203ddf5f5923199865b98e66d2f71a7..a0f010ae99c2f9ce1eb726e5caba316379328a42 100644
--- a/pkg/references/middleware/logging_middleware.go
+++ b/pkg/references/middleware/logging_middleware.go
@@ -1,10 +1,10 @@
 package middleware
 
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/access_log
-// gowrap: http://github.com/hexdigest/gowrap
+// DO NOT EDIT!
+// This code is generated with http://github.com/hexdigest/gowrap tool
+// using ../../../assets/templates/middleware/access_log template
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/access_log -o logging_middleware.go -l ""
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/access_log -o logging_middleware.go
 
 import (
 	"context"
@@ -73,3 +73,46 @@ func (m *loggingMiddleware) Get(ctx context.Context, spaceId string, envId strin
 
 	return items, notfound, err
 }
+
+func (m *loggingMiddleware) Publish(ctx context.Context, spaceId string, envId string, references []*references.Reference, recursive bool, force bool) (published []*references.Reference, notfound []*references.Reference, unpublished []*references.Reference, err error) {
+	begin := time.Now()
+	var fields []zapcore.Field
+	for k, v := range map[string]interface{}{
+		"ctx":        ctx,
+		"spaceId":    spaceId,
+		"envId":      envId,
+		"references": references,
+		"recursive":  recursive,
+		"force":      force} {
+		if k == "ctx" {
+			fields = append(fields, zap.String("principal", fmt.Sprint(auth.GetPrincipal(ctx))))
+			continue
+		}
+		fields = append(fields, zap.Reflect(k, v))
+	}
+
+	m.logger.Debug("Publish.Request", fields...)
+
+	published, notfound, unpublished, err = m.next.Publish(ctx, spaceId, envId, references, recursive, force)
+
+	fields = []zapcore.Field{
+		zap.Duration("time", time.Since(begin)),
+	}
+
+	for k, v := range map[string]interface{}{
+		"published":   published,
+		"notfound":    notfound,
+		"unpublished": unpublished,
+		"err":         err} {
+		if k == "err" {
+			err, _ := v.(error)
+			fields = append(fields, zap.Error(err))
+			continue
+		}
+		fields = append(fields, zap.Reflect(k, v))
+	}
+
+	m.logger.Debug("Publish.Response", fields...)
+
+	return published, notfound, unpublished, err
+}
diff --git a/pkg/references/middleware/middleware.go b/pkg/references/middleware/middleware.go
index 3037ea954cd583a69e2e3604cffe1d4602a6536a..6bd830146952e16ccabf780230d03dc6b9473a74 100644
--- a/pkg/references/middleware/middleware.go
+++ b/pkg/references/middleware/middleware.go
@@ -1,10 +1,10 @@
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/middleware
-// gowrap: http://github.com/hexdigest/gowrap
-
 package middleware
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/middleware -o middleware.go -l ""
+// DO NOT EDIT!
+// This code is generated with http://github.com/hexdigest/gowrap tool
+// using ../../../assets/templates/middleware/middleware template
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/middleware -o middleware.go
 
 import (
 	"git.perx.ru/perxis/perxis-go/pkg/references"
diff --git a/pkg/references/middleware/recovering_middleware.go b/pkg/references/middleware/recovering_middleware.go
index 8028c14e805ef57531efd1c1d06af14167548738..070d9d22fca08a8394362b8eea6a31628d56902c 100644
--- a/pkg/references/middleware/recovering_middleware.go
+++ b/pkg/references/middleware/recovering_middleware.go
@@ -1,10 +1,10 @@
-// Code generated by gowrap. DO NOT EDIT.
-// template: ../../../assets/templates/middleware/recovery
-// gowrap: http://github.com/hexdigest/gowrap
-
 package middleware
 
-//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/recovery -o recovering_middleware.go -l ""
+// DO NOT EDIT!
+// This code is generated with http://github.com/hexdigest/gowrap tool
+// using ../../../assets/templates/middleware/recovery template
+
+//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/references -i References -t ../../../assets/templates/middleware/recovery -o recovering_middleware.go
 
 import (
 	"context"
@@ -42,3 +42,15 @@ func (m *recoveringMiddleware) Get(ctx context.Context, spaceId string, envId st
 
 	return m.next.Get(ctx, spaceId, envId, references)
 }
+
+func (m *recoveringMiddleware) Publish(ctx context.Context, spaceId string, envId string, references []*references.Reference, recursive bool, force bool) (published []*references.Reference, notfound []*references.Reference, unpublished []*references.Reference, err error) {
+	logger := m.logger
+	defer func() {
+		if r := recover(); r != nil {
+			logger.Error("panic", zap.Error(fmt.Errorf("%v", r)))
+			err = fmt.Errorf("%v", r)
+		}
+	}()
+
+	return m.next.Publish(ctx, spaceId, envId, references, recursive, force)
+}
diff --git a/pkg/references/service.go b/pkg/references/service.go
index 14e2e8eb6f6eb0558033046840a5e9c2cda7f387..136001a263b8754fba68de60259c2102608a0a77 100644
--- a/pkg/references/service.go
+++ b/pkg/references/service.go
@@ -11,4 +11,6 @@ import (
 // @grpc-addr content.references.References
 type References interface {
 	Get(ctx context.Context, spaceId, envId string, references []*Reference) (items []*items.Item, notfound []*Reference, err error)
+
+	Publish(ctx context.Context, spaceId, envId string, references []*Reference, recursive, force bool) (published []*Reference, notfound []*Reference, unpublished []*Reference, err error)
 }