diff --git wp-admin/edit-comments.php wp-admin/edit-comments.php
index 174cd9a..1cacb0d 100644
--- wp-admin/edit-comments.php
+++ wp-admin/edit-comments.php
@@ -105,7 +105,9 @@ wp_enqueue_script('admin-comments');
 enqueue_comment_hotkeys_js();
 
 if ( $post_id )
-	$title = sprintf(__('Comments on &#8220;%s&#8221;'), wp_html_excerpt(_draft_or_post_title($post_id), 50));
+	$title = sprintf(__('Comments on &#8220;%s&#8221;'),
+					 wp_html_excerpt( _draft_or_post_title($post_id), 50,
+									  array( 'append_ellipsis' => true ) ) );
 else
 	$title = __('Comments');
 
@@ -146,14 +148,19 @@ if ( $post_id )
 	echo sprintf(__('Comments on &#8220;%s&#8221;'),
 		sprintf('<a href="%s">%s</a>',
 			get_edit_post_link($post_id),
-			wp_html_excerpt(_draft_or_post_title($post_id), 50)
+			wp_html_excerpt( _draft_or_post_title($post_id), 50,
+							 array( 'append_ellipsis' => true ) )
 		)
 	);
 else
 	echo __('Comments');
 
 if ( isset($_REQUEST['s']) && $_REQUEST['s'] )
-	printf( '<span class="subtitle">' . sprintf( __( 'Search results for &#8220;%s&#8221;' ), wp_html_excerpt( esc_html( stripslashes( $_REQUEST['s'] ) ), 50 ) ) . '</span>' ); ?>
+	printf( '<span class="subtitle">' .
+			sprintf( __( 'Search results for &#8220;%s&#8221;' ),
+					 wp_html_excerpt( esc_html( stripslashes( $_REQUEST['s'] ) ), 50,
+									  array( 'append_ellipsis' => true ) ) ) .
+			'</span>' ); ?>
 </h2>
 
 <?php
