diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 785179f7b31c59cce2308e15b3e37146fe78d7f9..c673db2034f4c67b151d072a8dc60e01d0f9517d 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -179,6 +179,7 @@
 #include "llimview.h"
 #include "llviewerthrottle.h"
 #include "llparcel.h"
+#include "llavatariconctrl.h"
 
 // *FIX: These extern globals should be cleaned up.
 // The globals either represent state/config/resource-storage of either 
@@ -1467,6 +1468,9 @@ bool LLAppViewer::cleanup()
     sImageDecodeThread = NULL;
 
 	LLLocationHistory::getInstance()->save();
+
+	LLAvatarIconIDCache::getInstance()->save();
+
 	delete mFastTimerLogThread;
 	mFastTimerLogThread = NULL;
 
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 1d5fa9ffa7eeeca25e790b42872e6d6151d52557..3e411583ac0254debd565b476ff3779f5b765bdc 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -50,7 +50,94 @@
 
 static LLDefaultChildRegistry::Register<LLAvatarIconCtrl> r("avatar_icon");
 
-LLAvatarIconCtrl::avatar_image_map_t LLAvatarIconCtrl::sImagesCache;
+bool LLAvatarIconIDCache::LLAvatarIconIDCacheItem::expired()
+{
+	const F64 SEC_PER_DAY_PLUS_HOUR = (24.0 + 1.0) * 60.0 * 60.0;
+	F64 delta = LLDate::now().secondsSinceEpoch() - cached_time.secondsSinceEpoch();
+	if (delta > SEC_PER_DAY_PLUS_HOUR)
+		return true;
+	return false;
+}
+
+void LLAvatarIconIDCache::load	()
+{
+	llinfos << "Loading avatar icon id cache." << llendl;
+	
+	// build filename for each user
+	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename);
+	llifstream file(resolved_filename);
+
+	if (!file.is_open())
+		return;
+	
+	// add each line in the file to the list
+	int uuid_len = UUID_STR_LENGTH-1;
+	std::string line;
+	while (std::getline(file, line)) 
+	{
+		LLUUID avatar_id;
+		LLUUID icon_id;
+		LLDate date;
+
+		std::string avatar_id_str = line.substr(0,uuid_len);
+		std::string icon_id_str = line.substr(uuid_len,uuid_len);
+		
+		std::string date_str = line.substr(uuid_len*2, line.length()-uuid_len*2);
+
+		if(!avatar_id.set(avatar_id_str) || !icon_id.set(icon_id_str) || !date.fromString(date_str))
+			continue;
+
+		LLAvatarIconIDCacheItem item = {icon_id,date};
+		mCache[avatar_id] = item;
+	}
+
+	file.close();
+	
+}
+
+void LLAvatarIconIDCache::save	()
+{
+	std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, mFilename);
+
+	// open a file for writing
+	llofstream file (resolved_filename);
+	if (!file.is_open())
+	{
+		llwarns << "can't open avatar icons cache file\"" << mFilename << "\" for writing" << llendl;
+		return;
+	}
+
+	for(std::map<LLUUID,LLAvatarIconIDCacheItem>::iterator it = mCache.begin();it!=mCache.end();++it)
+	{
+		if(!it->second.expired())
+		{
+			file << it->first << it->second.icon_id << it->second.cached_time << std::endl;	
+		}
+	}
+	
+	file.close();
+}
+
+LLUUID*	LLAvatarIconIDCache::get		(const LLUUID& avatar_id)
+{
+	std::map<LLUUID,LLAvatarIconIDCacheItem>::iterator it = mCache.find(avatar_id);
+	if(it==mCache.end())
+		return 0;
+	if(it->second.expired())
+		return 0;
+	return &it->second.icon_id;
+}
+
+void LLAvatarIconIDCache::add		(const LLUUID& avatar_id,const LLUUID& icon_id)
+{
+	LLAvatarIconIDCacheItem item = {icon_id,LLDate::now()};
+	mCache[avatar_id] = item;
+}
+
+void LLAvatarIconIDCache::remove	(const LLUUID& avatar_id)
+{
+	mCache.erase(avatar_id);
+}
 
 
 LLAvatarIconCtrl::Params::Params()
