diff --git a/Makefile b/Makefile
index b0b31e1dfe312e8ba8ae22c93fd17e5341d60079..7885775e8a4b394adf66a1fbd6830eab495528ec 100644
--- a/Makefile
+++ b/Makefile
@@ -88,3 +88,12 @@ mocks: $(MOCKS)
 
 mocks-clean:
 	@rm -rf $(MOCKS)
+
+
+# Deprecated
+# Генерация кода для go-kit при помощи 'github.com/devimteam/microgen' - go-kit перешел на github.com/recolabs/microgen/cmd/microgen
+#MICROGENFILES?=$(shell find . -name "service.go" -exec grep -Ril "microgen" {} \;)
+#microgen: $(MICROGENFILES)
+#
+#%/service.go: % .FORCE
+#	-microgen -file "$@" -out "$<"
diff --git a/pkg/references/transport/client.microgen.go b/pkg/references/transport/client.microgen.go
index a79d9192b857e3360087ddae86298e880df93be9..5c0eb4143138bac3e2eecb3713103cf7c347c873 100644
--- a/pkg/references/transport/client.microgen.go
+++ b/pkg/references/transport/client.microgen.go
@@ -1,4 +1,4 @@
-// Code generated by microgen 0.9.1. DO NOT EDIT.
+// Code generated by microgen 1.0.4. DO NOT EDIT.
 
 package transport
 
@@ -27,3 +27,21 @@ func (set EndpointsSet) Get(arg0 context.Context, arg1 string, arg2 string, arg3
 	}
 	return response.(*GetResponse).Items, response.(*GetResponse).Notfound, res2
 }
+
+func (set EndpointsSet) Publish(arg0 context.Context, arg1 string, arg2 string, arg3 []*references.Reference, arg4 bool, arg5 bool) (res0 []*references.Reference, res1 []*references.Reference, res2 []*references.Reference, res3 error) {
+	request := PublishRequest{
+		EnvId:      arg2,
+		Force:      arg5,
+		Recursive:  arg4,
+		References: arg3,
+		SpaceId:    arg1,
+	}
+	response, res3 := set.PublishEndpoint(arg0, &request)
+	if res3 != nil {
+		if e, ok := status.FromError(res3); ok || e.Code() == codes.Internal || e.Code() == codes.Unknown {
+			res3 = errors.New(e.Message())
+		}
+		return
+	}
+	return response.(*PublishResponse).Published, response.(*PublishResponse).Notfound, response.(*PublishResponse).Unpublished, res3
+}
diff --git a/pkg/references/transport/endpoints.microgen.go b/pkg/references/transport/endpoints.microgen.go
index 737752a45beef781518c38424e8fe8c31ac47d6a..4993e5172f1e2d56712b236657c992beb974322f 100644
--- a/pkg/references/transport/endpoints.microgen.go
+++ b/pkg/references/transport/endpoints.microgen.go
@@ -1,4 +1,4 @@
-// Code generated by microgen 0.9.1. DO NOT EDIT.
+// Code generated by microgen 1.0.4. DO NOT EDIT.
 
 package transport
 
@@ -6,5 +6,6 @@ import endpoint "github.com/go-kit/kit/endpoint"
 
 // EndpointsSet implements References API and used for transport purposes.
 type EndpointsSet struct {
-	GetEndpoint endpoint.Endpoint
+	GetEndpoint     endpoint.Endpoint
+	PublishEndpoint endpoint.Endpoint
 }
diff --git a/pkg/references/transport/exchanges.microgen.go b/pkg/references/transport/exchanges.microgen.go
index bd31aa2d3f78b6e0d321eb7ce602501056842d16..a0e1774d8b88deb4fb3393473e7efbebbc9a5118 100644
--- a/pkg/references/transport/exchanges.microgen.go
+++ b/pkg/references/transport/exchanges.microgen.go
@@ -1,10 +1,10 @@
-// Code generated by microgen 0.9.1. DO NOT EDIT.
+// Code generated by microgen 1.0.4. DO NOT EDIT.
 
 package transport
 
 import (
-	items "git.perx.ru/perxis/perxis-go/pkg/items"
-	references "git.perx.ru/perxis/perxis-go/pkg/references"
+	"git.perx.ru/perxis/perxis-go/pkg/items"
+	"git.perx.ru/perxis/perxis-go/pkg/references"
 )
 
 type (
@@ -17,4 +17,17 @@ type (
 		Items    []*items.Item           `json:"items"`
 		Notfound []*references.Reference `json:"notfound"`
 	}
+
+	PublishRequest struct {
+		SpaceId    string                  `json:"space_id"`
+		EnvId      string                  `json:"env_id"`
+		References []*references.Reference `json:"references"`
+		Recursive  bool                    `json:"recursive"`
+		Force      bool                    `json:"force"`
+	}
+	PublishResponse struct {
+		Published   []*references.Reference `json:"published"`
+		Notfound    []*references.Reference `json:"notfound"`
+		Unpublished []*references.Reference `json:"unpublished"`
+	}
 )
