Index: code/freespace2/freespace.cpp
===================================================================
--- code/freespace2/freespace.cpp	(revision 9388)
+++ code/freespace2/freespace.cpp	(working copy)
@@ -3670,7 +3670,22 @@
 	if(draw_viewer_last && Viewer_obj)
 	{
 		gr_post_process_save_zbuffer();
-		ship_render(Viewer_obj);
+		vec3d cockpit_eye_pos;
+		matrix dummy;
+		ship_get_eye(&cockpit_eye_pos, &dummy, Viewer_obj, true, true);
+		gr_end_view_matrix();
+		
+		gr_end_proj_matrix();
+		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, 0.05f, Max_draw_distance);
+		gr_set_view_matrix(&cockpit_eye_pos, &Eye_matrix);
+		
+		model_set_detail_level(0);
+		model_render(Ship_info[Ships[Viewer_obj->instance].ship_info_index].model_num, &Viewer_obj->orient, &vmd_zero_vector, MR_NORMAL | MR_LOCK_DETAIL, OBJ_INDEX(Viewer_obj));
+		
+		gr_end_view_matrix();
+		gr_end_proj_matrix();
+		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance);
+		gr_set_view_matrix(&Eye_position, &Eye_matrix);
 	}
 
 
Index: code/ship/ship.cpp
===================================================================
--- code/ship/ship.cpp	(revision 9388)
+++ code/ship/ship.cpp	(working copy)
@@ -5741,7 +5741,6 @@
 	ship *shipp = &Ships[num];
 	ship *warp_shipp = NULL;
 	ship_info *sip = &Ship_info[Ships[num].ship_info_index];
-	bool reset_proj_when_done = false;
 	bool is_first_stage_arrival = false;
 	bool show_thrusters = (shipp->flags2 & SF2_NO_THRUSTERS) == 0;
 	dock_function_info dfi;
@@ -5797,21 +5796,10 @@
 			}
 		}		
 
-		if (!(sip->flags2 & SIF2_SHOW_SHIP_MODEL) && !(Viewer_mode & VM_TOPDOWN))
+		if (!(Viewer_mode & VM_TOPDOWN))
 		{
 			return;
 		}
-
-		//For in-ship cockpits. This is admittedly something of a hack
-		if (!Cmdline_nohtl) {
-			reset_proj_when_done = true;
-
-			gr_end_view_matrix();
-			gr_end_proj_matrix();
-
-			gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, 0.05f, Max_draw_distance);
-			gr_set_view_matrix(&Eye_position, &Eye_matrix);
-		}
 	}
 
 	MONITOR_INC( NumShipsRend, 1 );
@@ -6266,14 +6254,6 @@
 			}
 		}
 	#endif
-
-		if (!Cmdline_nohtl && reset_proj_when_done) {
-			gr_end_view_matrix();
-			gr_end_proj_matrix();
-
-			gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance);
-			gr_set_view_matrix(&Eye_position, &Eye_matrix);
-		}
 	}
 
 	//WMC - Draw animated warp effect (ie BSG thingy)
@@ -6308,16 +6288,15 @@
 
 	matrix eye_ori = vmd_identity_matrix;
 	vec3d eye_pos = vmd_zero_vector;
-	ship_get_eye(&eye_pos, &eye_ori, objp, false);
+	ship_get_eye(&eye_pos, &eye_ori, objp, false, true);
 
 	vec3d pos = vmd_zero_vector;
 
 	vm_vec_unrotate(&pos, &sip->cockpit_offset, &eye_ori);
-	vm_vec_add2(&pos, &eye_pos);
 	if (!Cmdline_nohtl)
 	{
 		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, 0.02f, 10.0f*pm->rad);
-		gr_set_view_matrix(&Eye_position, &Eye_matrix);
+		gr_set_view_matrix(&vmd_zero_vector, &Eye_matrix);
 	}
 
 	//Zbuffer
@@ -12045,7 +12024,7 @@
 // the vector of the eye is returned in the parameter 'eye'.  The orientation of the
 // eye is returned in orient.  (NOTE: this is kind of bogus for now since non 0th element
 // eyes have no defined up vector)
-void ship_get_eye( vec3d *eye_pos, matrix *eye_orient, object *obj, bool do_slew )
+void ship_get_eye( vec3d *eye_pos, matrix *eye_orient, object *obj, bool do_slew , bool from_origin)
 {
 	ship *shipp = &Ships[obj->instance];
 	polymodel *pm = model_get(Ship_info[shipp->ship_info_index].model_num);
@@ -12060,7 +12039,7 @@
 	// eye points are stored in an array -- the normal viewing position for a ship is the current_eye_index
 	// element.
 	eye *ep = &(pm->view_positions[Ships[obj->instance].current_viewpoint]);
-	model_find_world_point( eye_pos, &ep->pnt, pm->id, ep->parent, &obj->orient, &obj->pos );
+	model_find_world_point( eye_pos, &ep->pnt, pm->id, ep->parent, &obj->orient, from_origin ? &vmd_zero_vector : &obj->pos );
 	*eye_orient = obj->orient;
 
 	//	Modify the orientation based on head orientation.
Index: code/ship/ship.h
===================================================================
--- code/ship/ship.h	(revision 9388)
+++ code/ship/ship.h	(working copy)
@@ -1662,7 +1662,7 @@
 extern void compute_slew_matrix(matrix *orient, angles *a);
 //extern camid ship_set_eye( object *obj, int eye_index);
 extern void ship_set_eye(object *obj, int eye_index);
-extern void ship_get_eye( vec3d *eye_pos, matrix *eye_orient, object *obj, bool do_slew = true );		// returns in eye the correct viewing position for the given object
+extern void ship_get_eye( vec3d *eye_pos, matrix *eye_orient, object *obj, bool do_slew = true, bool from_origin = false);		// returns in eye the correct viewing position for the given object
 //extern camid ship_get_followtarget_eye(object *obj);
 extern ship_subsys *ship_get_indexed_subsys( ship *sp, int index, vec3d *attacker_pos = NULL );	// returns index'th subsystem of this ship
 extern int ship_get_index_from_subsys(ship_subsys *ssp, int objnum, int error_bypass = 0);