@@ -161,18 +248,13 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
 			// an avatar.
 
 			// Check if cache already contains image_id for that avatar
-			avatar_image_map_t::iterator it = sImagesCache.find(mAvatarId);
-			if (it != sImagesCache.end())
-			{
-				updateFromCache(it->second);
-			}
-			else
+			
+			if (!updateFromCache())
 			{
-				app->addObserver(value.asUUID(), this);
-				app->sendAvatarPropertiesRequest(value.asUUID());
+				app->addObserver(mAvatarId, this);
+				app->sendAvatarPropertiesRequest(mAvatarId);
 			}
 		}
-
 	}
 	else
 	{
@@ -182,12 +264,18 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
 	gCacheName->get(mAvatarId, FALSE, boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3, _4));
 }
 
-void LLAvatarIconCtrl::updateFromCache(LLAvatarIconCtrl::LLImagesCacheItem data)
+bool LLAvatarIconCtrl::updateFromCache()
 {
+	LLUUID* icon_id_ptr = LLAvatarIconIDCache::getInstance()->get(mAvatarId);
+	if(!icon_id_ptr)
+		return false;
+
+	const LLUUID& icon_id = *icon_id_ptr;
+
 	// Update the avatar
-	if (data.image_id.notNull())
+	if (icon_id.notNull())
 	{
-		LLIconCtrl::setValue(data.image_id);
+		LLIconCtrl::setValue(icon_id);
 	}
 	else
 	{
@@ -224,6 +312,7 @@ void LLAvatarIconCtrl::updateFromCache(LLAvatarIconCtrl::LLImagesCacheItem data)
 			setToolTip((LLStringExplicit)"");
 		}
 	}
+	return true;
 }
 
 //virtual
@@ -239,10 +328,8 @@ void LLAvatarIconCtrl::processProperties(void* data, EAvatarProcessorType type)
 				return;
 			}
 
-			LLAvatarIconCtrl::LLImagesCacheItem data(avatar_data->image_id, avatar_data->flags);
-
-			updateFromCache(data);
-			sImagesCache.insert(std::pair<LLUUID, LLAvatarIconCtrl::LLImagesCacheItem>(mAvatarId, data));
+			LLAvatarIconIDCache::getInstance()->add(mAvatarId,avatar_data->image_id);
+			updateFromCache();
 		}
 	}
 }
diff --git a/indra/newview/llavatariconctrl.h b/indra/newview/llavatariconctrl.h
index 49e304a521e1f7fb63da701fa0ba4c15c997d62f..77390eb2330c2d9be4956eb1a45b8cfee3d80925 100644
--- a/indra/newview/llavatariconctrl.h
+++ b/indra/newview/llavatariconctrl.h
@@ -37,6 +37,35 @@
 #include "llavatarpropertiesprocessor.h"
 #include "llviewermenu.h"
 
