diff --git a/src/unstable-overlays/nix/5567-make-installables-expr-context.patch b/src/unstable-overlays/nix/5567-make-installables-expr-context.patch
index d41d664..afefb17 100644
--- a/src/unstable-overlays/nix/5567-make-installables-expr-context.patch
+++ b/src/unstable-overlays/nix/5567-make-installables-expr-context.patch
@@ -1,7 +1,7 @@
 From 519d541fdc71508793ece6e087d2c1a231378558 Mon Sep 17 00:00:00 2001
 From: Skyler Grey <skyler3665@gmail.com>
 Date: Wed, 20 Jul 2022 14:45:45 +0100
-Subject: [PATCH 1/4] Make --expr always include nixpkgs
+Subject: [PATCH 01/10] Make --expr always include nixpkgs
 
 ---
  src/libcmd/installables.cc | 7 +++++--
@@ -29,7 +29,7 @@
 From 29b83de5671901e5e8755c17b840139a6f8650db Mon Sep 17 00:00:00 2001
 From: Skyler Grey <skyler3665@gmail.com>
 Date: Wed, 20 Jul 2022 14:46:17 +0100
-Subject: [PATCH 2/4] Stop --expr requiring --impure flag
+Subject: [PATCH 02/10] Stop --expr requiring --impure flag
 
 ---
  src/libcmd/installables.cc | 2 +-
@@ -52,7 +52,7 @@
 From 9e9d28496a7216a0e2893ac0eb05a8c45d898c95 Mon Sep 17 00:00:00 2001
 From: Skyler Grey <skyler3665@gmail.com>
 Date: Wed, 20 Jul 2022 23:51:16 +0100
-Subject: [PATCH 3/4] Make nix shell take installables as context
+Subject: [PATCH 03/10] Make nix shell take installables as context
 
 ---
  src/libcmd/installables.cc | 46 +++++++++++++++++++++++++++++++++++++-
@@ -122,7 +122,7 @@
 From e3045be11cbac91a5e65ef42e42e320e6689e713 Mon Sep 17 00:00:00 2001
 From: Skyler Grey <skyler3665@gmail.com>
 Date: Wed, 20 Jul 2022 23:56:09 +0100
-Subject: [PATCH 4/4] Update documentation to match nix shell change
+Subject: [PATCH 04/10] Update documentation to match nix shell change
 
 ---
  src/nix/nix.md | 9 +++++++--
@@ -148,3 +148,263 @@
  
  For most commands, if no installable is specified, the default is `.`,
  i.e. Nix will operate on the default flake output attribute of the
