diff --git a/src/include/menus.h b/src/include/menus.h
index 86d9fa267..0b082abe8 100644
--- a/src/include/menus.h
+++ b/src/include/menus.h
@@ -297,14 +297,16 @@ typedef struct _menuitem_ {
 */
 typedef struct _menus_ {
 	/// @todo char* Name; ///< menu name
-	int       X;         ///< menu area x pos
-	int       Y;         ///< menu area y pos
-	int       Width;     ///< menu area width
-	int       Height;    ///< menu area height
-	char*     Panel;     ///< optional background panel
-	int       DefSel;    ///< initial selected item number (or -1)
-	int       NumItems;  ///< number of items to follow
-	Menuitem* Items;     ///< buttons, etc
+	int       X;          ///< menu area x pos
+	int       Y;          ///< menu area y pos
+	int       Width;      ///< menu area width
+	int       Height;     ///< menu area height
+	char*     Panel;      ///< optional background panel
+	char*     Background; ///< optional background image behind the menu panel
+	Graphic*  BackgroundG;///< optional background image behind the menu panel
+	int       DefSel;     ///< initial selected item number (or -1)
+	int       NumItems;   ///< number of items to follow
+	Menuitem* Items;      ///< buttons, etc
 	void (*NetAction)(void);   ///< network action callback
 } Menu;
 
diff --git a/src/ui/menu_proc.cpp b/src/ui/menu_proc.cpp
index ea1fb8512..f5afa9436 100644
--- a/src/ui/menu_proc.cpp
+++ b/src/ui/menu_proc.cpp
@@ -91,14 +91,6 @@ global Menu* CurrentMenu;
 */
 local Graphic* Menusbgnd;
 
-/**
-**		X, Y, Width, and Height of menu are to redraw
-*/
-local int MenuRedrawX;
-local int MenuRedrawY;
-local int MenuRedrawW;
-local int MenuRedrawH;
-
 local int MenuButtonUnderCursor = -1;
 local int MenuButtonCurSel = -1;
 
@@ -182,11 +174,6 @@ global void MenusSetBackground(void)
 	VideoDrawSubClip(Menusbgnd, 0, 0,
 		Menusbgnd->Width, Menusbgnd->Height,
 		(VideoWidth - Menusbgnd->Width) / 2, (VideoHeight - Menusbgnd->Height) / 2);
-
-	MenuRedrawX = 0;
-	MenuRedrawY = 0;
-	MenuRedrawW = VideoWidth;
-	MenuRedrawH = VideoHeight;
 }
 
 /**
@@ -987,9 +974,9 @@ local void DrawInput(Menuitem* mi, int mx, int my)
 
 
 /**
-**		Draw a menu.
+**  Draw a menu.
 **
-**		@param menu		The menu number to display (NULL allowed)
+**  @param menu  The menu number to display (NULL allowed)
 */
 global void DrawMenu(Menu* menu)
 {
@@ -1007,35 +994,38 @@ global void DrawMenu(Menu* menu)
 		return;
 	}
 