+class LLAvatarIconIDCache: public LLSingleton<LLAvatarIconIDCache>
+{
+public:
+	struct LLAvatarIconIDCacheItem
+	{
+		LLUUID icon_id;
+		LLDate cached_time;	
+
+		bool expired();
+	};
+
+	LLAvatarIconIDCache():mFilename("avatar_icons_cache.txt")
+	{
+	}
+
+	void				load	();
+	void				save	();
+
+	LLUUID*				get		(const LLUUID& id);
+	void				add		(const LLUUID& avatar_id,const LLUUID& icon_id);
+
+	void				remove	(const LLUUID& id);
+protected:
+	
+
+	std::string	mFilename;
+	std::map<LLUUID,LLAvatarIconIDCacheItem> mCache;//we cache only LLUID and time
+};
+
 class LLAvatarIconCtrl
 : public LLIconCtrl, public LLAvatarPropertiesObserver
 {
@@ -82,19 +111,8 @@ class LLAvatarIconCtrl
 	LLHandle<LLView>	mPopupMenuHandle;
 	bool				mDrawTooltip;
 
-	struct LLImagesCacheItem
-	{
-		LLUUID	image_id;
-		U32   	flags;
-
-		LLImagesCacheItem(LLUUID image_id_, U32 flags_) : image_id(image_id_), flags(flags_) {}
-	};
-
-	typedef std::map<LLUUID, LLAvatarIconCtrl::LLImagesCacheItem> avatar_image_map_t;
-	
-	static avatar_image_map_t sImagesCache;
 
-	void updateFromCache(LLAvatarIconCtrl::LLImagesCacheItem data);
+	bool updateFromCache();
 };
 
 #endif  // LL_LLAVATARICONCTRL_H
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index e71ddfb283e98b219195af96b9592f37263671aa..e1e3fe4677aec3ca0dd03d35b29eb136b55a4de3 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -420,7 +420,7 @@ void LLTeleportHistoryPanel::showTeleportHistory()
 	S32 index = hist_items.size() - 1;
 
 	for (LLTeleportHistoryStorage::slurl_list_t::const_reverse_iterator iter = hist_items.rbegin();
-	      iter != hist_items.rend(); ++iter)
+	      iter != hist_items.rend(); ++iter, --index)
 	{
 		std::string landmark_title = (*iter).mTitle;
 		LLStringUtil::toUpper(landmark_title);
@@ -496,8 +496,6 @@ void LLTeleportHistoryPanel::showTeleportHistory()
 		{
 			curr_flat_view->addItem(new LLTeleportHistoryFlatItem(index, &mContextMenu, (*iter).mTitle));
 		}
-
-		index--;
 	}
 
 	// Hide empty tabs from current to bottom
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index 9cd3acf13ed3af3ae87926e0ec2bbf3c170d80d4..45763dd8a7c5ad467c59cf4025bc3a9f2e28fe70 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -189,6 +189,7 @@
 #include "llwearable.h"
 #include "llinventorybridge.h"
 #include "llappearancemgr.h"
+#include "llavatariconctrl.h"
 
 #if LL_WINDOWS
 #include "llwindebug.h"
@@ -1021,6 +1022,9 @@ bool idle_startup()
 		// Load location history 
 		LLLocationHistory::getInstance()->load();
 
+		// Load Avatars icons cache
+		LLAvatarIconIDCache::getInstance()->load();
+
 		//-------------------------------------------------
 		// Handle startup progress screen
 		//-------------------------------------------------
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index 0921ccfb95aebfb78bf20298c7bc44e1c3775021..611c51ad117baf00c3e52edfd60306d5f453dc07 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -11,10 +11,10 @@
  can_dock="true"
  can_minimize="true"
  visible="true" 
- width="315">
+ width="365">
   <layout_stack follows="left|top|right|bottom"
                 height="235"
-                width="315"
+                width="365"
                 layout="topleft"
                 orientation="horizontal"
                 name="im_panels"
@@ -25,13 +25,13 @@
       layout="topleft"
       top_delta="-3"
       min_width="96" 
-      width="96"
+      width="146"
       height="225"
       label="IM Control Panel"
       user_resize="false" />
     <layout_panel height="235"
                   width="200"
-                  left_delta="96" 
+                  left_delta="146" 
                   top="0"
                   user_resize="false">
       <button height="12"
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index a9363df2597b5672f4b511ff5d9925640cc94da1..be38492c821102b2b32c2e3472eb571797661851 100644
--- a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
@@ -1,31 +1,27 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="panel_im_control_panel"
-       width="96"
-       height="215"
-       border="false">
-  <avatar_list
-           width="90"
-           column_padding="0"
-           draw_heading="true"
-           draw_stripes="false"
-           follows="left|top|bottom|right"
-           layout="topleft"
-           left="3"
-           name="speakers_list"
-           search_column="1"
-           sort_column="2"
-           top="10"
-           height="150" />
-
-  <button name="group_info_btn"
-          label="Group Info"
-          left_delta="3"
-          width="90"
-		  height="20" />
-
-  <button name="call_btn"
-          label="Call"
-          width="90"
-          height="20" />
-
+<panel
+ name="panel_im_control_panel"
+ width="146"
+ height="215"
+ border="false">
+    <avatar_list_tmp
+     color="DkGray2"
+     follows="left|top|right|bottom"
+     height="150"
+     layout="topleft"
+     left="3"
+     name="speakers_list"
+     top="10"
+     width="140"/>
+    <button
+     name="group_info_btn"
+     label="Group Info"
+     left_delta="3"
+     width="90"
+     height="20" />
+    <button
+     name="call_btn"
+     label="Call"
+     width="90"
+     height="20" />
 </panel>