diff -upr evince/shell/ev-view.c evince.new/shell/ev-view.c
--- evince/shell/ev-view.c	2005-04-25 01:26:58.000000000 +0400
+++ evince.new/shell/ev-view.c	2005-04-26 15:06:44.000000000 +0400
@@ -105,6 +105,7 @@ struct _EvView {
 
 	GtkAdjustment *hadjustment;
 	GtkAdjustment *vadjustment;
+	gboolean vadjustment_dirty;
 
 	EvPageCache *page_cache;
 	EvPixbufCache *pixbuf_cache;
@@ -157,6 +158,32 @@ G_DEFINE_TYPE (EvView, ev_view, GTK_TYPE
 /*** Helper functions ***/
 
 static void
+view_scroll_to_page (EvView *view, gint new_page)
+{
+	gint max_height, n_rows;
+	
+	if (view->vadjustment == NULL || view->page_cache == NULL)
+		return;
+	
+	if (view->continuous) {
+		
+		n_rows = view->dual_page ? new_page / 2 : new_page;
+		
+		get_bounding_box_size (view, NULL, &max_height);
+
+		gtk_adjustment_clamp_page(view->vadjustment,
+					  (max_height + view->spacing) * n_rows, 
+					  (max_height + view->spacing) * n_rows +
+					   view->vadjustment->page_size);
+	} else {
+		gtk_adjustment_set_value (view->vadjustment,
+					  view->vadjustment->lower);
+	}
+
+	view->vadjustment_dirty = FALSE;
+}
+
+static void
 view_update_adjustments (EvView *view)
 {
 	int old_x = view->scroll_x;
@@ -192,6 +219,9 @@ view_set_adjustment_values (EvView      
 	int requisition;
 	int allocation;
 
+	double factor;
+	int new_value;
+
 	if (orientation == GTK_ORIENTATION_HORIZONTAL)  {
 		requisition = widget->requisition.width;
 		allocation = widget->allocation.width;
@@ -204,6 +234,8 @@ view_set_adjustment_values (EvView      
 
 	if (!adjustment)
 		return;
+	
+	factor = (adjustment->value + adjustment->page_size * 0.5) / adjustment->upper;
 
 	adjustment->page_size = allocation;
 	adjustment->step_increment = allocation * 0.1;
@@ -211,11 +243,16 @@ view_set_adjustment_values (EvView      
 	adjustment->lower = 0;
 	adjustment->upper = MAX (allocation, requisition);
 
-	if (adjustment->value > adjustment->upper - adjustment->page_size) {
-		adjustment->value = adjustment->upper - adjustment->page_size;
-		value_changed = TRUE;
+	if (view->vadjustment_dirty && orientation == GTK_ORIENTATION_VERTICAL) {
+		view_scroll_to_page (view, view->current_page);
+	} else {
+		new_value = CLAMP (adjustment->upper * factor - adjustment->page_size * 0.5, 0, adjustment->upper - adjustment->page_size);
+		if (new_value != adjustment->value) {	
+			adjustment->value = new_value;
+			value_changed = TRUE;
+		}	
 	}
-
+	
 	gtk_adjustment_changed (adjustment);
 	if (value_changed)
 		gtk_adjustment_value_changed (adjustment);
@@ -1737,6 +1774,7 @@ ev_view_init (EvView *view)
 	view->presentation = FALSE;
 	view->full_screen = FALSE;
 	view->sizing_mode = EV_SIZING_FIT_WIDTH;
+	view->vadjustment_dirty = TRUE;
 }
 
 static void
@@ -1906,7 +1944,6 @@ page_changed_cb (EvPageCache *page_cache
 	int old_page = view->current_page;
 	int old_width, old_height;
 	int new_width, new_height;
-	int max_height, n_rows;
 
 	if (old_page == new_page)
 		return;
@@ -1930,22 +1967,9 @@ page_changed_cb (EvPageCache *page_cache
 		gtk_widget_queue_resize (GTK_WIDGET (view));
 	else
 		gtk_widget_queue_draw (GTK_WIDGET (view));
-	
-	if (view->continuous) {
-		
-		n_rows = view->dual_page ? new_page / 2 : new_page;
-		
-		get_bounding_box_size (view, NULL, &max_height);
-
-		gtk_adjustment_clamp_page(view->vadjustment,
-					  (max_height + view->spacing) * n_rows, 
-					  (max_height + view->spacing) * n_rows +
-					   view->vadjustment->page_size);
-	} else {
-		gtk_adjustment_set_value (view->vadjustment,
-					  view->vadjustment->lower);
-	}
 
+	view_scroll_to_page (view, new_page);
+		
 	if (EV_IS_DOCUMENT_FIND (view->document)) {
 		view->find_page = new_page;
 		view->find_result = 0;
@@ -1974,6 +1998,7 @@ ev_view_set_document (EvView     *view,
 		view->document = document;
 		view->find_page = 0;
 		view->find_result = 0;
+		view->vadjustment_dirty = TRUE;
 
 		if (view->document) {
 			g_object_ref (view->document);
@@ -2018,16 +2043,18 @@ ev_view_zoom (EvView   *view,
 void
 ev_view_set_continuous (EvView   *view,
 			gboolean  continuous)
-{
+{	
 	g_return_if_fail (EV_IS_VIEW (view));
 
 	continuous = continuous != FALSE;
 
 	if (view->continuous != continuous) {
 		view->continuous = continuous;
+		view->vadjustment_dirty = TRUE;
 		gtk_widget_queue_resize (GTK_WIDGET (view));
 	}
 
+
 	g_object_notify (G_OBJECT (view), "continuous");
 }
 
@@ -2043,6 +2070,8 @@ ev_view_set_dual_page (EvView   *view,
 		return;
 
 	view->dual_page = dual_page;
+	view->vadjustment_dirty = TRUE;
+
 	/* FIXME: if we're keeping the pixbuf cache around, we should extend the
 	 * preload_cache_size to be 2 if dual_page is set.
 	 */
