diff --git src/bp-core/bp-core-avatars.php src/bp-core/bp-core-avatars.php
index 7992132..bde4bb9 100644
--- src/bp-core/bp-core-avatars.php
+++ src/bp-core/bp-core-avatars.php
@@ -174,29 +174,24 @@ add_action( 'bp_setup_globals', 'bp_core_set_avatar_globals' );
  * @return string Formatted HTML <img> element, or raw avatar URL based on $html arg.
  */
 function bp_core_fetch_avatar( $args = '' ) {
+	$bp = buddypress();
 
 	// If avatars are disabled for the root site, obey that request and bail
-	if ( ! buddypress()->avatar->show_avatars )
+	if ( ! $bp->avatar->show_avatars ) {
 		return;
+	}
 
 	global $current_blog;
 
-	$bp = buddypress();
-
-	// Set a few default variables
-	$def_object = 'user';
-	$def_type   = 'thumb';
-	$def_class  = 'avatar';
-
-	// Set the default variables array
+	// Set the default variables array and parse it against incoming $args array.
 	$params = wp_parse_args( $args, array(
 		'item_id'    => false,
-		'object'     => $def_object, // user/group/blog/custom type (if you use filters)
-		'type'       => $def_type,   // thumb or full
+		'object'     => 'user', 	 // user/group/blog/custom type (if you use filters)
+		'type'       => 'thumb',   	 // thumb or full
 		'avatar_dir' => false,       // Specify a custom avatar directory for your object
 		'width'      => false,       // Custom width (int)
 		'height'     => false,       // Custom height (int)
-		'class'      => $def_class,  // Custom <img> class (string)
+		'class'      => 'avatar',  	 // Custom <img> class (string)
 		'css_id'     => false,       // Custom <img> ID (string)
 		'alt'        => '',    	     // Custom <img> alt (string)
 		'email'      => false,       // Pass the user email (for gravatar) to prevent querying the DB for it
@@ -204,154 +199,160 @@ function bp_core_fetch_avatar( $args = '' ) {
 		'html'       => true,        // Wrap the return img URL in <img />
 		'title'      => ''           // Custom <img> title (string)
 	) );
-	extract( $params, EXTR_SKIP );
 
 	/** Set item_id ***********************************************************/
 
-	if ( empty( $item_id ) ) {
+	if ( empty( $params['item_id'] ) ) {
 
-		switch ( $object ) {
+		switch ( $params['object'] ) {
 
 			case 'blog'  :
-				$item_id = $current_blog->id;
+				$params['item_id'] = $current_blog->id;
 				break;
 
 			case 'group' :
 				if ( bp_is_active( 'groups' ) ) {
-					$item_id = $bp->groups->current_group->id;
+					$params['item_id'] = $bp->groups->current_group->id;
 				} else {
-					$item_id = false;
+					$params['item_id'] = false;
 				}
 
 				break;
 
 			case 'user'  :
 			default      :
-				$item_id = bp_displayed_user_id();
+				$params['item_id'] = bp_displayed_user_id();
 				break;
 		}
 
-		$item_id = apply_filters( 'bp_core_avatar_item_id', $item_id, $object, $params );
+		$params['item_id'] = apply_filters( 'bp_core_avatar_item_id', $params['item_id'], $params['object'], $params );
 
-		if ( empty( $item_id ) ) {
+		if ( empty( $params['item_id'] ) ) {
 			return false;
 		}
 	}
 
-	$class = apply_filters( 'bp_core_avatar_class', $class, $item_id, $object, $params );
-
 	/** Set avatar_dir ********************************************************/
 
-	if ( empty( $avatar_dir ) ) {
+	if ( empty( $params['avatar_dir'] ) ) {
 
-		switch ( $object ) {
+		switch ( $params['object'] ) {
 
 			case 'blog'  :
-				$avatar_dir = 'blog-avatars';
+				$params['avatar_dir'] = 'blog-avatars';
 				break;
 
 			case 'group' :
 				if ( bp_is_active( 'groups' ) ) {
-					$avatar_dir = 'group-avatars';
+					$params['avatar_dir'] = 'group-avatars';
 				} else {
-					$avatar_dir = false;
+					$params['avatar_dir'] = false;
 				}
 
 				break;
 
 			case 'user'  :
 			default      :
-				$avatar_dir = 'avatars';
+				$params['avatar_dir'] = 'avatars';
 				break;
 		}
 
-		$avatar_dir = apply_filters( 'bp_core_avatar_dir', $avatar_dir, $object, $params );
+		$params['avatar_dir'] = apply_filters( 'bp_core_avatar_dir', $params['avatar_dir'], $params['object'], $params );
 
-		if ( empty( $avatar_dir ) ) {
+		if ( empty( $params['avatar_dir'] ) ) {
 			return false;
 		}
 	}
 
 	/** <img> alt *************************************************************/
 
-	if ( false !== strpos( $alt, '%s' ) || false !== strpos( $alt, '%1$s' ) ) {
+	if ( false !== strpos( $params['alt'], '%s' ) || false !== strpos( $params['alt'], '%1$s' ) ) {
 
-		switch ( $object ) {
+		switch ( $params['object'] ) {
 
 			case 'blog'  :
-				$item_name = get_blog_option( $item_id, 'blogname' );
+				$item_name = get_blog_option( $params['item_id'], 'blogname' );
 				break;
 
 			case 'group' :
-				$item_name = bp_get_group_name( groups_get_group( array( 'group_id' => $item_id ) ) );
+				$item_name = bp_get_group_name( groups_get_group( array( 'group_id' => $params['item_id'] ) ) );
 				break;
 
 			case 'user'  :
 			default :
-				$item_name = bp_core_get_user_displayname( $item_id );
+				$item_name = bp_core_get_user_displayname( $params['item_id'] );
 				break;
 		}
 
-		$item_name = apply_filters( 'bp_core_avatar_alt', $item_name, $item_id, $object, $params );
-		$alt       = sprintf( $alt, $item_name );
+		$item_name = apply_filters( 'bp_core_avatar_alt', $item_name, $params['item_id'], $params['object'], $params );
+		$params['alt'] = sprintf( $params['alt'], $item_name );
 	}
 
 	/** Sanity Checks *********************************************************/
 
-	// Get a fallback for the 'alt' parameter
-	if ( empty( $alt ) )
-		$alt = __( 'Profile Photo', 'buddypress' );
+	// Get a fallback for the 'alt' parameter, create html output
+	if ( empty( $params['alt'] ) ) {
+		$params['alt'] = __( 'Profile Photo', 'buddypress' );
+	}
+	$html_alt = ' alt="' . esc_attr( $params['alt'] ) . '"';
 
-	$html_alt = ' alt="' . esc_attr( $alt ) . '"';
+	// Filter image title and create html string
+	$html_title = '';
+	$params['title'] = apply_filters( 'bp_core_avatar_title', $params['title'], $params['item_id'], $params['object'], $params );
 
-	// Set title tag, if it's been provided
-	if ( !empty( $title ) ) {
-		$title = " title='" . esc_attr( apply_filters( 'bp_core_avatar_title', $title, $item_id, $object, $params ) ) . "'";
+	if ( ! empty( $params['title'] ) ) {
+		$html_title = ' title="' . esc_attr( $params['title'] ) . '"';
 	}
 
-	// Set CSS ID if passed
-	if ( !empty( $css_id ) ) {
-		$css_id = ' id="' . esc_attr( $css_id ) . '"';
+	// Set CSS ID and create html string
+	$html_css_id = '';
+	$params['css_id'] = apply_filters( 'bp_core_css_id', $params['css_id'], $params['item_id'], $params['object'], $params );
+	
+	if ( ! empty( $params['css_id'] ) ) {
+		$html_css_id = ' id="' . esc_attr( $params['css_id'] ) . '"';
 	}
 
 	// Set image width
-	if ( false !== $width ) {
-		$html_width = ' width="' . $width . '"';
-	} elseif ( 'thumb' == $type ) {
-		$html_width = ' width="' . bp_core_avatar_thumb_width() . '"';
+	if ( false !== $params['width'] ) {
+		// Width has been specified. No modification necessary.
+	} else if ( 'thumb' == $params['type'] ) {
+		$params['width'] = bp_core_avatar_thumb_width();
 	} else {
-		$html_width = ' width="' . bp_core_avatar_full_width() . '"';
+		$params['width'] = bp_core_avatar_full_width();
 	}
+	$html_width = ' width="' . $params['width'] . '"';
 
 	// Set image height
-	if ( false !== $height ) {
-		$html_height = ' height="' . $height . '"';
-	} elseif ( 'thumb' == $type ) {
-		$html_height = ' height="' . bp_core_avatar_thumb_height() . '"';
+	if ( false !== $params['height'] ) {
+		// Height has been specified. No modification necessary.
+	} else if ( 'thumb' == $params['type'] ) {
+		$params['height'] = bp_core_avatar_thumb_height();
 	} else {
-		$html_height = ' height="' . bp_core_avatar_full_height() . '"';
+		$params['height'] = bp_core_avatar_full_height();
 	}
+	$html_height = ' height="' . $params['height'] . '"';
+
+	// Create CSS class html string
+	$params['class'] = apply_filters( 'bp_core_avatar_class', $params['class'], $params['item_id'], $params['object'], $params );
+	$html_class = ' class="' . sanitize_html_class( $params['class'] ) . ' ' . sanitize_html_class( $params['object'] . '-' . $params['item_id'] . '-avatar' ) . ' ' . sanitize_html_class( 'avatar-' . $params['width'] ) . ' photo"';
 
 	// Set img URL and DIR based on prepopulated constants
 	$avatar_loc        = new stdClass();
 	$avatar_loc->path  = trailingslashit( bp_core_avatar_upload_path() );
 	$avatar_loc->url   = trailingslashit( bp_core_avatar_url() );
 
-	$avatar_loc->dir   = trailingslashit( $avatar_dir );
-	$avatar_folder_url = apply_filters( 'bp_core_avatar_folder_url', ( $avatar_loc->url  . $avatar_loc->dir . $item_id ), $item_id, $object, $avatar_dir );
-	$avatar_folder_dir = apply_filters( 'bp_core_avatar_folder_dir', ( $avatar_loc->path . $avatar_loc->dir . $item_id ), $item_id, $object, $avatar_dir );
-
-	// Add an identifying class
-	$class .= ' ' . $object . '-' . $item_id . '-avatar ' . sanitize_html_class( "avatar-$width" ) . ' photo';
+	$avatar_loc->dir   = trailingslashit( $params['avatar_dir'] );
+	$avatar_folder_url = apply_filters( 'bp_core_avatar_folder_url', ( $avatar_loc->url  . $avatar_loc->dir . $params['item_id'] ), $params['item_id'], $params['object'], $params['avatar_dir'] );
+	$avatar_folder_dir = apply_filters( 'bp_core_avatar_folder_dir', ( $avatar_loc->path . $avatar_loc->dir . $params['item_id'] ), $params['item_id'], $params['object'], $params['avatar_dir'] );
 
 	/**
 	 * Look for uploaded avatar first. Use it if it exists.
 	 * Set the file names to search for, to select the full size
 	 * or thumbnail image.
 	 */
-	$avatar_size              = ( 'full' == $type ) ? '-bpfull' : '-bpthumb';
-	$legacy_user_avatar_name  = ( 'full' == $type ) ? '-avatar2' : '-avatar1';
-	$legacy_group_avatar_name = ( 'full' == $type ) ? '-groupavatar-full' : '-groupavatar-thumb';
+	$avatar_size              = ( 'full' == $params['type'] ) ? '-bpfull' : '-bpthumb';
+	$legacy_user_avatar_name  = ( 'full' == $params['type'] ) ? '-avatar2' : '-avatar1';
+	$legacy_group_avatar_name = ( 'full' == $params['type'] ) ? '-groupavatar-full' : '-groupavatar-thumb';
 
 	// Check for directory
 	if ( file_exists( $avatar_folder_dir ) ) {
@@ -405,8 +406,8 @@ function bp_core_fetch_avatar( $args = '' ) {
 		if ( isset( $avatar_url ) ) {
 
 			// Return it wrapped in an <img> element
-			if ( true === $html ) {
-				return apply_filters( 'bp_core_fetch_avatar', '<img src="' . $avatar_url . '" class="' . esc_attr( $class ) . '"' . $css_id . $html_width . $html_height . $html_alt . $title . ' />', $params, $item_id, $avatar_dir, $css_id, $html_width, $html_height, $avatar_folder_url, $avatar_folder_dir );
+			if ( true === $params['html'] ) {
+				return apply_filters( 'bp_core_fetch_avatar', '<img src="' . $avatar_url . '"' . $html_class . $html_css_id  . $html_width . $html_height . $html_alt . $html_title . ' />', $params, $params['item_id'], $params['avatar_dir'], $html_css_id, $html_width, $html_height, $avatar_folder_url, $avatar_folder_dir );
 
 			// ...or only the URL
 			} else {
@@ -417,33 +418,24 @@ function bp_core_fetch_avatar( $args = '' ) {
 
 	// If no avatars could be found, try to display a gravatar
 
-	// Skips gravatar check if $no_grav is passed
-	if ( ! apply_filters( 'bp_core_fetch_avatar_no_grav', $no_grav ) ) {
-
-		// Set gravatar size
-		if ( false !== $width ) {
-			$grav_size = $width;
-		} else if ( 'full' == $type ) {
-			$grav_size = bp_core_avatar_full_width();
-		} else if ( 'thumb' == $type ) {
-			$grav_size = bp_core_avatar_thumb_width();
-		}
+	// Skips gravatar check if $params['no_grav'] is passed
+	if ( ! apply_filters( 'bp_core_fetch_avatar_no_grav', $params['no_grav'], $params ) ) {
 
 		// Set gravatar type
-		if ( empty( $bp->grav_default->{$object} ) ) {
+		if ( empty( $bp->grav_default->{$params['object']} ) ) {
 			$default_grav = 'wavatar';
-		} else if ( 'mystery' == $bp->grav_default->{$object} ) {
-			$default_grav = apply_filters( 'bp_core_mysteryman_src', 'mm', $grav_size );
+		} else if ( 'mystery' == $bp->grav_default->{$params['object']} ) {
+			$default_grav = apply_filters( 'bp_core_mysteryman_src', 'mm', $params['width'] );
 		} else {
-			$default_grav = $bp->grav_default->{$object};
+			$default_grav = $bp->grav_default->{$params['object']};
 		}
 
 		// Set gravatar object
-		if ( empty( $email ) ) {
-			if ( 'user' == $object ) {
-				$email = bp_core_get_user_email( $item_id );
-			} else if ( 'group' == $object || 'blog' == $object ) {
-				$email = "{$item_id}-{$object}@{bp_get_root_domain()}";
+		if ( empty( $params['email'] ) ) {
+			if ( 'user' == $params['object'] ) {
+				$params['email'] = bp_core_get_user_email( $params['item_id'] );
+			} else if ( 'group' == $params['object'] || 'blog' == $params['object'] ) {
+				$params['email'] = $params['item_id'] . '-' . $params['object'] . '@' . bp_get_root_domain();
 			}
 		}
 
@@ -454,8 +446,8 @@ function bp_core_fetch_avatar( $args = '' ) {
 		}
 
 		// Filter gravatar vars
-		$email    = apply_filters( 'bp_core_gravatar_email', $email, $item_id, $object );
-		$gravatar = apply_filters( 'bp_gravatar_url', $host ) . md5( strtolower( $email ) ) . '?d=' . $default_grav . '&amp;s=' . $grav_size;
+		$params['email'] = apply_filters( 'bp_core_gravatar_email', $params['email'], $params['item_id'], $params['object'] );
+		$gravatar = apply_filters( 'bp_gravatar_url', $host ) . md5( strtolower( $params['email'] ) ) . '?d=' . $default_grav . '&amp;s=' . $params['width'];
 
 		// Gravatar rating; http://bit.ly/89QxZA
 		$rating = get_option( 'avatar_rating' );
@@ -465,11 +457,11 @@ function bp_core_fetch_avatar( $args = '' ) {
 
 	// No avatar was found, and we've been told not to use a gravatar.
 	} else {
-		$gravatar = apply_filters( "bp_core_default_avatar_$object", bp_core_avatar_default( 'local' ), $params );
+		$gravatar = apply_filters( 'bp_core_default_avatar_' . $params['object'], bp_core_avatar_default( 'local' ), $params );
 	}
 
-	if ( true === $html ) {
-		return apply_filters( 'bp_core_fetch_avatar', '<img src="' . $gravatar . '" class="' . esc_attr( $class ) . '"' . $css_id . $html_width . $html_height . $html_alt . $title . ' />', $params, $item_id, $avatar_dir, $css_id, $html_width, $html_height, $avatar_folder_url, $avatar_folder_dir );
+	if ( true === $params['html'] ) {
+		return apply_filters( 'bp_core_fetch_avatar', '<img src="' . $gravatar . '"' . $html_css_id . $html_class . $html_width . $html_height . $html_alt . $html_title . ' />', $params, $params['item_id'], $params['avatar_dir'], $html_css_id, $html_width, $html_height, $avatar_folder_url, $avatar_folder_dir );
 	} else {
 		return apply_filters( 'bp_core_fetch_avatar_url', $gravatar, $params );
 	}
diff --git tests/phpunit/testcases/core/avatars.php tests/phpunit/testcases/core/avatars.php
index 8070b7b..316ad26 100644
--- tests/phpunit/testcases/core/avatars.php
+++ tests/phpunit/testcases/core/avatars.php
@@ -6,6 +6,8 @@
 class BP_Tests_Avatars extends BP_UnitTestCase {
 	protected $old_current_user = 0;
 
+	private $params = array();
+
 	public function setUp() {
 		parent::setUp();
 
@@ -110,4 +112,77 @@ class BP_Tests_Avatars extends BP_UnitTestCase {
 	public function avatar_cb() {
 		return 'foo';
 	}
+
+	/**
+	 * @group bp_core_fetch_avatar
+	 */
+	public function test_bp_core_fetch_avatar_parameter_conservation() {
+		// First, run the check with custom parameters, specifying no gravatar.
+		$this->params = array(
+			'item_id'    => 1406,
+			'object'     => 'custom_object', 	// user/group/blog/custom type (if you use filters)
+			'type'       => 'full',   	 		// thumb or full
+			'avatar_dir' => 'custom-dir',       // Specify a custom avatar directory for your object
+			'width'      => 48,       			// Custom width (int)
+			'height'     => 54,       			// Custom height (int)
+			'class'      => 'custom-class',  	// Custom <img> class (string)
+			'css_id'     => 'custom-css-id',    // Custom <img> ID (string)
+			'alt'        => 'custom alt',    	// Custom <img> alt (string)
+			'email'      => 'avatar@avatar.org',// Pass the user email (for gravatar) to prevent querying the DB for it
+			'no_grav'    => true,       		// If there is no avatar found, return false instead of a grav?
+			'html'       => true,        		// Wrap the return img URL in <img />
+			'title'      => 'custom-title'		// Custom <img> title (string)
+		);
+
+		// Check to make sure the custom parameters survived the function all the way up to output
+		add_filter( 'bp_core_fetch_avatar', array( $this, 'bp_core_fetch_avatar_filter_check' ), 12, 2 );
+		$avatar = bp_core_fetch_avatar( $this->params );
+
+		// Re-run check, allowing gravatars.
+		$this->params['no_grav'] = false;
+		$avatar = bp_core_fetch_avatar( $this->params );
+
+		remove_filter( 'bp_core_fetch_avatar', array( $this, 'bp_core_fetch_avatar_filter_check' ), 12, 2 );
+
+		unset( $this->params );
+	}
+
+	public function bp_core_fetch_avatar_filter_check( $html, $params ) {
+		// Check that the passed parameters match the original custom parameters.
+		$this->assertEmpty( array_merge( array_diff( $params, $this->params ), array_diff( $this->params, $params ) ) );
+
+		// Check the returned html to see that it matches an expected value.
+		// Get the correct default avatar, based on whether gravatars are allowed.
+		if ( $params['no_grav'] ) { 
+			$avatar_url = bp_core_avatar_default( 'local' );
+		} else {
+			// This test has the slight odor of hokum since it recreates so much code that could be changed at any time.
+			$bp = buddypress();
+			// Set host based on if using ssl
+			$host = 'http://gravatar.com/avatar/';
+			if ( is_ssl() ) {
+				$host = 'https://secure.gravatar.com/avatar/';
+			}
+			// Set expected gravatar type
+			if ( empty( $bp->grav_default->{$this->params['object']} ) ) {
+				$default_grav = 'wavatar';
+			} else if ( 'mystery' == $bp->grav_default->{$this->params['object']} ) {
+				$default_grav = apply_filters( 'bp_core_mysteryman_src', 'mm', $this->params['width'] );
+			} else {
+				$default_grav = $bp->grav_default->{$this->params['object']};
+			}
+
+			$avatar_url = $host . md5( strtolower( $this->params['email'] ) ) . '?d=' . $default_grav . '&amp;s=' . $this->params['width'];
+
+			// Gravatar rating; http://bit.ly/89QxZA
+			$rating = get_option( 'avatar_rating' );
+			if ( ! empty( $rating ) ) {
+				$avatar_url .= "&amp;r={$rating}";
+			}
+		}
+
+		$expected_html = '<img src="' . $avatar_url . '" id="' . $this->params['css_id'] . '" class="' . $this->params['class'] . ' ' . $this->params['object'] . '-' . $this->params['item_id'] . '-avatar avatar-' . $this->params['width'] . ' photo" width="' . $this->params['width'] . '" height="' . $this->params['height'] . '" alt="' . $this->params['alt'] . '" title="' . $this->params['title'] . '" />';
+
+		$this->assertEquals( $html, $expected_html );
+	}
 }
