diff --git a/go.mod b/go.mod
index 86d2b2e66603975e24e4f78b4650a3100b17ece5..63de9afb6a6cab76b4b155e7f090d3dc470806b9 100644
--- a/go.mod
+++ b/go.mod
@@ -17,8 +17,8 @@ require (
 	github.com/rs/xid v1.5.0
 	github.com/stretchr/testify v1.8.4
 	go.mongodb.org/mongo-driver v1.13.0
-	go.opentelemetry.io/otel v1.20.0
-	go.opentelemetry.io/otel/trace v1.20.0
+	go.opentelemetry.io/otel v1.21.0
+	go.opentelemetry.io/otel/trace v1.21.0
 	go.uber.org/zap v1.26.0
 	golang.org/x/crypto v0.15.0
 	golang.org/x/image v0.14.0
@@ -42,22 +42,25 @@ require (
 	github.com/gosimple/unidecode v1.0.1 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect
 	github.com/klauspost/compress v1.17.3 // indirect
+	github.com/kr/pretty v0.3.1 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/montanaflynn/stats v0.7.1 // indirect
 	github.com/nats-io/nkeys v0.4.6 // indirect
 	github.com/nats-io/nuid v1.0.1 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
+	github.com/rogpeppe/go-internal v1.10.0 // indirect
 	github.com/stretchr/objx v0.5.1 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.2 // indirect
 	github.com/xdg-go/stringprep v1.0.4 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect
-	go.opentelemetry.io/otel/metric v1.20.0 // indirect
+	go.opentelemetry.io/otel/metric v1.21.0 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
 	golang.org/x/sync v0.5.0 // indirect
 	golang.org/x/sys v0.14.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/appengine v1.6.8 // indirect
 	google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect
+	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
 )
diff --git a/go.sum b/go.sum
index d11a9be6ed599fe2754ece384aef33f07f3ec19d..3273d5c5392761e9f4e31b6736f355f3bd1eba6d 100644
--- a/go.sum
+++ b/go.sum
@@ -9,6 +9,7 @@ github.com/avast/retry-go/v4 v4.5.1 h1:AxIx0HGi4VZ3I02jr78j5lZ3M6x1E0Ivxa6b0pUUh
 github.com/avast/retry-go/v4 v4.5.1/go.mod h1:/sipNsvNB3RRuT5iNcb6h73nw3IBmXJ/H3XrCQYSOpc=
 github.com/bep/gowebp v0.2.0 h1:ZVfK8i9PpZqKHEmthQSt3qCnnHycbLzBPEsVtk2ch2Q=
 github.com/bep/gowebp v0.2.0/go.mod h1:ZhFodwdiFp8ehGJpF4LdPl6unxZm9lLFjxD3z2h2AgI=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -54,6 +55,13 @@ github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHm
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA=
 github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s=
 github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
 github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
@@ -74,6 +82,7 @@ github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY=
 github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts=
 github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
 github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
@@ -81,6 +90,9 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84=
 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
 github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4=
@@ -109,12 +121,12 @@ github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY=
 go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ=
-go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc=
-go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs=
-go.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA=
-go.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM=
-go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ=
-go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU=
+go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc=
+go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
+go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4=
+go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
+go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc=
+go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
 go.uber.org/goleak v1.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
 go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
@@ -181,8 +193,9 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
 google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
diff --git a/perxis-proto b/perxis-proto
index 78539871cf2d9f6b187865c4855450143dec4e79..59b21fcd765d2a6208f65dccdd04a63e55a0016e 160000
--- a/perxis-proto
+++ b/perxis-proto
@@ -1 +1 @@
-Subproject commit 78539871cf2d9f6b187865c4855450143dec4e79
+Subproject commit 59b21fcd765d2a6208f65dccdd04a63e55a0016e
diff --git a/pkg/account/client.go b/pkg/account/client.go
index 53ae9fb81924ec95370b3e9110de8fbfb93d3400..112a71f67fe130bb57c6483ad4793565bca8d0bd 100644
--- a/pkg/account/client.go
+++ b/pkg/account/client.go
@@ -53,9 +53,9 @@ func NewClient(conn *grpc.ClientConn, opts ...Option) *Account {
 func WithCaching(client *Account, size int, ttl time.Duration) *Account {
 	c := *client
 
-	c.Members = serviceMembers.CachingMiddleware(cache.NewCache(size, ttl))(client.Members)
-	c.Organizations = serviceOrganizations.CachingMiddleware(cache.NewCache(size, ttl))(client.Organizations)
-	c.Users = serviceUsers.CachingMiddleware(cache.NewCache(size, ttl))(client.Users)
+	c.Members = serviceMembers.CachingMiddleware(cache.NewMemoryCache(size, ttl))(client.Members)
+	c.Organizations = serviceOrganizations.CachingMiddleware(cache.NewMemoryCache(size, ttl))(client.Organizations)
+	c.Users = serviceUsers.CachingMiddleware(cache.NewMemoryCache(size, ttl))(client.Users)
 
 	return &c
 }
diff --git a/pkg/cache/cache.go b/pkg/cache/cache.go
index c71b426f00cbca17ca0b2597e222e3e2a57ea58d..e8feb4ce5309bfa92feec72c4624190a3c1e1c79 100644
--- a/pkg/cache/cache.go
+++ b/pkg/cache/cache.go
@@ -1,88 +1,7 @@
 package cache
 
-import (
-	"fmt"
-	"time"
-
-	"git.perx.ru/perxis/perxis-go/pkg/service"
-	lru "github.com/hashicorp/golang-lru/v2"
-	"go.uber.org/zap"
-)
-
-const (
-	defaultCacheSize = 1000
-	defaultTTL       = 30 * time.Second
-)
-
-type Cache struct {
-	cache  *lru.Cache[interface{}, interface{}]
-	ttl    time.Duration
-	logger *zap.Logger
-}
-
-type item struct {
-	value     interface{}
-	expiredAt time.Time
-}
-
-func NewCache(size int, ttl time.Duration, opts ...interface{}) *Cache {
-	if size == 0 {
-		size = defaultCacheSize
-	}
-	if ttl == 0 {
-		ttl = defaultTTL
-	}
-	c, err := lru.New[interface{}, interface{}](size)
-	if err != nil {
-		panic(err)
-	}
-	ch := &Cache{
-		cache:  c,
-		ttl:    ttl,
-		logger: zap.NewNop(),
-	}
-
-	for _, o := range opts {
-		switch p := o.(type) {
-		case *zap.Logger:
-			ch.logger = p
-		}
-	}
-
-	ch.logger = ch.logger.Named("Cache")
-
-	return ch
-}
-
-func (c *Cache) Set(key, value interface{}) (err error) {
-	c.cache.Add(key, &item{value: value, expiredAt: time.Now().Add(c.ttl)})
-	c.logger.Debug("Set", zap.String("key", fmt.Sprintf("%v", key)), zap.String("ptr", fmt.Sprintf("%p", value)))
-	return nil
-}
-
-func (c *Cache) Get(key interface{}) (value interface{}, err error) {
-	val, ok := c.cache.Get(key)
-	if ok {
-		v := val.(*item)
-		if v.expiredAt.Before(time.Now()) {
-			_ = c.Remove(key)
-			c.logger.Debug("Expired", zap.String("key", fmt.Sprintf("%v", key)), zap.String("ptr", fmt.Sprintf("%p", v.value)))
-			return nil, service.ErrNotFound
-		}
-		c.logger.Debug("Hit", zap.String("key", fmt.Sprintf("%v", key)), zap.String("ptr", fmt.Sprintf("%p", v.value)))
-		return v.value, nil
-	}
-	c.logger.Debug("Miss", zap.String("key", fmt.Sprintf("%v", key)))
-	return nil, service.ErrNotFound
-}
-
-func (c *Cache) Remove(key interface{}) (err error) {
-	present := c.cache.Remove(key)
-	c.logger.Debug("Remove", zap.String("key", fmt.Sprintf("%v", key)))
-
-	if !present {
-		err = service.ErrNotFound
-	}
-
-	return
+type Cache interface {
+	Set(key, value any) error
+	Get(key any) (any, error)
+	Remove(key any) error
 }
diff --git a/pkg/cache/memory_cache.go b/pkg/cache/memory_cache.go
new file mode 100644
index 0000000000000000000000000000000000000000..12b9b55812bbfb11646f828a4a3e643027687c4b
--- /dev/null
+++ b/pkg/cache/memory_cache.go
@@ -0,0 +1,90 @@
+package cache
+
+import (
+	"fmt"
+	"time"
+
+	"git.perx.ru/perxis/perxis-go/pkg/service"
+	lru "github.com/hashicorp/golang-lru/v2"
+	"go.uber.org/zap"
+)
+
+const (
+	defaultCacheSize = 1000
+	defaultTTL       = 30 * time.Second
+)
+
+var _ Cache = &MemoryCache{}
+
+type MemoryCache struct {
+	cache  *lru.Cache[interface{}, interface{}]
+	ttl    time.Duration
+	logger *zap.Logger
+}
+
+type item struct {
+	value     interface{}
+	expiredAt time.Time
+}
+
+func NewMemoryCache(size int, ttl time.Duration, opts ...interface{}) *MemoryCache {
+	if size == 0 {
+		size = defaultCacheSize
+	}
+	if ttl == 0 {
+		ttl = defaultTTL
+	}
+	c, err := lru.New[interface{}, interface{}](size)
+	if err != nil {
+		panic(err)
+	}
+	ch := &MemoryCache{
+		cache:  c,
+		ttl:    ttl,
+		logger: zap.NewNop(),
+	}
+
+	for _, o := range opts {
+		switch p := o.(type) {
+		case *zap.Logger:
+			ch.logger = p
+		}
+	}
+
+	ch.logger = ch.logger.Named("Cache")
+
+	return ch
+}
+
+func (c *MemoryCache) Set(key, value interface{}) (err error) {
+	c.cache.Add(key, &item{value: value, expiredAt: time.Now().Add(c.ttl)})
+	c.logger.Debug("Set", zap.String("key", fmt.Sprintf("%v", key)), zap.String("ptr", fmt.Sprintf("%p", value)))
+	return nil
+}
+
+func (c *MemoryCache) Get(key interface{}) (value interface{}, err error) {
+	val, ok := c.cache.Get(key)
+	if ok {
+		v := val.(*item)
+		if v.expiredAt.Before(time.Now()) {
+			_ = c.Remove(key)
+			c.logger.Debug("Expired", zap.String("key", fmt.Sprintf("%v", key)), zap.String("ptr", fmt.Sprintf("%p", v.value)))
+			return nil, service.ErrNotFound
+		}
+		c.logger.Debug("Hit", zap.String("key", fmt.Sprintf("%v", key)), zap.String("ptr", fmt.Sprintf("%p", v.value)))
+		return v.value, nil
+	}
+	c.logger.Debug("Miss", zap.String("key", fmt.Sprintf("%v", key)))
+	return nil, service.ErrNotFound
+}
+
+func (c *MemoryCache) Remove(key interface{}) (err error) {
+	present := c.cache.Remove(key)
+	c.logger.Debug("Remove", zap.String("key", fmt.Sprintf("%v", key)))
+
+	if !present {
+		err = service.ErrNotFound
+	}
+
+	return
+}
diff --git a/pkg/cache/cache_test.go b/pkg/cache/memory_cache_test.go
similarity index 93%
rename from pkg/cache/cache_test.go
rename to pkg/cache/memory_cache_test.go
index b0d4304a499f0970cc695b667429c896763c1a33..b7cf246f6923f6fe131de760a5cbf3272fec2da1 100644
--- a/pkg/cache/cache_test.go
+++ b/pkg/cache/memory_cache_test.go
@@ -10,7 +10,7 @@ import (
 
 func TestCache(t *testing.T) {
 	t.Run("Simple", func(t *testing.T) {
-		c := NewCache(10, 0)
+		c := NewMemoryCache(10, 0)
 
 		{
 			val, err := c.Get("test_key")
@@ -37,7 +37,7 @@ func TestCache(t *testing.T) {
 		}
 	})
 	t.Run("Value Evicted", func(t *testing.T) {
-		c := NewCache(1, 0)
+		c := NewMemoryCache(1, 0)
 
 		{
 			err := c.Set("test_key_1", "test_val_1")
@@ -62,7 +62,7 @@ func TestCache(t *testing.T) {
 
 	})
 	t.Run("TTL expired", func(t *testing.T) {
-		c := NewCache(10, 10*time.Millisecond)
+		c := NewMemoryCache(10, 10*time.Millisecond)
 
 		err := c.Set("test_key", "test_val")
 		require.NoError(t, err)
diff --git a/pkg/clients/middleware/caching_middleware.go b/pkg/clients/middleware/caching_middleware.go
index 1733c0de4a8dde8f011d46b2b77005f8924e60bb..08af3a47a7cd3f23b8ae07e4050f9e18f1be1ee3 100644
--- a/pkg/clients/middleware/caching_middleware.go
+++ b/pkg/clients/middleware/caching_middleware.go
@@ -12,7 +12,7 @@ func makeKey(ss ...string) string {
 	return strings.Join(ss, "-")
 }
 
-func CachingMiddleware(cache *cache.Cache) Middleware {
+func CachingMiddleware(cache cache.Cache) Middleware {
 	return func(next service.Clients) service.Clients {
 		return &cachingMiddleware{
 			cache: cache,
@@ -22,7 +22,7 @@ func CachingMiddleware(cache *cache.Cache) Middleware {
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Clients
 }
 
diff --git a/pkg/clients/middleware/caching_middleware_test.go b/pkg/clients/middleware/caching_middleware_test.go
index b842e1183a5425a4b3aec8d59b0720e5627767ed..2a90c1db2c322ca9509cb2bf9bdd63b252e67c68 100644
--- a/pkg/clients/middleware/caching_middleware_test.go
+++ b/pkg/clients/middleware/caching_middleware_test.go
@@ -31,7 +31,7 @@ func TestClientsCache(t *testing.T) {
 	t.Run("Get from cache", func(t *testing.T) {
 		cs := &csmocks.Clients{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 		cs.On("Get", mock.Anything, spaceID, cltID).Return(&clients.Client{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}}, nil).Once()
 
@@ -52,7 +52,7 @@ func TestClientsCache(t *testing.T) {
 	t.Run("GetBy from cache", func(t *testing.T) {
 		cs := &csmocks.Clients{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 		cs.On("GetBy", mock.Anything, spaceID, &clients.GetByParams{OAuthClientID: clientID}).Return(&clients.Client{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}}, nil).Once()
 
@@ -73,7 +73,7 @@ func TestClientsCache(t *testing.T) {
 	t.Run("List", func(t *testing.T) {
 		cs := &csmocks.Clients{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 		cs.On("List", mock.Anything, spaceID).Return([]*clients.Client{{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}}}, nil).Once()
 
@@ -92,7 +92,7 @@ func TestClientsCache(t *testing.T) {
 		t.Run("After Update", func(t *testing.T) {
 			cs := &csmocks.Clients{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 			cs.On("Get", mock.Anything, spaceID, cltID).Return(&clients.Client{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}}, nil).Once()
 			cs.On("List", mock.Anything, spaceID).Return([]*clients.Client{{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}}}, nil).Once()
@@ -143,7 +143,7 @@ func TestClientsCache(t *testing.T) {
 		t.Run("After Update(List)", func(t *testing.T) {
 			cs := &csmocks.Clients{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 			cs.On("List", mock.Anything, spaceID).Return([]*clients.Client{{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}}}, nil).Once()
 
@@ -172,7 +172,7 @@ func TestClientsCache(t *testing.T) {
 		t.Run("After Delete", func(t *testing.T) {
 			cs := &csmocks.Clients{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 			cs.On("Get", mock.Anything, spaceID, cltID).Return(&clients.Client{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}}, nil).Once()
 			cs.On("List", mock.Anything, spaceID).Return([]*clients.Client{{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}}}, nil).Once()
@@ -222,7 +222,7 @@ func TestClientsCache(t *testing.T) {
 		t.Run("After Delete(List)", func(t *testing.T) {
 			cs := &csmocks.Clients{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 			cs.On("List", mock.Anything, spaceID).Return([]*clients.Client{{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}}}, nil).Once()
 
@@ -250,7 +250,7 @@ func TestClientsCache(t *testing.T) {
 		t.Run("After Create", func(t *testing.T) {
 			cs := &csmocks.Clients{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 			cs.On("List", mock.Anything, spaceID).Return([]*clients.Client{{ID: cltID, SpaceID: spaceID, Name: "client_1"}}, nil).Once()
 
@@ -279,7 +279,7 @@ func TestClientsCache(t *testing.T) {
 		t.Run("After Enable", func(t *testing.T) {
 			cs := &csmocks.Clients{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 			tr := true
 			cs.On("Get", mock.Anything, spaceID, cltID).Return(&clients.Client{ID: cltID, SpaceID: spaceID, OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}, Disabled: &tr}, nil).Once()
@@ -329,7 +329,7 @@ func TestClientsCache(t *testing.T) {
 		t.Run("After Enable(List)", func(t *testing.T) {
 			cs := &csmocks.Clients{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 			tr := true
 			cs.On("List", mock.Anything, spaceID).Return([]*clients.Client{{ID: cltID, SpaceID: spaceID, OAuth: &clients.OAuth{ClientID: clientID, AuthID: "authID"}, Disabled: &tr}}, nil).Once()
@@ -359,7 +359,7 @@ func TestClientsCache(t *testing.T) {
 		t.Run("After TTL expired", func(t *testing.T) {
 			cs := &csmocks.Clients{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 			cs.On("Get", mock.Anything, spaceID, cltID).Return(&clients.Client{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID}}, nil).Once()
 			cs.On("Get", mock.Anything, spaceID, cltID).Return(&clients.Client{ID: cltID, SpaceID: spaceID, Name: "client_1", OAuth: &clients.OAuth{ClientID: clientID}}, nil).Once()
diff --git a/pkg/collaborators/middleware/caching_middleware.go b/pkg/collaborators/middleware/caching_middleware.go
index ea595919431cd653e74ca0ffe24b62ff3b2d0a10..7533ae551ed47a421d3fe8ed643ce679e07fddc2 100644
--- a/pkg/collaborators/middleware/caching_middleware.go
+++ b/pkg/collaborators/middleware/caching_middleware.go
@@ -12,7 +12,7 @@ func makeKey(ss ...string) string {
 	return strings.Join(ss, "-")
 }
 
-func CachingMiddleware(cache *cache.Cache) Middleware {
+func CachingMiddleware(cache cache.Cache) Middleware {
 	return func(next service.Collaborators) service.Collaborators {
 		return &cachingMiddleware{
 			cache: cache,
@@ -22,7 +22,7 @@ func CachingMiddleware(cache *cache.Cache) Middleware {
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Collaborators
 }
 
diff --git a/pkg/collaborators/middleware/caching_middleware_test.go b/pkg/collaborators/middleware/caching_middleware_test.go
index b7dc09281a9f972e9eafde3dd87ce628b0ea2fae..ea2ccaddb2621c306e317d6d873a455489a6a2a6 100644
--- a/pkg/collaborators/middleware/caching_middleware_test.go
+++ b/pkg/collaborators/middleware/caching_middleware_test.go
@@ -31,7 +31,7 @@ func TestCollaboratorsCache(t *testing.T) {
 	t.Run("Get from cache", func(t *testing.T) {
 		cs := &csmocks.Collaborators{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 		cs.On("Get", mock.Anything, spaceID, userID).Return(spaceRole, nil).Once()
 
@@ -48,7 +48,7 @@ func TestCollaboratorsCache(t *testing.T) {
 	t.Run("ListCollaborators from cache", func(t *testing.T) {
 		cs := &csmocks.Collaborators{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 		cs.On("ListCollaborators", mock.Anything, spaceID).Return([]*collaborators.Collaborator{{SpaceID: spaceID, Subject: userID, Role: spaceRole}}, nil).Once()
 
@@ -64,7 +64,7 @@ func TestCollaboratorsCache(t *testing.T) {
 	t.Run("ListSpaces from cache", func(t *testing.T) {
 		cs := &csmocks.Collaborators{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 		cs.On("ListSpaces", mock.Anything, userID).Return([]*collaborators.Collaborator{{SpaceID: spaceID, Subject: userID, Role: spaceRole}}, nil).Once()
 
@@ -81,7 +81,7 @@ func TestCollaboratorsCache(t *testing.T) {
 		t.Run("After Remove", func(t *testing.T) {
 			cs := &csmocks.Collaborators{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 			cs.On("Get", mock.Anything, spaceID, userID).Return(spaceRole, nil).Once()
 			cs.On("ListCollaborators", mock.Anything, spaceID).Return([]*collaborators.Collaborator{{SpaceID: spaceID, Subject: userID, Role: spaceRole}}, nil).Once()
@@ -135,7 +135,7 @@ func TestCollaboratorsCache(t *testing.T) {
 		t.Run("After TTL expired", func(t *testing.T) {
 			cs := &csmocks.Collaborators{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(cs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(cs)
 
 			cs.On("Get", mock.Anything, spaceID, userID).Return(spaceRole, nil).Once()
 			cs.On("ListCollaborators", mock.Anything, spaceID).Return([]*collaborators.Collaborator{{SpaceID: spaceID, Subject: userID, Role: spaceRole}}, nil).Once()
diff --git a/pkg/collections/middleware/caching_middleware.go b/pkg/collections/middleware/caching_middleware.go
index 469c39df98e1edb80495257999b6fecf81011247..de34d42af02f7259c66aea5799210c50c0e1961e 100644
--- a/pkg/collections/middleware/caching_middleware.go
+++ b/pkg/collections/middleware/caching_middleware.go
@@ -19,7 +19,7 @@ func makeKey(spaceId, envId, collectionId string, disableSchemaIncludes bool) st
 	return s
 }
 
-func CachingMiddleware(cache *cache.Cache, envs envService.Environments) Middleware {
+func CachingMiddleware(cache cache.Cache, envs envService.Environments) Middleware {
 	return func(next service.Collections) service.Collections {
 		return &cachingMiddleware{
 			cache: cache,
@@ -30,7 +30,7 @@ func CachingMiddleware(cache *cache.Cache, envs envService.Environments) Middlew
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Collections
 	envs  envService.Environments
 }
diff --git a/pkg/collections/middleware/caching_middleware_test.go b/pkg/collections/middleware/caching_middleware_test.go
index c9e58b6886e121bf6b1f2edd37d9f4d9a69c9319..ac284ce5464af7469fee9ad4a7babf377b9c335a 100644
--- a/pkg/collections/middleware/caching_middleware_test.go
+++ b/pkg/collections/middleware/caching_middleware_test.go
@@ -36,7 +36,7 @@ func TestCollections_Cache(t *testing.T) {
 		col := &colsmocks.Collections{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 		col.On("Get", mock.Anything, spaceID, envID, colID).Return(&collections.Collection{ID: colID, SpaceID: spaceID, EnvID: envID, Name: "name"}, nil).Once()
@@ -60,7 +60,7 @@ func TestCollections_Cache(t *testing.T) {
 		col := &colsmocks.Collections{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 
 		col.On("Get", mock.Anything, spaceID, envAlias, colID).Return(&collections.Collection{ID: colID, SpaceID: spaceID, EnvID: envID, Name: "name"}, nil).Once()
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
@@ -84,7 +84,7 @@ func TestCollections_Cache(t *testing.T) {
 		col := &colsmocks.Collections{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 		col.On("Get", mock.Anything, spaceID, envID, colID, mock.Anything).Run(func(args mock.Arguments) {
@@ -104,7 +104,7 @@ func TestCollections_Cache(t *testing.T) {
 	//	col := &colsmocks.Collections{}
 	//	env := &envmocks.Environments{}
 	//
-	//	svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+	//	svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 	//
 	//	col.On("List", mock.Anything, spaceID, envID).Return([]*collections.Collection{{ID: colID, SpaceID: spaceID, EnvID: envID, Name: "name"}}, nil).Once()
 	//	env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
@@ -130,7 +130,7 @@ func TestCollections_Cache(t *testing.T) {
 		col := &colsmocks.Collections{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 
 		col.On("List", mock.Anything, spaceID, envAlias, mock.Anything).Return([]*collections.Collection{{ID: colID, SpaceID: spaceID, EnvID: envID, Name: "name"}}, nil).Once()
 		col.On("List", mock.Anything, spaceID, envID, mock.Anything).Return([]*collections.Collection{{ID: colID, SpaceID: spaceID, EnvID: envID, Name: "name"}}, nil).Once()
@@ -150,7 +150,7 @@ func TestCollections_Cache(t *testing.T) {
 			col := &colsmocks.Collections{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			col.On("Get", mock.Anything, spaceID, envID, colID).Return(&collections.Collection{ID: colID, SpaceID: spaceID, EnvID: envID, Name: "name"}, nil).Once()
@@ -199,7 +199,7 @@ func TestCollections_Cache(t *testing.T) {
 			col := &colsmocks.Collections{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			//env.On("Get", mock.Anything, spaceID, envAlias).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
@@ -252,7 +252,7 @@ func TestCollections_Cache(t *testing.T) {
 			col := &colsmocks.Collections{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Twice()
 			col.On("Get", mock.Anything, spaceID, envID, colID).Return(&collections.Collection{ID: colID, SpaceID: spaceID, EnvID: envID, Name: "name"}, nil).Once()
@@ -317,7 +317,7 @@ func TestCollections_Cache(t *testing.T) {
 			col := &colsmocks.Collections{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Twice()
 			col.On("Get", mock.Anything, spaceID, envID, colID).Return(&collections.Collection{ID: colID, SpaceID: spaceID, EnvID: envID, Name: "name"}, nil).Once()
@@ -379,7 +379,7 @@ func TestCollections_Cache(t *testing.T) {
 			col := &colsmocks.Collections{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 
 			//env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			col.On("List", mock.Anything, spaceID, envID, mock.Anything).Return([]*collections.Collection{{ID: colID, SpaceID: spaceID, EnvID: envID, Name: "name"}}, nil).Twice()
@@ -430,7 +430,7 @@ func TestCollections_Cache(t *testing.T) {
 			col := &colsmocks.Collections{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), env)(col)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), env)(col)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil)
 			col.On("Get", mock.Anything, spaceID, envID, colID).Return(&collections.Collection{ID: colID, SpaceID: spaceID, EnvID: envID, Name: "name"}, nil).Once()
diff --git a/pkg/content/client.go b/pkg/content/client.go
index af5ba5bf9956cfaa51e0636acff0d98c82edfb38..bbdd62bb9474afd54ce63606055c244311478adc 100644
--- a/pkg/content/client.go
+++ b/pkg/content/client.go
@@ -76,15 +76,15 @@ func NewClient(conn *grpc.ClientConn, opts ...Option) *Content {
 func WithCaching(client *Content, size int, ttl time.Duration) *Content {
 	c := *client
 
-	c.Clients = clientsSvc.CachingMiddleware(cache.NewCache(size, ttl))(client.Clients)
-	c.Environments = environmentsSvc.CachingMiddleware(cache.NewCache(size, ttl))(client.Environments)
-	c.Locales = localesSvc.CachingMiddleware(cache.NewCache(size, ttl))(client.Locales)
-	c.Roles = rolesSvc.CachingMiddleware(cache.NewCache(size, ttl))(client.Roles)
-	c.Spaces = spacesSvc.CachingMiddleware(cache.NewCache(size, ttl))(client.Spaces)
-	c.Items = itemsSvc.CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), c.Environments)(client.Items)
-	c.Collections = collectionsSvc.CachingMiddleware(cache.NewCache(size, ttl), c.Environments)(client.Collections)
-	c.Collaborators = collaboratorsSvc.CachingMiddleware(cache.NewCache(size, ttl))(client.Collaborators)
-	c.Invitations = invitationsSvc.CachingMiddleware(cache.NewCache(size, ttl))(client.Invitations)
+	c.Clients = clientsSvc.CachingMiddleware(cache.NewMemoryCache(size, ttl))(client.Clients)
+	c.Environments = environmentsSvc.CachingMiddleware(cache.NewMemoryCache(size, ttl))(client.Environments)
+	c.Locales = localesSvc.CachingMiddleware(cache.NewMemoryCache(size, ttl))(client.Locales)
+	c.Roles = rolesSvc.CachingMiddleware(cache.NewMemoryCache(size, ttl))(client.Roles)
+	c.Spaces = spacesSvc.CachingMiddleware(cache.NewMemoryCache(size, ttl))(client.Spaces)
+	c.Items = itemsSvc.CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), c.Environments)(client.Items)
+	c.Collections = collectionsSvc.CachingMiddleware(cache.NewMemoryCache(size, ttl), c.Environments)(client.Collections)
+	c.Collaborators = collaboratorsSvc.CachingMiddleware(cache.NewMemoryCache(size, ttl))(client.Collaborators)
+	c.Invitations = invitationsSvc.CachingMiddleware(cache.NewMemoryCache(size, ttl))(client.Invitations)
 
 	return &c
 }
diff --git a/pkg/delivery/client/client.go b/pkg/delivery/client/client.go
index 1de0dd684a2344264ad217c2834fbb74f19d837f..e3fb962c22cd76d4adc2cbd5ca9d6195eb9e41d6 100644
--- a/pkg/delivery/client/client.go
+++ b/pkg/delivery/client/client.go
@@ -44,10 +44,10 @@ func NewClient(conn *grpc.ClientConn, opts ...Option) (delivery.Delivery, error)
 func WithCaching(cfg *deliveryservice.Config, size int, ttl time.Duration) *deliveryservice.Config {
 	c := *cfg
 
-	c.Environments = environments.CachingMiddleware(cache.NewCache(size, ttl))(cfg.Environments)
-	c.Locales = locales.CachingMiddleware(cache.NewCache(size, ttl))(cfg.Locales)
-	c.Items = items.CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), c.Environments)(cfg.Items)
-	c.Collections = collections.CachingMiddleware(cache.NewCache(size, ttl), c.Environments)(cfg.Collections)
+	c.Environments = environments.CachingMiddleware(cache.NewMemoryCache(size, ttl))(cfg.Environments)
+	c.Locales = locales.CachingMiddleware(cache.NewMemoryCache(size, ttl))(cfg.Locales)
+	c.Items = items.CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), c.Environments)(cfg.Items)
+	c.Collections = collections.CachingMiddleware(cache.NewMemoryCache(size, ttl), c.Environments)(cfg.Collections)
 
 	return &c
 }
diff --git a/pkg/environments/middleware/caching_middleware.go b/pkg/environments/middleware/caching_middleware.go
index dfe5b927117bfecdb56d11ab0e14582e43ef75b7..0801730a0e93947c847352a9710a02f85ae94ee0 100644
--- a/pkg/environments/middleware/caching_middleware.go
+++ b/pkg/environments/middleware/caching_middleware.go
@@ -12,7 +12,7 @@ func makeKey(ss ...string) string {
 	return strings.Join(ss, "-")
 }
 
-func CachingMiddleware(cache *cache.Cache) Middleware {
+func CachingMiddleware(cache cache.Cache) Middleware {
 	return func(next service.Environments) service.Environments {
 		return &cachingMiddleware{
 			cache: cache,
@@ -22,7 +22,7 @@ func CachingMiddleware(cache *cache.Cache) Middleware {
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Environments
 }
 
diff --git a/pkg/environments/middleware/caching_middleware_test.go b/pkg/environments/middleware/caching_middleware_test.go
index 2e1b73a8366873dfb31b8d9fd24d31ac894025ee..784ce35632e2bcd74993ce499f4ec1db329041d7 100644
--- a/pkg/environments/middleware/caching_middleware_test.go
+++ b/pkg/environments/middleware/caching_middleware_test.go
@@ -31,7 +31,7 @@ func TestEnvironmentsCache(t *testing.T) {
 	t.Run("Get from cache", func(t *testing.T) {
 		envs := &mocksenvironments.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(envs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(envs)
 
 		envs.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{envAlias}}, nil).Once()
 
@@ -52,7 +52,7 @@ func TestEnvironmentsCache(t *testing.T) {
 	t.Run("Get from cache(by Alias)", func(t *testing.T) {
 		envs := &mocksenvironments.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(envs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(envs)
 
 		envs.On("Get", mock.Anything, spaceID, envAlias).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{envAlias}}, nil).Once()
 
@@ -73,7 +73,7 @@ func TestEnvironmentsCache(t *testing.T) {
 	t.Run("List from cache", func(t *testing.T) {
 		envs := &mocksenvironments.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(envs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(envs)
 
 		envs.On("List", mock.Anything, spaceID).Return([]*environments.Environment{{ID: envID, SpaceID: spaceID, Description: "Environment"}}, nil).Once()
 
@@ -91,7 +91,7 @@ func TestEnvironmentsCache(t *testing.T) {
 		t.Run("After SetAlias", func(t *testing.T) {
 			envs := &mocksenvironments.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(envs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(envs)
 
 			envs.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{"envID2"}}, nil).Once()
 			envs.On("List", mock.Anything, spaceID).Return([]*environments.Environment{{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{"envID2"}}}, nil).Once()
@@ -135,7 +135,7 @@ func TestEnvironmentsCache(t *testing.T) {
 		t.Run("After RemoveAlias", func(t *testing.T) {
 			envs := &mocksenvironments.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(envs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(envs)
 
 			envs.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{"envID2", envAlias}}, nil).Once()
 			envs.On("List", mock.Anything, spaceID).Return([]*environments.Environment{{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{"envID2", envAlias}}}, nil).Once()
@@ -184,7 +184,7 @@ func TestEnvironmentsCache(t *testing.T) {
 		t.Run("After Update", func(t *testing.T) {
 			envs := &mocksenvironments.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(envs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(envs)
 
 			envs.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{envAlias}}, nil).Once()
 			envs.On("List", mock.Anything, spaceID).Return([]*environments.Environment{{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{envAlias}}}, nil).Once()
@@ -235,7 +235,7 @@ func TestEnvironmentsCache(t *testing.T) {
 		t.Run("After Update(List)", func(t *testing.T) {
 			envs := &mocksenvironments.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(envs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(envs)
 
 			envs.On("List", mock.Anything, spaceID).Return([]*environments.Environment{{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{envAlias}}}, nil).Once()
 			envs.On("Update", mock.Anything, mock.Anything).Return(nil).Once()
@@ -262,7 +262,7 @@ func TestEnvironmentsCache(t *testing.T) {
 		t.Run("After Delete", func(t *testing.T) {
 			envs := &mocksenvironments.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(envs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(envs)
 
 			envs.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{envAlias}}, nil).Once()
 			envs.On("List", mock.Anything, spaceID).Return([]*environments.Environment{{ID: envID, SpaceID: spaceID, Description: "Environment", Aliases: []string{envAlias}}}, nil).Once()
@@ -311,7 +311,7 @@ func TestEnvironmentsCache(t *testing.T) {
 		t.Run("After Create", func(t *testing.T) {
 			envs := &mocksenvironments.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(envs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(envs)
 
 			envs.On("List", mock.Anything, spaceID).Return([]*environments.Environment{{ID: envID, SpaceID: spaceID, Description: "Environment"}}, nil).Once()
 
@@ -338,7 +338,7 @@ func TestEnvironmentsCache(t *testing.T) {
 		t.Run("After size exceeded", func(t *testing.T) {
 			envs := &mocksenvironments.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(1, ttl))(envs)
+			svc := CachingMiddleware(cache.NewMemoryCache(1, ttl))(envs)
 
 			envs.On("Get", mock.Anything, spaceID, "envID2").Return(&environments.Environment{ID: "envID2", SpaceID: spaceID, Description: "Environment2"}, nil).Once()
 			envs.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Description: "Environment"}, nil).Once()
@@ -364,7 +364,7 @@ func TestEnvironmentsCache(t *testing.T) {
 		t.Run("After TTL expired", func(t *testing.T) {
 			envs := &mocksenvironments.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(envs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(envs)
 
 			envs.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Description: "Environment"}, nil).Once()
 			v1, err := svc.Get(ctx, spaceID, envID)
diff --git a/pkg/invitations/middleware/caching_middleware.go b/pkg/invitations/middleware/caching_middleware.go
index 651514a530039e7859fe146bd921c9d82e9ebd01..5f2a1086a15c09d55b5461e029036b091d68dcfe 100644
--- a/pkg/invitations/middleware/caching_middleware.go
+++ b/pkg/invitations/middleware/caching_middleware.go
@@ -8,7 +8,7 @@ import (
 	services "git.perx.ru/perxis/perxis-go/pkg/options"
 )
 
-func CachingMiddleware(cache *cache.Cache) Middleware {
+func CachingMiddleware(cache cache.Cache) Middleware {
 	return func(next service.Invitations) service.Invitations {
 		return &cachingMiddleware{
 			cache: cache,
@@ -18,7 +18,7 @@ func CachingMiddleware(cache *cache.Cache) Middleware {
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Invitations
 }
 
diff --git a/pkg/invitations/middleware/caching_middleware_test.go b/pkg/invitations/middleware/caching_middleware_test.go
index 8c83d76ec0a35f1fa06e1065da3624ab3f7198e3..e7fac6f545463644ddd7476a43123f248b9a16b8 100644
--- a/pkg/invitations/middleware/caching_middleware_test.go
+++ b/pkg/invitations/middleware/caching_middleware_test.go
@@ -32,7 +32,7 @@ func TestLocalesCache(t *testing.T) {
 	t.Run("Get from Cache", func(t *testing.T) {
 		inv := &invmocks.Invitations{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(inv)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(inv)
 
 		inv.On("Get", mock.Anything, invID).Return(&invitations.Invitation{ID: invID, Email: email, OrgID: orgID}, nil).Once()
 
@@ -50,7 +50,7 @@ func TestLocalesCache(t *testing.T) {
 		t.Run("Get from Accept", func(t *testing.T) {
 			inv := &invmocks.Invitations{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(inv)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(inv)
 
 			inv.On("Get", mock.Anything, invID).Return(&invitations.Invitation{ID: invID, Email: email, OrgID: orgID}, nil).Once()
 
@@ -77,7 +77,7 @@ func TestLocalesCache(t *testing.T) {
 		t.Run("Get from Delete", func(t *testing.T) {
 			inv := &invmocks.Invitations{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(inv)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(inv)
 
 			inv.On("Get", mock.Anything, invID).Return(&invitations.Invitation{ID: invID, Email: email, OrgID: orgID}, nil).Once()
 
@@ -104,7 +104,7 @@ func TestLocalesCache(t *testing.T) {
 		t.Run("After TTL expired", func(t *testing.T) {
 			inv := &invmocks.Invitations{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(inv)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(inv)
 
 			inv.On("Get", mock.Anything, invID).Return(&invitations.Invitation{ID: invID, Email: email, OrgID: orgID}, nil).Once()
 
diff --git a/pkg/items/middleware/caching_middleware.go b/pkg/items/middleware/caching_middleware.go
index 2d76f2150eeacc1cd70e9697c3db63853ef47908..6b11851381fb9dc13b630477052f05d4148bc765 100644
--- a/pkg/items/middleware/caching_middleware.go
+++ b/pkg/items/middleware/caching_middleware.go
@@ -13,7 +13,7 @@ func makeKey(ss ...string) string {
 	return strings.Join(ss, "-")
 }
 
-func CachingMiddleware(cache, cachePublished *cache.Cache, envs envService.Environments) Middleware {
+func CachingMiddleware(cache, cachePublished cache.Cache, envs envService.Environments) Middleware {
 	return func(next service.Items) service.Items {
 		return &cachingMiddleware{
 			cache:          cache,
@@ -25,8 +25,8 @@ func CachingMiddleware(cache, cachePublished *cache.Cache, envs envService.Envir
 }
 
 type cachingMiddleware struct {
-	cache          *cache.Cache
-	cachePublished *cache.Cache
+	cache          cache.Cache
+	cachePublished cache.Cache
 	envs           envService.Environments
 	service.Items
 }
diff --git a/pkg/items/middleware/caching_middleware_test.go b/pkg/items/middleware/caching_middleware_test.go
index b7ea569db094e7905b6aae2ce8bebfb381849f95..c3e862b1ffe3dd5e7fdde976cc4aa09e316a600f 100644
--- a/pkg/items/middleware/caching_middleware_test.go
+++ b/pkg/items/middleware/caching_middleware_test.go
@@ -37,7 +37,7 @@ func TestItemsCache(t *testing.T) {
 		itms := &itmsmocks.Items{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 		itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -61,7 +61,7 @@ func TestItemsCache(t *testing.T) {
 		itms := &itmsmocks.Items{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 		itms.On("Get", mock.Anything, spaceID, envAlias, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -85,7 +85,7 @@ func TestItemsCache(t *testing.T) {
 		itms := &itmsmocks.Items{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 		itms.On("GetPublished", mock.Anything, spaceID, envID, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -109,7 +109,7 @@ func TestItemsCache(t *testing.T) {
 		itms := &itmsmocks.Items{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 		itms.On("GetPublished", mock.Anything, spaceID, envAlias, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -138,7 +138,7 @@ func TestItemsCache(t *testing.T) {
 		itms := &itmsmocks.Items{}
 		env := &envmocks.Environments{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 		env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Twice()
 		itms.On("GetPublished", mock.Anything, spaceID, envAlias, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -176,7 +176,7 @@ func TestItemsCache(t *testing.T) {
 			env := &envmocks.Environments{}
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, Data: map[string]interface{}{"f1": "d1"}}, nil).Once()
 
@@ -208,7 +208,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -241,7 +241,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -273,7 +273,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished}, nil).Once()
@@ -313,7 +313,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished}, nil).Once()
@@ -346,7 +346,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -379,7 +379,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, Data: map[string]interface{}{"f1": "d1"}}, nil).Once()
@@ -412,7 +412,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished}, nil).Once()
@@ -445,7 +445,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("GetPublished", mock.Anything, spaceID, envID, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished, Data: map[string]interface{}{"f1": "d1"}}, nil).Once()
@@ -486,7 +486,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("GetPublished", mock.Anything, spaceID, envID, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
@@ -527,7 +527,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("GetPublished", mock.Anything, spaceID, envID, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished}, nil).Once()
@@ -568,7 +568,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("GetPublished", mock.Anything, spaceID, envID, colID, itemID, mock.Anything).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StatePublished}, nil).Once()
@@ -609,7 +609,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
@@ -657,7 +657,7 @@ func TestItemsCache(t *testing.T) {
 			itms := &itmsmocks.Items{}
 			env := &envmocks.Environments{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl), cache.NewCache(size, ttl), env)(itms)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl), cache.NewMemoryCache(size, ttl), env)(itms)
 
 			env.On("Get", mock.Anything, spaceID, envID).Return(&environments.Environment{ID: envID, SpaceID: spaceID, Aliases: []string{envAlias}}, nil).Once()
 			itms.On("Get", mock.Anything, spaceID, envID, colID, itemID).Return(&items.Item{ID: itemID, SpaceID: spaceID, EnvID: envID, CollectionID: colID, State: items.StateDraft}, nil).Once()
diff --git a/pkg/locales/middleware/caching_middleware.go b/pkg/locales/middleware/caching_middleware.go
index 9d1624950aab3d798070844ed2e9d89142430c2c..13928a5166f2187e85a5e7da63861509e3f69d3a 100644
--- a/pkg/locales/middleware/caching_middleware.go
+++ b/pkg/locales/middleware/caching_middleware.go
@@ -7,7 +7,7 @@ import (
 	service "git.perx.ru/perxis/perxis-go/pkg/locales"
 )
 
-func CachingMiddleware(cache *cache.Cache) Middleware {
+func CachingMiddleware(cache cache.Cache) Middleware {
 	return func(next service.Locales) service.Locales {
 		return &cachingMiddleware{
 			cache: cache,
@@ -17,7 +17,7 @@ func CachingMiddleware(cache *cache.Cache) Middleware {
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Locales
 }
 
diff --git a/pkg/locales/middleware/caching_middleware_test.go b/pkg/locales/middleware/caching_middleware_test.go
index d39e78d78e487c7c2c90f906559dee400aaa414b..281aa49611a83e4a0a28f1064dbf5fe149dd29f3 100644
--- a/pkg/locales/middleware/caching_middleware_test.go
+++ b/pkg/locales/middleware/caching_middleware_test.go
@@ -28,7 +28,7 @@ func TestLocalesCache(t *testing.T) {
 	t.Run("List from Cache", func(t *testing.T) {
 		loc := &locmocks.Locales{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(loc)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(loc)
 
 		loc.On("List", mock.Anything, spaceID).Return([]*locales.Locale{{ID: loc1, Name: "name1", SpaceID: spaceID}}, nil).Once()
 
@@ -46,7 +46,7 @@ func TestLocalesCache(t *testing.T) {
 		t.Run("After Delete", func(t *testing.T) {
 			loc := &locmocks.Locales{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(loc)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(loc)
 
 			loc.On("List", mock.Anything, spaceID).Return([]*locales.Locale{{ID: loc1, Name: "name1", SpaceID: spaceID}}, nil).Once()
 
@@ -74,7 +74,7 @@ func TestLocalesCache(t *testing.T) {
 		t.Run("After Create", func(t *testing.T) {
 			loc := &locmocks.Locales{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(loc)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(loc)
 
 			loc.On("List", mock.Anything, spaceID).Return([]*locales.Locale{{ID: loc1, Name: "name1", SpaceID: spaceID}}, nil).Once()
 
@@ -106,7 +106,7 @@ func TestLocalesCache(t *testing.T) {
 		t.Run("After TTL expired", func(t *testing.T) {
 			loc := &locmocks.Locales{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(loc)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(loc)
 
 			loc.On("List", mock.Anything, spaceID).Return([]*locales.Locale{{ID: loc1, Name: "name1", SpaceID: spaceID}}, nil).Once()
 
diff --git a/pkg/members/middleware/caching_middleware.go b/pkg/members/middleware/caching_middleware.go
index cffbc7c46a35da518eee412044cc18c1e2aa9970..0af3f76f9e5aa1eeeee01c36f2e7509e35e951c3 100644
--- a/pkg/members/middleware/caching_middleware.go
+++ b/pkg/members/middleware/caching_middleware.go
@@ -12,7 +12,7 @@ func makeKey(ss ...string) string {
 	return strings.Join(ss, "-")
 }
 
-func CachingMiddleware(cache *cache.Cache) Middleware {
+func CachingMiddleware(cache cache.Cache) Middleware {
 	return func(next service.Members) service.Members {
 		return &cachingMiddleware{
 			cache: cache,
@@ -22,7 +22,7 @@ func CachingMiddleware(cache *cache.Cache) Middleware {
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Members
 }
 
diff --git a/pkg/members/middleware/caching_middleware_test.go b/pkg/members/middleware/caching_middleware_test.go
index 4564dbe41a1fb943e86ad247a171497cffe01c18..eda7eb3a2a85123d36d20f09e9bd0c5188b609a9 100644
--- a/pkg/members/middleware/caching_middleware_test.go
+++ b/pkg/members/middleware/caching_middleware_test.go
@@ -26,7 +26,7 @@ func TestMembersCache(t *testing.T) {
 
 	t.Run("Get from cache", func(t *testing.T) {
 		mbrs := &mocksmembers.Members{}
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(mbrs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(mbrs)
 
 		mbrs.On("Get", mock.Anything, orgId, userId).Return(members.RoleOwner, nil).Once()
 
@@ -43,7 +43,7 @@ func TestMembersCache(t *testing.T) {
 	t.Run("Invalidate cache", func(t *testing.T) {
 		t.Run("After Set", func(t *testing.T) {
 			mbrs := &mocksmembers.Members{}
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(mbrs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(mbrs)
 
 			mbrs.On("Get", mock.Anything, orgId, userId).Return(members.RoleOwner, nil).Once()
 
@@ -69,7 +69,7 @@ func TestMembersCache(t *testing.T) {
 
 		t.Run("After Remove", func(t *testing.T) {
 			mbrs := &mocksmembers.Members{}
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(mbrs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(mbrs)
 
 			mbrs.On("Get", mock.Anything, orgId, userId).Return(members.RoleOwner, nil).Once()
 
@@ -96,7 +96,7 @@ func TestMembersCache(t *testing.T) {
 
 		t.Run("After RemoveAll", func(t *testing.T) {
 			mbrs := &mocksmembers.Members{}
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(mbrs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(mbrs)
 
 			mbrs.On("Get", mock.Anything, orgId, userId).Return(members.RoleOwner, nil).Once()
 			mbrs.On("ListMembers", mock.Anything, orgId).Return([]*members.Member{{OrgId: orgId, UserId: userId, Role: members.RoleOwner}}, nil)
@@ -124,7 +124,7 @@ func TestMembersCache(t *testing.T) {
 
 		t.Run("After TTL expired", func(t *testing.T) {
 			mbrs := &mocksmembers.Members{}
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(mbrs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(mbrs)
 
 			mbrs.On("Get", mock.Anything, orgId, userId).Return(members.RoleOwner, nil).Once()
 
diff --git a/pkg/organizations/middleware/caching_middleware.go b/pkg/organizations/middleware/caching_middleware.go
index 8350fb9275f51461165062d1f5d759bd5a17241a..18649df9511f12a658cbb3966d507a76108939d8 100644
--- a/pkg/organizations/middleware/caching_middleware.go
+++ b/pkg/organizations/middleware/caching_middleware.go
@@ -8,7 +8,7 @@ import (
 	service "git.perx.ru/perxis/perxis-go/pkg/organizations"
 )
 
-func CachingMiddleware(cache *cache.Cache) Middleware {
+func CachingMiddleware(cache cache.Cache) Middleware {
 	return func(next service.Organizations) service.Organizations {
 		return &cachingMiddleware{
 			cache: cache,
@@ -18,7 +18,7 @@ func CachingMiddleware(cache *cache.Cache) Middleware {
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Organizations
 }
 
diff --git a/pkg/organizations/middleware/caching_middleware_test.go b/pkg/organizations/middleware/caching_middleware_test.go
index f468baf0d6d3653e54f90856bf8731c2626ddc65..19cd14d5b2e808f3d4c22f77d8b115a27a9025cf 100644
--- a/pkg/organizations/middleware/caching_middleware_test.go
+++ b/pkg/organizations/middleware/caching_middleware_test.go
@@ -28,7 +28,7 @@ func TestOrganizationsCache(t *testing.T) {
 
 	t.Run("Get from cache", func(t *testing.T) {
 		orgs := &mocksorgs.Organizations{}
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(orgs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(orgs)
 
 		orgs.On("Get", mock.Anything, orgId).Return(&organizations.Organization{ID: orgId, Name: "Organization"}, nil).Once()
 
@@ -45,7 +45,7 @@ func TestOrganizationsCache(t *testing.T) {
 	t.Run("Invalidate cache", func(t *testing.T) {
 		t.Run("After Update", func(t *testing.T) {
 			orgs := &mocksorgs.Organizations{}
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(orgs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(orgs)
 
 			orgs.On("Get", mock.Anything, orgId).Return(&organizations.Organization{ID: orgId, Name: "Organization"}, nil).Once()
 
@@ -70,7 +70,7 @@ func TestOrganizationsCache(t *testing.T) {
 
 		t.Run("After Delete", func(t *testing.T) {
 			orgs := &mocksorgs.Organizations{}
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(orgs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(orgs)
 
 			orgs.On("Get", mock.Anything, orgId).Return(&organizations.Organization{ID: orgId, Name: "Organization"}, nil).Once()
 
@@ -94,7 +94,7 @@ func TestOrganizationsCache(t *testing.T) {
 
 		t.Run("After TTL expired", func(t *testing.T) {
 			orgs := &mocksorgs.Organizations{}
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(orgs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(orgs)
 
 			orgs.On("Get", mock.Anything, orgId).Return(&organizations.Organization{ID: orgId, Name: "Organization"}, nil).Once()
 
diff --git a/pkg/references/middleware/telemetry_middleware.go b/pkg/references/middleware/telemetry_middleware.go
new file mode 100644
index 0000000000000000000000000000000000000000..16fe5d30d2e5cc8dc82adfc7d7a3db87acf45636
--- /dev/null
+++ b/pkg/references/middleware/telemetry_middleware.go
@@ -0,0 +1,89 @@
+// Code generated by gowrap. DO NOT EDIT.
+// template: ../../../assets/templates/middleware/telemetry
+// 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/telemetry -o telemetry_middleware.go -l ""
+
+import (
+	"context"
+
+	"git.perx.ru/perxis/perxis-go/pkg/items"
+	"git.perx.ru/perxis/perxis-go/pkg/references"
+	"go.opentelemetry.io/otel"
+	"go.opentelemetry.io/otel/attribute"
+	"go.opentelemetry.io/otel/trace"
+)
+
+// telemetryMiddleware implements references.References interface instrumented with opentracing spans
+type telemetryMiddleware struct {
+	references.References
+	_instance      string
+	_spanDecorator func(span trace.Span, params, results map[string]interface{})
+}
+
+// TelemetryMiddleware returns telemetryMiddleware
+func TelemetryMiddleware(base references.References, instance string, spanDecorator ...func(span trace.Span, params, results map[string]interface{})) telemetryMiddleware {
+	d := telemetryMiddleware{
+		References: base,
+		_instance:  instance,
+	}
+
+	if len(spanDecorator) > 0 && spanDecorator[0] != nil {
+		d._spanDecorator = spanDecorator[0]
+	}
+
+	return d
+}
+
+// Get implements references.References
+func (_d telemetryMiddleware) Get(ctx context.Context, spaceId string, envId string, references []*references.Reference) (items []*items.Item, notfound []*references.Reference, err error) {
+	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "References.Get")
+	defer func() {
+		if _d._spanDecorator != nil {
+			_d._spanDecorator(_span, map[string]interface{}{
+				"ctx":        ctx,
+				"spaceId":    spaceId,
+				"envId":      envId,
+				"references": references}, map[string]interface{}{
+				"items":    items,
+				"notfound": notfound,
+				"err":      err})
+		} else if err != nil {
+			_span.RecordError(err)
+			_span.SetAttributes(attribute.String("event", "error"))
+			_span.SetAttributes(attribute.String("message", err.Error()))
+		}
+
+		_span.End()
+	}()
+	return _d.References.Get(ctx, spaceId, envId, references)
+}
+
+// Publish implements references.References
+func (_d telemetryMiddleware) 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) {
+	ctx, _span := otel.Tracer(_d._instance).Start(ctx, "References.Publish")
+	defer func() {
+		if _d._spanDecorator != nil {
+			_d._spanDecorator(_span, map[string]interface{}{
+				"ctx":        ctx,
+				"spaceId":    spaceId,
+				"envId":      envId,
+				"references": references,
+				"recursive":  recursive,
+				"force":      force}, map[string]interface{}{
+				"published":   published,
+				"notfound":    notfound,
+				"unpublished": unpublished,
+				"err":         err})
+		} else if err != nil {
+			_span.RecordError(err)
+			_span.SetAttributes(attribute.String("event", "error"))
+			_span.SetAttributes(attribute.String("message", err.Error()))
+		}
+
+		_span.End()
+	}()
+	return _d.References.Publish(ctx, spaceId, envId, references, recursive, force)
+}
diff --git a/pkg/roles/middleware/caching_middleware.go b/pkg/roles/middleware/caching_middleware.go
index 86725074b2d211f916c8ec126ad866ca89a0cc56..3f46087ec59e3ee71cd441b87e16a995d82eb7ea 100644
--- a/pkg/roles/middleware/caching_middleware.go
+++ b/pkg/roles/middleware/caching_middleware.go
@@ -12,7 +12,7 @@ func makeKey(ss ...string) string {
 	return strings.Join(ss, "-")
 }
 
-func CachingMiddleware(cache *cache.Cache) Middleware {
+func CachingMiddleware(cache cache.Cache) Middleware {
 	return func(next service.Roles) service.Roles {
 		return &cachingMiddleware{
 			cache: cache,
@@ -22,7 +22,7 @@ func CachingMiddleware(cache *cache.Cache) Middleware {
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Roles
 }
 
diff --git a/pkg/roles/middleware/caching_middleware_test.go b/pkg/roles/middleware/caching_middleware_test.go
index ff0165f8e9234d70d084a934d923b4e0b721ee0e..9d5d64f4231cf8bd86d533224fd50e762eebdcab 100644
--- a/pkg/roles/middleware/caching_middleware_test.go
+++ b/pkg/roles/middleware/caching_middleware_test.go
@@ -30,7 +30,7 @@ func TestRolesCache(t *testing.T) {
 	t.Run("Get from cache", func(t *testing.T) {
 		rl := &rsmocks.Roles{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(rl)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(rl)
 
 		rl.On("Get", mock.Anything, spaceID, roleID).Return(&roles.Role{ID: roleID, SpaceID: spaceID, Description: "Role"}, nil).Once()
 
@@ -47,7 +47,7 @@ func TestRolesCache(t *testing.T) {
 	t.Run("List from cache", func(t *testing.T) {
 		rl := &rsmocks.Roles{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(rl)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(rl)
 
 		rl.On("List", mock.Anything, spaceID).Return([]*roles.Role{{ID: roleID, SpaceID: spaceID, Description: "Role"}}, nil).Once()
 
@@ -65,7 +65,7 @@ func TestRolesCache(t *testing.T) {
 		t.Run("After Update", func(t *testing.T) {
 			rl := &rsmocks.Roles{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(rl)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(rl)
 
 			rl.On("Get", mock.Anything, spaceID, roleID).Return(&roles.Role{ID: roleID, SpaceID: spaceID, Description: "Role"}, nil).Once()
 			rl.On("List", mock.Anything, spaceID).Return([]*roles.Role{{ID: roleID, SpaceID: spaceID, Description: "Role"}}, nil).Once()
@@ -106,7 +106,7 @@ func TestRolesCache(t *testing.T) {
 		t.Run("After Delete", func(t *testing.T) {
 			rl := &rsmocks.Roles{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(rl)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(rl)
 
 			rl.On("Get", mock.Anything, spaceID, roleID).Return(&roles.Role{ID: roleID, SpaceID: spaceID, Description: "Role"}, nil).Once()
 			rl.On("List", mock.Anything, spaceID).Return([]*roles.Role{{ID: roleID, SpaceID: spaceID, Description: "Role"}}, nil).Once()
@@ -149,7 +149,7 @@ func TestRolesCache(t *testing.T) {
 		t.Run("After Create", func(t *testing.T) {
 			rl := &rsmocks.Roles{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(rl)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(rl)
 
 			rl.On("List", mock.Anything, spaceID).Return([]*roles.Role{{ID: roleID, SpaceID: spaceID, Description: "Role"}}, nil).Once()
 
@@ -177,7 +177,7 @@ func TestRolesCache(t *testing.T) {
 		t.Run("After TTL expired", func(t *testing.T) {
 			rl := &rsmocks.Roles{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(rl)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(rl)
 
 			rl.On("Get", mock.Anything, spaceID, roleID).Return(&roles.Role{ID: roleID, SpaceID: spaceID, Description: "Role"}, nil).Once()
 
diff --git a/pkg/spaces/middleware/caching_middleware.go b/pkg/spaces/middleware/caching_middleware.go
index 99c50a90e56fc8d25a34eca38962689f48f5abf3..f99e21a1f4a254ef6fb0890d09776b9b4738fd38 100644
--- a/pkg/spaces/middleware/caching_middleware.go
+++ b/pkg/spaces/middleware/caching_middleware.go
@@ -9,7 +9,7 @@ import (
 
 func orgKey(orgID string) string { return "org-" + orgID }
 
-func CachingMiddleware(cache *cache.Cache) Middleware {
+func CachingMiddleware(cache cache.Cache) Middleware {
 	return func(next service.Spaces) service.Spaces {
 		m := &cachingMiddleware{
 			cache: cache,
@@ -21,7 +21,7 @@ func CachingMiddleware(cache *cache.Cache) Middleware {
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Spaces
 }
 
diff --git a/pkg/spaces/middleware/caching_middleware_test.go b/pkg/spaces/middleware/caching_middleware_test.go
index a79a136f41690d0a6c6a16709bb9a591e5688735..e87ceb38c79c6b15d76ab6f6ff8f628a680a5aa6 100644
--- a/pkg/spaces/middleware/caching_middleware_test.go
+++ b/pkg/spaces/middleware/caching_middleware_test.go
@@ -31,7 +31,7 @@ func TestRolesCache(t *testing.T) {
 	t.Run("Get from cache", func(t *testing.T) {
 		sp := &spmocks.Spaces{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(sp)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(sp)
 
 		sp.On("Get", mock.Anything, spaceID).Return(&spaces.Space{ID: spaceID, OrgID: orgID, Name: "Space"}, nil).Once()
 
@@ -48,7 +48,7 @@ func TestRolesCache(t *testing.T) {
 	t.Run("List from cache", func(t *testing.T) {
 		sp := &spmocks.Spaces{}
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(sp)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(sp)
 
 		sp.On("List", mock.Anything, orgID).Return([]*spaces.Space{{ID: spaceID, OrgID: orgID, Name: "Space"}}, nil).Once()
 
@@ -66,7 +66,7 @@ func TestRolesCache(t *testing.T) {
 		t.Run("After Update", func(t *testing.T) {
 			sp := &spmocks.Spaces{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(sp)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(sp)
 
 			sp.On("Get", mock.Anything, spaceID).Return(&spaces.Space{ID: spaceID, OrgID: orgID, Name: "Space"}, nil).Once()
 			sp.On("List", mock.Anything, orgID).Return([]*spaces.Space{{ID: spaceID, OrgID: orgID, Name: "Space"}}, nil).Once()
@@ -107,7 +107,7 @@ func TestRolesCache(t *testing.T) {
 		t.Run("After UpdateConfig", func(t *testing.T) {
 			sp := &spmocks.Spaces{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(sp)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(sp)
 
 			sp.On("Get", mock.Anything, spaceID).Return(&spaces.Space{ID: spaceID, OrgID: orgID, Name: "Space"}, nil).Once()
 			sp.On("List", mock.Anything, orgID).Return([]*spaces.Space{{ID: spaceID, OrgID: orgID, Name: "Space"}}, nil).Once()
@@ -148,7 +148,7 @@ func TestRolesCache(t *testing.T) {
 		t.Run("After Delete", func(t *testing.T) {
 			sp := &spmocks.Spaces{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(sp)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(sp)
 
 			sp.On("Get", mock.Anything, spaceID).Return(&spaces.Space{ID: spaceID, OrgID: orgID, Name: "Space"}, nil).Once()
 			sp.On("List", mock.Anything, orgID).Return([]*spaces.Space{{ID: spaceID, OrgID: orgID, Name: "Space"}}, nil).Once()
@@ -189,7 +189,7 @@ func TestRolesCache(t *testing.T) {
 		t.Run("After Create", func(t *testing.T) {
 			sp := &spmocks.Spaces{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(sp)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(sp)
 
 			sp.On("List", mock.Anything, orgID).Return([]*spaces.Space{{ID: spaceID, OrgID: orgID, Name: "Space"}}, nil).Once()
 
@@ -217,7 +217,7 @@ func TestRolesCache(t *testing.T) {
 		t.Run("After TTL expired", func(t *testing.T) {
 			sp := &spmocks.Spaces{}
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(sp)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(sp)
 
 			sp.On("Get", mock.Anything, spaceID).Return(&spaces.Space{ID: spaceID, OrgID: orgID, Name: "Space"}, nil).Once()
 
diff --git a/pkg/spaces/service.go b/pkg/spaces/service.go
index e77cd813387acb1cf8c4dfc95bf795422ac8732c..c75dab18e60f2e37d6dae9007de7563d7ca8b751 100644
--- a/pkg/spaces/service.go
+++ b/pkg/spaces/service.go
@@ -57,7 +57,7 @@ func IsSpaceAvailable(ctx context.Context, spcs Spaces, spaceId string) error {
 		return errors.Wrap(err, "space not available")
 	}
 
-	if spc.State != StateReady {
+	if spc.StateInfo != nil && spc.StateInfo.State != StateReady {
 		return errors.New("space not available")
 	}
 
diff --git a/pkg/spaces/service_test.go b/pkg/spaces/service_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..30594bcea39f8ae5a7e3dc85a1bd2cdd35da2054
--- /dev/null
+++ b/pkg/spaces/service_test.go
@@ -0,0 +1,52 @@
+package spaces
+
+import (
+	"context"
+	"testing"
+)
+
+// dummySpaces используется для имитации поведения Spaces
+// Моки использовать не можем, так как получается циклический импорт
+type dummySpaces struct {
+	Spaces
+	space *Space
+}
+
+func (t *dummySpaces) Get(_ context.Context, _ string) (*Space, error) { return t.space, nil }
+
+func TestIsSpaceAvailable(t *testing.T) {
+	tests := []struct {
+		name    string
+		space   *Space
+		wantErr bool
+	}{
+		{
+			"Space has nil StateInfo: available",
+			&Space{ID: "space", OrgID: "org", Name: "test-space"},
+			false,
+		},
+		{
+			"Space state is StateReady: available",
+			&Space{ID: "space", OrgID: "org", Name: "test-space", StateInfo: &StateInfo{State: StateReady}},
+			false,
+		},
+		{
+			"Space state is StatePreparing: not available",
+			&Space{ID: "space", OrgID: "org", Name: "test-space", StateInfo: &StateInfo{State: StatePreparing}},
+			true,
+		},
+		{
+			"Space state is StateMigration: not available",
+			&Space{ID: "space", OrgID: "org", Name: "test-space", StateInfo: &StateInfo{State: StateMigration}},
+			true,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			spaces := &dummySpaces{space: tt.space}
+			if err := IsSpaceAvailable(context.Background(), spaces, "space"); (err != nil) != tt.wantErr {
+				t.Errorf("IsSpaceAvailable() error = %v, wantErr %v", err, tt.wantErr)
+			}
+		})
+	}
+}
diff --git a/pkg/spaces/space.go b/pkg/spaces/space.go
index b0aff6a44c45ae08532c9806d3785c6659214897..aa039c46f95e6c1ec3b0e49b65e766dc7451cd9f 100644
--- a/pkg/spaces/space.go
+++ b/pkg/spaces/space.go
@@ -1,5 +1,7 @@
 package spaces
 
+import "time"
+
 type State int
 
 const (
@@ -24,13 +26,18 @@ type Space struct {
 	OrgID       string `json:"org_id,omitempty" bson:"org_id"`
 	Name        string `json:"name,omitempty" bson:"name"`
 	Description string `json:"desc,omitempty" bson:"desc"`
-	State       State  `json:"state" bson:"state"`
-	StateInfo   string `json:"stateInfo,omitempty" bson:"stateInfo,omitempty"`
-
 	// TransferToOrg - идентификатор организации, в которую был запрошен перенос пространства
 	TransferToOrg string `json:"transfer_to_org" bson:"transfer_to_org"`
 
-	Config *Config `json:"config" bson:"config"`
+	Config    *Config    `json:"config" bson:"config"`
+	StateInfo *StateInfo `json:"state_info,omitempty" bson:"state_info,omitempty"`
+}
+
+type StateInfo struct {
+	State     State     `json:"state" bson:"state"`
+	Info      string    `json:"info" bson:"info"`
+	Time      time.Time `json:"time,omitempty" bson:"time,omitempty"`
+	DBVersion uint32    `json:"db_version" bson:"db_version"`
 }
 
 func (s Space) Clone() *Space {
@@ -48,10 +55,10 @@ func (s Space) Fetch(i interface{}) interface{} {
 		return s.Name
 	case "Description":
 		return s.Description
-	case "State":
-		return s.State
 	case "Config":
 		return s.Config
+	case "StateInfo":
+		return s.StateInfo
 	default:
 		panic("unknown parameter")
 	}
diff --git a/pkg/spaces/transport/grpc/protobuf_type_converters.microgen.go b/pkg/spaces/transport/grpc/protobuf_type_converters.microgen.go
index a701d272a48f089a133396c6033409c49e58cd9a..70081af310c72b62f2cc1a7ac0bc32fed007ac60 100644
--- a/pkg/spaces/transport/grpc/protobuf_type_converters.microgen.go
+++ b/pkg/spaces/transport/grpc/protobuf_type_converters.microgen.go
@@ -7,6 +7,7 @@ package transportgrpc
 import (
 	service "git.perx.ru/perxis/perxis-go/pkg/spaces"
 	pb "git.perx.ru/perxis/perxis-go/proto/spaces"
+	"google.golang.org/protobuf/types/known/timestamppb"
 )
 
 func PtrConfigToProto(config *service.Config) (*pb.Config, error) {
@@ -18,6 +19,18 @@ func PtrConfigToProto(config *service.Config) (*pb.Config, error) {
 	}, nil
 }
 
+func PtrStateInfoToProto(stateInfo *service.StateInfo) (*pb.StateInfo, error) {
+	if stateInfo == nil {
+		return nil, nil
+	}
+	return &pb.StateInfo{
+		State:     pb.State(stateInfo.State),
+		Info:      stateInfo.Info,
+		DbVersion: int32(stateInfo.DBVersion),
+		Time:      timestamppb.New(stateInfo.Time),
+	}, nil
+}
+
 func ProtoToPtrConfig(protoConfig *pb.Config) (*service.Config, error) {
 	if protoConfig == nil {
 		return nil, nil
@@ -27,17 +40,35 @@ func ProtoToPtrConfig(protoConfig *pb.Config) (*service.Config, error) {
 	}, nil
 }
 
+func ProtoToPtrStateInfo(protoStateInfo *pb.StateInfo) (*service.StateInfo, error) {
+	if protoStateInfo == nil {
+		return nil, nil
+	}
+	return &service.StateInfo{
+		State:     service.State(protoStateInfo.State),
+		Info:      protoStateInfo.Info,
+		Time:      protoStateInfo.Time.AsTime(),
+		DBVersion: uint32(protoStateInfo.DbVersion),
+	}, nil
+}
+
 func PtrSpaceToProto(space *service.Space) (*pb.Space, error) {
 	if space == nil {
 		return nil, nil
 	}
 	cfg, _ := PtrConfigToProto(space.Config)
+	var state pb.State
+	if space.StateInfo != nil {
+		state = pb.State(space.StateInfo.State)
+	}
+	stateInfo, _ := PtrStateInfoToProto(space.StateInfo)
 	return &pb.Space{
 		Id:            space.ID,
 		OrgId:         space.OrgID,
 		Name:          space.Name,
 		Description:   space.Description,
-		State:         pb.State(space.State),
+		State:         state,
+		StateInfo:     stateInfo,
 		Config:        cfg,
 		TransferToOrg: space.TransferToOrg,
 	}, nil
@@ -48,12 +79,13 @@ func ProtoToPtrSpace(protoSpace *pb.Space) (*service.Space, error) {
 		return nil, nil
 	}
 	cfg, _ := ProtoToPtrConfig(protoSpace.Config)
+	state, _ := ProtoToPtrStateInfo(protoSpace.StateInfo)
 	return &service.Space{
 		ID:            protoSpace.Id,
 		OrgID:         protoSpace.OrgId,
 		Name:          protoSpace.Name,
 		Description:   protoSpace.Description,
-		State:         service.State(protoSpace.State),
+		StateInfo:     state,
 		Config:        cfg,
 		TransferToOrg: protoSpace.TransferToOrg,
 	}, nil
diff --git a/pkg/users/middleware/caching_middleware.go b/pkg/users/middleware/caching_middleware.go
index c5674b82f0a1176304dc2efc0b60b7458839e347..8397bfd3a5c2a02c9ff52c42f9d1e23d431aed8e 100644
--- a/pkg/users/middleware/caching_middleware.go
+++ b/pkg/users/middleware/caching_middleware.go
@@ -8,7 +8,7 @@ import (
 	service "git.perx.ru/perxis/perxis-go/pkg/users"
 )
 
-func CachingMiddleware(cache *cache.Cache) Middleware {
+func CachingMiddleware(cache cache.Cache) Middleware {
 	return func(next service.Users) service.Users {
 		return &cachingMiddleware{
 			cache: cache,
@@ -18,7 +18,7 @@ func CachingMiddleware(cache *cache.Cache) Middleware {
 }
 
 type cachingMiddleware struct {
-	cache *cache.Cache
+	cache cache.Cache
 	next  service.Users
 }
 
diff --git a/pkg/users/middleware/caching_middleware_test.go b/pkg/users/middleware/caching_middleware_test.go
index fde23379bebd1957e7084fb7dc51ac45be467b59..edc9176baac6656a1d70995b0881055b83642293 100644
--- a/pkg/users/middleware/caching_middleware_test.go
+++ b/pkg/users/middleware/caching_middleware_test.go
@@ -29,7 +29,7 @@ func TestUsersCache(t *testing.T) {
 		usrs := &mocks.Users{}
 		ctx := context.Background()
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(usrs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(usrs)
 
 		usrs.On("Get", mock.Anything, userID).Return(&users.User{ID: userID, Name: "User", Identities: []string{identity}}, nil).Once()
 
@@ -51,7 +51,7 @@ func TestUsersCache(t *testing.T) {
 		usrs := &mocks.Users{}
 		ctx := context.Background()
 
-		svc := CachingMiddleware(cache.NewCache(size, ttl))(usrs)
+		svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(usrs)
 
 		usrs.On("GetByIdentity", mock.Anything, identity).Return(&users.User{ID: userID, Name: "User", Identities: []string{identity}}, nil).Once()
 
@@ -74,7 +74,7 @@ func TestUsersCache(t *testing.T) {
 			usrs := &mocks.Users{}
 			ctx := context.Background()
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(usrs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(usrs)
 
 			usrs.On("Get", mock.Anything, userID).Return(&users.User{ID: userID, Name: "User", Identities: []string{identity}}, nil).Once()
 			usrs.On("Update", mock.Anything, mock.Anything).Return(nil).Once()
@@ -107,7 +107,7 @@ func TestUsersCache(t *testing.T) {
 			usrs := &mocks.Users{}
 			ctx := context.Background()
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(usrs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(usrs)
 
 			usrs.On("Get", mock.Anything, userID).Return(&users.User{ID: userID, Name: "User", Identities: []string{identity}}, nil).Once()
 			usrs.On("Delete", mock.Anything, mock.Anything).Return(nil).Once()
@@ -140,7 +140,7 @@ func TestUsersCache(t *testing.T) {
 			usrs := &mocks.Users{}
 			ctx := context.Background()
 
-			svc := CachingMiddleware(cache.NewCache(size, ttl))(usrs)
+			svc := CachingMiddleware(cache.NewMemoryCache(size, ttl))(usrs)
 
 			usrs.On("Get", mock.Anything, userID).Return(&users.User{ID: userID, Name: "User", Identities: []string{identity}}, nil).Once()
 
diff --git a/proto/spaces/spaces.pb.go b/proto/spaces/spaces.pb.go
index d5c57b12ed99209be6e6bfeb15e5627c7eb58b40..aedef2c39158d62f2fb08844c27c9c7f0fac6cb1 100644
--- a/proto/spaces/spaces.pb.go
+++ b/proto/spaces/spaces.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
 // 	protoc-gen-go v1.31.0
-// 	protoc        v4.24.3
+// 	protoc        v4.25.1
 // source: spaces/spaces.proto
 
 package spaces
@@ -10,6 +10,7 @@ import (
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	emptypb "google.golang.org/protobuf/types/known/emptypb"
+	timestamppb "google.golang.org/protobuf/types/known/timestamppb"
 	reflect "reflect"
 	sync "sync"
 )
@@ -90,13 +91,15 @@ type Space struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Id            string  `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
-	OrgId         string  `protobuf:"bytes,2,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"`
-	Name          string  `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
-	Description   string  `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
-	State         State   `protobuf:"varint,5,opt,name=state,proto3,enum=content.spaces.State" json:"state,omitempty"`
-	TransferToOrg string  `protobuf:"bytes,6,opt,name=transfer_to_org,json=transferToOrg,proto3" json:"transfer_to_org,omitempty"` // идентификатор организации, в которую запрошен перенос пространства
-	Config        *Config `protobuf:"bytes,10,opt,name=config,proto3" json:"config,omitempty"`
+	Id          string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
+	OrgId       string `protobuf:"bytes,2,opt,name=org_id,json=orgId,proto3" json:"org_id,omitempty"`
+	Name        string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
+	Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
+	// Deprecated
+	State         State      `protobuf:"varint,5,opt,name=state,proto3,enum=content.spaces.State" json:"state,omitempty"`
+	TransferToOrg string     `protobuf:"bytes,6,opt,name=transfer_to_org,json=transferToOrg,proto3" json:"transfer_to_org,omitempty"` // идентификатор организации, в которую запрошен перенос пространства
+	Config        *Config    `protobuf:"bytes,10,opt,name=config,proto3" json:"config,omitempty"`
+	StateInfo     *StateInfo `protobuf:"bytes,11,opt,name=state_info,json=stateInfo,proto3" json:"state_info,omitempty"`
 }
 
 func (x *Space) Reset() {
@@ -180,18 +183,97 @@ func (x *Space) GetConfig() *Config {
 	return nil
 }
 
+func (x *Space) GetStateInfo() *StateInfo {
+	if x != nil {
+		return x.StateInfo
+	}
+	return nil
+}
+
+type StateInfo struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	State     State                  `protobuf:"varint,1,opt,name=state,proto3,enum=content.spaces.State" json:"state,omitempty"`
+	Info      string                 `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"`
+	DbVersion int32                  `protobuf:"varint,3,opt,name=db_version,json=dbVersion,proto3" json:"db_version,omitempty"`
+	Time      *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=time,proto3" json:"time,omitempty"`
+}
+
+func (x *StateInfo) Reset() {
+	*x = StateInfo{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_spaces_spaces_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *StateInfo) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*StateInfo) ProtoMessage() {}
+
+func (x *StateInfo) ProtoReflect() protoreflect.Message {
+	mi := &file_spaces_spaces_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use StateInfo.ProtoReflect.Descriptor instead.
+func (*StateInfo) Descriptor() ([]byte, []int) {
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *StateInfo) GetState() State {
+	if x != nil {
+		return x.State
+	}
+	return State_UNKNOWN
+}
+
+func (x *StateInfo) GetInfo() string {
+	if x != nil {
+		return x.Info
+	}
+	return ""
+}
+
+func (x *StateInfo) GetDbVersion() int32 {
+	if x != nil {
+		return x.DbVersion
+	}
+	return 0
+}
+
+func (x *StateInfo) GetTime() *timestamppb.Timestamp {
+	if x != nil {
+		return x.Time
+	}
+	return nil
+}
+
 type Config struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
+	// Deprecated
 	Features []string `protobuf:"bytes,1,rep,name=features,proto3" json:"features,omitempty"`
 }
 
 func (x *Config) Reset() {
 	*x = Config{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[1]
+		mi := &file_spaces_spaces_proto_msgTypes[2]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -204,7 +286,7 @@ func (x *Config) String() string {
 func (*Config) ProtoMessage() {}
 
 func (x *Config) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[1]
+	mi := &file_spaces_spaces_proto_msgTypes[2]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -217,7 +299,7 @@ func (x *Config) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use Config.ProtoReflect.Descriptor instead.
 func (*Config) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{1}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{2}
 }
 
 func (x *Config) GetFeatures() []string {
@@ -238,7 +320,7 @@ type CreateRequest struct {
 func (x *CreateRequest) Reset() {
 	*x = CreateRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[2]
+		mi := &file_spaces_spaces_proto_msgTypes[3]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -251,7 +333,7 @@ func (x *CreateRequest) String() string {
 func (*CreateRequest) ProtoMessage() {}
 
 func (x *CreateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[2]
+	mi := &file_spaces_spaces_proto_msgTypes[3]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -264,7 +346,7 @@ func (x *CreateRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateRequest.ProtoReflect.Descriptor instead.
 func (*CreateRequest) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{2}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{3}
 }
 
 func (x *CreateRequest) GetSpace() *Space {
@@ -285,7 +367,7 @@ type CreateResponse struct {
 func (x *CreateResponse) Reset() {
 	*x = CreateResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[3]
+		mi := &file_spaces_spaces_proto_msgTypes[4]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -298,7 +380,7 @@ func (x *CreateResponse) String() string {
 func (*CreateResponse) ProtoMessage() {}
 
 func (x *CreateResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[3]
+	mi := &file_spaces_spaces_proto_msgTypes[4]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -311,7 +393,7 @@ func (x *CreateResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use CreateResponse.ProtoReflect.Descriptor instead.
 func (*CreateResponse) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{3}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{4}
 }
 
 func (x *CreateResponse) GetCreated() *Space {
@@ -332,7 +414,7 @@ type GetRequest struct {
 func (x *GetRequest) Reset() {
 	*x = GetRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[4]
+		mi := &file_spaces_spaces_proto_msgTypes[5]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -345,7 +427,7 @@ func (x *GetRequest) String() string {
 func (*GetRequest) ProtoMessage() {}
 
 func (x *GetRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[4]
+	mi := &file_spaces_spaces_proto_msgTypes[5]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -358,7 +440,7 @@ func (x *GetRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetRequest.ProtoReflect.Descriptor instead.
 func (*GetRequest) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{4}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{5}
 }
 
 func (x *GetRequest) GetSpaceId() string {
@@ -379,7 +461,7 @@ type GetResponse struct {
 func (x *GetResponse) Reset() {
 	*x = GetResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[5]
+		mi := &file_spaces_spaces_proto_msgTypes[6]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -392,7 +474,7 @@ func (x *GetResponse) String() string {
 func (*GetResponse) ProtoMessage() {}
 
 func (x *GetResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[5]
+	mi := &file_spaces_spaces_proto_msgTypes[6]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -405,7 +487,7 @@ func (x *GetResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use GetResponse.ProtoReflect.Descriptor instead.
 func (*GetResponse) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{5}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{6}
 }
 
 func (x *GetResponse) GetSpace() *Space {
@@ -426,7 +508,7 @@ type ListRequest struct {
 func (x *ListRequest) Reset() {
 	*x = ListRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[6]
+		mi := &file_spaces_spaces_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -439,7 +521,7 @@ func (x *ListRequest) String() string {
 func (*ListRequest) ProtoMessage() {}
 
 func (x *ListRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[6]
+	mi := &file_spaces_spaces_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -452,7 +534,7 @@ func (x *ListRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListRequest.ProtoReflect.Descriptor instead.
 func (*ListRequest) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{6}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{7}
 }
 
 func (x *ListRequest) GetOrgId() string {
@@ -473,7 +555,7 @@ type ListResponse struct {
 func (x *ListResponse) Reset() {
 	*x = ListResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[7]
+		mi := &file_spaces_spaces_proto_msgTypes[8]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -486,7 +568,7 @@ func (x *ListResponse) String() string {
 func (*ListResponse) ProtoMessage() {}
 
 func (x *ListResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[7]
+	mi := &file_spaces_spaces_proto_msgTypes[8]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -499,7 +581,7 @@ func (x *ListResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListResponse.ProtoReflect.Descriptor instead.
 func (*ListResponse) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{7}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{8}
 }
 
 func (x *ListResponse) GetSpaces() []*Space {
@@ -520,7 +602,7 @@ type UpdateRequest struct {
 func (x *UpdateRequest) Reset() {
 	*x = UpdateRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[8]
+		mi := &file_spaces_spaces_proto_msgTypes[9]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -533,7 +615,7 @@ func (x *UpdateRequest) String() string {
 func (*UpdateRequest) ProtoMessage() {}
 
 func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[8]
+	mi := &file_spaces_spaces_proto_msgTypes[9]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -546,7 +628,7 @@ func (x *UpdateRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateRequest.ProtoReflect.Descriptor instead.
 func (*UpdateRequest) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{8}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{9}
 }
 
 func (x *UpdateRequest) GetSpace() *Space {
@@ -568,7 +650,7 @@ type UpdateConfigRequest struct {
 func (x *UpdateConfigRequest) Reset() {
 	*x = UpdateConfigRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[9]
+		mi := &file_spaces_spaces_proto_msgTypes[10]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -581,7 +663,7 @@ func (x *UpdateConfigRequest) String() string {
 func (*UpdateConfigRequest) ProtoMessage() {}
 
 func (x *UpdateConfigRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[9]
+	mi := &file_spaces_spaces_proto_msgTypes[10]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -594,7 +676,7 @@ func (x *UpdateConfigRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use UpdateConfigRequest.ProtoReflect.Descriptor instead.
 func (*UpdateConfigRequest) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{9}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{10}
 }
 
 func (x *UpdateConfigRequest) GetSpaceId() string {
@@ -622,7 +704,7 @@ type DeleteRequest struct {
 func (x *DeleteRequest) Reset() {
 	*x = DeleteRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[10]
+		mi := &file_spaces_spaces_proto_msgTypes[11]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -635,7 +717,7 @@ func (x *DeleteRequest) String() string {
 func (*DeleteRequest) ProtoMessage() {}
 
 func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[10]
+	mi := &file_spaces_spaces_proto_msgTypes[11]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -648,7 +730,7 @@ func (x *DeleteRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use DeleteRequest.ProtoReflect.Descriptor instead.
 func (*DeleteRequest) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{10}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{11}
 }
 
 func (x *DeleteRequest) GetSpaceId() string {
@@ -670,7 +752,7 @@ type TransferRequest struct {
 func (x *TransferRequest) Reset() {
 	*x = TransferRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[11]
+		mi := &file_spaces_spaces_proto_msgTypes[12]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -683,7 +765,7 @@ func (x *TransferRequest) String() string {
 func (*TransferRequest) ProtoMessage() {}
 
 func (x *TransferRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[11]
+	mi := &file_spaces_spaces_proto_msgTypes[12]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -696,7 +778,7 @@ func (x *TransferRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use TransferRequest.ProtoReflect.Descriptor instead.
 func (*TransferRequest) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{11}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{12}
 }
 
 func (x *TransferRequest) GetSpaceId() string {
@@ -724,7 +806,7 @@ type AbortTransferRequest struct {
 func (x *AbortTransferRequest) Reset() {
 	*x = AbortTransferRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[12]
+		mi := &file_spaces_spaces_proto_msgTypes[13]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -737,7 +819,7 @@ func (x *AbortTransferRequest) String() string {
 func (*AbortTransferRequest) ProtoMessage() {}
 
 func (x *AbortTransferRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[12]
+	mi := &file_spaces_spaces_proto_msgTypes[13]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -750,7 +832,7 @@ func (x *AbortTransferRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use AbortTransferRequest.ProtoReflect.Descriptor instead.
 func (*AbortTransferRequest) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{12}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{13}
 }
 
 func (x *AbortTransferRequest) GetSpaceId() string {
@@ -771,7 +853,7 @@ type ListTransfersRequest struct {
 func (x *ListTransfersRequest) Reset() {
 	*x = ListTransfersRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[13]
+		mi := &file_spaces_spaces_proto_msgTypes[14]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -784,7 +866,7 @@ func (x *ListTransfersRequest) String() string {
 func (*ListTransfersRequest) ProtoMessage() {}
 
 func (x *ListTransfersRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[13]
+	mi := &file_spaces_spaces_proto_msgTypes[14]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -797,7 +879,7 @@ func (x *ListTransfersRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListTransfersRequest.ProtoReflect.Descriptor instead.
 func (*ListTransfersRequest) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{13}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{14}
 }
 
 func (x *ListTransfersRequest) GetOrgId() string {
@@ -818,7 +900,7 @@ type ListTransfersResponse struct {
 func (x *ListTransfersResponse) Reset() {
 	*x = ListTransfersResponse{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[14]
+		mi := &file_spaces_spaces_proto_msgTypes[15]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -831,7 +913,7 @@ func (x *ListTransfersResponse) String() string {
 func (*ListTransfersResponse) ProtoMessage() {}
 
 func (x *ListTransfersResponse) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[14]
+	mi := &file_spaces_spaces_proto_msgTypes[15]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -844,7 +926,7 @@ func (x *ListTransfersResponse) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use ListTransfersResponse.ProtoReflect.Descriptor instead.
 func (*ListTransfersResponse) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{14}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{15}
 }
 
 func (x *ListTransfersResponse) GetSpaces() []*Space {
@@ -866,7 +948,7 @@ type MoveRequest struct {
 func (x *MoveRequest) Reset() {
 	*x = MoveRequest{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_spaces_spaces_proto_msgTypes[15]
+		mi := &file_spaces_spaces_proto_msgTypes[16]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -879,7 +961,7 @@ func (x *MoveRequest) String() string {
 func (*MoveRequest) ProtoMessage() {}
 
 func (x *MoveRequest) ProtoReflect() protoreflect.Message {
-	mi := &file_spaces_spaces_proto_msgTypes[15]
+	mi := &file_spaces_spaces_proto_msgTypes[16]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -892,7 +974,7 @@ func (x *MoveRequest) ProtoReflect() protoreflect.Message {
 
 // Deprecated: Use MoveRequest.ProtoReflect.Descriptor instead.
 func (*MoveRequest) Descriptor() ([]byte, []int) {
-	return file_spaces_spaces_proto_rawDescGZIP(), []int{15}
+	return file_spaces_spaces_proto_rawDescGZIP(), []int{16}
 }
 
 func (x *MoveRequest) GetSpaceId() string {
@@ -916,135 +998,150 @@ var file_spaces_spaces_proto_rawDesc = []byte{
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73,
 	0x70, 0x61, 0x63, 0x65, 0x73, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72,
 	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x22, 0xe9, 0x01, 0x0a, 0x05, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02,
-	0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x06,
-	0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72,
-	0x67, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72,
-	0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65,
-	0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61,
-	0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52,
-	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66,
-	0x65, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72, 0x67, 0x12, 0x2e,
-	0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,
+	0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f,
+	0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x22, 0xa3, 0x02, 0x0a, 0x05, 0x53, 0x70, 0x61, 0x63, 0x65, 0x12, 0x0e, 0x0a,
+	0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a,
+	0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f,
+	0x72, 0x67, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63,
+	0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64,
+	0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74,
+	0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65,
+	0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73,
+	0x66, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72, 0x67, 0x12,
+	0x2e, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
+	0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12,
+	0x38, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x0b, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09,
+	0x73, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x9b, 0x01, 0x0a, 0x09, 0x53, 0x74,
+	0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+	0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73,
+	0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x62, 0x5f, 0x76,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x62,
+	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
+	0x70, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x24, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69,
+	0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20,
+	0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x3c, 0x0a,
+	0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b,
+	0x0a, 0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e,
+	0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53,
+	0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x41, 0x0a, 0x0e, 0x43,
+	0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a,
+	0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15,
 	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e,
-	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x24,
-	0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74,
-	0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74,
-	0x75, 0x72, 0x65, 0x73, 0x22, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65,
-	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01,
-	0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73,
-	0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x22, 0x41, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18,
+	0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x27,
+	0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x3a, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65,
+	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18,
 	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x07, 0x63, 0x72,
-	0x65, 0x61, 0x74, 0x65, 0x64, 0x22, 0x27, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18,
-	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x3a,
-	0x0a, 0x0b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a,
-	0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70,
-	0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x24, 0x0a, 0x0b, 0x4c, 0x69,
-	0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67,
-	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64,
-	0x22, 0x3d, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
-	0x12, 0x2d, 0x0a, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
-	0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22,
-	0x3c, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x2b, 0x0a, 0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
-	0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x60, 0x0a,
-	0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64,
-	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12,
-	0x2e, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
-	0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
-	0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22,
-	0x2a, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
-	0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x54, 0x0a, 0x0f, 0x54,
-	0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19,
-	0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x72, 0x61,
-	0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x02, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72,
-	0x67, 0x22, 0x31, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66,
-	0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x05, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x22, 0x24, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, 0x3d, 0x0a, 0x0c, 0x4c, 0x69, 0x73,
+	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65,
+	0x52, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x3c, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x05, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52,
+	0x05, 0x73, 0x70, 0x61, 0x63, 0x65, 0x22, 0x60, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65,
+	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a,
+	0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66,
+	0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+	0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2a, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65,
+	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61,
 	0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e,
-	0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06,
-	0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72,
-	0x67, 0x49, 0x64, 0x22, 0x46, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73,
-	0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x06,
-	0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70,
-	0x61, 0x63, 0x65, 0x52, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x0b, 0x4d,
-	0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18,
-	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x2a, 0x70, 0x0a, 0x05,
-	0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e,
-	0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4e, 0x45, 0x57, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52,
-	0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52,
-	0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e,
-	0x41, 0x4e, 0x43, 0x45, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x49, 0x47, 0x52, 0x41, 0x54,
-	0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e,
-	0x47, 0x10, 0x06, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x07, 0x32, 0xe6,
-	0x05, 0x0a, 0x06, 0x53, 0x70, 0x61, 0x63, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x06, 0x43, 0x72, 0x65,
-	0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
-	0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61,
-	0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
-	0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74,
-	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
-	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b,
-	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e,
-	0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6f,
-	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73,
-	0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x55,
-	0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
-	0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
-	0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d,
-	0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23,
+	0x63, 0x65, 0x49, 0x64, 0x22, 0x54, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x74,
+	0x6f, 0x5f, 0x6f, 0x72, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x72, 0x61,
+	0x6e, 0x73, 0x66, 0x65, 0x72, 0x54, 0x6f, 0x4f, 0x72, 0x67, 0x22, 0x31, 0x0a, 0x14, 0x41, 0x62,
+	0x6f, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65,
+	0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x22, 0x2d, 0x0a,
+	0x14, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65,
+	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x72, 0x67, 0x49, 0x64, 0x22, 0x46, 0x0a, 0x15,
+	0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73,
+	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x53, 0x70, 0x61, 0x63, 0x65, 0x52, 0x06, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x0b, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75,
+	0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x64, 0x12, 0x15,
+	0x0a, 0x06, 0x6f, 0x72, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
+	0x6f, 0x72, 0x67, 0x49, 0x64, 0x2a, 0x70, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0b,
+	0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4e,
+	0x45, 0x57, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x02, 0x12,
+	0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0f,
+	0x0a, 0x0b, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x04, 0x12,
+	0x0d, 0x0a, 0x09, 0x4d, 0x49, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x0c,
+	0x0a, 0x08, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x09, 0x0a, 0x05,
+	0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x07, 0x32, 0xe6, 0x05, 0x0a, 0x06, 0x53, 0x70, 0x61, 0x63,
+	0x65, 0x73, 0x12, 0x49, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x63,
+	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72,
+	0x65, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x63, 0x6f,
+	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x43, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x40, 0x0a,
+	0x03, 0x47, 0x65, 0x74, 0x12, 0x1a, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+	0x1a, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x73, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12,
+	0x43, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71,
+	0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73,
+	0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+	0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1d,
 	0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e,
-	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75,
-	0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x41, 0x0a,
-	0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
-	0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52,
+	0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74,
+	0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x23, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
+	0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43,
+	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
+	0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65,
+	0x12, 0x1d, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65,
+	0x73, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
+	0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x08, 0x54, 0x72, 0x61,
+	0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e,
+	0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52,
 	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
-	0x12, 0x45, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x63,
-	0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x54, 0x72,
-	0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x0d, 0x41, 0x62, 0x6f, 0x72, 0x74,
-	0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
-	0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x54,
-	0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
-	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
-	0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74,
-	0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
-	0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54,
-	0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
-	0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73,
-	0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65,
-	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x04, 0x4d, 0x6f, 0x76, 0x65,
-	0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65,
-	0x73, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e,
-	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
-	0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x2e, 0x70,
-	0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65,
-	0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x70,
-	0x61, 0x63, 0x65, 0x73, 0x3b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
+	0x12, 0x4f, 0x0a, 0x0d, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65,
+	0x72, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63,
+	0x65, 0x73, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72,
+	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22,
+	0x00, 0x12, 0x5e, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65,
+	0x72, 0x73, 0x12, 0x24, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61,
+	0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72,
+	0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
+	0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72,
+	0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
+	0x00, 0x12, 0x3d, 0x0a, 0x04, 0x4d, 0x6f, 0x76, 0x65, 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6e, 0x74,
+	0x65, 0x6e, 0x74, 0x2e, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x52,
+	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
+	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00,
+	0x42, 0x32, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x2e, 0x70, 0x65, 0x72, 0x78, 0x2e, 0x72, 0x75, 0x2f,
+	0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2f, 0x70, 0x65, 0x72, 0x78, 0x69, 0x73, 0x2d, 0x67, 0x6f,
+	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x3b, 0x73, 0x70,
+	0x61, 0x63, 0x65, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1060,62 +1157,67 @@ func file_spaces_spaces_proto_rawDescGZIP() []byte {
 }
 
 var file_spaces_spaces_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
-var file_spaces_spaces_proto_msgTypes = make([]protoimpl.MessageInfo, 16)
+var file_spaces_spaces_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
 var file_spaces_spaces_proto_goTypes = []interface{}{
 	(State)(0),                    // 0: content.spaces.State
 	(*Space)(nil),                 // 1: content.spaces.Space
-	(*Config)(nil),                // 2: content.spaces.Config
-	(*CreateRequest)(nil),         // 3: content.spaces.CreateRequest
-	(*CreateResponse)(nil),        // 4: content.spaces.CreateResponse
-	(*GetRequest)(nil),            // 5: content.spaces.GetRequest
-	(*GetResponse)(nil),           // 6: content.spaces.GetResponse
-	(*ListRequest)(nil),           // 7: content.spaces.ListRequest
-	(*ListResponse)(nil),          // 8: content.spaces.ListResponse
-	(*UpdateRequest)(nil),         // 9: content.spaces.UpdateRequest
-	(*UpdateConfigRequest)(nil),   // 10: content.spaces.UpdateConfigRequest
-	(*DeleteRequest)(nil),         // 11: content.spaces.DeleteRequest
-	(*TransferRequest)(nil),       // 12: content.spaces.TransferRequest
-	(*AbortTransferRequest)(nil),  // 13: content.spaces.AbortTransferRequest
-	(*ListTransfersRequest)(nil),  // 14: content.spaces.ListTransfersRequest
-	(*ListTransfersResponse)(nil), // 15: content.spaces.ListTransfersResponse
-	(*MoveRequest)(nil),           // 16: content.spaces.MoveRequest
-	(*emptypb.Empty)(nil),         // 17: google.protobuf.Empty
+	(*StateInfo)(nil),             // 2: content.spaces.StateInfo
+	(*Config)(nil),                // 3: content.spaces.Config
+	(*CreateRequest)(nil),         // 4: content.spaces.CreateRequest
+	(*CreateResponse)(nil),        // 5: content.spaces.CreateResponse
+	(*GetRequest)(nil),            // 6: content.spaces.GetRequest
+	(*GetResponse)(nil),           // 7: content.spaces.GetResponse
+	(*ListRequest)(nil),           // 8: content.spaces.ListRequest
+	(*ListResponse)(nil),          // 9: content.spaces.ListResponse
+	(*UpdateRequest)(nil),         // 10: content.spaces.UpdateRequest
+	(*UpdateConfigRequest)(nil),   // 11: content.spaces.UpdateConfigRequest
+	(*DeleteRequest)(nil),         // 12: content.spaces.DeleteRequest
+	(*TransferRequest)(nil),       // 13: content.spaces.TransferRequest
+	(*AbortTransferRequest)(nil),  // 14: content.spaces.AbortTransferRequest
+	(*ListTransfersRequest)(nil),  // 15: content.spaces.ListTransfersRequest
+	(*ListTransfersResponse)(nil), // 16: content.spaces.ListTransfersResponse
+	(*MoveRequest)(nil),           // 17: content.spaces.MoveRequest
+	(*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp
+	(*emptypb.Empty)(nil),         // 19: google.protobuf.Empty
 }
 var file_spaces_spaces_proto_depIdxs = []int32{
 	0,  // 0: content.spaces.Space.state:type_name -> content.spaces.State
-	2,  // 1: content.spaces.Space.config:type_name -> content.spaces.Config
-	1,  // 2: content.spaces.CreateRequest.space:type_name -> content.spaces.Space
-	1,  // 3: content.spaces.CreateResponse.created:type_name -> content.spaces.Space
-	1,  // 4: content.spaces.GetResponse.space:type_name -> content.spaces.Space
-	1,  // 5: content.spaces.ListResponse.spaces:type_name -> content.spaces.Space
-	1,  // 6: content.spaces.UpdateRequest.space:type_name -> content.spaces.Space
-	2,  // 7: content.spaces.UpdateConfigRequest.config:type_name -> content.spaces.Config
-	1,  // 8: content.spaces.ListTransfersResponse.spaces:type_name -> content.spaces.Space
-	3,  // 9: content.spaces.Spaces.Create:input_type -> content.spaces.CreateRequest
-	5,  // 10: content.spaces.Spaces.Get:input_type -> content.spaces.GetRequest
-	7,  // 11: content.spaces.Spaces.List:input_type -> content.spaces.ListRequest
-	9,  // 12: content.spaces.Spaces.Update:input_type -> content.spaces.UpdateRequest
-	10, // 13: content.spaces.Spaces.UpdateConfig:input_type -> content.spaces.UpdateConfigRequest
-	11, // 14: content.spaces.Spaces.Delete:input_type -> content.spaces.DeleteRequest
-	12, // 15: content.spaces.Spaces.Transfer:input_type -> content.spaces.TransferRequest
-	13, // 16: content.spaces.Spaces.AbortTransfer:input_type -> content.spaces.AbortTransferRequest
-	14, // 17: content.spaces.Spaces.ListTransfers:input_type -> content.spaces.ListTransfersRequest
-	16, // 18: content.spaces.Spaces.Move:input_type -> content.spaces.MoveRequest
-	4,  // 19: content.spaces.Spaces.Create:output_type -> content.spaces.CreateResponse
-	6,  // 20: content.spaces.Spaces.Get:output_type -> content.spaces.GetResponse
-	8,  // 21: content.spaces.Spaces.List:output_type -> content.spaces.ListResponse
-	17, // 22: content.spaces.Spaces.Update:output_type -> google.protobuf.Empty
-	17, // 23: content.spaces.Spaces.UpdateConfig:output_type -> google.protobuf.Empty
-	17, // 24: content.spaces.Spaces.Delete:output_type -> google.protobuf.Empty
-	17, // 25: content.spaces.Spaces.Transfer:output_type -> google.protobuf.Empty
-	17, // 26: content.spaces.Spaces.AbortTransfer:output_type -> google.protobuf.Empty
-	15, // 27: content.spaces.Spaces.ListTransfers:output_type -> content.spaces.ListTransfersResponse
-	17, // 28: content.spaces.Spaces.Move:output_type -> google.protobuf.Empty
-	19, // [19:29] is the sub-list for method output_type
-	9,  // [9:19] is the sub-list for method input_type
-	9,  // [9:9] is the sub-list for extension type_name
-	9,  // [9:9] is the sub-list for extension extendee
-	0,  // [0:9] is the sub-list for field type_name
+	3,  // 1: content.spaces.Space.config:type_name -> content.spaces.Config
+	2,  // 2: content.spaces.Space.state_info:type_name -> content.spaces.StateInfo
+	0,  // 3: content.spaces.StateInfo.state:type_name -> content.spaces.State
+	18, // 4: content.spaces.StateInfo.time:type_name -> google.protobuf.Timestamp
+	1,  // 5: content.spaces.CreateRequest.space:type_name -> content.spaces.Space
+	1,  // 6: content.spaces.CreateResponse.created:type_name -> content.spaces.Space
+	1,  // 7: content.spaces.GetResponse.space:type_name -> content.spaces.Space
+	1,  // 8: content.spaces.ListResponse.spaces:type_name -> content.spaces.Space
+	1,  // 9: content.spaces.UpdateRequest.space:type_name -> content.spaces.Space
+	3,  // 10: content.spaces.UpdateConfigRequest.config:type_name -> content.spaces.Config
+	1,  // 11: content.spaces.ListTransfersResponse.spaces:type_name -> content.spaces.Space
+	4,  // 12: content.spaces.Spaces.Create:input_type -> content.spaces.CreateRequest
+	6,  // 13: content.spaces.Spaces.Get:input_type -> content.spaces.GetRequest
+	8,  // 14: content.spaces.Spaces.List:input_type -> content.spaces.ListRequest
+	10, // 15: content.spaces.Spaces.Update:input_type -> content.spaces.UpdateRequest
+	11, // 16: content.spaces.Spaces.UpdateConfig:input_type -> content.spaces.UpdateConfigRequest
+	12, // 17: content.spaces.Spaces.Delete:input_type -> content.spaces.DeleteRequest
+	13, // 18: content.spaces.Spaces.Transfer:input_type -> content.spaces.TransferRequest
+	14, // 19: content.spaces.Spaces.AbortTransfer:input_type -> content.spaces.AbortTransferRequest
+	15, // 20: content.spaces.Spaces.ListTransfers:input_type -> content.spaces.ListTransfersRequest
+	17, // 21: content.spaces.Spaces.Move:input_type -> content.spaces.MoveRequest
+	5,  // 22: content.spaces.Spaces.Create:output_type -> content.spaces.CreateResponse
+	7,  // 23: content.spaces.Spaces.Get:output_type -> content.spaces.GetResponse
+	9,  // 24: content.spaces.Spaces.List:output_type -> content.spaces.ListResponse
+	19, // 25: content.spaces.Spaces.Update:output_type -> google.protobuf.Empty
+	19, // 26: content.spaces.Spaces.UpdateConfig:output_type -> google.protobuf.Empty
+	19, // 27: content.spaces.Spaces.Delete:output_type -> google.protobuf.Empty
+	19, // 28: content.spaces.Spaces.Transfer:output_type -> google.protobuf.Empty
+	19, // 29: content.spaces.Spaces.AbortTransfer:output_type -> google.protobuf.Empty
+	16, // 30: content.spaces.Spaces.ListTransfers:output_type -> content.spaces.ListTransfersResponse
+	19, // 31: content.spaces.Spaces.Move:output_type -> google.protobuf.Empty
+	22, // [22:32] is the sub-list for method output_type
+	12, // [12:22] is the sub-list for method input_type
+	12, // [12:12] is the sub-list for extension type_name
+	12, // [12:12] is the sub-list for extension extendee
+	0,  // [0:12] is the sub-list for field type_name
 }
 
 func init() { file_spaces_spaces_proto_init() }
@@ -1137,7 +1239,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*Config); i {
+			switch v := v.(*StateInfo); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1149,7 +1251,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CreateRequest); i {
+			switch v := v.(*Config); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1161,7 +1263,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*CreateResponse); i {
+			switch v := v.(*CreateRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1173,7 +1275,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetRequest); i {
+			switch v := v.(*CreateResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1185,7 +1287,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*GetResponse); i {
+			switch v := v.(*GetRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1197,7 +1299,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListRequest); i {
+			switch v := v.(*GetResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1209,7 +1311,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListResponse); i {
+			switch v := v.(*ListRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1221,7 +1323,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateRequest); i {
+			switch v := v.(*ListResponse); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1233,7 +1335,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*UpdateConfigRequest); i {
+			switch v := v.(*UpdateRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1245,7 +1347,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*DeleteRequest); i {
+			switch v := v.(*UpdateConfigRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1257,7 +1359,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*TransferRequest); i {
+			switch v := v.(*DeleteRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1269,7 +1371,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*AbortTransferRequest); i {
+			switch v := v.(*TransferRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1281,7 +1383,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListTransfersRequest); i {
+			switch v := v.(*AbortTransferRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1293,7 +1395,7 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*ListTransfersResponse); i {
+			switch v := v.(*ListTransfersRequest); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1305,6 +1407,18 @@ func file_spaces_spaces_proto_init() {
 			}
 		}
 		file_spaces_spaces_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ListTransfersResponse); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_spaces_spaces_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*MoveRequest); i {
 			case 0:
 				return &v.state
@@ -1323,7 +1437,7 @@ func file_spaces_spaces_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_spaces_spaces_proto_rawDesc,
 			NumEnums:      1,
-			NumMessages:   16,
+			NumMessages:   17,
 			NumExtensions: 0,
 			NumServices:   1,
 		},
diff --git a/proto/spaces/spaces_grpc.pb.go b/proto/spaces/spaces_grpc.pb.go
index 18aa43b307fd40ad17480082c2cc104dea50ed9c..f080fe31ba0c4d97ff3fa5fecbf608eaf2ccdd6d 100644
--- a/proto/spaces/spaces_grpc.pb.go
+++ b/proto/spaces/spaces_grpc.pb.go
@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
 // - protoc-gen-go-grpc v1.3.0
-// - protoc             v4.24.3
+// - protoc             v4.25.1
 // source: spaces/spaces.proto
 
 package spaces