diff -Naur evince_src/libview/ev-view.c evince_src2/libview/ev-view.c
--- evince_src/libview/ev-view.c	2014-09-03 18:01:24.000000000 +0200
+++ evince_src2/libview/ev-view.c	2014-11-28 14:13:41.285032331 +0100
@@ -607,6 +607,7 @@
 	gdouble upper;
 	double factor;
 	gint new_value;
+	gdouble zoom_center;
 
 	gtk_widget_get_allocation (widget, &allocation);
 
@@ -627,7 +628,20 @@
 	value = gtk_adjustment_get_value (adjustment);
 	upper = gtk_adjustment_get_upper (adjustment);
 	page_size = gtk_adjustment_get_page_size (adjustment);
+	zoom_center = (orientation == GTK_ORIENTATION_HORIZONTAL) ?
+		view->zoom_center_x : view->zoom_center_y;
+	gint xpt=-1;
+	gint ypt=-1; 
+	//ev_document_misc_get_pointer_position(GTK_WIDGET(view),xpt,ypt);
+        GdkDeviceManager *device_manager;
+        GdkDevice        *device_pointer;
+
+        device_manager = gdk_display_get_device_manager (gtk_widget_get_display (GTK_WIDGET(view)));
+        device_pointer = gdk_device_manager_get_client_pointer (device_manager);
+        gdk_window_get_device_position (gtk_widget_get_window (GTK_WIDGET(view)),device_pointer,&xpt, &ypt, NULL);
 
+	fprintf(stdout,"x=%i,y=%i\n",xpt,ypt);
+	fprintf(stdout,"zoom_center=%f\n",zoom_center);
 	if (upper != .0) {
 		switch (view->pending_scroll) {
     	        case SCROLL_TO_KEEP_POSITION:
@@ -636,8 +650,12 @@
 			break;
     	        case SCROLL_TO_PAGE_POSITION:
 			break;
-    	        case SCROLL_TO_CENTER:
-			factor = (value + page_size * 0.5) / upper;
+		case SCROLL_TO_CENTER: {
+			if (zoom_center > 0)				
+				factor = (value + zoom_center) / upper;
+			else
+				factor = (value + page_size * 0.5) / upper;
+		}
 			break;
 		}
 	}
@@ -663,10 +681,19 @@
     	        case SCROLL_TO_PAGE_POSITION:
 			ev_view_scroll_to_page_position (view, orientation);
 			break;
-    	        case SCROLL_TO_CENTER:
-			new_value = CLAMP (upper * factor - page_size * 0.5 + 0.5,
-					   0, upper - page_size);
-			gtk_adjustment_set_value (adjustment, (int)new_value);
+	        case SCROLL_TO_CENTER: {
+		       if (zoom_center > 0) {
+			       new_value = CLAMP (upper * factor - zoom_center + 0.5,
+						  0, upper - page_size);
+			       (orientation == GTK_ORIENTATION_HORIZONTAL) ?
+				       (view->zoom_center_x=-1.0):(view->zoom_center_y=-1.0);
+			}
+			else {
+				new_value = CLAMP (upper * factor - page_size * 0.5 + 0.5,
+				       0, upper - page_size);
+			}
+			gtk_adjustment_set_value (adjustment, (int)new_value);		
+		}
 			break;
 	}
 
@@ -3963,6 +3990,9 @@
 
 	if (state == GDK_CONTROL_MASK) {
 		ev_document_model_set_sizing_mode (view->model, EV_SIZING_FREE);
+		view->zoom_center_x = event->x;
+		view->zoom_center_y = event->y;
+
 		switch (event->direction) {
 		case GDK_SCROLL_DOWN:
 		case GDK_SCROLL_RIGHT:
@@ -7159,6 +7189,8 @@
 			       EvView         *view)
 {
 	gdouble factor;
+	gdouble center_x;
+	gdouble center_y;
 
 	view->drag_info.in_drag = FALSE;
 	view->image_dnd_info.in_drag = FALSE;
@@ -7167,6 +7199,11 @@
 	view->prev_zoom_gesture_scale = scale;
 	ev_document_model_set_sizing_mode (view->model, EV_SIZING_FREE);
 
+	if (gtk_gesture_get_bounding_box_center (GTK_GESTURE (gesture), &center_x,
+                      &center_y)) {
+		view->zoom_center_x = center_x;
+		view->zoom_center_y = center_y;
+	}
 	if ((factor < 1.0 && ev_view_can_zoom_out (view)) ||
 	    (factor >= 1.0 && ev_view_can_zoom_in (view)))
 		ev_view_zoom (view, factor);
diff -Naur evince_src/libview/ev-view-private.h evince_src2/libview/ev-view-private.h
--- evince_src/libview/ev-view-private.h	2014-09-03 17:28:19.000000000 +0200
+++ evince_src2/libview/ev-view-private.h	2014-11-27 17:38:24.271208747 +0100
@@ -235,6 +235,10 @@
 	GtkGesture *zoom_gesture;
 	gdouble prev_zoom_gesture_scale;
 	EvPanAction pan_action;
+
+	/* Current zoom center */
+	gdouble zoom_center_x;
+	gdouble zoom_center_y;
 };
 
 struct _EvViewClass {
