diff --git a/lib/modules/Tools.pmod/AutoDoc.pmod/BMMLParser.pike b/lib/modules/Tools.pmod/AutoDoc.pmod/BMMLParser.pike
index 1e651e3e4632d5de786861638d22c36096be067b..a12346ef44536c4a6844232072d99a0bad45e8f6 100644
--- a/lib/modules/Tools.pmod/AutoDoc.pmod/BMMLParser.pike
+++ b/lib/modules/Tools.pmod/AutoDoc.pmod/BMMLParser.pike
@@ -207,11 +207,15 @@ string url_quote(string s)
 		 
 }
 
-string mkdocument(string s,string title)
+string mkdocument(string s, string title, array(string)|void root)
 {
+  string namespace = "predef";
+  if (root && sizeof(root) && has_suffix(root[0], "::")) {
+    namespace = root[0][..<2];
+  }
   return string_to_utf8("<?xml version='1.0' encoding='utf-8'?>\n"
 			"<autodoc>"
-			"<namespace name='predef'>" +
+			"<namespace name='" + namespace + "'>" +
 			s+
 			"</namespace>"+
 			"</autodoc>\n");
@@ -364,9 +368,10 @@ string mkindex(string topic, int usehead)
 
 /* Convert a page */
 string convert_page(string path, string fname,
-		    string|void cont, .Flags|void flags)
+		    string|void cont, .Flags|void flags,
+		    array(string)|void root)
 {
-  string output, short;
+  string output, short = "";
   int headno;
   string name;
 
@@ -392,13 +397,17 @@ string convert_page(string path, string fname,
     array(string) module_path = name/".";
 
     if ((sizeof(parts) > 1) || (sizeof(module_path) > 1)) {
-      foreach(module_path; int i; string segment) {
-	string type = "module";
-	if (i == sizeof(module_path)-1) {
-	  type = "class";
+      if (name == "preprocessor") {
+	root = ({ "cpp::" });
+      } else {
+	foreach(module_path; int i; string segment) {
+	  string type = "module";
+	  if (i == sizeof(module_path)-1) {
+	    type = "class";
+	  }
+	  header += "<" + type + " name='" + html_quote(segment) + "'>\n";
+	  trailer = "</" + type + ">\n" + trailer;
 	}
-	header += "<" + type + " name='" + html_quote(segment) + "'>\n";
-	trailer = "</" + type + ">\n" + trailer;
       }
     } else if (known_constants[name]) {
       header += "<docgroup homogen-name='" + html_quote(name) +
@@ -418,6 +427,7 @@ string convert_page(string path, string fname,
     for(int partno=0; partno<sizeof(parts); partno++)
     {
       string part_name="error";
+      array(string) part_names;
       array(string) sections;
       string part;
       int section;
@@ -469,6 +479,8 @@ string convert_page(string path, string fname,
 	  
 	  rest="\t<tt>"+part_name+"</tt> - "+b;
 
+	  part_names = ({ part_name });
+
 	  // FALL_THROUGH
 	case "RETURN VALUE":
 	case "RETURN VALUES":
@@ -481,6 +493,15 @@ string convert_page(string path, string fname,
 	case "BUGS":
 	  rest=magic(rest, 0);
 	  break;
+	case "DIRECTIVE":
+	  if((sscanf(rest, "\t%s", part_name) != 1) &&
+	     (sscanf(rest,"    %*[\t ]%s", part_name) != 2))
+	    perror("Warning DIRECTIVE section broken!\n");
+
+	  part_names = map(part_name/"\n", String.trim_all_whites);
+
+	  rest = "";
+	  break;
 	case "NOTES":
 	case "NOTES, TODOs AND OTHER THINGS":
 	  type = "NOTES";
@@ -526,7 +547,6 @@ string convert_page(string path, string fname,
 
 	case "EXAMPLES":
 	case "EXAMPLE":
-	case "DIRECTIVE":
 	case "PREPROCESSOR DIRECTIVES":
 	  rest="<tt>"+magic(rest,1)+"</tt>";
 	  break;
@@ -577,17 +597,28 @@ string convert_page(string path, string fname,
 	// Empty part!
 	parts[partno] = "";
       }
-      if(partno && part_name)
-      {
-	parts[partno]="<docgroup homogen-name='" + part_name +
-	  "' homogen-type='method'>\n"
-	  "<method name='" + part_name + "'>" +
-	  // FIXME <returntype> & <arguments>.
-	  "</method>" + parts[partno] + "</docgroup>\n";
+      if(partno && part_names) {
+	if (sizeof(part_names) == 1) {
+	  parts[partno]="<docgroup homogen-name='" + part_name +
+	    "' homogen-type='method'>\n"
+	    "<method name='" + part_name + "'>\n" +
+	    // FIXME <returntype> & <arguments>.
+	    "</method>\n" + parts[partno] + "</docgroup>\n";
+	} else {
+	  // Multiple symbols documented at the same time.
+	  // Currently only used by the preprocessor doc.
+	  parts[partno]="<docgroup homogen-type='method'>\n"
+	    "<method name='" + part_names *
+	    ("'>\n" +
+	     // FIXME <returntype> & <arguments>.
+	     "</method>\n<method name='") + "'>\n" +
+	    // FIXME <returntype> & <arguments>.
+	    "</method>\n" + parts[partno] + "</docgroup>\n";
+	}
       }
     }
     output = mkdocument(header + parts*"\n" + trailer,
-			"Pike: " + name);
+			"Pike: " + name, root);
   }
   else if(path[strlen(path)-5..]==".bmml")
   {
@@ -661,7 +692,7 @@ string convert_page(string path, string fname,
     cont="<doc placeholder='true'><text><p>" + sections*"\n</p>\n<p>\n" +
       "</p></text></doc>\n";
 
-    return mkdocument(cont, title || "Pike manual");
+    return mkdocument(cont, title || "Pike manual", root);
 #else
     return "";
 #endif
@@ -725,7 +756,7 @@ string convert_page(string path, string fname,
       tmp+=line+"\n";
     }
     output=mkdocument(output,"Pike: "+
-		      replace((fname/"/")[-1],"_"," "));
+		      replace((fname/"/")[-1],"_"," "), root);
 #else
     return "";
 #endif
diff --git a/lib/modules/Tools.pmod/Standalone.pmod/extract_autodoc.pike b/lib/modules/Tools.pmod/Standalone.pmod/extract_autodoc.pike
index bef18eec0d97478cbc9a8b20dfb9dd2e327c5c16..17ea41cf485baeb6827e676489fb94d4222e416a 100644
--- a/lib/modules/Tools.pmod/Standalone.pmod/extract_autodoc.pike
+++ b/lib/modules/Tools.pmod/Standalone.pmod/extract_autodoc.pike
@@ -185,6 +185,11 @@ void recurse(string srcdir, string builddir, int root_ts, array(string) root)
       }
     }
     root_ts = st->mtime;
+  } else if (st = file_stat(srcdir+"/.bmmlrc")) {
+    if (Stdio.read_file(srcdir+"/.bmmlrc") == "prefix internal\n") {
+      root = ({ "c::" });
+    }
+    root_ts = st->mtime;
   }
 
   foreach(get_dir(builddir), string fn) {
@@ -495,7 +500,8 @@ string extract(string filename, string imgdest,
     }
     file = replace(file, "Myslq", "Mysql");
     Tools.AutoDoc.BMMLParser bmml_parser = Tools.AutoDoc.BMMLParser();
-    return bmml_parser->convert_page(filename, basename(filename), file, flags);
+    return bmml_parser->convert_page(filename, basename(filename), file,
+				     flags, root);
   }
 
   int i;