diff --git a/gen/cache/client.go b/gen/cache/client.go
index ec6218557a4ad5ef34f1a76161238b1105677603..d4e423c35d255e27d26fd4fa72c04f858fa50515 100644
--- a/gen/cache/client.go
+++ b/gen/cache/client.go
@@ -16,12 +16,14 @@ import (
 // Client is the "cache" service client.
 type Client struct {
 	GetEndpoint goa.Endpoint
+	SetEndpoint goa.Endpoint
 }
 
 // NewClient initializes a "cache" service client given the endpoints.
-func NewClient(get goa.Endpoint) *Client {
+func NewClient(get, set goa.Endpoint) *Client {
 	return &Client{
 		GetEndpoint: get,
+		SetEndpoint: set,
 	}
 }
 
@@ -34,3 +36,9 @@ func (c *Client) Get(ctx context.Context, p *CacheGetRequest) (res []byte, err e
 	}
 	return ires.([]byte), nil
 }
+
+// Set calls the "Set" endpoint of the "cache" service.
+func (c *Client) Set(ctx context.Context, p *CacheSetRequest) (err error) {
+	_, err = c.SetEndpoint(ctx, p)
+	return
+}
diff --git a/gen/cache/endpoints.go b/gen/cache/endpoints.go
index 4dfb7f41650a6bc82b6317a2aea05fba34d967b2..c3d44cb790448204680ba0f060701a6bfffede4c 100644
--- a/gen/cache/endpoints.go
+++ b/gen/cache/endpoints.go
@@ -16,18 +16,21 @@ import (
 // Endpoints wraps the "cache" service endpoints.
 type Endpoints struct {
 	Get goa.Endpoint
+	Set goa.Endpoint
 }
 
 // NewEndpoints wraps the methods of the "cache" service with endpoints.
 func NewEndpoints(s Service) *Endpoints {
 	return &Endpoints{
 		Get: NewGetEndpoint(s),
+		Set: NewSetEndpoint(s),
 	}
 }
 
 // Use applies the given middleware to all the "cache" service endpoints.
 func (e *Endpoints) Use(m func(goa.Endpoint) goa.Endpoint) {
 	e.Get = m(e.Get)
+	e.Set = m(e.Set)
 }
 
 // NewGetEndpoint returns an endpoint function that calls the method "Get" of
@@ -38,3 +41,12 @@ func NewGetEndpoint(s Service) goa.Endpoint {
 		return s.Get(ctx, p)
 	}
 }
+
+// NewSetEndpoint returns an endpoint function that calls the method "Set" of
+// service "cache".
+func NewSetEndpoint(s Service) goa.Endpoint {
+	return func(ctx context.Context, req interface{}) (interface{}, error) {
+		p := req.(*CacheSetRequest)
+		return nil, s.Set(ctx, p)
+	}
+}
diff --git a/gen/cache/service.go b/gen/cache/service.go
index 089bd94d2623488893a2a0a9a7c2763957b84a0b..e672fc7bc4db00887c9adb5e586ef105348ac07c 100644
--- a/gen/cache/service.go
+++ b/gen/cache/service.go
@@ -16,6 +16,9 @@ type Service interface {
 	// Get value from the cache. The result is a sequence of bytes which the client
 	// must decode.
 	Get(context.Context, *CacheGetRequest) (res []byte, err error)
+	// Set value in the cache. The HTTP request body is stored as value and the key
+	// is assembled from HTTP request headers.
+	Set(context.Context, *CacheSetRequest) (err error)
 }
 
 // ServiceName is the name of the service as defined in the design. This is the
@@ -26,7 +29,7 @@ const ServiceName = "cache"
 // MethodNames lists the service method names as defined in the design. These
 // are the same values that are set in the endpoint request contexts under the
 // MethodKey key.
-var MethodNames = [1]string{"Get"}
+var MethodNames = [2]string{"Get", "Set"}
 
 // CacheGetRequest is the payload type of the cache service Get method.
 type CacheGetRequest struct {
@@ -34,3 +37,11 @@ type CacheGetRequest struct {
 	Namespace string
 	Scope     string
 }
+
+// CacheSetRequest is the payload type of the cache service Set method.
+type CacheSetRequest struct {
+	Data      []byte
+	Key       string
+	Namespace string
+	Scope     string
+}
diff --git a/gen/http/cache/client/cli.go b/gen/http/cache/client/cli.go
index 102424b710f74365e6125b64830218de30980a04..831930f08a936972035d19196555ce387b10215d 100644
--- a/gen/http/cache/client/cli.go
+++ b/gen/http/cache/client/cli.go
@@ -32,3 +32,32 @@ func BuildGetPayload(cacheGetKey string, cacheGetNamespace string, cacheGetScope
 
 	return v, nil
 }
+
+// BuildSetPayload builds the payload for the cache Set endpoint from CLI flags.
+func BuildSetPayload(cacheSetBody string, cacheSetKey string, cacheSetNamespace string, cacheSetScope string) (*cache.CacheSetRequest, error) {
+	var body []byte
+	{
+		body = []byte(cacheSetBody)
+	}
+	var key string
+	{
+		key = cacheSetKey
+	}
+	var namespace string
+	{
+		namespace = cacheSetNamespace
+	}
+	var scope string
+	{
+		scope = cacheSetScope
+	}
+	v := body
+	res := &cache.CacheSetRequest{
+		Data: v,
+	}
+	res.Key = key
+	res.Namespace = namespace
+	res.Scope = scope
+
+	return res, nil
+}
diff --git a/gen/http/cache/client/client.go b/gen/http/cache/client/client.go
index a909cf4774e21ad7b49f24881b0b1e2d4321f37b..f813e4412a506fd9efed09bd9b534d490a5b8576 100644
--- a/gen/http/cache/client/client.go
+++ b/gen/http/cache/client/client.go
@@ -20,6 +20,9 @@ type Client struct {
 	// Get Doer is the HTTP client used to make requests to the Get endpoint.
 	GetDoer goahttp.Doer
 
+	// Set Doer is the HTTP client used to make requests to the Set endpoint.
+	SetDoer goahttp.Doer
+
 	// RestoreResponseBody controls whether the response bodies are reset after
 	// decoding so they can be read again.
 	RestoreResponseBody bool
@@ -41,6 +44,7 @@ func NewClient(
 ) *Client {
 	return &Client{
 		GetDoer:             doer,
+		SetDoer:             doer,
 		RestoreResponseBody: restoreBody,
 		scheme:              scheme,
 		host:                host,
@@ -72,3 +76,27 @@ func (c *Client) Get() goa.Endpoint {
 		return decodeResponse(resp)
 	}
 }
+
+// Set returns an endpoint that makes HTTP requests to the cache service Set
+// server.
+func (c *Client) Set() goa.Endpoint {
+	var (
+		encodeRequest  = EncodeSetRequest(c.encoder)
+		decodeResponse = DecodeSetResponse(c.decoder, c.RestoreResponseBody)
+	)
+	return func(ctx context.Context, v interface{}) (interface{}, error) {
+		req, err := c.BuildSetRequest(ctx, v)
+		if err != nil {
+			return nil, err
+		}
+		err = encodeRequest(req, v)
+		if err != nil {
+			return nil, err
+		}
+		resp, err := c.SetDoer.Do(req)
+		if err != nil {
+			return nil, goahttp.ErrRequestError("cache", "Set", err)
+		}
+		return decodeResponse(resp)
+	}
+}
diff --git a/gen/http/cache/client/encode_decode.go b/gen/http/cache/client/encode_decode.go
index dd4550d9b4b97277842a3b9a182c872796d6ed01..248a4a06bd22d3ee6ae4e4201621f2c30febcfca 100644
--- a/gen/http/cache/client/encode_decode.go
+++ b/gen/http/cache/client/encode_decode.go
@@ -91,3 +91,73 @@ func DecodeGetResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody
 		}
 	}
 }
+
+// BuildSetRequest instantiates a HTTP request object with method and path set
+// to call the "cache" service "Set" endpoint
+func (c *Client) BuildSetRequest(ctx context.Context, v interface{}) (*http.Request, error) {
+	u := &url.URL{Scheme: c.scheme, Host: c.host, Path: SetCachePath()}
+	req, err := http.NewRequest("POST", u.String(), nil)
+	if err != nil {
+		return nil, goahttp.ErrInvalidURL("cache", "Set", u.String(), err)
+	}
+	if ctx != nil {
+		req = req.WithContext(ctx)
+	}
+
+	return req, nil
+}
+
+// EncodeSetRequest returns an encoder for requests sent to the cache Set
+// server.
+func EncodeSetRequest(encoder func(*http.Request) goahttp.Encoder) func(*http.Request, interface{}) error {
+	return func(req *http.Request, v interface{}) error {
+		p, ok := v.(*cache.CacheSetRequest)
+		if !ok {
+			return goahttp.ErrInvalidType("cache", "Set", "*cache.CacheSetRequest", v)
+		}
+		{
+			head := p.Key
+			req.Header.Set("x-cache-key", head)
+		}
+		{
+			head := p.Namespace
+			req.Header.Set("x-cache-namespace", head)
+		}
+		{
+			head := p.Scope
+			req.Header.Set("x-cache-scope", head)
+		}
+		body := p.Data
+		if err := encoder(req).Encode(&body); err != nil {
+			return goahttp.ErrEncodingError("cache", "Set", err)
+		}
+		return nil
+	}
+}
+
+// DecodeSetResponse returns a decoder for responses returned by the cache Set
+// endpoint. restoreBody controls whether the response body should be restored
+// after having been read.
+func DecodeSetResponse(decoder func(*http.Response) goahttp.Decoder, restoreBody bool) func(*http.Response) (interface{}, error) {
+	return func(resp *http.Response) (interface{}, error) {
+		if restoreBody {
+			b, err := ioutil.ReadAll(resp.Body)
+			if err != nil {
+				return nil, err
+			}
+			resp.Body = ioutil.NopCloser(bytes.NewBuffer(b))
+			defer func() {
+				resp.Body = ioutil.NopCloser(bytes.NewBuffer(b))
+			}()
+		} else {
+			defer resp.Body.Close()
+		}
+		switch resp.StatusCode {
+		case http.StatusCreated:
+			return nil, nil
+		default:
+			body, _ := ioutil.ReadAll(resp.Body)
+			return nil, goahttp.ErrInvalidResponse("cache", "Set", resp.StatusCode, string(body))
+		}
+	}
+}
diff --git a/gen/http/cache/client/paths.go b/gen/http/cache/client/paths.go
index d4e85ee6fa5552f06361e65105ef5bea446e5753..90588e4bae0c42a9b125238089f4519ae1b13a5f 100644
--- a/gen/http/cache/client/paths.go
+++ b/gen/http/cache/client/paths.go
@@ -11,3 +11,8 @@ package client
 func GetCachePath() string {
 	return "/v1/cache"
 }
+
+// SetCachePath returns the URL path to the cache service Set HTTP endpoint.
+func SetCachePath() string {
+	return "/v1/cache"
+}
diff --git a/gen/http/cache/server/encode_decode.go b/gen/http/cache/server/encode_decode.go
index 6e8629d2e7494d5e077d13533ad55a83d966660f..1e2d096e4798d5c66e211c11778fcac21f8bb6ab 100644
--- a/gen/http/cache/server/encode_decode.go
+++ b/gen/http/cache/server/encode_decode.go
@@ -9,6 +9,7 @@ package server
 
 import (
 	"context"
+	"io"
 	"net/http"
 
 	goahttp "goa.design/goa/v3/http"
@@ -57,3 +58,54 @@ func DecodeGetRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Dec
 		return payload, nil
 	}
 }
