diff --git a/source/dub/dependency.d b/source/dub/dependency.d
index f56795b..5e01585 100644
--- a/source/dub/dependency.d
+++ b/source/dub/dependency.d
@@ -69,7 +69,7 @@
 	*/
 	this(string spec)
 	{
-		this.m_range = VersionRange.fromString(spec);
+		this(VersionRange.fromString(spec));
 	}
 
 	/** Constructs a new dependency specification that matches a specific
@@ -982,7 +982,7 @@
 
 		string r;
 
-		if (this == Dependency.invalid.m_range) return "invalid";
+		if (this == Invalid) return "invalid";
 		if (this.isExactVersion() && m_inclusiveA && m_inclusiveB) {
 			// Special "==" case
 			if (m_versA == Version.masterBranch) return "~master";
diff --git a/source/dub/dub.d b/source/dub/dub.d
index 4f0413d..ffa3875 100644
--- a/source/dub/dub.d
+++ b/source/dub/dub.d
@@ -528,7 +528,7 @@
 					try if (m_packageManager.getOrLoadPackage(path)) continue;
 					catch (Exception e) { logDebug("Failed to load path based selection: %s", e.toString().sanitize); }
 				} else if (!dep.repository.empty) {
-					if (m_packageManager.loadSCMPackage(getBasePackageName(p), dep))
+					if (m_packageManager.loadSCMPackage(getBasePackageName(p), dep.repository))
 						continue;
 				} else {
 					if (m_packageManager.getPackage(p, dep.version_)) continue;
@@ -591,7 +591,7 @@
 					continue;
 				}
 			} else if (!ver.repository.empty) {
-				pack = m_packageManager.loadSCMPackage(p, ver);
+				pack = m_packageManager.loadSCMPackage(p, ver.repository);
 			} else {
 				assert(ver.isExactVersion, "Resolved dependency is neither path, nor repository, nor exact version based!?");
 				pack = m_packageManager.getPackage(p, ver.version_);
@@ -1718,7 +1718,7 @@
 			return m_rootPackage.basePackage;
 
 		if (!dep.repository.empty) {
-			auto ret = m_dub.packageManager.loadSCMPackage(name, dep);
+			auto ret = m_dub.packageManager.loadSCMPackage(name, dep.repository);
 			return ret !is null && dep.matches(ret.version_) ? ret : null;
 		} else if (!dep.path.empty) {
 			try {
diff --git a/source/dub/packagemanager.d b/source/dub/packagemanager.d
index 342dac8..972a5e3 100644
--- a/source/dub/packagemanager.d
+++ b/source/dub/packagemanager.d
@@ -8,6 +8,7 @@
 module dub.packagemanager;
 
 import dub.dependency;
+static import dub.dependency;
 import dub.internal.utils;
 import dub.internal.vibecompat.core.file;
 import dub.internal.vibecompat.core.log;
@@ -273,15 +274,21 @@
 			The package loaded from the given SCM repository or null if the
 			package couldn't be loaded.
 	*/
+	deprecated("Use the overload that accepts a `dub.dependency : Repository`")
 	Package loadSCMPackage(string name, Dependency dependency)
 	in { assert(!dependency.repository.empty); }
+	do { return this.loadSCMPackage(name, dependency.repository); }
+
+	/// Ditto
+	Package loadSCMPackage(string name, dub.dependency.Repository repo)
+	in { assert(!repo.empty); }
 	do {
         Package pack;
 
-        with (dependency.repository) final switch (kind)
+        final switch (repo.kind)
         {
-            case Kind.git:
-                pack = loadGitPackage(name, dependency.versionSpec, dependency.repository.remote);
+            case repo.Kind.git:
+                pack = loadGitPackage(name, repo.ref_, repo.remote);
         }
         if (pack !is null) {
             addPackages(m_temporaryPackages, pack);
diff --git a/source/dub/project.d b/source/dub/project.d
index e6d0a14..0b3ca49 100644
--- a/source/dub/project.d
+++ b/source/dub/project.d
@@ -473,6 +473,10 @@
 		m_missingDependencies = [];
 		m_packageManager.refresh(false);
 
+		Package resolveSubPackage(Package p, string subname, bool silentFail) {
+			return subname.length ? m_packageManager.getSubPackage(p, subname, silentFail) : p;
+		}
+
 		void collectDependenciesRec(Package pack, int depth = 0)
 		{
 			auto indent = replicate("  ", depth);
@@ -490,10 +494,6 @@
 				// need to be satisfied
 				bool is_desired = !vspec.optional || m_selections.hasSelectedVersion(basename) || (vspec.default_ && m_selections.bare);
 
-				Package resolveSubPackage(Package p, in bool silentFail) {
-					return subname.length ? m_packageManager.getSubPackage(p, subname, silentFail) : p;
-				}
-
 				if (dep.name == m_rootPackage.basePackage.name) {
 					vspec = Dependency(m_rootPackage.version_);
 					p = m_rootPackage.basePackage;
@@ -511,10 +511,10 @@
 						auto path = vspec.path;
 						if (!path.absolute) path = m_rootPackage.path ~ path;
 						p = m_packageManager.getOrLoadPackage(path, NativePath.init, true);
-						p = resolveSubPackage(p, true);
+						p = resolveSubPackage(p, subname, true);
 					} else if (!vspec.repository.empty) {
-						p = m_packageManager.loadSCMPackage(basename, vspec);
-						p = resolveSubPackage(p, true);
+						p = m_packageManager.loadSCMPackage(basename, vspec.repository);
+						p = resolveSubPackage(p, subname, true);
 					} else {
 						p = m_packageManager.getBestPackage(dep.name, vspec);
 					}
@@ -522,15 +522,15 @@
 					auto idx = m_dependencies.countUntil!(d => getBasePackageName(d.name) == basename);
 					auto bp = m_dependencies[idx].basePackage;
 					vspec = Dependency(bp.path);
-					p = resolveSubPackage(bp, false);
+					p = resolveSubPackage(bp, subname, false);
 				} else {
 					logDiagnostic("%sVersion selection for dependency %s (%s) of %s is missing.",
 						indent, basename, dep.name, pack.name);
 				}
 
 				if (!p && !vspec.repository.empty) {
-					p = m_packageManager.loadSCMPackage(basename, vspec);
-					resolveSubPackage(p, false);
+					p = m_packageManager.loadSCMPackage(basename, vspec.repository);
+					resolveSubPackage(p, subname, false);
 				}
 
 				if (!p && !vspec.path.empty && is_desired) {
@@ -542,7 +542,7 @@
 						logWarn("%sSub package %s must be referenced using the path to it's parent package.", indent, dep.name);
 						p = p.parentPackage;
 					}
-					p = resolveSubPackage(p, false);
+					p = resolveSubPackage(p, subname, false);
 					enforce(p.name == dep.name,
 						format("Path based dependency %s is referenced with a wrong name: %s vs. %s",
 							path.toNativeString(), dep.name, p.name));