Index: code/freespace2/freespace.cpp
===================================================================
--- code/freespace2/freespace.cpp	(revision 5755)
+++ code/freespace2/freespace.cpp	(working copy)
@@ -2814,6 +2814,8 @@
 	Cutscene_bars_progress = 1.0f;
 }
 
+void bars_do_frame(float frametime);
+
 void game_set_view_clip(float frametime)
 {
 	if ((Game_mode & GM_DEAD) || (supernova_active() >= 2))
@@ -2826,16 +2828,16 @@
 			gr_set_color(0,0,0);
 			gr_rect(0, 0, gr_screen.max_w, yborder, false);
 			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
-		} else {
-			//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
-			// J.S. I've changed my ways!! See the new "no constants" code!!!
-			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
-		}
+		} 
+		//	Numeric constants encouraged by J "pig farmer" S, who shall remain semi-anonymous.
+		// J.S. I've changed my ways!! See the new "no constants" code!!!
+		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );	
 	}
 	else {
 		// Set the clip region for normal view
 		if ( View_percent >= 100 )	{
 			gr_reset_clip();
+			bars_do_frame(frametime);
 		} else {
 			int xborder, yborder;
 
@@ -3857,14 +3859,35 @@
 int Game_subspace_effect = 0;
 DCF_BOOL( subspace, Game_subspace_effect )
 
-void clip_frame_view();
-
 // Does everything needed to render a frame
 void game_render_frame( camid cid )
 {
 
 	g3_start_frame(game_zbuffer);
 
+	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
+	if ( Cmdline_env && !Env_cubemap_drawn ) {
+		setup_environment_mapping(cid);
+
+		if ( !Dynamic_environment ) {
+			Env_cubemap_drawn = true;
+		}
+
+	}
+
+	gr_zbuffer_clear(TRUE);
+
+	gr_reset_clip();
+
+	gr_screen.gf_post_process_before();
+
+	if(!Time_compression_locked)
+		game_set_view_clip(flFrametime);
+	else
+		game_set_view_clip(flRealframetime);
+
+	neb2_render_setup(cid);
+
 	camera *cam = cid.getCamera();
 	matrix eye_no_jitter = vmd_identity_matrix;
 	if(cam != NULL)
@@ -3904,22 +3927,6 @@
 		shield_point_multi_setup();
 	}
 
-	// this needs to happen after g3_start_frame() and before the primary projection and view matrix is setup
-	if ( Cmdline_env && !Env_cubemap_drawn ) {
-		setup_environment_mapping(cid);
-
-		if ( !Dynamic_environment ) {
-			Env_cubemap_drawn = true;
-		}
-	}
-	gr_zbuffer_clear(TRUE);
-
-	gr_screen.gf_post_process_before();
-
-	clip_frame_view();
-
-	neb2_render_setup(cid);
-
 #ifndef DYN_CLIP_DIST
 	if (!Cmdline_nohtl) {
 		gr_set_proj_matrix(Proj_fov, gr_screen.clip_aspect, Min_draw_distance, Max_draw_distance);
@@ -4582,46 +4589,37 @@
 		else
 			yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR - fl2i(Cutscene_bars_progress*(gr_screen.max_h/CUTSCENE_BAR_DIVISOR));
 
+		gr_reset_clip();
+
 		if (g3_in_frame() == 0) {
 			//Set rectangles
 			gr_set_color(0,0,0);
 			gr_rect(0, 0, gr_screen.max_w, yborder, false);
 			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
-		} else {
-			//Set clipping
-			gr_reset_clip();
-			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false );
 		}
+		//Set clipping
+		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - yborder*2, false, Cutscene_fov_change );
+
+		Cutscene_bar_size = yborder;
 	}
 	else if(Cutscene_bar_flags & CUB_CUTSCENE)
 	{
 		int yborder = gr_screen.max_h/CUTSCENE_BAR_DIVISOR;
 
+		gr_reset_clip();
+
 		if (g3_in_frame() == 0) {
 			gr_set_color(0,0,0);
 			gr_rect(0, 0, gr_screen.max_w, yborder, false);
-			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false);
-		} else {
-			gr_reset_clip();
-			gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false );
+			gr_rect(0, gr_screen.max_h-yborder, gr_screen.max_w, yborder, false );
 		}
