Index: code/mission/missionparse.cpp
===================================================================
--- code/mission/missionparse.cpp	(revision 7264)
+++ code/mission/missionparse.cpp	(working copy)
@@ -1820,8 +1820,8 @@
 	}
 
 	// Goober5000
-	shipp->ship_max_shield_strength = p_objp->ship_max_shield_strength;
-	shipp->ship_max_hull_strength = p_objp->ship_max_hull_strength;
+	shipp->ship_max_shield_strength = Ship_info[shipp->ship_info_index].max_shield_strength * p_objp->ship_max_shield_strength;
+	shipp->ship_max_hull_strength =  Ship_info[shipp->ship_info_index].max_hull_strength * p_objp->ship_max_hull_strength;
 
 	// Goober5000 - ugh, this is really stupid having to do this here; if the
 	// ship creation code was better organized this wouldn't be necessary
@@ -2905,17 +2905,17 @@
 
 	// set max hitpoint and shield values		
 	if (p_objp->special_shield != -1) {
-		p_objp->ship_max_shield_strength = (float) p_objp->special_shield; 
+		p_objp->ship_max_shield_strength = (float) p_objp->special_shield / Ship_info[p_objp->ship_class].max_shield_strength; 
 	}
 	else {
-		p_objp->ship_max_shield_strength = Ship_info[p_objp->ship_class].max_shield_strength;
+		p_objp->ship_max_shield_strength = 1.0f;
 	}
 		
 	if (p_objp->special_hitpoints > 0) {
-		p_objp->ship_max_hull_strength = (float) p_objp->special_hitpoints; 
+		p_objp->ship_max_hull_strength = (float) p_objp->special_hitpoints / Ship_info[p_objp->ship_class].max_hull_strength; 
 	}
 	else {
-		p_objp->ship_max_hull_strength = Ship_info[p_objp->ship_class].max_hull_strength;
+		p_objp->ship_max_hull_strength = 1.0f;
 	}
 
 	Assert(p_objp->ship_max_hull_strength > 0.0f);	// Goober5000: div-0 check (not shield because we might not have one)
@@ -3539,28 +3539,28 @@
 	// Hitpoints
 	// We need to take into account that the ship might have been assigned special hitpoints so we can't 
 	// simply swap old for new. 
-	Assert (p_obj->ship_max_hull_strength > 0);
-	Assert (old_ship_info->max_hull_strength > 0);
+	Assert (p_obj->ship_max_hull_strength > 0.0f);
+	Assert (old_ship_info->max_hull_strength > 0.0f);
 	
-	float hp_multiplier = p_obj->ship_max_hull_strength / old_ship_info->max_hull_strength;
-	p_obj->ship_max_hull_strength = new_ship_info->max_hull_strength * hp_multiplier;
+	float hp_multiplier = (Ship_info[p_obj->ship_class].max_hull_strength * p_obj->ship_max_hull_strength) / old_ship_info->max_hull_strength;
+	p_obj->ship_max_hull_strength = (new_ship_info->max_hull_strength * hp_multiplier) / new_ship_info->max_hull_strength;
 
 
 	// Shields
 	// Again we have to watch out for special hitpoints but this time we can't assume that there will be a 
 	// shield. So first lets see if there is one. 
-	if ((p_obj->ship_max_shield_strength != old_ship_info->max_shield_strength) && 
-		(p_obj->ship_max_shield_strength > 0) &&
-		(new_ship_info->max_shield_strength > 0))
+	if ((p_obj->ship_max_shield_strength != 1.0f) && 
+		(p_obj->ship_max_shield_strength > 0.0f) &&
+		(new_ship_info->max_shield_strength > 0.0f))
 	{
 		// This ship is using special hitpoints to alter the shield strength
 		float shield_multiplier = p_obj->ship_max_shield_strength / i2fl(old_ship_info->max_shield_strength);
-		p_obj->ship_max_shield_strength = new_ship_info->max_shield_strength * shield_multiplier;
+		p_obj->ship_max_shield_strength = (new_ship_info->max_shield_strength * shield_multiplier) / new_ship_info->max_shield_strength;
 	}
 	// Not using special hitpoints or a class which has a shield strength of zero
 	else
 	{
-		p_obj->ship_max_shield_strength = new_ship_info->max_shield_strength;
+		p_obj->ship_max_shield_strength = 1.0f;
 	}
 	
 	// Primary weapons
@@ -6092,7 +6092,7 @@
 
 	for (p_objp = GET_FIRST(&Ship_arrival_list); p_objp != END_OF_LIST(&Ship_arrival_list); p_objp = GET_NEXT(p_objp))
 	{
-		if (!stricmp(p_objp->name, name))
+		if (!stricmp(p_objp->name, name)) 
 			return p_objp;	// still on the arrival list
 	}
 
@@ -7245,8 +7245,8 @@
 	}
 
 	// set support ship hitpoints
-	pobj->ship_max_hull_strength = Ship_info[i].max_hull_strength;
-	pobj->ship_max_shield_strength = Ship_info[i].max_shield_strength;
+	pobj->ship_max_hull_strength = 1.0f;
+	pobj->ship_max_shield_strength = 1.0f;
 
 	pobj->team = requester_shipp->team;
 
Index: code/mission/missionparse.h
===================================================================
--- code/mission/missionparse.h	(revision 7264)
+++ code/mission/missionparse.h	(working copy)
@@ -430,8 +430,8 @@
 	int		alt_type_index;					// optional alt type index
 	int		callsign_index;					// optional callsign index
 
-	float ship_max_hull_strength;
-	float ship_max_shield_strength;
+	float ship_max_hull_strength;			// Expressed as percentages of actual hull value
+	float ship_max_shield_strength;			//
 
 	// Goober5000
 	int num_texture_replacements;
@@ -525,8 +525,8 @@
 		alt_type_index = 0;
 		callsign_index = 0;
 
-		ship_max_hull_strength = 0.;
-		ship_max_shield_strength = 0.;
+		ship_max_hull_strength = 0.0f;
+		ship_max_shield_strength = 0.0f;
 
 		num_texture_replacements = 0;
 		
Index: code/parse/sexp.cpp
===================================================================
--- code/parse/sexp.cpp	(revision 7264)
+++ code/parse/sexp.cpp	(working copy)
@@ -14750,11 +14750,11 @@
 
 	// copy hull...
 	target_pobjp->special_hitpoints = source_shipp->special_hitpoints;
-	target_pobjp->ship_max_hull_strength = source_shipp->ship_max_hull_strength;
+	target_pobjp->ship_max_hull_strength = source_shipp->ship_max_hull_strength / Ship_info[source_shipp->ship_info_index].max_hull_strength;
 	target_pobjp->initial_hull = fl2i(get_hull_pct(source_objp) * 100.0f);
 
 	// ...and shields
-	target_pobjp->ship_max_shield_strength = source_shipp->ship_max_shield_strength;
+	target_pobjp->ship_max_shield_strength = source_shipp->ship_max_shield_strength / Ship_info[source_shipp->ship_info_index].max_shield_strength;
 	target_pobjp->initial_shields = fl2i(get_shield_pct(source_objp) * 100.0f);
 
 
