diff --git a/.gitignore b/.gitignore
index d573d737d63a9db371bf77dee09a80493f7cc752..b6424bc0a822aab0b88aab8766e7f2b3ce28d3e7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -93,3 +93,6 @@ airframes.md
 airframes.xml
 
 cppcheck-result.xml
+cppcheck
+
+scan-build
diff --git a/.travis.yml b/.travis.yml
index 0bfcf188ef56ff5053551a5669ce09502761cf1c..6d8276100799ffbebb9ae820a3ff921fd6f8ffb2 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -61,11 +61,11 @@ before_install:
 
 env:
   global:
-# COVERITY KEY
+    # COVERITY KEY
     - secure: "NyaJoCGjU0Xc90Y6bxVYWLgjrJX5HlZsm/SPxruZ6I7xkGo19fJIFzGegOHQFR32D4AiKjllfjTUNy+ncckWplind0QwxtF4/kxXrz9XBfiby6X8jLYXIekrB6Ay0mBLGbniDdh+lpWtcyop6Dmkt5bdJCJuKY2nv9ENnhhs07M="
-# AWS KEY: $PX4_AWS_KEY
+    # AWS KEY: $PX4_AWS_KEY
     - secure: "XknnZHWBbpHbN4f3fuAVwUztdLIu8ej4keC3aQSDofo3uw8AFEzojfsQsN9u77ShWSIV4iYJWh9C9ALkCx7TocJ+xYjiboo10YhM9lH/8u+EXjYWG6GHS8ua0wkir+cViSxoLNaMtmcb/rPTicJecAGANxLsIHyBAgTL3fkbLSA="
-# AWS SECRET: $PX4_AWS_SECRET
+    # AWS SECRET: $PX4_AWS_SECRET
     - secure: "h6oajlW68dWIr+wZhO58Dv6e68dZHrBLVA6lPXZmheFQBW6Xam1HuLGA0LOW6cL9TnrAsOZ8g4goB58eMQnMEijFZKi3mhRwZhd/Xjq/ZGJOWBUrLoQHZUw2dQk5ja5vmUlKEoQnFZjDuMjx8KfX5ZMNy8A3yssWZtJYHD8c+bk="
 
 script:
@@ -86,17 +86,21 @@ script:
     fi
 
 after_success:
-  # s3 deploy airframe and parameter metadata
-  - if [[ "${BUILD_TARGET}" = "px4_metadata" && "${TRAVIS_PULL_REQUEST}" = "false" && "${TRAVIS_BRANCH}" != "coverity" ]]; then
-         ./Tools/docker_run.sh 'make s3put_px4_metadata AWS_S3_BUCKET="px4-travis/Firmware/${TRAVIS_BRANCH}"';
+  # s3 upload airframe and parameter metadata
+  - if [[ "${BUILD_TARGET}" = "px4_metadata" && "${TRAVIS_PULL_REQUEST}" = "false" ]]; then
+         ./Tools/docker_run.sh 'make s3put_metadata AWS_S3_BUCKET="px4-travis/Firmware/${TRAVIS_BRANCH}"';
     fi
   # s3 upload clang scan-build output for master branch
-  - if [[ "${BUILD_TARGET}" = "scan-build" && "${TRAVIS_PULL_REQUEST}" = "false" && "${TRAVIS_BRANCH}" = "master" ]]; then
-         ./Tools/docker_run.sh 'make s3put_scan-build AWS_S3_BUCKET="px4-travis/scan-build"';
+  - if [[ "${BUILD_TARGET}" = "scan-build" && "${TRAVIS_PULL_REQUEST}" = "false" ]]; then
+         ./Tools/docker_run.sh 'make s3put_scan-build AWS_S3_BUCKET="px4-travis/Firmware/${TRAVIS_BRANCH}/scan-build"';
     fi
   # s3 upload cppcheck output for master branch