-	}
-}
+		
+		gr_set_clip(0, yborder, gr_screen.max_w, gr_screen.max_h - (yborder*2), false, Cutscene_fov_change );
 
-void clip_frame_view() {
-	if(!Time_compression_locked) {
-		// Player is dead
-		game_set_view_clip(flFrametime);
-
-		// Cutscene bars
-		bars_do_frame(flRealframetime);
-	} else {
-		// Player is dead
-		game_set_view_clip(flRealframetime);
-
-		// Cutscene bars
-		bars_do_frame(flRealframetime);
+		Cutscene_bar_size = yborder;
 	}
+	else if(Cutscene_bar_size)
+		Cutscene_bar_size = 0;
 }
 
 //WMC - This does stuff like fading in and out and subtitles. Special FX?
@@ -4768,7 +4765,10 @@
 			DEBUG_GET_TIME( render3_time1 )
 			camid cid = game_render_frame_setup();
 
-			clip_frame_view();
+			if(!Time_compression_locked)
+				game_set_view_clip(flFrametime);
+			else
+				game_set_view_clip(flRealframetime);
 
 			game_render_frame( cid );
 
Index: code/globalincs/systemvars.cpp
===================================================================
--- code/globalincs/systemvars.cpp	(revision 5755)
+++ code/globalincs/systemvars.cpp	(working copy)
@@ -33,6 +33,10 @@
 float Cutscene_delta_time = 1.0f;
 //How far along a change is (0 to 1)
 float Cutscene_bars_progress = 1.0f;
+//Change FOV?
+bool Cutscene_fov_change = true;
+//Size of the bar
+int Cutscene_bar_size = 0;
 
 //FADEIN STUFF
 shader Viewer_shader;
Index: code/globalincs/systemvars.h
===================================================================
--- code/globalincs/systemvars.h	(revision 5755)
+++ code/globalincs/systemvars.h	(working copy)
@@ -57,7 +57,8 @@
 //Styles to get to bars
 #define CUB_GRADUAL			(1<<15)
 extern float Cutscene_bars_progress, Cutscene_delta_time;
-extern int Cutscene_bar_flags;
+extern int Cutscene_bar_flags, Cutscene_bar_size;
+extern bool Cutscene_fov_change;
 
 //-----Fadein stuff
 struct shader;
Index: code/graphics/2d.h
===================================================================
--- code/graphics/2d.h	(revision 5755)
+++ code/graphics/2d.h	(working copy)
@@ -224,7 +224,7 @@
 	void (*gf_flash_alpha)(int r, int g, int b, int a);
 
 	// sets the clipping region
-	void (*gf_set_clip)(int x, int y, int w, int h, bool resize);
+	void (*gf_set_clip)(int x, int y, int w, int h, bool resize, bool change_fov);
 
 	// resets the clipping region to entire screen
 	void (*gf_reset_clip)();
@@ -525,9 +525,9 @@
 void gr_flip();
 
 //#define gr_set_clip			GR_CALL(gr_screen.gf_set_clip)
-__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true)
+__inline void gr_set_clip(int x, int y, int w, int h, bool resize=true, bool change_fov=true)
 {
-	(*gr_screen.gf_set_clip)(x,y,w,h,resize);
+	(*gr_screen.gf_set_clip)(x,y,w,h,resize,change_fov);
 }
 #define gr_reset_clip		GR_CALL(gr_screen.gf_reset_clip)
 //#define gr_set_font			GR_CALL(gr_screen.gf_set_font)
