diff --git a/doc/ChangeLog.html b/doc/ChangeLog.html
index d86660e63..b87866170 100644
--- a/doc/ChangeLog.html
+++ b/doc/ChangeLog.html
@@ -31,6 +31,7 @@
 <li>Future 1.19 Release<p>
     <ul>
     <li>+++
+    <li>Undo the UI rewrite because of CPU usage increase.
     <li>Made computer reciprocate Shared Vision and Ally Commands (from Russell Smith)
     <li>Made the 'make it so' cheat reversable and changes build speed for buildings already under construction (Nehal Mistry).
     <li>Fixed bug #427560: Diplomacy menu button (from Jimmy Salmon).
diff --git a/src/action/command.cpp b/src/action/command.cpp
index b1b858cde..639382b01 100644
--- a/src/action/command.cpp
+++ b/src/action/command.cpp
@@ -1373,13 +1373,6 @@ global void CommandAutoSpellCast(Unit* unit,SpellType* spell)
 */
 global void CommandDiplomacy(int player,int state,int opponent)
 {
-    // If we work changing states with a computer, it should
-    // automatically reciprocate the changes :)
-    if( Players[opponent].Type == PlayerComputer && 
-	Players[player].Type == PlayerPerson ) {
-	CommandDiplomacy(opponent,state,player);
-    }
-
     switch( state ) {
 	case DiplomacyNeutral:
 	    Players[player].Enemy&=~(1<<opponent);
@@ -1412,13 +1405,6 @@ global void CommandSharedVision(int player,int state,int opponent)
 {
     int i;
     Unit* unit;
-
-    // If we work changing states with a computer, it should
-    // automatically reciprocate the changes :)
-    if( Players[opponent].Type == PlayerComputer && 
-	Players[player].Type == PlayerPerson ) {
-	CommandSharedVision(opponent,state,player);
-    }
     
     if( state==0 ) {
 	// Check all tiles and mark unseen ones as explored.
diff --git a/src/editor/editloop.cpp b/src/editor/editloop.cpp
index d9069c5a4..8a2cb1449 100644
--- a/src/editor/editloop.cpp
+++ b/src/editor/editloop.cpp
@@ -339,12 +339,13 @@ local int CalculateUnitIcons(void)
     i = 0;
     count = 0;
     x = TheUI.ButtonPanelY + 24;
-    while (x < TheUI.ButtonPanelEndY - IconHeight) {
+    while (x < TheUI.ButtonPanelY + TheUI.ButtonPanel.Graphic->Height
+	    - IconHeight) {
 	++i;
 	x += IconHeight + 2;
     }
     x = TheUI.ButtonPanelX + 10;
-    while (x < TheUI.ButtonPanelEndX) {
+    while (x < TheUI.ButtonPanelX + 146) {
 	count += i;
 	x += IconWidth + 8;
     }
@@ -618,7 +619,8 @@ local void DrawUnitIcons(void)
     y = TheUI.ButtonPanelY + 24;
 
     i = UnitIndex;
-    while (y < TheUI.ButtonPanelEndY - IconHeight) {
+    while (y < TheUI.ButtonPanelY
+	    + TheUI.ButtonPanel.Graphic->Height - IconHeight) {
 	if (i >= MaxShownUnits) {
 	    break;
 	}
@@ -806,31 +808,6 @@ local void DrawEditorInfo(void)
     int y;
     unsigned flags;
     char buf[256];
-    int resx;
-    int resy;
-
-    resx = resy = 9999;
-    for (i = 1; i < MaxCosts; ++i) {
-	x = TheUI.Resources[i].IconX;
-	if (TheUI.Resources[i].Icon.Graphic && x < resx) {
-	    resx = x;
-	}
-	x = TheUI.Resources[i].TextX;
-	if (x != -1 && x < resx) {
-	    resx = TheUI.Resources[i].IconX;
-	}
-	y = TheUI.Resources[i].IconY;
-	if (TheUI.Resources[i].Icon.Graphic && y < resy) {
-	    resy = y;
-	}
-	y = TheUI.Resources[i].TextY;
-	if (y != -1 && y < resx) {
-	    resy = TheUI.Resources[i].IconY;
-	}
-    }
-    if (resx == 9999 || resy == 9999) {
-	return;
-    }
 
     x = y = 0;
     if (TheUI.MouseViewport) {
@@ -839,7 +816,7 @@ local void DrawEditorInfo(void)
     }
 
     sprintf(buf, "Editor (%d %d)", x, y);
-    VideoDrawText(resx + 2, resy + 2, GameFont, buf);
+    VideoDrawText(TheUI.ResourceX + 2, TheUI.ResourceY + 2, GameFont, buf);
 
     //
     //	Flags info
@@ -860,7 +837,7 @@ local void DrawEditorInfo(void)
 	flags & MapFieldAirUnit		? 'a' : '-',
 	flags & MapFieldSeaUnit		? 's' : '-',
 	flags & MapFieldBuilding	? 'b' : '-');
-    VideoDrawText(resx + 118, resy + 2, GameFont, buf);
+    VideoDrawText(TheUI.ResourceX + 118, TheUI.ResourceY + 2, GameFont, buf);
 
     //
     //	Tile info
@@ -881,7 +858,7 @@ local void DrawEditorInfo(void)
 	    ? TheMap.Tileset->TileNames[TheMap.Tileset->MixedNameTable[i]]
 	    : "");
 
-    VideoDrawText(resx + 252, resy + 2, GameFont, buf);
+    VideoDrawText(TheUI.ResourceX + 252, TheUI.ResourceY + 2, GameFont, buf);
 }
 
 /**
@@ -917,16 +894,6 @@ global void EditorUpdateDisplay(void)
 
     DrawMapArea();			// draw the map area
 
-    //
-    //  Panels
-    //
-    for (i = 0; i < TheUI.NumPanels; ++i) {
-	if (TheUI.Panel[i].Graphic) {
-	    VideoDraw(TheUI.Panel[i].Graphic, 0,
-		    TheUI.PanelX[i], TheUI.PanelY[i]);
-	}
-    }
-
     if (CursorOn == CursorOnMap) {
 	DrawMapCursor();			// cursor on map
     }
@@ -934,14 +901,25 @@ global void EditorUpdateDisplay(void)
     //
     //  Menu button
     //
-    DrawMenuButton(TheUI.MenuButton.Button,
-	    (ButtonAreaUnderCursor == ButtonAreaMenu
-		&& ButtonUnderCursor == 0 ? MenuButtonActive : 0)|
+    if (TheUI.MenuButton.Graphic) {
+	VideoDrawSub(TheUI.MenuButton.Graphic, 0, 0,
+	    TheUI.MenuButton.Graphic->Width, TheUI.MenuButton.Graphic->Height,
+	    TheUI.MenuButtonX, TheUI.MenuButtonY);
+    }
+    DrawMenuButton(MBUTTON_MAIN,
+	    (ButtonUnderCursor == 0 ? MenuButtonActive : 0)|
 	    (GameMenuButtonClicked ? MenuButtonClicked : 0),
-	    TheUI.MenuButton.Width, TheUI.MenuButton.Height,
-	    TheUI.MenuButton.X,TheUI.MenuButton.Y,
-	    GameFont,TheUI.MenuButton.Text,NULL,NULL);
+	    128, 19,
+	    TheUI.MenuButtonX+24,TheUI.MenuButtonY+2,
+	    GameFont,"Menu (~<F10~>)",NULL,NULL);
 
+    //
+    //  Minimap border
+    //
+    if (TheUI.Minimap.Graphic) {
+	VideoDrawSub(TheUI.Minimap.Graphic, 0, 0, TheUI.Minimap.Graphic->Width,
+	    TheUI.Minimap.Graphic->Height, TheUI.MinimapX, TheUI.MinimapY);
+    }
     //
     //  Minimap
     //
@@ -958,12 +936,40 @@ global void EditorUpdateDisplay(void)
 	    TheUI.InfoPanel.Graphic->Width, TheUI.InfoPanel.Graphic->Height/4,
 	    TheUI.InfoPanelX, TheUI.InfoPanelY);
     }
+    //
+    //  Button panel
+    //
+    if (TheUI.ButtonPanel.Graphic) {
+	VideoDrawSub(TheUI.ButtonPanel.Graphic, 0, 0,
+	    TheUI.ButtonPanel.Graphic->Width,
+	    TheUI.ButtonPanel.Graphic->Height, TheUI.ButtonPanelX,
+	    TheUI.ButtonPanelY);
+    }
     DrawEditorPanel();
 
+    //
+    //  Resource
+    //
+    if (TheUI.Resource.Graphic) {
+	VideoDrawSub(TheUI.Resource.Graphic, 0, 0,
+	    TheUI.Resource.Graphic->Width, TheUI.Resource.Graphic->Height,
+	    TheUI.ResourceX, TheUI.ResourceY);
+    }
     if (CursorOn==CursorOnMap) {
 	DrawEditorInfo();
     }
 
+    //
+    //  Fillers
+    //
+    for (i = 0; i < TheUI.NumFillers; ++i) {
+	if (TheUI.Filler[i].Graphic) {
+	    VideoDrawSub(TheUI.Filler[i].Graphic, 0, 0,
+		    TheUI.Filler[i].Graphic->Width,
+		    TheUI.Filler[i].Graphic->Height,
+		    TheUI.FillerX[i], TheUI.FillerY[i]);
+	}
+    }
     //
     //  Status line
     //
@@ -999,8 +1005,7 @@ local void EditorCallbackButtonUp(unsigned button)
 
     if ((1<<button) == LeftButton && GameMenuButtonClicked == 1) {
 	GameMenuButtonClicked = 0;
-	if (ButtonAreaUnderCursor == ButtonAreaMenu
-		&& ButtonUnderCursor == ButtonUnderMenu) {
+	if (ButtonUnderCursor == 0) {
 	    ProcessMenu("menu-editor", 1);
 	}
     }
@@ -1021,8 +1026,7 @@ local void EditorCallbackButtonDown(unsigned button __attribute__ ((unused)))
     //
     //  Click on menu button
     //
-    if (CursorOn == CursorOnButton && ButtonAreaUnderCursor == ButtonAreaMenu
-	    && ButtonUnderCursor == ButtonUnderMenu
+    if (CursorOn == CursorOnButton && ButtonUnderCursor == 0
 	    && (MouseButtons & LeftButton) && !GameMenuButtonClicked) {
 	PlayGameSound(GameSounds.Click.Sound, MaxSampleVolume);
 	GameMenuButtonClicked = 1;
@@ -1567,14 +1571,13 @@ local void EditorCallbackMouse(int x, int y)
     CursorOn = -1;
     CursorPlayer = -1;
     CursorUnitIndex = -1;
-    ButtonAreaUnderCursor = -1;
     ButtonUnderCursor = -1;
 
     //
     //	Minimap
     //
-    if (x >= TheUI.MinimapX && x < TheUI.MinimapX+TheUI.MinimapW
-	    && y >= TheUI.MinimapY && y < TheUI.MinimapY+TheUI.MinimapH) {
+    if (x >= TheUI.MinimapX+24 && x < TheUI.MinimapX+24+MINIMAP_W
+	    && y >= TheUI.MinimapY+2 && y < TheUI.MinimapY+2+MINIMAP_H) {
 	CursorOn = CursorOnMinimap;
     }
 
@@ -1606,7 +1609,8 @@ local void EditorCallbackMouse(int x, int y)
 
 	i = UnitIndex;
 	by = TheUI.ButtonPanelY + 24;
-	while (by < TheUI.ButtonPanelEndY - IconHeight) {
+	while (by < TheUI.ButtonPanelY
+		+ TheUI.ButtonPanel.Graphic->Height - IconHeight) {
 	    if (i >= MaxShownUnits || !ShownUnitTypes[i]) {
 		break;
 	    }
@@ -1709,24 +1713,25 @@ local void EditorCallbackMouse(int x, int y)
 	SetStatusLine("Tile mode");
 	return;
     }
-    if( TheUI.MenuButton.X!=-1 ) {
-	if( x>=TheUI.MenuButton.X
-		&& x<=TheUI.MenuButton.X+TheUI.MenuButton.Width
-		&& y>TheUI.MenuButton.Y
-		&& y<=TheUI.MenuButton.Y+TheUI.MenuButton.Height ) {
-	    ButtonAreaUnderCursor=ButtonAreaMenu;
-	    ButtonUnderCursor=ButtonUnderMenu;
-	    CursorOn=CursorOnButton;
-	    MustRedraw|=RedrawMenuButton;
-	    return;
+    for (i = 0; i < (int)(sizeof(TheUI.Buttons)/sizeof(*TheUI.Buttons)); ++i) {
+	if (x < TheUI.Buttons[i].X
+		|| x > TheUI.Buttons[i].X + TheUI.Buttons[i].Width
+		|| y < TheUI.Buttons[i].Y
+		|| y > TheUI.Buttons[i].Y + TheUI.Buttons[i].Height) {
+	    continue;
 	}
+	DebugLevel3("On button %d\n" _C_ i);
+	ButtonUnderCursor = i;
+	CursorOn = CursorOnButton;
+	ClearStatusLine();
+	return;
     }
 
     //
     //  Minimap
     //
-    if (x >= TheUI.MinimapX && x < TheUI.MinimapX + TheUI.MinimapW
-	    && y >= TheUI.MinimapY && y < TheUI.MinimapY + TheUI.MinimapH) {
+    if (x >= TheUI.MinimapX + 24 && x < TheUI.MinimapX + 24 + MINIMAP_W
+	    && y >= TheUI.MinimapY + 2 && y < TheUI.MinimapY + 2 + MINIMAP_H) {
 	CursorOn = CursorOnMinimap;
 	return;
     }
diff --git a/src/game/campaign.cpp b/src/game/campaign.cpp
index b240b3560..a4550c415 100644
--- a/src/game/campaign.cpp
+++ b/src/game/campaign.cpp
@@ -514,6 +514,22 @@ global void CampaignCclRegister(void)
     gh_new_procedureN("briefing",CclBriefing);
 }
 
+/**
+**	FIXME: should use the names of the real fonts.
+*/
+local char *FontNames[] = {
+    "small",
+    "game",
+    "large",
+    "small-title",
+    "large-title",
+    "user1",
+    "user2",
+    "user3",
+    "user4",
+    "user5",
+};
+
 /**
 **	Save the campaign module.
 */
diff --git a/src/include/font.h b/src/include/font.h
index 206700f7e..8c6253651 100644
--- a/src/include/font.h
+++ b/src/include/font.h
@@ -129,12 +129,6 @@ enum _game_font_ {
 --	Variables
 ----------------------------------------------------------------------------*/
 
-/**
-**	Font names
-**	FIXME: should use the names of the real fonts.
-*/
-extern char *FontNames[];
-
 /*----------------------------------------------------------------------------
 --	Functions
 ----------------------------------------------------------------------------*/
diff --git a/src/include/freecraft.h b/src/include/freecraft.h
index c06883280..486ef78ca 100644
--- a/src/include/freecraft.h
+++ b/src/include/freecraft.h
@@ -352,6 +352,9 @@ extern char NameLine[];
 #define MAXMAP_W	50		/// Maximum map width in tiles on screen
 #define MAXMAP_H	40		/// Maximum map height in tiles
 
+#define MINIMAP_W	128		/// Minimap width in pixels
+#define MINIMAP_H	128		/// Minimap height in pixels
+
     /// Scrolling area (<= 15 y)
 #define SCROLL_UP	15
     /// Scrolling area (>= VideoHeight-16 y)
diff --git a/src/include/interface.h b/src/include/interface.h
index a85f39600..2e19f0246 100644
--- a/src/include/interface.h
+++ b/src/include/interface.h
@@ -85,19 +85,6 @@ struct _button_action_ {
     char*	UnitMask;		/// for which units is it available
 };
 
-enum _button_area_ {
-    ButtonAreaInfo,
-    ButtonAreaTraining,
-    ButtonAreaButton,
-    ButtonAreaMenu,
-};
-
-enum _button_under_ {
-    ButtonUnderMenu,
-    ButtonUnderNetworkMenu,
-    ButtonUnderNetworkDiplomacy,
-};
-
     /// current interface state
 enum _iface_state_ {
     IfaceStateNormal,			/// Normal Game state
@@ -245,14 +232,10 @@ extern enum _scroll_state_ MouseScrollState;
 extern enum _key_state_ KeyState;
     /// pointer to unit under the cursor
 extern Unit* UnitUnderCursor;
-    /// button area under the cursor
-extern int ButtonAreaUnderCursor;
     /// button number under the cursor
 extern int ButtonUnderCursor;
-    /// menu button was clicked down
+    /// button 0 (Game Menu) was clicked down
 extern char GameMenuButtonClicked;
-    /// diplomacy button was clicked down
-extern char GameDiplomacyButtonClicked;
     /// Mouse leaves windows stops scroll
 extern char LeaveStops;
     /// current CursorOn field
diff --git a/src/include/menus.h b/src/include/menus.h
index 115e08e47..f5296bfd8 100644
--- a/src/include/menus.h
+++ b/src/include/menus.h
@@ -60,7 +60,6 @@ typedef int MenuButtonId;
 /// FIXME: FILL IN THIS TABLE!!!!
 
 #define MBUTTON_MAIN		 4	/// FIXME: write docu
-#define MBUTTON_NETWORK		 7
 #define MBUTTON_GM_HALF		10
 #define MBUTTON_132		13
 #define MBUTTON_GM_FULL		16
@@ -330,9 +329,6 @@ extern _MenuFuncHash MenuFuncHash;
 --	Functions
 ----------------------------------------------------------------------------*/
 
-    /// Menu button style to char*
-extern char *MenuButtonStyle(int style);
-
     /// Initialize the hash tables for the menus
 extern void InitMenuFuncHash(void);
 
diff --git a/src/include/ui.h b/src/include/ui.h
index f74734318..7e3aa1ee1 100644
--- a/src/include/ui.h
+++ b/src/include/ui.h
@@ -53,6 +53,9 @@
 */
 #define MOUSESCALE	1
 
+    /// MACRO - HARDCODED NUMBER OF BUTTONS on screen
+#define MaxButtons	19
+
     /// typedef for buttons on screen themselves
 typedef struct _button_ Button;
 
@@ -163,13 +166,14 @@ typedef struct _ui_ {
     char*	NormalFontColor;	/// Color for normal text displayed
     char*	ReverseFontColor;	/// Color for reverse text displayed
 
-    //	Panels
-    GraphicConfig* Panel;		/// Panel graphics
-    int*	PanelX;			/// Panel X positions
-    int*	PanelY;			/// Panel Y positions
-    int		NumPanels;		/// Number of panels
+    //	Fillers
+    GraphicConfig* Filler;		/// Filler graphics
+    int*	FillerX;		/// Filler X positions
+    int*	FillerY;		/// Filler Y positions
+    int		NumFillers;		/// Number of fillers
 
     //	Resource line
+    GraphicConfig Resource;		/// Resource background
     int		ResourceX;		/// Resource X position
     int		ResourceY;		/// Resource Y position
 
@@ -194,36 +198,44 @@ typedef struct _ui_ {
 	int	IconH;			/// icon H position
 	int	TextX;			/// text X position
 	int	TextY;			/// text Y position
-    }		Resources[MaxCosts+2];	/// Icon+Text of all resources
-					/// +2 for food and score
+    }		Resources[MaxCosts];	/// Icon+Text of all resources
+
+    GraphicConfig FoodIcon;		/// units icon image
+    int		FoodIconRow;		/// units icon image row (frame)
+    int		FoodIconX;		/// units icon X position
+    int		FoodIconY;		/// units icon Y position
+    int		FoodIconW;		/// units icon W position
+    int		FoodIconH;		/// units icon H position
+    int		FoodTextX;		/// units text X position
+    int		FoodTextY;		/// units text Y position
+
+    GraphicConfig ScoreIcon;		/// score icon image
+    int		ScoreIconRow;		/// score icon image row (frame)
+    int		ScoreIconX;		/// score icon X position
+    int		ScoreIconY;		/// score icon Y position
+    int		ScoreIconW;		/// score icon W position
+    int		ScoreIconH;		/// score icon H position
+    int		ScoreTextX;		/// score text X position
+    int		ScoreTextY;		/// score text Y position
 
     // Info panel
     GraphicConfig InfoPanel;		/// Info panel background
     int		InfoPanelX;		/// Info panel screen X position
     int		InfoPanelY;		/// Info panel screen Y position
-    int		InfoPanelW;		/// Info panel screen width
-    int		InfoPanelH;		/// Info panel screen height
-    int		InfoPanelNeutralFrame;
-    int		InfoPanelSelectedFrame;
-    int		InfoPanelMagicFrame;
-    int		InfoPanelConstructionFrame;
+    int		InfoPanelW;		/// Info panel width
+    int		InfoPanelH;		/// Info panel height
 
     // Complete bar
     int		CompleteBarColor;	/// color for complete bar
     int		CompleteBarX;		/// complete bar X position
     int		CompleteBarY;		/// complete bar Y position
-    int		CompleteBarW;		/// complete bar width
-    int		CompleteBarH;		/// complete bar height
-    char*	CompleteBarText;	/// complete bar text
-    unsigned	CompleteBarFont;	/// complete bar font
     int		CompleteTextX;		/// complete text X position
     int		CompleteTextY;		/// complete text Y position
 
     // Button panel
+    GraphicConfig ButtonPanel;		/// Button panel background
     int		ButtonPanelX;		/// Button panel screen X position
     int		ButtonPanelY;		/// Button panel screen Y position
-    int		ButtonPanelEndX;	/// Button panel screen end X position
-    int		ButtonPanelEndY;	/// Button panel screen end Y position
 
     // Map area
     ViewportMode ViewportMode;		/// Current viewport mode
@@ -235,42 +247,25 @@ typedef struct _ui_ {
     Viewport	MapArea;		/// geometry of the whole map area
 
     // The menu button
-    struct {
-	int	X;			/// button screen X position
-	int	Y;			/// button screen Y position
-	char*	Text;			/// button caption
-	int	Width;			/// button width
-	int	Height;			/// button height
-	int	Button;			/// button style
-    }		MenuButton,
-		NetworkMenuButton,
-		NetworkDiplomacyButton;
+    GraphicConfig MenuButton;		/// menu button background
+    int		MenuButtonX;		/// menu button screen X position
+    int		MenuButtonY;		/// menu button screen Y position
 
     // The minimap
+    GraphicConfig Minimap;		/// minimap panel background
     int		MinimapX;		/// minimap screen X position
     int		MinimapY;		/// minimap screen Y position
-    int		MinimapW;		/// minimap screen width
-    int		MinimapH;		/// minimap screen height
-    int		MinimapCursorColor;	/// minimap cursor color
+    int		ViewportCursorColor;	/// minimap cursor color
 
     // The status line
-    int		StatusLineX;		/// Status line screen X position
-    int		StatusLineY;		/// Status line screen Y position
-    int		StatusLineW;		/// Status line screen width
-    unsigned	StatusLineFont;		/// Status line font
+    GraphicConfig StatusLine;		/// Status line background
+    int		StatusLineX;		/// status line screeen X position
+    int		StatusLineY;		/// status line screeen Y position
 
-    // Message area
-    int		MessageAreaX;		/// Message screen X position
-    int		MessageAreaY;		/// Message screen Y position
-    int		MessageAreaW;		/// Message screen width
-    unsigned	MessageAreaFont;	/// Message font
-
-    Button*	InfoButtons;		/// Info buttons
-    int		NumInfoButtons;		/// Number of info buttons
-    Button*	TrainingButtons;	/// Training buttons
-    int		NumTrainingButtons;	/// Number of training buttons
-    Button*	ButtonButtons;		/// Button panel buttons
-    int		NumButtonButtons;	/// Number of button panel buttons
+	/// all buttons (1 Menu, 9 Group, 9 Command)
+    Button	Buttons[MaxButtons];
+	/// used for displaying unit training queues
+    Button	Buttons2[6];
 
     // Offsets for 640x480 center used by menus
     int		Offset640X;		/// Offset for 640x480 X position
diff --git a/src/include/upgrade_structs.h b/src/include/upgrade_structs.h
index 3cc5ea720..3428a0f12 100644
--- a/src/include/upgrade_structs.h
+++ b/src/include/upgrade_structs.h
@@ -62,9 +62,6 @@ enum _costs_ {
     MaxCosts				/// how many different costs
 };
 
-#define FoodCost MaxCosts
-#define ScoreCost MaxCosts+1
-
 /**
 **	Speed factor for harvesting resources
 */
diff --git a/src/map/minimap.cpp b/src/map/minimap.cpp
index c371ac749..fec08a501 100644
--- a/src/map/minimap.cpp
+++ b/src/map/minimap.cpp
@@ -49,8 +49,8 @@
 
 local Graphic* MinimapTerrainGraphic;	/// generated minimap terrain
 local Graphic* MinimapGraphic;		/// generated minimap
-local int* Minimap2MapX;		/// fast conversion table
-local int* Minimap2MapY;		/// fast conversion table
+local int Minimap2MapX[MINIMAP_W];	/// fast conversion table
+local int Minimap2MapY[MINIMAP_H];	/// fast conversion table
 local int Map2MinimapX[MaxMapWidth];	/// fast conversion table
 local int Map2MinimapY[MaxMapHeight];	/// fast conversion table
 
@@ -96,10 +96,6 @@ global void UpdateMinimapXY(int tx,int ty)
     int y;
     int scale;
 
-    if( TheUI.MinimapX==-1 ) {
-	return;
-    }
-
     if( !(scale=(MinimapScale/MINIMAP_FAC)) ) {
 	scale=1;
     }
@@ -107,7 +103,7 @@ global void UpdateMinimapXY(int tx,int ty)
     //	Pixel 7,6 7,14, 15,6 15,14 are taken for the minimap picture.
     //
     ty*=TheMap.Width;
-    for( my=MinimapY; my<TheUI.MinimapH-MinimapY; ++my ) {
+    for( my=MinimapY; my<MINIMAP_H-MinimapY; ++my ) {
 	y=Minimap2MapY[my];
 	if( y<ty ) {
 	    continue;
@@ -116,7 +112,7 @@ global void UpdateMinimapXY(int tx,int ty)
 	    break;
 	}
 
-	for( mx=MinimapX; mx<TheUI.MinimapW-MinimapX; ++mx ) {
+	for( mx=MinimapX; mx<MINIMAP_W-MinimapX; ++mx ) {
 	    int tile;
 
 	    x=Minimap2MapX[mx];
@@ -128,7 +124,7 @@ global void UpdateMinimapXY(int tx,int ty)
 	    }
 
 	    tile=TheMap.Fields[x+y].Tile;
-	    ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*TheUI.MinimapW]=
+	    ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*MINIMAP_W]=
 		TheMap.Tiles[tile][7+(mx%scale)*8+(6+(my%scale)*8)*TileSizeX];
 	}
     }
@@ -147,10 +143,6 @@ global void UpdateMinimapTerrain(void)
     int my;
     int scale;
 
-    if( TheUI.MinimapX==-1 ) {
-	return;
-    }
-
     if( !(scale=(MinimapScale/MINIMAP_FAC)) ) {
 	scale=1;
     }
@@ -158,12 +150,12 @@ global void UpdateMinimapTerrain(void)
     //
     //	Pixel 7,6 7,14, 15,6 15,14 are taken for the minimap picture.
     //
-    for( my=MinimapY; my<TheUI.MinimapH-MinimapY; ++my ) {
-	for( mx=MinimapX; mx<TheUI.MinimapW-MinimapX; ++mx ) {
+    for( my=MinimapY; my<MINIMAP_H-MinimapY; ++my ) {
+	for( mx=MinimapX; mx<MINIMAP_W-MinimapX; ++mx ) {
 	    int tile;
 
 	    tile=TheMap.Fields[Minimap2MapX[mx]+Minimap2MapY[my]].Tile;
-	    ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*TheUI.MinimapW]=
+	    ((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*MINIMAP_W]=
 		TheMap.Tiles[tile][7+(mx%scale)*8+(6+(my%scale)*8)*TileSizeX];
 	}
     }
@@ -178,21 +170,17 @@ global void CreateMinimap(void)
 {
     int n;
 
-    if( TheUI.MinimapX==-1 ) {
-	return;
-    }
-
     if( TheMap.Width>TheMap.Height ) {	// Scale to biggest value.
 	n=TheMap.Width;
     } else {
 	n=TheMap.Height;
     }
-    MinimapScale=(TheUI.MinimapW*MINIMAP_FAC)/n;
+    MinimapScale=(MINIMAP_W*MINIMAP_FAC)/n;
 
-    MinimapX=((TheUI.MinimapW*MINIMAP_FAC)/MinimapScale-TheMap.Width)/2;
-    MinimapY=((TheUI.MinimapH*MINIMAP_FAC)/MinimapScale-TheMap.Height)/2;
-    MinimapX=(TheUI.MinimapW-(TheMap.Width*MinimapScale)/MINIMAP_FAC)/2;
-    MinimapY=(TheUI.MinimapH-(TheMap.Height*MinimapScale)/MINIMAP_FAC)/2;
+    MinimapX=((MINIMAP_W*MINIMAP_FAC)/MinimapScale-TheMap.Width)/2;
+    MinimapY=((MINIMAP_H*MINIMAP_FAC)/MinimapScale-TheMap.Height)/2;
+    MinimapX=(MINIMAP_W-(TheMap.Width*MinimapScale)/MINIMAP_FAC)/2;
+    MinimapY=(MINIMAP_H-(TheMap.Height*MinimapScale)/MINIMAP_FAC)/2;
 
     DebugLevel0Fn("MinimapScale %d(%d), X off %d, Y off %d\n" _C_
 	    MinimapScale/MINIMAP_FAC _C_ MinimapScale _C_ MinimapX _C_ MinimapY);
@@ -202,12 +190,10 @@ global void CreateMinimap(void)
     //
     // FIXME: this needs to be recalculated during map load - the map size
     // might have changed!
-    Minimap2MapX=calloc(sizeof(int),TheUI.MinimapW*TheUI.MinimapH);
-    Minimap2MapY=calloc(sizeof(int),TheUI.MinimapW*TheUI.MinimapH);
-    for( n=MinimapX; n<TheUI.MinimapW-MinimapX; ++n ) {
+    for( n=MinimapX; n<MINIMAP_W-MinimapX; ++n ) {
 	Minimap2MapX[n]=((n-MinimapX)*MINIMAP_FAC)/MinimapScale;
     }
-    for( n=MinimapY; n<TheUI.MinimapH-MinimapY; ++n ) {
+    for( n=MinimapY; n<MINIMAP_H-MinimapY; ++n ) {
 	Minimap2MapY[n]=(((n-MinimapY)*MINIMAP_FAC)/MinimapScale)*TheMap.Width;
     }
     for( n=0; n<TheMap.Width; ++n ) {
@@ -217,11 +203,11 @@ global void CreateMinimap(void)
 	Map2MinimapY[n]=(n*MinimapScale)/MINIMAP_FAC;
     }
 
-    MinimapTerrainGraphic=NewGraphic(8,TheUI.MinimapW,TheUI.MinimapH);
-    memset(MinimapTerrainGraphic->Frames,0,TheUI.MinimapW*TheUI.MinimapH);
-    MinimapGraphic=NewGraphic(8,TheUI.MinimapW,TheUI.MinimapH);
+    MinimapTerrainGraphic=NewGraphic(8,MINIMAP_W,MINIMAP_H);
+    memset(MinimapTerrainGraphic->Frames,0,MINIMAP_W*MINIMAP_H);
+    MinimapGraphic=NewGraphic(8,MINIMAP_W,MINIMAP_H);
     MinimapGraphic->Pixels=VideoCreateNewPalette(GlobalPalette);
-    memset(MinimapGraphic->Frames,0,TheUI.MinimapW*TheUI.MinimapH);
+    memset(MinimapGraphic->Frames,0,MINIMAP_W*MINIMAP_H);
 
     UpdateMinimapTerrain();
 }
@@ -239,10 +225,8 @@ global void DestroyMinimap(void)
     }
     VideoSaveFree(MinimapGraphic);
     MinimapGraphic=NULL;
-    free(Minimap2MapX);
-    Minimap2MapX=NULL;
-    free(Minimap2MapY);
-    Minimap2MapY=NULL;
+    memset(Minimap2MapX,0,MINIMAP_W*sizeof(int));
+    memset(Minimap2MapY,0,MINIMAP_H*sizeof(int));
 }
 
 /**
@@ -262,10 +246,6 @@ global void UpdateMinimap(void)
     int h;
     int h0;
 
-    if( TheUI.MinimapX==-1 ) {
-	return;
-    }
-
     w=(FrameCounter/FRAMES_PER_SECOND)&1;
     if( (new_phase=red_phase-w) ) {
 	red_phase=w;
@@ -274,27 +254,26 @@ global void UpdateMinimap(void)
     //
     //	Draw the mini-map background.	Note draws a little too much.
     //
-#if 0
-    for( h=0; h<TheUI.MinimapH; ++h ) {
-	memcpy(&((unsigned char*)MinimapGraphic->Frames)[h*TheUI.MinimapW],
-	    &((unsigned char*)TheUI.Minimap.Graphic->Frames)[h*TheUI.Minimap.Graphic->Width],
+    // FIXME: position of the minimap in the graphic is hardcoded (24x2)
+    for( h=0; h<MINIMAP_H; ++h ) {
+	memcpy(&((unsigned char*)MinimapGraphic->Frames)[h*MINIMAP_W],
+	    &((unsigned char*)TheUI.Minimap.Graphic->Frames)[24+(h+2)*TheUI.Minimap.Graphic->Width],
 	    TheUI.Minimap.Graphic->Width);
     }
-#endif
 
     //
     //	Draw the terrain
     //
     if( MinimapWithTerrain ) {
-	for( my=0; my<TheUI.MinimapH; ++my ) {
-	    for( mx=0; mx<TheUI.MinimapW; ++mx ) {
+	for( my=0; my<MINIMAP_H; ++my ) {
+	    for( mx=0; mx<MINIMAP_W; ++mx ) {
 		if( IsMapFieldVisible(ThisPlayer,Minimap2MapX[mx],(Minimap2MapY[my]/TheMap.Width))
 			|| (IsMapFieldExplored(ThisPlayer,Minimap2MapX[mx],
 				(Minimap2MapY[my]/TheMap.Width)) &&
 				((mx&1)==(my&1)))
 			|| ReplayRevealMap ) {
-		    ((unsigned char*)MinimapGraphic->Frames)[mx+my*TheUI.MinimapW]=
-			((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*TheUI.MinimapW];
+		    ((unsigned char*)MinimapGraphic->Frames)[mx+my*MINIMAP_W]=
+			((unsigned char*)MinimapTerrainGraphic->Frames)[mx+my*MINIMAP_W];
 		}
 	    }
 	}
@@ -330,17 +309,17 @@ global void UpdateMinimap(void)
 	    mx=1+MinimapX+Map2MinimapX[(*table)->X];
 	    my=1+MinimapY+Map2MinimapY[(*table)->Y];
 	    w=Map2MinimapX[type->TileWidth];
-	    if( mx+w>=TheUI.MinimapW ) {	// clip right side
-		w=TheUI.MinimapW-mx;
+	    if( mx+w>=MINIMAP_W ) {	// clip right side
+		w=MINIMAP_W-mx;
 	    }
 	    h0=Map2MinimapY[type->TileHeight];
-	    if( my+h0>=TheUI.MinimapH ) {	// clip bottom side
-		h0=TheUI.MinimapH-my;
+	    if( my+h0>=MINIMAP_H ) {	// clip bottom side
+		h0=MINIMAP_H-my;
 	    }
 	    while( w-->=0 ) {
 		h=h0;
 		while( h-->=0 ) {
-		    ((unsigned char*)MinimapGraphic->Frames)[mx+w+(my+h)*TheUI.MinimapW]=color;
+		    ((unsigned char*)MinimapGraphic->Frames)[mx+w+(my+h)*MINIMAP_W]=color;
 		}
 	    }
 	}
@@ -396,17 +375,17 @@ global void UpdateMinimap(void)
 	mx=1+MinimapX+Map2MinimapX[unit->X];
 	my=1+MinimapY+Map2MinimapY[unit->Y];
 	w=Map2MinimapX[type->TileWidth];
-	if( mx+w>=TheUI.MinimapW ) {		// clip right side
-	    w=TheUI.MinimapW-mx;
+	if( mx+w>=MINIMAP_W ) {		// clip right side
+	    w=MINIMAP_W-mx;
 	}
 	h0=Map2MinimapY[type->TileHeight];
-	if( my+h0>=TheUI.MinimapH ) {	// clip bottom side
-	    h0=TheUI.MinimapH-my;
+	if( my+h0>=MINIMAP_H ) {	// clip bottom side
+	    h0=MINIMAP_H-my;
 	}
 	while( w-->=0 ) {
 	    h=h0;
 	    while( h-->=0 ) {
-		((unsigned char*)MinimapGraphic->Frames)[mx+w+(my+h)*TheUI.MinimapW]=color;
+		((unsigned char*)MinimapGraphic->Frames)[mx+w+(my+h)*MINIMAP_W]=color;
 	    }
 	}
     }
@@ -421,13 +400,9 @@ global void UpdateMinimap(void)
 global void DrawMinimap(int vx __attribute__((unused)),
 	int vy __attribute__((unused)))
 {
-    if( TheUI.MinimapX==-1 ) {
-	return;
-    }
-
     VideoDrawSub(MinimapGraphic,0,0
 	    ,MinimapGraphic->Width,MinimapGraphic->Height
-	    ,TheUI.MinimapX,TheUI.MinimapY);
+	    ,TheUI.MinimapX+24,TheUI.MinimapY+2);
 }
 
 /**
@@ -457,16 +432,12 @@ global void DrawMinimapCursor(int vx, int vy)
     int h;
     int i;
 
-    if( TheUI.MinimapX==-1 ) {
-	return;
-    }
-
     // Determine and save region below minimap cursor
     // FIXME: position of the minimap in the graphic is hardcoded (24x2)
     OldMinimapCursorX=x=
-	TheUI.MinimapX+MinimapX+(vx*MinimapScale)/MINIMAP_FAC;
+	TheUI.MinimapX+24+MinimapX+(vx*MinimapScale)/MINIMAP_FAC;
     OldMinimapCursorY=y=
-	TheUI.MinimapY+MinimapY+(vy*MinimapScale)/MINIMAP_FAC;
+	TheUI.MinimapY+2+MinimapY+(vy*MinimapScale)/MINIMAP_FAC;
     OldMinimapCursorW=w=
 	(TheUI.SelectedViewport->MapWidth*MinimapScale)/MINIMAP_FAC;
     OldMinimapCursorH=h=
@@ -484,7 +455,7 @@ global void DrawMinimapCursor(int vx, int vy)
     SaveCursorRectangle(OldMinimapCursorImage,x,y,w,h);
 
     // Draw cursor as rectangle (Note: unclipped, as it is always visible)
-    VideoDraw50TransRectangle(TheUI.MinimapCursorColor,x,y,w,h);
+    VideoDraw50TransRectangle(TheUI.ViewportCursorColor,x,y,w,h);
 }
 
 /**
@@ -497,7 +468,7 @@ global int ScreenMinimap2MapX(int x)
 {
     int tx;
 
-    tx=((((x)-TheUI.MinimapX-MinimapX)*MINIMAP_FAC)/MinimapScale);
+    tx=((((x)-TheUI.MinimapX-24-MinimapX)*MINIMAP_FAC)/MinimapScale);
     if( tx<0 ) {
 	return 0;
     }
@@ -514,7 +485,7 @@ global int ScreenMinimap2MapY(int y)
 {
     int ty;
 
-    ty=((((y)-TheUI.MinimapY-MinimapY)*MINIMAP_FAC)/MinimapScale);
+    ty=((((y)-TheUI.MinimapY-2-MinimapY)*MINIMAP_FAC)/MinimapScale);
     if( ty<0 ) {
 	return 0;
     }
diff --git a/src/stratagus/mainloop.cpp b/src/stratagus/mainloop.cpp
index 3acff76eb..fb78d076b 100644
--- a/src/stratagus/mainloop.cpp
+++ b/src/stratagus/mainloop.cpp
@@ -254,40 +254,23 @@ global void DebugTestDisplay(void)
 /**
 **	Draw menu button area.
 **
-**	With DRAW_DEBUG it shows the used frame time and arrival of network packets.
+**	With debug it shows the used frame time and arrival of network packets.
+**
+**	@todo	Must be more configurable. Adding diplomacy menu here?
 */
 local void DrawMenuButtonArea(void)
 {
-    if( NetworkFildes==-1 ) {
-	if( TheUI.MenuButton.X!=-1 ) {
-	    DrawMenuButton(TheUI.MenuButton.Button,
-		    (ButtonAreaUnderCursor==ButtonAreaMenu
-			&& ButtonUnderCursor==ButtonUnderMenu ? MenuButtonActive : 0)|
-		    (GameMenuButtonClicked ? MenuButtonClicked : 0),
-		    TheUI.MenuButton.Width, TheUI.MenuButton.Height,
-		    TheUI.MenuButton.X,TheUI.MenuButton.Y,
-		    GameFont,TheUI.MenuButton.Text,NULL,NULL);
-	}
-    } else {
-	if( TheUI.NetworkMenuButton.X!=-1 ) {
-	    DrawMenuButton(TheUI.NetworkMenuButton.Button,
-		    (ButtonAreaUnderCursor==ButtonAreaMenu
-			&& ButtonUnderCursor==ButtonUnderNetworkMenu ? MenuButtonActive : 0)|
-		    (GameMenuButtonClicked ? MenuButtonClicked : 0),
-		    TheUI.NetworkMenuButton.Width, TheUI.NetworkMenuButton.Height,
-		    TheUI.NetworkMenuButton.X,TheUI.NetworkMenuButton.Y,
-		    GameFont,TheUI.NetworkMenuButton.Text,NULL,NULL);
-	}
-	if( TheUI.NetworkDiplomacyButton.X!=-1 ) {
-	    DrawMenuButton(TheUI.NetworkDiplomacyButton.Button,
-		    (ButtonAreaUnderCursor==ButtonAreaMenu
-			&& ButtonUnderCursor==ButtonUnderNetworkDiplomacy ? MenuButtonActive : 0)|
-		    (GameMenuButtonClicked ? MenuButtonClicked : 0),
-		    TheUI.NetworkDiplomacyButton.Width, TheUI.NetworkDiplomacyButton.Height,
-		    TheUI.NetworkDiplomacyButton.X,TheUI.NetworkDiplomacyButton.Y,
-		    GameFont,TheUI.NetworkDiplomacyButton.Text,NULL,NULL);
-	}
-    }
+    VideoDrawSub(TheUI.MenuButton.Graphic,0,0
+	    ,TheUI.MenuButton.Graphic->Width
+	    ,TheUI.MenuButton.Graphic->Height
+	    ,TheUI.MenuButtonX,TheUI.MenuButtonY);
+
+    DrawMenuButton(MBUTTON_MAIN,
+	    (ButtonUnderCursor == 0 ? MenuButtonActive : 0)|
+	    (GameMenuButtonClicked ? MenuButtonClicked : 0),
+	    128, 19,
+	    TheUI.MenuButtonX+24,TheUI.MenuButtonY+2,
+	    GameFont,"Menu (~<F10~>)",NULL,NULL);
 
 #ifdef DRAW_DEBUG
     //
@@ -525,52 +508,77 @@ global void DrawMapArea(void)
 */
 global void UpdateDisplay(void)
 {
-    int i;
-
     MustRedraw&=EnableRedraw;		// Don't redraw disabled parts
 
     VideoLockScreen();			// prepare video write
 
     HideAnyCursor();			// remove cursor (when available)
 
-    if( GuiGameStarted ) {
+    if( MustRedraw&RedrawMap ) {
 	DrawMapArea();
+    }
 
+    if( MustRedraw&(RedrawMessage|RedrawMap) ) {
 	DrawMessages();
+    }
 
+    if( MustRedraw&RedrawFillers ) {
+	int i;
 
-	for( i=0; i<TheUI.NumPanels; ++i ) {
-	    VideoDraw(TheUI.Panel[i].Graphic,0,
-		    TheUI.PanelX[i],TheUI.PanelY[i]);
+	for( i=0; i<TheUI.NumFillers; ++i ) {
+	    VideoDrawSub(TheUI.Filler[i].Graphic,0,0
+		    ,TheUI.Filler[i].Graphic->Width
+		    ,TheUI.Filler[i].Graphic->Height
+		    ,TheUI.FillerX[i],TheUI.FillerY[i]);
 	}
+    }
 
+    if( MustRedraw&RedrawMenuButton ) {
 	DrawMenuButtonArea();
+    }
+    if( MustRedraw&RedrawMinimapBorder ) {
+	VideoDrawSub(TheUI.Minimap.Graphic,0,0
+		,TheUI.Minimap.Graphic->Width,TheUI.Minimap.Graphic->Height
+		,TheUI.MinimapX,TheUI.MinimapY);
+    }
 
-	PlayerPixels(Players);		// Reset to default colors
+    PlayerPixels(Players);		// Reset to default colors
 
+    if( MustRedraw&RedrawMinimap ) {
 	// FIXME: redraw only 1* per second!
 	// HELPME: Viewpoint rectangle must be drawn faster (if implemented) ?
 	DrawMinimap(TheUI.SelectedViewport->MapX, TheUI.SelectedViewport->MapY);
 	DrawMinimapCursor(TheUI.SelectedViewport->MapX,
 		TheUI.SelectedViewport->MapY);
+    } else if (MustRedraw&RedrawMinimapCursor) {
+	HideMinimapCursor();
+	DrawMinimapCursor(TheUI.SelectedViewport->MapX,
+		TheUI.SelectedViewport->MapY);
+    }
 
+    if( MustRedraw&RedrawInfoPanel ) {
 	DrawInfoPanel();
 	PlayerPixels(Players);		// Reset to default colors
-
+    }
+    if( MustRedraw&RedrawButtonPanel ) {
 	DrawButtonPanel();
 	PlayerPixels(Players);		// Reset to default colors
-
+    }
+    if( MustRedraw&RedrawResources ) {
 	DrawResources();
-
+    }
+    if( MustRedraw&RedrawStatusLine ) {
 	DrawStatusLine();
 	MustRedraw|=RedrawCosts;
-
+    }
+    if( MustRedraw&RedrawCosts ) {
 	DrawCosts();
-
+    }
+    if( MustRedraw&RedrawTimer ) {
 	DrawTimer();
     }
 
-    if( CurrentMenu ) {
+    if( MustRedraw&RedrawMenu ) {
 	DrawMenu(CurrentMenu);
     }
 
@@ -588,94 +596,59 @@ global void UpdateDisplay(void)
 	if( MustRedraw&RedrawMap ) {
 	    // FIXME: split into small parts see RedrawTile and RedrawRow
 	    InvalidateAreaAndCheckCursor(
-		    TheUI.MapArea.X,TheUI.MapArea.Y,
-		    TheUI.MapArea.EndX-TheUI.MapArea.X+1,
-		    TheUI.MapArea.EndY-TheUI.MapArea.Y+1);
+		     TheUI.MapArea.X,TheUI.MapArea.Y
+		    ,TheUI.MapArea.EndX-TheUI.MapArea.X+1
+		    ,TheUI.MapArea.EndY-TheUI.MapArea.Y+1);
 	}
 	if( MustRedraw&RedrawFillers ) {
 	    int i;
 
-	    for( i=0; i<TheUI.NumPanels; ++i ) {
+	    for( i=0; i<TheUI.NumFillers; ++i ) {
 		InvalidateAreaAndCheckCursor(
-			TheUI.PanelX[i],TheUI.PanelY[i],
-			TheUI.Panel[i].Graphic->Width,
-			TheUI.Panel[i].Graphic->Height);
+			 TheUI.FillerX[i],TheUI.FillerY[i]
+			,TheUI.Filler[i].Graphic->Width
+			,TheUI.Filler[i].Graphic->Height);
 	    }
 	}
 	if(MustRedraw&RedrawMenuButton ) {
-	    if( NetworkFildes==-1 ) {
-		if( TheUI.MenuButton.X!=-1 ) {
-		    InvalidateAreaAndCheckCursor(
-			    TheUI.MenuButton.X,TheUI.MenuButton.Y,
-			    TheUI.MenuButton.Width,
-			    TheUI.MenuButton.Height);
-		}
-	    } else {
-		if( TheUI.NetworkMenuButton.X!=-1 ) {
-		    InvalidateAreaAndCheckCursor(
-			    TheUI.NetworkMenuButton.X,
-			    TheUI.NetworkMenuButton.Y,
-			    TheUI.NetworkMenuButton.Width,
-			    TheUI.NetworkMenuButton.Height);
-		}
-		if( TheUI.NetworkDiplomacyButton.X!=-1 ) {
-		    InvalidateAreaAndCheckCursor(
-			    TheUI.NetworkDiplomacyButton.X,
-			    TheUI.NetworkDiplomacyButton.Y,
-			    TheUI.NetworkDiplomacyButton.Width,
-			    TheUI.NetworkDiplomacyButton.Height);
-		}
-	    }
+	    InvalidateAreaAndCheckCursor(
+		     TheUI.MenuButtonX,TheUI.MenuButtonY
+		    ,TheUI.MenuButton.Graphic->Width
+		    ,TheUI.MenuButton.Graphic->Height);
 	}
 	if( MustRedraw&RedrawMinimapBorder ) {
-	    // Unused
-//	    InvalidateAreaAndCheckCursor(
-//		 TheUI.MinimapX,TheUI.MinimapY
-//		,TheUI.Minimap.Graphic->Width,TheUI.Minimap.Graphic->Height);
+	    InvalidateAreaAndCheckCursor(
+		 TheUI.MinimapX,TheUI.MinimapY
+		,TheUI.Minimap.Graphic->Width,TheUI.Minimap.Graphic->Height);
 	} else if( (MustRedraw&RedrawMinimap)
 		|| (MustRedraw&RedrawMinimapCursor) ) {
 	    // FIXME: Redraws too much of the minimap
-	    if( TheUI.MinimapX!=-1 ) {
-		InvalidateAreaAndCheckCursor(
-			TheUI.MinimapX,TheUI.MinimapY,
-			TheUI.MinimapW,TheUI.MinimapH);
-	    }
+	    InvalidateAreaAndCheckCursor(
+		     TheUI.MinimapX+24,TheUI.MinimapY+2
+		    ,MINIMAP_W,MINIMAP_H);
 	}
 	if( MustRedraw&RedrawInfoPanel ) {
-	    if( TheUI.InfoPanelX!=-1 ) {
-		InvalidateAreaAndCheckCursor(
-			TheUI.InfoPanelX,TheUI.InfoPanelY,
-			TheUI.InfoPanelW,TheUI.InfoPanelH);
-	    }
+	    InvalidateAreaAndCheckCursor(
+		     TheUI.InfoPanelX,TheUI.InfoPanelY
+		    ,TheUI.InfoPanelW,TheUI.InfoPanelH);
 	}
 	if( MustRedraw&RedrawButtonPanel ) {
 	    InvalidateAreaAndCheckCursor(
-		    TheUI.ButtonPanelX,TheUI.ButtonPanelY,
-		    TheUI.ButtonPanelEndX-TheUI.ButtonPanelX+7,
-		    TheUI.ButtonPanelEndY-TheUI.ButtonPanelY+7);
+		     TheUI.ButtonPanelX,TheUI.ButtonPanelY
+		    ,TheUI.ButtonPanel.Graphic->Width
+		    ,TheUI.ButtonPanel.Graphic->Height);
 	}
 	if( MustRedraw&RedrawResources ) {
-	    for( i=0; i<MaxCosts+2; ++i ) {
-		if( TheUI.Resources[i].TextX!=-1 ) {
-		    // FIXME: width is wrong
-		    static int width=0;
-		    if( !width ) {
-			width=VideoTextLength(GameFont,"99,999");
-		    }
-		    InvalidateAreaAndCheckCursor(
-			    TheUI.Resources[i].TextX,TheUI.Resources[i].TextY,
-			    width,
-			    VideoTextHeight(GameFont));
-		}
-	    }
+	    InvalidateAreaAndCheckCursor(
+		     TheUI.ResourceX,TheUI.ResourceY
+		    ,TheUI.Resource.Graphic->Width
+		    ,TheUI.Resource.Graphic->Height);
 	}
 	if( MustRedraw&RedrawStatusLine || MustRedraw&RedrawCosts ) {
-	    if( TheUI.StatusLineX!=-1 ) {
-		InvalidateAreaAndCheckCursor(
-			TheUI.StatusLineX,TheUI.StatusLineY,
-			TheUI.StatusLineW,
-			VideoTextHeight(TheUI.StatusLineFont));
-	    }
+	    InvalidateAreaAndCheckCursor(
+		     TheUI.StatusLineX,TheUI.StatusLineY
+		    ,TheUI.StatusLine.Graphic->Width
+		    ,TheUI.StatusLine.Graphic->Height);
 	}
 	if( MustRedraw&RedrawTimer ) {
 	    // FIXME: Invalidate timer area
@@ -869,6 +842,10 @@ global void GameMainLoop(void)
 	    if( Callbacks==&MenuCallbacks ) {
 		MustRedraw|=RedrawMenu;
 	    }
+	    if( CurrentMenu && CurrentMenu->Panel
+		    && !strcmp(CurrentMenu->Panel, ScPanel) ) {
+		MustRedraw = RedrawEverything;
+	    }
 
 	    //For debuggin only: replace UpdateDisplay by DebugTestDisplay when
 	    //			 debugging linedraw routines..
diff --git a/src/ui/botpanel.cpp b/src/ui/botpanel.cpp
index 66e047574..30e457591 100644
--- a/src/ui/botpanel.cpp
+++ b/src/ui/botpanel.cpp
@@ -374,9 +374,12 @@ global void DrawButtonPanel(void)
     const ButtonAction* buttons;
     char buf[8];
 
-    if( !TheUI.NumButtonButtons ) {
-	return;
-    }
+    //
+    //	Draw background
+    //
+    VideoDrawSub(TheUI.ButtonPanel.Graphic,0,0
+	    ,TheUI.ButtonPanel.Graphic->Width,TheUI.ButtonPanel.Graphic->Height
+	    ,TheUI.ButtonPanelX,TheUI.ButtonPanelY);
 
     if( !(buttons=CurrentButtons) ) {	// no buttons
 	return;
@@ -385,14 +388,13 @@ global void DrawButtonPanel(void)
     // FIXME: this is unneeded DrawUnitIcon does it self
     PlayerPixels(ThisPlayer);		// could only select own units.
 
-    for( i=0; i<TheUI.NumButtonButtons; ++i ) {
+    for( i=0; i<9; ++i ) {
 	if( buttons[i].Pos!=-1 ) {
 	    int j;
 	    int action;
 
 	    // cursor is on that button
-	    if( ButtonAreaUnderCursor==ButtonAreaButton
-		    && ButtonUnderCursor==i ) {
+	    if( ButtonUnderCursor==i+10 ) {
 		v=IconActive;
 		if( MouseButtons&LeftButton ) {
 		    v=IconClicked;
@@ -491,13 +493,12 @@ global void DrawButtonPanel(void)
 	    }
 
 	    DrawUnitIcon(ThisPlayer,buttons[i].Icon.Icon
-		    ,v,TheUI.ButtonButtons[i].X,TheUI.ButtonButtons[i].Y);
+		    ,v,TheUI.Buttons[i+10].X,TheUI.Buttons[i+10].Y);
 
 	    //
 	    //	Update status line for this button
 	    //
-	    if( ButtonAreaUnderCursor==ButtonAreaButton
-		    && ButtonUnderCursor==i && KeyState!=KeyStateInput ) {
+	    if( ButtonUnderCursor==i+10 && KeyState!=KeyStateInput ) {
 		SetStatusLine(buttons[i].Hint);
 		// FIXME: Draw costs
 		v=buttons[i].Value;
@@ -538,7 +539,7 @@ global void DrawButtonPanel(void)
 	    if( ShowCommandKey ) {
 		Button* b;
 
-		b=&TheUI.ButtonButtons[i];
+		b=&TheUI.Buttons[i+10];
 		if( CurrentButtons[i].Key==27 ) {
 		    strcpy(buf,"ESC");
 		    VideoDrawText(b->X+4+b->Width-VideoTextLength(GameFont,buf),
diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp
index 9dd104478..f800d353b 100644
--- a/src/ui/interface.cpp
+++ b/src/ui/interface.cpp
@@ -95,7 +95,7 @@ local void ShowInput(void)
     sprintf(InputStatusLine,"MESSAGE:%s~!_",Input);
     input=InputStatusLine;
     // FIXME: This is slow!
-    while( VideoTextLength(GameFont,input)>TheUI.StatusLineW ) {
+    while( VideoTextLength(GameFont,input)>TheUI.StatusLine.Graphic->Width ) {
 	++input;
     }
     KeyState=KeyStateCommand;
diff --git a/src/ui/mainscr.cpp b/src/ui/mainscr.cpp
index 9a9a2756d..599097558 100644
--- a/src/ui/mainscr.cpp
+++ b/src/ui/mainscr.cpp
@@ -133,19 +133,14 @@ local void UiDrawCompleted(int full,int ready)
 {
     int f;
 
-    if( TheUI.CompleteBarX==-1 ) {
-	return;
-    }
-
     if( !full ) {
 	return;
     }
     f=(100*ready)/full;
-    f=(f*TheUI.CompleteBarW)/100;
-    VideoFillRectangleClip(TheUI.CompleteBarColor,
-	    TheUI.CompleteBarX,TheUI.CompleteBarY,f,TheUI.CompleteBarH);
-    VideoDrawText(TheUI.CompleteTextX,TheUI.CompleteTextY,
-	    TheUI.CompleteBarFont,TheUI.CompleteBarText);
+    f=(f*152)/100;
+    VideoFillRectangleClip(TheUI.CompleteBarColor
+	    ,TheUI.CompleteBarX,TheUI.CompleteBarY,f,14);
+    VideoDrawText(TheUI.CompleteTextX,TheUI.CompleteTextY,GameFont,"% Complete");
 }
 
 /**
@@ -193,28 +188,22 @@ global void DrawUnitInfo(const Unit* unit)
     //
     //	Draw icon in upper left corner
     //
-    if( TheUI.NumInfoButtons>=2 ) {
-	x=TheUI.InfoButtons[0].X;
-	y=TheUI.InfoButtons[0].Y;
-	DrawUnitIcon(unit->Player,type->Icon.Icon
-		,(ButtonAreaUnderCursor==ButtonAreaInfo && ButtonUnderCursor==0)
-		    ? (IconActive|(MouseButtons&LeftButton)) : 0
-		,x,y);
-	UiDrawLifeBar(unit,x,y);
+    x=TheUI.Buttons[1].X;
+    y=TheUI.Buttons[1].Y;
+    DrawUnitIcon(unit->Player,type->Icon.Icon
+	    ,(ButtonUnderCursor==1)
+		? (IconActive|(MouseButtons&LeftButton)) : 0
+	    ,x,y);
+    UiDrawLifeBar(unit,x,y);
 
-	if( unit->Player==ThisPlayer ) {	// Only for own units.
-	    if( unit->HP && unit->HP<10000 ) {
-		sprintf(buf,"%d/%d",unit->HP,stats->HitPoints);
-		VideoDrawTextCentered(x+(type->Icon.Icon->Width+7)/2
-			,y+type->Icon.Icon->Height+7+7+3,SmallFont,buf);
-	    }
+    if( unit->Player==ThisPlayer ) {	// Only for own units.
+	if( unit->HP && unit->HP<10000 ) {
+	    sprintf(buf,"%d/%d",unit->HP,stats->HitPoints);
+	    VideoDrawTextCentered(x+(type->Icon.Icon->Width+7)/2
+		    ,y+type->Icon.Icon->Height+7+7+3,SmallFont,buf);
 	}
     }
 
-    if( TheUI.InfoPanelW<176 ) {
-	return;
-    }
-
     x=TheUI.InfoPanelX;
     y=TheUI.InfoPanelY;
 
@@ -324,12 +313,12 @@ global void DrawUnitInfo(const Unit* unit)
 	    } else {
 		VideoDrawTextCentered(x+114,y+8+29,GameFont,"Training...");
 
-		for( i=0; i<unit->Data.Train.Count; ++i ) {
+		for( i = 0; i < unit->Data.Train.Count; i++ ) {
 		    DrawUnitIcon(unit->Player
 			    ,unit->Data.Train.What[i]->Icon.Icon
-			    ,(ButtonAreaUnderCursor==ButtonAreaTraining && ButtonUnderCursor==i)
+			    ,(ButtonUnderCursor==i+4)
 				? (IconActive|(MouseButtons&LeftButton)) : 0
-			    ,TheUI.TrainingButtons[i].X,TheUI.TrainingButtons[i].Y);
+			    ,TheUI.Buttons2[i].X,TheUI.Buttons2[i].Y);
 		}
 
 		UiDrawCompleted(
@@ -442,16 +431,16 @@ global void DrawUnitInfo(const Unit* unit)
 	    if( unit->OnBoard[i]!=NoUnitP ) {
 		DrawUnitIcon(unit->Player
 		    ,unit->OnBoard[i]->Type->Icon.Icon
-		    ,(ButtonAreaUnderCursor==ButtonAreaInfo && ButtonUnderCursor==i+3)
+		    ,(ButtonUnderCursor==i+4)
 			? (IconActive|(MouseButtons&LeftButton)) : 0
-			    ,TheUI.InfoButtons[i+3].X,TheUI.InfoButtons[i+3].Y);
+			    ,TheUI.Buttons[i+4].X,TheUI.Buttons[i+4].Y);
 		UiDrawLifeBar(unit->OnBoard[i]
-			,TheUI.InfoButtons[i+3].X,TheUI.InfoButtons[i+3].Y);
+			,TheUI.Buttons[i+4].X,TheUI.Buttons[i+4].Y);
 		if( unit->OnBoard[i]->Type->CanCastSpell ) {
 		    UiDrawManaBar(unit->OnBoard[i]
-			    ,TheUI.InfoButtons[i+3].X,TheUI.InfoButtons[i+3].Y);
+			    ,TheUI.Buttons[i+4].X,TheUI.Buttons[i+4].Y);
 		}
-		if( ButtonAreaUnderCursor==ButtonAreaInfo && ButtonUnderCursor==i+3 ) {
+		if( ButtonUnderCursor==i+4 ) {
 		    if( unit->OnBoard[i]->Name ) {
 			char buf[128];
 
@@ -578,6 +567,11 @@ global void DrawResources(void)
     int i;
     int v;
 
+    VideoDrawSub(TheUI.Resource.Graphic,0,0
+	    ,TheUI.Resource.Graphic->Width
+	    ,TheUI.Resource.Graphic->Height
+	    ,TheUI.ResourceX,TheUI.ResourceY);
+
     if( TheUI.OriginalResources ) {
 	// FIXME: could write a sub function for this
 	VideoDrawSub(TheUI.Resources[GoldCost].Icon.Graphic,0
@@ -611,43 +605,31 @@ global void DrawResources(void)
 			,0,TheUI.Resources[i].IconRow*TheUI.Resources[i].IconH
 			,TheUI.Resources[i].IconW,TheUI.Resources[i].IconH
 			,TheUI.Resources[i].IconX,TheUI.Resources[i].IconY);
-	    }
-	    if( TheUI.Resources[i].TextX!=-1 ) {
 		v=ThisPlayer->Resources[i];
 		VideoDrawNumber(TheUI.Resources[i].TextX
 			,TheUI.Resources[i].TextY+(v>99999)*3
 			,v>99999 ? SmallFont : GameFont,v);
 	    }
 	}
-	if( TheUI.Resources[FoodCost].Icon.Graphic ) {
-	    VideoDrawSub(TheUI.Resources[FoodCost].Icon.Graphic,0
-		    ,TheUI.Resources[FoodCost].IconRow*TheUI.Resources[FoodCost].IconH
-		    ,TheUI.Resources[FoodCost].IconW,TheUI.Resources[FoodCost].IconH
-		    ,TheUI.Resources[FoodCost].IconX,TheUI.Resources[FoodCost].IconY);
-	}
-	if( TheUI.Resources[FoodCost].TextX!=-1 ) {
-	    sprintf(tmp,"%d/%d",ThisPlayer->NumFoodUnits,ThisPlayer->Food);
-	    if( ThisPlayer->Food<ThisPlayer->NumFoodUnits ) {
-		VideoDrawReverseText(TheUI.Resources[FoodCost].TextX,
-			TheUI.Resources[FoodCost].TextY,GameFont,tmp);
-	    } else {
-		VideoDrawText(TheUI.Resources[FoodCost].TextX,
-			TheUI.Resources[FoodCost].TextY,GameFont,tmp);
-	    }
+	VideoDrawSub(TheUI.FoodIcon.Graphic,0
+		,TheUI.FoodIconRow*TheUI.FoodIconH
+		,TheUI.FoodIconW,TheUI.FoodIconH
+		,TheUI.FoodIconX,TheUI.FoodIconY);
+	sprintf(tmp,"%d/%d",ThisPlayer->NumFoodUnits,ThisPlayer->Food);
+	if( ThisPlayer->Food<ThisPlayer->NumFoodUnits ) {
+	    VideoDrawReverseText(TheUI.FoodTextX,TheUI.FoodTextY,GameFont,tmp);
+	} else {
+	    VideoDrawText(TheUI.FoodTextX,TheUI.FoodTextY,GameFont,tmp);
 	}
 
-	if( TheUI.Resources[ScoreCost].Icon.Graphic ) {
-	    VideoDrawSub(TheUI.Resources[ScoreCost].Icon.Graphic,0
-		    ,TheUI.Resources[ScoreCost].IconRow*TheUI.Resources[ScoreCost].IconH
-		    ,TheUI.Resources[ScoreCost].IconW,TheUI.Resources[ScoreCost].IconH
-		    ,TheUI.Resources[ScoreCost].IconX,TheUI.Resources[ScoreCost].IconY);
-	}
-	if( TheUI.Resources[ScoreCost].TextX!=-1 ) {
-	    v=ThisPlayer->Score;
-	    VideoDrawNumber(TheUI.Resources[ScoreCost].TextX
-		    ,TheUI.Resources[ScoreCost].TextY+(v>99999)*3
-		    ,v>99999 ? SmallFont : GameFont,v);
-	}
+	VideoDrawSub(TheUI.ScoreIcon.Graphic,0
+		,TheUI.ScoreIconRow*TheUI.ScoreIconH
+		,TheUI.ScoreIconW,TheUI.ScoreIconH
+		,TheUI.ScoreIconX,TheUI.ScoreIconY);
+	v=ThisPlayer->Score;
+	VideoDrawNumber(TheUI.ScoreTextX
+		,TheUI.ScoreTextY+(v>99999)*3
+		,v>99999 ? SmallFont : GameFont,v);
     }
 }
 
@@ -722,7 +704,7 @@ global void UpdateMessages(void)
     // Scroll/remove old message line
     if (MessagesFrameTimeout < FrameCounter) {
 	++MessagesScrollY;
-	if (MessagesScrollY == VideoTextHeight(TheUI.MessageAreaFont) + 1) {
+	if (MessagesScrollY == VideoTextHeight(GameFont) + 1) {
 	    MessagesFrameTimeout = FrameCounter + MESSAGES_TIMEOUT - MessagesScrollY;
 	    MessagesScrollY = 0;
 	    ShiftMessages();
@@ -742,20 +724,16 @@ global void DrawMessages(void)
 {
     int z;
 
-    if (TheUI.MessageAreaX==-1 ) {
-	return;
-    }
-
     // Draw message line(s)
     for (z = 0; z < MessagesCount; z++) {
 	if (z == 0) {
 	    PushClipping();
-	    SetClipping(TheUI.MessageAreaX, TheUI.MessageAreaY, VideoWidth - 1,
+	    SetClipping(TheUI.MapArea.X + 8, TheUI.MapArea.Y + 8, VideoWidth - 1,
 		VideoHeight - 1);
 	}
-	VideoDrawTextClip(TheUI.MessageAreaX,
-	    TheUI.MessageAreaY + z * (VideoTextHeight(TheUI.MessageAreaFont) + 1) - MessagesScrollY,
-	    TheUI.MessageAreaFont, Messages[z]);
+	VideoDrawTextClip(TheUI.MapArea.X + 8,
+	    TheUI.MapArea.Y + 8 + z * (VideoTextHeight(GameFont) + 1) - MessagesScrollY,
+	    GameFont, Messages[z]);
 	if (z == 0) {
 	    PopClipping();
 	}
@@ -776,10 +754,6 @@ local void AddMessage(const char *msg)
     char *message;
     char *next;
 
-    if (TheUI.MessageAreaX==-1) {
-	return;
-    }
-
     if (!MessagesCount) {
 	MessagesFrameTimeout = FrameCounter + MESSAGES_TIMEOUT;
     }
@@ -814,7 +788,8 @@ local void AddMessage(const char *msg)
 	next = ptr = message + strlen(message);
     }
 
-    while (VideoTextLength(TheUI.MessageAreaFont, message) >= TheUI.MessageAreaW ) {
+    // FIXME: 440+(VideoWidth-640) is the wrong value.
+    while (VideoTextLength(GameFont, message) >= 440+(VideoWidth-640) ) {
 	while (1) {
 	    --ptr;
 	    if (*ptr == ' ') {
@@ -828,7 +803,7 @@ local void AddMessage(const char *msg)
 	// No space found, wrap in the middle of a word
 	if (ptr == message) {
 	    ptr = next-1;
-	    while (VideoTextLength(TheUI.MessageAreaFont, message) >= TheUI.MessageAreaW ) {
+	    while (VideoTextLength(GameFont, message) >= 440+(VideoWidth-640) ) {
 		*--ptr = '\0';
 	    }
 	    next = ptr+1;
@@ -971,9 +946,12 @@ local char StatusLine[STATUS_LINE_LEN];			/// status line/hints
 */
 global void DrawStatusLine(void)
 {
-    if( TheUI.StatusLineX!=-1 && StatusLine[0] ) {
-	VideoDrawText(TheUI.StatusLineX,TheUI.StatusLineY,
-		TheUI.StatusLineFont,StatusLine);
+    VideoDrawSub(TheUI.StatusLine.Graphic
+	    ,0,0
+	    ,TheUI.StatusLine.Graphic->Width,TheUI.StatusLine.Graphic->Height
+	    ,TheUI.StatusLineX,TheUI.StatusLineY);
+    if( StatusLine ) {
+	VideoDrawText(TheUI.StatusLineX+2,TheUI.StatusLineY+2,GameFont,StatusLine);
     }
 }
 
@@ -984,9 +962,9 @@ global void DrawStatusLine(void)
 */
 global void SetStatusLine(char* status)
 {
-    if( KeyState!=KeyStateInput && strcmp(StatusLine,status) ) {
+    if( KeyState!=KeyStateInput && strcmp( StatusLine, status ) ) {
 	MustRedraw|=RedrawStatusLine;
-	strncpy(StatusLine,status,STATUS_LINE_LEN-1);
+	strncpy( StatusLine, status, STATUS_LINE_LEN-1 );
 	StatusLine[STATUS_LINE_LEN-1] = 0;
     }
 }
@@ -997,7 +975,7 @@ global void SetStatusLine(char* status)
 global void ClearStatusLine(void)
 {
     if( KeyState!=KeyStateInput ) {
-	SetStatusLine("");
+	SetStatusLine( "" );
     }
 }
 
@@ -1020,15 +998,13 @@ global void DrawCosts(void)
     x=TheUI.StatusLineX+270;
     if( CostsMana ) {
 	// FIXME: hardcoded image!!!
-	if( TheUI.Resources[GoldCost].Icon.Graphic ) {
-	    VideoDrawSub(TheUI.Resources[GoldCost].Icon.Graphic
-		    /* ,0,TheUI.Resources[GoldCost].IconRow
-			    *TheUI.Resources[GoldCost].IconH */
-		    ,0,3*TheUI.Resources[GoldCost].IconH
-		    ,TheUI.Resources[GoldCost].IconW
-		    ,TheUI.Resources[GoldCost].IconH
-		    ,x,TheUI.StatusLineY+1);
-	}
+	VideoDrawSub(TheUI.Resources[GoldCost].Icon.Graphic
+		/* ,0,TheUI.Resources[GoldCost].IconRow
+			*TheUI.Resources[GoldCost].IconH */
+		,0,3*TheUI.Resources[GoldCost].IconH
+		,TheUI.Resources[GoldCost].IconW
+		,TheUI.Resources[GoldCost].IconH
+		,x,TheUI.StatusLineY+1);
 
 	VideoDrawNumber(x+15,TheUI.StatusLineY+2,GameFont,CostsMana);
 	x+=45;
@@ -1052,12 +1028,10 @@ global void DrawCosts(void)
 
     if( CostsFood ) {
 	// FIXME: hardcoded image!!!
-	if( TheUI.Resources[FoodCost].Icon.Graphic ) {
-	    VideoDrawSub(TheUI.Resources[FoodCost].Icon.Graphic
-		    ,0,TheUI.Resources[FoodCost].IconRow*TheUI.Resources[FoodCost].IconH
-		    ,TheUI.Resources[FoodCost].IconW,TheUI.Resources[FoodCost].IconH
-		    ,x,TheUI.StatusLineY+1);
-	}
+	VideoDrawSub(TheUI.FoodIcon.Graphic
+		,0,TheUI.FoodIconRow*TheUI.FoodIconH
+		,TheUI.FoodIconW,TheUI.FoodIconH
+		,x,TheUI.StatusLineY+1);
 	VideoDrawNumber(x+15,TheUI.StatusLineY+2,GameFont,CostsFood);
 	x+=45;
     }
@@ -1123,12 +1097,10 @@ global void ClearCosts(void)
 */
 local void DrawInfoPanelBackground(unsigned frame)
 {
-    if( TheUI.InfoPanel.Graphic ) {
-	VideoDrawSub(TheUI.InfoPanel.Graphic,
-		0,TheUI.InfoPanelH*frame,
-		TheUI.InfoPanelW,TheUI.InfoPanelH,
-		TheUI.InfoPanelX,TheUI.InfoPanelY);
-    }
+    VideoDrawSub(TheUI.InfoPanel.Graphic
+	    ,0,TheUI.InfoPanelH*frame
+	    ,TheUI.InfoPanelW,TheUI.InfoPanelH
+	    ,TheUI.InfoPanelX,TheUI.InfoPanelY);
 }
 
 /**
@@ -1144,25 +1116,20 @@ global void DrawInfoPanel(void)
 {
     int i;
 
-    if( TheUI.InfoPanelX==-1 ) {
-	return;
-    }
-
     if( NumSelected ) {
 	if( NumSelected>1 ) {
 	    PlayerPixels(ThisPlayer);	// can only be own!
-	    DrawInfoPanelBackground(TheUI.InfoPanelNeutralFrame);
+	    DrawInfoPanelBackground(0);
             for( i=0; i<NumSelected; ++i ) {
-	        DrawUnitIcon(ThisPlayer,
-			Selected[i]->Type->Icon.Icon,
-			(ButtonAreaUnderCursor==ButtonAreaInfo && ButtonUnderCursor==0)
-			    ? (IconActive|(MouseButtons&LeftButton)) : 0,
-			TheUI.InfoButtons[i].X,TheUI.InfoButtons[i].Y);
+	        DrawUnitIcon(ThisPlayer
+			,Selected[i]->Type->Icon.Icon
+			,(ButtonUnderCursor==i+1)
+			    ? (IconActive|(MouseButtons&LeftButton)) : 0
+				,TheUI.Buttons[i+1].X,TheUI.Buttons[i+1].Y);
 		UiDrawLifeBar(Selected[i]
-			,TheUI.InfoButtons[i].X,TheUI.InfoButtons[i].Y);
+			,TheUI.Buttons[i+1].X,TheUI.Buttons[i+1].Y);
 
-		if( ButtonAreaUnderCursor==ButtonAreaInfo
-			&& ButtonUnderCursor==i ) {
+		if( ButtonUnderCursor==1+i ) {
 		    if( Selected[i]->Name ) {
 			char buf[128];
 
@@ -1183,18 +1150,18 @@ global void DrawInfoPanel(void)
 			|| Selected[0]->Orders[0].Action==UnitActionResearch
 			|| Selected[0]->Orders[0].Action==UnitActionUpgradeTo
 			|| Selected[0]->Orders[0].Action==UnitActionTrain) ) {
-		    i=TheUI.InfoPanelConstructionFrame;
+		    i=3;
 		} else if( Selected[0]->Type->_MaxMana ) {
-		    i=TheUI.InfoPanelMagicFrame;
+		    i=2;
 		} else {
-		    i=TheUI.InfoPanelSelectedFrame;
+		    i=1;
 		}
 	    } else {
-		i=TheUI.InfoPanelNeutralFrame;
+		i=0;
 	    }
 	    DrawInfoPanelBackground(i);
 	    DrawUnitInfo(Selected[0]);
-	    if( ButtonAreaUnderCursor==ButtonAreaInfo && ButtonUnderCursor==0 ) {
+	    if( ButtonUnderCursor==1 ) {
 		if( Selected[0]->Name ) {
 		    char buf[128];
 
@@ -1211,7 +1178,7 @@ global void DrawInfoPanel(void)
 
     //	Nothing selected
 
-    DrawInfoPanelBackground(TheUI.InfoPanelNeutralFrame);
+    DrawInfoPanelBackground(0);
     if( UnitUnderCursor && UnitVisibleOnMap(UnitUnderCursor) ) {
 	// FIXME: not correct for enemies units
 	DrawUnitInfo(UnitUnderCursor);
@@ -1222,10 +1189,6 @@ global void DrawInfoPanel(void)
 	char* rc;
 	// FIXME: need some cool ideas for this.
 
-	if( TheUI.InfoPanelW<176 ) {
-	    return;
-	}
-
 	x=TheUI.InfoPanelX+16;
 	y=TheUI.InfoPanelY+8;
 
@@ -1276,23 +1239,23 @@ global void DrawTimer(void)
     int min;
     int sec;
 
-    if( !GameTimer.Init ) {
+    if (!GameTimer.Init) {
 	return;
     }
 
-    sec=GameTimer.Cycles / CYCLES_PER_SECOND % 60;
-    min=(GameTimer.Cycles / CYCLES_PER_SECOND / 60) % 60;
-    hour=(GameTimer.Cycles / CYCLES_PER_SECOND / 3600);
+    sec = GameTimer.Cycles / CYCLES_PER_SECOND % 60;
+    min = (GameTimer.Cycles / CYCLES_PER_SECOND / 60) % 60;
+    hour = (GameTimer.Cycles / CYCLES_PER_SECOND / 3600);
 
-    if( hour ) {
-	sprintf(buf,"%d:%02d:%02d",hour,min,sec);
+    if (hour) {
+	sprintf(buf, "%d:%02d:%02d", hour, min, sec);
     } else {
-	sprintf(buf,"%d:%02d",min,sec);
+	sprintf(buf, "%d:%02d", min, sec);
     }
 
     // FIXME: make this configurable
-    VideoDrawText(TheUI.SelectedViewport->EndX-70,
-	TheUI.SelectedViewport->Y+15,GameFont,buf);
+    VideoDrawText(TheUI.SelectedViewport->EndX - 70,
+	TheUI.SelectedViewport->Y + 15, GameFont, buf);
 }
 
 /**
diff --git a/src/ui/menu_defs.inc b/src/ui/menu_defs.inc
index 06bf88db9..ea45717c3 100644
--- a/src/ui/menu_defs.inc
+++ b/src/ui/menu_defs.inc
@@ -157,6 +157,46 @@ local char *MenuHotKeyToStr(int key, char *buf)
     return buf;
 }
 
+local char *MenuButtonStyle(int style)
+{
+    switch (style) {
+	case MBUTTON_MAIN:
+	    return "main";
+	case MBUTTON_GM_HALF:
+	    return "gm-half";
+	case MBUTTON_132:
+	    return "132";
+	case MBUTTON_GM_FULL:
+	    return "gm-full";
+	case MBUTTON_GEM_ROUND:
+	    return "gem-round";
+	case MBUTTON_GEM_SQUARE:
+	    return "gem-square";
+	case MBUTTON_UP_ARROW:
+	    return "up-arrow";
+	case MBUTTON_DOWN_ARROW:
+	    return "down-arrow";
+	case MBUTTON_LEFT_ARROW:
+	    return "left-arrow";
+	case MBUTTON_RIGHT_ARROW:
+	    return "right-arrow";
+	case MBUTTON_S_KNOB:
+	    return "s-knob";
+	case MBUTTON_S_VCONT:
+	    return "s-vcont";
+	case MBUTTON_S_HCONT:
+	    return "s-hcont";
+	case MBUTTON_PULLDOWN:
+	    return "pulldown";
+	case MBUTTON_VTHIN:
+	    return "vthin";
+	case MBUTTON_FOLDER:
+	    return "folder";
+    }
+    fprintf(stderr,"MenuButtonStyle not found: %d\n", style);
+    return "";
+}
+
 /**
 **	Save state of units to file.
 **
diff --git a/src/ui/menu_proc.cpp b/src/ui/menu_proc.cpp
index f5b957e0e..04b24a6a5 100644
--- a/src/ui/menu_proc.cpp
+++ b/src/ui/menu_proc.cpp
@@ -104,51 +104,6 @@ local int MenuButtonCurSel = -1;
 --	Menu operation functions
 ----------------------------------------------------------------------------*/
 
-/**
-**	FIXME: docu
-*/
-global char *MenuButtonStyle(int style)
-{
-    switch (style) {
-	case MBUTTON_MAIN:
-	    return "main";
-	case MBUTTON_NETWORK:
-	    return "network";
-	case MBUTTON_GM_HALF:
-	    return "gm-half";
-	case MBUTTON_132:
-	    return "132";
-	case MBUTTON_GM_FULL:
-	    return "gm-full";
-	case MBUTTON_GEM_ROUND:
-	    return "gem-round";
-	case MBUTTON_GEM_SQUARE:
-	    return "gem-square";
-	case MBUTTON_UP_ARROW:
-	    return "up-arrow";
-	case MBUTTON_DOWN_ARROW:
-	    return "down-arrow";
-	case MBUTTON_LEFT_ARROW:
-	    return "left-arrow";
-	case MBUTTON_RIGHT_ARROW:
-	    return "right-arrow";
-	case MBUTTON_S_KNOB:
-	    return "s-knob";
-	case MBUTTON_S_VCONT:
-	    return "s-vcont";
-	case MBUTTON_S_HCONT:
-	    return "s-hcont";
-	case MBUTTON_PULLDOWN:
-	    return "pulldown";
-	case MBUTTON_VTHIN:
-	    return "vthin";
-	case MBUTTON_FOLDER:
-	    return "folder";
-    }
-    fprintf(stderr,"MenuButtonStyle not found: %d\n", style);
-    return "";
-}
-
 /**
 **	Find a menu by ident.
 **
@@ -2388,6 +2343,9 @@ global void ProcessMenu(const char *menu_id, int loop)
 	    }
 	    DebugLevel3("MustRedraw: 0x%08x\n" _C_ MustRedraw);
 	    if (MustRedraw) {
+		if (CurrentMenu->Panel && !strcmp(CurrentMenu->Panel, ScPanel)) {
+		    MustRedraw = RedrawEverything;
+		}
 		if (MustRedraw == RedrawEverything) {
 		    InterfaceState = IfaceStateNormal;
 		    UpdateDisplay();
diff --git a/src/ui/mouse.cpp b/src/ui/mouse.cpp
index 69e71f34e..3916d6bc0 100644
--- a/src/ui/mouse.cpp
+++ b/src/ui/mouse.cpp
@@ -61,10 +61,8 @@ global enum _mouse_buttons_ MouseButtons;/// Current pressed mouse buttons
 global enum _key_modifiers_ KeyModifiers;/// Current keyboard modifiers
 
 global Unit* UnitUnderCursor;		/// Unit under cursor
-global int ButtonAreaUnderCursor=-1;	/// Button area under cursor
 global int ButtonUnderCursor=-1;	/// Button under cursor
-global char GameMenuButtonClicked;	/// Menu button was clicked
-global char GameDiplomacyButtonClicked;	/// Diplomacy button was clicked
+global char GameMenuButtonClicked;	/// Game menu button (F10) was clicked
 global char LeaveStops;			/// Mouse leaves windows stops scroll
 
 global enum _cursor_on_ CursorOn=CursorOnUnknown;	/// Cursor on field
@@ -105,31 +103,31 @@ local void DrawMouseCoordsOnMap(int x,int y)
 	return;
     }
     VideoLockScreen();
-    VideoDrawSub(TheUI.MenuButton.Graphic,0,0,
-	    TheUI.MenuButton.Graphic->Width,
-	    TheUI.MenuButton.Graphic->Height,
-	    TheUI.MenuButtonX,TheUI.MenuButtonY);
+    VideoDrawSub(TheUI.MenuButton.Graphic,0,0
+	    ,TheUI.MenuButton.Graphic->Width
+	    ,TheUI.MenuButton.Graphic->Height
+	    ,TheUI.MenuButtonX,TheUI.MenuButtonY);
     flags=TheMap.Fields[x+y*TheMap.Width].Flags;
 //  sprintf(buf,"%3d,%3d=%02X|%04X|%c%c%c%c%c%c%c%c%c",x,y
-    sprintf(buf,"%3d,%3d=%02X|%04X|%c%c%c%c%c%c%c",x,y,
-	    TheMap.Fields[x+y*TheMap.Width].Value,
-	    flags,
+    sprintf(buf,"%3d,%3d=%02X|%04X|%c%c%c%c%c%c%c",x,y
+	    ,TheMap.Fields[x+y*TheMap.Width].Value
+	    ,flags
 	    //,TheMap.Fields[x+y*TheMap.Width].Tile
-	    flags&MapFieldUnpassable	?'u':'-',
-	    flags&MapFieldNoBuilding	?'n':'-',
-	    flags&MapFieldForest	?'f':'-',
-	    flags&MapFieldWaterAllowed ?'w':'-',
-	    flags&MapFieldCoastAllowed ?'c':'-',
-	    flags&MapFieldLandAllowed	?'l':'-',
-	    flags&MapFieldHuman	?'h':'-'
-//	    flags&MapFieldExplored	?'e':'-'
-//	    flags&MapFieldVisible	?'v':'-'
+	    ,flags&MapFieldUnpassable	?'u':'-'
+	    ,flags&MapFieldNoBuilding	?'n':'-'
+	    ,flags&MapFieldForest	?'f':'-'
+	    ,flags&MapFieldWaterAllowed ?'w':'-'
+	    ,flags&MapFieldCoastAllowed ?'c':'-'
+	    ,flags&MapFieldLandAllowed	?'l':'-'
+	    ,flags&MapFieldHuman	?'h':'-'
+//	    ,flags&MapFieldExplored	?'e':'-'
+//	    ,flags&MapFieldVisible	?'v':'-'
 	);
     VideoDrawText(TheUI.MenuButtonX+3,TheUI.MenuButtonY+3,GameFont,buf);
     VideoUnlockScreen();
-    InvalidateArea(TheUI.MenuButtonX,TheUI.MenuButtonY,
-	    TheUI.MenuButton.Graphic->Width,
-	    TheUI.MenuButton.Graphic->Height);
+    InvalidateArea(TheUI.MenuButtonX,TheUI.MenuButtonY
+	    ,TheUI.MenuButton.Graphic->Width
+	    ,TheUI.MenuButton.Graphic->Height);
 }
 #endif	// } FLAG_DEBUG
 
@@ -465,105 +463,46 @@ local void HandleMouseOn(int x,int y)
     //
     //	Handle buttons
     //
-    if( NetworkFildes==-1 ) {
-	if( TheUI.MenuButton.X!=-1 ) {
-	    if( x>=TheUI.MenuButton.X
-		    && x<=TheUI.MenuButton.X+TheUI.MenuButton.Width
-		    && y>TheUI.MenuButton.Y
-		    && y<=TheUI.MenuButton.Y+TheUI.MenuButton.Height ) {
-		ButtonAreaUnderCursor=ButtonAreaMenu;
-		ButtonUnderCursor=ButtonUnderMenu;
-		CursorOn=CursorOnButton;
+    for( i=0; i<(int)(sizeof(TheUI.Buttons)/sizeof(*TheUI.Buttons)); ++i ) {
+	if( x<TheUI.Buttons[i].X
+		|| x>TheUI.Buttons[i].X+TheUI.Buttons[i].Width
+		|| y<TheUI.Buttons[i].Y
+		|| y>TheUI.Buttons[i].Y+TheUI.Buttons[i].Height ) {
+	    continue;
+	}
+	DebugLevel3("On button %d\n" _C_ i);
+	ButtonUnderCursor=i;
+	CursorOn=CursorOnButton;
+	if( i<10 ) {
+	    if (i == 0) {		// Menu button
 		MustRedraw|=RedrawMenuButton;
-		return;
+	    } else {
+		MustRedraw|=RedrawInfoPanel;
+	    }
+	} else {
+	    MustRedraw|=RedrawButtonPanel;
+	}
+	return;
+    }
+
+    if( ButtonUnderCursor!=-1 ) {	// remove old display
+	if( ButtonUnderCursor<10 ) {
+	    if (ButtonUnderCursor == 0) {	// Menu button
+		MustRedraw|=RedrawMenuButton;
+	    } else {
+		MustRedraw|=RedrawInfoPanel;
 	    }
-	}
-    } else {
-	if( TheUI.NetworkMenuButton.X!=-1 ) {
-	    if( x>=TheUI.NetworkMenuButton.X
-		    && x<=TheUI.NetworkMenuButton.X+TheUI.NetworkMenuButton.Width
-		    && y>TheUI.NetworkMenuButton.Y
-		    && y<=TheUI.NetworkMenuButton.Y+TheUI.NetworkMenuButton.Height ) {
-		ButtonAreaUnderCursor=ButtonAreaMenu;
-		ButtonUnderCursor=ButtonUnderNetworkMenu;
-		CursorOn=CursorOnButton;
-		MustRedraw|=RedrawMenuButton;
-		return;
-	    }
-	}
-	if( TheUI.NetworkDiplomacyButton.X!=-1 ) {
-	    if( x>=TheUI.NetworkDiplomacyButton.X
-		    && x<=TheUI.NetworkDiplomacyButton.X+TheUI.NetworkDiplomacyButton.Width
-		    && y>TheUI.NetworkDiplomacyButton.Y
-		    && y<=TheUI.NetworkDiplomacyButton.Y+TheUI.NetworkDiplomacyButton.Height ) {
-		ButtonAreaUnderCursor=ButtonAreaMenu;
-		ButtonUnderCursor=ButtonUnderNetworkDiplomacy;
-		CursorOn=CursorOnButton;
-		MustRedraw|=RedrawMenuButton;
-		return;
-	    }
-	}
-    }
-    for( i=0; i<TheUI.NumButtonButtons; ++i ) {
-	if( x>=TheUI.ButtonButtons[i].X
-		&& x<=TheUI.ButtonButtons[i].X+TheUI.ButtonButtons[i].Width+7
-		&& y>TheUI.ButtonButtons[i].Y
-		&& y<=TheUI.ButtonButtons[i].Y+TheUI.ButtonButtons[i].Height+7 ) {
-	    ButtonAreaUnderCursor=ButtonAreaButton;
-	    ButtonUnderCursor=i;
-	    CursorOn=CursorOnButton;
-	    MustRedraw|=RedrawButtonPanel;
-	    return;
-	}
-    }
-    if( NumSelected==1 && Selected[0]->Type->Building
-	    && Selected[0]->Orders[0].Action==UnitActionTrain
-	    && Selected[0]->Data.Train.Count>1 ) {
-	for( i=0; i<TheUI.NumTrainingButtons; ++i ) {
-	    if( x>=TheUI.TrainingButtons[i].X
-		    && x<=TheUI.TrainingButtons[i].X+TheUI.TrainingButtons[i].Width+7
-		    && y>TheUI.TrainingButtons[i].Y
-		    && y<=TheUI.TrainingButtons[i].Y+TheUI.TrainingButtons[i].Height+7 ) {
-		ButtonAreaUnderCursor=ButtonAreaTraining;
-		ButtonUnderCursor=i;
-		CursorOn=CursorOnButton;
-		MustRedraw|=RedrawButtonPanel;
-		return;
-	    }
-	}
-    } else {
-	for( i=0; i<TheUI.NumInfoButtons; ++i ) {
-	    if( x>=TheUI.InfoButtons[i].X
-		    && x<=TheUI.InfoButtons[i].X+TheUI.InfoButtons[i].Width+7
-		    && y>TheUI.InfoButtons[i].Y
-		    && y<=TheUI.InfoButtons[i].Y+TheUI.InfoButtons[i].Height+7 ) {
-		ButtonAreaUnderCursor=ButtonAreaInfo;
-		ButtonUnderCursor=i;
-		CursorOn=CursorOnButton;
-		MustRedraw|=RedrawButtonPanel;
-		return;
-	    }
-	}
-    }
-
-    if( ButtonUnderCursor!=-1 ) {	// remove old display
-	if( ButtonAreaUnderCursor==ButtonAreaMenu ) {
-	    MustRedraw|=RedrawMenuButton;
-	} else if( ButtonAreaUnderCursor==ButtonAreaInfo ) {
-	    MustRedraw|=RedrawInfoPanel;
 	} else {
 	    MustRedraw|=RedrawButtonPanel;
 	}
-	ButtonAreaUnderCursor=-1;
 	ButtonUnderCursor=-1;
     }
 
     //
     //	Minimap
     //
-    if( TheUI.MinimapX!=-1
-	    && x>=TheUI.MinimapX && x<TheUI.MinimapX+TheUI.MinimapW
-	    && y>=TheUI.MinimapY && y<TheUI.MinimapY+TheUI.MinimapH ) {
+    if( x>=TheUI.MinimapX+24 && x<TheUI.MinimapX+24+MINIMAP_W
+	    && y>=TheUI.MinimapY+2 && y<TheUI.MinimapY+2+MINIMAP_H ) {
 	CursorOn=CursorOnMinimap;
 	return;
     }
@@ -657,18 +596,18 @@ global void RestrictCursorToViewport(void)
 */
 global void RestrictCursorToMinimap(void)
 {
-    if (CursorX < TheUI.MinimapX) {
-	CursorStartX = TheUI.MinimapX;
-    } else if (CursorX >= TheUI.MinimapX + TheUI.MinimapW) {
-	CursorStartX = TheUI.MinimapX + TheUI.MinimapW - 1;
+    if (CursorX < TheUI.MinimapX + 24) {
+	CursorStartX = TheUI.MinimapX + 24;
+    } else if (CursorX >= TheUI.MinimapX + 24 + MINIMAP_W) {
+	CursorStartX = TheUI.MinimapX + 24 + MINIMAP_W - 1;
     } else {
 	CursorStartX = CursorX;
     }
 
-    if (CursorY < TheUI.MinimapY) {
-	CursorStartY = TheUI.MinimapY;
-    } else if (CursorY >= TheUI.MinimapY + TheUI.MinimapH) {
-	CursorStartY = TheUI.MinimapY + TheUI.MinimapH - 1;
+    if (CursorY < TheUI.MinimapY + 2) {
+	CursorStartY = TheUI.MinimapY + 2;
+    } else if (CursorY >= TheUI.MinimapY + 2 + MINIMAP_H) {
+	CursorStartY = TheUI.MinimapY + 2 + MINIMAP_H - 1;
     } else {
 	CursorStartY = CursorY;
     }
@@ -755,7 +694,7 @@ global void UIHandleMouseMove(int x,int y)
     //
     //	User may be draging with button pressed.
     //
-    if( GameMenuButtonClicked || GameDiplomacyButtonClicked ) {
+    if( GameMenuButtonClicked ) {
 	return;
     }
 
@@ -1276,11 +1215,11 @@ local void UISelectStateButtonDown(unsigned button __attribute__((unused)))
 	sx = CursorX - vp->X + TileSizeX * vp->MapX;
 	sy = CursorY - vp->Y + TileSizeY * vp->MapY;
 	if( MouseButtons&LeftButton ) {
-	    MakeLocalMissile(MissileTypeGreenCross,
-		    vp->MapX*TileSizeX+CursorX - vp->X,
-		    vp->MapY*TileSizeY+CursorY - vp->Y,
-		    vp->MapX*TileSizeX+CursorX - vp->X,
-		    vp->MapY*TileSizeY+CursorY - vp->Y);
+	    MakeLocalMissile(MissileTypeGreenCross
+		    ,vp->MapX*TileSizeX+CursorX - vp->X
+		    ,vp->MapY*TileSizeY+CursorY - vp->Y
+		    ,vp->MapX*TileSizeX+CursorX - vp->X
+		    ,vp->MapY*TileSizeY+CursorY - vp->Y);
 	    SendCommand(sx, sy);
 	}
 	return;
@@ -1305,8 +1244,8 @@ local void UISelectStateButtonDown(unsigned button __attribute__((unused)))
 	    CurrentButtonLevel = 0; // reset unit buttons to normal
 	    UpdateButtonPanel();
 	    MustRedraw|=RedrawButtonPanel|RedrawCursor;
-	    MakeLocalMissile(MissileTypeGreenCross,
-		    sx+TileSizeX/2,sy+TileSizeY/2,0,0);
+	    MakeLocalMissile(MissileTypeGreenCross
+		    ,sx+TileSizeX/2,sy+TileSizeY/2,0,0);
 	    SendCommand(sx,sy);
 	} else {
 	    ViewportCenterViewpoint(TheUI.SelectedViewport, mx, my);
@@ -1316,8 +1255,8 @@ local void UISelectStateButtonDown(unsigned button __attribute__((unused)))
 
     if( CursorOn==CursorOnButton ) {
 	// FIXME: other buttons?
-	if( ButtonAreaUnderCursor==ButtonAreaButton ) {
-	    DoButtonButtonClicked(ButtonUnderCursor);
+	if( ButtonUnderCursor>9 ) {
+	    DoButtonButtonClicked(ButtonUnderCursor-10);
 	    return;
 	}
     }
@@ -1424,16 +1363,16 @@ global void UIHandleButtonDown(unsigned button)
 		}
 		if( CanBuildUnitType(Selected[0],CursorBuilding,x,y)
 			&& (explored || ReplayRevealMap) ) {
-		    PlayGameSound(GameSounds.PlacementSuccess.Sound,
-			    MaxSampleVolume);
-		    SendCommandBuildBuilding(Selected[0],x,y,CursorBuilding,
-			    !(KeyModifiers&ModifierShift));
+		    PlayGameSound(GameSounds.PlacementSuccess.Sound
+			    ,MaxSampleVolume);
+		    SendCommandBuildBuilding(Selected[0],x,y,CursorBuilding
+			    ,!(KeyModifiers&ModifierShift));
 		    if( !(KeyModifiers&ModifierAlt) ) {
 			CancelBuildingMode();
 		    }
 		} else {
-		    PlayGameSound(GameSounds.PlacementError.Sound,
-			    MaxSampleVolume);
+		    PlayGameSound(GameSounds.PlacementError.Sound
+			    ,MaxSampleVolume);
 		}
 	    } else {
 		CancelBuildingMode();
@@ -1479,10 +1418,10 @@ global void UIHandleButtonDown(unsigned button)
 		if( UnitUnderCursor && (unit=UnitOnScreenMapPosition(x,y)) ) {
 		    unit->Blink=4;	// if right click on building -- blink
 		} else {	// if not not click on building -- green cross
-		    MakeLocalMissile(MissileTypeGreenCross,
-			TheUI.MouseViewport->MapX*TileSizeX
-			    +CursorX-TheUI.MouseViewport->X,
-			TheUI.MouseViewport->MapY*TileSizeY
+		    MakeLocalMissile(MissileTypeGreenCross
+			,TheUI.MouseViewport->MapX*TileSizeX
+			    +CursorX-TheUI.MouseViewport->X
+			,TheUI.MouseViewport->MapY*TileSizeY
 			    +CursorY-TheUI.MouseViewport->Y,0,0);
 		}
 		DoRightButton(x,y);
@@ -1497,9 +1436,9 @@ global void UIHandleButtonDown(unsigned button)
 		ScreenMinimap2MapX(CursorX), ScreenMinimap2MapY(CursorY));
 	} else if( MouseButtons&RightButton ) {
 	    if( !GameObserve && !GamePaused ) {
-		MakeLocalMissile(MissileTypeGreenCross,
-			ScreenMinimap2MapX(CursorX)*TileSizeX+TileSizeX/2,
-			ScreenMinimap2MapY(CursorY)*TileSizeY+TileSizeY/2,0,0);
+		MakeLocalMissile(MissileTypeGreenCross
+			,ScreenMinimap2MapX(CursorX)*TileSizeX+TileSizeX/2
+			,ScreenMinimap2MapY(CursorY)*TileSizeY+TileSizeY/2,0,0);
 		// DoRightButton() takes screen map coordinates
 		DoRightButton(ScreenMinimap2MapX(CursorX) * TileSizeX,
 			ScreenMinimap2MapY(CursorY) * TileSizeY);
@@ -1512,82 +1451,75 @@ global void UIHandleButtonDown(unsigned button)
 	//
 	//	clicked on info panel - selection shown
 	//
-	if( NumSelected>1 && ButtonAreaUnderCursor==ButtonAreaInfo ) {
+	if( NumSelected>1 && ButtonUnderCursor && ButtonUnderCursor<10 ) {
 	    if( !GameObserve && !GamePaused ) {
-		DoSelectionButtons(ButtonUnderCursor,button);
+		DoSelectionButtons(ButtonUnderCursor-1,button);
 	    }
 	} else if( (MouseButtons&LeftButton) ) {
 	    //
 	    //	clicked on menu button
 	    //
-	    if( ButtonAreaUnderCursor==ButtonAreaMenu ) {
-		if( (ButtonUnderCursor==ButtonUnderMenu
-			    || ButtonUnderCursor==ButtonUnderNetworkMenu)
-			&& !GameMenuButtonClicked ) {
-		    PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume);
-		    GameMenuButtonClicked=1;
-		    MustRedraw|=RedrawMenuButton;
-		} else if( ButtonUnderCursor==ButtonUnderNetworkDiplomacy
-			&& !GameDiplomacyButtonClicked ) {
-		    PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume);
-		    GameDiplomacyButtonClicked=1;
-		    MustRedraw|=RedrawMenuButton;
-		}
+	    if( ButtonUnderCursor==0 && !GameMenuButtonClicked ) {
+		PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume);
+		GameMenuButtonClicked = 1;
+		MustRedraw|=RedrawMenuButton;
 	    //
-	    //	clicked on info panel
+	    //	clicked on info panel - single unit shown
 	    //
-	    } else if( ButtonAreaUnderCursor==ButtonAreaInfo ) {
-		//
-		//  clicked on single unit shown
-		//
-		if( ButtonUnderCursor==0 && NumSelected==1 ) {
-		    PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume);
-		    ViewportCenterViewpoint(TheUI.SelectedViewport, Selected[0]->X,
-			    Selected[0]->Y);
-		//
-		//  for transporter
-		//
-		} else if( ButtonUnderCursor>2 && ButtonUnderCursor<9 ) {
-		    if( NumSelected==1 && Selected[0]->Type->Transporter ) {
-			if( !GameObserve && !GamePaused ) {
-			    if( Selected[0]->OnBoard[ButtonUnderCursor-3] ) {
-				// FIXME: should check if valid here.
-				SendCommandUnload(Selected[0],
-					Selected[0]->X,Selected[0]->Y,
-					Selected[0]->OnBoard[ButtonUnderCursor-3],
-					!(KeyModifiers&ModifierShift));
-			    }
+	    } else if( ButtonUnderCursor==1 && NumSelected==1 ) {
+		PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume);
+		ViewportCenterViewpoint(TheUI.SelectedViewport, Selected[0]->X,
+			Selected[0]->Y);
+	    //
+	    //	clicked on info panel - single unit shown
+	    //		for transporter - training queues
+	    //
+	    } else if( ButtonUnderCursor>3 && ButtonUnderCursor<10 ) {
+		if( NumSelected==1 && Selected[0]->Type->Transporter ) {
+		    if( !GameObserve && !GamePaused ) {
+			if( Selected[0]->OnBoard[ButtonUnderCursor-4] ) {
+			    // FIXME: should check if valid here.
+			    SendCommandUnload(Selected[0]
+				    ,Selected[0]->X,Selected[0]->Y
+				    ,Selected[0]->OnBoard[ButtonUnderCursor-4]
+				    ,!(KeyModifiers&ModifierShift));
 			}
 		    }
 		}
-	    //
-	    //	clicked on training button
-	    //
-	    } else if( ButtonAreaUnderCursor==ButtonAreaTraining ) {
-		if( !GameObserve && !GamePaused ) {
-		    if( ButtonUnderCursor<Selected[0]->Data.Train.Count ) {
-			DebugLevel0Fn("Cancel slot %d %s\n" _C_
-			    ButtonUnderCursor _C_
-			    Selected[0]->Data.Train.What[ButtonUnderCursor]->Ident);
-			SendCommandCancelTraining(Selected[0],
-			    ButtonUnderCursor,
-			    Selected[0]->Data.Train.What[ButtonUnderCursor]);
+		else if( NumSelected==1 && Selected[0]->Type->Building &&
+		         Selected[0]->Orders[0].Action==UnitActionTrain) {
+		    if( !GameObserve && !GamePaused ) {
+			int slotid = ButtonUnderCursor-4;
+			if ( Selected[0]->Data.Train.Count == 1 ) {
+			    // FIXME: ignore clicks that did not hit
+			    // FIXME: with only one unit being built, this
+			    // unit is displayed between two slots.
+			    slotid = 0;
+			}
+			if ( slotid < Selected[0]->Data.Train.Count ) {
+			    DebugLevel0Fn("Cancel slot %d %s\n" _C_
+				slotid _C_
+				Selected[0]->Data.Train.What[slotid]
+				    ->Ident);
+			    SendCommandCancelTraining(Selected[0],
+				slotid,
+				Selected[0]->Data.Train.What[slotid]);
+			}
 		    }
 		}
 	    //
 	    //	clicked on button panel
 	    //
-	    } else if( ButtonAreaUnderCursor==ButtonAreaButton ) {
+	    } else if( ButtonUnderCursor>9 ) {
 		if( !GameObserve && !GamePaused ) {
-		    DoButtonButtonClicked(ButtonUnderCursor);
+		    DoButtonButtonClicked(ButtonUnderCursor-10);
 		}
 	    }
 	} else if( (MouseButtons&MiddleButton) ) {
 	    //
 	    //	clicked on info panel - single unit shown
 	    //
-	    if( ButtonAreaUnderCursor==ButtonAreaInfo
-		    && ButtonUnderCursor==0 && NumSelected==1 ) {
+	    if( ButtonUnderCursor==1 && NumSelected==1 ) {
 		PlayGameSound(GameSounds.Click.Sound,MaxSampleVolume);
 		if( TheUI.SelectedViewport->Unit == Selected[0] ) {
 		    TheUI.SelectedViewport->Unit = NULL;
@@ -1621,9 +1553,7 @@ global void UIHandleButtonUp(unsigned button)
     if( (1<<button) == LeftButton && GameMenuButtonClicked == 1 ) {
 	GameMenuButtonClicked = 0;
 	MustRedraw|=RedrawMenuButton;
-	if( ButtonAreaUnderCursor==ButtonAreaMenu
-		&& (ButtonUnderCursor==ButtonUnderMenu
-		    || ButtonUnderCursor==ButtonUnderNetworkMenu) ) {
+	if( ButtonUnderCursor == 0 ) {
 	    // FIXME: Not if, in input mode.
 	    if( NetworkFildes==-1 ) {
 		GamePaused=1;
@@ -1634,20 +1564,6 @@ global void UIHandleButtonUp(unsigned button)
 	}
     }
 
-    //
-    //	Diplomacy button
-    //
-    if( (1<<button) == LeftButton && GameDiplomacyButtonClicked == 1 ) {
-	GameDiplomacyButtonClicked = 0;
-	MustRedraw|=RedrawMenuButton;
-	if( ButtonAreaUnderCursor==ButtonAreaMenu
-		&& ButtonUnderCursor==ButtonUnderNetworkDiplomacy) {
-	    // FIXME: Not if, in input mode.
-	    ProcessMenu("menu-diplomacy",0);
-	    return;
-	}
-    }
-
     // FIXME: should be completly rewritten
     // FIXME: must selecting!  (lokh: what does this mean? is this done now?)
 
@@ -1721,10 +1637,10 @@ global void UIHandleButtonUp(unsigned button)
 	    if( IsMapFieldVisible(ThisPlayer,
 			Viewport2MapX(TheUI.MouseViewport,CursorX),
 			Viewport2MapY(TheUI.MouseViewport,CursorY)) || ReplayRevealMap ) {
-		unit=UnitOnScreen(unit,
-		    CursorX-TheUI.MouseViewport->X+
-			TheUI.MouseViewport->MapX*TileSizeX,
-		    CursorY-TheUI.MouseViewport->Y+
+		unit=UnitOnScreen(unit
+		    ,CursorX-TheUI.MouseViewport->X+
+			TheUI.MouseViewport->MapX*TileSizeX
+		    ,CursorY-TheUI.MouseViewport->Y+
 			TheUI.MouseViewport->MapY*TileSizeY);
 	    }
 	    if( unit ) {
diff --git a/src/ui/script_ui.cpp b/src/ui/script_ui.cpp
index 04b3aecb1..578d16fe8 100644
--- a/src/ui/script_ui.cpp
+++ b/src/ui/script_ui.cpp
@@ -530,83 +530,753 @@ local SCM CclSetGameCursor(SCM ident)
 }
 
 /**
-**	Define a menu item
+**	Define the look+feel of the user interface.
 **
 **	FIXME: need some general data structure to make this parsing easier.
-**
-**	@param value	Button type.
+**	FIXME: use the new tagged config format.
 */
-local MenuButtonId scm2buttonid(SCM value)
+local SCM CclDefineUI(SCM list)
 {
-    MenuButtonId id;
+    SCM value;
+    SCM temp;
+    char* str;
+    int	x;
+    int	y;
+    int i;
+    UI* ui;
+    void* v;
+    MenuPanel** menupanel;
 
-    if ( gh_eq_p(value, gh_symbol2scm("main")) ) {
-        id=MBUTTON_MAIN;
-    } else if ( gh_eq_p(value, gh_symbol2scm("network")) ) {
-        id=MBUTTON_NETWORK;
-    } else if ( gh_eq_p(value, gh_symbol2scm("gm-half")) ) {
-        id=MBUTTON_GM_HALF;
-    } else if ( gh_eq_p(value, gh_symbol2scm("132")) ) {
-        id=MBUTTON_132;
-    } else if ( gh_eq_p(value, gh_symbol2scm("gm-full")) ) {
-        id=MBUTTON_GM_FULL;
-    } else if ( gh_eq_p(value, gh_symbol2scm("gem-round")) ) {
-        id=MBUTTON_GEM_ROUND;
-    } else if ( gh_eq_p(value, gh_symbol2scm("gem-square")) ) {
-        id=MBUTTON_GEM_SQUARE;
-    } else if ( gh_eq_p(value, gh_symbol2scm("up-arrow")) ) {
-        id=MBUTTON_UP_ARROW;
-    } else if ( gh_eq_p(value, gh_symbol2scm("down-arrow")) ) {
-        id=MBUTTON_DOWN_ARROW;
-    } else if ( gh_eq_p(value, gh_symbol2scm("left-arrow")) ) {
-        id=MBUTTON_LEFT_ARROW;
-    } else if ( gh_eq_p(value, gh_symbol2scm("right-arrow")) ) {
-        id=MBUTTON_RIGHT_ARROW;
-    } else if ( gh_eq_p(value, gh_symbol2scm("s-knob")) ) {
-        id=MBUTTON_S_KNOB;
-    } else if ( gh_eq_p(value, gh_symbol2scm("s-vcont")) ) {
-        id=MBUTTON_S_VCONT;
-    } else if ( gh_eq_p(value, gh_symbol2scm("s-hcont")) ) {
-        id=MBUTTON_S_HCONT;
-    } else if ( gh_eq_p(value, gh_symbol2scm("pulldown")) ) {
-        id=MBUTTON_PULLDOWN;
-    } else if ( gh_eq_p(value, gh_symbol2scm("vthin")) ) {
-        id=MBUTTON_VTHIN;
-    } else if ( gh_eq_p(value, gh_symbol2scm("folder")) ) {
-        id=MBUTTON_FOLDER;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-gem-round")) ) {
-        id=MBUTTON_SC_GEM_ROUND;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-gem-square")) ) {
-        id=MBUTTON_SC_GEM_SQUARE;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-up-arrow")) ) {
-        id=MBUTTON_SC_UP_ARROW;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-down-arrow")) ) {
-        id=MBUTTON_SC_DOWN_ARROW;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-left-arrow")) ) {
-        id=MBUTTON_SC_LEFT_ARROW;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-right-arrow")) ) {
-        id=MBUTTON_SC_RIGHT_ARROW;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-knob")) ) {
-        id=MBUTTON_SC_S_KNOB;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-vcont")) ) {
-        id=MBUTTON_SC_S_VCONT;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-hcont")) ) {
-        id=MBUTTON_SC_S_HCONT;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-pulldown")) ) {
-        id=MBUTTON_SC_PULLDOWN;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-button-left")) ) {
-        id=MBUTTON_SC_BUTTON_LEFT;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-button")) ) {
-        id=MBUTTON_SC_BUTTON;
-    } else if ( gh_eq_p(value, gh_symbol2scm("sc-button-right")) ) {
-        id=MBUTTON_SC_BUTTON_RIGHT;
-    } else {
-	char *s1=gh_scm2newstr(value, NULL);
-        fprintf(stderr, "Unsupported button %s\n", s1);
-        free(s1);
-	return 0;
+    //	Get identifier
+    value=gh_car(list);
+    list=gh_cdr(list);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(list);
+    list=gh_cdr(list);
+    x=gh_scm2int(value);
+    value=gh_car(list);
+    list=gh_cdr(list);
+    y=gh_scm2int(value);
+
+    // Find slot: new or redefinition
+    ui=NULL;
+    i=0;
+    if( UI_Table ) {
+	for( ; UI_Table[i]; ++i ) {
+	    if( UI_Table[i]->Width==x && UI_Table[i]->Height==y
+		    && !strcmp(UI_Table[i]->Name,str) ) {
+		ui=UI_Table[i];
+		break;
+	    }
+	}
     }
-    return id;
+    if( !ui ) {
+	ui=calloc(1,sizeof(UI));
+	v=malloc(sizeof(UI*)*(i+2));
+	memcpy(v,UI_Table,i*sizeof(UI*));
+	free(UI_Table);
+	UI_Table=v;
+	UI_Table[i]=ui;
+	UI_Table[i+1]=NULL;
+    }
+
+    free(ui->Name);
+    ui->Name=str;
+    ui->Width=x;
+    ui->Height=y;
+
+    //
+    //	Some value defaults
+    //
+
+    // This save the setup values FIXME: They are set by CCL.
+
+    ui->Contrast=TheUI.Contrast;
+    ui->Brightness=TheUI.Brightness;
+    ui->Saturation=TheUI.Saturation;
+
+    ui->MouseScroll=TheUI.MouseScroll;
+    ui->KeyScroll=TheUI.KeyScroll;
+    ui->ReverseMouseMove=TheUI.ReverseMouseMove;
+
+    ui->WarpX=-1;
+    ui->WarpY=-1;
+
+    ui->MouseAdjust=TheUI.MouseAdjust;
+    ui->MouseScale=TheUI.MouseScale;
+
+    ui->OriginalResources=TheUI.OriginalResources;
+
+    //
+    //	Now the real values.
+    //
+
+    //	Filler 1
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    for( i=0; i<ui->NumFillers; ++i ) {
+	free(ui->Filler[i].File);
+    }
+    free(ui->Filler);
+    free(ui->FillerX);
+    free(ui->FillerY);
+
+    ui->NumFillers=1;
+    ui->Filler=malloc(ui->NumFillers*sizeof(*ui->Filler));
+    ui->FillerX=malloc(ui->NumFillers*sizeof(*ui->FillerX));
+    ui->FillerY=malloc(ui->NumFillers*sizeof(*ui->FillerY));
+
+    ui->Filler[0].File=str;
+    ui->FillerX[0]=x;
+    ui->FillerY[0]=y;
+
+    //	Resource
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->Resource.File);
+    ui->Resource.File=str;
+    ui->ResourceX=x;
+    ui->ResourceY=y;
+
+    //
+    //	Parse icons
+    //
+    for( i=1; i<MaxCosts; ++i ) {
+	// icon
+	temp=gh_car(list);
+	list=gh_cdr(list);
+
+	if( gh_null_p(temp) ) {
+	    free(ui->Resources[i].Icon.File);
+	    ui->Resources[i].Icon.File=NULL;
+	    ui->Resources[i].Icon.Graphic=NULL;
+	    ui->Resources[i].IconRow=0;
+	    ui->Resources[i].IconX=0;
+	    ui->Resources[i].IconY=0;
+	    ui->Resources[i].IconW=0;
+	    ui->Resources[i].IconH=0;
+	    ui->Resources[i].TextX=0;
+	    ui->Resources[i].TextY=0;
+	    continue;
+	}
+
+	if( !gh_list_p(temp) ) {
+	    fprintf(stderr,"list expected\n");
+	    return SCM_UNSPECIFIED;
+	}
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	str=gh_scm2newstr(value,NULL);
+	free(ui->Resources[i].Icon.File);
+	ui->Resources[i].Icon.File=str;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Resources[i].IconRow=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Resources[i].IconX=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Resources[i].IconY=y;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Resources[i].IconW=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Resources[i].IconH=y;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Resources[i].TextX=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Resources[i].TextY=y;
+    }
+
+    //	Food icon
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->FoodIcon.File);
+    ui->FoodIcon.File=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    i=gh_scm2int(value);
+    ui->FoodIconRow=i;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->FoodIconX=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->FoodIconY=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->FoodIconW=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->FoodIconH=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->FoodTextX=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->FoodTextY=y;
+
+    //	Score icon
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ScoreIcon.File);
+    ui->ScoreIcon.File=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    i=gh_scm2int(value);
+    ui->ScoreIconRow=i;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->ScoreIconX=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->ScoreIconY=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->ScoreIconW=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->ScoreIconH=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->ScoreTextX=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->ScoreTextY=y;
+
+    //	InfoPanel
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->InfoPanel.File);
+    ui->InfoPanel.File=str;
+    ui->InfoPanelX=x;
+    ui->InfoPanelY=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->InfoPanelW=x;
+    ui->InfoPanelH=y;
+
+    // Completed bar
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    i=gh_scm2int(value);
+    ui->CompleteBarColor=i;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->CompleteBarX=x;
+    ui->CompleteBarY=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->CompleteTextX=x;
+    ui->CompleteTextY=y;
+
+    //	ButtonPanel
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->ButtonPanel.File);
+    ui->ButtonPanel.File=str;
+    ui->ButtonPanelX=x;
+    ui->ButtonPanelY=y;
+
+    // The map
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->MapArea.X=x;
+    ui->MapArea.Y=y;
+    if ( ui->MapArea.X < 0 || ui->MapArea.Y < 0 ) {
+	fprintf(stderr,"map top-left point expected\n");
+	return SCM_UNSPECIFIED;
+    }
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    //StephanR: note that the bottom-right point is one pixel off
+    ui->MapArea.EndX = x-1;
+    ui->MapArea.EndY = y-1;
+    if ( x < 1 || y < 1 || ui->MapArea.EndX < ui->MapArea.X ||
+				ui->MapArea.EndY < ui->MapArea.Y ) {
+	fprintf(stderr,"map bottom-right point expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    //	MenuButton
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->MenuButton.File);
+    ui->MenuButton.File=str;
+    ui->MenuButtonX=x;
+    ui->MenuButtonY=y;
+
+    //	Minimap
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->Minimap.File);
+    ui->Minimap.File=str;
+    ui->MinimapX=x;
+    ui->MinimapY=y;
+
+    //	StatusLine
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->StatusLine.File);
+    ui->StatusLine.File=str;
+    ui->StatusLineX=x;
+    ui->StatusLineY=y;
+
+    // Buttons
+    for( i=0; i<MaxButtons; ++i ) {
+	temp=gh_car(list);
+	list=gh_cdr(list);
+
+	if( !gh_list_p(temp) ) {
+	    fprintf(stderr,"list expected\n");
+	    return SCM_UNSPECIFIED;
+	}
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Buttons[i].X=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Buttons[i].Y=y;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Buttons[i].Width=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Buttons[i].Height=y;
+    }
+    for( i=0; i<6; ++i ) {
+	temp=gh_car(list);
+	list=gh_cdr(list);
+
+	if( !gh_list_p(temp) ) {
+	    fprintf(stderr,"list expected\n");
+	    return SCM_UNSPECIFIED;
+	}
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Buttons2[i].X=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Buttons2[i].Y=y;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Buttons2[i].Width=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Buttons2[i].Height=y;
+    }
+
+    //
+    //	Get the cursors definitions.
+    //
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->Point.Name);
+    ui->Point.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->Glass.Name);
+    ui->Glass.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->Cross.Name);
+    ui->Cross.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->YellowHair.Name);
+    ui->YellowHair.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->GreenHair.Name);
+    ui->GreenHair.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->RedHair.Name);
+    ui->RedHair.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->Scroll.Name);
+    ui->Scroll.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowE.Name);
+    ui->ArrowE.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowNE.Name);
+    ui->ArrowNE.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowN.Name);
+    ui->ArrowN.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowNW.Name);
+    ui->ArrowNW.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowW.Name);
+    ui->ArrowW.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowSW.Name);
+    ui->ArrowSW.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowS.Name);
+    ui->ArrowS.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowSE.Name);
+    ui->ArrowSE.Name=str;
+
+    //
+    //	Panels
+    //
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    menupanel=&ui->MenuPanels;
+    while( *menupanel ) {
+	menupanel=&(*menupanel)->Next;
+    }
+    (*menupanel)=calloc(1,sizeof(**menupanel));
+    (*menupanel)->Ident=strdup("panel1");
+    (*menupanel)->Panel.File=str;
+
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    while( *menupanel ) {
+	menupanel=&(*menupanel)->Next;
+    }
+    (*menupanel)=calloc(1,sizeof(**menupanel));
+    (*menupanel)->Ident=strdup("panel2");
+    (*menupanel)->Panel.File=str;
+
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    while( *menupanel ) {
+	menupanel=&(*menupanel)->Next;
+    }
+    (*menupanel)=calloc(1,sizeof(**menupanel));
+    (*menupanel)->Ident=strdup("panel3");
+    (*menupanel)->Panel.File=str;
+
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    while( *menupanel ) {
+	menupanel=&(*menupanel)->Next;
+    }
+    (*menupanel)=calloc(1,sizeof(**menupanel));
+    (*menupanel)->Ident=strdup("panel4");
+    (*menupanel)->Panel.File=str;
+
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    while( *menupanel ) {
+	menupanel=&(*menupanel)->Next;
+    }
+    (*menupanel)=calloc(1,sizeof(**menupanel));
+    (*menupanel)->Ident=strdup("panel5");
+    (*menupanel)->Panel.File=str;
+
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->VictoryBackground.File);
+    ui->VictoryBackground.File=str;
+
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->DefeatBackground.File);
+    ui->DefeatBackground.File=str;
+
+    return SCM_UNSPECIFIED;
 }
 
 /**
@@ -614,10 +1284,10 @@ local MenuButtonId scm2buttonid(SCM value)
 **
 **	@param list	Tagged list of the user interface configuration.
 */
-local SCM CclDefineUI(SCM list)
+local SCM CclDefineNewUI(SCM list)
 {
     SCM value;
-    SCM sublist;
+    //SCM temp;
     char* str;
     int	x;
     int	y;
@@ -687,20 +1357,6 @@ local SCM CclDefineUI(SCM list)
 
     ui->OriginalResources=TheUI.OriginalResources;
 
-    ui->MenuButton.X=-1;
-    ui->NetworkMenuButton.X=-1;
-    ui->NetworkDiplomacyButton.X=-1;
-    ui->MinimapX=-1;
-    ui->StatusLineX=-1;
-    ui->InfoPanelX=-1;
-    ui->InfoPanelW=-1;
-    ui->CompleteBarX=-1;
-    ui->ButtonPanelX=-1;
-    ui->MessageAreaX=-1;
-    for( i=0; i<MaxCosts+2; ++i ) {
-	ui->Resources[i].TextX=-1;
-    }
-
     //
     //	Now the real values.
     //
@@ -715,623 +1371,664 @@ local SCM CclDefineUI(SCM list)
 	    value=gh_car(list);
 	    list=gh_cdr(list);
 	    ui->ReverseFontColor=gh_scm2newstr(value,NULL);
-	} else if( gh_eq_p(value,gh_symbol2scm("panel")) ) {
-	    sublist=gh_car(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("filler")) ) {
+	    value=gh_car(list);
 	    list=gh_cdr(list);
-	    ui->NumPanels++;
-	    ui->Panel=realloc(ui->Panel,ui->NumPanels*sizeof(*ui->Panel));
-	    ui->PanelX=realloc(ui->PanelX,ui->NumPanels*sizeof(*ui->PanelX));
-	    ui->PanelY=realloc(ui->PanelY,ui->NumPanels*sizeof(*ui->PanelY));
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("file")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->Panel[ui->NumPanels-1].File=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->PanelX[ui->NumPanels-1]=gh_scm2int(gh_car(value));
-		    ui->PanelY[ui->NumPanels-1]=gh_scm2int(gh_car(gh_cdr(value)));
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
 	} else if( gh_eq_p(value,gh_symbol2scm("resources")) ) {
-	    sublist=gh_car(list);
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("info-panel")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("button-panel")) ) {
+	    value=gh_car(list);
 	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		SCM slist;
-		int res;
-		char* name;
-
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		name=gh_scm2newstr(value,NULL);
-		for( res=0; res<MaxCosts; ++res ) {
-		    if( !strcmp(name,DefaultResourceNames[res]) ) {
-			break;
-		    }
-		}
-		if( res==MaxCosts ) {
-		    if( !strcmp(name,"food") ) {
-			res=FoodCost;
-		    } else if( !strcmp(name,"score") ) {
-			res=ScoreCost;
-		    } else {
-			errl("Resource not found",value);
-		    }
-		}
-		free(name);
-		slist=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		while( !gh_null_p(slist) ) {
-		    value=gh_car(slist);
-		    slist=gh_cdr(slist);
-		    if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-			value=gh_car(slist);
-			slist=gh_cdr(slist);
-			ui->Resources[res].IconX=gh_scm2int(gh_car(value));
-			ui->Resources[res].IconY=gh_scm2int(gh_car(gh_cdr(value)));
-		    } else if( gh_eq_p(value,gh_symbol2scm("file")) ) {
-			value=gh_car(slist);
-			slist=gh_cdr(slist);
-			ui->Resources[res].Icon.File=gh_scm2newstr(value,NULL);
-		    } else if( gh_eq_p(value,gh_symbol2scm("row")) ) {
-			value=gh_car(slist);
-			slist=gh_cdr(slist);
-			ui->Resources[res].IconRow=gh_scm2int(value);
-		    } else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-			value=gh_car(slist);
-			slist=gh_cdr(slist);
-			ui->Resources[res].IconW=gh_scm2int(gh_car(value));
-			ui->Resources[res].IconH=gh_scm2int(gh_car(gh_cdr(value)));
-		    } else if( gh_eq_p(value,gh_symbol2scm("text-pos")) ) {
-			value=gh_car(slist);
-			slist=gh_cdr(slist);
-			ui->Resources[res].TextX=gh_scm2int(gh_car(value));
-			ui->Resources[res].TextY=gh_scm2int(gh_car(gh_cdr(value)));
-		    } else {
-			errl("Unsupported tag",value);
-		    }
-		}
-	    }
 	} else if( gh_eq_p(value,gh_symbol2scm("map-area")) ) {
-	    int w;
-	    int h;
-
-	    w=0;
-	    h=0;
-	    sublist=gh_car(list);
+	    value=gh_car(list);
 	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MapArea.X=gh_scm2int(gh_car(value));
-		    ui->MapArea.Y=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    w=gh_scm2int(gh_car(value));
-		    h=gh_scm2int(gh_car(gh_cdr(value)));
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
-	    ui->MapArea.EndX=ui->MapArea.X+w-1;
-	    ui->MapArea.EndY=ui->MapArea.Y+h-1;
-	} else if( gh_eq_p(value,gh_symbol2scm("info-area")) ) {
-	    int minx;
-	    int miny;
-	    int maxx;
-	    int maxy;
-
-	    minx=miny=9999;
-	    maxx=maxy=0;
-
-	    sublist=gh_car(list);
-	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->InfoPanelX=gh_scm2int(gh_car(value));
-		    ui->InfoPanelY=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("panel")) ) {
-		    SCM slist;
-
-		    slist=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    while( !gh_null_p(slist) ) {
-			value=gh_car(slist);
-			slist=gh_cdr(slist);
-			if( gh_eq_p(value,gh_symbol2scm("file")) ) {
-			    value=gh_car(slist);
-			    slist=gh_cdr(slist);
-			    ui->InfoPanel.File=gh_scm2newstr(value,NULL);
-			} else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-			    value=gh_car(slist);
-			    slist=gh_cdr(slist);
-			    ui->InfoPanelW=gh_scm2int(gh_car(value));
-			    ui->InfoPanelH=gh_scm2int(gh_car(gh_cdr(value)));
-			} else {
-			    errl("Unsupported tag",value);
-			}
-		    }
-		} else if( gh_eq_p(value,gh_symbol2scm("neutral-frame")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->InfoPanelNeutralFrame=gh_scm2int(value);
-		} else if( gh_eq_p(value,gh_symbol2scm("selected-frame")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->InfoPanelSelectedFrame=gh_scm2int(value);
-		} else if( gh_eq_p(value,gh_symbol2scm("magic-frame")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->InfoPanelMagicFrame=gh_scm2int(value);
-		} else if( gh_eq_p(value,gh_symbol2scm("construction-frame")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->InfoPanelConstructionFrame=gh_scm2int(value);
-		} else if( gh_eq_p(value,gh_symbol2scm("completed-bar")) ) {
-		    SCM slist;
-
-		    slist=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    while( !gh_null_p(slist) ) {
-			value=gh_car(slist);
-			slist=gh_cdr(slist);
-			if( gh_eq_p(value,gh_symbol2scm("color")) ) {
-			    value=gh_car(slist);
-			    slist=gh_cdr(slist);
-			    ui->CompleteBarColor=gh_scm2int(value);
-			} else if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-			    value=gh_car(slist);
-			    slist=gh_cdr(slist);
-			    ui->CompleteBarX=gh_scm2int(gh_car(value));
-			    ui->CompleteBarY=gh_scm2int(gh_car(gh_cdr(value)));
-			} else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-			    value=gh_car(slist);
-			    slist=gh_cdr(slist);
-			    ui->CompleteBarW=gh_scm2int(gh_car(value));
-			    ui->CompleteBarH=gh_scm2int(gh_car(gh_cdr(value)));
-			} else if( gh_eq_p(value,gh_symbol2scm("text")) ) {
-			    value=gh_car(slist);
-			    slist=gh_cdr(slist);
-			    ui->CompleteBarText=gh_scm2newstr(value,NULL);
-			} else if( gh_eq_p(value,gh_symbol2scm("font")) ) {
-			    value=gh_car(slist);
-			    slist=gh_cdr(slist);
-			    ui->CompleteBarFont=CclFontByIdentifier(value);
-			} else if( gh_eq_p(value,gh_symbol2scm("text-pos")) ) {
-			    value=gh_car(slist);
-			    slist=gh_cdr(slist);
-			    ui->CompleteTextX=gh_scm2int(gh_car(value));
-			    ui->CompleteTextY=gh_scm2int(gh_car(gh_cdr(value)));
-			} else {
-			    errl("Unsupported tag",value);
-			}
-		    }
-		} else if( gh_eq_p(value,gh_symbol2scm("buttons")) ) {
-		    SCM slist;
-		    SCM sslist;
-		    Button* b;
-
-		    slist=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    while( !gh_null_p(slist) ) {
-			sslist=gh_car(slist);
-			slist=gh_cdr(slist);
-			ui->NumInfoButtons++;
-			ui->InfoButtons=realloc(ui->InfoButtons,
-				ui->NumInfoButtons*sizeof(*ui->InfoButtons));
-			b=&ui->InfoButtons[ui->NumInfoButtons-1];
-			while( !gh_null_p(sslist) ) {
-			    value=gh_car(sslist);
-			    sslist=gh_cdr(sslist);
-			    if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-				value=gh_car(sslist);
-				sslist=gh_cdr(sslist);
-				b->X=gh_scm2int(gh_car(value));
-				b->Y=gh_scm2int(gh_car(gh_cdr(value)));
-			    } else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-				value=gh_car(sslist);
-				sslist=gh_cdr(sslist);
-				b->Width=gh_scm2int(gh_car(value));
-				b->Height=gh_scm2int(gh_car(gh_cdr(value)));
-			    } else {
-				errl("Unsupported tag",value);
-			    }
-			}
-			if( b->X<minx ) {
-			    minx=b->X;
-			}
-			if( b->Y<miny ) {
-			    miny=b->Y;
-			}
-			if( b->X+b->Width>maxx ) {
-			    maxx=b->X+b->Width;
-			}
-			if( b->Y+b->Height>maxy ) {
-			    maxy=b->Y+b->Height;
-			}
-		    }
-		} else if( gh_eq_p(value,gh_symbol2scm("training-buttons")) ) {
-		    SCM slist;
-		    SCM sslist;
-		    Button* b;
-
-		    slist=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    while( !gh_null_p(slist) ) {
-			sslist=gh_car(slist);
-			slist=gh_cdr(slist);
-			ui->NumTrainingButtons++;
-			ui->TrainingButtons=realloc(ui->TrainingButtons,
-				ui->NumTrainingButtons*sizeof(*ui->TrainingButtons));
-			b=&ui->TrainingButtons[ui->NumTrainingButtons-1];
-			while( !gh_null_p(sslist) ) {
-			    value=gh_car(sslist);
-			    sslist=gh_cdr(sslist);
-			    if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-				value=gh_car(sslist);
-				sslist=gh_cdr(sslist);
-				b->X=gh_scm2int(gh_car(value));
-				b->Y=gh_scm2int(gh_car(gh_cdr(value)));
-			    } else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-				value=gh_car(sslist);
-				sslist=gh_cdr(sslist);
-				b->Width=gh_scm2int(gh_car(value));
-				b->Height=gh_scm2int(gh_car(gh_cdr(value)));
-			    } else {
-				errl("Unsupported tag",value);
-			    }
-			}
-			if( b->X<minx ) {
-			    minx=b->X;
-			}
-			if( b->Y<miny ) {
-			    miny=b->Y;
-			}
-			if( b->X+b->Width>maxx ) {
-			    maxx=b->X+b->Width;
-			}
-			if( b->Y+b->Height>maxy ) {
-			    maxy=b->Y+b->Height;
-			}
-		    }
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
-	    if( ui->InfoPanelX==-1 ) {
-		ui->InfoPanelX=minx;
-		ui->InfoPanelY=miny;
-	    }
-	    if( ui->InfoPanelW==-1 ) {
-		ui->InfoPanelW=maxx-ui->InfoPanelX;
-		ui->InfoPanelH=maxy-ui->InfoPanelY;
-	    }
-	} else if( gh_eq_p(value,gh_symbol2scm("button-area")) ) {
-	    sublist=gh_car(list);
-	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("buttons")) ) {
-		    SCM slist;
-		    SCM sslist;
-		    Button* b;
-
-		    slist=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    while( !gh_null_p(slist) ) {
-			sslist=gh_car(slist);
-			slist=gh_cdr(slist);
-			ui->NumButtonButtons++;
-			ui->ButtonButtons=realloc(ui->ButtonButtons,
-				ui->NumButtonButtons*sizeof(*ui->ButtonButtons));
-			b=&ui->ButtonButtons[ui->NumButtonButtons-1];
-			while( !gh_null_p(sslist) ) {
-			    value=gh_car(sslist);
-			    sslist=gh_cdr(sslist);
-			    if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-				value=gh_car(sslist);
-				sslist=gh_cdr(sslist);
-				b->X=gh_scm2int(gh_car(value));
-				b->Y=gh_scm2int(gh_car(gh_cdr(value)));
-			    } else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-				value=gh_car(sslist);
-				sslist=gh_cdr(sslist);
-				b->Width=gh_scm2int(gh_car(value));
-				b->Height=gh_scm2int(gh_car(gh_cdr(value)));
-			    } else {
-				errl("Unsupported tag",value);
-			    }
-			}
-			if( ui->NumButtonButtons==1
-				|| b->X<ui->ButtonPanelX ) {
-			    ui->ButtonPanelX=b->X;
-			}
-			if( ui->NumButtonButtons==1
-				|| b->X+b->Width>ui->ButtonPanelEndX ) {
-			    ui->ButtonPanelEndX=b->X+b->Width;
-			}
-			if( ui->NumButtonButtons==1
-				|| b->Y<ui->ButtonPanelY ) {
-			    ui->ButtonPanelY=b->Y;
-			}
-			if( ui->NumButtonButtons==1
-				|| b->Y+b->Height>ui->ButtonPanelEndY ) {
-			    ui->ButtonPanelEndY=b->Y+b->Height;
-			}
-		    }
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
-	} else if( gh_eq_p(value,gh_symbol2scm("minimap-area")) ) {
-	    sublist=gh_car(list);
-	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MinimapX=gh_scm2int(gh_car(value));
-		    ui->MinimapY=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MinimapW=gh_scm2int(gh_car(value));
-		    ui->MinimapH=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("cursor-color")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MinimapCursorColor=gh_scm2int(value);
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
-	} else if( gh_eq_p(value,gh_symbol2scm("status-line")) ) {
-	    sublist=gh_car(list);
-	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("font")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->StatusLineFont=CclFontByIdentifier(value);
-		} else if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->StatusLineX=gh_scm2int(gh_car(value));
-		    ui->StatusLineY=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("width")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->StatusLineW=gh_scm2int(value);
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
 	} else if( gh_eq_p(value,gh_symbol2scm("menu-button")) ) {
-	    sublist=gh_car(list);
+	    value=gh_car(list);
 	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MenuButton.X=gh_scm2int(gh_car(value));
-		    ui->MenuButton.Y=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MenuButton.Width=gh_scm2int(gh_car(value));
-		    ui->MenuButton.Height=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("caption")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MenuButton.Text=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("style")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MenuButton.Button=scm2buttonid(value);
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
-	} else if( gh_eq_p(value,gh_symbol2scm("network-menu-button")) ) {
-	    sublist=gh_car(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("minimap")) ) {
+	    value=gh_car(list);
 	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->NetworkMenuButton.X=gh_scm2int(gh_car(value));
-		    ui->NetworkMenuButton.Y=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->NetworkMenuButton.Width=gh_scm2int(gh_car(value));
-		    ui->NetworkMenuButton.Height=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("caption")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->NetworkMenuButton.Text=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("style")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->NetworkMenuButton.Button=scm2buttonid(value);
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
-	} else if( gh_eq_p(value,gh_symbol2scm("network-diplomacy-button")) ) {
-	    sublist=gh_car(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("status-line")) ) {
+	    value=gh_car(list);
 	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->NetworkDiplomacyButton.X=gh_scm2int(gh_car(value));
-		    ui->NetworkDiplomacyButton.Y=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("size")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->NetworkDiplomacyButton.Width=gh_scm2int(gh_car(value));
-		    ui->NetworkDiplomacyButton.Height=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("caption")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->NetworkDiplomacyButton.Text=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("style")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->NetworkDiplomacyButton.Button=scm2buttonid(value);
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
-	} else if( gh_eq_p(value,gh_symbol2scm("message-area")) ) {
-	    sublist=gh_car(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("buttons")) ) {
+	    value=gh_car(list);
+	    list=gh_cdr(list);
+	} else if( gh_eq_p(value,gh_symbol2scm("buttons-2")) ) {
+	    value=gh_car(list);
 	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("font")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MessageAreaFont=CclFontByIdentifier(value);
-		} else if( gh_eq_p(value,gh_symbol2scm("pos")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MessageAreaX=gh_scm2int(gh_car(value));
-		    ui->MessageAreaY=gh_scm2int(gh_car(gh_cdr(value)));
-		} else if( gh_eq_p(value,gh_symbol2scm("width")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->MessageAreaW=gh_scm2int(value);
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
 	} else if( gh_eq_p(value,gh_symbol2scm("cursors")) ) {
-	    sublist=gh_car(list);
-	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		if( gh_eq_p(value,gh_symbol2scm("point")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->Point.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("glass")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->Glass.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("cross")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->Cross.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("yellow")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->YellowHair.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("green")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->GreenHair.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("red")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->RedHair.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("scroll")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->Scroll.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("arrow-e")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->ArrowE.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("arrow-ne")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->ArrowNE.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("arrow-n")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->ArrowN.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("arrow-nw")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->ArrowNW.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("arrow-w")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->ArrowW.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("arrow-sw")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->ArrowSW.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("arrow-s")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->ArrowS.Name=gh_scm2newstr(value,NULL);
-		} else if( gh_eq_p(value,gh_symbol2scm("arrow-se")) ) {
-		    value=gh_car(sublist);
-		    sublist=gh_cdr(sublist);
-		    ui->ArrowSE.Name=gh_scm2newstr(value,NULL);
-		} else {
-		    errl("Unsupported tag",value);
-		}
-	    }
-	} else if( gh_eq_p(value,gh_symbol2scm("victory-background")) ) {
 	    value=gh_car(list);
 	    list=gh_cdr(list);
-	    ui->VictoryBackground.File=gh_scm2newstr(value,NULL);
-	} else if( gh_eq_p(value,gh_symbol2scm("defeat-background")) ) {
+	} else if( gh_eq_p(value,gh_symbol2scm("panels")) ) {
 	    value=gh_car(list);
 	    list=gh_cdr(list);
-	    ui->DefeatBackground.File=gh_scm2newstr(value,NULL);
-	} else if( gh_eq_p(value,gh_symbol2scm("menu-panels")) ) {
-	    sublist=gh_car(list);
-	    list=gh_cdr(list);
-	    while( !gh_null_p(sublist) ) {
-		MenuPanel** menupanel;
-
-		menupanel=&ui->MenuPanels;
-		while( *menupanel ) {
-		    menupanel=&(*menupanel)->Next;
-		}
-		*menupanel=calloc(1,sizeof(**menupanel));
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		(*menupanel)->Ident=gh_scm2newstr(value,NULL);
-		value=gh_car(sublist);
-		sublist=gh_cdr(sublist);
-		(*menupanel)->Panel.File=gh_scm2newstr(value,NULL);
-	    }
 	} else {
 	    errl("Unsupported tag",value);
 	}
     }
 
+#if 0
+    //	Filler 1
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->Filler1.File);
+    ui->Filler1.File=str;
+    ui->Filler1X=x;
+    ui->Filler1Y=y;
+
+    //	Resource
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->Resource.File);
+    ui->Resource.File=str;
+    ui->ResourceX=x;
+    ui->ResourceY=y;
+
+    //
+    //	Parse icons
+    //
+    for( i=1; i<MaxCosts; ++i ) {
+	// icon
+	temp=gh_car(list);
+	list=gh_cdr(list);
+
+	if( gh_null_p(temp) ) {
+	    free(ui->Resources[i].Icon.File);
+	    ui->Resources[i].Icon.File=NULL;
+	    ui->Resources[i].Icon.Graphic=NULL;
+	    ui->Resources[i].IconRow=0;
+	    ui->Resources[i].IconX=0;
+	    ui->Resources[i].IconY=0;
+	    ui->Resources[i].IconW=0;
+	    ui->Resources[i].IconH=0;
+	    ui->Resources[i].TextX=0;
+	    ui->Resources[i].TextY=0;
+	    continue;
+	}
+
+	if( !gh_list_p(temp) ) {
+	    fprintf(stderr,"list expected\n");
+	    return SCM_UNSPECIFIED;
+	}
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	str=gh_scm2newstr(value,NULL);
+	free(ui->Resources[i].Icon.File);
+	ui->Resources[i].Icon.File=str;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Resources[i].IconRow=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Resources[i].IconX=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Resources[i].IconY=y;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Resources[i].IconW=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Resources[i].IconH=y;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Resources[i].TextX=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Resources[i].TextY=y;
+    }
+
+    //	Food icon
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->FoodIcon.File);
+    ui->FoodIcon.File=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    i=gh_scm2int(value);
+    ui->FoodIconRow=i;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->FoodIconX=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->FoodIconY=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->FoodIconW=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->FoodIconH=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->FoodTextX=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->FoodTextY=y;
+
+    //	Score icon
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ScoreIcon.File);
+    ui->ScoreIcon.File=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    i=gh_scm2int(value);
+    ui->ScoreIconRow=i;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->ScoreIconX=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->ScoreIconY=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->ScoreIconW=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->ScoreIconH=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    ui->ScoreTextX=x;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->ScoreTextY=y;
+
+    //	InfoPanel
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->InfoPanel.File);
+    ui->InfoPanel.File=str;
+    ui->InfoPanelX=x;
+    ui->InfoPanelY=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->InfoPanelW=x;
+    ui->InfoPanelH=y;
+
+    // Completed bar
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    i=gh_scm2int(value);
+    ui->CompleteBarColor=i;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->CompleteBarX=x;
+    ui->CompleteBarY=y;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->CompleteTextX=x;
+    ui->CompleteTextY=y;
+
+    //	ButtonPanel
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->ButtonPanel.File);
+    ui->ButtonPanel.File=str;
+    ui->ButtonPanelX=x;
+    ui->ButtonPanelY=y;
+
+    // The map
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    ui->MapArea.X=x;
+    ui->MapArea.Y=y;
+    if ( ui->MapArea.X < 0 || ui->MapArea.Y < 0 ) {
+	fprintf(stderr,"map top-left point expected\n");
+	return SCM_UNSPECIFIED;
+    }
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+    //StephanR: note that the bottom-right point is one pixel off
+    ui->MapArea.EndX = x-1;
+    ui->MapArea.EndY = y-1;
+    if ( x < 1 || y < 1 || ui->MapArea.EndX < ui->MapArea.X ||
+				ui->MapArea.EndY < ui->MapArea.Y ) {
+	fprintf(stderr,"map bottom-right point expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    //	MenuButton
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->MenuButton.File);
+    ui->MenuButton.File=str;
+    ui->MenuButtonX=x;
+    ui->MenuButtonY=y;
+
+    //	Minimap
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->Minimap.File);
+    ui->Minimap.File=str;
+    ui->MinimapX=x;
+    ui->MinimapY=y;
+
+    //	StatusLine
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    if( !gh_list_p(temp) ) {
+	fprintf(stderr,"list expected\n");
+	return SCM_UNSPECIFIED;
+    }
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    x=gh_scm2int(value);
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    y=gh_scm2int(value);
+
+    free(ui->StatusLine.File);
+    ui->StatusLine.File=str;
+    ui->StatusLineX=x;
+    ui->StatusLineY=y;
+
+    // Buttons
+    for( i=0; i<MaxButtons; ++i ) {
+	temp=gh_car(list);
+	list=gh_cdr(list);
+
+	if( !gh_list_p(temp) ) {
+	    fprintf(stderr,"list expected\n");
+	    return SCM_UNSPECIFIED;
+	}
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Buttons[i].X=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Buttons[i].Y=y;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Buttons[i].Width=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Buttons[i].Height=y;
+    }
+    for( i=0; i<6; ++i ) {
+	temp=gh_car(list);
+	list=gh_cdr(list);
+
+	if( !gh_list_p(temp) ) {
+	    fprintf(stderr,"list expected\n");
+	    return SCM_UNSPECIFIED;
+	}
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Buttons2[i].X=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Buttons2[i].Y=y;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	x=gh_scm2int(value);
+	ui->Buttons2[i].Width=x;
+
+	value=gh_car(temp);
+	temp=gh_cdr(temp);
+	y=gh_scm2int(value);
+	ui->Buttons2[i].Height=y;
+    }
+
+    //
+    //	Get the cursors definitions.
+    //
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->Point.Name);
+    ui->Point.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->Glass.Name);
+    ui->Glass.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->Cross.Name);
+    ui->Cross.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->YellowHair.Name);
+    ui->YellowHair.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->GreenHair.Name);
+    ui->GreenHair.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->RedHair.Name);
+    ui->RedHair.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->Scroll.Name);
+    ui->Scroll.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowE.Name);
+    ui->ArrowE.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowNE.Name);
+    ui->ArrowNE.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowN.Name);
+    ui->ArrowN.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowNW.Name);
+    ui->ArrowNW.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowW.Name);
+    ui->ArrowW.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowSW.Name);
+    ui->ArrowSW.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowS.Name);
+    ui->ArrowS.Name=str;
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ArrowSE.Name);
+    ui->ArrowSE.Name=str;
+
+    //
+    //	Panels
+    //
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->GameMenuPanel.File);
+    ui->GameMenuPanel.File=str;
+
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->Menu1Panel.File);
+    ui->Menu1Panel.File=str;
+
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->Menu2Panel.File);
+    ui->Menu2Panel.File=str;
+
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->VictoryPanel.File);
+    ui->VictoryPanel.File=str;
+
+    temp=gh_car(list);
+    list=gh_cdr(list);
+
+    value=gh_car(temp);
+    temp=gh_cdr(temp);
+    str=gh_scm2newstr(value,NULL);
+    free(ui->ScenarioPanel.File);
+    ui->ScenarioPanel.File=str;
+#endif
+
     return SCM_UNSPECIFIED;
 }
 