+
+// EncodeSetResponse returns an encoder for responses returned by the cache Set
+// endpoint.
+func EncodeSetResponse(encoder func(context.Context, http.ResponseWriter) goahttp.Encoder) func(context.Context, http.ResponseWriter, interface{}) error {
+	return func(ctx context.Context, w http.ResponseWriter, v interface{}) error {
+		w.WriteHeader(http.StatusCreated)
+		return nil
+	}
+}
+
+// DecodeSetRequest returns a decoder for requests sent to the cache Set
+// endpoint.
+func DecodeSetRequest(mux goahttp.Muxer, decoder func(*http.Request) goahttp.Decoder) func(*http.Request) (interface{}, error) {
+	return func(r *http.Request) (interface{}, error) {
+		var (
+			body []byte
+			err  error
+		)
+		err = decoder(r).Decode(&body)
+		if err != nil {
+			if err == io.EOF {
+				return nil, goa.MissingPayloadError()
+			}
+			return nil, goa.DecodePayloadError(err.Error())
+		}
+
+		var (
+			key       string
+			namespace string
+			scope     string
+		)
+		key = r.Header.Get("x-cache-key")
+		if key == "" {
+			err = goa.MergeErrors(err, goa.MissingFieldError("x-cache-key", "header"))
+		}
+		namespace = r.Header.Get("x-cache-namespace")
+		if namespace == "" {
+			err = goa.MergeErrors(err, goa.MissingFieldError("x-cache-namespace", "header"))
+		}
+		scope = r.Header.Get("x-cache-scope")
+		if scope == "" {
+			err = goa.MergeErrors(err, goa.MissingFieldError("x-cache-scope", "header"))
+		}
+		if err != nil {
+			return nil, err
+		}
+		payload := NewSetCacheSetRequest(body, key, namespace, scope)
+
+		return payload, nil
+	}
+}
diff --git a/gen/http/cache/server/paths.go b/gen/http/cache/server/paths.go
index 656155750cbb8e8932366cf94bde88f3d5e97d6f..31e15617209f7986fb54b5cf611ad1ed57c8d457 100644
--- a/gen/http/cache/server/paths.go
+++ b/gen/http/cache/server/paths.go
@@ -11,3 +11,8 @@ package server
 func GetCachePath() string {
 	return "/v1/cache"
 }
