diff --git a/src/builtin_functions.c b/src/builtin_functions.c
index ae9600155c29a0b1f013956122a6d3f8406924d5..3f2714ca4339c207934c652523e3f75a298e4a3e 100644
--- a/src/builtin_functions.c
+++ b/src/builtin_functions.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: builtin_functions.c,v 1.352 2001/03/11 22:50:36 grubba Exp $");
+RCSID("$Id: builtin_functions.c,v 1.353 2001/03/17 16:37:41 grubba Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "pike_macros.h"
@@ -2445,6 +2445,13 @@ static node *fix_overloaded_type(node *n, int lfun, const char *deftype, int def
   t=first_arg[0]->type;
   if(!t || match_types(t, object_type_string))
   {
+#ifdef USE_PIKE_TYPE
+    /* Skip any name-nodes. */
+    while(t && t->type == PIKE_T_NAME) {
+      t = t->cdr;
+    }
+#endif /* USE_PIKE_TYPE */
+    /* FIXME: Ought to handle or-nodes here. */
     if(t && (
 #ifdef USE_PIKE_TYPE
 	     t->type
@@ -7451,7 +7458,7 @@ void init_builtin_efuns(void)
 
   ADD_EFUN("_refs",f__refs,tFunc(tRef,tInt),OPT_EXTERNAL_DEPEND);
   ADD_EFUN("_leak",f__leak,tFunc(tRef,tInt),OPT_EXTERNAL_DEPEND);
-  ADD_EFUN("_typeof",f__typeof,tFunc(tMix,tType),0);
+  ADD_EFUN("_typeof", f__typeof, tFunc(tSetvar(0, tMix), tType(tVar(0))), 0);
 
   /* class __master
    * Used to prototype the master object.
diff --git a/src/encode.c b/src/encode.c
index 28a8f2fe905db45ffab2d5690d2eee9828722dd5..ff1ef7ef18722bee035d95cfae9aa17de5e37da9 100644
--- a/src/encode.c
+++ b/src/encode.c
@@ -25,7 +25,7 @@
 #include "version.h"
 #include "bignum.h"
 
-RCSID("$Id: encode.c,v 1.91 2001/03/17 00:02:08 grubba Exp $");
+RCSID("$Id: encode.c,v 1.92 2001/03/17 16:37:42 grubba Exp $");
 
 /* #define ENCODE_DEBUG */
 
@@ -312,6 +312,7 @@ static void encode_type(struct pike_type *t, struct encode_data *data)
       t = t->cdr;
       goto one_more_type;
 
+    case T_TYPE:
     case T_ARRAY:
     case T_MULTISET:
     case T_NOT:
@@ -404,6 +405,7 @@ one_more_type:
     case T_AND:
       t += low_encode_type(t, data);
 
+    case T_TYPE:
     case T_ARRAY:
     case T_MULTISET:
     case T_NOT:
@@ -1197,6 +1199,7 @@ one_more_type:
       goto one_more_type;
 #endif /* USE_PIKE_TYPE */
 
+    case T_TYPE:
     case T_ARRAY:
     case T_MULTISET:
     case T_NOT:
@@ -1248,7 +1251,6 @@ one_more_type:
     case '8':
     case '9':
     case T_FLOAT:
-    case T_TYPE:
     case T_STRING:
     case T_PROGRAM:
     case T_MIXED:
diff --git a/src/operators.c b/src/operators.c
index 36d733ea1323f9e1e077b7f8aceb9d762e75cc7c..0e765b408f303776bc3e2e2d97fb49e40d6e5c56 100644
--- a/src/operators.c
+++ b/src/operators.c
@@ -6,7 +6,7 @@
 /**/
 #include "global.h"
 #include <math.h>
-RCSID("$Id: operators.c,v 1.129 2001/03/04 19:27:18 mirar Exp $");
+RCSID("$Id: operators.c,v 1.130 2001/03/17 16:37:42 grubba Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "multiset.h"
@@ -3409,7 +3409,8 @@ void init_operators(void)
 			tVar(0), tVar(0),tInt01),
 		 tFuncV(tOr3(tObj,tProgram,tFunction) tMix,tMix,tInt01),
 		 tFuncV(tMix tOr3(tObj,tProgram,tFunction),tMix,tInt01),
-		 tFuncV(tType tType,tOr3(tProgram,tFunction,tType),tInt01)),
+		 tFuncV(tType(tMix) tType(tMix),
+			tOr3(tProgram,tFunction,tType(tMix)),tInt01)),
 	    OPT_WEAK_TYPE|OPT_TRY_OPTIMIZE,optimize_eq,generate_comparison);
   /* function(mixed...:int) */
   ADD_EFUN2("`!=",f_ne,
@@ -3419,7 +3420,8 @@ void init_operators(void)
 			tVar(0), tVar(0),tInt01),
 		 tFuncV(tOr3(tObj,tProgram,tFunction) tMix,tMix,tInt01),
 		 tFuncV(tMix tOr3(tObj,tProgram,tFunction),tMix,tInt01),
-		 tFuncV(tType tType,tOr3(tProgram,tFunction,tType),tInt01)),
+		 tFuncV(tType(tMix) tType(tMix),
+			tOr3(tProgram,tFunction,tType(tMix)),tInt01)),
 	    OPT_WEAK_TYPE|OPT_TRY_OPTIMIZE,0,generate_comparison);
   /* function(mixed:int) */
   ADD_EFUN2("`!",f_not,tFuncV(tMix,tVoid,tInt01),
@@ -3499,7 +3501,7 @@ multiset & mapping -> mapping
 		     F_AND_TYPE(tMapping),
 		     F_AND_TYPE(tMultiset),
 		     F_AND_TYPE(tString),
-		     F_AND_TYPE(tOr(tType,tPrg)) ),
+		     F_AND_TYPE(tOr(tType(tMix),tPrg)) ),
 
 	       tIfnot(tFuncV(tNone, tNot(tMapping), tMix),
 		      tFuncV(tNone,
@@ -3517,7 +3519,7 @@ multiset & mapping -> mapping
        tFuncV(tSetvar(3,tMultiset),tSetvar(4,tMultiset),tOr(tVar(3),tVar(4))),	\
        tFuncV(tSetvar(5,tArray),tSetvar(6,tArray),tOr(tVar(5),tVar(6))),	\
        tFuncV(tString,tString,tString),						\
-       tFuncV(tOr(tType,tPrg),tOr(tType,tPrg),tType))
+       tFuncV(tOr(tType(tMix),tPrg),tOr(tType(tMix),tPrg),tType(tMix)))
 
   ADD_EFUN2("`|",f_or,LOG_TYPE,OPT_TRY_OPTIMIZE,optimize_binary,generate_or);
 
