diff -uprN evince-2.25.92/libview/ev-view.c evince-2.25.92.new/libview/ev-view.c
--- evince-2.25.92/libview/ev-view.c	2009-03-03 02:30:25.000000000 +0300
+++ evince-2.25.92.new/libview/ev-view.c	2009-03-09 01:32:28.000000000 +0300
@@ -287,7 +287,10 @@ static void       jump_to_find_result   
 static void       jump_to_find_page                          (EvView             *view, 
 							      EvViewFindDirection direction,
 							      gint                shift);
-
+static void       synctex_open_editor                        (EvView             *view,
+							      gint page,
+							      gint doc_point_x,
+								  gint doc_point_y);
 /*** Selection ***/
 static void       compute_selections                         (EvView             *view,
 							      EvSelectionStyle    style,
@@ -1316,7 +1319,7 @@ goto_dest (EvView *view, EvLinkDest *des
 						view->current_page);
 }
 
-static void
+void
 ev_view_goto_dest (EvView *view, EvLinkDest *dest)
 {
 	EvLinkDestType type;
@@ -2626,6 +2629,25 @@ ev_view_button_press_event (GtkWidget   
 	view->pressed_button = event->button;
 	view->selection_info.in_drag = FALSE;
 
+	/* Doubleclick in document: open editor via synctex */
+	if( event->button==1 && event->type==GDK_2BUTTON_PRESS ){
+		/* First: get pagenumber and doc_point where doubleclick happened */
+		gint page=0;
+		gint offset_x=0, offset_y=0;
+		gint doc_point_x=0, doc_point_y=0;
+		
+		find_page_at_location(view, event->x+view->scroll_x, event->y+view->scroll_y,
+			&page, &offset_x, &offset_y);
+			
+		get_doc_point_from_offset(view, page, offset_x, offset_y,
+			&doc_point_x, &doc_point_y);
+
+		if ( page > -1 ){ /* Clicked inside a page: open editor and return */
+			synctex_open_editor(view, page, doc_point_x, doc_point_y);
+			return TRUE;
+		}
+	}
+
 	if (view->scroll_info.autoscrolling)
 		return TRUE;
 	
@@ -4420,6 +4442,13 @@ ev_view_reload (EvView *view)
 	view_update_range_and_current_page (view);
 }
 
+void
+ev_view_set_uri (EvView *view, gchar *uri)
+{
+	view->uri = uri;
+	return;
+}
+
 /*** Zoom and sizing mode ***/
 
 #define EPSILON 0.0000001
@@ -5150,6 +5179,67 @@ ev_view_find_cancel (EvView *view)
 	view->find_pages = NULL;
 }
 
+void
+ev_view_highlight_rect (EvView *view, EvRectangle *rect)
+{
+		gint i, page, n_pages;
+		gdouble width, height;
+		EvPoint point;
+
+		page = ev_page_cache_get_current_page (view->page_cache);
+		n_pages = ev_page_cache_get_n_pages (view->page_cache);
+
+		view->find_pages = (GList**)g_malloc( sizeof(gpointer) * n_pages );
+		for( i=0; i<n_pages; i++){
+			view->find_pages[i] = NULL;
+		}
+		view->find_pages[page] = g_list_append ( view->find_pages[page], rect );
+		view->highlight_find_results=TRUE;
+		
+		width = (gdouble)ev_view_get_width(view) / ev_view_get_zoom(view);
+		height = (gdouble)ev_view_get_height(view) / ev_view_get_zoom(view);
+		
+		point.x = (rect->x1+rect->x2)/2.0 - width/2.0;
+		if (point.x<0){
+			point.x=0;
+		}
+		point.y = (rect->y1+rect->y2)/2.0 - height/2.0;
+		if (point.y<0){
+			point.y=0;
+		}
+		view->pending_point = point;
+		view->pending_scroll = SCROLL_TO_PAGE_POSITION;
+		return;
+}
+
+static void 
+synctex_open_editor(EvView *view, gint page, gint doc_point_x, gint doc_point_y)
+{
+	/* Get filename */
+	gchar **filename = g_strsplit( view->uri, "://", 2);
+
+	/* Build synctex argument with location information */
+	page += 1;	/* Page should be 1-based */
+	gchar synctex_arg[500];
+	sprintf(synctex_arg, "%d:%d:%d:%s", page, doc_point_x, doc_point_y, filename[1]);
+	g_strfreev(filename);
+
+	/* Execute synctex command */
+	gchar  **argv;
+	argv = g_new(gchar*, 7);
+	argv[0] = "synctex";
+	argv[1] = "edit";
+	argv[2] = "-o";
+	argv[3] = synctex_arg;
+	argv[4] = "-x";
+	/* To use another editor, change this line */
+	argv[5] = "bash -c 'cd $(dirname %{output}); geany --line %{line} --column %{column} %{input}'";
+	argv[6] = NULL;
+	g_spawn_async( NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL);
+
+	return;
+}
+
 /*** Selections ***/
 
 /* compute_new_selection_rect/text calculates the area currently selected by
diff -uprN evince-2.25.92/libview/ev-view.h evince-2.25.92.new/libview/ev-view.h
--- evince-2.25.92/libview/ev-view.h	2009-03-03 01:18:42.000000000 +0300
+++ evince-2.25.92.new/libview/ev-view.h	2009-03-09 01:32:28.000000000 +0300
@@ -57,6 +57,8 @@ void		ev_view_set_document	  (EvView    
 void 		ev_view_set_loading       (EvView 	  *view,
 				           gboolean        loading);
 void            ev_view_reload            (EvView         *view);
+void			ev_view_set_uri			  (EvView		  *view,
+							gchar *uri);
 
 /* Clipboard */
 void		ev_view_copy		  (EvView         *view);
@@ -118,6 +120,8 @@ void            ev_view_find_changed    
 						   GList         **results,
 						   gint            page);
 void            ev_view_find_cancel               (EvView         *view);
+void            ev_view_highlight_rect            (EvView *view,
+						   EvRectangle *rect);
 
 /* Cursor */
 void           ev_view_hide_cursor        (EvView         *view);
@@ -129,6 +133,8 @@ void	       ev_view_scroll             (
 					   gboolean        horizontal);
 void	       ev_view_handle_link        (EvView         *view,
 					   EvLink         *link);
+void           ev_view_goto_dest           (EvView         *view,
+                       EvLinkDest *dest);
 gboolean       ev_view_next_page	  (EvView         *view);
 gboolean       ev_view_previous_page	  (EvView         *view);
 gchar*         ev_view_page_label_from_dest (EvView *view, EvLinkDest *dest);
