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