diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 5df73a994e4d824e5f056c371967c214e81f1aef..13daa79528dda9ae99060f4b30f4a0979e2b05b0 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -323,14 +323,12 @@ boost::signals2::connection LLAvatarList::setRefreshCompleteCallback(const commi
 void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
 {
 	LLAvatarListItem* item = new LLAvatarListItem();
-	item->showInfoBtn(true);
 	item->showSpeakingIndicator(true);
 	item->setName(name);
 	item->setAvatarId(id, mIgnoreOnlineStatus);
 	item->setOnline(mIgnoreOnlineStatus ? true : is_online);
 	item->showLastInteractionTime(mShowLastInteractionTime);
 
-	item->childSetVisible("info_btn", false);
 	item->setAvatarIconVisible(mShowIcons);
 	item->setShowInfoBtn(mShowInfoBtn);
 	item->setShowProfileBtn(mShowProfileBtn);
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 6945ac69323318c5f6343733e7464bb227417a28..aa5a575464a633b36f5fe3749f5508a3a7681a5d 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -48,6 +48,10 @@ S32 LLAvatarListItem::sIconWidth = 0;
 S32 LLAvatarListItem::sInfoBtnWidth = 0;
 S32 LLAvatarListItem::sProfileBtnWidth = 0;
 S32 LLAvatarListItem::sSpeakingIndicatorWidth = 0;
+S32 LLAvatarListItem::sLeftPadding = 0;
+S32 LLAvatarListItem::sRightNamePadding = 0;
+S32 LLAvatarListItem::sChildrenWidths[LLAvatarListItem::ALIC_COUNT];
+
 
 LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
 :	LLPanel(),
@@ -95,10 +99,7 @@ BOOL  LLAvatarListItem::postBuild()
 	// so that we can hide and show the icon again later.
 	if (!sStaticInitialized)
 	{
-		sIconWidth = mAvatarName->getRect().mLeft - mAvatarIcon->getRect().mLeft;
-		sInfoBtnWidth = mInfoBtn->getRect().mRight - mSpeakingIndicator->getRect().mRight;
-		sProfileBtnWidth = mProfileBtn->getRect().mRight - mInfoBtn->getRect().mRight;
-		sSpeakingIndicatorWidth = mSpeakingIndicator->getRect().mRight - mAvatarName->getRect().mRight;
+		initChildrenWidths(this);
 
 		sStaticInitialized = true;
 	}
@@ -137,6 +138,8 @@ void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
 	mProfileBtn->setVisible(mShowProfileBtn);
 
 	LLPanel::onMouseEnter(x, y, mask);
+
+	updateChildren();
 }
 
 void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
@@ -146,6 +149,8 @@ void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
 	mProfileBtn->setVisible(false);
 
 	LLPanel::onMouseLeave(x, y, mask);
+
+	updateChildren();
 }
 
 // virtual, called by LLAvatarTracker
@@ -215,12 +220,8 @@ void LLAvatarListItem::showLastInteractionTime(bool show)
 	if (show)
 		return;
 
-	LLRect	name_rect	= mAvatarName->getRect();
-	LLRect	time_rect	= mLastInteractionTime->getRect();
-
 	mLastInteractionTime->setVisible(false);
-	name_rect.mRight += (time_rect.mRight - name_rect.mRight);
-	mAvatarName->setRect(name_rect);
+	updateChildren();
 }
 
 void LLAvatarListItem::setLastInteractionTime(U32 secs_since)
@@ -234,12 +235,6 @@ void LLAvatarListItem::setShowInfoBtn(bool show)
 	if(mShowInfoBtn == show)
 		return;
 	mShowInfoBtn = show;
-	S32 width_delta = show ? - sInfoBtnWidth : sInfoBtnWidth;
-
-	//Translating speaking indicator
-	mSpeakingIndicator->translate(width_delta, 0);
-	//Reshaping avatar name
-	mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight());
 }
 
 void LLAvatarListItem::setShowProfileBtn(bool show)