diff -uprN evince-2.25.92/libview/ev-view-private.h evince-2.25.92.new/libview/ev-view-private.h
--- evince-2.25.92/libview/ev-view-private.h	2009-03-03 01:18:42.000000000 +0300
+++ evince-2.25.92.new/libview/ev-view-private.h	2009-03-09 01:32:28.000000000 +0300
@@ -178,6 +178,8 @@ struct _EvView {
 	GtkWidget *goto_entry;
 
 	EvTransitionAnimation *animation;
+	
+	gchar *uri;
 };
 
 struct _EvViewClass {
diff -uprN evince-2.25.92/shell/ev-application.c evince-2.25.92.new/shell/ev-application.c
--- evince-2.25.92/shell/ev-application.c	2009-03-03 01:18:43.000000000 +0300
+++ evince-2.25.92.new/shell/ev-application.c	2009-03-09 01:32:28.000000000 +0300
@@ -24,6 +24,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include <glib.h>
 #include <glib/gi18n.h>
@@ -358,16 +359,22 @@ static EvLinkDest *
 get_destination_from_args (GHashTable *args)
 {
 	EvLinkDest *dest = NULL;
-	GValue     *value = NULL;
+	GValue     *page_value = NULL;
+	GValue     *absolute_value = NULL;
 	
 	g_assert (args != NULL);
 	
-	value = g_hash_table_lookup (args, "page-label");
-	if (value) {
+	page_value = g_hash_table_lookup (args, "page-label");
+	absolute_value= g_hash_table_lookup (args, "use-absolute-page");
+	
+	if (page_value) {
 		const gchar *page_label;
-
-		page_label = g_value_get_string (value);
-		dest = ev_link_dest_new_page_label (page_label);
+		page_label = g_value_get_string(page_value);
+		if ( g_value_get_boolean( absolute_value ) ){
+			dest = ev_link_dest_new_page( atol(page_label)-1 );
+		} else{
+			dest = ev_link_dest_new_page_label(page_label);
+		}
 	}
 
 	return dest;
@@ -427,6 +434,34 @@ get_print_settings_from_args (GHashTable
 	return print_settings;
 }
 
+static EvRectangle *
+get_highlight_rect_from_args (GHashTable *args)
+{
+	GValue      *value = NULL;
+	EvRectangle *rect = NULL;
+	
+	g_assert (args != NULL);
+	rect = g_new(EvRectangle, 1);
+	
+	value = g_hash_table_lookup (args, "highlight-rect-x1");
+	if (!value) {	return NULL;	}
+	rect->x1 = g_value_get_double (value);
+
+	value = g_hash_table_lookup (args, "highlight-rect-x2");
+	if (!value) {	return NULL;	}
+	rect->x2 = g_value_get_double (value);
+
+	value = g_hash_table_lookup (args, "highlight-rect-y1");
+	if (!value) {	return NULL;	}
+	rect->y1 = g_value_get_double (value);
+
+	value = g_hash_table_lookup (args, "highlight-rect-y2");
+	if (!value) {	return NULL;	}
+	rect->y2 = g_value_get_double (value);
+
+	return rect;
+}
+
 /**
  * ev_application_open_window:
  * @application: The instance of the application.
@@ -594,7 +629,8 @@ ev_application_open_uri_at_dest (EvAppli
 				 EvWindowRunMode mode,
 				 const gchar    *search_string,
 				 gboolean        unlink_temp_file,
-				 const gchar    *print_settings, 
+				 const gchar    *print_settings,
+				 EvRectangle	*highlight_rect,
 				 guint           timestamp)
 {
 	EvWindow *new_window;
@@ -619,7 +655,7 @@ ev_application_open_uri_at_dest (EvAppli
 	/* We need to load uri before showing the window, so
 	   we can restore window size without flickering */	
 	ev_window_open_uri (new_window, uri, dest, mode, search_string, 
-			    unlink_temp_file, print_settings);
+			    unlink_temp_file, print_settings, highlight_rect);
 
 	if (!GTK_WIDGET_REALIZED (GTK_WIDGET (new_window)))
 		gtk_widget_realize (GTK_WIDGET (new_window));
@@ -660,6 +696,7 @@ ev_application_open_uri (EvApplication  
 	gboolean         unlink_temp_file = FALSE;
 	const gchar     *print_settings = NULL;
 	GdkScreen       *screen = NULL;
+	EvRectangle		*highlight_rect = NULL;
 
 	if (args) {
 		screen = get_screen_from_args (args);
@@ -669,12 +706,13 @@ ev_application_open_uri (EvApplication  
 		unlink_temp_file = (mode == EV_WINDOW_MODE_PREVIEW &&
 				    get_unlink_temp_file_from_args (args));
 		print_settings = get_print_settings_from_args (args);
+		highlight_rect = get_highlight_rect_from_args (args);
 	}
-	
+
 	ev_application_open_uri_at_dest (application, uri, screen,
 					 dest, mode, search_string,
 					 unlink_temp_file,
-					 print_settings, timestamp);
+					 print_settings, highlight_rect, timestamp);
 
 	if (dest)
 		g_object_unref (dest);
@@ -693,7 +731,7 @@ ev_application_open_uri_list (EvApplicat
 	for (l = uri_list; l != NULL; l = l->next) {
 		ev_application_open_uri_at_dest (application, (char *)l->data,
 						 screen, NULL, 0, NULL,
-						 FALSE, NULL, timestamp);
+						 FALSE, NULL, NULL, timestamp);
 	}
 }
 
diff -uprN evince-2.25.92/shell/ev-application.h evince-2.25.92.new/shell/ev-application.h
--- evince-2.25.92/shell/ev-application.h	2009-03-03 01:18:43.000000000 +0300
+++ evince-2.25.92.new/shell/ev-application.h	2009-03-09 01:32:28.000000000 +0300
@@ -71,6 +71,7 @@ void              ev_application_open_ur
 						      const gchar     *search_string,
 						      gboolean         unlink_temp_file,
 						      const gchar     *print_settings, 
+						      EvRectangle     *highlight_rect, 
 						      guint32          timestamp);
 void	          ev_application_open_uri_list       (EvApplication   *application,
 		  			              GSList          *uri_list,
diff -uprN evince-2.25.92/shell/ev-print-operation.c evince-2.25.92.new/shell/ev-print-operation.c
--- evince-2.25.92/shell/ev-print-operation.c	2009-03-03 01:18:43.000000000 +0300
+++ evince-2.25.92.new/shell/ev-print-operation.c	2009-03-09 01:32:28.000000000 +0300
@@ -776,6 +776,7 @@ export_print_done (EvPrintOperationExpor
 						 NULL,
 						 TRUE,
 						 print_settings_file,
+						 NULL,
 						 GDK_CURRENT_TIME);
 		g_free (print_settings_file);
 		g_free (uri);
diff -uprN evince-2.25.92/shell/ev-window.c evince-2.25.92.new/shell/ev-window.c
--- evince-2.25.92/shell/ev-window.c	2009-03-03 02:30:25.000000000 +0300
+++ evince-2.25.92.new/shell/ev-window.c	2009-03-09 01:32:28.000000000 +0300
@@ -200,6 +200,7 @@ struct _EvWindowPrivate {
 	EvLinkDest       *dest;
 	gchar            *search_string;
 	EvWindowRunMode   window_mode;
+	EvRectangle		 *highlight_rect;
 
 	EvJob            *load_job;
 	EvJob            *reload_job;
@@ -1374,6 +1375,7 @@ ev_window_load_job_cb (EvJob *job,
 
 	g_assert (job_load->uri);
 
+	ev_view_set_uri(EV_VIEW (ev_window->priv->view), g_strdup (job_load->uri));
 	ev_view_set_loading (EV_VIEW (ev_window->priv->view), FALSE);
 
 	/* Success! */
@@ -1410,6 +1412,11 @@ ev_window_load_job_cb (EvJob *job,
 			link = ev_link_new (NULL, link_action);
 			ev_view_handle_link (EV_VIEW (ev_window->priv->view), link);
 		    	g_object_unref (link);
+			
+			if (ev_window->priv->highlight_rect) {
+				ev_view_highlight_rect ( EV_VIEW (ev_window->priv->view),
+					ev_window->priv->highlight_rect );
+			}
 
 			/* Already unrefed by ev_link_action
 			 * FIXME: link action should inc dest ref counting
@@ -1804,7 +1811,8 @@ ev_window_open_uri (EvWindow       *ev_w
 		    EvWindowRunMode mode,
 		    const gchar    *search_string, 
 		    gboolean        unlink_temp_file,
-		    const gchar    *print_settings)
+		    const gchar    *print_settings,
+		    EvRectangle     *highlight_rect)
 {
 	GFile *source_file;
 
@@ -1813,6 +1821,19 @@ ev_window_open_uri (EvWindow       *ev_w
 	if (ev_window->priv->uri &&
 	    g_ascii_strcasecmp (ev_window->priv->uri, uri) == 0) {
 		ev_window_reload_document (ev_window);
+
+		if (dest){
+			if (ev_window->priv->dest){
+				g_object_unref (ev_window->priv->dest);
+			}
+			ev_window->priv->dest = dest ? g_object_ref (dest) : NULL;
+			ev_view_goto_dest(EV_VIEW (ev_window->priv->view), dest);
+
+			if (highlight_rect){
+				ev_window->priv->highlight_rect = highlight_rect;
+				ev_view_highlight_rect( EV_VIEW (ev_window->priv->view), highlight_rect );
+			}
+		}
 		return;
 	}
 
@@ -1848,6 +1869,8 @@ ev_window_open_uri (EvWindow       *ev_w
 		g_object_unref (ev_window->priv->dest);
 	ev_window->priv->dest = dest ? g_object_ref (dest) : NULL;
 
+	ev_window->priv->highlight_rect = highlight_rect;
+
 	setup_size_from_metadata (ev_window);
 
 	ev_window->priv->load_job = ev_job_load_new (uri);
@@ -2180,6 +2203,7 @@ ev_window_cmd_file_open_copy_at_dest (Ev
 					 NULL, 
 					 TRUE,
 					 NULL,
+					 NULL,
 					 GDK_CURRENT_TIME);
 	g_free (symlink_uri);
 }
@@ -2213,7 +2237,7 @@ ev_window_cmd_recent_file_activate (GtkA
 	
 	ev_application_open_uri_at_dest (EV_APP, uri,
 					 gtk_window_get_screen (GTK_WINDOW (window)),
-					 NULL, 0, NULL, FALSE, NULL, 
+					 NULL, 0, NULL, FALSE, NULL, NULL,
 					 GDK_CURRENT_TIME);
 }
 
@@ -2224,7 +2248,7 @@ ev_window_open_recent_action_item_activa
 {
 	ev_application_open_uri_at_dest (EV_APP, uri,
 					 gtk_window_get_screen (GTK_WINDOW (window)),
-					 NULL, 0, NULL, FALSE, NULL, 
+					 NULL, 0, NULL, FALSE, NULL, NULL,
 					 GDK_CURRENT_TIME);
 }
 
@@ -5549,6 +5573,7 @@ open_remote_link (EvWindow *window, EvLi
 					 NULL, 
 					 FALSE,
 					 NULL,
+					 NULL,
 					 GDK_CURRENT_TIME);
 
 	g_free (uri);
diff -uprN evince-2.25.92/shell/ev-window.h evince-2.25.92.new/shell/ev-window.h
--- evince-2.25.92/shell/ev-window.h	2009-03-03 01:18:43.000000000 +0300
+++ evince-2.25.92.new/shell/ev-window.h	2009-03-09 01:32:28.000000000 +0300
@@ -79,7 +79,8 @@ void		ev_window_open_uri	  (EvWindow    
 					   EvWindowRunMode mode,
 					   const gchar    *search_string,
 					   gboolean        unlink_temp_file,
-					   const gchar    *print_settings);
+					   const gchar    *print_settings,
+					   EvRectangle     *highlight_rect);
 gboolean	ev_window_is_empty	  (const EvWindow *ev_window);
 void		ev_window_print_range     (EvWindow       *ev_window,
 					   int             first_page,
diff -uprN evince-2.25.92/shell/main.c evince-2.25.92.new/shell/main.c
--- evince-2.25.92/shell/main.c	2009-03-03 01:18:43.000000000 +0300
+++ evince-2.25.92.new/shell/main.c	2009-03-09 01:32:28.000000000 +0300
@@ -42,6 +42,8 @@
 #endif
 
 static gchar   *ev_page_label;
+static gboolean use_absolute_page = FALSE;
+static gchar   *ev_highlight_rect;
 static gchar   *ev_find_string;
 static gboolean preview_mode = FALSE;
 static gboolean fullscreen_mode = FALSE;
@@ -65,6 +67,8 @@ option_version_cb (const gchar *option_n
 static const GOptionEntry goption_options[] =
 {
 	{ "page-label", 'p', 0, G_OPTION_ARG_STRING, &ev_page_label, N_("The page of the document to display."), N_("PAGE")},
+	{ "use-absolute-page", 'a', 0, G_OPTION_ARG_NONE, &use_absolute_page, N_("PAGE is absolute page number (first page is 1). Use with -p"), NULL},
+	{ "highlight-rect", 'h', 0, G_OPTION_ARG_STRING, &ev_highlight_rect, N_("Highlight a rectangle in the document. Two possible formats: \"x:y\" ( x and y center of box) or \"x:y:w:h\" (x and y top-left corner of box, w and h width and height."), N_("COORDS")},
 	{ "fullscreen", 'f', 0, G_OPTION_ARG_NONE, &fullscreen_mode, N_("Run evince in fullscreen mode"), NULL },
 	{ "presentation", 's', 0, G_OPTION_ARG_NONE, &presentation_mode, N_("Run evince in presentation mode"), NULL },
 	{ "preview", 'w', 0, G_OPTION_ARG_NONE, &preview_mode, N_("Run evince as a previewer"), NULL },
@@ -134,6 +138,7 @@ arguments_parse (void)
 	g_hash_table_insert (args, g_strdup ("screen"), value);
 
 	if (ev_page_label) {
+		/* ev_page_label */
 		value = g_new0 (GValue, 1);
 		g_value_init (value, G_TYPE_STRING);
 		g_value_set_string (value, ev_page_label);
@@ -142,6 +147,64 @@ arguments_parse (void)
 
 		g_free (ev_page_label);
 		ev_page_label = NULL;
+
+		/* use_absolute_page */
+		value = g_new0 (GValue, 1);
+		g_value_init (value, G_TYPE_BOOLEAN);
+		g_value_set_boolean (value, use_absolute_page);
+
+		g_hash_table_insert (args, g_strdup ("use-absolute-page"), value);
+	}
+	
+	if (ev_highlight_rect) {
+		int i;
+		gdouble x1, x2, y1, y2;
+		gchar **strings;
+		
+		strings = g_strsplit( ev_highlight_rect, ":", 5);		
+		for (i=0; strings[i]!=NULL; i++);
+		
+		if ( i==2 ) {
+			x1 = atof(strings[0]) - 10;
+			x2 = atof(strings[0]) + 10;
+			y1 = atof(strings[1]) - 10;
+			y2 = atof(strings[1]) + 10;
+		} else if ( i==4 ) {
+			x1 = atof(strings[0]);
+			x2 = atof(strings[0]) + atof(strings[2]);
+			y1 = atof(strings[1]);
+			y2 = atof(strings[1]) + atof(strings[3]);
+		}
+
+		if ( (i==2||i==4) && (x2-x1)>0 && (y2-y1)>0 ){
+			value = g_new0 (GValue, 1);
+			g_value_init (value, G_TYPE_DOUBLE);
+			g_value_set_double (value, x1);
+			g_hash_table_insert (args, g_strdup ("highlight-rect-x1"), value);
+			
+			value = g_new0 (GValue, 1);
+			g_value_init (value, G_TYPE_DOUBLE);
+			g_value_set_double (value, x2);
+			g_hash_table_insert (args, g_strdup ("highlight-rect-x2"), value);
+			
+			value = g_new0 (GValue, 1);
+			g_value_init (value, G_TYPE_DOUBLE);
+			g_value_set_double (value, y1);
+			g_hash_table_insert (args, g_strdup ("highlight-rect-y1"), value);
+			
+			value = g_new0 (GValue, 1);
+			g_value_init (value, G_TYPE_DOUBLE);
+			g_value_set_double (value, y2);
+			g_hash_table_insert (args, g_strdup ("highlight-rect-y2"), value);
+		} else {
+			/* FIXME: Should GError or something else be used for error handling?
+			 * 		  It would be best to quit after printing the error */
+			printf("Evince: Invalid argument for -h (or --highlight). Ignoring\n");
+		}
+
+		g_strfreev(strings);
+		g_free (ev_highlight_rect);
+		ev_highlight_rect = NULL;
 	}
 
 	if (ev_find_string) {
