Index: code/hud/hudartillery.cpp
===================================================================
--- code/hud/hudartillery.cpp	(revision 8846)
+++ code/hud/hudartillery.cpp	(working copy)
@@ -297,6 +297,7 @@
 
                         Weapons[Objects[weapon_objnum].instance].team = moveup->sinfo.ssm_team;
                         Weapons[Objects[weapon_objnum].instance].homing_object = moveup->sinfo.target;
+						Weapons[Objects[weapon_objnum].instance].homing_obj_sig = moveup->sinfo.target->signature;
                         Weapons[Objects[weapon_objnum].instance].target_sig = moveup->sinfo.target->signature;
 
 						// this makes this particular missile done
Index: code/network/multimsgs.cpp
===================================================================
--- code/network/multimsgs.cpp	(revision 8846)
+++ code/network/multimsgs.cpp	(working copy)
@@ -7403,6 +7403,7 @@
 	}
 
 	wp->homing_object = homing_object;
+	wp->homing_obj_sig = homing_object->signature;
 	wp->homing_subsys = NULL;
 	wp->target_num = OBJ_INDEX(homing_object);
 	wp->target_sig = homing_object->signature;
Index: code/parse/lua.cpp
===================================================================
--- code/parse/lua.cpp	(revision 8846)
+++ code/parse/lua.cpp	(working copy)
@@ -7910,6 +7910,7 @@
 			if(wp->target_sig != newh->sig)
 			{
 				wp->homing_object = newh->objp;
+				wp->homing_obj_sig = newh->sig;
 				wp->homing_pos = newh->objp->pos;
 				wp->homing_subsys = NULL;
 			}
@@ -7917,6 +7918,7 @@
 		else
 		{
 			wp->homing_object = NULL;
+			wp->homing_obj_sig = -1;
 			wp->homing_pos = vmd_zero_vector;
 			wp->homing_subsys = NULL;
 		}
@@ -7949,12 +7951,14 @@
 		if(v3 != NULL)
 		{
 			wp->homing_object = NULL;
+			wp->homing_obj_sig = -1;
 			wp->homing_subsys = NULL;
 			wp->homing_pos = *v3;
 		}
 		else
 		{
 			wp->homing_object = NULL;
+			wp->homing_obj_sig = -1;
 			wp->homing_subsys = NULL;
 			wp->homing_pos = vmd_zero_vector;
 		}
@@ -7986,6 +7990,7 @@
 			if(wp->target_sig != newh->sig)
 			{
 				wp->homing_object = newh->objp;
+				wp->homing_obj_sig = newh->sig;
 				wp->homing_subsys = newh->ss;
 				get_subsystem_pos(&wp->homing_pos, wp->homing_object, wp->homing_subsys);
 			}
@@ -7993,6 +7998,7 @@
 		else
 		{
 			wp->homing_object = NULL;
+			wp->homing_obj_sig = -1;
 			wp->homing_pos = vmd_zero_vector;
 			wp->homing_subsys = NULL;
 		}
Index: code/weapon/weapon.h
===================================================================
--- code/weapon/weapon.h	(revision 8846)
+++ code/weapon/weapon.h	(working copy)
@@ -158,6 +158,7 @@
 	fix		creation_time;					//	time at which created, stuffed Missiontime
 	int		weapon_flags;					//	bit flags defining behavior, see WF_xxxx
 	object*	homing_object;					//	object this weapon is homing on.
+	int		homing_obj_sig;				// signature of object this weapon is homing on. Used for validating the object
 	ship_subsys*	homing_subsys;			// subsystem this weapon is homing on
 	vec3d	homing_pos;						// world position missile is homing on
 	short		swarm_index;					// index into swarm missile info, -1 if not WIF_SWARM
Index: code/weapon/weapons.cpp
===================================================================
--- code/weapon/weapons.cpp	(revision 8846)
+++ code/weapon/weapons.cpp	(working copy)
@@ -3753,6 +3753,7 @@
 	old_homing_objp = wp->homing_object;
 
 	wp->homing_object = &obj_used_list;