-  - if [[ "${BUILD_TARGET}" = "cppcheck" && "${TRAVIS_PULL_REQUEST}" = "false" && "${TRAVIS_BRANCH}" = "master" ]]; then
-         ./Tools/docker_run.sh 'make s3put_cppcheck AWS_S3_BUCKET="px4-travis/cppcheck"';
+  - if [[ "${BUILD_TARGET}" = "cppcheck" && "${TRAVIS_PULL_REQUEST}" = "false" ]]; then
+         ./Tools/docker_run.sh 'make s3put_cppcheck AWS_S3_BUCKET="px4-travis/Firmware/${TRAVIS_BRANCH}/cppcheck"';
+    fi
+  # s3 upload code coverage
+  - if [[ "${BUILD_TARGET}" = "tests_coverage" && "${TRAVIS_PULL_REQUEST}" = "false" ]]; then
+         ./Tools/docker_run.sh 'make s3put_coverage AWS_S3_BUCKET="px4-travis/Firmware/${TRAVIS_BRANCH}/coverage"';
     fi
   # coveralls code coverage report
   - if [[ "${BUILD_TARGET}" = "tests_coverage" && "${TRAVIS_PULL_REQUEST}" = "false" ]]; then
diff --git a/Makefile b/Makefile
index f64459636e8709c17040e93e1c930e11ba9d206a..8f8dcf9b034d97baa459a2125cdab8e7ed78e674 100644
--- a/Makefile
+++ b/Makefile
@@ -287,10 +287,13 @@ s3put_px4_metadata: px4_metadata
 	@$(SRC_DIR)/Tools/s3put.sh parameters.md
 
 s3put_scan-build: scan-build
-	$(SRC_DIR)/Tools/s3put.sh `find build_scan-build -mindepth 1 -maxdepth 1 -type d`/
+	@cd $(SRC_DIR) && ./Tools/s3put.sh `find build_scan-build -mindepth 1 -maxdepth 1 -type d`/
 
 s3put_cppcheck: cppcheck
-	$(SRC_DIR)/Tools/s3put.sh build_cppcheck-htmlreport/
+	@cd $(SRC_DIR) && ./Tools/s3put.sh cppcheck/
+
+s3put_coverage: tests_coverage
+	@cd $(SRC_DIR) && ./Tools/s3put.sh coverage-html/
 
 # Astyle
 # --------------------------------------------------------------------
@@ -358,7 +361,7 @@ clang-tidy-quiet: posix_sitl_default-clang
 
 cppcheck: posix_sitl_default
 	@cppcheck --enable=all --std=c++11 --std=c99 --std=posix --project=build_posix_sitl_default/compile_commands.json --xml-version=2 2> cppcheck-result.xml
-	@cppcheck-htmlreport --source-encoding=ascii --file=cppcheck-result.xml --report-dir=build_cppcheck-htmlreport --source-dir=$(SRC_DIR)/src/
+	@cppcheck-htmlreport --source-encoding=ascii --file=cppcheck-result.xml --report-dir=cppcheck --source-dir=$(SRC_DIR)/src/
 
 # Cleanup
 # --------------------------------------------------------------------
diff --git a/Tools/s3put.sh b/Tools/s3put.sh
index dbb71335092585882add92f21b0ac8a4f14fa8d1..a74cbc57406531de6aee9880c976663c1804afef 100755
--- a/Tools/s3put.sh
+++ b/Tools/s3put.sh
@@ -11,9 +11,12 @@ filename=${1}
 [ -z "$AWS_SECRET_ACCESS_KEY" ] && { echo "ERROR: Need to set AWS_SECRET_ACCESS_KEY"; exit 1; }
 [ -z "$AWS_S3_BUCKET" ] && { echo "ERROR: Need to set AWS_S3_BUCKET"; exit 1; }
 
-if [ -e ${filename} ]; then
+if [ -f ${filename} ]; then
 	base_file_name=`basename $filename`
-	s3cmd --access_key=${AWS_ACCESS_KEY_ID} --secret_key=${AWS_SECRET_ACCESS_KEY} put -r ${filename} s3://${AWS_S3_BUCKET}/${base_file_name}
+	s3cmd --access_key=${AWS_ACCESS_KEY_ID} --secret_key=${AWS_SECRET_ACCESS_KEY} put ${filename} s3://${AWS_S3_BUCKET}/${base_file_name}
+elif [ -d ${filename} ]; then
+	dir_name=$filename
+	s3cmd --access_key=${AWS_ACCESS_KEY_ID} --secret_key=${AWS_SECRET_ACCESS_KEY} put -r ${dir_name} s3://${AWS_S3_BUCKET}/
 else
 	echo "ERROR: ${file} doesn't exist"
 	exit 1