diff --git a/source/dub/dependencyresolver.d b/source/dub/dependencyresolver.d
index aea79ba..6a292ef 100644
--- a/source/dub/dependencyresolver.d
+++ b/source/dub/dependencyresolver.d
@@ -10,7 +10,7 @@
 import dub.dependency;
 import dub.internal.vibecompat.core.log;
 
-import std.algorithm : all, canFind, filter, sort;
+import std.algorithm : all, canFind, filter, map, sort;
 import std.array : appender, array;
 import std.conv : to;
 import std.exception : enforce;
@@ -55,7 +55,7 @@
 
 	CONFIG[string] resolve(TreeNode root, bool throw_on_failure = true)
 	{
-		auto root_base_pack = rootPackage(root.pack);
+		auto root_base_pack = basePackage(root.pack);
 
 		// find all possible configurations of each possible dependency
 		size_t[string] package_indices;
@@ -71,7 +71,7 @@
 			visited[parent] = true;
 
 			foreach (ch; getChildren(parent)) {
-				auto basepack = rootPackage(ch.pack);
+				auto basepack = basePackage(ch.pack);
 				auto pidx = all_configs.length;
 
 				if (ch.depType != DependencyType.required) maybe_optional_deps[ch.pack] = true;
@@ -132,12 +132,12 @@
 
 			visited[parent] = true;
 			sizediff_t maxcpi = -1;
-			sizediff_t parentidx = package_indices.get(rootPackage(parent.pack), -1);
-			auto parentbase = rootPackage(parent.pack);
+			sizediff_t parentidx = package_indices.get(basePackage(parent.pack), -1);
+			auto parentbase = basePackage(parent.pack);
 
 			// loop over all dependencies
 			foreach (ch; getChildren(parent)) {
-				auto basepack = rootPackage(ch.pack);
+				auto basepack = basePackage(ch.pack);
 				assert(basepack in package_indices, format("%s not in packages %s", basepack, package_indices));
 
 				// get the current config/version of the current dependency
@@ -226,7 +226,9 @@
 						auto cfg = all_configs[i][config_indices[i]];
 						if (cfg != CONFIG.invalid) ret[p] = cfg;
 					}
+				logDebug("Resolved dependencies before optional-purge: %s", ret.byKey.map!(k => k~" "~ret[k].to!string));
 				purgeOptionalDependencies(root, ret);
+				logDebug("Resolved dependencies after optional-purge: %s", ret.byKey.map!(k => k~" "~ret[k].to!string));
 				return ret;
 			}
 
@@ -255,9 +257,9 @@
 		void markRecursively(TreeNode node)
 		{
 			if (node.pack in required) return;
-			required[node.pack] = true;
+			required[basePackage(node.pack)] = true;
 			foreach (dep; getChildren(node).filter!(dep => dep.depType != DependencyType.optional))
-				if (auto dp = rootPackage(dep.pack) in configs)
+				if (auto dp = basePackage(dep.pack) in configs)
 					markRecursively(TreeNode(dep.pack, *dp));
 		}
 
@@ -277,7 +279,7 @@
 	optional
 }
 
