Index: src/wp-includes/class-wp-network-query.php
===================================================================
--- src/wp-includes/class-wp-network-query.php	(revision 41352)
+++ src/wp-includes/class-wp-network-query.php	(working copy)
@@ -98,6 +98,9 @@
  	 *     @type int          $number               Maximum number of networks to retrieve. Default empty (no limit).
  	 *     @type int          $offset               Number of networks to offset the query. Used to build LIMIT clause.
  	 *                                              Default 0.
+         *     @type int          $paged                When used with $number, defines the page of results to return.
+         *                                              When used with $offset, $offset takes precedence. 
+         *                                              If 0 same as default. Default 1.
  	 *     @type bool         $no_found_rows        Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true.
  	 *     @type string|array $orderby              Network status or array of statuses. Accepts 'id', 'domain', 'path',
  	 *                                              'domain_length', 'path_length' and 'network__in'. Also accepts false,
@@ -121,6 +124,7 @@
 			'fields'               => '',
 			'number'               => '',
 			'offset'               => '',
+                        'paged'                => 1,
 			'no_found_rows'        => true,
 			'orderby'              => 'id',
 			'order'                => 'ASC',
@@ -326,14 +330,19 @@
 
 		$number = absint( $this->query_vars['number'] );
 		$offset = absint( $this->query_vars['offset'] );
+                $paged  = absint( $this->query_vars['paged'] );
 
-		if ( ! empty( $number ) ) {
-			if ( $offset ) {
-				$limits = 'LIMIT ' . $offset . ',' . $number;
-			} else {
-				$limits = 'LIMIT ' . $number;
-			}
-		}
+                // Limit
+                if ( $number > 0 ) {
+                        if ( $offset > 0 ) {
+                                $calc_offset = $offset;
+                        } elseif( $paged > 0 ) {
+                                $calc_offset = $number * ( $paged - 1 );
+                        } else {
+                                $calc_offset = 0;
+                        }
+                        $limits = $wpdb->prepare( "LIMIT %d, %d", $calc_offset, $number );
+                }
 
 		if ( $this->query_vars['count'] ) {
 			$fields = 'COUNT(*)';
Index: src/wp-includes/class-wp-site-query.php
===================================================================
--- src/wp-includes/class-wp-site-query.php	(revision 41352)
+++ src/wp-includes/class-wp-site-query.php	(working copy)
@@ -92,6 +92,7 @@
 	 *
 	 * @since 4.6.0
 	 * @since 4.8.0 Introduced the 'lang_id', 'lang__in', and 'lang__not_in' parameters.
+	 * @since 4.9.0 Introduced the 'paged' argument. 
 	 *
 	 * @param string|array $query {
 	 *     Optional. Array or query string of site query parameters. Default empty.
@@ -108,6 +109,9 @@
 	 *     @type int          $number            Maximum number of sites to retrieve. Default 100.
 	 *     @type int          $offset            Number of sites to offset the query. Used to build LIMIT clause.
 	 *                                           Default 0.
+    	 *     @type int          $paged             When used with $number, defines the page of results to return. 
+    	 *                                           When used with $offset, $offset takes precedence. 
+	 *                                           If 0 same as default. Default 1. 
 	 *     @type bool         $no_found_rows     Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true.
 	 *     @type string|array $orderby           Site status or array of statuses. Accepts 'id', 'domain', 'path',
 	 *                                           'network_id', 'last_updated', 'registered', 'domain_length',
@@ -147,6 +151,7 @@
 			'site__not_in'      => '',
 			'number'            => 100,
 			'offset'            => '',
+			'paged'             => 1,
 			'no_found_rows'     => true,
 			'orderby'           => 'id',
 			'order'             => 'ASC',
@@ -370,15 +375,20 @@
 
 		$number = absint( $this->query_vars['number'] );
 		$offset = absint( $this->query_vars['offset'] );
+		$paged  = absint( $this->query_vars['paged'] ); 
+	
+                // Limit
+                if ( $number > 0 ) {
+                        if ( $offset > 0 ) {
+                                $calc_offset = $offset;
+                        } elseif( $paged > 0 ) {
+                                $calc_offset = $number * ( $paged - 1 );
+                        } else {
+                                $calc_offset = 0;
+                        }
+                        $limits = $wpdb->prepare( "LIMIT %d, %d", $calc_offset, $number );
+                }
 
-		if ( ! empty( $number ) ) {
-			if ( $offset ) {
-				$limits = 'LIMIT ' . $offset . ',' . $number;
-			} else {
-				$limits = 'LIMIT ' . $number;
-			}
-		}
-
 		if ( $this->query_vars['count'] ) {
 			$fields = 'COUNT(*)';
 		} else {
Index: tests/phpunit/tests/multisite/networkQuery.php
===================================================================
--- tests/phpunit/tests/multisite/networkQuery.php	(revision 41352)
+++ tests/phpunit/tests/multisite/networkQuery.php	(working copy)
@@ -452,6 +452,83 @@
 		) );
 		$this->assertEquals( $number_of_queries + 1, $wpdb->num_queries );
 	}
