Index: engine/utils.c
===================================================================
--- engine/utils.c	(revision 2385)
+++ engine/utils.c	(working copy)
@@ -1426,7 +1426,20 @@
   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 == NO_MOVE || countlib(neighbor) != 2)
+    return 0;
+
   /* Try to play the move. */
   if (!trymove(move, color, "send_two_return_one-A", NO_MOVE))
     return 0;
Index: engine/reading.c
===================================================================
--- engine/reading.c	(revision 2385)
+++ engine/reading.c	(working copy)
@@ -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				\
Index: engine/board.c
===================================================================
--- engine/board.c	(revision 2385)
+++ engine/board.c	(working copy)
@@ -2873,6 +2873,45 @@
           || board[EAST(pos)] == color);
 }
 
+/* If (pos) has exactly one neighbor of color (color)
+ * returns position of this neighbor. Otherwise returns NO_MOVE.
+ */
+
+int
+find_neighbor(int pos, int color)
+{
+  int npos = NO_MOVE;
+
+  ASSERT_ON_BOARD1(pos);
+  ASSERT1(IS_STONE(color), pos);
+
+  if (board[SOUTH(pos)] == color)
+    npos = SOUTH(pos);
+
+  if (board[WEST(pos)] == color) {
+    if (npos != NO_MOVE)
+      return NO_MOVE;
+    else
+      npos = WEST(pos);
+  }
+
+  if (board[NORTH(pos)] == color) {
+    if (npos != NO_MOVE)
+      return NO_MOVE;
+    else
+      npos = NORTH(pos);
+  }
+
+  if (board[EAST(pos)] == color) {
+    if (npos != NO_MOVE)
+      return NO_MOVE;
+    else
+      npos = EAST(pos);
+  }
+
+  return npos;
+}
+
 /*
  * Returns true if str1 and str2 belong to the same string.
  */
Index: engine/board.h
===================================================================
--- engine/board.h	(revision 2385)
+++ engine/board.h	(working copy)
@@ -323,6 +323,7 @@
 int second_order_liberty_of_string(int pos, int str);
 int neighbor_of_string(int pos, int str);
 int has_neighbor(int pos, int color);
+int find_neighbor(int pos, int color);
 int same_string(int str1, int str2);
 int adjacent_strings(int str1, int str2);
 void mark_string(int str, signed char mx[BOARDMAX], signed char mark);

