diff --git a/xtrn/3rdp-install/carlton-blackjack.ini b/xtrn/3rdp-install/carlton-blackjack.ini
new file mode 100644
index 0000000000000000000000000000000000000000..b24251286fbacf735c33eb4e0209f31c726bdca6
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-blackjack.ini
@@ -0,0 +1,24 @@
+Name: Black Jack
+Desc: Blackjack Door with Pro/Vegas Features
+By:   Todd Carlton
+Cats: Games
+Subs: Chance
+exe: BLAKJACK.EXE
+
+[md5:e8ee607a940c5f75d0fa4a235f6e3682]
+ver = 3.31
+url = http://bbsfiles.com/ftp/Carlton/bj331.zip
+
+[prog:BLACKJ]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Black Jack
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = blakjack node%#.cfg /FD
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[exec:../3rdp-install/carlton-blackjack.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-blackjack.js b/xtrn/3rdp-install/carlton-blackjack.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f4889d653df3a9da5d648a6b8bda0999cbaa642
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-blackjack.js
@@ -0,0 +1,40 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+var cfg_filename = js.startup_dir + 'BLAKJACK.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[4] = gamedir + "BLAKJACK.ASC";
+lines[5] = gamedir + "BLAKJACK.ANS";
+
+writeln("Beginning node config generation...");
+for (i in system.node_list) {
+	var nodenum = parseInt(i, 10) + 1;
+	lines[0] = system.node_list[i].dir + 'door.sys';
+	
+	writeln("Creating " + js.startup_dir + 'node' + nodenum + '.cfg');
+	
+	var file = new File(js.startup_dir + 'node' + nodenum + '.cfg');
+	if (!file.open("w")) {
+		writeln("Error " + file.error + " opening " + file.name + " for writing");
+		exit(1)
+	}
+	file.writeAll(lines);
+	file.close();
+}
+
+writeln("Config generation complete");
+
+exit(0);
diff --git a/xtrn/3rdp-install/carlton-crazy8.ini b/xtrn/3rdp-install/carlton-crazy8.ini
new file mode 100644
index 0000000000000000000000000000000000000000..e6a46eac3caa88f1ebce7fc09af82094666bee53
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-crazy8.ini
@@ -0,0 +1,24 @@
+Name: Those Crazy Eights
+Desc: Classic game of Crazy 8's
+By:   Todd Carlton
+Cats: Games
+Subs: Card, Board
+exe: CRAZY8.EXE
+
+[md5:02f847daa71401b99b0d1e4019136b63]
+ver = 1.21
+url = http://bbsfiles.com/ftp/Carlton/ce121.zip
+
+[prog:CRAZY8]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Those Crazy Eights
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = crazy8.exe node%#.cfg /FD
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[exec:../3rdp-install/carlton-crazy8.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-crazy8.js b/xtrn/3rdp-install/carlton-crazy8.js
new file mode 100644
index 0000000000000000000000000000000000000000..a275bdb1fcb88bbdce844c55a85b85de664c1f65
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-crazy8.js
@@ -0,0 +1,39 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+var cfg_filename = js.startup_dir + 'CRAZY8.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[4] = gamedir;
+
+writeln("Beginning node config generation...");
+for (i in system.node_list) {
+	var nodenum = parseInt(i, 10) + 1;
+	lines[0] = system.node_list[i].dir + 'door.sys';
+	
+	writeln("Creating " + js.startup_dir + 'node' + nodenum + '.cfg');
+	
+	var file = new File(js.startup_dir + 'node' + nodenum + '.cfg');
+	if (!file.open("w")) {
+		writeln("Error " + file.error + " opening " + file.name + " for writing");
+		exit(1)
+	}
+	file.writeAll(lines);
+	file.close();
+}
+
+writeln("Config generation complete");
+
+exit(0);
diff --git a/xtrn/3rdp-install/carlton-doormania.ini b/xtrn/3rdp-install/carlton-doormania.ini
new file mode 100644
index 0000000000000000000000000000000000000000..8db2d8577397dbb55b726e8b8cc55bcd4bce1608
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-doormania.ini
@@ -0,0 +1,24 @@
+Name: DoorMania
+Desc: 12 popular doors in one: Blackjack, Luck 7, Plinko, High Roller, and more.
+By:   Todd Carlton
+Cats: Games
+Subs: Chance, Trivia, Cards
+exe: MANIA.EXE
+
+[md5:0cf56c8b083436a2ddfc02991867be01]
+ver = 4.05
+url = http://bbsfiles.com/ftp/Carlton/dm405.zip
+
+[prog:DMANIA]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = DoorMania
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = mania node%#.cfg /FD
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[exec:../3rdp-install/carlton-doormania.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-doormania.js b/xtrn/3rdp-install/carlton-doormania.js
new file mode 100644
index 0000000000000000000000000000000000000000..2ee52a96fec22192334a54fd86756ebb8e9bf4f1
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-doormania.js
@@ -0,0 +1,39 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+var cfg_filename = js.startup_dir + 'SAMPLE.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[4] = gamedir;
+
+writeln("Beginning node config generation...");
+for (i in system.node_list) {
+	var nodenum = parseInt(i, 10) + 1;
+	lines[0] = system.node_list[i].dir + 'door.sys';
+	
+	writeln("Creating " + js.startup_dir + 'node' + nodenum + '.cfg');
+	
+	var file = new File(js.startup_dir + 'node' + nodenum + '.cfg');
+	if (!file.open("w")) {
+		writeln("Error " + file.error + " opening " + file.name + " for writing");
+		exit(1)
+	}
+	file.writeAll(lines);
+	file.close();
+}
+
+writeln("Config generation complete");
+
+exit(0);
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-fleethunter.ini b/xtrn/3rdp-install/carlton-fleethunter.ini
new file mode 100644
index 0000000000000000000000000000000000000000..863d56ed778ba61057661865e082ca80f0bcb274
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-fleethunter.ini
@@ -0,0 +1,29 @@
+Name: Fleet Hunter
+Desc: Enemy Waters: Part II. Use torpedos to destroy ships on your target list.
+By:   Todd Carlton
+Cats: Games
+Subs: Arcade
+exe: FLEET.EXE
+
+[md5:c28ec00fb4144a81e553d736de95a92e]
+ver = 1.34
+url = http://bbsfiles.com/ftp/Carlton/fh134.zip
+
+[prog:FLEETH]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Fleet Hunter
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = fleet.exe %#
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[pre-eval:file_exists(startup_dir + 'CARLTON.INF')]
+prompt = false
+required = true
+fail = Run MAKENODE.EXE or copy existing CARLTON.INF into gamedir. It should set FOSSIL and NODE DIR.
+
+[exec:../3rdp-install/carlton-fleethunter.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-fleethunter.js b/xtrn/3rdp-install/carlton-fleethunter.js
new file mode 100644
index 0000000000000000000000000000000000000000..6edfca8058f7e123e33356a611b22e821eb06b12
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-fleethunter.js
@@ -0,0 +1,35 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+file_backup(gamedir + "HUNTER.CFG", 3);
+
+var cfg_filename = js.startup_dir + 'SAMPLE.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[2] = gamedir + "CARLTON.INF";
+lines[3] = gamedir + "TRISCORE.ANS";
+lines[4] = gamedir + "TRISCORE.ASC";
+
+var file = new File(js.startup_dir + 'HUNTER.CFG');
+if (!file.open("w")) {
+	writeln("Error " + file.error + " opening " + file.name + " for writing");
+	exit(1)
+}
+file.writeAll(lines);
+file.close();
+
+writeln("Config generation complete");
+
+exit(0);
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-litecar.ini b/xtrn/3rdp-install/carlton-litecar.ini
new file mode 100644
index 0000000000000000000000000000000000000000..8228211ced02a2cfe8230825fa69efca875623cc
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-litecar.ini
@@ -0,0 +1,29 @@
+Name: Lite Car Challenge
+Desc: Race around the arena dodging obstacles and evading other players.
+By:   Todd Carlton
+Cats: Games
+Subs: Arena, Racing
+exe: LITECARS.EXE
+
+[md5:62b40d35bb8ba1c4b24e032bc38c428f]
+ver = 1.54
+url = http://bbsfiles.com/ftp/Carlton/lc154.zip
+
+[prog:LITECAR]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Lite Car Challenge
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = litecars.exe %#
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[pre-eval:file_exists(startup_dir + 'CARLTON.INF')]
+prompt = false
+required = true
+fail = Run MAKENODE.EXE or copy existing CARLTON.INF into gamedir. It should set FOSSIL and NODE DIR.
+
+[exec:../3rdp-install/carlton-litecar.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-litecar.js b/xtrn/3rdp-install/carlton-litecar.js
new file mode 100644
index 0000000000000000000000000000000000000000..88bc9983ee48ada49d4d5f343e655e0c6199d74c
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-litecar.js
@@ -0,0 +1,35 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+file_backup(gamedir + "LITECARS.CFG", 3);
+
+var cfg_filename = js.startup_dir + 'LITECARS.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[2] = gamedir + "CARLTON.INF";
+lines[3] = gamedir + "SCORE.ASC";
+lines[4] = gamedir + "SCORE.ANS";
+
+var file = new File(js.startup_dir + 'LITECARS.CFG');
+if (!file.open("w")) {
+	writeln("Error " + file.error + " opening " + file.name + " for writing");
+	exit(1)
+}
+file.writeAll(lines);
+file.close();
+
+writeln("Config generation complete");
+
+exit(0);
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-milleborne.ini b/xtrn/3rdp-install/carlton-milleborne.ini
new file mode 100644
index 0000000000000000000000000000000000000000..81f6d1c01c1b410975b87b2632bbfffde8f64b78
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-milleborne.ini
@@ -0,0 +1,29 @@
+Name: Mille Borne
+Desc: The number one family card game.
+By:   Todd Carlton
+Cats: Games
+Subs: Card, Board
+exe: MB.EXE
+
+[md5:94e41796c8e8c6892777f7ec13610896]
+ver = 5.25
+url = http://bbsfiles.com/ftp/Carlton/mz335.zip
+
+[prog:MILLE]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Mille Borne
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = mb.exe %#
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[pre-eval:file_exists(startup_dir + 'CARLTON.INF')]
+prompt = false
+required = true
+fail = Run MAKENODE.EXE or copy existing CARLTON.INF into gamedir. It should set FOSSIL and NODE DIR.
+
+[exec:../3rdp-install/carlton-milleborne.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-milleborne.js b/xtrn/3rdp-install/carlton-milleborne.js
new file mode 100644
index 0000000000000000000000000000000000000000..b3d9bb4bb0dead8da3bbad7303ea85b77c2960ce
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-milleborne.js
@@ -0,0 +1,35 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+file_backup(gamedir + "MB.CFG", 3);
+
+var cfg_filename = js.startup_dir + 'MB.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[2] = gamedir + "CARLTON.INF";
+lines[3] = gamedir + "SCORE-MB.ASC";
+lines[4] = gamedir + "SCORE-MB.ANS";
+
+var file = new File(js.startup_dir + 'MB.CFG');
+if (!file.open("w")) {
+	writeln("Error " + file.error + " opening " + file.name + " for writing");
+	exit(1)
+}
+file.writeAll(lines);
+file.close();
+
+writeln("Config generation complete");
+
+exit(0);
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-minezone.ini b/xtrn/3rdp-install/carlton-minezone.ini
new file mode 100644
index 0000000000000000000000000000000000000000..8685c37ff24a6eab4eb69afd6735c0a7e679e48f
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-minezone.ini
@@ -0,0 +1,24 @@
+Name: Mine Zone
+Desc: Navigate through the minezone without blowing yourself up.
+By:   Todd Carlton
+Cats: Games
+Subs: Arcade
+exe: MINEZONE.EXE
+
+[md5:0fcb20c294c42cf67db987379965bf0b]
+ver = 3.35
+url = http://bbsfiles.com/ftp/Carlton/mz335.zip
+
+[prog:MINEZONE]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Mine Zone
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = minezone.exe %#.cfg /FD
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[exec:../3rdp-install/carlton-minezone.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-minezone.js b/xtrn/3rdp-install/carlton-minezone.js
new file mode 100644
index 0000000000000000000000000000000000000000..77c60fcb9ea17eccdd112943e2798b3f36470668
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-minezone.js
@@ -0,0 +1,40 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+var cfg_filename = js.startup_dir + 'MINEZONE.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[4] = gamedir + "MINESCOR.ASC";
+lines[5] = gamedir + "MINESCOR.ANS";
+
+writeln("Beginning node config generation...");
+for (i in system.node_list) {
+	var nodenum = parseInt(i, 10) + 1;
+	lines[0] = system.node_list[i].dir + 'door.sys';
+	
+	writeln("Creating " + js.startup_dir + 'node' + nodenum + '.cfg');
+	
+	var file = new File(js.startup_dir + 'node' + nodenum + '.cfg');
+	if (!file.open("w")) {
+		writeln("Error " + file.error + " opening " + file.name + " for writing");
+		exit(1)
+	}
+	file.writeAll(lines);
+	file.close();
+}
+
+writeln("Config generation complete");
+
+exit(0);
diff --git a/xtrn/3rdp-install/carlton-navgrid.ini b/xtrn/3rdp-install/carlton-navgrid.ini
new file mode 100644
index 0000000000000000000000000000000000000000..433d4653ac27215d930961b74fe3989bcd986035
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-navgrid.ini
@@ -0,0 +1,24 @@
+Name: NavGrid
+Desc: Enemy Waters Part I. Cursor-Controlled Combat Game.
+By:   Todd Carlton
+Cats: Games
+Subs: Arcade,Combats
+exe: NAVGRID.EXE
+
+[md5:00d6a5b11db6054927875f644c1216fa]
+ver = 3.41
+url = http://bbsfiles.com/ftp/Carlton/ng341.zip
+
+[prog:NAVGRID]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = NavGrid
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = navgrid.exe node%#.cfg /FD
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[exec:../3rdp-install/carlton-navgrid.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-navgrid.js b/xtrn/3rdp-install/carlton-navgrid.js
new file mode 100644
index 0000000000000000000000000000000000000000..63ef2dab798f7248f80c1f5107e84d0981a294c3
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-navgrid.js
@@ -0,0 +1,39 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+var cfg_filename = js.startup_dir + 'SAMPLE.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[4] = gamedir;
+
+writeln("Beginning node config generation...");
+for (i in system.node_list) {
+	var nodenum = parseInt(i, 10) + 1;
+	lines[0] = system.node_list[i].dir + 'door.sys';
+	
+	writeln("Creating " + js.startup_dir + 'node' + nodenum + '.cfg');
+	
+	var file = new File(js.startup_dir + 'node' + nodenum + '.cfg');
+	if (!file.open("w")) {
+		writeln("Error " + file.error + " opening " + file.name + " for writing");
+		exit(1)
+	}
+	file.writeAll(lines);
+	file.close();
+}
+
+writeln("Config generation complete");
+
+exit(0);
diff --git a/xtrn/3rdp-install/carlton-plinko.ini b/xtrn/3rdp-install/carlton-plinko.ini
new file mode 100644
index 0000000000000000000000000000000000000000..d881a75d21f37047c444219daa8d3956d20d3fce
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-plinko.ini
@@ -0,0 +1,32 @@
+Name: Plinko
+Desc: Aim Plink chips and drop them down the pegged board.
+By:   Todd Carlton
+Cats: Games
+Subs: Chance
+exe: PLINKO.EXE
+
+; WARNING: Do not read the sysop docs, they are wrong. Line 5 of the config 
+; should be the baud rate, like:
+; 5 - baud rate
+; 6 - bulletin dir
+; 7 - asc file
+; 8 - ans file
+; then 9-12 are the same as the docs
+; ALSO - bbstype 1 is DOOR.SYS
+[md5:0d9e6a93d84e26f14d00e163418fe3e5]
+ver = 1.14
+url = http://bbsfiles.com/ftp/Carlton/po114.zip
+
+[prog:PLINKO]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Plinko
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = plinko.exe node%#.cfg
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[exec:../3rdp-install/carlton-plinko.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-plinko.js b/xtrn/3rdp-install/carlton-plinko.js
new file mode 100644
index 0000000000000000000000000000000000000000..208dc4b9a8d15df6e74faa4088c57b079a9636fc
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-plinko.js
@@ -0,0 +1,49 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+var cfg_filename = js.startup_dir + 'PLINKO.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[0] = "FREE COPY";
+lines[1] = "BBSFILES.COM";
+lines[2] = "1";
+lines[4] = "38400";
+lines[5] = gamedir;
+lines[6] = "PLINKO.ASC";
+lines[7] = "PLINKO.ANS";
+lines[8] = "10";
+lines[9] = "10";
+lines[10] = "@PAUSE@";
+lines[11] = "1537381269776M";
+
+writeln("Beginning node config generation...");
+for (i in system.node_list) {
+	var nodenum = parseInt(i, 10) + 1;
+	lines[3] = system.node_list[i].dir;
+	
+	writeln("Creating " + js.startup_dir + 'node' + nodenum + '.cfg');
+	
+	var file = new File(js.startup_dir + 'node' + nodenum + '.cfg');
+	if (!file.open("w")) {
+		writeln("Error " + file.error + " opening " + file.name + " for writing");
+		exit(1)
+	}
+	file.writeAll(lines);
+	file.close();
+}
+
+writeln("Config generation complete");
+
+exit(0);
diff --git a/xtrn/3rdp-install/carlton-rockin.ini b/xtrn/3rdp-install/carlton-rockin.ini
new file mode 100644
index 0000000000000000000000000000000000000000..930349866a64f0b23836721bc604229d30a103c6
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-rockin.ini
@@ -0,0 +1,24 @@
+Name: Rockin Success
+Desc: Hire Managers, Tour Continents, Write Songs, Start Fan Clubs, and More.
+By:   Todd Carlton
+Cats: Games
+Subs: Simulation
+exe: ROCK.EXE
+
+[md5:9122feca47de5bbd73be184d1f4bba0d]
+ver = 6.03
+url = http://bbsfiles.com/ftp/Carlton/rs602.zip
+
+[prog:ROCKIN]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Rockin Success
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = rock.exe node%#.cfg /FD
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[exec:../3rdp-install/carlton-rockin.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-rockin.js b/xtrn/3rdp-install/carlton-rockin.js
new file mode 100644
index 0000000000000000000000000000000000000000..a1d57922e4cfec48ffb059bc2af024eb697da911
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-rockin.js
@@ -0,0 +1,40 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+var cfg_filename = js.startup_dir + 'ROCK.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[4] = gamedir + "ROCKSCOR.ASC";
+lines[5] = gamedir + "ROCKSCOR.ANS";
+
+writeln("Beginning node config generation...");
+for (i in system.node_list) {
+	var nodenum = parseInt(i, 10) + 1;
+	lines[0] = system.node_list[i].dir + 'door.sys';
+	
+	writeln("Creating " + js.startup_dir + 'node' + nodenum + '.cfg');
+	
+	var file = new File(js.startup_dir + 'node' + nodenum + '.cfg');
+	if (!file.open("w")) {
+		writeln("Error " + file.error + " opening " + file.name + " for writing");
+		exit(1)
+	}
+	file.writeAll(lines);
+	file.close();
+}
+
+writeln("Config generation complete");
+
+exit(0);
diff --git a/xtrn/3rdp-install/carlton-scavenger.ini b/xtrn/3rdp-install/carlton-scavenger.ini
new file mode 100644
index 0000000000000000000000000000000000000000..fc2f5c0bff2de19008384247de689a6cb45930fd
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-scavenger.ini
@@ -0,0 +1,29 @@
+Name: Scavenger Hunt
+Desc: Scavenger Hunting game
+By:   Todd Carlton, Mike Walters
+Cats: Games
+Subs: Arena
+exe: SCAVHUNT.EXE
+
+[md5:38c43fe275ef77243ba5ce0b74294373]
+ver = 2.23
+url = http://bbsfiles.com/ftp/Carlton/sh223.zip
+
+[prog:SCAVHUNT]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Scavenger Hunt
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = scavhunt.exe %#
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[pre-eval:file_exists(startup_dir + 'CARLTON.INF')]
+prompt = false
+required = true
+fail = Run MAKENODE.EXE or copy existing CARLTON.INF into gamedir. It should set FOSSIL and NODE DIR.
+
+[exec:../3rdp-install/carlton-scavenger.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-scavenger.js b/xtrn/3rdp-install/carlton-scavenger.js
new file mode 100644
index 0000000000000000000000000000000000000000..9c8d4ebf4481910bb1e140ddc8020ca210ab2c94
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-scavenger.js
@@ -0,0 +1,41 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+file_backup(gamedir + "SCAVHUNT.CFG", 3);
+
+var cfg_filename = js.startup_dir + 'SCAVHUNT.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[2] = gamedir + "CARLTON.INF";
+
+var file = new File(js.startup_dir + 'SCAVHUNT.CFG');
+if (!file.open("w")) {
+	writeln("Error " + file.error + " opening " + file.name + " for writing");
+	exit(1)
+}
+file.writeAll(lines);
+file.close();
+
+var file = new File(js.startup_dir + 'HUNTLIST.TXT');
+if (!file.open("w")) {
+	writeln("Error " + file.error + " opening " + file.name + " for writing");
+	exit(1)
+}
+file.writeAll("\r\n");
+file.close();
+
+writeln("Config generation complete");
+
+exit(0);
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-urges.ini b/xtrn/3rdp-install/carlton-urges.ini
new file mode 100644
index 0000000000000000000000000000000000000000..f38cf11ca36bac54af01c73ee24c2ff3af916e3b
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-urges.ini
@@ -0,0 +1,29 @@
+Name: Tournament Word Guess
+Desc: Mature Card Game about a very active sex life
+By:   Todd Carlton
+Cats: Games
+Subs: Word,Adult
+exe: URGES.EXE
+
+[md5:0298eedb36569918943af648f5f2ab48]
+ver = 5.05
+url = http://bbsfiles.com/ftp/Carlton/ug505.zip
+
+[prog:URGES]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Urges
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = urges.exe %#
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[pre-eval:file_exists(startup_dir + 'CARLTON.INF')]
+prompt = false
+required = true
+fail = Run MAKENODE.EXE or copy existing CARLTON.INF into gamedir. It should set FOSSIL and NODE DIR.
+
+[exec:../3rdp-install/carlton-urges.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-urges.js b/xtrn/3rdp-install/carlton-urges.js
new file mode 100644
index 0000000000000000000000000000000000000000..d0739fe6353132bdc357ca56a4229b524b0111a6
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-urges.js
@@ -0,0 +1,33 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+file_backup(gamedir + "URGES.CFG", 3);
+
+var cfg_filename = js.startup_dir + 'URGES.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[2] = gamedir + "CARLTON.INF";
+
+var file = new File(js.startup_dir + 'URGES.CFG');
+if (!file.open("w")) {
+	writeln("Error " + file.error + " opening " + file.name + " for writing");
+	exit(1)
+}
+file.writeAll(lines);
+file.close();
+
+writeln("Config generation complete");
+
+exit(0);
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-wordguess.ini b/xtrn/3rdp-install/carlton-wordguess.ini
new file mode 100644
index 0000000000000000000000000000000000000000..0d1d17e42bf17dbc8bd7b2c751f87993c2a7ff58
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-wordguess.ini
@@ -0,0 +1,24 @@
+Name: Tournament Word Guess
+Desc: Figure out each of nine mystery words entered by opposing players.
+By:   Todd Carlton
+Cats: Games
+Subs: Word
+exe: GUESS.EXE
+
+[md5:27347e47119a9a3f868c80730e89fc3a]
+ver = 5.00
+url = http://bbsfiles.com/ftp/Carlton/wg500.zip
+
+[prog:GUESS]
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+name = Tournament Word Guess
+;      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+cmd = guess.exe node%#.cfg /FD
+ars = DOS
+execution_ars = NOT GUEST
+settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
+type = XTRN_GAP
+
+[exec:../3rdp-install/carlton-wordguess.js]
+prompt = false
+required = true
\ No newline at end of file
diff --git a/xtrn/3rdp-install/carlton-wordguess.js b/xtrn/3rdp-install/carlton-wordguess.js
new file mode 100644
index 0000000000000000000000000000000000000000..d83ea6be5dcd099674594e5a4c76e76164964b31
--- /dev/null
+++ b/xtrn/3rdp-install/carlton-wordguess.js
@@ -0,0 +1,39 @@
+"use strict";
+
+writeln("Generating config files...");
+
+var i;
+
+var gamedir = fullpath(js.startup_dir);
+
+var cfg_filename = js.startup_dir + 'SAMPLE.CFG';
+var file = new File(cfg_filename);
+if (!file.open("r")) {
+	writeln("Error " + file.error + " opening " + file.name);
+	exit(1)
+}
+
+var lines = file.readAll();
+file.close();
+
+lines[6] = gamedir;
+
+writeln("Beginning node config generation...");
+for (i in system.node_list) {
+	var nodenum = parseInt(i, 10) + 1;
+	lines[0] = system.node_list[i].dir + 'door.sys';
+	
+	writeln("Creating " + js.startup_dir + 'node' + nodenum + '.cfg');
+	
+	var file = new File(js.startup_dir + 'node' + nodenum + '.cfg');
+	if (!file.open("w")) {
+		writeln("Error " + file.error + " opening " + file.name + " for writing");
+		exit(1)
+	}
+	file.writeAll(lines);
+	file.close();
+}
+
+writeln("Config generation complete");
+
+exit(0);
diff --git a/xtrn/3rdp-install/foodfite-wilson.ini b/xtrn/3rdp-install/foodfite-wilson.ini
index 2eff7466666f61a373467821ecd5f146add66bfa..3cf5b83b74d464a5e6fbf2413c7f51ef48cbed8a 100644
--- a/xtrn/3rdp-install/foodfite-wilson.ini
+++ b/xtrn/3rdp-install/foodfite-wilson.ini
@@ -49,6 +49,7 @@ type = XTRN_GAP
 
 [exec:../3rdp-install/foodfite-wilson.js]
 prompt = false
+required = true
 
 [event:FFBULL]
 prompt = false