diff --git a/Build/Compilers/ZDoom/zspecial.acs b/Build/Compilers/ZDoom/zspecial.acs
index 39ea921350dd15ba0e1a86c4cf9d0802b7a16c3e..3f7ba0eb6a1b7c51aa64c5dfb136d010f421fa97 100644
--- a/Build/Compilers/ZDoom/zspecial.acs
+++ b/Build/Compilers/ZDoom/zspecial.acs
@@ -396,6 +396,9 @@ special
 	-124:EndDBTransaction(0),
 	-125:GetDBEntries(1),
 	
+	// -1xx are reserved for Zandronum
+	-200:CheckClass(1),
+	
 	// ZDaemon's
 	-19620:GetTeamScore(1),
 	-19621:SetTeamScore(2),
diff --git a/Build/Configurations/Eternity_Doom2Doom.cfg b/Build/Configurations/Eternity_Doom2Doom.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..ac838ceb811a9f98873b590a2168d85c79349d33
--- /dev/null
+++ b/Build/Configurations/Eternity_Doom2Doom.cfg
@@ -0,0 +1,61 @@
+/*************************************************************\
+  Doom Builder 2 Game Configuration for ZDoom-compatible port
+\*************************************************************/
+
+// This is required to prevent accidental use of a different configuration
+type = "Doom Builder 2 Game Configuration";
+
+// This is the title to show for this game
+game = "Eternity: Doom 2 (Doom format)";
+
+// This is the simplified game engine/sourceport name
+engine = "eternity";
+
+// *******************************************************
+// *                                                     *
+// *   Note: all the elements that could be factorized   *
+// *   because they were common to ZDoom, GZDoom and     *
+// *   Zandronum have been moved to ZDoom_common.cfg.     *
+// *                                                     *
+// *******************************************************
+
+// STANDARD DOOM SETTINGS
+// Settings common to all games and all map formats
+include("Includes\\Doom_common.cfg", "common");
+
+// Settings common to Doom map format
+include("Includes\\Eternity_common.cfg", "mapformat_doom");
+
+// Settings common to Doom games
+include("Includes\\Game_Doom.cfg");
+
+//mxd. No DECORATE support in Eternity
+decorategames = "";
+
+// Default thing filters
+// (these are not required, just useful for new users)
+thingsfilters
+{
+	include("Includes\\Doom_misc.cfg", "thingsfilters");
+}
+
+// THING TYPES
+// Each engine has its own additional thing types
+// Order should always be 1: Game; 2: ZDoom/game; 3: ZDoom/zdoom
+thingtypes
+{
+	// Basic game actors
+	include("Includes\\Doom_things.cfg");
+	include("Includes\\Doom2_things.cfg");
+    include("Includes\\Boom_things.cfg");
+    include("Includes\\Eternity_things.cfg");
+}
+
+// ENUMERATIONS
+// Each engine has its own additional thing types
+// These are enumerated lists for linedef types and UDMF fields.
+enums
+{
+	// Basic game enums
+	include("Includes\\Doom_misc.cfg", "enums");
+}
diff --git a/Build/Configurations/Eternity_DoomUDMF.cfg b/Build/Configurations/Eternity_DoomUDMF.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..4f53b6c8871a2acaccfe4867bf9ffaae708644b7
--- /dev/null
+++ b/Build/Configurations/Eternity_DoomUDMF.cfg
@@ -0,0 +1,57 @@
+/*************************************************************\
+  Doom Builder 2 Game Configuration for Eternity on UDMF
+\*************************************************************/
+
+// This is required to prevent accidental use of a different configuration
+type = "Doom Builder 2 Game Configuration";
+
+// This is the title to show for this game
+game = "Eternity: Doom 2 (UDMF)";
+
+// This is the simplified game engine/sourceport name
+engine = "eternity";
+
+// STANDARD ETERNITY SETTINGS
+// Settings common to all games and all map formats
+include("Includes\\Eternity_common.cfg", "common");
+
+// Settings common to text map format
+include("Includes\\Eternity_common.cfg", "mapformat_udmf");
+
+// Settings common to Doom games
+include("Includes\\Game_Doom.cfg");
+
+//mxd. No DECORATE support in Eternity
+decorategames = "";
+
+// Default thing filters
+// (these are not required, just useful for new users)
+thingsfilters
+{
+	include("Includes\\ZDoom_misc.cfg", "thingsfilters_udmf");
+}
+
+// THING TYPES
+// Each engine has its own additional thing types
+// Order should always be 1: Game; 2: ZDoom/game; 3: ZDoom/zdoom
+thingtypes
+{
+	// Basic game actors
+	include("Includes\\Doom_things.cfg");
+	include("Includes\\Doom2_things.cfg");
+	include("Includes\\Eternity_things.cfg");
+}
+
+// ENUMERATIONS
+// Each engine has its own additional thing types
+// These are enumerated lists for linedef types and UDMF fields.
+enums
+{
+	// Basic game enums
+	include("Includes\\Doom_misc.cfg", "enums");
+	// Standard ZDoom enums
+	include("Includes\\ZDoom_misc.cfg", "enums");
+	// Additional ZDoom enums for that game
+	include("Includes\\ZDoom_misc.cfg", "enums_doom");
+	include("Includes\\Eternity_misc.cfg", "enums");
+}
diff --git a/Build/Configurations/Includes/Eternity_common.cfg b/Build/Configurations/Includes/Eternity_common.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..13d300e85e34be2d87ddeb3397af2c8149d3e5b9
--- /dev/null
+++ b/Build/Configurations/Includes/Eternity_common.cfg
@@ -0,0 +1,364 @@
+// ***********************************************************
+// *                                                         *
+// * These values are mainly for UDMF Eternity               *
+// *                                                         *
+// ***********************************************************
+
+common
+{
+	// Some common settings
+	include("Common.cfg");
+
+	// Default testing parameters
+	include("Test_params.cfg", "vanilla_mapxx");	// Eternity doesn't yet have +map
+
+	// Action special help (mxd)
+	actionspecialhelp = "http://eternity.youfailit.net/wiki/Detailed_parameterized_linedef_specification";
+	
+	// FIXME: this info is not on the wiki, but in things.edf
+	// Thing class help (mxd)
+	thingclasshelp = "https://github.com/team-eternity/eternity/blob/master/base/doom/things.edf";
+
+	// Default nodebuilder configurations
+	defaultsavecompiler = "zdbsp_normal";
+	defaulttestcompiler = "zdbsp_fast";
+
+	// Generalized actions
+	// generalizedlinedefs is true for Doom format and false for
+	// the other two, so it's not here.
+	generalizedsectors = true;
+	
+	//mxd. Maximum safe map size check (0 means skip check)
+	safeboundary = 0;
+
+	// Texture loading options
+	mixtexturesflats = true;
+	defaulttexturescale = 1.0f;
+	defaultflatscale = 1.0f;
+	scaledtextureoffsets = true;
+	
+	//mxd. Sidedefs compression
+	// ioanch FIXME: what does this do? I made it false
+	sidedefcompressionignoresaction = false;
+
+	// Texture sources
+	textures
+	{
+		include("Doom_misc.cfg", "textures");
+		include("ZDoom_misc.cfg", "textures");	// works for Eternity too
+	}
+	
+	//mxd. HiRes sources
+	hires
+	{
+		include("ZDoom_misc.cfg", "hires");
+	}
+
+	// Patch sources
+	patches
+	{
+		include("Doom_misc.cfg", "patches");
+	}
+
+	// Sprite sources
+	sprites
+	{
+		include("Doom_misc.cfg", "sprites");
+	}
+
+	// Flat sources
+	flats
+	{
+		include("Doom_misc.cfg", "flats");
+	}
+
+	// Colormap sources
+	colormaps
+	{
+		include("Boom_misc.cfg", "colormaps");
+	}
+
+	//mxd. Voxel sources
+	// Not in Eternity
+//	voxels
+//	{
+//		include("ZDoom_misc.cfg", "voxels");
+//	}
+
+	// Generalized sector types
+	gen_sectortypes
+	{
+		include("ZDoom_generalized.cfg", "gen_sectortypes");	// same as in ZDOOM
+	}
+	
+	//mxd. Built-in Damage types
+	// ioanch: From base/things.edf
+	damagetypes = "Fist Pistol Shotgun Chaingun Plasma BFG BFG_Splash Chainsaw SShotgun BetaBFG BFGBurst Slime Lava Crush Telefrag Falling Suicide Barrel Splash Quake Rocket R_Splash BFG11k_Splash Grenade Hit PlayerMisc Fire";
+}
+
+mapformat_doom
+{
+    mixtexturesflats = true;
+  // The format interface handles the map data format
+  formatinterface = "DoomMapSetIO";
+
+	maplumpnames
+	{
+		include("Doom_misc.cfg", "doommaplumpnames");
+		include("Boom_misc.cfg", "boommaplumpnames");
+	}
+
+  // When this is set to true, sectors with the same tag will light up when a line is highlighted
+  linetagindicatesectors = true;
+
+  // Special linedefs
+  include("ZDoom_misc.cfg", "speciallinedefs_doomhexen");
+
+  // Default flags for first new thing
+  defaultthingflags
+  {
+    include("Doom_misc.cfg", "defaultthingflags");
+  }
+
+  // Door making
+  include("ZDoom_misc.cfg", "doormaking_doom");
+
+  // Generalized actions
+  generalizedlinedefs = true;
+  generalizedsectors = true;
+  
+  // GENERALIZED LINEDEF TYPES
+	gen_linedeftypes
+	{
+		include("Boom_generalized.cfg", "gen_linedeftypes");
+	}
+  
+  // GENERALIZED SECTOR TYPES
+	gen_sectortypes
+	{
+		include("Boom_generalized.cfg", "gen_sectortypes");
+        include("Eternity_generalized.cfg", "gen_sectortypes");
+	}
+  
+  // DEFAULT SECTOR BRIGHTNESS LEVELS
+  sectorbrightness
+  {
+    include("Doom_misc.cfg", "sectorbrightness");
+  }
+
+  // SECTOR TYPES
+  sectortypes
+  {
+    include("Doom_sectors.cfg");
+  }
+
+	// LINEDEF FLAGS
+	linedefflags
+	{
+		include("Doom_misc.cfg", "linedefflags");
+		include("Boom_misc.cfg", "linedefflags");
+        include("Eternity_misc.cfg", "linedefflags");
+	}
+
+	// LINEDEF ACTIVATIONS
+	linedefactivations
+	{
+	}
+
+	// Linedef flags UDMF translation table
+	// This is needed for copy/paste and prefabs to work properly
+	// When the UDMF field name is prefixed with ! it is inverted
+	linedefflagstranslation
+	{
+		include("Doom_misc.cfg", "linedefflagstranslation");
+    include("Boom_misc.cfg", "linedefflagstranslation");
+	}
+
+	// LINEDEF TYPES
+	linedeftypes
+	{
+		include("Doom_linedefs.cfg");
+    include("Boom_linedefs.cfg");
+        include("Eternity_linedefs.cfg", "doom");
+	}
+
+	// THING FLAGS
+	thingflags
+	{
+		include("Doom_misc.cfg", "thingflags");
+    include("Boom_misc.cfg", "thingflags");
+        include("Eternity_misc.cfg", "thingflags");
+	}
+
+	// Thing flags UDMF translation table
+	// This is needed for copy/paste and prefabs to work properly
+	// When the UDMF field name is prefixed with ! it is inverted
+	thingflagstranslation
+	{
+		include("Doom_misc.cfg", "thingflagstranslation");
+    include("Boom_misc.cfg", "thingflagstranslation");
+	}
+		// How to compare thing flags (for the stuck things error checker)
+	thingflagscompare
+	{
+		include("Boom_misc.cfg", "thingflagscompare");
+	}
+
+	// Things flags masks
+	include("Doom_misc.cfg", "thingflagsmasks");
+
+}
+// ***********************************************************
+// *                                                         *
+// *                       Text map format                   *
+// *                                                         *
+// ***********************************************************
+
+mapformat_udmf
+{
+	// The format interface handles the map data format
+	formatinterface = "UniversalMapSetIO";
+
+	//mxd. The default script compiler to use
+	defaultscriptcompiler = "zdoom_acs.cfg"; 
+
+	// Enables support for long (> 8 chars) texture names
+	// WARNING: this should only be enabled for UDMF game configurations!
+	// WARNING: enabling this will make maps incompatible with Doom Builder 2 and can lead to problems in Slade 3!
+	longtexturenames = true;
+	
+	// Default nodebuilder configurations
+	defaultsavecompiler = "zdbsp_udmf_normal";
+	defaulttestcompiler = "zdbsp_udmf_fast";
+	
+	// ioanch: eternity
+	engine = "eternity"; // override that so that DB2 uses the correct namespace
+
+	maplumpnames
+	{
+		include("UDMF_misc.cfg", "udmfmaplumpnames_begin");
+		include("ZDoom_misc.cfg", "udmfmaplumpnames");
+		include("UDMF_misc.cfg", "udmfmaplumpnames_end");
+	}
+
+	// eternity
+	universalfields
+	{
+		include("Eternity_misc.cfg", "universalfields");
+	}
+
+	// When this is set to true, sectors with the same tag will light up when a line is highlighted
+	linetagindicatesectors = false;
+
+	// Special linedefs
+	include("ZDoom_misc.cfg", "speciallinedefs_udmf");	// same in EE
+
+	// Default flags for first new thing
+	defaultthingflags
+	{
+		include("Eternity_misc.cfg", "defaultthingflags_udmf");
+	}
+
+	// Door making
+	include("Eternity_misc.cfg", "doormaking_udmf");
+
+	// Generalized actions
+	generalizedlinedefs = false;
+
+	// SECTOR FLAGS
+	sectorflags
+	{
+		include("Eternity_misc.cfg", "sectorflags_udmf");
+	}
+	
+	// DEFAULT SECTOR BRIGHTNESS LEVELS
+	sectorbrightness
+	{
+		include("ZDoom_misc.cfg", "sectorbrightness");
+	}
+
+	// SECTOR TYPES
+	sectortypes
+	{
+		include("Eternity_misc.cfg", "sectors_udmf");
+	}
+
+	// SECTOR RENSERSTYLES
+	sectorrenderstyles
+	{
+		include("UDMF_misc.cfg", "sectorrenderstyles");
+	}
+
+	// LINEDEF FLAGS
+	linedefflags
+	{
+		include("Eternity_misc.cfg", "linedefflags_udmf");
+	}
+
+	// LINEDEF ACTIVATIONS
+	linedefactivations
+	{
+		include("Eternity_misc.cfg", "linedefactivations_udmf");
+	}
+	
+	//mxd. Linedef flags UDMF translation table
+	// This is needed for copy/paste and prefabs to work properly
+	// When the UDMF field name is prefixed with ! it is inverted
+	linedefflagstranslation
+	{
+		include("Doom_misc.cfg", "linedefflagstranslation");
+		include("Hexen_misc.cfg", "linedefflagstranslation");
+		include("ZDoom_misc.cfg", "linedefflagstranslation");
+	} 
+
+	// LINEDEF RENSERSTYLES
+	linedefrenderstyles
+	{
+		include("UDMF_misc.cfg", "linedefrenderstyles");
+	}
+
+	//SIDEDEF FLAGS
+	sidedefflags
+	{
+		include("Eternity_misc.cfg", "sidedefflags");  
+	}
+
+	// THING FLAGS
+	thingflags
+	{
+		include("Eternity_misc.cfg", "thingflags_udmf");
+	}
+	
+	// THING RENSERSTYLES
+	thingrenderstyles
+	{
+		include("UDMF_misc.cfg", "thingrenderstyles");
+	}
+
+	// How to compare thing flags (for the stuck things error checker)
+	thingflagscompare
+	{
+		include("Eternity_misc.cfg", "thingflagscompare_udmf");
+	}
+
+	//mxd. Thing flags UDMF translation table
+	// This is needed for copy/paste and prefabs to work properly
+	// When the UDMF field name is prefixed with ! it is inverted
+	thingflagstranslation
+	{
+		include("Doom_misc.cfg", "thingflagstranslation");
+		include("Hexen_misc.cfg", "thingflagstranslation");
+		include("ZDoom_misc.cfg", "thingflagstranslation");
+	}
+
+	// Things flags masks
+	include("Hexen_misc.cfg", "thingflagsmasks");
+
+	// LINEDEF TYPES
+	linedeftypes
+	{
+		include("Hexen_linedefs.cfg");
+		include("Eternity_linedefs.cfg", "udmf");
+	}
+
+}
\ No newline at end of file
diff --git a/Build/Configurations/Includes/Eternity_generalized.cfg b/Build/Configurations/Includes/Eternity_generalized.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..667307d42f31b8057c9d530e81c77ae1e14e3474
--- /dev/null
+++ b/Build/Configurations/Includes/Eternity_generalized.cfg
@@ -0,0 +1,14 @@
+gen_sectortypes
+{
+    allsounds
+    {
+        0 = "sounds in sector are normal";
+        1024 = "sounds in sector are suppressed";
+    }
+    
+    movementsounds
+    {
+        0 = "floor/ceiling normal";
+        2048 = "floor/ceiling silent";
+    }
+}
\ No newline at end of file
diff --git a/Build/Configurations/Includes/Eternity_linedefs.cfg b/Build/Configurations/Includes/Eternity_linedefs.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..e5a43540749271f04e88c16ddfeed1f4083551e4
--- /dev/null
+++ b/Build/Configurations/Includes/Eternity_linedefs.cfg
@@ -0,0 +1,2668 @@
+doom
+{
+	pillar
+	{
+		title = "Pillars";
+		362
+		{
+			title = "Pillar Build";
+			prefix = "--";
+		}
+		363
+		{
+			title = "Pillar Build and Crush";
+			prefix = "--";
+		}
+		364
+		{
+			title = "Pillar Open";
+			prefix = "--";
+		}
+	}
+	polyobject
+	{
+		title = "Polyobjects";
+		348
+		{
+			title = "Polyobject Start Line";
+			prefix = "--";
+		}
+		349
+		{
+			title = "Polyobject Explicit Line";
+			prefix = "--";
+		}
+		350
+		{
+			title = "Polyobject door slide";
+			prefix = "--";
+		}
+		351
+		{
+			title = "Polyobject door swing";
+			prefix = "--";
+		}
+		352
+		{
+			title = "Polyobject move";
+			prefix = "--";
+		}
+		353
+		{
+			title = "Polyobject override move";
+			prefix = "--";
+		}
+		354
+		{
+			title = "Polyobject rotate right";
+			prefix = "--";
+		}
+		355
+		{
+			title = "Polyobject override rotate right";
+			prefix = "--";
+		}
+		356
+		{
+			title = "Polyobject rotate left";
+			prefix = "--";
+		}
+		357
+		{
+			title = "Polyobject override rotate left";
+			prefix = "--";
+		}
+	}
+	thing
+	{
+		title = "Things";
+		398
+		{
+			title = "Thing spawn";
+			prefix = "--";
+		}
+		399
+		{
+			title = "Thing spawn no fog";
+			prefix = "--";
+		}
+		402
+		{
+			title = "Thing projectile";
+			prefix = "--";
+		}
+		403
+		{
+			title = "Thing projectile gravity";
+			prefix = "--";
+		}
+		404
+		{
+			title = "Thing activate";
+			prefix = "--";
+		}
+		405
+		{
+			title = "Thing deactivate";
+			prefix = "--";
+		}
+		421
+		{
+			title = "Thing change TID";
+			prefix = "--";
+		}
+	}
+	transfer
+	{
+		title = "Transfer";
+		281
+		{
+			prefix = "--";
+			title = "Transfer floor to 3dmidtex";
+		}
+		282
+		{
+			prefix = "--";
+			title = "Transfer ceiling to 3dmidtex";
+		}
+	}
+	hereticwind
+	{
+		title = "Heretic wind";
+		293
+		{
+			prefix = "--";
+			title = "Heretic wind by line vector";
+		}
+		294
+		{
+			prefix = "--";
+			title = "Heretic current by line vector";
+		}
+	}
+	portal
+	{
+		title = "Portal";
+		283
+		{
+			prefix = "--";
+			title = "Portal plane ceilings";
+		}
+		284
+		{
+			prefix = "--";
+			title = "Portal plane floors";
+		}
+		285
+		{
+			prefix = "--";
+			title = "Portal plane floors/ceilings";
+		}
+		286
+		{
+			prefix = "--";
+			title = "Portal horizon ceilings";
+		}
+		287
+		{
+			prefix = "--";
+			title = "Portal horizon floors";
+		}
+		288
+		{
+			prefix = "--";
+			title = "Portal horizon floors/ceilings";
+		}
+		290
+		{
+			prefix = "--";
+			title = "Portal skybox ceilings";
+		}
+		291
+		{
+			prefix = "--";
+			title = "Portal skybox floors";
+		}
+		292
+		{
+			prefix = "--";
+			title = "Portal skybox floors/ceilings";
+		}
+		295
+		{
+			prefix = "--";
+			title = "Portal anchored ceilings";
+		}
+		296
+		{
+			prefix = "--";
+			title = "Portal anchored floors";
+		}
+		297
+		{
+			prefix = "--";
+			title = "Portal anchored floors/ceilings";
+		}
+		298
+		{
+			prefix = "--";
+			title = "Portal anchor for 295 and 297";
+		}
+		299
+		{
+			prefix = "--";
+			title = "Portal anchor for 296";
+		}
+		344
+		{
+			prefix = "--";
+			title = "Portal two-way anchored ceilings";
+		}
+		345
+		{
+			prefix = "--";
+			title = "Portal two-way anchored floors";
+		}
+		346
+		{
+			prefix = "--";
+			title = "Portal anchor for 344";
+		}
+		347
+		{
+			prefix = "--";
+			title = "Portal anchor for 345";
+		}
+		289
+		{
+			prefix = "--";
+			title = "Portal transfer";
+		}
+		358
+		{
+			prefix = "--";
+			title = "Portal linked ceilings";
+		}
+		359
+		{
+			prefix = "--";
+			title = "Portal linked floors";
+		}
+		360
+		{
+			prefix = "--";
+			title = "Portal linked anchor for 358";
+		}
+		361
+		{
+			prefix = "--";
+			title = "Portal linked anchor for 359";
+		}
+		376
+		{
+			prefix = "--";
+			title = "Portal linked apply to lines";
+		}
+		377
+		{
+			prefix = "--";
+			title = "Portal linked anchor for 376";
+		}
+		385
+		{
+			prefix = "--";
+			title = "Portal linked apply front sector";
+		}
+	}
+
+	slopes
+	{
+		title = "Slopes";
+		386
+		{
+			prefix = "--";
+			title = "Slope front sector to floor";
+		}
+		387
+		{
+			prefix = "--";
+			title = "Slope front sector to ceiling";
+		}
+		388
+		{
+			prefix = "--";
+			title = "Slope front sector to floor/ceiling";
+		}
+		389
+		{
+			prefix = "--";
+			title = "Slope back sector to floor";
+		}
+		390
+		{
+			prefix = "--";
+			title = "Slope back sector to ceiling";
+		}
+		391
+		{
+			prefix = "--";
+			title = "Slope back sector to floor/ceiling";
+		}
+		392
+		{
+			prefix = "--";
+			title = "Slope back floor and front ceiling";
+		}
+		393
+		{
+			prefix = "--";
+			title = "Slope back ceiling and front floor";
+		}
+		394
+		{
+			prefix = "--";
+			title = "Slope front floor to tagged slope";
+		}
+		395
+		{
+			prefix = "--";
+			title = "Slope front ceiling to tagged slope";
+		}
+		396
+		{
+			prefix = "--";
+			title = "Slope front floor/ceiling to tagged slope";
+		}
+	}
+	surfaces
+	{
+		title = "Attached surfaces";
+		379
+		{
+			prefix = "--";
+			title = "Attach set ceiling control";
+		}
+		380
+		{
+			prefix = "--";
+			title = "Attach set floor control";
+		}
+		381
+		{
+			prefix = "--";
+			title = "Attach floor to control";
+		}
+		382
+		{
+			prefix = "--";
+			title = "Attach ceiling to control";
+		}
+		383
+		{
+			prefix = "--";
+			title = "Attach mirror floor to control";
+		}
+		384
+		{
+			prefix = "--";
+			title = "Attach mirror ceiling to control";
+		}
+	}
+
+	exit
+	{
+		title = "Exit";
+		400
+		{
+			prefix = "--";
+			title = "Teleport end game";
+		}
+	}
+
+	scripts
+	{
+		title = "Scripts";
+		280
+		{
+			prefix = "WR";
+			title = "Script start";
+		}
+		273
+		{
+			prefix = "WR";
+			title = "Script start 1-way";
+		}
+		274
+		{
+			prefix = "W1";
+			title = "Script start";
+		}
+		275
+		{
+			prefix = "W1";
+			title = "Script start 1-way";
+		}
+		276
+		{
+			prefix = "SR";
+			title = "Script start";
+		}
+		277
+		{
+			prefix = "S1";
+			title = "Script start";
+		}
+		278
+		{
+			prefix = "GR";
+			title = "Script start";
+		}
+		279
+		{
+			prefix = "G1";
+			title = "Script start";
+		}
+		365
+		{
+			prefix = "--";
+			title = "Script execute param";
+		}
+		366
+		{
+			prefix = "--";
+			title = "Script suspend param";
+		}
+		367
+		{
+			prefix = "--";
+			title = "Script terminate param";
+		}
+	}
+	extradata
+	{
+		title = "ExtraData";
+		270
+		{
+			prefix = "--";
+			title = "ExtraData linedef";
+		}
+	}
+}
+
+udmf
+{
+	polyobj
+	{	
+		title = "Polyobjects";
+		
+		87
+		{
+			title = "Polyobject Stop";
+			id = "Polyobj_Stop";
+			arg0
+			{
+				title = "Polyobject Number";
+				type = 25;
+			}
+		}
+	}
+
+	line
+	{
+		title = "Line";
+		
+		9
+		{
+			title = "Line Horizon";
+			id = "Line_Horizon";
+			requiresactivation = false;
+		}	
+		
+	}
+
+	door
+	{
+		
+		249
+		{
+			title = "Door Close Wait Open";
+			id = "Door_CloseWaitOpen";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "flat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Delay";
+				type = 11;
+				enum = "generic_door_delays";
+				default = 34;
+			}
+			arg3
+			{
+				title = "Light Tag";
+				type = 13;
+			}
+		}
+	}
+
+	floor
+	{
+		37
+		{
+			title = "Floor Move to Value";
+			id = "Floor_MoveToValue";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Target Height";
+			}
+			arg3
+			{
+				title = "Change";
+				type = 11;
+				enum = "change";
+			}
+			arg4
+			{
+				title = "Crush Damage";
+			}
+		}
+		
+		138
+		{
+			title = "Floor Waggle";
+			id = "Floor_Waggle";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Amplitude";
+			}
+			arg2
+			{
+				title = "Frequency";
+			}
+			arg3
+			{
+				title = "Phase Offset (0-63)";
+			}
+			arg4
+			{
+				title = "Duration";
+				type = 11;
+				enum = "delay_seconds";
+				default = 5;
+			}
+		}
+		
+		200
+		{
+			title = "Floor Generic Change";
+			id = "Generic_Floor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Movement Amount";
+			}
+			arg3
+			{
+				title = "Target";
+				type = 11;
+				enum
+				{
+					0 = "Move by Movement Amount";
+					1 = "Highest neighboring floor";
+					2 = "Lowest neighboring floor";
+					3 = "Nearest neighboring floor";
+					4 = "Lowest neighboring ceiling";
+					5 = "Sector ceiling";
+					6 = "Move by the height of sector's shortest lower texture";
+				}
+			}
+			arg4
+			{
+				title = "Flags";
+				type = 26;
+				enum
+				{
+					0 = "Don't copy anything";
+					1 = "Copy floor texture, remove sector special";
+					2 = "Copy floor texture";
+					3 = "Copy floor texture and special";
+				}
+				flags
+				{
+					4 = "Use numeric model if set, trigger model if not";
+					8 = "Raise floor if set, lower it if not";
+					16 = "Inflict crushing damage";
+				}
+			}
+		}
+		
+		235
+		{
+			title = "Transfer Floor Texture and Special form Back Side";
+			id = "Floor_TransferTrigger";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		236
+		{
+			title = "Transfer Floor Texture and Special using Numeric Change Model";
+			id = "Floor_TransferNumeric";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		238
+		{
+			title = "Floor Raise to Lowest Ceiling";
+			id = "Floor_RaiseToLowestCeiling";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Change";
+				type = 11;
+				enum = "change";
+			}
+			arg3 
+			{
+				title = "Crushing Damage";
+			}
+			arg4
+			{
+				title = "Gap to ceiling";
+			}
+		}
+				
+		240
+		{
+			title = "Floor Raise by Texture";
+			id = "Floor_RaiseByTexture";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Change";
+				type = 11;
+				enum = "change";
+			}
+		}
+		
+		242
+		{
+			title = "Floor Lower to Highest Floor (ZDoom)";
+			id = "Floor_LowerToHighest";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Adjust Target Height";
+			}
+			arg3
+			{
+				title = "Force Adjust";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		
+		256
+		{
+			title = "Floor Lower to Highest Floor";
+			id = "Floor_LowerToHighestEE";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Change";
+				type = 11;
+				enum = "change";
+			}
+		}
+		
+		250
+		{
+			title = "Floor Donut";
+			id = "Floor_Donut";
+			
+			arg0
+			{
+				title = "Center Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Pillar Lower Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Stairs Raise Speed";
+				type = 11;
+				enum = "stair_speeds";
+				default = 4;
+			}
+		}
+		
+		251
+		{
+			title = "Floor and Ceiling Lower and Raise";
+			id = "FloorAndCeiling_LowerRaise";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Floor Lowering Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Ceiling Raising Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Emulate Boom Bug";
+				type = 11;
+				enum
+				{
+					0 = "No";
+					1998 = "Yes";
+				}
+			}
+		}
+	}
+
+	stairs
+	{
+		
+		
+		217
+		{
+			title = "Stairs Build up (Doom mode)";
+			id = "Stairs_BuildUpDoom";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "stair_speeds";
+				default = 4;
+			}
+			arg2
+			{
+				title = "Step Height";
+			}
+			arg3
+			{
+				title = "Build Step Delay";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+			arg4
+			{
+				title = "Reset Delay";
+				type = 11;
+				enum = "reset_tics";
+			}
+		}
+	}
+
+
+	pillar
+	{
+		94	// Pillar_BuildAndCrush
+		{
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+	}
+
+	ceiling
+	{
+		title = "Ceiling";
+		
+		42	// Ceiling Crusher Start
+		{
+			arg3
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+		43	// Ceiling Crush Once
+		{
+			arg3
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+			
+		}
+		
+		97
+		{
+			title = "Ceiling Lower And Crush Dist";
+			id = "Ceiling_LowerAndCrushDist";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+				
+			}
+		
+			arg2
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+		
+			arg3
+			{
+				title = "Lip";
+			}
+		
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+		
+		104
+		{
+			title = "Ceiling Crush And Raise Dist";
+			id = "Ceiling_CrushAndRaiseSilentDist";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		
+			arg1
+			{
+				title = "Lip";
+			}
+		
+			arg2
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+		
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+
+		45	// Ceiling Crush Once and Open
+		{
+			arg3
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+			
+		}
+		47
+		{
+			title = "Ceiling Move to Value";
+			id = "Ceiling_MoveToValue";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Target Height";
+			}
+			arg3
+			{
+				title = "Change";
+				type = 11;
+				enum = "change";
+			}
+		}
+		
+		192
+		{
+			title = "Ceiling Lower to Highest Floor";
+			id = "Ceiling_LowerToHighestFloor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Change";
+				type = 11;
+				enum = "change";
+			}
+			arg3
+			{
+				title = "Crushing Damage";
+			}
+			arg4
+			{
+				title = "Gap to Floor";
+			}
+		}
+		193
+		{
+			title = "Ceiling Lower Instantly by Value * 8";
+			id = "Ceiling_LowerInstant";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg2
+			{
+				title = "Lower by (* 8)";
+			}
+		}
+		194
+		{
+			title = "Ceiling Raise Instantly by Value * 8";
+			id = "Ceiling_RaiseInstant";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg2
+			{
+				title = "Raise by (* 8)";
+			}
+		}
+		195
+		{
+			title = "Ceiling Crush Once and Open A";
+			id = "Ceiling_CrushRaiseAndStayA";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lower Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+			
+		}
+		196
+		{
+			title = "Ceiling Crush Start A";
+			id = "Ceiling_CrushAndRaiseA";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lower Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+			
+		}
+		197
+		{
+			title = "Ceiling Crush Start A (silent)";
+			id = "Ceiling_CrushAndRaiseSilentA";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lower Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+			
+		}
+		198
+		{
+			title = "Ceiling Raise by Value * 8";
+			id = "Ceiling_RaiseByValueTimes8";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise by (* 8)";
+			}
+		}
+		199
+		{
+			title = "Ceiling Lower by Value * 8";
+			id = "Ceiling_LowerByValueTimes8";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Lower by (* 8)";
+			}
+		}
+		
+		201
+		{
+			title = "Ceiling Generic Change";
+			id = "Generic_Ceiling";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Movement Amount";
+			}
+			arg3
+			{
+				title = "Target";
+				type = 11;
+				enum
+				{
+					0 = "Move by Movement Amount";
+					1 = "Highest neighboring ceiling";
+					2 = "Lowest neighboring ceiling";
+					3 = "Nearest neighboring ceiling";
+					4 = "Highest neighboring floor";
+					5 = "Sector floor";
+					6 = "Move by the height of sector's shortest upper texture";
+				}
+			}
+			arg4
+			{
+				title = "Flags";
+				type = 26;
+				enum
+				{
+					0 = "Don't copy anything";
+					1 = "Copy ceiling texture, remove sector special";
+					2 = "Copy ceiling texture";
+					3 = "Copy ceiling texture and special";
+				}
+				flags
+				{
+					4 = "Use numeric model if set, trigger model if not";
+					8 = "Raise ceiling if set, lower it if not";
+					16 = "Inflict crushing damage";
+				}
+			}
+		}
+		205
+		{
+			title = "Ceiling Generic Crush (Doom mode)";
+			id = "Generic_Crusher";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lowering Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raising Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Silent";
+				type = 11;
+				enum = "noyes";
+			}
+			arg4
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+		}
+		252
+		{
+			title = "Ceiling Raise to Nearest Ceiling";
+			id = "Ceiling_RaiseToNearest";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Change";
+				type = 11;
+				enum = "change";
+			}
+		}
+		253
+		{
+			title = "Ceiling Lower to Lowest Ceiling";
+			id = "Ceiling_LowerToLowest";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Change";
+				type = 11;
+				enum = "change";
+			}
+			arg3
+			{
+				title = "Crushing damage";
+			}
+		}
+		254
+		{
+			title = "Ceiling Lower to Floor";
+			id = "Ceiling_LowerToFloor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Change";
+				type = 11;
+				enum = "change";
+			}
+			arg3
+			{
+				title = "Crushing Damage";
+			}
+			arg4
+			{
+				title = "Gap to Floor";
+			}
+		}
+		255
+		{
+			title = "Ceiling Crush Once and Open A (silent)";
+			id = "Ceiling_CrushRaiseAndStaySilA";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lowering Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raising Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+	}
+
+	transfer
+	{
+		title = "Transfer";
+		
+		209
+		{
+			title = "Transfer Heights";
+			id = "Transfer_Heights";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		
+		210
+		{
+			title = "Transfer Floor Brightness";
+			id = "Transfer_FloorLight";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		211
+		{
+			title = "Transfer Ceiling Brightness";
+			id = "Transfer_CeilingLight";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}		
+	}
+
+	platform
+	{
+		206
+		{
+			title = "Platform Lower Wait Raise (lip)";
+			id = "Plat_DownWaitUpStayLip";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Reverse Delay (tics)";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+			arg3
+			{
+				title = "Lip Amount";
+			}
+		}
+		207
+		{
+			title = "Platform Perpetual Move (lip)";
+			id = "Plat_PerpetualRaiseLip";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Reverse Delay (tics)";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+			arg3
+			{
+				title = "Lip Amount";
+			}
+		}
+		228
+		{
+			title = "Platform Raise Tx0";
+			id = "Plat_RaiseAndStayTx0";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Lockout Mode";
+				type = 11;
+				enum
+				{
+					0 = "Lockout in Heretic only";
+					1 = "Don't lockout";
+					2 = "Lockout in all games";
+				}
+			}
+		}
+		230
+		{
+			title = "Platform Raise by Value Tx (* 8)";
+			id = "Plat_UpByValueStayTx";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise by (* 8)";
+			}
+		}
+		231
+		{
+			title = "Platform Toggle Ceiling";
+			id = "Plat_ToggleCeiling";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+	}
+
+	teleport
+	{
+		title = "Teleport";
+		
+		71	// Teleport_NoFog
+		{
+			arg1
+			{
+				title = "Teleport Dest. angle usage";
+				type = 11;
+				enum
+				{
+					0 = "Don't change angle and velocity (Hexen-compat)";
+					1 = "Always use the teleport exit's angle (Strife-compat)";
+					2 = "Adjust relatively to the teleport exit's angle, but in the wrong direction (Boom-compat)";
+					3 = "Adjust relatively to the teleport exit's angle (Boom-fixed)";
+				}
+			}
+			arg3
+			{
+				title = "Keep rel. Height";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		74	// Teleport_NewMap
+		{
+			arg2
+			{
+				title = "Keep Orientation";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		215
+		{
+			title = "Teleport to Line";
+			id = "Teleport_Line";
+			
+			arg1
+			{
+				title = "Target Line Tag";
+				type = 15;
+			}
+			arg2
+			{
+				title = "Reverse Angle";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+	}
+
+	thing
+	{
+		17
+		{
+			title = "Thing Raise";
+			id = "Thing_Raise";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+		}
+		19
+		{
+			title = "Thing Stop";
+			id = "Thing_Stop";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+		}
+		72 // ThrustThing
+		{
+			arg2
+			{
+				title = "No Limit";
+				type = 11;
+				enum = "noyes";
+			}
+			arg3
+			{
+				title = "Target Thing Tag";
+				type = 14;
+			}
+		}
+		73 // DamageThing
+		{
+			arg1
+			{
+				title = "Death";
+				type = 11;
+				enum = "death_types";
+			}
+		}
+		119
+		{
+			title = "Damage Thing by Tag";
+			id = "Thing_Damage";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Damage";
+				default = 100;
+			}
+			arg2
+			{
+				title = "Death";
+				type = 11;
+				enum = "death_types";
+			}
+		}
+		128
+		{
+			title = "Thing Thrust Z";
+			id = "ThrustThingZ";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Force";
+			}
+			arg2
+			{
+				title = "Down/Up";
+				type = 11;
+				enum = "updown";
+			}
+			arg3
+			{
+				title = "Set/Add";
+				type = 11;
+				enum = "setadd";
+			}
+		}
+		135	// Thing_Spawn
+		{
+			arg3
+			{
+				title = "New Thing Tag";
+				type = 14;
+			}
+		}
+		137	// Thing_SpawnNoFog
+		{
+			arg3
+			{
+				title = "New Thing Tag";
+				type = 14;
+			}
+		}
+		176
+		{
+			title = "Change Thing Tag";
+			id = "Thing_ChangeTID";
+			
+			arg0
+			{
+				title = "Old Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "New Thing Tag";
+				type = 14;
+			}
+		}
+		248
+		{
+			title = "Heal Thing";
+			id = "HealThing";
+			
+			arg0
+			{
+				title = "Heal Amount";
+			}
+			arg1
+			{
+				title = "Max health";
+			}
+		}
+		
+	}
+
+	script
+	{
+		title = "Script";
+		
+		83	// Script Locked Execute
+		{
+			arg4	// Key Number
+			{
+				type = 11;
+				enum = "keys";
+			}
+		}
+		84
+		{
+			title = "Script Execute with Result";
+			id = "ACS_ExecuteWithResult";
+			
+			arg0
+			{
+				title = "Script Number";
+			}
+			arg1
+			{
+				title = "Script Argument 1";
+			}
+			arg2
+			{
+				title = "Script Argument 2";
+			}
+			arg3
+			{
+				title = "Script Argument 3";
+			}
+			arg4
+			{
+				title = "Script Argument 4";
+			}
+		}
+		226
+		{
+			title = "Script Execute Always";
+			id = "ACS_ExecuteAlways";
+			
+			arg0
+			{
+				title = "Script Number";
+			}
+			
+			arg1
+			{
+				title = "Map Number";
+			}
+			
+			arg2
+			{
+				title = "Script Argument 1";
+			}
+			
+			arg3
+			{
+				title = "Script Argument 2";
+			}
+			
+			arg4
+			{
+				title = "Script Argument 3";
+			}
+		}
+	}
+
+	end
+	{
+		243
+		{
+			title = "End Normal";
+			id = "Exit_Normal";
+			
+			arg0
+			{
+				title = "Position";
+			}
+		}
+		244
+		{
+			title = "End Secret";
+			id = "Exit_Secret";
+			
+			arg0
+			{
+				title = "Position";
+			}
+		}
+	}
+
+	scroll
+	{
+		title = "Scroll";
+				
+		100 //Scroll_Texture_Left
+		{
+			arg1
+			{
+				title = "Sidedef Part";
+				type = 12;
+				enum = "sidedef_part";
+			}
+		}
+		
+		101 //Scroll_Texture_Right
+		{
+			arg1
+			{
+				title = "Sidedef Part";
+				type = 12;
+				enum = "sidedef_part";
+			}
+		}
+		
+		102 //Scroll_Texture_Up
+		{
+			arg1
+			{
+				title = "Sidedef Part";
+				type = 12;
+				enum = "sidedef_part";
+			}
+		}
+		
+		103 //Scroll_Texture_Down
+		{
+			arg1
+			{
+				title = "Sidedef Part";
+				type = 12;
+				enum = "sidedef_part";
+			}
+		}
+		
+		222
+		{
+			title = "Scroll Texture Model";
+			id = "Scroll_Texture_Model";
+			requiresactivation = false;
+			
+			arg1
+			{
+				title = "Options";
+				type = 12;
+				enum
+				{
+					1 = "Displacement";
+					2 = "Accelerative";
+				}
+			}
+		}
+		
+		223
+		{
+			title = "Scroll Floor";
+			id = "Scroll_Floor";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Options";
+				type = 12;
+				enum
+				{
+					1 = "Displacement";
+					2 = "Accelerative";
+					4 = "Scroll by linedef dx/dy";
+				}
+			}
+			arg2
+			{
+				title = "Scroll";
+				type = 11;
+				enum
+				{
+					0 = "Texture only";
+					1 = "Things only";
+					2 = "Both";
+				}
+			}
+			arg3
+			{
+				title = "Horizontal Speed";
+				default = 128;
+				type = 11;
+				enum = "sector_scroll_speeds_x";
+			}
+			arg4
+			{
+				title = "Vertical Speed";
+				default = 128;
+				type = 11;
+				enum = "sector_scroll_speeds_y";
+			}
+		}
+		224
+		{
+			title = "Scroll Ceiling";
+			id = "Scroll_Ceiling";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Options";
+				type = 12;
+				enum
+				{
+					1 = "Displacement";
+					2 = "Accelerative";
+					4 = "Scroll by linedef dx/dy";
+				}
+			}
+			arg3
+			{
+				title = "Horizontal Speed";
+				default = 128;
+				type = 11;
+				enum = "sector_scroll_speeds_x";
+			}
+			arg4
+			{
+				title = "Vertical Speed";
+				default = 128;
+				type = 11;
+				enum = "sector_scroll_speeds_y";
+			}
+		}
+		225
+		{
+			title = "Scroll Texture by Offsets";
+			id = "Scroll_Texture_Offsets";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sidedef Part";
+				type = 12;
+				enum = "sidedef_part";
+			}
+		}
+	}
+
+
+	light
+	{
+		232
+		{
+			title = "Light Strobe (Doom mode)";
+			id = "Light_StrobeDoom";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Brightest Duration (tics)";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+			arg2
+			{
+				title = "Darkest Duration (tics)";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+		}
+		233
+		{
+			title = "Light Change to Darkest Neightbour";
+			id = "Light_MinNeighbor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		234
+		{
+			title = "Light Change to Brightest Neightbour";
+			id = "Light_MaxNeighbor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+	}
+
+	sector
+	{
+		title = "Sector";
+		
+		48
+		{
+			title = "Sector Attach 3D Midtex";
+			id = "Sector_Attach3dMidtex";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Line Tag";
+				type = 15;
+			}
+			arg1
+			{
+				title = "Sector Tag";
+				type = 13;
+			}		
+			arg2
+			{
+				title = "Floor / Ceiling";
+				type = 11;
+				enum = "floorceiling";
+			}
+		}
+		
+		57
+		{
+			title = "Sector Set Portal";
+			id = "Sector_SetPortal";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Portal Type";
+				type = 11;
+				enum
+				{
+					0 = "Link to portal with same tag";
+					1 = "Copy portal from second tag";
+					2 = "Eternity-style skybox portal";
+					3 = "Plane portal";
+					4 = "Horizon portal";
+					5 = "Copy portal to line";
+					6 = "Linked portal";
+				}
+			}
+			arg2
+			{
+				title = "Plane";
+				type = 11;
+				enum
+				{
+					0 = "Floor";
+					1 = "Ceiling";
+					2 = "Both";
+					3 = "Any (\"Copy portal\" types only)";
+				}
+			}
+			arg3
+			{
+				title = "Misc";
+				tooltip = "For type 0 portal: specifies whether the line belongs to the sector viewed\nthrough the portal (1) or the sector in which the portal is seen (0).\nFor type 1 portal: specifies the sector tag of the portal to copy.";
+			}
+			arg4
+			{
+				title = "Opacity";
+			}
+		}
+		185
+		{
+			title = "Sector Rotate Flat";
+			id = "Sector_SetRotation";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Floor Angle";
+				type = 8;
+			}
+			arg2
+			{
+				title = "Ceiling Angle";
+				type = 8;
+			}
+		}
+		186
+		{
+			title = "Sector Ceiling Panning";
+			id = "Sector_SetCeilingPanning";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Horizontal Integral";
+			}
+			arg2
+			{
+				title = "Horizontal Fractional";
+			}
+			arg3
+			{
+				title = "Vertical Integral";
+			}
+			arg4
+			{
+				title = "Vertical Fractional";
+			}
+		}
+		187
+		{
+			title = "Sector Floor Panning";
+			id = "Sector_SetFloorPanning";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Horizontal Integral";
+			}
+			arg2
+			{
+				title = "Horizontal Fractional";
+			}
+			arg3
+			{
+				title = "Vertical Integral";
+			}
+			arg4
+			{
+				title = "Vertical Fractional";
+			}
+		}
+		188
+		{
+			title = "Sector Ceiling Scale";
+			id = "Sector_SetCeilingScale";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Horizontal Integral";
+			}
+			arg2
+			{
+				title = "Horizontal Fractional";
+			}
+			arg3
+			{
+				title = "Vertical Integral";
+			}
+			arg4
+			{
+				title = "Vertical Fractional";
+			}
+		}
+		189
+		{
+			title = "Sector Floor Scale";
+			id = "Sector_SetFloorScale";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Horizontal Integral";
+			}
+			arg2
+			{
+				title = "Horizontal Fractional";
+			}
+			arg3
+			{
+				title = "Vertical Integral";
+			}
+			arg4
+			{
+				title = "Vertical Fractional";
+			}
+		}		
+		218
+		{
+			title = "Sector Wind";
+			id = "Sector_SetWind";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Wind Strength";
+			}
+			arg2
+			{
+				title = "Wind Angle";
+				type = 22;
+			}
+			arg3
+			{
+				title = "Use Line Vector";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		219
+		{
+			title = "Sector Friction";
+			id = "Sector_SetFriction";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Friction Amount";
+				type = 11;
+				enum
+				{
+					0 = "Use Line Length";
+					1 = "Very Sludgy";
+					50 = "Sludgy";
+					100 = "Normal";
+					200 = "Icy";
+					255 = "Very Icy";
+				}
+			}
+		}
+		
+		220
+		{
+			title = "Sector Current";
+			id = "Sector_SetCurrent";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Current Strength";
+			}
+			arg2
+			{
+				title = "Current Angle";
+				type = 22;
+			}
+			arg3
+			{
+				title = "Use Line Vector";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+	}
+
+	change
+	{
+		title = "Change";
+		
+		179
+		{
+			title = "Change Skill";
+			id = "ChangeSkill";
+			
+			arg0
+			{
+				title = "New Skill Level";
+				type = 11;
+				enum 
+				{
+					0 = "Very Easy";
+					1 = "Easy";
+					2 = "Normal";
+					3 = "Hard";
+					4 = "Nightmare!";
+				}
+			}
+		}
+	}
+
+	plane
+	{
+		title = "Plane";
+		
+		181
+		{
+			title = "Plane Align (slope)";
+			id = "Plane_Align";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Align Floor";
+				type = 11;
+				enum
+				{
+					0 = "None";
+					1 = "Front";
+					2 = "Back";
+				}
+			}
+			arg1
+			{
+				title = "Align Ceiling";
+				type = 11;
+				enum
+				{
+					0 = "None";
+					1 = "Front";
+					2 = "Back";
+				}
+			}
+		}
+	}
+
+	static
+	{
+		title = "Static";
+		
+		190
+		{
+			title = "Static Init";
+			id = "Static_Init";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Property";
+				type = 11;
+				enum
+				{
+					0 = "Set the gravity to the length of the linedef";
+					1 = "Set the light or fog color in a sector";
+					2 = "Set damage to the length of the linedef";
+					3 = "Define a sector link";
+					255 = "Use the line's upper texture as the sky in any tagged sectors";
+				}
+			}
+			arg2
+			{
+				title = "Flip Sky / Ceiling";
+			}
+			arg3
+			{
+				title = "Movement Type";
+			}
+		}
+	}
+
+	elevator
+	{
+		title = "Elevator";
+		
+		245
+		{
+			title = "Elevator Raise to Nearest Floor";
+			id = "Elevator_RaiseToNearest";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		246
+		{
+			title = "Elevator Move to Activated Floor";
+			id = "Elevator_MoveToFloor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		247
+		{
+			title = "Elevator Lower to Nearest Floor";
+			id = "Elevator_LowerToNearest";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+	}
+	polyobj
+	{
+		1	// Polyobject Start Line
+		{
+			arg3
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+		}
+		5	// Polyobject Explicit Line
+		{
+			arg4
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+		}
+	}
+	plane
+	{
+		181 //Plane_Align
+		{
+			arg2
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+		}
+	}
+	scroll
+	{
+		52 //Scroll_Wall
+		{
+			arg0
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+		}
+		221 //Scroll_Texture_Both
+		{
+			arg0
+			{
+				title = "Line ID";
+				type = 0;
+			}
+		}
+		222 //Scroll_Texture_Model
+		{
+			arg0
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+		}
+	}
+	sector
+	{
+		48 //Sector_Attach3dMidtex
+		{
+			arg0
+			{
+				title = "Line ID";
+				type = 0;
+			}
+		}
+	}
+	teleport
+	{
+		215 //Teleport_Line
+		{
+			arg0
+			{
+				title = "Line ID";
+				type = 0;
+			}
+			arg1
+			{
+				title = "Target Line ID";
+				type = 0;
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/Build/Configurations/Includes/Eternity_misc.cfg b/Build/Configurations/Includes/Eternity_misc.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..3b289567f14e2eaf95ba47930b64ed7831c00e2d
--- /dev/null
+++ b/Build/Configurations/Includes/Eternity_misc.cfg
@@ -0,0 +1,4217 @@
+linedefflags
+{
+    1024 = "3D middle texture";
+}
+
+thingflags
+{
+	128 = "Friendly";
+	512 = "Dormant";
+}
+
+/*
+ADDITIONAL UNIVERSAL DOOM MAP FORMAT FIELD DEFINITIONS
+Only add fields here that Doom Builder does not edit with its own user-interface!
+The "default" field must match the UDMF specifications!
+
+Field data types:
+0 = integer *
+1 = float
+2 = string
+3 = bool
+4 = linedef action (integer) *
+5 = sector effect (integer) *
+6 = texture (string)
+7 = flat (string)
+8 = angle in degrees (integer)
+9 = angle in radians (float)
+10 = XXRRGGBB color (integer)
+11 = enum option (integer) *
+12 = enum bits (integer) *
+13 = sector tag (integer) *
+14 = thing tag (integer) *
+15 = linedef tag (integer) *
+16 = enum option (string)
+17 = angle in degrees (float)
+22 = byte angle (integer)
+*/
+universalfields
+{
+	linedef
+	{
+		comment
+		{
+			type = 2;
+			default = "";
+		}
+	}
+	
+	sidedef
+	{
+		comment
+		{
+			type = 2;
+			default = "";
+		}
+	}
+	
+	thing
+	{
+		comment
+		{
+			type = 2;
+			default = "";
+		}
+	}
+	
+	sector
+	{
+		comment
+		{
+			type = 2;
+			default = "";
+		}
+	}
+}
+
+defaultthingflags_udmf
+{
+	skill1;
+	skill2;
+	skill3;
+	skill4;
+	skill5;
+	single;
+	coop;
+	dm;
+	class1;
+	class2;
+	class3;
+}
+
+doormaking_udmf
+{
+	makedooraction = 12;	// See linedeftypes
+	makedoorflags { playeruse; repeatspecial; }
+	makedoorarg0 = 0;
+	makedoorarg1 = 16;
+	makedoorarg2 = 150;
+	makedoorarg3 = 0;
+	makedoorarg4 = 0;
+}
+
+sectorflags_udmf
+{
+	secret = "Secret";
+	lightfloorabsolute = "Floor light setting is absolute";
+	lightceilingabsolute = "Ceiling light setting is absolute";
+	damage_endgodmode = "Damage disables god mode cheat";
+	damage_exitlevel = "Damage and exit level when < 10%";
+	damageterraineffect = "Spawn terrain splashes on damage";
+	portal_ceil_disabled = "Disable ceiling portal";
+	portal_ceil_norender = "Don't display ceiling portal";
+	portal_ceil_nopass = "Blocking ceiling linked portal";
+	portal_ceil_blocksound = "Ceiling linked portal blocks sound";
+	portal_ceil_useglobaltex = "Ceiling portal uses global texture";
+	portal_floor_disabled = "Disable floor portal";
+	portal_floor_norender = "Don't display floor portal";
+	portal_floor_nopass = "Blocking floor linked portal";
+	portal_floor_blocksound = "Floor portal blocks sound";
+	portal_floor_useglobaltex = "Floor portal uses global texture";
+}
+
+// These are instead of Doom sector types in UDMF and Hexen format
+sectors_udmf
+{
+	0 = "None";
+	1 = "Light Phased";
+	2 = "Light Sequence Start";
+	3 = "Light Sequence Special 1";
+	4 = "Light Sequence Special 2";
+	40 = "Wind East weak";
+	41 = "Wind East medium";
+	42 = "Wind East strong";
+	43 = "Wind North weak";
+	44 = "Wind North medium";
+	45 = "Wind North strong";
+	46 = "Wind South weak";
+	47 = "Wind South medium";
+	48 = "Wind South strong";
+	49 = "Wind West weak";
+	50 = "Wind West medium";
+	51 = "Wind West strong";
+	65 = "Light Flicker";
+	66 = "Light Strobe Fast";
+	67 = "Light Strobe Slow";
+	68 = "Light Strobe Hurt -20% health";
+	69 = "Damage Hellslime -10% health";
+	71 = "Damage Nukage -5% health";
+	72 = "Light Glow";
+	74 = "Sector Door Close (30 sec)";
+	75 = "Damage End Level -20% health";
+	76 = "Light StrobeSlowSync";
+	77 = "Light StrobeFastSync";
+	78 = "Sector Door Raise (5 min)";
+	79 = "Low Friction";
+	80 = "Damage Super Hellslime -20% health";
+	81 = "Light Fire Flicker";
+	82 = "Damage -5% health (no protection)";
+	83 = "Damage -8% health (no protection)";
+	84 = "Scroll east + -2 or -5% health (no protection)";
+	85 = "Damage Sludge -4% health";
+	225 = "Carry East Slow";
+	226 = "Carry East Med.Slow";
+	227 = "Carry East Medium";
+	228 = "Carry East Med.Fast";
+	229 = "Carry East Fast";
+	230 = "Carry North Slow";
+	231 = "Carry North Med.Slow";
+	232 = "Carry North Medium";
+	233 = "Carry North Med.Fast";
+	234 = "Carry North Fast";
+	235 = "Carry South Slow";
+	236 = "Carry South Med.Slow";
+	237 = "Carry South Medium";
+	238 = "Carry South Med.Fast";
+	239 = "Carry South Fast";
+	240 = "Carry West Slow";
+	241 = "Carry West Med.Slow";
+	242 = "Carry West Medium";
+	243 = "Carry West Med.Fast";
+	244 = "Carry West Fast";
+}
+
+linedefflags_udmf
+{
+	twosided = "Doublesided";
+	dontpegtop = "Upper unpegged";
+	dontpegbottom = "Lower unpegged";
+	blocking = "Impassable";
+	blockeverything = "Block everything"; 
+	blockmonsters = "Block monsters";
+	blocksound = "Block sound";
+	jumpover = "Jump-over railing";
+	clipmidtex = "Clip middle texture";
+	midtex3d = "Walkable middle texture";
+	midtex3dimpassible = "Projectile shoot-through middle texture";
+	mapped = "Initially shown on map";
+	secret = "Shown as 1-sided on map";
+	dontdraw = "Not shown on map";
+	translucent = "Translucent (obsolete)";
+	zoneboundary = "Sound zone boundary";
+}
+
+linedefactivations_udmf
+{
+	repeatspecial = "Repeatable action";
+	playeruse = "When player presses use";
+	playercross = "When player walks over";
+	playerpush = "When player bumps";
+	monsteruse = "When monster presses use";
+	monstercross = "When monster walks over";
+	monsterpush = "When monsters bumps";
+	missilecross = "When projectile crosses";
+	impact = "On projectile impact";
+	passuse = "Pass use on";
+	firstsideonly = "Front side only";
+}
+
+sidedefflags
+{
+
+}
+
+// Basic UDMF stuff.
+thingflags_udmf
+{
+	skill1 = "Skill 1";
+	skill2 = "Skill 2";
+	skill3 = "Skill 3";
+	skill4 = "Skill 4";
+	skill5 = "Skill 5";
+	single = "Singleplayer";
+	coop = "Cooperative";
+	dm = "Deathmatch";
+	friend = "Friendly (MBF logic)";
+	strifeally = "Friendly (Strife logic)";
+	ambush = "Ambush players";
+	standing = "Stand still";
+	dormant = "Dormant";
+	translucent = "Translucent (25%)";
+	invisible = "Invisible";
+}
+
+// How thing flags should be compared (for the stuck thing error check)
+thingflagscompare_udmf
+{
+	skills
+	{
+		skill1;
+		skill2;
+		skill3;
+		skill4;
+		skill5;
+	}
+
+	gamemodes
+	{
+		single { requiredgroups = "skills"; }
+		coop   { requiredgroups = "skills"; }
+		dm      { ignoredgroups = "skills"; }
+	}
+
+	classes
+	{
+		class1;
+		class2;
+		class3;
+	}
+}
+
+linedefs_eternity_udmf
+{
+	polyobj
+	{
+		title = "Polyobjects";
+		
+		59
+		{
+			title = "Polyobject Move to Spot (override)";
+			id = "Polyobj_OR_MoveToSpot";
+			arg0
+			{
+				title = "Polyobject Number";
+				type = 25;
+			}
+			arg1
+			{
+				title = "Speed (mu. per octic)";
+				type = 11;
+				enum = "stair_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Target MapSpot Tag";
+				type = 14;
+				targetclasses = "MapSpot,MapSpotGravity";
+			}
+		}
+		86
+		{
+			title = "Polyobject Move to Spot";
+			id = "Polyobj_MoveToSpot";
+			arg0
+			{
+				title = "Polyobject Number";
+				type = 25;
+			}
+			arg1
+			{
+				title = "Speed (mu. per octic)";
+				type = 11;
+				enum = "stair_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Target MapSpot Tag";
+				type = 14;
+				targetclasses = "MapSpot,MapSpotGravity";
+			}
+		}
+		87
+		{
+			title = "Polyobject Stop";
+			id = "Polyobj_Stop";
+			arg0
+			{
+				title = "Polyobject Number";
+				type = 25;
+			}
+		}
+		88
+		{
+			title = "Polyobject Move to";
+			id = "Polyobj_MoveTo";
+			arg0
+			{
+				title = "Polyobject Number";
+				type = 25;
+			}
+			arg1
+			{
+				title = "Speed (mu. per octic)";
+				type = 11;
+				enum = "stair_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Target X Pos";
+			}
+			arg3
+			{
+				title = "Target Y Pos";
+			}
+		}
+		89
+		{
+			title = "Polyobject Move to (override)";
+			id = "Polyobj_OR_MoveTo";
+			arg0
+			{
+				title = "Polyobject Number";
+				type = 25;
+			}
+			arg1
+			{
+				title = "Speed (mu. per octic)";
+				type = 11;
+				enum = "stair_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Target X Pos";
+			}
+			arg3
+			{
+				title = "Target Y Pos";
+			}
+		}
+	}
+
+	line
+	{
+		title = "Line";
+		
+		9
+		{
+			title = "Line Horizon";
+			id = "Line_Horizon";
+			requiresactivation = false;
+		}	
+		121	// Line Identification
+		{
+			arg1
+			{
+				title = "Flags";
+				type = 12;
+				enum
+				{
+					1 = "Sound zone boundary";
+					2 = "Jump-over railing";
+					4 = "Block floating monsters";
+					8 = "Clip middle texture";
+					16 = "Wrap middle texture";
+					32 = "Walkable middle texture";
+					64 = "Switch height check";
+					128 = "Front side only";
+				}
+			}
+			arg4
+			{
+				title = "Line ID High";
+			}
+		}
+		182
+		{
+			title = "Line Mirror";
+			id = "Line_Mirror";
+			requiresactivation = false;
+		}
+		156
+		{
+			title = "Line Set Portal";
+			id = "Line_SetPortal";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Exit Line Tag";
+				tooltip = "The tag number of the line that will act as the \"exit\" of the current portal";
+				type = 15;
+			}
+			arg2
+			{
+				title = "Portal Type";
+				type = 11;
+				enum
+				{
+					0 = "Visual only";
+					1 = "Visual + simple teleporter";
+					2 = "Interactive";
+					3 = "Static (Eternity style)";
+				}
+			}
+			arg3
+			{
+				title = "Plane Align";
+				tooltip = "Determines how the planes at the other side of the portal are relative to this line";
+				type = 11;
+				enum
+				{
+					0 = "None";
+					1 = "Floors";
+					2 = "Ceilings";
+				}
+			}
+		}
+		107
+		{
+			title = "Line Set Portal Target";
+			id = "Line_SetPortalTarget";
+			
+			arg0
+			{
+				title = "Source Line Tag";
+				type = 15;
+			}
+			arg1
+			{
+				title = "Target Line Tag";
+				type = 15;
+			}
+		}
+	}
+
+	door
+	{
+		14
+		{
+			title = "Door Animated";
+			id = "Door_Animated";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Animation Speed";
+				type = 11;
+				enum = "door_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Close Delay";
+				type = 11;
+				enum = "reset_tics";
+				default = 150;
+			}
+			arg3
+			{
+				title = "Lock";
+				type = 11;
+				enum = "keys";
+			}
+		}
+		202
+		{
+			title = "Door Generic";
+			id = "Generic_Door";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "flat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Type";
+				type = 26;
+				enum
+				{
+					0 = "Open Close";
+					1 = "Open Stay";
+					2 = "Close Open";
+					3 = "Close Stay";
+				}
+				flags
+				{
+					64 = "No retrigger";
+					128 = "Tag is light tag";
+				}
+			}
+			arg3
+			{
+				title = "Delay";
+				type = 11;
+				enum = "generic_door_delays";
+				default = 34;
+			}
+			arg4
+			{
+				title = "Lock";
+				type = 11;
+				enum = "keys";
+			}
+		}
+		
+		249
+		{
+			title = "Door Close Wait Open";
+			id = "Door_CloseWaitOpen";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "flat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Delay";
+				type = 11;
+				enum = "generic_door_delays";
+				default = 34;
+			}
+			arg3
+			{
+				title = "Light Tag";
+				type = 13;
+			}
+		}
+	}
+
+	autosave
+	{
+		title = "Autosave";
+		
+		15
+		{
+			title = "Autosave";
+			id = "Autosave";
+		}
+	}
+
+	floor
+	{
+		28	// Floor Crusher Start
+		{
+			arg3
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+		37
+		{
+			title = "Floor Move to Value";
+			id = "Floor_MoveToValue";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Target Height";
+			}
+			arg3
+			{
+				title = "Negative Height";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		
+		138
+		{
+			title = "Floor Waggle";
+			id = "Floor_Waggle";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Amplitude";
+			}
+			arg2
+			{
+				title = "Frequency";
+			}
+			arg3
+			{
+				title = "Phase Offset (0-63)";
+			}
+			arg4
+			{
+				title = "Duration";
+				type = 11;
+				enum = "delay_seconds";
+				default = 5;
+			}
+		}
+		
+		200
+		{
+			title = "Floor Generic Change";
+			id = "Generic_Floor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Movement Amount";
+			}
+			arg3
+			{
+				title = "Target";
+				type = 11;
+				enum
+				{
+					0 = "Move by Movement Amount";
+					1 = "Highest neighboring floor";
+					2 = "Lowest neighboring floor";
+					3 = "Nearest neighboring floor";
+					4 = "Lowest neighboring ceiling";
+					5 = "Sector ceiling";
+					6 = "Move by the height of sector's shortest lower texture";
+				}
+			}
+			arg4
+			{
+				title = "Flags";
+				type = 26;
+				enum
+				{
+					0 = "Don't copy anything";
+					1 = "Copy floor texture, remove sector special";
+					2 = "Copy floor texture";
+					3 = "Copy floor texture and special";
+				}
+				flags
+				{
+					4 = "Use numeric model if set, trigger model if not";
+					8 = "Raise floor if set, lower it if not";
+					16 = "Inflict crushing damage";
+				}
+			}
+		}
+		
+		235
+		{
+			title = "Transfer Floor Texture and Special form Back Side";
+			id = "Floor_TransferTrigger";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		236
+		{
+			title = "Transfer Floor Texture and Special using Numeric Change Model";
+			id = "Floor_TransferNumeric";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		238
+		{
+			title = "Floor Raise to Lowest Ceiling";
+			id = "Floor_RaiseToLowestCeiling";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		239
+		{
+			title = "Floor Raise by TxTy";
+			id = "Floor_RaiseByValueTxTy";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise by";
+			}
+		}
+		
+		240
+		{
+			title = "Floor Raise by Texture";
+			id = "Floor_RaiseByTexture";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		
+		241
+		{
+			title = "Floor Lower to Lowest TxTy";
+			id = "Floor_LowerToLowestTxTy";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		
+		242
+		{
+			title = "Floor Lower to Highest Floor";
+			id = "Floor_LowerToHighest";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Adjust Target Height";
+			}
+			arg3
+			{
+				title = "Force Adjust";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		250
+		{
+			title = "Floor Donut";
+			id = "Floor_Donut";
+			
+			arg0
+			{
+				title = "Center Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Pillar Lower Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Stairs Raise Speed";
+				type = 11;
+				enum = "stair_speeds";
+				default = 4;
+			}
+		}
+		
+		251
+		{
+			title = "Floor and Ceiling Lower and Raise";
+			id = "FloorAndCeiling_LowerRaise";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Floor Lowering Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Ceiling Raising Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Emulate Boom Bug";
+				type = 11;
+				enum
+				{
+					0 = "No";
+					1998 = "Yes";
+				}
+			}
+		}
+	}
+
+	stairs
+	{
+		204
+		{
+			title = "Stairs Generic Build";
+			id = "Generic_Stairs";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "stair_speeds";
+				default = 4;
+			}
+			arg2
+			{
+				title = "Step Height";
+			}
+			arg3
+			{
+				title = "Options";
+				type = 12;
+				enum
+				{
+					1 = "Upwards";
+					2 = "Ignore Floor Texture";
+				}
+			}
+			arg4
+			{
+				title = "Reset Delay";
+				type = 11;
+				enum = "reset_tics";
+			}
+		}
+		
+		217
+		{
+			title = "Stairs Build up (Doom mode)";
+			id = "Stairs_BuildUpDoom";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "stair_speeds";
+				default = 4;
+			}
+			arg2
+			{
+				title = "Step Height";
+			}
+			arg3
+			{
+				title = "Build Step Delay";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+			arg4
+			{
+				title = "Reset Delay";
+				type = 11;
+				enum = "reset_tics";
+			}
+		}
+	}
+
+
+	pillar
+	{
+		94	// Pillar_BuildAndCrush
+		{
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+	}
+
+
+	forcefield
+	{
+		title = "Forcefield";
+		
+		33
+		{
+			title = "Forcefield Set";
+			id = "ForceField";
+			requiresactivation = false;
+		}
+		34
+		{
+			title = "Forcefield Remove";
+			id = "ClearForceField";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+	}
+
+
+	ceiling
+	{
+		title = "Ceiling";
+		
+		38
+		{
+			title = "Ceiling Waggle";
+			id = "Ceiling_Waggle";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Amplitude (in 1/8 mu.)";
+				default = 128;
+			}
+			arg2
+			{
+				title = "Frequency";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Phase Offset (0-63)";
+			}
+			arg4
+			{
+				title = "Duration";
+				type = 11;
+				enum = "delay_seconds";
+				default = 5;
+			}
+		}
+		42	// Ceiling Crusher Start
+		{
+			arg3
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+		43	// Ceiling Crush Once
+		{
+			arg3
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+			
+		}
+		
+		97
+		{
+			title = "Ceiling Lower And Crush Dist";
+			id = "Ceiling_LowerAndCrushDist";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+				
+			}
+		
+			arg2
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+		
+			arg3
+			{
+				title = "Lip";
+			}
+		
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+		
+		104
+		{
+			title = "Ceiling Crush And Raise Dist";
+			id = "Ceiling_CrushAndRaiseSilentDist";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		
+			arg1
+			{
+				title = "Lip";
+			}
+		
+			arg2
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+		
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+
+		45	// Ceiling Crush Once and Open
+		{
+			arg3
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+			
+		}
+		47
+		{
+			title = "Ceiling Move to Value";
+			id = "Ceiling_MoveToValue";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Target Height";
+			}
+			arg3
+			{
+				title = "Negative Height";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		169
+		{
+			title = "Ceiling Generic Crush (Hexen mode)";
+			id = "Generic_Crusher2";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lower Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Silent";
+				type = 11;
+				enum = "noyes";
+			}
+			arg4
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+		}
+		192
+		{
+			title = "Ceiling Lower to Highest Floor";
+			id = "Ceiling_LowerToHighestFloor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		193
+		{
+			title = "Ceiling Lower Instantly by Value * 8";
+			id = "Ceiling_LowerInstant";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg2
+			{
+				title = "Lower by (* 8)";
+			}
+		}
+		194
+		{
+			title = "Ceiling Raise Instantly by Value * 8";
+			id = "Ceiling_RaiseInstant";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg2
+			{
+				title = "Raise by (* 8)";
+			}
+		}
+		195
+		{
+			title = "Ceiling Crush Once and Open A";
+			id = "Ceiling_CrushRaiseAndStayA";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lower Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+			
+		}
+		196
+		{
+			title = "Ceiling Crush Start A";
+			id = "Ceiling_CrushAndRaiseA";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lower Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+			
+		}
+		197
+		{
+			title = "Ceiling Crush Start A (silent)";
+			id = "Ceiling_CrushAndRaiseSilentA";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lower Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+			
+		}
+		198
+		{
+			title = "Ceiling Raise by Value * 8";
+			id = "Ceiling_RaiseByValueTimes8";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise by (* 8)";
+			}
+		}
+		199
+		{
+			title = "Ceiling Lower by Value * 8";
+			id = "Ceiling_LowerByValueTimes8";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Lower by (* 8)";
+			}
+		}
+		
+		201
+		{
+			title = "Ceiling Generic Change";
+			id = "Generic_Ceiling";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Movement Amount";
+			}
+			arg3
+			{
+				title = "Target";
+				type = 11;
+				enum
+				{
+					0 = "Move by Movement Amount";
+					1 = "Highest neighboring ceiling";
+					2 = "Lowest neighboring ceiling";
+					3 = "Nearest neighboring ceiling";
+					4 = "Highest neighboring floor";
+					5 = "Sector floor";
+					6 = "Move by the height of sector's shortest upper texture";
+				}
+			}
+			arg4
+			{
+				title = "Flags";
+				type = 26;
+				enum
+				{
+					0 = "Don't copy anything";
+					1 = "Copy ceiling texture, remove sector special";
+					2 = "Copy ceiling texture";
+					3 = "Copy ceiling texture and special";
+				}
+				flags
+				{
+					4 = "Use numeric model if set, trigger model if not";
+					8 = "Raise ceiling if set, lower it if not";
+					16 = "Inflict crushing damage";
+				}
+			}
+		}
+		205
+		{
+			title = "Ceiling Generic Crush (Doom mode)";
+			id = "Generic_Crusher";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lowering Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raising Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Silent";
+				type = 11;
+				enum = "noyes";
+			}
+			arg4
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+		}
+		252
+		{
+			title = "Ceiling Raise to Nearest Ceiling";
+			id = "Ceiling_RaiseToNearest";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		253
+		{
+			title = "Ceiling Lower to Lowest Ceiling";
+			id = "Ceiling_LowerToLowest";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		254
+		{
+			title = "Ceiling Lower to Floor";
+			id = "Ceiling_LowerToFloor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		255
+		{
+			title = "Ceiling Crush Once and Open A (silent)";
+			id = "Ceiling_CrushRaiseAndStaySilA";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Lowering Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raising Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg3
+			{
+				title = "Crush Damage";
+				default = 100;
+			}
+			arg4
+			{
+				title = "Crush Mode";
+				type = 11;
+				enum = "crush_mode";
+			}
+		}
+	}
+
+	breakable
+	{
+		title = "Breakable";
+		
+		49
+		{
+			title = "Breakable Glass";
+			id = "GlassBreak";
+			
+			arg0
+			{
+				title = "Spawn Glass Shards";
+				type = 11;
+				enum = "yesno";
+			}
+		}
+	}
+
+	transfer
+	{
+		title = "Transfer";
+		
+		50
+		{
+			title = "Transfer Brightness Level";
+			id = "ExtraFloor_LightOnly";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Options";
+				type = 11;
+				enum
+				{
+					0 = "From control sector's ceiling down to the top of another type 0 light";
+					1 = "From control sector's ceiling down to control sector's floor";
+					2 = "From control sector's ceiling down to the top of another extra light";
+				}
+			}
+		}
+		209
+		{
+			title = "Transfer Heights";
+			id = "Transfer_Heights";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Options";
+				type = 12;
+				enum
+				{
+					0 = "Boom mode";
+					1 = "Use fake ceiling/floor";
+					2 = "Draw fake floor only";
+					4 = "Inside sector only";
+					8 = "Swimmable below fake";
+					16 = "Do not draw";
+					32 = "Keep lighting";
+				}
+			}
+		}
+		
+		210
+		{
+			title = "Transfer Floor Brightness";
+			id = "Transfer_FloorLight";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		211
+		{
+			title = "Transfer Ceiling Brightness";
+			id = "Transfer_CeilingLight";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		16
+		{
+			title = "Transfer Wall Brightness";
+			id = "Transfer_WallLight";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Line Tag";
+				type = 15;
+			}
+			arg1
+			{
+				title = "Flags";
+				type = 12;
+				enum
+				{
+					1 = "Transfer light level to front side";
+					2 = "Transfer light level to back side";
+					4 = "Ignore fake contrast";
+				}
+			}
+		}
+		
+	}
+
+	platform
+	{
+		172
+		{
+			title = "Platform Raise to Nearest Wait Lower";
+			id = "Plat_UpNearestWaitDownStay";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Reverse Delay (tics)";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+		}
+		203
+		{
+			title = "Platform Generic Change";
+			id = "Generic_Lift";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Reverse Delay (tics)";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+			arg3
+			{
+				title = "Type";
+				type = 11;
+				enum = "generic_lift_types";
+			}
+			arg4
+			{
+				title = "Movement Amount";
+			}
+		}
+		206
+		{
+			title = "Platform Lower Wait Raise (lip)";
+			id = "Plat_DownWaitUpStayLip";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Reverse Delay (tics)";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+			arg3
+			{
+				title = "Lip Amount";
+			}
+			arg4
+			{
+				title = "Sound Type";
+				type = 11;
+				enum = "plat_sound";
+			}
+		}
+		207
+		{
+			title = "Platform Perpetual Move (lip)";
+			id = "Plat_PerpetualRaiseLip";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Reverse Delay (tics)";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+			arg3
+			{
+				title = "Lip Amount";
+			}
+		}
+		228
+		{
+			title = "Platform Raise Tx0";
+			id = "Plat_RaiseAndStayTx0";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Lockout Mode";
+				type = 11;
+				enum
+				{
+					0 = "Lockout in Heretic only";
+					1 = "Don't lockout";
+					2 = "Lockout in all games";
+				}
+			}
+		}
+		230
+		{
+			title = "Platform Raise by Value Tx (* 8)";
+			id = "Plat_UpByValueStayTx";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+			arg2
+			{
+				title = "Raise by (* 8)";
+			}
+		}
+		231
+		{
+			title = "Platform Toggle Ceiling";
+			id = "Plat_ToggleCeiling";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+	}
+
+	teleport
+	{
+		title = "Teleport";
+		
+		39
+		{
+			title = "Teleport to Pain State (silent)";
+			id = "Teleport_ZombieChanger";
+			
+			arg0
+			{
+				title = "Target Teleport Dest. Tag";
+				type = 14;
+				targetclasses = "TeleportDest,TeleportDest2,TeleportDest3";
+			}
+			arg1
+			{
+				title = "Target Sector Tag";
+				type = 13;
+			}
+		}
+		70	// Teleport
+		{
+			arg2
+			{
+				title = "Source Fog";
+				type = 11;
+				enum = "yesno";
+			}
+		}
+		71	// Teleport_NoFog
+		{
+			arg1
+			{
+				title = "Teleport Dest. angle usage";
+				type = 11;
+				enum
+				{
+					0 = "Don't change angle and velocity (Hexen-compat)";
+					1 = "Always use the teleport exit's angle (Strife-compat)";
+					2 = "Adjust relatively to the teleport exit's angle, but in the wrong direction (Boom-compat)";
+					3 = "Adjust relatively to the teleport exit's angle (Boom-fixed)";
+				}
+			}
+			arg3
+			{
+				title = "Keep rel. Height";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		74	// Teleport_NewMap
+		{
+			arg2
+			{
+				title = "Keep Orientation";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		76
+		{
+			title = "Teleport Other";
+			id = "TeleportOther";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Target MapSpot Tag";
+				type = 14;
+				targetclasses = "MapSpot,MapSpotGravity";
+			}
+			arg2
+			{
+				title = "Fog";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		77
+		{
+			title = "Teleport Group";
+			id = "TeleportGroup";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				tooltip = "The TID of the actor(s) to teleport.\nIf 0, teleports the activator only.";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Source Teleport Dest. Tag";
+				type = 14;
+				targetclasses = "TeleportDest,TeleportDest2,TeleportDest3";
+			}
+			arg2
+			{
+				title = "Target Teleport Dest. Tag";
+				type = 14;
+				targetclasses = "TeleportDest,TeleportDest2,TeleportDest3";
+			}
+			arg3
+			{
+				title = "Move Source";
+				type = 11;
+				enum = "noyes";
+			}
+			arg4
+			{
+				title = "Fog";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		78
+		{
+			title = "Teleport in Sector";
+			id = "TeleportInSector";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Source Tag";
+				tooltip = "The spot relative to which to teleport.";
+				type = 14;
+			}
+			arg2
+			{
+				title = "Target Teleport Dest. Tag";
+				type = 14;
+				targetclasses = "TeleportDest,TeleportDest2,TeleportDest3";
+			}
+			arg3
+			{
+				title = "Fog";
+				type = 11;
+				enum = "noyes";
+			}
+			arg4
+			{
+				title = "Group Thing Tag";
+				tooltip = "The TID of the thing(s) to teleport.\nIf 0, teleports all actors in the sector";
+				type = 14;
+			}
+		}
+		154
+		{
+			title = "Teleport (no Stop)";
+			id = "Teleport_NoStop";
+			
+			arg0
+			{
+				title = "Target Teleport Dest. Tag";
+				type = 14;
+				targetclasses = "TeleportDest,TeleportDest2,TeleportDest3";
+			}
+			arg1
+			{
+				title = "Target Sector Tag";
+				type = 13;
+			}
+			arg2
+			{
+				title = "Fog";
+				type = 11;
+				enum = "yesno";
+			}
+		}
+		215
+		{
+			title = "Teleport to Line";
+			id = "Teleport_Line";
+			
+			arg1
+			{
+				title = "Target Line Tag";
+				type = 15;
+			}
+			arg2
+			{
+				title = "Reverse Angle";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+	}
+
+	thing
+	{
+		17
+		{
+			title = "Thing Raise";
+			id = "Thing_Raise";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+		}
+		18
+		{
+			title = "Start Conversation";
+			id = "StartConversation";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Face Talker";
+				type = 11;
+				enum = "noyes";
+				default = 1;
+			}
+		}
+		19
+		{
+			title = "Thing Stop";
+			id = "Thing_Stop";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+		}
+		72 // ThrustThing
+		{
+			arg2
+			{
+				title = "No Limit";
+				type = 11;
+				enum = "noyes";
+			}
+			arg3
+			{
+				title = "Target Thing Tag";
+				type = 14;
+			}
+		}
+		73 // DamageThing
+		{
+			arg1
+			{
+				title = "Death";
+				type = 11;
+				enum = "death_types";
+			}
+		}
+		79
+		{
+			title = "Set Conversation";
+			id = "Thing_SetConversation";
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Conversation ID";
+			}
+		}
+		119
+		{
+			title = "Damage Thing by Tag";
+			id = "Thing_Damage";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Damage";
+				default = 100;
+			}
+			arg2
+			{
+				title = "Death";
+				type = 11;
+				enum = "death_types";
+			}
+		}
+		125
+		{
+			title = "Move Thing";
+			id = "Thing_Move";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Target Thing Tag";
+				type = 14;
+			}
+			arg2
+			{
+				title = "Fog";
+				type = 11;
+				enum = "yesno";
+			}
+		}
+		127
+		{
+			title = "Thing Set Special";
+			id = "Thing_SetSpecial";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Special";
+				type = 4;
+			}
+			arg2
+			{
+				title = "Arg 1";
+			}
+			arg3
+			{
+				title = "Arg 2";
+			}
+			arg4
+			{
+				title = "Arg 3";
+			}
+		}
+		128
+		{
+			title = "Thing Thrust Z";
+			id = "ThrustThingZ";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Force";
+			}
+			arg2
+			{
+				title = "Down/Up";
+				type = 11;
+				enum = "updown";
+			}
+			arg3
+			{
+				title = "Set/Add";
+				type = 11;
+				enum = "setadd";
+			}
+		}
+		135	// Thing_Spawn
+		{
+			arg3
+			{
+				title = "New Thing Tag";
+				type = 14;
+			}
+		}
+		137	// Thing_SpawnNoFog
+		{
+			arg3
+			{
+				title = "New Thing Tag";
+				type = 14;
+			}
+		}
+		139
+		{
+			title = "Spawn Thing Facing";
+			id = "Thing_SpawnFacing";
+			
+			arg0
+			{
+				title = "Mapspot Tag";
+				type = 14;
+				targetclasses = "MapSpot,MapSpotGravity";
+			}
+			arg1
+			{
+				title = "Spawn Thing";
+				type = 11;
+				enum = "spawnthing";
+			}
+			arg2
+			{
+				title = "Fog";
+				type = 11;
+				enum = "yesno";
+			}
+			arg3
+			{
+				title = "New Thing Tag";
+				type = 14;
+			}
+		}
+		175
+		{
+			title = "Spawn Projectile (Intercept)";
+			id = "Thing_ProjectileIntercept";
+			
+			arg0
+			{
+				title = "Mapspot Tag";
+				type = 14;
+				targetclasses = "MapSpot,MapSpotGravity";
+			}
+			arg1
+			{
+				title = "Projectile Type";
+				type = 11;
+				enum = "spawn_projectile";
+			}
+			arg2
+			{
+				title = "Speed";
+			}
+			arg3
+			{
+				title = "Target Thing Tag";
+				type = 14;
+			}
+			arg4
+			{
+				title = "New Thing Tag";
+				type = 14;
+			}
+		}
+		176
+		{
+			title = "Change Thing Tag";
+			id = "Thing_ChangeTID";
+			
+			arg0
+			{
+				title = "Old Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "New Thing Tag";
+				type = 14;
+			}
+		}
+		177
+		{
+			title = "Thing Hate";
+			id = "Thing_Hate";
+			
+			arg0
+			{
+				title = "Hater Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Hatee Tag";
+				type = 14;
+			}
+			arg2
+			{
+				title = "Hate";
+				type = 11;
+				enum
+				{
+					0 = "Target only";
+					1 = "Target and Player";
+					2 = "Forced Target and Player";
+					3 = "Hunt Target and Player";
+					4 = "Forced Hunt Target and Player";
+					5 = "Target, Ignore Player";
+					6 = "Forced Target, Ignore Player";
+				}
+			}
+		}
+		178
+		{
+			title = "Spawn Aimed Projectile";
+			id = "Thing_ProjectileAimed";
+			
+			arg0
+			{
+				title = "Mapspot Tag";
+				type = 14;
+				targetclasses = "MapSpot,MapSpotGravity";
+			}
+			arg1
+			{
+				title = "Projectile Type";
+				type = 11;
+				enum = "spawn_projectile";
+			}
+			arg2
+			{
+				title = "Speed";
+			}
+			arg3
+			{
+				title = "Target Thing Tag";
+				type = 14;
+			}
+			arg4
+			{
+				title = "New Thing Tag";
+				type = 14;
+			}
+		}
+		180
+		{
+			title = "Set Thing Translation";
+			id = "Thing_SetTranslation";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Translation Index";
+			}
+		}
+		229
+		{
+			title = "Thing Set Goal";
+			id = "Thing_SetGoal";
+			
+			arg0
+			{
+				title = "Monster Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Target Thing Tag";
+				type = 14;
+			}
+			arg2
+			{
+				title = "Delay";
+				type = 11;
+				enum 
+				{
+					0 = "No Delay";
+					1 = "1 Second";
+					2 = "2 Seconds";
+					3 = "3 Seconds";
+					5 = "5 Seconds";
+					10 = "10 Seconds";
+					15 = "15 Seconds";
+					20 = "20 Seconds";
+					25 = "25 Seconds";
+					30 = "30 Seconds";
+					60 = "1 Minute";
+				}
+			}
+			arg3
+			{
+				title = "Don't Chase Target";
+				type = 11;
+				enum = "falsetrue";
+			}
+		}
+		248
+		{
+			title = "Heal Thing";
+			id = "HealThing";
+			
+			arg0
+			{
+				title = "Heal Amount";
+			}
+		}
+		
+	}
+
+	script
+	{
+		title = "Script";
+		
+		83	// Script Locked Execute
+		{
+			arg4	// Key Number
+			{
+				type = 11;
+				enum = "keys";
+			}
+		}
+		84
+		{
+			title = "Script Execute with Result";
+			id = "ACS_ExecuteWithResult";
+			
+			arg0
+			{
+				title = "Script Number";
+			}
+			arg1
+			{
+				title = "Script Argument 1";
+			}
+			arg2
+			{
+				title = "Script Argument 2";
+			}
+			arg3
+			{
+				title = "Script Argument 3";
+			}
+			arg4
+			{
+				title = "Script Argument 4";
+			}
+		}
+		85
+		{
+			title = "Script Locked Execute (Door message)";
+			id = "ACS_LockedExecuteDoor";
+			
+			arg0
+			{
+				title = "Script Number";
+			}
+			
+			arg1
+			{
+				title = "Map Number";
+			}
+			
+			arg2
+			{
+				title = "Script Argument 1";
+			}
+			
+			arg3
+			{
+				title = "Script Argument 2";
+			}
+			
+			arg4
+			{
+				title = "Key Number";
+				type = 11;
+				enum = "keys";
+			}
+		}
+		158
+		{
+			title = "FraggleScript Execute";
+			id = "FS_Execute";
+			
+			arg0
+			{
+				title = "Script Number";
+			}
+			arg1
+			{
+				title = "Side";
+				type = 11;
+				enum
+				{
+					0 = "Both";
+					1 = "Front";
+				}
+			}
+			arg2
+			{
+				title = "Key";
+				type = 11;
+				enum = "keys";
+			}
+			arg3
+			{
+				title = "Message";
+				type = 11;
+				enum
+				{
+					0 = "Open door";
+					1 = "Activate object";
+				}
+			}
+		}
+		226
+		{
+			title = "Script Execute Always";
+			id = "ACS_ExecuteAlways";
+			
+			arg0
+			{
+				title = "Script Number";
+			}
+			
+			arg1
+			{
+				title = "Map Number";
+			}
+			
+			arg2
+			{
+				title = "Script Argument 1";
+			}
+			
+			arg3
+			{
+				title = "Script Argument 2";
+			}
+			
+			arg4
+			{
+				title = "Script Argument 3";
+			}
+		}
+	}
+
+	end
+	{
+		243
+		{
+			title = "End Normal";
+			id = "Exit_Normal";
+			
+			arg0
+			{
+				title = "Position";
+			}
+		}
+		244
+		{
+			title = "End Secret";
+			id = "Exit_Secret";
+			
+			arg0
+			{
+				title = "Position";
+			}
+		}
+	}
+
+	scroll
+	{
+		title = "Scroll";
+		
+		52
+		{
+			title = "Scroll Wall";
+			id = "Scroll_Wall";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Line Tag";
+				type = 15;
+			}
+			arg1
+			{
+				title = "Horizontal speed";
+			}
+			arg2
+			{
+				title = "Vertical speed";
+			}
+			arg3
+			{
+				title = "Side";
+				type = 11;
+				enum = "frontback";
+			}
+			arg4
+			{
+				title = "Flags";
+				type = 12;
+				enum
+				{
+					1 = "Scroll upper";
+					2 = "Scroll middle";
+					4 = "Scroll lower";
+				}
+			}
+		}
+		
+		100 //Scroll_Texture_Left
+		{
+			arg1
+			{
+				title = "Sidedef Part";
+				type = 12;
+				enum = "sidedef_part";
+			}
+		}
+		
+		101 //Scroll_Texture_Right
+		{
+			arg1
+			{
+				title = "Sidedef Part";
+				type = 12;
+				enum = "sidedef_part";
+			}
+		}
+		
+		102 //Scroll_Texture_Up
+		{
+			arg1
+			{
+				title = "Sidedef Part";
+				type = 12;
+				enum = "sidedef_part";
+			}
+		}
+		
+		103 //Scroll_Texture_Down
+		{
+			arg1
+			{
+				title = "Sidedef Part";
+				type = 12;
+				enum = "sidedef_part";
+			}
+		}
+		
+		221
+		{
+			title = "Scroll Texture Both";
+			id = "Scroll_Texture_Both";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Line Tag";
+				type = 15;
+			}
+			arg1
+			{
+				title = "Left Speed";
+				type = 11;
+				enum = "scroll_speeds";
+			}
+			arg2
+			{
+				title = "Right Speed";
+				type = 11;
+				enum = "scroll_speeds";
+			}
+			arg3
+			{
+				title = "Down Speed";
+				type = 11;
+				enum = "scroll_speeds";
+			}
+			arg4
+			{
+				title = "Up Speed";
+				type = 11;
+				enum = "scroll_speeds";
+			}
+		}
+		222
+		{
+			title = "Scroll Texture Model";
+			id = "Scroll_Texture_Model";
+			requiresactivation = false;
+			
+			arg1
+			{
+				title = "Options";
+				type = 12;
+				enum
+				{
+					1 = "Displacement";
+					2 = "Accelerative";
+				}
+			}
+		}
+		
+		223
+		{
+			title = "Scroll Floor";
+			id = "Scroll_Floor";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Options";
+				type = 12;
+				enum
+				{
+					1 = "Displacement";
+					2 = "Accelerative";
+					4 = "Scroll by linedef dx/dy";
+				}
+			}
+			arg2
+			{
+				title = "Scroll";
+				type = 11;
+				enum
+				{
+					0 = "Texture only";
+					1 = "Things only";
+					2 = "Both";
+				}
+			}
+			arg3
+			{
+				title = "Horizontal Speed";
+				default = 128;
+				type = 11;
+				enum = "sector_scroll_speeds_x";
+			}
+			arg4
+			{
+				title = "Vertical Speed";
+				default = 128;
+				type = 11;
+				enum = "sector_scroll_speeds_y";
+			}
+		}
+		224
+		{
+			title = "Scroll Ceiling";
+			id = "Scroll_Ceiling";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Options";
+				type = 12;
+				enum
+				{
+					1 = "Displacement";
+					2 = "Accelerative";
+					4 = "Scroll by linedef dx/dy";
+				}
+			}
+			arg3
+			{
+				title = "Horizontal Speed";
+				default = 128;
+				type = 11;
+				enum = "sector_scroll_speeds_x";
+			}
+			arg4
+			{
+				title = "Vertical Speed";
+				default = 128;
+				type = 11;
+				enum = "sector_scroll_speeds_y";
+			}
+		}
+		225
+		{
+			title = "Scroll Texture by Offsets";
+			id = "Scroll_Texture_Offsets";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sidedef Part";
+				type = 12;
+				enum = "sidedef_part";
+			}
+		}
+	}
+
+
+	light
+	{
+		109
+		{
+			title = "Lightning Control";
+			id = "Light_ForceLightning";
+			
+			arg0
+			{
+				title = "Mode";
+				type = 11;
+				enum
+				{
+					0 = "Enable Lightning Mode";
+					1 = "Flash Once";
+					2 = "Terminate Lightning Mode";
+				}
+			}
+		}
+		117
+		{
+			title = "Light Stop";
+			id = "Light_Stop";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		232
+		{
+			title = "Light Strobe (Doom mode)";
+			id = "Light_StrobeDoom";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Brightest Duration (tics)";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+			arg2
+			{
+				title = "Darkest Duration (tics)";
+				type = 11;
+				enum = "delay_tics";
+				default = 35;
+			}
+		}
+		233
+		{
+			title = "Light Change to Darkest Neightbour";
+			id = "Light_MinNeighbor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+		234
+		{
+			title = "Light Change to Brightest Neightbour";
+			id = "Light_MaxNeighbor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+		}
+	}
+
+	sector
+	{
+		title = "Sector";
+		
+		48
+		{
+			title = "Sector Attach 3D Midtex";
+			id = "Sector_Attach3dMidtex";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Line Tag";
+				type = 15;
+			}
+			arg1
+			{
+				title = "Sector Tag";
+				type = 13;
+			}		
+			arg2
+			{
+				title = "Floor / Ceiling";
+				type = 11;
+				enum = "floorceiling";
+			}
+		}
+		51
+		{
+			title = "Sector Set Link";
+			id = "Sector_SetLink";
+			
+			arg0
+			{
+				title = "Control Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Target Sector Tag";
+				type = 13;
+			}
+			arg2
+			{
+				title = "Floor / Ceiling";
+				type = 11;
+				enum = "floorceiling";
+			}
+			arg3
+			{
+				title = "Move Type";
+				type = 12;
+				enum
+				{
+					0 = "Unlink target sector(s) from the control sector";
+					1 = "Link target sector's floor to the specified surface of the control sector";
+					2 = "Link target sector's ceiling to the specified surface of the control sector";
+					4 = "Target floor movement is the opposite direction as the control sector's surface (requires bit 1)";
+					8 = "Target ceiling movement is the opposite direction as the control sector's surface (requires bit 2)";
+				}
+			}
+		}
+		
+		98
+		{
+			title = "Sector Set Translucent";
+			id = "Sector_SetTranslucent";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Floor / Ceiling";
+				type = 11;
+				enum = "floorceiling";
+			}
+			arg2
+			{
+				title = "Opacity";
+			}
+			arg3
+			{
+				title = "Translucency Type";
+				type = 11;
+				enum
+				{
+					0 = "Normal";
+					1 = "Additive";
+				}
+			}
+		}
+
+		54
+		{
+			title = "Sector Change Flags";
+			id = "Sector_ChangeFlags";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Set Flags";
+				type = 12;
+				enum = "sector_flags";
+			}
+			arg2
+			{
+				title = "Clear Flags";
+				type = 12;
+				enum = "sector_flags";
+			}
+		}
+		57
+		{
+			title = "Sector Set Portal";
+			id = "Sector_SetPortal";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Portal Type";
+				type = 11;
+				enum
+				{
+					0 = "Link to portal with same tag";
+					1 = "Copy portal from second tag";
+					2 = "Eternity-style skybox portal";
+					3 = "Plane portal";
+					4 = "Horizon portal";
+					5 = "Copy portal to line";
+					6 = "Interactive portal";
+				}
+			}
+			arg2
+			{
+				title = "Plane";
+				type = 11;
+				enum
+				{
+					0 = "Floor";
+					1 = "Ceiling";
+					2 = "Both";
+					3 = "Any (\"Copy portal\" types only)";
+				}
+			}
+			arg3
+			{
+				title = "Misc";
+				tooltip = "For type 0 portal: specifies whether the line belongs to the sector viewed\nthrough the portal (1) or the sector in which the portal is seen (0).\nFor type 1 portal: specifies the sector tag of the portal to copy.";
+			}
+			arg4
+			{
+				title = "Opacity";
+			}
+		}
+		58
+		{
+			title = "Sector Copy Scroller";
+			id = "Sector_CopyScroller";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Scroller Type";
+				type = 12;
+				enum
+				{
+					1 = "Copy ceiling scroller";
+					2 = "Copy floor scroller";
+					4 = "Copy carrying effect";
+				}
+			}		
+		}
+		160
+		{
+			title = "Sector Set 3D Floor";
+			id = "Sector_Set3dFloor";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Type";
+				type = 26;
+				default = 1;
+				enum
+				{
+					0 = "Vavoom-Style";
+					1 = "Solid";
+					2 = "Swimmable";
+					3 = "Non-Solid";
+				}
+				flags
+				{
+					4 = "Render-Inside";
+					16 = "Invert Visibility Rules";
+					32 = "Invert Shootability Rules";
+				}
+			}
+			arg2
+			{
+				title = "Flags";
+				type = 12;
+				enum
+				{
+					1 = "Disable light effects";
+					2 = "Restrict light inside";
+					4 = "Fog effect (GZDoom only)";
+					8 = "Ignore bottom height";
+					16 = "Use upper texture";
+					32 = "Use lower texture";
+					64 = "Additive transluency";
+					512 = "Fade effect (no view blend)";
+					1024 = "Reset light effects";
+				}
+			}
+			arg3
+			{
+				title = "Opacity";
+				default = 255;
+			}
+		}
+		161
+		{
+			title = "Sector Set Contents (Vavoom compatibility)";
+			id = "Sector_SetContents";
+			
+			arg0
+			{
+				title = "Type";
+				type = 11;
+				enum
+				{
+					0 = "Empty";
+					1 = "Water";
+					2 = "Lava";
+					3 = "Nukage";
+					4 = "Slime";
+					5 = "Hellslime";
+					6 = "Blood";
+					7 = "Sludge";
+					8 = "Hazard";
+					9 = "Boom-style water";
+				}
+			}
+			arg1
+			{
+				title = "Translucency Percent";
+			}
+			arg2
+			{
+				title = "Flags";
+				type = 12;
+				enum
+				{
+					1 = "Don't block movement";
+					2 = "Don't block sight";
+					4 = "Don't block shooting";
+					8 = "Additive translucency";
+				}
+			}
+		}
+		185
+		{
+			title = "Sector Rotate Flat";
+			id = "Sector_SetRotation";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Floor Angle";
+				type = 8;
+			}
+			arg2
+			{
+				title = "Ceiling Angle";
+				type = 8;
+			}
+		}
+		186
+		{
+			title = "Sector Ceiling Panning";
+			id = "Sector_SetCeilingPanning";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Horizontal Integral";
+			}
+			arg2
+			{
+				title = "Horizontal Fractional";
+			}
+			arg3
+			{
+				title = "Vertical Integral";
+			}
+			arg4
+			{
+				title = "Vertical Fractional";
+			}
+		}
+		187
+		{
+			title = "Sector Floor Panning";
+			id = "Sector_SetFloorPanning";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Horizontal Integral";
+			}
+			arg2
+			{
+				title = "Horizontal Fractional";
+			}
+			arg3
+			{
+				title = "Vertical Integral";
+			}
+			arg4
+			{
+				title = "Vertical Fractional";
+			}
+		}
+		188
+		{
+			title = "Sector Ceiling Scale";
+			id = "Sector_SetCeilingScale";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Horizontal Integral";
+			}
+			arg2
+			{
+				title = "Horizontal Fractional";
+			}
+			arg3
+			{
+				title = "Vertical Integral";
+			}
+			arg4
+			{
+				title = "Vertical Fractional";
+			}
+		}
+		189
+		{
+			title = "Sector Floor Scale";
+			id = "Sector_SetFloorScale";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Horizontal Integral";
+			}
+			arg2
+			{
+				title = "Horizontal Fractional";
+			}
+			arg3
+			{
+				title = "Vertical Integral";
+			}
+			arg4
+			{
+				title = "Vertical Fractional";
+			}
+		}
+		212
+		{
+			title = "Sector Color";
+			id = "Sector_SetColor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Red";
+			}
+			arg2
+			{
+				title = "Green";
+			}
+			arg3
+			{
+				title = "Blue";
+			}
+			arg4
+			{
+				title = "Desaturation";
+			}
+		}
+		213
+		{
+			title = "Sector Fade";
+			id = "Sector_SetFade";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Red";
+			}
+			arg2
+			{
+				title = "Green";
+			}
+			arg3
+			{
+				title = "Blue";
+			}
+		}
+		214
+		{
+			title = "Sector Damage";
+			id = "Sector_SetDamage";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Damage Amount";
+				default = 15;
+			}
+			arg2
+			{
+				title = "Death";
+				type = 11;
+				enum = "death_types";
+			}
+		}
+		216
+		{
+			title = "Sector Gravity";
+			id = "Sector_SetGravity";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Gravity Integral";
+			}
+			arg2
+			{
+				title = "Gravity Fractional";
+			}
+		}
+		
+		218
+		{
+			title = "Sector Wind";
+			id = "Sector_SetWind";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Wind Strength";
+			}
+			arg2
+			{
+				title = "Wind Angle";
+				type = 22;
+			}
+			arg3
+			{
+				title = "Use Line Vector";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+		219
+		{
+			title = "Sector Friction";
+			id = "Sector_SetFriction";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Friction Amount";
+				type = 11;
+				enum
+				{
+					0 = "Use Line Length";
+					1 = "Very Sludgy";
+					50 = "Sludgy";
+					100 = "Normal";
+					200 = "Icy";
+					255 = "Very Icy";
+				}
+			}
+		}
+		
+		220
+		{
+			title = "Sector Current";
+			id = "Sector_SetCurrent";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Current Strength";
+			}
+			arg2
+			{
+				title = "Current Angle";
+				type = 22;
+			}
+			arg3
+			{
+				title = "Use Line Vector";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+	}
+
+	alert
+	{
+		title = "Alert";
+		
+		173
+		{
+			title = "Alert monsters";
+			id = "NoiseAlert";
+			
+			arg0
+			{
+				title = "Target Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Emitter Tag";
+				type = 14;
+			}
+		}
+	}
+
+	communicator
+	{
+		title = "Communicator";
+		
+		174
+		{
+			title = "Communicator Message";
+			id = "SendToCommunicator";
+			
+			arg0
+			{
+				title = "Message ID";
+			}
+			arg1
+			{
+				title = "Front Side Only";
+				type = 11;
+				enum = "noyes";
+			}
+			arg2
+			{
+				title = "Print Activator Name";
+				type = 11;
+				enum = "noyes";
+			}
+			arg3
+			{
+				title = "Add to Log";
+				type = 11;
+				enum = "yesno";
+			}
+		}
+	}
+
+	change
+	{
+		title = "Change";
+		
+		157
+		{
+			title = "Set Global Fog Parameter (GZDoom only)";
+			id = "SetGlobalFogParameter";
+			
+			arg0
+			{
+				title = "Property";
+				type = 11;
+				enum
+				{
+					0 = "Density";
+					1 = "Outside density";
+					2 = "Skyfog";
+				}
+			}
+			arg1
+			{
+				title = "Value";
+			}
+		}
+		179
+		{
+			title = "Change Skill";
+			id = "ChangeSkill";
+			
+			arg0
+			{
+				title = "New Skill Level";
+				type = 11;
+				enum 
+				{
+					0 = "Very Easy";
+					1 = "Easy";
+					2 = "Normal";
+					3 = "Hard";
+					4 = "Nightmare!";
+				}
+			}
+		}
+	}
+
+	plane
+	{
+		title = "Plane";
+		
+		118
+		{
+			title = "Plane Copy (slope)";
+			id = "Plane_Copy";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Front Floor Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Front Ceiling Tag";
+				type = 13;
+			}
+			arg2
+			{
+				title = "Back Floor Tag";
+				type = 13;
+			}
+			arg3
+			{
+				title = "Back Ceiling Tag";
+				type = 13;
+			}
+			arg4
+			{
+				title = "Share Slope";
+				type = 12;
+				enum
+				{
+					1 = "Front floor to back sector";
+					2 = "Back floor to front sector";
+					4 = "Front ceiling to back sector";
+					8 = "Back ceiling to front sector";
+				}
+			}
+		}
+		159
+		{
+			title = "Plane Reflection (OpenGL only)";
+			id = "Sector_SetPlaneReflection";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Floor Reflectiveness";
+			}
+			arg2
+			{
+				title = "Ceiling Reflectiveness";
+			}
+		}
+		181
+		{
+			title = "Plane Align (slope)";
+			id = "Plane_Align";
+			requiresactivation = false;
+			
+			arg0
+			{
+				title = "Align Floor";
+				type = 11;
+				enum
+				{
+					0 = "None";
+					1 = "Front";
+					2 = "Back";
+				}
+			}
+			arg1
+			{
+				title = "Align Ceiling";
+				type = 11;
+				enum
+				{
+					0 = "None";
+					1 = "Front";
+					2 = "Back";
+				}
+			}
+		}
+	}
+
+	static
+	{
+		title = "Static";
+		
+		190
+		{
+			title = "Static Init";
+			id = "Static_Init";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Property";
+				type = 11;
+				enum
+				{
+					0 = "Set the gravity to the length of the linedef";
+					1 = "Set the light or fog color in a sector";
+					2 = "Set damage to the length of the linedef";
+					3 = "Define a sector link";
+					255 = "Use the line's upper texture as the sky in any tagged sectors";
+				}
+			}
+			arg2
+			{
+				title = "Flip Sky / Ceiling";
+			}
+			arg3
+			{
+				title = "Movement Type";
+			}
+		}
+	}
+
+	player
+	{
+		title = "Player";
+		
+		191
+		{
+			title = "Set Player Property";
+			id = "SetPlayerProperty";
+			
+			arg0
+			{
+				title = "Target";
+				type = 11;
+				enum
+				{
+					0 = "Activator";
+					1 = "Everyone";
+				}
+			}
+			arg1
+			{
+				title = "Enable";
+				type = 11;
+				enum = "noyes";
+			}
+			arg2
+			{
+				title = "Property";
+				type = 11;
+				enum
+				{
+					0 = "PROP_FROZEN";
+					1 = "PROP_NOTARGET";
+					2 = "PROP_INSTANTWEAPONSWITCH";
+					3 = "PROP_FLY";
+					4 = "PROP_TOTALLYFROZEN";
+					16 = "PROP_BUDDHA";
+				}
+			}
+		}
+	}
+
+	translucent
+	{
+		title = "Translucent";
+		
+		208
+		{
+			title = "Translucent Line";
+			id = "TranslucentLine";
+			requiresactivation = false;
+			
+			arg1
+			{
+				title = "Opacity";
+				default = 128;
+			}
+			arg2
+			{
+				title = "Additive";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+	}
+
+	point
+	{
+		title = "Point";
+		
+		227
+		{
+			title = "Point Pusher/Puller Set Force";
+			id = "PointPush_SetForce";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg2
+			{
+				title = "Strength";
+			}
+			arg3
+			{
+				title = "Use Line Vector";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+	}
+
+	camera
+	{
+		title = "Camera";
+		
+		237
+		{
+			title = "Change Camera";
+			id = "ChangeCamera";
+			
+			arg0
+			{
+				title = "Thing Tag";
+				type = 14;
+			}
+			arg1
+			{
+				title = "Target";
+				type = 11;
+				enum
+				{
+					0 = "Activator";
+					1 = "Everyone";
+				}
+			}
+			arg2
+			{
+				title = "Movement Cancels";
+				type = 11;
+				enum = "noyes";
+			}
+		}
+	}
+
+	elevator
+	{
+		title = "Elevator";
+		
+		245
+		{
+			title = "Elevator Raise to Nearest Floor";
+			id = "Elevator_RaiseToNearest";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		246
+		{
+			title = "Elevator Move to Activated Floor";
+			id = "Elevator_MoveToFloor";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+		247
+		{
+			title = "Elevator Lower to Nearest Floor";
+			id = "Elevator_LowerToNearest";
+			
+			arg0
+			{
+				title = "Sector Tag";
+				type = 13;
+			}
+			arg1
+			{
+				title = "Movement Speed";
+				type = 11;
+				enum = "plat_speeds";
+				default = 16;
+			}
+		}
+	}
+	line
+	{
+		156 // Line_SetPortal
+		{
+			arg1
+			{
+				title = "This Line Tag";
+				tooltip = "The tag number of the current line";
+				type = 15;
+			}	
+		}
+	}
+	polyobj
+	{
+		1	// Polyobject Start Line
+		{
+			arg3
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+		}
+		5	// Polyobject Explicit Line
+		{
+			arg4
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+		}
+	}
+	plane
+	{
+		181 //Plane_Align
+		{
+			arg2
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+		}
+	}
+	scroll
+	{
+		52 //Scroll_Wall
+		{
+			arg0
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+		}
+		221 //Scroll_Texture_Both
+		{
+			arg0
+			{
+				title = "Line ID";
+				type = 0;
+			}
+		}
+		222 //Scroll_Texture_Model
+		{
+			arg0
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+		}
+	}
+	sector
+	{
+		48 //Sector_Attach3dMidtex
+		{
+			arg0
+			{
+				title = "Line ID";
+				type = 0;
+			}
+		}
+		160 //Sector_Set3dFloor
+		{
+			arg1
+			{
+				title = "Type";
+				type = 26;
+				default = 1;
+				enum
+				{
+					0 = "Vavoom-Style";
+					1 = "Solid";
+					2 = "Swimmable";
+					3 = "Non-Solid";
+				}
+				flags
+				{
+					4 = "Render-Inside";
+					8 = "Use Arg5 as Line ID";
+					16 = "Invert Visibility Rules";
+					32 = "Invert Shootability Rules";
+				}
+			}
+			arg4
+			{
+				title = "Line ID / Hi-Tag";
+			}
+		}
+	}
+	teleport
+	{
+		215 //Teleport_Line
+		{
+			arg0
+			{
+				title = "Line ID";
+				type = 0;
+			}
+			arg1
+			{
+				title = "Target Line ID";
+				type = 0;
+			}
+		}
+	}
+	transfer
+	{
+		16 //Transfer_WallLight
+		{
+			arg0
+			{
+				title = "Line ID";
+				type = 0;
+			}
+		}
+  }
+	translucent
+	{
+		208 //TranslucentLine
+		{
+			arg0
+			{
+				title = "Set Line ID";
+				type = 0;
+			}
+			arg3
+			{
+				title = "Flags";
+				type = 12;
+				enum
+				{
+					1 = "Sound boundary";
+					2 = "Railing";
+					4 = "Block floating monsters";
+					8 = "Clip mid texture";
+					16 = "Wrap mid texture";
+					32 = "3D mid texture";
+					64 = "Check switch height";
+				}
+			}
+		}
+	}
+		// No Line_SetIdentification in UDMF!
+	line
+	{
+		121 = NULL;
+	}
+}
+
+enums
+{
+	change
+	{
+		0 = "No texture or type change";
+		1 = "Copy texture, zero type; trigger model";
+		2 = "Copy texture, zero type; numeric model";
+		3 = "Copy texture, preserve type; trigger model";
+		4 = "Copy texture, preserve type; numeric model";
+		5 = "Copy texture and type; trigger model";
+		6 = "Copy texture and type; numeric model";
+	}
+}
\ No newline at end of file
diff --git a/Build/Configurations/Includes/Eternity_things.cfg b/Build/Configurations/Includes/Eternity_things.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..a30c2b29efc5bd34c843ff4711373fc71ea20d17
--- /dev/null
+++ b/Build/Configurations/Includes/Eternity_things.cfg
@@ -0,0 +1,124 @@
+monsters
+{
+    888
+    {
+        title = "Dog";
+        sprite = "internal:dog";
+        class = "MBFHelperDog";
+        width = 12;
+        height = 28;
+    }
+}
+
+eternity
+{
+    color = 8;	// Grey
+	arrow = 1;
+	title = "Eternity Items";
+	width = 0;
+	height = 0;
+	sort = 1;
+	fixedsize = true;
+    
+    5003
+    {
+        title = "Camera spot";
+        class = "SMMUCameraSpot";
+    }
+    1200
+    {
+        title = "Enviro sequence 0";
+    }
+    1300
+    {
+        title = "Enviro sequence param";
+    }
+    1400
+    {
+        title = "Sector sequence 0";
+    }
+    1500
+    {
+        title = "Sector sequence param";
+    }
+    5004
+    {
+        title = "ExtraData thing";
+    }
+    5006
+    {
+        title = "Skybox camera";
+        class = "EESkyboxCam";
+    }
+    5007
+    {
+        title = "Particle Drip";
+        class = "EEParticleDrip";
+    }
+    9001
+    {
+        title = "Map spot";
+        class = "EEMapSpot";
+    }
+    9013
+    {
+        title = "Map spot gravity";
+        class = "EEMapSpotGravity";
+    }
+    9027
+    {
+        title = "Particle fountain red";
+    }
+    9028
+    {
+        title = "Particle fountain green";
+    }
+    9029
+    {
+        title = "Particle fountain blue";
+    }
+    9030
+    {
+        title = "Particle fountain yellow";
+    }
+    9031
+    {
+        title = "Particle fountain purple";
+    }
+    9032
+    {
+        title = "Particle fountain black";
+    }
+    9033
+    {
+        title = "Particle fountain white";
+    }
+    9300t
+    {
+        title = "Polyobject anchor";
+        class = "EEPolyObjAnchor";
+    }
+    9301
+    {
+        title = "Polyobject spawn spot";
+        class = "EEPolyObjSpawnSpot";
+    }
+    9302
+    {
+        title = "Polyobject spawn spot crush";
+        class = "EEPolyObjSpawnSpotCrush";
+    }
+    9303
+    {
+        title = "Polyobject spawn spot damage";
+        class = "EEPolyObjSpawnSpotDamage";
+    }
+    14001
+    {
+        title = "Ambience 1";
+    }
+    14065
+    {
+        title = "Ambience param";
+    }
+}
\ No newline at end of file
diff --git a/Build/Scripting/ZDoom_ACS.cfg b/Build/Scripting/ZDoom_ACS.cfg
index 4d89f86fd48a801402ade5246607ce48b6ae1766..b323c91f3d5afff37203da4ee53c2ef55914eb18 100644
--- a/Build/Scripting/ZDoom_ACS.cfg
+++ b/Build/Scripting/ZDoom_ACS.cfg
@@ -107,6 +107,7 @@ keywords
 	CheckActorInventory = "int CheckActorInventory(int tid, str inventory_item)\nChecks the given actor's inventory for the item specified by inventory_item";
 	CheckActorProperty = "bool CheckActorProperty(int tid, int property, [int|float|str] value)";
 	CheckActorState = "bool CheckActorState(int tid, str statename[, bool exact = false])";
+	CheckClass = "bool CheckClass(str classname)";
 	CheckFlag = "bool CheckFlag(int tid, str flag)\nChecks to see if the actor with the matching tid has the specified actor flag set.\nIf tid is 0, the check is performed on the activator of the script.";
 	CheckFont = "bool CheckFont(str fontname)";
 	CheckInventory = "int CheckInventory(str inventory_item)\nChecks the inventory of the actor who activated the script for the item specified by inventory_item";
diff --git a/Source/Core/Controls/ArgumentBox.cs b/Source/Core/Controls/ArgumentBox.cs
index e22cc9e5d3d84f0073114b8db33f981707ccf490..389235e7b60c230b649ddef245dbeb2df36506c4 100644
--- a/Source/Core/Controls/ArgumentBox.cs
+++ b/Source/Core/Controls/ArgumentBox.cs
@@ -263,36 +263,54 @@ namespace CodeImp.DoomBuilder.Controls
 		// This checks if the number is relative
 		public bool CheckIsRelative()
 		{
-			// Prefixed with ++ or --?
-			return (combobox.Text.Trim().StartsWith("++") || combobox.Text.Trim().StartsWith("--"));
+			// Prefixed with +++, ---, ++ or --?
+			string str = combobox.Text.Trim();
+			return (str.StartsWith("+++") || str.StartsWith("---") || str.StartsWith("++") || str.StartsWith("--"));
 		}
 		
 		// This returns the selected value
-		public int GetResult(int original)
+		public int GetResult(int original) { return GetResult(original, 0); } //mxd
+		public int GetResult(int original, int offset)
 		{
 			int result;
 			
 			// Strip prefixes
 			string str = combobox.Text.Trim().ToLowerInvariant();
-			str = str.TrimStart('+', '-');
+			string numstr = str.TrimStart('+', '-'); //mxd
 
 			// Anything in the box?
-			if(combobox.Text.Trim().Length > 0)
+			if(numstr.Length > 0)
 			{
+				//mxd. Prefixed with +++?
+				if(str.StartsWith("+++"))
+				{
+					// Add offset to number
+					int num;
+					if(!int.TryParse(numstr, out num)) num = 0;
+					result = num + offset;
+				}
+				//mxd. Prefixed with ---?
+				else if(str.StartsWith("---"))
+				{
+					// Subtract offset from number
+					int num;
+					if(!int.TryParse(numstr, out num)) num = 0;
+					result = num - offset;
+				}
 				// Prefixed with ++?
-				if(combobox.Text.Trim().StartsWith("++"))
+				else if(str.StartsWith("++"))
 				{
 					// Add number to original
 					int num;
-					if(!int.TryParse(str, out num)) num = 0;
+					if(!int.TryParse(numstr, out num)) num = 0;
 					result = original + num;
 				}
 				// Prefixed with --?
-				else if(combobox.Text.Trim().StartsWith("--"))
+				else if(str.StartsWith("--"))
 				{
 					// Subtract number from original
 					int num;
-					if(!int.TryParse(str, out num)) num = 0;
+					if(!int.TryParse(numstr, out num)) num = 0;
 					result = original - num;
 				}
 				else
diff --git a/Source/Core/Controls/ArgumentsControl.cs b/Source/Core/Controls/ArgumentsControl.cs
index a6784b98e6d8f3c495a624653c84a29b0554caf6..584bb74785405b7023e40d77c8524e8a359813a5 100644
--- a/Source/Core/Controls/ArgumentsControl.cs
+++ b/Source/Core/Controls/ArgumentsControl.cs
@@ -133,7 +133,7 @@ namespace CodeImp.DoomBuilder.Controls
 
 		#region ================== Apply
 
-		public void Apply(Linedef l)
+		public void Apply(Linedef l, int offset)
 		{
 			//mxd. Script name/number handling
 			// We can't rely on control visibility here, because all controlls will be invisible if ArgumentsControl is invisible
@@ -161,7 +161,7 @@ namespace CodeImp.DoomBuilder.Controls
 
 				// Apply classic arg
 				case ArgZeroMode.DEFAULT:
-					l.Args[0] = arg0.GetResult(l.Args[0]);
+					l.Args[0] = arg0.GetResult(l.Args[0], offset);
 					if(l.Fields.ContainsKey("arg0str")) l.Fields.Remove("arg0str");
 					break;
 
@@ -169,13 +169,13 @@ namespace CodeImp.DoomBuilder.Controls
 			}
 
 			// Apply the rest of args
-			l.Args[1] = arg1.GetResult(l.Args[1]);
-			l.Args[2] = arg2.GetResult(l.Args[2]);
-			l.Args[3] = arg3.GetResult(l.Args[3]);
-			l.Args[4] = arg4.GetResult(l.Args[4]);
+			l.Args[1] = arg1.GetResult(l.Args[1], offset);
+			l.Args[2] = arg2.GetResult(l.Args[2], offset);
+			l.Args[3] = arg3.GetResult(l.Args[3], offset);
+			l.Args[4] = arg4.GetResult(l.Args[4], offset);
 		}
 
-		public void Apply(Thing t)
+		public void Apply(Thing t, int offset)
 		{
 			//mxd. Script name/number handling
 			// We can't rely on control visibility here, because all controlls will be invisible if ArgumentsControl is invisible
@@ -203,7 +203,7 @@ namespace CodeImp.DoomBuilder.Controls
 
 				// Apply classic arg
 				case ArgZeroMode.DEFAULT:
-					t.Args[0] = arg0.GetResult(t.Args[0]);
+					t.Args[0] = arg0.GetResult(t.Args[0], offset);
 					if(t.Fields.ContainsKey("arg0str")) t.Fields.Remove("arg0str");
 					break;
 
@@ -211,10 +211,10 @@ namespace CodeImp.DoomBuilder.Controls
 			}
 
 			// Apply the rest of args
-			t.Args[1] = arg1.GetResult(t.Args[1]);
-			t.Args[2] = arg2.GetResult(t.Args[2]);
-			t.Args[3] = arg3.GetResult(t.Args[3]);
-			t.Args[4] = arg4.GetResult(t.Args[4]);
+			t.Args[1] = arg1.GetResult(t.Args[1], offset);
+			t.Args[2] = arg2.GetResult(t.Args[2], offset);
+			t.Args[3] = arg3.GetResult(t.Args[3], offset);
+			t.Args[4] = arg4.GetResult(t.Args[4], offset);
 		}
 
 		#endregion
diff --git a/Source/Core/Data/FlatImage.cs b/Source/Core/Data/FlatImage.cs
index d03f9e053cf49e4d47544e0dec37bbaceb216b74..f51e5135d08b37d7a9299dd960ed1b51b5bc84d9 100644
--- a/Source/Core/Data/FlatImage.cs
+++ b/Source/Core/Data/FlatImage.cs
@@ -58,9 +58,14 @@ namespace CodeImp.DoomBuilder.Data
 				if(lumpdata != null)
 				{
 					// Copy lump data to memory
-					lumpdata.Seek(0, SeekOrigin.Begin);
 					byte[] membytes = new byte[(int)lumpdata.Length];
-					lumpdata.Read(membytes, 0, (int)lumpdata.Length);
+
+					lock(lumpdata) //mxd
+					{
+						lumpdata.Seek(0, SeekOrigin.Begin);
+						lumpdata.Read(membytes, 0, (int)lumpdata.Length);
+					}
+					
 					MemoryStream mem = new MemoryStream(membytes);
 					mem.Seek(0, SeekOrigin.Begin);
 
diff --git a/Source/Core/Data/HiResImage.cs b/Source/Core/Data/HiResImage.cs
index 6a1932fa2d54e5c34a9990b47ad4d19a134b6634..84a037afcc016fbc6dc716347f1461b3404a5ab6 100644
--- a/Source/Core/Data/HiResImage.cs
+++ b/Source/Core/Data/HiResImage.cs
@@ -120,9 +120,14 @@ namespace CodeImp.DoomBuilder.Data
 				if(data != null)
 				{
 					// Copy patch data to memory
-					data.Seek(0, SeekOrigin.Begin);
 					byte[] membytes = new byte[(int)data.Length];
-					data.Read(membytes, 0, (int)data.Length);
+
+					lock(data) //mxd
+					{
+						data.Seek(0, SeekOrigin.Begin);
+						data.Read(membytes, 0, (int)data.Length);
+					}
+					
 					MemoryStream mem = new MemoryStream(membytes);
 					mem.Seek(0, SeekOrigin.Begin);
 
diff --git a/Source/Core/Data/SimpleTextureImage.cs b/Source/Core/Data/SimpleTextureImage.cs
index c5d129f583346dea66687aa954fd4e000eb128ee..750894d3719ea0b0e81e1a5c68dd2191c0b67d25 100644
--- a/Source/Core/Data/SimpleTextureImage.cs
+++ b/Source/Core/Data/SimpleTextureImage.cs
@@ -71,9 +71,14 @@ namespace CodeImp.DoomBuilder.Data
 				if(patchdata != null)
 				{
 					// Copy patch data to memory
-					patchdata.Seek(0, SeekOrigin.Begin);
 					byte[] membytes = new byte[(int)patchdata.Length];
-					patchdata.Read(membytes, 0, (int)patchdata.Length);
+
+					lock(patchdata) //mxd
+					{
+						patchdata.Seek(0, SeekOrigin.Begin);
+						patchdata.Read(membytes, 0, (int)patchdata.Length);
+					}
+					
 					MemoryStream mem = new MemoryStream(membytes);
 					mem.Seek(0, SeekOrigin.Begin);
 
diff --git a/Source/Core/Data/SpriteImage.cs b/Source/Core/Data/SpriteImage.cs
index 97e7be274fb537e77d3c6ed53ecd1386d7a0546d..0f9a0bfb8c353c979164de71f29b97739496dea1 100644
--- a/Source/Core/Data/SpriteImage.cs
+++ b/Source/Core/Data/SpriteImage.cs
@@ -89,9 +89,14 @@ namespace CodeImp.DoomBuilder.Data
 				if(lumpdata != null)
 				{
 					// Copy lump data to memory
-					lumpdata.Seek(0, SeekOrigin.Begin);
 					byte[] membytes = new byte[(int)lumpdata.Length];
-					lumpdata.Read(membytes, 0, (int)lumpdata.Length);
+
+					lock(lumpdata) //mxd
+					{
+						lumpdata.Seek(0, SeekOrigin.Begin);
+						lumpdata.Read(membytes, 0, (int)lumpdata.Length);
+					}
+					
 					MemoryStream mem = new MemoryStream(membytes);
 					mem.Seek(0, SeekOrigin.Begin);
 					
diff --git a/Source/Core/Data/TEXTURESImage.cs b/Source/Core/Data/TEXTURESImage.cs
index 79d3244f4ce158c1eaa810e2b90cea4c5aab2cd4..cd9fbe158c9e6c1212dc3de294bcf06ea4b1d9cc 100644
--- a/Source/Core/Data/TEXTURESImage.cs
+++ b/Source/Core/Data/TEXTURESImage.cs
@@ -162,9 +162,14 @@ namespace CodeImp.DoomBuilder.Data
 						if(patchdata != null)
 						{
 							// Copy patch data to memory
-							patchdata.Seek(0, SeekOrigin.Begin);
 							byte[] membytes = new byte[(int)patchdata.Length];
-							patchdata.Read(membytes, 0, (int)patchdata.Length);
+
+							lock(patchdata) //mxd
+							{
+								patchdata.Seek(0, SeekOrigin.Begin);
+								patchdata.Read(membytes, 0, (int)patchdata.Length);
+							}
+							
 							MemoryStream mem = new MemoryStream(membytes);
 							mem.Seek(0, SeekOrigin.Begin);
 
diff --git a/Source/Core/Data/TextureImage.cs b/Source/Core/Data/TextureImage.cs
index e5c3a43f3d4451478839eeefda8bd9dbc4e93589..e675d4a5b094961427bb4c5525af487b4a860e79 100644
--- a/Source/Core/Data/TextureImage.cs
+++ b/Source/Core/Data/TextureImage.cs
@@ -108,9 +108,14 @@ namespace CodeImp.DoomBuilder.Data
 						if(patchdata != null)
 						{
 							// Copy patch data to memory
-							patchdata.Seek(0, SeekOrigin.Begin);
 							byte[] membytes = new byte[(int)patchdata.Length];
-							patchdata.Read(membytes, 0, (int)patchdata.Length);
+
+							lock(patchdata) //mxd
+							{
+								patchdata.Seek(0, SeekOrigin.Begin);
+								patchdata.Read(membytes, 0, (int)patchdata.Length);
+							}
+							
 							MemoryStream mem = new MemoryStream(membytes);
 							mem.Seek(0, SeekOrigin.Begin);
 
diff --git a/Source/Core/Editing/EditMode.cs b/Source/Core/Editing/EditMode.cs
index fb5aeede68f02973b086a9d664970438f8ca61dd..da45ce4340b20ce8ba9a95baed72ba7474f58184 100644
--- a/Source/Core/Editing/EditMode.cs
+++ b/Source/Core/Editing/EditMode.cs
@@ -246,6 +246,7 @@ namespace CodeImp.DoomBuilder.Editing
 
 		// Processing events
 		public virtual void OnProcess(long deltatime) { }
+		public virtual void OnClockReset() { } //mxd
 		
 		// Generic events
 		public virtual void OnReloadResources() { }
diff --git a/Source/Core/General/Clock.cs b/Source/Core/General/Clock.cs
index 12866b6adda268267255dad4f8be15bed3f9a58f..6b41f249c5b17b6c2b96da4bc0143498df72931b 100644
--- a/Source/Core/General/Clock.cs
+++ b/Source/Core/General/Clock.cs
@@ -22,5 +22,12 @@ namespace CodeImp.DoomBuilder
 	{
 		// This queries the system for the current time
 		public static long CurrentTime { get { return Configuration.Timer.ElapsedMilliseconds; } }
+
+		//mxd. Timer needs to be reset from time to time (like, every 2 days of continuously running the editor) to prevent float precision degradation.
+		internal static void Reset()
+		{
+			Configuration.Timer.Reset();
+			Configuration.Timer.Start();
+		}
 	}
 }
diff --git a/Source/Core/General/General.cs b/Source/Core/General/General.cs
index 200a251b739e587f83caf1dfea71a5b019058bac..e3004cee6346f4afb852408d4de8a4944edbb536 100644
--- a/Source/Core/General/General.cs
+++ b/Source/Core/General/General.cs
@@ -1062,6 +1062,9 @@ namespace CodeImp.DoomBuilder
 			// Ask the user to save changes (if any)
 			if(AskSaveMap())
 			{
+				//mxd. Reset the clock...
+				MainWindow.ResetClock();
+				
 				// Open map options dialog
 				MapOptionsForm optionswindow = new MapOptionsForm(newoptions, true);
 				if(optionswindow.ShowDialog(mainwindow) == DialogResult.OK)
@@ -1457,6 +1460,9 @@ namespace CodeImp.DoomBuilder
 				Cursor.Current = Cursors.Default;
 			}
 
+			//mxd. Also reset the clock...
+			MainWindow.ResetClock();
+
 			return result;
 		}
 
@@ -1541,6 +1547,10 @@ namespace CodeImp.DoomBuilder
 			}
 			
 			savefile.Dispose();
+
+			//mxd. Also reset the clock...
+			MainWindow.ResetClock();
+
 			return result;
 		}
 
@@ -1606,6 +1616,10 @@ namespace CodeImp.DoomBuilder
 			}
 
 			savefile.Dispose();
+
+			//mxd. Also reset the clock...
+			MainWindow.ResetClock();
+
 			return result;
 		}
 		
diff --git a/Source/Core/Rendering/Renderer3D.cs b/Source/Core/Rendering/Renderer3D.cs
index ce5e31d1abb888c44e30cd48fd36ff7ffa9c1b81..6d63ae0cefd81d809e67c15c33b352e65ff68ff6 100644
--- a/Source/Core/Rendering/Renderer3D.cs
+++ b/Source/Core/Rendering/Renderer3D.cs
@@ -335,8 +335,7 @@ namespace CodeImp.DoomBuilder.Rendering
 				// Highlight
 				if(General.Settings.AnimateVisualSelection)
 				{
-					long time = Clock.CurrentTime;
-					highlightglow = (float)Math.Sin(time / 100.0f) * 0.1f + 0.4f;
+					highlightglow = (float)Math.Sin(Clock.CurrentTime / 100.0f) * 0.1f + 0.4f;
 					highlightglowinv = -highlightglow + 0.8f;
 				}
 				else
diff --git a/Source/Core/VisualModes/VisualThing.cs b/Source/Core/VisualModes/VisualThing.cs
index a7f1c045860aca398736ac4a690d4d86f01025e3..92fd6eb09ce218cf467bf2d330c6c268ec628ad8 100644
--- a/Source/Core/VisualModes/VisualThing.cs
+++ b/Source/Core/VisualModes/VisualThing.cs
@@ -759,7 +759,6 @@ namespace CodeImp.DoomBuilder.VisualModes
 				return;
 			}
 
-			long time = Clock.CurrentTime;
 			float rMin = Math.Min(lightPrimaryRadius, lightSecondaryRadius);
 			float rMax = Math.Max(lightPrimaryRadius, lightSecondaryRadius);
 			float diff = rMax - rMin;
@@ -767,12 +766,12 @@ namespace CodeImp.DoomBuilder.VisualModes
 			switch(lightType) 
 			{
 				case DynamicLightType.PULSE:
-					lightDelta = ((float)Math.Sin(time / (interval * 4.0f)) + 1.0f) / 2.0f; //just playing by the eye here... in [0.0 ... 1.0] interval
+					lightDelta = ((float)Math.Sin(Clock.CurrentTime / (interval * 4.0f)) + 1.0f) / 2.0f; //just playing by the eye here... in [0.0 ... 1.0] interval
 					lightRadius = rMin + diff * lightDelta;
 					break;
 
-				case DynamicLightType.FLICKER: 
-					float fdelta = (float)Math.Sin(time / 0.1f); //just playing by the eye here...
+				case DynamicLightType.FLICKER:
+					float fdelta = (float)Math.Sin(Clock.CurrentTime / 0.1f); //just playing by the eye here...
 					if(Math.Sign(fdelta) != Math.Sign(lightDelta)) 
 					{
 						lightDelta = fdelta;
@@ -781,7 +780,7 @@ namespace CodeImp.DoomBuilder.VisualModes
 					break;
 
 				case DynamicLightType.RANDOM:
-					float rdelta = (float)Math.Sin(time / (interval * 9.0f)); //just playing by the eye here...
+					float rdelta = (float)Math.Sin(Clock.CurrentTime / (interval * 9.0f)); //just playing by the eye here...
 					if(Math.Sign(rdelta) != Math.Sign(lightDelta)) 
 					{
 						lightRadius = rMin + (General.Random(0, (int) (diff * 10))) / 10.0f;
diff --git a/Source/Core/Windows/LinedefEditForm.cs b/Source/Core/Windows/LinedefEditForm.cs
index 9247d9312408fefcf8973afe061a71137d80d5f8..edf55d1cd1c7ed749ce462de195e9563efd13ec9 100644
--- a/Source/Core/Windows/LinedefEditForm.cs
+++ b/Source/Core/Windows/LinedefEditForm.cs
@@ -394,7 +394,7 @@ namespace CodeImp.DoomBuilder.Windows
 			MakeUndo(); //mxd
 			
 			// Go for all the lines
-			int tagoffset = 0; //mxd
+			int offset = 0; //mxd
 			foreach(Linedef l in lines)
 			{
 				// Apply chosen activation flag
@@ -402,11 +402,11 @@ namespace CodeImp.DoomBuilder.Windows
 					l.Activate = (activation.SelectedItem as LinedefActivateInfo).Index;
 				
 				// Action/tags
-				l.Tag = General.Clamp(tagSelector.GetSmartTag(l.Tag, tagoffset++), General.Map.FormatInterface.MinTag, General.Map.FormatInterface.MaxTag); //mxd
+				l.Tag = General.Clamp(tagSelector.GetSmartTag(l.Tag, offset), General.Map.FormatInterface.MinTag, General.Map.FormatInterface.MaxTag); //mxd
 				if(!action.Empty) l.Action = action.Value;
 
 				//mxd. Apply args
-				argscontrol.Apply(l);
+				argscontrol.Apply(l, offset);
 				
 				// Remove front side?
 				if((l.Front != null) && (frontside.CheckState == CheckState.Unchecked))
@@ -457,6 +457,9 @@ namespace CodeImp.DoomBuilder.Windows
 						}
 					}
 				}
+
+				//mxd. Increase offset...
+				offset++;
 			}
 
 			// Update the used textures
diff --git a/Source/Core/Windows/LinedefEditFormUDMF.cs b/Source/Core/Windows/LinedefEditFormUDMF.cs
index 7b6f1b7a02aada365b615c5ada6e2b32597ba46e..73f9ec2eec4951777efb5d4dba08e24dda9368cd 100644
--- a/Source/Core/Windows/LinedefEditFormUDMF.cs
+++ b/Source/Core/Windows/LinedefEditFormUDMF.cs
@@ -668,6 +668,7 @@ namespace CodeImp.DoomBuilder.Windows
 			}
 			
 			// Go for all the lines
+			int offset = 0; //mxd
 			foreach(Linedef l in lines)
 			{
 				// UDMF activations
@@ -685,7 +686,7 @@ namespace CodeImp.DoomBuilder.Windows
 				if(!action.Empty) l.Action = action.Value;
 
 				//mxd. Apply args
-				argscontrol.Apply(l);
+				argscontrol.Apply(l, offset++);
 				
 				// Remove front side?
 				if((l.Front != null) && (frontside.CheckState == CheckState.Unchecked))
diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs
index 78da8864192839c72a4ce754c171b1b4700897a4..90c7c3cc4c9d0c8baac5180ffd50f42e383281b5 100644
--- a/Source/Core/Windows/MainForm.cs
+++ b/Source/Core/Windows/MainForm.cs
@@ -4164,6 +4164,17 @@ namespace CodeImp.DoomBuilder.Windows
 			processingcount = 0;
 			processor.Enabled = false;
 		}
+
+		//mxd
+		internal void ResetClock()
+		{
+			Clock.Reset();
+			lastupdatetime = 0;
+			
+			// Let the mode know...
+			if(General.Editing.Mode != null)
+				General.Editing.Mode.OnClockReset();
+		}
 		
 		// Processor event
 		private void processor_Tick(object sender, EventArgs e)
diff --git a/Source/Core/Windows/ThingEditForm.cs b/Source/Core/Windows/ThingEditForm.cs
index 5a18300cf128feda9b3bf34c07469d58256bf289..4e54eb1e0e5c7bcac01584e013b942a790909204 100644
--- a/Source/Core/Windows/ThingEditForm.cs
+++ b/Source/Core/Windows/ThingEditForm.cs
@@ -416,7 +416,7 @@ namespace CodeImp.DoomBuilder.Windows
 			}
 
 			// Go for all the things
-			int tagoffset = 0; //mxd
+			int offset = 0; //mxd
 			foreach(Thing t in things)
 			{
 				// Coordination
@@ -443,14 +443,17 @@ namespace CodeImp.DoomBuilder.Windows
 				}
 
 				// Action/tags
-				t.Tag = General.Clamp(tagSelector.GetSmartTag(t.Tag, tagoffset++), General.Map.FormatInterface.MinTag, General.Map.FormatInterface.MaxTag); //mxd
+				t.Tag = General.Clamp(tagSelector.GetSmartTag(t.Tag, offset), General.Map.FormatInterface.MinTag, General.Map.FormatInterface.MaxTag); //mxd
 				if(!action.Empty) t.Action = action.Value;
 
 				//mxd. Apply args
-				argscontrol.Apply(t);
+				argscontrol.Apply(t, offset);
 				
 				// Update settings
 				t.UpdateConfiguration();
+
+				//mxd. Increase offset...
+				offset++;
 			}
 
 			// Set as defaults
diff --git a/Source/Core/Windows/ThingEditFormUDMF.cs b/Source/Core/Windows/ThingEditFormUDMF.cs
index df08d4509d11c52d5d040b2ecf4cdcaeb416265a..84b92931272ed58e681d318209d6b4723dd52441 100644
--- a/Source/Core/Windows/ThingEditFormUDMF.cs
+++ b/Source/Core/Windows/ThingEditFormUDMF.cs
@@ -512,7 +512,7 @@ namespace CodeImp.DoomBuilder.Windows
 			}
 
 			// Go for all the things
