diff --git a/src/post_modules/GTK/build_pgtk.pike b/src/post_modules/GTK/build_pgtk.pike
index f49a3c83278b7cf2300fdcad1bde1001772ee3f8..6e10e069370da2e231ef90f58abebd6616240932 100755
--- a/src/post_modules/GTK/build_pgtk.pike
+++ b/src/post_modules/GTK/build_pgtk.pike
@@ -409,6 +409,130 @@ int fnamesfun( string a, string b )
           classname(String.capitalize(lower_case(b))));
 }
 
+string wmml_section( string w, mapping data )
+{
+  string wmml;
+  if( w != "global" )
+  {
+    wmml = (
+            "<anchor name=\""+classname(w)+"\">\n"
+            "<section name=\""+classname(w)+"\" title=\""+classname(w)+"\">\n"
+            "<class name=\""+classname(w)+"\" title=\"  \">\n"
+            );
+  } else {
+   wmml="<section name=\"Toplevel functions\" title=\"Toplevel functions\">\n";
+  }
+
+
+                 //"<class name=\""+classname(w)+"\" title=\""+classname(w)+
+                 //                 "\">\n");
+
+  int global;
+
+  if(w == "global")
+    global = 1;
+  
+  wmml += (docs[w]||"");
+  if(!docs[w])
+    werror(lines[ w ]+
+           ": Warning: No documentation for class\n");
+
+  if( data["inherit"] )
+  {
+    wmml += "<p>Inherits <ref to=\""+classname( data["inherit"] )+"\"><br>";
+  }
+
+  foreach(sort(indices(struct)), string a)
+    if(struct[a]["inherit"] == w)
+      wmml += ("Inherited by <ref to="+classname( a )+"><br>");
+
+  if( data->create )
+  {
+    string a = true_types[w+"create"][1];
+    if( (a-" ") == "void"  )
+      a = "";
+    if( warn->noargs )
+      if(strlen(a) && !named[ w + "create" ] )
+        werror(lines[ w + "create" ]+": Warning: Arguments not named\n");
+    wmml += "<method name=\""+classname(w)+"\">";
+    wmml += "<man_syntax>";
+    wmml += classname( w )+" "+classname( w )+
+         "( "+replace( a, ",", ", ")+");<br>";
+    wmml += "</man_syntax>";
+    wmml += "<man_description>"+docs[w+"create"]+"</man_description></method>";
+
+    if(!docs[w+"create"])
+      werror(lines[ w + "create" ]+
+             ": Warning: No documentation for constructor\n");
+  }
+  foreach( sort(indices(data)-({"create","inherit","destroy"})), string fun )
+  {
+    string a = true_types[w+fun][1],
+           b = true_types[w+fun][0];
+    if( (a-" ") == "void"  )
+      a = "";
+    if( warn->noargs )
+      if(strlen(a) && !named[ w + fun ] )
+        werror(lines[w+fun]+": Warning: Arguments not named\n");
+    if(!docs[w+fun] || !strlen(docs[w+fun]))
+    {
+      if( warn->nodocs )
+        werror(lines[ w + fun ]+
+               ": Warning: No documentation for "+fun+"\n");
+    
+    } else if( warn->cstyle ) {
+      if( search(docs[w+fun], "GTK_") != -1)
+        if(search( docs[w+fun], "C-") == -1)
+          werror(lines[ w + fun ]+
+                 ": Warning: Possible C-style GTK constant name\n");
+      if( search(docs[w+fun], "gtk_") != -1)
+        if(search( docs[w+fun], "C-") == -1)
+          werror(lines[ w + fun ]+
+                 ": Warning: Possible C-style GTK function name\n");
+    }
+    wmml += ("\n\n<method name="+fun+" title=\"\">\n<man_syntax>\n  "+
+             "<b>"+b+" "+(global?"GTK.":"")+fun+"( "+
+             replace( a, ",",", ")+" );</b>"
+             "\n</man_syntax>\n" +
+             "<man_description>\n"+docs[w+fun]+"\n</man_description>\n"
+             "</method>\n");
+  }
+  if( w != "global" )
+    wmml += "</class></section></anchor>";
+  else
+    wmml += "</section>";
+  return wmml ;
+}
+
+string rec_make_wmml_tree( array plane, mapping t )
+{
+  string wmml="\n<ul>";
+  foreach(sort(plane), string n)
+  {
+    wmml += ("<li><ref to=\""+classname(n)+"\">");
+    if(t[n])
+      wmml += rec_make_wmml_tree( sort(t[n]), t );
+  }
+  return wmml+"</ul>\n";
+}
+
+void make_wmml_docs( array root_widgets, mapping inheriting )
+{
+  string wmml="<anchor name=GTK><chapter title=\"GTK Reference\">";
+  wmml += 
+       "<section title=\"GTK Inheritance Tree\" name=tree>\n"
+       + rec_make_wmml_tree( root_widgets, inheriting ) +
+       "\n</section>";
+
+  wmml += wmml_section( "global", struct->global );
+
+  array in_order = indices(struct);
+  sort( map(map( in_order, classname ),lower_case), in_order );
+  foreach(in_order, string s)
+    wmml += wmml_section( s, struct[s] );
+  Stdio.write_file( "wmml/gtk_reference.wmml", wmml+"</chapter></anchor>" );
+}
+
 int do_docs;
 array (string) sort_dependencies( array bunch, mapping extra )
 {
@@ -416,13 +540,22 @@ array (string) sort_dependencies( array bunch, mapping extra )
   foreach(bunch, string s)
   {
     if(inheriting[extra[s]["inherit"]])
-      inheriting[extra[s]["inherit"]]+=({ s });
+      inheriting[extra[s]["inherit"]] += ({ s });
     else
-      inheriting[extra[s]["inherit"]]=({ s });
+      inheriting[extra[s]["inherit"]] = ({ s });
   }
   array (string) result = sort(inheriting[0]);
 
-  if(do_docs)
+  if( mkwmml )
+  {
+    array roots=
+          indices(inheriting)-
+          `+(({}),@values(inheriting));;
+    foreach( roots, mixed q )
+      make_wmml_docs( inheriting[q], inheriting );
+  }
+
+  if(do_docs && !mkwmml)
   {
     multiset roots=
       mkmultiset(indices(inheriting))-mkmultiset(`+(@values(inheriting)));;
@@ -507,19 +640,18 @@ string make_example_image(string from, int top)
   object mei;
   if(!mei)
     mei = (object)("make_example_image.pike");
-  if(file_stat( "docs/"+mei->file_name(from)))
-    return mei->tags(from);
+  mei->wmml = mkwmml;
+  if(file_stat( (mkwmml?"wmml/gtkimg":"docs")+"/"+mei->file_name(from)))
+    return mei->tags( from );
 
-  if(!PIKE) 
+  if(!PIKE)
     find_pike();
 
   string res=Process.popen(PIKE+" "+dirname(__FILE__)+
                            "/make_example_image.pike '"+from+"'"+
-                           (top?" TOP":""));
+                           (top?" TOP":" POT") + (mkwmml?" WMML":" HTML"));
   if(!strlen(res))
