diff --git a/doc/src/sgml/custom-scan.sgml b/doc/src/sgml/custom-scan.sgml
index 93d96f2f56..2ad5c22efa 100644
--- a/doc/src/sgml/custom-scan.sgml
+++ b/doc/src/sgml/custom-scan.sgml
@@ -76,9 +76,10 @@ typedef struct CustomPath
     capabilities.  <structfield>flags</structfield> should include
     <literal>CUSTOMPATH_SUPPORT_BACKWARD_SCAN</literal> if the custom path can support
     a backward scan, <literal>CUSTOMPATH_SUPPORT_MARK_RESTORE</literal> if it
-    can support mark and restore,
-    and <literal>CUSTOMPATH_SUPPORT_PROJECTION</literal> if it can perform
-    projections.  (If <literal>CUSTOMPATH_SUPPORT_PROJECTION</literal> is not
+    can support mark and restore, <literal>CUSTOMPATH_SUPPORT_PROJECTION</literal> if it 
+    can perform projections and <literal>CUSTOMPATH_SUPPORT_ASYNC_EXECUTION</literal> 
+    if it can support asynchronous execution.
+      (If <literal>CUSTOMPATH_SUPPORT_PROJECTION</literal> is not
     set, the scan node will only be asked to produce Vars of the scanned
     relation; while if that flag is set, the scan node must be able to
     evaluate scalar expressions over these Vars.)
@@ -385,6 +386,61 @@ void (*ExplainCustomScan) (CustomScanState *node,
     be shown even without this callback, but the callback allows the display
     of additional, private state.
    </para>
+
+   <para>
+<programlisting>
+void (*AsyncCustomScanRequest) (AsyncRequest *areq);
+</programlisting>
+    Produce one tuple asynchronously from the custom-scan plan node. 
+    <literal>areq</literal> is
+     the <structname>AsyncRequest</structname> struct describing the
+     custom-scan node and the parent
+     <structname>Append</structname> node that requested the tuple from it.
+     This function should store the tuple into the slot specified by
+     <literal>areq-&gt;result</literal>, and set
+     <literal>areq-&gt;request_complete</literal> to <literal>true</literal>;
+     or if it needs to wait on an event external to the core server such as
+     network I/O, and cannot produce any tuple immediately, set the flag to
+     <literal>false</literal>, and set
+     <literal>areq-&gt;callback_pending</literal> to <literal>true</literal>
+     for the custom-scan node to get a callback from
+     the callback functions described below.  If no more tuples are available,
+     set the slot to NULL or an empty slot, and the
+     <literal>areq-&gt;request_complete</literal> flag to
+     <literal>true</literal>.  It's recommended to use
+     <function>ExecAsyncRequestDone</function> or
+     <function>ExecAsyncRequestPending</function> to set the output parameters
+     in the <literal>areq</literal>.
+   </para>
+
+   <para>
+<programlisting>
+void (*AsyncCustomScanConfigureWait) (AsyncRequest *areq);
+</programlisting>
+     Configure a file descriptor event for which the
+     custom-scan node wishes to wait.
+     This function will only be called when the
+     custom-scan node has the
+     <literal>areq-&gt;callback_pending</literal> flag set, and should add
+     the event to the <structfield>as_eventset</structfield> of the parent
+     <structname>Append</structname> node described by the
+     <literal>areq</literal>.  See the comments for
+     <function>ExecAsyncConfigureWait</function> in
+     <filename>src/backend/executor/execAsync.c</filename> for additional
+     information.  When the file descriptor event occurs,
+     <function>AsyncCustomScanNotify</function> will be called.
+   </para>
+
+   <para>
+<programlisting>
+void (*AsyncCustomScanNotify) (AsyncRequest *areq);
+</programlisting>
+     Process a relevant event that has occurred, then produce one tuple
+     asynchronously from the custom-scan node.
+     This function should set the output parameters in the
+     <literal>areq</literal> in the same way as
+     <function>AsyncCustomScanRequest</function>.
+   </para>
   </sect2>
  </sect1>
 </chapter>
