diff -N -r -u -X .ignore gnugo-copy/engine/board.c gnugo/engine/board.c
--- gnugo-copy/engine/board.c	2007-02-22 17:35:27.031250000 +0100
+++ gnugo/engine/board.c	2007-03-01 15:20:18.843750000 +0100
@@ -3310,6 +3310,44 @@
 }
 
 /*
+ * If (pos) has exactly one neighbor of color (color)
+ * returns position of this neighbor. Otherwise returns -1.
+ */
+
+int
+find_neighbor(int pos, int color)
+{
+  int npos;
+
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  if (board[SOUTH(pos)] == color)
+    npos = SOUTH(pos);
+  else
+    npos = 0;
+  if (board[WEST(pos)] == color) {
+    if (npos)
+      npos = -1;
+    else
+      npos = WEST(pos);
+  }
+  if (board[NORTH(pos)] == color) {
+    if (npos)
+      npos = -1;
+    else
+      npos = NORTH(pos);
+  }
+  if (board[EAST(pos)] == color) {
+    if (npos)
+      npos = -1;
+    else
+      npos = EAST(pos);
+  }
+  return npos ? npos : -1;
+}
+
+/*
  * Returns true if str1_pos and str2_pos belong to the same string.
  */
 
diff -N -r -u -X .ignore gnugo-copy/engine/board.h gnugo/engine/board.h
--- gnugo-copy/engine/board.h	2006-12-30 20:57:55.171875000 +0100
+++ gnugo/engine/board.h	2007-03-01 15:20:22.671875000 +0100
@@ -330,6 +330,7 @@
 int second_order_liberty_of_string(int pos, int str_pos);
 int neighbor_of_string(int pos, int str_pos);
 int has_neighbor(int pos, int color);
+int find_neighbor(int pos, int color);
 int same_string(int str1_pos, int str2_pos);
 int adjacent_strings(int str1_pos, int str2_pos);
 void mark_string(int str, signed char mx[BOARDMAX], signed char mark);
diff -N -r -u -X .ignore gnugo-copy/engine/reading.c gnugo/engine/reading.c
--- gnugo-copy/engine/reading.c	2007-02-02 19:01:45.578125000 +0100
+++ gnugo/engine/reading.c	2007-03-01 14:55:54.906250000 +0100
@@ -175,8 +175,9 @@
       int ko_move;							\
       int apos = moves.pos[k];						\
 									\
-      if (komaster_trymove(apos, other, moves.message[k], str,&ko_move,	\
-			   stackp <= ko_depth && savecode == 0)) {	\
+      if ((board_ko_pos || !send_two_return_one(apos, other))		\
+	  && komaster_trymove(apos, other,moves.message[k],str,&ko_move,\
+			      stackp <= ko_depth && savecode == 0)) {	\
 	int dcode = do_find_defense(str, (defense_hint));		\
 									\
 	if (REVERSE_RESULT(dcode) > savecode				\
@@ -1452,9 +1453,8 @@
 
   /* If the string is a single stone and a capture would give a ko,
    * try to defend it with ko by backfilling.
-   *
-   * FIXME: What is an example of this? Is it correct that the
-   *           return value is WIN and not KO_A or KO_B?
+   * If we don't find any defending move return LOSE and not KO_B,
+   * because we'll lose this ko sooner or later.
    */
   if (stackp <= backfill_depth
       && countstones(str) == 1
diff -N -r -u -X .ignore gnugo-copy/engine/utils.c gnugo/engine/utils.c
--- gnugo-copy/engine/utils.c	2007-02-19 16:57:12.812500000 +0100
+++ gnugo/engine/utils.c	2007-03-01 15:24:10.609375000 +0100
@@ -1434,6 +1434,19 @@
   int other = OTHER_COLOR(color);
   int lib1;
   int lib2;
+  int neighbor;
+
+  /* We must check this, because in such position:
+   *
+   * -----
+   * O.*OX
+   * OOXXX
+   *
+   * move * prevents making an eye by X player.
+   */
+  neighbor = find_neighbor(move, color);
+  if (neighbor == -1 || countlib(neighbor) != 2)
+    return 0;
 
   /* Try to play the move. */
   if (!trymove(move, color, "send_two_return_one-A", NO_MOVE))
