diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg
index 17b772f358ee6d9af53da65840e34b9a0d722d5d..f5eddf380b7b1436994a376ba5cfd6aa3f57b051 100644
--- a/extras/conf/udb/Includes/SRB222_linedefs.cfg
+++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg
@@ -2575,6 +2575,38 @@ udmf
 			}
 		}
 
+		317
+		{
+			title = "Condition Set Trigger";
+			prefix = "(317)";
+			arg0
+			{
+				title = "Trigger type";
+				type = 11;
+				enum = "triggertype";
+			}
+			arg1
+			{
+				title = "Trigger ID";
+			}
+		}
+
+		319
+		{
+			title = "Unlockable";
+			prefix = "(319)";
+			arg0
+			{
+				title = "Trigger type";
+				type = 11;
+				enum = "triggertype";
+			}
+			arg1
+			{
+				title = "Unlockable ID";
+			}
+		}
+
 		323
 		{
 			title = "NiGHTSerize";
diff --git a/src/p_setup.c b/src/p_setup.c
index c2fee35b6dde7a7e4018265ff9e39d44815e78c2..add37c25b47187563070924e05cf9aa1cb056a49 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -3752,6 +3752,18 @@ static void P_ConvertBinaryMap(void)
 				lines[i].args[2] = TMC_EQUAL;
 			lines[i].special = 314;
 			break;
+		case 317: //Condition set trigger - Continuous
+		case 318: //Condition set trigger - Once
+			lines[i].args[0] = (lines[i].special == 318) ? TMT_ONCE : TMT_CONTINUOUS;
+			lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS;
+			lines[i].special = 317;
+			break;
+		case 319: //Unlockable trigger - Continuous
+		case 320: //Unlockable trigger - Once
+			lines[i].args[0] = (lines[i].special == 320) ? TMT_ONCE : TMT_CONTINUOUS;
+			lines[i].args[1] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS;
+			lines[i].special = 319;
+			break;
 		case 323: //NiGHTSerize - Each time
 		case 324: //NiGHTSerize - Once
 		case 325: //DeNiGHTSerize - Each time
diff --git a/src/p_spec.c b/src/p_spec.c
index 0e552f688866974f287c6bc2abe4fe7f0a8705ea..ca084750b88285eabdb28e77f02de35210a332e5 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -1768,10 +1768,9 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
 			if (!P_CheckPushables(triggerline, caller))
 				return false;
 			break;
-		case 317: // continuous
-		case 318: // once
+		case 317:
 			{ // Unlockable triggers required
-				INT32 trigid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS);
+				INT32 trigid = triggerline->args[1];
 
 				if ((modifiedgame && !savemoddata) || (netgame || multiplayer))
 					return false;
@@ -1784,10 +1783,9 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
 					return false;
 			}
 			break;
-		case 319: // continuous
-		case 320: // once
+		case 319:
 			{ // An unlockable itself must be unlocked!
-				INT32 unlockid = (INT32)(sides[triggerline->sidenum[0]].textureoffset>>FRACBITS);
+				INT32 unlockid = triggerline->args[1];
 
 				if ((modifiedgame && !savemoddata) || (netgame || multiplayer))
 					return false;
@@ -1855,8 +1853,8 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller
 	 || specialtype == 308  // Race only - Once
 	 || specialtype == 313  // No More Enemies - Once
 	 || (specialtype == 314 && triggerline->args[0] == TMT_ONCE)  // No of pushables
-	 || specialtype == 318  // Unlockable trigger - Once
-	 || specialtype == 320  // Unlockable - Once
+	 || (specialtype == 317 && triggerline->args[0] == TMT_ONCE)  // Unlockable trigger
+	 || (specialtype == 319 && triggerline->args[0] == TMT_ONCE)  // Unlockable
 	 || specialtype == 321 || specialtype == 322 // Trigger on X calls - Continuous + Each Time
 	 || (specialtype == 323 && triggerline->args[0]) // Nightserize - Once
 	 || (specialtype == 325 && triggerline->args[0]) // DeNightserize - Once
@@ -6667,6 +6665,8 @@ void P_SpawnSpecials(boolean fromnetsave)
 			case 300: // Trigger linedef executor
 			case 303: // Count rings
 			case 314: // Pushable linedef executors (count # of pushables)
+			case 317: // Condition set trigger
+			case 319: // Unlockable trigger
 				if (lines[i].args[0] > TMT_EACHTIMEMASK)
 					P_AddEachTimeThinker(&lines[i], lines[i].args[0] == TMT_EACHTIMEENTERANDEXIT);
 				break;
@@ -6702,14 +6702,6 @@ void P_SpawnSpecials(boolean fromnetsave)
 				P_AddNoEnemiesThinker(&lines[i]);
 				break;
 
-			// Unlock trigger executors
-			case 317:
-			case 318:
-				break;
-			case 319:
-			case 320:
-				break;
-
 			// Trigger on X calls
 			case 321:
 			case 322: