diff --git a/lua/lazy/core/meta.lua b/lua/lazy/core/meta.lua
index 52b0549..6e781a0 100644
--- a/lua/lazy/core/meta.lua
+++ b/lua/lazy/core/meta.lua
@@ -198,7 +198,10 @@ function M:_rebuild(name)
 
       -- dependencies
       for _, dep in ipairs(fragment.deps or {}) do
-        table.insert(plugin.dependencies, self.fragments:get(dep).name)
+        local dep_meta = self.frag_to_meta[dep]
+        if dep_meta then
+          table.insert(plugin.dependencies, dep_meta.name)
+        end
       end
     end
   end
diff --git a/tests/core/plugin_spec.lua b/tests/core/plugin_spec.lua
index 87cea77..d810339 100644
--- a/tests/core/plugin_spec.lua
+++ b/tests/core/plugin_spec.lua
@@ -8,20 +8,27 @@ local function inspect(obj)
   return vim.inspect(obj):gsub("%s+", " ")
 end
 
----@param plugins LazyPlugin[]|LazyPlugin
+---@param plugin LazyPlugin
+local function resolve(plugin)
+  local meta = getmetatable(plugin)
+  local ret = meta and type(meta.__index) == "table" and resolve(meta.__index) or {}
+  for k, v in pairs(plugin) do
+    ret[k] = v
+  end
+  return ret
+end
+
+---@param plugins LazyPlugin[]
 local function clean(plugins)
-  local p = plugins
-  plugins = type(plugins) == "table" and plugins or { plugins }
-  for _, plugin in pairs(plugins) do
-    plugin._.fid = nil
-    plugin._.fpid = nil
-    plugin._.fdeps = nil
+  return vim.tbl_map(function(plugin)
+    plugin = resolve(plugin)
+    plugin[1] = nil
     plugin._.frags = nil
     if plugin._.dep == false then
       plugin._.dep = nil
     end
-  end
-  return p
+    return plugin
+  end, plugins)
 end
 
 describe("plugin spec url/name", function()
@@ -168,14 +175,12 @@ describe("plugin spec opt", function()
       end
       assert.same({
         bar = {
-          "foo/bar",
           _ = {},
           dependencies = { "dep1", "dep2" },
           name = "bar",
           url = "https://github.com/foo/bar.git",
         },
         dep1 = {
-          "foo/dep1",
           _ = {
             dep = true,
           },
@@ -183,7 +188,6 @@ describe("plugin spec opt", function()
           url = "https://github.com/foo/dep1.git",
         },
         dep2 = {
-          "foo/dep2",
           _ = {
             dep = true,
           },
@@ -198,13 +202,13 @@ describe("plugin spec opt", function()
     before_each(function()
       Handler.init()
     end)
-    it("handles dep names", function()
-      Config.options.defaults.lazy = false
-      local tests = {
-        { { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } }, "foo/dep1" },
-        { "foo/dep1", { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } } },
-      }
-      for _, test in ipairs(tests) do
+    Config.options.defaults.lazy = false
+    local tests = {
+      { { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } }, "foo/dep1" },
+      { "foo/dep1", { "foo/bar", dependencies = { { "dep1" }, "foo/dep2" } } },
+    }
+    for _, test in ipairs(tests) do
+      it("handles dep names " .. inspect(test), function()
         local spec = Plugin.Spec.new(vim.deepcopy(test))
         assert(#spec.notifs == 0)
         Config.plugins = spec.plugins
@@ -213,31 +217,74 @@ describe("plugin spec opt", function()
         for _, plugin in pairs(spec.plugins) do
           plugin.dir = nil
         end
-        assert.same(clean(spec.plugins), {
+        assert.same({
           bar = {
-            "foo/bar",
             _ = {},
             dependencies = { "dep1", "dep2" },
             name = "bar",
             url = "https://github.com/foo/bar.git",
           },
           dep1 = {
-            "foo/dep1",
             _ = {},
             name = "dep1",
             url = "https://github.com/foo/dep1.git",
           },
           dep2 = {
-            "foo/dep2",
             _ = {
               dep = true,
             },
             name = "dep2",
             url = "https://github.com/foo/dep2.git",
           },
-        })
-      end
-    end)
+        }, clean(spec.plugins))
+      end)
+    end
+
+    Config.options.defaults.lazy = false
+    local tests = {
+      {
+        { "foo/baz", name = "bar" },
+        { "foo/fee", dependencies = { "foo/baz" } },
+      },
+      {
+        { "foo/fee", dependencies = { "foo/baz" } },
+        { "foo/baz", name = "bar" },
+      },
+      -- {
+      --   { "foo/baz", name = "bar" },
+      --   { "foo/fee", dependencies = { "baz" } },
+      -- },
+      {
+        { "foo/baz", name = "bar" },
+        { "foo/fee", dependencies = { "bar" } },
+      },
+    }
+    for _, test in ipairs(tests) do
+      it("handles dep names " .. inspect(test), function()
+        local spec = Plugin.Spec.new(vim.deepcopy(test))
+        assert(#spec.notifs == 0)
+        Config.plugins = spec.plugins
+        Plugin.update_state()
+        spec = Plugin.Spec.new(test)
+        spec.meta:rebuild()
+        for _, plugin in pairs(spec.plugins) do
+          plugin.dir = nil
+        end
+        assert.same({
+          bar = {
+            _ = {},
+            name = "bar",
+            url = "https://github.com/foo/baz.git",
+          },
+          fee = {
+            _ = {},
+            name = "fee",
+            url = "https://github.com/foo/fee.git",
+            dependencies = { "bar" },
+          },
+        }, clean(spec.plugins))
+      end)
+    end
 
     it("handles opt from dep", function()
       Config.options.defaults.lazy = false