diff --git a/generator/Data/XCB/Python/Parse.hs b/generator/Data/XCB/Python/Parse.hs
--- a/generator/Data/XCB/Python/Parse.hs
+++ b/generator/Data/XCB/Python/Parse.hs
@@ -96,8 +96,9 @@
           globals = [mkDict "_events", mkDict "_errors"]
           name = xheader_header header
           add = [mkAddExt header]
-      parts <- mapM (processXDecl name) $ xheader_decls header
-      let (requests, decls) = collectBindings parts
+      partsList <- mapM (processXDecl name) $ xheader_decls header
+      let parts = concat partsList
+          (requests, decls) = collectBindings parts
           ext = if length requests > 0
                 then [mkClass (name ++ "Extension") "xcffib.Extension" requests]
                 else []
@@ -674,18 +675,18 @@
 
 processXDecl :: String
              -> XDecl
-             -> State TypeInfoMap BindingPart
+             -> State TypeInfoMap [BindingPart]
 processXDecl ext (XTypeDef name typ) =
   do modify $ \m -> mkModify ext name (m M.! typ) m
-     return Noop
+     return [Noop]
 processXDecl ext (XidType name) =
   -- http://www.markwitmer.com/guile-xcb/doc/guile-xcb/XIDs.html
   do modify $ mkModify ext name (BaseType "I")
-     return Noop
+     return [Noop]
 processXDecl _ (XImport n) =
-  return $ Declaration [ mkRelImport n]
+  return [Declaration [ mkRelImport n]]
 processXDecl _ (XEnum name membs) =
-  return $ Declaration [mkEnum name $ xEnumElemsToPyEnum id membs]
+  return [Declaration [mkEnum name $ xEnumElemsToPyEnum id membs]]
 processXDecl ext (XStruct n _ membs) = do
   m <- get
   let (statements, len) = mkStructStyleUnpack "" ext m membs
@@ -696,7 +697,7 @@
         let rhs = Int theLen
         return $ mkAssign "fixed_size" rhs
   modify $ mkModify ext n (CompositeType ext n)
-  return $ Declaration [mkXClass n "xcffib.Struct" False statements (pack : fixedLength ++ synthetic)]
+  return [Declaration [mkXClass n "xcffib.Struct" False statements (pack : fixedLength ++ synthetic)]]
 processXDecl ext (XEvent name opcode _ xge membs noSequence) = do
   m <- get
   let cname = name ++ "Event"
@@ -707,9 +708,9 @@
       eventsUpd = mkDictUpdate "_events" opcode cname
       isxge = fromMaybe False xge
       -- xgeexp = mkAssign "xge" (if fromMaybe False xge then (mkName "True") else (mkName "False"))
-  return $ Declaration [ mkXClass cname "xcffib.Event" isxge statements (pack : synthetic)
+  return [Declaration [ mkXClass cname "xcffib.Event" isxge statements (pack : synthetic)
                        , eventsUpd
-                       ]
+                       ]]
 processXDecl ext (XError name opcode _ membs) = do
   m <- get
   let cname = name ++ "Error"
@@ -718,10 +719,10 @@
       (statements, _) = mkStructStyleUnpack prefix ext m membs
       errorsUpd = mkDictUpdate "_errors" opcode cname
       alias = mkAssign ("Bad" ++ name) (mkName cname)
-  return $ Declaration [ mkXClass cname "xcffib.Error" False statements [pack]
+  return [Declaration [ mkXClass cname "xcffib.Error" False statements [pack]
                        , alias
                        , errorsUpd
-                       ]
+                       ]]
 processXDecl ext (XRequest name opcode _ membs reply) = do
   m <- get
   let
@@ -756,7 +757,13 @@
                                                    ++ [argChecked])
       requestBody = buf ++ packStmts ++ [ret]
       request = mkMethod name allArgs requestBody
