diff --git a/pkg/extension/extension.go b/pkg/extension/extension.go
index ee95f328fdc31b75c68467df210d766c8cf336ce..15b92676be86b1782eb0ca8e5feb98bf1f8ba186 100644
--- a/pkg/extension/extension.go
+++ b/pkg/extension/extension.go
@@ -3,7 +3,6 @@ package extension
 import (
 	"context"
 
-	"git.perx.ru/perxis/perxis-go/pkg/operation"
 	"go.uber.org/zap"
 
 	"git.perx.ru/perxis/perxis-go"
@@ -70,13 +69,6 @@ type Extension interface {
 	Action(ctx context.Context, in *ActionRequest) (*ActionResponse, error)
 }
 
-type ExtensionOpetation interface {
-	InstallOperation(ctx context.Context, in *InstallRequest) (*operation.Operation, error)
-	CheckOperation(ctx context.Context, in *CheckRequest) (*operation.Operation, error)
-	UninstallOperation(ctx context.Context, in *UninstallRequest) (*operation.Operation, error)
-	Action(ctx context.Context, in *ActionRequest) (*ActionResponse, error)
-}
-
 func CheckInstalled(ctx context.Context, content *content.Content, spaceID, envID, extension string) (bool, error) {
 	status, err := NewStorage(content, nil).GetExtension(ctx, spaceID, envID, extension)
 	if err != nil {
diff --git a/pkg/extension/manager.go b/pkg/extension/manager.go
index 285d21ad1119a1a78aaf239d0283f329abd8b9f5..9d4def7ce9e6c24c8e9ac257066606e16db80afb 100644
--- a/pkg/extension/manager.go
+++ b/pkg/extension/manager.go
@@ -10,7 +10,7 @@ import (
 )
 
 type Manager interface {
-	ExtensionOpetation
+	Extension
 	RegisterExtensions(ctx context.Context, ext ...*ExtensionConnector) error
 	UnregisterExtensions(ctx context.Context, ext ...*ExtensionConnector) error
 	ListRegisteredExtensions(ctx context.Context, extensions ...string) ([]*ExtensionConnector, error)
diff --git a/pkg/extension/manager_server.go b/pkg/extension/manager_server.go
deleted file mode 100644
index 66a2f12ec800313399e498ecbd66350bf32833b3..0000000000000000000000000000000000000000
--- a/pkg/extension/manager_server.go
+++ /dev/null
@@ -1,76 +0,0 @@
-package extension
-
-import (
-	"context"
-
-	"git.perx.ru/perxis/perxis-go/pkg/errors"
-	"git.perx.ru/perxis/perxis-go/pkg/operation"
-	pb "git.perx.ru/perxis/perxis-go/proto/extensions"
-	"google.golang.org/grpc"
-)
-
-type ManagerServer struct {
-	manager Manager
-	pb.UnimplementedExtensionServiceServer
-}
-
-func NewManagerServer(manager Manager) *ManagerServer {
-	return &ManagerServer{manager: manager}
-}
-
-func RegisterManagerServer(grpcSrv *grpc.Server, srv *ManagerServer) {
-	pb.RegisterExtensionServiceServer(grpcSrv, srv)
-}
-
-func (s *ManagerServer) Install(ctx context.Context, req *InstallRequest) (*operation.Proto, error) {
-	op, err := s.manager.InstallOperation(ctx, req)
-	if err != nil {
-		return nil, err
-	}
-	return op.Proto(), nil
-}
-
-func (s *ManagerServer) Uninstall(ctx context.Context, req *UninstallRequest) (*operation.Proto, error) {
-	op, err := s.manager.UninstallOperation(ctx, req)
-	if err != nil {
-		return nil, err
-	}
-	return op.Proto(), nil
-}
-
-func (s *ManagerServer) Check(ctx context.Context, req *CheckRequest) (*operation.Proto, error) {
-	op, err := s.manager.CheckOperation(ctx, req)
-	if err != nil {
-		return nil, err
-	}
-	return op.Proto(), nil
-}
-
-func (s *ManagerServer) Action(ctx context.Context, in *pb.ActionRequest) (*pb.ActionResponse, error) {
-	actionURL, err := NewActionURL(in.Action)
-	if err != nil {
-		return nil, ErrInvalidAction
-	}
-
-	ext := actionURL.Extension()
-	if ext == "" {
-		ext = in.Extension
-	}
-	if ext == "" {
-		return nil, ErrInvalidAction
-	}
-
-	out, err := s.manager.Action(ctx, ActionRequestFromPB(in))
-
-	if out == nil {
-		out = &ActionResponse{}
-	}
-
-	if err != nil {
-		out.State = ResponseError
-		out.Error = err.Error()
-		out.Msg += errors.GetDetail(err)
-	}
-
-	return ActionResponseToPB(out), nil
-}
diff --git a/pkg/extension/middleware/access_logging_middleware.go b/pkg/extension/middleware/access_logging_middleware.go
index 46d3440971f8db4584912c32287306ec1a74e597..0fbd63de8991c449fc96ad49527f5e079bd88773 100644
--- a/pkg/extension/middleware/access_logging_middleware.go
+++ b/pkg/extension/middleware/access_logging_middleware.go
@@ -12,7 +12,6 @@ import (
 
 	"git.perx.ru/perxis/perxis-go/pkg/auth"
 	"git.perx.ru/perxis/perxis-go/pkg/extension"
-	"git.perx.ru/perxis/perxis-go/pkg/operation"
 	"go.uber.org/zap"
 )
 
@@ -51,42 +50,55 @@ func (m *accessLoggingMiddleware) Action(ctx context.Context, in *extension.Acti
 	return ap1, err
 }
 
-func (m *accessLoggingMiddleware) CheckOperation(ctx context.Context, in *extension.CheckRequest) (op1 *operation.Operation, err error) {
+func (m *accessLoggingMiddleware) Check(ctx context.Context, in *extension.CheckRequest) (err error) {
 	begin := time.Now()
 
-	m.logger.Debug("CheckOperation.Request",
+	m.logger.Debug("Check.Request",
 		zap.Reflect("principal", auth.GetPrincipal(ctx)),
 		zap.Reflect("in", in),
 	)
 
-	op1, err = m.next.CheckOperation(ctx, in)
+	err = m.next.Check(ctx, in)
 
-	m.logger.Debug("CheckOperation.Response",
+	m.logger.Debug("Check.Response",
 		zap.Duration("time", time.Since(begin)),
-		zap.Reflect("op1", op1),
 		zap.Error(err),
 	)
 
-	return op1, err
+	return err
+}
+
+func (m *accessLoggingMiddleware) GetDescriptor() (ep1 *extension.ExtensionDescriptor) {
+	begin := time.Now()
+
+	m.logger.Debug("GetDescriptor.Request")
+
+	ep1 = m.next.GetDescriptor()
+
+	m.logger.Debug("GetDescriptor.Response",
+		zap.Duration("time", time.Since(begin)),
+		zap.Reflect("ep1", ep1),
+	)
+
+	return ep1
 }
 
-func (m *accessLoggingMiddleware) InstallOperation(ctx context.Context, in *extension.InstallRequest) (op1 *operation.Operation, err error) {
+func (m *accessLoggingMiddleware) Install(ctx context.Context, in *extension.InstallRequest) (err error) {
 	begin := time.Now()
 
-	m.logger.Debug("InstallOperation.Request",
+	m.logger.Debug("Install.Request",
 		zap.Reflect("principal", auth.GetPrincipal(ctx)),
 		zap.Reflect("in", in),
 	)
 
-	op1, err = m.next.InstallOperation(ctx, in)
+	err = m.next.Install(ctx, in)
 
-	m.logger.Debug("InstallOperation.Response",
+	m.logger.Debug("Install.Response",
 		zap.Duration("time", time.Since(begin)),
-		zap.Reflect("op1", op1),
 		zap.Error(err),
 	)
 
-	return op1, err
+	return err
 }
 
 func (m *accessLoggingMiddleware) ListExtensions(ctx context.Context, space string, env string, filter *extension.ListExtensionsFilter) (ipa1 []*extension.Info, err error) {
@@ -147,23 +159,22 @@ func (m *accessLoggingMiddleware) RegisterExtensions(ctx context.Context, ext ..
 	return err
 }
 
-func (m *accessLoggingMiddleware) UninstallOperation(ctx context.Context, in *extension.UninstallRequest) (op1 *operation.Operation, err error) {
+func (m *accessLoggingMiddleware) Uninstall(ctx context.Context, in *extension.UninstallRequest) (err error) {
 	begin := time.Now()
 
-	m.logger.Debug("UninstallOperation.Request",
+	m.logger.Debug("Uninstall.Request",
 		zap.Reflect("principal", auth.GetPrincipal(ctx)),
 		zap.Reflect("in", in),
 	)
 
-	op1, err = m.next.UninstallOperation(ctx, in)
+	err = m.next.Uninstall(ctx, in)
 
-	m.logger.Debug("UninstallOperation.Response",
+	m.logger.Debug("Uninstall.Response",
 		zap.Duration("time", time.Since(begin)),
-		zap.Reflect("op1", op1),
 		zap.Error(err),
 	)
 
-	return op1, err
+	return err
 }
 
 func (m *accessLoggingMiddleware) UnregisterExtensions(ctx context.Context, ext ...*extension.ExtensionConnector) (err error) {
diff --git a/pkg/extension/middleware/error_logging_middleware.go b/pkg/extension/middleware/error_logging_middleware.go
index d9f6753845852c57c904c947dd03480b678b6e32..474003790010e858eed9fb9ac2af71f17fb35094 100644
--- a/pkg/extension/middleware/error_logging_middleware.go
+++ b/pkg/extension/middleware/error_logging_middleware.go
@@ -10,7 +10,6 @@ import (
 	"context"
 
 	"git.perx.ru/perxis/perxis-go/pkg/extension"
-	"git.perx.ru/perxis/perxis-go/pkg/operation"
 	"go.uber.org/zap"
 )
 
@@ -40,24 +39,28 @@ func (m *errorLoggingMiddleware) Action(ctx context.Context, in *extension.Actio
 	return m.next.Action(ctx, in)
 }
 
-func (m *errorLoggingMiddleware) CheckOperation(ctx context.Context, in *extension.CheckRequest) (op1 *operation.Operation, err error) {
+func (m *errorLoggingMiddleware) Check(ctx context.Context, in *extension.CheckRequest) (err error) {
 	logger := m.logger
 	defer func() {
 		if err != nil {
 			logger.Warn("response error", zap.Error(err))
 		}
 	}()
-	return m.next.CheckOperation(ctx, in)
+	return m.next.Check(ctx, in)
 }
 
-func (m *errorLoggingMiddleware) InstallOperation(ctx context.Context, in *extension.InstallRequest) (op1 *operation.Operation, err error) {
+func (m *errorLoggingMiddleware) GetDescriptor() (ep1 *extension.ExtensionDescriptor) {
+	return m.next.GetDescriptor()
+}
+
+func (m *errorLoggingMiddleware) Install(ctx context.Context, in *extension.InstallRequest) (err error) {
 	logger := m.logger
 	defer func() {
 		if err != nil {
 			logger.Warn("response error", zap.Error(err))
 		}
 	}()
-	return m.next.InstallOperation(ctx, in)
+	return m.next.Install(ctx, in)
 }
 
 func (m *errorLoggingMiddleware) ListExtensions(ctx context.Context, space string, env string, filter *extension.ListExtensionsFilter) (ipa1 []*extension.Info, err error) {
@@ -90,14 +93,14 @@ func (m *errorLoggingMiddleware) RegisterExtensions(ctx context.Context, ext ...
 	return m.next.RegisterExtensions(ctx, ext...)
 }
 
-func (m *errorLoggingMiddleware) UninstallOperation(ctx context.Context, in *extension.UninstallRequest) (op1 *operation.Operation, err error) {
+func (m *errorLoggingMiddleware) Uninstall(ctx context.Context, in *extension.UninstallRequest) (err error) {
 	logger := m.logger
 	defer func() {
 		if err != nil {
 			logger.Warn("response error", zap.Error(err))
 		}
 	}()
-	return m.next.UninstallOperation(ctx, in)
+	return m.next.Uninstall(ctx, in)
 }
 
 func (m *errorLoggingMiddleware) UnregisterExtensions(ctx context.Context, ext ...*extension.ExtensionConnector) (err error) {
diff --git a/pkg/extension/middleware/recovering_middleware.go b/pkg/extension/middleware/recovering_middleware.go
index 0a7284dda276d3339f87e520c92657792f65d239..54b78da481917fda0d5614f6d9158c455d4d03e6 100644
--- a/pkg/extension/middleware/recovering_middleware.go
+++ b/pkg/extension/middleware/recovering_middleware.go
@@ -11,7 +11,6 @@ import (
 	"fmt"
 
 	"git.perx.ru/perxis/perxis-go/pkg/extension"
-	"git.perx.ru/perxis/perxis-go/pkg/operation"
 	"go.uber.org/zap"
 )
 
@@ -43,7 +42,7 @@ func (m *recoveringMiddleware) Action(ctx context.Context, in *extension.ActionR
 	return m.next.Action(ctx, in)
 }
 
-func (m *recoveringMiddleware) CheckOperation(ctx context.Context, in *extension.CheckRequest) (op1 *operation.Operation, err error) {
+func (m *recoveringMiddleware) Check(ctx context.Context, in *extension.CheckRequest) (err error) {
 	logger := m.logger
 	defer func() {
 		if r := recover(); r != nil {
@@ -52,10 +51,21 @@ func (m *recoveringMiddleware) CheckOperation(ctx context.Context, in *extension
 		}
 	}()
 
-	return m.next.CheckOperation(ctx, in)
+	return m.next.Check(ctx, in)
 }
 
-func (m *recoveringMiddleware) InstallOperation(ctx context.Context, in *extension.InstallRequest) (op1 *operation.Operation, err error) {
+func (m *recoveringMiddleware) GetDescriptor() (ep1 *extension.ExtensionDescriptor) {
+	logger := m.logger
+	defer func() {
+		if r := recover(); r != nil {
+			logger.Error("panic", zap.Error(fmt.Errorf("%v", r)))
+		}
+	}()
+
+	return m.next.GetDescriptor()
+}
+
+func (m *recoveringMiddleware) Install(ctx context.Context, in *extension.InstallRequest) (err error) {
 	logger := m.logger
 	defer func() {
 		if r := recover(); r != nil {
@@ -64,7 +74,7 @@ func (m *recoveringMiddleware) InstallOperation(ctx context.Context, in *extensi
 		}
 	}()
 
-	return m.next.InstallOperation(ctx, in)
+	return m.next.Install(ctx, in)
 }
 
 func (m *recoveringMiddleware) ListExtensions(ctx context.Context, space string, env string, filter *extension.ListExtensionsFilter) (ipa1 []*extension.Info, err error) {
@@ -103,7 +113,7 @@ func (m *recoveringMiddleware) RegisterExtensions(ctx context.Context, ext ...*e
 	return m.next.RegisterExtensions(ctx, ext...)
 }
 
-func (m *recoveringMiddleware) UninstallOperation(ctx context.Context, in *extension.UninstallRequest) (op1 *operation.Operation, err error) {
+func (m *recoveringMiddleware) Uninstall(ctx context.Context, in *extension.UninstallRequest) (err error) {
 	logger := m.logger
 	defer func() {
 		if r := recover(); r != nil {
@@ -112,7 +122,7 @@ func (m *recoveringMiddleware) UninstallOperation(ctx context.Context, in *exten
 		}
 	}()
 
-	return m.next.UninstallOperation(ctx, in)
+	return m.next.Uninstall(ctx, in)
 }
 
 func (m *recoveringMiddleware) UnregisterExtensions(ctx context.Context, ext ...*extension.ExtensionConnector) (err error) {
diff --git a/pkg/extension/middleware/telemetry_middleware.go b/pkg/extension/middleware/telemetry_middleware.go
index 54b823abb1d9d92d0d8e513948ff7501c0df27f5..7302cab3b4ecf364f475b0dbe7d77a37c96cd784 100644
--- a/pkg/extension/middleware/telemetry_middleware.go
+++ b/pkg/extension/middleware/telemetry_middleware.go
@@ -13,7 +13,6 @@ import (
 	oid "git.perx.ru/perxis/perxis-go/id"
 	"git.perx.ru/perxis/perxis-go/pkg/auth"
 	"git.perx.ru/perxis/perxis-go/pkg/extension"
-	"git.perx.ru/perxis/perxis-go/pkg/operation"
 	"git.perx.ru/perxis/perxis-go/pkg/telemetry/metrics"
 	"go.opentelemetry.io/otel"
 	"go.opentelemetry.io/otel/attribute"
@@ -93,19 +92,19 @@ func (_d telemetryMiddleware) Action(ctx context.Context, in *extension.ActionRe
 	return ap1, err
 }
 
-// CheckOperation implements extension.Manager
-func (_d telemetryMiddleware) CheckOperation(ctx context.Context, in *extension.CheckRequest) (op1 *operation.Operation, err error) {
+// Check implements extension.Manager
+func (_d telemetryMiddleware) Check(ctx context.Context, in *extension.CheckRequest) (err error) {
 	var att = []attribute.KeyValue{
 		attribute.String("service", "Manager"),
-		attribute.String("method", "CheckOperation"),
+		attribute.String("method", "Check"),
 	}
 	attributes := otelmetric.WithAttributeSet(attribute.NewSet(att...))
 
 	start := time.Now()
-	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Manager.CheckOperation")
+	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Manager.Check")
 	defer _span.End()
 
-	op1, err = _d.Manager.CheckOperation(ctx, in)
+	err = _d.Manager.Check(ctx, in)
 
 	_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
 
@@ -120,7 +119,6 @@ func (_d telemetryMiddleware) CheckOperation(ctx context.Context, in *extension.
 		_d._spanDecorator(_span, map[string]interface{}{
 			"ctx": ctx,
 			"in":  in}, map[string]interface{}{
-			"op1": op1,
 			"err": err})
 	} else if err != nil {
 		_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
@@ -130,22 +128,22 @@ func (_d telemetryMiddleware) CheckOperation(ctx context.Context, in *extension.
 		_span.SetAttributes(attribute.String("message", err.Error()))
 	}
 
-	return op1, err
+	return err
 }
 
-// InstallOperation implements extension.Manager
-func (_d telemetryMiddleware) InstallOperation(ctx context.Context, in *extension.InstallRequest) (op1 *operation.Operation, err error) {
+// Install implements extension.Manager
+func (_d telemetryMiddleware) Install(ctx context.Context, in *extension.InstallRequest) (err error) {
 	var att = []attribute.KeyValue{
 		attribute.String("service", "Manager"),
-		attribute.String("method", "InstallOperation"),
+		attribute.String("method", "Install"),
 	}
 	attributes := otelmetric.WithAttributeSet(attribute.NewSet(att...))
 
 	start := time.Now()
-	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Manager.InstallOperation")
+	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Manager.Install")
 	defer _span.End()
 
-	op1, err = _d.Manager.InstallOperation(ctx, in)
+	err = _d.Manager.Install(ctx, in)
 
 	_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
 
@@ -160,7 +158,6 @@ func (_d telemetryMiddleware) InstallOperation(ctx context.Context, in *extensio
 		_d._spanDecorator(_span, map[string]interface{}{
 			"ctx": ctx,
 			"in":  in}, map[string]interface{}{
-			"op1": op1,
 			"err": err})
 	} else if err != nil {
 		_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
@@ -170,7 +167,7 @@ func (_d telemetryMiddleware) InstallOperation(ctx context.Context, in *extensio
 		_span.SetAttributes(attribute.String("message", err.Error()))
 	}
 
-	return op1, err
+	return err
 }
 
 // ListExtensions implements extension.Manager
@@ -294,19 +291,19 @@ func (_d telemetryMiddleware) RegisterExtensions(ctx context.Context, ext ...*ex
 	return err
 }
 
-// UninstallOperation implements extension.Manager
-func (_d telemetryMiddleware) UninstallOperation(ctx context.Context, in *extension.UninstallRequest) (op1 *operation.Operation, err error) {
+// Uninstall implements extension.Manager
+func (_d telemetryMiddleware) Uninstall(ctx context.Context, in *extension.UninstallRequest) (err error) {
 	var att = []attribute.KeyValue{
 		attribute.String("service", "Manager"),
-		attribute.String("method", "UninstallOperation"),
+		attribute.String("method", "Uninstall"),
 	}
 	attributes := otelmetric.WithAttributeSet(attribute.NewSet(att...))
 
 	start := time.Now()
-	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Manager.UninstallOperation")
+	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Manager.Uninstall")
 	defer _span.End()
 
-	op1, err = _d.Manager.UninstallOperation(ctx, in)
+	err = _d.Manager.Uninstall(ctx, in)
 
 	_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
 
@@ -321,7 +318,6 @@ func (_d telemetryMiddleware) UninstallOperation(ctx context.Context, in *extens
 		_d._spanDecorator(_span, map[string]interface{}{
 			"ctx": ctx,
 			"in":  in}, map[string]interface{}{
-			"op1": op1,
 			"err": err})
 	} else if err != nil {
 		_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
@@ -331,7 +327,7 @@ func (_d telemetryMiddleware) UninstallOperation(ctx context.Context, in *extens
 		_span.SetAttributes(attribute.String("message", err.Error()))
 	}
 
-	return op1, err
+	return err
 }
 
 // UnregisterExtensions implements extension.Manager