diff --git a/code/mod_table/mod_table.cpp b/code/mod_table/mod_table.cpp
index e45f4bb..391068a 100644
--- a/code/mod_table/mod_table.cpp
+++ b/code/mod_table/mod_table.cpp
@@ -31,6 +31,7 @@ int FS2NetD_port = 0;
 float Briefing_window_FOV = 0.29375f;
 bool Disable_hc_message_ani = false;
 bool Red_alert_applies_to_delayed_ships = false;
+bool Beams_use_damage_factors = false;
 
 
 void parse_mod_table(const char *filename)
@@ -259,6 +260,15 @@ void parse_mod_table(const char *filename)
 			mprintf(("Game Settings Table: Flight controls follow eyepoint orientation\n"));
 	}
 
+	if (optional_string("$Beams Use Damage Factors:")) {
+		stuff_boolean(&Beams_use_damage_factors);
+		if (Beams_use_damage_factors) {
+			mprintf(("Game Settings Table: Beams will use Damage Factors\n"));
+		} else {
+			mprintf(("Game Settings Table: Beams will ignore Damage Factors (retail behavior)\n"));
+		}
+	}
+
 	required_string("#END");
 }
 
diff --git a/code/mod_table/mod_table.h b/code/mod_table/mod_table.h
index 129d09e..f394813 100644
--- a/code/mod_table/mod_table.h
+++ b/code/mod_table/mod_table.h
@@ -26,5 +26,6 @@ extern int FS2NetD_port;
 extern float Briefing_window_FOV;
 extern bool Disable_hc_message_ani;
 extern bool Red_alert_applies_to_delayed_ships;
+extern bool Beams_use_damage_factors;
 
 void mod_table_init();
diff --git a/code/ship/shiphit.cpp b/code/ship/shiphit.cpp
index 0a5438c..6e6a9bf 100644
--- a/code/ship/shiphit.cpp
+++ b/code/ship/shiphit.cpp
@@ -327,6 +327,11 @@ int shiphit_get_damage_weapon(object *damaging_objp)
 		case OBJ_SHOCKWAVE:
 			weapon_info_index = shockwave_get_weapon_index(damaging_objp->instance);
 			break;
+		case OBJ_BEAM:
+			if (Beams_use_damage_factors) {
+				weapon_info_index = beam_get_weapon_info_index(damaging_objp);
+			}
+			break;
 		default:
 			weapon_info_index = -1;
 			break;
@@ -486,7 +491,8 @@ float do_subobj_hit_stuff(object *ship_objp, object *other_obj, vec3d *hitpos, i
 
 	// scale subsystem damage if appropriate
 	weapon_info_index = shiphit_get_damage_weapon(other_obj);	// Goober5000 - a NULL other_obj returns -1
-	if ((weapon_info_index >= 0) && (other_obj->type == OBJ_WEAPON)) {
+	if ((weapon_info_index >= 0) && ((other_obj->type == OBJ_WEAPON) ||
+				(Beams_use_damage_factors && (other_obj->type == OBJ_BEAM)))) {
 		if ( Weapon_info[weapon_info_index].wi_flags2 & WIF2_TRAINING ) {
 			return damage_left;
 		}