@@ -248,12 +243,6 @@ void LLAvatarListItem::setShowProfileBtn(bool show)
 	if(mShowProfileBtn == show)
 			return;
 	mShowProfileBtn = show;
-	S32 width_delta = show ? - sProfileBtnWidth : sProfileBtnWidth;
-
-	//Translating speaking indicator
-	mSpeakingIndicator->translate(width_delta, 0);
-	//Reshaping avatar name
-	mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight());
 }
 
 void LLAvatarListItem::setSpeakingIndicatorVisible(bool visible)
@@ -262,10 +251,7 @@ void LLAvatarListItem::setSpeakingIndicatorVisible(bool visible)
 	if (mSpeakingIndicator->getVisible() == (BOOL)visible)
 		return;
 	mSpeakingIndicator->setVisible(visible);
-	S32 width_delta = visible ? - sSpeakingIndicatorWidth : sSpeakingIndicatorWidth;
-
-	//Reshaping avatar name
-	mAvatarName->reshape(mAvatarName->getRect().getWidth() + width_delta, mAvatarName->getRect().getHeight());
+	updateChildren();
 }
 
 void LLAvatarListItem::setAvatarIconVisible(bool visible)
@@ -276,11 +262,7 @@ void LLAvatarListItem::setAvatarIconVisible(bool visible)
 
 	// Show/hide avatar icon.
 	mAvatarIcon->setVisible(visible);
-
-	// Move the avatar name horizontally by icon size + its distance from the avatar name.
-	LLRect name_rect = mAvatarName->getRect();
-	name_rect.mLeft += visible ? sIconWidth : -sIconWidth;
-	mAvatarName->setRect(name_rect);
+	updateChildren();
 }
 
 void LLAvatarListItem::onInfoBtnClick()
@@ -346,6 +328,7 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str
 
 void LLAvatarListItem::reshapeAvatarName()
 {
+/*
 	S32 width_delta = 0;
 	width_delta += mShowProfileBtn ? sProfileBtnWidth : 0;
 	width_delta += mSpeakingIndicator->getVisible() ? sSpeakingIndicatorWidth : 0;
@@ -357,6 +340,7 @@ void LLAvatarListItem::reshapeAvatarName()
 	S32 width  = getRect().getWidth() - width_delta;
 
 	mAvatarName->reshape(width, height);
+*/
 }
 
 // Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years",
@@ -492,4 +476,133 @@ LLAvatarListItem::icon_color_map_t& LLAvatarListItem::getItemIconColorMap()
 	return item_icon_color_map;
 }
 
