diff --git a/pkg/delivery/transport/grpc/protobuf_type_converters.microgen.go b/pkg/delivery/transport/grpc/protobuf_type_converters.microgen.go
index 6961c709da405a34710e76ff6c1ad6f34c218f1b..aedb4ff8a7612702413760f2a1276153c1571c9e 100644
--- a/pkg/delivery/transport/grpc/protobuf_type_converters.microgen.go
+++ b/pkg/delivery/transport/grpc/protobuf_type_converters.microgen.go
@@ -302,11 +302,39 @@ func ProtoToPtrItemsFilter(protoFilter *itemspb.Filter) (*items.Filter, error) {
 }
 
 func PtrServicesFindOptionsToProto(options *services.FindOptions) (*common.FindOptions, error) {
-	return services.FindOptionsToPB(options), nil
+	if options == nil {
+		return nil, nil
+	}
+	return &common.FindOptions{
+		Sort:          options.Sort,
+		PageNum:       int32(options.PageNum),
+		PageSize:      int32(options.PageSize),
+		Offset:        int32(options.Offset),
+		Limit:         int32(options.Limit),
+		Fields:        options.Fields,
+		ExcludeFields: options.ExcludeFields,
+	}, nil
 }
 
 func ProtoToPtrServicesFindOptions(protoOptions *common.FindOptions) (*services.FindOptions, error) {
-	return services.FindOptionsFromPB(protoOptions), nil
+	if protoOptions == nil {
+		return nil, nil
+	}
+	return &services.FindOptions{
+		SortOptions: services.SortOptions{
+			Sort: protoOptions.Sort,
+		},
+		PaginationOptions: services.PaginationOptions{
+			PageNum:  int(protoOptions.PageNum),
+			PageSize: int(protoOptions.PageSize),
+			Offset:   int(protoOptions.Offset),
+			Limit:    int(protoOptions.Limit),
+		},
+		FieldOptions: services.FieldOptions{
+			Fields:        protoOptions.Fields,
+			ExcludeFields: protoOptions.ExcludeFields,
+		},
+	}, nil
 }
 
 func ListPtrItemsItemToProto(itms []*items.Item) ([]*itemspb.Item, error) {
diff --git a/pkg/invitations/transport/grpc/protobuf_type_converters.microgen.go b/pkg/invitations/transport/grpc/protobuf_type_converters.microgen.go
index 1b222519b0aacc35feb180e0273ac9758394aefe..ee7b788e2bf670b9f885c0fa3d9a52cbff30502e 100644
--- a/pkg/invitations/transport/grpc/protobuf_type_converters.microgen.go
+++ b/pkg/invitations/transport/grpc/protobuf_type_converters.microgen.go
@@ -104,18 +104,11 @@ func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*pb.FindOptions,
 	if opts == nil {
 		return nil, nil
 	}
-
-	fo := &pb.FindOptions{
+	return &pb.FindOptions{
 		Sort:     opts.Sort,
-		PageSize: int32(opts.Limit),
-	}
-
-	if opts.Limit != 0 {
-		// Потенциальная ошибка если offset не кратен limit
-		fo.PageNum = int32(opts.Offset / opts.Limit)
-	}
-
-	return fo, nil
+		PageNum:  int32(opts.PageNum),
+		PageSize: int32(opts.PageSize),
+	}, nil
 }
 
 func ProtoToPtrServicesFindOptions(protoOpts *pb.FindOptions) (*options.FindOptions, error) {
@@ -127,8 +120,8 @@ func ProtoToPtrServicesFindOptions(protoOpts *pb.FindOptions) (*options.FindOpti
 			Sort: protoOpts.Sort,
 		},
 		PaginationOptions: options.PaginationOptions{
-			Limit:	int(protoOpts.PageSize),
-			Offset: int(protoOpts.PageNum * protoOpts.PageSize),
+			PageNum:  int(protoOpts.PageNum),
+			PageSize: int(protoOpts.PageSize),
 		},
 	}, nil
 }
