diff --git src/bp-core/bp-core-attachments.php src/bp-core/bp-core-attachments.php
index eeee64bd6..1f7255bf0 100644
--- src/bp-core/bp-core-attachments.php
+++ src/bp-core/bp-core-attachments.php
@@ -156,6 +156,7 @@ function bp_attachments_get_max_upload_file_size( $type = '' ) {
  * Get allowed types for any attachment.
  *
  * @since 2.4.0
+ * @since 11.0.0 Adds the support for .webp images to Avatars and Cover images.
  *
  * @param string $type The extension types to get.
  *                     Default: 'avatar'.
@@ -163,16 +164,16 @@ function bp_attachments_get_max_upload_file_size( $type = '' ) {
  */
 function bp_attachments_get_allowed_types( $type = 'avatar' ) {
 	// Defaults to BuddyPress supported image extensions.
-	$exts    = array( 'jpeg', 'gif', 'png' );
-	$wp_exts = wp_get_ext_types();
+	$exts = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png' );
+	if ( bp_is_running_wp( '5.8.0', '>=' ) ) {
+		$exts[] = 'webp';
+	}
 
-	/**
-	 * It's not a BuddyPress feature, get the allowed extensions
-	 * matching the $type requested.
-	 */
-	if ( 'avatar' !== $type && 'cover_image' !== $type ) {
+	// Avatar and cover image are images.
+	if ( 'image' !== $type && 'avatar' !== $type && 'cover_image' !== $type ) {
 		// Reset the default exts.
-		$exts = array();
+		$exts    = array();
+		$wp_exts = wp_get_ext_types();
 
 		if ( 'video' === $type ) {
 			$exts = wp_get_video_extensions();
@@ -689,6 +690,7 @@ function bp_attachments_get_plupload_l10n() {
 			'dismiss'                   => __( 'Dismiss', 'buddypress' ),
 			'crunching'                 => __( 'Crunching&hellip;', 'buddypress' ),
 			'unique_file_warning'       => __( 'Make sure to upload a unique file', 'buddypress' ),
+			'noneditable_image'         => __( 'This image cannot be processed by the web server. Convert it to JPEG or PNG before uploading.', 'buddypress' ),
 
 			/* translators: %s: File name. */
 			'error_uploading'           => __( '&#8220;%s&#8221; has failed to upload.', 'buddypress' ),
@@ -779,6 +781,15 @@ function bp_attachments_enqueue_scripts( $class = '' ) {
 		$defaults['filters']['max_file_size'] = $args['max_file_size'] . 'b';
 	}
 
+	if ( isset( $args['mime_types'] ) && $args['mime_types'] ) {
+		$defaults['filters']['mime_types'] =  array( array( 'extensions' => $args['mime_types'] ) );
+	}
+
+	// Check if WebP images can be edited.
+	if ( bp_is_running_wp( '5.8.0', '>=' ) && ! wp_image_editor_supports( array( 'mime_type' => 'image/webp' ) ) ) {
+		$defaults['webp_upload_error'] = true;
+	}
+
 	// Specific to BuddyPress Avatars.
 	if ( 'bp_avatar_upload' === $defaults['multipart_params']['action'] ) {
 
diff --git src/bp-core/classes/class-bp-attachment-avatar.php src/bp-core/classes/class-bp-attachment-avatar.php
index 21bfedd94..0c6d76569 100644
--- src/bp-core/classes/class-bp-attachment-avatar.php
+++ src/bp-core/classes/class-bp-attachment-avatar.php
@@ -399,6 +399,9 @@ class BP_Attachment_Avatar extends BP_Attachment {
 		// Get default script data.
 		$script_data = parent::script_data();
 
+		// Adds the list of supported image types.
+		$script_data['mime_types'] = implode( ',', bp_core_get_allowed_avatar_types() );
+
 		// Defaults to Avatar Backbone script.
 		$js_scripts = array( 'bp-avatar' );
 
diff --git src/bp-core/classes/class-bp-attachment-cover-image.php src/bp-core/classes/class-bp-attachment-cover-image.php
index 14a5a2ef8..8fc50113a 100644
--- src/bp-core/classes/class-bp-attachment-cover-image.php
+++ src/bp-core/classes/class-bp-attachment-cover-image.php
@@ -196,6 +196,9 @@ class BP_Attachment_Cover_Image extends BP_Attachment {
 		// Get default script data.
 		$script_data = parent::script_data();
 
+		// Adds the list of supported image types.
+		$script_data['mime_types'] = implode( ',', bp_attachments_get_allowed_types( 'cover_image' ) );
+
 		if ( bp_is_user() ) {
 			$item_id = bp_displayed_user_id();
 
diff --git src/bp-core/classes/class-bp-attachment.php src/bp-core/classes/class-bp-attachment.php
index 17bb3c553..6e92bab95 100644
--- src/bp-core/classes/class-bp-attachment.php
+++ src/bp-core/classes/class-bp-attachment.php
@@ -493,17 +493,8 @@ abstract class BP_Attachment {
 			$check_types['dst_file'] = array( 'file' => $r['dst_file'], 'error' => _x( 'destination file', 'Attachment destination file', 'buddypress' ) );
 		}
 
-		/**
-		 * WordPress image supported types.
-		 * @see wp_attachment_is()
-		 */
-		$supported_image_types = array(
-			'jpg'  => 1,
-			'jpeg' => 1,
-			'jpe'  => 1,
-			'gif'  => 1,
-			'png'  => 1,
-		);
+		// Set supported image types.
+		$supported_image_types = array_fill_keys( bp_attachments_get_allowed_types( 'image' ), 1 );
 
 		foreach ( $check_types as $file ) {
 			$is_image      = wp_check_filetype( $file['file'] );
diff --git src/bp-core/js/bp-plupload.js src/bp-core/js/bp-plupload.js
index 3416de196..e81e7bb57 100644
--- src/bp-core/js/bp-plupload.js
+++ src/bp-core/js/bp-plupload.js
@@ -162,6 +162,13 @@ window.bp = window.bp || {};
 					return;
 				}
 
+				if ( file.type === 'image/webp' && uploader.settings.webp_upload_error ) {
+					// Disallow uploading of WebP images if the server cannot edit them.
+					$( self ).trigger( 'bp-uploader-warning', self.strings.noneditable_image );
+					uploader.removeFile( file );
+					return;
+				}
+
 				if ( max > hundredmb && file.size > hundredmb && uploader.runtime !== 'html5' ) {
 					_this.uploadSizeError( uploader, file, true );
 				} else {
diff --git tests/phpunit/testcases/core/avatars.php tests/phpunit/testcases/core/avatars.php
index 98ecf0cfe..6d5195ada 100644
--- tests/phpunit/testcases/core/avatars.php
+++ tests/phpunit/testcases/core/avatars.php
@@ -257,19 +257,19 @@ class BP_Tests_Avatars extends BP_UnitTestCase {
 	public function test_bp_core_get_allowed_avatar_types_filter() {
 		add_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_add_type' ) );
 
-		$this->assertEquals( array( 'jpeg', 'gif', 'png' ), bp_core_get_allowed_avatar_types() );
+		$this->assertEquals( array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' ), bp_core_get_allowed_avatar_types() );
 
 		remove_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_add_type' ) );
 
 		add_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_remove_type' ) );
 
-		$this->assertEquals( array( 'gif', 'png' ), bp_core_get_allowed_avatar_types() );
+		$this->assertEquals( array( 'jpeg', 'jpe', 'gif', 'png', 'webp' ), bp_core_get_allowed_avatar_types() );
 
 		remove_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_remove_type' ) );
 
 		add_filter( 'bp_core_get_allowed_avatar_types', '__return_empty_array' );
 
-		$this->assertEquals( array( 'jpeg', 'gif', 'png' ), bp_core_get_allowed_avatar_types() );
+		$this->assertEquals( array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' ), bp_core_get_allowed_avatar_types() );
 
 		remove_filter( 'bp_core_get_allowed_avatar_types', '__return_empty_array' );
 	}
@@ -281,24 +281,24 @@ class BP_Tests_Avatars extends BP_UnitTestCase {
 	public function test_bp_core_get_allowed_avatar_mimes() {
 		$mimes = bp_core_get_allowed_avatar_mimes();
 
-		$this->assertEqualSets( array( 'jpeg', 'gif', 'png', 'jpg' ), array_keys( $mimes ) );
-		$this->assertEqualSets( array( 'image/jpeg', 'image/gif', 'image/png', 'image/jpeg' ), array_values( $mimes ) );
+		$this->assertEqualSets( array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' ), array_keys( $mimes ) );
+		$this->assertEqualSets( array( 'image/jpeg', 'image/jpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/webp' ), array_values( $mimes ) );
 
 		add_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_add_type' ) );
 
-		$this->assertEqualSets( array( 'image/jpeg', 'image/gif', 'image/png', 'image/jpeg' ), array_values( bp_core_get_allowed_avatar_mimes() ) );
+		$this->assertEqualSets( array( 'image/jpeg', 'image/jpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/webp' ), array_values( bp_core_get_allowed_avatar_mimes() ) );
 
 		remove_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_add_type' ) );
 
 		add_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_remove_type' ) );
 
-		$this->assertEqualSets( array( 'image/gif', 'image/png' ), array_values( bp_core_get_allowed_avatar_mimes() ) );
+		$this->assertEqualSets( array( 'image/jpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/webp', 'image/jpeg' ), array_values( bp_core_get_allowed_avatar_mimes() ) );
 
 		remove_filter( 'bp_core_get_allowed_avatar_types', array( $this, 'avatar_types_filter_remove_type' ) );
 
 		add_filter( 'bp_core_get_allowed_avatar_types', '__return_empty_array' );
 
-		$this->assertEqualSets( array( 'image/jpeg', 'image/gif', 'image/png', 'image/jpeg' ), array_values( bp_core_get_allowed_avatar_mimes() ) );
+		$this->assertEqualSets( array( 'image/jpeg', 'image/jpeg', 'image/jpeg', 'image/gif', 'image/png', 'image/webp' ), array_values( bp_core_get_allowed_avatar_mimes() ) );
 
 		remove_filter( 'bp_core_get_allowed_avatar_types', '__return_empty_array' );
 	}
diff --git tests/phpunit/testcases/core/functions.php tests/phpunit/testcases/core/functions.php
index 144b61be9..4eaa053c8 100644
--- tests/phpunit/testcases/core/functions.php
+++ tests/phpunit/testcases/core/functions.php
@@ -784,7 +784,7 @@ class BP_Tests_Core_Functions extends BP_UnitTestCase {
 	 * @group bp_attachments
 	 */
 	public function test_bp_attachments_get_allowed_types() {
-		$supported = array( 'jpeg', 'gif', 'png' );
+		$supported = array( 'jpg', 'jpeg', 'jpe', 'gif', 'png', 'webp' );
 
 		$avatar = bp_attachments_get_allowed_types( 'avatar' );
 		$this->assertSame( $supported, $avatar );
