diff --git a/README.md b/README.md
index a953c0f7159d3cb37d864cc68ac4552cc14c6672..61054f8f2bc50ad9755afd532e846b64977625af 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,3 @@ of the manual. It helps you to get started with building Nix from source.
 ## License
 
 Nix is released under the LGPL v2.1
-
-This product includes software developed by the OpenSSL Project for
-use in the [OpenSSL Toolkit](https://www.OpenSSL.org/).
diff --git a/doc/manual/command-ref/nix-env.xml b/doc/manual/command-ref/nix-env.xml
index d257a5e49c70d37d35a2b836d6699fbef1df5479..9c03ccce11c49714a9899853fc3639959e26d40f 100644
--- a/doc/manual/command-ref/nix-env.xml
+++ b/doc/manual/command-ref/nix-env.xml
@@ -1066,7 +1066,8 @@ user environment elements, etc. -->
     the derivation, which can be used to unambiguously select it using
     the <link linkend="opt-attr"><option>--attr</option> option</link>
     available in commands that install derivations like
-    <literal>nix-env --install</literal>.</para></listitem>
+    <literal>nix-env --install</literal>. This option only works
+    together with <option>--available</option></para></listitem>
 
   </varlistentry>
 
diff --git a/doc/manual/command-ref/nix-store.xml b/doc/manual/command-ref/nix-store.xml
index 113a3c2e41ed414686f93e341e0ee9940863de3b..e8bbd16e849b5157509c7c3779d2966d4d106cd0 100644
--- a/doc/manual/command-ref/nix-store.xml
+++ b/doc/manual/command-ref/nix-store.xml
@@ -360,7 +360,6 @@ EOF
     <arg choice='plain'><option>--print-roots</option></arg>
     <arg choice='plain'><option>--print-live</option></arg>
     <arg choice='plain'><option>--print-dead</option></arg>
-    <arg choice='plain'><option>--delete</option></arg>
   </group>
   <arg><option>--max-freed</option> <replaceable>bytes</replaceable></arg>
 </cmdsynopsis>
@@ -407,14 +406,6 @@ the Nix store not reachable via file system references from a set of
 
   </varlistentry>
 
-  <varlistentry><term><option>--delete</option></term>
-
-    <listitem><para>This operation performs an actual garbage
-    collection.  All dead paths are removed from the
-    store.  This is the default.</para></listitem>
-
-  </varlistentry>
-
 </variablelist>
 
 <para>By default, all unreachable paths are deleted.  The following
@@ -444,10 +435,10 @@ and <link
 linkend="conf-keep-derivations"><literal>keep-derivations</literal></link>
 variables in the Nix configuration file.</para>
 
-<para>With <option>--delete</option>, the collector prints the total
-number of freed bytes when it finishes (or when it is interrupted).
-With <option>--print-dead</option>, it prints the number of bytes that
-would be freed.</para>
+<para>By default, the collector prints the total number of freed bytes
+when it finishes (or when it is interrupted). With
+<option>--print-dead</option>, it prints the number of bytes that would
+be freed.</para>
 
 </refsection>
 
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index f6c96bd685fedb8d9b686da711c00ae7f1ed5ed5..ab4d2bc4b174b3b932211d84a75a8eda48386419 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -6,6 +6,7 @@
 #include "symbol-table.hh"
 #include "config.hh"
 
+#include <regex>
 #include <map>
 #include <optional>
 #include <unordered_map>
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index 5ef8cb989b54bdfba84cd8a61cde2ac443450cdf..e47b00acf3b1a6fd5b3a3c13186753daa48b8f8a 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -914,6 +914,8 @@ static void opQuery(Globals & globals, Strings opFlags, Strings opArgs)
             throw UsageError(format("unknown flag '%1%'") % arg);
     }
 
+    if (printAttrPath && source != sAvailable)
+        throw UsageError("--attr-path(-P) only works with --available");
 
     /* Obtain derivation information from the specified source. */
     DrvInfos availElems, installedElems;
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index 9336baa831e3de4e678f9586cc990575148f7ab8..806ab756381e5930844845d6c69d9dd06ace3bce 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -572,7 +572,6 @@ static void opGC(Strings opFlags, Strings opArgs)
         if (*i == "--print-roots") printRoots = true;
         else if (*i == "--print-live") options.action = GCOptions::gcReturnLive;
         else if (*i == "--print-dead") options.action = GCOptions::gcReturnDead;