+
+        /**
+         * @ticket 41819
+         */
+        public function test_wp_network_query_by_paged() {
+
+                $n1 = get_network_by_path( 'wordpress.org', '/' );
+                $n2 = get_network_by_path( 'make.wordpress.org', '/' );
+                $n3 = get_network_by_path( 'www.wordpress.net', '/' );
+                $n4 = get_network_by_path( 'www.w.org', '/foo/' );
+
+                $q = new WP_Network_Query();
+
+                $actual = $q->query( array(
+                        'fields'        => 'ids',
+                        'network__in'   => array( $n1->id, $n2->id, $n3->id, $n4->id ),
+                        'number'        => 2,
+                        'paged'         => 2,
+                        'orderby'       => 'network__in',
+                        'order'         => 'ASC'
+                ) );
+
+                $expected = array( $n3->id, $n4->id );
+
+                $this->assertEquals( $actual, $expected );
+        }
+
+        /**
+         * @ticket 41819
+         */
+        public function test_wp_network_query_offset_should_take_precedence_over_paged() {
+
+                $n1 = get_network_by_path( 'wordpress.org', '/' );
+                $n2 = get_network_by_path( 'make.wordpress.org', '/' );
+                $n3 = get_network_by_path( 'www.wordpress.net', '/' );
+                $n4 = get_network_by_path( 'www.w.org', '/foo/' );
+
+                $q = new WP_Network_Query();
+
+                $actual = $q->query( array(
+                        'fields'        => 'ids',
+                        'network__in'   => array( $n1->id, $n2->id, $n3->id, $n4->id ),
+                        'number'        => 2,
+                        'offset'        => 1,
+                        'paged'         => 2,
+                        'orderby'       => 'network__in',
+                        'order'         => 'ASC'
+                ) );
+
+                $expected = array( $n2->id, $n3->id );
+
+                $this->assertEquals( $actual, $expected );
+        }
+
+        /**
+         * @ticket 41819
+         */
+        public function test_wp_network_query_paged_zero_same_as_paged_one() {
+
+                $q0 = new WP_Network_Query();
+
+                $actual0 = $q0->query( array(
+                        'number'        => 2,
+                        'paged'         => 0,
+                ) );
+
+                $q1 = new WP_Network_Query();
+
+                $actual1 = $q1->query( array(
+                        'number'        => 2,
+                        'paged'         => 1,
+                ) );
+
+                $this->assertSame( $q0->request, $q1->request );
+        }
+
 }
 
 endif;
+
Index: tests/phpunit/tests/multisite/siteQuery.php
===================================================================
--- tests/phpunit/tests/multisite/siteQuery.php	(revision 41352)
+++ tests/phpunit/tests/multisite/siteQuery.php	(working copy)
@@ -737,6 +737,82 @@
 		) );
 		$this->assertEquals( $number_of_queries + 1, $wpdb->num_queries );
 	}
+
+	/**
+	 * @ticket 41819
+	 */
+        public function test_wp_site_query_by_paged() {
+
+  		$s1 = get_site_by_path( 'www.w.org', '/' );
+  		$s2 = get_site_by_path( 'www.w.org', '/foo/' );
+  		$s3 = get_site_by_path( 'www.w.org', '/foo/bar/' );
+  		$s4 = get_site_by_path( 'www.w.org', '/make/' );
+
+                $q = new WP_Site_Query();
+
+                $actual = $q->query( array(
+			'fields'     	=> 'ids',
+			'site__in'	=> array( $s1->blog_id, $s2->blog_id, $s3->blog_id, $s4->blog_id ),
+                        'number'	=> 2,
+                        'paged' 	=> 2,
+			'orderby'	=> 'site__in',
+			'order'		=> 'ASC'
+                ) );
+
+		$expected = array( $s3->blog_id, $s4->blog_id ); 
+
+                $this->assertEquals( $actual, $expected );
+        }
+
+	/**
+	 * @ticket 41819
+	 */
+        public function test_wp_site_query_offset_should_take_precedence_over_paged() {
+
+  		$s1 = get_site_by_path( 'www.w.org', '/' );
+  		$s2 = get_site_by_path( 'www.w.org', '/foo/' );
+  		$s3 = get_site_by_path( 'www.w.org', '/foo/bar/' );
+  		$s4 = get_site_by_path( 'www.w.org', '/make/' );
+
+                $q = new WP_Site_Query();
+
+                $actual = $q->query( array(
+			'fields'     	=> 'ids',
+			'site__in'	=> array( $s1->blog_id, $s2->blog_id, $s3->blog_id, $s4->blog_id ),
+                        'number'	=> 2,
+			'offset'	=> 1,
+                        'paged' 	=> 2,
+			'orderby'	=> 'site__in',
+			'order'		=> 'ASC'
+                ) );
+
+		$expected = array( $s2->blog_id, $s3->blog_id ); 
+
+                $this->assertEquals( $actual, $expected );
+        }
+
+	/**
+	 * @ticket 41819
+	 */
+        public function test_wp_site_query_paged_zero_same_as_paged_one() {
+
+                $q0 = new WP_Site_Query();
+
+                $actual0 = $q0->query( array(
+                        'number'	=> 2,
+                        'paged' 	=> 0,
+                ) );
+
+                $q1 = new WP_Site_Query();
+
+                $actual1 = $q1->query( array(
+                        'number'	=> 2,
+                        'paged' 	=> 1,
+                ) );
+
+                $this->assertSame( $q0->request, $q1->request );
+        }
+
 }
 
 endif;
