diff --git a/src/game/dummy.cpp b/src/dummy.cpp
similarity index 100%
rename from src/game/dummy.cpp
rename to src/dummy.cpp
diff --git a/src/game/Makefile b/src/game/Makefile
index bfca79366..fd10d4b14 100644
--- a/src/game/Makefile
+++ b/src/game/Makefile
@@ -21,6 +21,6 @@ include $(TOPDIR)/Rules.make
 
 MODULE  = game
 
-OBJS	= dummy.$(OE)
+OBJS	= game.$(OE)
 
 include $(TOPDIR)/Common.mk
diff --git a/src/include/Makefile b/src/include/Makefile
index 0f9625d66..548733ba7 100644
--- a/src/include/Makefile
+++ b/src/include/Makefile
@@ -30,7 +30,7 @@ HDRS	= actions.h ai.h ccl.h freecraft.h construct.h cursor.h font.h icons.h \
 	  pud.h tileset.h unit.h unittype.h upgrade.h upgrade_structs.h \
 	  ccl_sound.h sound.h sound_id.h unitsound.h wav.h sound_server.h \
 	  video.h network.h goal.h ui.h button.h menus.h spells.h \
-	  siod.h siodp.h iolib.h depend.h myendian.h rdtsc.h \
+	  siod.h siodp.h iolib.h depend.h settings.h myendian.h rdtsc.h \
 	  etlib/generic.h etlib/xmalloc.h etlib/hash.h etlib/dllist.h
 
 all:
diff --git a/src/include/map.h b/src/include/map.h
index 86a145c89..a06026267 100644
--- a/src/include/map.h
+++ b/src/include/map.h
@@ -165,6 +165,8 @@ extern int FogOfWarBrightness;
 extern int FogOfWarSaturation;
     /// Forest regeneration
 extern int ForestRegeneration;
+    /// Flag must reveal the map
+extern int FlagRevealMap;
 
 /*----------------------------------------------------------------------------
 --	Functions
diff --git a/src/include/settings.h b/src/include/settings.h
new file mode 100644
index 000000000..62900b8cb
--- /dev/null
+++ b/src/include/settings.h
@@ -0,0 +1,95 @@
+//   ___________		     _________		      _____  __
+//   \_	  _____/______   ____   ____ \_   ___ \____________ _/ ____\/  |_
+//    |    __) \_  __ \_/ __ \_/ __ \/    \  \/\_  __ \__  \\   __\\   __\ 
+//    |     \   |  | \/\  ___/\  ___/\     \____|  | \// __ \|  |   |  |
+//    \___  /   |__|    \___  >\___  >\______  /|__|  (____  /__|   |__|
+//	  \/		    \/	   \/	     \/		   \/
+//  ______________________                           ______________________
+//			  T H E   W A R   B E G I N S
+//	   FreeCraft - A free fantasy real time strategy game engine
+//
+/**@name settings.h	-	The game settings headerfile. */
+//
+//	(c) Copyright 2000 by Andreas Arens
+//
+//	$Id$
+
+#ifndef __SETTINGS_H__
+#define __SETTINGS_H__
+
+//@{
+
+/*----------------------------------------------------------------------------
+--	Includes
+----------------------------------------------------------------------------*/
+
+#ifndef __STRUCT_SETTINGS__
+#define __STRUCT_SETTINGS__
+typedef struct _settings_ Settings;
+#endif
+
+#include "player.h"
+
+/*----------------------------------------------------------------------------
+--	Settings  __WIP__
+----------------------------------------------------------------------------*/
+
+/**
+**	Settings structure
+**
+**	This structure one day should contain all common game settings,
+**	in-game, or pre-start, and the individual (per player) presets.
+**	This allows central maintainance, easy (network-)negotiation,
+**	simplifies load/save/reinitialization, etc...
+**
+*/
+struct _settings_ {
+//  Individual presets:
+//  For single-player game only Presets[0] will be used..
+    struct {
+	unsigned	Race;		/// race of the player
+	unsigned	Team;		/// team of player -- NOT SELECTABLE YET
+    }	Presets[PlayerMax];
+
+//  Common settings:
+    unsigned	Resources;		/// preset resource factor
+    unsigned	NumUnits;		/// preset # of units
+    unsigned	Opponents;		/// preset # of ai-opponents
+    unsigned	Terrain;		/// terrain type (summer,winter,...)
+};
+
+#define SettingsPresetMapDefault	(~0ul)	/// Special: Use pud/cm supplied
+
+/*
+**	Resource-Preset factor -- NOT USED YET
+*/
+#define SettingsResourcesMapDefault	SettingsPresetMapDefault
+#define SettingsResourcesLow		0
+#define SettingsResourcesMedium		1
+#define SettingsResourcesHigh		2
+
+/*
+**	NumUnits start settings
+*/
+#define SettingsNumUnitsMapDefault	SettingsPresetMapDefault
+#define SettingsNumUnits1		0
+
+/*----------------------------------------------------------------------------
+
+--	Variables
+----------------------------------------------------------------------------*/
+
+extern Settings GameSettings;		/// Game Settings
+
+/*----------------------------------------------------------------------------
+--	Functions
+----------------------------------------------------------------------------*/
+
+    /// Create a game
+extern void CreateGame(char* filename,WorldMap* map);
+    /// Init Setting to default values
+extern void InitSettings(void);
+
+//@}
+
+#endif // !__SETTINGS_H__
diff --git a/src/include/video.h b/src/include/video.h
index 22908febf..909063632 100644
--- a/src/include/video.h
+++ b/src/include/video.h
@@ -24,6 +24,16 @@
 --	Includes
 ----------------------------------------------------------------------------*/
 
