diff --git a/.travis.yml b/.travis.yml
index 474f6867fdca57542a15b0387c2abbdfa1f48b8e..d7db65bed3bbf0e1988c55649e16fbdcbeb3a676 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,8 +5,10 @@ cache:
   ## cargo: true
   directories:
     - $HOME/.cargo
+    ## caching CARGO_TARGET_DIR actually slows down the build over time,
+    ## because old build products are never deleted.
     ## where we point CARGO_TARGET_DIR in all our cargo invocations
-    - $TRAVIS_BUILD_DIR/src/rust/target
+    #- $TRAVIS_BUILD_DIR/src/rust/target
 
 compiler:
   - gcc
@@ -209,6 +211,8 @@ script:
   - if [[ "$DISTCHECK" == "" && "$TEST_STEM" == "" ]]; then make check; fi
   - if [[ "$TEST_STEM" != "" ]]; then make src/app/tor test-stem; fi
   - if [[ "$DISTCHECK" != "" && "$TEST_STEM" == "" ]]; then make distcheck DISTCHECK_CONFIGURE_FLAGS="$CONFIGURE_FLAGS"; fi
+  ## If this build was one that produced coverage, upload it.
+  - if [[ "$COVERAGE_OPTIONS" != "" ]]; then coveralls -b . --exclude src/test --exclude src/trunnel --gcov-options '\-p' || echo "Coverage failed"; fi
 
 after_failure:
   ## configure will leave a log file with more details of config failures.
@@ -220,9 +224,12 @@ after_failure:
   - if [[ "$DISTCHECK" != "" ]]; then make show-distdir-testlog || echo "make failed"; fi
   - if [[ "$DISTCHECK" != "" ]]; then make show-distdir-core || echo "make failed"; fi
 
-after_success:
-  ## If this build was one that produced coverage, upload it.
-  - if [[ "$COVERAGE_OPTIONS" != "" ]]; then coveralls -b . --exclude src/test --exclude src/trunnel --gcov-options '\-p'; fi
+before_cache:
+  ## Delete all gcov files.
+  - if [[ "$COVERAGE_OPTIONS" != "" ]]; then make reset-gcov; fi
+  ## Delete the cargo registry before caching .cargo, because it's cheaper to
+  ## download the registry and throw it away, rather than caching it
+  - rm -rf $HOME/.cargo/registry
 
 notifications:
   irc:
diff --git a/Makefile.am b/Makefile.am
index b40b2e51bc047226f422ae9ce82077c190e83cb3..d65c08f6bffcb71a97966a7e64517d14eed4e468 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -295,8 +295,10 @@ test-full: need-stem-path need-chutney-path check test-network test-stem
 
 test-full-online: need-stem-path need-chutney-path check test-network test-stem-full
 
+# We can't delete the gcno files, because they are created when tor is compiled
 reset-gcov:
-	rm -f $(top_builddir)/src/*/*.gcda $(top_builddir)/src/*/*/*.gcda
+	rm -f $(top_builddir)/src/*/*.gcda $(top_builddir)/src/*/*/*.gcda \
+	      $(top_builddir)/src/*/*.gcov $(top_builddir)/src/*/*/*.gcov
 
 HTML_COVER_DIR=$(top_builddir)/coverage_html
 coverage-html: all
diff --git a/changes/bug29036 b/changes/bug29036
new file mode 100644
index 0000000000000000000000000000000000000000..8b96c5c8fa625fc484b365dcf874d316cdb15ac1
--- /dev/null
+++ b/changes/bug29036
@@ -0,0 +1,5 @@
+  o Minor bugfix (continuous integration):
+    - Reset coverage state on disk after Travis CI has finished. This is being
+      done to prevent future gcda file merge errors which causes the test suite
+      for the process subsystem to fail. The process subsystem was introduced
+      in 0.4.0.1-alpha. Fixes bug 29036; bugfix on 0.2.9.15.
diff --git a/changes/ticket29962 b/changes/ticket29962
new file mode 100644
index 0000000000000000000000000000000000000000..e36cc0cf9ad8d3ba4fc93cae9e6b33961a20255d
--- /dev/null
+++ b/changes/ticket29962
@@ -0,0 +1,3 @@
+  o Minor features (continuous integration):
+    - On Travis Rust builds, cleanup Rust registry and refrain from caching
+      target/ directory to speed up builds. Resolves issue 29962.