diff --git a/.gitignore b/.gitignore
index c48505d..3ec21c3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,6 @@
 /test/expected-describe-data-2-dmd-output
 /test/describe-project/dummy.dat
 /test/describe-project/dummy-dep1.dat
+
+# Ignore coverage files
+cov/
diff --git a/.travis.yml b/.travis.yml
index 65629a6..bd60f14 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,9 +5,9 @@
   include:
     - d: dmd-2.068.2-b1
     - d: dmd-2.068.1
-    - d: dmd-2.067.1
       env:
         - COVERAGE=true
+    - d: dmd-2.067.1
     - d: dmd-2.066.1
     - d: dmd-2.065.0
     - d: dmd-2.064.2
diff --git a/source/app.d b/source/app.d
index af2b866..370cd8f 100644
--- a/source/app.d
+++ b/source/app.d
@@ -11,7 +11,5 @@
 
 int main(string[] args)
 {
-	version (unittest) return 0;
-	else return runDubCommandLine(args);
+	return runDubCommandLine(args);
 }
-
diff --git a/source/dub/dub.d b/source/dub/dub.d
index 65fd7ee..d06f888 100644
--- a/source/dub/dub.d
+++ b/source/dub/dub.d
@@ -39,6 +39,20 @@
 // Workaround for libcurl liker errors when building with LDC
 version (LDC) pragma(lib, "curl");
 
+// Set output path and options for coverage reports
+version (DigitalMars) version (D_Coverage) static if (__VERSION__ >= 2068)
+{
+	shared static this()
+	{
+		import core.runtime, std.file, std.path, std.stdio;
+		dmd_coverSetMerge(true);
+		auto path = buildPath(dirName(thisExePath()), "../cov");
+		if (!path.exists)
+			mkdir(path);
+		dmd_coverDestPath(path);
+	}
+}
+
 enum defaultRegistryURL = "http://code.dlang.org/";
 
 /// The default supplier for packages, which is the registry
@@ -472,14 +486,14 @@
 	{
 		import std.stdio;
 		import std.ascii : newline;
-		
+
 		// Split comma-separated lists
 		string[] requestedDataSplit =
 			requestedData
 			.map!(a => a.splitter(",").map!strip)
 			.joiner()
 			.array();
-		
+
 		auto data = m_project.listBuildSettings(platform, config, buildType,
 			requestedDataSplit, formattingCompiler, nullDelim);
 
@@ -1107,4 +1121,3 @@
 		return null;
 	}
 }
-