-  return $ Request request replyDecl
+      baseArgs = ("self" : (filter (not . null) args))
+      checkedMethod = mkMethod (name ++ "Checked") baseArgs
+        [mkReturn $ mkCall ("self." ++ name) (map mkName (tail baseArgs) ++ [mkName "is_checked=True"])]
+      uncheckedMethod = mkMethod (name ++ "Unchecked") baseArgs
+        [mkReturn $ mkCall ("self." ++ name) (map mkName (tail baseArgs) ++ [mkName "is_checked=False"])]
+
+  return [Request request replyDecl, Request checkedMethod [], Request uncheckedMethod []]
 processXDecl ext (XUnion name _ membs) = do
   m <- get
   let unpackF = structElemToPyUnpack unpackerCopy ext m
@@ -772,7 +779,7 @@
       pack = mkPackMethod ext name m Nothing [head membs] Nothing
       decl = [mkXClass name "xcffib.Union" False initMethodStmts [pack]]
   modify $ mkModify ext name (CompositeType ext name)
-  return $ Declaration decl
+  return [Declaration decl]
   where
     unpackerCopy = mkCall "unpacker.copy" []
     mkUnionUnpack :: (Maybe String, String)
@@ -788,7 +795,7 @@
 processXDecl ext (XidUnion name _) =
   -- These are always unions of only XIDs.
   do modify $ mkModify ext name (BaseType "I")
-     return Noop
+     return [Noop]
 
 -- EventStruct basically describes a set of possible events that could be
 -- represented by this one member. Slated to land in 1.13, it is only used in
@@ -803,7 +810,7 @@
 -- again.
 processXDecl ext (XEventStruct name _) = do
   modify $ mkModify ext name (CompositeType ext name)
-  return $ Declaration $ [mkXClass name "xcffib.Buffer" False [] []]
+  return [Declaration $ [mkXClass name "xcffib.Buffer" False [] []]]
 
 mkVersion :: XHeader -> Suite
 mkVersion header =
diff --git a/test/generator/eventstruct.py b/test/generator/eventstruct.py
--- a/test/generator/eventstruct.py
+++ b/test/generator/eventstruct.py
@@ -12,4 +12,8 @@
         buf.write(xcffib.pack_list(events, EventForSend))
         buf.write(xcffib.pack_list(classes, "B"))
         return self.send_request(31, buf, is_checked=is_checked)
+    def SendExtensionEventChecked(self, device_id, propagate, num_classes, num_events, events, classes):
+        return self.SendExtensionEvent(device_id, propagate, num_classes, num_events, events, classes, is_checked=True)
+    def SendExtensionEventUnchecked(self, device_id, propagate, num_classes, num_events, events, classes):
+        return self.SendExtensionEvent(device_id, propagate, num_classes, num_events, events, classes, is_checked=False)
 xcffib._add_ext(key, eventstructExtension, _events, _errors)
diff --git a/test/generator/randr.py b/test/generator/randr.py
--- a/test/generator/randr.py
+++ b/test/generator/randr.py
@@ -62,4 +62,8 @@
         buf = io.BytesIO()
         buf.write(struct.pack("=xx2xI", crtc))
         return self.send_request(27, buf, GetCrtcTransformCookie, is_checked=is_checked)
+    def GetCrtcTransformChecked(self, crtc):
+        return self.GetCrtcTransform(crtc, is_checked=True)
+    def GetCrtcTransformUnchecked(self, crtc):
+        return self.GetCrtcTransform(crtc, is_checked=False)
 xcffib._add_ext(key, randrExtension, _events, _errors)
diff --git a/test/generator/render.py b/test/generator/render.py
--- a/test/generator/render.py
+++ b/test/generator/render.py
@@ -57,4 +57,8 @@
         buf.write(color.pack() if hasattr(color, "pack") else COLOR.synthetic(*color).pack())
         buf.write(xcffib.pack_list(rects, RECTANGLE))
         return self.send_request(26, buf, is_checked=is_checked)