+// static
+void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
+{
+	//profile btn width + padding
+	S32 profile_btn_width = avatar_item->getRect().getWidth() - avatar_item->mProfileBtn->getRect().mLeft;
+
+	//info btn width + padding
+	S32 info_btn_width = avatar_item->mProfileBtn->getRect().mLeft - avatar_item->mInfoBtn->getRect().mLeft;
+
+	//speaking indicator width + padding
+	S32 speaking_indicator_width = avatar_item->mInfoBtn->getRect().mLeft - avatar_item->mSpeakingIndicator->getRect().mLeft;
+
+	// last interaction time textbox width + padding
+	S32 last_interaction_time_width = avatar_item->mSpeakingIndicator->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
+
+	// icon width + padding
+	S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft;
+
+	sLeftPadding = avatar_item->mAvatarIcon->getRect().mLeft;
+	sRightNamePadding = avatar_item->mLastInteractionTime->getRect().mLeft - avatar_item->mAvatarName->getRect().mRight;
+
+	S32 index = ALIC_COUNT;
+	sChildrenWidths[--index] = icon_width;
+	sChildrenWidths[--index] = 0; // for avatar name we don't need its width, it will be calculated as "left available space"
+	sChildrenWidths[--index] = last_interaction_time_width;
+	sChildrenWidths[--index] = speaking_indicator_width;
+	sChildrenWidths[--index] = info_btn_width;
+	sChildrenWidths[--index] = profile_btn_width;
+}
+
+void LLAvatarListItem::updateChildren()
+{
+	LL_DEBUGS("AvatarItemReshape") << LL_ENDL;
+	LL_DEBUGS("AvatarItemReshape") << "Updating for: " << getAvatarName() << LL_ENDL;
+
+	S32 name_new_width = getRect().getWidth();
+	S32 ctrl_new_left = name_new_width;
+	S32 name_new_left = sLeftPadding;
+
+	// iterate through all children and set them into correct position depend on each child visibility
+	// assume that child indexes are in back order: the first in Enum is the last (right) in the item
+	// iterate & set child views starting from right to left
+	for (S32 i = 0; i < ALIC_COUNT; ++i)
+	{
+		// skip "name" textbox, it will be processed out of loop later
+		if (ALIC_NAME == i) continue;
+
+		LLView* control = getItemChildView((EAvatarListItemChildIndex)i);
+
+		LL_DEBUGS("AvatarItemReshape") << "Processing control: " << control->getName() << LL_ENDL;
+		// skip invisible views
+		if (!control->getVisible()) continue;
+
+		S32 ctrl_width = sChildrenWidths[i]; // including space between current & left controls
+
+		// decrease available for 
+		name_new_width -= ctrl_width;
+		LL_DEBUGS("AvatarItemReshape") << "width: " << ctrl_width << ", name_new_width: " << name_new_width << LL_ENDL;
+
+		LLRect control_rect = control->getRect();
+		LL_DEBUGS("AvatarItemReshape") << "rect before: " << control_rect << LL_ENDL;
+
+		if (ALIC_ICON == i)
+		{
+			// assume that this is the last iteration,
+			// so it is not necessary to save "ctrl_new_left" value calculated on previous iterations
+			ctrl_new_left = sLeftPadding;//control_rect.mLeft;
+			name_new_left = ctrl_new_left + ctrl_width;
+		}
+		else
+		{
+			ctrl_new_left -= ctrl_width;
+		}
+
+		LL_DEBUGS("AvatarItemReshape") << "ctrl_new_left: " << ctrl_new_left << LL_ENDL;
+
+		control_rect.setLeftTopAndSize(
+			ctrl_new_left,
+			control_rect.mTop,
+			control_rect.getWidth(),
+			control_rect.getHeight());
+
+		LL_DEBUGS("AvatarItemReshape") << "rect after: " << control_rect << LL_ENDL;
+		control->setShape(control_rect);
+	}
+
+	// set size and position of the "name" child
+	LLView* name_view = getItemChildView(ALIC_NAME);
+	LLRect name_view_rect = name_view->getRect();
+	LL_DEBUGS("AvatarItemReshape") << "name rect before: " << name_view_rect << LL_ENDL;
+
+	// apply paddings
+	name_new_width -= sLeftPadding;
+	name_new_width -= sRightNamePadding;
+
+	name_view_rect.setLeftTopAndSize(
+		name_new_left,
+		name_view_rect.mTop,
+		name_new_width,
+		name_view_rect.getHeight());
+
+	name_view->setShape(name_view_rect);
+
+	LL_DEBUGS("AvatarItemReshape") << "name rect after: " << name_view_rect << LL_ENDL;
+}
+
+LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_index)
+{
+	LLView* child_view = mAvatarName;
+	if (child_view_index < 0 || ALIC_COUNT <= child_view_index)
+	{
+		LL_WARNS("AvatarItemReshape") << "Child view index is out of range: " << child_view_index << LL_ENDL;
+		return child_view;
+	}
+	switch (child_view_index)
+	{
+	case ALIC_ICON:					child_view = mAvatarIcon; break;
+	case ALIC_NAME:					child_view = mAvatarName; break;
+	case ALIC_INTERACTION_TIME:		child_view = mLastInteractionTime; break;
+	case ALIC_SPEAKER_INDICATOR:	child_view = mSpeakingIndicator; break;
+	case ALIC_INFO_BUTTON:			child_view = mInfoBtn; break;
+	case ALIC_PROFILE_BUTTON:		child_view = mProfileBtn; break;
+	default:
+		LL_WARNS("AvatarItemReshape") << "Unexpected child view index is passed: " << child_view_index << LL_ENDL;
+	}
+	
+	return child_view;
+}
+
 // EOF
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 96097bc9b52dc2e07c5a5baafb222b3ec745dd8d..688197810e41ff9b9390b5ba51bd9c5e8da0502c 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -98,7 +98,6 @@ public:
 	void onProfileBtnClick();
 
 	void showSpeakingIndicator(bool show) { mSpeakingIndicator->setVisible(show); }