+
+// SetCachePath returns the URL path to the cache service Set HTTP endpoint.
+func SetCachePath() string {
+	return "/v1/cache"
+}
diff --git a/gen/http/cache/server/server.go b/gen/http/cache/server/server.go
index 63e8e6f0139c65f080770c08f884366d149a90b3..dd65640c9087f7a8309277bd5933ee1e75f42f4f 100644
--- a/gen/http/cache/server/server.go
+++ b/gen/http/cache/server/server.go
@@ -20,6 +20,7 @@ import (
 type Server struct {
 	Mounts []*MountPoint
 	Get    http.Handler
+	Set    http.Handler
 }
 
 // ErrorNamer is an interface implemented by generated error structs that
@@ -56,8 +57,10 @@ func New(
 	return &Server{
 		Mounts: []*MountPoint{
 			{"Get", "GET", "/v1/cache"},
+			{"Set", "POST", "/v1/cache"},
 		},
 		Get: NewGetHandler(e.Get, mux, decoder, encoder, errhandler, formatter),
+		Set: NewSetHandler(e.Set, mux, decoder, encoder, errhandler, formatter),
 	}
 }
 
@@ -67,11 +70,13 @@ func (s *Server) Service() string { return "cache" }
 // Use wraps the server handlers with the given middleware.
 func (s *Server) Use(m func(http.Handler) http.Handler) {
 	s.Get = m(s.Get)
+	s.Set = m(s.Set)
 }
 
 // Mount configures the mux to serve the cache endpoints.
 func Mount(mux goahttp.Muxer, h *Server) {
 	MountGetHandler(mux, h.Get)
+	MountSetHandler(mux, h.Set)
 }
 
 // Mount configures the mux to serve the cache endpoints.
@@ -129,3 +134,54 @@ func NewGetHandler(
 		}
 	})
 }
