diff --git a/pkg/members/members.go b/pkg/members/members.go
new file mode 100644
index 0000000000000000000000000000000000000000..0993b6fddfe34cf7f257e6b70433893485a60dba
--- /dev/null
+++ b/pkg/members/members.go
@@ -0,0 +1,35 @@
+package members
+
+import (
+	"fmt"
+)
+
+type Member struct {
+	OrgId  string `bson:"orgId"`
+	UserId string `bson:"userId"`
+	Role   Role   `bson:"role"`
+}
+
+type Role uint
+
+const (
+	NotMember Role = iota
+	RoleMember
+	RoleOwner
+	RoleAdmin
+)
+
+func (r Role) IsPrivileged() bool {
+	return r == RoleOwner || r == RoleAdmin
+}
+
+func (r Role) Format(s fmt.State, verb rune) {
+	switch r {
+	case RoleOwner:
+		fmt.Fprint(s, "owner")
+	case RoleAdmin:
+		fmt.Fprint(s, "admin")
+	case RoleMember:
+		fmt.Fprint(s, "member")
+	}
+}
diff --git a/pkg/members/mocks/Members.go b/pkg/members/mocks/Members.go
new file mode 100644
index 0000000000000000000000000000000000000000..2adeaac705bf18a17eb06f7932d5d3769de1b50f
--- /dev/null
+++ b/pkg/members/mocks/Members.go
@@ -0,0 +1,124 @@
+// Code generated by mockery v2.7.4. DO NOT EDIT.
+
+package mocks
+
+import (
+	context "context"
+
+	members "git.perx.ru/perxis/perxis-go/pkg/members"
+	mock "github.com/stretchr/testify/mock"
+)
+
+// Members is an autogenerated mock type for the Members type
+type Members struct {
+	mock.Mock
+}
+
+// Get provides a mock function with given fields: ctx, orgId, userId
+func (_m *Members) Get(ctx context.Context, orgId string, userId string) (members.Role, error) {
+	ret := _m.Called(ctx, orgId, userId)
+
+	var r0 members.Role
+	if rf, ok := ret.Get(0).(func(context.Context, string, string) members.Role); ok {
+		r0 = rf(ctx, orgId, userId)
+	} else {
+		r0 = ret.Get(0).(members.Role)
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok {
+		r1 = rf(ctx, orgId, userId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// ListMembers provides a mock function with given fields: ctx, orgId
+func (_m *Members) ListMembers(ctx context.Context, orgId string) ([]*members.Member, error) {
+	ret := _m.Called(ctx, orgId)
+
+	var r0 []*members.Member
+	if rf, ok := ret.Get(0).(func(context.Context, string) []*members.Member); ok {
+		r0 = rf(ctx, orgId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*members.Member)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, string) error); ok {
+		r1 = rf(ctx, orgId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// ListOrganizations provides a mock function with given fields: ctx, userId
+func (_m *Members) ListOrganizations(ctx context.Context, userId string) ([]*members.Member, error) {
+	ret := _m.Called(ctx, userId)
+
+	var r0 []*members.Member
+	if rf, ok := ret.Get(0).(func(context.Context, string) []*members.Member); ok {
+		r0 = rf(ctx, userId)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).([]*members.Member)
+		}
+	}
+
+	var r1 error
+	if rf, ok := ret.Get(1).(func(context.Context, string) error); ok {
+		r1 = rf(ctx, userId)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
+// Remove provides a mock function with given fields: ctx, orgId, userId
+func (_m *Members) Remove(ctx context.Context, orgId string, userId string) error {
+	ret := _m.Called(ctx, orgId, userId)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(context.Context, string, string) error); ok {
+		r0 = rf(ctx, orgId, userId)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// RemoveAll provides a mock function with given fields: ctx, orgId
+func (_m *Members) RemoveAll(ctx context.Context, orgId string) error {
+	ret := _m.Called(ctx, orgId)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(context.Context, string) error); ok {
+		r0 = rf(ctx, orgId)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
+
+// Set provides a mock function with given fields: ctx, orgId, userId, role
+func (_m *Members) Set(ctx context.Context, orgId string, userId string, role members.Role) error {
+	ret := _m.Called(ctx, orgId, userId, role)
+
+	var r0 error
+	if rf, ok := ret.Get(0).(func(context.Context, string, string, members.Role) error); ok {
+		r0 = rf(ctx, orgId, userId, role)
+	} else {
+		r0 = ret.Error(0)
+	}
+
+	return r0
+}
diff --git a/pkg/members/service.go b/pkg/members/service.go
new file mode 100644
index 0000000000000000000000000000000000000000..5b88239b9b8509d8c1f65ca1a1a353cfe7281503
--- /dev/null
+++ b/pkg/members/service.go
@@ -0,0 +1,23 @@
+package members
+
+import (
+	"context"
+)
+
+// @microgen grpc
+// @protobuf git.perx.ru/perxis/perxis-go/proto/members
+// @grpc-addr account.members.Members
+type Members interface {
+	Set(ctx context.Context, orgId, userId string, role Role) (err error)
+
+	Get(ctx context.Context, orgId, userId string) (role Role, err error)
+
+	Remove(ctx context.Context, orgId, userId string) (err error)
+
+	// @microgen -
+	RemoveAll(ctx context.Context, orgId string) (err error)
+
+	ListMembers(ctx context.Context, orgId string) (members []*Member, err error)
+
+	ListOrganizations(ctx context.Context, userId string) (organizations []*Member, err error)
+}
diff --git a/pkg/members/transport/client.microgen.go b/pkg/members/transport/client.microgen.go
new file mode 100644
index 0000000000000000000000000000000000000000..4cd10cad5b1b970f30a9380eae77a5d706748a08
--- /dev/null
+++ b/pkg/members/transport/client.microgen.go
@@ -0,0 +1,86 @@
+// Code generated by microgen 0.9.1. DO NOT EDIT.
+
+package transport
+
+import (
+	"context"
+	"errors"
+
+	members "git.perx.ru/perxis/perxis-go/pkg/members"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+func (set EndpointsSet) Set(arg0 context.Context, arg1 string, arg2 string, arg3 members.Role) (res0 error) {
+	request := SetRequest{
+		OrgId:  arg1,
+		Role:   arg3,
+		UserId: arg2,
+	}
+	_, res0 = set.SetEndpoint(arg0, &request)
+	if res0 != nil {
+		if e, ok := status.FromError(res0); ok || e.Code() == codes.Internal || e.Code() == codes.Unknown {
+			res0 = errors.New(e.Message())
+		}
+		return
+	}
+	return res0
+}
+
+func (set EndpointsSet) Get(arg0 context.Context, arg1 string, arg2 string) (res0 members.Role, res1 error) {
+	request := GetRequest{
+		OrgId:  arg1,
+		UserId: arg2,
+	}
+	response, res1 := set.GetEndpoint(arg0, &request)
+	if res1 != nil {
+		if e, ok := status.FromError(res1); ok || e.Code() == codes.Internal || e.Code() == codes.Unknown {
+			res1 = errors.New(e.Message())
+		}
+		return
+	}
+	return response.(*GetResponse).Role, res1
+}
+
+func (set EndpointsSet) Remove(arg0 context.Context, arg1 string, arg2 string) (res0 error) {
+	request := RemoveRequest{
+		OrgId:  arg1,
+		UserId: arg2,
+	}
+	_, res0 = set.RemoveEndpoint(arg0, &request)
+	if res0 != nil {
+		if e, ok := status.FromError(res0); ok || e.Code() == codes.Internal || e.Code() == codes.Unknown {
+			res0 = errors.New(e.Message())
+		}
+		return
+	}
+	return res0
+}
+
+func (set EndpointsSet) RemoveAll(arg0 context.Context, arg1 string) (res0 error) {
+	return
+}
+
+func (set EndpointsSet) ListMembers(arg0 context.Context, arg1 string) (res0 []*members.Member, res1 error) {
+	request := ListMembersRequest{OrgId: arg1}
+	response, res1 := set.ListMembersEndpoint(arg0, &request)
+	if res1 != nil {
+		if e, ok := status.FromError(res1); ok || e.Code() == codes.Internal || e.Code() == codes.Unknown {
+			res1 = errors.New(e.Message())
+		}
+		return
+	}
+	return response.(*ListMembersResponse).Members, res1
+}
+
+func (set EndpointsSet) ListOrganizations(arg0 context.Context, arg1 string) (res0 []*members.Member, res1 error) {
+	request := ListOrganizationsRequest{UserId: arg1}
+	response, res1 := set.ListOrganizationsEndpoint(arg0, &request)
+	if res1 != nil {
+		if e, ok := status.FromError(res1); ok || e.Code() == codes.Internal || e.Code() == codes.Unknown {
+			res1 = errors.New(e.Message())
+		}
+		return
+	}
+	return response.(*ListOrganizationsResponse).Organizations, res1
+}
diff --git a/pkg/members/transport/endpoints.microgen.go b/pkg/members/transport/endpoints.microgen.go
new file mode 100644
index 0000000000000000000000000000000000000000..88740bb07c63a46ff111527fdeae40dfc89a6167
--- /dev/null
+++ b/pkg/members/transport/endpoints.microgen.go
@@ -0,0 +1,14 @@
+// Code generated by microgen 0.9.1. DO NOT EDIT.
+
+package transport
+
+import endpoint "github.com/go-kit/kit/endpoint"
+
+// EndpointsSet implements Members API and used for transport purposes.
+type EndpointsSet struct {
+	SetEndpoint               endpoint.Endpoint
+	GetEndpoint               endpoint.Endpoint
+	RemoveEndpoint            endpoint.Endpoint
+	ListMembersEndpoint       endpoint.Endpoint
+	ListOrganizationsEndpoint endpoint.Endpoint
+}
diff --git a/pkg/members/transport/exchanges.microgen.go b/pkg/members/transport/exchanges.microgen.go
new file mode 100644
index 0000000000000000000000000000000000000000..afa03b65ed508022e89565e2f0881e6afb3c5678
--- /dev/null
+++ b/pkg/members/transport/exchanges.microgen.go
@@ -0,0 +1,44 @@
+// Code generated by microgen 0.9.1. DO NOT EDIT.
+
+package transport
+
+import members "git.perx.ru/perxis/perxis-go/pkg/members"
+
+type (
+	SetRequest struct {
+		OrgId  string       `json:"org_id"`
+		UserId string       `json:"user_id"`
+		Role   members.Role `json:"role"`
+	}
+	// Formal exchange type, please do not delete.
+	SetResponse struct{}
+
+	GetRequest struct {
+		OrgId  string `json:"org_id"`
+		UserId string `json:"user_id"`
+	}
+	GetResponse struct {
+		Role members.Role `json:"role"`
+	}
+
+	RemoveRequest struct {
+		OrgId  string `json:"org_id"`
+		UserId string `json:"user_id"`
+	}
+	// Formal exchange type, please do not delete.
+	RemoveResponse struct{}
+
+	ListMembersRequest struct {
+		OrgId string `json:"org_id"`
+	}
+	ListMembersResponse struct {
+		Members []*members.Member `json:"members"`
+	}
+
+	ListOrganizationsRequest struct {
+		UserId string `json:"user_id"`
+	}
+	ListOrganizationsResponse struct {
+		Organizations []*members.Member `json:"organizations"`
+	}
+)
diff --git a/pkg/members/transport/grpc/client.microgen.go b/pkg/members/transport/grpc/client.microgen.go
new file mode 100644
index 0000000000000000000000000000000000000000..ad8ad450edbdfa95435e9a3b472386db033bc33f
--- /dev/null
+++ b/pkg/members/transport/grpc/client.microgen.go
@@ -0,0 +1,54 @@
+// Code generated by microgen 0.9.1. DO NOT EDIT.
+
+package transportgrpc
+
+import (
+	pb "git.perx.ru/perxis/perxis-go/proto/members"
+	transport "git.perx.ru/perxis/perxis/services/members/transport"
+	grpckit "github.com/go-kit/kit/transport/grpc"
+	empty "github.com/golang/protobuf/ptypes/empty"
+	grpc "google.golang.org/grpc"
+)
+
+func NewGRPCClient(conn *grpc.ClientConn, addr string, opts ...grpckit.ClientOption) transport.EndpointsSet {
+	if addr == "" {
+		addr = "account.members.Members"
+	}
+	return transport.EndpointsSet{
+		GetEndpoint: grpckit.NewClient(
+			conn, addr, "Get",
+			_Encode_Get_Request,
+			_Decode_Get_Response,
+			pb.GetResponse{},
+			opts...,
+		).Endpoint(),
+		ListMembersEndpoint: grpckit.NewClient(
+			conn, addr, "ListMembers",
+			_Encode_ListMembers_Request,
+			_Decode_ListMembers_Response,
+			pb.ListMembersResponse{},
+			opts...,
+		).Endpoint(),
+		ListOrganizationsEndpoint: grpckit.NewClient(
+			conn, addr, "ListOrganizations",
+			_Encode_ListOrganizations_Request,
+			_Decode_ListOrganizations_Response,
+			pb.ListOrganizationsResponse{},
+			opts...,
+		).Endpoint(),
+		RemoveEndpoint: grpckit.NewClient(
+			conn, addr, "Remove",
+			_Encode_Remove_Request,
+			_Decode_Remove_Response,
+			empty.Empty{},
+			opts...,
+		).Endpoint(),
+		SetEndpoint: grpckit.NewClient(
+			conn, addr, "Set",
+			_Encode_Set_Request,
+			_Decode_Set_Response,
+			empty.Empty{},
+			opts...,
+		).Endpoint(),
+	}
+}
diff --git a/pkg/members/transport/grpc/protobuf_endpoint_converters.microgen.go b/pkg/members/transport/grpc/protobuf_endpoint_converters.microgen.go
new file mode 100644
index 0000000000000000000000000000000000000000..71748297758d43ade7f7131d808a992fc84aadeb
--- /dev/null
+++ b/pkg/members/transport/grpc/protobuf_endpoint_converters.microgen.go
@@ -0,0 +1,209 @@
+// Code generated by microgen 0.9.1. DO NOT EDIT.
+
+// Please, do not change functions names!
+package transportgrpc
+
+import (
+	"context"
+	"errors"
+
+	"git.perx.ru/perxis/perxis-go/proto/members"
+	"git.perx.ru/perxis/perxis/services/members/transport"
+	"github.com/golang/protobuf/ptypes/empty"
+)
+
+func _Encode_Set_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil SetRequest")
+	}
+	req := request.(*transport.SetRequest)
+	reqRole, err := RoleToProto(req.Role)
+	if err != nil {
+		return nil, err
+	}
+	return &members.SetRequest{
+		OrgId:  req.OrgId,
+		Role:   reqRole,
+		UserId: req.UserId,
+	}, nil
+}
+
+func _Encode_Get_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil GetRequest")
+	}
+	req := request.(*transport.GetRequest)
+	return &members.GetRequest{
+		OrgId:  req.OrgId,
+		UserId: req.UserId,
+	}, nil
+}
+
+func _Encode_Remove_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil RemoveRequest")
+	}
+	req := request.(*transport.RemoveRequest)
+	return &members.RemoveRequest{
+		OrgId:  req.OrgId,
+		UserId: req.UserId,
+	}, nil
+}
+
+func _Encode_ListMembers_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil ListMembersRequest")
+	}
+	req := request.(*transport.ListMembersRequest)
+	return &members.ListMembersRequest{OrgId: req.OrgId}, nil
+}
+
+func _Encode_ListOrganizations_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil ListOrganizationsRequest")
+	}
+	req := request.(*transport.ListOrganizationsRequest)
+	return &members.ListOrganizationsRequest{UserId: req.UserId}, nil
+}
+
+func _Encode_Set_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	return &empty.Empty{}, nil
+}
+
+func _Encode_Get_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	if response == nil {
+		return nil, errors.New("nil GetResponse")
+	}
+	resp := response.(*transport.GetResponse)
+	respRole, err := RoleToProto(resp.Role)
+	if err != nil {
+		return nil, err
+	}
+	return &members.GetResponse{Role: respRole}, nil
+}
+
+func _Encode_Remove_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	return &empty.Empty{}, nil
+}
+
+func _Encode_ListMembers_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	if response == nil {
+		return nil, errors.New("nil ListMembersResponse")
+	}
+	resp := response.(*transport.ListMembersResponse)
+	respMembers, err := ListPtrMemberToProto(resp.Members)
+	if err != nil {
+		return nil, err
+	}
+	return &members.ListMembersResponse{Members: respMembers}, nil
+}
+
+func _Encode_ListOrganizations_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	if response == nil {
+		return nil, errors.New("nil ListOrganizationsResponse")
+	}
+	resp := response.(*transport.ListOrganizationsResponse)
+	respOrganizations, err := ListPtrMemberToProto(resp.Organizations)
+	if err != nil {
+		return nil, err
+	}
+	return &members.ListOrganizationsResponse{Organizations: respOrganizations}, nil
+}
+
+func _Decode_Set_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil SetRequest")
+	}
+	req := request.(*members.SetRequest)
+	reqRole, err := ProtoToRole(req.Role)
+	if err != nil {
+		return nil, err
+	}
+	return &transport.SetRequest{
+		OrgId:  string(req.OrgId),
+		Role:   reqRole,
+		UserId: string(req.UserId),
+	}, nil
+}
+
+func _Decode_Get_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil GetRequest")
+	}
+	req := request.(*members.GetRequest)
+	return &transport.GetRequest{
+		OrgId:  string(req.OrgId),
+		UserId: string(req.UserId),
+	}, nil
+}
+
+func _Decode_Remove_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil RemoveRequest")
+	}
+	req := request.(*members.RemoveRequest)
+	return &transport.RemoveRequest{
+		OrgId:  string(req.OrgId),
+		UserId: string(req.UserId),
+	}, nil
+}
+
+func _Decode_ListMembers_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil ListMembersRequest")
+	}
+	req := request.(*members.ListMembersRequest)
+	return &transport.ListMembersRequest{OrgId: string(req.OrgId)}, nil
+}
+
+func _Decode_ListOrganizations_Request(ctx context.Context, request interface{}) (interface{}, error) {
+	if request == nil {
+		return nil, errors.New("nil ListOrganizationsRequest")
+	}
+	req := request.(*members.ListOrganizationsRequest)
+	return &transport.ListOrganizationsRequest{UserId: string(req.UserId)}, nil
+}
+
+func _Decode_Set_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	return &empty.Empty{}, nil
+}
+
+func _Decode_Get_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	if response == nil {
+		return nil, errors.New("nil GetResponse")
+	}
+	resp := response.(*members.GetResponse)
+	respRole, err := ProtoToRole(resp.Role)
+	if err != nil {
+		return nil, err
+	}
+	return &transport.GetResponse{Role: respRole}, nil
+}
+
+func _Decode_Remove_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	return &empty.Empty{}, nil
+}
+
+func _Decode_ListMembers_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	if response == nil {
+		return nil, errors.New("nil ListMembersResponse")
+	}
+	resp := response.(*members.ListMembersResponse)
+	respMembers, err := ProtoToListPtrMember(resp.Members)
+	if err != nil {
+		return nil, err
+	}
+	return &transport.ListMembersResponse{Members: respMembers}, nil
+}
+
+func _Decode_ListOrganizations_Response(ctx context.Context, response interface{}) (interface{}, error) {
+	if response == nil {
+		return nil, errors.New("nil ListOrganizationsResponse")
+	}
+	resp := response.(*members.ListOrganizationsResponse)
+	respOrganizations, err := ProtoToListPtrMember(resp.Organizations)
+	if err != nil {
+		return nil, err
+	}
+	return &transport.ListOrganizationsResponse{Organizations: respOrganizations}, nil
+}
diff --git a/pkg/members/transport/grpc/protobuf_type_converters.microgen.go b/pkg/members/transport/grpc/protobuf_type_converters.microgen.go
new file mode 100644
index 0000000000000000000000000000000000000000..a5b5264837967bf034c2badd0ae96066212b291e
--- /dev/null
+++ b/pkg/members/transport/grpc/protobuf_type_converters.microgen.go
@@ -0,0 +1,42 @@
+// Code generated by microgen 0.9.1. DO NOT EDIT.
+
+// It is better for you if you do not change functions names!
+// This file will never be overwritten.
+package transportgrpc
+
+import (
+	pb "git.perx.ru/perxis/perxis-go/proto/members"
+	service "git.perx.ru/perxis/perxis/services/members"
+)
+
+func RoleToProto(role service.Role) (pb.Role, error) {
+	return pb.Role(role), nil
+}
+
+func ProtoToRole(protoRole pb.Role) (service.Role, error) {
+	return service.Role(protoRole), nil
+}
+
+func ListPtrMemberToProto(members []*service.Member) ([]*pb.Member, error) {
+	res := make([]*pb.Member, 0, len(members))
+	for _, m := range members {
+		res = append(res, &pb.Member{
+			OrgId:  m.OrgId,
+			UserId: m.UserId,
+			Role:   pb.Role(m.Role),
+		})
+	}
+	return res, nil
+}
+
+func ProtoToListPtrMember(protoMembers []*pb.Member) ([]*service.Member, error) {
+	res := make([]*service.Member, 0, len(protoMembers))
+	for _, m := range protoMembers {
+		res = append(res, &service.Member{
+			OrgId:  m.OrgId,
+			UserId: m.UserId,
+			Role:   service.Role(m.Role),
+		})
+	}
+	return res, nil
+}
diff --git a/pkg/members/transport/grpc/server.microgen.go b/pkg/members/transport/grpc/server.microgen.go
new file mode 100644
index 0000000000000000000000000000000000000000..2805883e4d013566b6bdc7bca1a75ae284e239e7
--- /dev/null
+++ b/pkg/members/transport/grpc/server.microgen.go
@@ -0,0 +1,97 @@
+// Code generated by microgen 0.9.1. DO NOT EDIT.
+
+// DO NOT EDIT.
+package transportgrpc
+
+import (
+	pb "git.perx.ru/perxis/perxis-go/proto/members"
+	transport "git.perx.ru/perxis/perxis/services/members/transport"
+	grpc "github.com/go-kit/kit/transport/grpc"
+	empty "github.com/golang/protobuf/ptypes/empty"
+	context "golang.org/x/net/context"
+)
+
+type membersServer struct {
+	set               grpc.Handler
+	get               grpc.Handler
+	remove            grpc.Handler
+	listMembers       grpc.Handler
+	listOrganizations grpc.Handler
+
+	pb.UnimplementedMembersServer
+}
+
+func NewGRPCServer(endpoints *transport.EndpointsSet, opts ...grpc.ServerOption) pb.MembersServer {
+	return &membersServer{
+		get: grpc.NewServer(
+			endpoints.GetEndpoint,
+			_Decode_Get_Request,
+			_Encode_Get_Response,
+			opts...,
+		),
+		listMembers: grpc.NewServer(
+			endpoints.ListMembersEndpoint,
+			_Decode_ListMembers_Request,
+			_Encode_ListMembers_Response,
+			opts...,
+		),
+		listOrganizations: grpc.NewServer(
+			endpoints.ListOrganizationsEndpoint,
+			_Decode_ListOrganizations_Request,
+			_Encode_ListOrganizations_Response,
+			opts...,
+		),
+		remove: grpc.NewServer(
+			endpoints.RemoveEndpoint,
+			_Decode_Remove_Request,
+			_Encode_Remove_Response,
+			opts...,
+		),
+		set: grpc.NewServer(
+			endpoints.SetEndpoint,
+			_Decode_Set_Request,
+			_Encode_Set_Response,
+			opts...,
+		),
+	}
+}
+
+func (S *membersServer) Set(ctx context.Context, req *pb.SetRequest) (*empty.Empty, error) {
+	_, resp, err := S.set.ServeGRPC(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+	return resp.(*empty.Empty), nil
+}
+
+func (S *membersServer) Get(ctx context.Context, req *pb.GetRequest) (*pb.GetResponse, error) {
+	_, resp, err := S.get.ServeGRPC(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+	return resp.(*pb.GetResponse), nil
+}
+
+func (S *membersServer) Remove(ctx context.Context, req *pb.RemoveRequest) (*empty.Empty, error) {
+	_, resp, err := S.remove.ServeGRPC(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+	return resp.(*empty.Empty), nil
+}
+
+func (S *membersServer) ListMembers(ctx context.Context, req *pb.ListMembersRequest) (*pb.ListMembersResponse, error) {
+	_, resp, err := S.listMembers.ServeGRPC(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+	return resp.(*pb.ListMembersResponse), nil
+}
+
+func (S *membersServer) ListOrganizations(ctx context.Context, req *pb.ListOrganizationsRequest) (*pb.ListOrganizationsResponse, error) {
+	_, resp, err := S.listOrganizations.ServeGRPC(ctx, req)
+	if err != nil {
+		return nil, err
+	}
+	return resp.(*pb.ListOrganizationsResponse), nil
+}
diff --git a/pkg/members/transport/server.microgen.go b/pkg/members/transport/server.microgen.go
new file mode 100644
index 0000000000000000000000000000000000000000..b1c40ac3039b2ce46685880e93651f20d4fe7d16
--- /dev/null
+++ b/pkg/members/transport/server.microgen.go
@@ -0,0 +1,60 @@
+// Code generated by microgen 0.9.1. DO NOT EDIT.
+
+package transport
+
+import (
+	"context"
+
+	members "git.perx.ru/perxis/perxis-go/pkg/members"
+	endpoint "github.com/go-kit/kit/endpoint"
+)
+
+func Endpoints(svc members.Members) EndpointsSet {
+	return EndpointsSet{
+		GetEndpoint:               GetEndpoint(svc),
+		ListMembersEndpoint:       ListMembersEndpoint(svc),
+		ListOrganizationsEndpoint: ListOrganizationsEndpoint(svc),
+		RemoveEndpoint:            RemoveEndpoint(svc),
+		SetEndpoint:               SetEndpoint(svc),
+	}
+}
+
+func SetEndpoint(svc members.Members) endpoint.Endpoint {
+	return func(arg0 context.Context, request interface{}) (interface{}, error) {
+		req := request.(*SetRequest)
+		res0 := svc.Set(arg0, req.OrgId, req.UserId, req.Role)
+		return &SetResponse{}, res0
+	}
+}
+
+func GetEndpoint(svc members.Members) endpoint.Endpoint {
+	return func(arg0 context.Context, request interface{}) (interface{}, error) {
+		req := request.(*GetRequest)
+		res0, res1 := svc.Get(arg0, req.OrgId, req.UserId)
+		return &GetResponse{Role: res0}, res1
+	}
+}
+
+func RemoveEndpoint(svc members.Members) endpoint.Endpoint {
+	return func(arg0 context.Context, request interface{}) (interface{}, error) {
+		req := request.(*RemoveRequest)
+		res0 := svc.Remove(arg0, req.OrgId, req.UserId)
+		return &RemoveResponse{}, res0
+	}
+}
+
+func ListMembersEndpoint(svc members.Members) endpoint.Endpoint {
+	return func(arg0 context.Context, request interface{}) (interface{}, error) {
+		req := request.(*ListMembersRequest)
+		res0, res1 := svc.ListMembers(arg0, req.OrgId)
+		return &ListMembersResponse{Members: res0}, res1
+	}
+}
+
+func ListOrganizationsEndpoint(svc members.Members) endpoint.Endpoint {
+	return func(arg0 context.Context, request interface{}) (interface{}, error) {
+		req := request.(*ListOrganizationsRequest)
+		res0, res1 := svc.ListOrganizations(arg0, req.UserId)
+		return &ListOrganizationsResponse{Organizations: res0}, res1
+	}
+}