diff --git a/src/m_menu.c b/src/m_menu.c
index 6383c106df3dce2e1aa8196ea9e4929832b22fbd..0ed7e6882649ee3a62d37a916abaafcea9c0d92d 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -1381,13 +1381,13 @@ static menuitem_t OP_VideoOptionsMenu[] =
 
 	{IT_HEADER, NULL, "Diagnostic", NULL, 184},
 	{IT_STRING | IT_CVAR, NULL, "Show FPS",                  &cv_ticrate,         190},
-	{IT_STRING | IT_CVAR, NULL, "FPS Cap",                   &cv_fpscap,          195},
-	{IT_STRING | IT_CVAR, NULL, "Clear Before Redraw",       &cv_homremoval,      200},
-	{IT_STRING | IT_CVAR, NULL, "Show \"FOCUS LOST\"",       &cv_showfocuslost,   205},
+	{IT_STRING | IT_CVAR, NULL, "Clear Before Redraw",       &cv_homremoval,      195},
+	{IT_STRING | IT_CVAR, NULL, "Show \"FOCUS LOST\"",       &cv_showfocuslost,   200},
 
 #ifdef HWRENDER
-	{IT_HEADER, NULL, "Renderer", NULL, 213},
-	{IT_CALL | IT_STRING, NULL, "OpenGL Options...",         M_OpenGLOptionsMenu, 219},
+	{IT_HEADER, NULL, "Renderer", NULL, 208},
+	{IT_CALL | IT_STRING, NULL, "OpenGL Options...",         M_OpenGLOptionsMenu, 214},
+	{IT_STRING | IT_CVAR, NULL, "FPS Cap",                   &cv_fpscap,          219},
 #endif
 };
 
diff --git a/src/screen.c b/src/screen.c
index 88898c503ae6b16ba43b47f3cc5ba5454a5c1e1a..b51b5472f8984bc889ed348659271ef21792de36 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -451,7 +451,6 @@ boolean SCR_IsAspectCorrect(INT32 width, INT32 height)
 	 );
 }
 
-static tic_t totaltics;
 double averageFPS = 0.0f;
 
 #define FPS_SAMPLE_RATE (50000) // How often to update FPS samples, in microseconds
@@ -515,18 +514,37 @@ void SCR_DisplayTicRate(void)
 	if (gamestate == GS_NULL)
 		return;
 
-	if (totaltics <= cap/2) ticcntcolor = V_REDMAP;
-	else if (totaltics >= cap) ticcntcolor = V_GREENMAP;
+	if (cap > 0)
+	{
+		if (fps <= cap / 2.0) ticcntcolor = V_REDMAP;
+		else if (fps <= cap * 0.90) ticcntcolor = V_YELLOWMAP;
+		else ticcntcolor = V_GREENMAP;
+	}
+	else
+	{
+		ticcntcolor = V_GREENMAP;
+	}
+
 
 	if (cv_ticrate.value == 2) // compact counter
 		V_DrawString(vid.width-(32*vid.dupx), h,
 			ticcntcolor|V_NOSCALESTART|V_USERHUDTRANS, va("%04.0f", fps));
 	else if (cv_ticrate.value == 1) // full counter
 	{
-		V_DrawString(vid.width-(104*vid.dupx), h,
-			V_YELLOWMAP|V_NOSCALESTART|V_USERHUDTRANS, "FPS:");
-		V_DrawString(vid.width-(72*vid.dupx), h,
-			ticcntcolor|V_NOSCALESTART|V_USERHUDTRANS, va("%4.0f/%4u", fps, cap));
+		if (cap > 0)
+		{
+			V_DrawString(vid.width-(104*vid.dupx), h,
+				V_YELLOWMAP|V_NOSCALESTART|V_USERHUDTRANS, "FPS:");
+			V_DrawString(vid.width-(72*vid.dupx), h,
+				ticcntcolor|V_NOSCALESTART|V_USERHUDTRANS, va("%4.0f/%4u", fps, cap));
+		}
+		else
+		{
+			V_DrawString(vid.width-(88*vid.dupx), h,
+				V_YELLOWMAP|V_NOSCALESTART|V_USERHUDTRANS, "FPS:");
+			V_DrawString(vid.width-(56*vid.dupx), h,
+				ticcntcolor|V_NOSCALESTART|V_USERHUDTRANS, va("%4.0f", fps));
+		}
 	}
 }