diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..1f8e784
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,42 @@
+[package]
+name = "tempfile"
+version = "3.2.0"
+authors = [
+  "Steven Allen <steven@stebalien.com>",
+  "The Rust Project Developers",
+  "Ashley Mannix <ashleymannix@live.com.au>",
+  "Jason White <jasonaw0@gmail.com>",
+]
+documentation = "https://docs.rs/tempfile"
+edition = "2018"
+exclude = ["/.travis.yml", "/appveyor.yml"]
+homepage = "http://stebalien.com/projects/tempfile-rs"
+keywords = ["tempfile", "tmpfile", "filesystem"]
+license = "MIT OR Apache-2.0"
+repository = "https://github.com/Stebalien/tempfile"
+description = "A library for managing temporary files and directories."
+
+[dependencies]
+cfg-if = "1"
+rand = { version = "0.8", features = ["small_rng", "getrandom"], default_features = false }
+remove_dir_all = "0.5"
+
+[target.'cfg(any(unix, target_os = "wasi"))'.dependencies]
+libc = "0.2.27"
+
+[target.'cfg(windows)'.dependencies.winapi]
+version = "0.3"
+features = [
+    "fileapi",
+    "handleapi",
+    "winbase",
+]
+
+[target.'cfg(target_os = "redox")'.dependencies]
+redox_syscall = "0.2"
+
+[dev-dependencies]
+doc-comment = "0.3"
+
+[features]
+nightly = []
diff --git a/LICENSE b/LICENSE
new file mode 120000
index 0000000..6b579aa
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1 @@
+LICENSE-APACHE
\ No newline at end of file
diff --git a/LICENSE-APACHE b/LICENSE-APACHE
new file mode 100644
index 0000000..16fe87b
--- /dev/null
+++ b/LICENSE-APACHE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+	http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/LICENSE-MIT b/LICENSE-MIT
new file mode 100644
index 0000000..0c3270f
--- /dev/null
+++ b/LICENSE-MIT
@@ -0,0 +1,25 @@
+Copyright (c) 2015 Steven Allen
+
+Permission is hereby granted, free of charge, to any
+person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the
+Software without restriction, including without
+limitation the rights to use, copy, modify, merge,
+publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software
+is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice
+shall be included in all copies or substantial portions
+of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
+ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
+TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
+SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
+IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/METADATA b/METADATA
new file mode 100644
index 0000000..fee7cae
--- /dev/null
+++ b/METADATA
@@ -0,0 +1,20 @@
+name: "tempfile"
+description: "A library for managing temporary files and directories."
+third_party {
+  url {
+    type: HOMEPAGE
+    value: "https://crates.io/crates/tempfile"
+  }
+  url {
+    type: ARCHIVE
+    value: "https://static.crates.io/crates/tempfile/tempfile-3.2.0.crate"
+  }
+  version: "3.2.0"
+  # Dual-licensed, using the least restrictive per go/thirdpartylicenses#same.
+  license_type: NOTICE
+  last_upgrade_date {
+    year: 2021
+    month: 10
+    day: 25
+  }
+}
diff --git a/MODULE_LICENSE_APACHE2 b/MODULE_LICENSE_APACHE2
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/MODULE_LICENSE_APACHE2
diff --git a/NEWS b/NEWS
new file mode 100644
index 0000000..6c83656
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,191 @@
+3.2.0
+=====
+
+Features:
+
+* Bump rand dependency to `0.8`.
+* Bump cfg-if dependency to `1.0`
+
+Other than that, this release mostly includes small cleanups and simplifications.
+
+Breaking: The minimum rust version is now `1.40.0`.
+
+3.1.0
+=====
+
+Features:
+
+* Bump rand dependency to `0.7`.
+
+Breaking: The minimum rust version is now `1.32.0`.
+
+3.0.9
+=====
+
+Documentation:
+
+* Add an example for reopening a named temporary file.
+* Flesh out the security documentation.
+
+Features:
+
+* Introduce an `append` option to the builder.
+* Errors:
+  * No longer implement the soft-deprecated `description`.
+  * Implement `source` instead of `cause`.
+
+Breaking: The minimum rust version is now 1.30.
+
+3.0.8
+=====
+
+This is a bugfix release.
+
+Fixes:
+
+* Export `PathPersistError`.
+* Fix a bug where flushing a `SpooledTempFile` to disk could fail to write part
+  of the file in some rare, yet-to-reproduced cases.
+
+3.0.7
+=====
+
+Breaking:
+
+* `Builder::prefix` and `Builder::suffix` now accept a generic `&AsRef<OsStr>`.
+  This could affect type inference.
+* Temporary files (except unnamed temporary files on Windows and Linux >= 3.11)
+  now use absolute path names. This will break programs that create temporary
+  files relative to their current working directory when they don't have the
+  search permission (x) on some ancestor directory. This is only likely to
+  affect programs with strange chroot-less filesystem sandboxes. If you believe
+  you're affected by this issue, please comment on #40.
+
+Features:
+
+* Accept anything implementing `&AsRef<OsStr>` in the builder: &OsStr, &OsString, &Path, etc.
+
+Fixes:
+
+* Fix LFS support.
+* Use absolute paths for named temporary files to guard against changes in the
+  current directory.
+* Use absolute paths when creating unnamed temporary files on platforms that
+  can't create unlinked or auto-deleted temporary files. This fixes a very
+  unlikely race where the current directory could change while the temporary
+  file is being created.
+
+Misc:
+
+* Use modern stdlib features to avoid custom unsafe code. This reduces the
+  number of unsafe blocks from 12 to 4.
+
+3.0.6
+=====
+
+* Don't hide temporary files on windows, fixing #66 and #69.
+
+3.0.5
+=====
+
+Features:
+
+* Added a spooled temporary file implementation. This temporary file variant
+  starts out as an in-memory temporary file but "rolls-over" onto disk when it
+  grows over a specified size (#68).
+* Errors are now annotated with paths to make debugging easier (#73).
+
+Misc:
+
+* The rand version has been bumped to 0.6 (#74).
+
+Bugs:
+
+* Tempfile compiles again on Redox (#75).
+
+3.0.4
+=====
+
+* Now compiles on unsupported platforms.
+
+3.0.3
+=====
+
+* update rand to 0.5
+
+3.0.2
+=====
+
+* Actually *delete* temporary files on non-Linux unix systems (thanks to
+@oliverhenshaw for the fix and a test case).
+
+3.0.1
+=====
+
+* Restore NamedTempFile::new_in
+
+3.0.0
+=====
+
+* Adds temporary directory support (@KodrAus)
+* Allow closing named temporary files without deleting them (@jasonwhite)
+
+2.2.0
+=====
+
+* Redox Support
+
+2.1.6
+=====
+
+* Remove build script and bump minimum rustc version to 1.9.0
+
+2.1.5
+=====
+
+* Don't build platform-specific dependencies on all platforms.
+* Cleanup some documentation.
+
+2.1.4
+=====
+
+* Fix crates.io tags. No interesting changes.
+
+2.1.3
+=====
+
+Export `PersistError`.
+
+2.1.2
+=====
+
+Add `Read`/`Write`/`Seek` impls on `&NamedTempFile`. This mirrors the
+implementations on `&File`. One can currently just deref to a `&File` but these
+implementations are more discoverable.
+
+2.1.1
+=====
+
+Add LFS Support.
+
+2.1.0
+=====
+
+* Implement `AsRef<File>` for `NamedTempFile` allowing named temporary files to
+  be borrowed as `File`s.
+* Add a method to convert a `NamedTempFile` to an unnamed temporary `File`.
+
+2.0.1
+=====
+
+* Arm bugfix
+
+2.0.0
+=====
+
+This release replaces `TempFile` with a `tempfile()` function that returnes
+`std::fs::File` objects. These are significantly more useful because most rust
+libraries expect normal `File` objects.
+
+To continue supporting shared temporary files, this new version adds a
+`reopen()` method to `NamedTempFile`.
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..9b9c2ab
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,2 @@
+jiyong@google.com
+qwandor@google.com
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..1dba3a0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,45 @@
+tempfile
+========
+
+[![Crate](https://img.shields.io/crates/v/tempfile.svg)](https://crates.io/crates/tempfile)
+[![Build Status](https://github.com/Stebalien/tempfile/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/Stebalien/tempfile/actions/workflows/ci.yml?query=branch%3Amaster)
+
+A secure, cross-platform, temporary file library for Rust. In addition to creating
+temporary files, this library also allows users to securely open multiple
+independent references to the same temporary file (useful for consumer/producer
+patterns and surprisingly difficult to implement securely).
+
+[Documentation](https://docs.rs/tempfile/)
+
+Usage
+-----
+
+Minimum required Rust version: 1.40.0
+
+Add this to your `Cargo.toml`:
+```toml
+[dependencies]
+tempfile = "3"
+```
+
+Example
+-------
+
+```rust
+use std::fs::File;
+use std::io::{Write, Read, Seek, SeekFrom};
+
+fn main() {
+    // Write
+    let mut tmpfile: File = tempfile::tempfile().unwrap();
+    write!(tmpfile, "Hello World!").unwrap();
+
+    // Seek to start
+    tmpfile.seek(SeekFrom::Start(0)).unwrap();
+
+    // Read
+    let mut buf = String::new();
+    tmpfile.read_to_string(&mut buf).unwrap();
+    assert_eq!("Hello World!", buf);
+}
+```
diff --git a/src/dir.rs b/src/dir.rs
new file mode 100644
index 0000000..d630762
--- /dev/null
+++ b/src/dir.rs
@@ -0,0 +1,406 @@
+// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+use remove_dir_all::remove_dir_all;
+use std::path::{self, Path, PathBuf};
+use std::{fmt, fs, io};
+
+use crate::error::IoResultExt;
+use crate::Builder;
+
+/// Create a new temporary directory.
+///
+/// The `tempdir` function creates a directory in the file system
+/// and returns a [`TempDir`].
+/// The directory will be automatically deleted when the `TempDir`s
+/// destructor is run.
+///
+/// # Resource Leaking
+///
+/// See [the resource leaking][resource-leaking] docs on `TempDir`.
+///
+/// # Errors
+///
+/// If the directory can not be created, `Err` is returned.
+///
+/// # Examples
+///
+/// ```
+/// use tempfile::tempdir;
+/// use std::fs::File;
+/// use std::io::{self, Write};
+///
+/// # fn main() {
+/// #     if let Err(_) = run() {
+/// #         ::std::process::exit(1);
+/// #     }
+/// # }
+/// # fn run() -> Result<(), io::Error> {
+/// // Create a directory inside of `std::env::temp_dir()`
+/// let dir = tempdir()?;
+///
+/// let file_path = dir.path().join("my-temporary-note.txt");
+/// let mut file = File::create(file_path)?;
+/// writeln!(file, "Brian was here. Briefly.")?;
+///
+/// // `tmp_dir` goes out of scope, the directory as well as
+/// // `tmp_file` will be deleted here.
+/// drop(file);
+/// dir.close()?;
+/// # Ok(())
+/// # }
+/// ```
+///
+/// [`TempDir`]: struct.TempDir.html
+/// [resource-leaking]: struct.TempDir.html#resource-leaking
+pub fn tempdir() -> io::Result<TempDir> {
+    TempDir::new()
+}
+
+/// Create a new temporary directory.
+///
+/// The `tempdir` function creates a directory in the file system
+/// and returns a [`TempDir`].
+/// The directory will be automatically deleted when the `TempDir`s
+/// destructor is run.
+///
+/// # Resource Leaking
+///
+/// See [the resource leaking][resource-leaking] docs on `TempDir`.
+///
+/// # Errors
+///
+/// If the directory can not be created, `Err` is returned.
+///
+/// # Examples
+///
+/// ```
+/// use tempfile::tempdir;
+/// use std::fs::File;
+/// use std::io::{self, Write};
+///
+/// # fn main() {
+/// #     if let Err(_) = run() {
+/// #         ::std::process::exit(1);
+/// #     }
+/// # }
+/// # fn run() -> Result<(), io::Error> {
+/// // Create a directory inside of `std::env::temp_dir()`,
+/// let dir = tempdir()?;
+///
+/// let file_path = dir.path().join("my-temporary-note.txt");
+/// let mut file = File::create(file_path)?;
+/// writeln!(file, "Brian was here. Briefly.")?;
+///
+/// // `tmp_dir` goes out of scope, the directory as well as
+/// // `tmp_file` will be deleted here.
+/// drop(file);
+/// dir.close()?;
+/// # Ok(())
+/// # }
+/// ```
+///
+/// [`TempDir`]: struct.TempDir.html
+/// [resource-leaking]: struct.TempDir.html#resource-leaking
+pub fn tempdir_in<P: AsRef<Path>>(dir: P) -> io::Result<TempDir> {
+    TempDir::new_in(dir)
+}
+
+/// A directory in the filesystem that is automatically deleted when
+/// it goes out of scope.
+///
+/// The [`TempDir`] type creates a directory on the file system that
+/// is deleted once it goes out of scope. At construction, the
+/// `TempDir` creates a new directory with a randomly generated name.
+///
+/// The default constructor, [`TempDir::new()`], creates directories in
+/// the location returned by [`std::env::temp_dir()`], but `TempDir`
+/// can be configured to manage a temporary directory in any location
+/// by constructing with a [`Builder`].
+///
+/// After creating a `TempDir`, work with the file system by doing
+/// standard [`std::fs`] file system operations on its [`Path`],
+/// which can be retrieved with [`TempDir::path()`]. Once the `TempDir`
+/// value is dropped, the directory at the path will be deleted, along
+/// with any files and directories it contains. It is your responsibility
+/// to ensure that no further file system operations are attempted
+/// inside the temporary directory once it has been deleted.
+///
+/// # Resource Leaking
+///
+/// Various platform-specific conditions may cause `TempDir` to fail
+/// to delete the underlying directory. It's important to ensure that
+/// handles (like [`File`] and [`ReadDir`]) to files inside the
+/// directory are dropped before the `TempDir` goes out of scope. The
+/// `TempDir` destructor will silently ignore any errors in deleting
+/// the directory; to instead handle errors call [`TempDir::close()`].
+///
+/// Note that if the program exits before the `TempDir` destructor is
+/// run, such as via [`std::process::exit()`], by segfaulting, or by
+/// receiving a signal like `SIGINT`, then the temporary directory
+/// will not be deleted.
+///
+/// # Examples
+///
+/// Create a temporary directory with a generated name:
+///
+/// ```
+/// use std::fs::File;
+/// use std::io::Write;
+/// use tempfile::TempDir;
+///
+/// # use std::io;
+/// # fn run() -> Result<(), io::Error> {
+/// // Create a directory inside of `std::env::temp_dir()`
+/// let tmp_dir = TempDir::new()?;
+/// # Ok(())
+/// # }
+/// ```
+///
+/// Create a temporary directory with a prefix in its name:
+///
+/// ```
+/// use std::fs::File;
+/// use std::io::Write;
+/// use tempfile::Builder;
+///
+/// # use std::io;
+/// # fn run() -> Result<(), io::Error> {
+/// // Create a directory inside of `std::env::temp_dir()`,
+/// // whose name will begin with 'example'.
+/// let tmp_dir = Builder::new().prefix("example").tempdir()?;
+/// # Ok(())
+/// # }
+/// ```
+///
+/// [`File`]: http://doc.rust-lang.org/std/fs/struct.File.html
+/// [`Path`]: http://doc.rust-lang.org/std/path/struct.Path.html
+/// [`ReadDir`]: http://doc.rust-lang.org/std/fs/struct.ReadDir.html
+/// [`Builder`]: struct.Builder.html
+/// [`TempDir::close()`]: struct.TempDir.html#method.close
+/// [`TempDir::new()`]: struct.TempDir.html#method.new
+/// [`TempDir::path()`]: struct.TempDir.html#method.path
+/// [`TempDir`]: struct.TempDir.html
+/// [`std::env::temp_dir()`]: https://doc.rust-lang.org/std/env/fn.temp_dir.html
+/// [`std::fs`]: http://doc.rust-lang.org/std/fs/index.html
+/// [`std::process::exit()`]: http://doc.rust-lang.org/std/process/fn.exit.html
+pub struct TempDir {
+    path: Option<PathBuf>,
+}
+
+impl TempDir {
+    /// Attempts to make a temporary directory inside of `env::temp_dir()`.
+    ///
+    /// See [`Builder`] for more configuration.
+    ///
+    /// The directory and everything inside it will be automatically deleted
+    /// once the returned `TempDir` is destroyed.
+    ///
+    /// # Errors
+    ///
+    /// If the directory can not be created, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::fs::File;
+    /// use std::io::Write;
+    /// use tempfile::TempDir;
+    ///
+    /// # use std::io;
+    /// # fn run() -> Result<(), io::Error> {
+    /// // Create a directory inside of `std::env::temp_dir()`
+    /// let tmp_dir = TempDir::new()?;
+    ///
+    /// let file_path = tmp_dir.path().join("my-temporary-note.txt");
+    /// let mut tmp_file = File::create(file_path)?;
+    /// writeln!(tmp_file, "Brian was here. Briefly.")?;
+    ///
+    /// // `tmp_dir` goes out of scope, the directory as well as
+    /// // `tmp_file` will be deleted here.
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [`Builder`]: struct.Builder.html
+    pub fn new() -> io::Result<TempDir> {
+        Builder::new().tempdir()
+    }
+
+    /// Attempts to make a temporary directory inside of `dir`.
+    /// The directory and everything inside it will be automatically
+    /// deleted once the returned `TempDir` is destroyed.
+    ///
+    /// # Errors
+    ///
+    /// If the directory can not be created, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::fs::{self, File};
+    /// use std::io::Write;
+    /// use tempfile::TempDir;
+    ///
+    /// # use std::io;
+    /// # fn run() -> Result<(), io::Error> {
+    /// // Create a directory inside of the current directory
+    /// let tmp_dir = TempDir::new_in(".")?;
+    /// let file_path = tmp_dir.path().join("my-temporary-note.txt");
+    /// let mut tmp_file = File::create(file_path)?;
+    /// writeln!(tmp_file, "Brian was here. Briefly.")?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn new_in<P: AsRef<Path>>(dir: P) -> io::Result<TempDir> {
+        Builder::new().tempdir_in(dir)
+    }
+
+    /// Accesses the [`Path`] to the temporary directory.
+    ///
+    /// [`Path`]: http://doc.rust-lang.org/std/path/struct.Path.html
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use tempfile::TempDir;
+    ///
+    /// # use std::io;
+    /// # fn run() -> Result<(), io::Error> {
+    /// let tmp_path;
+    ///
+    /// {
+    ///    let tmp_dir = TempDir::new()?;
+    ///    tmp_path = tmp_dir.path().to_owned();
+    ///
+    ///    // Check that the temp directory actually exists.
+    ///    assert!(tmp_path.exists());
+    ///
+    ///    // End of `tmp_dir` scope, directory will be deleted
+    /// }
+    ///
+    /// // Temp directory should be deleted by now
+    /// assert_eq!(tmp_path.exists(), false);
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn path(&self) -> &path::Path {
+        self.path.as_ref().unwrap()
+    }
+
+    /// Persist the temporary directory to disk, returning the [`PathBuf`] where it is located.
+    ///
+    /// This consumes the [`TempDir`] without deleting directory on the filesystem, meaning that
+    /// the directory will no longer be automatically deleted.
+    ///
+    /// [`TempDir`]: struct.TempDir.html
+    /// [`PathBuf`]: http://doc.rust-lang.org/std/path/struct.PathBuf.html
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::fs;
+    /// use tempfile::TempDir;
+    ///
+    /// # use std::io;
+    /// # fn run() -> Result<(), io::Error> {
+    /// let tmp_dir = TempDir::new()?;
+    ///
+    /// // Persist the temporary directory to disk,
+    /// // getting the path where it is.
+    /// let tmp_path = tmp_dir.into_path();
+    ///
+    /// // Delete the temporary directory ourselves.
+    /// fs::remove_dir_all(tmp_path)?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn into_path(mut self) -> PathBuf {
+        self.path.take().unwrap()
+    }
+
+    /// Closes and removes the temporary directory, returning a `Result`.
+    ///
+    /// Although `TempDir` removes the directory on drop, in the destructor
+    /// any errors are ignored. To detect errors cleaning up the temporary
+    /// directory, call `close` instead.
+    ///
+    /// # Errors
+    ///
+    /// This function may return a variety of [`std::io::Error`]s that result from deleting
+    /// the files and directories contained with the temporary directory,
+    /// as well as from deleting the temporary directory itself. These errors
+    /// may be platform specific.
+    ///
+    /// [`std::io::Error`]: http://doc.rust-lang.org/std/io/struct.Error.html
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::fs::File;
+    /// use std::io::Write;
+    /// use tempfile::TempDir;
+    ///
+    /// # use std::io;
+    /// # fn run() -> Result<(), io::Error> {
+    /// // Create a directory inside of `std::env::temp_dir()`.
+    /// let tmp_dir = TempDir::new()?;
+    /// let file_path = tmp_dir.path().join("my-temporary-note.txt");
+    /// let mut tmp_file = File::create(file_path)?;
+    /// writeln!(tmp_file, "Brian was here. Briefly.")?;
+    ///
+    /// // By closing the `TempDir` explicitly we can check that it has
+    /// // been deleted successfully. If we don't close it explicitly,
+    /// // the directory will still be deleted when `tmp_dir` goes out
+    /// // of scope, but we won't know whether deleting the directory
+    /// // succeeded.
+    /// drop(tmp_file);
+    /// tmp_dir.close()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn close(mut self) -> io::Result<()> {
+        let result = remove_dir_all(self.path()).with_err_path(|| self.path());
+
+        // Prevent the Drop impl from removing the dir a second time.
+        self.path = None;
+
+        result
+    }
+}
+
+impl AsRef<Path> for TempDir {
+    fn as_ref(&self) -> &Path {
+        self.path()
+    }
+}
+
+impl fmt::Debug for TempDir {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        f.debug_struct("TempDir")
+            .field("path", &self.path())
+            .finish()
+    }
+}
+
+impl Drop for TempDir {
+    fn drop(&mut self) {
+        // Path is `None` if `close()` or `into_path()` has been called.
+        if let Some(ref p) = self.path {
+            let _ = remove_dir_all(p);
+        }
+    }
+}
+
+pub(crate) fn create(path: PathBuf) -> io::Result<TempDir> {
+    fs::create_dir(&path)
+        .with_err_path(|| &path)
+        .map(|_| TempDir { path: Some(path) })
+}
diff --git a/src/error.rs b/src/error.rs
new file mode 100644
index 0000000..ed6b6cc
--- /dev/null
+++ b/src/error.rs
@@ -0,0 +1,45 @@
+use std::path::PathBuf;
+use std::{error, fmt, io};
+
+#[derive(Debug)]
+struct PathError {
+    path: PathBuf,
+    err: io::Error,
+}
+
+impl fmt::Display for PathError {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "{} at path {:?}", self.err, self.path)
+    }
+}
+
+impl error::Error for PathError {
+    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
+        self.err.source()
+    }
+}
+
+pub(crate) trait IoResultExt<T> {
+    fn with_err_path<F, P>(self, path: F) -> Self
+    where
+        F: FnOnce() -> P,
+        P: Into<PathBuf>;
+}
+
+impl<T> IoResultExt<T> for Result<T, io::Error> {
+    fn with_err_path<F, P>(self, path: F) -> Self
+    where
+        F: FnOnce() -> P,
+        P: Into<PathBuf>,
+    {
+        self.map_err(|e| {
+            io::Error::new(
+                e.kind(),
+                PathError {
+                    path: path().into(),
+                    err: e,
+                },
+            )
+        })
+    }
+}
diff --git a/src/file/imp/mod.rs b/src/file/imp/mod.rs
new file mode 100644
index 0000000..ceb630e
--- /dev/null
+++ b/src/file/imp/mod.rs
@@ -0,0 +1,12 @@
+cfg_if! {
+    if #[cfg(any(unix, target_os = "redox", target_os = "wasi"))] {
+        mod unix;
+        pub use self::unix::*;
+    } else if #[cfg(windows)] {
+        mod windows;
+        pub use self::windows::*;
+    } else {
+        mod other;
+        pub use self::other::*;
+    }
+}
diff --git a/src/file/imp/other.rs b/src/file/imp/other.rs
new file mode 100644
index 0000000..d8a55a7
--- /dev/null
+++ b/src/file/imp/other.rs
@@ -0,0 +1,30 @@
+use std::fs::{File, OpenOptions};
+use std::io;
+use std::path::Path;
+
+fn not_supported<T>() -> io::Result<T> {
+    Err(io::Error::new(
+        io::ErrorKind::Other,
+        "operation not supported on this platform",
+    ))
+}
+
+pub fn create_named(_path: &Path, open_options: &mut OpenOptions) -> io::Result<File> {
+    not_supported()
+}
+
+pub fn create(_dir: &Path) -> io::Result<File> {
+    not_supported()
+}
+
+pub fn reopen(_file: &File, _path: &Path) -> io::Result<File> {
+    not_supported()
+}
+
+pub fn persist(_old_path: &Path, _new_path: &Path, _overwrite: bool) -> io::Result<()> {
+    not_supported()
+}
+
+pub fn keep(path: &Path) -> io::Result<()> {
+    not_supported()
+}
diff --git a/src/file/imp/unix.rs b/src/file/imp/unix.rs
new file mode 100644
index 0000000..89249fd
--- /dev/null
+++ b/src/file/imp/unix.rs
@@ -0,0 +1,156 @@
+use std::env;
+use std::ffi::{CString, OsStr};
+use std::fs::{self, File, OpenOptions};
+use std::io;
+cfg_if! {
+    if #[cfg(not(target_os = "wasi"))] {
+        use std::os::unix::ffi::OsStrExt;
+        use std::os::unix::fs::{MetadataExt, OpenOptionsExt};
+    } else {
+        use std::os::wasi::ffi::OsStrExt;
+        #[cfg(feature = "nightly")]
+        use std::os::wasi::fs::MetadataExt;
+    }
+}
+use crate::util;
+use std::path::Path;
+
+#[cfg(not(target_os = "redox"))]
+use libc::{c_char, c_int, link, rename, unlink};
+
+#[cfg(not(target_os = "redox"))]
+#[inline(always)]
+pub fn cvt_err(result: c_int) -> io::Result<c_int> {
+    if result == -1 {
+        Err(io::Error::last_os_error())
+    } else {
+        Ok(result)
+    }
+}
+
+#[cfg(target_os = "redox")]
+#[inline(always)]
+pub fn cvt_err(result: Result<usize, syscall::Error>) -> io::Result<usize> {
+    result.map_err(|err| io::Error::from_raw_os_error(err.errno))
+}
+
+// Stolen from std.
+pub fn cstr(path: &Path) -> io::Result<CString> {
+    CString::new(path.as_os_str().as_bytes())
+        .map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "path contained a null"))
+}
+
+pub fn create_named(path: &Path, open_options: &mut OpenOptions) -> io::Result<File> {
+    open_options.read(true).write(true).create_new(true);
+
+    #[cfg(not(target_os = "wasi"))]
+    {
+        open_options.mode(0o600);
+    }
+
+    open_options.open(path)
+}
+
+fn create_unlinked(path: &Path) -> io::Result<File> {
+    let tmp;
+    // shadow this to decrease the lifetime. It can't live longer than `tmp`.
+    let mut path = path;
+    if !path.is_absolute() {
+        let cur_dir = env::current_dir()?;
+        tmp = cur_dir.join(path);
+        path = &tmp;
+    }
+
+    let f = create_named(path, &mut OpenOptions::new())?;
+    // don't care whether the path has already been unlinked,
+    // but perhaps there are some IO error conditions we should send up?
+    let _ = fs::remove_file(path);
+    Ok(f)
+}
+
+#[cfg(target_os = "linux")]
+pub fn create(dir: &Path) -> io::Result<File> {
+    use libc::{EISDIR, ENOENT, EOPNOTSUPP, O_TMPFILE};
+    OpenOptions::new()
+        .read(true)
+        .write(true)
+        .custom_flags(O_TMPFILE) // do not mix with `create_new(true)`
+        .open(dir)
+        .or_else(|e| {
+            match e.raw_os_error() {
+                // These are the three "not supported" error codes for O_TMPFILE.
+                Some(EOPNOTSUPP) | Some(EISDIR) | Some(ENOENT) => create_unix(dir),
+                _ => Err(e),
+            }
+        })
+}
+
+#[cfg(not(target_os = "linux"))]
+pub fn create(dir: &Path) -> io::Result<File> {
+    create_unix(dir)
+}
+
+fn create_unix(dir: &Path) -> io::Result<File> {
+    util::create_helper(
+        dir,
+        OsStr::new(".tmp"),
+        OsStr::new(""),
+        crate::NUM_RAND_CHARS,
+        |path| create_unlinked(&path),
+    )
+}
+
+#[cfg(any(not(target_os = "wasi"), feature = "nightly"))]
+pub fn reopen(file: &File, path: &Path) -> io::Result<File> {
+    let new_file = OpenOptions::new().read(true).write(true).open(path)?;
+    let old_meta = file.metadata()?;
+    let new_meta = new_file.metadata()?;
+    if old_meta.dev() != new_meta.dev() || old_meta.ino() != new_meta.ino() {
+        return Err(io::Error::new(
+            io::ErrorKind::NotFound,
+            "original tempfile has been replaced",
+        ));
+    }
+    Ok(new_file)
+}
+
+#[cfg(all(target_os = "wasi", not(feature = "nightly")))]
+pub fn reopen(_file: &File, _path: &Path) -> io::Result<File> {
+    return Err(io::Error::new(
+        io::ErrorKind::Other,
+        "this operation is supported on WASI only on nightly Rust (with `nightly` feature enabled)",
+    ));
+}
+
+#[cfg(not(target_os = "redox"))]
+pub fn persist(old_path: &Path, new_path: &Path, overwrite: bool) -> io::Result<()> {
+    unsafe {
+        let old_path = cstr(old_path)?;
+        let new_path = cstr(new_path)?;
+        if overwrite {
+            cvt_err(rename(
+                old_path.as_ptr() as *const c_char,
+                new_path.as_ptr() as *const c_char,
+            ))?;
+        } else {
+            cvt_err(link(
+                old_path.as_ptr() as *const c_char,
+                new_path.as_ptr() as *const c_char,
+            ))?;
+            // Ignore unlink errors. Can we do better?
+            // On recent linux, we can use renameat2 to do this atomically.
+            let _ = unlink(old_path.as_ptr() as *const c_char);
+        }
+        Ok(())
+    }
+}
+
+#[cfg(target_os = "redox")]
+pub fn persist(old_path: &Path, new_path: &Path, overwrite: bool) -> io::Result<()> {
+    // XXX implement when possible
+    Err(io::Error::from_raw_os_error(syscall::ENOSYS))
+}
+
+pub fn keep(_: &Path) -> io::Result<()> {
+    Ok(())
+}
diff --git a/src/file/imp/windows.rs b/src/file/imp/windows.rs
new file mode 100644
index 0000000..71b4748
--- /dev/null
+++ b/src/file/imp/windows.rs
@@ -0,0 +1,108 @@
+use std::ffi::OsStr;
+use std::fs::{File, OpenOptions};
+use std::os::windows::ffi::OsStrExt;
+use std::os::windows::fs::OpenOptionsExt;
+use std::os::windows::io::{AsRawHandle, FromRawHandle, RawHandle};
+use std::path::Path;
+use std::{io, iter};
+
+use winapi::um::fileapi::SetFileAttributesW;
+use winapi::um::handleapi::INVALID_HANDLE_VALUE;
+use winapi::um::winbase::{MoveFileExW, ReOpenFile};
+use winapi::um::winbase::{FILE_FLAG_DELETE_ON_CLOSE, MOVEFILE_REPLACE_EXISTING};
+use winapi::um::winnt::{FILE_ATTRIBUTE_NORMAL, FILE_ATTRIBUTE_TEMPORARY};
+use winapi::um::winnt::{FILE_GENERIC_READ, FILE_GENERIC_WRITE, HANDLE};
+use winapi::um::winnt::{FILE_SHARE_DELETE, FILE_SHARE_READ, FILE_SHARE_WRITE};
+
+use crate::util;
+
+fn to_utf16(s: &Path) -> Vec<u16> {
+    s.as_os_str().encode_wide().chain(iter::once(0)).collect()
+}
+
+pub fn create_named(path: &Path, open_options: &mut OpenOptions) -> io::Result<File> {
+    open_options
+        .create_new(true)
+        .read(true)
+        .write(true)
+        .custom_flags(FILE_ATTRIBUTE_TEMPORARY)
+        .open(path)
+}
+
+pub fn create(dir: &Path) -> io::Result<File> {
+    util::create_helper(
+        dir,
+        OsStr::new(".tmp"),
+        OsStr::new(""),
+        crate::NUM_RAND_CHARS,
+        |path| {
+            OpenOptions::new()
+                .create_new(true)
+                .read(true)
+                .write(true)
+                .share_mode(0)
+                .custom_flags(FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE)
+                .open(path)
+        },
+    )
+}
+
+pub fn reopen(file: &File, _path: &Path) -> io::Result<File> {
+    let handle = file.as_raw_handle();
+    unsafe {
+        let handle = ReOpenFile(
+            handle as HANDLE,
+            FILE_GENERIC_READ | FILE_GENERIC_WRITE,
+            FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE,
+            0,
+        );
+        if handle == INVALID_HANDLE_VALUE {
+            Err(io::Error::last_os_error())
+        } else {
+            Ok(FromRawHandle::from_raw_handle(handle as RawHandle))
+        }
+    }
+}
+
+pub fn keep(path: &Path) -> io::Result<()> {
+    unsafe {
+        let path_w = to_utf16(path);
+        if SetFileAttributesW(path_w.as_ptr(), FILE_ATTRIBUTE_NORMAL) == 0 {
+            Err(io::Error::last_os_error())
+        } else {
+            Ok(())
+        }
+    }
+}
+
+pub fn persist(old_path: &Path, new_path: &Path, overwrite: bool) -> io::Result<()> {
+    // TODO: We should probably do this in one-shot using SetFileInformationByHandle but the API is
+    // really painful.
+
+    unsafe {
+        let old_path_w = to_utf16(old_path);
+        let new_path_w = to_utf16(new_path);
+
+        // Don't succeed if this fails. We don't want to claim to have successfully persisted a file
+        // still marked as temporary because this file won't have the same consistency guarantees.
+        if SetFileAttributesW(old_path_w.as_ptr(), FILE_ATTRIBUTE_NORMAL) == 0 {
+            return Err(io::Error::last_os_error());
+        }
+
+        let mut flags = 0;
+
+        if overwrite {
+            flags |= MOVEFILE_REPLACE_EXISTING;
+        }
+
+        if MoveFileExW(old_path_w.as_ptr(), new_path_w.as_ptr(), flags) == 0 {
+            let e = io::Error::last_os_error();
+            // If this fails, the temporary file is now un-hidden and no longer marked temporary
+            // (slightly less efficient) but it will still work.
+            let _ = SetFileAttributesW(old_path_w.as_ptr(), FILE_ATTRIBUTE_TEMPORARY);
+            Err(e)
+        } else {
+            Ok(())
+        }
+    }
+}
diff --git a/src/file/mod.rs b/src/file/mod.rs
new file mode 100644
index 0000000..31fdd4b
--- /dev/null
+++ b/src/file/mod.rs
@@ -0,0 +1,959 @@
+use std::env;
+use std::error;
+use std::ffi::OsStr;
+use std::fmt;
+use std::fs::{self, File, OpenOptions};
+use std::io::{self, Read, Seek, SeekFrom, Write};
+use std::mem;
+use std::ops::Deref;
+use std::path::{Path, PathBuf};
+
+use crate::error::IoResultExt;
+use crate::Builder;
+
+mod imp;
+
+/// Create a new temporary file.
+///
+/// The file will be created in the location returned by [`std::env::temp_dir()`].
+///
+/// # Security
+///
+/// This variant is secure/reliable in the presence of a pathological temporary file cleaner.
+///
+/// # Resource Leaking
+///
+/// The temporary file will be automatically removed by the OS when the last handle to it is closed.
+/// This doesn't rely on Rust destructors being run, so will (almost) never fail to clean up the temporary file.
+///
+/// # Errors
+///
+/// If the file can not be created, `Err` is returned.
+///
+/// # Examples
+///
+/// ```
+/// use tempfile::tempfile;
+/// use std::io::{self, Write};
+///
+/// # fn main() {
+/// #     if let Err(_) = run() {
+/// #         ::std::process::exit(1);
+/// #     }
+/// # }
+/// # fn run() -> Result<(), io::Error> {
+/// // Create a file inside of `std::env::temp_dir()`.
+/// let mut file = tempfile()?;
+///
+/// writeln!(file, "Brian was here. Briefly.")?;
+/// # Ok(())
+/// # }
+/// ```
+///
+/// [`std::env::temp_dir()`]: https://doc.rust-lang.org/std/env/fn.temp_dir.html
+pub fn tempfile() -> io::Result<File> {
+    tempfile_in(&env::temp_dir())
+}
+
+/// Create a new temporary file in the specified directory.
+///
+/// # Security
+///
+/// This variant is secure/reliable in the presence of a pathological temporary file cleaner.
+/// If the temporary file isn't created in [`std::env::temp_dir()`] then temporary file cleaners aren't an issue.
+///
+/// # Resource Leaking
+///
+/// The temporary file will be automatically removed by the OS when the last handle to it is closed.
+/// This doesn't rely on Rust destructors being run, so will (almost) never fail to clean up the temporary file.
+///
+/// # Errors
+///
+/// If the file can not be created, `Err` is returned.
+///
+/// # Examples
+///
+/// ```
+/// use tempfile::tempfile_in;
+/// use std::io::{self, Write};
+///
+/// # fn main() {
+/// #     if let Err(_) = run() {
+/// #         ::std::process::exit(1);
+/// #     }
+/// # }
+/// # fn run() -> Result<(), io::Error> {
+/// // Create a file inside of the current working directory
+/// let mut file = tempfile_in("./")?;
+///
+/// writeln!(file, "Brian was here. Briefly.")?;
+/// # Ok(())
+/// # }
+/// ```
+///
+/// [`std::env::temp_dir()`]: https://doc.rust-lang.org/std/env/fn.temp_dir.html
+pub fn tempfile_in<P: AsRef<Path>>(dir: P) -> io::Result<File> {
+    imp::create(dir.as_ref())
+}
+
+/// Error returned when persisting a temporary file path fails.
+#[derive(Debug)]
+pub struct PathPersistError {
+    /// The underlying IO error.
+    pub error: io::Error,
+    /// The temporary file path that couldn't be persisted.
+    pub path: TempPath,
+}
+
+impl From<PathPersistError> for io::Error {
+    #[inline]
+    fn from(error: PathPersistError) -> io::Error {
+        error.error
+    }
+}
+
+impl From<PathPersistError> for TempPath {
+    #[inline]
+    fn from(error: PathPersistError) -> TempPath {
+        error.path
+    }
+}
+
+impl fmt::Display for PathPersistError {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "failed to persist temporary file path: {}", self.error)
+    }
+}
+
+impl error::Error for PathPersistError {
+    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
+        Some(&self.error)
+    }
+}
+
+/// A path to a named temporary file without an open file handle.
+///
+/// This is useful when the temporary file needs to be used by a child process,
+/// for example.
+///
+/// When dropped, the temporary file is deleted.
+pub struct TempPath {
+    path: PathBuf,
+}
+
+impl TempPath {
+    /// Close and remove the temporary file.
+    ///
+    /// Use this if you want to detect errors in deleting the file.
+    ///
+    /// # Errors
+    ///
+    /// If the file cannot be deleted, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use std::io;
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// let file = NamedTempFile::new()?;
+    ///
+    /// // Close the file, but keep the path to it around.
+    /// let path = file.into_temp_path();
+    ///
+    /// // By closing the `TempPath` explicitly, we can check that it has
+    /// // been deleted successfully. If we don't close it explicitly, the
+    /// // file will still be deleted when `file` goes out of scope, but we
+    /// // won't know whether deleting the file succeeded.
+    /// path.close()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn close(mut self) -> io::Result<()> {
+        let result = fs::remove_file(&self.path).with_err_path(|| &self.path);
+        self.path = PathBuf::new();
+        mem::forget(self);
+        result
+    }
+
+    /// Persist the temporary file at the target path.
+    ///
+    /// If a file exists at the target path, persist will atomically replace it.
+    /// If this method fails, it will return `self` in the resulting
+    /// [`PathPersistError`].
+    ///
+    /// Note: Temporary files cannot be persisted across filesystems. Also
+    /// neither the file contents nor the containing directory are
+    /// synchronized, so the update may not yet have reached the disk when
+    /// `persist` returns.
+    ///
+    /// # Security
+    ///
+    /// Only use this method if you're positive that a temporary file cleaner
+    /// won't have deleted your file. Otherwise, you might end up persisting an
+    /// attacker controlled file.
+    ///
+    /// # Errors
+    ///
+    /// If the file cannot be moved to the new location, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use std::io::{self, Write};
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// let mut file = NamedTempFile::new()?;
+    /// writeln!(file, "Brian was here. Briefly.")?;
+    ///
+    /// let path = file.into_temp_path();
+    /// path.persist("./saved_file.txt")?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [`PathPersistError`]: struct.PathPersistError.html
+    pub fn persist<P: AsRef<Path>>(mut self, new_path: P) -> Result<(), PathPersistError> {
+        match imp::persist(&self.path, new_path.as_ref(), true) {
+            Ok(_) => {
+                // Don't drop `self`. We don't want to try deleting the old
+                // temporary file path. (It'll fail, but the failure is never
+                // seen.)
+                self.path = PathBuf::new();
+                mem::forget(self);
+                Ok(())
+            }
+            Err(e) => Err(PathPersistError {
+                error: e,
+                path: self,
+            }),
+        }
+    }
+
+    /// Persist the temporary file at the target path if and only if no file exists there.
+    ///
+    /// If a file exists at the target path, fail. If this method fails, it will
+    /// return `self` in the resulting [`PathPersistError`].
+    ///
+    /// Note: Temporary files cannot be persisted across filesystems. Also Note:
+    /// This method is not atomic. It can leave the original link to the
+    /// temporary file behind.
+    ///
+    /// # Security
+    ///
+    /// Only use this method if you're positive that a temporary file cleaner
+    /// won't have deleted your file. Otherwise, you might end up persisting an
+    /// attacker controlled file.
+    ///
+    /// # Errors
+    ///
+    /// If the file cannot be moved to the new location or a file already exists
+    /// there, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use std::io::{self, Write};
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// let mut file = NamedTempFile::new()?;
+    /// writeln!(file, "Brian was here. Briefly.")?;
+    ///
+    /// let path = file.into_temp_path();
+    /// path.persist_noclobber("./saved_file.txt")?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [`PathPersistError`]: struct.PathPersistError.html
+    pub fn persist_noclobber<P: AsRef<Path>>(
+        mut self,
+        new_path: P,
+    ) -> Result<(), PathPersistError> {
+        match imp::persist(&self.path, new_path.as_ref(), false) {
+            Ok(_) => {
+                // Don't drop `self`. We don't want to try deleting the old
+                // temporary file path. (It'll fail, but the failure is never
+                // seen.)
+                self.path = PathBuf::new();
+                mem::forget(self);
+                Ok(())
+            }
+            Err(e) => Err(PathPersistError {
+                error: e,
+                path: self,
+            }),
+        }
+    }
+
+    /// Keep the temporary file from being deleted. This function will turn the
+    /// temporary file into a non-temporary file without moving it.
+    ///
+    ///
+    /// # Errors
+    ///
+    /// On some platforms (e.g., Windows), we need to mark the file as
+    /// non-temporary. This operation could fail.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use std::io::{self, Write};
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// let mut file = NamedTempFile::new()?;
+    /// writeln!(file, "Brian was here. Briefly.")?;
+    ///
+    /// let path = file.into_temp_path();
+    /// let path = path.keep()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [`PathPersistError`]: struct.PathPersistError.html
+    pub fn keep(mut self) -> Result<PathBuf, PathPersistError> {
+        match imp::keep(&self.path) {
+            Ok(_) => {
+                // Don't drop `self`. We don't want to try deleting the old
+                // temporary file path. (It'll fail, but the failure is never
+                // seen.)
+                let path = mem::replace(&mut self.path, PathBuf::new());
+                mem::forget(self);
+                Ok(path)
+            }
+            Err(e) => Err(PathPersistError {
+                error: e,
+                path: self,
+            }),
+        }
+    }
+}
+
+impl fmt::Debug for TempPath {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        self.path.fmt(f)
+    }
+}
+
+impl Drop for TempPath {
+    fn drop(&mut self) {
+        let _ = fs::remove_file(&self.path);
+    }
+}
+
+impl Deref for TempPath {
+    type Target = Path;
+
+    fn deref(&self) -> &Path {
+        &self.path
+    }
+}
+
+impl AsRef<Path> for TempPath {
+    fn as_ref(&self) -> &Path {
+        &self.path
+    }
+}
+
+impl AsRef<OsStr> for TempPath {
+    fn as_ref(&self) -> &OsStr {
+        self.path.as_os_str()
+    }
+}
+
+/// A named temporary file.
+///
+/// The default constructor, [`NamedTempFile::new()`], creates files in
+/// the location returned by [`std::env::temp_dir()`], but `NamedTempFile`
+/// can be configured to manage a temporary file in any location
+/// by constructing with [`NamedTempFile::new_in()`].
+///
+/// # Security
+///
+/// Most operating systems employ temporary file cleaners to delete old
+/// temporary files. Unfortunately these temporary file cleaners don't always
+/// reliably _detect_ whether the temporary file is still being used.
+///
+/// Specifically, the following sequence of events can happen:
+///
+/// 1. A user creates a temporary file with `NamedTempFile::new()`.
+/// 2. Time passes.
+/// 3. The temporary file cleaner deletes (unlinks) the temporary file from the
+///    filesystem.
+/// 4. Some other program creates a new file to replace this deleted temporary
+///    file.
+/// 5. The user tries to re-open the temporary file (in the same program or in a
+///    different program) by path. Unfortunately, they'll end up opening the
+///    file created by the other program, not the original file.
+///
+/// ## Operating System Specific Concerns
+///
+/// The behavior of temporary files and temporary file cleaners differ by
+/// operating system.
+///
+/// ### Windows
+///
+/// On Windows, open files _can't_ be deleted. This removes most of the concerns
+/// around temporary file cleaners.
+///
+/// Furthermore, temporary files are, by default, created in per-user temporary
+/// file directories so only an application running as the same user would be
+/// able to interfere (which they could do anyways). However, an application
+/// running as the same user can still _accidentally_ re-create deleted
+/// temporary files if the number of random bytes in the temporary file name is
+/// too small.
+///
+/// So, the only real concern on Windows is:
+///
+/// 1. Opening a named temporary file in a world-writable directory.
+/// 2. Using the `into_temp_path()` and/or `into_parts()` APIs to close the file
+///    handle without deleting the underlying file.
+/// 3. Continuing to use the file by path.
+///
+/// ### UNIX
+///
+/// Unlike on Windows, UNIX (and UNIX like) systems allow open files to be
+/// "unlinked" (deleted).
+///
+/// #### MacOS
+///
+/// Like on Windows, temporary files are created in per-user temporary file
+/// directories by default so calling `NamedTempFile::new()` should be
+/// relatively safe.
+///
+/// #### Linux
+///
+/// Unfortunately, most _Linux_ distributions don't create per-user temporary
+/// file directories. Worse, systemd's tmpfiles daemon (a common temporary file
+/// cleaner) will happily remove open temporary files if they haven't been
+/// modified within the last 10 days.
+///
+/// # Resource Leaking
+///
+/// If the program exits before the `NamedTempFile` destructor is
+/// run, such as via [`std::process::exit()`], by segfaulting, or by
+/// receiving a signal like `SIGINT`, then the temporary file
+/// will not be deleted.
+///
+/// Use the [`tempfile()`] function unless you absolutely need a named file.
+///
+/// [`tempfile()`]: fn.tempfile.html
+/// [`NamedTempFile::new()`]: #method.new
+/// [`NamedTempFile::new_in()`]: #method.new_in
+/// [`std::env::temp_dir()`]: https://doc.rust-lang.org/std/env/fn.temp_dir.html
+/// [`std::process::exit()`]: http://doc.rust-lang.org/std/process/fn.exit.html
+pub struct NamedTempFile {
+    path: TempPath,
+    file: File,
+}
+
+impl fmt::Debug for NamedTempFile {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "NamedTempFile({:?})", self.path)
+    }
+}
+
+impl AsRef<Path> for NamedTempFile {
+    #[inline]
+    fn as_ref(&self) -> &Path {
+        self.path()
+    }
+}
+
+/// Error returned when persisting a temporary file fails.
+#[derive(Debug)]
+pub struct PersistError {
+    /// The underlying IO error.
+    pub error: io::Error,
+    /// The temporary file that couldn't be persisted.
+    pub file: NamedTempFile,
+}
+
+impl From<PersistError> for io::Error {
+    #[inline]
+    fn from(error: PersistError) -> io::Error {
+        error.error
+    }
+}
+
+impl From<PersistError> for NamedTempFile {
+    #[inline]
+    fn from(error: PersistError) -> NamedTempFile {
+        error.file
+    }
+}
+
+impl fmt::Display for PersistError {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        write!(f, "failed to persist temporary file: {}", self.error)
+    }
+}
+
+impl error::Error for PersistError {
+    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
+        Some(&self.error)
+    }
+}
+
+impl NamedTempFile {
+    /// Create a new named temporary file.
+    ///
+    /// See [`Builder`] for more configuration.
+    ///
+    /// # Security
+    ///
+    /// This will create a temporary file in the default temporary file
+    /// directory (platform dependent). This has security implications on many
+    /// platforms so please read the security section of this type's
+    /// documentation.
+    ///
+    /// Reasons to use this method:
+    ///
+    ///   1. The file has a short lifetime and your temporary file cleaner is
+    ///      sane (doesn't delete recently accessed files).
+    ///
+    ///   2. You trust every user on your system (i.e. you are the only user).
+    ///
+    ///   3. You have disabled your system's temporary file cleaner or verified
+    ///      that your system doesn't have a temporary file cleaner.
+    ///
+    /// Reasons not to use this method:
+    ///
+    ///   1. You'll fix it later. No you won't.
+    ///
+    ///   2. You don't care about the security of the temporary file. If none of
+    ///      the "reasons to use this method" apply, referring to a temporary
+    ///      file by name may allow an attacker to create/overwrite your
+    ///      non-temporary files. There are exceptions but if you don't already
+    ///      know them, don't use this method.
+    ///
+    /// # Errors
+    ///
+    /// If the file can not be created, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// Create a named temporary file and write some data to it:
+    ///
+    /// ```no_run
+    /// # use std::io::{self, Write};
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), ::std::io::Error> {
+    /// let mut file = NamedTempFile::new()?;
+    ///
+    /// writeln!(file, "Brian was here. Briefly.")?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [`Builder`]: struct.Builder.html
+    pub fn new() -> io::Result<NamedTempFile> {
+        Builder::new().tempfile()
+    }
+
+    /// Create a new named temporary file in the specified directory.
+    ///
+    /// See [`NamedTempFile::new()`] for details.
+    ///
+    /// [`NamedTempFile::new()`]: #method.new
+    pub fn new_in<P: AsRef<Path>>(dir: P) -> io::Result<NamedTempFile> {
+        Builder::new().tempfile_in(dir)
+    }
+
+    /// Get the temporary file's path.
+    ///
+    /// # Security
+    ///
+    /// Referring to a temporary file's path may not be secure in all cases.
+    /// Please read the security section on the top level documentation of this
+    /// type for details.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use std::io::{self, Write};
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), ::std::io::Error> {
+    /// let file = NamedTempFile::new()?;
+    ///
+    /// println!("{:?}", file.path());
+    /// # Ok(())
+    /// # }
+    /// ```
+    #[inline]
+    pub fn path(&self) -> &Path {
+        &self.path
+    }
+
+    /// Close and remove the temporary file.
+    ///
+    /// Use this if you want to detect errors in deleting the file.
+    ///
+    /// # Errors
+    ///
+    /// If the file cannot be deleted, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use std::io;
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// let file = NamedTempFile::new()?;
+    ///
+    /// // By closing the `NamedTempFile` explicitly, we can check that it has
+    /// // been deleted successfully. If we don't close it explicitly,
+    /// // the file will still be deleted when `file` goes out
+    /// // of scope, but we won't know whether deleting the file
+    /// // succeeded.
+    /// file.close()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn close(self) -> io::Result<()> {
+        let NamedTempFile { path, .. } = self;
+        path.close()
+    }
+
+    /// Persist the temporary file at the target path.
+    ///
+    /// If a file exists at the target path, persist will atomically replace it.
+    /// If this method fails, it will return `self` in the resulting
+    /// [`PersistError`].
+    ///
+    /// Note: Temporary files cannot be persisted across filesystems. Also
+    /// neither the file contents nor the containing directory are
+    /// synchronized, so the update may not yet have reached the disk when
+    /// `persist` returns.
+    ///
+    /// # Security
+    ///
+    /// This method persists the temporary file using its path and may not be
+    /// secure in the in all cases. Please read the security section on the top
+    /// level documentation of this type for details.
+    ///
+    /// # Errors
+    ///
+    /// If the file cannot be moved to the new location, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use std::io::{self, Write};
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// let file = NamedTempFile::new()?;
+    ///
+    /// let mut persisted_file = file.persist("./saved_file.txt")?;
+    /// writeln!(persisted_file, "Brian was here. Briefly.")?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [`PersistError`]: struct.PersistError.html
+    pub fn persist<P: AsRef<Path>>(self, new_path: P) -> Result<File, PersistError> {
+        let NamedTempFile { path, file } = self;
+        match path.persist(new_path) {
+            Ok(_) => Ok(file),
+            Err(err) => {
+                let PathPersistError { error, path } = err;
+                Err(PersistError {
+                    file: NamedTempFile { path, file },
+                    error,
+                })
+            }
+        }
+    }
+
+    /// Persist the temporary file at the target path if and only if no file exists there.
+    ///
+    /// If a file exists at the target path, fail. If this method fails, it will
+    /// return `self` in the resulting PersistError.
+    ///
+    /// Note: Temporary files cannot be persisted across filesystems. Also Note:
+    /// This method is not atomic. It can leave the original link to the
+    /// temporary file behind.
+    ///
+    /// # Security
+    ///
+    /// This method persists the temporary file using its path and may not be
+    /// secure in the in all cases. Please read the security section on the top
+    /// level documentation of this type for details.
+    ///
+    /// # Errors
+    ///
+    /// If the file cannot be moved to the new location or a file already exists there,
+    /// `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use std::io::{self, Write};
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// let file = NamedTempFile::new()?;
+    ///
+    /// let mut persisted_file = file.persist_noclobber("./saved_file.txt")?;
+    /// writeln!(persisted_file, "Brian was here. Briefly.")?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn persist_noclobber<P: AsRef<Path>>(self, new_path: P) -> Result<File, PersistError> {
+        let NamedTempFile { path, file } = self;
+        match path.persist_noclobber(new_path) {
+            Ok(_) => Ok(file),
+            Err(err) => {
+                let PathPersistError { error, path } = err;
+                Err(PersistError {
+                    file: NamedTempFile { path, file },
+                    error,
+                })
+            }
+        }
+    }
+
+    /// Keep the temporary file from being deleted. This function will turn the
+    /// temporary file into a non-temporary file without moving it.
+    ///
+    ///
+    /// # Errors
+    ///
+    /// On some platforms (e.g., Windows), we need to mark the file as
+    /// non-temporary. This operation could fail.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use std::io::{self, Write};
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// let mut file = NamedTempFile::new()?;
+    /// writeln!(file, "Brian was here. Briefly.")?;
+    ///
+    /// let (file, path) = file.keep()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [`PathPersistError`]: struct.PathPersistError.html
+    pub fn keep(self) -> Result<(File, PathBuf), PersistError> {
+        let (file, path) = (self.file, self.path);
+        match path.keep() {
+            Ok(path) => Ok((file, path)),
+            Err(PathPersistError { error, path }) => Err(PersistError {
+                file: NamedTempFile { path, file },
+                error,
+            }),
+        }
+    }
+
+    /// Securely reopen the temporary file.
+    ///
+    /// This function is useful when you need multiple independent handles to
+    /// the same file. It's perfectly fine to drop the original `NamedTempFile`
+    /// while holding on to `File`s returned by this function; the `File`s will
+    /// remain usable. However, they may not be nameable.
+    ///
+    /// # Errors
+    ///
+    /// If the file cannot be reopened, `Err` is returned.
+    ///
+    /// # Security
+    ///
+    /// Unlike `File::open(my_temp_file.path())`, `NamedTempFile::reopen()`
+    /// guarantees that the re-opened file is the _same_ file, even in the
+    /// presence of pathological temporary file cleaners.
+    ///
+    /// # Examples
+    ///
+    /// ```no_run
+    /// # use std::io;
+    /// use tempfile::NamedTempFile;
+    ///
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// let file = NamedTempFile::new()?;
+    ///
+    /// let another_handle = file.reopen()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn reopen(&self) -> io::Result<File> {
+        imp::reopen(self.as_file(), NamedTempFile::path(self))
+            .with_err_path(|| NamedTempFile::path(self))
+    }
+
+    /// Get a reference to the underlying file.
+    pub fn as_file(&self) -> &File {
+        &self.file
+    }
+
+    /// Get a mutable reference to the underlying file.
+    pub fn as_file_mut(&mut self) -> &mut File {
+        &mut self.file
+    }
+
+    /// Convert the temporary file into a `std::fs::File`.
+    ///
+    /// The inner file will be deleted.
+    pub fn into_file(self) -> File {
+        self.file
+    }
+
+    /// Closes the file, leaving only the temporary file path.
+    ///
+    /// This is useful when another process must be able to open the temporary
+    /// file.
+    pub fn into_temp_path(self) -> TempPath {
+        self.path
+    }
+
+    /// Converts the named temporary file into its constituent parts.
+    ///
+    /// Note: When the path is dropped, the file is deleted but the file handle
+    /// is still usable.
+    pub fn into_parts(self) -> (File, TempPath) {
+        (self.file, self.path)
+    }
+}
+
+impl Read for NamedTempFile {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.as_file_mut().read(buf).with_err_path(|| self.path())
+    }
+}
+
+impl<'a> Read for &'a NamedTempFile {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        self.as_file().read(buf).with_err_path(|| self.path())
+    }
+}
+
+impl Write for NamedTempFile {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.as_file_mut().write(buf).with_err_path(|| self.path())
+    }
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        self.as_file_mut().flush().with_err_path(|| self.path())
+    }
+}
+
+impl<'a> Write for &'a NamedTempFile {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        self.as_file().write(buf).with_err_path(|| self.path())
+    }
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        self.as_file().flush().with_err_path(|| self.path())
+    }
+}
+
+impl Seek for NamedTempFile {
+    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
+        self.as_file_mut().seek(pos).with_err_path(|| self.path())
+    }
+}
+
+impl<'a> Seek for &'a NamedTempFile {
+    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
+        self.as_file().seek(pos).with_err_path(|| self.path())
+    }
+}
+
+#[cfg(unix)]
+impl std::os::unix::io::AsRawFd for NamedTempFile {
+    #[inline]
+    fn as_raw_fd(&self) -> std::os::unix::io::RawFd {
+        self.as_file().as_raw_fd()
+    }
+}
+
+#[cfg(windows)]
+impl std::os::windows::io::AsRawHandle for NamedTempFile {
+    #[inline]
+    fn as_raw_handle(&self) -> std::os::windows::io::RawHandle {
+        self.as_file().as_raw_handle()
+    }
+}
+
+pub(crate) fn create_named(
+    mut path: PathBuf,
+    open_options: &mut OpenOptions,
+) -> io::Result<NamedTempFile> {
+    // Make the path absolute. Otherwise, changing directories could cause us to
+    // delete the wrong file.
+    if !path.is_absolute() {
+        path = env::current_dir()?.join(path)
+    }
+    imp::create_named(&path, open_options)
+        .with_err_path(|| path.clone())
+        .map(|file| NamedTempFile {
+            path: TempPath { path },
+            file,
+        })
+}
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..d89798f
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,508 @@
+//! Temporary files and directories.
+//!
+//! - Use the [`tempfile()`] function for temporary files
+//! - Use the [`tempdir()`] function for temporary directories.
+//!
+//! # Design
+//!
+//! This crate provides several approaches to creating temporary files and directories.
+//! [`tempfile()`] relies on the OS to remove the temporary file once the last handle is closed.
+//! [`TempDir`] and [`NamedTempFile`] both rely on Rust destructors for cleanup.
+//!
+//! When choosing between the temporary file variants, prefer `tempfile`
+//! unless you either need to know the file's path or to be able to persist it.
+//!
+//! ## Resource Leaking
+//!
+//! `tempfile` will (almost) never fail to cleanup temporary resources, but `TempDir` and `NamedTempFile` will if
+//! their destructors don't run. This is because `tempfile` relies on the OS to cleanup the
+//! underlying file, while `TempDir` and `NamedTempFile` rely on their destructors to do so.
+//!
+//! ## Security
+//!
+//! In the presence of pathological temporary file cleaner, relying on file paths is unsafe because
+//! a temporary file cleaner could delete the temporary file which an attacker could then replace.
+//!
+//! `tempfile` doesn't rely on file paths so this isn't an issue. However, `NamedTempFile` does
+//! rely on file paths for _some_ operations. See the security documentation on
+//! the `NamedTempFile` type for more information.
+//!
+//! ## Examples
+//!
+//! Create a temporary file and write some data into it:
+//!
+//! ```
+//! use tempfile::tempfile;
+//! use std::io::{self, Write};
+//!
+//! # fn main() {
+//! #     if let Err(_) = run() {
+//! #         ::std::process::exit(1);
+//! #     }
+//! # }
+//! # fn run() -> Result<(), io::Error> {
+//! // Create a file inside of `std::env::temp_dir()`.
+//! let mut file = tempfile()?;
+//!
+//! writeln!(file, "Brian was here. Briefly.")?;
+//! # Ok(())
+//! # }
+//! ```
+//!
+//! Create a named temporary file and open an independent file handle:
+//!
+//! ```
+//! use tempfile::NamedTempFile;
+//! use std::io::{self, Write, Read};
+//!
+//! # fn main() {
+//! #     if let Err(_) = run() {
+//! #         ::std::process::exit(1);
+//! #     }
+//! # }
+//! # fn run() -> Result<(), io::Error> {
+//! let text = "Brian was here. Briefly.";
+//!
+//! // Create a file inside of `std::env::temp_dir()`.
+//! let mut file1 = NamedTempFile::new()?;
+//!
+//! // Re-open it.
+//! let mut file2 = file1.reopen()?;
+//!
+//! // Write some test data to the first handle.
+//! file1.write_all(text.as_bytes())?;
+//!
+//! // Read the test data using the second handle.
+//! let mut buf = String::new();
+//! file2.read_to_string(&mut buf)?;
+//! assert_eq!(buf, text);
+//! # Ok(())
+//! # }
+//! ```
+//!
+//! Create a temporary directory and add a file to it:
+//!
+//! ```
+//! use tempfile::tempdir;
+//! use std::fs::File;
+//! use std::io::{self, Write};
+//!
+//! # fn main() {
+//! #     if let Err(_) = run() {
+//! #         ::std::process::exit(1);
+//! #     }
+//! # }
+//! # fn run() -> Result<(), io::Error> {
+//! // Create a directory inside of `std::env::temp_dir()`.
+//! let dir = tempdir()?;
+//!
+//! let file_path = dir.path().join("my-temporary-note.txt");
+//! let mut file = File::create(file_path)?;
+//! writeln!(file, "Brian was here. Briefly.")?;
+//!
+//! // By closing the `TempDir` explicitly, we can check that it has
+//! // been deleted successfully. If we don't close it explicitly,
+//! // the directory will still be deleted when `dir` goes out
+//! // of scope, but we won't know whether deleting the directory
+//! // succeeded.
+//! drop(file);
+//! dir.close()?;
+//! # Ok(())
+//! # }
+//! ```
+//!
+//! [`tempfile()`]: fn.tempfile.html
+//! [`tempdir()`]: fn.tempdir.html
+//! [`TempDir`]: struct.TempDir.html
+//! [`NamedTempFile`]: struct.NamedTempFile.html
+//! [`std::env::temp_dir()`]: https://doc.rust-lang.org/std/env/fn.temp_dir.html
+
+#![doc(
+    html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
+    html_favicon_url = "https://www.rust-lang.org/favicon.ico",
+    html_root_url = "https://docs.rs/tempfile/3.1.0"
+)]
+#![cfg_attr(test, deny(warnings))]
+#![deny(rust_2018_idioms)]
+#![allow(clippy::redundant_field_names)]
+#![cfg_attr(feature = "nightly", feature(wasi_ext))]
+
+#[macro_use]
+extern crate cfg_if;
+
+#[cfg(doctest)]
+#[macro_use]
+extern crate doc_comment;
+
+#[cfg(doctest)]
+doctest!("../README.md");
+
+const NUM_RETRIES: u32 = 1 << 31;
+const NUM_RAND_CHARS: usize = 6;
+
+use std::ffi::OsStr;
+use std::fs::OpenOptions;
+use std::path::Path;
+use std::{env, io};
+
+mod dir;
+mod error;
+mod file;
+mod spooled;
+mod util;
+
+pub use crate::dir::{tempdir, tempdir_in, TempDir};
+pub use crate::file::{
+    tempfile, tempfile_in, NamedTempFile, PathPersistError, PersistError, TempPath,
+};
+pub use crate::spooled::{spooled_tempfile, SpooledTempFile};
+
+/// Create a new temporary file or directory with custom parameters.
+#[derive(Debug, Clone, Eq, PartialEq)]
+pub struct Builder<'a, 'b> {
+    random_len: usize,
+    prefix: &'a OsStr,
+    suffix: &'b OsStr,
+    append: bool,
+}
+
+impl<'a, 'b> Default for Builder<'a, 'b> {
+    fn default() -> Self {
+        Builder {
+            random_len: crate::NUM_RAND_CHARS,
+            prefix: OsStr::new(".tmp"),
+            suffix: OsStr::new(""),
+            append: false,
+        }
+    }
+}
+
+impl<'a, 'b> Builder<'a, 'b> {
+    /// Create a new `Builder`.
+    ///
+    /// # Examples
+    ///
+    /// Create a named temporary file and write some data into it:
+    ///
+    /// ```
+    /// # use std::io;
+    /// # use std::ffi::OsStr;
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// use tempfile::Builder;
+    ///
+    /// let named_tempfile = Builder::new()
+    ///     .prefix("my-temporary-note")
+    ///     .suffix(".txt")
+    ///     .rand_bytes(5)
+    ///     .tempfile()?;
+    ///
+    /// let name = named_tempfile
+    ///     .path()
+    ///     .file_name().and_then(OsStr::to_str);
+    ///
+    /// if let Some(name) = name {
+    ///     assert!(name.starts_with("my-temporary-note"));
+    ///     assert!(name.ends_with(".txt"));
+    ///     assert_eq!(name.len(), "my-temporary-note.txt".len() + 5);
+    /// }
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// Create a temporary directory and add a file to it:
+    ///
+    /// ```
+    /// # use std::io::{self, Write};
+    /// # use std::fs::File;
+    /// # use std::ffi::OsStr;
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// use tempfile::Builder;
+    ///
+    /// let dir = Builder::new()
+    ///     .prefix("my-temporary-dir")
+    ///     .rand_bytes(5)
+    ///     .tempdir()?;
+    ///
+    /// let file_path = dir.path().join("my-temporary-note.txt");
+    /// let mut file = File::create(file_path)?;
+    /// writeln!(file, "Brian was here. Briefly.")?;
+    ///
+    /// // By closing the `TempDir` explicitly, we can check that it has
+    /// // been deleted successfully. If we don't close it explicitly,
+    /// // the directory will still be deleted when `dir` goes out
+    /// // of scope, but we won't know whether deleting the directory
+    /// // succeeded.
+    /// drop(file);
+    /// dir.close()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn new() -> Self {
+        Self::default()
+    }
+
+    /// Set a custom filename prefix.
+    ///
+    /// Path separators are legal but not advisable.
+    /// Default: `.tmp`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # use std::io;
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// # use tempfile::Builder;
+    /// let named_tempfile = Builder::new()
+    ///     .prefix("my-temporary-note")
+    ///     .tempfile()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn prefix<S: AsRef<OsStr> + ?Sized>(&mut self, prefix: &'a S) -> &mut Self {
+        self.prefix = prefix.as_ref();
+        self
+    }
+
+    /// Set a custom filename suffix.
+    ///
+    /// Path separators are legal but not advisable.
+    /// Default: empty.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # use std::io;
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// # use tempfile::Builder;
+    /// let named_tempfile = Builder::new()
+    ///     .suffix(".txt")
+    ///     .tempfile()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn suffix<S: AsRef<OsStr> + ?Sized>(&mut self, suffix: &'b S) -> &mut Self {
+        self.suffix = suffix.as_ref();
+        self
+    }
+
+    /// Set the number of random bytes.
+    ///
+    /// Default: `6`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # use std::io;
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// # use tempfile::Builder;
+    /// let named_tempfile = Builder::new()
+    ///     .rand_bytes(5)
+    ///     .tempfile()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn rand_bytes(&mut self, rand: usize) -> &mut Self {
+        self.random_len = rand;
+        self
+    }
+
+    /// Set the file to be opened in append mode.
+    ///
+    /// Default: `false`.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # use std::io;
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// # use tempfile::Builder;
+    /// let named_tempfile = Builder::new()
+    ///     .append(true)
+    ///     .tempfile()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    pub fn append(&mut self, append: bool) -> &mut Self {
+        self.append = append;
+        self
+    }
+
+    /// Create the named temporary file.
+    ///
+    /// # Security
+    ///
+    /// See [the security][security] docs on `NamedTempFile`.
+    ///
+    /// # Resource leaking
+    ///
+    /// See [the resource leaking][resource-leaking] docs on `NamedTempFile`.
+    ///
+    /// # Errors
+    ///
+    /// If the file cannot be created, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # use std::io;
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// # use tempfile::Builder;
+    /// let tempfile = Builder::new().tempfile()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [security]: struct.NamedTempFile.html#security
+    /// [resource-leaking]: struct.NamedTempFile.html#resource-leaking
+    pub fn tempfile(&self) -> io::Result<NamedTempFile> {
+        self.tempfile_in(&env::temp_dir())
+    }
+
+    /// Create the named temporary file in the specified directory.
+    ///
+    /// # Security
+    ///
+    /// See [the security][security] docs on `NamedTempFile`.
+    ///
+    /// # Resource leaking
+    ///
+    /// See [the resource leaking][resource-leaking] docs on `NamedTempFile`.
+    ///
+    /// # Errors
+    ///
+    /// If the file cannot be created, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// # use std::io;
+    /// # fn main() {
+    /// #     if let Err(_) = run() {
+    /// #         ::std::process::exit(1);
+    /// #     }
+    /// # }
+    /// # fn run() -> Result<(), io::Error> {
+    /// # use tempfile::Builder;
+    /// let tempfile = Builder::new().tempfile_in("./")?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [security]: struct.NamedTempFile.html#security
+    /// [resource-leaking]: struct.NamedTempFile.html#resource-leaking
+    pub fn tempfile_in<P: AsRef<Path>>(&self, dir: P) -> io::Result<NamedTempFile> {
+        util::create_helper(
+            dir.as_ref(),
+            self.prefix,
+            self.suffix,
+            self.random_len,
+            |path| file::create_named(path, OpenOptions::new().append(self.append)),
+        )
+    }
+
+    /// Attempts to make a temporary directory inside of `env::temp_dir()` whose
+    /// name will have the prefix, `prefix`. The directory and
+    /// everything inside it will be automatically deleted once the
+    /// returned `TempDir` is destroyed.
+    ///
+    /// # Resource leaking
+    ///
+    /// See [the resource leaking][resource-leaking] docs on `TempDir`.
+    ///
+    /// # Errors
+    ///
+    /// If the directory can not be created, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::fs::File;
+    /// use std::io::Write;
+    /// use tempfile::Builder;
+    ///
+    /// # use std::io;
+    /// # fn run() -> Result<(), io::Error> {
+    /// let tmp_dir = Builder::new().tempdir()?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [resource-leaking]: struct.TempDir.html#resource-leaking
+    pub fn tempdir(&self) -> io::Result<TempDir> {
+        self.tempdir_in(&env::temp_dir())
+    }
+
+    /// Attempts to make a temporary directory inside of `dir`.
+    /// The directory and everything inside it will be automatically
+    /// deleted once the returned `TempDir` is destroyed.
+    ///
+    /// # Resource leaking
+    ///
+    /// See [the resource leaking][resource-leaking] docs on `TempDir`.
+    ///
+    /// # Errors
+    ///
+    /// If the directory can not be created, `Err` is returned.
+    ///
+    /// # Examples
+    ///
+    /// ```
+    /// use std::fs::{self, File};
+    /// use std::io::Write;
+    /// use tempfile::Builder;
+    ///
+    /// # use std::io;
+    /// # fn run() -> Result<(), io::Error> {
+    /// let tmp_dir = Builder::new().tempdir_in("./")?;
+    /// # Ok(())
+    /// # }
+    /// ```
+    ///
+    /// [resource-leaking]: struct.TempDir.html#resource-leaking
+    pub fn tempdir_in<P: AsRef<Path>>(&self, dir: P) -> io::Result<TempDir> {
+        let storage;
+        let mut dir = dir.as_ref();
+        if !dir.is_absolute() {
+            let cur_dir = env::current_dir()?;
+            storage = cur_dir.join(dir);
+            dir = &storage;
+        }
+
+        util::create_helper(dir, self.prefix, self.suffix, self.random_len, dir::create)
+    }
+}
diff --git a/src/spooled.rs b/src/spooled.rs
new file mode 100644
index 0000000..e6f750e
--- /dev/null
+++ b/src/spooled.rs
@@ -0,0 +1,152 @@
+use crate::file::tempfile;
+use std::fs::File;
+use std::io::{self, Cursor, Read, Seek, SeekFrom, Write};
+
+#[derive(Debug)]
+enum SpooledInner {
+    InMemory(Cursor<Vec<u8>>),
+    OnDisk(File),
+}
+
+/// An object that behaves like a regular temporary file, but keeps data in
+/// memory until it reaches a configured size, at which point the data is
+/// written to a temporary file on disk, and further operations use the file
+/// on disk.
+#[derive(Debug)]
+pub struct SpooledTempFile {
+    max_size: usize,
+    inner: SpooledInner,
+}
+
+/// Create a new spooled temporary file.
+///
+/// # Security
+///
+/// This variant is secure/reliable in the presence of a pathological temporary
+/// file cleaner.
+///
+/// # Resource Leaking
+///
+/// The temporary file will be automatically removed by the OS when the last
+/// handle to it is closed. This doesn't rely on Rust destructors being run, so
+/// will (almost) never fail to clean up the temporary file.
+///
+/// # Examples
+///
+/// ```
+/// use tempfile::spooled_tempfile;
+/// use std::io::{self, Write};
+///
+/// # fn main() {
+/// #     if let Err(_) = run() {
+/// #         ::std::process::exit(1);
+/// #     }
+/// # }
+/// # fn run() -> Result<(), io::Error> {
+/// let mut file = spooled_tempfile(15);
+///
+/// writeln!(file, "short line")?;
+/// assert!(!file.is_rolled());
+///
+/// // as a result of this write call, the size of the data will exceed
+/// // `max_size` (15), so it will be written to a temporary file on disk,
+/// // and the in-memory buffer will be dropped
+/// writeln!(file, "marvin gardens")?;
+/// assert!(file.is_rolled());
+///
+/// # Ok(())
+/// # }
+/// ```
+#[inline]
+pub fn spooled_tempfile(max_size: usize) -> SpooledTempFile {
+    SpooledTempFile::new(max_size)
+}
+
+impl SpooledTempFile {
+    pub fn new(max_size: usize) -> SpooledTempFile {
+        SpooledTempFile {
+            max_size: max_size,
+            inner: SpooledInner::InMemory(Cursor::new(Vec::new())),
+        }
+    }
+
+    /// Returns true if the file has been rolled over to disk.
+    pub fn is_rolled(&self) -> bool {
+        match self.inner {
+            SpooledInner::InMemory(_) => false,
+            SpooledInner::OnDisk(_) => true,
+        }
+    }
+
+    /// Rolls over to a file on disk, regardless of current size. Does nothing
+    /// if already rolled over.
+    pub fn roll(&mut self) -> io::Result<()> {
+        if !self.is_rolled() {
+            let mut file = tempfile()?;
+            if let SpooledInner::InMemory(ref mut cursor) = self.inner {
+                file.write_all(cursor.get_ref())?;
+                file.seek(SeekFrom::Start(cursor.position()))?;
+            }
+            self.inner = SpooledInner::OnDisk(file);
+        }
+        Ok(())
+    }
+
+    pub fn set_len(&mut self, size: u64) -> Result<(), io::Error> {
+        if size as usize > self.max_size {
+            self.roll()?; // does nothing if already rolled over
+        }
+        match self.inner {
+            SpooledInner::InMemory(ref mut cursor) => {
+                cursor.get_mut().resize(size as usize, 0);
+                Ok(())
+            }
+            SpooledInner::OnDisk(ref mut file) => file.set_len(size),
+        }
+    }
+}
+
+impl Read for SpooledTempFile {
+    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
+        match self.inner {
+            SpooledInner::InMemory(ref mut cursor) => cursor.read(buf),
+            SpooledInner::OnDisk(ref mut file) => file.read(buf),
+        }
+    }
+}
+
+impl Write for SpooledTempFile {
+    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
+        // roll over to file if necessary
+        let mut rolling = false;
+        if let SpooledInner::InMemory(ref mut cursor) = self.inner {
+            rolling = cursor.position() as usize + buf.len() > self.max_size;
+        }
+        if rolling {
+            self.roll()?;
+        }
+
+        // write the bytes
+        match self.inner {
+            SpooledInner::InMemory(ref mut cursor) => cursor.write(buf),
+            SpooledInner::OnDisk(ref mut file) => file.write(buf),
+        }
+    }
+
+    #[inline]
+    fn flush(&mut self) -> io::Result<()> {
+        match self.inner {
+            SpooledInner::InMemory(ref mut cursor) => cursor.flush(),
+            SpooledInner::OnDisk(ref mut file) => file.flush(),
+        }
+    }
+}
+
+impl Seek for SpooledTempFile {
+    fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
+        match self.inner {
+            SpooledInner::InMemory(ref mut cursor) => cursor.seek(pos),
+            SpooledInner::OnDisk(ref mut file) => file.seek(pos),
+        }
+    }
+}
diff --git a/src/util.rs b/src/util.rs
new file mode 100644
index 0000000..01beeed
--- /dev/null
+++ b/src/util.rs
@@ -0,0 +1,63 @@
+use rand::{self, Rng, SeedableRng};
+use rand::{distributions::Alphanumeric, rngs::SmallRng};
+use std::ffi::{OsStr, OsString};
+use std::thread_local;
+use std::{
+    cell::UnsafeCell,
+    path::{Path, PathBuf},
+};
+use std::{io, str};
+
+use crate::error::IoResultExt;
+
+thread_local! {
+    static THREAD_RNG: UnsafeCell<SmallRng> = UnsafeCell::new(SmallRng::from_entropy());
+}
+
+fn tmpname(prefix: &OsStr, suffix: &OsStr, rand_len: usize) -> OsString {
+    let mut buf = OsString::with_capacity(prefix.len() + suffix.len() + rand_len);
+    buf.push(prefix);
+
+    // Push each character in one-by-one. Unfortunately, this is the only
+    // safe(ish) simple way to do this without allocating a temporary
+    // String/Vec.
+    THREAD_RNG.with(|rng| unsafe {
+        (&mut *rng.get())
+            .sample_iter(&Alphanumeric)
+            .take(rand_len)
+            .for_each(|b| buf.push(str::from_utf8_unchecked(&[b as u8])))
+    });
+    buf.push(suffix);
+    buf
+}
+
+pub fn create_helper<F, R>(
+    base: &Path,
+    prefix: &OsStr,
+    suffix: &OsStr,
+    random_len: usize,
+    f: F,
+) -> io::Result<R>
+where
+    F: Fn(PathBuf) -> io::Result<R>,
+{
+    let num_retries = if random_len != 0 {
+        crate::NUM_RETRIES
+    } else {
+        1
+    };
+
+    for _ in 0..num_retries {
+        let path = base.join(tmpname(prefix, suffix, random_len));
+        return match f(path) {
+            Err(ref e) if e.kind() == io::ErrorKind::AlreadyExists => continue,
+            res => res,
+        };
+    }
+
+    Err(io::Error::new(
+        io::ErrorKind::AlreadyExists,
+        "too many temporary files exist",
+    ))
+    .with_err_path(|| base)
+}
diff --git a/tests/namedtempfile.rs b/tests/namedtempfile.rs
new file mode 100644
index 0000000..a489d56
--- /dev/null
+++ b/tests/namedtempfile.rs
@@ -0,0 +1,283 @@
+#![deny(rust_2018_idioms)]
+
+use std::env;
+use std::fs::File;
+use std::io::{Read, Seek, SeekFrom, Write};
+use std::path::Path;
+use tempfile::{Builder, NamedTempFile};
+
+fn exists<P: AsRef<Path>>(path: P) -> bool {
+    std::fs::metadata(path.as_ref()).is_ok()
+}
+
+#[test]
+fn test_basic() {
+    let mut tmpfile = NamedTempFile::new().unwrap();
+    write!(tmpfile, "abcde").unwrap();
+    tmpfile.seek(SeekFrom::Start(0)).unwrap();
+    let mut buf = String::new();
+    tmpfile.read_to_string(&mut buf).unwrap();
+    assert_eq!("abcde", buf);
+}
+
+#[test]
+fn test_deleted() {
+    let tmpfile = NamedTempFile::new().unwrap();
+    let path = tmpfile.path().to_path_buf();
+    assert!(exists(&path));
+    drop(tmpfile);
+    assert!(!exists(&path));
+}
+
+#[test]
+fn test_persist() {
+    let mut tmpfile = NamedTempFile::new().unwrap();
+    let old_path = tmpfile.path().to_path_buf();
+    let persist_path = env::temp_dir().join("persisted_temporary_file");
+    write!(tmpfile, "abcde").unwrap();
+    {
+        assert!(exists(&old_path));
+        let mut f = tmpfile.persist(&persist_path).unwrap();
+        assert!(!exists(&old_path));
+
+        // Check original file
+        f.seek(SeekFrom::Start(0)).unwrap();
+        let mut buf = String::new();
+        f.read_to_string(&mut buf).unwrap();
+        assert_eq!("abcde", buf);
+    }
+
+    {
+        // Try opening it at the new path.
+        let mut f = File::open(&persist_path).unwrap();
+        f.seek(SeekFrom::Start(0)).unwrap();
+        let mut buf = String::new();
+        f.read_to_string(&mut buf).unwrap();
+        assert_eq!("abcde", buf);
+    }
+    std::fs::remove_file(&persist_path).unwrap();
+}
+
+#[test]
+fn test_persist_noclobber() {
+    let mut tmpfile = NamedTempFile::new().unwrap();
+    let old_path = tmpfile.path().to_path_buf();
+    let persist_target = NamedTempFile::new().unwrap();
+    let persist_path = persist_target.path().to_path_buf();
+    write!(tmpfile, "abcde").unwrap();
+    assert!(exists(&old_path));
+    {
+        tmpfile = tmpfile.persist_noclobber(&persist_path).unwrap_err().into();
+        assert!(exists(&old_path));
+        std::fs::remove_file(&persist_path).unwrap();
+        drop(persist_target);
+    }
+    tmpfile.persist_noclobber(&persist_path).unwrap();
+    // Try opening it at the new path.
+    let mut f = File::open(&persist_path).unwrap();
+    f.seek(SeekFrom::Start(0)).unwrap();
+    let mut buf = String::new();
+    f.read_to_string(&mut buf).unwrap();
+    assert_eq!("abcde", buf);
+    std::fs::remove_file(&persist_path).unwrap();
+}
+
+#[test]
+fn test_customnamed() {
+    let tmpfile = Builder::new()
+        .prefix("tmp")
+        .suffix(&".rs".to_string())
+        .rand_bytes(12)
+        .tempfile()
+        .unwrap();
+    let name = tmpfile.path().file_name().unwrap().to_str().unwrap();
+    assert!(name.starts_with("tmp"));
+    assert!(name.ends_with(".rs"));
+    assert_eq!(name.len(), 18);
+}
+
+#[test]
+fn test_append() {
+    let mut tmpfile = Builder::new().append(true).tempfile().unwrap();
+    tmpfile.write(b"a").unwrap();
+    tmpfile.seek(SeekFrom::Start(0)).unwrap();
+    tmpfile.write(b"b").unwrap();
+
+    tmpfile.seek(SeekFrom::Start(0)).unwrap();
+    let mut buf = vec![0u8; 1];
+    tmpfile.read_exact(&mut buf).unwrap();
+    assert_eq!(buf, b"a");
+}
+
+#[test]
+fn test_reopen() {
+    let source = NamedTempFile::new().unwrap();
+    let mut first = source.reopen().unwrap();
+    let mut second = source.reopen().unwrap();
+    drop(source);
+
+    write!(first, "abcde").expect("write failed");
+    let mut buf = String::new();
+    second.read_to_string(&mut buf).unwrap();
+    assert_eq!("abcde", buf);
+}
+
+#[test]
+fn test_into_file() {
+    let mut file = NamedTempFile::new().unwrap();
+    let path = file.path().to_owned();
+    write!(file, "abcde").expect("write failed");
+
+    assert!(path.exists());
+    let mut file = file.into_file();
+    assert!(!path.exists());
+
+    file.seek(SeekFrom::Start(0)).unwrap();
+    let mut buf = String::new();
+    file.read_to_string(&mut buf).unwrap();
+    assert_eq!("abcde", buf);
+}
+
+#[test]
+fn test_immut() {
+    let tmpfile = NamedTempFile::new().unwrap();
+    (&tmpfile).write_all(b"abcde").unwrap();
+    (&tmpfile).seek(SeekFrom::Start(0)).unwrap();
+    let mut buf = String::new();
+    (&tmpfile).read_to_string(&mut buf).unwrap();
+    assert_eq!("abcde", buf);
+}
+
+#[test]
+fn test_temppath() {
+    let mut tmpfile = NamedTempFile::new().unwrap();
+    write!(tmpfile, "abcde").unwrap();
+
+    let path = tmpfile.into_temp_path();
+    assert!(path.is_file());
+}
+
+#[test]
+fn test_temppath_persist() {
+    let mut tmpfile = NamedTempFile::new().unwrap();
+    write!(tmpfile, "abcde").unwrap();
+
+    let tmppath = tmpfile.into_temp_path();
+
+    let old_path = tmppath.to_path_buf();
+    let persist_path = env::temp_dir().join("persisted_temppath_file");
+
+    {
+        assert!(exists(&old_path));
+        tmppath.persist(&persist_path).unwrap();
+        assert!(!exists(&old_path));
+    }
+
+    {
+        // Try opening it at the new path.
+        let mut f = File::open(&persist_path).unwrap();
+        f.seek(SeekFrom::Start(0)).unwrap();
+        let mut buf = String::new();
+        f.read_to_string(&mut buf).unwrap();
+        assert_eq!("abcde", buf);
+    }
+
+    std::fs::remove_file(&persist_path).unwrap();
+}
+
+#[test]
+fn test_temppath_persist_noclobber() {
+    let mut tmpfile = NamedTempFile::new().unwrap();
+    write!(tmpfile, "abcde").unwrap();
+
+    let mut tmppath = tmpfile.into_temp_path();
+
+    let old_path = tmppath.to_path_buf();
+    let persist_target = NamedTempFile::new().unwrap();
+    let persist_path = persist_target.path().to_path_buf();
+
+    assert!(exists(&old_path));
+
+    {
+        tmppath = tmppath.persist_noclobber(&persist_path).unwrap_err().into();
+        assert!(exists(&old_path));
+        std::fs::remove_file(&persist_path).unwrap();
+        drop(persist_target);
+    }
+
+    tmppath.persist_noclobber(&persist_path).unwrap();
+
+    // Try opening it at the new path.
+    let mut f = File::open(&persist_path).unwrap();
+    f.seek(SeekFrom::Start(0)).unwrap();
+    let mut buf = String::new();
+    f.read_to_string(&mut buf).unwrap();
+    assert_eq!("abcde", buf);
+    std::fs::remove_file(&persist_path).unwrap();
+}
+
+#[test]
+fn test_write_after_close() {
+    let path = NamedTempFile::new().unwrap().into_temp_path();
+    File::create(path).unwrap().write_all(b"test").unwrap();
+}
+
+#[test]
+fn test_change_dir() {
+    env::set_current_dir(env::temp_dir()).unwrap();
+    let tmpfile = NamedTempFile::new_in(".").unwrap();
+    let path = env::current_dir().unwrap().join(tmpfile.path());
+    env::set_current_dir("/").unwrap();
+    drop(tmpfile);
+    assert!(!exists(path))
+}
+
+#[test]
+fn test_into_parts() {
+    let mut file = NamedTempFile::new().unwrap();
+    write!(file, "abcd").expect("write failed");
+
+    let (mut file, temp_path) = file.into_parts();
+
+    let path = temp_path.to_path_buf();
+
+    assert!(path.exists());
+    drop(temp_path);
+    assert!(!path.exists());
+
+    write!(file, "efgh").expect("write failed");
+
+    file.seek(SeekFrom::Start(0)).unwrap();
+    let mut buf = String::new();
+    file.read_to_string(&mut buf).unwrap();
+    assert_eq!("abcdefgh", buf);
+}
+
+#[test]
+fn test_keep() {
+    let mut tmpfile = NamedTempFile::new().unwrap();
+    write!(tmpfile, "abcde").unwrap();
+    let (mut f, temp_path) = tmpfile.into_parts();
+    let path;
+    {
+        assert!(exists(&temp_path));
+        path = temp_path.keep().unwrap();
+        assert!(exists(&path));
+
+        // Check original file
+        f.seek(SeekFrom::Start(0)).unwrap();
+        let mut buf = String::new();
+        f.read_to_string(&mut buf).unwrap();
+        assert_eq!("abcde", buf);
+    }
+
+    {
+        // Try opening it again.
+        let mut f = File::open(&path).unwrap();
+        f.seek(SeekFrom::Start(0)).unwrap();
+        let mut buf = String::new();
+        f.read_to_string(&mut buf).unwrap();
+        assert_eq!("abcde", buf);
+    }
+    std::fs::remove_file(&path).unwrap();
+}
diff --git a/tests/spooled.rs b/tests/spooled.rs
new file mode 100644
index 0000000..288d1e6
--- /dev/null
+++ b/tests/spooled.rs
@@ -0,0 +1,307 @@
+#![deny(rust_2018_idioms)]
+
+use std::io::{Read, Seek, SeekFrom, Write};
+
+use tempfile::{spooled_tempfile, SpooledTempFile};
+
+#[test]
+fn test_automatic_rollover() {
+    let mut t = spooled_tempfile(10);
+    let mut buf = Vec::new();
+
+    assert!(!t.is_rolled());
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 0);
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 0);
+    assert_eq!(buf.as_slice(), b"");
+    buf.clear();
+
+    assert_eq!(t.write(b"abcde").unwrap(), 5);
+
+    assert!(!t.is_rolled());
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 5);
+    assert_eq!(buf.as_slice(), b"abcde");
+
+    assert_eq!(t.write(b"fghijklmno").unwrap(), 10);
+
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 15);
+    assert!(t.is_rolled());
+}
+
+#[test]
+fn test_explicit_rollover() {
+    let mut t = SpooledTempFile::new(100);
+    assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26);
+    assert!(!t.is_rolled());
+
+    // roll over explicitly
+    assert!(t.roll().is_ok());
+    assert!(t.is_rolled());
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26);
+
+    let mut buf = Vec::new();
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 0);
+    assert_eq!(buf.as_slice(), b"");
+    buf.clear();
+
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 26);
+    assert_eq!(buf.as_slice(), b"abcdefghijklmnopqrstuvwxyz");
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26);
+}
+
+// called by test_seek_{buffer, file}
+// assumes t is empty and offset is 0 to start
+fn test_seek(t: &mut SpooledTempFile) {
+    assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
+
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26); // tell()
+    assert_eq!(t.seek(SeekFrom::Current(-1)).unwrap(), 25);
+    assert_eq!(t.seek(SeekFrom::Current(1)).unwrap(), 26);
+    assert_eq!(t.seek(SeekFrom::Current(1)).unwrap(), 27);
+    assert_eq!(t.seek(SeekFrom::Current(-27)).unwrap(), 0);
+    assert!(t.seek(SeekFrom::Current(-1)).is_err());
+    assert!(t.seek(SeekFrom::Current(-1245)).is_err());
+
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    assert_eq!(t.seek(SeekFrom::Start(1)).unwrap(), 1);
+    assert_eq!(t.seek(SeekFrom::Start(26)).unwrap(), 26);
+    assert_eq!(t.seek(SeekFrom::Start(27)).unwrap(), 27);
+    // // these are build errors
+    // assert!(t.seek(SeekFrom::Start(-1)).is_err());
+    // assert!(t.seek(SeekFrom::Start(-1000)).is_err());
+
+    assert_eq!(t.seek(SeekFrom::End(0)).unwrap(), 26);
+    assert_eq!(t.seek(SeekFrom::End(-1)).unwrap(), 25);
+    assert_eq!(t.seek(SeekFrom::End(-26)).unwrap(), 0);
+    assert!(t.seek(SeekFrom::End(-27)).is_err());
+    assert!(t.seek(SeekFrom::End(-99)).is_err());
+    assert_eq!(t.seek(SeekFrom::End(1)).unwrap(), 27);
+    assert_eq!(t.seek(SeekFrom::End(1)).unwrap(), 27);
+}
+
+#[test]
+fn test_seek_buffer() {
+    let mut t = spooled_tempfile(100);
+    test_seek(&mut t);
+}
+
+#[test]
+fn test_seek_file() {
+    let mut t = SpooledTempFile::new(10);
+    test_seek(&mut t);
+}
+
+fn test_seek_read(t: &mut SpooledTempFile) {
+    assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
+
+    let mut buf = Vec::new();
+
+    // we're at the end
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 0);
+    assert_eq!(buf.as_slice(), b"");
+    buf.clear();
+
+    // seek to start, read whole thing
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 26);
+    assert_eq!(buf.as_slice(), b"abcdefghijklmnopqrstuvwxyz");
+    buf.clear();
+
+    // now we're at the end again
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26); // tell()
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 0);
+    assert_eq!(buf.as_slice(), b"");
+    buf.clear();
+
+    // seek to somewhere in the middle, read a bit
+    assert_eq!(t.seek(SeekFrom::Start(5)).unwrap(), 5);
+    let mut buf = [0; 5];
+    assert!(t.read_exact(&mut buf).is_ok());
+    assert_eq!(buf, *b"fghij");
+
+    // read again from current spot
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 10); // tell()
+    assert!(t.read_exact(&mut buf).is_ok());
+    assert_eq!(buf, *b"klmno");
+
+    let mut buf = [0; 15];
+    // partial read
+    assert_eq!(t.read(&mut buf).unwrap(), 11);
+    assert_eq!(buf[0..11], *b"pqrstuvwxyz");
+
+    // try to read off the end: UnexpectedEof
+    assert!(t.read_exact(&mut buf).is_err());
+}
+
+#[test]
+fn test_seek_read_buffer() {
+    let mut t = spooled_tempfile(100);
+    test_seek_read(&mut t);
+}
+
+#[test]
+fn test_seek_read_file() {
+    let mut t = SpooledTempFile::new(10);
+    test_seek_read(&mut t);
+}
+
+fn test_overwrite_middle(t: &mut SpooledTempFile) {
+    assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
+
+    assert_eq!(t.seek(SeekFrom::Start(10)).unwrap(), 10);
+    assert_eq!(t.write(b"0123456789").unwrap(), 10);
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+
+    let mut buf = Vec::new();
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 26);
+    assert_eq!(buf.as_slice(), b"abcdefghij0123456789uvwxyz");
+}
+
+#[test]
+fn test_overwrite_middle_of_buffer() {
+    let mut t = spooled_tempfile(100);
+    test_overwrite_middle(&mut t);
+}
+
+#[test]
+fn test_overwrite_middle_of_file() {
+    let mut t = SpooledTempFile::new(10);
+    test_overwrite_middle(&mut t);
+}
+
+#[test]
+fn test_overwrite_and_extend_buffer() {
+    let mut t = spooled_tempfile(100);
+    assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
+    assert_eq!(t.seek(SeekFrom::End(-5)).unwrap(), 21);
+    assert_eq!(t.write(b"0123456789").unwrap(), 10);
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    let mut buf = Vec::new();
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 31);
+    assert_eq!(buf.as_slice(), b"abcdefghijklmnopqrstu0123456789");
+    assert!(!t.is_rolled());
+}
+
+#[test]
+fn test_overwrite_and_extend_rollover() {
+    let mut t = SpooledTempFile::new(20);
+    assert_eq!(t.write(b"abcdefghijklmno").unwrap(), 15);
+    assert!(!t.is_rolled());
+    assert_eq!(t.seek(SeekFrom::End(-5)).unwrap(), 10);
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 10); // tell()
+    assert!(!t.is_rolled());
+    assert_eq!(t.write(b"0123456789)!@#$%^&*(").unwrap(), 20);
+    assert!(t.is_rolled());
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 30); // tell()
+    let mut buf = Vec::new();
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 30);
+    assert_eq!(buf.as_slice(), b"abcdefghij0123456789)!@#$%^&*(");
+}
+
+fn test_sparse(t: &mut SpooledTempFile) {
+    assert_eq!(t.write(b"abcde").unwrap(), 5);
+    assert_eq!(t.seek(SeekFrom::Current(5)).unwrap(), 10);
+    assert_eq!(t.write(b"klmno").unwrap(), 5);
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    let mut buf = Vec::new();
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 15);
+    assert_eq!(buf.as_slice(), b"abcde\0\0\0\0\0klmno");
+}
+
+#[test]
+fn test_sparse_buffer() {
+    let mut t = spooled_tempfile(100);
+    test_sparse(&mut t);
+}
+
+#[test]
+fn test_sparse_file() {
+    let mut t = SpooledTempFile::new(1);
+    test_sparse(&mut t);
+}
+
+#[test]
+fn test_sparse_write_rollover() {
+    let mut t = spooled_tempfile(10);
+    assert_eq!(t.write(b"abcde").unwrap(), 5);
+    assert!(!t.is_rolled());
+    assert_eq!(t.seek(SeekFrom::Current(5)).unwrap(), 10);
+    assert!(!t.is_rolled());
+    assert_eq!(t.write(b"klmno").unwrap(), 5);
+    assert!(t.is_rolled());
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    let mut buf = Vec::new();
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 15);
+    assert_eq!(buf.as_slice(), b"abcde\0\0\0\0\0klmno");
+}
+
+fn test_set_len(t: &mut SpooledTempFile) {
+    let mut buf: Vec<u8> = Vec::new();
+
+    assert_eq!(t.write(b"abcdefghijklmnopqrstuvwxyz").unwrap(), 26);
+
+    // truncate to 10 bytes
+    assert!(t.set_len(10).is_ok());
+
+    // position should not have moved
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26); // tell()
+
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 0);
+    assert_eq!(buf.as_slice(), b"");
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 26); // tell()
+    buf.clear();
+
+    // read whole thing
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 10);
+    assert_eq!(buf.as_slice(), b"abcdefghij");
+    buf.clear();
+
+    // set_len to expand beyond the end
+    assert!(t.set_len(40).is_ok());
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 10); // tell()
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 40);
+    assert_eq!(
+        buf.as_slice(),
+        &b"abcdefghij\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"[..]
+    );
+}
+
+#[test]
+fn test_set_len_buffer() {
+    let mut t = spooled_tempfile(100);
+    test_set_len(&mut t);
+}
+
+#[test]
+fn test_set_len_file() {
+    let mut t = spooled_tempfile(100);
+    test_set_len(&mut t);
+}
+
+#[test]
+fn test_set_len_rollover() {
+    let mut buf: Vec<u8> = Vec::new();
+
+    let mut t = spooled_tempfile(10);
+    assert_eq!(t.write(b"abcde").unwrap(), 5);
+    assert!(!t.is_rolled());
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 5); // tell()
+
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 5);
+    assert_eq!(buf.as_slice(), b"abcde");
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 5); // tell()
+    buf.clear();
+
+    assert!(t.set_len(20).is_ok());
+    assert!(t.is_rolled());
+    assert_eq!(t.seek(SeekFrom::Current(0)).unwrap(), 5); // tell()
+    assert_eq!(t.seek(SeekFrom::Start(0)).unwrap(), 0);
+    assert_eq!(t.read_to_end(&mut buf).unwrap(), 20);
+    assert_eq!(buf.as_slice(), b"abcde\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
+}
diff --git a/tests/tempdir.rs b/tests/tempdir.rs
new file mode 100644
index 0000000..746fe47
--- /dev/null
+++ b/tests/tempdir.rs
@@ -0,0 +1,261 @@
+// Copyright 2013-2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![deny(rust_2018_idioms)]
+
+use std::env;
+use std::fs;
+use std::path::Path;
+use std::sync::mpsc::channel;
+use std::thread;
+
+use tempfile::{Builder, TempDir};
+
+macro_rules! t {
+    ($e:expr) => {
+        match $e {
+            Ok(n) => n,
+            Err(e) => panic!("error: {}", e),
+        }
+    };
+}
+
+trait PathExt {
+    fn exists(&self) -> bool;
+    fn is_dir(&self) -> bool;
+}
+
+impl PathExt for Path {
+    fn exists(&self) -> bool {
+        fs::metadata(self).is_ok()
+    }
+    fn is_dir(&self) -> bool {
+        fs::metadata(self).map(|m| m.is_dir()).unwrap_or(false)
+    }
+}
+
+fn test_tempdir() {
+    let path = {
+        let p = t!(Builder::new().prefix("foobar").tempdir_in(&Path::new(".")));
+        let p = p.path();
+        assert!(p.to_str().unwrap().contains("foobar"));
+        p.to_path_buf()
+    };
+    assert!(!path.exists());
+}
+
+#[test]
+fn test_customnamed() {
+    let tmpfile = Builder::new()
+        .prefix("prefix")
+        .suffix("suffix")
+        .rand_bytes(12)
+        .tempdir()
+        .unwrap();
+    let name = tmpfile.path().file_name().unwrap().to_str().unwrap();
+    assert!(name.starts_with("prefix"));
+    assert!(name.ends_with("suffix"));
+    assert_eq!(name.len(), 24);
+}
+
+fn test_rm_tempdir() {
+    let (tx, rx) = channel();
+    let f = move || -> () {
+        let tmp = t!(TempDir::new());
+        tx.send(tmp.path().to_path_buf()).unwrap();
+        panic!("panic to unwind past `tmp`");
+    };
+    let _ = thread::spawn(f).join();
+    let path = rx.recv().unwrap();
+    assert!(!path.exists());
+
+    let tmp = t!(TempDir::new());
+    let path = tmp.path().to_path_buf();
+    let f = move || -> () {
+        let _tmp = tmp;
+        panic!("panic to unwind past `tmp`");
+    };
+    let _ = thread::spawn(f).join();
+    assert!(!path.exists());
+
+    let path;
+    {
+        let f = move || t!(TempDir::new());
+
+        let tmp = thread::spawn(f).join().unwrap();
+        path = tmp.path().to_path_buf();
+        assert!(path.exists());
+    }
+    assert!(!path.exists());
+
+    let path;
+    {
+        let tmp = t!(TempDir::new());
+        path = tmp.into_path();
+    }
+    assert!(path.exists());
+    t!(fs::remove_dir_all(&path));
+    assert!(!path.exists());
+}
+
+fn test_rm_tempdir_close() {
+    let (tx, rx) = channel();
+    let f = move || -> () {
+        let tmp = t!(TempDir::new());
+        tx.send(tmp.path().to_path_buf()).unwrap();
+        t!(tmp.close());
+        panic!("panic when unwinding past `tmp`");
+    };
+    let _ = thread::spawn(f).join();
+    let path = rx.recv().unwrap();
+    assert!(!path.exists());
+
+    let tmp = t!(TempDir::new());
+    let path = tmp.path().to_path_buf();
+    let f = move || -> () {
+        let tmp = tmp;
+        t!(tmp.close());
+        panic!("panic when unwinding past `tmp`");
+    };
+    let _ = thread::spawn(f).join();
+    assert!(!path.exists());
+
+    let path;
+    {
+        let f = move || t!(TempDir::new());
+
+        let tmp = thread::spawn(f).join().unwrap();
+        path = tmp.path().to_path_buf();
+        assert!(path.exists());
+        t!(tmp.close());
+    }
+    assert!(!path.exists());
+
+    let path;
+    {
+        let tmp = t!(TempDir::new());
+        path = tmp.into_path();
+    }
+    assert!(path.exists());
+    t!(fs::remove_dir_all(&path));
+    assert!(!path.exists());
+}
+
+// Ideally these would be in std::os but then core would need
+// to depend on std
+fn recursive_mkdir_rel() {
+    let path = Path::new("frob");
+    let cwd = env::current_dir().unwrap();
+    println!(
+        "recursive_mkdir_rel: Making: {} in cwd {} [{}]",
+        path.display(),
+        cwd.display(),
+        path.exists()
+    );
+    t!(fs::create_dir(&path));
+    assert!(path.is_dir());
+    t!(fs::create_dir_all(&path));
+    assert!(path.is_dir());
+}
+
+fn recursive_mkdir_dot() {
+    let dot = Path::new(".");
+    t!(fs::create_dir_all(&dot));
+    let dotdot = Path::new("..");
+    t!(fs::create_dir_all(&dotdot));
+}
+
+fn recursive_mkdir_rel_2() {
+    let path = Path::new("./frob/baz");
+    let cwd = env::current_dir().unwrap();
+    println!(
+        "recursive_mkdir_rel_2: Making: {} in cwd {} [{}]",
+        path.display(),
+        cwd.display(),
+        path.exists()
+    );
+    t!(fs::create_dir_all(&path));
+    assert!(path.is_dir());
+    assert!(path.parent().unwrap().is_dir());
+    let path2 = Path::new("quux/blat");
+    println!(
+        "recursive_mkdir_rel_2: Making: {} in cwd {}",
+        path2.display(),
+        cwd.display()
+    );
+    t!(fs::create_dir("quux"));
+    t!(fs::create_dir_all(&path2));
+    assert!(path2.is_dir());
+    assert!(path2.parent().unwrap().is_dir());
+}
+
+// Ideally this would be in core, but needs TempFile
+pub fn test_remove_dir_all_ok() {
+    let tmpdir = t!(TempDir::new());
+    let tmpdir = tmpdir.path();
+    let root = tmpdir.join("foo");
+
+    println!("making {}", root.display());
+    t!(fs::create_dir(&root));
+    t!(fs::create_dir(&root.join("foo")));
+    t!(fs::create_dir(&root.join("foo").join("bar")));
+    t!(fs::create_dir(&root.join("foo").join("bar").join("blat")));
+    t!(fs::remove_dir_all(&root));
+    assert!(!root.exists());
+    assert!(!root.join("bar").exists());
+    assert!(!root.join("bar").join("blat").exists());
+}
+
+pub fn dont_double_panic() {
+    let r: Result<(), _> = thread::spawn(move || {
+        let tmpdir = TempDir::new().unwrap();
+        // Remove the temporary directory so that TempDir sees
+        // an error on drop
+        t!(fs::remove_dir(tmpdir.path()));
+        // Panic. If TempDir panics *again* due to the rmdir
+        // error then the process will abort.
+        panic!();
+    })
+    .join();
+    assert!(r.is_err());
+}
+
+fn in_tmpdir<F>(f: F)
+where
+    F: FnOnce(),
+{
+    let tmpdir = t!(TempDir::new());
+    assert!(env::set_current_dir(tmpdir.path()).is_ok());
+
+    f();
+}
+
+pub fn pass_as_asref_path() {
+    let tempdir = t!(TempDir::new());
+    takes_asref_path(&tempdir);
+
+    fn takes_asref_path<T: AsRef<Path>>(path: T) {
+        let path = path.as_ref();
+        assert!(path.exists());
+    }
+}
+
+#[test]
+fn main() {
+    in_tmpdir(test_tempdir);
+    in_tmpdir(test_rm_tempdir);
+    in_tmpdir(test_rm_tempdir_close);
+    in_tmpdir(recursive_mkdir_rel);
+    in_tmpdir(recursive_mkdir_dot);
+    in_tmpdir(recursive_mkdir_rel_2);
+    in_tmpdir(test_remove_dir_all_ok);
+    in_tmpdir(dont_double_panic);
+    in_tmpdir(pass_as_asref_path);
+}
diff --git a/tests/tempfile.rs b/tests/tempfile.rs
new file mode 100644
index 0000000..f4dddb2
--- /dev/null
+++ b/tests/tempfile.rs
@@ -0,0 +1,65 @@
+#![deny(rust_2018_idioms)]
+
+use std::fs;
+use std::io::{Read, Seek, SeekFrom, Write};
+use std::sync::mpsc::{sync_channel, TryRecvError};
+use std::thread;
+
+#[test]
+fn test_basic() {
+    let mut tmpfile = tempfile::tempfile().unwrap();
+    write!(tmpfile, "abcde").unwrap();
+    tmpfile.seek(SeekFrom::Start(0)).unwrap();
+    let mut buf = String::new();
+    tmpfile.read_to_string(&mut buf).unwrap();
+    assert_eq!("abcde", buf);
+}
+
+#[test]
+fn test_cleanup() {
+    let tmpdir = tempfile::tempdir().unwrap();
+    {
+        let mut tmpfile = tempfile::tempfile_in(&tmpdir).unwrap();
+        write!(tmpfile, "abcde").unwrap();
+    }
+    let num_files = fs::read_dir(&tmpdir).unwrap().count();
+    assert!(num_files == 0);
+}
+
+// Only run this test on Linux. MacOS doesn't like us creating so many files, apparently.
+#[cfg(target_os = "linux")]
+#[test]
+fn test_pathological_cleaner() {
+    let tmpdir = tempfile::tempdir().unwrap();
+    let (tx, rx) = sync_channel(0);
+    let cleaner_thread = thread::spawn(move || {
+        let tmp_path = rx.recv().unwrap();
+        while rx.try_recv() == Err(TryRecvError::Empty) {
+            let files = fs::read_dir(&tmp_path).unwrap();
+            for f in files {
+                // skip errors
+                if f.is_err() {
+                    continue;
+                }
+                let f = f.unwrap();
+                let _ = fs::remove_file(f.path());
+            }
+        }
+    });
+
+    // block until cleaner_thread makes progress
+    tx.send(tmpdir.path().to_owned()).unwrap();
+    // need 40-400 iterations to encounter race with cleaner on original system
+    for _ in 0..10000 {
+        let mut tmpfile = tempfile::tempfile_in(&tmpdir).unwrap();
+        write!(tmpfile, "abcde").unwrap();
+        tmpfile.seek(SeekFrom::Start(0)).unwrap();
+        let mut buf = String::new();
+        tmpfile.read_to_string(&mut buf).unwrap();
+        assert_eq!("abcde", buf);
+    }
+
+    // close the channel to make cleaner_thread exit
+    drop(tx);
+    cleaner_thread.join().expect("The cleaner thread failed");
+}
