diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index d458ab2721ff701294361d123499a45e590bba3d..9efb8eae5b68babdad774382a901743cd7fa6d4d 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -688,7 +688,7 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
             for (auto & j : refs) {
                 drv.inputSrcs.insert(j.clone());
                 if (j.isDerivation())
-                    drv.inputDrvs[j.clone()] = state.store->queryDerivationOutputNames(j);
+                    drv.inputDrvs[j.clone()] = readDerivation(*state.store, state.store->toRealPath(j)).outputNames();
             }
         }
 
diff --git a/src/libstore/build.cc b/src/libstore/build.cc
index bdf03ff944ffcfbe5e9921db6fde41bf21f59163..3ab6220e3156cdf119e55dade1b7187accf94325 100644
--- a/src/libstore/build.cc
+++ b/src/libstore/build.cc
@@ -2723,9 +2723,6 @@ struct RestrictedStore : public LocalFSStore
     StorePathSet queryDerivationOutputs(const StorePath & path) override
     { throw Error("queryDerivationOutputs"); }
 
-    StringSet queryDerivationOutputNames(const StorePath & path) override
-    { throw Error("queryDerivationOutputNames"); }
-
     std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override
     { throw Error("queryPathFromHashPart"); }
 
diff --git a/src/libstore/daemon.cc b/src/libstore/daemon.cc
index 5cff170dd93ae0ee2267cafe1d29716fd77c1f90..dc201557943e6177e7966250f0bbd55587c90672 100644
--- a/src/libstore/daemon.cc
+++ b/src/libstore/daemon.cc
@@ -329,8 +329,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
     case wopQueryDerivationOutputNames: {
         auto path = store->parseStorePath(readString(from));
         logger->startWork();
-        StringSet names;
-        names = store->queryDerivationOutputNames(path);
+        auto names = readDerivation(*store, store->toRealPath(path)).outputNames();
         logger->stopWork();
         to << names;
         break;
diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc
index c68e7b16b1a0bcc83b62162fcdc099b686afcc67..6de91ec973d34d93c8999abc4ed2d6d602cb3a9c 100644
--- a/src/libstore/derivations.cc
+++ b/src/libstore/derivations.cc
@@ -410,6 +410,15 @@ StorePathSet BasicDerivation::outputPaths() const
 }
 
 
+StringSet BasicDerivation::outputNames() const
+{
+    StringSet names;
+    for (auto & i : outputs)
+        names.insert(i.first);
+    return names;
+}
+
+
 Source & readDerivation(Source & in, const Store & store, BasicDerivation & drv)
 {
     drv.outputs.clear();
diff --git a/src/libstore/derivations.hh b/src/libstore/derivations.hh
index b1224b93bbb7dbc04dcaf042ae1b1bb3cfd91188..88aed66bf2974378e3b768e3eab94ac197e3400d 100644
--- a/src/libstore/derivations.hh
+++ b/src/libstore/derivations.hh
@@ -58,6 +58,8 @@ struct BasicDerivation
     /* Return the output paths of a derivation. */
     StorePathSet outputPaths() const;
 
+    /* Return the output names of a derivation. */
+    StringSet outputNames() const;
 };
 
 struct Derivation : BasicDerivation
diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc
index 1c3795eb1c0e7508fb964bb26221c17c67ebe173..e379db42605db05b071efbbdf5a583c33c4d3645 100644
--- a/src/libstore/local-store.cc
+++ b/src/libstore/local-store.cc
@@ -785,23 +785,6 @@ StorePathSet LocalStore::queryDerivationOutputs(const StorePath & path)
 }
 
 