@@ -3593,7 +3595,7 @@ multiset & mapping -> mapping
 		 tFunc(tInt,tInt),
 		 tFunc(tFlt,tFlt),
 		 tFunc(tStr,tStr),
-		 tFunc(tOr(tType,tProgram),tType)),
+		 tFunc(tOr(tType(tMix),tProgram),tType(tMix))),
 	    OPT_TRY_OPTIMIZE,0,generate_compl);
   /* function(string|multiset|array|mapping|object:int) */
   ADD_EFUN2("sizeof", f_sizeof,
diff --git a/src/pike_types.c b/src/pike_types.c
index 651b31a9221c54d0b6bd15e27a79c8f085c94427..1c576af612cd1038cd40d8c9359249d76a6d43eb 100644
--- a/src/pike_types.c
+++ b/src/pike_types.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: pike_types.c,v 1.161 2001/03/05 21:32:52 grubba Exp $");
+RCSID("$Id: pike_types.c,v 1.162 2001/03/17 16:37:43 grubba Exp $");
 #include <ctype.h>
 #include "svalue.h"
 #include "pike_types.h"
@@ -416,6 +416,11 @@ void push_scope_type(int level)
 
 void push_assign_type(int marker)
 {
+#ifdef PIKE_DEBUG
+  if ((marker < '0') || (marker > '9')) {
+    fatal("Bad assign marker: %d\n", marker);
+  }
+#endif /* PIKE_DEBUG */
   *Pike_compiler->type_stackp = mk_type(T_ASSIGN,
 					(void *)(ptrdiff_t)marker,
 					*Pike_compiler->type_stackp,
@@ -463,6 +468,7 @@ void push_type(unsigned INT16 type)
   case T_ARRAY:
   case T_MULTISET:
   case T_NOT:
+  case T_TYPE:
     /* Make a new type of the top type, and put it in car. */
     *Pike_compiler->type_stackp = mk_type(type,
 					  *Pike_compiler->type_stackp, NULL,
@@ -481,7 +487,6 @@ void push_type(unsigned INT16 type)
 
   case T_FLOAT:
   case T_STRING:
-  case T_TYPE:
   case T_PROGRAM:
   case T_MIXED:
   case T_VOID:
@@ -531,6 +536,7 @@ void pop_type_stack(void)
   case T_ARRAY:
   case T_MULTISET:
   case T_NOT:
+  case T_TYPE:
     /* car */
     push_finished_type(top->car);
     break;
@@ -543,7 +549,6 @@ void pop_type_stack(void)
   case T_OBJECT:
   case T_FLOAT:
   case T_STRING:
-  case T_TYPE:
   case T_PROGRAM:
   case T_MIXED:
   case T_VOID:
@@ -831,7 +836,8 @@ static void internal_parse_typeA(char **_s)
 	push_reverse_type(T_TUPLE);
 	break;
       }
-      if(!strcmp(buf,"type")) { push_type(T_TYPE); break; }
+      /* FIXME: Handle type(T) */
+      if(!strcmp(buf,"type")) { push_type(T_MIXED); push_type(T_TYPE); break; }
       goto bad_type;
 
     case 'm':
@@ -1123,7 +1129,11 @@ void simple_describe_type(struct pike_type *s)
 	}
       case T_FLOAT: printf("float"); break;
       case T_STRING: printf("string"); break;
-      case T_TYPE: printf("type"); break;
+      case T_TYPE:
+	printf("type(");
+	simple_describe_type(s->car);
+	printf(")");
+	break;
       case T_PROGRAM: printf("program"); break;
       case T_OBJECT:
 	printf("object(%s %ld)",
@@ -1269,7 +1279,11 @@ static void low_describe_type(struct pike_type *t)
       break;
 
     case T_STRING: my_strcat("string"); break;
-    case T_TYPE: my_strcat("type"); break;
+    case T_TYPE:
+      my_strcat("type(");
+      my_describe_type(t->car);
+      my_strcat(")");
+      break;
 
     case PIKE_T_NAME:
       if (!((struct pike_string *)t->car)->size_shift) {
@@ -1643,7 +1657,6 @@ static int lower_and_pike_types(struct pike_type *t1, struct pike_type *t2)
     break;
   case T_PROGRAM:
   case T_STRING:
-  case T_TYPE:
   case T_FLOAT:
   case T_INT:
     even_lower_and_pike_types(t1, t2);
@@ -1675,7 +1688,6 @@ static int low_and_push_complex_pike_type(struct pike_type *type)
   case T_ZERO:
   case T_PROGRAM:
   case T_STRING:
-  case T_TYPE:
   case T_FLOAT:
   case T_INT:
     /* Simple type. Already handled. */
@@ -1751,7 +1763,6 @@ static void low_and_pike_types(struct pike_type *t1,
   }
   else if((t1->type == t2->type) &&
 	  ((t1->type == T_STRING) ||
-	   (t1->type == T_TYPE) ||
 	   (t1->type == T_FLOAT) ||
 	   (t1->type == T_PROGRAM)))
   {
@@ -2301,6 +2312,7 @@ static struct pike_type *low_match_types2(struct pike_type *a,
   }
     
 
+  case T_TYPE:
   case T_MULTISET:
   case T_ARRAY:
     if(!low_match_types(a->car, b->car,
@@ -2308,7 +2320,6 @@ static struct pike_type *low_match_types2(struct pike_type *a,
 
   case T_FLOAT:
   case T_STRING:
-  case T_TYPE:
   case T_PROGRAM:
   case T_ZERO:
   case T_VOID:
@@ -2828,6 +2839,7 @@ static int low_pike_types_le2(struct pike_type *a, struct pike_type *b,
   }
     
 
+  case T_TYPE:
   case T_MULTISET:
   case T_ARRAY:
     a = a->car;
@@ -2837,7 +2849,6 @@ static int low_pike_types_le2(struct pike_type *a, struct pike_type *b,
 
   case T_FLOAT:
   case T_STRING:
-  case T_TYPE:
   case T_PROGRAM:
   case T_ZERO:
   case T_VOID:
@@ -3740,6 +3751,12 @@ struct pike_type *get_type_of_svalue(struct svalue *s)
     return pop_unfinished_type();
   }
 
+  case T_TYPE:
+    type_stack_mark();
+    push_finished_type(s->u.type);
+    push_type(T_TYPE);
+    return pop_unfinished_type();
+
   default:
     type_stack_mark();
     push_type(s->type);
@@ -3921,6 +3938,7 @@ static struct pike_type *low_make_pike_type(unsigned char *type_string,
 		   low_make_pike_type(*cont, cont), PT_COPY_BOTH);
   case T_ARRAY:
   case T_MULTISET:
+  case T_TYPE:
   case T_NOT:
     /* Single type */
     return mk_type(type, low_make_pike_type(type_string+1, cont), NULL,
@@ -3941,7 +3959,6 @@ static struct pike_type *low_make_pike_type(unsigned char *type_string,
 
   case T_FLOAT:
   case T_STRING:
-  case T_TYPE:
   case T_PROGRAM:
   case T_MIXED:
   case T_VOID:
@@ -4111,6 +4128,7 @@ one_more_type:
       
     case T_ARRAY:
     case T_MULTISET:
+    case T_TYPE:
     case T_NOT:
       goto one_more_type;
       
@@ -4126,7 +4144,6 @@ one_more_type:
     case '9':
     case T_FLOAT:
     case T_STRING:
-    case T_TYPE:
     case T_PROGRAM:
     case T_MIXED:
     case T_VOID:
@@ -4482,7 +4499,8 @@ static void internal_parse_typeA(char **_s)
 	push_type(T_TUPLE);
 	break;
       }
-      if(!strcmp(buf,"type")) { push_type(T_TYPE); break; }
+      /* FIXME: Support for type(T). */
+      if(!strcmp(buf,"type")) { push_type(T_MIXED); push_type(T_TYPE); break; }
       goto bad_type;
 
     case 'm':
@@ -4822,7 +4840,11 @@ static char *low_describe_type(char *t)
       /* Prog id */
       break;
     case T_STRING: my_strcat("string"); break;
-    case T_TYPE: my_strcat("type"); break;
+    case T_TYPE:
+      my_strcat("type(");
+      t = low_describe_type(t);
+      my_strcat(")");
+      break;
       
     case T_FUNCTION:
     {
@@ -5217,7 +5239,6 @@ static int lower_and_pike_types(char *t1, char *t2)
     break;
   case T_PROGRAM:
   case T_STRING:
-  case T_TYPE:
   case T_FLOAT:
   case T_INT:
     even_lower_and_pike_types(t1, t2);
@@ -5250,7 +5271,6 @@ static int low_and_push_complex_pike_type(char *type)
   case T_ZERO:
   case T_PROGRAM:
   case T_STRING:
-  case T_TYPE:
   case T_FLOAT:
   case T_INT:
     /* Simple type. Already handled. */
@@ -5328,7 +5348,6 @@ static void low_and_pike_types(char *t1, char *t2)
     push_type(T_SCOPE);
   }
   else if((EXTRACT_UCHAR(t1)==T_STRING && EXTRACT_UCHAR(t2)==T_STRING) ||
-	  (EXTRACT_UCHAR(t1)==T_TYPE && EXTRACT_UCHAR(t2)==T_TYPE) ||
 	  (EXTRACT_UCHAR(t1)==T_FLOAT && EXTRACT_UCHAR(t2)==T_FLOAT) ||
 	  (EXTRACT_UCHAR(t1)==T_PROGRAM && EXTRACT_UCHAR(t2)==T_PROGRAM))
   {
@@ -5867,13 +5886,13 @@ static char *low_match_types2(char *a,char *b, int flags)
   }
     
 
+  case T_TYPE:
   case T_MULTISET:
   case T_ARRAY:
     if(!low_match_types(++a,++b,flags & ~(A_EXACT|B_EXACT))) return 0;
 
   case T_FLOAT:
   case T_STRING:
-  case T_TYPE:
   case T_PROGRAM:
   case T_ZERO:
   case T_VOID:
@@ -6379,13 +6398,13 @@ static int low_pike_types_le2(char *a, char *b,
   }
     
 
+  case T_TYPE:
   case T_MULTISET:
   case T_ARRAY:
     if(!low_pike_types_le(++a, ++b, 0, flags)) return 0;
 
   case T_FLOAT:
   case T_STRING:
-  case T_TYPE:
   case T_PROGRAM:
   case T_ZERO:
   case T_VOID:
@@ -7256,6 +7275,12 @@ struct pike_type *get_type_of_svalue(struct svalue *s)
     return pop_unfinished_type();
   }
 
+  case T_TYPE:
+    type_stack_mark();
+    push_finished_type(s->u.type);
+    push_type(T_TYPE);
+    return pop_unfinished_type();
+
   default:
     type_stack_mark();
     push_type(s->type);
@@ -7461,7 +7486,7 @@ void init_types(void)
   multiset_type_string = CONSTTYPE(tMultiset);
   mapping_type_string = CONSTTYPE(tMapping);
   function_type_string = CONSTTYPE(tFunction);
-  type_type_string = CONSTTYPE(tType);
+  type_type_string = CONSTTYPE(tType(tMix));
   void_type_string = CONSTTYPE(tVoid);
   zero_type_string = CONSTTYPE(tZero);
   any_type_string = CONSTTYPE(tOr(tVoid,tMix));
diff --git a/src/svalue.h b/src/svalue.h
index b8293d32163cda414efa55591d1feff20161b3b0..e75d460f7abef3df192f7cc45c97c414c4652dca 100644
--- a/src/svalue.h
+++ b/src/svalue.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: svalue.h,v 1.79 2001/03/09 02:27:57 hubbe Exp $
+ * $Id: svalue.h,v 1.80 2001/03/17 16:37:43 grubba Exp $
  */
 #ifndef SVALUE_H
 #define SVALUE_H
@@ -138,7 +138,7 @@ struct svalue
 #define tProgram "\005"
 #define tStr "\006"
 #define tString "\006"
-#define tType "\007"
+#define tType(T) "\007" T
 #define tInt "\010\200\000\000\000\177\377\377\377"
 #define tInt0 "\010\000\000\000\000\000\000\000\000"
 #define tInt1 "\010\000\000\000\001\000\000\000\001"