diff --git a/google_threads/env.h b/google_threads/env.h
new file mode 100644
index 0000000..ef516cd
--- /dev/null
+++ b/google_threads/env.h
@@ -0,0 +1,93 @@
+#ifndef THIRD_PARTY_EIGEN3_GOOGLE_THREADS_ENV_H_
+#define THIRD_PARTY_EIGEN3_GOOGLE_THREADS_ENV_H_
+
+#include <functional>
+#include <string>
+#include <utility>
+
+#include "thread/fiber/fiber.h"
+#include "thread/thread.h"
+#include "thread/thread_options.h"
+
+namespace Eigen {
+
+inline std::string GetGoogleNamePrefix() { return "GoogleEigen_"; }
+
+// Implements the `Environment` interface needed by Eigen's `ThreadPoolTempl`
+// class. See Eigen's `ThreadEnvironment.h` for an implementation that uses the
+// banned `std::thread` library.
+struct GoogleEnvironment {
+  struct Task {
+    std::function<void()> f;
+  };
+  struct EnvThread {};
+  virtual ~GoogleEnvironment() = default;
+  virtual EnvThread* CreateThread(std::function<void()> f) = 0;
+  virtual Task CreateTask(std::function<void()> f) = 0;
+  virtual void ExecuteTask(const Task& task) = 0;
+};
+
+// Uses Google Threads (go/c++-concurrency#threads_fibers) to handle thread
+// management.
+struct GoogleThreadEnvironment : public GoogleEnvironment {
+  // Constructor must start the thread, while destructor must join it.
+  struct EnvThread : public GoogleEnvironment::EnvThread {
+    EnvThread(std::function<void()> f) : func_thread_(std::move(f)) {
+      func_thread_.Start();
+    };
+    ~EnvThread() { func_thread_.Join(); };
+    void OnCancel() {};
+
+   private:
+    // Wraps a function in a thread and calls it when the thread starts.
+    // Needed to conform to Eigen's `EnvThread` interface.
+    class FuncThread : public ::Thread {
+     public:
+      static ::thread::Options options() {
+        ::thread::Options options;
+        options.set_joinable(true);
+        return options;
+      }
+
+      FuncThread(std::function<void()> f)
+          : ::Thread(options(), GetGoogleNamePrefix()), f_(std::move(f)) {};
+      ~FuncThread() override = default;
+      void Run() override { f_(); };
+
+     private:
+      std::function<void()> f_;
+    };
+
+    // Managed by `EnvThread` internally.
+    FuncThread func_thread_;
+  };
+
+  EnvThread* CreateThread(std::function<void()> f) {
+    return new EnvThread(std::move(f));
+  }
+  Task CreateTask(std::function<void()> f) { return Task{std::move(f)}; }
+  void ExecuteTask(const Task& task) { task.f(); }
+};
+
+// Uses Google Fibers (go/fibers) to handle thread management.
+struct GoogleFiberEnvironment : public GoogleEnvironment {
+  // Constructor must start the thread, while destructor must join it.
+  struct EnvThread : public GoogleEnvironment::EnvThread {
+    EnvThread(std::function<void()> f) : fiber_(std::move(f)) {};
+    ~EnvThread() { fiber_.Join(); };
+    void OnCancel() {};
+
+   private:
+    ::thread::Fiber fiber_;
+  };
+
+  EnvThread* CreateThread(std::function<void()> f) {
+    return new EnvThread(std::move(f));
+  }
+  Task CreateTask(std::function<void()> f) { return Task{std::move(f)}; }
+  void ExecuteTask(const Task& task) { task.f(); }
+};
+
+}  // namespace Eigen
+
+#endif  // THIRD_PARTY_EIGEN3_GOOGLE_THREADS_ENV_H_