Index: code/graphics/gropengl.cpp
===================================================================
--- code/graphics/gropengl.cpp	(revision 5755)
+++ code/graphics/gropengl.cpp	(working copy)
@@ -375,7 +375,7 @@
 #endif
 }
 
-void gr_opengl_set_clip(int x, int y, int w, int h, bool resize)
+void gr_opengl_set_clip(int x, int y, int w, int h, bool resize, bool change_fov)
 {
 	// check for sanity of parameters
 	if (x < 0) {
@@ -415,37 +415,39 @@
 		h = max_h;
 	}
 
-	gr_screen.offset_x_unscaled = x;
-	gr_screen.offset_y_unscaled = y;
-	gr_screen.clip_left_unscaled = 0;
-	gr_screen.clip_right_unscaled = w-1;
-	gr_screen.clip_top_unscaled = 0;
-	gr_screen.clip_bottom_unscaled = h-1;
-	gr_screen.clip_width_unscaled = w;
-	gr_screen.clip_height_unscaled = h;
+	if (change_fov) {
+		gr_screen.offset_x_unscaled = x;
+		gr_screen.offset_y_unscaled = y;
+		gr_screen.clip_left_unscaled = 0;
+		gr_screen.clip_right_unscaled = w-1;
+		gr_screen.clip_top_unscaled = 0;
+		gr_screen.clip_bottom_unscaled = h-1;
+		gr_screen.clip_width_unscaled = w;
+		gr_screen.clip_height_unscaled = h;
+		
 
-	if (to_resize) {
-		gr_resize_screen_pos(&x, &y);
-		gr_resize_screen_pos(&w, &h);
-	} else {
-		gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
-		gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
-		gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
-	}
+		if (to_resize) {
+			gr_resize_screen_pos(&x, &y);
+			gr_resize_screen_pos(&w, &h);
+		} else {
+			gr_unsize_screen_pos( &gr_screen.offset_x_unscaled, &gr_screen.offset_y_unscaled );
+			gr_unsize_screen_pos( &gr_screen.clip_right_unscaled, &gr_screen.clip_bottom_unscaled );
+			gr_unsize_screen_pos( &gr_screen.clip_width_unscaled, &gr_screen.clip_height_unscaled );
+		}
 
-	gr_screen.offset_x = x;
-	gr_screen.offset_y = y;
-	gr_screen.clip_left = 0;
-	gr_screen.clip_right = w-1;
-	gr_screen.clip_top = 0;
-	gr_screen.clip_bottom = h-1;
-	gr_screen.clip_width = w;
-	gr_screen.clip_height = h;
+		gr_screen.offset_x = x;
+		gr_screen.offset_y = y;
+		gr_screen.clip_left = 0;
+		gr_screen.clip_right = w-1;
+		gr_screen.clip_top = 0;
+		gr_screen.clip_bottom = h-1;
+		gr_screen.clip_width = w;
+		gr_screen.clip_height = h;
 
-	gr_screen.clip_aspect = i2fl(w) / i2fl(h);
-	gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
-	gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
-
+		gr_screen.clip_aspect = i2fl(w) / i2fl(h);
+		gr_screen.clip_center_x = (gr_screen.clip_left + gr_screen.clip_right) * 0.5f;
+		gr_screen.clip_center_y = (gr_screen.clip_top + gr_screen.clip_bottom) * 0.5f;
+	}
 	// just return early if we aren't actually going to need the scissor test
 	if ( (x == 0) && (y == 0) && (w == max_w) && (h == max_h) ) {
 		GL_state.ScissorTest(GL_FALSE);
Index: code/graphics/gropenglpostprocessing.cpp
===================================================================
--- code/graphics/gropenglpostprocessing.cpp	(revision 5755)
+++ code/graphics/gropenglpostprocessing.cpp	(working copy)
@@ -1,6 +1,7 @@
 #include "graphics/gropenglpostprocessing.h"
 #include "graphics/gropenglshader.h"
 
+#include "globalincs/systemvars.h"
 #include "io/timer.h"
 #include "nebula/neb.h"
 #include "parse/parselo.h"
@@ -367,8 +368,13 @@
 	}
 
 	// Fix problems when player is dead and the screen is clipped.
-	glEnable(GL_SCISSOR_TEST);
-	glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
+	if (gr_screen.max_h != gr_screen.clip_height) {
+		glEnable(GL_SCISSOR_TEST);
+		glScissor(0, (gr_screen.max_h-gr_screen.clip_height)/2, gr_screen.max_w, gr_screen.clip_height);
+	} else if (Cutscene_bar_size) {
+		glEnable(GL_SCISSOR_TEST);
+		glScissor(0, Cutscene_bar_size, gr_screen.max_w, gr_screen.max_h - Cutscene_bar_size * 2);
+	}
 
 	// Main post-processing render
 	render_target::apply_default();
Index: code/graphics/grstub.cpp
===================================================================
--- code/graphics/grstub.cpp	(revision 5755)
+++ code/graphics/grstub.cpp	(working copy)
@@ -256,7 +256,7 @@
 {
 }
 
-void gr_stub_set_clip(int x, int y, int w, int h, bool resize)
+void gr_stub_set_clip(int x, int y, int w, int h, bool resize,bool fov_change)
 {
 }
 
Index: code/parse/sexp.cpp
===================================================================
--- code/parse/sexp.cpp	(revision 5755)
+++ code/parse/sexp.cpp	(working copy)
@@ -529,7 +529,7 @@
 	{ "set-training-context-speed",		OP_SET_TRAINING_CONTEXT_SPEED,		2, 2, },
 
 	//Cutscene stuff
-	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 1, },
+	{ "set-cutscene-bars",			OP_CUTSCENES_SET_CUTSCENE_BARS,			0, 2, },
 	{ "unset-cutscene-bars",		OP_CUTSCENES_UNSET_CUTSCENE_BARS,		0, 1, },
 	{ "fade-in",					OP_CUTSCENES_FADE_IN,					0, 1, },
 	{ "fade-out",					OP_CUTSCENES_FADE_OUT,					0, 2, },