-			int tagoffset = 0; //mxd
+			int offset = 0; //mxd
 			foreach(Thing t in things) 
 			{
 				// Coordination
@@ -532,11 +532,11 @@ namespace CodeImp.DoomBuilder.Windows
 				if(t.Position.x != px || t.Position.y != py) t.Move(new Vector2D(px, py));
 
 				// Action/tags
-				t.Tag = General.Clamp(tagSelector.GetSmartTag(t.Tag, tagoffset++), General.Map.FormatInterface.MinTag, General.Map.FormatInterface.MaxTag); //mxd
+				t.Tag = General.Clamp(tagSelector.GetSmartTag(t.Tag, offset), General.Map.FormatInterface.MinTag, General.Map.FormatInterface.MaxTag); //mxd
 				if(!action.Empty) t.Action = action.Value;
 
 				//mxd. Apply args
-				argscontrol.Apply(t);
+				argscontrol.Apply(t, offset);
 
 				//mxd. Custom fields
 				fieldslist.Apply(t.Fields);
@@ -563,6 +563,9 @@ namespace CodeImp.DoomBuilder.Windows
 
 				// Update settings
 				t.UpdateConfiguration();
+
+				//mxd. Increase offset...
+				offset++;
 			}
 
 			// Set as defaults
diff --git a/Source/Plugins/BuilderModes/ClassicModes/MakeSectorMode.cs b/Source/Plugins/BuilderModes/ClassicModes/MakeSectorMode.cs
index fe83eea2470e68676a79508619ce47dc629bf62c..7509476ecce1c6e86cd3e3b74165e4332342eedf 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/MakeSectorMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/MakeSectorMode.cs
@@ -506,8 +506,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			if(flashpolygon != null)
 			{
 				// Determine the intensity of the flash by time elapsed
-				long curtime = Clock.CurrentTime;
-				flashintensity = 1f - ((curtime - flashstarttime) / FLASH_DURATION);
+				flashintensity = 1f - ((Clock.CurrentTime - flashstarttime) / FLASH_DURATION);
 				if(flashintensity > 0.0f)
 				{
 					// Update vertices in polygon
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
index 88ae06980a47be669bd01a988993f265fcd50777..820178e572c19638103ee0073e3355e30b776b9f 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
@@ -1209,7 +1209,14 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			MouseEventArgs args = new MouseEventArgs(General.Interface.MouseButtons, 0, 0, 0, 0);
 			OnMouseMove(args);
 		}
-		
+
+		//mxd
+		public override void OnClockReset()
+		{
+			base.OnClockReset();
+			lastpicktime = 0;
+		}
+
 		// This draws a frame
 		public override void OnRedrawDisplay()
 		{
diff --git a/Source/Plugins/NodesViewer/NodesForm.cs b/Source/Plugins/NodesViewer/NodesForm.cs
index c42d8f42f367c9ad851efe67385610b4b49f4b03..08c00abf6f080950f3ddd3264ade7767cc28be01 100644
--- a/Source/Plugins/NodesViewer/NodesForm.cs
+++ b/Source/Plugins/NodesViewer/NodesForm.cs
@@ -168,6 +168,7 @@ namespace CodeImp.DoomBuilder.Plugins.NodesViewer
 			NodesViewerMode newmode = new NodesViewerMode();
 			General.Editing.ChangeMode(newmode);
 			newmode.Form.showsegsvertices.Checked = this.showsegsvertices.Checked;
+			newmode.Form.Location = this.Location; //mxd
 		}
 
 		#endregion
diff --git a/Source/Plugins/VisplaneExplorer/VisplaneExplorerMode.cs b/Source/Plugins/VisplaneExplorer/VisplaneExplorerMode.cs
index 84be986e1d2043dd413bd8e5ac293f80de06abf3..23d11e69e91ad10c0861b85a3d0e840a35515b75 100644
--- a/Source/Plugins/VisplaneExplorer/VisplaneExplorerMode.cs
+++ b/Source/Plugins/VisplaneExplorer/VisplaneExplorerMode.cs
@@ -59,7 +59,7 @@ namespace CodeImp.DoomBuilder.Plugins.VisplaneExplorer
 		private Dictionary<Point, Tile> tiles = new Dictionary<Point, Tile>();
 
 		// Time when to do another update
-		private DateTime nextupdate;
+		private long nextupdate;
 
 		// Are we processing?
 		private bool processingenabled;
@@ -323,7 +323,7 @@ namespace CodeImp.DoomBuilder.Plugins.VisplaneExplorer
 			renderer.SetPresentation(p);
 
 			// Setup processing
-			nextupdate = DateTime.Now + new TimeSpan(0, 0, 0, 0, 100);
+			nextupdate = Clock.CurrentTime + 100;
 			General.Interface.EnableProcessing();
 			processingenabled = true;
 
@@ -358,7 +358,7 @@ namespace CodeImp.DoomBuilder.Plugins.VisplaneExplorer
 			RedrawAllTiles();
 			
 			// Update the screen sooner
-			nextupdate = DateTime.Now + new TimeSpan(0, 0, 0, 0, 100);
+			nextupdate = Clock.CurrentTime + 100;
 		}
 
 		// Draw the display
@@ -383,7 +383,7 @@ namespace CodeImp.DoomBuilder.Plugins.VisplaneExplorer
 		public override void OnProcess(long deltatime)
 		{
 			base.OnProcess(deltatime);
-			if(DateTime.Now >= nextupdate)
+			if(Clock.CurrentTime >= nextupdate)
 			{
 				// Get the processed points from the VPO manager
 				List<PointData> points = new List<PointData>();
@@ -405,7 +405,7 @@ namespace CodeImp.DoomBuilder.Plugins.VisplaneExplorer
 				RedrawAllTiles();
 				General.Interface.RedrawDisplay();
 
-				nextupdate = DateTime.Now + new TimeSpan(0, 0, 0, 0, 500);
+				nextupdate = Clock.CurrentTime + 500;
 			}
 			else
 			{