-	void showInfoBtn(bool show_info_btn) {mInfoBtn->setVisible(show_info_btn); }
 	void showLastInteractionTime(bool show);
 
 	/**
@@ -124,6 +123,23 @@ private:
 		E_UNKNOWN,
 	} EOnlineStatus;
 
+	/**
+	 * Enumeration of item elements in order from right to left.
+	 * 
+	 * updateChildren() assumes that indexes are in the such order to process avatar icon easier.
+	 *
+	 * @see updateChildren()
+	 */
+	typedef enum e_avatar_item_child {
+		ALIC_PROFILE_BUTTON,
+		ALIC_INFO_BUTTON,
+		ALIC_SPEAKER_INDICATOR,
+		ALIC_INTERACTION_TIME,
+		ALIC_NAME,
+		ALIC_ICON,
+		ALIC_COUNT,
+	} EAvatarListItemChildIndex;
+
 	void setNameInternal(const std::string& name, const std::string& highlight);
 	void onNameCache(const std::string& first_name, const std::string& last_name);
 
@@ -135,6 +151,26 @@ private:
 	typedef std::map<EItemState, LLColor4> icon_color_map_t;
 	static icon_color_map_t& getItemIconColorMap();
 
+	/**
+	 * Initializes widths of all children to use them while changing visibility of any of them.
+	 *
+	 * @see updateChildren()
+	 */
+	static void initChildrenWidths(LLAvatarListItem* self);
+
+	/**
+	 * Updates position and rectangle of visible children to fit all available item's width.
+	 */
+	void updateChildren();
+
+	/**
+	 * Gets child view specified by index.
+	 *
+	 * This method implemented via switch by all EAvatarListItemChildIndex values.
+	 * It is used to not store children in array or vector to avoid of increasing memory usage.
+	 */
+	LLView* getItemChildView(EAvatarListItemChildIndex child_index);
+
 	LLTextBox* mAvatarName;
 	LLTextBox* mLastInteractionTime;
 	LLStyle::Params mAvatarNameStyle;
@@ -155,6 +191,17 @@ private:
 	static S32  sInfoBtnWidth; //info btn width + padding
 	static S32  sProfileBtnWidth; //profile btn width + padding
 	static S32  sSpeakingIndicatorWidth; //speaking indicator width + padding
+	static S32  sLeftPadding; // padding to first left visible child (icon or name)
+	static S32  sRightNamePadding; // right padding from name to next visible child
+
+	/**
+	 * Contains widths of each child specified by EAvatarListItemChildIndex
+	 * including padding to the next right one.
+	 *
+	 * @see initChildrenWidths()
+	 */
+	static S32 sChildrenWidths[ALIC_COUNT];
+
 };
 
 #endif //LL_LLAVATARLISTITEM_H
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index 4342318c226f79f3e9676f56e27fe21506e8aa0c..615ade99a2bcbe90456786b8ffb25df48f6f2900 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -58,13 +58,13 @@
      top="6"
      use_ellipses="true"
      value="Unknown"
-     width="182" />
+     width="180" />
     <text
      follows="right"
      font="SansSerifSmall"
      height="15"
      layout="topleft"
-     left_pad="8"
+     left_pad="5"
      name="last_interaction"
      text_color="LtGray_50"
      value="0s"
@@ -75,7 +75,7 @@
      draw_border="false"
      height="16"
      layout="topleft"
-     left_pad="0"
+     left_pad="5"
      mouse_opaque="true"
      name="speaking_indicator"
      visible="true"