+
+// MountSetHandler configures the mux to serve the "cache" service "Set"
+// endpoint.
+func MountSetHandler(mux goahttp.Muxer, h http.Handler) {
+	f, ok := h.(http.HandlerFunc)
+	if !ok {
+		f = func(w http.ResponseWriter, r *http.Request) {
+			h.ServeHTTP(w, r)
+		}
+	}
+	mux.Handle("POST", "/v1/cache", f)
+}
+
+// NewSetHandler creates a HTTP handler which loads the HTTP request and calls
+// the "cache" service "Set" endpoint.
+func NewSetHandler(
+	endpoint goa.Endpoint,
+	mux goahttp.Muxer,
+	decoder func(*http.Request) goahttp.Decoder,
+	encoder func(context.Context, http.ResponseWriter) goahttp.Encoder,
+	errhandler func(context.Context, http.ResponseWriter, error),
+	formatter func(err error) goahttp.Statuser,
+) http.Handler {
+	var (
+		decodeRequest  = DecodeSetRequest(mux, decoder)
+		encodeResponse = EncodeSetResponse(encoder)
+		encodeError    = goahttp.ErrorEncoder(encoder, formatter)
+	)
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		ctx := context.WithValue(r.Context(), goahttp.AcceptTypeKey, r.Header.Get("Accept"))
+		ctx = context.WithValue(ctx, goa.MethodKey, "Set")
+		ctx = context.WithValue(ctx, goa.ServiceKey, "cache")
+		payload, err := decodeRequest(r)
+		if err != nil {
+			if err := encodeError(ctx, w, err); err != nil {
+				errhandler(ctx, w, err)
+			}
+			return
+		}
+		res, err := endpoint(ctx, payload)
+		if err != nil {
+			if err := encodeError(ctx, w, err); err != nil {
+				errhandler(ctx, w, err)
+			}
+			return
+		}
+		if err := encodeResponse(ctx, w, res); err != nil {
+			errhandler(ctx, w, err)
+		}
+	})
+}
diff --git a/gen/http/cache/server/types.go b/gen/http/cache/server/types.go
index 4585d80628f45910bd241d0caacce974fb9766fd..67496e706748df08a202a8fd492e6db1e86bc912 100644
--- a/gen/http/cache/server/types.go
+++ b/gen/http/cache/server/types.go
@@ -20,3 +20,16 @@ func NewGetCacheGetRequest(key string, namespace string, scope string) *cache.Ca
 
 	return v
 }