diff --git a/pkg/references/transport/grpc/client.microgen.go b/pkg/references/transport/grpc/client.microgen.go
index f475ea9cb27f040fbcdb32a06b8893f7975c46ec..0cc0cfe3c18e3274267517d1be1472167ebc21e6 100644
--- a/pkg/references/transport/grpc/client.microgen.go
+++ b/pkg/references/transport/grpc/client.microgen.go
@@ -1,9 +1,9 @@
-// Code generated by microgen 0.9.1. DO NOT EDIT.
+// Code generated by microgen 1.0.4. DO NOT EDIT.
 
 package transportgrpc
 
 import (
-	transport "git.perx.ru/perxis/perxis-go/pkg/references/transport"
+	"git.perx.ru/perxis/perxis-go/pkg/references/transport"
 	pb "git.perx.ru/perxis/perxis-go/proto/references"
 	grpckit "github.com/go-kit/kit/transport/grpc"
 	grpc "google.golang.org/grpc"
@@ -13,11 +13,20 @@ func NewGRPCClient(conn *grpc.ClientConn, addr string, opts ...grpckit.ClientOpt
 	if addr == "" {
 		addr = "content.references.References"
 	}
-	return transport.EndpointsSet{GetEndpoint: grpckit.NewClient(
-		conn, addr, "Get",
-		_Encode_Get_Request,
-		_Decode_Get_Response,
-		pb.GetResponse{},
-		opts...,
-	).Endpoint()}
+	return transport.EndpointsSet{
+		GetEndpoint: grpckit.NewClient(
+			conn, addr, "Get",
+			_Encode_Get_Request,
+			_Decode_Get_Response,
+			pb.GetResponse{},
+			opts...,
+		).Endpoint(),
+		PublishEndpoint: grpckit.NewClient(
+			conn, addr, "Publish",
+			_Encode_Publish_Request,
+			_Decode_Publish_Response,
+			pb.PublishResponse{},
+			opts...,
+		).Endpoint(),
+	}
 }
diff --git a/pkg/references/transport/grpc/protobuf_endpoint_converters.microgen.go b/pkg/references/transport/grpc/protobuf_endpoint_converters.microgen.go
index d47c0574bb55f654778bafac1035fbb6ba018d0d..0c995ffcb98960a8257533992cc5e33faaa9aa59 100644
--- a/pkg/references/transport/grpc/protobuf_endpoint_converters.microgen.go
+++ b/pkg/references/transport/grpc/protobuf_endpoint_converters.microgen.go
@@ -1,4 +1,4 @@
-// Code generated by microgen 0.9.1. DO NOT EDIT.
+// Code generated by microgen 1.0.4. DO NOT EDIT.
 
 // Please, do not change functions names!
 package transportgrpc
@@ -7,7 +7,7 @@ import (
 	"context"
 	"errors"
 
-	transport "git.perx.ru/perxis/perxis-go/pkg/references/transport"
+	"git.perx.ru/perxis/perxis-go/pkg/references/transport"
 	pb "git.perx.ru/perxis/perxis-go/proto/references"
 )
 
@@ -80,3 +80,87 @@ func _Decode_Get_Response(ctx context.Context, response interface{}) (interface{
 		Notfound: respNotfound,
 	}, nil
 }
+
+func _Encode_Publish_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil PublishRequest")
+	}
+	req := request.(*transport.PublishRequest)
+	reqReferences, err := ListPtrReferenceToProto(req.References)
+	if err != nil {
+		return nil, err
+	}
+	return &pb.PublishRequest{
+		EnvId:      req.EnvId,
+		Force:      req.Force,
+		Recursive:  req.Recursive,
+		References: reqReferences,
+		SpaceId:    req.SpaceId,
+	}, nil
+}
+
+func _Encode_Publish_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	if response == nil {
+		return nil, errors.New("nil PublishResponse")
+	}
+	resp := response.(*transport.PublishResponse)
+	respPublished, err := ListPtrReferenceToProto(resp.Published)
+	if err != nil {
+		return nil, err
+	}
+	respNotfound, err := ListPtrReferenceToProto(resp.Notfound)
+	if err != nil {
+		return nil, err
+	}
+	respUnpublished, err := ListPtrReferenceToProto(resp.Unpublished)
+	if err != nil {
+		return nil, err
+	}
+	return &pb.PublishResponse{
+		Notfound:    respNotfound,
+		Published:   respPublished,
+		Unpublished: respUnpublished,
+	}, nil
+}
+
+func _Decode_Publish_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil PublishRequest")
+	}
+	req := request.(*pb.PublishRequest)
+	reqReferences, err := ProtoToListPtrReference(req.References)
+	if err != nil {
+		return nil, err
+	}
+	return &transport.PublishRequest{
+		EnvId:      string(req.EnvId),
+		Force:      bool(req.Force),
+		Recursive:  bool(req.Recursive),
+		References: reqReferences,
+		SpaceId:    string(req.SpaceId),
+	}, nil
+}
+
+func _Decode_Publish_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	if response == nil {
+		return nil, errors.New("nil PublishResponse")
+	}
+	resp := response.(*pb.PublishResponse)
+	respPublished, err := ProtoToListPtrReference(resp.Published)
+	if err != nil {
+		return nil, err
+	}
+	respNotfound, err := ProtoToListPtrReference(resp.Notfound)
+	if err != nil {
+		return nil, err
+	}
+	respUnpublished, err := ProtoToListPtrReference(resp.Unpublished)
+	if err != nil {
+		return nil, err
+	}
+	return &transport.PublishResponse{
+		Notfound:    respNotfound,
+		Published:   respPublished,
+		Unpublished: respUnpublished,
+	}, nil
+}
diff --git a/pkg/references/transport/grpc/server.microgen.go b/pkg/references/transport/grpc/server.microgen.go
index 960cf20350072d36498b2bb57edb8c594d193d28..e5fe77fde5f1463720b2dc9424f2620a464d6f17 100644
--- a/pkg/references/transport/grpc/server.microgen.go
+++ b/pkg/references/transport/grpc/server.microgen.go
@@ -1,28 +1,37 @@
-// Code generated by microgen 0.9.1. DO NOT EDIT.
+// Code generated by microgen 1.0.4. DO NOT EDIT.
 
 // DO NOT EDIT.
 package transportgrpc
 
 import (
-	transport "git.perx.ru/perxis/perxis-go/pkg/references/transport"
+	"git.perx.ru/perxis/perxis-go/pkg/references/transport"
 	pb "git.perx.ru/perxis/perxis-go/proto/references"
-	grpc "github.com/go-kit/kit/transport/grpc"
-	context "golang.org/x/net/context"
+	"github.com/go-kit/kit/transport/grpc"
+	"golang.org/x/net/context"
 )
 
 type referencesServer struct {
-	get grpc.Handler
+	get     grpc.Handler
+	publish grpc.Handler
 
 	pb.UnsafeReferencesServer
 }
 
 func NewGRPCServer(endpoints *transport.EndpointsSet, opts ...grpc.ServerOption) pb.ReferencesServer {
-	return &referencesServer{get: grpc.NewServer(
-		endpoints.GetEndpoint,
-		_Decode_Get_Request,
-		_Encode_Get_Response,
-		opts...,
-	)}
+	return &referencesServer{
+		get: grpc.NewServer(
+			endpoints.GetEndpoint,
+			_Decode_Get_Request,
+			_Encode_Get_Response,
+			opts...,
+		),
+		publish: grpc.NewServer(
+			endpoints.PublishEndpoint,
+			_Decode_Publish_Request,
+			_Encode_Publish_Response,
+			opts...,
+		),
+	}
 }
 
 func (S *referencesServer) Get(ctx context.Context, req *pb.GetRequest) (*pb.GetResponse, error) {
@@ -32,3 +41,11 @@ func (S *referencesServer) Get(ctx context.Context, req *pb.GetRequest) (*pb.Get
 	}
 	return resp.(*pb.GetResponse), nil
 }
