diff --git src/bp-messages/bp-messages-notifications.php src/bp-messages/bp-messages-notifications.php
index e2855d746..176a950d6 100644
--- src/bp-messages/bp-messages-notifications.php
+++ src/bp-messages/bp-messages-notifications.php
@@ -284,7 +284,14 @@ function bp_messages_message_delete_notifications( $thread_id, $message_ids ) {
 	$thread = new BP_Messages_Thread( $thread_id );
 	foreach ( $thread->get_recipients() as $recipient ) {
 		foreach ( $message_ids as $message_id ) {
-			bp_notifications_delete_notifications_by_item_id( $recipient->user_id, (int) $message_id, buddypress()->messages->id, 'new_message' );
+			if ( ! empty( $recipient->user_id ) ) {
+				bp_notifications_delete_notifications_by_item_id(
+					$recipient->user_id,
+					(int) $message_id,
+					buddypress()->messages->id,
+					'new_message'
+				);
+			}
 		}
 	}
 }
diff --git src/bp-messages/bp-messages-template.php src/bp-messages/bp-messages-template.php
index d95da454c..5647c4426 100644
--- src/bp-messages/bp-messages-template.php
+++ src/bp-messages/bp-messages-template.php
@@ -1625,23 +1625,32 @@ function bp_message_get_recipient_usernames() {
  *
  * @param array|string $args {
  *     Array of arguments. All are optional.
- *     @type int    $thread_id         ID of the thread whose messages you are displaying.
- *                                     Default: if viewing a thread, the thread ID will be parsed from
- *                                     the URL (bp_action_variable( 0 )).
- *     @type string $order             'ASC' or 'DESC'. Default: 'ASC'.
- *     @type bool   $update_meta_cache Whether to pre-fetch metadata for
- *                                     queried message items. Default: true.
+ *     @type int      $thread_id         ID of the thread whose messages you are displaying.
+ *                                       Default: if viewing a thread, the thread ID will be parsed from
+ *                                       the URL (bp_action_variable( 0 )).
+ *     @type string   $order             'ASC' or 'DESC'. Default: 'ASC'.
+ *     @type bool     $update_meta_cache Whether to pre-fetch metadata for
+ *                                       queried message items. Default: true.
+ *     @type int|null $page              Page of messages being requested. Default to null, meaning all.
+ *     @type int|null $per_page          Messages to return per page. Default to null, meaning all.
  * }
+ *
  * @return bool True if there are messages to display, otherwise false.
  */
 function bp_thread_has_messages( $args = '' ) {
 	global $thread_template;
 
-	$r = bp_parse_args( $args, array(
-		'thread_id'         => false,
-		'order'             => 'ASC',
-		'update_meta_cache' => true,
-	), 'thread_has_messages' );
+	$r = bp_parse_args(
+		$args,
+		array(
+			'thread_id'         => false,
+			'order'             => 'ASC',
+			'update_meta_cache' => true,
+			'page'              => null,
+			'per_page'          => null,
+		),
+		'thread_has_messages'
+	);
 
 	if ( empty( $r['thread_id'] ) && bp_is_messages_component() && bp_is_current_action( 'view' ) ) {
 		$r['thread_id'] = (int) bp_action_variable( 0 );
diff --git src/bp-messages/classes/class-bp-messages-thread.php src/bp-messages/classes/class-bp-messages-thread.php
index bc5f93a5e..4c2d543a4 100644
--- src/bp-messages/classes/class-bp-messages-thread.php
+++ src/bp-messages/classes/class-bp-messages-thread.php
@@ -109,15 +109,26 @@ class BP_Messages_Thread {
 	 * Constructor.
 	 *
 	 * @since 1.0.0
+	 * @since 10.0.0 Updated the `$args` with new paremeters.
 	 *
-	 * @see BP_Messages_Thread::populate() for full description of parameters.
-	 *
-	 * @param bool   $thread_id ID for the message thread.
-	 * @param string $order     Order to display the messages in.
-	 * @param array  $args      Array of arguments for thread querying.
+	 * @param int    $thread_id          The message thread ID.
+	 * @param string $order              The order to sort the messages. Either 'ASC' or 'DESC'.
+	 *                                   Defaults to 'ASC'.
+	 * @param array  $args               {
+	 *     Array of arguments.
+	 *     @type int         $user_id             ID of the user to get the unread count.
+	 *     @type bool        $update_meta_cache   Whether to pre-fetch metadata for
+	 *                                            queried message items. Default: true.
+	 *     @type int|null    $page                Page of messages being requested. Default to null, meaning all.
+	 *     @type int|null    $per_page            Messages to return per page. Default to null, meaning all.
+	 *     @type string      $order               The order to sort the messages. Either 'ASC' or 'DESC'.
+	 *                                            Defaults to 'ASC'.
+	 *     @type int|null    $recipients_page     Page of recipients being requested. Default to null, meaning all.
+	 *     @type int|null    $recipients_per_page Recipients to return per page. Defaults to null, meaning all.
+	 * }
 	 */
-	public function __construct( $thread_id = false, $order = 'ASC', $args = array() ) {
-		if ( $thread_id ) {
+	public function __construct( $thread_id = 0, $order = 'ASC', $args = array() ) {
+		if ( ! empty( $thread_id ) ) {
 			$this->populate( $thread_id, $order, $args );
 		}
 	}
@@ -125,22 +136,31 @@ class BP_Messages_Thread {
 	/**
 	 * Populate method.
 	 *
-	 * Used in constructor.
+	 * Used in the constructor.
 	 *
 	 * @since 1.0.0
+	 * @since 10.0.0 Updated the `$args` with new paremeters.
 	 *
-	 * @param int    $thread_id The message thread ID.
-	 * @param string $order     The order to sort the messages. Either 'ASC' or 'DESC'.
-	 * @param array  $args {
+	 * @param int    $thread_id                   The message thread ID.
+	 * @param string $order                       The order to sort the messages. Either 'ASC' or 'DESC'.
+	 *                                            Defaults to 'ASC'.
+	 * @param array  $args                        {
 	 *     Array of arguments.
-	 *     @type bool $update_meta_cache Whether to pre-fetch metadata for
-	 *                                   queried message items. Default: true.
+	 *     @type int         $user_id             ID of the user to get the unread count.
+	 *     @type bool        $update_meta_cache   Whether to pre-fetch metadata for
+	 *                                            queried message items. Default: true.
+	 *     @type int|null    $page                Page of messages being requested. Default to null, meaning all.
+	 *     @type int|null    $per_page            Messages to return per page. Default to null, meaning all.
+	 *     @type string      $order               The order to sort the messages. Either 'ASC' or 'DESC'.
+	 *                                            Defaults to 'ASC'.
+	 *     @type int|null    $recipients_page     Page of recipients being requested. Default to null, meaning all.
+	 *     @type int|null    $recipients_per_page Recipients to return per page. Defaults to null, meaning all.
 	 * }
-	 * @return bool False on failure.
+	 * @return bool False if there are no messages.
 	 */
 	public function populate( $thread_id = 0, $order = 'ASC', $args = array() ) {
 
-		if ( 'ASC' !== $order && 'DESC' !== $order ) {
+		if ( ! in_array( strtoupper( $order ), array( 'ASC', 'DESC' ), true ) ) {
 			$order = 'ASC';
 		}
 
@@ -150,26 +170,29 @@ class BP_Messages_Thread {
 			bp_loggedin_user_id();
 
 		// Merge $args with our defaults.
-		$r = wp_parse_args( $args, array(
-			'user_id'           => $user_id,
-			'update_meta_cache' => true
-		) );
+		$r = wp_parse_args(
+			$args,
+			array(
+				'user_id'             => $user_id,
+				'update_meta_cache'   => true,
+				'page'                => null,
+				'per_page'            => null,
+				'order'               => $order,
+				'recipients_page'     => null,
+				'recipients_per_page' => null,
+			)
+		);
 
 		$this->messages_order = $order;
 		$this->thread_id      = (int) $thread_id;
 
 		// Get messages for thread.
-		$this->messages = self::get_messages( $this->thread_id );
+		$this->messages = self::get_messages( $this->thread_id, $r );
 
-		if ( empty( $this->messages ) || is_wp_error( $this->messages ) ) {
+		if ( empty( $this->messages ) ) {
 			return false;
 		}
 
-		// Flip if order is DESC.
-		if ( 'DESC' === $order ) {
-			$this->messages = array_reverse( $this->messages );
-		}
-
 		$last_message_index         = count( $this->messages ) - 1;
 		$this->last_message_id      = $this->messages[ $last_message_index ]->id;
 		$this->last_message_date    = $this->messages[ $last_message_index ]->date_sent;
@@ -182,9 +205,9 @@ class BP_Messages_Thread {
 		}
 
 		// Fetch the recipients.
-		$this->recipients = $this->get_recipients();
+		$this->recipients = $this->get_recipients( $thread_id, $r );
 
-		// Get the unread count for the logged in user.
+		// Get the unread count for the user.
 		if ( isset( $this->recipients[ $r['user_id'] ] ) ) {
 			$this->unread_count = $this->recipients[ $r['user_id'] ]->unread_count;
 		}
@@ -198,10 +221,12 @@ class BP_Messages_Thread {
 		 * Fires after a BP_Messages_Thread object has been populated.
 		 *
 		 * @since 2.2.0
+		 * @since 10.0.0 Added `$r` as a parameter.
 		 *
 		 * @param BP_Messages_Thread $this Message thread object.
+		 * @param array              $r    Array of paremeters.
 		 */
-		do_action( 'bp_messages_thread_post_populate', $this );
+		do_action( 'bp_messages_thread_post_populate', $this, $r );
 	}
 
 	/**
@@ -230,15 +255,21 @@ class BP_Messages_Thread {
 	 * Returns recipients for a message thread.
 	 *
 	 * @since 1.0.0
-	 * @since 2.3.0 Added $thread_id as a parameter.
+	 * @since 2.3.0  Added `$thread_id` as a parameter.
+	 * @since 10.0.0 Added `$args` as a parameter.
 	 *
 	 * @global BuddyPress $bp The one true BuddyPress instance.
 	 * @global wpdb $wpdb WordPress database object.
 	 *
-	 * @param int $thread_id The thread ID.
+	 * @param int   $thread_id Message thread ID.
+	 * @param array $args      {
+	 *     Array of arguments.
+	 *     @type int|null $recipients_page     Page of recipients being requested. Default to all.
+	 *     @type int|null $recipients_per_page Recipients to return per page. Defaults to all.
+	 * }
 	 * @return array
 	 */
-	public function get_recipients( $thread_id = 0 ) {
+	public function get_recipients( $thread_id = 0, $args = array() ) {
 		global $wpdb;
 
 		if ( empty( $thread_id ) ) {
@@ -247,74 +278,155 @@ class BP_Messages_Thread {
 
 		$thread_id = (int) $thread_id;
 
+		if ( empty( $thread_id ) ) {
+			return array();
+		}
+
+		$bp = buddypress();
+		$r  = wp_parse_args(
+			$args,
+			array(
+				'recipients_page'     => null,
+				'recipients_per_page' => null,
+			)
+		);
+
+		// Get recipients from cache if available.
 		$recipients = wp_cache_get( 'thread_recipients_' . $thread_id, 'bp_messages' );
-		if ( false === $recipients ) {
-			$bp = buddypress();
 
-			$recipients = array();
-			$sql        = $wpdb->prepare( "SELECT * FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d", $thread_id );
-			$results    = $wpdb->get_results( $sql );
+		// Get recipients and cache it.
+		if ( empty( $recipients ) ) {
+
+			// Query recipients.
+			$results = $wpdb->get_results(
+				$wpdb->prepare(
+					"SELECT * FROM {$bp->messages->table_name_recipients} WHERE thread_id = %d",
+					$thread_id
+				)
+			);
 
+			$recipients = array();
 			foreach ( (array) $results as $recipient ) {
 				$recipients[ $recipient->user_id ] = $recipient;
 			}
 
+			// Cast all items from the messages DB table as integers.
+			foreach ( (array) $recipients as $key => $data ) {
+				$recipients[ $key ] = (object) array_map( 'intval', (array) $data );
+			}
+
+			// Cache recipients.
 			wp_cache_set( 'thread_recipients_' . $thread_id, $recipients, 'bp_messages' );
 		}
 
-		// Cast all items from the messages DB table as integers.
-		foreach ( (array) $recipients as $key => $data ) {
-			$recipients[ $key ] = (object) array_map( 'intval', (array) $data );
+		// Paginate the results.
+		if ( ! empty( $recipients ) && $r['recipients_per_page'] && $r['recipients_page'] ) {
+			$start      = ( $r['recipients_page'] - 1 ) * ( $r['recipients_per_page'] );
+			$recipients = array_slice( $recipients, $start, $r['recipients_per_page'] );
 		}
 
 		/**
 		 * Filters the recipients of a message thread.
 		 *
 		 * @since 2.2.0
+		 * @since 10.0.0 Added `$r` as a parameter.
 		 *
 		 * @param array $recipients Array of recipient objects.
-		 * @param int   $thread_id  ID of the current thread.
+		 * @param int   $thread_id  ID of the thread.
+		 * @param array $r          An array of parameters.
 		 */
-		return apply_filters( 'bp_messages_thread_get_recipients', $recipients, $thread_id );
+		return apply_filters( 'bp_messages_thread_get_recipients', (array) $recipients, (int) $thread_id, (array) $r );
 	}
 
 	/** Static Functions ******************************************************/
 
 	/**
-	 * Get all messages associated with a thread.
+	 * Get messages associated with a thread.
 	 *
 	 * @since 2.3.0
+	 * @since 10.0.0 Added `$args` as a parameter.
 	 *
 	 * @global BuddyPress $bp The one true BuddyPress instance.
 	 * @global wpdb $wpdb WordPress database object.
 	 *
-	 * @param int $thread_id The message thread ID.
-	 *
-	 * @return array List of messages associated with a thread.
+	 * @param int   $thread_id The message thread ID.
+	 * @param array $args      {
+	 *     Array of arguments.
+	 *     @type int|null    $page     Page of messages being requested. Default to all.
+	 *     @type int|null    $per_page Messages to return per page. Default to all.
+	 *     @type string      $order    The order to sort the messages. Either 'ASC' or 'DESC'.
+	 *                                 Defaults to 'ASC'.
+	 * }
+	 * @return array
 	 */
-	public static function get_messages( $thread_id = 0 ) {
+	public static function get_messages( $thread_id = 0, $args = array() ) {
+		global $wpdb;
+
 		$thread_id = (int) $thread_id;
-		$messages  = wp_cache_get( $thread_id, 'bp_messages_threads' );
+		if ( empty( $thread_id ) ) {
+			return array();
+		}
 
-		if ( false === $messages ) {
-			global $wpdb;
+		$bp = buddypress();
+		$r  = wp_parse_args(
+			$args,
+			array(
+				'page'     => null,
+				'per_page' => null,
+				'order'    => 'ASC',
+			)
+		);
 
-			$bp = buddypress();
+		// Fallback.
+		if ( ! in_array( strtoupper( $r['order'] ), array( 'ASC', 'DESC' ), true ) ) {
+			$r['order'] = 'ASC';
+		}
 
-			// Always sort by ASC by default.
-			$messages = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$bp->messages->table_name_messages} WHERE thread_id = %d ORDER BY date_sent ASC", $thread_id ) );
+		// Get messages from cache if available.
+		$messages = wp_cache_get( $thread_id, 'bp_messages_threads' );
 
+		// Get messages and cache it.
+		if ( empty( $messages ) ) {
+
+			$messages = $wpdb->get_results(
+				$wpdb->prepare(
+					"SELECT * FROM {$bp->messages->table_name_messages} WHERE thread_id = %d ORDER BY date_sent ASC",
+					$thread_id
+				)
+			);
+
+			// Integer casting.
+			foreach ( $messages as $key => $data ) {
+				$messages[ $key ]->id        = (int) $messages[ $key ]->id;
+				$messages[ $key ]->thread_id = (int) $messages[ $key ]->thread_id;
+				$messages[ $key ]->sender_id = (int) $messages[ $key ]->sender_id;
+			}
+
+			// Cache request.
 			wp_cache_set( $thread_id, (array) $messages, 'bp_messages_threads' );
 		}
 
-		// Integer casting.
-		foreach ( $messages as $key => $data ) {
-			$messages[ $key ]->id        = (int) $messages[ $key ]->id;
-			$messages[ $key ]->thread_id = (int) $messages[ $key ]->thread_id;
-			$messages[ $key ]->sender_id = (int) $messages[ $key ]->sender_id;
+		// Flip if order is DESC.
+		if ( 'DESC' === strtoupper( $r['order'] ) ) {
+			$messages = array_reverse( $messages );
 		}
 
-		return $messages;
+		// Paginate the results.
+		if ( ! empty( $messages ) && $r['per_page'] && $r['page'] ) {
+			$start    = ( $r['page'] - 1 ) * ( $r['per_page'] );
+			$messages = array_slice( $messages, $start, $r['per_page'] );
+		}
+
+		/**
+		 * Filters the messages associated with a thread.
+		 *
+		 * @since 10.0.0
+		 *
+		 * @param array $messages   Array of message objects.
+		 * @param int   $thread_id  ID of the thread.
+		 * @param array $r          An array of parameters.
+		 */
+		return apply_filters( 'bp_messages_thread_get_messages', (array) $messages, (int) $thread_id, (array) $r );
 	}
 
 	/**
@@ -845,7 +957,7 @@ class BP_Messages_Thread {
 	 * @since 1.0.0
 	 *
 	 * @param int $thread_id The message thread ID.
-	 * @param int $user_id   The user ID.
+	 * @param int $user_id   The user ID. Default: ID of the logged-in user.
 	 * @return int|null The recorded recipient ID on success, null on failure.
 	 */
 	public static function check_access( $thread_id, $user_id = 0 ) {
@@ -856,11 +968,11 @@ class BP_Messages_Thread {
 
 		$recipients = self::get_recipients_for_thread( $thread_id );
 
-		if ( isset( $recipients[ $user_id ] ) && 0 == $recipients[ $user_id ]->is_deleted ) {
+		if ( isset( $recipients[ $user_id ] ) && 0 === $recipients[ $user_id ]->is_deleted ) {
 			return $recipients[ $user_id ]->id;
-		} else {
-			return null;
 		}
+
+		return null;
 	}
 
 	/**
diff --git tests/phpunit/testcases/messages/class.bp-messages-thread.php tests/phpunit/testcases/messages/class.bp-messages-thread.php
index f9de1d1cd..946a87edb 100644
--- tests/phpunit/testcases/messages/class.bp-messages-thread.php
+++ tests/phpunit/testcases/messages/class.bp-messages-thread.php
@@ -9,7 +9,7 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 	/**
 	 * @group cache
 	 */
-	public function test_construct_cache() {
+	public function construct_cache() {
 		$u1 = self::factory()->user->create();
 		$u2 = self::factory()->user->create();
 
@@ -30,6 +30,66 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 		);
 	}
 
+	public function test_get_messages_with_invalid_thread_id() {
+		$this->assertTrue( empty( BP_Messages_Thread::get_messages( 0 ) ) );
+	}
+
+	public function test_get_messages_using_arguments() {
+		$u1 = self::factory()->user->create();
+		$u2 = self::factory()->user->create();
+		$m1 = self::factory()->message->create_and_get( array(
+			'sender_id' => $u1,
+			'recipients' => array( $u2 ),
+			'subject' => 'Foo',
+		) );
+
+		self::factory()->message->create_many(
+			98,
+			array(
+				'thread_id' => $m1->thread_id,
+				'sender_id' => $u2,
+				'recipients' => array( $u1 ),
+				'subject' => 'Bar',
+			)
+		);
+
+		// Last message
+		self::factory()->message->create(
+			array(
+				'thread_id' => $m1->thread_id,
+				'sender_id' => $u1,
+				'recipients' => array( $u2 ),
+				'subject' => 'Last Message',
+			)
+		);
+
+		// Default results.
+		$messages = BP_Messages_Thread::get_messages( $m1->thread_id );
+		$this->assertTrue( 100 === count( $messages ) );
+
+		// Get first 10 messages.
+		$messages = BP_Messages_Thread::get_messages( $m1->thread_id, array( 'page' => 1, 'per_page' => 10 ) );
+		$this->assertTrue( 10 === count( $messages ) );
+
+		// Get first 10 messages differently.
+		$thread = new BP_Messages_Thread( $m1->thread_id, 'ASC', array( 'page' => 1, 'per_page' => 10 ) );
+		$this->assertTrue( 10 === count( $thread->messages ) );
+
+		// Get all messages.
+		$messages = BP_Messages_Thread::get_messages( $m1->thread_id, array( 'page' => null, 'per_page' => null ) );
+		$this->assertTrue( 100 === count( $messages ) );
+
+		// Get all mesages differently.
+		$thread = new BP_Messages_Thread( $m1->thread_id, 'ASC', array( 'page' => null, 'per_page' => null ) );
+		$this->assertTrue( 100 === count( $thread->messages ) );
+
+		// Get last message.
+		$messages = BP_Messages_Thread::get_messages( $m1->thread_id, array( 'page' => 100, 'per_page' => 1 ) );
+		$this->assertTrue( 1 === count( $messages ) );
+		$this->assertEquals( $u1, $messages[0]->sender_id );
+		$this->assertEquals( 'Last Message', $messages[0]->subject );
+	}
+
 	/**
 	 * @group order
 	 */
@@ -39,29 +99,53 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 
 		// create thread
 		$message_1 = self::factory()->message->create_and_get( array(
-			'sender_id' => $u1,
+			'sender_id'  => $u1,
 			'recipients' => array( $u2 ),
-			'subject' => 'Foo',
+			'subject'    => 'Foo',
 		) );
-		$m1 = $message_1->id;
 
 		// create reply
 		$message_2 = self::factory()->message->create_and_get( array(
-			'thread_id' => $message_1->thread_id,
-			'sender_id' => $u1,
+			'thread_id'  => $message_1->thread_id,
+			'sender_id'  => $u1,
 			'recipients' => array( $u2 ),
-			'content' => 'Bar'
+			'content'    => 'Bar'
 		) );
-		$m2 = $message_2->id;
 
-		// now get thread by DESC
+		// Default sort from constructor.
+		$thread = new BP_Messages_Thread( $message_1->thread_id );
+		$this->assertEquals(
+			array( $message_1->id, $message_2->id ),
+			wp_list_pluck( $thread->messages, 'id' )
+		);
+
+		// Default via the helper method.
+		$messages = BP_Messages_Thread::get_messages( $message_1->thread_id );
+		$this->assertEquals(
+			array( $message_1->id, $message_2->id ),
+			wp_list_pluck( $messages, 'id' )
+		);
+
+		// Now get thread by DESC via the constructor.
 		$thread = new BP_Messages_Thread( $message_1->thread_id, 'DESC' );
+		$this->assertEquals(
+			array( $message_2->id, $message_1->id ),
+			wp_list_pluck( $thread->messages, 'id' )
+		);
 
-		// assert!
+		// Testing sort with lowercase.
+		$thread = new BP_Messages_Thread( $message_1->thread_id, 'desc' );
 		$this->assertEquals(
-			array( $m2, $m1 ),
+			array( $message_2->id, $message_1->id ),
 			wp_list_pluck( $thread->messages, 'id' )
 		);
+
+		// Now sorting via the helper method.
+		$messages = BP_Messages_Thread::get_messages( $message_1->thread_id, array( 'order' => 'desc' ) );
+		$this->assertEquals(
+			array( $message_2->id, $message_1->id ),
+			wp_list_pluck( $messages, 'id' )
+		);
 	}
 
 	/**
@@ -71,7 +155,7 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 		$u1 = self::factory()->user->create();
 		$u2 = self::factory()->user->create();
 
-		$message_1 = self::factory()->message->create_and_get( array(
+		self::factory()->message->create_and_get( array(
 			'sender_id' => $u1,
 			'recipients' => array( $u2 ),
 			'subject' => 'Foo',
@@ -101,7 +185,7 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 		$u1 = self::factory()->user->create();
 		$u2 = self::factory()->user->create();
 
-		$message_1 = self::factory()->message->create_and_get( array(
+		self::factory()->message->create_and_get( array(
 			'sender_id' => $u1,
 			'recipients' => array( $u2 ),
 			'subject' => 'Foo',
@@ -133,7 +217,7 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 		$u1 = self::factory()->user->create();
 		$u2 = self::factory()->user->create();
 
-		$message_1 = self::factory()->message->create_and_get( array(
+		self::factory()->message->create_and_get( array(
 			'sender_id' => $u1,
 			'recipients' => array( $u2 ),
 			'subject' => 'Foo',
@@ -153,6 +237,28 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 		$this->assertSame( $expected, $found );
 	}
 
+	/**
+	 * @group get_recipients
+	 */
+	public function test_get_recipients_paginated() {
+		$u1       = self::factory()->user->create();
+		$user_ids = self::factory()->user->create_many( 9 );
+		$m        = self::factory()->message->create_and_get( array(
+			'sender_id'  => $u1,
+			'recipients' => $user_ids,
+			'subject'    => 'Foo',
+		) );
+
+		$thread_1 = new BP_Messages_Thread( $m->thread_id );
+		$this->assertTrue( 10 === count( $thread_1->get_recipients() ) );
+
+		$thread_2 = new BP_Messages_Thread( $m->thread_id, 'ASC', array( 'recipients_page' => 1, 'recipients_per_page' => 5 ) );
+		$this->assertTrue( 5 === count( $thread_2->recipients ) );
+
+		$thread_3 = new BP_Messages_Thread( $m->thread_id );
+		$this->assertTrue( 8 === count( $thread_3->get_recipients( $m->thread_id, array( 'recipients_page' => 1, 'recipients_per_page' => 8 ) ) ) );
+	}
+
 	/**
 	 * @group get_recipients
 	 * @group cache
@@ -196,11 +302,11 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 		) );
 
 		$thread = new BP_Messages_Thread( $message->thread_id );
-		$recipients = $thread->get_recipients();
+		$thread->get_recipients();
 
 		// Verify that the cache is populated.
 		$num_queries = $wpdb->num_queries;
-		$recipients_cached = $thread->get_recipients();
+		$thread->get_recipients();
 		$this->assertEquals( $num_queries, $wpdb->num_queries );
 
 		messages_new_message( array(
@@ -213,7 +319,7 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 
 		// Cache should be empty.
 		$num_queries = $wpdb->num_queries;
-		$recipients_uncached = $thread->get_recipients();
+		$thread->get_recipients();
 		$this->assertEquals( $num_queries + 1, $wpdb->num_queries );
 	}
 
@@ -236,11 +342,11 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 		$t1 = $message->thread_id;
 
 		$thread = new BP_Messages_Thread( $t1 );
-		$recipients = $thread->get_recipients();
+		$thread->get_recipients();
 
 		// Verify that the cache is populated.
 		$num_queries = $wpdb->num_queries;
-		$recipients_cached = $thread->get_recipients();
+		$thread->get_recipients();
 		$this->assertEquals( $num_queries, $wpdb->num_queries );
 
 		messages_delete_thread( $t1 );
@@ -268,11 +374,11 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 		$t1 = $message->thread_id;
 
 		$thread = new BP_Messages_Thread( $t1 );
-		$recipients = $thread->get_recipients();
+		$thread->get_recipients();
 
 		// Verify that the cache is populated.
 		$num_queries = $wpdb->num_queries;
-		$recipients_cached = $thread->get_recipients();
+		$thread->get_recipients();
 		$this->assertEquals( $num_queries, $wpdb->num_queries );
 
 		messages_delete_thread( array( $t1 ) );
@@ -396,11 +502,11 @@ class BP_Tests_BP_Messages_Thread extends BP_UnitTestCase {
 		$t1 = $message->thread_id;
 
 		$thread = new BP_Messages_Thread( $t1 );
-		$recipients = $thread->get_recipients();
+		$thread->get_recipients();
 
 		// Verify that the cache is populated.
 		$num_queries = $wpdb->num_queries;
-		$recipients_cached = $thread->get_recipients();
+		$thread->get_recipients();
 		$this->assertEquals( $num_queries, $wpdb->num_queries );
 
 		// Mark thread as unread