-	MenuRedrawX = menu->X;
-	MenuRedrawY = menu->Y;
-	MenuRedrawW = menu->Width;
-	MenuRedrawH = menu->Height;
+	if (menu->Background) {
+		if (!menu->BackgroundG) {
+			menu->BackgroundG = LoadGraphic(menu->Background);
+			ResizeGraphic(menu->BackgroundG, VideoWidth, VideoHeight);
+		}
+		VideoDraw(menu->BackgroundG, 0, 0, 0);
+	}
 
 	if (menu->Panel && !strcmp(menu->Panel, ScPanel)) {
 		// Background
-		VideoFillTransRectangle(ColorBlack, MenuRedrawX + 1,
-				MenuRedrawY + 1, MenuRedrawW - 2, MenuRedrawH - 2, 50);
-		VideoDrawHLineClip(ColorBlue, MenuRedrawX + 3, MenuRedrawY, MenuRedrawW - 6);
-		VideoDrawHLineClip(ColorBlue, MenuRedrawX + 3, MenuRedrawY + MenuRedrawH - 1, MenuRedrawW - 6);
-		VideoDrawVLineClip(ColorBlue, MenuRedrawX, MenuRedrawY + 3, MenuRedrawH - 6);
-		VideoDrawVLineClip(ColorBlue, MenuRedrawX + MenuRedrawW - 1, MenuRedrawY + 3, MenuRedrawH - 6);
+		VideoFillTransRectangle(ColorBlack, menu->X + 1,
+				menu->Y + 1, menu->Width - 2, menu->Height - 2, 50);
+		VideoDrawHLineClip(ColorBlue, menu->X + 3, menu->Y, menu->Width - 6);
+		VideoDrawHLineClip(ColorBlue, menu->X + 3, menu->Y + menu->Height - 1, menu->Width - 6);
+		VideoDrawVLineClip(ColorBlue, menu->X, menu->Y + 3, menu->Height - 6);
+		VideoDrawVLineClip(ColorBlue, menu->X + menu->Width - 1, menu->Y + 3, menu->Height - 6);
 		// top left
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + 1, MenuRedrawY + 1);
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + 2, MenuRedrawY + 1);
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + 1, MenuRedrawY + 2);
+		VideoDrawPixelClip(ColorBlue, menu->X + 1, menu->Y + 1);
+		VideoDrawPixelClip(ColorBlue, menu->X + 2, menu->Y + 1);
+		VideoDrawPixelClip(ColorBlue, menu->X + 1, menu->Y + 2);
 		// top right
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + MenuRedrawW - 3, MenuRedrawY + 1);
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + MenuRedrawW - 2, MenuRedrawY + 1);
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + MenuRedrawW - 2, MenuRedrawY + 2);
+		VideoDrawPixelClip(ColorBlue, menu->X + menu->Width - 3, menu->Y + 1);
+		VideoDrawPixelClip(ColorBlue, menu->X + menu->Width - 2, menu->Y + 1);
+		VideoDrawPixelClip(ColorBlue, menu->X + menu->Width - 2, menu->Y + 2);
 		// bottom left
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + 1, MenuRedrawY + MenuRedrawH - 3);
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + 1, MenuRedrawY + MenuRedrawH - 2);
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + 2, MenuRedrawY + MenuRedrawH - 2);
+		VideoDrawPixelClip(ColorBlue, menu->X + 1, menu->Y + menu->Height - 3);
+		VideoDrawPixelClip(ColorBlue, menu->X + 1, menu->Y + menu->Height - 2);
+		VideoDrawPixelClip(ColorBlue, menu->X + 2, menu->Y + menu->Height - 2);
 		// bottom right
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + MenuRedrawW - 3, MenuRedrawY + MenuRedrawH - 2);
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + MenuRedrawW - 2, MenuRedrawY + MenuRedrawH - 2);
-		VideoDrawPixelClip(ColorBlue, MenuRedrawX + MenuRedrawW - 2, MenuRedrawY + MenuRedrawH - 3);
+		VideoDrawPixelClip(ColorBlue, menu->X + menu->Width - 3, menu->Y + menu->Height - 2);
+		VideoDrawPixelClip(ColorBlue, menu->X + menu->Width - 2, menu->Y + menu->Height - 2);
+		VideoDrawPixelClip(ColorBlue, menu->X + menu->Width - 2, menu->Y + menu->Height - 3);
 	} else if (menu->Panel) {
 		MenuPanel* menupanel;
 
diff --git a/src/ui/menus.cpp b/src/ui/menus.cpp
index ab7a8a47f..516837f6c 100644
--- a/src/ui/menus.cpp
+++ b/src/ui/menus.cpp
@@ -782,28 +782,26 @@ global void InitMenuFuncHash(void)
 }
 
 /*----------------------------------------------------------------------------
---		Button action handler and Init/Exit functions
+--  Button action handler and Init/Exit functions
 ----------------------------------------------------------------------------*/
 
 /**
-**		Draw the version and copyright at bottom of the screen.
-**		Also include now the license.
+**  Draw the version, copyright, and license at bottom of the screen.
 */
