diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index 80cec6c9f30a4dc8d86efbdc91f78693686ff9da..ccc7aa8cec918b463fbf9745543ccfa4479af3f0 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -47,6 +47,7 @@ set(llui_SOURCE_FILES
     lleditmenuhandler.cpp
     llf32uictrl.cpp
     llfiltereditor.cpp
+    llflashtimer.cpp
     llflatlistview.cpp
     llfloater.cpp
     llfloaterreg.cpp
@@ -153,6 +154,7 @@ set(llui_HEADER_FILES
     lleditmenuhandler.h
     llf32uictrl.h
     llfiltereditor.h 
+    llflashtimer.h
     llflatlistview.h
     llfloater.h
     llfloaterreg.h
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 3b9076ee54bca0a26c8b9506ad33e6c16bf7fb17..8a34e221b1a7213a30ca1db264139734177491da 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -170,17 +170,18 @@ LLButton::LLButton(const LLButton::Params& p)
 	mMouseUpSignal(NULL),
 	mHeldDownSignal(NULL),
 	mUseDrawContextAlpha(p.use_draw_context_alpha),
-	mHandleRightMouse(p.handle_right_mouse),
-	mButtonFlashCount(p.button_flash_count),
-	mButtonFlashRate(p.button_flash_rate)
+	mHandleRightMouse(p.handle_right_mouse)
 {
+	// If optional parameter "p.button_flash_count" is not provided, LLFlashTimer will be
+	// used instead it a "default" value from gSavedSettings.getS32("FlashCount")).
+	// Likewise, missing "p.button_flash_rate" is replaced by gSavedSettings.getF32("FlashPeriod");
+	S32 flash_count = p.button_flash_count || 0;
+	F32 flash_rate = p.button_flash_rate || 0.0; //
+	mFlashingTimer = new LLFlashTimer ((LLFlashTimer::callback_t)NULL, flash_count, flash_rate);
+
 	static LLUICachedControl<S32> llbutton_orig_h_pad ("UIButtonOrigHPad", 0);
 	static Params default_params(LLUICtrlFactory::getDefaultParams<LLButton>());
-if (this->getName() == "chat")
-{
-bool q = false;
-q = !q;
-}
+
 	if (!p.label_selected.isProvided())
 	{
 		mSelectedLabel = mUnselectedLabel;
@@ -271,6 +272,7 @@ LLButton::~LLButton()
 	delete mMouseDownSignal;
 	delete mMouseUpSignal;
 	delete mHeldDownSignal;
+	delete mFlashingTimer;
 }
 
 // HACK: Committing a button is the same as instantly clicking it.
@@ -595,22 +597,11 @@ void LLButton::draw()
 {
 	static LLCachedControl<bool> sEnableButtonFlashing(*LLUI::sSettingGroups["config"], "EnableButtonFlashing", true);
 	F32 alpha = mUseDrawContextAlpha ? getDrawContext().mAlpha : getCurrentTransparency();
-	bool flash = FALSE;
 
-	if( mFlashing)
-	{
-		if ( sEnableButtonFlashing)
-		{
-			F32 elapsed = mFlashingTimer.getElapsedTimeF32();
-			S32 flash_count = S32(elapsed * mButtonFlashRate * 2.f);
-			// flash on or off?
-			flash = (flash_count % 2 == 0) || flash_count > S32((F32)mButtonFlashCount * 2.f);
-		}
-		else
-		{ // otherwise just highlight button in flash color
-			flash = true;
-		}
-	}
+	mFlashing = mFlashingTimer->isFlashing();
+
+	bool flash = mFlashing &&
+	                 (!sEnableButtonFlashing || mFlashingTimer->isHighlight());
 
 	bool pressed_by_keyboard = FALSE;
 	if (hasFocus())
@@ -955,10 +946,13 @@ void LLButton::setToggleState(BOOL b)
 
 void LLButton::setFlashing( BOOL b )	
 { 
-	if ((bool)b != mFlashing)
+	if (b)
+	{
+		mFlashingTimer->startFlashing();
+	}
+	else
 	{
-		mFlashing = b; 
-		mFlashingTimer.reset();
+		mFlashingTimer->stopFlashing();
 	}
 }
 
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index deaa0823c610a16be0fa85f770e31bbc59529dee..92548298f5046be6383aacdf07f866a5075d3859 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -30,6 +30,7 @@
 #include "lluuid.h"
 #include "llbadgeowner.h"
 #include "llcontrol.h"
+#include "llflashtimer.h"
 #include "lluictrl.h"
 #include "v4color.h"
 #include "llframetimer.h"
@@ -201,6 +202,7 @@ class LLButton
 	void			setHighlight(bool b);
 	void			setFlashing( BOOL b );
 	BOOL			getFlashing() const		{ return mFlashing; }
+    LLFlashTimer*   getFlashTimer() {return mFlashingTimer;}
 
 	void			setHAlign( LLFontGL::HAlign align )		{ mHAlign = align; }
 	LLFontGL::HAlign getHAlign() const						{ return mHAlign; }
@@ -285,8 +287,6 @@ class LLButton
 
 	LLFrameTimer	mMouseDownTimer;
 	bool			mNeedsHighlight;
-	S32				mButtonFlashCount;
-	F32				mButtonFlashRate;
 
 	void			drawBorder(LLUIImage* imagep, const LLColor4& color, S32 size);
 	void			resetMouseDownTimer();
@@ -373,7 +373,7 @@ class LLButton
 	bool						mForcePressedState;
 	bool						mDisplayPressedState;
 
-	LLFrameTimer				mFlashingTimer;
+	LLFlashTimer*				mFlashingTimer;
 
 	bool						mHandleRightMouse;
 };
diff --git a/indra/newview/llflashtimer.cpp b/indra/llui/llflashtimer.cpp
similarity index 95%
rename from indra/newview/llflashtimer.cpp
rename to indra/llui/llflashtimer.cpp
index 2feacfa2181d34bebe5fbc79f126f363fb895c77..c572a83ff5f3d1bc2e3cc5fbb8fd071af1f6096e 100644
--- a/indra/newview/llflashtimer.cpp
+++ b/indra/llui/llflashtimer.cpp
@@ -23,12 +23,10 @@
  * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
  * $/LicenseInfo$
  */
-
-
-#include "llviewerprecompiledheaders.h"
+#include "../newview/llviewerprecompiledheaders.h"
 
 #include "llflashtimer.h"
-#include "llviewercontrol.h"
+#include "../newview/llviewercontrol.h"
 #include "lleventtimer.h"
 
 LLFlashTimer::LLFlashTimer(callback_t cb, S32 count, F32 period)
diff --git a/indra/newview/llflashtimer.h b/indra/llui/llflashtimer.h
similarity index 97%
rename from indra/newview/llflashtimer.h
rename to indra/llui/llflashtimer.h
index c030edfc52b2814ab664fc70db5510c1f4279650..2ef6ebcc8ac6eff65cacd58cbefec6ff7f24ba37 100644
--- a/indra/newview/llflashtimer.h
+++ b/indra/llui/llflashtimer.h
@@ -49,13 +49,14 @@ class LLFlashTimer : public LLEventTimer
 
 	void startFlashing();
 	void stopFlashing();
+
 	bool isFlashing() {return mIsFlashing;}
 	bool isHighlight() {return mIsHighlight;}
 
 private:
 	callback_t		mCallback;
 	/**
-	 * How many times Well will blink.
+	 * How many times parent will blink.
 	 */
 	S32 mFlashCount;
 	S32 mCurrentTickCount;
diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp
index 90568f344aadaa98e96b8e7b08247b0cf32d292d..d65f53cd4daab121d7c93261a89b5abb0bd79d9e 100755
--- a/indra/llui/llfolderviewitem.cpp
+++ b/indra/llui/llfolderviewitem.cpp
@@ -23,8 +23,9 @@
 * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA
 * $/LicenseInfo$
 */
+#include "../newview/llviewerprecompiledheaders.h"
 
-#include "../newview/llflashtimer.h"
+#include "llflashtimer.h"
 
 #include "linden_common.h"
 #include "llfolderviewitem.h"
@@ -164,17 +165,19 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
 	}
 }
 
+// Destroys the object
+LLFolderViewItem::~LLFolderViewItem()
+{
+	delete mFlashTimer;
+	mViewModelItem = NULL;
+}
+
 BOOL LLFolderViewItem::postBuild()
 {
 	refresh();
 	return TRUE;
 }
 
-// Destroys the object
-LLFolderViewItem::~LLFolderViewItem( void )
-{
-	mViewModelItem = NULL;
-}
 
 LLFolderView* LLFolderViewItem::getRoot()
 {
diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h
index c16d65206f7a4677b1b86f6eb27b333dd4eb54f3..c8d6c37b0403365bb36d0c0a327605a0e4f2540d 100755
--- a/indra/llui/llfolderviewitem.h
+++ b/indra/llui/llfolderviewitem.h
@@ -26,10 +26,10 @@
 #ifndef LLFOLDERVIEWITEM_H
 #define LLFOLDERVIEWITEM_H
 
+#include "llflashtimer.h"
 #include "llview.h"
 #include "lluiimage.h"
 
-class LLFlashTimer;
 class LLFolderView;
 class LLFolderViewModelItem;
 class LLFolderViewFolder;
@@ -163,6 +163,7 @@ class LLFolderViewItem : public LLView
     S32 getIconPad();
     S32 getTextPad();
 
+    LLFlashTimer* getFlashTimer() {return mFlashTimer;}
 	// If 'selection' is 'this' then note that otherwise ignore.
 	// Returns TRUE if this item ends up being selected.
 	virtual BOOL setSelection(LLFolderViewItem* selection, BOOL openitem, BOOL take_keyboard_focus);
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index c24eb2ee90a603813e62f7d067808fa7b2757985..d1f77830a64bf0a3f7136835c5ac98aaec19f897 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -506,8 +506,8 @@ void LLTabContainer::draw()
 		}
 	}
 