diff --git wp-admin/includes/dashboard.php wp-admin/includes/dashboard.php
index 0df8109..59a7539 100644
--- wp-admin/includes/dashboard.php
+++ wp-admin/includes/dashboard.php
@@ -827,7 +827,7 @@ function wp_dashboard_incoming_links_output() {
 			$publisher = "<strong>$publisher</strong>";
 
 		$content = $item->get_content();
-		$content = wp_html_excerpt($content, 50) . ' ...';
+		$content = wp_html_excerpt( $content, 50, array( 'append_ellipsis' => true ) );
 
 		if ( $link )
 			/* translators: incoming links feed, %1$s is other person, %3$s is content */
diff --git wp-admin/includes/media.php wp-admin/includes/media.php
index beb3dcc..f531442 100644
--- wp-admin/includes/media.php
+++ wp-admin/includes/media.php
@@ -1108,7 +1108,13 @@ function get_media_item( $attachment_id, $args = null ) {
 	}
 
 	$display_title = ( !empty( $title ) ) ? $title : $filename; // $title shouldn't ever be empty, but just in case
-	$display_title = $show_title ? "<div class='filename new'><span class='title'>" . wp_html_excerpt( $display_title, 60 ) . "</span></div>" : '';
+	$display_title = "<div class='filename new'><span class='title'>" .
+					 wp_html_excerpt( $display_title, 60,
+									  array( 'append_ellipsis' => true ) ) .
+					 "</span></div>";
+	if ( ! $show_title ) {
+		$display_title = '';
+	}
 
 	$gallery = ( ( isset( $_REQUEST['tab'] ) && 'gallery' == $_REQUEST['tab'] ) || ( isset( $redir_tab ) && 'gallery' == $redir_tab ) );
 	$order = '';
diff --git wp-admin/includes/nav-menu.php wp-admin/includes/nav-menu.php
index 6064462..9b4247e 100644
--- wp-admin/includes/nav-menu.php
+++ wp-admin/includes/nav-menu.php
@@ -501,8 +501,7 @@ function wp_nav_menu_locations_meta_box() {
 					<?php foreach ( $menus as $menu ) : ?>
 					<option<?php selected( isset( $menu_locations[ $location ] ) && $menu_locations[ $location ] == $menu->term_id ); ?>
 						value="<?php echo $menu->term_id; ?>"><?php
-						$truncated_name = wp_html_excerpt( $menu->name, 40 );
-						echo $truncated_name == $menu->name ? $menu->name : trim( $truncated_name ) . '&hellip;';
+						echo wp_html_excerpt( $menu->name, 40, array( 'append_ellipsis' => true ) );
 					?></option>
 					<?php endforeach; ?>
 				</select>
diff --git wp-admin/nav-menus.php wp-admin/nav-menus.php
index 361d0f6..50d2e68 100644
--- wp-admin/nav-menus.php
+++ wp-admin/nav-menus.php
@@ -405,10 +405,7 @@ if ( ! $nav_menu_selected_title && is_nav_menu( $nav_menu_selected_id ) ) {
 
 // Generate truncated menu names
 foreach( (array) $nav_menus as $key => $_nav_menu ) {
-	$_nav_menu->truncated_name = trim( wp_html_excerpt( $_nav_menu->name, 40 ) );
-	if ( $_nav_menu->truncated_name != $_nav_menu->name )
-		$_nav_menu->truncated_name .= '&hellip;';
-
+	$_nav_menu->truncated_name = trim( wp_html_excerpt( $_nav_menu->name, 40, array( 'append_ellipsis' => true ) ) );
 	$nav_menus[$key]->truncated_name = $_nav_menu->truncated_name;
 }
 
diff --git wp-includes/comment.php wp-includes/comment.php
index 09bad3c..1d043ad 100644
--- wp-includes/comment.php
+++ wp-includes/comment.php
@@ -1756,7 +1756,7 @@ function do_trackbacks($post_id) {
 	else
 		$excerpt = apply_filters('the_excerpt', $post->post_excerpt);
 	$excerpt = str_replace(']]>', ']]&gt;', $excerpt);
-	$excerpt = wp_html_excerpt($excerpt, 252) . '...';
+	$excerpt = wp_html_excerpt( $excerpt, 252, array( 'append_ellipsis' => true ) );
 
 	$post_title = apply_filters('the_title', $post->post_title, $post->ID);
 	$post_title = strip_tags($post_title);
diff --git wp-includes/formatting.php wp-includes/formatting.php
index a0e9994..69be2e9 100644
--- wp-includes/formatting.php
+++ wp-includes/formatting.php
@@ -3084,18 +3084,31 @@ function wp_sprintf_l($pattern, $args) {
  * be counted as one character. For example &amp; will be counted as 4, &lt; as
  * 3, etc.
  *
+ * The list of arguments that $options can contain, which will overwrite the
+ * defaults:
+ *
+ * append_ellipsis - Whether to append truncated string with an ellipsis.
+ * Defaults to false.
+ *
  * @since 2.5.0
  *
  * @param integer $str String to get the excerpt from.
  * @param integer $count Maximum number of characters to take.
+ * @param string|array $options Additional options affecting extracted output.
  * @return string The excerpt.
  */
-function wp_html_excerpt( $str, $count ) {
+function wp_html_excerpt( $str, $count, $options = '' ) {
+	$defaults = array(
+		'append_ellipsis' => false
+	);
+	$options = wp_parse_args( $options, $defaults );
 	$str = wp_strip_all_tags( $str, true );
-	$str = mb_substr( $str, 0, $count );
+	$new_str = mb_substr( $str, 0, $count );
 	// remove part of an entity at the end
-	$str = preg_replace( '/&[^;\s]{0,6}$/', '', $str );
-	return $str;
+	$new_str = preg_replace( '/&[^;\s]{0,6}$/', '', $new_str );
+	if( $options['append_ellipsis'] && strlen( $new_str ) < strlen( $str ) )
+		$new_str .= '&hellip;';
+	return $new_str;
 }
 
 /**
diff --git wp-trackback.php wp-trackback.php
index 06e4750..d31b21e 100644
--- wp-trackback.php
+++ wp-trackback.php
@@ -87,8 +87,8 @@ if ( !empty($tb_url) && !empty($title) ) {
 	if ( !pings_open($tb_id) )
 		trackback_response(1, 'Sorry, trackbacks are closed for this item.');
 
-	$title =  wp_html_excerpt( $title, 250 ).'...';
-	$excerpt = wp_html_excerpt( $excerpt, 252 ).'...';
+	$title =  wp_html_excerpt( $title, 250, array( 'append_ellipsis' => true ) );
+	$excerpt = wp_html_excerpt( $excerpt, 252, array( 'append_ellipsis' => true ) );
 
 	$comment_post_ID = (int) $tb_id;
 	$comment_author = $blog_name;
