diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp
index 75342afbe269b1ee5189394f394a5dda717791ae..e9614ea660ceb18d60bdedaadf605aab8b110160 100644
--- a/indra/llui/llkeywords.cpp
+++ b/indra/llui/llkeywords.cpp
@@ -339,6 +339,9 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
 		{
 			if( *cur == '\n' )
 			{
+				LLTextSegmentPtr text_segment = new LLLineBreakTextSegment(cur-base);
+				text_segment->setToken( 0 );
+				insertSegment( *seg_list, text_segment, text_len, defaultColor, editor);
 				cur++;
 				if( !*cur || *cur == '\n' )
 				{
@@ -378,9 +381,8 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
 						}
 						S32 seg_end = cur - base;
 						
-						LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, seg_end, editor );
-						text_segment->setToken( cur_token );
-						insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
+						//create segments from seg_start to seg_end
+						insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor);
 						line_done = TRUE; // to break out of second loop.
 						break;
 					}
@@ -486,11 +488,12 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
 						seg_end = seg_start + between_delimiters + cur_delimiter->getLength();
 					}
 
-
+					insertSegments(wtext, *seg_list,cur_delimiter, text_len, seg_start, seg_end, defaultColor, editor);
+					/*
 					LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_delimiter->getColor(), seg_start, seg_end, editor );
 					text_segment->setToken( cur_delimiter );
 					insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
-
+					*/
 					// Note: we don't increment cur, since the end of one delimited seg may be immediately
 					// followed by the start of another one.
 					continue;
@@ -519,10 +522,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
 
 						// llinfos << "Seg: [" << word.c_str() << "]" << llendl;
 
-
-						LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, seg_end, editor );
-						text_segment->setToken( cur_token );
-						insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
+						insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor);
 					}
 					cur += seg_len; 
 					continue;
@@ -537,24 +537,50 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
 	}
 }
 
-void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>* seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, LLTextEditor& editor )
+void LLKeywords::insertSegments(const LLWString& wtext, std::vector<LLTextSegmentPtr>& seg_list, LLKeywordToken* cur_token, S32 text_len, S32 seg_start, S32 seg_end, const LLColor4 &defaultColor, LLTextEditor& editor )
+{
+	std::string::size_type pos = wtext.find('\n',seg_start);
+	
+	while (pos!=-1 && pos < (std::string::size_type)seg_end)
+	{
+		if (pos!=seg_start)
+		{
+			LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, pos, editor );
+			text_segment->setToken( cur_token );
+			insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
+		}
+
+		LLTextSegmentPtr text_segment = new LLLineBreakTextSegment(pos);
+		text_segment->setToken( cur_token );
+		insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
+
+		seg_start = pos+1;
+		pos = wtext.find('\n',seg_start);
+	}
+
+	LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, seg_end, editor );
+	text_segment->setToken( cur_token );
+	insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
+}
+
+void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, LLTextEditor& editor )
 {
-	LLTextSegmentPtr last = seg_list->back();
+	LLTextSegmentPtr last = seg_list.back();
 	S32 new_seg_end = new_segment->getEnd();
 
 	if( new_segment->getStart() == last->getStart() )
 	{
-		seg_list->pop_back();
+		seg_list.pop_back();
 	}
 	else
 	{
 		last->setEnd( new_segment->getStart() );
 	}
-	seg_list->push_back( new_segment );
+	seg_list.push_back( new_segment );
 
 	if( new_seg_end < text_len )
 	{
-		seg_list->push_back( new LLNormalTextSegment( defaultColor, new_seg_end, text_len, editor ) );
+		seg_list.push_back( new LLNormalTextSegment( defaultColor, new_seg_end, text_len, editor ) );
 	}
 }
 
diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h
index e5b66dfa56d44414259931d32c4c58ad59dbe569..09378e408bb0b7fc55464101cebb705ce8709613 100644
--- a/indra/llui/llkeywords.h
+++ b/indra/llui/llkeywords.h
@@ -129,7 +129,8 @@ class LLKeywords
 
 private:
 	LLColor3	readColor(const std::string& s);
