diff -ur screen-4.0.2/doc/screen.1 patched/doc/screen.1
--- screen-4.0.2/doc/screen.1	Fri Dec  5 13:51:57 2003
+++ patched/doc/screen.1	Sat Oct 21 15:49:50 2006
@@ -1261,6 +1261,14 @@
 \fBB\fP, \fBE\fP move the cursor WORD by WORD (as in vi).
 .br 
 .ti -2n
+.\"\fBf\fP,\fBt\fP, \fBF\fP, \fBT\fP move the cursor forward/backward to the next occurence of the target.
+\fBf/F\fP, \fBt/T\fP move the cursor forward/backward to the next occurence of the target. (eg, '3fy' will 
+move the cursor to the 3rd 'y' to the right.)
+.br
+.ti -2n
+\fB;\fP \fB,\fP Repeat the last f/F/t/T command in the same/opposite direction.
+.br
+.ti -2n
 \fBC-u\fP and \fBC-d\fP scroll the display up/down by the specified amount of 
 lines while preserving the cursor position. (Default: half screen-full). 
 .br
diff -ur screen-4.0.2/mark.c patched/mark.c
--- screen-4.0.2/mark.c	Mon Sep  8 15:26:00 2003
+++ patched/mark.c	Sat Oct 21 15:17:25 2006
@@ -134,6 +134,54 @@
   return x;
 }
 
+/*
+ * nextchar sets *xp to the num-th occurrence of the target in the line.
+ *
+ * Returns -1 if the target doesn't appear num times, 0 otherwise.
+ */
+static int
+nextchar(int *xp, int *yp, int direction, char target, int num)
+{
+  int width;  /* width of the current window. */
+  int x;      /* x coordinate of the current cursor position. */
+  int step;   /* amount to increment x (+1 or -1) */
+  int adjust; /* Final adjustment of cursor position. */
+  char *displayed_line; /* Line in which search takes place. */
+ 
+  debug("nextchar\n");
+ 
+  x = *xp;
+  adjust = 0;
+  width = fore->w_width;
+  displayed_line = WIN(*yp) -> image;
+ 
+  switch(direction) {
+  case 't': adjust = -1; /* fall through */
+  case 'f': step = 1; /* fall through */
+  break;
+  case 'T': adjust = 1; /* fall through */
+  case 'F': step = -1; /* fall through */
+  break;
+  default:
+  ASSERT(0);
+  }
+ 
+  x += step;
+ 
+  debug1("ml->image = %s\n", displayed_line);
+  debug2("num = %d, width = %d\n",num, width);
+  debug2("x = %d targe = %c\n", x, target );
+ 
+  for ( ;x>=0 && x <= width; x += step) {
+    if (displayed_line[x] == target) {
+      if (--num == 0) {
+        *xp = x + adjust;
+        return 0;
+      }
+    }
+  }
+  return -1;
+}
 
 /*
  *  nextword calculates the cursor position of the num'th word.
@@ -149,6 +197,8 @@
 #define NW_MUSTMOVE	(1<<2)
 #define NW_BIG		(1<<3)
 
+
+
 static void
 nextword(xp, yp, flags, num)
 int *xp, *yp, flags, num;
@@ -514,7 +564,7 @@
           inlen--;
 	}
       rep_cnt = markdata->rep_cnt;
-      if (od >= '0' && od <= '9')
+      if (od >= '0' && od <= '9' && !markdata->f_cmd.flag)
         {
 	  if (rep_cnt < 1001 && (od != '0' || rep_cnt != 0))
 	    {
@@ -534,8 +584,61 @@
 	}
       cx = markdata->cx;
       cy = markdata->cy;
-      switch (od)
-	{
+
+      if (markdata -> f_cmd.flag) {
+        debug2("searching for %c:%d\n",od,rep_cnt);
+        markdata->f_cmd.flag = 0;
+        markdata->rep_cnt = 0;
+
+	if (isgraph (od)) {
+	  markdata->f_cmd.target = od;
+	  rep_cnt = (rep_cnt) ? rep_cnt : 1;
+	  nextchar(&cx, &cy, markdata->f_cmd.direction, od, rep_cnt );
+	  revto(cx, cy);
+	  continue;
+	}
+      }
+
+      switch (od) 
+        {
+	case 'f': /* fall through */
+	case 'F': /* fall through */
+	case 't': /* fall through */
+	case 'T': /* fall through */
+	/* 
+	 * Set f_cmd to do a search on the next key stroke.
+	 * If we break, rep_cnt will be reset, so we
+	 * continue instead. It might be cleaner to
+	 * store the rep_count in f_cmd and
+	 * break here so later followon code will be
+	 * hit. 
+	 */
+	markdata->f_cmd.flag = 1;
+        markdata->f_cmd.direction = od;
+	debug("entering char search\n");
+	continue;
+	case ';':
+	  if (!rep_cnt)
+	    rep_cnt = 1;
+	  nextchar(&cx, &cy, markdata->f_cmd.direction, markdata->f_cmd.target, rep_cnt );
+	  revto(cx, cy);
+	break;
+	case ',': {
+	  int search_dir;
+	  if (!rep_cnt)
+	    rep_cnt = 1;
+	  switch (markdata->f_cmd.direction) {
+	  case 't': search_dir = 'T'; break;
+	  case 'T': search_dir = 't'; break;
+	  case 'f': search_dir = 'F'; break;
+	  case 'F': search_dir = 'f'; break;
+	  }
+	  nextchar(&cx, &cy, search_dir, markdata->f_cmd.target, rep_cnt );
+	 
+	  revto(cx, cy);
+	  break;
+	  }
+
 	case 'o':
 	case 'x':
 	  if (!markdata->second)
diff -ur screen-4.0.2/mark.h patched/mark.h
--- screen-4.0.2/mark.h	Tue Jan  8 15:42:30 2002
+++ patched/mark.h	Sat Oct 21 15:17:28 2006
@@ -41,6 +41,10 @@
   int	isdir;		/* current search direction */
   int	isstartpos;	/* position where isearch was started */
   int	isstartdir;	/* direction when isearch was started */
+  struct {              /* bookkeeping for fFtT;, commands */
+    int flag, target, direction;
+  } f_cmd;
+    
 };
 
 