diff --git a/pkg/items/dummy.go b/pkg/items/dummy.go
new file mode 100644
index 0000000000000000000000000000000000000000..fc1f725abc3e5f9c16164daca30f3334c16f9f86
--- /dev/null
+++ b/pkg/items/dummy.go
@@ -0,0 +1,17 @@
+package items
+
+import "context"
+
+type FindResultDummy struct {
+	Items []*Item
+	Total int
+	Error error
+}
+type Dummy struct {
+	Items
+	FindResult *FindResultDummy
+}
+
+func (d *Dummy) Find(_ context.Context, _, _, _ string, _ *Filter, _ ...*FindOptions) ([]*Item, int, error) {
+	return d.FindResult.Items, d.FindResult.Total, d.FindResult.Error
+}
diff --git a/pkg/items/pagination.go b/pkg/items/pagination.go
index c8c4bb16d2da0d2d10e3d98422aaf345ffbf7c21..1910a34ba67c21cb1ebf54923ebe750af0fd10d2 100644
--- a/pkg/items/pagination.go
+++ b/pkg/items/pagination.go
@@ -16,7 +16,9 @@ type BatchProcessor struct {
 	FindPublishedOptions         *FindPublishedOptions
 	Filter                       *Filter
 
-	limit     int
+	// Deprecated использовать offset, limit
+	pageSize, pageNum int
+
 	sort      []string
 	processed int
 }
@@ -37,7 +39,7 @@ func (b *BatchProcessor) getBatch(ctx context.Context) ([]*Item, bool, error) {
 				Regular:     b.FindPublishedOptions.Regular,
 				Hidden:      b.FindPublishedOptions.Hidden,
 				Templates:   b.FindPublishedOptions.Templates,
-				FindOptions: *options.New(b.processed, b.limit, b.sort...),
+				FindOptions: *options.NewFindOptions(b.pageNum, b.pageSize, b.sort...),
 			},
 		)
 	} else {
@@ -52,13 +54,14 @@ func (b *BatchProcessor) getBatch(ctx context.Context) ([]*Item, bool, error) {
 				Regular:     b.FindOptions.Regular,
 				Hidden:      b.FindOptions.Hidden,
 				Templates:   b.FindOptions.Templates,
-				FindOptions: *options.New(b.processed, b.limit, b.sort...),
+				FindOptions: *options.NewFindOptions(b.pageNum, b.pageSize, b.sort...),
 			},
 		)
 	}
 
 	if err == nil {
 		b.processed += len(res)
+		b.pageNum++
 	}
 
 	return res, b.processed != total, err
