diff --git a/extras/conf/udb/Includes/SRB222_linedefs.cfg b/extras/conf/udb/Includes/SRB222_linedefs.cfg
index 0aa7ea6291d899336f0b7935a456f262d62d63b2..fff9edf109b28ba8ada2ca7182cf93ad1b0a7e79 100644
--- a/extras/conf/udb/Includes/SRB222_linedefs.cfg
+++ b/extras/conf/udb/Includes/SRB222_linedefs.cfg
@@ -3677,6 +3677,7 @@ udmf
 					0 = "Add tag";
 					1 = "Remove tag";
 					2 = "Replace first tag";
+					3 = "Change trigger tag";
 				}
 			}
 		}
@@ -3699,6 +3700,7 @@ udmf
 					0 = "Add tag";
 					1 = "Remove tag";
 					2 = "Replace first tag";
+					3 = "Change trigger tag";
 				}
 			}
 		}
diff --git a/src/p_mobj.c b/src/p_mobj.c
index 6d20f0569a0ea326d9ed070b00fe983ef7226fa4..1ceb2610bd8ef513ca4b8542e780d015b10ab67d 100644
--- a/src/p_mobj.c
+++ b/src/p_mobj.c
@@ -1457,7 +1457,7 @@ fixed_t P_GetMobjGravity(mobj_t *mo)
 			if ((rover->flags & (FF_SWIMMABLE|FF_GOOWATER)) == (FF_SWIMMABLE|FF_GOOWATER))
 				goopgravity = true;
 
-			gravfactor = P_GetSectorGravityFactor(mo->subsector->sector);
+			gravfactor = P_GetSectorGravityFactor(rover->master->frontsector);
 
 			if (gravfactor == FRACUNIT)
 				continue;
diff --git a/src/p_setup.c b/src/p_setup.c
index afbd0f48e5509e33a9b0b87403d9f0e4ceeff598..efcd0edf0a36c5b7f25083c1406a49c49c7d6a03 100644
--- a/src/p_setup.c
+++ b/src/p_setup.c
@@ -4250,6 +4250,8 @@ static void P_ConvertBinaryLinedefTypes(void)
 			lines[i].args[0] = tag;
 			lines[i].args[1] = lines[i].special - 66;
 			lines[i].args[2] = P_AproxDistance(lines[i].dx, lines[i].dy) >> FRACBITS;
+			if (lines[i].flags & ML_NOCLIMB)
+				lines[i].args[2] *= -1;
 			lines[i].special = 66;
 			break;
 		case 76: //Make FOF bouncy
@@ -5554,13 +5556,13 @@ static void P_ConvertBinaryLinedefTypes(void)
 				lines[i].args[1] = 0;
 			if (lines[i].flags & ML_NOSKEW)
 			{
-				lines[i].args[2] = lines[i].dx >> (FRACBITS + SCROLL_SHIFT);
-				lines[i].args[3] = lines[i].dy >> (FRACBITS + SCROLL_SHIFT);
+				lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> (FRACBITS - SCROLL_SHIFT);
+				lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> (FRACBITS - SCROLL_SHIFT);
 			}
 			else
 			{
-				lines[i].args[2] = sides[lines[i].sidenum[0]].textureoffset >> FRACBITS;
-				lines[i].args[3] = sides[lines[i].sidenum[0]].rowoffset >> FRACBITS;
+				lines[i].args[2] = lines[i].dx >> FRACBITS;
+				lines[i].args[3] = lines[i].dy >> FRACBITS;
 			}
 			lines[i].args[4] = lines[i].special - 502;
 			lines[i].special = 502;
diff --git a/src/p_spec.c b/src/p_spec.c
index c9d42e5c5034783729f29aadd7dc9f818a9341d0..3bfd917640f40eaf6f6f9b975d4c3bc76af1d710 100644
--- a/src/p_spec.c
+++ b/src/p_spec.c
@@ -2397,6 +2397,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
 					default:
 						Tag_SectorFSet(secnum, newtag);
 						break;
+					case TMT_TRIGGERTAG:
+						sectors[secnum].triggertag = newtag;
+						break;
 				}
 			}
 			break;
@@ -2419,6 +2422,9 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec)
 				default:
 					Tag_SectorFSet(secnum, newtag);
 					break;
+				case TMT_TRIGGERTAG:
+					sectors[secnum].triggertag = newtag;
+					break;
 			}
 			break;
 		}
@@ -7599,9 +7605,9 @@ static void P_SpawnScrollers(void)
 					if (s != (INT32)i)
 					{
 						if (l->args[1] != TMSD_BACK)
-							Add_Scroller(sc_side, l->args[2] << FRACBITS, l->args[3] << FRACBITS, control, lines[s].sidenum[0], accel, 0);
+							Add_Scroller(sc_side, l->args[2] << (FRACBITS - SCROLL_SHIFT), l->args[3] << (FRACBITS - SCROLL_SHIFT), control, lines[s].sidenum[0], accel, 0);
 						if (l->args[1] != TMSD_FRONT && lines[s].sidenum[1] != 0xffff)
-							Add_Scroller(sc_side, l->args[2] << FRACBITS, l->args[3] << FRACBITS, control, lines[s].sidenum[1], accel, 0);
+							Add_Scroller(sc_side, l->args[2] << (FRACBITS - SCROLL_SHIFT), l->args[3] << (FRACBITS - SCROLL_SHIFT), control, lines[s].sidenum[1], accel, 0);
 					}
 				break;
 			}
diff --git a/src/p_spec.h b/src/p_spec.h
index bdc912c346943afeeb0be761e9e88d5cbaa779af..33d18d63e5aeef7ddf955406045655d70755c64b 100644
--- a/src/p_spec.h
+++ b/src/p_spec.h
@@ -306,6 +306,7 @@ typedef enum
 	TMT_ADD          = 0,
 	TMT_REMOVE       = 1,
 	TMT_REPLACEFIRST = 2,