-	mPrevArrowBtn->setFlashing(FALSE);
-	mNextArrowBtn->setFlashing(FALSE);
+	mPrevArrowBtn->getFlashTimer()->stopFlashing();
+	mNextArrowBtn->getFlashTimer()->stopFlashing();
 }
 
 
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 574fdc495a55443621557b64156f3ef1e3fb56c9..f652c9e50c605ccc7a4c9fcc04445675faae066a 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -178,7 +178,6 @@ set(viewer_SOURCE_FILES
     llfilepicker.cpp
     llfilteredwearablelist.cpp
     llfirstuse.cpp
-    llflashtimer.cpp
     llflexibleobject.cpp
     llfloaterabout.cpp
     llfloaterbvhpreview.cpp
@@ -763,7 +762,6 @@ set(viewer_HEADER_FILES
     llfilepicker.h
     llfilteredwearablelist.h
     llfirstuse.h
-    llflashtimer.h
     llflexibleobject.h
     llfloaterabout.h
     llfloaterbvhpreview.h
diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp
index da6f3a484d1ab0671f610fbc4a8914279649b458..90ddeef5bbb2e12b26da969b0361ffa9138cfc91 100644
--- a/indra/newview/llfloaterimcontainer.cpp
+++ b/indra/newview/llfloaterimcontainer.cpp
@@ -41,6 +41,7 @@
 #include "llcallbacklist.h"
 #include "llgroupactions.h"
 #include "llgroupiconctrl.h"
+#include "llflashtimer.h"
 #include "llfloateravatarpicker.h"
 #include "llfloaterpreference.h"
 #include "llimview.h"
@@ -1594,17 +1595,22 @@ void LLFloaterIMContainer::reSelectConversation()
 	{
 		selectFloater(session_floater);
 	}
-
 }
 
-void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id)
+void LLFloaterIMContainer::flashConversationItemWidget(const LLUUID& session_id, bool is_flashes)
 {
 	LLFolderViewItem* widget = get_ptr_in_map(mConversationsWidgets,session_id);
 	if (widget)
 	{
-		widget->;
+		if (is_flashes)
+		{
+			widget->getFlashTimer()->startFlashing();
+		}
+		else
+		{
+			widget->getFlashTimer()->stopFlashing();
+		}
 	}
-
 }
 
 // EOF
diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h
index 443688668bdc7008b74a8a2a58873b803d081414..9112b540187cbe79d0fe205d7ce598e7c1e1d17a 100644
--- a/indra/newview/llfloaterimcontainer.h
+++ b/indra/newview/llfloaterimcontainer.h
@@ -164,7 +164,7 @@ class LLFloaterIMContainer
 	void setTimeNow(const LLUUID& session_id, const LLUUID& participant_id);
 	void setNearbyDistances();
 	void reSelectConversation();
-	void flashConversationItemWidget(const LLUUID& session_id);
+	void flashConversationItemWidget(const LLUUID& session_id, bool is_flashes);
 
 private:
 	LLConversationViewSession* createConversationItemWidget(LLConversationItem* item);
diff --git a/indra/newview/llfloaterimsessiontab.cpp b/indra/newview/llfloaterimsessiontab.cpp
index 69b42cdd6d9e1d3275e8037d451ed650a5c6f3c9..42e7e6cb553044834c472d4dd3435845ea43f4ae 100644
--- a/indra/newview/llfloaterimsessiontab.cpp
+++ b/indra/newview/llfloaterimsessiontab.cpp
@@ -40,6 +40,7 @@
 #include "llfloaterimsession.h"
 #include "llfloaterimcontainer.h" // to replace separate IM Floaters with multifloater container
 #include "lllayoutstack.h"
+#include "lltoolbarview.h"
 #include "llfloaterimnearbychat.h"
 
 const F32 REFRESH_INTERVAL = 0.2f;
@@ -328,11 +329,20 @@ std::string LLFloaterIMSessionTab::appendTime()
 
 void LLFloaterIMSessionTab::appendMessage(const LLChat& chat, const LLSD &args)
 {
+
 	// Update the participant activity time
 	LLFloaterIMContainer* im_box = LLFloaterIMContainer::findInstance();
 	if (im_box)
 	{
 		im_box->setTimeNow(mSessionID,chat.mFromID);
+
+		// TODO: Warning! The next two lines of code are included below only temporarily
+		// to demonstrate the correct format call the appropriate functions.
+		// They should be moved to the right places when working on CHUI-486. ~Alex ProductEngine.
+		// ---- start demo ----
+            im_box->flashConversationItemWidget(mSessionID, true); // flashing of the conversation's item
+            gToolBarView->flashCommand(LLCommandId("chat"), true); // flashing of the FUI button "Chat"
+        // ---- end demo -----
 	}