diff --git a/gocheck.go b/gocheck.go
index 780594f..21977db 100644
--- a/gocheck.go
+++ b/gocheck.go
@@ -118,36 +118,36 @@
 
 type tempDir struct {
 	sync.Mutex
-	_path    string
-	_counter int
+	path    string
+	counter int
 }
 
 func (td *tempDir) newPath() string {
 	td.Lock()
 	defer td.Unlock()
-	if td._path == "" {
+	if td.path == "" {
 		var err error
 		for i := 0; i != 100; i++ {
 			path := fmt.Sprintf("%s/gocheck-%d", os.TempDir(), rand.Int())
 			if err = os.Mkdir(path, 0700); err == nil {
-				td._path = path
+				td.path = path
 				break
 			}
 		}
-		if td._path == "" {
+		if td.path == "" {
 			panic("Couldn't create temporary directory: " + err.Error())
 		}
 	}
-	result := path.Join(td._path, strconv.Itoa(td._counter))
-	td._counter += 1
+	result := path.Join(td.path, strconv.Itoa(td.counter))
+	td.counter += 1
 	return result
 }
 
 func (td *tempDir) removeAll() {
 	td.Lock()
 	defer td.Unlock()
-	if td._path != "" {
-		err := os.RemoveAll(td._path)
+	if td.path != "" {
+		err := os.RemoveAll(td.path)
 		if err != nil {
 			fmt.Fprintf(os.Stderr, "WARNING: Error cleaning up temporaries: "+err.Error())
 		}
@@ -300,6 +300,7 @@
 }
 
 var valueGo = filepath.Join("reflect", "value.go")
+var asmGo = filepath.Join("runtime", "asm_")
 
 func (c *C) logPanic(skip int, value interface{}) {
 	skip += 1 // Our own frame.
@@ -314,6 +315,9 @@
 			if name == "Value.call" && strings.HasSuffix(path, valueGo) {
 				break
 			}
+			if name == "call16" && strings.Contains(path, asmGo) {
+				break
+			}
 			c.logf("%s:%d\n  in %s", nicePath(file), line, name)
 		} else {
 			break
@@ -393,8 +397,9 @@
 	Panicked         int
 	FixturePanicked  int
 	ExpectedFailures int
-	Missed           int   // Not even tried to run, related to a panic in the fixture.
-	RunError         error // Houston, we've got a problem.
+	Missed           int    // Not even tried to run, related to a panic in the fixture.
+	RunError         error  // Houston, we've got a problem.
+	WorkDir          string // If KeepWorkDir is true
 }
 
 type resultTracker struct {
@@ -493,6 +498,7 @@
 	tests                     []*methodType
 	tracker                   *resultTracker
 	tempDir                   *tempDir
+	keepDir                   bool
 	output                    *outputWriter
 	reportedProblemLast       bool
 	benchTime                 time.Duration
@@ -505,6 +511,7 @@
 	Filter        string
 	Benchmark     bool
 	BenchmarkTime time.Duration // Defaults to 1 second
+	KeepWorkDir   bool
 }
 
 // Create a new suiteRunner able to run all methods in the given suite.
@@ -529,9 +536,10 @@
 		output:    newOutputWriter(conf.Output, conf.Stream, conf.Verbose),
 		tracker:   newResultTracker(),
 		benchTime: conf.BenchmarkTime,
+		tempDir:   &tempDir{},
+		keepDir:   conf.KeepWorkDir,
+		tests:     make([]*methodType, 0, suiteNumMethods),
 	}
-	runner.tests = make([]*methodType, 0, suiteNumMethods)
-	runner.tempDir = new(tempDir)
 	if runner.benchTime == 0 {
 		runner.benchTime = 1 * time.Second
 	}
@@ -598,7 +606,11 @@
 			runner.skipTests(missedSt, runner.tests)
 		}
 		runner.tracker.waitAndStop()
-		runner.tempDir.removeAll()
+		if runner.keepDir {
+			runner.tracker.result.WorkDir = runner.tempDir.path
+		} else {
+			runner.tempDir.removeAll()
+		}
 	}
 	return &runner.tracker.result
 }
diff --git a/run.go b/run.go
index 8400355..642ca80 100644
--- a/run.go
+++ b/run.go
@@ -32,6 +32,7 @@
 	benchFlag   = flag.Bool("gocheck.b", false, "Run benchmarks")
 	benchTime   = flag.Duration("gocheck.btime", 1*time.Second, "approximate run time for each benchmark")
 	listFlag    = flag.Bool("gocheck.list", false, "List the names of all tests that will be run")
+	workFlag    = flag.Bool("gocheck.work", false, "Display and do not remove the test working directory") 
 )
 
 // Run all test suites registered with the Suite() function, printing
@@ -44,6 +45,7 @@
 		Stream:        *streamFlag,
 		Benchmark:     *benchFlag,
 		BenchmarkTime: *benchTime,
+		KeepWorkDir:   *workFlag,
 	}
 	if *listFlag {
 		w := bufio.NewWriter(os.Stdout)
@@ -86,9 +88,8 @@
 	return names
 }
 
-// List prints the names of the test functions in the given
-// suite that will be run with the provided run configuration
-// to the given Writer.
+// List returns the names of the test functions in the given
+// suite that will be run with the provided run configuration.
 func List(suite interface{}, runConf *RunConf) []string {
 	var names []string
 	runner := newSuiteRunner(suite, runConf)
@@ -109,6 +110,11 @@
 	r.FixturePanicked += other.FixturePanicked
 	r.ExpectedFailures += other.ExpectedFailures
 	r.Missed += other.Missed
+	if r.WorkDir != "" && other.WorkDir != "" {
+		r.WorkDir += ":" + other.WorkDir
+	} else if other.WorkDir != "" {
+		r.WorkDir = other.WorkDir
+	}
 }
 
 func (r *Result) Passed() bool {
@@ -148,5 +154,8 @@
 	if r.Missed != 0 {
 		value += fmt.Sprintf(", %d MISSED", r.Missed)
 	}
+	if r.WorkDir != "" {
+		value += "\nWORK=" + r.WorkDir
+	}
 	return value
 }
diff --git a/run_test.go b/run_test.go
index cdcddc0..d59bd1c 100644
--- a/run_test.go
+++ b/run_test.go
@@ -5,6 +5,7 @@
 import (
 	"errors"
 	. "launchpad.net/gocheck"
+	"os"
 	"sync"
 )
 
@@ -395,3 +396,24 @@
 
 	c.Assert(output.value, Matches, expected)
 }
+
+// -----------------------------------------------------------------------
+// Verify that that the keep work dir request indeed does so.
+
+type WorkDirSuite struct {}
+
+func (s *WorkDirSuite) Test(c *C) {
+	c.MkDir()
+}
+
+func (s *RunS) TestKeepWorkDir(c *C) {
+	output := String{}
+	runConf := RunConf{Output: &output, Verbose: true, KeepWorkDir: true}
+	result := Run(&WorkDirSuite{}, &runConf)
+
+	c.Assert(result.String(), Matches, ".*\nWORK=" + result.WorkDir)
+
+	stat, err := os.Stat(result.WorkDir)
+	c.Assert(err, IsNil)
+	c.Assert(stat.IsDir(), Equals, true)
+}
