diff --git a/MANIFEST.in b/MANIFEST.in
index 8bd83a7d56948..1a6b831c1b975 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -3,6 +3,7 @@ include LICENSE
 include RELEASE.md
 include README.rst
 include setup.py
+include pyproject.toml
 
 graft doc
 prune doc/build
diff --git a/doc/source/whatsnew/v0.21.0.txt b/doc/source/whatsnew/v0.21.0.txt
index f760d0b6359a2..0743cee73c5b9 100644
--- a/doc/source/whatsnew/v0.21.0.txt
+++ b/doc/source/whatsnew/v0.21.0.txt
@@ -112,6 +112,7 @@ Other Enhancements
 ^^^^^^^^^^^^^^^^^^
 
 - The ``validate`` argument for :func:`merge` function now checks whether a merge is one-to-one, one-to-many, many-to-one, or many-to-many. If a merge is found to not be an example of specified merge type, an exception of type ``MergeError`` will be raised. For more, see :ref:`here <merging.validation>` (:issue:`16270`)
+- Added support for `PEP 518 <https://www.python.org/dev/peps/pep-0518/>`_ to the build system (:issue:`16745`)
 - :func:`Series.to_dict` and :func:`DataFrame.to_dict` now support an ``into`` keyword which allows you to specify the ``collections.Mapping`` subclass that you would like returned.  The default is ``dict``, which is backwards compatible. (:issue:`16122`)
 - :func:`RangeIndex.append` now returns a ``RangeIndex`` object when possible (:issue:`16212`)
 - :func:`Series.rename_axis` and :func:`DataFrame.rename_axis` with ``inplace=True`` now return ``None`` while renaming the axis inplace. (:issue:`15704`)
diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000000000..f0d57d1d808a2
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,9 @@
+[build-system]
+requires = [
+    "wheel",
+    "setuptools",
+    "Cython",  # required for VCS build, optional for released source
+    "numpy==1.9.3; python_version=='3.5'",
+    "numpy==1.12.1; python_version=='3.6'",
+    "numpy==1.13.1; python_version>='3.7'",
+]