diff --git a/doc/api/errors.md b/doc/api/errors.md
index 40b8e7ab74cf71..e0c7414564694f 100644
--- a/doc/api/errors.md
+++ b/doc/api/errors.md
@@ -570,6 +570,12 @@ The `'ERR_ARG_NOT_ITERABLE'` error code is used generically to identify that an
iterable argument (i.e. a value that works with `for...of` loops) is required,
but not provided to a Node.js API.
+
+### ERR_FALSY_VALUE_REJECTION
+
+The `ERR_FALSY_VALUE_REJECTION` error code is used by the `util.callbackify()`
+API when a callbackified `Promise` is rejected with a falsy value (e.g. `null`).
+
### ERR_INVALID_ARG_TYPE
diff --git a/doc/api/util.md b/doc/api/util.md
index 839bdadf76e1ec..9fce6294e18b17 100644
--- a/doc/api/util.md
+++ b/doc/api/util.md
@@ -10,6 +10,64 @@ module developers as well. It can be accessed using:
const util = require('util');
```
+## util.callbackify(original)
+
+
+* `original` {Function} An `async` function
+* Returns: {Function} a callback style function
+
+Takes an `async` function (or a function that returns a Promise) and returns a
+function following the Node.js error first callback style. In the callback, the
+first argument will be the rejection reason (or `null` if the Promise resolved),
+and the second argument will be the resolved value.
+
+For example:
+
+```js
+const util = require('util');
+
+async function fn() {
+ return await Promise.resolve('hello world');
+}
+const callbackFunction = util.callbackify(fn);
+
+callbackFunction((err, ret) => {
+ if (err) throw err;
+ console.log(ret);
+});
+```
+
+Will print:
+
+```txt
+hello world
+```
+
+*Note*:
+
+* The callback is executed asynchronously, and will have a limited stack trace.
+If the callback throws, the process will emit an [`'uncaughtException'`][]
+event, and if not handled will exit.
+
+* Since `null` has a special meaning as the first argument to a callback, if a
+wrapped function rejects a `Promise` with a falsy value as a reason, the value
+is wrapped in an `Error` with the original value stored in a field named
+`reason`.
+ ```js
+ function fn() {
+ return Promise.reject(null);
+ }
+ const callbackFunction = util.callbackify(fn);
+
+ callbackFunction((err, ret) => {
+ // When the Promise was rejected with `null` it is wrapped with an Error and
+ // the original value is stored in `reason`.
+ err && err.hasOwnProperty('reason') && err.reason === null; // true
+ });
+ ```
+
## util.debuglog(section)