diff --git a/doc/gen-vm-docs.cs b/doc/gen-vm-docs.cs
new file mode 100644
index 000000000..1cdb59acb
--- /dev/null
+++ b/doc/gen-vm-docs.cs
@@ -0,0 +1,99 @@
+namespace GtkSharp.Docs {
+
+ using System;
+ using System.Collections;
+ using System.IO;
+ using System.Reflection;
+ using System.Xml;
+ using System.Xml.XPath;
+
+ public class GenVMDocs {
+
+ public static int Main (string[] args)
+ {
+ string api_filename = "";
+ XmlDocument api_doc = new XmlDocument ();
+
+ BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly;
+ foreach (string arg in args) {
+
+ Assembly assembly;
+ try {
+ assembly = Assembly.LoadFile (arg);
+ } catch (XmlException e) {
+ Console.WriteLine (e);
+ return 1;
+ }
+
+ foreach (Type t in assembly.GetTypes ()) {
+ if (!t.IsSubclassOf (typeof (GLib.Object)))
+ continue;
+
+ Hashtable sigs = new Hashtable ();
+
+ foreach (EventInfo ei in t.GetEvents (flags)) {
+ foreach (Attribute attr in ei.GetCustomAttributes (false)) {
+ if (attr.ToString () == "GLib.SignalAttribute") {
+ sigs [((GLib.SignalAttribute) attr).CName] = ei.Name;
+ break;
+ }
+ }
+ }
+
+ if (sigs.Count == 0) continue;
+
+ Hashtable vms = new Hashtable ();
+
+ foreach (MethodInfo mi in t.GetMethods (flags)) {
+ foreach (Attribute attr in mi.GetCustomAttributes (false)) {
+ if (attr.ToString () == "GLib.DefaultSignalHandlerAttribute") {
+ string conn_name = ((GLib.DefaultSignalHandlerAttribute) attr).ConnectionMethod;
+ if (sigs.ContainsValue (conn_name.Substring (8)))
+ vms [mi.Name] = conn_name.Substring (8);
+ break;
+ }
+ }
+ }
+
+ if (vms.Count == 0) continue;
+
+ string filename = "en/" + t.Namespace + "/" + t.Name + ".xml";
+
+ try {
+ Stream stream = File.OpenRead (filename);
+ api_doc.Load (stream);
+ stream.Close ();
+ Console.WriteLine ("opened:" + filename);
+ } catch (XmlException e) {
+ Console.WriteLine (e);
+ return 1;
+ }
+
+ XPathNavigator api_nav = api_doc.CreateNavigator ();
+
+ foreach (string vm in vms.Keys) {
+
+ XPathNodeIterator iter = api_nav.Select ("/Type/Members/Member[@MemberName='" + vm + "']");
+ if (iter.MoveNext ()) {
+ XmlElement elem = ((IHasXmlNode)iter.Current).GetNode () as XmlElement;
+ XmlElement summ = elem ["Docs"] ["summary"];
+ XmlElement rem = elem ["Docs"] ["remarks"];
+ string summary = summ.InnerXml;
+ string remarks = rem.InnerXml;
+ if (summary == "To be added" && remarks == "To be added") {
+ summ.InnerXml = "Default handler for the event.";
+ rem.InnerXml = "Override this method in a subclass to provide a default handler for the event.";
+ } else
+ Console.WriteLine ("Member had docs:" + vm);
+ } else {
+ Console.WriteLine ("Member not found:" + vm);
+ }
+
+ api_doc.Save (filename);
+ }
+ }
+ }
+ return 0;
+ }
+ }
+}