Index: code/model/modelread.cpp
===================================================================
--- code/model/modelread.cpp	(revision 9404)
+++ code/model/modelread.cpp	(working copy)
@@ -4114,13 +4114,17 @@
 	bsp_info *child_submodel;
 	
 	child_submodel = &pm->submodel[pm->detail[0]];
+	
+	if(child_submodel->no_collisions) { // if detail0 has $no_collision set dont check childs
+		return;
+	}
 
 	int i = child_submodel->first_child;
 	while ( i >= 0 )	{
 		child_submodel = &pm->submodel[i];
 
 		// Don't check it or its children if it is destroyed or it is a replacement (non-moving)
-		if ( !child_submodel->blown_off && (child_submodel->i_replace == -1) )	{
+		if ( !child_submodel->blown_off && (child_submodel->i_replace == -1) && !child_submodel->nocollide_this_only)	{
 
 			// Only look for submodels that rotate
 			if (child_submodel->movement_type == MOVEMENT_TYPE_ROT) {
Index: code/object/collideshipship.cpp
===================================================================
--- code/object/collideshipship.cpp	(revision 9404)
+++ code/object/collideshipship.cpp	(working copy)
@@ -236,9 +236,15 @@
 
 	SCP_vector<int> submodel_vector;
 	int valid_hit_occured = 0;
-	polymodel *pm;
+	polymodel *pm, *pm_light;
 	polymodel_instance *pmi;
+		
+	pm_light = model_get(Ship_info[light_shipp->ship_info_index].model_num);
 
+	if(pm_light->submodel[pm_light->detail[0]].no_collisions) {
+		return 0;
+	}
+
 	if (model_collide(&mc)) {
 
 		// Set earliest hit time