@@ -1707,6 +2404,84 @@ local SCM CclDefineMenu(SCM list)
     return SCM_UNSPECIFIED;
 }
 
+/**
+**	Define a menu item
+**
+**	FIXME: need some general data structure to make this parsing easier.
+**
+**	@param value	Button type.
+*/
+local MenuButtonId scm2buttonid(SCM value)
+{
+    MenuButtonId id;
+
+    if ( gh_eq_p(value, gh_symbol2scm("main")) ) {
+        id=MBUTTON_MAIN;
+    } else if ( gh_eq_p(value, gh_symbol2scm("gm-half")) ) {
+        id=MBUTTON_GM_HALF;
+    } else if ( gh_eq_p(value, gh_symbol2scm("132")) ) {
+        id=MBUTTON_132;
+    } else if ( gh_eq_p(value, gh_symbol2scm("gm-full")) ) {
+        id=MBUTTON_GM_FULL;
+    } else if ( gh_eq_p(value, gh_symbol2scm("gem-round")) ) {
+        id=MBUTTON_GEM_ROUND;
+    } else if ( gh_eq_p(value, gh_symbol2scm("gem-square")) ) {
+        id=MBUTTON_GEM_SQUARE;
+    } else if ( gh_eq_p(value, gh_symbol2scm("up-arrow")) ) {
+        id=MBUTTON_UP_ARROW;
+    } else if ( gh_eq_p(value, gh_symbol2scm("down-arrow")) ) {
+        id=MBUTTON_DOWN_ARROW;
+    } else if ( gh_eq_p(value, gh_symbol2scm("left-arrow")) ) {
+        id=MBUTTON_LEFT_ARROW;
+    } else if ( gh_eq_p(value, gh_symbol2scm("right-arrow")) ) {
+        id=MBUTTON_RIGHT_ARROW;
+    } else if ( gh_eq_p(value, gh_symbol2scm("s-knob")) ) {
+        id=MBUTTON_S_KNOB;
+    } else if ( gh_eq_p(value, gh_symbol2scm("s-vcont")) ) {
+        id=MBUTTON_S_VCONT;
+    } else if ( gh_eq_p(value, gh_symbol2scm("s-hcont")) ) {
+        id=MBUTTON_S_HCONT;
+    } else if ( gh_eq_p(value, gh_symbol2scm("pulldown")) ) {
+        id=MBUTTON_PULLDOWN;
+    } else if ( gh_eq_p(value, gh_symbol2scm("vthin")) ) {
+        id=MBUTTON_VTHIN;
+    } else if ( gh_eq_p(value, gh_symbol2scm("folder")) ) {
+        id=MBUTTON_FOLDER;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-gem-round")) ) {
+        id=MBUTTON_SC_GEM_ROUND;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-gem-square")) ) {
+        id=MBUTTON_SC_GEM_SQUARE;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-up-arrow")) ) {
+        id=MBUTTON_SC_UP_ARROW;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-down-arrow")) ) {
+        id=MBUTTON_SC_DOWN_ARROW;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-left-arrow")) ) {
+        id=MBUTTON_SC_LEFT_ARROW;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-right-arrow")) ) {
+        id=MBUTTON_SC_RIGHT_ARROW;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-knob")) ) {
+        id=MBUTTON_SC_S_KNOB;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-vcont")) ) {
+        id=MBUTTON_SC_S_VCONT;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-s-hcont")) ) {
+        id=MBUTTON_SC_S_HCONT;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-pulldown")) ) {
+        id=MBUTTON_SC_PULLDOWN;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-button-left")) ) {
+        id=MBUTTON_SC_BUTTON_LEFT;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-button")) ) {
+        id=MBUTTON_SC_BUTTON;
+    } else if ( gh_eq_p(value, gh_symbol2scm("sc-button-right")) ) {
+        id=MBUTTON_SC_BUTTON_RIGHT;
+    } else {
+	char *s1=gh_scm2newstr(value, NULL);
+        fprintf(stderr, "Unsupported button %s\n", s1);
+        free(s1);
+	return 0;
+    }
+    return id;
+}
+
 local int scm2hotkey(SCM value)
 {
     char *s;
@@ -2926,6 +3701,7 @@ global void UserInterfaceCclRegister(void)
     gh_new_procedureN("define-cursor",CclDefineCursor);
     gh_new_procedure1_0("set-game-cursor!",CclSetGameCursor);
     gh_new_procedureN("define-ui",CclDefineUI);
+    gh_new_procedureN("define-new-ui",CclDefineNewUI);
     gh_new_procedureN("define-viewports",CclDefineViewports);
 
     gh_new_procedure1_0("set-grab-mouse!", CclSetGrabMouse);
diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp
index 5de0f8a95..163b5589e 100644
--- a/src/ui/ui.cpp
+++ b/src/ui/ui.cpp
@@ -39,7 +39,6 @@
 #include "interface.h"
 #include "map.h"
 #include "ui.h"
-#include "menus.h"
 
 /*----------------------------------------------------------------------------
 --	Variables
@@ -70,6 +69,7 @@ global UI** UI_Table;
 local void ClipViewport(Viewport* vp, int ClipX, int ClipY);
 local void FinishViewportModeConfiguration(Viewport new_vps[], int num_vps);
 
+
 /**
 **	Initialize the user interface.
 **
@@ -146,6 +146,16 @@ global void InitUserInterface(const char *race_name)
     } else {
 	SetViewportMode(VIEWPORT_SINGLE);
     }
+
+    // FIXME: Can be removed after new config is working
+    if( !strcmp(race_name,"human") || !strcmp(race_name,"alliance") ) {
+	TheUI.NormalFontColor=strdup(FontWhite);
+	TheUI.ReverseFontColor=strdup(FontYellow);
+    } else {
+	TheUI.NormalFontColor=strdup(FontYellow);
+	TheUI.ReverseFontColor=strdup(FontWhite);
+    }
+    TheUI.ViewportCursorColor=ColorWhite;
 }
 
 /**
@@ -163,14 +173,20 @@ global void LoadUserInterface(void)
     //
     //	Load graphics
     //
-    for( i=0; i<TheUI.NumPanels; ++i ) {
-	if( TheUI.Panel[i].File ) {
-	    TheUI.Panel[i].Graphic=LoadSprite(TheUI.Panel[i].File,0,0);
+    for( i=0; i<TheUI.NumFillers; ++i ) {
+	if( TheUI.Filler[i].File ) {
+	    TheUI.Filler[i].Graphic=LoadGraphic(TheUI.Filler[i].File);
 #ifdef USE_OPENGL
-	    MakeTexture(TheUI.Panel[i].Graphic,TheUI.Panel[i].Graphic->Width,TheUI.Panel[i].Graphic->Height);
+	    MakeTexture(TheUI.Filler[i].Graphic,TheUI.Filler[i].Graphic->Width,TheUI.Filler[i].Graphic->Height);
 #endif
 	}
     }
+    if( TheUI.Resource.File ) {
+	TheUI.Resource.Graphic=LoadGraphic(TheUI.Resource.File);
+#ifdef USE_OPENGL
+	MakeTexture(TheUI.Resource.Graphic,TheUI.Resource.Graphic->Width,TheUI.Resource.Graphic->Height);
+#endif
+    }
 
     for( i=0; i<MaxCosts; ++i ) {
 	// FIXME: reuse same graphics?
@@ -184,17 +200,17 @@ global void LoadUserInterface(void)
     }
 
     // FIXME: reuse same graphics?
-    if( TheUI.Resources[FoodCost].Icon.File ) {
-	TheUI.Resources[FoodCost].Icon.Graphic=LoadGraphic(TheUI.Resources[FoodCost].Icon.File);
+    if( TheUI.FoodIcon.File ) {
+	TheUI.FoodIcon.Graphic=LoadGraphic(TheUI.FoodIcon.File);
 #ifdef USE_OPENGL
-	MakeTexture(TheUI.Resources[FoodCost].Icon.Graphic,TheUI.Resources[FoodCost].Icon.Graphic->Width,TheUI.Resources[FoodCost].Icon.Graphic->Height);
+	MakeTexture(TheUI.FoodIcon.Graphic,TheUI.FoodIcon.Graphic->Width,TheUI.FoodIcon.Graphic->Height);
 #endif
     }
     // FIXME: reuse same graphics?
-    if( TheUI.Resources[ScoreCost].Icon.File ) {
-	TheUI.Resources[ScoreCost].Icon.Graphic=LoadGraphic(TheUI.Resources[ScoreCost].Icon.File);
+    if( TheUI.ScoreIcon.File ) {
+	TheUI.ScoreIcon.Graphic=LoadGraphic(TheUI.ScoreIcon.File);
 #ifdef USE_OPENGL
-	MakeTexture(TheUI.Resources[ScoreCost].Icon.Graphic,TheUI.Resources[ScoreCost].Icon.Graphic->Width,TheUI.Resources[ScoreCost].Icon.Graphic->Height);
+	MakeTexture(TheUI.ScoreIcon.Graphic,TheUI.ScoreIcon.Graphic->Width,TheUI.ScoreIcon.Graphic->Height);
 #endif
     }
 
@@ -204,6 +220,30 @@ global void LoadUserInterface(void)
 	MakeTexture(TheUI.InfoPanel.Graphic,TheUI.InfoPanel.Graphic->Width,TheUI.InfoPanel.Graphic->Height);
 #endif
     }
+    if( TheUI.ButtonPanel.File ) {
+	TheUI.ButtonPanel.Graphic=LoadGraphic(TheUI.ButtonPanel.File);
+#ifdef USE_OPENGL
+	MakeTexture(TheUI.ButtonPanel.Graphic,TheUI.ButtonPanel.Graphic->Width,TheUI.ButtonPanel.Graphic->Height);
+#endif
+    }
+    if( TheUI.MenuButton.File ) {
+	TheUI.MenuButton.Graphic=LoadGraphic(TheUI.MenuButton.File);
+#ifdef USE_OPENGL
+	MakeTexture(TheUI.MenuButton.Graphic,TheUI.MenuButton.Graphic->Width,TheUI.MenuButton.Graphic->Height);
+#endif
+    }
+    if( TheUI.Minimap.File ) {
+	TheUI.Minimap.Graphic=LoadGraphic(TheUI.Minimap.File);
+#ifdef USE_OPENGL
+	MakeTexture(TheUI.Minimap.Graphic,TheUI.Minimap.Graphic->Width,TheUI.Minimap.Graphic->Height);
+#endif
+    }
+    if( TheUI.StatusLine.File ) {
+	TheUI.StatusLine.Graphic=LoadGraphic(TheUI.StatusLine.File);
+#ifdef USE_OPENGL
+	MakeTexture(TheUI.StatusLine.Graphic,TheUI.StatusLine.Graphic->Width,TheUI.StatusLine.Graphic->Height);
+#endif
+    }
 
     //
     //	Resolve cursors
@@ -245,226 +285,235 @@ global void LoadUserInterface(void)
 **	@param file	Save file handle
 **	@param ui	User interface to save
 */
-local void SaveUi(FILE * file, const UI * ui)
+local void OldSaveUi(FILE* file,const UI* ui)
 {
     int i;
     MenuPanel* menupanel;
 
-    fprintf(file, "(define-ui '%s %d %d",
+    fprintf(file,"(define-old-ui '%s %d %d\t; Selector\n",
+	    ui->Name,ui->Width,ui->Height);
+    fprintf(file,"  ; Filler 1\n");
+    fprintf(file,"  (list \"%s\" %d %d)\n",
+	    ui->Filler[0].File,ui->FillerX[0],ui->FillerY[0]);
+    fprintf(file,"  ; Resource line\n");
+    fprintf(file,"  (list \"%s\" %d %d)\n",
+	    ui->Resource.File,ui->ResourceX,ui->ResourceY);
+
+    for( i=1; i<MaxCosts; ++i ) {
+	fprintf(file,"  ; Resource %s\n",DefaultResourceNames[i]);
+	fprintf(file,"  (list \"%s\" %d\n    %d %d %d %d  %d %d)\n",
+		ui->Resources[i].Icon.File,ui->Resources[i].IconRow,
+		ui->Resources[i].IconX,ui->Resources[i].IconY,
+		ui->Resources[i].IconW,ui->Resources[i].IconH,
+		ui->Resources[i].TextX,ui->Resources[i].TextY);
+    }
+    fprintf(file,"  ; Food\n");
+    fprintf(file,"  (list \"%s\" %d\n    %d %d %d %d  %d %d)\n",
+	    ui->FoodIcon.File,ui->FoodIconRow,
+	    ui->FoodIconX,ui->FoodIconY,
+	    ui->FoodIconW,ui->FoodIconH,
+	    ui->FoodTextX,ui->FoodTextY);
+    fprintf(file,"  ; Score\n");
+    fprintf(file,"  (list \"%s\" %d\n    %d %d %d %d  %d %d)\n",
+	    ui->ScoreIcon.File,ui->ScoreIconRow,
+	    ui->ScoreIconX,ui->ScoreIconY,
+	    ui->ScoreIconW,ui->ScoreIconH,
+	    ui->ScoreTextX,ui->ScoreTextY);
+
+    fprintf(file,"  ; Info panel\n");
+    fprintf(file,"  (list \"%s\" %d %d %d %d)\n",
+	    ui->InfoPanel.File,
+	    ui->InfoPanelX,ui->InfoPanelY,
+	    ui->InfoPanelW,ui->InfoPanelH);
+
+    fprintf(file,"  ; Complete bar\n");
+    fprintf(file,"  (list %d %d %d %d %d)\n",
+	    ui->CompleteBarColor,
+	    ui->CompleteBarX,ui->CompleteBarY,
+	    ui->CompleteTextX,ui->CompleteTextY);
+
+    fprintf(file,"  ; Button panel\n");
+    fprintf(file,"  (list \"%s\" %d %d)\n",
+	    ui->ButtonPanel.File,ui->ButtonPanelX,ui->ButtonPanelY);
+
+    fprintf(file,"  ; The map area\n");
+    fprintf(file,"  (list %d %d %d %d)\n",
+	    ui->MapArea.X, ui->MapArea.Y,
+	    ui->MapArea.EndX+1,ui->MapArea.EndY+1);
+
+    fprintf(file,"  ; Menu button background\n");
+    fprintf(file,"  (list \"%s\" %d %d)\n",
+	    ui->MenuButton.File,ui->MenuButtonX,ui->MenuButtonY);
+
+    fprintf(file,"  ; Minimap background\n");
+    fprintf(file,"  (list \"%s\" %d %d)\n",
+	    ui->Minimap.File,ui->MinimapX,ui->MinimapY);
+
+    fprintf(file,"  ; Status line\n");
+    fprintf(file,"  (list \"%s\" %d %d)\n",
+	    ui->StatusLine.File,ui->StatusLineX,ui->StatusLineY);
+
+    fprintf(file,"  ; Buttons\n");
+    for( i=0; i<MaxButtons; ++i ) {
+	fprintf(file,"  (list %3d %3d %4d %3d)\n",
+		ui->Buttons[i].X,ui->Buttons[i].Y,
+		ui->Buttons[i].Width,ui->Buttons[i].Height);
+    }
+
+    fprintf(file,"  ; Buttons II\n");
+    for( i=0; i<6; ++i ) {
+	fprintf(file,"  (list %3d %3d %4d %3d)\n",
+		ui->Buttons2[i].X,ui->Buttons2[i].Y,
+		ui->Buttons2[i].Width,ui->Buttons2[i].Height);
+    }
+
+    fprintf(file,"  ; Cursors\n");
+    fprintf(file,"  (list");
+    fprintf(file," '%s",ui->Point.Name);
+    fprintf(file," '%s",ui->Glass.Name);
+    fprintf(file," '%s\n",ui->Cross.Name);
+    fprintf(file,"    '%s",ui->YellowHair.Name);
+    fprintf(file," '%s",ui->GreenHair.Name);
+    fprintf(file,"    '%s\n",ui->RedHair.Name);
+    fprintf(file,"    '%s\n",ui->Scroll.Name);
+
+    fprintf(file,"    '%s",ui->ArrowE.Name);
+    fprintf(file," '%s",ui->ArrowNE.Name);
+    fprintf(file," '%s",ui->ArrowN.Name);
+    fprintf(file," '%s\n",ui->ArrowNW.Name);
+    fprintf(file,"    '%s",ui->ArrowW.Name);
+    fprintf(file," '%s",ui->ArrowSW.Name);
+    fprintf(file," '%s",ui->ArrowS.Name);
+    fprintf(file," '%s)\n",ui->ArrowSE.Name);
+
+    menupanel=ui->MenuPanels;
+    while( menupanel ) {
+	fprintf(file,"  (list \"%s\")\n",menupanel->Panel.File);
+	menupanel=menupanel->Next;
+    }
+
+    fprintf(file,"  (list \"%s\")\n",ui->VictoryBackground.File);
+    fprintf(file,"  (list \"%s\")",ui->DefeatBackground.File);
+
+    fprintf(file," )\n\n");
+}
+
+#if 0
+/**
+**	Save the UI structure.
+**
+**	@param file	Save file handle
+**	@param ui	User interface to save
+*/
+local void NewSaveUi(FILE * file, const UI * ui)
+{
+    int i;
+
+    fprintf(file, "(define-ui '%s %d %d\t; Selector\n",
 	ui->Name, ui->Width, ui->Height);
 
-    fprintf(file, "\n  'normal-font-color '%s\n  'reverse-font-color '%s",
+    fprintf(file, "  'normal-font-color '%s 'reverse-font-color '%s\n",
 	ui->NormalFontColor, ui->ReverseFontColor);
 
-    fprintf(file, "\n");
-    for( i=0; i<TheUI.NumPanels; ++i ) {
-	fprintf(file, "\n  'panel '(file \"%s\" pos (%d %d))",
-	    ui->Panel[i].File, ui->PanelX[i], ui->PanelY[i]);
+    for( i=0; i<TheUI.NumFillers; ++i ) {
+	fprintf(file, "  'filler '(pos (%d %d) image \"%s\")\n",
+	    ui->FillerX[i], ui->FillerY[i], ui->Filler[i].File);
     }
 
-    fprintf(file, "\n");
-    fprintf(file, "\n  'resources '(");
-    for (i=1; i<MaxCosts; ++i) {
+    fprintf(file, "  'resources '(pos (%d %d) image \"%s\"",
+	ui->ResourceX, ui->ResourceY, ui->Resource.File);
+    for (i = 1; i < MaxCosts; ++i) {
 	// FIXME: use slot 0 for time displays!
-	if( DefaultResourceNames[i] ) {
-	    fprintf(file, "\n    %s (", DefaultResourceNames[i]);
-	    if( ui->Resources[i].Icon.File ) {
-		fprintf(file, "\n      pos (%d %d) file \"%s\" row %d size (%d %d)",
-		    ui->Resources[i].IconX, ui->Resources[i].IconY,
-		    ui->Resources[i].Icon.File,
-		    ui->Resources[i].IconRow,
-		    ui->Resources[i].IconW, ui->Resources[i].IconH);
-	    }
-	    if( ui->Resources[i].TextX!=-1 ) {
-		fprintf(file, "\n      text-pos (%d %d)",
-		    ui->Resources[i].TextX, ui->Resources[i].TextY);
-	    }
-	    fprintf(file, ")");
-	}
-    }
-    if( ui->Resources[FoodCost].Icon.File ) {
-	fprintf(file, "\n    food (");
-	fprintf(file, "\n      pos (%d %d) file \"%s\" row %d size (%d %d)",
-	    ui->Resources[FoodCost].IconX, ui->Resources[FoodCost].IconY,
-	    ui->Resources[FoodCost].Icon.File,
-	    ui->Resources[FoodCost].IconRow,
-	    ui->Resources[FoodCost].IconW, ui->Resources[FoodCost].IconH);
-	if( ui->Resources[FoodCost].TextX!=-1 ) {
-	    fprintf(file, "\n      text-pos (%d %d)",
-		ui->Resources[FoodCost].TextX, ui->Resources[FoodCost].TextY);
-	}
-	fprintf(file, ")");
-    }
-    if( ui->Resources[ScoreCost].Icon.File ) {
-	fprintf(file, "\n    score (");
-	fprintf(file, "\n      pos (%d %d) file \"%s\" row %d size (%d %d)",
-	    ui->Resources[ScoreCost].IconX, ui->Resources[ScoreCost].IconY,
-	    ui->Resources[ScoreCost].Icon.File,
-	    ui->Resources[ScoreCost].IconRow,
-	    ui->Resources[ScoreCost].IconW, ui->Resources[ScoreCost].IconH);
-	if( ui->Resources[ScoreCost].TextX!=-1 ) {
-	    fprintf(file, "\n      text-pos (%d %d)",
-		ui->Resources[ScoreCost].TextX, ui->Resources[ScoreCost].TextY);
-	}
-	fprintf(file, ")");
+	fprintf(file, "\n    %s (icon-pos (%d %d) icon-file \"%s\"\n",
+	    DefaultResourceNames[i],
+	    ui->Resources[i].IconX, ui->Resources[i].IconY,
+	    ui->Resources[i].Icon.File);
+	fprintf(file,"      icon-frame %d icon-size (%d %d) text-pos (%d %d))",
+	    ui->Resources[i].IconRow,
+	    ui->Resources[i].IconW, ui->Resources[i].IconH,
+	    ui->Resources[i].TextX, ui->Resources[i].TextY);
     }
+    fprintf(file, "\n    food (icon-pos (%d %d) icon-file \"%s\"\n",
+	ui->FoodIconX, ui->FoodIconY, ui->FoodIcon.File);
+    fprintf(file,"      icon-frame %d icon-size (%d %d) text-pos (%d %d))",
+	ui->FoodIconRow,
+	ui->FoodIconW, ui->FoodIconH, ui->FoodTextX, ui->FoodTextY);
+    fprintf(file, "\n    score (icon-pos (%d %d) icon-file \"%s\"\n",
+	ui->ScoreIconX, ui->ScoreIconY, ui->ScoreIcon.File);
+    fprintf(file,"      icon-frame %d icon-size (%d %d) text-pos (%d %d))",
+	ui->ScoreIconRow,
+	ui->ScoreIconW, ui->ScoreIconH, ui->ScoreTextX, ui->ScoreTextY);
     fprintf(file, ")\n");
 
-    fprintf(file, "\n  'map-area '(pos (%d %d) size (%d %d))",
+    fprintf(file, "  'info-panel '(pos (%d %d) image \"%s\"\n",
+	ui->InfoPanelX, ui->InfoPanelY,
+	ui->InfoPanel.File);
+    fprintf(file, "    size (%d %d)\n",
+	ui->InfoPanelW, ui->InfoPanelH);
+
+    fprintf(file, "    complete-bar (color %d pos (%d %d) text-pos (%d %d)))\n",
+	ui->CompleteBarColor,
+	ui->CompleteBarX, ui->CompleteBarY,
+	ui->CompleteTextX, ui->CompleteTextY);
+
+    fprintf(file, "  'button-panel '(pos (%d %d) image \"%s\")\n",
+	ui->ButtonPanelX, ui->ButtonPanelY, ui->ButtonPanel.File);
+
+    fprintf(file, "  'map-area '(pos (%d %d) size (%d %d))\n",
 	ui->MapArea.X, ui->MapArea.Y,
 	ui->MapArea.EndX + 1, ui->MapArea.EndY + 1);
 
-    fprintf(file, "\n");
-    fprintf(file, "\n  'info-area '(");
-    fprintf(file, "\n    pos (%d %d)",
-	ui->InfoPanelX, ui->InfoPanelY);
-    if( ui->InfoPanel.File ) {
-	fprintf(file, "\n    panel (file \"%s\" size (%d %d))",
-	    ui->InfoPanel.File, ui->InfoPanelW, ui->InfoPanelH);
+    fprintf(file, "  'menu-button '(pos (%d %d) image \"%s\")\n",
+	ui->MenuButtonX, ui->MenuButtonY, ui->MenuButton.File);
+
+    fprintf(file, "  'minimap '(pos (%d %d) image \"%s\" 'viewport-color %d)\n",
+	ui->MinimapX, ui->MinimapY, ui->Minimap.File, ui->ViewportCursorColor);
+
+    fprintf(file, "  'status-line '(pos (%d %d) image \"%s\")\n",
+	ui->StatusLineX, ui->StatusLineY, ui->StatusLine.File);
+
+    fprintf(file, "; 0 Menu 1-9 Info 10-19 Button\n");
+    fprintf(file, "  'buttons '(");
+    for (i = 0; i < MaxButtons; ++i) {
+	fprintf(file, "\n    (pos (%3d %3d) size (%4d %3d))",
+	    ui->Buttons[i].X, ui->Buttons[i].Y,
+	    ui->Buttons[i].Width, ui->Buttons[i].Height);
     }
-    fprintf(file, "\n    neutral-frame %d",
-	ui->InfoPanelNeutralFrame);
-    fprintf(file, "\n    selected-frame %d",
-	ui->InfoPanelSelectedFrame);
-    fprintf(file, "\n    magic-frame %d",
-	ui->InfoPanelMagicFrame);
-    fprintf(file, "\n    construction-frame %d",
-	ui->InfoPanelConstructionFrame);
-    fprintf(file, "\n    completed-bar (");
-    fprintf(file, "\n      color %d", ui->CompleteBarColor);
-    fprintf(file, "\n      pos (%d %d)", ui->CompleteBarX, ui->CompleteBarY);
-    fprintf(file, "\n      size (%d %d)", ui->CompleteBarW, ui->CompleteBarH);
-    fprintf(file, "\n      text \"%s\"", ui->CompleteBarText);
-    fprintf(file, "\n      font %s", FontNames[ui->CompleteBarFont]);
-    fprintf(file, "\n      text-pos (%d %d)",
-	ui->CompleteTextX, ui->CompleteTextY);
-    fprintf(file, ")");
-    if( ui->NumInfoButtons ) {
-	fprintf(file, "\n    buttons (");
-	for( i=0; i<ui->NumInfoButtons; ++i ) {
-	    fprintf(file, "\n      (pos (%3d %3d) size (%3d %3d))",
-		ui->InfoButtons[i].X, ui->InfoButtons[i].Y,
-		ui->InfoButtons[i].Width, ui->InfoButtons[i].Height);
-	}
-	fprintf(file, ")");
+
+    fprintf(file, ")\n; 0-5 Training\n");
+    fprintf(file, "  'buttons-2 '(");
+    for (i = 0; i < 6; ++i) {
+	fprintf(file, "\n    (pos (%3d %3d) size (%4d %3d))",
+	    ui->Buttons2[i].X, ui->Buttons2[i].Y,
+	    ui->Buttons2[i].Width, ui->Buttons2[i].Height);
     }
-    if( ui->NumTrainingButtons ) {
-	fprintf(file, "\n    buttons (");
-	for( i=0; i<ui->NumTrainingButtons; ++i ) {
-	    fprintf(file, "\n      (pos (%3d %3d) size (%3d %3d))",
-		ui->TrainingButtons[i].X, ui->TrainingButtons[i].Y,
-		ui->TrainingButtons[i].Width, ui->TrainingButtons[i].Height);
-	}
-	fprintf(file, ")");
-    }
-    fprintf(file, ")\n");
 
-    fprintf(file, "\n  'button-area '(");
-    if( ui->NumButtonButtons ) {
-	fprintf(file, "\n    buttons (");
-	for( i=0; i<ui->NumButtonButtons; ++i ) {
-	    fprintf(file, "\n      (pos (%3d %3d) size (%3d %3d))",
-		ui->ButtonButtons[i].X, ui->ButtonButtons[i].Y,
-		ui->ButtonButtons[i].Width, ui->ButtonButtons[i].Height);
-	}
-	fprintf(file, ")");
-    }
-    fprintf(file, ")\n");
+    fprintf(file, ")\n  'cursors '(point %s\n", ui->Point.Name);
+    fprintf(file, "    glass %s\n", ui->Glass.Name);
+    fprintf(file, "    cross %s\n", ui->Cross.Name);
+    fprintf(file, "    yellow %s\n", ui->YellowHair.Name);
+    fprintf(file, "    green %s\n", ui->GreenHair.Name);
+    fprintf(file, "    red %s\n", ui->RedHair.Name);
+    fprintf(file, "    scroll %s\n", ui->Scroll.Name);
 
-    fprintf(file, "\n  'minimap-area '(");
-    fprintf(file, "\n    pos (%d %d)",
-	ui->MinimapX, ui->MinimapY);
-    fprintf(file, "\n    size (%d %d)",
-	ui->MinimapW, ui->MinimapH);
-    fprintf(file, "\n    cursor-color %d",
-	ui->MinimapCursorColor);
-    fprintf(file, ")\n");
+    fprintf(file, "    arrow-e %s\n", ui->ArrowE.Name);
+    fprintf(file, "    arrow-ne %s\n", ui->ArrowNE.Name);
+    fprintf(file, "    arrow-n %s\n", ui->ArrowN.Name);
+    fprintf(file, "    arrow-nw %s\n", ui->ArrowNW.Name);
+    fprintf(file, "    arrow-w %s\n", ui->ArrowW.Name);
+    fprintf(file, "    arrow-sw %s\n", ui->ArrowSW.Name);
+    fprintf(file, "    arrow-s %s\n", ui->ArrowS.Name);
+    fprintf(file, "    arrow-se %s)\n", ui->ArrowSE.Name);
 
-    fprintf(file, "\n  'status-line '(");
-    fprintf(file, "\n    font %s",
-	FontNames[ui->StatusLineFont]);
-    fprintf(file, "\n    pos (%d %d)",
-	ui->StatusLineX, ui->StatusLineY);
-    fprintf(file, "\n    width %d",
-	ui->StatusLineW);
-    fprintf(file, ")\n");
-
-    fprintf(file, "\n  'menu-button '(");
-    fprintf(file, "\n    pos (%d %d)",
-	ui->MenuButton.X, ui->MenuButton.Y);
-    fprintf(file, "\n    size (%d %d)",
-	ui->MenuButton.Width, ui->MenuButton.Height);
-    fprintf(file, "\n    caption \"%s\"",
-	ui->MenuButton.Text);
-    fprintf(file, "\n    style %s",
-	MenuButtonStyle(ui->MenuButton.Button));
-    fprintf(file, ")");
-
-    fprintf(file, "\n  'network-menu-button '(");
-    fprintf(file, "\n    pos (%d %d)",
-	ui->NetworkMenuButton.X, ui->NetworkMenuButton.Y);
-    fprintf(file, "\n    size (%d %d)",
-	ui->NetworkMenuButton.Width, ui->NetworkMenuButton.Height);
-    fprintf(file, "\n    caption \"%s\"",
-	ui->NetworkMenuButton.Text);
-    fprintf(file, "\n    style %s",
-	MenuButtonStyle(ui->NetworkMenuButton.Button));
-    fprintf(file, ")");
-
-    fprintf(file, "\n  'network-diplomacy-button '(");
-    fprintf(file, "\n    pos (%d %d)",
-	ui->NetworkDiplomacyButton.X, ui->NetworkDiplomacyButton.Y);
-    fprintf(file, "\n    size (%d %d)",
-	ui->NetworkDiplomacyButton.Width, ui->NetworkDiplomacyButton.Height);
-    fprintf(file, "\n    caption \"%s\"",
-	ui->NetworkDiplomacyButton.Text);
-    fprintf(file, "\n    style %s",
-	MenuButtonStyle(ui->NetworkDiplomacyButton.Button));
-    fprintf(file, ")\n");
-
-    fprintf(file, "\n  'message-area '(");
-    fprintf(file, "\n    font %s", FontNames[ui->MessageAreaFont]);
-    fprintf(file, "\n    pos (%d %d)",
-	ui->MessageAreaX, ui->MessageAreaY);
-    fprintf(file, "\n    width %d", ui->MessageAreaW);
-    fprintf(file, ")\n");
-
-    fprintf(file, "\n  'cursors '(");
-    fprintf(file, "\n    point %s", ui->Point.Name);
-    fprintf(file, "\n    glass %s", ui->Glass.Name);
-    fprintf(file, "\n    cross %s", ui->Cross.Name);
-    fprintf(file, "\n    yellow %s", ui->YellowHair.Name);
-    fprintf(file, "\n    green %s", ui->GreenHair.Name);
-    fprintf(file, "\n    red %s", ui->RedHair.Name);
-    fprintf(file, "\n    scroll %s", ui->Scroll.Name);
-
-    fprintf(file, "\n    arrow-e %s", ui->ArrowE.Name);
-    fprintf(file, "\n    arrow-ne %s", ui->ArrowNE.Name);
-    fprintf(file, "\n    arrow-n %s", ui->ArrowN.Name);
-    fprintf(file, "\n    arrow-nw %s", ui->ArrowNW.Name);
-    fprintf(file, "\n    arrow-w %s", ui->ArrowW.Name);
-    fprintf(file, "\n    arrow-sw %s", ui->ArrowSW.Name);
-    fprintf(file, "\n    arrow-s %s", ui->ArrowS.Name);
-    fprintf(file, "\n    arrow-se %s", ui->ArrowSE.Name);
-    fprintf(file, ")\n");
-
-    fprintf(file, "\n  'victory-background \"%s\"",
-	ui->VictoryBackground.File);
-    fprintf(file, "\n  'defeat-background \"%s\"",
-	ui->DefeatBackground.File);
-    fprintf(file, "\n");
-
-    fprintf(file, "\n  'menu-panels '(");
-    menupanel=ui->MenuPanels;
-    while( menupanel ) {
-	fprintf(file,"\n    %s \"%s\"",
-		menupanel->Ident, menupanel->Panel.File);
-	menupanel=menupanel->Next;
-    }
-    fprintf(file, ")");
+    fprintf(file, "  'panels '(game-menu \"%s\"\n", ui->GameMenuPanel.File);
+    fprintf(file, "    menu-1 \"%s\"\n", ui->Menu1Panel.File);
+    fprintf(file, "    menu-2 \"%s\"\n", ui->Menu2Panel.File);
+    fprintf(file, "    victory \"%s\"\n", ui->VictoryPanel.File);
+    fprintf(file, "    scenario \"%s\")", ui->ScenarioPanel.File);
 
     fprintf(file, " )\n\n");
 }
+#endif
 
 /**
 **	Save the viewports.
@@ -514,7 +563,8 @@ global void SaveUserInterface(FILE* file)
 	    TheUI.OriginalResources ? "#t" : "#f");
 
     // Save the current UI
-    SaveUi(file,&TheUI);
+    OldSaveUi(file,&TheUI);
+    // NewSaveUi(file,&TheUI);
     SaveViewports(file,&TheUI);
 }
 
@@ -531,17 +581,22 @@ global void CleanUserInterface(void)
     //
     //	Free the graphics. FIXME: if they are shared this will crash.
     //
-    for( i=0; i<TheUI.NumPanels; ++i ) {
-	VideoSaveFree(TheUI.Panel[i].Graphic);
+    for( i=0; i<TheUI.NumFillers; ++i ) {
+	VideoSaveFree(TheUI.Filler[i].Graphic);
     }
+    VideoSaveFree(TheUI.Resource.Graphic);
 
     for( i=0; i<MaxCosts; ++i ) {
 	VideoSaveFree(TheUI.Resources[i].Icon.Graphic);
     }
 
-    VideoSaveFree(TheUI.Resources[FoodCost].Icon.Graphic);
-    VideoSaveFree(TheUI.Resources[ScoreCost].Icon.Graphic);
+    VideoSaveFree(TheUI.FoodIcon.Graphic);
+    VideoSaveFree(TheUI.ScoreIcon.Graphic);
     VideoSaveFree(TheUI.InfoPanel.Graphic);
+    VideoSaveFree(TheUI.ButtonPanel.Graphic);
+    VideoSaveFree(TheUI.MenuButton.Graphic);
+    VideoSaveFree(TheUI.Minimap.Graphic);
+    VideoSaveFree(TheUI.StatusLine.Graphic);
 
     menupanel=TheUI.MenuPanels;
     while( menupanel ) {
diff --git a/src/video/font.cpp b/src/video/font.cpp
index 06a65f89c..b13aae11e 100644
--- a/src/video/font.cpp
+++ b/src/video/font.cpp
@@ -97,22 +97,6 @@ local int FontBitmapWidths[MaxFonts];
 local int CurrentFont;
 #endif
 
-/**
-**	FIXME: should use the names of the real fonts.
-*/
-global char *FontNames[] = {
-    "small",
-    "game",
-    "large",
-    "small-title",
-    "large-title",
-    "user1",
-    "user2",
-    "user3",
-    "user4",
-    "user5",
-};
-
 /*----------------------------------------------------------------------------
 --	Functions
 ----------------------------------------------------------------------------*/