+    def FillRectanglesChecked(self, op, dst, color, rects_len, rects):
+        return self.FillRectangles(op, dst, color, rects_len, rects, is_checked=True)
+    def FillRectanglesUnchecked(self, op, dst, color, rects_len, rects):
+        return self.FillRectangles(op, dst, color, rects_len, rects, is_checked=False)
 xcffib._add_ext(key, renderExtension, _events, _errors)
diff --git a/test/generator/request.py b/test/generator/request.py
--- a/test/generator/request.py
+++ b/test/generator/request.py
@@ -10,4 +10,8 @@
         buf.write(struct.pack("=I", value_mask))
         buf.write(xcffib.pack_list(value_list, "I"))
         return self.send_request(1, buf, is_checked=is_checked)
+    def CreateWindowChecked(self, depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list):
+        return self.CreateWindow(depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list, is_checked=True)
+    def CreateWindowUnchecked(self, depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list):
+        return self.CreateWindow(depth, wid, parent, x, y, width, height, border_width, _class, visual, value_mask, value_list, is_checked=False)
 xcffib._add_ext(key, requestExtension, _events, _errors)
diff --git a/test/generator/request_reply.py b/test/generator/request_reply.py
--- a/test/generator/request_reply.py
+++ b/test/generator/request_reply.py
@@ -41,4 +41,8 @@
         buf = io.BytesIO()
         buf.write(struct.pack("=xx2x"))
         return self.send_request(99, buf, ListExtensionsCookie, is_checked=is_checked)
+    def ListExtensionsChecked(self):
+        return self.ListExtensions(is_checked=True)
+    def ListExtensionsUnchecked(self):
+        return self.ListExtensions(is_checked=False)
 xcffib._add_ext(key, request_replyExtension, _events, _errors)
diff --git a/test/generator/switch.py b/test/generator/switch.py
--- a/test/generator/switch.py
+++ b/test/generator/switch.py
@@ -78,8 +78,16 @@
             events = items.pop(0)
             buf.write(struct.pack("=I", events))
         return self.send_request(59, buf, GetPropertyCookie, is_checked=is_checked)
+    def GetPropertyChecked(self, value_mask, items):
+        return self.GetProperty(value_mask, items, is_checked=True)
+    def GetPropertyUnchecked(self, value_mask, items):
+        return self.GetProperty(value_mask, items, is_checked=False)
     def GetPropertyWithPad(self, is_checked=True):
         buf = io.BytesIO()
         buf.write(struct.pack("=xx2x"))
         return self.send_request(60, buf, GetPropertyWithPadCookie, is_checked=is_checked)
+    def GetPropertyWithPadChecked(self):
+        return self.GetPropertyWithPad(is_checked=True)
+    def GetPropertyWithPadUnchecked(self):
+        return self.GetPropertyWithPad(is_checked=False)
 xcffib._add_ext(key, switchExtension, _events, _errors)
diff --git a/test/generator/type_pad.py b/test/generator/type_pad.py
--- a/test/generator/type_pad.py
+++ b/test/generator/type_pad.py
@@ -73,4 +73,8 @@
         buf.write(struct.pack("=xx2xxHH", max_names, pattern_len))
         buf.write(xcffib.pack_list(pattern, "c"))
         return self.send_request(50, buf, ListFontsWithInfoCookie, is_checked=is_checked)
+    def ListFontsWithInfoChecked(self, max_names, pattern_len, pattern):
+        return self.ListFontsWithInfo(max_names, pattern_len, pattern, is_checked=True)
+    def ListFontsWithInfoUnchecked(self, max_names, pattern_len, pattern):
+        return self.ListFontsWithInfo(max_names, pattern_len, pattern, is_checked=False)
 xcffib._add_ext(key, type_padExtension, _events, _errors)
diff --git a/xcffib.cabal b/xcffib.cabal
--- a/xcffib.cabal
+++ b/xcffib.cabal
@@ -1,6 +1,6 @@
 cabal-version:       2.4
 name:                xcffib
-version:             1.11.2
+version:             1.12.0
 synopsis:            A cffi-based python binding for X
 homepage:            http://github.com/tych0/xcffib
 license:             Apache-2.0