+/*----------------------------------------------------------------------------
+--	Variables
+----------------------------------------------------------------------------*/
+
+extern global int ColorCycleAll;
+#ifdef DEBUG
+extern unsigned AllocatedGraphicMemory;
+extern unsigned CompressedGraphicMemory;
+#endif
+
 /*----------------------------------------------------------------------------
 --	Declarations
 ----------------------------------------------------------------------------*/
@@ -32,7 +42,6 @@ typedef unsigned char VMemType8;	///  8 bpp modes pointer
 typedef unsigned short VMemType16;	/// 16 bpp modes pointer
 typedef struct { char a,b,c;} VMemType24;/// 24 bpp modes pointer
 typedef unsigned long VMemType32;	/// 32 bpp modes pointer
-extern global int ColorCycleAll;
 
 /**
 **	General video mode pointer.
diff --git a/src/map/map.cpp b/src/map/map.cpp
index c85043a51..4b607576b 100644
--- a/src/map/map.cpp
+++ b/src/map/map.cpp
@@ -45,113 +45,8 @@ global unsigned MapX;			/// Map tile X start on display
 global unsigned MapY;			/// Map tile Y start on display
 global unsigned MapWidth;		/// map width in tiles
 global unsigned MapHeight;		/// map height in tiles
-global int lcm_prevent_recurse = 0;	/// prevent recursion through LoadGameMap
 
-/*----------------------------------------------------------------------------
---	Map loading/saving
-----------------------------------------------------------------------------*/
-
-/**
-**	Load a clone map.
-**
-**	@param filename	map filename
-**	@param map	map loaded
-*/
-local void LoadGameMap(const char* filename,WorldMap* map)
-{
-    DebugLevel3(__FUNCTION__" %p \n",map);
-
-#if defined(USE_CCL) || defined(USE_CCL2)
-    if (lcm_prevent_recurse) {
-	fprintf(stderr,"recursive use of load clone map!\n");
-	exit(-1);
-    }
-    lcm_prevent_recurse = 1;
-    gh_eval_file((char*)filename);
-    lcm_prevent_recurse = 0;
-    if (!ThisPlayer) {		/// ARI: bomb if nothing was loaded!
-	fprintf(stderr,"%s: invalid clone map\n", filename);
-	exit(-1);
-    }
-#else
-    fprintf(stderr,"Sorry, you need guile/siod installed to use clone maps!\n");
-    exit(-1);
-#endif
-}
-
-/**
-**	Load any map.
-**
-**	@param filename	map filename
-**	@param map	map loaded
-*/
-global void LoadMap(const char* filename,WorldMap* map)
-{
-    const char* tmp;
-
-    tmp=strrchr(filename,'.');
-    if( tmp ) {
-#ifdef USE_ZLIB
-	if( !strcmp(tmp,".gz") ) {
-	    while( tmp-1>filename && *--tmp!='.' ) {
-	    }
-	} else
-#endif
-#ifdef USE_BZ2LIB
-	if( !strcmp(tmp,".bz2") ) {
-	    while( tmp-1>filename && *--tmp!='.' ) {
-	    }
-	}
-#endif
-	if( !strcmp(tmp,".cm")
-#ifdef USE_ZLIB
-		|| !strcmp(tmp,".cm.gz")
-#endif
-#ifdef USE_BZ2LIB
-		|| !strcmp(tmp,".cm.bz2")
-#endif
-	) {
-	    LoadGameMap(filename,map);
-	    return;
-	}
-#if 0	// ARI: avoid delayed crash by not loading anything!
-	else if( !strcmp(tmp,".pud") || !strcmp(tmp,".pud.gz") || !strcmp(tmp,".pud.bz2") ) {
-	    LoadPud(filename,map);
-	    // return;
-	}
-#endif
-    }
-    // ARI: This bombs out, if no pud, so will be safe.
-    LoadPud(filename,map);
-}
-
-/**
-**	Save a map.
-**
-**	@param file	Output file.
-*/
-global void SaveMap(FILE* file)
-{
-    fprintf(file,"\n;;; -----------------------------------------\n");
-    fprintf(file,";;; MODULE: map $Id$\n");
-
-    fprintf(file,"(freecraft-map\n");
-
-    // FIXME: Need version number here!
-    fprintf(file,"  '(version %d.%d)\n",0,0);
-    fprintf(file,"  '(description \"Saved\")\n");
-    fprintf(file,"  '(terrain %d \"%s\")\n"
-	    ,TheMap.Terrain,Tilesets[TheMap.Terrain].Name);
-    fprintf(file,"  '(tiles #(\n");
-    fprintf(file,"  )\n");
-
-    fprintf(file,")\n");
-
-    fprintf(file,"(the-map\n");
-    fprintf(file,"  (%d %d)\n",TheMap.Width,TheMap.Height);
-    fprintf(file,"  %d\n",TheMap.NoFogOfWar);
-    fprintf(file,")\n");
-}
+global int FlagRevealMap;		/// Flag must reveal the map
 
 /*----------------------------------------------------------------------------
 --	Visibile and explored handling
diff --git a/src/stratagus/pud.cpp b/src/stratagus/pud.cpp
index 3d0c4d3ae..b5524c165 100644
--- a/src/stratagus/pud.cpp
+++ b/src/stratagus/pud.cpp
@@ -37,6 +37,7 @@
 #include "unit.h"
 #include "pud.h"
 #include "iolib.h"
+#include "settings.h"
 
 #include "myendian.h"
 
@@ -304,11 +305,11 @@ global PudInfo* GetPudInfo(const char* pud)
     }
     header[4]='\0';
     if( !PudReadHeader(input,header,&length) ) {
-	fprintf(stderr,"%s: invalid pud\n", pud);
+	fprintf(stderr,"GetPudInfo: %s: invalid pud\n", pud);
 	exit(-1);
     }
     if( memcmp(header,"TYPE",4) || length!=16 ) {
-	fprintf(stderr,"%s: invalid pud\n", pud);
+	fprintf(stderr,"GetPudInfo: %s: invalid pud\n", pud);
 	exit(-1);
     }
     if( CLread(input,buf,16)!=16 ) {	// IGNORE TYPE
@@ -316,7 +317,7 @@ global PudInfo* GetPudInfo(const char* pud)
 	exit(-1);
     }
     if( strcmp(buf,"WAR2 MAP") ) {	// ONLY CHECK STRING
-	fprintf(stderr,"%s: invalid pud\n", pud);
+	fprintf(stderr,"GetPudInfo: %s: invalid pud\n", pud);
 	exit(-1);
     }
 
@@ -722,11 +723,11 @@ global void LoadPud(const char* pud,WorldMap* map)
     }
     header[4]='\0';
     if( !PudReadHeader(input,header,&length) ) {
-	fprintf(stderr,"%s: invalid pud\n", pud);
+	fprintf(stderr,"LoadPud: %s: invalid pud\n", pud);
 	exit(-1);
     }
     if( memcmp(header,"TYPE",4) || length!=16 ) {
-	fprintf(stderr,"%s: invalid pud\n", pud);
+	fprintf(stderr,"LoadPud: %s: invalid pud\n", pud);
 	exit(-1);
     }
     if( CLread(input,buf,16)!=16 ) {	// IGNORE TYPE
@@ -734,7 +735,7 @@ global void LoadPud(const char* pud,WorldMap* map)
 	exit(-1);
     }
     if( strcmp(buf,"WAR2 MAP") ) {	// ONLY CHECK STRING
-	fprintf(stderr,"%s: invalid pud\n", pud);
+	fprintf(stderr,"LoadPud: %s: invalid pud\n", pud);
 	exit(-1);
     }
 
@@ -942,7 +943,11 @@ global void LoadPud(const char* pud,WorldMap* map)
 			    v=PlayerRaceNeutral;
 			    break;
 		    }
-		    PlayerSetSide(&Players[i],v);
+		    if (GameSettings.Presets[i].Race == SettingsPresetMapDefault) {
+			PlayerSetSide(&Players[i],v);
+		    } else {
+			PlayerSetSide(&Players[i],GameSettings.Presets[i].Race);
+		    }
 		}
 		continue;
 	    } else {
@@ -1113,6 +1118,7 @@ global void LoadPud(const char* pud,WorldMap* map)
 	    int t;
 	    int o;
 	    int v;
+	    int s;
 	    Unit* unit;
 
 	    while( length>=8 ) {
@@ -1128,6 +1134,15 @@ global void LoadPud(const char* pud,WorldMap* map)
 		    Players[o].X=MapOffsetX+x;
 		    Players[o].Y=MapOffsetY+y;
 		} else {
+		    if ((s = GameSettings.Presets[o].Race) != SettingsPresetMapDefault) {
+			if (s == PlayerRaceHuman && (t & 1) == 1) {
+			    t--;
+			}
+			if (s == PlayerRaceOrc && (t & 1) == 0) {
+			    t++;
+			}
+			// FIXME: This is hard-code WCII ... also: support more races..
+		    }
 		    unit=MakeUnitAndPlace(MapOffsetX+x,MapOffsetY+y
 			    ,UnitTypeByWcNum(t),&Players[o]);
 		    if( unit->Type->GoldMine || unit->Type->OilPatch ) {
diff --git a/src/stratagus/stratagus.cpp b/src/stratagus/stratagus.cpp
index 06597fb4d..f77eb4e05 100644
--- a/src/stratagus/stratagus.cpp
+++ b/src/stratagus/stratagus.cpp
@@ -70,19 +70,27 @@ extern int getopt(int argc, char *const*argv, const char *opt);
 #include "sound_server.h"
 #include "sound.h"
 #include "network.h"
-#include "pathfinder.h"
-#include "spells.h"
+#include "settings.h"
 
 /*----------------------------------------------------------------------------
 --	Variables
 ----------------------------------------------------------------------------*/
 
 #ifdef DEBUG