@@ -83,29 +86,32 @@ func (b *BatchProcessor) next(ctx context.Context) (res []*Item, next bool, err
 }
 
 func (b *BatchProcessor) reducePageSize() bool {
-	if b.limit == 1 {
+	if b.pageSize == 1 {
 		return false
 	}
 
-	b.limit /= 2
+	b.pageNum = 2 * b.pageNum
+	b.pageSize = b.pageSize / 2
+
 	return true
 }
 
 func (b *BatchProcessor) Do(ctx context.Context, f func(batch []*Item) error) (int, error) {
+
 	if b.FindOptions == nil && b.FindPublishedOptions == nil {
 		b.FindOptions = new(FindOptions)
 	}
 	if b.FindOptions != nil {
-		b.limit = b.FindOptions.Limit
+		b.pageSize = b.FindOptions.PageSize
 		b.sort = b.FindOptions.Sort
 	}
 	if b.FindPublishedOptions != nil {
-		b.limit = b.FindPublishedOptions.Limit
+		b.pageSize = b.FindPublishedOptions.PageSize
 		b.sort = b.FindPublishedOptions.Sort
 	}
 
-	if b.limit == 0 {
-		b.limit = 128
+	if b.pageSize == 0 {
+		b.pageSize = 128
 	}
 
 	if b.Filter != nil && (len(b.Filter.ID) > 0 || len(b.Filter.Q) > 0) && !data.Contains("_id", b.sort) {
diff --git a/pkg/items/pagination_test.go b/pkg/items/pagination_test.go
index 008b17795cc1c57d4e2dcf6bb3507bee8b3f1646..bf13af39e00bd19550ddd49bae3e165b5cfa9fff 100644
--- a/pkg/items/pagination_test.go
+++ b/pkg/items/pagination_test.go
@@ -11,51 +11,25 @@ import (
 )
 
 func TestBatchProcessor(t *testing.T) {
-	t.Run("EmptyResults", func(t *testing.T) {
-		itemssvc := &Stub{
-			FindResult: func(req StubFindRequest) StubFindResult {
-				return StubFindResult{Items: nil, Total: 0, Error: nil}
-			},
-		}
 
-		b := &BatchProcessor{
-			Items:        itemssvc,
-			SpaceID:      "sp",
-			EnvID:        environments.DefaultEnvironment,
-			CollectionID: "col",
-			FindOptions: &FindOptions{
-				Regular:     true,
-				Hidden:      true,
-				Templates:   true,
-				FindOptions: *options.NewFindOptions(0, 10),
-			},
-			Filter: NewFilter("a > 5"),
-		}
+	itemssvc := &Dummy{FindResult: &FindResultDummy{Items: nil, Total: 0, Error: nil}}
 
-		var counter int
-		_, err := b.Do(context.Background(), func(batch []*Item) error { counter++; return nil })
-		require.NoError(t, err)
-		assert.Equal(t, 0, counter)
-	})
+	b := &BatchProcessor{
+		Items:        itemssvc,
+		SpaceID:      "sp",
+		EnvID:        environments.DefaultEnvironment,
+		CollectionID: "col",
+		FindOptions: &FindOptions{
+			Regular:     true,
+			Hidden:      true,
+			Templates:   true,
+			FindOptions: *options.NewFindOptions(0, 10),
+		},
+		Filter: NewFilter("a > 5"),
+	}
 
-	t.Run("With FindOptions", func(t *testing.T) {
-		itemssvc := &Stub{
-			FindResult: func(req StubFindRequest) StubFindResult {
-				fo := MergeFindOptions(req.Options...)
-				return StubFindResult{Items: make([]*Item, fo.Limit), Total: 1000, Error: nil}
-			},
-		}
-		b := &BatchProcessor{
-			Items:        itemssvc,
-			SpaceID:      "sp",
-			EnvID:        environments.DefaultEnvironment,
-			CollectionID: "col",
-			FindOptions:  &FindOptions{FindOptions: *options.New(0, 25)},
-		}
-
-		var counter int
-		_, err := b.Do(context.Background(), func(batch []*Item) error { counter++; return nil })
-		require.NoError(t, err)
-		assert.Equal(t, 1000/25, counter)
-	})
+	var counter int
+	_, err := b.Do(context.Background(), func(batch []*Item) error { counter++; return nil })
+	require.NoError(t, err)
+	assert.Equal(t, 0, counter)
 }
diff --git a/pkg/items/stub.go b/pkg/items/stub.go
deleted file mode 100644
index 33573514b655a6084f636403a581bad46b130172..0000000000000000000000000000000000000000
--- a/pkg/items/stub.go
+++ /dev/null
@@ -1,35 +0,0 @@
-package items
-
-import (
-	"context"
-)
-
-type StubFindRequest struct {
-	Context                context.Context
-	SpaceID, EnvID, CollID string
-	Filter                 *Filter
-	Options                []*FindOptions
-}
-
-type StubFindResult struct {
-	Items []*Item
-	Total int
-	Error error
-}
-
-type Stub struct {
-	Items
-	FindResult func(req StubFindRequest) StubFindResult
-}
-
-func (d *Stub) Find(ctx context.Context, spaceID, envID, collID string, filter *Filter, opts ...*FindOptions) ([]*Item, int, error) {
-	res := d.FindResult(StubFindRequest{
-		Context: ctx,
-		SpaceID: spaceID,
-		EnvID:   envID,
-		CollID:  collID,
-		Filter:  filter,
-		Options: opts,
-	})
-	return res.Items, res.Total, res.Error
-}
diff --git a/pkg/items/transport/grpc/protobuf_type_converters.microgen.go b/pkg/items/transport/grpc/protobuf_type_converters.microgen.go
index ade05bfffeb4a1c745f80338e7faac2287b067a2..0b214cc93c44392ad1490ced7665dd1b595b76b3 100644
--- a/pkg/items/transport/grpc/protobuf_type_converters.microgen.go
+++ b/pkg/items/transport/grpc/protobuf_type_converters.microgen.go
@@ -144,11 +144,39 @@ func ProtoToPtrFilter(protoFilter *pb.Filter) (*service.Filter, error) {
 }
 
 func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*pbcommon.FindOptions, error) {
-	return options.FindOptionsToPB(opts), nil
+	if opts == nil {
+		return nil, nil
+	}
+	return &pbcommon.FindOptions{
+		Sort:          opts.Sort,
+		PageNum:       int32(opts.PageNum),
+		PageSize:      int32(opts.PageSize),
+		Offset:        int32(opts.Offset),
+		Limit:         int32(opts.Limit),
+		Fields:        opts.Fields,
+		ExcludeFields: opts.ExcludeFields,
+	}, nil
 }
 
 func ProtoToPtrServicesFindOptions(protoOpts *pbcommon.FindOptions) (*options.FindOptions, error) {
-	return options.FindOptionsFromPB(protoOpts), nil
+	if protoOpts == nil {
+		return nil, nil
+	}
+	return &options.FindOptions{
+		SortOptions: options.SortOptions{
+			Sort: protoOpts.Sort,
+		},
+		PaginationOptions: options.PaginationOptions{
+			PageNum:  int(protoOpts.PageNum),
+			PageSize: int(protoOpts.PageSize),
+			Offset:   int(protoOpts.Offset),
+			Limit:    int(protoOpts.Limit),
+		},
+		FieldOptions: options.FieldOptions{
+			Fields:        protoOpts.Fields,
+			ExcludeFields: protoOpts.ExcludeFields,
+		},
+	}, nil
 }
 
 func ListPtrItemToProto(items []*service.Item) ([]*pb.Item, error) {
diff --git a/pkg/options/options.go b/pkg/options/options.go
index d18ca338c01a7d0e2117a0e09f47d1a21421bdd1..066d3f8aa347a4b08fb901c87e2fc9afee7aa15f 100644
--- a/pkg/options/options.go
+++ b/pkg/options/options.go
@@ -13,6 +13,10 @@ type SortOptions struct {
 
 // PaginationOptions настройки возвращаемых страниц результатов
 type PaginationOptions struct {
+	//Deprecated
+	PageNum  int
+	PageSize int
+
 	Limit  int
 	Offset int
 }
@@ -35,18 +39,12 @@ type FindOptions struct {
 	FieldOptions
 }
 
-// Deprecated использовать New
 // NewFindOptions создает новые результаты поиска
 func NewFindOptions(pageNum, pageSize int, sort ...string) *FindOptions {
-	return New(pageNum*pageSize, pageSize, sort...)
-}
-
-// New создает новые параметры поиска
-func New(offset, limit int, sort ...string) *FindOptions {
 	return &FindOptions{
 		PaginationOptions: PaginationOptions{
-			Offset: offset,
-			Limit:  limit,
+			PageNum:  pageNum,
+			PageSize: pageSize,
 		},
 		SortOptions: SortOptions{
 			Sort: sort,
@@ -97,8 +95,8 @@ func FindOptionsFromPB(protoOpts *commonpb.FindOptions) *FindOptions {
 			Sort: protoOpts.Sort,
 		},
 		PaginationOptions: PaginationOptions{
-			Limit:    int(protoOpts.Limit),
-			Offset:   int(protoOpts.Offset),
+			Offset: int(protoOpts.Offset),
+			Limit:  int(protoOpts.Limit),
 		},
 		FieldOptions: FieldOptions{
 			Fields:        protoOpts.Fields,
@@ -106,9 +104,9 @@ func FindOptionsFromPB(protoOpts *commonpb.FindOptions) *FindOptions {
 		},
 	}
 
-	if fo.Offset == 0 && fo.Limit == 0 {
-		fo.Offset = int(protoOpts.PageSize * protoOpts.PageNum)
-		fo.Limit = int(protoOpts.PageSize)
+	if fo.Offset == 0 && fo.Limit == 0 && fo.PageSize != 0 {
+		fo.Offset = fo.PageSize * (fo.PageNum - 1)
+		fo.Limit = fo.PageSize
 	}
 
 	return fo
@@ -120,11 +118,21 @@ func FindOptionsToPB(opts *FindOptions) *commonpb.FindOptions {
 	}
 	fo := &commonpb.FindOptions{
 		Sort:          opts.Sort,
+		PageNum:       int32(opts.PageNum),
+		PageSize:      int32(opts.PageSize),
 		Offset:        int32(opts.Offset),
 		Limit:         int32(opts.Limit),
 		Fields:        opts.Fields,
 		ExcludeFields: opts.ExcludeFields,
 	}
+	if fo.PageSize != 0 && fo.Limit == 0 {
+		fo.Limit = fo.PageSize
+		fo.Offset = fo.PageSize * (fo.PageNum - 1)
+	}
+	if fo.Limit != 0 && fo.PageSize == 0 {
+		fo.PageSize = fo.Limit
+		fo.PageNum = fo.Offset / fo.Limit
+	}
 	return fo
 }
 
@@ -148,9 +156,11 @@ func MergeSortOptions(options ...SortOptions) SortOptions {
 func MergePaginationOptions(options ...PaginationOptions) PaginationOptions {
 	fo := PaginationOptions{}
 	for _, opt := range options {
-		if opt.Offset == 0 && opt.Limit == 0 {
+		if opt.PageSize == 0 && opt.PageNum == 0 && opt.Offset == 0 && opt.Limit == 0 {
 			continue
 		}
+		fo.PageNum = opt.PageNum
+		fo.PageSize = opt.PageSize
 		fo.Offset = opt.Offset
 		fo.Limit = opt.Limit
 	}
diff --git a/pkg/options/options_test.go b/pkg/options/options_test.go
index d2227a875a837c67006eab028f235afcbd1efe5e..981849a0e2625a8bd7e796a22eaa8529d606ef01 100644
--- a/pkg/options/options_test.go
+++ b/pkg/options/options_test.go
@@ -7,6 +7,7 @@ import (
 )
 
 func TestOptions_MergePaginationOptions(t *testing.T) {
+
 	var tt = []struct {
 		name     string
 		options  []PaginationOptions
@@ -23,29 +24,29 @@ func TestOptions_MergePaginationOptions(t *testing.T) {
 			expected: PaginationOptions{},
 		},
 		{
-			name:     "One limit/offset option",
-			options:  []PaginationOptions{{Limit: 10, Offset: 100}},
-			expected: PaginationOptions{Limit: 10, Offset: 100},
+			name:     "One option",
+			options:  []PaginationOptions{{PageNum: 10, PageSize: 100}},
+			expected: PaginationOptions{PageNum: 10, PageSize: 100},
 		},
 		{
-			name:     "Merge limit/offset #1",
-			options:  []PaginationOptions{{Limit: 0, Offset: 0}, {Limit: 10, Offset: 100}},
-			expected: PaginationOptions{Limit: 10, Offset: 100},
+			name:     "Merge #1",
+			options:  []PaginationOptions{{PageNum: 0, PageSize: 0}, {PageNum: 10, PageSize: 100}},
+			expected: PaginationOptions{PageNum: 10, PageSize: 100},
 		},
 		{
-			name:     "Merge limit/offset #2",
-			options:  []PaginationOptions{{Limit: 10, Offset: 100}, {Limit: 0, Offset: 0}},
-			expected: PaginationOptions{Limit: 10, Offset: 100},
+			name:     "Merge #2",
+			options:  []PaginationOptions{{PageNum: 10, PageSize: 100}, {PageNum: 0, PageSize: 0}},
+			expected: PaginationOptions{PageNum: 10, PageSize: 100},
 		},
 		{
-			name:     "Merge limit/offset #3",
-			options:  []PaginationOptions{{Limit: 0, Offset: 0}, {Limit: 10, Offset: 100}, {Limit: 0, Offset: 0}},
-			expected: PaginationOptions{Limit: 10, Offset: 100},
+			name:     "Merge #3",
+			options:  []PaginationOptions{{PageNum: 0, PageSize: 0}, {PageNum: 10, PageSize: 100}, {PageNum: 0, PageSize: 0}},
+			expected: PaginationOptions{PageNum: 10, PageSize: 100},
 		},
 		{
-			name:     "Merge limit/offset #4",
-			options:  []PaginationOptions{{Limit: 10, Offset: 100}, {}},
-			expected: PaginationOptions{Limit: 10, Offset: 100},
+			name:     "Merge #4",
+			options:  []PaginationOptions{{PageNum: 10, PageSize: 100}, {}},
+			expected: PaginationOptions{PageNum: 10, PageSize: 100},
 		},
 	}
 
diff --git a/pkg/organizations/transport/grpc/protobuf_type_converters.microgen.go b/pkg/organizations/transport/grpc/protobuf_type_converters.microgen.go
index 9a35f86e871d4e9b7792aa31590fd8f1b1fd0e12..2c024a9e6973181ccb5ff683b14be4aaad98792c 100644
--- a/pkg/organizations/transport/grpc/protobuf_type_converters.microgen.go
+++ b/pkg/organizations/transport/grpc/protobuf_type_converters.microgen.go
@@ -61,11 +61,33 @@ func ProtoToPtrFilter(protoFilter *pb.Filter) (*organizations.Filter, error) {
 }
 
 func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*common.FindOptions, error) {
-	return options.FindOptionsToPB(opts), nil
+	if opts == nil {
+		return nil, nil
+	}
+	return &common.FindOptions{
+		Sort:     opts.Sort,
+		PageNum:  int32(opts.PageNum),
+		PageSize: int32(opts.PageSize),
+		Offset:   int32(opts.Offset),
+		Limit:    int32(opts.Limit),
+	}, nil
 }
 
 func ProtoToPtrServicesFindOptions(protoOpts *common.FindOptions) (*options.FindOptions, error) {
-	return options.FindOptionsFromPB(protoOpts), nil
+	if protoOpts == nil {
+		return nil, nil
+	}
+	return &options.FindOptions{
+		SortOptions: options.SortOptions{
+			Sort: protoOpts.Sort,
+		},
+		PaginationOptions: options.PaginationOptions{
+			PageNum:  int(protoOpts.PageNum),
+			PageSize: int(protoOpts.PageSize),
+			Offset:   int(protoOpts.Offset),
+			Limit:    int(protoOpts.Limit),
+		},
+	}, nil
 }
 
 func ListPtrOrganizationToProto(orgs []*organizations.Organization) ([]*pb.Organization, error) {
diff --git a/pkg/users/transport/grpc/protobuf_type_converters.microgen.go b/pkg/users/transport/grpc/protobuf_type_converters.microgen.go
index 5f98e2486e50a16049db5ee136cc4d2c943264d7..3a73ddd7680439be98f1e8ca6ec0f4dbb70b076a 100644
--- a/pkg/users/transport/grpc/protobuf_type_converters.microgen.go
+++ b/pkg/users/transport/grpc/protobuf_type_converters.microgen.go
@@ -127,9 +127,27 @@ func ProtoToListPtrUser(protoCreates []*pb.User) ([]*service.User, error) {
 }
 
 func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*common.FindOptions, error) {
-	return options.FindOptionsToPB(opts), nil
+	if opts == nil {
+		return nil, nil
+	}
+	return &common.FindOptions{
+		Sort:     opts.Sort,
+		PageNum:  int32(opts.PageNum),
+		PageSize: int32(opts.PageSize),
+	}, nil
 }
 
 func ProtoToPtrServicesFindOptions(protoOpts *common.FindOptions) (*options.FindOptions, error) {
-	return options.FindOptionsFromPB(protoOpts), nil
+	if protoOpts == nil {
+		return nil, nil
+	}
+	return &options.FindOptions{
+		SortOptions: options.SortOptions{
+			Sort: protoOpts.Sort,
+		},
+		PaginationOptions: options.PaginationOptions{
+			PageNum:  int(protoOpts.PageNum),
+			PageSize: int(protoOpts.PageSize),
+		},
+	}, nil
 }