You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@opendal.apache.org by xu...@apache.org on 2023/11/14 16:16:33 UTC

(incubator-opendal) branch main updated: refactor(core): Rename all `Page` to `List` (#3589)

This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new c2040ff38 refactor(core): Rename all `Page` to `List` (#3589)
c2040ff38 is described below

commit c2040ff38c361701fb5ee1d1ca3054a8f6d252fb
Author: Xuanwo <gi...@xuanwo.io>
AuthorDate: Wed Nov 15 00:16:28 2023 +0800

    refactor(core): Rename all `Page` to `List` (#3589)
    
    * Rename API to list
    
    Signed-off-by: Xuanwo <gi...@xuanwo.io>
    
    * Rename pager to lister
    
    Signed-off-by: Xuanwo <gi...@xuanwo.io>
    
    * Rename pager to lister
    
    Signed-off-by: Xuanwo <gi...@xuanwo.io>
    
    * Fix
    
    Signed-off-by: Xuanwo <gi...@xuanwo.io>
    
    * Don't touch upgrade.md
    
    Signed-off-by: Xuanwo <gi...@xuanwo.io>
    
    ---------
    
    Signed-off-by: Xuanwo <gi...@xuanwo.io>
---
 core/src/docs/internals/accessor.rs                | 16 ++---
 core/src/layers/async_backtrace.rs                 |  8 +--
 core/src/layers/await_tree.rs                      |  8 +--
 core/src/layers/blocking.rs                        | 16 ++---
 core/src/layers/chaos.rs                           |  8 +--
 core/src/layers/complete.rs                        | 64 +++++++++----------
 core/src/layers/concurrent_limit.rs                | 12 ++--
 core/src/layers/error_context.rs                   | 18 +++---
 core/src/layers/immutable_index.rs                 | 12 ++--
 core/src/layers/logging.rs                         | 22 +++----
 core/src/layers/madsim.rs                          | 12 ++--
 core/src/layers/metrics.rs                         |  8 +--
 core/src/layers/minitrace.rs                       | 18 +++---
 core/src/layers/oteltrace.rs                       | 12 ++--
 core/src/layers/prometheus.rs                      |  8 +--
 core/src/layers/prometheus_client.rs               |  8 +--
 core/src/layers/retry.rs                           | 38 +++++------
 core/src/layers/throttle.rs                        |  8 +--
 core/src/layers/timeout.rs                         | 14 ++--
 core/src/layers/tracing.rs                         | 12 ++--
 core/src/layers/type_eraser.rs                     | 12 ++--
 core/src/raw/accessor.rs                           | 28 ++++----
 core/src/raw/adapters/kv/backend.rs                | 24 +++----
 core/src/raw/adapters/typed_kv/backend.rs          | 24 +++----
 core/src/raw/layer.rs                              | 28 ++++----
 core/src/raw/oio/{page => list}/api.rs             | 51 ++++++++-------
 core/src/raw/oio/{page => list}/into_flat_page.rs  | 74 +++++++++++-----------
 .../raw/oio/{page => list}/into_hierarchy_pager.rs | 40 ++++++------
 core/src/raw/oio/{page => list}/mod.rs             | 14 ++--
 core/src/raw/oio/mod.rs                            |  4 +-
 core/src/raw/oio/read/api.rs                       |  2 +-
 core/src/raw/oio/read/range_read.rs                |  4 +-
 core/src/services/alluxio/backend.rs               | 10 +--
 core/src/services/alluxio/{pager.rs => lister.rs}  |  8 +--
 core/src/services/alluxio/mod.rs                   |  2 +-
 core/src/services/azblob/backend.rs                | 10 +--
 core/src/services/azblob/{pager.rs => lister.rs}   |  6 +-
 core/src/services/azblob/mod.rs                    |  2 +-
 core/src/services/azdls/backend.rs                 | 10 +--
 core/src/services/azdls/{pager.rs => lister.rs}    |  6 +-
 core/src/services/azdls/mod.rs                     |  2 +-
 core/src/services/azfile/backend.rs                | 10 +--
 core/src/services/azfile/{pager.rs => lister.rs}   |  6 +-
 core/src/services/azfile/mod.rs                    |  2 +-
 core/src/services/cos/backend.rs                   | 10 +--
 core/src/services/cos/{pager.rs => lister.rs}      |  6 +-
 core/src/services/cos/mod.rs                       |  2 +-
 core/src/services/dbfs/backend.rs                  | 10 +--
 core/src/services/dbfs/{pager.rs => lister.rs}     |  6 +-
 core/src/services/dbfs/mod.rs                      |  2 +-
 core/src/services/dropbox/backend.rs               |  4 +-
 core/src/services/fs/backend.rs                    | 14 ++--
 core/src/services/fs/{pager.rs => lister.rs}       |  8 +--
 core/src/services/fs/mod.rs                        |  2 +-
 core/src/services/ftp/backend.rs                   | 10 +--
 core/src/services/ftp/{pager.rs => lister.rs}      |  6 +-
 core/src/services/ftp/mod.rs                       |  2 +-
 core/src/services/gcs/backend.rs                   | 10 +--
 core/src/services/gcs/{pager.rs => lister.rs}      |  8 +--
 core/src/services/gcs/mod.rs                       |  2 +-
 core/src/services/gdrive/backend.rs                | 10 +--
 core/src/services/gdrive/{pager.rs => lister.rs}   |  6 +-
 core/src/services/gdrive/mod.rs                    |  2 +-
 core/src/services/ghac/backend.rs                  |  4 +-
 core/src/services/hdfs/backend.rs                  | 14 ++--
 core/src/services/hdfs/{pager.rs => lister.rs}     |  8 +--
 core/src/services/hdfs/mod.rs                      |  2 +-
 core/src/services/http/backend.rs                  |  4 +-
 core/src/services/ipfs/backend.rs                  |  8 +--
 core/src/services/ipmfs/backend.rs                 | 10 +--
 core/src/services/ipmfs/{pager.rs => lister.rs}    |  6 +-
 core/src/services/ipmfs/mod.rs                     |  2 +-
 core/src/services/obs/backend.rs                   | 10 +--
 core/src/services/obs/{pager.rs => lister.rs}      |  6 +-
 core/src/services/obs/mod.rs                       |  2 +-
 core/src/services/onedrive/backend.rs              | 13 ++--
 core/src/services/onedrive/{pager.rs => lister.rs} |  8 +--
 core/src/services/onedrive/mod.rs                  |  2 +-
 core/src/services/oss/backend.rs                   | 10 +--
 core/src/services/oss/{pager.rs => lister.rs}      |  6 +-
 core/src/services/oss/mod.rs                       |  2 +-
 core/src/services/s3/backend.rs                    | 10 +--
 core/src/services/s3/{pager.rs => lister.rs}       |  6 +-
 core/src/services/s3/mod.rs                        |  2 +-
 core/src/services/sftp/backend.rs                  | 10 +--
 core/src/services/sftp/{pager.rs => lister.rs}     |  8 +--
 core/src/services/sftp/mod.rs                      |  2 +-
 core/src/services/supabase/backend.rs              |  6 +-
 core/src/services/swift/backend.rs                 | 10 +--
 core/src/services/swift/{pager.rs => lister.rs}    |  6 +-
 core/src/services/swift/mod.rs                     |  2 +-
 core/src/services/vercel_artifacts/backend.rs      |  4 +-
 core/src/services/webdav/backend.rs                | 12 ++--
 core/src/services/webdav/{pager.rs => lister.rs}   |  6 +-
 core/src/services/webdav/mod.rs                    |  2 +-
 core/src/services/webhdfs/backend.rs               | 16 ++---
 core/src/services/webhdfs/{pager.rs => lister.rs}  |  8 +--
 core/src/services/webhdfs/mod.rs                   |  2 +-
 core/src/types/list.rs                             | 32 +++++-----
 99 files changed, 541 insertions(+), 541 deletions(-)

diff --git a/core/src/docs/internals/accessor.rs b/core/src/docs/internals/accessor.rs
index bb3fc75b3..7cd50823b 100644
--- a/core/src/docs/internals/accessor.rs
+++ b/core/src/docs/internals/accessor.rs
@@ -29,10 +29,10 @@
 //! #[async_trait]
 //! //                  <----------Trait Bound-------------->
 //! pub trait Accessor: Send + Sync + Debug + Unpin + 'static {
-//!     type Reader: oio::Read;                 // --+
-//!     type BlockingReader: oio::BlockingRead; //   +--> Associated Type
-//!     type Pager: oio::Page;                  //   +
-//!     type BlockingPager: oio::BlockingPage;  // --+
+//!     type Reader: oio::Read;                    // --+
+//!     type BlockingReader: oio::BlockingRead;    //   +--> Associated Type
+//!     type Lister: oio::Lister;                  //   +
+//!     type BlockingLister: oio::BlockingLister;  // --+
 //!
 //!     // APIs
 //!     async fn hello(&self, path: &str, args: OpCreate) -> Result<RpCreate>;
@@ -102,8 +102,8 @@
 //!
 //! - `Reader`: reader returned by `read` operation.
 //! - `BlockingReader`: reader returned by `blocking_read` operation.
-//! - `Pager`: pager returned by `scan` or `list` operation.
-//! - `BlockingPager`: pager returned by `blocking_scan` or `blocking_list` operation.
+//! - `Lister`: lister returned by `scan` or `list` operation.
+//! - `BlockingLister`: lister returned by `blocking_scan` or `blocking_list` operation.
 //!
 //! Implementer of `Accessor` should take care the following things:
 //!
@@ -290,8 +290,8 @@
 //!     type BlockingReader = ();
 //!     type Writer = ();
 //!     type BlockingWriter = ();
-//!     type Pager = ();
-//!     type BlockingPager = ();
+//!     type Lister = ();
+//!     type BlockingLister = ();
 //!
 //!     fn metadata(&self) -> AccessorInfo {
 //!         let mut am = AccessorInfo::default();
diff --git a/core/src/layers/async_backtrace.rs b/core/src/layers/async_backtrace.rs
index 6fc5d3a1a..cd363432e 100644
--- a/core/src/layers/async_backtrace.rs
+++ b/core/src/layers/async_backtrace.rs
@@ -65,8 +65,8 @@ impl<A: Accessor> LayeredAccessor for AsyncBacktraceAccessor<A> {
     type BlockingReader = A::BlockingReader;
     type Writer = A::Writer;
     type BlockingWriter = A::BlockingWriter;
-    type Pager = A::Pager;
-    type BlockingPager = A::BlockingPager;
+    type Lister = A::Lister;
+    type BlockingLister = A::BlockingLister;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -103,7 +103,7 @@ impl<A: Accessor> LayeredAccessor for AsyncBacktraceAccessor<A> {
     }
 
     #[async_backtrace::framed]
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.inner.list(path, args).await
     }
 
@@ -125,7 +125,7 @@ impl<A: Accessor> LayeredAccessor for AsyncBacktraceAccessor<A> {
         self.inner.blocking_write(path, args)
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.inner.blocking_list(path, args)
     }
 }
diff --git a/core/src/layers/await_tree.rs b/core/src/layers/await_tree.rs
index dc50656f6..8d7755d2c 100644
--- a/core/src/layers/await_tree.rs
+++ b/core/src/layers/await_tree.rs
@@ -73,8 +73,8 @@ impl<A: Accessor> LayeredAccessor for AwaitTreeAccessor<A> {
     type BlockingReader = A::BlockingReader;
     type Writer = A::Writer;
     type BlockingWriter = A::BlockingWriter;
-    type Pager = A::Pager;
-    type BlockingPager = A::BlockingPager;
+    type Lister = A::Lister;
+    type BlockingLister = A::BlockingLister;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -122,7 +122,7 @@ impl<A: Accessor> LayeredAccessor for AwaitTreeAccessor<A> {
             .await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.inner
             .list(path, args)
             .instrument_await(format!("opendal::{}", Operation::List))
@@ -151,7 +151,7 @@ impl<A: Accessor> LayeredAccessor for AwaitTreeAccessor<A> {
         self.inner.blocking_write(path, args)
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.inner.blocking_list(path, args)
     }
 }
diff --git a/core/src/layers/blocking.rs b/core/src/layers/blocking.rs
index 9fbf7c006..67281ba25 100644
--- a/core/src/layers/blocking.rs
+++ b/core/src/layers/blocking.rs
@@ -177,8 +177,8 @@ impl<A: Accessor> LayeredAccessor for BlockingAccessor<A> {
     type BlockingReader = BlockingWrapper<A::Reader>;
     type Writer = A::Writer;
     type BlockingWriter = BlockingWrapper<A::Writer>;
-    type Pager = A::Pager;
-    type BlockingPager = BlockingWrapper<A::Pager>;
+    type Lister = A::Lister;
+    type BlockingLister = BlockingWrapper<A::Lister>;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -218,7 +218,7 @@ impl<A: Accessor> LayeredAccessor for BlockingAccessor<A> {
         self.inner.delete(path, args).await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.inner.list(path, args).await
     }
 
@@ -267,11 +267,11 @@ impl<A: Accessor> LayeredAccessor for BlockingAccessor<A> {
         self.handle.block_on(self.inner.delete(path, args))
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.handle.block_on(async {
-            let (rp, pager) = self.inner.list(path, args).await?;
-            let blocking_pager = Self::BlockingPager::new(self.handle.clone(), pager);
-            Ok((rp, blocking_pager))
+            let (rp, lister) = self.inner.list(path, args).await?;
+            let blocking_lister = Self::BlockingLister::new(self.handle.clone(), lister);
+            Ok((rp, blocking_lister))
         })
     }
 }
@@ -313,7 +313,7 @@ impl<I: oio::Write + 'static> oio::BlockingWrite for BlockingWrapper<I> {
     }
 }
 
-impl<I: oio::Page> oio::BlockingPage for BlockingWrapper<I> {
+impl<I: oio::List> oio::BlockingList for BlockingWrapper<I> {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         self.handle.block_on(self.inner.next())
     }
diff --git a/core/src/layers/chaos.rs b/core/src/layers/chaos.rs
index 02d7fb9a5..08ec4dee2 100644
--- a/core/src/layers/chaos.rs
+++ b/core/src/layers/chaos.rs
@@ -106,8 +106,8 @@ impl<A: Accessor> LayeredAccessor for ChaosAccessor<A> {
     type BlockingReader = ChaosReader<A::BlockingReader>;
     type Writer = A::Writer;
     type BlockingWriter = A::BlockingWriter;
-    type Pager = A::Pager;
-    type BlockingPager = A::BlockingPager;
+    type Lister = A::Lister;
+    type BlockingLister = A::BlockingLister;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -134,11 +134,11 @@ impl<A: Accessor> LayeredAccessor for ChaosAccessor<A> {
         self.inner.blocking_write(path, args)
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.inner.list(path, args).await
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.inner.blocking_list(path, args)
     }
 }
diff --git a/core/src/layers/complete.rs b/core/src/layers/complete.rs
index 5e22c4d1a..7fd2037dc 100644
--- a/core/src/layers/complete.rs
+++ b/core/src/layers/complete.rs
@@ -28,8 +28,8 @@ use async_trait::async_trait;
 use bytes::Bytes;
 
 use crate::raw::oio::Entry;
-use crate::raw::oio::FlatPager;
-use crate::raw::oio::HierarchyPager;
+use crate::raw::oio::FlatLister;
+use crate::raw::oio::HierarchyLister;
 use crate::raw::oio::RangeReader;
 use crate::raw::oio::StreamableReader;
 use crate::raw::oio::{into_flat_page, FileReader};
@@ -101,11 +101,11 @@ use crate::*;
 /// them. CompleteLayer will add those capabilities in a zero cost way.
 ///
 /// Underlying services will return [`Capability`] to indicate the
-/// features that returning pagers support.
+/// features that returning listers support.
 ///
 /// - If both `list_without_recursive` and `list_with_recursive`, return directly.
-/// - If only `list_with_recursive`, with [`oio::to_flat_pager`].
-/// - if only `list_without_recursive`, with [`oio::to_hierarchy_pager`].
+/// - If only `list_with_recursive`, with [`oio::to_flat_lister`].
+/// - if only `list_without_recursive`, with [`oio::to_hierarchy_lister`].
 /// - If neither not supported, something must be wrong for `list` is true.
 ///
 /// ## Capability Check
@@ -224,7 +224,7 @@ impl<A: Accessor> CompleteAccessor<A> {
         &self,
         path: &str,
         args: OpList,
-    ) -> Result<(RpList, CompletePager<A, A::Pager>)> {
+    ) -> Result<(RpList, CompleteLister<A, A::Lister>)> {
         let cap = self.meta.full_capability();
         if !cap.list {
             return Err(self.new_unsupported_error(Operation::List));
@@ -242,7 +242,7 @@ impl<A: Accessor> CompleteAccessor<A> {
             // - If recursive is false while services can list_without_recursive
             (_, true, true) | (true, true, _) | (false, _, true) => {
                 let (rp, p) = self.inner.list(path, args).await?;
-                Ok((rp, CompletePager::AlreadyComplete(p)))
+                Ok((rp, CompleteLister::AlreadyComplete(p)))
             }
             // If services can't list_with_recursive nor list_without_recursive.
             //
@@ -251,13 +251,13 @@ impl<A: Accessor> CompleteAccessor<A> {
             // If recursive is true but service can't list_with_recursive
             (true, false, true) => {
                 let p = into_flat_page(self.inner.clone(), path, args.limit().unwrap_or(1000));
-                Ok((RpList::default(), CompletePager::NeedFlat(p)))
+                Ok((RpList::default(), CompleteLister::NeedFlat(p)))
             }
             // If recursive is false but service can't list_without_recursive
             (false, true, false) => {
                 let (_, p) = self.inner.list(path, args.with_recursive(true)).await?;
                 let p = into_hierarchy_page(p, path);
-                Ok((RpList::default(), CompletePager::NeedHierarchy(p)))
+                Ok((RpList::default(), CompleteLister::NeedHierarchy(p)))
             }
         }
     }
@@ -266,7 +266,7 @@ impl<A: Accessor> CompleteAccessor<A> {
         &self,
         path: &str,
         args: OpList,
-    ) -> Result<(RpList, CompletePager<A, A::BlockingPager>)> {
+    ) -> Result<(RpList, CompleteLister<A, A::BlockingLister>)> {
         let cap = self.meta.full_capability();
         if !cap.list {
             return Err(self.new_unsupported_error(Operation::BlockingList));
@@ -284,7 +284,7 @@ impl<A: Accessor> CompleteAccessor<A> {
             // - If recursive is false while services can list_without_recursive
             (_, true, true) | (true, true, _) | (false, _, true) => {
                 let (rp, p) = self.inner.blocking_list(path, args)?;
-                Ok((rp, CompletePager::AlreadyComplete(p)))
+                Ok((rp, CompleteLister::AlreadyComplete(p)))
             }
             // If services can't list_with_recursive nor list_without_recursive.
             //
@@ -293,14 +293,14 @@ impl<A: Accessor> CompleteAccessor<A> {
             // If recursive is true but service can't list_with_recursive
             (true, false, true) => {
                 let p = into_flat_page(self.inner.clone(), path, args.limit().unwrap_or(1000));
-                Ok((RpList::default(), CompletePager::NeedFlat(p)))
+                Ok((RpList::default(), CompleteLister::NeedFlat(p)))
             }
             // If recursive is false but service can't list_without_recursive
             (false, true, false) => {
                 let (_, p) = self.inner.blocking_list(path, args.with_recursive(true))?;
-                let p: HierarchyPager<<A as Accessor>::BlockingPager> =
+                let p: HierarchyLister<<A as Accessor>::BlockingLister> =
                     into_hierarchy_page(p, path);
-                Ok((RpList::default(), CompletePager::NeedHierarchy(p)))
+                Ok((RpList::default(), CompleteLister::NeedHierarchy(p)))
             }
         }
     }
@@ -316,8 +316,8 @@ impl<A: Accessor> LayeredAccessor for CompleteAccessor<A> {
         oio::ExactBufWriter<CompleteWriter<A::Writer>>,
     >;
     type BlockingWriter = CompleteWriter<A::BlockingWriter>;
-    type Pager = CompletePager<A, A::Pager>;
-    type BlockingPager = CompletePager<A, A::BlockingPager>;
+    type Lister = CompleteLister<A, A::Lister>;
+    type BlockingLister = CompleteLister<A, A::BlockingLister>;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -430,7 +430,7 @@ impl<A: Accessor> LayeredAccessor for CompleteAccessor<A> {
         self.inner().delete(path, args).await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         let capability = self.meta.full_capability();
         if !capability.list {
             return Err(self.new_unsupported_error(Operation::List));
@@ -532,7 +532,7 @@ impl<A: Accessor> LayeredAccessor for CompleteAccessor<A> {
         self.inner().blocking_delete(path, args)
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         let capability = self.meta.full_capability();
         if !capability.list || !capability.blocking {
             return Err(self.new_unsupported_error(Operation::BlockingList));
@@ -627,20 +627,20 @@ where
     }
 }
 
-pub enum CompletePager<A: Accessor, P> {
+pub enum CompleteLister<A: Accessor, P> {
     AlreadyComplete(P),
-    NeedFlat(FlatPager<Arc<A>, P>),
-    NeedHierarchy(HierarchyPager<P>),
+    NeedFlat(FlatLister<Arc<A>, P>),
+    NeedHierarchy(HierarchyLister<P>),
 }
 
 #[async_trait]
-impl<A, P> oio::Page for CompletePager<A, P>
+impl<A, P> oio::List for CompleteLister<A, P>
 where
-    A: Accessor<Pager = P>,
-    P: oio::Page,
+    A: Accessor<Lister = P>,
+    P: oio::List,
 {
     async fn next(&mut self) -> Result<Option<Vec<Entry>>> {
-        use CompletePager::*;
+        use CompleteLister::*;
 
         match self {
             AlreadyComplete(p) => p.next().await,
@@ -650,13 +650,13 @@ where
     }
 }
 
-impl<A, P> oio::BlockingPage for CompletePager<A, P>
+impl<A, P> oio::BlockingList for CompleteLister<A, P>
 where
-    A: Accessor<BlockingPager = P>,
-    P: oio::BlockingPage,
+    A: Accessor<BlockingLister = P>,
+    P: oio::BlockingList,
 {
     fn next(&mut self) -> Result<Option<Vec<Entry>>> {
-        use CompletePager::*;
+        use CompleteLister::*;
 
         match self {
             AlreadyComplete(p) => p.next(),
@@ -770,8 +770,8 @@ mod tests {
         type BlockingReader = oio::BlockingReader;
         type Writer = oio::Writer;
         type BlockingWriter = oio::BlockingWriter;
-        type Pager = oio::Pager;
-        type BlockingPager = oio::BlockingPager;
+        type Lister = oio::Lister;
+        type BlockingLister = oio::BlockingLister;
 
         fn info(&self) -> AccessorInfo {
             let mut info = AccessorInfo::default();
@@ -808,7 +808,7 @@ mod tests {
             Ok(RpDelete {})
         }
 
-        async fn list(&self, _: &str, _: OpList) -> Result<(RpList, Self::Pager)> {
+        async fn list(&self, _: &str, _: OpList) -> Result<(RpList, Self::Lister)> {
             Ok((RpList {}, Box::new(())))
         }
 
diff --git a/core/src/layers/concurrent_limit.rs b/core/src/layers/concurrent_limit.rs
index c20ef4108..00f9a9a8c 100644
--- a/core/src/layers/concurrent_limit.rs
+++ b/core/src/layers/concurrent_limit.rs
@@ -86,8 +86,8 @@ impl<A: Accessor> LayeredAccessor for ConcurrentLimitAccessor<A> {
     type BlockingReader = ConcurrentLimitWrapper<A::BlockingReader>;
     type Writer = ConcurrentLimitWrapper<A::Writer>;
     type BlockingWriter = ConcurrentLimitWrapper<A::BlockingWriter>;
-    type Pager = ConcurrentLimitWrapper<A::Pager>;
-    type BlockingPager = ConcurrentLimitWrapper<A::BlockingPager>;
+    type Lister = ConcurrentLimitWrapper<A::Lister>;
+    type BlockingLister = ConcurrentLimitWrapper<A::BlockingLister>;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -151,7 +151,7 @@ impl<A: Accessor> LayeredAccessor for ConcurrentLimitAccessor<A> {
         self.inner.delete(path, args).await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         let permit = self
             .semaphore
             .clone()
@@ -226,7 +226,7 @@ impl<A: Accessor> LayeredAccessor for ConcurrentLimitAccessor<A> {
         self.inner.blocking_delete(path, args)
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         let permit = self
             .semaphore
             .clone()
@@ -309,13 +309,13 @@ impl<R: oio::BlockingWrite> oio::BlockingWrite for ConcurrentLimitWrapper<R> {
 }
 
 #[async_trait]
-impl<R: oio::Page> oio::Page for ConcurrentLimitWrapper<R> {
+impl<R: oio::List> oio::List for ConcurrentLimitWrapper<R> {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         self.inner.next().await
     }
 }
 
-impl<R: oio::BlockingPage> oio::BlockingPage for ConcurrentLimitWrapper<R> {
+impl<R: oio::BlockingList> oio::BlockingList for ConcurrentLimitWrapper<R> {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         self.inner.next()
     }
diff --git a/core/src/layers/error_context.rs b/core/src/layers/error_context.rs
index 9dae975f9..3278d502c 100644
--- a/core/src/layers/error_context.rs
+++ b/core/src/layers/error_context.rs
@@ -25,7 +25,7 @@ use async_trait::async_trait;
 use bytes::Bytes;
 use futures::TryFutureExt;
 
-use crate::raw::oio::PageOperation;
+use crate::raw::oio::ListOperation;
 use crate::raw::oio::ReadOperation;
 use crate::raw::oio::WriteOperation;
 use crate::raw::*;
@@ -70,8 +70,8 @@ impl<A: Accessor> LayeredAccessor for ErrorContextAccessor<A> {
     type BlockingReader = ErrorContextWrapper<A::BlockingReader>;
     type Writer = ErrorContextWrapper<A::Writer>;
     type BlockingWriter = ErrorContextWrapper<A::BlockingWriter>;
-    type Pager = ErrorContextWrapper<A::Pager>;
-    type BlockingPager = ErrorContextWrapper<A::BlockingPager>;
+    type Lister = ErrorContextWrapper<A::Lister>;
+    type BlockingLister = ErrorContextWrapper<A::BlockingLister>;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -183,7 +183,7 @@ impl<A: Accessor> LayeredAccessor for ErrorContextAccessor<A> {
             .await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.inner
             .list(path, args)
             .map_ok(|(rp, p)| {
@@ -320,7 +320,7 @@ impl<A: Accessor> LayeredAccessor for ErrorContextAccessor<A> {
         })
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.inner
             .blocking_list(path, args)
             .map(|(rp, os)| {
@@ -452,20 +452,20 @@ impl<T: oio::BlockingWrite> oio::BlockingWrite for ErrorContextWrapper<T> {
 }
 
 #[async_trait::async_trait]
-impl<T: oio::Page> oio::Page for ErrorContextWrapper<T> {
+impl<T: oio::List> oio::List for ErrorContextWrapper<T> {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         self.inner.next().await.map_err(|err| {
-            err.with_operation(PageOperation::Next)
+            err.with_operation(ListOperation::Next)
                 .with_context("service", self.scheme)
                 .with_context("path", &self.path)
         })
     }
 }
 
-impl<T: oio::BlockingPage> oio::BlockingPage for ErrorContextWrapper<T> {
+impl<T: oio::BlockingList> oio::BlockingList for ErrorContextWrapper<T> {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         self.inner.next().map_err(|err| {
-            err.with_operation(PageOperation::BlockingNext)
+            err.with_operation(ListOperation::BlockingNext)
                 .with_context("service", self.scheme)
                 .with_context("path", &self.path)
         })
diff --git a/core/src/layers/immutable_index.rs b/core/src/layers/immutable_index.rs
index 0186267cd..6137687b8 100644
--- a/core/src/layers/immutable_index.rs
+++ b/core/src/layers/immutable_index.rs
@@ -140,8 +140,8 @@ impl<A: Accessor> LayeredAccessor for ImmutableIndexAccessor<A> {
     type BlockingReader = A::BlockingReader;
     type Writer = A::Writer;
     type BlockingWriter = A::BlockingWriter;
-    type Pager = ImmutableDir;
-    type BlockingPager = ImmutableDir;
+    type Lister = ImmutableDir;
+    type BlockingLister = ImmutableDir;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -163,7 +163,7 @@ impl<A: Accessor> LayeredAccessor for ImmutableIndexAccessor<A> {
         self.inner.read(path, args).await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         let mut path = path;
         if path == "/" {
             path = ""
@@ -190,7 +190,7 @@ impl<A: Accessor> LayeredAccessor for ImmutableIndexAccessor<A> {
         self.inner.blocking_write(path, args)
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         let mut path = path;
         if path == "/" {
             path = ""
@@ -239,13 +239,13 @@ impl ImmutableDir {
 }
 
 #[async_trait]
-impl oio::Page for ImmutableDir {
+impl oio::List for ImmutableDir {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         Ok(self.inner_next_page())
     }
 }
 
-impl oio::BlockingPage for ImmutableDir {
+impl oio::BlockingList for ImmutableDir {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         Ok(self.inner_next_page())
     }
diff --git a/core/src/layers/logging.rs b/core/src/layers/logging.rs
index 78ebc8d4c..b556cc7aa 100644
--- a/core/src/layers/logging.rs
+++ b/core/src/layers/logging.rs
@@ -218,8 +218,8 @@ impl<A: Accessor> LayeredAccessor for LoggingAccessor<A> {
     type BlockingReader = LoggingReader<A::BlockingReader>;
     type Writer = LoggingWriter<A::Writer>;
     type BlockingWriter = LoggingWriter<A::BlockingWriter>;
-    type Pager = LoggingPager<A::Pager>;
-    type BlockingPager = LoggingPager<A::BlockingPager>;
+    type Lister = LoggingLister<A::Lister>;
+    type BlockingLister = LoggingLister<A::BlockingLister>;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -525,7 +525,7 @@ impl<A: Accessor> LayeredAccessor for LoggingAccessor<A> {
             .await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         debug!(
             target: LOGGING_TARGET,
             "service={} operation={} path={} -> started",
@@ -545,7 +545,7 @@ impl<A: Accessor> LayeredAccessor for LoggingAccessor<A> {
                         Operation::List,
                         path
                     );
-                    let streamer = LoggingPager::new(self.ctx.clone(), path, Operation::List, v);
+                    let streamer = LoggingLister::new(self.ctx.clone(), path, Operation::List, v);
                     Ok((rp, streamer))
                 }
                 Err(err) => {
@@ -914,7 +914,7 @@ impl<A: Accessor> LayeredAccessor for LoggingAccessor<A> {
             })
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         debug!(
             target: LOGGING_TARGET,
             "service={} operation={} path={} -> started",
@@ -933,7 +933,7 @@ impl<A: Accessor> LayeredAccessor for LoggingAccessor<A> {
                     Operation::BlockingList,
                     path
                 );
-                let li = LoggingPager::new(self.ctx.clone(), path, Operation::BlockingList, v);
+                let li = LoggingLister::new(self.ctx.clone(), path, Operation::BlockingList, v);
                 (rp, li)
             })
             .map_err(|err| {
@@ -1431,7 +1431,7 @@ impl<W: oio::BlockingWrite> oio::BlockingWrite for LoggingWriter<W> {
     }
 }
 
-pub struct LoggingPager<P> {
+pub struct LoggingLister<P> {
     ctx: LoggingContext,
     path: String,
     op: Operation,
@@ -1440,7 +1440,7 @@ pub struct LoggingPager<P> {
     inner: P,
 }
 
-impl<P> LoggingPager<P> {
+impl<P> LoggingLister<P> {
     fn new(ctx: LoggingContext, path: &str, op: Operation, inner: P) -> Self {
         Self {
             ctx,
@@ -1452,7 +1452,7 @@ impl<P> LoggingPager<P> {
     }
 }
 
-impl<P> Drop for LoggingPager<P> {
+impl<P> Drop for LoggingLister<P> {
     fn drop(&mut self) {
         if self.finished {
             debug!(
@@ -1475,7 +1475,7 @@ impl<P> Drop for LoggingPager<P> {
 }
 
 #[async_trait]
-impl<P: oio::Page> oio::Page for LoggingPager<P> {
+impl<P: oio::List> oio::List for LoggingLister<P> {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         let res = self.inner.next().await;
 
@@ -1519,7 +1519,7 @@ impl<P: oio::Page> oio::Page for LoggingPager<P> {
     }
 }
 
-impl<P: oio::BlockingPage> oio::BlockingPage for LoggingPager<P> {
+impl<P: oio::BlockingList> oio::BlockingList for LoggingLister<P> {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         let res = self.inner.next();
 
diff --git a/core/src/layers/madsim.rs b/core/src/layers/madsim.rs
index 1d1253baf..9eb75da2d 100644
--- a/core/src/layers/madsim.rs
+++ b/core/src/layers/madsim.rs
@@ -149,8 +149,8 @@ impl LayeredAccessor for MadsimAccessor {
     type BlockingReader = ();
     type Writer = MadsimWriter;
     type BlockingWriter = ();
-    type Pager = MadsimPager;
-    type BlockingPager = ();
+    type Lister = MadsimLister;
+    type BlockingLister = ();
 
     fn inner(&self) -> &Self::Inner {
         &()
@@ -217,7 +217,7 @@ impl LayeredAccessor for MadsimAccessor {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> crate::Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> crate::Result<(RpList, Self::Lister)> {
         Err(Error::new(
             ErrorKind::Unsupported,
             "will be supported in the future",
@@ -250,7 +250,7 @@ impl LayeredAccessor for MadsimAccessor {
         &self,
         path: &str,
         args: OpList,
-    ) -> crate::Result<(RpList, Self::BlockingPager)> {
+    ) -> crate::Result<(RpList, Self::BlockingLister)> {
         Err(Error::new(
             ErrorKind::Unsupported,
             "will not be supported in MadsimLayer",
@@ -331,10 +331,10 @@ impl oio::Write for MadsimWriter {
     }
 }
 
-pub struct MadsimPager {}
+pub struct MadsimLister {}
 
 #[async_trait]
-impl oio::Page for MadsimPager {
+impl oio::List for MadsimLister {
     async fn next(&mut self) -> crate::Result<Option<Vec<Entry>>> {
         Err(Error::new(
             ErrorKind::Unsupported,
diff --git a/core/src/layers/metrics.rs b/core/src/layers/metrics.rs
index bcbb72131..b9c67b54e 100644
--- a/core/src/layers/metrics.rs
+++ b/core/src/layers/metrics.rs
@@ -412,8 +412,8 @@ impl<A: Accessor> LayeredAccessor for MetricsAccessor<A> {
     type BlockingReader = MetricWrapper<A::BlockingReader>;
     type Writer = MetricWrapper<A::Writer>;
     type BlockingWriter = MetricWrapper<A::BlockingWriter>;
-    type Pager = A::Pager;
-    type BlockingPager = A::BlockingPager;
+    type Lister = A::Lister;
+    type BlockingLister = A::BlockingLister;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -547,7 +547,7 @@ impl<A: Accessor> LayeredAccessor for MetricsAccessor<A> {
             .await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.handle.requests_total_list.increment(1);
 
         let start = Instant::now();
@@ -709,7 +709,7 @@ impl<A: Accessor> LayeredAccessor for MetricsAccessor<A> {
         })
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.handle.requests_total_blocking_list.increment(1);
 
         let start = Instant::now();
diff --git a/core/src/layers/minitrace.rs b/core/src/layers/minitrace.rs
index 00e1239d2..26df33004 100644
--- a/core/src/layers/minitrace.rs
+++ b/core/src/layers/minitrace.rs
@@ -25,7 +25,7 @@ use bytes::Bytes;
 use futures::FutureExt;
 use minitrace::prelude::*;
 
-use crate::raw::oio::PageOperation;
+use crate::raw::oio::ListOperation;
 use crate::raw::oio::ReadOperation;
 use crate::raw::oio::WriteOperation;
 use crate::raw::*;
@@ -136,8 +136,8 @@ impl<A: Accessor> LayeredAccessor for MinitraceAccessor<A> {
     type BlockingReader = MinitraceWrapper<A::BlockingReader>;
     type Writer = MinitraceWrapper<A::Writer>;
     type BlockingWriter = MinitraceWrapper<A::BlockingWriter>;
-    type Pager = MinitraceWrapper<A::Pager>;
-    type BlockingPager = MinitraceWrapper<A::BlockingPager>;
+    type Lister = MinitraceWrapper<A::Lister>;
+    type BlockingLister = MinitraceWrapper<A::BlockingLister>;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -204,7 +204,7 @@ impl<A: Accessor> LayeredAccessor for MinitraceAccessor<A> {
     }
 
     #[trace(enter_on_poll = true)]
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.inner
             .list(path, args)
             .map(|v| {
@@ -274,7 +274,7 @@ impl<A: Accessor> LayeredAccessor for MinitraceAccessor<A> {
     }
 
     #[trace]
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.inner.blocking_list(path, args).map(|(rp, it)| {
             (
                 rp,
@@ -371,22 +371,22 @@ impl<R: oio::BlockingWrite> oio::BlockingWrite for MinitraceWrapper<R> {
 }
 
 #[async_trait]
-impl<R: oio::Page> oio::Page for MinitraceWrapper<R> {
+impl<R: oio::List> oio::List for MinitraceWrapper<R> {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         self.inner
             .next()
             .in_span(Span::enter_with_parent(
-                PageOperation::Next.into_static(),
+                ListOperation::Next.into_static(),
                 &self.span,
             ))
             .await
     }
 }
 
-impl<R: oio::BlockingPage> oio::BlockingPage for MinitraceWrapper<R> {
+impl<R: oio::BlockingList> oio::BlockingList for MinitraceWrapper<R> {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         let _g = self.span.set_local_parent();
-        let _span = LocalSpan::enter_with_local_parent(PageOperation::BlockingNext.into_static());
+        let _span = LocalSpan::enter_with_local_parent(ListOperation::BlockingNext.into_static());
         self.inner.next()
     }
 }
diff --git a/core/src/layers/oteltrace.rs b/core/src/layers/oteltrace.rs
index 1591ae6af..0244e3190 100644
--- a/core/src/layers/oteltrace.rs
+++ b/core/src/layers/oteltrace.rs
@@ -73,8 +73,8 @@ impl<A: Accessor> LayeredAccessor for OtelTraceAccessor<A> {
     type BlockingReader = OtelTraceWrapper<A::BlockingReader>;
     type Writer = OtelTraceWrapper<A::Writer>;
     type BlockingWriter = OtelTraceWrapper<A::BlockingWriter>;
-    type Pager = OtelTraceWrapper<A::Pager>;
-    type BlockingPager = OtelTraceWrapper<A::BlockingPager>;
+    type Lister = OtelTraceWrapper<A::Lister>;
+    type BlockingLister = OtelTraceWrapper<A::BlockingLister>;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -154,7 +154,7 @@ impl<A: Accessor> LayeredAccessor for OtelTraceAccessor<A> {
         self.inner().delete(path, args).with_context(cx).await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         let tracer = global::tracer("opendal");
         let mut span = tracer.start("list");
         span.set_attribute(KeyValue::new("path", path.to_string()));
@@ -254,7 +254,7 @@ impl<A: Accessor> LayeredAccessor for OtelTraceAccessor<A> {
         })
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         let tracer = global::tracer("opendal");
         let mut span = tracer.start("blocking_list");
         span.set_attribute(KeyValue::new("path", path.to_string()));
@@ -330,13 +330,13 @@ impl<R: oio::BlockingWrite> oio::BlockingWrite for OtelTraceWrapper<R> {
 }
 
 #[async_trait]
-impl<R: oio::Page> oio::Page for OtelTraceWrapper<R> {
+impl<R: oio::List> oio::List for OtelTraceWrapper<R> {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         self.inner.next().await
     }
 }
 
-impl<R: oio::BlockingPage> oio::BlockingPage for OtelTraceWrapper<R> {
+impl<R: oio::BlockingList> oio::BlockingList for OtelTraceWrapper<R> {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         self.inner.next()
     }
diff --git a/core/src/layers/prometheus.rs b/core/src/layers/prometheus.rs
index f26a4af2b..41b7bfc68 100644
--- a/core/src/layers/prometheus.rs
+++ b/core/src/layers/prometheus.rs
@@ -275,8 +275,8 @@ impl<A: Accessor> LayeredAccessor for PrometheusAccessor<A> {
     type BlockingReader = PrometheusMetricWrapper<A::BlockingReader>;
     type Writer = PrometheusMetricWrapper<A::Writer>;
     type BlockingWriter = PrometheusMetricWrapper<A::BlockingWriter>;
-    type Pager = A::Pager;
-    type BlockingPager = A::BlockingPager;
+    type Lister = A::Lister;
+    type BlockingLister = A::BlockingLister;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -429,7 +429,7 @@ impl<A: Accessor> LayeredAccessor for PrometheusAccessor<A> {
         })
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         let labels = self.stats.generate_metric_label(
             self.scheme.into_static(),
             Operation::List.into_static(),
@@ -633,7 +633,7 @@ impl<A: Accessor> LayeredAccessor for PrometheusAccessor<A> {
         })
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         let labels = self.stats.generate_metric_label(
             self.scheme.into_static(),
             Operation::BlockingList.into_static(),
diff --git a/core/src/layers/prometheus_client.rs b/core/src/layers/prometheus_client.rs
index 9cb4b69d1..fa9e7ec3d 100644
--- a/core/src/layers/prometheus_client.rs
+++ b/core/src/layers/prometheus_client.rs
@@ -214,8 +214,8 @@ impl<A: Accessor> LayeredAccessor for PrometheusAccessor<A> {
     type BlockingReader = PrometheusMetricWrapper<A::BlockingReader>;
     type Writer = PrometheusMetricWrapper<A::Writer>;
     type BlockingWriter = PrometheusMetricWrapper<A::BlockingWriter>;
-    type Pager = A::Pager;
-    type BlockingPager = A::BlockingPager;
+    type Lister = A::Lister;
+    type BlockingLister = A::BlockingLister;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -336,7 +336,7 @@ impl<A: Accessor> LayeredAccessor for PrometheusAccessor<A> {
         })
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.metrics
             .increment_request_total(self.scheme, Operation::List);
         let start_time = Instant::now();
@@ -493,7 +493,7 @@ impl<A: Accessor> LayeredAccessor for PrometheusAccessor<A> {
         })
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.metrics
             .increment_request_total(self.scheme, Operation::BlockingList);
         let start_time = Instant::now();
diff --git a/core/src/layers/retry.rs b/core/src/layers/retry.rs
index 96c6e144a..d0162ccdf 100644
--- a/core/src/layers/retry.rs
+++ b/core/src/layers/retry.rs
@@ -35,7 +35,7 @@ use bytes::Bytes;
 use futures::FutureExt;
 use log::warn;
 
-use crate::raw::oio::PageOperation;
+use crate::raw::oio::ListOperation;
 use crate::raw::oio::ReadOperation;
 use crate::raw::oio::WriteOperation;
 use crate::raw::*;
@@ -284,8 +284,8 @@ impl<A: Accessor, I: RetryInterceptor> LayeredAccessor for RetryAccessor<A, I> {
     type BlockingReader = RetryWrapper<A::BlockingReader, I>;
     type Writer = RetryWrapper<A::Writer, I>;
     type BlockingWriter = RetryWrapper<A::BlockingWriter, I>;
-    type Pager = RetryWrapper<A::Pager, I>;
-    type BlockingPager = RetryWrapper<A::BlockingPager, I>;
+    type Lister = RetryWrapper<A::Lister, I>;
+    type BlockingLister = RetryWrapper<A::BlockingLister, I>;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -432,7 +432,7 @@ impl<A: Accessor, I: RetryInterceptor> LayeredAccessor for RetryAccessor<A, I> {
             .await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         { || self.inner.list(path, args.clone()) }
             .retry(&self.builder)
             .when(|e| e.is_temporary())
@@ -445,9 +445,9 @@ impl<A: Accessor, I: RetryInterceptor> LayeredAccessor for RetryAccessor<A, I> {
             })
             .map(|v| {
                 v.map(|(l, p)| {
-                    let pager =
+                    let lister =
                         RetryWrapper::new(p, self.notify.clone(), path, self.builder.clone());
-                    (l, pager)
+                    (l, lister)
                 })
                 .map_err(|e| e.set_persistent())
             })
@@ -622,7 +622,7 @@ impl<A: Accessor, I: RetryInterceptor> LayeredAccessor for RetryAccessor<A, I> {
             .map_err(|e| e.set_persistent())
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         { || self.inner.blocking_list(path, args.clone()) }
             .retry(&self.builder)
             .when(|e| e.is_temporary())
@@ -1050,7 +1050,7 @@ impl<R: oio::BlockingWrite, I: RetryInterceptor> oio::BlockingWrite for RetryWra
 }
 
 #[async_trait]
-impl<P: oio::Page, I: RetryInterceptor> oio::Page for RetryWrapper<P, I> {
+impl<P: oio::List, I: RetryInterceptor> oio::List for RetryWrapper<P, I> {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         let mut backoff = self.builder.build();
 
@@ -1065,7 +1065,7 @@ impl<P: oio::Page, I: RetryInterceptor> oio::Page for RetryWrapper<P, I> {
                             &e,
                             dur,
                             &[
-                                ("operation", PageOperation::Next.into_static()),
+                                ("operation", ListOperation::Next.into_static()),
                                 ("path", &self.path),
                             ],
                         );
@@ -1078,7 +1078,7 @@ impl<P: oio::Page, I: RetryInterceptor> oio::Page for RetryWrapper<P, I> {
     }
 }
 
-impl<P: oio::BlockingPage, I: RetryInterceptor> oio::BlockingPage for RetryWrapper<P, I> {
+impl<P: oio::BlockingList, I: RetryInterceptor> oio::BlockingList for RetryWrapper<P, I> {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         { || self.inner.next() }
             .retry(&self.builder)
@@ -1088,7 +1088,7 @@ impl<P: oio::BlockingPage, I: RetryInterceptor> oio::BlockingPage for RetryWrapp
                     err,
                     dur,
                     &[
-                        ("operation", PageOperation::BlockingNext.into_static()),
+                        ("operation", ListOperation::BlockingNext.into_static()),
                         ("path", &self.path),
                     ],
                 );
@@ -1145,8 +1145,8 @@ mod tests {
         type BlockingReader = ();
         type Writer = ();
         type BlockingWriter = ();
-        type Pager = MockPager;
-        type BlockingPager = ();
+        type Lister = MockLister;
+        type BlockingLister = ();
 
         fn info(&self) -> AccessorInfo {
             let mut am = AccessorInfo::default();
@@ -1172,9 +1172,9 @@ mod tests {
             ))
         }
 
-        async fn list(&self, _: &str, _: OpList) -> Result<(RpList, Self::Pager)> {
-            let pager = MockPager::default();
-            Ok((RpList::default(), pager))
+        async fn list(&self, _: &str, _: OpList) -> Result<(RpList, Self::Lister)> {
+            let lister = MockLister::default();
+            Ok((RpList::default(), lister))
         }
 
         async fn batch(&self, op: OpBatch) -> Result<RpBatch> {
@@ -1291,17 +1291,17 @@ mod tests {
     }
 
     #[derive(Debug, Clone, Default)]
-    struct MockPager {
+    struct MockLister {
         attempt: usize,
     }
     #[async_trait]
-    impl oio::Page for MockPager {
+    impl oio::List for MockLister {
         async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
             self.attempt += 1;
             match self.attempt {
                 1 => Err(Error::new(
                     ErrorKind::RateLimited,
-                    "retryable rate limited error from pager",
+                    "retryable rate limited error from lister",
                 )
                 .set_temporary()),
                 2 => {
diff --git a/core/src/layers/throttle.rs b/core/src/layers/throttle.rs
index 708d5980b..d76428b39 100644
--- a/core/src/layers/throttle.rs
+++ b/core/src/layers/throttle.rs
@@ -120,8 +120,8 @@ impl<A: Accessor> LayeredAccessor for ThrottleAccessor<A> {
     type BlockingReader = ThrottleWrapper<A::BlockingReader>;
     type Writer = ThrottleWrapper<A::Writer>;
     type BlockingWriter = ThrottleWrapper<A::BlockingWriter>;
-    type Pager = A::Pager;
-    type BlockingPager = A::BlockingPager;
+    type Lister = A::Lister;
+    type BlockingLister = A::BlockingLister;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -145,7 +145,7 @@ impl<A: Accessor> LayeredAccessor for ThrottleAccessor<A> {
             .map(|(rp, w)| (rp, ThrottleWrapper::new(w, limiter)))
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.inner.list(path, args).await
     }
 
@@ -165,7 +165,7 @@ impl<A: Accessor> LayeredAccessor for ThrottleAccessor<A> {
             .map(|(rp, w)| (rp, ThrottleWrapper::new(w, limiter)))
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.inner.blocking_list(path, args)
     }
 }
diff --git a/core/src/layers/timeout.rs b/core/src/layers/timeout.rs
index 2cabf36af..64b55ff18 100644
--- a/core/src/layers/timeout.rs
+++ b/core/src/layers/timeout.rs
@@ -24,7 +24,7 @@ use std::time::Instant;
 use async_trait::async_trait;
 use bytes::Bytes;
 
-use crate::raw::oio::PageOperation;
+use crate::raw::oio::ListOperation;
 use crate::raw::oio::ReadOperation;
 use crate::raw::oio::WriteOperation;
 use crate::raw::*;
@@ -146,8 +146,8 @@ impl<A: Accessor> LayeredAccessor for TimeoutAccessor<A> {
     type BlockingReader = A::BlockingReader;
     type Writer = TimeoutWrapper<A::Writer>;
     type BlockingWriter = A::BlockingWriter;
-    type Pager = TimeoutWrapper<A::Pager>;
-    type BlockingPager = A::BlockingPager;
+    type Lister = TimeoutWrapper<A::Lister>;
+    type BlockingLister = A::BlockingLister;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -177,7 +177,7 @@ impl<A: Accessor> LayeredAccessor for TimeoutAccessor<A> {
             .map(|(rp, r)| (rp, TimeoutWrapper::new(r, self.timeout, self.speed)))
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         tokio::time::timeout(self.timeout, self.inner.list(path, args))
             .await
             .map_err(|_| {
@@ -197,7 +197,7 @@ impl<A: Accessor> LayeredAccessor for TimeoutAccessor<A> {
         self.inner.blocking_write(path, args)
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.inner.blocking_list(path, args)
     }
 }
@@ -416,13 +416,13 @@ impl<R: oio::Write> oio::Write for TimeoutWrapper<R> {
 }
 
 #[async_trait]
-impl<R: oio::Page> oio::Page for TimeoutWrapper<R> {
+impl<R: oio::List> oio::List for TimeoutWrapper<R> {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         tokio::time::timeout(self.timeout, self.inner.next())
             .await
             .map_err(|_| {
                 Error::new(ErrorKind::Unexpected, "operation timeout")
-                    .with_operation(PageOperation::Next)
+                    .with_operation(ListOperation::Next)
                     .with_context("timeout", self.timeout.as_secs_f64().to_string())
                     .set_temporary()
             })?
diff --git a/core/src/layers/tracing.rs b/core/src/layers/tracing.rs
index 9bb0b54c2..418be8235 100644
--- a/core/src/layers/tracing.rs
+++ b/core/src/layers/tracing.rs
@@ -137,8 +137,8 @@ impl<A: Accessor> LayeredAccessor for TracingAccessor<A> {
     type BlockingReader = TracingWrapper<A::BlockingReader>;
     type Writer = TracingWrapper<A::Writer>;
     type BlockingWriter = TracingWrapper<A::BlockingWriter>;
-    type Pager = TracingWrapper<A::Pager>;
-    type BlockingPager = TracingWrapper<A::BlockingPager>;
+    type Lister = TracingWrapper<A::Lister>;
+    type BlockingLister = TracingWrapper<A::BlockingLister>;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -191,7 +191,7 @@ impl<A: Accessor> LayeredAccessor for TracingAccessor<A> {
     }
 
     #[tracing::instrument(level = "debug", skip(self))]
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.inner
             .list(path, args)
             .map(|v| v.map(|(rp, s)| (rp, TracingWrapper::new(Span::current(), s))))
@@ -248,7 +248,7 @@ impl<A: Accessor> LayeredAccessor for TracingAccessor<A> {
     }
 
     #[tracing::instrument(level = "debug", skip(self))]
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.inner
             .blocking_list(path, args)
             .map(|(rp, it)| (rp, TracingWrapper::new(Span::current(), it)))
@@ -364,14 +364,14 @@ impl<R: oio::BlockingWrite> oio::BlockingWrite for TracingWrapper<R> {
 }
 
 #[async_trait]
-impl<R: oio::Page> oio::Page for TracingWrapper<R> {
+impl<R: oio::List> oio::List for TracingWrapper<R> {
     #[tracing::instrument(parent = &self.span, level = "debug", skip_all)]
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         self.inner.next().await
     }
 }
 
-impl<R: oio::BlockingPage> oio::BlockingPage for TracingWrapper<R> {
+impl<R: oio::BlockingList> oio::BlockingList for TracingWrapper<R> {
     #[tracing::instrument(parent = &self.span, level = "debug", skip_all)]
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         self.inner.next()
diff --git a/core/src/layers/type_eraser.rs b/core/src/layers/type_eraser.rs
index 9561700c7..68cb24859 100644
--- a/core/src/layers/type_eraser.rs
+++ b/core/src/layers/type_eraser.rs
@@ -59,8 +59,8 @@ impl<A: Accessor> LayeredAccessor for TypeEraseAccessor<A> {
     type BlockingReader = oio::BlockingReader;
     type Writer = oio::Writer;
     type BlockingWriter = oio::BlockingWriter;
-    type Pager = oio::Pager;
-    type BlockingPager = oio::BlockingPager;
+    type Lister = oio::Lister;
+    type BlockingLister = oio::BlockingLister;
 
     fn inner(&self) -> &Self::Inner {
         &self.inner
@@ -80,11 +80,11 @@ impl<A: Accessor> LayeredAccessor for TypeEraseAccessor<A> {
             .map(|(rp, w)| (rp, Box::new(w) as oio::Writer))
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.inner
             .list(path, args)
             .await
-            .map(|(rp, p)| (rp, Box::new(p) as oio::Pager))
+            .map(|(rp, p)| (rp, Box::new(p) as oio::Lister))
     }
 
     fn blocking_read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::BlockingReader)> {
@@ -99,9 +99,9 @@ impl<A: Accessor> LayeredAccessor for TypeEraseAccessor<A> {
             .map(|(rp, w)| (rp, Box::new(w) as oio::BlockingWriter))
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.inner
             .blocking_list(path, args)
-            .map(|(rp, p)| (rp, Box::new(p) as oio::BlockingPager))
+            .map(|(rp, p)| (rp, Box::new(p) as oio::BlockingLister))
     }
 }
diff --git a/core/src/raw/accessor.rs b/core/src/raw/accessor.rs
index 6fed93b58..5ff1ab802 100644
--- a/core/src/raw/accessor.rs
+++ b/core/src/raw/accessor.rs
@@ -65,11 +65,11 @@ pub trait Accessor: Send + Sync + Debug + Unpin + 'static {
     /// BlockingWriter is the associated writer the could return in
     /// `blocking_write` operation.
     type BlockingWriter: oio::BlockingWrite;
-    /// Pager is the associated page that return in `list` operation.
-    type Pager: oio::Page;
-    /// BlockingPager is the associated pager that could return in
+    /// Lister is the associated lister that return in `list` operation.
+    type Lister: oio::List;
+    /// BlockingLister is the associated lister that could return in
     /// `blocking_list` operation.
-    type BlockingPager: oio::BlockingPage;
+    type BlockingLister: oio::BlockingList;
 
     /// Invoke the `info` operation to get metadata of accessor.
     ///
@@ -209,7 +209,7 @@ pub trait Accessor: Send + Sync + Debug + Unpin + 'static {
     ///
     /// - Input path MUST be dir path, DON'T NEED to check mode.
     /// - List non-exist dir should return Empty.
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         let (_, _) = (path, args);
 
         Err(Error::new(
@@ -353,7 +353,7 @@ pub trait Accessor: Send + Sync + Debug + Unpin + 'static {
     /// # Behavior
     ///
     /// - List non-exist dir should return Empty.
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         let (_, _) = (path, args);
 
         Err(Error::new(
@@ -370,8 +370,8 @@ impl Accessor for () {
     type BlockingReader = ();
     type Writer = ();
     type BlockingWriter = ();
-    type Pager = ();
-    type BlockingPager = ();
+    type Lister = ();
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         AccessorInfo {
@@ -392,8 +392,8 @@ impl<T: Accessor + ?Sized> Accessor for Arc<T> {
     type BlockingReader = T::BlockingReader;
     type Writer = T::Writer;
     type BlockingWriter = T::BlockingWriter;
-    type Pager = T::Pager;
-    type BlockingPager = T::BlockingPager;
+    type Lister = T::Lister;
+    type BlockingLister = T::BlockingLister;
 
     fn info(&self) -> AccessorInfo {
         self.as_ref().info()
@@ -424,7 +424,7 @@ impl<T: Accessor + ?Sized> Accessor for Arc<T> {
     async fn delete(&self, path: &str, args: OpDelete) -> Result<RpDelete> {
         self.as_ref().delete(path, args).await
     }
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         self.as_ref().list(path, args).await
     }
 
@@ -460,7 +460,7 @@ impl<T: Accessor + ?Sized> Accessor for Arc<T> {
     fn blocking_delete(&self, path: &str, args: OpDelete) -> Result<RpDelete> {
         self.as_ref().blocking_delete(path, args)
     }
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         self.as_ref().blocking_list(path, args)
     }
 }
@@ -472,8 +472,8 @@ pub type FusedAccessor = Arc<
         BlockingReader = oio::BlockingReader,
         Writer = oio::Writer,
         BlockingWriter = oio::BlockingWriter,
-        Pager = oio::Pager,
-        BlockingPager = oio::BlockingPager,
+        Lister = oio::Lister,
+        BlockingLister = oio::BlockingLister,
     >,
 >;
 
diff --git a/core/src/raw/adapters/kv/backend.rs b/core/src/raw/adapters/kv/backend.rs
index a05dee052..4360e6f39 100644
--- a/core/src/raw/adapters/kv/backend.rs
+++ b/core/src/raw/adapters/kv/backend.rs
@@ -68,8 +68,8 @@ impl<S: Adapter> Accessor for Backend<S> {
     type BlockingReader = oio::Cursor;
     type Writer = KvWriter<S>;
     type BlockingWriter = KvWriter<S>;
-    type Pager = KvPager;
-    type BlockingPager = KvPager;
+    type Lister = KvLister;
+    type BlockingLister = KvLister;
 
     fn info(&self) -> AccessorInfo {
         let mut am: AccessorInfo = self.kv.metadata().into();
@@ -202,20 +202,20 @@ impl<S: Adapter> Accessor for Backend<S> {
         Ok(RpDelete::default())
     }
 
-    async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Lister)> {
         let p = build_abs_path(&self.root, path);
         let res = self.kv.scan(&p).await?;
-        let pager = KvPager::new(&self.root, res);
+        let lister = KvLister::new(&self.root, res);
 
-        Ok((RpList::default(), pager))
+        Ok((RpList::default(), lister))
     }
 
-    fn blocking_list(&self, path: &str, _: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, _: OpList) -> Result<(RpList, Self::BlockingLister)> {
         let p = build_abs_path(&self.root, path);
         let res = self.kv.blocking_scan(&p)?;
-        let pager = KvPager::new(&self.root, res);
+        let lister = KvLister::new(&self.root, res);
 
-        Ok((RpList::default(), pager))
+        Ok((RpList::default(), lister))
     }
 
     async fn rename(&self, from: &str, to: &str, _: OpRename) -> Result<RpRename> {
@@ -301,12 +301,12 @@ where
     }
 }
 
-pub struct KvPager {
+pub struct KvLister {
     root: String,
     inner: Option<Vec<String>>,
 }
 
-impl KvPager {
+impl KvLister {
     fn new(root: &str, inner: Vec<String>) -> Self {
         Self {
             root: root.to_string(),
@@ -335,13 +335,13 @@ impl KvPager {
 }
 
 #[async_trait]
-impl oio::Page for KvPager {
+impl oio::List for KvLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         Ok(self.inner_next_page())
     }
 }
 
-impl oio::BlockingPage for KvPager {
+impl oio::BlockingList for KvLister {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         Ok(self.inner_next_page())
     }
diff --git a/core/src/raw/adapters/typed_kv/backend.rs b/core/src/raw/adapters/typed_kv/backend.rs
index 8d2343026..2a1da5966 100644
--- a/core/src/raw/adapters/typed_kv/backend.rs
+++ b/core/src/raw/adapters/typed_kv/backend.rs
@@ -62,8 +62,8 @@ impl<S: Adapter> Accessor for Backend<S> {
     type BlockingReader = oio::Cursor;
     type Writer = KvWriter<S>;
     type BlockingWriter = KvWriter<S>;
-    type Pager = KvPager;
-    type BlockingPager = KvPager;
+    type Lister = KvLister;
+    type BlockingLister = KvLister;
 
     fn info(&self) -> AccessorInfo {
         let kv_info = self.kv.info();
@@ -205,20 +205,20 @@ impl<S: Adapter> Accessor for Backend<S> {
         Ok(RpDelete::default())
     }
 
-    async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Lister)> {
         let p = build_abs_path(&self.root, path);
         let res = self.kv.scan(&p).await?;
-        let pager = KvPager::new(&self.root, res);
+        let lister = KvLister::new(&self.root, res);
 
-        Ok((RpList::default(), pager))
+        Ok((RpList::default(), lister))
     }
 
-    fn blocking_list(&self, path: &str, _: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, _: OpList) -> Result<(RpList, Self::BlockingLister)> {
         let p = build_abs_path(&self.root, path);
         let res = self.kv.blocking_scan(&p)?;
-        let pager = KvPager::new(&self.root, res);
+        let lister = KvLister::new(&self.root, res);
 
-        Ok((RpList::default(), pager))
+        Ok((RpList::default(), lister))
     }
 
     async fn rename(&self, from: &str, to: &str, _: OpRename) -> Result<RpRename> {
@@ -302,12 +302,12 @@ where
     }
 }
 
-pub struct KvPager {
+pub struct KvLister {
     root: String,
     inner: Option<Vec<String>>,
 }
 
-impl KvPager {
+impl KvLister {
     fn new(root: &str, inner: Vec<String>) -> Self {
         Self {
             root: root.to_string(),
@@ -336,13 +336,13 @@ impl KvPager {
 }
 
 #[async_trait]
-impl oio::Page for KvPager {
+impl oio::List for KvLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         Ok(self.inner_next_page())
     }
 }
 
-impl oio::BlockingPage for KvPager {
+impl oio::BlockingList for KvLister {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         Ok(self.inner_next_page())
     }
diff --git a/core/src/raw/layer.rs b/core/src/raw/layer.rs
index 7d0c40a20..48619c9be 100644
--- a/core/src/raw/layer.rs
+++ b/core/src/raw/layer.rs
@@ -61,8 +61,8 @@ use crate::*;
 ///     type BlockingReader = A::BlockingReader;
 ///     type Writer = A::Writer;
 ///     type BlockingWriter = A::BlockingWriter;
-///     type Pager = A::Pager;
-///     type BlockingPager = A::BlockingPager;
+///     type Lister = A::Lister;
+///     type BlockingLister = A::BlockingLister;
 ///
 ///     fn inner(&self) -> &Self::Inner {
 ///         &self.inner
@@ -92,11 +92,11 @@ use crate::*;
 ///         self.inner.blocking_write(path, args)
 ///     }
 ///
-///     async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+///     async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
 ///         self.inner.list(path, args).await
 ///     }
 ///
-///     fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+///     fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
 ///         self.inner.blocking_list(path, args)
 ///     }
 /// }
@@ -132,8 +132,8 @@ pub trait LayeredAccessor: Send + Sync + Debug + Unpin + 'static {
     type BlockingReader: oio::BlockingRead;
     type Writer: oio::Write;
     type BlockingWriter: oio::BlockingWrite;
-    type Pager: oio::Page;
-    type BlockingPager: oio::BlockingPage;
+    type Lister: oio::List;
+    type BlockingLister: oio::BlockingList;
 
     fn inner(&self) -> &Self::Inner;
 
@@ -165,7 +165,7 @@ pub trait LayeredAccessor: Send + Sync + Debug + Unpin + 'static {
         self.inner().delete(path, args).await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)>;
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)>;
 
     async fn batch(&self, args: OpBatch) -> Result<RpBatch> {
         self.inner().batch(args).await
@@ -199,7 +199,7 @@ pub trait LayeredAccessor: Send + Sync + Debug + Unpin + 'static {
         self.inner().blocking_delete(path, args)
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)>;
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)>;
 }
 
 #[async_trait]
@@ -208,8 +208,8 @@ impl<L: LayeredAccessor> Accessor for L {
     type BlockingReader = L::BlockingReader;
     type Writer = L::Writer;
     type BlockingWriter = L::BlockingWriter;
-    type Pager = L::Pager;
-    type BlockingPager = L::BlockingPager;
+    type Lister = L::Lister;
+    type BlockingLister = L::BlockingLister;
 
     fn info(&self) -> AccessorInfo {
         (self as &L).metadata()
@@ -243,7 +243,7 @@ impl<L: LayeredAccessor> Accessor for L {
         (self as &L).delete(path, args).await
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         (self as &L).list(path, args).await
     }
 
@@ -283,7 +283,7 @@ impl<L: LayeredAccessor> Accessor for L {
         (self as &L).blocking_delete(path, args)
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         (self as &L).blocking_list(path, args)
     }
 }
@@ -321,8 +321,8 @@ mod tests {
         type BlockingReader = ();
         type Writer = ();
         type BlockingWriter = ();
-        type Pager = ();
-        type BlockingPager = ();
+        type Lister = ();
+        type BlockingLister = ();
 
         fn info(&self) -> AccessorInfo {
             let mut am = AccessorInfo::default();
diff --git a/core/src/raw/oio/page/api.rs b/core/src/raw/oio/list/api.rs
similarity index 70%
rename from core/src/raw/oio/page/api.rs
rename to core/src/raw/oio/list/api.rs
index 62a265404..c08f5d294 100644
--- a/core/src/raw/oio/page/api.rs
+++ b/core/src/raw/oio/list/api.rs
@@ -23,44 +23,43 @@ use async_trait::async_trait;
 use crate::raw::oio::Entry;
 use crate::*;
 
-/// PageOperation is the name for APIs of pager.
+/// PageOperation is the name for APIs of lister.
 #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
 #[non_exhaustive]
-pub enum PageOperation {
-    /// Operation for [`Page::next`]
+pub enum ListOperation {
+    /// Operation for [`List::next`]
     Next,
-    /// Operation for [`BlockingPage::next`]
+    /// Operation for [`BlockingList::next`]
     BlockingNext,
 }
 
-impl PageOperation {
+impl ListOperation {
     /// Convert self into static str.
     pub fn into_static(self) -> &'static str {
         self.into()
     }
 }
 
-impl Display for PageOperation {
+impl Display for ListOperation {
     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
         write!(f, "{}", self.into_static())
     }
 }
 
-impl From<PageOperation> for &'static str {
-    fn from(v: PageOperation) -> &'static str {
-        use PageOperation::*;
+impl From<ListOperation> for &'static str {
+    fn from(v: ListOperation) -> &'static str {
+        use ListOperation::*;
 
         match v {
-            Next => "Pager::next",
-            BlockingNext => "BlockingPager::next",
+            Next => "List::next",
+            BlockingNext => "List::next",
         }
     }
 }
 
-/// Page trait is used by [`raw::Accessor`] to implement `list`
-/// or `scan` operation.
+/// Page trait is used by [`raw::Accessor`] to implement `list` operation.
 #[async_trait]
-pub trait Page: Send + Sync + 'static {
+pub trait List: Send + Sync + 'static {
     /// Fetch a new page of [`Entry`]
     ///
     /// `Ok(None)` means all pages have been returned. Any following call
@@ -68,25 +67,25 @@ pub trait Page: Send + Sync + 'static {
     async fn next(&mut self) -> Result<Option<Vec<Entry>>>;
 }
 
-/// The boxed version of [`Page`]
-pub type Pager = Box<dyn Page>;
+/// The boxed version of [`List`]
+pub type Lister = Box<dyn List>;
 
 #[async_trait]
-impl<P: Page + ?Sized> Page for Box<P> {
+impl<P: List + ?Sized> List for Box<P> {
     async fn next(&mut self) -> Result<Option<Vec<Entry>>> {
         (**self).next().await
     }
 }
 
 #[async_trait]
-impl Page for () {
+impl List for () {
     async fn next(&mut self) -> Result<Option<Vec<Entry>>> {
         Ok(None)
     }
 }
 
 #[async_trait]
-impl<P: Page> Page for Option<P> {
+impl<P: List> List for Option<P> {
     async fn next(&mut self) -> Result<Option<Vec<Entry>>> {
         match self {
             Some(p) => p.next().await,
@@ -95,8 +94,8 @@ impl<P: Page> Page for Option<P> {
     }
 }
 
-/// BlockingPage is the blocking version of [`Page`].
-pub trait BlockingPage: Send + 'static {
+/// BlockingList is the blocking version of [`List`].
+pub trait BlockingList: Send + 'static {
     /// Fetch a new page of [`Entry`]
     ///
     /// `Ok(None)` means all pages have been returned. Any following call
@@ -104,22 +103,22 @@ pub trait BlockingPage: Send + 'static {
     fn next(&mut self) -> Result<Option<Vec<Entry>>>;
 }
 
-/// BlockingPager is a boxed [`BlockingPage`]
-pub type BlockingPager = Box<dyn BlockingPage>;
+/// BlockingLister is a boxed [`BlockingList`]
+pub type BlockingLister = Box<dyn BlockingList>;
 
-impl<P: BlockingPage + ?Sized> BlockingPage for Box<P> {
+impl<P: BlockingList + ?Sized> BlockingList for Box<P> {
     fn next(&mut self) -> Result<Option<Vec<Entry>>> {
         (**self).next()
     }
 }
 
-impl BlockingPage for () {
+impl BlockingList for () {
     fn next(&mut self) -> Result<Option<Vec<Entry>>> {
         Ok(None)
     }
 }
 
-impl<P: BlockingPage> BlockingPage for Option<P> {
+impl<P: BlockingList> BlockingList for Option<P> {
     fn next(&mut self) -> Result<Option<Vec<Entry>>> {
         match self {
             Some(p) => p.next(),
diff --git a/core/src/raw/oio/page/into_flat_page.rs b/core/src/raw/oio/list/into_flat_page.rs
similarity index 82%
rename from core/src/raw/oio/page/into_flat_page.rs
rename to core/src/raw/oio/list/into_flat_page.rs
index 4af725043..ee9966b4c 100644
--- a/core/src/raw/oio/page/into_flat_page.rs
+++ b/core/src/raw/oio/list/into_flat_page.rs
@@ -23,8 +23,8 @@ use async_trait::async_trait;
 use crate::raw::*;
 use crate::*;
 
-/// to_flat_pager is used to make a hierarchy pager flat.
-pub fn into_flat_page<A: Accessor, P>(acc: A, path: &str, size: usize) -> FlatPager<A, P> {
+/// to_flat_lister is used to make a hierarchy lister flat.
+pub fn into_flat_page<A: Accessor, P>(acc: A, path: &str, size: usize) -> FlatLister<A, P> {
     #[cfg(debug_assertions)]
     {
         let meta = acc.info();
@@ -34,17 +34,17 @@ pub fn into_flat_page<A: Accessor, P>(acc: A, path: &str, size: usize) -> FlatPa
         );
     }
 
-    FlatPager {
+    FlatLister {
         acc,
         size,
         root: path.to_string(),
         dirs: VecDeque::from([oio::Entry::new(path, Metadata::new(EntryMode::DIR))]),
-        pagers: vec![],
+        listers: vec![],
         res: Vec::with_capacity(size),
     }
 }
 
-/// ToFlatPager will walk dir in bottom up way:
+/// ToFlatLister will walk dir in bottom up way:
 ///
 /// - List nested dir first
 /// - Go back into parent dirs one by one
@@ -61,7 +61,7 @@ pub fn into_flat_page<A: Accessor, P>(acc: A, path: &str, size: usize) -> FlatPa
 /// └── file_a
 /// ```
 ///
-/// ToFlatPager will output entries like:
+/// ToFlatLister will output entries like:
 ///
 /// ```txt
 /// dir_x/dir_y/dir_z/file_c
@@ -77,33 +77,33 @@ pub fn into_flat_page<A: Accessor, P>(acc: A, path: &str, size: usize) -> FlatPa
 /// There is no guarantee about the order between files and dirs at the same level.
 /// We only make sure the nested dirs will show up before parent dirs.
 ///
-/// Especially, for storage services that can't return dirs first, ToFlatPager
+/// Especially, for storage services that can't return dirs first, ToFlatLister
 /// may output parent dirs' files before nested dirs, this is expected because files
 /// always output directly while listing.
-pub struct FlatPager<A: Accessor, P> {
+pub struct FlatLister<A: Accessor, P> {
     acc: A,
     size: usize,
     root: String,
     dirs: VecDeque<oio::Entry>,
-    pagers: Vec<(P, oio::Entry, Vec<oio::Entry>)>,
+    listers: Vec<(P, oio::Entry, Vec<oio::Entry>)>,
     res: Vec<oio::Entry>,
 }
 
 #[async_trait]
-impl<A, P> oio::Page for FlatPager<A, P>
+impl<A, P> oio::List for FlatLister<A, P>
 where
-    A: Accessor<Pager = P>,
-    P: oio::Page,
+    A: Accessor<Lister = P>,
+    P: oio::List,
 {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         loop {
             if let Some(de) = self.dirs.pop_back() {
                 let (_, op) = self.acc.list(de.path(), OpList::new()).await?;
-                self.pagers.push((op, de, vec![]))
+                self.listers.push((op, de, vec![]))
             }
 
-            let (mut pager, de, mut buf) = match self.pagers.pop() {
-                Some((pager, de, buf)) => (pager, de, buf),
+            let (mut lister, de, mut buf) = match self.listers.pop() {
+                Some((lister, de, buf)) => (lister, de, buf),
                 None => {
                     if !self.res.is_empty() {
                         return Ok(Some(mem::take(&mut self.res)));
@@ -113,7 +113,7 @@ where
             };
 
             if buf.is_empty() {
-                match pager.next().await? {
+                match lister.next().await? {
                     Some(v) => {
                         buf = v;
                     }
@@ -132,13 +132,13 @@ where
                 if let Some(oe) = buf.pop_front() {
                     if oe.mode().is_dir() {
                         self.dirs.push_back(oe);
-                        self.pagers.push((pager, de, buf.into()));
+                        self.listers.push((lister, de, buf.into()));
                         break;
                     } else {
                         self.res.push(oe)
                     }
                 } else {
-                    self.pagers.push((pager, de, vec![]));
+                    self.listers.push((lister, de, vec![]));
                     break;
                 }
             }
@@ -150,20 +150,20 @@ where
     }
 }
 
-impl<A, P> oio::BlockingPage for FlatPager<A, P>
+impl<A, P> oio::BlockingList for FlatLister<A, P>
 where
-    A: Accessor<BlockingPager = P>,
-    P: oio::BlockingPage,
+    A: Accessor<BlockingLister = P>,
+    P: oio::BlockingList,
 {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         loop {
             if let Some(de) = self.dirs.pop_back() {
                 let (_, op) = self.acc.blocking_list(de.path(), OpList::new())?;
-                self.pagers.push((op, de, vec![]))
+                self.listers.push((op, de, vec![]))
             }
 
-            let (mut pager, de, mut buf) = match self.pagers.pop() {
-                Some((pager, de, buf)) => (pager, de, buf),
+            let (mut lister, de, mut buf) = match self.listers.pop() {
+                Some((lister, de, buf)) => (lister, de, buf),
                 None => {
                     if !self.res.is_empty() {
                         return Ok(Some(mem::take(&mut self.res)));
@@ -173,7 +173,7 @@ where
             };
 
             if buf.is_empty() {
-                match pager.next()? {
+                match lister.next()? {
                     Some(v) => {
                         buf = v;
                     }
@@ -192,13 +192,13 @@ where
                 if let Some(oe) = buf.pop_front() {
                     if oe.mode().is_dir() {
                         self.dirs.push_back(oe);
-                        self.pagers.push((pager, de, buf.into()));
+                        self.listers.push((lister, de, buf.into()));
                         break;
                     } else {
                         self.res.push(oe)
                     }
                 } else {
-                    self.pagers.push((pager, de, vec![]));
+                    self.listers.push((lister, de, vec![]));
                     break;
                 }
             }
@@ -216,7 +216,7 @@ mod tests {
     use std::vec;
 
     use log::debug;
-    use oio::BlockingPage;
+    use oio::BlockingList;
 
     use super::*;
 
@@ -235,10 +235,10 @@ mod tests {
             Self { map }
         }
 
-        fn get(&self, path: &str) -> MockPager {
+        fn get(&self, path: &str) -> MockLister {
             let inner = self.map.get(path).expect("must have value").to_vec();
 
-            MockPager { inner, done: false }
+            MockLister { inner, done: false }
         }
     }
 
@@ -248,8 +248,8 @@ mod tests {
         type BlockingReader = ();
         type Writer = ();
         type BlockingWriter = ();
-        type Pager = ();
-        type BlockingPager = MockPager;
+        type Lister = ();
+        type BlockingLister = MockLister;
 
         fn info(&self) -> AccessorInfo {
             let mut am = AccessorInfo::default();
@@ -259,18 +259,18 @@ mod tests {
             am
         }
 
-        fn blocking_list(&self, path: &str, _: OpList) -> Result<(RpList, Self::BlockingPager)> {
+        fn blocking_list(&self, path: &str, _: OpList) -> Result<(RpList, Self::BlockingLister)> {
             debug!("visit path: {path}");
             Ok((RpList::default(), self.get(path)))
         }
     }
 
-    struct MockPager {
+    struct MockLister {
         inner: Vec<&'static str>,
         done: bool,
     }
 
-    impl BlockingPage for MockPager {
+    impl BlockingList for MockLister {
         fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
             if self.done {
                 return Ok(None);
@@ -298,11 +298,11 @@ mod tests {
         let _ = tracing_subscriber::fmt().with_test_writer().try_init();
 
         let acc = MockService::new();
-        let mut pager = into_flat_page(acc, "x/", 10);
+        let mut lister = into_flat_page(acc, "x/", 10);
 
         let mut entries = Vec::default();
 
-        while let Some(e) = pager.next()? {
+        while let Some(e) = lister.next()? {
             entries.extend_from_slice(&e)
         }
 
diff --git a/core/src/raw/oio/page/into_hierarchy_pager.rs b/core/src/raw/oio/list/into_hierarchy_pager.rs
similarity index 86%
rename from core/src/raw/oio/page/into_hierarchy_pager.rs
rename to core/src/raw/oio/list/into_hierarchy_pager.rs
index 10a5449d6..2971ad2a1 100644
--- a/core/src/raw/oio/page/into_hierarchy_pager.rs
+++ b/core/src/raw/oio/list/into_hierarchy_pager.rs
@@ -22,38 +22,38 @@ use async_trait::async_trait;
 use crate::raw::*;
 use crate::*;
 
-/// to_hierarchy_pager is used to make a hierarchy pager flat.
-pub fn into_hierarchy_page<P>(pager: P, path: &str) -> HierarchyPager<P> {
+/// to_hierarchy_lister is used to make a hierarchy lister flat.
+pub fn into_hierarchy_page<P>(lister: P, path: &str) -> HierarchyLister<P> {
     let path = if path == "/" {
         "".to_string()
     } else {
         path.to_string()
     };
 
-    HierarchyPager {
-        pager,
+    HierarchyLister {
+        lister,
         path,
         visited: HashSet::default(),
     }
 }
 
-/// ToHierarchyPager will convert a flat page to hierarchy by filter
+/// ToHierarchyLister will convert a flat page to hierarchy by filter
 /// not needed entries.
 ///
 /// # Notes
 ///
-/// ToHierarchyPager filter entries after fetch entries. So it's possible
+/// ToHierarchyLister filter entries after fetch entries. So it's possible
 /// to return an empty vec. It doesn't mean the all pages have been
 /// returned.
 ///
 /// Please keep calling next_page until we returned `Ok(None)`
-pub struct HierarchyPager<P> {
-    pager: P,
+pub struct HierarchyLister<P> {
+    lister: P,
     path: String,
     visited: HashSet<String>,
 }
 
-impl<P> HierarchyPager<P> {
+impl<P> HierarchyLister<P> {
     /// TODO: use retain_mut instead after we bump MSRV to 1.61.
     fn filter_entries(&mut self, entries: Vec<oio::Entry>) -> Vec<oio::Entry> {
         entries
@@ -117,9 +117,9 @@ impl<P> HierarchyPager<P> {
 }
 
 #[async_trait]
-impl<P: oio::Page> oio::Page for HierarchyPager<P> {
+impl<P: oio::List> oio::List for HierarchyLister<P> {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
-        let page = self.pager.next().await?;
+        let page = self.lister.next().await?;
 
         let entries = if let Some(entries) = page {
             entries
@@ -133,9 +133,9 @@ impl<P: oio::Page> oio::Page for HierarchyPager<P> {
     }
 }
 
-impl<P: oio::BlockingPage> oio::BlockingPage for HierarchyPager<P> {
+impl<P: oio::BlockingList> oio::BlockingList for HierarchyLister<P> {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
-        let page = self.pager.next()?;
+        let page = self.lister.next()?;
 
         let entries = if let Some(entries) = page {
             entries
@@ -155,16 +155,16 @@ mod tests {
     use std::collections::HashSet;
 
     use log::debug;
-    use oio::BlockingPage;
+    use oio::BlockingList;
 
     use super::*;
 
-    struct MockPager {
+    struct MockLister {
         inner: Vec<&'static str>,
         done: bool,
     }
 
-    impl MockPager {
+    impl MockLister {
         fn new(inner: &[&'static str]) -> Self {
             Self {
                 inner: inner.to_vec(),
@@ -173,7 +173,7 @@ mod tests {
         }
     }
 
-    impl BlockingPage for MockPager {
+    impl BlockingList for MockLister {
         fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
             if self.done {
                 return Ok(None);
@@ -200,13 +200,13 @@ mod tests {
     fn test_blocking_list() -> Result<()> {
         let _ = tracing_subscriber::fmt().with_test_writer().try_init();
 
-        let pager = MockPager::new(&["x/x/", "x/y/", "y/", "x/x/x", "y/y", "xy/", "z", "y/a"]);
-        let mut pager = into_hierarchy_page(pager, "");
+        let lister = MockLister::new(&["x/x/", "x/y/", "y/", "x/x/x", "y/y", "xy/", "z", "y/a"]);
+        let mut lister = into_hierarchy_page(lister, "");
 
         let mut entries = Vec::default();
 
         let mut set = HashSet::new();
-        while let Some(e) = pager.next()? {
+        while let Some(e) = lister.next()? {
             for i in &e {
                 debug!("got path {}", i.path());
                 assert!(
diff --git a/core/src/raw/oio/page/mod.rs b/core/src/raw/oio/list/mod.rs
similarity index 82%
rename from core/src/raw/oio/page/mod.rs
rename to core/src/raw/oio/list/mod.rs
index 26be17451..0a4b0e39e 100644
--- a/core/src/raw/oio/page/mod.rs
+++ b/core/src/raw/oio/list/mod.rs
@@ -16,16 +16,16 @@
 // under the License.
 
 mod api;
-pub use api::BlockingPage;
-pub use api::BlockingPager;
-pub use api::Page;
-pub use api::PageOperation;
-pub use api::Pager;
+pub use api::BlockingList;
+pub use api::BlockingLister;
+pub use api::List;
+pub use api::ListOperation;
+pub use api::Lister;
 
 mod into_flat_page;
 pub use into_flat_page::into_flat_page;
-pub use into_flat_page::FlatPager;
+pub use into_flat_page::FlatLister;
 
 mod into_hierarchy_pager;
 pub use into_hierarchy_pager::into_hierarchy_page;
-pub use into_hierarchy_pager::HierarchyPager;
+pub use into_hierarchy_pager::HierarchyLister;
diff --git a/core/src/raw/oio/mod.rs b/core/src/raw/oio/mod.rs
index 9e52acfd2..7a10a8331 100644
--- a/core/src/raw/oio/mod.rs
+++ b/core/src/raw/oio/mod.rs
@@ -31,8 +31,8 @@ pub use write::*;
 mod stream;
 pub use stream::*;
 
-mod page;
-pub use page::*;
+mod list;
+pub use list::*;
 
 mod cursor;
 pub use cursor::Cursor;
diff --git a/core/src/raw/oio/read/api.rs b/core/src/raw/oio/read/api.rs
index 0b9aaf770..098599855 100644
--- a/core/src/raw/oio/read/api.rs
+++ b/core/src/raw/oio/read/api.rs
@@ -28,7 +28,7 @@ use pin_project::pin_project;
 
 use crate::*;
 
-/// PageOperation is the name for APIs of pager.
+/// PageOperation is the name for APIs of lister.
 #[derive(Debug, Copy, Clone, Hash, Eq, PartialEq)]
 #[non_exhaustive]
 pub enum ReadOperation {
diff --git a/core/src/raw/oio/read/range_read.rs b/core/src/raw/oio/read/range_read.rs
index 0447aba8f..3759c3dee 100644
--- a/core/src/raw/oio/read/range_read.rs
+++ b/core/src/raw/oio/read/range_read.rs
@@ -640,8 +640,8 @@ mod tests {
         type BlockingReader = ();
         type Writer = ();
         type BlockingWriter = ();
-        type Pager = ();
-        type BlockingPager = ();
+        type Lister = ();
+        type BlockingLister = ();
 
         fn info(&self) -> AccessorInfo {
             let mut am = AccessorInfo::default();
diff --git a/core/src/services/alluxio/backend.rs b/core/src/services/alluxio/backend.rs
index e047bf89c..d5c9b3a12 100644
--- a/core/src/services/alluxio/backend.rs
+++ b/core/src/services/alluxio/backend.rs
@@ -29,7 +29,7 @@ use crate::*;
 
 use super::writer::AlluxioWriter;
 use super::writer::AlluxioWriters;
-use super::{core::AlluxioCore, pager::AlluxioPager};
+use super::{core::AlluxioCore, lister::AlluxioLister};
 
 /// Config for alluxio services support.
 #[derive(Default, Deserialize)]
@@ -185,8 +185,8 @@ impl Accessor for AlluxioBackend {
     type BlockingReader = ();
     type Writer = AlluxioWriters;
     type BlockingWriter = ();
-    type Pager = AlluxioPager;
-    type BlockingPager = ();
+    type Lister = AlluxioLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -252,10 +252,10 @@ impl Accessor for AlluxioBackend {
         Ok(RpDelete::default())
     }
 
-    async fn list(&self, path: &str, _args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, _args: OpList) -> Result<(RpList, Self::Lister)> {
         Ok((
             RpList::default(),
-            AlluxioPager::new(self.core.clone(), path),
+            AlluxioLister::new(self.core.clone(), path),
         ))
     }
 }
diff --git a/core/src/services/alluxio/pager.rs b/core/src/services/alluxio/lister.rs
similarity index 95%
rename from core/src/services/alluxio/pager.rs
rename to core/src/services/alluxio/lister.rs
index 64483751b..c1efa6b3a 100644
--- a/core/src/services/alluxio/pager.rs
+++ b/core/src/services/alluxio/lister.rs
@@ -25,7 +25,7 @@ use crate::raw::*;
 use crate::ErrorKind;
 use crate::Result;
 
-pub struct AlluxioPager {
+pub struct AlluxioLister {
     core: Arc<AlluxioCore>,
 
     path: String,
@@ -33,9 +33,9 @@ pub struct AlluxioPager {
     done: bool,
 }
 
-impl AlluxioPager {
+impl AlluxioLister {
     pub(super) fn new(core: Arc<AlluxioCore>, path: &str) -> Self {
-        AlluxioPager {
+        AlluxioLister {
             core,
             path: path.to_string(),
             done: false,
@@ -44,7 +44,7 @@ impl AlluxioPager {
 }
 
 #[async_trait]
-impl oio::Page for AlluxioPager {
+impl oio::List for AlluxioLister {
     async fn next(&mut self) -> Result<Option<Vec<Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/alluxio/mod.rs b/core/src/services/alluxio/mod.rs
index 707df837a..95e0216d3 100644
--- a/core/src/services/alluxio/mod.rs
+++ b/core/src/services/alluxio/mod.rs
@@ -21,5 +21,5 @@ pub use backend::AlluxioConfig;
 
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/azblob/backend.rs b/core/src/services/azblob/backend.rs
index acd29e74d..a87907477 100644
--- a/core/src/services/azblob/backend.rs
+++ b/core/src/services/azblob/backend.rs
@@ -34,7 +34,7 @@ use sha2::Digest;
 use sha2::Sha256;
 
 use super::error::parse_error;
-use super::pager::AzblobPager;
+use super::lister::AzblobLister;
 use super::writer::AzblobWriter;
 use crate::raw::*;
 use crate::services::azblob::core::AzblobCore;
@@ -546,8 +546,8 @@ impl Accessor for AzblobBackend {
     type BlockingReader = ();
     type Writer = AzblobWriters;
     type BlockingWriter = ();
-    type Pager = AzblobPager;
-    type BlockingPager = ();
+    type Lister = AzblobLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -688,8 +688,8 @@ impl Accessor for AzblobBackend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
-        let op = AzblobPager::new(
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
+        let op = AzblobLister::new(
             self.core.clone(),
             path.to_string(),
             args.recursive(),
diff --git a/core/src/services/azblob/pager.rs b/core/src/services/azblob/lister.rs
similarity index 99%
rename from core/src/services/azblob/pager.rs
rename to core/src/services/azblob/lister.rs
index 19c11bf36..25ccc1248 100644
--- a/core/src/services/azblob/pager.rs
+++ b/core/src/services/azblob/lister.rs
@@ -27,7 +27,7 @@ use super::error::parse_error;
 use crate::raw::*;
 use crate::*;
 
-pub struct AzblobPager {
+pub struct AzblobLister {
     core: Arc<AzblobCore>,
 
     path: String,
@@ -38,7 +38,7 @@ pub struct AzblobPager {
     done: bool,
 }
 
-impl AzblobPager {
+impl AzblobLister {
     pub fn new(core: Arc<AzblobCore>, path: String, recursive: bool, limit: Option<usize>) -> Self {
         let delimiter = if recursive { "" } else { "/" };
 
@@ -55,7 +55,7 @@ impl AzblobPager {
 }
 
 #[async_trait]
-impl oio::Page for AzblobPager {
+impl oio::List for AzblobLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/azblob/mod.rs b/core/src/services/azblob/mod.rs
index efc6e42f0..da314f5b3 100644
--- a/core/src/services/azblob/mod.rs
+++ b/core/src/services/azblob/mod.rs
@@ -21,5 +21,5 @@ pub use backend::AzblobConfig;
 
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/azdls/backend.rs b/core/src/services/azdls/backend.rs
index 909bbd571..f5e08abe4 100644
--- a/core/src/services/azdls/backend.rs
+++ b/core/src/services/azdls/backend.rs
@@ -29,7 +29,7 @@ use reqsign::AzureStorageSigner;
 
 use super::core::AzdlsCore;
 use super::error::parse_error;
-use super::pager::AzdlsPager;
+use super::lister::AzdlsLister;
 use super::writer::AzdlsWriter;
 use crate::raw::*;
 use crate::services::azdls::writer::AzdlsWriters;
@@ -233,8 +233,8 @@ impl Accessor for AzdlsBackend {
     type BlockingReader = ();
     type Writer = AzdlsWriters;
     type BlockingWriter = ();
-    type Pager = AzdlsPager;
-    type BlockingPager = ();
+    type Lister = AzdlsLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -365,8 +365,8 @@ impl Accessor for AzdlsBackend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
-        let op = AzdlsPager::new(self.core.clone(), path.to_string(), args.limit());
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
+        let op = AzdlsLister::new(self.core.clone(), path.to_string(), args.limit());
 
         Ok((RpList::default(), op))
     }
diff --git a/core/src/services/azdls/pager.rs b/core/src/services/azdls/lister.rs
similarity index 98%
rename from core/src/services/azdls/pager.rs
rename to core/src/services/azdls/lister.rs
index 19f67d007..a624aa31e 100644
--- a/core/src/services/azdls/pager.rs
+++ b/core/src/services/azdls/lister.rs
@@ -26,7 +26,7 @@ use super::error::parse_error;
 use crate::raw::*;
 use crate::*;
 
-pub struct AzdlsPager {
+pub struct AzdlsLister {
     core: Arc<AzdlsCore>,
 
     path: String,
@@ -36,7 +36,7 @@ pub struct AzdlsPager {
     done: bool,
 }
 
-impl AzdlsPager {
+impl AzdlsLister {
     pub fn new(core: Arc<AzdlsCore>, path: String, limit: Option<usize>) -> Self {
         Self {
             core,
@@ -50,7 +50,7 @@ impl AzdlsPager {
 }
 
 #[async_trait]
-impl oio::Page for AzdlsPager {
+impl oio::List for AzdlsLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/azdls/mod.rs b/core/src/services/azdls/mod.rs
index 0207e1f6c..4284e4595 100644
--- a/core/src/services/azdls/mod.rs
+++ b/core/src/services/azdls/mod.rs
@@ -20,5 +20,5 @@ pub use backend::AzdlsBuilder as Azdls;
 
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/azfile/backend.rs b/core/src/services/azfile/backend.rs
index 612edb286..d11b34efd 100644
--- a/core/src/services/azfile/backend.rs
+++ b/core/src/services/azfile/backend.rs
@@ -28,7 +28,7 @@ use reqsign::AzureStorageLoader;
 use reqsign::AzureStorageSigner;
 
 use crate::raw::*;
-use crate::services::azfile::pager::AzfilePager;
+use crate::services::azfile::lister::AzfileLister;
 use crate::*;
 
 use super::core::AzfileCore;
@@ -251,8 +251,8 @@ impl Accessor for AzfileBackend {
     type BlockingReader = ();
     type Writer = AzfileWriters;
     type BlockingWriter = ();
-    type Pager = AzfilePager;
-    type BlockingPager = ();
+    type Lister = AzfileLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -395,8 +395,8 @@ impl Accessor for AzfileBackend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
-        let op = AzfilePager::new(self.core.clone(), path.to_string(), args.limit());
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
+        let op = AzfileLister::new(self.core.clone(), path.to_string(), args.limit());
 
         Ok((RpList::default(), op))
     }
diff --git a/core/src/services/azfile/pager.rs b/core/src/services/azfile/lister.rs
similarity index 98%
rename from core/src/services/azfile/pager.rs
rename to core/src/services/azfile/lister.rs
index 8272d19f0..cd17aef33 100644
--- a/core/src/services/azfile/pager.rs
+++ b/core/src/services/azfile/lister.rs
@@ -28,7 +28,7 @@ use crate::*;
 use super::core::AzfileCore;
 use super::error::parse_error;
 
-pub struct AzfilePager {
+pub struct AzfileLister {
     core: Arc<AzfileCore>,
     path: String,
     limit: Option<usize>,
@@ -36,7 +36,7 @@ pub struct AzfilePager {
     continuation: String,
 }
 
-impl AzfilePager {
+impl AzfileLister {
     pub fn new(core: Arc<AzfileCore>, path: String, limit: Option<usize>) -> Self {
         Self {
             core,
@@ -49,7 +49,7 @@ impl AzfilePager {
 }
 
 #[async_trait]
-impl oio::Page for AzfilePager {
+impl oio::List for AzfileLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/azfile/mod.rs b/core/src/services/azfile/mod.rs
index 8aeebac0f..0ae9da729 100644
--- a/core/src/services/azfile/mod.rs
+++ b/core/src/services/azfile/mod.rs
@@ -20,5 +20,5 @@ pub use backend::AzfileBuilder as Azfile;
 mod backend;
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/cos/backend.rs b/core/src/services/cos/backend.rs
index f03311f45..dbf2f9b1f 100644
--- a/core/src/services/cos/backend.rs
+++ b/core/src/services/cos/backend.rs
@@ -29,7 +29,7 @@ use reqsign::TencentCosSigner;
 
 use super::core::CosCore;
 use super::error::parse_error;
-use super::pager::CosPager;
+use super::lister::CosLister;
 use super::writer::CosWriter;
 use crate::raw::*;
 use crate::services::cos::writer::CosWriters;
@@ -245,8 +245,8 @@ impl Accessor for CosBackend {
     type BlockingReader = ();
     type Writer = CosWriters;
     type BlockingWriter = ();
-    type Pager = CosPager;
-    type BlockingPager = ();
+    type Lister = CosLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -421,10 +421,10 @@ impl Accessor for CosBackend {
         )))
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         Ok((
             RpList::default(),
-            CosPager::new(self.core.clone(), path, args.recursive(), args.limit()),
+            CosLister::new(self.core.clone(), path, args.recursive(), args.limit()),
         ))
     }
 }
diff --git a/core/src/services/cos/pager.rs b/core/src/services/cos/lister.rs
similarity index 98%
rename from core/src/services/cos/pager.rs
rename to core/src/services/cos/lister.rs
index f2b38d791..55d4bd812 100644
--- a/core/src/services/cos/pager.rs
+++ b/core/src/services/cos/lister.rs
@@ -31,7 +31,7 @@ use crate::ErrorKind;
 use crate::Metadata;
 use crate::Result;
 
-pub struct CosPager {
+pub struct CosLister {
     core: Arc<CosCore>,
     path: String,
     delimiter: &'static str,
@@ -41,7 +41,7 @@ pub struct CosPager {
     done: bool,
 }
 
-impl CosPager {
+impl CosLister {
     pub fn new(core: Arc<CosCore>, path: &str, recursive: bool, limit: Option<usize>) -> Self {
         let delimiter = if recursive { "" } else { "/" };
         Self {
@@ -57,7 +57,7 @@ impl CosPager {
 }
 
 #[async_trait]
-impl oio::Page for CosPager {
+impl oio::List for CosLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/cos/mod.rs b/core/src/services/cos/mod.rs
index b51de4b7e..780c2c479 100644
--- a/core/src/services/cos/mod.rs
+++ b/core/src/services/cos/mod.rs
@@ -20,5 +20,5 @@ pub use backend::CosBuilder as Cos;
 
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/dbfs/backend.rs b/core/src/services/dbfs/backend.rs
index afebda36b..4b13e10ba 100644
--- a/core/src/services/dbfs/backend.rs
+++ b/core/src/services/dbfs/backend.rs
@@ -30,7 +30,7 @@ use crate::*;
 
 use super::core::DbfsCore;
 use super::error::parse_error;
-use super::pager::DbfsPager;
+use super::lister::DbfsLister;
 use super::reader::DbfsReader;
 use super::writer::DbfsWriter;
 
@@ -158,8 +158,8 @@ impl Accessor for DbfsBackend {
     type BlockingReader = ();
     type Writer = oio::OneShotWriter<DbfsWriter>;
     type BlockingWriter = ();
-    type Pager = DbfsPager;
-    type BlockingPager = ();
+    type Lister = DbfsLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -275,8 +275,8 @@ impl Accessor for DbfsBackend {
         }
     }
 
-    async fn list(&self, path: &str, _args: OpList) -> Result<(RpList, Self::Pager)> {
-        let op = DbfsPager::new(self.core.clone(), path.to_string());
+    async fn list(&self, path: &str, _args: OpList) -> Result<(RpList, Self::Lister)> {
+        let op = DbfsLister::new(self.core.clone(), path.to_string());
 
         Ok((RpList::default(), op))
     }
diff --git a/core/src/services/dbfs/pager.rs b/core/src/services/dbfs/lister.rs
similarity index 97%
rename from core/src/services/dbfs/pager.rs
rename to core/src/services/dbfs/lister.rs
index 58aef5d75..fd27b912b 100644
--- a/core/src/services/dbfs/pager.rs
+++ b/core/src/services/dbfs/lister.rs
@@ -27,13 +27,13 @@ use crate::*;
 
 use super::error::parse_error;
 
-pub struct DbfsPager {
+pub struct DbfsLister {
     core: Arc<DbfsCore>,
     path: String,
     done: bool,
 }
 
-impl DbfsPager {
+impl DbfsLister {
     pub fn new(core: Arc<DbfsCore>, path: String) -> Self {
         Self {
             core,
@@ -44,7 +44,7 @@ impl DbfsPager {
 }
 
 #[async_trait]
-impl oio::Page for DbfsPager {
+impl oio::List for DbfsLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/dbfs/mod.rs b/core/src/services/dbfs/mod.rs
index bb7205031..5a310d088 100644
--- a/core/src/services/dbfs/mod.rs
+++ b/core/src/services/dbfs/mod.rs
@@ -20,6 +20,6 @@ pub use backend::DbfsBuilder as Dbfs;
 
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod reader;
 mod writer;
diff --git a/core/src/services/dropbox/backend.rs b/core/src/services/dropbox/backend.rs
index 498bb22cd..6aef1c9f7 100644
--- a/core/src/services/dropbox/backend.rs
+++ b/core/src/services/dropbox/backend.rs
@@ -52,8 +52,8 @@ impl Accessor for DropboxBackend {
     type BlockingReader = ();
     type Writer = oio::OneShotWriter<DropboxWriter>;
     type BlockingWriter = ();
-    type Pager = ();
-    type BlockingPager = ();
+    type Lister = ();
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut ma = AccessorInfo::default();
diff --git a/core/src/services/fs/backend.rs b/core/src/services/fs/backend.rs
index 874acfce4..c3dad8bc5 100644
--- a/core/src/services/fs/backend.rs
+++ b/core/src/services/fs/backend.rs
@@ -24,7 +24,7 @@ use chrono::DateTime;
 use log::debug;
 use uuid::Uuid;
 
-use super::pager::FsPager;
+use super::lister::FsLister;
 use super::writer::FsWriter;
 use crate::raw::*;
 use crate::*;
@@ -248,8 +248,8 @@ impl Accessor for FsBackend {
     type BlockingReader = oio::StdReader<std::fs::File>;
     type Writer = FsWriter<tokio::fs::File>;
     type BlockingWriter = FsWriter<std::fs::File>;
-    type Pager = Option<FsPager<tokio::fs::ReadDir>>;
-    type BlockingPager = Option<FsPager<std::fs::ReadDir>>;
+    type Lister = Option<FsLister<tokio::fs::ReadDir>>;
+    type BlockingLister = Option<FsLister<std::fs::ReadDir>>;
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -446,7 +446,7 @@ impl Accessor for FsBackend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         let p = self.root.join(path.trim_end_matches('/'));
 
         let f = match tokio::fs::read_dir(&p).await {
@@ -460,7 +460,7 @@ impl Accessor for FsBackend {
             }
         };
 
-        let rd = FsPager::new(&self.root, f, args.limit());
+        let rd = FsLister::new(&self.root, f, args.limit());
 
         Ok((RpList::default(), Some(rd)))
     }
@@ -617,7 +617,7 @@ impl Accessor for FsBackend {
         }
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         let p = self.root.join(path.trim_end_matches('/'));
 
         let f = match std::fs::read_dir(p) {
@@ -631,7 +631,7 @@ impl Accessor for FsBackend {
             }
         };
 
-        let rd = FsPager::new(&self.root, f, args.limit());
+        let rd = FsLister::new(&self.root, f, args.limit());
 
         Ok((RpList::default(), Some(rd)))
     }
diff --git a/core/src/services/fs/pager.rs b/core/src/services/fs/lister.rs
similarity index 96%
rename from core/src/services/fs/pager.rs
rename to core/src/services/fs/lister.rs
index 1c1e1fcce..403f674e8 100644
--- a/core/src/services/fs/pager.rs
+++ b/core/src/services/fs/lister.rs
@@ -25,14 +25,14 @@ use crate::EntryMode;
 use crate::Metadata;
 use crate::Result;
 
-pub struct FsPager<P> {
+pub struct FsLister<P> {
     root: PathBuf,
 
     size: usize,
     rd: P,
 }
 
-impl<P> FsPager<P> {
+impl<P> FsLister<P> {
     pub fn new(root: &Path, rd: P, limit: Option<usize>) -> Self {
         Self {
             root: root.to_owned(),
@@ -43,7 +43,7 @@ impl<P> FsPager<P> {
 }
 
 #[async_trait]
-impl oio::Page for FsPager<tokio::fs::ReadDir> {
+impl oio::List for FsLister<tokio::fs::ReadDir> {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         let mut oes: Vec<oio::Entry> = Vec::with_capacity(self.size);
 
@@ -84,7 +84,7 @@ impl oio::Page for FsPager<tokio::fs::ReadDir> {
     }
 }
 
-impl oio::BlockingPage for FsPager<std::fs::ReadDir> {
+impl oio::BlockingList for FsLister<std::fs::ReadDir> {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         let mut oes: Vec<oio::Entry> = Vec::with_capacity(self.size);
 
diff --git a/core/src/services/fs/mod.rs b/core/src/services/fs/mod.rs
index 28aae0814..fd51bffc9 100644
--- a/core/src/services/fs/mod.rs
+++ b/core/src/services/fs/mod.rs
@@ -18,5 +18,5 @@
 mod backend;
 pub use backend::FsBuilder as Fs;
 
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/ftp/backend.rs b/core/src/services/ftp/backend.rs
index 0b25fd68c..787da112f 100644
--- a/core/src/services/ftp/backend.rs
+++ b/core/src/services/ftp/backend.rs
@@ -37,7 +37,7 @@ use suppaftp::FtpStream;
 use suppaftp::Status;
 use tokio::sync::OnceCell;
 
-use super::pager::FtpPager;
+use super::lister::FtpLister;
 use super::util::FtpReader;
 use super::writer::FtpWriter;
 use crate::raw::*;
@@ -284,8 +284,8 @@ impl Accessor for FtpBackend {
     type BlockingReader = ();
     type Writer = FtpWriters;
     type BlockingWriter = ();
-    type Pager = FtpPager;
-    type BlockingPager = ();
+    type Lister = FtpLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -444,7 +444,7 @@ impl Accessor for FtpBackend {
         Ok(RpDelete::default())
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         let mut ftp_stream = self.ftp_connect(Operation::List).await?;
 
         let pathname = if path == "/" { None } else { Some(path) };
@@ -452,7 +452,7 @@ impl Accessor for FtpBackend {
 
         Ok((
             RpList::default(),
-            FtpPager::new(if path == "/" { "" } else { path }, files, args.limit()),
+            FtpLister::new(if path == "/" { "" } else { path }, files, args.limit()),
         ))
     }
 }
diff --git a/core/src/services/ftp/pager.rs b/core/src/services/ftp/lister.rs
similarity index 97%
rename from core/src/services/ftp/pager.rs
rename to core/src/services/ftp/lister.rs
index e1e1c0af1..ba0892e8c 100644
--- a/core/src/services/ftp/pager.rs
+++ b/core/src/services/ftp/lister.rs
@@ -25,13 +25,13 @@ use suppaftp::list::File;
 use crate::raw::*;
 use crate::*;
 
-pub struct FtpPager {
+pub struct FtpLister {
     path: String,
     size: usize,
     file_iter: IntoIter<String>,
 }
 
-impl FtpPager {
+impl FtpLister {
     pub fn new(path: &str, files: Vec<String>, limit: Option<usize>) -> Self {
         Self {
             path: path.to_string(),
@@ -42,7 +42,7 @@ impl FtpPager {
 }
 
 #[async_trait]
-impl oio::Page for FtpPager {
+impl oio::List for FtpLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         let mut oes: Vec<oio::Entry> = Vec::with_capacity(self.size);
 
diff --git a/core/src/services/ftp/mod.rs b/core/src/services/ftp/mod.rs
index 963732fd4..85d3d8da9 100644
--- a/core/src/services/ftp/mod.rs
+++ b/core/src/services/ftp/mod.rs
@@ -20,6 +20,6 @@ pub use backend::FtpBuilder as Ftp;
 pub use backend::FtpConfig;
 
 mod err;
-mod pager;
+mod lister;
 mod util;
 mod writer;
diff --git a/core/src/services/gcs/backend.rs b/core/src/services/gcs/backend.rs
index 8fb6eb9a4..c2340b7c5 100644
--- a/core/src/services/gcs/backend.rs
+++ b/core/src/services/gcs/backend.rs
@@ -32,7 +32,7 @@ use serde_json;
 
 use super::core::GcsCore;
 use super::error::parse_error;
-use super::pager::GcsPager;
+use super::lister::GcsLister;
 use super::writer::GcsWriter;
 use crate::raw::*;
 use crate::services::gcs::writer::GcsWriters;
@@ -312,8 +312,8 @@ impl Accessor for GcsBackend {
     type BlockingReader = ();
     type Writer = GcsWriters;
     type BlockingWriter = ();
-    type Pager = GcsPager;
-    type BlockingPager = ();
+    type Lister = GcsLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -471,10 +471,10 @@ impl Accessor for GcsBackend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         Ok((
             RpList::default(),
-            GcsPager::new(
+            GcsLister::new(
                 self.core.clone(),
                 path,
                 args.recursive(),
diff --git a/core/src/services/gcs/pager.rs b/core/src/services/gcs/lister.rs
similarity index 98%
rename from core/src/services/gcs/pager.rs
rename to core/src/services/gcs/lister.rs
index 5c4fdc50d..97496f353 100644
--- a/core/src/services/gcs/pager.rs
+++ b/core/src/services/gcs/lister.rs
@@ -26,9 +26,9 @@ use super::error::parse_error;
 use crate::raw::*;
 use crate::*;
 
-/// GcsPager takes over task of listing objects and
+/// GcsLister takes over task of listing objects and
 /// helps walking directory
-pub struct GcsPager {
+pub struct GcsLister {
     core: Arc<GcsCore>,
 
     path: String,
@@ -43,7 +43,7 @@ pub struct GcsPager {
     done: bool,
 }
 
-impl GcsPager {
+impl GcsLister {
     /// Generate a new directory walker
     pub fn new(
         core: Arc<GcsCore>,
@@ -68,7 +68,7 @@ impl GcsPager {
 }
 
 #[async_trait]
-impl oio::Page for GcsPager {
+impl oio::List for GcsLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/gcs/mod.rs b/core/src/services/gcs/mod.rs
index 6f95267c4..4552a46f9 100644
--- a/core/src/services/gcs/mod.rs
+++ b/core/src/services/gcs/mod.rs
@@ -20,6 +20,6 @@ pub use backend::GcsBuilder as Gcs;
 
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod uri;
 mod writer;
diff --git a/core/src/services/gdrive/backend.rs b/core/src/services/gdrive/backend.rs
index 029f79a08..f0d9da1b1 100644
--- a/core/src/services/gdrive/backend.rs
+++ b/core/src/services/gdrive/backend.rs
@@ -27,7 +27,7 @@ use serde_json::json;
 
 use super::core::GdriveCore;
 use super::error::parse_error;
-use super::pager::GdrivePager;
+use super::lister::GdriveLister;
 use super::writer::GdriveWriter;
 use crate::raw::*;
 use crate::services::gdrive::core::GdriveFile;
@@ -45,8 +45,8 @@ impl Accessor for GdriveBackend {
     type BlockingReader = ();
     type Writer = oio::OneShotWriter<GdriveWriter>;
     type BlockingWriter = ();
-    type Pager = GdrivePager;
-    type BlockingPager = ();
+    type Lister = GdriveLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut ma = AccessorInfo::default();
@@ -212,10 +212,10 @@ impl Accessor for GdriveBackend {
         }
     }
 
-    async fn list(&self, path: &str, _args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, _args: OpList) -> Result<(RpList, Self::Lister)> {
         Ok((
             RpList::default(),
-            GdrivePager::new(path.into(), self.core.clone()),
+            GdriveLister::new(path.into(), self.core.clone()),
         ))
     }
 
diff --git a/core/src/services/gdrive/pager.rs b/core/src/services/gdrive/lister.rs
similarity index 97%
rename from core/src/services/gdrive/pager.rs
rename to core/src/services/gdrive/lister.rs
index a3c836592..53d8f86c4 100644
--- a/core/src/services/gdrive/pager.rs
+++ b/core/src/services/gdrive/lister.rs
@@ -30,14 +30,14 @@ use crate::raw::oio::{self};
 use crate::EntryMode;
 use crate::Metadata;
 use crate::Result;
-pub struct GdrivePager {
+pub struct GdriveLister {
     path: String,
     core: Arc<GdriveCore>,
     next_page_token: Option<String>,
     done: bool,
 }
 
-impl GdrivePager {
+impl GdriveLister {
     pub fn new(path: String, core: Arc<GdriveCore>) -> Self {
         Self {
             path,
@@ -49,7 +49,7 @@ impl GdrivePager {
 }
 
 #[async_trait]
-impl oio::Page for GdrivePager {
+impl oio::List for GdriveLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/gdrive/mod.rs b/core/src/services/gdrive/mod.rs
index 2ef0caaec..015f177b2 100644
--- a/core/src/services/gdrive/mod.rs
+++ b/core/src/services/gdrive/mod.rs
@@ -21,5 +21,5 @@ mod core;
 mod error;
 
 pub use builder::GdriveBuilder as Gdrive;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/ghac/backend.rs b/core/src/services/ghac/backend.rs
index b163a8f90..92d105892 100644
--- a/core/src/services/ghac/backend.rs
+++ b/core/src/services/ghac/backend.rs
@@ -230,8 +230,8 @@ impl Accessor for GhacBackend {
     type BlockingReader = ();
     type Writer = GhacWriter;
     type BlockingWriter = ();
-    type Pager = ();
-    type BlockingPager = ();
+    type Lister = ();
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
diff --git a/core/src/services/hdfs/backend.rs b/core/src/services/hdfs/backend.rs
index cbcaea45f..acb8d452f 100644
--- a/core/src/services/hdfs/backend.rs
+++ b/core/src/services/hdfs/backend.rs
@@ -24,7 +24,7 @@ use std::sync::Arc;
 use async_trait::async_trait;
 use log::debug;
 
-use super::pager::HdfsPager;
+use super::lister::HdfsLister;
 use super::writer::HdfsWriter;
 use crate::raw::*;
 use crate::*;
@@ -161,8 +161,8 @@ impl Accessor for HdfsBackend {
     type BlockingReader = oio::StdReader<hdrs::File>;
     type Writer = HdfsWriter<hdrs::AsyncFile>;
     type BlockingWriter = HdfsWriter<hdrs::File>;
-    type Pager = Option<HdfsPager>;
-    type BlockingPager = Option<HdfsPager>;
+    type Lister = Option<HdfsLister>;
+    type BlockingLister = Option<HdfsLister>;
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -296,7 +296,7 @@ impl Accessor for HdfsBackend {
         Ok(RpDelete::default())
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         let p = build_rooted_abs_path(&self.root, path);
 
         let f = match self.client.read_dir(&p) {
@@ -310,7 +310,7 @@ impl Accessor for HdfsBackend {
             }
         };
 
-        let rd = HdfsPager::new(&self.root, f, args.limit());
+        let rd = HdfsLister::new(&self.root, f, args.limit());
 
         Ok((RpList::default(), Some(rd)))
     }
@@ -413,7 +413,7 @@ impl Accessor for HdfsBackend {
         Ok(RpDelete::default())
     }
 
-    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingPager)> {
+    fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
         let p = build_rooted_abs_path(&self.root, path);
 
         let f = match self.client.read_dir(&p) {
@@ -427,7 +427,7 @@ impl Accessor for HdfsBackend {
             }
         };
 
-        let rd = HdfsPager::new(&self.root, f, args.limit());
+        let rd = HdfsLister::new(&self.root, f, args.limit());
 
         Ok((RpList::default(), Some(rd)))
     }
diff --git a/core/src/services/hdfs/pager.rs b/core/src/services/hdfs/lister.rs
similarity index 96%
rename from core/src/services/hdfs/pager.rs
rename to core/src/services/hdfs/lister.rs
index 28b8ca5f9..5e31c1e14 100644
--- a/core/src/services/hdfs/pager.rs
+++ b/core/src/services/hdfs/lister.rs
@@ -22,14 +22,14 @@ use crate::EntryMode;
 use crate::Metadata;
 use crate::Result;
 
-pub struct HdfsPager {
+pub struct HdfsLister {
     root: String,
 
     size: usize,
     rd: hdrs::Readdir,
 }
 
-impl HdfsPager {
+impl HdfsLister {
     pub fn new(root: &str, rd: hdrs::Readdir, limit: Option<usize>) -> Self {
         Self {
             root: root.to_string(),
@@ -41,7 +41,7 @@ impl HdfsPager {
 }
 
 #[async_trait]
-impl oio::Page for HdfsPager {
+impl oio::List for HdfsLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         let mut oes: Vec<oio::Entry> = Vec::with_capacity(self.size);
 
@@ -72,7 +72,7 @@ impl oio::Page for HdfsPager {
     }
 }
 
-impl oio::BlockingPage for HdfsPager {
+impl oio::BlockingList for HdfsLister {
     fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         let mut oes: Vec<oio::Entry> = Vec::with_capacity(self.size);
 
diff --git a/core/src/services/hdfs/mod.rs b/core/src/services/hdfs/mod.rs
index 996a654fa..da4ae5c63 100644
--- a/core/src/services/hdfs/mod.rs
+++ b/core/src/services/hdfs/mod.rs
@@ -18,5 +18,5 @@
 mod backend;
 pub use backend::HdfsBuilder as Hdfs;
 
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/http/backend.rs b/core/src/services/http/backend.rs
index 879f691b2..b10eba4a8 100644
--- a/core/src/services/http/backend.rs
+++ b/core/src/services/http/backend.rs
@@ -228,8 +228,8 @@ impl Accessor for HttpBackend {
     type BlockingReader = ();
     type Writer = ();
     type BlockingWriter = ();
-    type Pager = ();
-    type BlockingPager = ();
+    type Lister = ();
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut ma = AccessorInfo::default();
diff --git a/core/src/services/ipfs/backend.rs b/core/src/services/ipfs/backend.rs
index 8dcf8610e..2c1681dbe 100644
--- a/core/src/services/ipfs/backend.rs
+++ b/core/src/services/ipfs/backend.rs
@@ -165,8 +165,8 @@ impl Accessor for IpfsBackend {
     type BlockingReader = ();
     type Writer = ();
     type BlockingWriter = ();
-    type Pager = DirStream;
-    type BlockingPager = ();
+    type Lister = DirStream;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut ma = AccessorInfo::default();
@@ -350,7 +350,7 @@ impl Accessor for IpfsBackend {
         }
     }
 
-    async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Lister)> {
         Ok((
             RpList::default(),
             DirStream::new(Arc::new(self.clone()), path),
@@ -429,7 +429,7 @@ impl DirStream {
 }
 
 #[async_trait]
-impl oio::Page for DirStream {
+impl oio::List for DirStream {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.consumed {
             return Ok(None);
diff --git a/core/src/services/ipmfs/backend.rs b/core/src/services/ipmfs/backend.rs
index ef39c17f0..26c06d569 100644
--- a/core/src/services/ipmfs/backend.rs
+++ b/core/src/services/ipmfs/backend.rs
@@ -27,7 +27,7 @@ use http::StatusCode;
 use serde::Deserialize;
 
 use super::error::parse_error;
-use super::pager::IpmfsPager;
+use super::lister::IpmfsLister;
 use super::writer::IpmfsWriter;
 use crate::raw::*;
 use crate::*;
@@ -66,8 +66,8 @@ impl Accessor for IpmfsBackend {
     type BlockingReader = ();
     type Writer = oio::OneShotWriter<IpmfsWriter>;
     type BlockingWriter = ();
-    type Pager = IpmfsPager;
-    type BlockingPager = ();
+    type Lister = IpmfsLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -170,10 +170,10 @@ impl Accessor for IpmfsBackend {
         }
     }
 
-    async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, _: OpList) -> Result<(RpList, Self::Lister)> {
         Ok((
             RpList::default(),
-            IpmfsPager::new(Arc::new(self.clone()), &self.root, path),
+            IpmfsLister::new(Arc::new(self.clone()), &self.root, path),
         ))
     }
 }
diff --git a/core/src/services/ipmfs/pager.rs b/core/src/services/ipmfs/lister.rs
similarity index 97%
rename from core/src/services/ipmfs/pager.rs
rename to core/src/services/ipmfs/lister.rs
index ac5b157d9..535c982b1 100644
--- a/core/src/services/ipmfs/pager.rs
+++ b/core/src/services/ipmfs/lister.rs
@@ -28,14 +28,14 @@ use crate::EntryMode;
 use crate::Metadata;
 use crate::Result;
 
-pub struct IpmfsPager {
+pub struct IpmfsLister {
     backend: Arc<IpmfsBackend>,
     root: String,
     path: String,
     consumed: bool,
 }
 
-impl IpmfsPager {
+impl IpmfsLister {
     pub fn new(backend: Arc<IpmfsBackend>, root: &str, path: &str) -> Self {
         Self {
             backend,
@@ -47,7 +47,7 @@ impl IpmfsPager {
 }
 
 #[async_trait]
-impl oio::Page for IpmfsPager {
+impl oio::List for IpmfsLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.consumed {
             return Ok(None);
diff --git a/core/src/services/ipmfs/mod.rs b/core/src/services/ipmfs/mod.rs
index b788d6482..2a7ce5c0a 100644
--- a/core/src/services/ipmfs/mod.rs
+++ b/core/src/services/ipmfs/mod.rs
@@ -20,5 +20,5 @@ mod builder;
 pub use builder::IpmfsBuilder as Ipmfs;
 
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/obs/backend.rs b/core/src/services/obs/backend.rs
index f28363af8..6cfe43e4f 100644
--- a/core/src/services/obs/backend.rs
+++ b/core/src/services/obs/backend.rs
@@ -29,7 +29,7 @@ use reqsign::HuaweicloudObsSigner;
 
 use super::core::ObsCore;
 use super::error::parse_error;
-use super::pager::ObsPager;
+use super::lister::ObsLister;
 use super::writer::ObsWriter;
 use crate::raw::*;
 use crate::services::obs::writer::ObsWriters;
@@ -252,8 +252,8 @@ impl Accessor for ObsBackend {
     type BlockingReader = ();
     type Writer = ObsWriters;
     type BlockingWriter = ();
-    type Pager = ObsPager;
-    type BlockingPager = ();
+    type Lister = ObsLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -427,10 +427,10 @@ impl Accessor for ObsBackend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         Ok((
             RpList::default(),
-            ObsPager::new(self.core.clone(), path, args.recursive(), args.limit()),
+            ObsLister::new(self.core.clone(), path, args.recursive(), args.limit()),
         ))
     }
 }
diff --git a/core/src/services/obs/pager.rs b/core/src/services/obs/lister.rs
similarity index 98%
rename from core/src/services/obs/pager.rs
rename to core/src/services/obs/lister.rs
index 9908d95f7..c96f51e3e 100644
--- a/core/src/services/obs/pager.rs
+++ b/core/src/services/obs/lister.rs
@@ -31,7 +31,7 @@ use crate::ErrorKind;
 use crate::Metadata;
 use crate::Result;
 
-pub struct ObsPager {
+pub struct ObsLister {
     core: Arc<ObsCore>,
     path: String,
     delimiter: &'static str,
@@ -41,7 +41,7 @@ pub struct ObsPager {
     done: bool,
 }
 
-impl ObsPager {
+impl ObsLister {
     pub fn new(core: Arc<ObsCore>, path: &str, recursive: bool, limit: Option<usize>) -> Self {
         let delimiter = if recursive { "" } else { "/" };
 
@@ -58,7 +58,7 @@ impl ObsPager {
 }
 
 #[async_trait]
-impl oio::Page for ObsPager {
+impl oio::List for ObsLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/obs/mod.rs b/core/src/services/obs/mod.rs
index 9e44b65ef..f8a78290f 100644
--- a/core/src/services/obs/mod.rs
+++ b/core/src/services/obs/mod.rs
@@ -20,5 +20,5 @@ pub use backend::ObsBuilder as Obs;
 
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/onedrive/backend.rs b/core/src/services/onedrive/backend.rs
index 8ed92ab4a..bef175735 100644
--- a/core/src/services/onedrive/backend.rs
+++ b/core/src/services/onedrive/backend.rs
@@ -29,7 +29,7 @@ use super::graph_model::CreateDirPayload;
 use super::graph_model::ItemType;
 use super::graph_model::OneDriveUploadSessionCreationRequestBody;
 use super::graph_model::OnedriveGetItemBody;
-use super::pager::OnedrivePager;
+use super::lister::OnedriveLister;
 use super::writer::OneDriveWriter;
 use crate::raw::*;
 use crate::*;
@@ -66,8 +66,8 @@ impl Accessor for OnedriveBackend {
     type BlockingReader = ();
     type Writer = oio::OneShotWriter<OneDriveWriter>;
     type BlockingWriter = ();
-    type Pager = OnedrivePager;
-    type BlockingPager = ();
+    type Lister = OnedriveLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut ma = AccessorInfo::default();
@@ -162,10 +162,11 @@ impl Accessor for OnedriveBackend {
         }
     }
 
-    async fn list(&self, path: &str, _op_list: OpList) -> Result<(RpList, Self::Pager)> {
-        let pager: OnedrivePager = OnedrivePager::new(self.root.clone(), path.into(), self.clone());
+    async fn list(&self, path: &str, _op_list: OpList) -> Result<(RpList, Self::Lister)> {
+        let lister: OnedriveLister =
+            OnedriveLister::new(self.root.clone(), path.into(), self.clone());
 
-        Ok((RpList::default(), pager))
+        Ok((RpList::default(), lister))
     }
 
     async fn create_dir(&self, path: &str, _: OpCreateDir) -> Result<RpCreateDir> {
diff --git a/core/src/services/onedrive/pager.rs b/core/src/services/onedrive/lister.rs
similarity index 97%
rename from core/src/services/onedrive/pager.rs
rename to core/src/services/onedrive/lister.rs
index c960c843e..90daeb866 100644
--- a/core/src/services/onedrive/pager.rs
+++ b/core/src/services/onedrive/lister.rs
@@ -32,7 +32,7 @@ use crate::EntryMode;
 use crate::Metadata;
 use crate::Result;
 
-pub struct OnedrivePager {
+pub struct OnedriveLister {
     root: String,
     path: String,
     backend: OnedriveBackend,
@@ -40,7 +40,7 @@ pub struct OnedrivePager {
     done: bool,
 }
 
-impl OnedrivePager {
+impl OnedriveLister {
     const DRIVE_ROOT_PREFIX: &'static str = "/drive/root:";
 
     pub(crate) fn new(root: String, path: String, backend: OnedriveBackend) -> Self {
@@ -55,7 +55,7 @@ impl OnedrivePager {
 }
 
 #[async_trait]
-impl oio::Page for OnedrivePager {
+impl oio::List for OnedriveLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
@@ -112,7 +112,7 @@ impl oio::Page for OnedrivePager {
     }
 }
 
-impl OnedrivePager {
+impl OnedriveLister {
     async fn onedrive_get(&mut self) -> Result<Response<IncomingAsyncBody>> {
         let request_url = if let Some(next_link) = &self.next_link {
             let next_link_clone = next_link.clone();
diff --git a/core/src/services/onedrive/mod.rs b/core/src/services/onedrive/mod.rs
index 8a0160019..359f1d84e 100644
--- a/core/src/services/onedrive/mod.rs
+++ b/core/src/services/onedrive/mod.rs
@@ -21,5 +21,5 @@ mod error;
 mod graph_model;
 
 pub use builder::OnedriveBuilder as Onedrive;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/oss/backend.rs b/core/src/services/oss/backend.rs
index 8fd43971b..c5fc3441c 100644
--- a/core/src/services/oss/backend.rs
+++ b/core/src/services/oss/backend.rs
@@ -32,7 +32,7 @@ use reqsign::AliyunOssSigner;
 
 use super::core::*;
 use super::error::parse_error;
-use super::pager::OssPager;
+use super::lister::OssLister;
 use super::writer::OssWriter;
 use crate::raw::*;
 use crate::services::oss::writer::OssWriters;
@@ -380,8 +380,8 @@ impl Accessor for OssBackend {
     type BlockingReader = ();
     type Writer = OssWriters;
     type BlockingWriter = ();
-    type Pager = OssPager;
-    type BlockingPager = ();
+    type Lister = OssLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -544,10 +544,10 @@ impl Accessor for OssBackend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         Ok((
             RpList::default(),
-            OssPager::new(
+            OssLister::new(
                 self.core.clone(),
                 path,
                 args.recursive(),
diff --git a/core/src/services/oss/pager.rs b/core/src/services/oss/lister.rs
similarity index 99%
rename from core/src/services/oss/pager.rs
rename to core/src/services/oss/lister.rs
index d865b4ec0..7b4b0bce3 100644
--- a/core/src/services/oss/pager.rs
+++ b/core/src/services/oss/lister.rs
@@ -32,7 +32,7 @@ use crate::ErrorKind;
 use crate::Metadata;
 use crate::Result;
 
-pub struct OssPager {
+pub struct OssLister {
     core: Arc<OssCore>,
 
     path: String,
@@ -46,7 +46,7 @@ pub struct OssPager {
     done: bool,
 }
 
-impl OssPager {
+impl OssLister {
     pub fn new(
         core: Arc<OssCore>,
         path: &str,
@@ -69,7 +69,7 @@ impl OssPager {
 }
 
 #[async_trait]
-impl oio::Page for OssPager {
+impl oio::List for OssLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/oss/mod.rs b/core/src/services/oss/mod.rs
index 9bfd1692c..3954a9885 100644
--- a/core/src/services/oss/mod.rs
+++ b/core/src/services/oss/mod.rs
@@ -20,5 +20,5 @@ pub use backend::OssBuilder as Oss;
 
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/s3/backend.rs b/core/src/services/s3/backend.rs
index 49cff44b3..7e1ccfc85 100644
--- a/core/src/services/s3/backend.rs
+++ b/core/src/services/s3/backend.rs
@@ -41,7 +41,7 @@ use serde::Deserialize;
 use super::core::*;
 use super::error::parse_error;
 use super::error::parse_s3_error_code;
-use super::pager::S3Pager;
+use super::lister::S3Lister;
 use super::writer::S3Writer;
 use super::writer::S3Writers;
 use crate::raw::*;
@@ -969,8 +969,8 @@ impl Accessor for S3Backend {
     type BlockingReader = ();
     type Writer = S3Writers;
     type BlockingWriter = ();
-    type Pager = S3Pager;
-    type BlockingPager = ();
+    type Lister = S3Lister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -1133,10 +1133,10 @@ impl Accessor for S3Backend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         Ok((
             RpList::default(),
-            S3Pager::new(
+            S3Lister::new(
                 self.core.clone(),
                 path,
                 args.recursive(),
diff --git a/core/src/services/s3/pager.rs b/core/src/services/s3/lister.rs
similarity index 99%
rename from core/src/services/s3/pager.rs
rename to core/src/services/s3/lister.rs
index 55ebec1a3..431abd8f1 100644
--- a/core/src/services/s3/pager.rs
+++ b/core/src/services/s3/lister.rs
@@ -29,7 +29,7 @@ use crate::EntryMode;
 use crate::Metadata;
 use crate::Result;
 
-pub struct S3Pager {
+pub struct S3Lister {
     core: Arc<S3Core>,
 
     path: String,
@@ -43,7 +43,7 @@ pub struct S3Pager {
     done: bool,
 }
 
-impl S3Pager {
+impl S3Lister {
     pub fn new(
         core: Arc<S3Core>,
         path: &str,
@@ -67,7 +67,7 @@ impl S3Pager {
 }
 
 #[async_trait]
-impl oio::Page for S3Pager {
+impl oio::List for S3Lister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/s3/mod.rs b/core/src/services/s3/mod.rs
index 9e343f9c1..4e2f283cb 100644
--- a/core/src/services/s3/mod.rs
+++ b/core/src/services/s3/mod.rs
@@ -21,5 +21,5 @@ pub use backend::S3Config;
 
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/sftp/backend.rs b/core/src/services/sftp/backend.rs
index 7152f0267..76f792e19 100644
--- a/core/src/services/sftp/backend.rs
+++ b/core/src/services/sftp/backend.rs
@@ -33,7 +33,7 @@ use openssh_sftp_client::SftpOptions;
 
 use super::error::is_not_found;
 use super::error::is_sftp_protocol_error;
-use super::pager::SftpPager;
+use super::lister::SftpLister;
 use super::writer::SftpWriter;
 use crate::raw::*;
 use crate::*;
@@ -247,8 +247,8 @@ impl Accessor for SftpBackend {
     type BlockingReader = ();
     type Writer = SftpWriter;
     type BlockingWriter = ();
-    type Pager = Option<SftpPager>;
-    type BlockingPager = ();
+    type Lister = Option<SftpLister>;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -446,7 +446,7 @@ impl Accessor for SftpBackend {
         Ok(RpDelete::default())
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         let client = self.connect().await?;
         let mut fs = client.fs();
         fs.set_cwd(&self.root);
@@ -467,7 +467,7 @@ impl Accessor for SftpBackend {
 
         Ok((
             RpList::default(),
-            Some(SftpPager::new(dir, path.to_owned(), args.limit())),
+            Some(SftpLister::new(dir, path.to_owned(), args.limit())),
         ))
     }
 }
diff --git a/core/src/services/sftp/pager.rs b/core/src/services/sftp/lister.rs
similarity index 96%
rename from core/src/services/sftp/pager.rs
rename to core/src/services/sftp/lister.rs
index 81c0e22bc..b130629ca 100644
--- a/core/src/services/sftp/pager.rs
+++ b/core/src/services/sftp/lister.rs
@@ -25,19 +25,19 @@ use openssh_sftp_client::fs::ReadDir;
 use crate::raw::oio;
 use crate::Result;
 
-pub struct SftpPager {
+pub struct SftpLister {
     dir: Pin<Box<ReadDir>>,
     prefix: String,
     limit: usize,
 }
 
-impl SftpPager {
+impl SftpLister {
     pub fn new(dir: ReadDir, path: String, limit: Option<usize>) -> Self {
         let prefix = if path == "/" { "".to_owned() } else { path };
 
         let limit = limit.unwrap_or(usize::MAX);
 
-        SftpPager {
+        SftpLister {
             dir: Box::pin(dir),
             prefix,
             limit,
@@ -46,7 +46,7 @@ impl SftpPager {
 }
 
 #[async_trait]
-impl oio::Page for SftpPager {
+impl oio::List for SftpLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.limit == 0 {
             return Ok(None);
diff --git a/core/src/services/sftp/mod.rs b/core/src/services/sftp/mod.rs
index 8672e88da..fcc74afc2 100644
--- a/core/src/services/sftp/mod.rs
+++ b/core/src/services/sftp/mod.rs
@@ -20,6 +20,6 @@ pub use backend::SftpConfig;
 
 mod backend;
 mod error;
-mod pager;
+mod lister;
 mod utils;
 mod writer;
diff --git a/core/src/services/supabase/backend.rs b/core/src/services/supabase/backend.rs
index b96bbd3ef..3831ed0a0 100644
--- a/core/src/services/supabase/backend.rs
+++ b/core/src/services/supabase/backend.rs
@@ -160,9 +160,9 @@ impl Accessor for SupabaseBackend {
     type BlockingReader = ();
     type Writer = oio::OneShotWriter<SupabaseWriter>;
     type BlockingWriter = ();
-    // todo: implement Pager to support list and scan
-    type Pager = ();
-    type BlockingPager = ();
+    // todo: implement Lister to support list and scan
+    type Lister = ();
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
diff --git a/core/src/services/swift/backend.rs b/core/src/services/swift/backend.rs
index 50cec342c..6f6b22dba 100644
--- a/core/src/services/swift/backend.rs
+++ b/core/src/services/swift/backend.rs
@@ -26,7 +26,7 @@ use log::debug;
 
 use super::core::SwiftCore;
 use super::error::parse_error;
-use super::pager::SwiftPager;
+use super::lister::SwiftLister;
 use super::writer::SwiftWriter;
 use crate::raw::*;
 use crate::*;
@@ -218,8 +218,8 @@ impl Accessor for SwiftBackend {
     type BlockingReader = ();
     type Writer = oio::OneShotWriter<SwiftWriter>;
     type BlockingWriter = ();
-    type Pager = SwiftPager;
-    type BlockingPager = ();
+    type Lister = SwiftLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -328,8 +328,8 @@ impl Accessor for SwiftBackend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
-        let op = SwiftPager::new(self.core.clone(), path.to_string(), args.recursive());
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
+        let op = SwiftLister::new(self.core.clone(), path.to_string(), args.recursive());
 
         Ok((RpList::default(), op))
     }
diff --git a/core/src/services/swift/pager.rs b/core/src/services/swift/lister.rs
similarity index 98%
rename from core/src/services/swift/pager.rs
rename to core/src/services/swift/lister.rs
index 62ff2304b..d69bb42b5 100644
--- a/core/src/services/swift/pager.rs
+++ b/core/src/services/swift/lister.rs
@@ -25,14 +25,14 @@ use super::error::parse_error;
 use crate::raw::*;
 use crate::*;
 
-pub struct SwiftPager {
+pub struct SwiftLister {
     core: Arc<SwiftCore>,
     path: String,
     delimiter: &'static str,
     done: bool,
 }
 
-impl SwiftPager {
+impl SwiftLister {
     pub fn new(core: Arc<SwiftCore>, path: String, recursive: bool) -> Self {
         let delimiter = if recursive { "" } else { "/" };
         Self {
@@ -45,7 +45,7 @@ impl SwiftPager {
 }
 
 #[async_trait]
-impl oio::Page for SwiftPager {
+impl oio::List for SwiftLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.done {
             return Ok(None);
diff --git a/core/src/services/swift/mod.rs b/core/src/services/swift/mod.rs
index 7e5f93525..9cfeb92e0 100644
--- a/core/src/services/swift/mod.rs
+++ b/core/src/services/swift/mod.rs
@@ -20,5 +20,5 @@ pub use backend::SwiftBuilder as Swift;
 
 mod core;
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/vercel_artifacts/backend.rs b/core/src/services/vercel_artifacts/backend.rs
index f205d3cc4..9af126444 100644
--- a/core/src/services/vercel_artifacts/backend.rs
+++ b/core/src/services/vercel_artifacts/backend.rs
@@ -49,8 +49,8 @@ impl Accessor for VercelArtifactsBackend {
     type BlockingReader = ();
     type Writer = oio::OneShotWriter<VercelArtifactsWriter>;
     type BlockingWriter = ();
-    type Pager = ();
-    type BlockingPager = ();
+    type Lister = ();
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut ma = AccessorInfo::default();
diff --git a/core/src/services/webdav/backend.rs b/core/src/services/webdav/backend.rs
index 310c1a0fe..09e0f839a 100644
--- a/core/src/services/webdav/backend.rs
+++ b/core/src/services/webdav/backend.rs
@@ -31,8 +31,8 @@ use http::StatusCode;
 use log::debug;
 
 use super::error::parse_error;
-use super::pager::Multistatus;
-use super::pager::WebdavPager;
+use super::lister::Multistatus;
+use super::lister::WebdavLister;
 use super::writer::WebdavWriter;
 use crate::raw::*;
 use crate::*;
@@ -223,8 +223,8 @@ impl Accessor for WebdavBackend {
     type BlockingReader = ();
     type Writer = oio::OneShotWriter<WebdavWriter>;
     type BlockingWriter = ();
-    type Pager = Option<WebdavPager>;
-    type BlockingPager = ();
+    type Lister = Option<WebdavLister>;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut ma = AccessorInfo::default();
@@ -378,7 +378,7 @@ impl Accessor for WebdavBackend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         if args.recursive() {
             return Err(Error::new(
                 ErrorKind::Unsupported,
@@ -400,7 +400,7 @@ impl Accessor for WebdavBackend {
 
                 Ok((
                     RpList::default(),
-                    Some(WebdavPager::new(&self.base_dir, &self.root, path, result)),
+                    Some(WebdavLister::new(&self.base_dir, &self.root, path, result)),
                 ))
             }
             StatusCode::NOT_FOUND if path.ends_with('/') => Ok((RpList::default(), None)),
diff --git a/core/src/services/webdav/pager.rs b/core/src/services/webdav/lister.rs
similarity index 99%
rename from core/src/services/webdav/pager.rs
rename to core/src/services/webdav/lister.rs
index 519cae33f..84e97aca6 100644
--- a/core/src/services/webdav/pager.rs
+++ b/core/src/services/webdav/lister.rs
@@ -22,14 +22,14 @@ use serde::Deserialize;
 
 use crate::raw::*;
 use crate::*;
-pub struct WebdavPager {
+pub struct WebdavLister {
     base_dir: String,
     root: String,
     path: String,
     multistates: Multistatus,
 }
 
-impl WebdavPager {
+impl WebdavLister {
     pub fn new(base_dir: &str, root: &str, path: &str, multistates: Multistatus) -> Self {
         Self {
             base_dir: base_dir.to_string(),
@@ -41,7 +41,7 @@ impl WebdavPager {
 }
 
 #[async_trait]
-impl oio::Page for WebdavPager {
+impl oio::List for WebdavLister {
     async fn next(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         if self.multistates.response.is_empty() {
             return Ok(None);
diff --git a/core/src/services/webdav/mod.rs b/core/src/services/webdav/mod.rs
index 2b46724bb..d8d72c449 100644
--- a/core/src/services/webdav/mod.rs
+++ b/core/src/services/webdav/mod.rs
@@ -19,5 +19,5 @@ mod backend;
 pub use backend::WebdavBuilder as Webdav;
 
 mod error;
-mod pager;
+mod lister;
 mod writer;
diff --git a/core/src/services/webhdfs/backend.rs b/core/src/services/webhdfs/backend.rs
index b80423b6d..3352e47d0 100644
--- a/core/src/services/webhdfs/backend.rs
+++ b/core/src/services/webhdfs/backend.rs
@@ -29,12 +29,12 @@ use tokio::sync::OnceCell;
 
 use super::error::parse_error;
 use super::error::parse_error_msg;
+use super::lister::WebhdfsLister;
 use super::message::BooleanResp;
 use super::message::DirectoryListingWrapper;
 use super::message::FileStatusType;
 use super::message::FileStatusWrapper;
 use super::message::FileStatusesWrapper;
-use super::pager::WebhdfsPager;
 use super::writer::WebhdfsWriter;
 use crate::raw::*;
 use crate::*;
@@ -402,8 +402,8 @@ impl Accessor for WebhdfsBackend {
     type BlockingReader = ();
     type Writer = oio::OneShotWriter<WebhdfsWriter>;
     type BlockingWriter = ();
-    type Pager = WebhdfsPager;
-    type BlockingPager = ();
+    type Lister = WebhdfsLister;
+    type BlockingLister = ();
 
     fn info(&self) -> AccessorInfo {
         let mut am = AccessorInfo::default();
@@ -540,7 +540,7 @@ impl Accessor for WebhdfsBackend {
         }
     }
 
-    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Pager)> {
+    async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
         if args.recursive() {
             return Err(Error::new(
                 ErrorKind::Unsupported,
@@ -560,12 +560,12 @@ impl Accessor for WebhdfsBackend {
                         .map_err(new_json_deserialize_error)?
                         .directory_listing;
                     let file_statuses = directory_listing.partial_listing.file_statuses.file_status;
-                    let mut objects = WebhdfsPager::new(self.clone(), path, file_statuses);
+                    let mut objects = WebhdfsLister::new(self.clone(), path, file_statuses);
                     objects.set_remaining_entries(directory_listing.remaining_entries);
                     Ok((RpList::default(), objects))
                 }
                 StatusCode::NOT_FOUND => {
-                    let objects = WebhdfsPager::new(self.clone(), path, vec![]);
+                    let objects = WebhdfsLister::new(self.clone(), path, vec![]);
                     Ok((RpList::default(), objects))
                 }
                 _ => Err(parse_error(resp).await?),
@@ -580,11 +580,11 @@ impl Accessor for WebhdfsBackend {
                         .map_err(new_json_deserialize_error)?
                         .file_statuses
                         .file_status;
-                    let objects = WebhdfsPager::new(self.clone(), path, file_statuses);
+                    let objects = WebhdfsLister::new(self.clone(), path, file_statuses);
                     Ok((RpList::default(), objects))
                 }
                 StatusCode::NOT_FOUND => {
-                    let objects = WebhdfsPager::new(self.clone(), path, vec![]);
+                    let objects = WebhdfsLister::new(self.clone(), path, vec![]);
                     Ok((RpList::default(), objects))
                 }
                 _ => Err(parse_error(resp).await?),
diff --git a/core/src/services/webhdfs/pager.rs b/core/src/services/webhdfs/lister.rs
similarity index 97%
rename from core/src/services/webhdfs/pager.rs
rename to core/src/services/webhdfs/lister.rs
index c55252c3d..8c6579a5d 100644
--- a/core/src/services/webhdfs/pager.rs
+++ b/core/src/services/webhdfs/lister.rs
@@ -26,7 +26,7 @@ use super::message::FileStatusType;
 use crate::raw::*;
 use crate::*;
 
-pub struct WebhdfsPager {
+pub struct WebhdfsLister {
     backend: WebhdfsBackend,
     path: String,
     statuses: Vec<FileStatus>,
@@ -34,7 +34,7 @@ pub struct WebhdfsPager {
     remaining_entries: u32,
 }
 
-impl WebhdfsPager {
+impl WebhdfsLister {
     pub fn new(backend: WebhdfsBackend, path: &str, statuses: Vec<FileStatus>) -> Self {
         Self {
             backend,
@@ -51,7 +51,7 @@ impl WebhdfsPager {
 }
 
 #[async_trait]
-impl oio::Page for WebhdfsPager {
+impl oio::List for WebhdfsLister {
     /// Returns the next page of entries.
     ///
     /// Note: default list status with batch, calling next will query for next batch if `remaining_entries` > 0.
@@ -98,7 +98,7 @@ impl oio::Page for WebhdfsPager {
     }
 }
 
-impl WebhdfsPager {
+impl WebhdfsLister {
     /// Returns the next page of entries.
     fn webhdfs_get_next_list_statuses(&mut self) -> Result<Option<Vec<oio::Entry>>> {
         let mut entries = Vec::with_capacity(self.statuses.len());
diff --git a/core/src/services/webhdfs/mod.rs b/core/src/services/webhdfs/mod.rs
index 3a461ef8b..3bfbbc77d 100644
--- a/core/src/services/webhdfs/mod.rs
+++ b/core/src/services/webhdfs/mod.rs
@@ -19,6 +19,6 @@ mod backend;
 pub use backend::WebhdfsBuilder as Webhdfs;
 
 mod error;
+mod lister;
 mod message;
-mod pager;
 mod writer;
diff --git a/core/src/types/list.rs b/core/src/types/list.rs
index 5d0325b47..ac01496b3 100644
--- a/core/src/types/list.rs
+++ b/core/src/types/list.rs
@@ -30,7 +30,7 @@ use crate::raw::*;
 use crate::*;
 
 /// Future constructed by listing.
-type ListFuture = BoxFuture<'static, (oio::Pager, Result<Option<Vec<oio::Entry>>>)>;
+type ListFuture = BoxFuture<'static, (oio::Lister, Result<Option<Vec<oio::Entry>>>)>;
 /// Future constructed by stating.
 type StatFuture = BoxFuture<'static, (String, Result<RpStat>)>;
 
@@ -46,7 +46,7 @@ pub struct Lister {
     required_metakey: FlagSet<Metakey>,
 
     buf: VecDeque<oio::Entry>,
-    pager: Option<oio::Pager>,
+    lister: Option<oio::Lister>,
     listing: Option<ListFuture>,
     stating: Option<StatFuture>,
 }
@@ -60,14 +60,14 @@ impl Lister {
     /// Create a new lister.
     pub(crate) async fn create(acc: FusedAccessor, path: &str, args: OpList) -> Result<Self> {
         let required_metakey = args.metakey();
-        let (_, pager) = acc.list(path, args).await?;
+        let (_, lister) = acc.list(path, args).await?;
 
         Ok(Self {
             acc,
             required_metakey,
 
             buf: VecDeque::new(),
-            pager: Some(pager),
+            lister: Some(lister),
             listing: None,
             stating: None,
         })
@@ -113,7 +113,7 @@ impl Stream for Lister {
 
             return match res? {
                 Some(oes) => {
-                    self.pager = Some(op);
+                    self.lister = Some(op);
                     self.buf = oes.into();
                     self.poll_next(cx)
                 }
@@ -121,12 +121,12 @@ impl Stream for Lister {
             };
         }
 
-        match self.pager.take() {
-            Some(mut pager) => {
+        match self.lister.take() {
+            Some(mut lister) => {
                 let fut = async move {
-                    let res = pager.next().await;
+                    let res = lister.next().await;
 
-                    (pager, res)
+                    (lister, res)
                 };
                 self.listing = Some(Box::pin(fut));
                 self.poll_next(cx)
@@ -145,7 +145,7 @@ pub struct BlockingLister {
     /// required_metakey is the metakey required by users.
     required_metakey: FlagSet<Metakey>,
 
-    pager: Option<oio::BlockingPager>,
+    lister: Option<oio::BlockingLister>,
     buf: VecDeque<oio::Entry>,
 }
 
@@ -158,14 +158,14 @@ impl BlockingLister {
     /// Create a new lister.
     pub(crate) fn create(acc: FusedAccessor, path: &str, args: OpList) -> Result<Self> {
         let required_metakey = args.metakey();
-        let (_, pager) = acc.blocking_list(path, args)?;
+        let (_, lister) = acc.blocking_list(path, args)?;
 
         Ok(Self {
             acc,
             required_metakey,
 
             buf: VecDeque::new(),
-            pager: Some(pager),
+            lister: Some(lister),
         })
     }
 }
@@ -189,18 +189,18 @@ impl Iterator for BlockingLister {
             return Some(Ok(Entry::new(path, metadata)));
         }
 
-        let pager = match self.pager.as_mut() {
-            Some(pager) => pager,
+        let lister = match self.lister.as_mut() {
+            Some(lister) => lister,
             None => return None,
         };
 
-        self.buf = match pager.next() {
+        self.buf = match lister.next() {
             // Ideally, the convert from `Vec` to `VecDeque` will not do reallocation.
             //
             // However, this could be changed as described in [impl<T, A> From<Vec<T, A>> for VecDeque<T, A>](https://doc.rust-lang.org/std/collections/struct.VecDeque.html#impl-From%3CVec%3CT%2C%20A%3E%3E-for-VecDeque%3CT%2C%20A%3E)
             Ok(Some(entries)) => entries.into(),
             Ok(None) => {
-                self.pager = None;
+                self.lister = None;
                 return None;
             }
             Err(err) => return Some(Err(err)),