+	TMT_TRIGGERTAG   = 3,
 } textmaptagoptions_t;
 
 typedef enum
diff --git a/src/sdl/CMakeLists.txt b/src/sdl/CMakeLists.txt
index 4f19d93dff20c791d6b031fa18c1ab9f5efe0c71..d369d11c03c55cc59dbca49307a8a9fc4c0cb758 100644
--- a/src/sdl/CMakeLists.txt
+++ b/src/sdl/CMakeLists.txt
@@ -87,39 +87,40 @@ if(${SDL2_FOUND})
 	endif()
 
 	if(${CMAKE_SYSTEM} MATCHES Darwin)
-		find_library(CORE_LIB CoreFoundation)
+		find_library(CORE_FOUNDATION_LIBRARY "CoreFoundation")
 		target_link_libraries(SRB2SDL2 PRIVATE
-			${CORE_LIB}
-			SDL2
-			SDL2_mixer
-			${GME_LIBRARIES}
-			${OPENMPT_LIBRARIES}
-			${MIXERX_LIBRARIES}
-			${PNG_LIBRARIES}
-			${ZLIB_LIBRARIES}
-			${OPENGL_LIBRARIES}
-			${CURL_LIBRARIES}
+			${CORE_FOUNDATION_LIBRARY}
 		)
 		set_target_properties(SRB2SDL2 PROPERTIES OUTPUT_NAME "${CPACK_PACKAGE_DESCRIPTION_SUMMARY}")
-	else()
-		target_link_libraries(SRB2SDL2 PRIVATE
-			${SDL2_LIBRARIES}
-			${SDL2_MIXER_LIBRARIES}
-			${GME_LIBRARIES}
-			${OPENMPT_LIBRARIES}
-			${MIXERX_LIBRARIES}
-			${PNG_LIBRARIES}
-			${ZLIB_LIBRARIES}
-			${OPENGL_LIBRARIES}
-			${CURL_LIBRARIES}
+
+		# Configure the app bundle icon and plist properties
+		target_sources(SRB2SDL2 PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/macosx/Srb2mac.icns")
+		set_target_properties(SRB2SDL2 PROPERTIES
+			MACOSX_BUNDLE_ICON_FILE "Srb2mac"
+			MACOSX_BUNDLE_BUNDLE_NAME "Sonic Robo Blast 2"
+			MACOSX_BUNDLE_BUNDLE_VERSION ${SRB2_VERSION}
+
+			RESOURCE "${CMAKE_CURRENT_SOURCE_DIR}/macosx/Srb2mac.icns"
 		)
+	endif()
 
-		if(${CMAKE_SYSTEM} MATCHES Linux)
-			target_link_libraries(SRB2SDL2 PRIVATE
-				m
-				rt
-			)
-		endif()
+	target_link_libraries(SRB2SDL2 PRIVATE
+		${SDL2_LIBRARIES}
+		${SDL2_MIXER_LIBRARIES}
+		${GME_LIBRARIES}
+		${OPENMPT_LIBRARIES}
+		${MIXERX_LIBRARIES}
+		${PNG_LIBRARIES}
+		${ZLIB_LIBRARIES}
+		${OPENGL_LIBRARIES}
+		${CURL_LIBRARIES}
+	)
+
+	if(${CMAKE_SYSTEM} MATCHES Linux)
+		target_link_libraries(SRB2SDL2 PRIVATE
+			m
+			rt
+		)
 	endif()
 
 	#target_link_libraries(SRB2SDL2 PRIVATE SRB2Core)
@@ -136,8 +137,6 @@ if(${SDL2_FOUND})
 		endif()
 	endif()
 
-	set_target_properties(SRB2SDL2 PROPERTIES VERSION ${SRB2_VERSION})
-
 	if(${CMAKE_SYSTEM} MATCHES Windows)
 		target_link_libraries(SRB2SDL2 PRIVATE
 			ws2_32
@@ -188,6 +187,7 @@ if(${SDL2_FOUND})
 		install(TARGETS SRB2SDL2
 			BUNDLE DESTINATION .
 		)
+		set_property(TARGET SRB2SDL2 PROPERTY INSTALL_RPATH_USE_LINK_PATH ON)
 	else()
 		install(TARGETS SRB2SDL2 SRB2SDL2
 			RUNTIME DESTINATION .
diff --git a/src/taglist.c b/src/taglist.c
index 9bc6021b091ecab70de33ff1c31b0225571ea254..305b05f041b189fed25ba6c49e6f43ecb4577300 100644
--- a/src/taglist.c
+++ b/src/taglist.c
@@ -14,6 +14,7 @@
 #include "taglist.h"
 #include "z_zone.h"
 #include "r_data.h"
+#include "p_spec.h"
 
 // Bit array of whether a tag exists for sectors/lines/things.
 bitarray_t tags_available[BIT_ARRAY_SIZE (MAXTAGS)];
@@ -454,6 +455,11 @@ void Tag_SectorFSet (const size_t id, const mtag_t tag)
 	Taggroup_Remove(tags_sectors, curtag, id);
 	Taggroup_Add(tags_sectors, tag, id);
 	Tag_FSet(&sec->tags, tag);
+
+	// Sectors with linedef trigger effects need to have their trigger tag updated too
+	// This is a bit of a hack...
+	if (!udmf && GETSECSPECIAL(sec->special, 2) >= 1 && GETSECSPECIAL(sec->special, 2) <= 7)
+		sec->triggertag = tag;
 }
 
 mtag_t Tag_NextUnused(mtag_t start)