diff --git a/src/app.vala b/src/app.vala
index 67a58a2..1b69b32 100644
--- a/src/app.vala
+++ b/src/app.vala
@@ -28,7 +28,8 @@ class Window : Gtk.ApplicationWindow
 
   private string[] builtin_dingus = {
     "(((gopher|news|telnet|nntp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?",
-    "(((gopher|news|telnet|nntp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"]"
+    "(((gopher|news|telnet|nntp|file|http|ftp|https)://)|(www|ftp)[-A-Za-z0-9]*\\.)[-A-Za-z0-9\\.]+(:[0-9]*)?/[-A-Za-z0-9_\\$\\.\\+\\!\\*\\(\\),;:@&=\\?/~\\#\\%]*[^]'\\.}>\\) ,\\\"]",
+    "(\\d+)(?!\\d)"
   };
 
   private const GLib.ActionEntry[] action_entries = {
diff --git a/src/vte.c b/src/vte.c
index 2c5c869..7738b41 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -1342,6 +1342,7 @@ void
 vte_terminal_match_set_cursor_type(VteTerminal *terminal,
 				   int tag, GdkCursorType cursor_type)
 {
+#if 0
 	struct vte_match_regex *regex;
 	g_return_if_fail(VTE_IS_TERMINAL(terminal));
 	g_return_if_fail((guint) tag < terminal->pvt->match_regexes->len);
@@ -1351,6 +1352,7 @@ vte_terminal_match_set_cursor_type(VteTerminal *terminal,
         regex_match_clear_cursor(regex);
         regex->cursor_mode = VTE_REGEX_CURSOR_GDKCURSORTYPE;
 	regex->cursor.cursor_type = cursor_type;
+#endif
 	vte_terminal_match_hilite_clear(terminal);
 }
 
@@ -5328,6 +5330,23 @@ vte_cell_is_between(glong col, glong row,
 	return FALSE;
 }
 
+/* Check if the given point is in the region between the two points,
+ * optionally treating the second point as included in the region or not. */
+static gboolean
+vte_cell_is_between_thousands(glong width, glong col, glong row,
+		    glong acol, glong arow, glong bcol, glong brow,
+		    gboolean inclusive)
+{
+	long a, b, c, end;
+	if (!vte_cell_is_between (col, row, acol, arow, bcol, brow, inclusive)) return FALSE;
+	a = arow * width + acol;
+	b = brow * width + bcol;
+	end = MAX(a, b);
+	if (!inclusive) end--;
+	c = row * width + col;
+	return (c < end) && ((end - c) % 3 == 0);
+}
+
 /* Check if a cell is selected or not. */
 static gboolean
 vte_cell_is_selected(VteTerminal *terminal, glong col, glong row, gpointer data)
@@ -8833,7 +8852,7 @@ vte_terminal_draw_cells(VteTerminal *terminal,
 			guint fore, guint back, gboolean clear,
 			gboolean draw_default_bg,
 			gboolean bold, gboolean italic, gboolean underline,
-			gboolean strikethrough, gboolean hilite, gboolean boxed,
+			gboolean strikethrough, gboolean hilite, gboolean thousands, gboolean boxed,
 			gint column_width, gint row_height)
 {
 	int i, x, y;
@@ -8849,9 +8868,9 @@ vte_terminal_draw_cells(VteTerminal *terminal,
 		}
 		tmp = g_string_free (str, FALSE);
 		g_printerr ("draw_cells('%s', fore=%d, back=%d, bold=%d,"
-				" ul=%d, strike=%d, hilite=%d, boxed=%d)\n",
+				" ul=%d, strike=%d, hilite=%d, thousands=%d, boxed=%d)\n",
 				tmp, fore, back, bold,
-				underline, strikethrough, hilite, boxed);
+				underline, strikethrough, hilite, thousands, boxed);
 		g_free (tmp);
 	}
 
@@ -8893,7 +8912,7 @@ vte_terminal_draw_cells(VteTerminal *terminal,
 	}
 
 	/* Draw whatever SFX are required. */
-	if (underline | strikethrough | hilite | boxed) {
+	if (underline | strikethrough | hilite | thousands | boxed) {
 		i = 0;
 		do {
 			x = items[i].x;
@@ -8918,12 +8937,20 @@ vte_terminal_draw_cells(VteTerminal *terminal,
 						y + terminal->pvt->strikethrough_position + terminal->pvt->line_thickness - 1);
 			}
 			if (hilite) {
+//				vte_terminal_draw_line(terminal,
+//						&fg,
+//						x,
+//						y + row_height - 1,
+//						x + (columns * column_width) - 1,
+//						y + row_height - 1);
+			}
+			if (thousands) {
 				vte_terminal_draw_line(terminal,
 						&fg,
-						x,
-						y + row_height - 1,
 						x + (columns * column_width) - 1,
-						y + row_height - 1);
+						y,
+						x + (columns * column_width) - 1,
+						y + 1);
 			}
 			if (boxed) {
 				vte_terminal_draw_rectangle(terminal,
@@ -9159,7 +9186,7 @@ vte_terminal_draw_cells_with_attributes(VteTerminal *terminal,
 					cells[j].attr.italic,
 					cells[j].attr.underline,
 					cells[j].attr.strikethrough,
-					FALSE, FALSE, column_width, height);
+					FALSE, FALSE, FALSE, column_width, height);
 		j += g_unichar_to_utf8(items[i].c, scratch_buf);
 	}
 	g_free(cells);
@@ -9181,7 +9208,7 @@ vte_terminal_draw_rows(VteTerminal *terminal,
 	gint i, j, row, rows, x, y, end_column;
 	guint fore, nfore, back, nback;
 	gboolean underline, nunderline, bold, nbold, italic, nitalic, hilite, nhilite,
-		 selected, nselected, strikethrough, nstrikethrough;
+		 thousands, nthousands, selected, nselected, strikethrough, nstrikethrough;
 	guint item_count;
 	const VteCell *cell;
 	const VteRowData *row_data;
@@ -9340,8 +9367,15 @@ vte_terminal_draw_rows(VteTerminal *terminal,
 						terminal->pvt->match_end.col,
 						terminal->pvt->match_end.row,
 						TRUE);
+				thousands = vte_cell_is_between_thousands(terminal->pvt->column_count, i, row,
+						terminal->pvt->match_start.col,
+						terminal->pvt->match_start.row,
+						terminal->pvt->match_end.col,
+						terminal->pvt->match_end.row,
+						TRUE);
 			} else {
 				hilite = FALSE;
+				thousands = FALSE;
 			}
 
 			items[0].c = cell->c;
@@ -9370,7 +9404,7 @@ vte_terminal_draw_rows(VteTerminal *terminal,
 						/* only break the run if we
 						 * are drawing attributes
 						 */
-						if (underline || strikethrough || hilite) {
+						if (underline || strikethrough || hilite || thousands) {
 							break;
 						} else {
 							j++;
@@ -9415,6 +9449,18 @@ vte_terminal_draw_rows(VteTerminal *terminal,
 					if (nhilite != hilite) {
 						break;
 					}
+					nthousands = FALSE;
+					if (terminal->pvt->show_match) {
+						nthousands = vte_cell_is_between_thousands(terminal->pvt->column_count, j, row,
+								terminal->pvt->match_start.col,
+								terminal->pvt->match_start.row,
+								terminal->pvt->match_end.col,
+								terminal->pvt->match_end.row,
+								TRUE);
+					}
+					if (nthousands != thousands) {
+						break;
+					}
 					/* Add this cell to the draw list. */
 					items[item_count].c = cell->c;
 					items[item_count].columns = cell->attr.columns;
@@ -9458,7 +9504,7 @@ fg_draw:
 					item_count,
 					fore, back, FALSE, FALSE,
 					bold, italic, underline,
-					strikethrough, hilite, FALSE,
+					strikethrough, hilite, thousands, FALSE,
 					column_width, row_height);
 			item_count = 1;
 			/* We'll need to continue at the first cell which didn't
@@ -9664,7 +9710,7 @@ vte_terminal_paint_cursor(VteTerminal *terminal)
 		case VTE_CURSOR_SHAPE_BLOCK:
 
 			if (focus) {
-                                gboolean hilite = FALSE;
+                                gboolean hilite = FALSE, thousands = FALSE;
 
 				/* just reverse the character under the cursor */
 				vte_terminal_fill_rectangle (terminal,
@@ -9679,6 +9725,12 @@ vte_terminal_paint_cursor(VteTerminal *terminal)
                                                         terminal->pvt->match_end.col,
                                                         terminal->pvt->match_end.row,
                                                         TRUE);
+                                        thousands = vte_cell_is_between_thousands(terminal->pvt->column_count, col, row,
+                                                        terminal->pvt->match_start.col,
+                                                        terminal->pvt->match_start.row,
+                                                        terminal->pvt->match_end.col,
+                                                        terminal->pvt->match_end.row,
+                                                        TRUE);
                                 }
                                 if (cell && cell->c != 0 && cell->c != ' ') {
                                         vte_terminal_draw_cells(terminal,
@@ -9689,6 +9741,7 @@ vte_terminal_paint_cursor(VteTerminal *terminal)
                                                         cell->attr.underline,
                                                         cell->attr.strikethrough,
                                                         hilite,
+                                                        thousands,
                                                         FALSE,
                                                         width,
                                                         height);
@@ -9780,6 +9833,7 @@ vte_terminal_paint_im_preedit_string(VteTerminal *terminal)
 						FALSE,
 						FALSE,
 						FALSE,
+						FALSE,
 						TRUE,
 						width, height);
 		}
diff --git a/src/vteapp.c b/src/vteapp.c
index 4227a0f..fb16ec0 100644
--- a/src/vteapp.c
+++ b/src/vteapp.c
@@ -41,6 +41,7 @@
 static const char *builtin_dingus[] = {
   DINGUS1,
   DINGUS2,
+  "(\\d+)(?!\\d)",
   NULL
 };
 