+	wp->homing_obj_sig = -1;
 
 	//	Scan all objects, find a weapon to home on.
 	for ( objp = GET_FIRST(&obj_used_list); objp !=END_OF_LIST(&obj_used_list); objp = GET_NEXT(objp) ) {
@@ -3836,6 +3837,7 @@
 					if (dist < best_dist) {
 						best_dist = dist;
 						wp->homing_object	= objp;
+						wp->homing_obj_sig	= objp->signature;
 						wp->target_sig		= objp->signature;
 						wp->homing_subsys	= target_engines;
 
@@ -3976,6 +3978,7 @@
 		objp = &Objects[sop->objnum];
 		if (objp->signature == sig) {
 			wp->homing_object = objp;
+			wp->homing_obj_sig = objp->signature;
 			wp->target_sig = objp->signature;
 			break;
 		}
@@ -4002,7 +4005,7 @@
 	Assert(obj->instance == num);
 	wp = &Weapons[num];
 	wip = &Weapon_info[wp->weapon_info_index];
-	hobjp = Weapons[num].homing_object;
+	hobjp = wp->homing_object;
 
 	//local ssms home only in stages 1 and 5
 	if ( (wp->lssm_stage==2) || (wp->lssm_stage==3) || (wp->lssm_stage==4))
@@ -4044,6 +4047,7 @@
 		if ( wp->target_sig > 0 ) {
 			if ( wp->homing_object->signature != wp->target_sig ) {
 				wp->homing_object = &obj_used_list;
+				wp->homing_obj_sig = -1;
 				return;
 			}
 		}
@@ -4063,6 +4067,7 @@
 		if (wp->homing_subsys->flags & SSF_MISSILES_IGNORE_IF_DEAD) {
 			if ((wp->homing_subsys->max_hits > 0) && (wp->homing_subsys->current_hits <= 0)) {
 				wp->homing_object = &obj_used_list;
+				wp->homing_obj_sig = -1;
 				return;
 			}
 		}
@@ -4086,6 +4091,7 @@
 		wp->target_sig > 0 &&
 		wp->homing_subsys == NULL) {
 			wp->homing_object = &obj_used_list;
+			wp->homing_obj_sig = -1;
 			return;
 	}
 
@@ -4143,7 +4149,7 @@
 	}
 
 	//	If the object it is homing on is still valid, home some more!
-	if (hobjp != &obj_used_list) {
+	if (hobjp != &obj_used_list && hobjp->signature == wp->homing_obj_sig) {
 		float		old_dot, vel;
 		vec3d	vec_to_goal;
 		vec3d	target_pos;	// position of what the homing missile is seeking
@@ -4155,7 +4161,7 @@
 		//	For now, March 7, 1997, MK, heat seeking homing missiles will be able to home on
 		//	any subsystem.  Probably makes sense for them to only home on certain kinds of subsystems.
 		if ( (wp->homing_subsys != NULL) && !(wip->wi_flags2 & WIF2_NON_SUBSYS_HOMING) ) {
-			get_subsystem_world_pos(hobjp, Weapons[num].homing_subsys, &target_pos);
+			get_subsystem_world_pos(hobjp, wp->homing_subsys, &target_pos);
 			wp->homing_pos = target_pos;	// store the homing position in weapon data
 			Assert( !vm_is_vec_nan(&wp->homing_pos) );
 		} else {
@@ -4740,6 +4746,7 @@
 			wp->nearest_dist = 99999.0f;
 			if ( (wip->wi_flags & WIF_HOMING_ASPECT) && target_is_locked) {
 				wp->homing_object = &Objects[target_objnum];
+				wp->homing_obj_sig = Objects[target_objnum].signature;
 				wp->homing_subsys = target_subsys;
 				weapon_maybe_play_warning(wp);
 			} else if ( (wip->wi_flags & WIF_HOMING_JAVELIN) && target_is_locked) {
@@ -4750,12 +4757,15 @@
 						wp->homing_subsys = ship_get_closest_subsys_in_sight(target_ship, SUBSYSTEM_ENGINE, &Objects[weapon_objnum].pos);
 						if (wp->homing_subsys == NULL) {
 							wp->homing_object = &obj_used_list;
+							wp->homing_obj_sig = -1;
 						} else {
 							wp->homing_object = &Objects[target_objnum];
+							wp->homing_obj_sig = Objects[target_objnum].signature;
 							weapon_maybe_play_warning(wp);
 						}
 				} else {
 					wp->homing_object = &Objects[target_objnum];
+					wp->homing_obj_sig = Objects[target_objnum].signature;
 					wp->homing_subsys = target_subsys;
 					weapon_maybe_play_warning(wp);
 				}
@@ -4764,9 +4774,14 @@
 				//	immediately drop it and try to find one in its view cone.
 				if ((target_objnum != -1) && !(wip->wi_flags2 & WIF2_UNTARGETED_HEAT_SEEKER)) {
 					wp->homing_object = &Objects[target_objnum];
+					wp->homing_obj_sig = Objects[target_objnum].signature;
 					weapon_maybe_play_warning(wp);
-				} else
+				}
+				else
+				{
 					wp->homing_object = &obj_used_list;
+					wp->homing_obj_sig = -1;
+				}
 
 				wp->homing_subsys = target_subsys;
 			}
@@ -4949,6 +4964,7 @@
 	wp->start_pos = *pos;
 	wp->objnum = objnum;
 	wp->homing_object = &obj_used_list;		//	Assume not homing on anything.
+	wp->homing_obj_sig = -1;
 	wp->homing_subsys = NULL;
 	wp->creation_time = Missiontime;
 	wp->group_id = group_id;
