Index: code/network/multimsgs.cpp
===================================================================
--- code/network/multimsgs.cpp	(revision 4893)
+++ code/network/multimsgs.cpp	(working copy)
@@ -7774,6 +7786,9 @@
 	if ( !(Weapon_info[wp->weapon_info_index].wi_flags & WIF_HOMING) )
 		return;
 
+	// default the subsystem
+	t_subsys = -1;
+
 	// get the homing signature.  If this weapon isn't homing on anything, then sent 0 as the
 	// homing signature.
 	homing_signature = 0;
@@ -7782,7 +7797,6 @@
 		homing_signature = homing_object->net_signature;
 
 		// get the subsystem index.
-		t_subsys = -1;
 		if ( (homing_object->type == OBJ_SHIP) && (wp->homing_subsys != NULL) ) {
 			int s_index;
 
@@ -7835,7 +7849,14 @@
 	}
 
 	if ( homing_object->type == OBJ_WEAPON ) {
-		Assert((Weapon_info[Weapons[homing_object->instance].weapon_info_index].wi_flags & WIF_BOMB) || (Weapon_info[Weapons[homing_object->instance].weapon_info_index].wi_flags & WIF_CMEASURE));
+		int flags = Weapon_info[Weapons[homing_object->instance].weapon_info_index].wi_flags;
+
+	//	Assert( (flags & WIF_BOMB) || (flags & WIF_CMEASURE) );
+
+		if ( !((flags & WIF_BOMB) || (flags & WIF_CMEASURE)) ) {
+			nprintf(("Network", "Homing object is invalid for homing update\n"));
+			return;
+		}
 	}
 
 	wp->homing_object = homing_object;
@@ -8219,7 +8240,11 @@
 	if((Player_obj != NULL) && (Player_obj == objp)){		
 		return;
 	}
-		
+
+	if ( (rand_val >= NPERM_SIG_MIN) && (rand_val <= NPERM_SIG_MAX) ) {
+		multi_set_network_signature((ushort)rand_val, MULTI_SIG_NON_PERMANENT);
+	}
+
 	// make it so ship can fire right away!
 	Ships[objp->instance].cmeasure_fire_stamp = timestamp(0);
 	if ( objp == Player_obj ){		
Index: code/network/multiutil.cpp
===================================================================
--- code/network/multiutil.cpp	(revision 4893)
+++ code/network/multiutil.cpp	(working copy)
@@ -501,7 +501,7 @@
 	// as are debris and asteroids since they don't die very often.  It would be vary rare for this
 	// value (the permanent signature) to wrap.  For now, this condition is an error condition
 	if ( what_kind == MULTI_SIG_SHIP ) {
-		if ( Next_ship_signature == 0 ){
+		if ( Next_ship_signature < SHIP_SIG_MIN ){
 			Next_ship_signature = SHIP_SIG_MIN;
 		}
 
@@ -514,7 +514,7 @@
 
 		// signature stuff for asteroids.
 	} else if ( what_kind == MULTI_SIG_ASTEROID ) {
-		if ( Next_asteroid_signature == 0 ){
+		if ( Next_asteroid_signature < ASTEROID_SIG_MIN ){
 			Next_asteroid_signature = ASTEROID_SIG_MIN;
 		}
 
@@ -526,7 +526,7 @@
 
 		// signatures for debris
 	} else if ( what_kind == MULTI_SIG_DEBRIS ) {
-		if ( Next_debris_signature == 0 ){
+		if ( Next_debris_signature < DEBRIS_SIG_MIN ){
 			Next_debris_signature = DEBRIS_SIG_MIN;
 		}
 
@@ -538,12 +538,12 @@
 
 		// signature stuff for weapons and other expendable things.
 	} else if ( what_kind == MULTI_SIG_NON_PERMANENT ) {
-		if ( Next_non_perm_signature == 0 ){
+		if ( Next_non_perm_signature < NPERM_SIG_MIN ){
 			Next_non_perm_signature = NPERM_SIG_MIN;
 		}
 
 		sig = Next_non_perm_signature++;
-		if ( Next_non_perm_signature == NPERM_SIG_MAX ){
+		if ( (Next_non_perm_signature < NPERM_SIG_MIN) || (Next_non_perm_signature == NPERM_SIG_MAX) ) {
 			Next_non_perm_signature = NPERM_SIG_MIN;
 		}
 	} else {
@@ -559,22 +559,22 @@
 ushort multi_get_next_network_signature( int what_kind )
 {
 	if ( what_kind == MULTI_SIG_SHIP ) {
-		if ( Next_ship_signature == 0 )
+		if ( Next_ship_signature < SHIP_SIG_MIN )
 			Next_ship_signature = SHIP_SIG_MIN;
 		return Next_ship_signature;
 
 	} else if ( what_kind == MULTI_SIG_DEBRIS ) {
-		if ( Next_debris_signature == 0 )
+		if ( Next_debris_signature < DEBRIS_SIG_MIN)
 			Next_debris_signature = DEBRIS_SIG_MIN;
 		return Next_debris_signature;
 
 	} else if ( what_kind == MULTI_SIG_ASTEROID ) {
-		if ( Next_asteroid_signature == 0 )
+		if ( Next_asteroid_signature < ASTEROID_SIG_MIN )
 			Next_asteroid_signature = ASTEROID_SIG_MIN;
 		return Next_asteroid_signature;
 
 	} else if ( what_kind == MULTI_SIG_NON_PERMANENT ) {
-		if ( Next_non_perm_signature == 0 )
+		if ( Next_non_perm_signature < NPERM_SIG_MIN )
 			Next_non_perm_signature = NPERM_SIG_MIN;
 		return Next_non_perm_signature;
 
@@ -600,7 +600,7 @@
 		Assert( (signature >= ASTEROID_SIG_MIN) && (signature <= ASTEROID_SIG_MAX) );
 		Next_asteroid_signature = signature;
 	} else if ( what_kind == MULTI_SIG_NON_PERMANENT ) {
-		Assert( (signature >= NPERM_SIG_MIN) && (signature <= NPERM_SIG_MAX) );
+		Assert( (signature >= NPERM_SIG_MIN) /*&& (signature <= NPERM_SIG_MAX)*/ );
 		Next_non_perm_signature = signature;
 	} else
 		Int3();			// get Allender
Index: code/ship/ship.cpp
===================================================================
--- code/ship/ship.cpp	(revision 4893)
+++ code/ship/ship.cpp	(working copy)
@@ -10043,7 +10042,7 @@
 		// the new way of doing things
 		// if(Netgame.debug_flags & NETD_FLAG_CLIENT_FIRING){
 		if(Game_mode & GM_MULTIPLAYER){
-			send_NEW_countermeasure_fired_packet( objp, cmeasure_count, arand );
+			send_NEW_countermeasure_fired_packet( objp, cmeasure_count, /*arand*/Objects[cobjnum].net_signature );
 		}
 	}
 