-local void NameLineDrawFunc(Menuitem * mi __attribute__ ((unused)))
+local void NameLineDrawFunc(Menuitem* mi __attribute__ ((unused)))
 {
 	char* nc;
 	char* rc;
 
 	GetDefaultTextColors(&nc, &rc);
-	MenusSetBackground();
 	SetDefaultTextColors(rc, rc);
 
 	if (SoundFildes == -1 && !SoundOff) {
 		VideoDrawText(16, 16, LargeFont, "Sound disabled, please check!");
 	}
 
-	VideoDrawTextCentered(VideoWidth/2, TheUI.Offset480Y + 440, GameFont, NameLine);
-	VideoDrawTextCentered(VideoWidth/2, TheUI.Offset480Y + 456, GameFont,
+	VideoDrawTextCentered(VideoWidth / 2, TheUI.Offset480Y + 440, GameFont, NameLine);
+	VideoDrawTextCentered(VideoWidth / 2, TheUI.Offset480Y + 456, GameFont,
 		"Engine distributed under the terms of the GNU General Public License.");
 	SetDefaultTextColors(nc, rc);
 }
@@ -1735,8 +1733,6 @@ local void GlobalOptionsResolutionGem(Menuitem *mi)
 		InitVideo();
 		// Force Update Background Size
 		SetClipping(0,0,VideoWidth - 1,VideoHeight - 1);
-		MenusSetBackground();
-		Invalidate();
 		CleanModules();
 		LoadCcl();
 		PreMenuSetup();
@@ -2754,18 +2750,15 @@ local void SinglePlayerGameMenu(void)
 }
 
 /**
-**		Show the campaign select menu.
+**  Show the campaign select menu.
 **
-**		Look which campaigns are available and how they are called.
+**  Look which campaigns are available and how they are called.
 */
 local void CampaignGameMenu(void)
 {
 	int i;
 	Menu* menu;
 
-	MenusSetBackground();
-	Invalidate();
-
 	menu = FindMenu("menu-campaign-select");
 	DebugPrint("%d campaigns available\n" _C_ NumCampaigns);
 #ifdef DEBUG
@@ -2777,7 +2770,7 @@ local void CampaignGameMenu(void)
 #endif
 
 	//
-	//		Setup campaign name.
+	//  Setup campaign name.
 	//
 	for (i = 0; i < NumCampaigns && i < 4; ++i) {
 		char* s;
@@ -2812,9 +2805,6 @@ local void CampaignGameMenu(void)
 */
 local void StartCampaignFromMenu(int number)
 {
-	MenusSetBackground();
-	Invalidate();
-
 #if 0
 	// JOHNS: this is currently not needed:
 
@@ -2828,10 +2818,6 @@ local void StartCampaignFromMenu(int number)
 	PlayCampaign(Campaigns[number].Ident);
 	GuiGameStarted = 1;
 
-	MenusSetBackground();
-	VideoClearScreen();
-	Invalidate();
-
 	// FIXME: johns otherwise crash in UpdateDisplay -> DrawMinimapCursor
 	EndMenu();
 }
@@ -2944,9 +2930,6 @@ local void JoinNetGameMenu(void)
 	char *port;
 	Menu *menu;
 
-	MenusSetBackground();
-	Invalidate();
-
 	//
 	//  Prepare enter ip/hostname menu
 	//
@@ -2976,8 +2959,6 @@ local void JoinNetGameMenu(void)
 
 	ProcessMenu("menu-enter-server", 1);
 
-	MenusSetBackground();
-
 	if (menu->Items[1].d.input.nch == 0) {
 		return;
 	}
@@ -2991,7 +2972,6 @@ local void JoinNetGameMenu(void)
 	server_host_buffer[menu->Items[1].d.input.nch] = 0;
 	if (NetworkSetupServerAddress(server_host_buffer)) {
 		NetErrorMenu("Unable to lookup host.");
-		MenusSetBackground();
 		return;
 	}
 	NetworkInitClientConnect();
@@ -3009,8 +2989,6 @@ local void JoinNetGameMenu(void)
 	ProcessMenu("menu-net-connecting", 1);
 
 	if (GuiGameStarted) {
-		MenusSetBackground();
-		Invalidate();
 		EndMenu();
 	}
 }
@@ -3038,7 +3016,6 @@ local void NetConnectingExit(Menuitem *mi)
 */
 local void NetConnectingCancel(void)
 {
-	MenusSetBackground();
 	NetworkExitClientConnect();
 	// Trigger TerminateNetConnect() to call us again and end the menu
 	NetLocalState = ccs_usercanceled;
@@ -3129,11 +3106,8 @@ local void CreateInternetGameMenu(void)
 */
 local void MultiGameStart(void)
 {
-	MenusSetBackground();
-	Invalidate();
-
 	if (MetaServerInUse) {
-		SendMetaCommand("StartGame","");
+		SendMetaCommand("StartGame", "");
 	}
 
 	GameSettings.Presets[0].Race = SettingsPresetMapDefault;
@@ -3150,10 +3124,7 @@ local void MultiGameStart(void)
 local void MultiPlayerGameMenu(void)
 {
 	char NameBuf[32];
-	Menu *menu;
-
-	MenusSetBackground();
-	Invalidate();
+	Menu* menu;
 
 	menu = FindMenu("menu-enter-name");
 	menu->Items[1].d.input.buffer = NameBuf;
@@ -3165,8 +3136,6 @@ local void MultiPlayerGameMenu(void)
 
 	ProcessMenu("menu-enter-name", 1);
 
-	MenusSetBackground();
-
 	if (menu->Items[1].d.input.nch == 0) {
 		return;
 	}
@@ -3785,7 +3754,6 @@ local void ScenSelectCancel(void)
 */
 local void GameCancel(void)
 {
-	MenusSetBackground();
 	FreeMapInfo(MenuMapInfo);
 	MenuMapInfo = NULL;
 	EndMenu();
@@ -3892,7 +3860,6 @@ local void GameDrawFunc(Menuitem *mi __attribute__((unused)))
 	char buffer[32];
 
 	GetDefaultTextColors(&nc, &rc);
-	MenusSetBackground();
 	SetDefaultTextColors(rc, rc);
 	l = VideoTextLength(GameFont, "Scenario:");
 	VideoDrawText(TheUI.Offset640X + 16, TheUI.Offset480Y + 360, GameFont, "Scenario:");
@@ -4750,9 +4717,6 @@ global void NetClientUpdateState(void)
 */
 local void StartEditor(void)
 {
-	MenusSetBackground();
-	Invalidate();
-
 	SetupEditor();
 
 	EditorRunning = 1;
@@ -4814,9 +4778,6 @@ local void EditorNewMap(void)
 	char height[10];
 	char description[36];
 
-	MenusSetBackground();
-	Invalidate();
-
 	EditorCancelled = 0;
 
 	menu = FindMenu("menu-editor-new");
@@ -4836,7 +4797,6 @@ local void EditorNewMap(void)
 	ProcessMenu("menu-editor-new", 1);
 
 	if (EditorCancelled) {
-		MenusSetBackground();
 		return;
 	}
 
@@ -4860,7 +4820,6 @@ local void EditorNewMap(void)
 */
 local void EditorNewDrawFunc(Menuitem *mi __attribute__((unused)))
 {
-	MenusSetBackground();
 }
 
 /**
@@ -4954,7 +4913,6 @@ local void EditorMainLoadMap(void)
 	GetInfoFromSelectPath();
 
 	if (EditorCancelled) {
-		MenusSetBackground();
 		return;
 	}
 
@@ -5557,7 +5515,6 @@ local void EditorMapPropertiesOk(void)
 */
 local void EditorPlayerPropertiesDrawFunc(Menuitem *mi __attribute__((unused)))
 {
-	MenusSetBackground();
 }
 
 /**
@@ -6279,10 +6236,6 @@ local void ReplayGameMenu(void)
 #endif
 	*ScenSelectDisplayPath = '\0';
 
-	VideoClearScreen();
-	MenusSetBackground();
-	Invalidate();
-
 	GuiGameStarted = 0;
 	ProcessMenu("menu-replay-game", 1);
 	if (GuiGameStarted) {
@@ -6792,8 +6745,6 @@ global void InitMenuData(void)
 local void MultiGameMasterReport(void)
 {
 //	EndMenu();
-	MenusSetBackground();
-	Invalidate();
 
 	ProcessMenu("metaserver-list", 1);
 	if (GuiGameStarted) {
@@ -6808,8 +6759,6 @@ local void MultiGameMasterReport(void)
 local void ShowMetaServerList(void)
 {
 	EndMenu();
-	Invalidate();
-	MenusSetBackground();
 
 	GuiGameStarted = 0;
 	ProcessMenu("metaserver-list", 1);
@@ -6922,8 +6871,6 @@ local void MultiMetaServerGameSetupExit(Menuitem *mi)
 {
 	// TODO: how to free stuff?
 //	EndMenu();
-	MenusSetBackground();
-	Invalidate();
 //	EndMenu();
 }
 
@@ -6938,8 +6885,6 @@ local void SelectGameServer(Menuitem *mi)
 
 	j = mi - mi->menu->Items;
 	mi->menu->Items[j].d.gem.state = MI_GSTATE_UNCHECKED;
-	MenusSetBackground();
-	Invalidate();
 	EndMenu();
 
 	strcpy(server_host_buffer, mi->menu->Items[j - 4].d.text.text);
@@ -6954,7 +6899,6 @@ local void SelectGameServer(Menuitem *mi)
 //	server_host_buffer[menu->Items[1].d.input.nch] = 0;
 	if (NetworkSetupServerAddress(server_host_buffer)) {
 		NetErrorMenu("Unable to lookup host.");
-		MenusSetBackground();
 		ProcessMenu("metaserver-list", 1);
 		return;
 	}
@@ -6973,8 +6917,6 @@ local void SelectGameServer(Menuitem *mi)
 	ProcessMenu("menu-net-connecting", 1);
 
 	if (GuiGameStarted) {
-		MenusSetBackground();
-		Invalidate();
 		EndMenu();
 	}
 }
@@ -7028,7 +6970,6 @@ local int MetaServerConnectError(void)
 {
 	Invalidate();
 	NetErrorMenu("Cannot Connect to Meta-Server");
-	MenusSetBackground();
 	return 0;
 }
 
diff --git a/src/ui/script_ui.cpp b/src/ui/script_ui.cpp
index 17d91a572..8d20cb629 100644
--- a/src/ui/script_ui.cpp
+++ b/src/ui/script_ui.cpp
@@ -2385,6 +2385,8 @@ local int CclDefineMenu(lua_State* l)
 			if (strcmp(LuaToString(l, j + 1), "none")) {
 				item.Panel = strdup(LuaToString(l, j + 1));
 			}
+		} else if (!strcmp(value, "background")) {
+			item.Background = strdup(LuaToString(l, j + 1));
 		} else if (!strcmp(value, "default")) {
 			item.DefSel = LuaToNumber(l, j + 1);
 /*
@@ -2414,6 +2416,8 @@ local int CclDefineMenu(lua_State* l)
 			int mitype;
 
 			free(menu->Panel);
+			free(menu->Background);
+			VideoSafeFree(menu->BackgroundG);
 			for (i = 0; i < menu->NumItems; ++i) {
 				mitype = menu->Items[i].mitype;
 				if (mitype == MI_TYPE_TEXT) {