-  {
     werror("Failed to make example image from '"+from+"'\n");
-  }
   return res;
 }
 
@@ -607,21 +739,34 @@ string build_cursor( string a )
   sscanf( a, "GDK.%s", a );
   num = master()->resolv("GDK")[a];
 
-  return "<tr bgcolor="+(odd++%2?"#f6e0d0":"#faebd7")+
-    "><td><font color=black>GDK."+a+"</font></td>"
-    "<td><img src=cursor_"+num+".gif></td>"
-    "<td><img src=cursor_"+num+"_inv.gif></td>"
-    "<td><img src=cursor_"+num+"_red.gif></td>"
-    "<td><img src=cursor_"+num+"_red_inv.gif></td>"
-    "<td><img src=cursor_"+num+"_green.gif></td>"
-    "<td><img src=cursor_"+num+"_green_inv.gif></td>"
-    "<td><img src=cursor_"+num+"_blue.gif></td>"
-    "<td><img src=cursor_"+num+"_blue_inv.gif></td>"
-    "</tr>";
+  if( mkwmml )
+    return "<tr><td>GDK."+a+"</td>"
+           "<td><img src=gtkimg/cursor_"+num+".gif></td>"
+           "<td><img src=gtkimg/cursor_"+num+"_inv.gif></td>"
+           "<td><img src=gtkimg/cursor_"+num+"_red.gif></td>"
+           "<td><img src=gtkimg/cursor_"+num+"_red_inv.gif></td>"
+           "<td><img src=gtkimg/cursor_"+num+"_green.gif></td>"
+           "<td><img src=gtkimg/cursor_"+num+"_green_inv.gif></td>"
+           "<td><img src=gtkimg/cursor_"+num+"_blue.gif></td>"
+           "<td><img src=gtkimg/cursor_"+num+"_blue_inv.gif></td>"
+           "</tr>";
+  else
+    return "<tr bgcolor="+(odd++%2?"#f6e0d0":"#faebd7")+
+           "><td><font color=black>GDK."+a+"</font></td>"
+           "<td><img src=cursor_"+num+".gif></td>"
+           "<td><img src=cursor_"+num+"_inv.gif></td>"
+           "<td><img src=cursor_"+num+"_red.gif></td>"
+           "<td><img src=cursor_"+num+"_red_inv.gif></td>"
+           "<td><img src=cursor_"+num+"_green.gif></td>"
+           "<td><img src=cursor_"+num+"_green_inv.gif></td>"
+           "<td><img src=cursor_"+num+"_blue.gif></td>"
+           "<td><img src=cursor_"+num+"_blue_inv.gif></td>"
+           "</tr>";
 }
 
 
 string dir;