+
+From 4d6c60a8187d9904312d062a19e61ca5c338bc94 Mon Sep 17 00:00:00 2001
+From: Skyler Grey <skyler3665@gmail.com>
+Date: Thu, 21 Jul 2022 21:49:44 +0100
+Subject: [PATCH 05/10] Only build . with expr if it'd be a default installable
+
+---
+ src/libcmd/installables.cc | 16 +++++++++-------
+ 1 file changed, 9 insertions(+), 7 deletions(-)
+
+diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc
+index 1abad72e333..15679590e39 100644
+--- a/src/libcmd/installables.cc
++++ b/src/libcmd/installables.cc
+@@ -820,13 +820,15 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+             auto parsed = state->parseExprFromString(concatStringsSep(";", e), absPath("."));
+             state->eval(parsed, *vFile);
+ 
+-            auto [prefix, outputsSpec] = parseOutputsSpec(".");
+-            result.push_back(
+-                std::make_shared<InstallableAttrPath>(
+-                    state, *this, vFile,
+-                    prefix == "." ? "" : prefix,
+-                    outputsSpec));
+-            return result;
++            if (!ss.empty()) {
++                auto [prefix, outputsSpec] = parseOutputsSpec(".");
++                result.push_back(
++                    std::make_shared<InstallableAttrPath>(
++                        state, *this, vFile,
++                        prefix == "." ? "" : prefix,
++                        outputsSpec));
++                return result;
++            }
+         }
+ 
+         for (auto & s : ss) {
+
+From 14084facbd5654fa9e406ce0391c0544f3a42763 Mon Sep 17 00:00:00 2001
+From: Skyler Grey <skyler3665@gmail.com>
+Date: Fri, 22 Jul 2022 14:28:31 +0100
+Subject: [PATCH 06/10] Do not include implicit installables with expr
+
+---
+ src/libcmd/command.hh      | 2 +-
+ src/libcmd/installables.cc | 9 +++++----
+ 2 files changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/src/libcmd/command.hh b/src/libcmd/command.hh
+index 3b4b40981de..ba6ab4197ad 100644
+--- a/src/libcmd/command.hh
++++ b/src/libcmd/command.hh
+@@ -102,7 +102,7 @@ struct SourceExprCommand : virtual Args, MixFlakeOptions
+     SourceExprCommand(bool supportReadOnlyMode = false);
+ 
+     std::vector<std::shared_ptr<Installable>> parseInstallables(
+-        ref<Store> store, std::vector<std::string> ss);
++        ref<Store> store, std::vector<std::string> ss, std::optional<std::vector<std::string>> explicitInstallables);
+ 
+     std::shared_ptr<Installable> parseInstallable(
+         ref<Store> store, const std::string & installable);
+diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc
+index 15679590e39..fee419b240a 100644
+--- a/src/libcmd/installables.cc
++++ b/src/libcmd/installables.cc
+@@ -754,7 +754,7 @@ FlakeRef InstallableFlake::nixpkgsFlakeRef() const
+ }
+ 
+ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+-    ref<Store> store, std::vector<std::string> ss)
++    ref<Store> store, std::vector<std::string> ss, std::optional<std::vector<std::string>> explicitInstallables = std::nullopt)
+ {
+     std::vector<std::shared_ptr<Installable>> result;
+ 
+@@ -780,7 +780,7 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+         else {
+             Strings e = {};
+ 
+-            for (auto & s : ss) {
++            for (auto & s : explicitInstallables.value_or(ss)) {
+                 std::exception_ptr ex;
+ 
+                 if (s.find('/') != std::string::npos) {
+@@ -827,8 +827,8 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+                         state, *this, vFile,
+                         prefix == "." ? "" : prefix,
+                         outputsSpec));
+-                return result;
+             }
++            return result;
+         }
+ 
+         for (auto & s : ss) {
+@@ -1094,11 +1094,12 @@ void InstallablesCommand::prepare()
+ 
+ Installables InstallablesCommand::load() {
+     Installables installables;
++    auto explicitInstallables = _installables;
+     if (_installables.empty() && useDefaultInstallables())
+         // FIXME: commands like "nix profile install" should not have a
+         // default, probably.
+         _installables.push_back(".");
+-    return parseInstallables(getStore(), _installables);
++    return parseInstallables(getStore(), _installables, explicitInstallables);
+ }
+ 
+ std::vector<std::string> InstallablesCommand::getFlakesForCompletion()
+
+From f82a172cfe18af507fadac565223769af2a39d86 Mon Sep 17 00:00:00 2001
+From: Skyler Grey <skyler3665@gmail.com>
+Date: Fri, 22 Jul 2022 20:13:48 +0100
+Subject: [PATCH 07/10] Allow running --expr purely again
+
+---
+ src/libcmd/installables.cc | 15 ++++++++-------
+ src/nix/nix.md             |  2 --
+ 2 files changed, 8 insertions(+), 9 deletions(-)
+
+diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc
+index fee419b240a..3073b153568 100644
+--- a/src/libcmd/installables.cc
++++ b/src/libcmd/installables.cc
+@@ -767,7 +767,7 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+             throw UsageError("'--file' and '--expr' are exclusive");
+ 
+         // FIXME: backward compatibility hack
+-        evalSettings.pureEval = false;
++        if (file) evalSettings.pureEval = false;
+ 
+         auto state = getEvalState();
+         auto vFile = state->allocValue();
+@@ -780,7 +780,7 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+         else {
+             Strings e = {};
+ 
+-            for (auto & s : explicitInstallables.value_or(ss)) {
++            for (auto & s : explicitInstallables.value_or(std::vector<std::string>())) {
+                 std::exception_ptr ex;
+ 
+                 if (s.find('/') != std::string::npos) {
+@@ -796,7 +796,7 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+ 
+                 try {
+                     auto [flakeRef, fragment, outputsSpec] = parseFlakeRefWithFragmentAndOutputsSpec(s, absPath("."));
+-/*                    result.push_back(std::make_shared<InstallableFlake>(
++                    auto installableFlake = InstallableFlake(
+                             this,
+                             getEvalState(),
+                             std::move(flakeRef),
+@@ -804,10 +804,11 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+                             outputsSpec,
+                             getDefaultFlakeAttrPaths(),
+                             getDefaultFlakeAttrPathPrefixes(),
+-                            lockFlags));*/
+-                    e.push_back("with (builtins.getFlake \"" + flakeRef.to_string() + "\")" + (fragment != "" ? "." + fragment : ""));
+-                    e.push_back("with (builtins.getFlake \"" + flakeRef.to_string() + "\").packages.\"${builtins.currentSystem}\"" + (fragment != "" ? "." + fragment : ""));
+-                    e.push_back("with (builtins.getFlake \"" + flakeRef.to_string() + "\").legacyPackages.\"${builtins.currentSystem}\"" + (fragment != "" ? "." + fragment : ""));
++                            lockFlags);
++                    auto lockedFlake = installableFlake.getLockedFlake()->flake.lockedRef;
++                    e.push_back("with (builtins.getFlake \"" + lockedFlake.to_string() + "\")" + (fragment != "" ? "." + fragment : ""));
++                    e.push_back("with (builtins.getFlake \"" + lockedFlake.to_string() + "\").packages.\"${builtins.currentSystem}\"" + (fragment != "" ? "." + fragment : ""));
++                    e.push_back("with (builtins.getFlake \"" + lockedFlake.to_string() + "\").legacyPackages.\"${builtins.currentSystem}\"" + (fragment != "" ? "." + fragment : ""));
+                     continue;
+                 } catch (...) {
+                     ex = std::current_exception();
+diff --git a/src/nix/nix.md b/src/nix/nix.md
+index b5bee708451..33d618d88ad 100644
+--- a/src/nix/nix.md
++++ b/src/nix/nix.md
+@@ -145,8 +145,6 @@ the Nix store. Here are the recognised types of installables:
+   # nix shell nixpkgs#python3 --expr 'withPackages(pyPkgs: with pyPkgs; [ numpy ])'
+   ```
+ 
+-  Using `--expr` implies `--impure`.
+-
+ For most commands, if no installable is specified, the default is `.`,
+ i.e. Nix will operate on the default flake output attribute of the
+ flake in the current directory.
+
+From 91da7d50e7ba52b846fa50b8e106d723380b08d5 Mon Sep 17 00:00:00 2001
+From: Skyler Grey <skyler3665@gmail.com>
+Date: Sat, 23 Jul 2022 11:46:07 +0100
+Subject: [PATCH 08/10] Fix builtins.currentSystem in pure evaluation
+
+---
+ src/libcmd/installables.cc | 15 ++++++++++++---
+ 1 file changed, 12 insertions(+), 3 deletions(-)
+
+diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc
+index 3073b153568..d20ce6ed618 100644
+--- a/src/libcmd/installables.cc
++++ b/src/libcmd/installables.cc
+@@ -806,9 +806,18 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+                             getDefaultFlakeAttrPathPrefixes(),
+                             lockFlags);
+                     auto lockedFlake = installableFlake.getLockedFlake()->flake.lockedRef;
+-                    e.push_back("with (builtins.getFlake \"" + lockedFlake.to_string() + "\")" + (fragment != "" ? "." + fragment : ""));
+-                    e.push_back("with (builtins.getFlake \"" + lockedFlake.to_string() + "\").packages.\"${builtins.currentSystem}\"" + (fragment != "" ? "." + fragment : ""));
+-                    e.push_back("with (builtins.getFlake \"" + lockedFlake.to_string() + "\").legacyPackages.\"${builtins.currentSystem}\"" + (fragment != "" ? "." + fragment : ""));
++
++                    auto defaultPathPrefixes = getDefaultFlakeAttrPathPrefixes();
++                    defaultPathPrefixes.push_back("");
++
++                    for (auto & path : defaultPathPrefixes) {
++                        if (path.length()) {
++                            path.pop_back();
++                            path = "." + path;
++                        }
++
++                        e.push_back(str(boost::format("with (builtins.getFlake \"%1%\")%2%%3%") % lockedFlake.to_string() % path % (fragment != "" ? "." + fragment : "")));
++                    }
+                     continue;
+                 } catch (...) {
+                     ex = std::current_exception();
+
+From a126a92e4f2c6087bf46dfb8c4acd5c34e5422eb Mon Sep 17 00:00:00 2001
+From: Skyler Grey <skyler3665@gmail.com>
+Date: Sun, 24 Jul 2022 01:30:00 +0100
+Subject: [PATCH 09/10] Gracefully handle missing attributes
+
+---
+ src/libcmd/installables.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc
+index d20ce6ed618..9c8a848d641 100644
+--- a/src/libcmd/installables.cc
++++ b/src/libcmd/installables.cc
+@@ -816,7 +816,7 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+                             path = "." + path;
+                         }
+ 
+-                        e.push_back(str(boost::format("with (builtins.getFlake \"%1%\")%2%%3%") % lockedFlake.to_string() % path % (fragment != "" ? "." + fragment : "")));
++                        e.push_back(str(boost::format("with (builtins.getFlake \"%1%\")%2%%3% or {}") % lockedFlake.to_string() % path % (fragment != "" ? "." + fragment : "")));
+                     }
+                     continue;
+                 } catch (...) {
+
+From c7302640120ff9fff6c3a653c22fa678efbeb903 Mon Sep 17 00:00:00 2001
+From: Skyler Grey <skyler3665@gmail.com>
+Date: Sun, 24 Jul 2022 07:11:37 +0100
+Subject: [PATCH 10/10] Fix including a flake without any attrpath
+
+---
+ src/libcmd/installables.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/libcmd/installables.cc b/src/libcmd/installables.cc
+index 9c8a848d641..bdc3830956a 100644
+--- a/src/libcmd/installables.cc
++++ b/src/libcmd/installables.cc
+@@ -816,7 +816,7 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
+                             path = "." + path;
+                         }
+ 
+-                        e.push_back(str(boost::format("with (builtins.getFlake \"%1%\")%2%%3% or {}") % lockedFlake.to_string() % path % (fragment != "" ? "." + fragment : "")));
++                        e.push_back(str(boost::format("with (builtins.getFlake \"%1%\").outputs%2%%3% or {}") % lockedFlake.to_string() % path % (fragment != "" ? "." + fragment : "")));
+                     }
+                     continue;
+                 } catch (...) {
