diff --git src/bp-core/bp-core-attachments.php src/bp-core/bp-core-attachments.php
index 1fadb11..aeb25de 100644
--- src/bp-core/bp-core-attachments.php
+++ src/bp-core/bp-core-attachments.php
@@ -395,11 +395,32 @@ function bp_attachments_get_template_part( $slug ) {
 
 	// Load the attachment template in WP Administratin screens
 	if ( is_admin() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
-		$attachment_admin_template_part = buddypress()->themes_dir . '/bp-legacy/buddypress/' . $attachment_template_part . '.php';
+		// BP Legacy Templates dir
+		$attachment_admin_templates_dir = buddypress()->themes_dir . '/bp-legacy/buddypress/';
 
-		// Check the template part exists
+		// Path to the BP Legacy template
+		$attachment_admin_template_part = $attachment_admin_templates_dir . $attachment_template_part . '.php';
+
+		// The template part is not in BP Legacy, maybe in a plugin?
 		if ( ! file_exists( $attachment_admin_template_part ) ) {
-			return false;
+
+			/**
+			 * Filter here by returning true and setting your own path to your attachment template part using
+			 * $attachment_admin_template_part (passed by reference)
+			 *
+			 * @since  2.4.0
+			 *
+			 * @param  bool   $value True to use a custom template
+			 * @param  string $attachment_admin_template_part Path to the template part passed by reference
+			 * @param  string $slug the requested template slug eg: 'uploader' or 'custom_dir/custom_template'
+			 */
+			if ( false === apply_filters_ref_array( 'bp_attachments_get_admin_template_part', array( false, &$attachment_admin_template_part, $slug ) ) ) {
+				return false;
+
+			// A plugin is wishing to use his template part, let's check it exists.
+			} elseif ( ! file_exists( $attachment_admin_template_part ) ) {
+				return false;
+			}
 		}
 
 		// load the template part