-	void		insertSegment(std::vector<LLTextSegmentPtr> *seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, class LLTextEditor& editor);
+	void		insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, class LLTextEditor& editor);
+	void		insertSegments(const LLWString& wtext, std::vector<LLTextSegmentPtr>& seg_list, LLKeywordToken* token, S32 text_len, S32 seg_start, S32 seg_end, const LLColor4 &defaultColor, LLTextEditor& editor);
 
 	BOOL		mLoaded;
 	word_token_map_t mWordTokenMap;
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index d86709c448a0db179f995624dbdb3a45bd892f15..72f3a14822be246b57940f04c311772b00e175b0 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -2743,6 +2743,12 @@ void LLInlineViewSegment::linkToDocument(LLTextBase* editor)
 	editor->addDocumentChild(mView);
 }
 
+LLLineBreakTextSegment::LLLineBreakTextSegment(S32 pos):LLTextSegment(pos,pos+1)
+{
+	LLStyleSP s( new LLStyle(LLStyle::Params().visible(true)));
+
+	mFontHeight = llceil(s->getFont()->getLineHeight());
+}
 LLLineBreakTextSegment::LLLineBreakTextSegment(LLStyleConstSP style,S32 pos):LLTextSegment(pos,pos+1)
 {
 	mFontHeight = llceil(style->getFont()->getLineHeight());
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 176308c61a527abb8e3bc67bcc2c0c1de3369550..89ce5cdc8e142cc25753e749bdc0e605c4c985b8 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -519,6 +519,7 @@ class LLLineBreakTextSegment : public LLTextSegment
 public:
 
 	LLLineBreakTextSegment(LLStyleConstSP style,S32 pos);
+	LLLineBreakTextSegment(S32 pos);
 	~LLLineBreakTextSegment();
 	bool		getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
 	S32			getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const;
diff --git a/indra/newview/llinventoryfunctions.h b/indra/newview/llinventoryfunctions.h
index 33b52cfd5e614ccf5d16034c3f2ce54bd40c262b..c82ebd1439fa97d39c9d79831382a5eb08cc865c 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -324,6 +324,19 @@ class LLFindWearablesOfType : public LLInventoryCollectFunctor
 	LLWearableType::EType mWearableType;
 };
 
+/** Filter out wearables-links */
+class LLFindActualWearablesOfType : public LLFindWearablesOfType
+{
+public:
+	LLFindActualWearablesOfType(LLWearableType::EType type) : LLFindWearablesOfType(type) {}
+	virtual ~LLFindActualWearablesOfType() {}
+	virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+	{
+		if (item && item->getIsLinkType()) return false;
+		return LLFindWearablesOfType::operator()(cat, item);
+	}
+};
+
 // Find worn items.
 class LLFindWorn : public LLInventoryCollectFunctor
 {
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index d2b402fe14204ae962d58c9e4696f5c13df6d4dd..bd3525967071f6cb5fbea40aa5bf59a7ef8f5f7e 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -62,13 +62,9 @@
 #include "llsdutil.h"
 #include <deque>
 
-// If the viewer gets a notification, your observer assumes
-// that that notification is for itself and then tries to process
-// the results.  The notification could be for something else (e.g.
-// you're fetching an item and a notification gets triggered because
-// you renamed some other item).  This counter is to specify how many
-// notification to wait for before giving up.
-static const U32 MAX_NUM_NOTIFICATIONS_TO_PROCESS = 127;
+const U32 LLInventoryFetchItemsObserver::MAX_NUM_ATTEMPTS_TO_PROCESS = 10;
+const F32 LLInventoryFetchItemsObserver::FETCH_TIMER_EXPIRY = 10.0f;
+
 
 LLInventoryObserver::LLInventoryObserver()
 {
@@ -149,7 +145,7 @@ void LLInventoryCompletionObserver::watchItem(const LLUUID& id)
 LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_id) :
 	LLInventoryFetchObserver(item_id),
 
-	mNumTries(MAX_NUM_NOTIFICATIONS_TO_PROCESS)
+	mNumTries(MAX_NUM_ATTEMPTS_TO_PROCESS)
 {
 	mIDs.clear();
 	mIDs.push_back(item_id);
@@ -158,35 +154,47 @@ LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_
 LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids) :
 	LLInventoryFetchObserver(item_ids),
 
-	mNumTries(MAX_NUM_NOTIFICATIONS_TO_PROCESS)
+	mNumTries(MAX_NUM_ATTEMPTS_TO_PROCESS)
 {
 }
 
 void LLInventoryFetchItemsObserver::changed(U32 mask)
 {
-	BOOL any_items_missing = FALSE;
-
 	// scan through the incomplete items and move or erase them as
 	// appropriate.
 	if (!mIncomplete.empty())
 	{
+		// if period of an attempt expired...
+		if (mFetchingPeriod.hasExpired())
+		{
+			// ...reset timer and reduce count of attempts
+			mFetchingPeriod.reset();
+			mFetchingPeriod.setTimerExpirySec(FETCH_TIMER_EXPIRY);
+
+			--mNumTries;
+
+			LL_INFOS("InventoryFetch") << "LLInventoryFetchItemsObserver: " << this << ", attempt(s) left: " << (S32)mNumTries << LL_ENDL;
+		}
+
+		// do we still have any attempts?
+		bool timeout_expired = mNumTries <= 0;
+
 		for (uuid_vec_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
 		{
 			const LLUUID& item_id = (*it);
 			LLViewerInventoryItem* item = gInventory.getItem(item_id);
 			if (!item)
 			{
-				any_items_missing = TRUE;
-				if (mNumTries > 0)
+				if (timeout_expired)
 				{
-					// Keep trying.
-					++it;
+					// Just concede that this item hasn't arrived in reasonable time and continue on.
+					LL_WARNS("InventoryFetch") << "Fetcher timed out when fetching inventory item UUID: " << item_id << LL_ENDL;
+					it = mIncomplete.erase(it);
 				}
 				else
 				{
-					// Just concede that this item hasn't arrived in reasonable time and continue on.
-					llwarns << "Fetcher timed out when fetching inventory item assetID:" << item_id << llendl;
-					it = mIncomplete.erase(it);
+					// Keep trying.
+					++it;
 				}
 				continue;
 			}
@@ -198,14 +206,10 @@ void LLInventoryFetchItemsObserver::changed(U32 mask)
 			}
 			++it;
 		}
-		if (any_items_missing)
-		{
-			mNumTries--;
-		}
 
 		if (mIncomplete.empty())
 		{
-			mNumTries = MAX_NUM_NOTIFICATIONS_TO_PROCESS;
+			mNumTries = MAX_NUM_ATTEMPTS_TO_PROCESS;
 			done();
 		}
 	}
@@ -315,6 +319,10 @@ void LLInventoryFetchItemsObserver::startFetch()
 		item_entry["item_id"] = (*it);
 		items_llsd.append(item_entry);
 	}
+
+	mFetchingPeriod.resetWithExpiry(FETCH_TIMER_EXPIRY);
+	mNumTries = MAX_NUM_ATTEMPTS_TO_PROCESS;
+
 	fetch_items_from_llsd(items_llsd);
 }
 
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 6d5a86a6fca9763148b9d807cff34ffa23e6934c..72c13f55c691a514f3d0ab5a869c02c0329494e2 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -110,6 +110,22 @@ class LLInventoryFetchItemsObserver : public LLInventoryFetchObserver
 	/*virtual*/ void changed(U32 mask);
 private:
 	S8 mNumTries; // Number of times changed() was called without success
+	LLFrameTimer mFetchingPeriod;
+
+	/**
+	 * If the viewer gets a notification, your observer assumes
+	 * that that notification is for itself and then tries to process
+	 * the results.  The notification could be for something else (e.g.
+	 * you're fetching an item and a notification gets triggered because
+	 * you renamed some other item).  This counter is to specify how many
+	 * periods of time to wait for before giving up.
+	 */
+	static const U32 MAX_NUM_ATTEMPTS_TO_PROCESS;
+
+	/**
+	 * Period of waiting a notification when requested items get added into inventory.
+	 */
+	static const F32 FETCH_TIMER_EXPIRY;
 };
 
 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index ea7410502d7e427acc670df007aac4ec438928d1..ce382541c671335d3627523a0112237058f8d928 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -280,7 +280,7 @@ BOOL LLPanelOutfitEdit::postBuild()
 	childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance()));
 
 	mWearableListMaskCollector = new LLFindNonLinksByMask(ALL_ITEMS_MASK);
