diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7ba09a3..f93a946 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,4 +2,3 @@
 * Set the extension name for VS Code Go Nightly(`go-nightly`).
 * Pick up the pre-release version of `gopls` if available.
 * Disabled the telemetry report for VS Code Go.
-* Sync upstream@eae5825
diff --git a/src/goMain.ts b/src/goMain.ts
index 4de4089..3d58fe2 100644
--- a/src/goMain.ts
+++ b/src/goMain.ts
@@ -48,7 +48,14 @@
 import { testAtCursor, testCurrentFile, testCurrentPackage, testPrevious, testWorkspace } from './goTest';
 import { getConfiguredTools } from './goTools';
 import { vetCode } from './goVet';
-import { getFromGlobalState, setGlobalState, updateGlobalState } from './stateUtils';
+import {
+	getFromGlobalState,
+	getFromWorkspaceState,
+	setGlobalState,
+	setWorkspaceState,
+	updateGlobalState,
+	updateWorkspaceState
+} from './stateUtils';
 import { disposeTelemetryReporter, sendTelemetryEventForConfig } from './telemetry';
 import { cancelRunningTests, showTestOutput } from './testUtils';
 import {
@@ -71,6 +78,7 @@
 
 export function activate(ctx: vscode.ExtensionContext): void {
 	setGlobalState(ctx.globalState);
+	setWorkspaceState(ctx.workspaceState);
 
 	updateGoPathGoRootFromConfig().then(async () => {
 		const updateToolsCmdText = 'Update tools';
@@ -510,9 +518,12 @@
 				vscode.window.showErrorMessage('Cannot apply coverage profile when no Go file is open.');
 				return;
 			}
+			const lastCoverProfilePathKey = 'lastCoverProfilePathKey';
+			const lastCoverProfilePath = getFromWorkspaceState(lastCoverProfilePathKey, '');
 			vscode.window
 				.showInputBox({
-					prompt: 'Enter the path to the coverage profile for current package'
+					prompt: 'Enter the path to the coverage profile for current package',
+					value: lastCoverProfilePath,
 				})
 				.then((coverProfilePath) => {
 					if (!coverProfilePath) {
@@ -522,6 +533,9 @@
 						vscode.window.showErrorMessage(`Cannot find the file ${coverProfilePath}`);
 						return;
 					}
+					if (coverProfilePath !== lastCoverProfilePath) {
+						updateWorkspaceState(lastCoverProfilePathKey, coverProfilePath);
+					}
 					applyCodeCoverageToAllEditors(
 						coverProfilePath,
 						path.dirname(vscode.window.activeTextEditor.document.fileName)
diff --git a/src/stateUtils.ts b/src/stateUtils.ts
index 35983c5..067cd44 100644
--- a/src/stateUtils.ts
+++ b/src/stateUtils.ts
@@ -6,6 +6,7 @@
 import vscode = require('vscode');
 
 let globalState: vscode.Memento;
+let workspaceState: vscode.Memento;
 
 export function getFromGlobalState(key: string, defaultValue?: any) {
 	if (!globalState) {
@@ -24,3 +25,21 @@
 export function setGlobalState(state: vscode.Memento) {
 	globalState = state;
 }
+
+export function getFromWorkspaceState(key: string, defaultValue?: any) {
+	if (!workspaceState) {
+		return defaultValue;
+	}
+	return workspaceState.get(key, defaultValue);
+}
+
+export function updateWorkspaceState(key: string, value: any) {
+	if (!workspaceState) {
+		return;
+	}
+	return workspaceState.update(key, value);
+}
+
+export function setWorkspaceState(state: vscode.Memento) {
+	workspaceState = state;
+}
diff --git a/src/testUtils.ts b/src/testUtils.ts
index 533e461..1b3851b 100644
--- a/src/testUtils.ts
+++ b/src/testUtils.ts
@@ -325,21 +325,23 @@
 
 				// 1=ok/FAIL, 2=package, 3=time/(cached)
 				const packageResultLineRE = /^(ok|FAIL)[ \t]+(.+?)[ \t]+([0-9\.]+s|\(cached\))/;
+				const lineWithErrorRE = /^(\t|\s\s\s\s)\S/;
 				const testResultLines: string[] = [];
 
 				const processTestResultLine = (line: string) => {
-					if (!testconfig.includeSubDirectories) {
-						outputChannel.appendLine(expandFilePathInOutput(line, testconfig.dir));
-						return;
-					}
 					testResultLines.push(line);
 					const result = line.match(packageResultLineRE);
 					if (result && (pkgMap.has(result[2]) || currentGoWorkspace)) {
+						const hasTestFailed = line.startsWith('FAIL');
 						const packageNameArr = result[2].split('/');
 						const baseDir = pkgMap.get(result[2]) || path.join(currentGoWorkspace, ...packageNameArr);
-						testResultLines.forEach((testResultLine) =>
-							outputChannel.appendLine(expandFilePathInOutput(testResultLine, baseDir))
-						);
+						testResultLines.forEach((testResultLine) => {
+							if (hasTestFailed && lineWithErrorRE.test(testResultLine)) {
+								outputChannel.appendLine(expandFilePathInOutput(testResultLine, baseDir));
+							} else {
+								outputChannel.appendLine(testResultLine);
+							}
+						});
 						testResultLines.splice(0);
 					}
 				};