-extern unsigned AllocatedGraphicMemory;
-extern unsigned CompressedGraphicMemory;
 extern SCM CclUnits(void);
 #endif
 
+global char* TitleScreen;		/// Titlescreen to show at startup
+global char* FreeCraftLibPath;		/// Path for data
+
+    /// Name, Version, Copyright
+global char NameLine[] =
+    "FreeCraft V" VERSION ", (c) 1998-2000 by The FreeCraft Project.";
+
+    /// Filename of the map to load
+local char* MapName = NULL;
+
+
 /*----------------------------------------------------------------------------
 --	Speedups
 ----------------------------------------------------------------------------*/
@@ -156,134 +164,6 @@ global void SaveAll(void)
     fclose(file);
 }
 
-/*----------------------------------------------------------------------------
---	INIT
-----------------------------------------------------------------------------*/
-
-/**
-**	Initialise.
-**
-**		Load all graphics, sounds.
-*/
-global void FreeCraftInit(void)
-{
-    char* PalettePath;
-
-    DebugLevel3("Terrain %d\n",TheMap.Terrain);
-
-    // FIXME: must use palette from tileset!!
-    // FIXME: this must be extendable!!
-
-    switch( TheMap.Terrain ) {
-	case TilesetSummer:
-            PalettePath = strdcat(FreeCraftLibPath, "/summer.rgb");
-	    break;
-	case TilesetWinter:
-            PalettePath = strdcat(FreeCraftLibPath, "/winter.rgb");
-	    break;
-	case TilesetWasteland:
-            PalettePath = strdcat(FreeCraftLibPath, "/wasteland.rgb");
-	    break;
-	case TilesetSwamp:
-            PalettePath = strdcat(FreeCraftLibPath, "/swamp.rgb");
-	    break;
-	default:
-	    DebugLevel2("Unknown Terrain %d\n",TheMap.Terrain);
-            PalettePath = strdcat(FreeCraftLibPath, "/summer.rgb");
-	    break;
-    }
-    LoadRGB(GlobalPalette, PalettePath);
-    VideoCreatePalette(GlobalPalette);
-
-    //
-    //	Graphic part
-    //
-    LoadIcons();
-    InitMenus(ThisPlayer->Race);
-    LoadImages(ThisPlayer->Race);
-    LoadCursors(ThisPlayer->Race);
-    LoadTileset();
-    InitUnitButtons();
-    LoadMissileSprites();
-    InitSpells();
-    LoadUnitSprites();
-    LoadConstructions();
-    LoadDecorations();
-
-    IfDebug(
-	DebugLevel0("Graphics uses %d bytes (%d KB, %d MB)\n"
-		,AllocatedGraphicMemory
-		,AllocatedGraphicMemory/1024
-		,AllocatedGraphicMemory/1024/1024);
-	DebugLevel0("Compressed graphics uses %d bytes (%d KB, %d MB)\n"
-		,CompressedGraphicMemory
-		,CompressedGraphicMemory/1024
-		,CompressedGraphicMemory/1024/1024);
-    );
-
-    // FIXME: johns: did this belong into LoadMap?
-    CreateMinimap();			// create minimap for pud
-    InitMap();				// setup draw functions
-    InitMapFogOfWar();			// build tables for fog of war
-    PreprocessMap();			// Adjust map for use
-    MapColorCycle();			// Setup color cycle
-
-    InitUserInterface();		// Setup the user interface.
-
-    //
-    //	Sound part
-    //
-    //FIXME: check if everything is really loaded
-    LoadUnitSounds();
-    MapUnitSounds();
-
-#ifdef WITH_SOUND
-    IfDebug(
-	DebugLevel0("Sounds uses %d bytes (%d KB, %d MB)\n"
-		,AllocatedSoundMemory
-		,AllocatedSoundMemory/1024
-		,AllocatedSoundMemory/1024/1024);
-	DebugLevel0("Compressed sounds uses %d bytes (%d KB, %d MB)\n"
-		,CompressedSoundMemory
-		,CompressedSoundMemory/1024
-		,CompressedSoundMemory/1024/1024);
-    );
-#endif
-
-    //
-    //	Network part
-    //
-    InitNetwork();
-
-    //
-    //  Init units' groups
-    //
-    InitGroups();
-
-    //
-    //	Init players?
-    //
-    DebugPlayers();
-    PlayersInitAi();
-
-    //
-    //  Upgrades
-    //
-    InitUpgrades();
-
-    //
-    //  Dependencies
-    //
-    InitDependencies();
-
-    //
-    //  Buttons (botpanel)
-    //
-    InitButtons();
-
-    MapCenter(ThisPlayer->X,ThisPlayer->Y);
-}
-
 /*----------------------------------------------------------------------------
 --	Random
 ----------------------------------------------------------------------------*/