-	mWearableListTypeCollector = new LLFindWearablesOfType(LLWearableType::WT_NONE);
+	mWearableListTypeCollector = new LLFindActualWearablesOfType(LLWearableType::WT_NONE);
 
 	mWearableItemsPanel = getChild<LLPanel>("filtered_wearables_panel");
 	mWearableItemsList = getChild<LLInventoryItemsList>("filtered_wearables_list");
diff --git a/indra/newview/skins/default/xui/de/panel_bottomtray.xml b/indra/newview/skins/default/xui/de/panel_bottomtray.xml
index d52b8dcf4d3ce534cdf476178a987240cfe828b4..83f67344cac263743d8a88a2a14731cd985d7b89 100644
--- a/indra/newview/skins/default/xui/de/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/de/panel_bottomtray.xml
@@ -9,7 +9,7 @@
 	<layout_stack name="toolbar_stack">
 		<layout_panel name="speak_panel">
 			<talk_button name="talk">
-				<speak_button label="Sprechen" label_selected="Sprechen" name="speak_btn" halign="right" />
+				<speak_button label="Sprechen" label_selected="Sprechen" name="speak_btn" />
 			</talk_button>
 		</layout_panel>
 		<layout_panel name="gesture_panel">
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 f537c81860949a651110382b10724c3b0af4e345..c9b013099bc60c1a67c8edcd47cbe819a5c2eaea 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -33,7 +33,6 @@
       name="panel_im_control_panel"
       layout="topleft"
       follows="left"
-      label="IM Control Panel"
       min_width="115" 
       auto_resize="false"
       user_resize="true" />
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index 82b2405ec98b3f0acd1816649b9b6f49593a7856..4eff5bc48aec9bf8bc53f84495d280a87a6b10b8 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -90,7 +90,7 @@
                  label="Speak"
                  label_selected="Speak"
                  name="speak_btn"
-                 pad_right="22"
+                 pad_right="20"
                  tab_stop="true"
                  use_ellipses="true" />
             </talk_button>
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index 40f60d50fb46f12d11d2450a9787e9b2a6f3e100..feee5323207d99211a8fe93b9c82b9be05fd96a2 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -5,7 +5,6 @@
  border="false"
  height="600"
  follows="all"
- label="Outfit Edit"
  layout="topleft"
  left="0"
  min_height="350"
@@ -85,7 +84,6 @@
      bevel_style="none"
      follows="top|left|right"
      height="40"
-     label="bottom_panel"
      layout="topleft"
      left="6"
      name="header_panel"
@@ -106,7 +104,6 @@
              bevel_style="none"
              follows="top|right"
              height="38"
-             label="bottom_panel"
              layout="topleft"
              left_pad="5"
              name="outfit_name_and_status"
@@ -160,7 +157,6 @@ It is calculated as border_size + 2*UIResizeBarOverlap
         <layout_panel
          layout="topleft"
          height="187"
-         label="IM Control Panel"
          min_height="100"
          name="outfit_wearables_panel"
          width="313"
@@ -183,7 +179,6 @@ It is calculated as border_size + 2*UIResizeBarOverlap
                  bg_alpha_color="DkGray2"
                  layout="topleft"
                  height="154"
-                 label="add_button_and_combobox"
                  name="add_button_and_combobox"
                  width="311"
                  user_resize="false"
@@ -343,7 +338,6 @@ It is calculated as border_size + 2*UIResizeBarOverlap
      bevel_style="none"
      follows="bottom|left|right"
      height="27"
-     label="bottom_panel"
      layout="topleft"
      left="5"
      name="no_add_wearables_button_bar"
@@ -378,7 +372,6 @@ It is calculated as border_size + 2*UIResizeBarOverlap
      bevel_style="none"
      follows="left|right|bottom"
      height="27"
-     label="add_wearables_button_bar"
      layout="topleft"
      left="5"
      name="add_wearables_button_bar"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index b79ef1e287b58d2bc364b20a31cd820c8acb72e7..da28773c74c57241b1394679e53abe03a94e5426 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -173,6 +173,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
        		 background_visible="true"
        		 bg_alpha_color="DkGray2"
        		 bg_opaque_color="DkGray2"
+             empty_accordion_text.value=""
              follows="all"
              height="356"
              layout="topleft"