+
+func (S *referencesServer) Publish(ctx context.Context, req *pb.PublishRequest) (*pb.PublishResponse, error) {
+	_, resp, err := S.publish.ServeGRPC(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+	return resp.(*pb.PublishResponse), nil
+}
diff --git a/pkg/references/transport/server.microgen.go b/pkg/references/transport/server.microgen.go
index f66b4c6b4b8ff529bb498f11cec2bfce8f79c2bf..581aa61605034fa7fbb4cf025279ba6c38368d4a 100644
--- a/pkg/references/transport/server.microgen.go
+++ b/pkg/references/transport/server.microgen.go
@@ -1,16 +1,19 @@
-// Code generated by microgen 0.9.1. DO NOT EDIT.
+// Code generated by microgen 1.0.4. DO NOT EDIT.
 
 package transport
 
 import (
 	"context"
 
-	references "git.perx.ru/perxis/perxis-go/pkg/references"
-	endpoint "github.com/go-kit/kit/endpoint"
+	"git.perx.ru/perxis/perxis-go/pkg/references"
+	"github.com/go-kit/kit/endpoint"
 )
 
 func Endpoints(svc references.References) EndpointsSet {
-	return EndpointsSet{GetEndpoint: GetEndpoint(svc)}
+	return EndpointsSet{
+		GetEndpoint:     GetEndpoint(svc),
+		PublishEndpoint: PublishEndpoint(svc),
+	}
 }
 
 func GetEndpoint(svc references.References) endpoint.Endpoint {
@@ -23,3 +26,15 @@ func GetEndpoint(svc references.References) endpoint.Endpoint {
 		}, res2
 	}
 }
+
+func PublishEndpoint(svc references.References) endpoint.Endpoint {
+	return func(arg0 context.Context, request interface{}) (interface{}, error) {
+		req := request.(*PublishRequest)
+		res0, res1, res2, res3 := svc.Publish(arg0, req.SpaceId, req.EnvId, req.References, req.Recursive, req.Force)
+		return &PublishResponse{
+			Notfound:    res1,
+			Published:   res0,
+			Unpublished: res2,
+		}, res3
+	}
+}