+
+// NewSetCacheSetRequest builds a cache service Set endpoint payload.
+func NewSetCacheSetRequest(body []byte, key string, namespace string, scope string) *cache.CacheSetRequest {
+	v := body
+	res := &cache.CacheSetRequest{
+		Data: v,
+	}
+	res.Key = key
+	res.Namespace = namespace
+	res.Scope = scope
+
+	return res
+}
diff --git a/gen/http/cli/cache/cli.go b/gen/http/cli/cache/cli.go
index 2bfecddeacdbcbb0bd07454c0527db1669dc680a..94eec334197b11d9bd39f266cf35c9493ab497d3 100644
--- a/gen/http/cli/cache/cli.go
+++ b/gen/http/cli/cache/cli.go
@@ -25,14 +25,14 @@ import (
 //
 func UsageCommands() string {
 	return `health (liveness|readiness)
-cache get
+cache (get|set)
 `
 }
 
 // UsageExamples produces an example of a valid invocation of the CLI tool.
 func UsageExamples() string {
 	return os.Args[0] + ` health liveness` + "\n" +
-		os.Args[0] + ` cache get --key "Officiis fuga architecto cum." --namespace "Sint adipisci." --scope "Debitis id reprehenderit incidunt necessitatibus assumenda."` + "\n" +
+		os.Args[0] + ` cache get --key "Suscipit sed consequatur rerum occaecati in veritatis." --namespace "Repudiandae eos consequatur sint dolorum occaecati." --scope "Voluptatum modi tenetur tempore quia est ratione."` + "\n" +
 		""
 }
 
@@ -58,6 +58,12 @@ func ParseEndpoint(
 		cacheGetKeyFlag       = cacheGetFlags.String("key", "REQUIRED", "")
 		cacheGetNamespaceFlag = cacheGetFlags.String("namespace", "REQUIRED", "")
 		cacheGetScopeFlag     = cacheGetFlags.String("scope", "REQUIRED", "")
+
+		cacheSetFlags         = flag.NewFlagSet("set", flag.ExitOnError)
+		cacheSetBodyFlag      = cacheSetFlags.String("body", "REQUIRED", "")
+		cacheSetKeyFlag       = cacheSetFlags.String("key", "REQUIRED", "")
+		cacheSetNamespaceFlag = cacheSetFlags.String("namespace", "REQUIRED", "")
+		cacheSetScopeFlag     = cacheSetFlags.String("scope", "REQUIRED", "")
 	)
 	healthFlags.Usage = healthUsage
 	healthLivenessFlags.Usage = healthLivenessUsage
@@ -65,6 +71,7 @@ func ParseEndpoint(
 
 	cacheFlags.Usage = cacheUsage
 	cacheGetFlags.Usage = cacheGetUsage
+	cacheSetFlags.Usage = cacheSetUsage
 
 	if err := flag.CommandLine.Parse(os.Args[1:]); err != nil {
 		return nil, nil, err
@@ -115,6 +122,9 @@ func ParseEndpoint(
 			case "get":
 				epf = cacheGetFlags
 
+			case "set":
+				epf = cacheSetFlags
+
 			}
 
 		}
@@ -153,6 +163,9 @@ func ParseEndpoint(
 			case "get":
 				endpoint = c.Get()
 				data, err = cachec.BuildGetPayload(*cacheGetKeyFlag, *cacheGetNamespaceFlag, *cacheGetScopeFlag)
+			case "set":
+				endpoint = c.Set()
+				data, err = cachec.BuildSetPayload(*cacheSetBodyFlag, *cacheSetKeyFlag, *cacheSetNamespaceFlag, *cacheSetScopeFlag)
 			}
 		}
 	}
@@ -205,6 +218,7 @@ Usage:
 
 COMMAND:
     get: Get value from the cache. The result is a sequence of bytes which the client must decode.
+    set: Set value in the cache. The HTTP request body is stored as value and the key is assembled from HTTP request headers.
 
 Additional help:
     %[1]s cache COMMAND --help
@@ -219,6 +233,20 @@ Get value from the cache. The result is a sequence of bytes which the client mus
     -scope STRING: 
 
 Example:
-    %[1]s cache get --key "Officiis fuga architecto cum." --namespace "Sint adipisci." --scope "Debitis id reprehenderit incidunt necessitatibus assumenda."
+    %[1]s cache get --key "Suscipit sed consequatur rerum occaecati in veritatis." --namespace "Repudiandae eos consequatur sint dolorum occaecati." --scope "Voluptatum modi tenetur tempore quia est ratione."
+`, os.Args[0])
+}
+
+func cacheSetUsage() {
+	fmt.Fprintf(os.Stderr, `%[1]s [flags] cache set -body STRING -key STRING -namespace STRING -scope STRING
+
+Set value in the cache. The HTTP request body is stored as value and the key is assembled from HTTP request headers.
+    -body STRING: 
+    -key STRING: 
+    -namespace STRING: 
+    -scope STRING: 
+
+Example:
+    %[1]s cache set --body "UXVhc2kgdXQu" --key "Quasi perspiciatis." --namespace "Accusantium animi non alias." --scope "Esse inventore ullam placeat aut."
 `, os.Args[0])
 }
diff --git a/gen/http/openapi.json b/gen/http/openapi.json
index b77a470aa4c05f88e90ef116416482555f7a5c90..fd67bfa4d24ca8297c3f597e1dcb0b116b3885a9 100644
--- a/gen/http/openapi.json
+++ b/gen/http/openapi.json
@@ -1 +1 @@
-{"swagger":"2.0","info":{"title":"Cache Service","description":"The cache service exposes interface for working with Redis.","version":""},"host":"localhost:8083","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/v1/cache":{"get":{"tags":["cache"],"summary":"Get cache","description":"Get value from the cache. The result is a sequence of bytes which the client must decode.","operationId":"cache#Get","parameters":[{"name":"x-cache-key","in":"header","description":"Cache entry key","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache entry namespace","required":true,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache entry scope","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"byte"}}},"schemes":["http"]}}}}
\ No newline at end of file
+{"swagger":"2.0","info":{"title":"Cache Service","description":"The cache service exposes interface for working with Redis.","version":""},"host":"localhost:8083","consumes":["application/json","application/xml","application/gob"],"produces":["application/json","application/xml","application/gob"],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}},"schemes":["http"]}},"/v1/cache":{"get":{"tags":["cache"],"summary":"Get cache","description":"Get value from the cache. The result is a sequence of bytes which the client must decode.","operationId":"cache#Get","parameters":[{"name":"x-cache-key","in":"header","description":"Cache entry key","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache entry namespace","required":true,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache entry scope","required":true,"type":"string"}],"responses":{"200":{"description":"OK response.","schema":{"type":"string","format":"byte"}}},"schemes":["http"]},"post":{"tags":["cache"],"summary":"Set cache","description":"Set value in the cache. The HTTP request body is stored as value and the key is assembled from HTTP request headers.","operationId":"cache#Set","parameters":[{"name":"x-cache-key","in":"header","description":"Cache entry key","required":true,"type":"string"},{"name":"x-cache-namespace","in":"header","description":"Cache entry namespace","required":true,"type":"string"},{"name":"x-cache-scope","in":"header","description":"Cache entry scope","required":true,"type":"string"},{"name":"bytes","in":"body","required":true,"schema":{"type":"string","format":"byte"}}],"responses":{"201":{"description":"Created response."}},"schemes":["http"]}}}}
\ No newline at end of file
diff --git a/gen/http/openapi.yaml b/gen/http/openapi.yaml
index 5043265f7fa571f22f8a8f96b303296e161d0cdd..690205fe03cff658813d035e2c458636847aec88 100644
--- a/gen/http/openapi.yaml
+++ b/gen/http/openapi.yaml
@@ -67,3 +67,37 @@ paths:
             format: byte
       schemes:
       - http
+    post:
+      tags:
+      - cache
+      summary: Set cache
+      description: Set value in the cache. The HTTP request body is stored as value
+        and the key is assembled from HTTP request headers.
+      operationId: cache#Set
+      parameters:
+      - name: x-cache-key
+        in: header
+        description: Cache entry key
+        required: true
+        type: string
+      - name: x-cache-namespace
+        in: header
+        description: Cache entry namespace
+        required: true
+        type: string
+      - name: x-cache-scope
+        in: header
+        description: Cache entry scope
+        required: true
+        type: string
+      - name: bytes
+        in: body
+        required: true
+        schema:
+          type: string
+          format: byte
+      responses:
+        "201":
+          description: Created response.
+      schemes:
+      - http
diff --git a/gen/http/openapi3.json b/gen/http/openapi3.json
index be3f9a4d1f1018196f1bb8c204da2f91a9434473..764795157afc8335019e957c26d8d35dbc4f7602 100644
--- a/gen/http/openapi3.json
+++ b/gen/http/openapi3.json
@@ -1 +1 @@
-{"openapi":"3.0.3","info":{"title":"Cache Service","description":"The cache service exposes interface for working with Redis.","version":"1.0"},"servers":[{"url":"http://localhost:8083","description":"Cache Server"}],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}}}},"/v1/cache":{"get":{"tags":["cache"],"summary":"Get cache","description":"Get value from the cache. The result is a sequence of bytes which the client must decode.","operationId":"cache#Get","parameters":[{"name":"x-cache-key","in":"header","description":"Cache entry key","allowEmptyValue":true,"required":true,"schema":{"type":"string","description":"Cache entry key","example":"did:web:example.com"},"example":"did:web:example.com"},{"name":"x-cache-namespace","in":"header","description":"Cache entry namespace","allowEmptyValue":true,"required":true,"schema":{"type":"string","description":"Cache entry namespace","example":"Login"},"example":"Login"},{"name":"x-cache-scope","in":"header","description":"Cache entry scope","allowEmptyValue":true,"required":true,"schema":{"type":"string","description":"Cache entry scope","example":"administration"},"example":"administration"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"string","example":"UmVwdWRpYW5kYWUgZW9zIGNvbnNlcXVhdHVyIHNpbnQgZG9sb3J1bSBvY2NhZWNhdGku","format":"binary"},"example":"Vm9sdXB0YXR1bSBtb2RpIHRlbmV0dXIgdGVtcG9yZSBxdWlhIGVzdCByYXRpb25lLg=="}}}}}}},"components":{},"tags":[{"name":"health","description":"Health service provides health check endpoints."},{"name":"cache","description":"Cache service allows storing and retrieving data from distributed cache."}]}
\ No newline at end of file
+{"openapi":"3.0.3","info":{"title":"Cache Service","description":"The cache service exposes interface for working with Redis.","version":"1.0"},"servers":[{"url":"http://localhost:8083","description":"Cache Server"}],"paths":{"/liveness":{"get":{"tags":["health"],"summary":"Liveness health","operationId":"health#Liveness","responses":{"200":{"description":"OK response."}}}},"/readiness":{"get":{"tags":["health"],"summary":"Readiness health","operationId":"health#Readiness","responses":{"200":{"description":"OK response."}}}},"/v1/cache":{"get":{"tags":["cache"],"summary":"Get cache","description":"Get value from the cache. The result is a sequence of bytes which the client must decode.","operationId":"cache#Get","parameters":[{"name":"x-cache-key","in":"header","description":"Cache entry key","allowEmptyValue":true,"required":true,"schema":{"type":"string","description":"Cache entry key","example":"did:web:example.com"},"example":"did:web:example.com"},{"name":"x-cache-namespace","in":"header","description":"Cache entry namespace","allowEmptyValue":true,"required":true,"schema":{"type":"string","description":"Cache entry namespace","example":"Login"},"example":"Login"},{"name":"x-cache-scope","in":"header","description":"Cache entry scope","allowEmptyValue":true,"required":true,"schema":{"type":"string","description":"Cache entry scope","example":"administration"},"example":"administration"}],"responses":{"200":{"description":"OK response.","content":{"application/json":{"schema":{"type":"string","example":"UXVpIGl1c3RvIGVuaW0gZXN0IGRvbG9yZXMgZG9sb3JlbSBldC4=","format":"binary"},"example":"UXVpc3F1YW0gYWIgZG9sb3JlcyBkaXN0aW5jdGlvIHF1aXMu"}}}}},"post":{"tags":["cache"],"summary":"Set cache","description":"Set value in the cache. The HTTP request body is stored as value and the key is assembled from HTTP request headers.","operationId":"cache#Set","parameters":[{"name":"x-cache-key","in":"header","description":"Cache entry key","allowEmptyValue":true,"required":true,"schema":{"type":"string","description":"Cache entry key","example":"did:web:example.com"},"example":"did:web:example.com"},{"name":"x-cache-namespace","in":"header","description":"Cache entry namespace","allowEmptyValue":true,"required":true,"schema":{"type":"string","description":"Cache entry namespace","example":"Login"},"example":"Login"},{"name":"x-cache-scope","in":"header","description":"Cache entry scope","allowEmptyValue":true,"required":true,"schema":{"type":"string","description":"Cache entry scope","example":"administration"},"example":"administration"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"string","example":"RXQgaWxsdW0gZnVnaWF0IHV0Lg==","format":"binary"},"example":"T3B0aW8gYWxpcXVhbSBlcnJvciBuYW0u"}}},"responses":{"201":{"description":"Created response."}}}}},"components":{},"tags":[{"name":"health","description":"Health service provides health check endpoints."},{"name":"cache","description":"Cache service allows storing and retrieving data from distributed cache."}]}
\ No newline at end of file
diff --git a/gen/http/openapi3.yaml b/gen/http/openapi3.yaml
index 7fa181f0598cfd836cc793396662672f5d9f5776..22a3272368b850853ab7c45d52c28fd3ab8b5771 100644
--- a/gen/http/openapi3.yaml
+++ b/gen/http/openapi3.yaml
@@ -72,108 +72,175 @@ paths:
               schema:
                 type: string
                 example:
-                - 82
-                - 101
-                - 112
+                - 81
                 - 117
-                - 100
                 - 105
-                - 97
-                - 110
-                - 100
-                - 97
-                - 101
                 - 32
-                - 101
-                - 111
+                - 105
+                - 117
                 - 115
-                - 32
-                - 99
+                - 116
                 - 111
+                - 32
+                - 101
                 - 110
-                - 115
+                - 105
+                - 109
+                - 32
                 - 101
-                - 113
-                - 117
-                - 97
+                - 115
                 - 116
-                - 117
-                - 114
                 - 32
+                - 100
+                - 111
+                - 108
+                - 111
+                - 114
+                - 101
                 - 115
-                - 105
-                - 110
-                - 116
                 - 32
                 - 100
                 - 111
                 - 108
                 - 111
                 - 114
-                - 117
+                - 101
                 - 109
                 - 32
-                - 111
-                - 99
-                - 99
-                - 97
                 - 101
-                - 99
-                - 97
                 - 116
-                - 105
                 - 46
                 format: binary
               example:
-              - 86
-              - 111
-              - 108
+              - 81
               - 117
-              - 112
-              - 116
-              - 97
-              - 116
+              - 105
+              - 115
+              - 113
               - 117
+              - 97
               - 109
               - 32
-              - 109
+              - 97
+              - 98
+              - 32
+              - 100
               - 111
+              - 108
+              - 111
+              - 114
+              - 101
+              - 115
+              - 32
               - 100
               - 105
-              - 32
+              - 115
               - 116
-              - 101
+              - 105
               - 110
-              - 101
-              - 116
-              - 117
-              - 114
-              - 32
+              - 99
               - 116
-              - 101
-              - 109
-              - 112
+              - 105
               - 111
-              - 114
-              - 101
               - 32
               - 113
               - 117
               - 105
-              - 97
-              - 32
-              - 101
               - 115
+              - 46
+    post:
+      tags:
+      - cache
+      summary: Set cache
+      description: Set value in the cache. The HTTP request body is stored as value
+        and the key is assembled from HTTP request headers.
+      operationId: cache#Set
+      parameters:
+      - name: x-cache-key
+        in: header
+        description: Cache entry key
+        allowEmptyValue: true
+        required: true
+        schema:
+          type: string
+          description: Cache entry key
+          example: did:web:example.com
+        example: did:web:example.com
+      - name: x-cache-namespace
+        in: header
+        description: Cache entry namespace
+        allowEmptyValue: true
+        required: true
+        schema:
+          type: string
+          description: Cache entry namespace
+          example: Login
+        example: Login
+      - name: x-cache-scope
+        in: header
+        description: Cache entry scope
+        allowEmptyValue: true
+        required: true
+        schema:
+          type: string
+          description: Cache entry scope
+          example: administration
+        example: administration
+      requestBody:
+        required: true
+        content:
+          application/json:
+            schema:
+              type: string
+              example:
+              - 69
               - 116
               - 32
-              - 114
+              - 105
+              - 108
+              - 108
+              - 117
+              - 109
+              - 32
+              - 102
+              - 117
+              - 103
+              - 105
               - 97
               - 116
-              - 105
-              - 111
-              - 110
-              - 101
+              - 32
+              - 117
+              - 116
               - 46
+              format: binary
+            example:
+            - 79
+            - 112
+            - 116
+            - 105
+            - 111
+            - 32
+            - 97
+            - 108
+            - 105
+            - 113
+            - 117
+            - 97
+            - 109
+            - 32
+            - 101
+            - 114
+            - 114
+            - 111
+            - 114
+            - 32
+            - 110
+            - 97
+            - 109
+            - 46
+      responses:
+        "201":
+          description: Created response.
 components: {}
 tags:
 - name: health