diff --git a/lib/modules/Protocols.pmod/X.pmod/Requests.pmod b/lib/modules/Protocols.pmod/X.pmod/Requests.pmod
index bf68109b7ae973611cb3caeb56c1dc6961e019af..aa9d8f89160885731902126347c0ef3ac93beb0a 100644
--- a/lib/modules/Protocols.pmod/X.pmod/Requests.pmod
+++ b/lib/modules/Protocols.pmod/X.pmod/Requests.pmod
@@ -751,6 +751,26 @@ class AllocColor
   }
 }
 
+class CreateGlyphCursor
+{
+  inherit request;
+  constant reqType = 94;
+
+  int cid;
+  int sourcefont, maskfont;
+  int sourcechar, maskchar;
+  int forered, foregreen, foreblue;
+  int backred, backgreen, backblue;
+
+  string to_string()
+  {
+    return build_request(sprintf("%4c%4c%4c%2c%2c%2c%2c%2c%2c%2c%2c",
+				 cid, sourcefont, maskfont, sourcechar,
+				 maskchar, forered, foregreen, foreblue,
+				 backred, backgreen, backblue));
+  }
+}
+
 class QueryExtension
 {
   inherit request;
diff --git a/lib/modules/Protocols.pmod/X.pmod/Types.pmod b/lib/modules/Protocols.pmod/X.pmod/Types.pmod
index 19a39b6eb8904f534a9bbebe901625c9924bc670..11b5528d6d5e747fe544c519f0002bcc57541241 100644
--- a/lib/modules/Protocols.pmod/X.pmod/Types.pmod
+++ b/lib/modules/Protocols.pmod/X.pmod/Types.pmod
@@ -54,6 +54,18 @@ class Font
     display->send_request(req);
   }
 
+  object CreateGlyphCursor(int sourcechar, array(int)|void foreground,
+			   array(int)|void background)
+  {
+    return display->CreateGlyphCursor(this_object(), sourcechar, 0, 0,
+				      foreground, background);
+  }
+
+}
+
+class Cursor
+{
+  inherit XResource;
 }
 
 class Visual
diff --git a/lib/modules/Protocols.pmod/X.pmod/Xlib.pmod b/lib/modules/Protocols.pmod/X.pmod/Xlib.pmod
index 5bd5ee22fdb1d0b45f42222842c8139ccb3fd744..3fc864d923b9caea1cba1b35dd4ef4a6e9628b4b 100644
--- a/lib/modules/Protocols.pmod/X.pmod/Xlib.pmod
+++ b/lib/modules/Protocols.pmod/X.pmod/Xlib.pmod
@@ -901,4 +901,41 @@ class Display
     send_request(req);
     return Types.Font(this_object(), req->fid);
   }
+
+  object CreateGlyphCursor_req(object sourcefont, object maskfont,
+			       int sourcechar, int maskchar,
+			       array(int) foreground, array(int) background)
+  {
+    object req = Requests.CreateGlyphCursor();
+    req->cid = alloc_id();
+    req->sourcefont = sourcefont->id;
+    req->maskfont = maskfont->id;
+    req->sourcechar = sourcechar;
+    req->maskchar = maskchar;
+    req->forered = foreground[0];
+    req->foregreen = foreground[1];
+    req->foreblue = foreground[2];
+    req->backred = background[0];
+    req->backgreen = background[1];
+    req->backblue = background[2];
+    return req;
+  }
+
+  object CreateGlyphCursor(object sourcefont, int sourcechar,
+			   object|void maskfont, int|void maskchar,
+			   array(int)|void foreground,
+			   array(int)|void background)
+  {
+    if(!maskfont) {
+      maskfont = sourcefont;
+      if(!maskchar)
+	maskchar = sourcechar + 1;
+    }
+    object req = CreateGlyphCursor_req(sourcefont, maskfont,
+				       sourcechar, maskchar,
+				       foreground||({0,0,0}),
+				       background||({0xffff,0xffff,0xffff}));
+    send_request(req);
+    return Types.Cursor(this_object(), req->cid);
+  }
 }