+int mkwmml;
 int main(int argc, array argv)
 {
   string progname = "global", extra_cpp="";
@@ -637,6 +782,11 @@ int main(int argc, array argv)
       warn[w] = 1;
     if( sscanf( w, "--no-warn-%s", w ) )
       warn[w] = 0;
+    if( w=="--wmml" )
+    {
+      mkwmml=1;
+      do_docs=1;
+    }
   }
 
   dir = argv[1];
diff --git a/src/post_modules/GTK/make_example_image.pike b/src/post_modules/GTK/make_example_image.pike
index 0de47f425e7681395c16725dc33210afa2e5b977..8dfffa600bb6199f3137ca9f4972980abe4f04a5 100644
--- a/src/post_modules/GTK/make_example_image.pike
+++ b/src/post_modules/GTK/make_example_image.pike
@@ -74,12 +74,22 @@ string indent(string what, int|void limit)
 
 string tags(string source)
 {
-  return ("<table cellpadding=1 bgcolor=black><tr><td><table bgcolor=#e0e0e0 cellpadding=8 cellspacing=0 border=0><tr><td><img src="+file_name(source)+">"
-	"</td></td><tr><td><font size=-1><pre>"+
-	replace(indent(source), ({"<",">","&"}), ({"&lt;", "&gt;", "&amp;"}))+
-	"</pre></font></td></tr></table></td></tr></table>");
+  if( !wmml )
+  {
+    return ("<table cellpadding=1 bgcolor=black><tr><td><table bgcolor=#e0e0e0 cellpadding=8 cellspacing=0 border=0><tr><td><img src="+file_name(source)+">"
+            "</td></td><tr><td><font size=-1><pre>"+
+            replace(indent(source), ({"<",">","&"}), ({"&lt;", "&gt;", "&amp;"}))+
+            "</pre></font></td></tr></table></td></tr></table>");
+  } else {
+    return ("<table framed=1><tr><td><img src=gtkimg/"+file_name(source)+">"
+            "</td></tr><tr><td><font size=-1>"
+            "<example language=pike>"+
+            replace(indent(source), ({"<",">","&"}), ({"&lt;", "&gt;", "&amp;"}))+
+            "</example></font></td></tr></table>");
+  }
 }
 
+int wmml;
 void grab(object w)
 {
   object i = GTK.GdkImage();
@@ -91,13 +101,15 @@ void grab(object w)
   i->grab( w, 20,20, w->xsize()-40, w->ysize()-40);
   object i = Image.PNM.decode( i->get_pnm() );
 
-  mkdir("docs");
-  rm("docs/"+file_name(source));
+  mkdir(wmml?"wmml/gtkimg":"docs");
+  rm((wmml?"wmml/gtkimg/":"docs/")+file_name(source));
   function fun;
 #if constant(Image.GIF.encode)
-  Stdio.write_file("docs/"+file_name(source), Image.GIF.encode(i));
+  Stdio.write_file((wmml?"wmml/gtkimg/":"docs/")+
+                   file_name(source), Image.GIF.encode(i));
 #else
-  Stdio.write_file("docs/"+file_name(source), i->togif_fs());
+  Stdio.write_file((wmml?"wmml/gtkimg/":"docs/")+
+                   file_name(source), i->togif_fs());
 #endif
   write(tags( source ));
   
@@ -120,15 +132,19 @@ void show_recursively(object w)
 int main(int argc, array (string) argv)
 {
   object w;
+  werror("IMAGE ["+argv[1]+"]\n");
   if(!write) write = Stdio.stdout->write;
   source = argv[1];
-  if(file_stat( "docs/"+file_name(argv[1])))
+  wmml = (argv[3] == "WMML");
+
+  if(file_stat( (wmml?"wmml/gtkimg/":"docs/")+file_name(argv[1])))
   {
     write(tags(argv[1]));
     exit(0);
   }
   GTK.setup_gtk( "make_gtkexample", 1 );
-  if(argc == 2)
+
+  if(argv[2] != "TOP")
   {
     w = GTK.Window( GTK.WINDOW_TOPLEVEL );
     w->set_title("Example image generation");
@@ -136,7 +152,7 @@ int main(int argc, array (string) argv)
     w->set_border_width(20);
   } else {
     w = get_widget_from( argv[1] );
-    w->set_border_width(20);
+    w->set_border_width( 20 );
   }
   show_recursively( w );
   w->signal_connect( "event", got_event );