diff --git a/src/language.yacc b/src/language.yacc
index 88c2f86dd1549d14565d873661c687fc557899a4..56ff373b6b161522024e3669215be6af37a3fe8d 100644
--- a/src/language.yacc
+++ b/src/language.yacc
@@ -113,7 +113,7 @@
 /* This is the grammar definition of Pike. */
 
 #include "global.h"
-RCSID("$Id: language.yacc,v 1.276 2002/05/05 13:03:42 mast Exp $");
+RCSID("$Id: language.yacc,v 1.277 2002/05/05 16:31:06 mast Exp $");
 #ifdef HAVE_MEMORY_H
 #include <memory.h>
 #endif
@@ -3258,6 +3258,13 @@ idents: low_idents
     copy_shared_string(Pike_compiler->last_identifier, $2->u.sval.u.string);
     free_node($2);
   }
+  | TOK_GLOBAL '.' TOK_IDENTIFIER
+  {
+    $$ = resolve_identifier ($3->u.sval.u.string);
+    if(Pike_compiler->last_identifier) free_string(Pike_compiler->last_identifier);
+    copy_shared_string(Pike_compiler->last_identifier, $3->u.sval.u.string);
+    free_node ($3);
+  }
   | idents '.' bad_identifier {}
   | idents '.' error {}
   ;
diff --git a/src/program.c b/src/program.c
index 5e41fb83730c19706d50e85295c66e90117948bb..43c0ee04c22973b75f9c1ede9fb1b25198ef6cb2 100644
--- a/src/program.c
+++ b/src/program.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: program.c,v 1.422 2002/05/01 21:25:55 mast Exp $");
+RCSID("$Id: program.c,v 1.423 2002/05/05 16:31:07 mast Exp $");
 #include "program.h"
 #include "object.h"
 #include "dynamic_buffer.h"
@@ -950,6 +950,8 @@ static struct node_s *index_modules(struct pike_string *ident,
   return 0;
 }
 
+struct node_s *resolve_identifier(struct pike_string *ident);
+
 struct node_s *find_module_identifier(struct pike_string *ident,
 				      int see_inherit)
 {
@@ -1014,6 +1016,13 @@ struct node_s *find_module_identifier(struct pike_string *ident,
     return mkconstantsvaluenode(&s);
   }
 
+  return resolve_identifier(ident);
+}
+
+struct node_s *resolve_identifier(struct pike_string *ident)
+{
+  struct node_s *ret;
+
   if(resolve_cache)
   {
     struct svalue *tmp=low_mapping_string_lookup(resolve_cache,ident);
@@ -3197,11 +3206,10 @@ PMOD_EXPORT int quick_map_variable(char *name,
 
 #ifdef PROGRAM_BUILD_DEBUG
   {
-    fprintf (stderr, "%.*sdefining variable (pass=%d): ",
-	     compilation_depth, "                ", Pike_compiler->compiler_pass);
-    push_string (describe_type (t));
-    print_svalue (stderr, Pike_sp - 1);
-    pop_stack();
+    struct pike_string *d = describe_type (t);
+    fprintf (stderr, "%.*sdefining variable (pass=%d): %s ",
+	     compilation_depth, "                ", Pike_compiler->compiler_pass, d->str);
+    free_string (d);
     push_string (n);
     print_svalue (stderr, --Pike_sp);
     putc ('\n', stderr);
@@ -3228,11 +3236,10 @@ int define_variable(struct pike_string *name,
 
 #ifdef PROGRAM_BUILD_DEBUG
   {
-    fprintf (stderr, "%.*sdefining variable (pass=%d): ",
-	     compilation_depth, "                ", Pike_compiler->compiler_pass);
-    push_string (describe_type (type));
-    print_svalue (stderr, Pike_sp - 1);
-    pop_stack();
+    struct pike_string *d = describe_type (type);
+    fprintf (stderr, "%.*sdefining variable (pass=%d): %s ",
+	     compilation_depth, "                ", Pike_compiler->compiler_pass, d->str);
+    free_string (d);
     push_string (name);
     print_svalue (stderr, --Pike_sp);
     putc ('\n', stderr);
diff --git a/src/program.h b/src/program.h
index 57fb4cd65b2b90b5fac53dbd3580d1052aac33f9..279dcbf72fff155dbf8d8ff29ded9a2fc98c907c 100644
--- a/src/program.h
+++ b/src/program.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: program.h,v 1.156 2002/04/09 10:33:56 mast Exp $
+ * $Id: program.h,v 1.157 2002/05/05 16:31:07 mast Exp $
  */
 #ifndef PROGRAM_H
 #define PROGRAM_H
@@ -452,6 +452,7 @@ void use_module(struct svalue *s);
 void unuse_modules(INT32 howmany);
 struct node_s *find_module_identifier(struct pike_string *ident,
 				      int see_inherit);
+struct node_s *resolve_identifier(struct pike_string *ident);
 struct program *parent_compilation(int level);
 struct program *id_to_program(INT32 id);
 void optimize_program(struct program *p);
diff --git a/src/testsuite.in b/src/testsuite.in
index 42cd7201531a11d2c86275a763a476c99f13371a..200dba50673e6cb3eedff073e405004e7a8d2968 100644
--- a/src/testsuite.in
+++ b/src/testsuite.in
@@ -1,4 +1,4 @@
-test_true([["$Id: testsuite.in,v 1.509 2002/05/05 13:03:42 mast Exp $"]]);
+test_true([["$Id: testsuite.in,v 1.510 2002/05/05 16:31:08 mast Exp $"]]);
 
 cond([[all_constants()->_verify_internals]],
 [[
@@ -2143,7 +2143,19 @@ test_program([[
   int a() {return X()->Y()->f() == "XAYBB";}
 ]])
 
-// Testing global::
+test_program([[
+  class A {
+    string s = "A";
+  }
+  inherit A;
+  class X {
+    constant s = "X";
+    mixed f (string s) {return s + X::s + A::s;}
+  }
+  int a() {return X()->f("L") == "LXA";}
+]])
+
+// Testing 'global::'
 
 test_equal([[
   compile_string (#"
@@ -2177,6 +2189,45 @@ test_equal([[
     }")()->X()->f (33);
 ]], ({23, 24, 32, 33}))
 
+// Testing 'global.'
+
+test_compile([[
+  mixed a() {return global.Parser.HTML;}
+]], 0);
+
+test_compile_error([[
+  #pike 7.2
+  mixed a() {return global.Parser.HTML;}
+]], 0);
+
+test_any([[
+  if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n");
+  return compile_string (#"
+    class Parser {constant HTML = 1;}
+    mixed foo() {return programp (Parser.HTML);}")()->foo();
+]], 0);
+
+test_any([[
+  if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n");
+  return compile_string (#"
+    mixed foo() {return programp (Parser.HTML);}
+    class Parser {constant HTML = 1;}")()->foo();
+]], 0);
+
+test_any([[
+  if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n");
+  return compile_string (#"
+    class Parser {constant HTML = 1;}
+    mixed foo() {return programp (global.Parser.HTML);}")()->foo();
+]], 1);
+
+test_any([[
+  if (!programp (Parser.HTML)) error ("This test uses the existence of Parser.HTML.\n");
+  return compile_string (#"
+    mixed foo() {return programp (global.Parser.HTML);}
+    class Parser {constant HTML = 1;}")()->foo();
+]], 1);
+
 // testing virtual overloading
 test_any([[
 class fnord