diff --git a/engine/client/m_items.c b/engine/client/m_items.c
index 91fce7c03..0d0d83a5c 100644
--- a/engine/client/m_items.c
+++ b/engine/client/m_items.c
@@ -479,6 +479,7 @@ static void MenuDrawItems(int xpos, int ypos, menuoption_t *option, emenu_t *men
 	mpic_t *p;
 	int pw,ph;
 	int framescroll = 0;
+	int framescrollheight = 0;
 
 	menuframe_t *framescroller = NULL;
 
@@ -487,17 +488,21 @@ static void MenuDrawItems(int xpos, int ypos, menuoption_t *option, emenu_t *men
 		if (option->common.ishidden)
 			continue;
 
-		if (framescroller && option == menu->selecteditem)
+		if (framescroller && option == menu->selecteditem && framescrollheight)
 		{
 			if (ypos+option->common.posy < framescroller->common.posy)
 			{
-				framescroller->frac -= 0.1;
+				int i = ypos+option->common.posy+framescroll - framescroller->common.posy;
+				i-=8;
+				framescroller->frac = (i)/(float)framescrollheight;
 				if (framescroller->frac < 0)
 					framescroller->frac = 0;
 			}
 			else if (ypos+option->common.posy+option->common.height > framescroller->common.posy+framescroller->common.height)
 			{
-				framescroller->frac += 0.1;
+				int i = ypos+option->common.posy+framescroll - framescroller->common.posy;
+				i -= vid.height-8-framescroller->common.posy-option->common.height;
+				framescroller->frac = (i)/(float)framescrollheight;
 				if (framescroller->frac > 1)
 					framescroller->frac = 1;
 			}
@@ -594,6 +599,7 @@ static void MenuDrawItems(int xpos, int ypos, menuoption_t *option, emenu_t *men
 						maxy = opt2->common.posy + opt2->common.height;
 				}
 				maxy -= vid.height-8;
+				framescrollheight = maxy;
 
 				if (maxy < 0)
 				{
@@ -601,6 +607,7 @@ static void MenuDrawItems(int xpos, int ypos, menuoption_t *option, emenu_t *men
 					option->frame.frac = 0;
 					option->frame.common.width = 0;
 					option->frame.common.height = 0;
+					framescrollheight= 0;
 				}
 				else
 				{