-private string rootPackage(string p)
+private string basePackage(string p)
 {
 	auto idx = indexOf(p, ":");
 	if (idx < 0) return p;
diff --git a/source/dub/project.d b/source/dub/project.d
index 79f93e7..850775c 100644
--- a/source/dub/project.d
+++ b/source/dub/project.d
@@ -296,12 +296,13 @@
 				Package p;
 
 				auto basename = getBasePackageName(dep.name);
+				auto subname = getSubPackageName(dep.name);
 				if (dep.name == m_rootPackage.basePackage.name) {
 					vspec = Dependency(m_rootPackage.version_);
 					p = m_rootPackage.basePackage;
 				} else if (basename == m_rootPackage.basePackage.name) {
 					vspec = Dependency(m_rootPackage.version_);
-					try p = m_packageManager.getSubPackage(m_rootPackage.basePackage, getSubPackageName(dep.name), false);
+					try p = m_packageManager.getSubPackage(m_rootPackage.basePackage, subname, false);
 					catch (Exception e) {
 						logDiagnostic("%sError getting sub package %s: %s", indent, dep.name, e.msg);
 						continue;
@@ -313,12 +314,13 @@
 						auto path = vspec.path;
 						if (!path.absolute) path = m_rootPackage.path ~ path;
 						p = m_packageManager.getOrLoadPackage(path, Path.init, true);
+						if (subname.length) p = m_packageManager.getSubPackage(p, subname, true);
 					}
 				} else if (m_dependencies.canFind!(d => getBasePackageName(d.name) == basename)) {
 					auto idx = m_dependencies.countUntil!(d => getBasePackageName(d.name) == basename);
 					auto bp = m_dependencies[idx].basePackage;
 					vspec = Dependency(bp.path);
-					p = m_packageManager.getSubPackage(bp, getSubPackageName(dep.name), false);
+					p = m_packageManager.getSubPackage(bp, subname, false);
 				} else {
 					logDiagnostic("%sVersion selection for dependency %s (%s) of %s is missing.",
 						indent, basename, dep.name, pack.name);
@@ -333,7 +335,7 @@
 						logWarn("%sSub package %s must be referenced using the path to it's parent package.", indent, dep.name);
 						p = p.parentPackage;
 					}
-					if (dep.name.canFind(':')) p = m_packageManager.getSubPackage(p, getSubPackageName(dep.name), false);
+					if (subname.length) p = m_packageManager.getSubPackage(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));
diff --git a/test/issue813-fixed-dependency.sh b/test/issue813-fixed-dependency.sh
new file mode 100755
index 0000000..2785cdb
--- /dev/null
+++ b/test/issue813-fixed-dependency.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+cd ${CURR_DIR}/issue813-fixed-dependency
+rm -rf main/.dub
+rm -rf sub/.dub
+rm -rf sub/sub/.dub
+${DUB} build --bare --compiler=${DC} main || exit 1
diff --git a/test/issue813-fixed-dependency/.no_build b/test/issue813-fixed-dependency/.no_build
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/test/issue813-fixed-dependency/.no_build
@@ -0,0 +1 @@
+ 
diff --git a/test/issue813-fixed-dependency/main/dub.sdl b/test/issue813-fixed-dependency/main/dub.sdl
new file mode 100644
index 0000000..2faef96
--- /dev/null
+++ b/test/issue813-fixed-dependency/main/dub.sdl
@@ -0,0 +1,3 @@
+name "main"
+targetType "executable"
+dependency "sub" version="*"
diff --git a/test/issue813-fixed-dependency/main/dub.selections.json b/test/issue813-fixed-dependency/main/dub.selections.json
new file mode 100644
index 0000000..8443eed
--- /dev/null
+++ b/test/issue813-fixed-dependency/main/dub.selections.json
@@ -0,0 +1,6 @@
+{
+	"fileVersion": 1,
+	"versions": {
+		"sub": {"path": "../sub"}
+	}
+}
diff --git a/test/issue813-fixed-dependency/main/src/app.d b/test/issue813-fixed-dependency/main/src/app.d
new file mode 100644
index 0000000..dde0c1e
--- /dev/null
+++ b/test/issue813-fixed-dependency/main/src/app.d
@@ -0,0 +1,6 @@
+import sub.test;
+
+void main()
+{
+	foo();
+} 
diff --git a/test/issue813-fixed-dependency/sub/dub.sdl b/test/issue813-fixed-dependency/sub/dub.sdl
new file mode 100644
index 0000000..f8bdac6
--- /dev/null
+++ b/test/issue813-fixed-dependency/sub/dub.sdl
@@ -0,0 +1,3 @@
+name "sub"
+subPackage "sub/"
+dependency ":sub" version="*"
diff --git a/test/issue813-fixed-dependency/sub/sub/dub.sdl b/test/issue813-fixed-dependency/sub/sub/dub.sdl
new file mode 100644
index 0000000..a932e26
--- /dev/null
+++ b/test/issue813-fixed-dependency/sub/sub/dub.sdl
@@ -0,0 +1 @@
+name "sub"
diff --git a/test/issue813-fixed-dependency/sub/sub/src/sub/test.d b/test/issue813-fixed-dependency/sub/sub/src/sub/test.d
new file mode 100644
index 0000000..fe5bb2c
--- /dev/null
+++ b/test/issue813-fixed-dependency/sub/sub/src/sub/test.d
@@ -0,0 +1,6 @@
+module sub.test;
+
+void foo()
+{
+
+}
\ No newline at end of file
diff --git a/test/issue813-pure-sub-dependency.sh b/test/issue813-pure-sub-dependency.sh
new file mode 100755
index 0000000..85ab84e
--- /dev/null
+++ b/test/issue813-pure-sub-dependency.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+cd ${CURR_DIR}/issue813-pure-sub-dependency
+rm -rf main/.dub
+rm -rf sub/.dub
+rm -rf sub/sub/.dub
+rm -f main/dub.selections.json
+${DUB} build --bare --compiler=${DC} main || exit 1
diff --git a/test/issue813-pure-sub-dependency/.no_build b/test/issue813-pure-sub-dependency/.no_build
new file mode 100644
index 0000000..8d1c8b6
--- /dev/null
+++ b/test/issue813-pure-sub-dependency/.no_build
@@ -0,0 +1 @@
+ 
diff --git a/test/issue813-pure-sub-dependency/main/dub.sdl b/test/issue813-pure-sub-dependency/main/dub.sdl
new file mode 100644
index 0000000..79f7d71
--- /dev/null
+++ b/test/issue813-pure-sub-dependency/main/dub.sdl
@@ -0,0 +1,3 @@
+name "main"
+targetType "executable"
+dependency "sub:sub" version="*"
diff --git a/test/issue813-pure-sub-dependency/main/src/app.d b/test/issue813-pure-sub-dependency/main/src/app.d
new file mode 100644
index 0000000..dde0c1e
--- /dev/null
+++ b/test/issue813-pure-sub-dependency/main/src/app.d
@@ -0,0 +1,6 @@
+import sub.test;
+
+void main()
+{
+	foo();
+} 
diff --git a/test/issue813-pure-sub-dependency/sub/dub.sdl b/test/issue813-pure-sub-dependency/sub/dub.sdl
new file mode 100644
index 0000000..f8bdac6
--- /dev/null
+++ b/test/issue813-pure-sub-dependency/sub/dub.sdl
@@ -0,0 +1,3 @@
+name "sub"
+subPackage "sub/"
+dependency ":sub" version="*"
diff --git a/test/issue813-pure-sub-dependency/sub/sub/dub.sdl b/test/issue813-pure-sub-dependency/sub/sub/dub.sdl
new file mode 100644
index 0000000..a932e26
--- /dev/null
+++ b/test/issue813-pure-sub-dependency/sub/sub/dub.sdl
@@ -0,0 +1 @@
+name "sub"
diff --git a/test/issue813-pure-sub-dependency/sub/sub/src/sub/test.d b/test/issue813-pure-sub-dependency/sub/sub/src/sub/test.d
new file mode 100644
index 0000000..fe5bb2c
--- /dev/null
+++ b/test/issue813-pure-sub-dependency/sub/sub/src/sub/test.d
@@ -0,0 +1,6 @@
+module sub.test;
+
+void foo()
+{
+
+}
\ No newline at end of file