diff -N -r -u -X .ignore gnugo-copy/engine/worm.c gnugo/engine/worm.c
--- gnugo-copy/engine/worm.c	2007-02-24 15:12:04.828125000 +0100
+++ gnugo/engine/worm.c	2007-03-01 23:26:26.281250000 +0100
@@ -290,6 +290,7 @@
 	   */
 	  if (worm[str].color == OTHER_COLOR(color)
 	      && worm[str].attack_codes[0] != 0
+	      && worm[str].attack_points[0] != pos
 	      && worm[str].defense_codes[0] != 0) {
 	    int dcode = find_defense(str, NULL);
 	    if (dcode < worm[str].defense_codes[0]) {
@@ -335,7 +336,8 @@
 	   * pos.
 	   */
 	  else if (worm[str].color == color
-		   && worm[str].attack_codes[0] != 0) {
+		   && worm[str].attack_codes[0] != 0
+		   && worm[str].defense_points[0] != pos) {
 	    int acode = attack(str, NULL);
 	    if (acode < worm[str].attack_codes[0]) {
 	      int defense_works = 1;
@@ -782,6 +784,11 @@
 	if (defense_point != NO_MOVE)
 	  change_defense(str, defense_point, dcode);
       }
+/* This code doesn't give us nearly anything at all and costs some time.
+ * All defending moves should be found directly. On whole regression it
+ * gives only a few hits and doesn't change a result of any test.
+ */
+#if 0
       else {
 	/* If the point of attack is not adjacent to the worm, 
 	 * it is possible that this is an overlooked point of
@@ -799,6 +806,7 @@
 	    popgo();
 	  }
       }
+#endif
     }
   }
   gg_assert(stackp == 0);
@@ -852,7 +860,8 @@
       if (worm[str].defense_codes[0] && !defense_move_known(pos, str)
 	  && !discarded_move_known(pos, MAX_TACTICAL_POINTS,
 				   worm[str].discarded_defenses)) {
-	if (trymove(pos, color, "make_worms", NO_MOVE)) {
+	if (fastlib(pos, other, 0) != 1
+	    && trymove(pos, color, "make_worms", NO_MOVE)) {
 	  if (countlib(pos) > 1) {
 	    acode = attack(str, NULL);
 	    if (acode != WIN)