@@ -336,19 +216,8 @@ global char* strdcat3(const char* l, const char* m, const char* r) {
 ==	MAIN
 ============================================================================*/
 
-global char* TitleScreen;		/// Titlescreen show by startup
-global char* FreeCraftLibPath;		/// Path for data
-global int FlagRevealMap;		/// Flag must reveal the map
-
-
-local char* MapName;			/// Filename of the map to load
-
-    /// Name, Version, Copyright
-local char NameLine[] =
-    "FreeCraft V" VERSION ", (c) 1998-2000 by The FreeCraft Project.";
-
 /**
-**	Main, called from guile main.
+**	Main1, called from guile main / main.
 **
 **	@param	argc	Number of arguments.
 **	@param	argv	Vector of arguments.
@@ -356,82 +225,6 @@ local char NameLine[] =
 global int main1(int argc __attribute__ ((unused)),
 	char** argv __attribute__ ((unused)))
 {
-    InitVideo();			// setup video display
-#ifdef WITH_SOUND
-    if( InitSound() ) {			// setup sound card
-	SoundOff=1;
-	SoundFildes=-1;
-    }
-#endif
-
-    //
-    //	Show title screen.
-    //
-    SetClipping(0,0,VideoWidth,VideoHeight);
-    if( TitleScreen ) {
-	DisplayPicture(TitleScreen);
-    }
-    Invalidate();
-
-    //
-    //  Units Memory Management
-    //
-    InitUnitsMemory();
-    UpdateStats();
-    InitUnitTypes();
-
-    // 
-    //  Inital menues require some gfx..
-    //
-    LoadRGB(GlobalPalette, strdcat(FreeCraftLibPath, "/summer.rgb"));
-    VideoCreatePalette(GlobalPalette);
-    LoadFonts();
-
-    // All pre-start menues are orcish - may need to be switched later..
-    SetDefaultTextColors(FontYellow,FontWhite);
-    InitMenus(1);
-    LoadImages(1);
-    LoadCursors(1);
-
-    //
-    //	Load the map.
-    //
-    LoadMap(MapName,&TheMap);
-    if( FlagRevealMap ) {
-	RevealMap();
-    }
-
-    FreeCraftInit();
-#ifdef WITH_SOUND
-    if (SoundFildes!=-1) {
-	//FIXME: must be done after map is loaded
-	if ( InitSoundServer() ) {
-	    SoundOff=1;
-	    SoundFildes=-1;
-	} else {
-	    // must be done after sounds are loaded
-	    InitSoundClient();
-	}
-    }
-#endif
-    //FIXME: must be done after map is loaded
-    if(AStarOn) {
-	InitAStar();
-    }
-
-    SetStatusLine(NameLine);
-    SetMessage("Do it! Do it now!");
-
-    if( ThisPlayer->Race==PlayerRaceHuman ) {
-	SetDefaultTextColors(FontWhite,FontYellow);
-	// FIXME: Add this again:
-	//	PlaySound(SoundBasicHumanVoicesSelected1);
-    } else if( ThisPlayer->Race==PlayerRaceOrc ) {
-	SetDefaultTextColors(FontYellow,FontWhite);
-	// FIXME: Add this again:
-	//	PlaySound(SoundBasicOrcVoicesSelected1);
-    }
-    // FIXME: more races supported
 
     printf("%s\n  written by Lutz Sammer, Fabrice Rossi, Vladi Shabanski, Patrice Fortier,\n  Jon Gabrielson, Andreas Arens and others."
 #ifdef USE_CCL2
@@ -482,6 +275,52 @@ This software is provided as-is.  The author(s) can not be held liable for any\
 Use it at your own risk.\n"
 	,NameLine);
 
+    InitVideo();			// setup video display
+#ifdef WITH_SOUND
+    if( InitSound() ) {			// setup sound card
+	SoundOff=1;
+	SoundFildes=-1;
+    }
+#endif
+
+    //
+    //	Show title screen.
+    //
+    SetClipping(0,0,VideoWidth,VideoHeight);
+    if( TitleScreen ) {
+	DisplayPicture(TitleScreen);
+    }
+    Invalidate();
+
+    //
+    //  Units Memory Management
+    //
+    InitUnitsMemory();
+    UpdateStats();
+    InitUnitTypes();
+
+    // 
+    //  Inital menues require some gfx..
+    //
+    LoadRGB(GlobalPalette, strdcat(FreeCraftLibPath, "/summer.rgb"));
+    VideoCreatePalette(GlobalPalette);
+    LoadFonts();
+
+    // All pre-start menues are orcish - may need to be switched later..
+    SetDefaultTextColors(FontYellow,FontWhite);
+    InitMenus(1);
+    LoadImages(1);
+    LoadCursors(1);
+    InitSettings();
+
+    //
+    //	Create the game.
+    //
+    CreateGame(MapName,&TheMap);
+
+    SetStatusLine(NameLine);
+    SetMessage("Do it! Do it now!");
+
     GameMainLoop();
 
     return 0;
@@ -571,12 +410,9 @@ global int main(int argc,char** argv)
 #endif
 #if defined(USE_CCL) || defined(USE_CCL2)
     CclStartFile="ccl/freecraft.ccl";
-    MapName="default.cm";
-#else
-    MapName="default.pud";	// .gz/.bz2 automatically appended as needed.
 #endif
 
-    // FIXME: Parse options before ccl oder after?
+    // FIXME: Parse options before or after ccl?
 
     //
     //	Parse commandline
@@ -677,9 +513,6 @@ global int main(int argc,char** argv)
 	--argc;
     }
 
-    if (MapName[0] != '/' && MapName[0] != '.') {
-        MapName = strdcat3(FreeCraftLibPath, "/", MapName);
-    }
 #if defined(USE_CCL) || defined(USE_CCL2)
     if (CclStartFile[0] != '/' && CclStartFile[0] != '.') {
         CclStartFile = strdcat3(FreeCraftLibPath, "/", CclStartFile);
diff --git a/src/ui/menus.cpp b/src/ui/menus.cpp
index a7d5c3cad..762d72600 100644
--- a/src/ui/menus.cpp
+++ b/src/ui/menus.cpp
@@ -38,6 +38,7 @@
 #include "map.h"
 #include "pud.h"
 #include "iolib.h"
+#include "settings.h"
 
 /*----------------------------------------------------------------------------
 --	Prototypes for local functions
@@ -75,10 +76,15 @@ local void CustomGameCancel(void);
 local void CustomGameStart(void);
 local void CustomGameDrawFunc(Menuitem *mi);
 
+local void CustomGameRCSAction(Menuitem *mi, int i);
+
 /*----------------------------------------------------------------------------
 --	Variables
 ----------------------------------------------------------------------------*/
 
+    /// Name, Version, Copyright
+extern char NameLine[];
+
 // FIXME: Johns: this must be all be configured from ccl some time.
 
     /// private struct which specifies the buttons gfx
@@ -203,6 +209,8 @@ local Menuitem ScenSelectMenuItems[] = {
 **	Items for the Prg Start Menu
 */
 local Menuitem PrgStartMenuItems[] = {
+    { MI_TYPE_TEXT, 640/2, 440, 0, GameFont, NULL, NULL,
+	{ text:{ NameLine, MI_TFLAGS_CENTERED} } },
     { MI_TYPE_BUTTON, 208, 320, 0, LargeFont, StartMenusSetBackground, NULL,
 	{ button:{ "~!Single Player Game", 224, 27, MBUTTON_GM_FULL, SinglePlayerGameMenu, 's'} } },
     { MI_TYPE_BUTTON, 208, 320 + 36, MenuButtonDisabled, LargeFont, NULL, NULL,
@@ -265,7 +273,7 @@ local Menuitem CustomGameMenuItems[] = {
     { MI_TYPE_TEXT, 40, 10+240-20, 0, GameFont, NULL, NULL,
 	{ text:{ "~<Your Race:~>", 0} } },
     { MI_TYPE_PULLDOWN, 40, 10+240, 0, GameFont, NULL, NULL,
-	{ pulldown:{ cgrcsoptions, 152, 20, MBUTTON_PULLDOWN, NULL, 3, 2, 2, 0} } },
+	{ pulldown:{ cgrcsoptions, 152, 20, MBUTTON_PULLDOWN, CustomGameRCSAction, 3, 2, 2, 0} } },
     { MI_TYPE_TEXT, 220, 10+240-20, 0, GameFont, NULL, NULL,
 	{ text:{ "~<Resources:~>", 0} } },
     { MI_TYPE_PULLDOWN, 220, 10+240, 0, GameFont, NULL, NULL,
@@ -330,7 +338,7 @@ global Menu Menus[] = {
 	0,
 	640, 480,
 	ImageNone,
-	0, 3,
+	1, 4,
 	PrgStartMenuItems
     },
     {
@@ -709,7 +717,11 @@ local void ScenSelectMenu(void)
 	i = 0;
     }
     strcat(ScenSelectPath, ScenSelectFileName);		// Final map name with path
-    ScenSelectPudInfo = GetPudInfo(ScenSelectPath);
+    if (strstr(ScenSelectFileName, ".pud")) {
+	ScenSelectPudInfo = GetPudInfo(ScenSelectPath);
+    } else {
+	// FIXME: GetCmInfo();
+    }
     ScenSelectPath[i] = 0;
 }
 
@@ -821,7 +833,12 @@ local int ScenSelectRDFilter(char *pathbuf, FileList *fl)
 #endif
 	if (*cp == 0) {
 	    if (p) {
-		info = GetPudInfo(pathbuf);
+		if (strstr(pathbuf, ".pud")) {
+		    info = GetPudInfo(pathbuf);
+		} else {
+		    info = NULL;
+		    // info = GetCmInfo(pathbuf);
+		}
 		if (info) {
 		    sz = szl[ScenSelectMenuItems[8].d.pulldown.curopt];
 		    if (sz < 0 || (info->MapWidth == sz && info->MapHeight == sz)) {
@@ -832,6 +849,10 @@ local int ScenSelectRDFilter(char *pathbuf, FileList *fl)
 		    } else {
 			FreePudInfo(info);
 		    }
+		} else {
+		    fl->type = 1;
+		    fl->name = strdup(np);
+		    fl->xdata = NULL;
 		}
 	    } else {
 		fl->type = 1;
@@ -1088,16 +1109,24 @@ local void CustomGameStart(void)
 
 local void CustomGameSetupInit(Menuitem *mi __attribute__((unused)))
 {
-    extern int lcm_prevent_recurse;			// FIXME: quickhack
-    lcm_prevent_recurse = 0;
-
     strcpy(ScenSelectPath, FreeCraftLibPath);
+#if 0	// FIXME: as soon as .cm is supported..
+#if defined(USE_CCL) || defined(USE_CCL2)
+    strcpy(ScenSelectFileName, "default.cm");
+#else
+    strcpy(ScenSelectFileName, "default.pud");
+#endif
+#endif
     strcpy(ScenSelectFileName, "default.pud");
     if (ScenSelectPath[0]) {
 	strcat(ScenSelectPath, "/");
     }
     strcat(ScenSelectPath, ScenSelectFileName);		// Final map name with path
-    ScenSelectPudInfo = GetPudInfo(ScenSelectPath);
+    if (strstr(ScenSelectFileName, ".pud")) {
+	ScenSelectPudInfo = GetPudInfo(ScenSelectPath);
+    } else {
+	// FIXME: GetCmInfo();
+    }
     strcpy(ScenSelectPath, FreeCraftLibPath);
 }
 
@@ -1111,11 +1140,13 @@ local void CustomGameDrawFunc(Menuitem *mi)
     SetDefaultTextColors(rc, rc);
     DrawText(16, 360, GameFont, "Scenario:");
     DrawText(16, 360+24 , GameFont, ScenSelectFileName);
-    if (ScenSelectPudInfo->Description) {
-	DrawText(16, 360+24+24, GameFont, ScenSelectPudInfo->Description);
+    if (ScenSelectPudInfo) {
+	if (ScenSelectPudInfo->Description) {
+	    DrawText(16, 360+24+24, GameFont, ScenSelectPudInfo->Description);
+	}
+	sprintf(buffer, "%d x %d", ScenSelectPudInfo->MapWidth, ScenSelectPudInfo->MapHeight);
+	DrawText(16, 360+24+24+24, GameFont, buffer);
     }
-    sprintf(buffer, "%d x %d", ScenSelectPudInfo->MapWidth, ScenSelectPudInfo->MapHeight);
-    DrawText(16, 360+24+24+24, GameFont, buffer);
 #if 0
     for (n = j = 0; j < 16; j++) {
 	if (info->PlayerType[j] == PlayerHuman) {
@@ -1132,6 +1163,13 @@ local void CustomGameDrawFunc(Menuitem *mi)
     SetDefaultTextColors(nc, rc);
 }
 
+local void CustomGameRCSAction (Menuitem *mi __attribute__((unused)), int i)
+{
+    int v[] = { PlayerRaceHuman, PlayerRaceOrc, SettingsPresetMapDefault };
+
+    GameSettings.Presets[0].Race = v[i];
+}
+
 /*----------------------------------------------------------------------------
 --	Menu operation functions
 ----------------------------------------------------------------------------*/
@@ -1519,8 +1557,8 @@ global void MenuHandleButtonUp(int b)
 			    MenuButtonUnderCursor = -1;
 			    if (mi->d.pulldown.cursel != mi->d.pulldown.curopt) {
 				mi->d.pulldown.curopt = mi->d.pulldown.cursel;
-				if (mi->d.button.handler) {
-				    (*mi->d.button.handler)();
+				if (mi->d.pulldown.action) {
+				    (*mi->d.pulldown.action)(mi, mi->d.pulldown.curopt);
 				}
 			    }
 			}