-StringSet LocalStore::queryDerivationOutputNames(const StorePath & path)
-{
-    return retrySQLite<StringSet>([&]() {
-        auto state(_state.lock());
-
-        auto useQueryDerivationOutputs(state->stmtQueryDerivationOutputs.use()
-            (queryValidPathId(*state, path)));
-
-        StringSet outputNames;
-        while (useQueryDerivationOutputs.next())
-            outputNames.insert(useQueryDerivationOutputs.getStr(0));
-
-        return outputNames;
-    });
-}
-
-
 std::optional<StorePath> LocalStore::queryPathFromHashPart(const std::string & hashPart)
 {
     if (hashPart.size() != storePathHashLen) throw Error("invalid hash part");
diff --git a/src/libstore/local-store.hh b/src/libstore/local-store.hh
index c1e75390c5d20d6536cbaf53d74cbcd4a9bb383b..e17cc45aeadd879a329d7f139ba24790fa12afb4 100644
--- a/src/libstore/local-store.hh
+++ b/src/libstore/local-store.hh
@@ -135,8 +135,6 @@ public:
 
     StorePathSet queryDerivationOutputs(const StorePath & path) override;
 
-    StringSet queryDerivationOutputNames(const StorePath & path) override;
-
     std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override;
 
     StorePathSet querySubstitutablePaths(const StorePathSet & paths) override;
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 5c36693e699ff494762d97c4da6eea553cfa613e..735f59a91ade97bb3676bc8aa7a5b9900aba2e3a 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -418,15 +418,6 @@ StorePathSet RemoteStore::queryDerivationOutputs(const StorePath & path)
 }
 
 
-PathSet RemoteStore::queryDerivationOutputNames(const StorePath & path)
-{
-    auto conn(getConnection());
-    conn->to << wopQueryDerivationOutputNames << printStorePath(path);
-    conn.processStderr();
-    return readStrings<PathSet>(conn->from);
-}
-
-
 std::optional<StorePath> RemoteStore::queryPathFromHashPart(const std::string & hashPart)
 {
     auto conn(getConnection());
diff --git a/src/libstore/remote-store.hh b/src/libstore/remote-store.hh
index 3c86b4524ebe3f3aae4ffba29bacdaf4b9a5aa29..80c8e9f1168a2d80e3790de07b7b9dfff9717ca0 100644
--- a/src/libstore/remote-store.hh
+++ b/src/libstore/remote-store.hh
@@ -51,8 +51,6 @@ public:
 
     StorePathSet queryDerivationOutputs(const StorePath & path) override;
 
-    StringSet queryDerivationOutputNames(const StorePath & path) override;
-
     std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override;
 
     StorePathSet querySubstitutablePaths(const StorePathSet & paths) override;
diff --git a/src/libstore/store-api.hh b/src/libstore/store-api.hh
index b1e25fc7d66d72d421c9624cf01cbd8bb9aac6e1..5ba17e0bc9d9c63c6a98c317b4e6d31851536245 100644
--- a/src/libstore/store-api.hh
+++ b/src/libstore/store-api.hh
@@ -430,10 +430,6 @@ public:
     virtual StorePathSet queryDerivationOutputs(const StorePath & path)
     { unsupported("queryDerivationOutputs"); }
 
-    /* Query the output names of the derivation denoted by `path'. */
-    virtual StringSet queryDerivationOutputNames(const StorePath & path)
-    { unsupported("queryDerivationOutputNames"); }
-
     /* Query the full store path given the hash part of a valid store
        path, or empty if the path doesn't exist. */
     virtual std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) = 0;
diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh
index 857d54d993fc4b61f597975bdce17f307c22dac8..ac42457fc41c2fea03f8cdd528be579911c7d582 100644
--- a/src/libstore/worker-protocol.hh
+++ b/src/libstore/worker-protocol.hh
@@ -36,7 +36,7 @@ typedef enum {
     wopClearFailedPaths = 25,
     wopQueryPathInfo = 26,
     wopImportPaths = 27, // obsolete
-    wopQueryDerivationOutputNames = 28,
+    wopQueryDerivationOutputNames = 28, // obsolete
     wopQueryPathFromHashPart = 29,
     wopQuerySubstitutablePathInfos = 30,
     wopQueryValidPaths = 31,