--- src/findreplace.c.old	2007-11-28 23:50:53.000000000 +0100
+++ src/findreplace.c	2010-09-23 00:14:58.940419926 +0200
@@ -587,6 +587,7 @@ static void find_prev_cb(GtkButton *butt
 static void goto_byte_cb(GtkButton *button, GtkWidget *w)
 {
 	guint byte = 2, len, i;
+	int is_relative = 0;
 	gboolean is_hex;
 	const gchar *byte_str = gtk_entry_get_text(GTK_ENTRY(jump_dialog->int_entry));
 	GHexWindow *win = ghex_window_get_active();
@@ -602,7 +603,17 @@ static void goto_byte_cb(GtkButton *butt
 		display_error_dialog (win, _("No offset has been specified!"));
 		return;
 	}
-
+	
+	if(len > 1 && byte_str[0] == '+') {
+		is_relative = 1;
+		byte_str++;
+		len--;
+	} else if(len > 1 && byte_str[0] == '-') {
+		is_relative = -1;
+		byte_str++;
+		len--;
+	}
+	
 	is_hex = ((len > 2) && (byte_str[0] == '0') && (byte_str[1] == 'x'));
 
 	if(!is_hex) {
@@ -621,18 +632,22 @@ static void goto_byte_cb(GtkButton *butt
 	if((i == len) &&
 	   ((sscanf(byte_str, "0x%x", &byte) == 1) ||
 		(sscanf(byte_str, "%d", &byte) == 1))) {
+		if(is_relative != 0) {
+			byte = byte * is_relative + win->gh->cursor_pos;
+		}
 		if(byte >= win->gh->document->file_size)
 			display_error_dialog(win,
 								 _("Can not position cursor beyond the "
 								   "End Of File!"));
-		else
+		else 
 			gtk_hex_set_cursor(win->gh, byte);
 	}
 	else
 		display_error_dialog(win,
 							 _("You may only give the offset as:\n"
 							   "  - a positive decimal number, or\n"
-							   "  - a hex number, beginning with '0x'"));
+							   "  - a hex number, beginning with '0x'\n"
+							   "  - a '+' or '-' sign, followed by a relative offset"));
 }
 
 static void replace_next_cb(GtkButton *button, gpointer unused)
