Index: code/object/objcollide.cpp
===================================================================
--- code/object/objcollide.cpp	(revision 9114)
+++ code/object/objcollide.cpp	(working copy)
@@ -47,6 +47,8 @@
 struct checkobject;
 extern checkobject CheckObjects[MAX_OBJECTS];
 
+extern int Cmdline_old_collision_sys;
+
 void obj_pairs_close()
 {
 	if (Obj_pairs != NULL) {
@@ -1019,21 +1021,50 @@
 		else
 			crw_status[i] = CRW_NO_PAIR;
 	}
-
+	
 	// first pass is to see if any of the weapons don't have collision pairs.
 
-	opp = &pair_used_list;
-	opp = opp->next;
-	while( opp != NULL )	{
-		// for each collide pair, if the two objects can still collide, then set the remove_weapon
-		// parameter for the weapon to 0.  need to check both parameters
-		if ( opp->a->type == OBJ_WEAPON )
-			crw_check_weapon( opp->a->instance, opp->next_check_time );
+	if ( Cmdline_old_collision_sys ) {
+		opp = &pair_used_list;
+		opp = opp->next;
+		while( opp != NULL )	{
+			// for each collide pair, if the two objects can still collide, then set the remove_weapon
+			// parameter for the weapon to 0.  need to check both parameters
+			if ( opp->a->type == OBJ_WEAPON )
+				crw_check_weapon( opp->a->instance, opp->next_check_time );
 
-		if ( opp->b->type == OBJ_WEAPON )
-			crw_check_weapon( opp->b->instance, opp->next_check_time );
+			if ( opp->b->type == OBJ_WEAPON )
+				crw_check_weapon( opp->b->instance, opp->next_check_time );
 
-		opp = opp->next;
+			opp = opp->next;
+		}
+	} else {
+		SCP_hash_map<uint, collider_pair>::iterator it;
+		collider_pair *pair_obj;
+
+		for ( it = Collision_cached_pairs.begin(); it != Collision_cached_pairs.end(); ++it ) {
+			pair_obj = &it->second;
+			
+			if ( !pair_obj->initialized ) {
+				continue;
+			}
+
+			if ( pair_obj->a->type == OBJ_WEAPON && pair_obj->signature_a == pair_obj->a->signature ) {
+				crw_check_weapon(pair_obj->a->instance, pair_obj->next_check_time);
+
+				if ( crw_status[pair_obj->a->instance] == CRW_CAN_DELETE ) {
+					pair_obj->initialized = false;
+				}
+			}
+
+			if ( pair_obj->b->type == OBJ_WEAPON && pair_obj->signature_b == pair_obj->b->signature ) {
+				crw_check_weapon(pair_obj->b->instance, pair_obj->next_check_time);
+
+				if ( crw_status[pair_obj->b->instance] == CRW_CAN_DELETE ) {
+					pair_obj->initialized = false;
+				}
+			}
+		}
 	}
 
 	// for each weapon which could be removed, delete the object
@@ -1144,6 +1175,7 @@
 void obj_reset_colliders()
 {
 	Collision_sort_list.clear();
+	Collision_cached_pairs.clear();
 }
 
 void obj_collide_retime_cached_pairs(int checkdly)
Index: code/object/object.cpp
===================================================================
--- code/object/object.cpp	(revision 9114)
+++ code/object/object.cpp	(working copy)
@@ -192,11 +192,8 @@
 		return original_num_to_free;
 	}
 
-	if ( Cmdline_old_collision_sys ) {
-		deleted_weapons = collide_remove_weapons();
-	} else {
-		deleted_weapons = 0;
-	}
+	deleted_weapons = collide_remove_weapons();
+
 	num_to_free -= deleted_weapons;
 	if ( !num_to_free ){
 		return original_num_to_free;
Index: code/ship/ship.cpp
===================================================================
--- code/ship/ship.cpp	(revision 9114)
+++ code/ship/ship.cpp	(working copy)
@@ -9188,8 +9188,13 @@
 	sp->model_instance_num = model_create_instance(sip->model_num);
 
 	// Valathil - Reinitialize collision checks
-	obj_remove_pairs(objp);
-	obj_add_pairs(objp->instance);
+	if ( Cmdline_old_collision_sys ) {
+		obj_remove_pairs(objp);
+		obj_add_pairs(objp->instance);
+	} else {
+		obj_remove_collider(OBJ_INDEX(objp));
+		obj_add_collider(OBJ_INDEX(objp));
+	}
 
 	// The E - If we're switching during gameplay, make sure we get valid primary/secondary selections
 	if ( by_sexp ) {
Index: code/ship/shipfx.cpp
===================================================================
--- code/ship/shipfx.cpp	(revision 9114)
+++ code/ship/shipfx.cpp	(working copy)
@@ -1121,7 +1121,7 @@
 
 					if ( mc.bsp_leaf ) {
 						if ( mc.bsp_leaf->tmap_num < 255 ) {
-							polymodel *pm = model_get(sip->cockpit_model_num);
+							polymodel *pm = model_get(sip->model_num);
 							int tmap_num = mc.bsp_leaf->tmap_num;
 
 							if ( !(pm->maps[tmap_num].is_transparent) && strcmp(bm_get_filename(mc.hit_bitmap), "glass.dds") ) {
Index: code/weapon/weapons.cpp
===================================================================
--- code/weapon/weapons.cpp	(revision 9114)
+++ code/weapon/weapons.cpp	(working copy)
@@ -4887,11 +4887,7 @@
 		//if ( !(Objects[parent_objnum].flags & OF_PLAYER_SHIP) )
 		//	return -1;
 
-		if ( Cmdline_old_collision_sys ) {
-			num_deleted = collide_remove_weapons();
-		} else {
-			num_deleted = 0;
-		}
+		num_deleted = collide_remove_weapons();
 
 		nprintf(("WARNING", "Deleted %d weapons because of lack of slots\n", num_deleted));
 		if (num_deleted == 0){