-        else if (*i == "--delete") options.action = GCOptions::gcDeleteDead;
         else if (*i == "--max-freed") {
             long long maxFreed = getIntArg<long long>(*i, i, opFlags.end(), true);
             options.maxFreed = maxFreed >= 0 ? maxFreed : 0;
diff --git a/src/nix/repl.cc b/src/nix/repl.cc
index 9f76e1b4f5b6b9b31ef445d7a809758791d13e0b..a2632cff81cbda5128802fa854a1d5fae2e414cf 100644
--- a/src/nix/repl.cc
+++ b/src/nix/repl.cc
@@ -32,6 +32,9 @@ extern "C" {
 #include "command.hh"
 #include "finally.hh"
 
+#define GC_INCLUDE_NEW
+#include <gc/gc_cpp.h>
+
 namespace nix {
 
 #define ESC_RED "\033[31m"
@@ -42,10 +45,10 @@ namespace nix {
 #define ESC_CYA "\033[36m"
 #define ESC_END "\033[0m"
 
-struct NixRepl
+struct NixRepl : gc
 {
     string curDir;
-    EvalState state;
+    std::unique_ptr<EvalState> state;
     Bindings * autoArgs;
 
     Strings loadedFiles;
@@ -123,8 +126,8 @@ string removeWhitespace(string s)
 
 
 NixRepl::NixRepl(const Strings & searchPath, nix::ref<Store> store)
-    : state(searchPath, store)
-    , staticEnv(false, &state.staticBaseEnv)
+    : state(std::make_unique<EvalState>(searchPath, store))
+    , staticEnv(false, &state->staticBaseEnv)
     , historyFile(getDataDir() + "/nix/repl-history")
 {
     curDir = absPath(".");
@@ -353,8 +356,8 @@ StringSet NixRepl::completePrefix(string prefix)
 
             Expr * e = parseString(expr);
             Value v;
-            e->eval(state, *env, v);
-            state.forceAttrs(v);
+            e->eval(*state, *env, v);
+            state->forceAttrs(v);
 
             for (auto & i : *v.attrs) {
                 string name = i.name;
@@ -409,11 +412,11 @@ bool isVarName(const string & s)
 
 
 Path NixRepl::getDerivationPath(Value & v) {
-    auto drvInfo = getDerivation(state, v, false);
+    auto drvInfo = getDerivation(*state, v, false);
     if (!drvInfo)
         throw Error("expression does not evaluate to a derivation, so I can't build it");
     Path drvPath = drvInfo->queryDrvPath();
-    if (drvPath == "" || !state.store->isValidPath(state.store->parseStorePath(drvPath)))
+    if (drvPath == "" || !state->store->isValidPath(state->store->parseStorePath(drvPath)))
         throw Error("expression did not evaluate to a valid derivation");
     return drvPath;
 }
@@ -459,12 +462,12 @@ bool NixRepl::processLine(string line)
     }
 
     else if (command == ":l" || command == ":load") {
-        state.resetFileCache();
+        state->resetFileCache();
         loadFile(arg);
     }
 
     else if (command == ":r" || command == ":reload") {
-        state.resetFileCache();
+        state->resetFileCache();
         reloadFiles();
     }
 
@@ -476,13 +479,13 @@ bool NixRepl::processLine(string line)
 
         if (v.type == tPath || v.type == tString) {
             PathSet context;
-            auto filename = state.coerceToString(noPos, v, context);
-            pos.file = state.symbols.create(filename);
+            auto filename = state->coerceToString(noPos, v, context);
+            pos.file = state->symbols.create(filename);
         } else if (v.type == tLambda) {
             pos = v.lambda.fun->pos;
         } else {
             // assume it's a derivation
-            pos = findDerivationFilename(state, v, arg);
+            pos = findDerivationFilename(*state, v, arg);
         }
 
         // Open in EDITOR
@@ -492,7 +495,7 @@ bool NixRepl::processLine(string line)
         runProgram(editor, args);
 
         // Reload right after exiting the editor
-        state.resetFileCache();
+        state->resetFileCache();
         reloadFiles();
     }
 
@@ -505,7 +508,7 @@ bool NixRepl::processLine(string line)
         Value v, f, result;
         evalString(arg, v);
         evalString("drv: (import <nixpkgs> {}).runCommand \"shell\" { buildInputs = [ drv ]; } \"\"", f);
-        state.callFunction(f, v, result, Pos());
+        state->callFunction(f, v, result, Pos());
 
         Path drvPath = getDerivationPath(result);
         runProgram(settings.nixBinDir + "/nix-shell", Strings{drvPath});
@@ -521,10 +524,10 @@ bool NixRepl::processLine(string line)
                but doing it in a child makes it easier to recover from
                problems / SIGINT. */
             if (runProgram(settings.nixBinDir + "/nix", Strings{"build", "--no-link", drvPath}) == 0) {
-                auto drv = readDerivation(*state.store, drvPath);
+                auto drv = readDerivation(*state->store, drvPath);
                 std::cout << std::endl << "this derivation produced the following outputs:" << std::endl;
                 for (auto & i : drv.outputs)
-                    std::cout << fmt("  %s -> %s\n", i.first, state.store->printStorePath(i.second.path));
+                    std::cout << fmt("  %s -> %s\n", i.first, state->store->printStorePath(i.second.path));
             }
         } else if (command == ":i") {
             runProgram(settings.nixBinDir + "/nix-env", Strings{"-i", drvPath});
@@ -554,11 +557,11 @@ bool NixRepl::processLine(string line)
             isVarName(name = removeWhitespace(string(line, 0, p))))
         {
             Expr * e = parseString(string(line, p + 1));
-            Value & v(*state.allocValue());
+            Value & v(*state->allocValue());
             v.type = tThunk;
             v.thunk.env = env;
             v.thunk.expr = e;
-            addVarToScope(state.symbols.create(name), v);
+            addVarToScope(state->symbols.create(name), v);
         } else {
             Value v;
             evalString(line, v);
@@ -575,21 +578,21 @@ void NixRepl::loadFile(const Path & path)
     loadedFiles.remove(path);
     loadedFiles.push_back(path);
     Value v, v2;
-    state.evalFile(lookupFileArg(state, path), v);
-    state.autoCallFunction(*autoArgs, v, v2);
+    state->evalFile(lookupFileArg(*state, path), v);
+    state->autoCallFunction(*autoArgs, v, v2);
     addAttrsToScope(v2);
 }
 
 
 void NixRepl::initEnv()
 {
-    env = &state.allocEnv(envSize);
-    env->up = &state.baseEnv;
+    env = &state->allocEnv(envSize);
+    env->up = &state->baseEnv;
     displ = 0;
     staticEnv.vars.clear();
 
     varNames.clear();
-    for (auto & i : state.staticBaseEnv.vars)
+    for (auto & i : state->staticBaseEnv.vars)
         varNames.insert(i.first);
 }
 
@@ -613,7 +616,7 @@ void NixRepl::reloadFiles()
 
 void NixRepl::addAttrsToScope(Value & attrs)
 {
-    state.forceAttrs(attrs);
+    state->forceAttrs(attrs);
     for (auto & i : *attrs.attrs)
         addVarToScope(i.name, *i.value);
     std::cout << format("Added %1% variables.") % attrs.attrs->size() << std::endl;
@@ -632,7 +635,7 @@ void NixRepl::addVarToScope(const Symbol & name, Value & v)
 
 Expr * NixRepl::parseString(string s)
 {
-    Expr * e = state.parseExprFromString(s, curDir, staticEnv);
+    Expr * e = state->parseExprFromString(s, curDir, staticEnv);
     return e;
 }
 
@@ -640,8 +643,8 @@ Expr * NixRepl::parseString(string s)
 void NixRepl::evalString(string s, Value & v)
 {
     Expr * e = parseString(s);
-    e->eval(state, *env, v);
-    state.forceValue(v);
+    e->eval(*state, *env, v);
+    state->forceValue(v);
 }
 
 
@@ -671,7 +674,7 @@ std::ostream & NixRepl::printValue(std::ostream & str, Value & v, unsigned int m
     str.flush();
     checkInterrupt();
 
-    state.forceValue(v);
+    state->forceValue(v);
 
     switch (v.type) {
 
@@ -700,13 +703,13 @@ std::ostream & NixRepl::printValue(std::ostream & str, Value & v, unsigned int m
     case tAttrs: {
         seen.insert(&v);
 
-        bool isDrv = state.isDerivation(v);
+        bool isDrv = state->isDerivation(v);
 
         if (isDrv) {
             str << "«derivation ";
-            Bindings::iterator i = v.attrs->find(state.sDrvPath);
+            Bindings::iterator i = v.attrs->find(state->sDrvPath);
             PathSet context;
-            Path drvPath = i != v.attrs->end() ? state.coerceToPath(*i->pos, *i->value, context) : "???";
+            Path drvPath = i != v.attrs->end() ? state->coerceToPath(*i->pos, *i->value, context) : "???";
             str << drvPath << "»";
         }
 
@@ -810,7 +813,7 @@ struct CmdRepl : StoreCommand, MixEvalArgs
     {
         evalSettings.pureEval = false;
         auto repl = std::make_unique<NixRepl>(searchPath, openStore());
-        repl->autoArgs = getAutoArgs(repl->state);
+        repl->autoArgs = getAutoArgs(*repl->state);
         repl->mainLoop(files);
     }
 };