@@ -15546,8 +15546,10 @@
 
 	float delta_speed = 0.0f;
 
-	if(node != -1)
+	if(node != -1) {
 		delta_speed = eval_num(node)/1000.0f;
+		node = CDR(node);
+	}
 
 	if(delta_speed > 0.0f)
 	{
@@ -15559,6 +15561,10 @@
 	{
 		Cutscene_bar_flags &= ~CUB_GRADUAL;
 	}
+
+	Cutscene_fov_change = true;
+	if(node != -1)
+		Cutscene_fov_change = is_sexp_true(node) != 0;
 }
 
 void sexp_unset_cutscene_bars(int node)
@@ -20146,6 +20152,11 @@
 			return OPF_NONE;
 
 		case OP_CUTSCENES_SET_CUTSCENE_BARS:
+			if (argnum==0)
+				return OPF_POSITIVE;
+			else
+				return OPF_BOOL;
+
 		case OP_CUTSCENES_UNSET_CUTSCENE_BARS:
 		case OP_CUTSCENES_FADE_IN:
 		case OP_CUTSCENES_FADE_OUT:
@@ -24212,8 +24223,9 @@
 
 	{ OP_CUTSCENES_SET_CUTSCENE_BARS, "set-cutscene-bars\r\n"
 		"\tShows bars at the top and bottom of screen  "
-		"Takes 0 or 1 arguments...\r\n"
+		"Takes 0, 1 or 2 arguments...\r\n"
 		"\t1:\tMilliseconds for bars to slide in\r\n"
+		"\t2:\tWhether FOV should be changed (defaults to true)\r\n"
 	},
 
 	{ OP_CUTSCENES_UNSET_CUTSCENE_BARS, "unset-cutscene-bars\r\n"
