diff --git src/bp-core/bp-core-avatars.php src/bp-core/bp-core-avatars.php
index bef7735..3667af5 100644
--- src/bp-core/bp-core-avatars.php
+++ src/bp-core/bp-core-avatars.php
@@ -1236,6 +1236,81 @@ function bp_avatar_ajax_set() {
 add_action( 'wp_ajax_bp_avatar_set', 'bp_avatar_ajax_set' );
 
 /**
+ * Use the absolute path to an image to set an object's avatar
+ *
+ * @since BuddyPress (?)
+ *
+ * @param  array  $args {
+ *     @type int    $item_id   The ID of the object
+ *     @type string $type      The type of the object (eg: group, user, blog)
+ *     @type string $component The component for the object (eg: groups, xprofile, blogs)
+ *     @type string $image     The absolute path to the image
+ *     @type int $crop_x       The horizontal starting point of the crop. Default: 0.
+ *     @type int $crop_y       The vertical starting point of the crop. Default: 0.
+ * }
+ * @return bool  true on success, false otherwise
+ */
+function bp_avatar_create_item_avatar( $args = array() ) {
+	$r = bp_parse_args( $args, array(
+		'item_id'   => 0,
+		'type'      => 'user',
+		'component' => 'xprofile',
+		'image'     => '',
+		'crop_x'    => 0,
+		'crop_y'    => 0
+	), 'create_item_avatar' );
+
+	if ( empty( $r['item_id'] ) || ! file_exists( $r['image'] ) || ! @getimagesize( $r['image'] ) ) {
+		return false;
+	}
+
+	if ( is_callable( $r['component'] . '_avatar_upload_dir' ) ) {
+		$dir_args = array( $r['item_id'] );
+
+		// In case  of xprofile, we need an extra argument
+		if ( 'xprofile' === $r['component'] ) {
+			$dir_args = array( false, $r['item_id'] );
+		}
+
+		$avatar_data = call_user_func_array( $r['component'] . '_avatar_upload_dir', $dir_args );
+	}
+
+	if ( ! isset( $avatar_data['path'] ) || ! isset( $avatar_data['subdir'] ) ) {
+		return false;
+	}
+
+	// It's not a regular upload, we may need to create this folder
+	if( ! is_dir( $avatar_data['path'] ) ) {
+		if ( ! wp_mkdir_p( $avatar_data['path'] ) ) {
+			return false;
+		}
+	}
+
+	$image_file_name = wp_unique_filename( $avatar_data['path'], basename( $r['image'] ) );
+
+	// Copy the image file into the avatar dir
+	copy( $r['image'], $avatar_data['path'] . '/' . $image_file_name );
+
+	// Check the original file is copied
+	if ( ! file_exists( $avatar_data['path'] . '/' . $image_file_name ) ) {
+		return false;
+	}
+
+	if ( ! bp_core_avatar_handle_crop( array(
+		'object'        => $r['type'],
+		'avatar_dir'    => trim( dirname( $avatar_data['subdir'] ), '/' ),
+		'item_id'       => (int) $r['item_id'],
+		'original_file' => trailingslashit( $avatar_data['subdir'] ) . $image_file_name,
+		'crop_x'        => $r['crop_x'],
+		'crop_y'        => $r['crop_y']
+	) ) ) {
+		return false;
+	} else {
+		return true;
+	}
+}
+
+/**
  * Replace default WordPress avatars with BP avatars, if available.
  *
  * Filters 'get_avatar'.
