diff --git a/src/pike_types.c b/src/pike_types.c
index a0caa6386212b092fa926c259a09d77af2b504e3..3134547c3e38b11e68e2745d2a819837d2113653 100644
--- a/src/pike_types.c
+++ b/src/pike_types.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: pike_types.c,v 1.39 1998/04/14 22:10:49 hubbe Exp $");
+RCSID("$Id: pike_types.c,v 1.40 1998/04/16 01:23:02 hubbe Exp $");
 #include <ctype.h>
 #include "svalue.h"
 #include "pike_types.h"
@@ -1062,6 +1062,16 @@ static char *low_match_types(char *a,char *b, int flags)
     break;
 
   case T_OBJECT:
+#if 0
+    if(EXTRACT_INT(a+2) || EXTRACT_INT(b+2))
+    {
+      fprintf(stderr,"Type match1: ");
+      stupid_describe_type(a,type_length(a));
+      fprintf(stderr,"Type match2: ");
+      stupid_describe_type(b,type_length(b));
+    }
+#endif
+
     /* object(* 0) matches any object */
     if(!EXTRACT_INT(a+2) || !EXTRACT_INT(b+2)) break;
 
@@ -1081,11 +1091,11 @@ static char *low_match_types(char *a,char *b, int flags)
 
     {
       struct program *ap,*bp;
-      ap=id_to_program(EXTRACT_UCHAR(a+2));
-      bp=id_to_program(EXTRACT_UCHAR(b+2));
+      ap=id_to_program(EXTRACT_INT(a+2));
+      bp=id_to_program(EXTRACT_INT(b+2));
 
       if(!ap || !bp) break;
-      
+
       if(EXTRACT_UCHAR(a+1))
       {
 	if(!implements(ap,bp))
diff --git a/src/program.c b/src/program.c
index 848fa9222b357ddafea78b30de42c48098d3792b..f4f04f17c746d4f16bcb99b5b34988549cd1a7df 100644
--- a/src/program.c
+++ b/src/program.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: program.c,v 1.81 1998/04/15 02:11:24 grubba Exp $");
+RCSID("$Id: program.c,v 1.82 1998/04/16 01:23:03 hubbe Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -682,6 +682,9 @@ void check_program(struct program *p)
   INT32 size,e;
   unsigned INT32 checksum;
 
+  if(p->id > current_program_id)
+    fatal("Program id is out of sync! (p->id=%d, current_program_id=%d)\n",p->id,current_program_id);
+
   if(p->refs <=0)
     fatal("Program has zero refs.\n");
 
@@ -2490,6 +2493,7 @@ int implements(struct program *a, struct program *b)
   unsigned long hval;
   if(!a || !b) return -1;
   if(a==b) return 1;
+
   hval = a->id*9248339 + b->id;
   hval %= IMPLEMENTS_CACHE_SIZE;
   if(implements_cache[hval].aid==a->id && implements_cache[hval].bid==b->id)
@@ -2499,5 +2503,6 @@ int implements(struct program *a, struct program *b)
   /* Do it the tedious way */
   implements_cache[hval].aid=a->id;
   implements_cache[hval].bid=b->id;
-  return implements_cache[hval].ret=low_implements(a,b);
+  implements_cache[hval].ret=low_implements(a,b);
+  return implements_cache[hval].ret;
 }