diff --git a/indra/llwindow/llwindow.cpp b/indra/llwindow/llwindow.cpp
index f4678a70c5b407fbcc75b39a38c203312a2aad6c..c5725677b485bb3caec21e73858d242eb85bf996 100644
--- a/indra/llwindow/llwindow.cpp
+++ b/indra/llwindow/llwindow.cpp
@@ -117,7 +117,8 @@ LLWindow::LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags)
 	  mSwapMethod(SWAP_METHOD_UNDEFINED),
 	  mHideCursorPermanent(FALSE),
 	  mFlags(flags),
-	  mHighSurrogate(0)
+	  mHighSurrogate(0),
+	  mRefreshRate(0)
 {
 }
 
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 0edf39f6ef53353d03ca75c2f66dc35f88c933f6..4380bbdb7370426a60b351d87066d99457bd7027 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -196,6 +196,8 @@ class LLWindow : public LLInstanceTracker<LLWindow>
     // windows only DirectInput8 for joysticks
     virtual void* getDirectInput8() { return NULL; };
     virtual bool getInputDevices(U32 device_type_filter, void * devices_callback, void* userdata) { return false; };
+
+    virtual S32 getRefreshRate() { return mRefreshRate; }
 protected:
 	LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags);
 	virtual ~LLWindow();
@@ -229,6 +231,7 @@ class LLWindow : public LLInstanceTracker<LLWindow>
 	U16			mHighSurrogate;
 	S32			mMinWindowWidth;
 	S32			mMinWindowHeight;
+    S32         mRefreshRate;
 
  	// Handle a UTF-16 encoding unit received from keyboard.
  	// Converting the series of UTF-16 encoding units to UTF-32 data,
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 1f3823509c4ebddb77e64193a292fdfc77f3868a..932f8c32cff7b789ff8836becc4e2defe99aa2cf 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -583,7 +583,7 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
 	{
 		current_refresh = 60;
 	}
-
+    mRefreshRate = current_refresh;
 	//-----------------------------------------------------------------------
 	// Drop resolution and go fullscreen
 	// use a display mode with our desired size and depth, with a refresh
@@ -1061,6 +1061,7 @@ BOOL LLWindowWin32::switchContext(BOOL fullscreen, const LLCoordScreen& size, BO
     {
         current_refresh = 60;
     }
+    mRefreshRate = current_refresh;
 
     gGLManager.shutdownGL();
     //destroy gl context
diff --git a/indra/newview/llfloaterperformance.cpp b/indra/newview/llfloaterperformance.cpp
index c89c58c4016a16bbefe80f5060b9d2637f650271..ecacadee3e704536077b0fd1f9993f6c9b5600cb 100644
--- a/indra/newview/llfloaterperformance.cpp
+++ b/indra/newview/llfloaterperformance.cpp
@@ -43,6 +43,7 @@
 #include "lltextbox.h"
 #include "lltrans.h"
 #include "llviewerobjectlist.h"
+#include "llviewerwindow.h"
 #include "llvoavatar.h"
 #include "llvoavatarself.h"
 #include "llworld.h"
@@ -162,11 +163,9 @@ void LLFloaterPerformance::showSelectedPanel(LLPanel* selected_panel)
 
 void LLFloaterPerformance::draw()
 {
-    const S32 NUM_PERIODS = 50;
-
     if (mUpdateTimer->hasExpired())
     {
-        getChild<LLTextBox>("fps_value")->setValue((S32)llround(LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS, NUM_PERIODS)));
+        setFPSText();
         if (mHUDsPanel->getVisible())
         {
             populateHUDList();
@@ -409,6 +408,21 @@ void LLFloaterPerformance::populateNearbyList()
     mNearbyList->selectByID(prev_selected_id);
 }
 
+void LLFloaterPerformance::setFPSText()
+{
+    const S32 NUM_PERIODS = 50;
+    S32 current_fps = (S32)llround(LLTrace::get_frame_recording().getPeriodMedianPerSec(LLStatViewer::FPS, NUM_PERIODS));
+    getChild<LLTextBox>("fps_value")->setValue(current_fps);
+
+    std::string fps_text = getString("fps_text");
+    static LLCachedControl<bool> vsync_enabled(gSavedSettings, "RenderVSyncEnable", true);
+    if (vsync_enabled && (current_fps >= gViewerWindow->getWindow()->getRefreshRate()))
+    {
+        fps_text += getString("max_text");
+    }
+    getChild<LLTextBox>("fps_lbl")->setValue(fps_text);
+}
+
 void LLFloaterPerformance::detachItem(const LLUUID& item_id)
 {
     LLAppearanceMgr::instance().removeItemFromAvatar(item_id);
diff --git a/indra/newview/llfloaterperformance.h b/indra/newview/llfloaterperformance.h
index 9ccb29cd7b53646ab7d5157cf158d0cf48030aba..e40eee162db0b0949e5d16e64de72384ad46007f 100644
--- a/indra/newview/llfloaterperformance.h
+++ b/indra/newview/llfloaterperformance.h
@@ -57,6 +57,7 @@ class LLFloaterPerformance : public LLFloater
     void populateHUDList();
     void populateObjectList();
     void populateNearbyList();
+    void setFPSText();
 
     void onClickAdvanced();
     void onChangeQuality(const LLSD& data);
diff --git a/indra/newview/skins/default/xui/en/floater_performance.xml b/indra/newview/skins/default/xui/en/floater_performance.xml
index 0107c5986817a93bfeef6e01efde8fd5deb26b56..bf2623f35613b46f49fa7e2a3687827fca28bc1c 100644
--- a/indra/newview/skins/default/xui/en/floater_performance.xml
+++ b/indra/newview/skins/default/xui/en/floater_performance.xml
@@ -6,6 +6,12 @@
  save_rect="true"
  title="IMPROVE GRAPHICS SPEED"
  width="580">
+  <string
+   name="fps_text"
+   value="frames per second"/>
+  <string
+   name="max_text"
+   value=" (maximum)"/>
   <panel
    bevel_style="none"
    follows="left|top"
@@ -35,7 +41,7 @@
        text_color="White"
        height="20"
        layout="topleft"
-       left="20"
+       left="10"
        top="8"
        name="fps_value"
        width="42">