diff --git a/src/ChangeLog b/src/ChangeLog
index e8023b919d62bcab8a7447ff71a01e451789ca4e..da17511e3725ab404a66b64a5738c95c1264502f 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -8,6 +8,17 @@ Sat Feb 10 21:43:42 1996  Fredrik Hubinette  <hubbe@sparky.signum.se>
 	* simulate.lpc: fixed an add_efun for exec
 	* Updated a LOT of docfiles.
 
+Sat Feb 10 02:26:25 1996  Fredrik Hubinette  <hubbe@tymin.signum.se>
+
+	* array.c: fixed a coredump when doing & on one compact and
+	  one noncompact array.
+	* language.y: fixed so that continue now always need a semicolon
+          after it.
+        * builtin_efuns.c: replace_many fixed.
+	* array.c: fix_type_field fixed.
+	* las.c: fixed node_is_equal, it can now see the differance between
+          different global variables :P
+
 Mon Nov 20 16:52:32 1995  Fredrik Hubinette  <hubbe@sparky.signum.se>
 
 	* builtin_efuns.c (replace_many): Fixed an array bound read.
diff --git a/src/array.c b/src/array.c
index ff504ba561f3c40d22e85ba66f04293fa58eef5d..76e6f2a1e762f6c29146f8fa2c4d4b136ea0ff51 100644
--- a/src/array.c
+++ b/src/array.c
@@ -962,7 +962,7 @@ void array_fix_type_field(struct array *v)
    break;
 
   default:
-    v->type_field=1 << v->array_type;
+    t=1 << v->array_type;
     for(e=0; e<v->size; e++)
     {
       if(! SHORT_ITEM(v)[e].refs)
@@ -973,6 +973,10 @@ void array_fix_type_field(struct array *v)
     }
 
   }
+#ifdef DEBUG
+  if(t & ~(v->type_field))
+    fatal("Type field out of order!\n");
+#endif
   v->type_field = t;
 }
 
@@ -1245,7 +1249,7 @@ struct array *array_zip(struct array *a, struct array *b,INT32 *zipper)
       }else{
 	if(b->array_type == T_MIXED)
 	{
-	  assign_svalue(ITEM(ret)+e, ITEM(a)+*zipper);
+	  assign_svalue_no_free(ITEM(ret)+e, ITEM(b)+~*zipper);
 	}else{
 	  assign_from_short_svalue_no_free(ITEM(ret)+e,
 				   SHORT_ITEM(b)+~*zipper,
diff --git a/src/builtin_efuns.c b/src/builtin_efuns.c
index 521705eff69ce9645721bb53577a62585edd3bd6..90507b5a82d29d993927b36842ca49c7fb6053b4 100644
--- a/src/builtin_efuns.c
+++ b/src/builtin_efuns.c
@@ -1071,7 +1071,9 @@ struct lpc_string * replace_many(struct lpc_string *str,
 	}
       }
       if(a<from->size &&
-	 !low_quick_binary_strcmp(v[a].ind->str,v[a].ind->len,s,length))
+	 length >= v[a].ind->len &&
+	 !low_quick_binary_strcmp(v[a].ind->str,v[a].ind->len,
+				  s,v[a].ind->len))
       {
 	c=v[a].ind->len;
 	if(!c) c=1;
diff --git a/src/language.y b/src/language.y
index 23dd5d1376449529643fe9a40c9fa5281a09b1c4..46739d6791214206fd05cc476215adeb0909cb67 100644
--- a/src/language.y
+++ b/src/language.y
@@ -615,8 +615,8 @@ statement: unused2 ';' { $$=$1; }
          | return ';'
 	 | block {}
          | foreach
-         | break
-         | continue
+         | break ';'
+         | continue ';'
          | error ';' { $$=0; }
   	 | ';' { $$=0; } 
          ;
diff --git a/src/las.c b/src/las.c
index 333ce0f661105f528e404f4b87ad2d5b9dddc071..8d3d7f8a9b5bc6c2334c95c2dc975df12e1d86e5 100644
--- a/src/las.c
+++ b/src/las.c
@@ -327,6 +327,7 @@ int node_is_eq(node *a,node *b)
   switch(a->token)
   {
   case F_LOCAL:
+  case F_IDENTIFIER:
     return a->u.number == b->u.number;
 
   case F_CAST:
diff --git a/src/test/create_testsuite b/src/test/create_testsuite
index b79a1b3adc7a25d090cec30f92d06e685e771c2c..3efeae6cb43b35648262606c244a1889ce3251cb 100755
--- a/src/test/create_testsuite
+++ b/src/test/create_testsuite
@@ -59,6 +59,11 @@ define(TESTNO,0)
 
 test_compile_error_low(master()->add_precompiled_program(\"/test\",compile_string(\"int foo() { return 17; }\",\"62\")))
 
+test_compile([[while(0)if(0)continue;else;]])
+test_program([[int b=1,c; int a() { c=b+2; return c==3; }]])
+test_true([[ ("foobar"/"o") & ({ "foo" }) ]])
+test_any([[ array a="foo bar"/" "; return sizeof(a & ({"foo"}))]],1)
+
 test_eq("\377"[0],255)
 test_do(add_efun("foo",clone(class {int i;})))
 test_eq(foo->i,0)