Upgrade oss-fuzz to e0a94e1a0924a1e2460f5de5abad9ee6b5acad7d am: 3ca8729c54

Original change: https://android-review.googlesource.com/c/platform/external/oss-fuzz/+/1395749

Change-Id: I350dffb61fc5b8367327d8de5d11f73bb81899d3
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..61ac0b1
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,10 @@
+out
+.git
+
+# Copied from .gitignore.
+.vscode/
+*.pyc
+/build/
+*~
+.DS_Store
+*.swp
diff --git a/.github/workflows/infra_tests.yml b/.github/workflows/infra_tests.yml
new file mode 100644
index 0000000..0641e6c
--- /dev/null
+++ b/.github/workflows/infra_tests.yml
@@ -0,0 +1,38 @@
+name: Infra tests
+on:
+  pull_request:
+    paths:
+      - 'infra/**'
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v2
+      - run: |  # Needed for git diff to work.
+          git fetch origin master --depth 1
+          git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master
+
+      - name: Setup python environment
+        uses: actions/setup-python@v2
+        with:
+          python-version: 3.8
+
+      - name: Install dependencies
+        run: |
+          python -m pip install --upgrade pip
+          pip install -r infra/ci/requirements.txt
+          pip install -r infra/build/functions/requirements.txt
+
+      - uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
+        with:
+          version: '298.0.0'
+      - run: |
+          gcloud components install beta cloud-datastore-emulator
+          gcloud info
+
+      - name: Run infra tests
+        run: python infra/presubmit.py infra-tests
+
+
diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml
new file mode 100644
index 0000000..0ab4f4f
--- /dev/null
+++ b/.github/workflows/presubmit.yml
@@ -0,0 +1,26 @@
+name: Presubmit checks
+on: [pull_request]
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v2
+      - run: |  # Needed for git diff to work.
+          git fetch origin master --depth 1
+          git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master
+
+      - name: Setup python environment
+        uses: actions/setup-python@v2
+        with:
+          python-version: 3.8
+
+      - name: Install dependencies
+        run: |
+          python -m pip install --upgrade pip
+          pip install -r infra/ci/requirements.txt
+          pip install -r infra/build/functions/requirements.txt
+
+      - name: Run presubmit checks
+        run: python infra/presubmit.py
diff --git a/.github/workflows/project_tests.yml b/.github/workflows/project_tests.yml
new file mode 100644
index 0000000..4c78ee1
--- /dev/null
+++ b/.github/workflows/project_tests.yml
@@ -0,0 +1,65 @@
+name: Project tests
+on: [pull_request]
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+      matrix:
+        engine:
+          - libfuzzer
+        sanitizer:
+          - address
+          - memory
+          - undefined
+          - coverage
+        architecture:
+          - x86_64
+        include:
+          - engine: afl
+            sanitizer: address
+            architecture: x86_64
+          - engine: honggfuzz
+            sanitizer: address
+            architecture: x86_64
+          - engine: libfuzzer
+            sanitizer: address
+            architecture: i386
+          - engine: none
+            sanitizer: address
+            architecture: x86_64
+          - engine: dataflow
+            sanitizer: dataflow
+            architecture: x86_64
+    env:
+      ENGINE: ${{ matrix.engine }}
+      SANITIZER: ${{ matrix.sanitizer }}
+      ARCHITECTURE: ${{ matrix.architecture }}
+
+    steps:
+      - uses: actions/checkout@v2
+      - run: |  # Needed for git diff to work.
+          git fetch origin master --depth 1
+          git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master
+
+      - name: Clear unnecessary files
+        run: |
+          sudo swapoff -a
+          sudo rm -f /swapfile
+          sudo apt clean
+          docker rmi $(docker images -a -q)
+          df -h
+
+      - name: Setup python environment
+        uses: actions/setup-python@v2
+        with:
+          python-version: 3.8
+
+      - name: Install dependencies
+        run: |
+          python -m pip install --upgrade pip
+          pip install -r infra/ci/requirements.txt
+
+      - name: Run project tests
+        run: python infra/ci/build.py
diff --git a/.gitignore b/.gitignore
index 63a2602..df32e5f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
 .vscode/
 *.pyc
-build/
-*~
\ No newline at end of file
+/build/
+*~
+.DS_Store
+*.swp
diff --git a/.pylintrc b/.pylintrc
index 00878f7..02abe5f 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -139,7 +139,9 @@
         deprecated-sys-function,
         exception-escape,
         comprehension-escape,
-        fixme
+        fixme,
+        import-error,
+        no-member
 
 # Enable the message, report, category or checker with the given id(s). You can
 # either give multiple identifier separated by comma (,) or put this option
@@ -582,4 +584,4 @@
                        Exception
 
 # Maximum number of characters on a single line.
-max-line-length=80
\ No newline at end of file
+max-line-length=80
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 3cf7704..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,64 +0,0 @@
-language: python
-dist: xenial
-
-services:
-  - docker
-
-before_install:
-  - git fetch origin +refs/heads/$TRAVIS_BRANCH
-
-install:
-  - pip install -r infra/travis/requirements.txt
-
-
-matrix:
-  include:
-    - name: "presubmit"
-      script: ./infra/presubmit.py
-    - name: "libfuzzer address x86_64"
-      env:
-        - TRAVIS_ENGINE=libfuzzer
-        - TRAVIS_SANITIZER=address
-        - TRAVIS_ARCHITECTURE=x86_64
-    - name: "libfuzzer memory x86_64"
-      env:
-        - TRAVIS_ENGINE=libfuzzer
-        - TRAVIS_SANITIZER=memory
-        - TRAVIS_ARCHITECTURE=x86_64
-    - name: "libfuzzer undefined x86_64"
-      env:
-        - TRAVIS_SANITIZER=undefined
-        - TRAVIS_ENGINE=libfuzzer
-        - TRAVIS_ARCHITECTURE=x86_64
-    - name: "afl address x86_64"
-      env:
-        - TRAVIS_ENGINE=afl
-        - TRAVIS_SANITIZER=address
-        - TRAVIS_ARCHITECTURE=x86_64
-    - name: "honggfuzz address x86_64"
-      env:
-        - TRAVIS_ENGINE=honggfuzz
-        - TRAVIS_SANITIZER=address
-        - TRAVIS_ARCHITECTURE=x86_64
-    - name: "none address x86_64"
-      env:
-        - TRAVIS_ENGINE=none
-        - TRAVIS_SANITIZER=address
-        - TRAVIS_ARCHITECTURE=x86_64
-    - name: "libfuzzer address i386"
-      env:
-        - TRAVIS_ENGINE=libfuzzer
-        - TRAVIS_SANITIZER=address
-        - TRAVIS_ARCHITECTURE=i386
-    - name: "dataflow dataflow x86_64"
-      env:
-        - TRAVIS_ENGINE=dataflow
-        - TRAVIS_SANITIZER=dataflow
-        - TRAVIS_ARCHITECTURE=x86_64
-    - name: "infra-tests"
-      script: sudo /bin/bash -c 'source $HOME/virtualenv/python3.6/bin/activate && ./infra/presubmit.py infra-tests'
-
-script: ./infra/travis/travis_build.py
-
-notifications:
-  webhooks: https://www.travisbuddy.com/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 81dfba7..4255338 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,4 +1,5 @@
-Want to contribute? Great! First, read this page (including the small print at the end).
+Want to contribute? Great! First, read this page (including the small print at
+the end).
 
 ### Before you contribute
 Before we can use your code, you must sign the
@@ -6,7 +7,7 @@
 (CLA), which you can do online. The CLA is necessary mainly because you own the
 copyright to your changes, even after your contribution becomes part of our
 codebase, so we need your permission to use and distribute your code. We also
-need to be sure of various other things—for instance that you'll tell us if you
+need to be sure of various other things: for instance that you'll tell us if you
 know that your code infringes on other people's patents. You don't have to sign
 the CLA until after you've submitted your code for review and a member has
 approved it, but you must do it before we can put your code into our codebase.
diff --git a/METADATA b/METADATA
index 9a352cb..4abb3f6 100644
--- a/METADATA
+++ b/METADATA
@@ -9,11 +9,11 @@
     type: GIT
     value: "https://github.com/google/oss-fuzz.git"
   }
-  version: "4e241e814080eac62a106931214cbd17275182cc"
+  version: "e0a94e1a0924a1e2460f5de5abad9ee6b5acad7d"
   license_type: NOTICE
   last_upgrade_date {
     year: 2020
-    month: 6
-    day: 1
+    month: 8
+    day: 10
   }
 }
diff --git a/README.md b/README.md
index 102fdec..429fbda 100644
--- a/README.md
+++ b/README.md
@@ -1,39 +1,58 @@
 # OSS-Fuzz: Continuous Fuzzing for Open Source Software
 
-[Fuzz testing](https://en.wikipedia.org/wiki/Fuzz_testing) is a well-known
-technique for uncovering programming errors in software.
-Many of these detectable errors, like [buffer overflow](https://en.wikipedia.org/wiki/Buffer_overflow), can have serious security implications. Google has found [thousands] of security vulnerabilities and stability bugs by deploying [guided in-process fuzzing of Chrome components](https://security.googleblog.com/2016/08/guided-in-process-fuzzing-of-chrome.html),
-and we now want to share that service with the open source community. 
+[Fuzz testing] is a well-known technique for uncovering programming errors in
+software. Many of these detectable errors, like [buffer overflow], can have
+serious security implications. Google has found [thousands] of security
+vulnerabilities and stability bugs by deploying [guided in-process fuzzing of
+Chrome components], and we now want to share that service with the open source
+community.
 
+[Fuzz testing]: https://en.wikipedia.org/wiki/Fuzz_testing
+[buffer overflow]: https://en.wikipedia.org/wiki/Buffer_overflow
 [thousands]: https://bugs.chromium.org/p/chromium/issues/list?q=label%3AStability-LibFuzzer%2CStability-AFL%20-status%3ADuplicate%2CWontFix&can=1
+[guided in-process fuzzing of Chrome components]: https://security.googleblog.com/2016/08/guided-in-process-fuzzing-of-chrome.html
 
-In cooperation with the [Core Infrastructure Initiative](https://www.coreinfrastructure.org/), 
-OSS-Fuzz aims to make common open source software more secure and stable by
-combining modern fuzzing techniques with scalable,
-distributed execution.
+In cooperation with the [Core Infrastructure Initiative], OSS-Fuzz aims to make
+common open source software more secure and stable by combining modern fuzzing
+techniques with scalable, distributed execution.
 
-We support the [libFuzzer](http://llvm.org/docs/LibFuzzer.html) and [AFL](https://lcamtuf.coredump.cx/afl/) fuzzing engines
-in combination with [Sanitizers](https://github.com/google/sanitizers), as well as
-[ClusterFuzz](https://github.com/google/clusterfuzz),
-a distributed fuzzer execution environment and reporting tool. 
+[Core Infrastructure Initiative]: https://www.coreinfrastructure.org/
 
-Currently, OSS-Fuzz supports C/C++, Rust, and Go code. Other languages supported by [LLVM](http://llvm.org) may work too.
-OSS-Fuzz supports fuzzing x86_64 and i386 builds.
+We support the [libFuzzer], [AFL], and [Honggfuzz] fuzzing engines in
+combination with [Sanitizers], as well as [ClusterFuzz], a distributed fuzzer
+execution environment and reporting tool.
+
+[libFuzzer]: https://llvm.org/docs/LibFuzzer.html
+[AFL]: https://lcamtuf.coredump.cx/afl/
+[Honggfuzz]: https://github.com/google/honggfuzz
+[Sanitizers]: https://github.com/google/sanitizers
+[ClusterFuzz]: https://github.com/google/clusterfuzz
+
+Currently, OSS-Fuzz supports C/C++, Rust, and Go code. Other languages supported
+by [LLVM] may work too. OSS-Fuzz supports fuzzing x86_64 and i386 builds.
+
+[LLVM]: https://llvm.org
 
 ## Overview
 ![OSS-Fuzz process diagram](docs/images/process.png)
 
 ## Documentation
-Read our [detailed documentation](https://google.github.io/oss-fuzz) to learn how to use OSS-Fuzz.
+Read our [detailed documentation] to learn how to use OSS-Fuzz.
+
+[detailed documentation]: https://google.github.io/oss-fuzz
 
 ## Trophies
-As of January 2020, OSS-Fuzz has found over [16,000] bugs in [250] open source projects.
+As of June 2020, OSS-Fuzz has found over [20,000] bugs in [300] open source
+projects.
 
-[16,000]: https://bugs.chromium.org/p/oss-fuzz/issues/list?q=-status%3AWontFix%2CDuplicate%20-component%3AInfra&can=1
-[250]: https://github.com/google/oss-fuzz/tree/master/projects
+[20,000]: https://bugs.chromium.org/p/oss-fuzz/issues/list?q=-status%3AWontFix%2CDuplicate%20-component%3AInfra&can=1
+[300]: https://github.com/google/oss-fuzz/tree/master/projects
 
 ## Blog posts
+* 2016-12-01 - [Announcing OSS-Fuzz: Continuous fuzzing for open source software]
+* 2017-05-08 - [OSS-Fuzz: Five months later, and rewarding projects]
+* 2018-11-06 - [A New Chapter for OSS-Fuzz]
 
-* 2016-12-01 - [Announcing OSS-Fuzz: Continuous fuzzing for open source software](https://opensource.googleblog.com/2016/12/announcing-oss-fuzz-continuous-fuzzing.html)
-* 2017-05-08 - [OSS-Fuzz: Five months later, and rewarding projects](https://opensource.googleblog.com/2017/05/oss-fuzz-five-months-later-and.html)
-* 2018-11-06 - [A New Chapter for OSS-Fuzz](https://security.googleblog.com/2018/11/a-new-chapter-for-oss-fuzz.html)
+[Announcing OSS-Fuzz: Continuous fuzzing for open source software]: https://opensource.googleblog.com/2016/12/announcing-oss-fuzz-continuous-fuzzing.html
+[OSS-Fuzz: Five months later, and rewarding projects]: https://opensource.googleblog.com/2017/05/oss-fuzz-five-months-later-and.html
+[A New Chapter for OSS-Fuzz]: https://security.googleblog.com/2018/11/a-new-chapter-for-oss-fuzz.html
diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock
index 14b63ac..a6c756a 100644
--- a/docs/Gemfile.lock
+++ b/docs/Gemfile.lock
@@ -1,13 +1,14 @@
 GEM
   remote: https://rubygems.org/
   specs:
-    activesupport (4.2.11.1)
-      i18n (~> 0.7)
+    activesupport (6.0.3.2)
+      concurrent-ruby (~> 1.0, >= 1.0.2)
+      i18n (>= 0.7, < 2)
       minitest (~> 5.1)
-      thread_safe (~> 0.3, >= 0.3.4)
       tzinfo (~> 1.1)
-    addressable (2.6.0)
-      public_suffix (>= 2.0.2, < 4.0)
+      zeitwerk (~> 2.2, >= 2.2.2)
+    addressable (2.7.0)
+      public_suffix (>= 2.0.2, < 5.0)
     coffee-script (2.4.1)
       coffee-script-source
       execjs
@@ -15,7 +16,7 @@
     colorator (1.1.0)
     commonmarker (0.17.13)
       ruby-enum (~> 0.5)
-    concurrent-ruby (1.1.5)
+    concurrent-ruby (1.1.6)
     dnsruby (1.61.3)
       addressable (~> 2.5)
     em-websocket (0.5.1)
@@ -25,33 +26,32 @@
       ffi (>= 1.3.0)
     eventmachine (1.2.7)
     execjs (2.7.0)
-    faraday (0.15.4)
+    faraday (1.0.1)
       multipart-post (>= 1.2, < 3)
-    ffi (1.11.1)
+    ffi (1.13.1)
     forwardable-extended (2.6.0)
     gemoji (3.0.1)
-    github-pages (198)
-      activesupport (= 4.2.11.1)
+    github-pages (206)
       github-pages-health-check (= 1.16.1)
-      jekyll (= 3.8.5)
-      jekyll-avatar (= 0.6.0)
+      jekyll (= 3.8.7)
+      jekyll-avatar (= 0.7.0)
       jekyll-coffeescript (= 1.1.1)
-      jekyll-commonmark-ghpages (= 0.1.5)
+      jekyll-commonmark-ghpages (= 0.1.6)
       jekyll-default-layout (= 0.1.4)
-      jekyll-feed (= 0.11.0)
+      jekyll-feed (= 0.13.0)
       jekyll-gist (= 1.5.0)
-      jekyll-github-metadata (= 2.12.1)
-      jekyll-mentions (= 1.4.1)
-      jekyll-optional-front-matter (= 0.3.0)
+      jekyll-github-metadata (= 2.13.0)
+      jekyll-mentions (= 1.5.1)
+      jekyll-optional-front-matter (= 0.3.2)
       jekyll-paginate (= 1.1.0)
-      jekyll-readme-index (= 0.2.0)
-      jekyll-redirect-from (= 0.14.0)
-      jekyll-relative-links (= 0.6.0)
-      jekyll-remote-theme (= 0.3.1)
+      jekyll-readme-index (= 0.3.0)
+      jekyll-redirect-from (= 0.15.0)
+      jekyll-relative-links (= 0.6.1)
+      jekyll-remote-theme (= 0.4.1)
       jekyll-sass-converter (= 1.5.2)
-      jekyll-seo-tag (= 2.5.0)
-      jekyll-sitemap (= 1.2.0)
-      jekyll-swiss (= 0.4.0)
+      jekyll-seo-tag (= 2.6.1)
+      jekyll-sitemap (= 1.4.0)
+      jekyll-swiss (= 1.0.0)
       jekyll-theme-architect (= 0.1.1)
       jekyll-theme-cayman (= 0.1.1)
       jekyll-theme-dinky (= 0.1.1)
@@ -61,19 +61,18 @@
       jekyll-theme-midnight (= 0.1.1)
       jekyll-theme-minimal (= 0.1.1)
       jekyll-theme-modernist (= 0.1.1)
-      jekyll-theme-primer (= 0.5.3)
+      jekyll-theme-primer (= 0.5.4)
       jekyll-theme-slate (= 0.1.1)
       jekyll-theme-tactile (= 0.1.1)
       jekyll-theme-time-machine (= 0.1.1)
-      jekyll-titles-from-headings (= 0.5.1)
-      jemoji (= 0.10.2)
+      jekyll-titles-from-headings (= 0.5.3)
+      jemoji (= 0.11.1)
       kramdown (= 1.17.0)
-      liquid (= 4.0.0)
-      listen (= 3.1.5)
+      liquid (= 4.0.3)
       mercenary (~> 0.3)
-      minima (= 2.5.0)
-      nokogiri (>= 1.8.5, < 2.0)
-      rouge (= 2.2.1)
+      minima (= 2.5.1)
+      nokogiri (>= 1.10.4, < 2.0)
+      rouge (= 3.19.0)
       terminal-table (~> 1.4)
     github-pages-health-check (1.16.1)
       addressable (~> 2.3)
@@ -81,13 +80,13 @@
       octokit (~> 4.0)
       public_suffix (~> 3.0)
       typhoeus (~> 1.3)
-    html-pipeline (2.12.0)
+    html-pipeline (2.13.0)
       activesupport (>= 2)
       nokogiri (>= 1.4)
     http_parser.rb (0.6.0)
     i18n (0.9.5)
       concurrent-ruby (~> 1.0)
-    jekyll (3.8.5)
+    jekyll (3.8.7)
       addressable (~> 2.4)
       colorator (~> 1.0)
       em-websocket (~> 0.5)
@@ -100,49 +99,50 @@
       pathutil (~> 0.9)
       rouge (>= 1.7, < 4)
       safe_yaml (~> 1.0)
-    jekyll-avatar (0.6.0)
-      jekyll (~> 3.0)
+    jekyll-avatar (0.7.0)
+      jekyll (>= 3.0, < 5.0)
     jekyll-coffeescript (1.1.1)
       coffee-script (~> 2.2)
       coffee-script-source (~> 1.11.1)
     jekyll-commonmark (1.3.1)
       commonmarker (~> 0.14)
       jekyll (>= 3.7, < 5.0)
-    jekyll-commonmark-ghpages (0.1.5)
+    jekyll-commonmark-ghpages (0.1.6)
       commonmarker (~> 0.17.6)
-      jekyll-commonmark (~> 1)
-      rouge (~> 2)
+      jekyll-commonmark (~> 1.2)
+      rouge (>= 2.0, < 4.0)
     jekyll-default-layout (0.1.4)
       jekyll (~> 3.0)
-    jekyll-feed (0.11.0)
-      jekyll (~> 3.3)
+    jekyll-feed (0.13.0)
+      jekyll (>= 3.7, < 5.0)
     jekyll-gist (1.5.0)
       octokit (~> 4.2)
-    jekyll-github-metadata (2.12.1)
-      jekyll (~> 3.4)
+    jekyll-github-metadata (2.13.0)
+      jekyll (>= 3.4, < 5.0)
       octokit (~> 4.0, != 4.4.0)
-    jekyll-mentions (1.4.1)
+    jekyll-mentions (1.5.1)
       html-pipeline (~> 2.3)
-      jekyll (~> 3.0)
-    jekyll-optional-front-matter (0.3.0)
-      jekyll (~> 3.0)
+      jekyll (>= 3.7, < 5.0)
+    jekyll-optional-front-matter (0.3.2)
+      jekyll (>= 3.0, < 5.0)
     jekyll-paginate (1.1.0)
-    jekyll-readme-index (0.2.0)
-      jekyll (~> 3.0)
-    jekyll-redirect-from (0.14.0)
-      jekyll (~> 3.3)
-    jekyll-relative-links (0.6.0)
-      jekyll (~> 3.3)
-    jekyll-remote-theme (0.3.1)
-      jekyll (~> 3.5)
-      rubyzip (>= 1.2.1, < 3.0)
+    jekyll-readme-index (0.3.0)
+      jekyll (>= 3.0, < 5.0)
+    jekyll-redirect-from (0.15.0)
+      jekyll (>= 3.3, < 5.0)
+    jekyll-relative-links (0.6.1)
+      jekyll (>= 3.3, < 5.0)
+    jekyll-remote-theme (0.4.1)
+      addressable (~> 2.0)
+      jekyll (>= 3.5, < 5.0)
+      rubyzip (>= 1.3.0)
     jekyll-sass-converter (1.5.2)
       sass (~> 3.4)
-    jekyll-seo-tag (2.5.0)
-      jekyll (~> 3.3)
-    jekyll-sitemap (1.2.0)
-      jekyll (~> 3.3)
-    jekyll-swiss (0.4.0)
+    jekyll-seo-tag (2.6.1)
+      jekyll (>= 3.3, < 5.0)
+    jekyll-sitemap (1.4.0)
+      jekyll (>= 3.7, < 5.0)
+    jekyll-swiss (1.0.0)
     jekyll-theme-architect (0.1.1)
       jekyll (~> 3.5)
       jekyll-seo-tag (~> 2.0)
@@ -170,8 +170,8 @@
     jekyll-theme-modernist (0.1.1)
       jekyll (~> 3.5)
       jekyll-seo-tag (~> 2.0)
-    jekyll-theme-primer (0.5.3)
-      jekyll (~> 3.5)
+    jekyll-theme-primer (0.5.4)
+      jekyll (> 3.5, < 5.0)
       jekyll-github-metadata (~> 2.9)
       jekyll-seo-tag (~> 2.0)
     jekyll-theme-slate (0.1.1)
@@ -183,43 +183,42 @@
     jekyll-theme-time-machine (0.1.1)
       jekyll (~> 3.5)
       jekyll-seo-tag (~> 2.0)
-    jekyll-titles-from-headings (0.5.1)
-      jekyll (~> 3.3)
+    jekyll-titles-from-headings (0.5.3)
+      jekyll (>= 3.3, < 5.0)
     jekyll-watch (2.2.1)
       listen (~> 3.0)
-    jemoji (0.10.2)
+    jemoji (0.11.1)
       gemoji (~> 3.0)
       html-pipeline (~> 2.2)
-      jekyll (~> 3.0)
+      jekyll (>= 3.0, < 5.0)
     kramdown (1.17.0)
-    liquid (4.0.0)
-    listen (3.1.5)
-      rb-fsevent (~> 0.9, >= 0.9.4)
-      rb-inotify (~> 0.9, >= 0.9.7)
-      ruby_dep (~> 1.2)
+    liquid (4.0.3)
+    listen (3.2.1)
+      rb-fsevent (~> 0.10, >= 0.10.3)
+      rb-inotify (~> 0.9, >= 0.9.10)
     mercenary (0.3.6)
     mini_portile2 (2.4.0)
-    minima (2.5.0)
-      jekyll (~> 3.5)
+    minima (2.5.1)
+      jekyll (>= 3.5, < 5.0)
       jekyll-feed (~> 0.9)
       jekyll-seo-tag (~> 2.1)
-    minitest (5.11.3)
+    minitest (5.14.1)
     multipart-post (2.1.1)
-    nokogiri (1.10.8)
+    nokogiri (1.10.10)
       mini_portile2 (~> 2.4.0)
-    octokit (4.14.0)
+    octokit (4.18.0)
+      faraday (>= 0.9)
       sawyer (~> 0.8.0, >= 0.5.3)
     pathutil (0.16.2)
       forwardable-extended (~> 2.6)
     public_suffix (3.1.1)
-    rb-fsevent (0.10.3)
-    rb-inotify (0.10.0)
+    rb-fsevent (0.10.4)
+    rb-inotify (0.10.1)
       ffi (~> 1.0)
-    rouge (2.2.1)
-    ruby-enum (0.7.2)
+    rouge (3.19.0)
+    ruby-enum (0.8.0)
       i18n
-    ruby_dep (1.5.0)
-    rubyzip (1.2.3)
+    rubyzip (2.3.0)
     safe_yaml (1.0.5)
     sass (3.7.4)
       sass-listen (~> 4.0.0)
@@ -232,11 +231,12 @@
     terminal-table (1.8.0)
       unicode-display_width (~> 1.1, >= 1.1.1)
     thread_safe (0.3.6)
-    typhoeus (1.3.1)
+    typhoeus (1.4.0)
       ethon (>= 0.9.0)
-    tzinfo (1.2.5)
+    tzinfo (1.2.7)
       thread_safe (~> 0.1)
-    unicode-display_width (1.6.0)
+    unicode-display_width (1.7.0)
+    zeitwerk (2.4.0)
 
 PLATFORMS
   ruby
@@ -245,4 +245,4 @@
   github-pages
 
 BUNDLED WITH
-   1.16.1
+   2.1.4
diff --git a/docs/advanced-topics/ideal_integration.md b/docs/advanced-topics/ideal_integration.md
index b83fafe..7e18653 100644
--- a/docs/advanced-topics/ideal_integration.md
+++ b/docs/advanced-topics/ideal_integration.md
@@ -73,7 +73,7 @@
 * For every fuzz target `foo` in the project, there is a build rule that
 builds `foo_fuzzer`, a binary that: 
 	* Contains the fuzzing entry point.
-	* Contains (`LLVMFuzzerTestOneInput`) and all the code it depends on
+	* Contains (`LLVMFuzzerTestOneInput`) and all the code it depends on.
 	* Uses the `main()` function from `$LIB_FUZZING_ENGINE` (env var [provided]({{ site.baseurl }}/getting-started/new-project-guide/) by OSS-Fuzz environment).
 * Since the build system supports changing the compiler and passing extra compiler
 flags, the build command for `foo_fuzzer` looks similar to this:
@@ -143,7 +143,7 @@
 [sanitizers](https://github.com/google/sanitizers) during regression testing.
 
 Examples: [SQLite](https://www.sqlite.org/src/artifact/d9f1a6f43e7bab45),
-[openssl](https://github.com/openssl/openssl/blob/master/fuzz/test-corpus.c)
+[openssl](https://github.com/openssl/openssl/blob/master/fuzz/test-corpus.c).
 
 ## Performance
 
diff --git a/docs/advanced-topics/reproducing.md b/docs/advanced-topics/reproducing.md
index 7e8ea6d..9b5e297 100644
--- a/docs/advanced-topics/reproducing.md
+++ b/docs/advanced-topics/reproducing.md
@@ -78,9 +78,9 @@
 
 The `sanitizer` used in the report is the value in the
 **Sanitizer** column. It's one of the following:
-  * **address** for AddressSanitizer
-  * **memory** for MemorySanitizer
-  * **undefined** for UndefinedBehaviorSanitizer
+  * **address** for AddressSanitizer.
+  * **memory** for MemorySanitizer.
+  * **undefined** for UndefinedBehaviorSanitizer.
 
 **Note**: The `architecture` argument is only necessary if you want to specify
 `i386` configuration.
diff --git a/docs/faq.md b/docs/faq.md
index d3c5579..2ba2631 100644
--- a/docs/faq.md
+++ b/docs/faq.md
@@ -45,6 +45,13 @@
   - look for existing fuzz target [examples](https://github.com/google/oss-fuzz/tree/master/projects)
     and find similarities.
 
+## Where can I store fuzz target sources and the build script if it's not yet accepted upstream?
+
+Fuzz target sources as well as the build script may temporarily live inside the
+`projects/<your_project>` directory in the OSS-Fuzz repository. Note that we do
+not accept integrations that rely on forked repositories. Refer to the
+[ideal integration guide] for the preferred long term solution.
+
 ## My project is not open source. Can I use OSS-Fuzz?
 
 You cannot use OSS-Fuzz, but you can use [ClusterFuzz] which OSS-Fuzz is based
@@ -152,6 +159,7 @@
 as they do not indicate the presence of bugs or lack thereof.
 
 ## What happens when I rename a fuzz target ?
+
 If you rename your fuzz targets, the existing bugs for those targets will get
 closed and fuzzing will start from scratch from a fresh corpora
 (seed corpus only). Similar corpora will get accumulated over time depending on
@@ -163,14 +171,15 @@
 new location [here]({{ site.baseurl }}/advanced-topics/corpora/#viewing-the-corpus-for-a-fuzz-target)).
 
 ## Does OSS-Fuzz support AFL or honggfuzz?
+
 OSS-Fuzz *uses* both [AFL](https://lcamtuf.coredump.cx/afl/) and
 [honggfuzz](https://github.com/google/honggfuzz)
 [fuzzing engines]({{ site.baseurl }}/reference/glossary/#fuzzing-engine).
-Follow the
-[ideal integration guide]({{ site.baseurl }}/advanced-topics/ideal-integration/)
-and OSS-Fuzz will use all its fuzzing engines on your code.
+Follow the [ideal integration guide] and OSS-Fuzz will use all its fuzzing
+engines on your code.
 
 ## What are the specs on your machines?
+
 OSS-Fuzz builders have 32CPU/28.8GB RAM.
 
 Fuzzing machines only have a single core and fuzz targets should not use more
@@ -184,3 +193,4 @@
 have no intent to restrict the use of the artifacts produced by OSS-Fuzz.
 
 [ClusterFuzz]: https://github.com/google/clusterfuzz
+[ideal integration guide]: {{ site.baseurl }}/advanced-topics/ideal-integration/
diff --git a/docs/further-reading/fuzzer_environment.md b/docs/further-reading/fuzzer_environment.md
index 233cb25..7c527ec 100644
--- a/docs/further-reading/fuzzer_environment.md
+++ b/docs/further-reading/fuzzer_environment.md
@@ -25,11 +25,11 @@
 [build.sh]({{ site.baseurl }}/getting-started/new-project-guide/#buildsh)
 are not available on the bot runtime environment (where the fuzz targets run).
 
-If you need these dependencies in the runtime environment, you can either
+If you need these dependencies in the runtime environment, you can either:
 - Install the packages via Dockerfile
 ([example](https://github.com/google/oss-fuzz/blob/2d5e2ef84f281e6ab789055aa735606d3122fda9/projects/tor/Dockerfile#L19))
 and then link statically against them
-([example](https://github.com/google/oss-fuzz/blob/2d5e2ef84f281e6ab789055aa735606d3122fda9/projects/tor/build.sh#L40))
+([example](https://github.com/google/oss-fuzz/blob/2d5e2ef84f281e6ab789055aa735606d3122fda9/projects/tor/build.sh#L40)).
 - Or build the dependencies statically in
 [build.sh]({{ site.baseurl }}/getting-started/new-project-guide/#buildsh)
 ([example](https://github.com/google/oss-fuzz/blob/64f8b6593da141b97c98c7bc6f07df92c42ee010/projects/ffmpeg/build.sh#L26)).
diff --git a/docs/getting-started/continuous_integration.md b/docs/getting-started/continuous_integration.md
index cc461a5..0ebe5d1 100644
--- a/docs/getting-started/continuous_integration.md
+++ b/docs/getting-started/continuous_integration.md
@@ -10,7 +10,7 @@
 
 OSS-Fuzz offers **CIFuzz**, which will run your fuzz targets each time a pull request
 is submitted, for projects hosted on GitHub. This allows you to detect and
-fix bugs before they make it into your codebase
+fix bugs before they make it into your codebase.
 
 ## How it works
 
@@ -79,9 +79,9 @@
 ```
 
 
-
 ### Optional configuration
 
+#### Configurable Variables
 `fuzz-time`: Determines how long CIFuzz spends fuzzing your project in seconds.
 The default is 600 seconds. The GitHub Actions max run time is 21600 seconds (6 hours).
 
@@ -94,6 +94,95 @@
 limit for broken fuzz targets than OSS-Fuzz's check_build. Most users should
 not set this.
 
+`sanitizer`: Determines a sanitizer to build and run fuzz targets with. The choices are `'address'`,
+`'memory'` and `'undefined'`. The default is `'address'`. It is important to note that the `Build Fuzzers`
+and the `Run Fuzzers` sanitizer field needs to be the same. To specify a list of sanitizers
+a [matrix](https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstrategymatrix)
+can be used. To use a sanitizer add it to the list of sanitizers in the matrix field below:
+
+```yaml
+{% raw %}
+name: CIFuzz
+on: [pull_request]
+jobs:
+ Fuzzing:
+   runs-on: ubuntu-latest
+   strategy:
+     fail-fast: false
+     matrix:
+       sanitizer: [address, undefined, memory]
+   steps:
+   - name: Build Fuzzers (${{ matrix.sanitizer }})
+     id: build
+     uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
+     with:
+       oss-fuzz-project-name: 'example'
+       dry-run: false
+       sanitizer: ${{ matrix.sanitizer }}
+   - name: Run Fuzzers (${{ matrix.sanitizer }})
+     uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
+     with:
+       oss-fuzz-project-name: 'example'
+       fuzz-seconds: 600
+       dry-run: false
+       sanitizer: ${{ matrix.sanitizer }}
+   - name: Upload Crash
+     uses: actions/upload-artifact@v1
+     if: failure() && steps.build.outcome == 'success'
+     with:
+       name: ${{ matrix.sanitizer }}-artifacts
+       path: ./out/artifacts
+{% endraw %}
+```
+
+#### Branches and paths
+
+You can make CIFuzz trigger only on certain branches or paths by following the
+instructions [here](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions).
+For example, the following code can used to trigger CIFuzz only on changes to
+C/C++ code residing on master and release branches:
+
+```yaml
+name: CIFuzz
+on:
+  pull_request:
+    branches: 
+      - master
+      - 'releases/**'
+    paths:
+      - '**.c'
+      - '**.cc'
+      - '**.cpp'
+      - '**.cxx'
+      - '**.h'
+jobs:
+ Fuzzing:
+   runs-on: ubuntu-latest
+   steps:
+   - name: Build Fuzzers
+     id: build
+     uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master
+     with:
+       oss-fuzz-project-name: 'example'
+       dry-run: false
+   - name: Run Fuzzers
+     uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master
+     with:
+       oss-fuzz-project-name: 'example'
+       fuzz-seconds: 600
+       dry-run: false
+   - name: Upload Crash
+     uses: actions/upload-artifact@v1
+     if: failure() && steps.build.outcome == 'success'
+     with:
+       name: artifacts
+       path: ./out/artifacts
+```
+
+You can checkout CIFuzz configs for OSS-Fuzz projects. Example -
+[systemd](https://github.com/systemd/systemd/blob/master/.github/workflows/cifuzz.yml),
+[curl](https://github.com/curl/curl/blob/master/.github/workflows/fuzz.yml).
+
 ## Understanding results
 
 The results of CIFuzz can be found in two different places.
diff --git a/docs/getting-started/new-project-guide/rust_lang.md b/docs/getting-started/new-project-guide/rust_lang.md
new file mode 100644
index 0000000..c28dd76
--- /dev/null
+++ b/docs/getting-started/new-project-guide/rust_lang.md
@@ -0,0 +1,102 @@
+---
+layout: default
+title: Integrating a Rust project
+parent: Setting up a new project
+grand_parent: Getting started
+nav_order: 2
+permalink: /getting-started/new-project-guide/rust-lang/
+---
+
+# Integrating a Rust project
+{: .no_toc}
+
+- TOC
+{:toc}
+---
+
+The process of integrating a project written in Rust with OSS-Fuzz is very
+similar to the general [Setting up a new project]({{ site.baseurl
+}}/getting-started/new-project-guide/) process. The key specifics of integrating
+a Rust project are outlined below.
+
+## cargo-fuzz support
+
+Rust integration with OSS-Fuzz is expected to use [`cargo
+fuzz`](https://github.com/rust-fuzz/cargo-fuzz) to build fuzzers. The `cargo
+fuzz` tool will build code with required compiler flags as well as link to the
+correct libFuzzer on OSS-Fuzz itself. Note that using `cargo fuzz` also makes it
+quite easy to run the fuzzers locally yourself if you get a failing test case!
+
+## Project files
+
+First you'll want to follow the [setup instructions for `cargo fuzz`
+itself](https://rust-fuzz.github.io/book/). Afterwards your project should have:
+
+* A top-level `fuzz` directory.
+* A `fuzz/Cargo.toml` manifest which pulls in necessary dependencies to fuzz.
+* Some `fuzz/fuzz_targets/*.rs` files which are the fuzz targets that will be
+  compiled and run on OSS-Fuzz.
+
+Note that you can customize this layout as well, but you'll need to edit some
+the scripts below to integrate into OSS-Fuzz.
+
+### project.yaml
+
+The `language` attribute must be specified.
+
+```yaml
+language: rust
+```
+
+The only supported fuzzing engine and sanitizer are `libfuzzer` and `address`,
+respectively.
+[Example](https://github.com/google/oss-fuzz/blob/12ef3654b3e9adfd20b5a6afdde54819ba71493d/projects/serde_json/project.yaml#L3-L6)
+
+```yaml
+sanitizers:
+  - address
+fuzzing_engines:
+  - libfuzzer
+```
+
+### Dockerfile
+
+The OSS-Fuzz builder image has the latest nightly release of Rust as well as
+`cargo fuzz` pre-installed and in `PATH`. In the `Dockerfile` for your project
+all you'll need to do is fetch the latest copy of your code and install any
+system dependencies necessary to build your project.
+[Example](https://github.com/google/oss-fuzz/blob/12ef3654b3e9adfd20b5a6afdde54819ba71493d/projects/serde_json/Dockerfile#L18-L20)
+
+```dockerfile
+RUN git clone --depth 1 https://github.com/serde-rs/json json
+```
+
+### build.sh
+
+Here it's expected that you'll build the fuzz targets for your project and then
+copy the final binaries into the output directory.
+[Example](https://github.com/google/oss-fuzz/blob/12ef3654b3e9adfd20b5a6afdde54819ba71493d/projects/serde_json/build.sh#L20):
+
+```sh
+cd $SRC/json
+cargo fuzz build -O
+cp fuzz/target/x86_64-unknown-linux-gnu/release/from_slice $OUT/
+```
+
+Note that you likely want to pass the `-O` flag to `cargo fuzz build` which
+builds fuzzers in release mode. You may also want to pass the
+`--debug-assertions` flag to enable more checks while fuzzing. In this example
+the `from_slice` binary is the fuzz target.
+
+With some bash-fu you can also automatically copy over all fuzz targets into
+the output directory so when you add a fuzz target to your project it's
+automatically integrated into OSS-Fuzz:
+
+```sh
+FUZZ_TARGET_OUTPUT_DIR=target/x86_64-unknown-linux-gnu/release
+for f in fuzz/fuzz_targets/*.rs
+do
+    FUZZ_TARGET_NAME=$(basename ${f%.*})
+    cp $FUZZ_TARGET_OUTPUT_DIR/$FUZZ_TARGET_NAME $OUT/
+done
+```
diff --git a/docs/getting-started/new_project_guide.md b/docs/getting-started/new_project_guide.md
index 7ea668f..1b9a984 100644
--- a/docs/getting-started/new_project_guide.md
+++ b/docs/getting-started/new_project_guide.md
@@ -82,16 +82,19 @@
 - [sanitizers](#sanitizers) (optional)
 - [architectures](#architectures) (optional)
 - [help_url](#help_url) (optional)
+- [builds_per_day](#build_frequency) (optional)
 
 ### homepage
 You project's homepage.
 
 ### language
 
-Programming language the project is written in. Most often this would be `c` or
-`c++`. Other values for this attribute are documented in language specific
-documentation pages (e.g.
-[Integrating a Go project]({{ site.baseurl }}//getting-started/new-project-guide/go-lang/)).
+Programming language the project is written in. Values you can specify include:
+
+* `c`
+* `c++`
+* [`go`]({{ site.baseurl }}//getting-started/new-project-guide/go-lang/)
+* [`rust`]({{ site.baseurl }}//getting-started/new-project-guide/rust-lang/)
 
 ### primary_contact, auto_ccs {#primary}
 The primary contact and list of other contacts to be CCed. Each person listed gets access to ClusterFuzz, including crash reports and fuzzer statistics, and are auto-cced on new bugs filed in the OSS-Fuzz
@@ -114,11 +117,11 @@
 and recommended, but is not enabled by default due to the likelihood of false positives from
 un-instrumented system dependencies. If you want to use "memory," first make sure your project's
 runtime dependencies are listed in the OSS-Fuzz
-[msan-builder Dockerfile](https://github.com/google/oss-fuzz/blob/master/infra/base-images/msan-builder/Dockerfile#L20).
+[msan-libs-builder Dockerfile](https://github.com/google/oss-fuzz/blob/master/infra/base-images/msan-libs-builder/Dockerfile#L20).
 Then, you can opt in by adding "memory" to your list of sanitizers.
 
 If your project does not build with a particular sanitizer configuration and you need some time to fix
-it, you can use `sanitizers` to override the defaults temporarily. For example, to disable the 
+it, you can use `sanitizers` to override the defaults temporarily. For example, to disable the
 UndefinedBehaviourSanitizer build, just specify all supported sanitizers except "undefined".
 
 If you want to test a particular sanitizer to see what crashes it generates without filing
@@ -147,7 +150,7 @@
  - x86_64
  - i386
  ```
- 
+
 By fuzzing on i386 you might find bugs that:
 * Only occur in architecture-specific source code (e.g. code that contains i386 assembly).
 * Exist in architecture-independent source code and which only affects i386 users.
@@ -167,13 +170,22 @@
 
 `help_url` example: [skia](https://github.com/google/oss-fuzz/blob/master/projects/skia/project.yaml).
 
+### builds_per_day (optional) {#build_frequency}
+The number of times the project should be built per day.
+OSS-Fuzz allows upto 4 builds per day, and builds once per day by default.
+Example:
+```yaml
+builds_per_day: 2
+```
+
+Will build the project twice per day.
+
 ## Dockerfile
 
 This configuration file defines the Docker image for your project. Your [build.sh](#build.sh) script will be executed in inside the container you define.
 For most projects, the image is simple:
 ```docker
 FROM gcr.io/oss-fuzz-base/base-builder       # base image with clang toolchain
-MAINTAINER YOUR_EMAIL                        # maintainer for this file
 RUN apt-get update && apt-get install -y ... # install required packages to build your project
 RUN go get ...                               # install dependencies to build your Go project
 RUN git clone <git_url> <checkout_dir>       # checkout all sources needed to build your project
@@ -197,7 +209,7 @@
 - Build the project using your build system with the correct compiler.
 - Provide compiler flags as [environment variables](#Requirements).
 - Build your [fuzz targets]({{ site.baseurl }}/reference/glossary/#fuzz-target) and link your project's build with libFuzzer.
-   
+
 Resulting binaries should be placed in `$OUT`.
 
 Here's an example from Expat ([source](https://github.com/google/oss-fuzz/blob/master/projects/expat/build.sh)):
@@ -280,7 +292,7 @@
 
 ## Testing locally
 
-You can build your docker image and fuzz targets locally, so you can test them before you push them to the OSS-Fuzz repository. 
+You can build your docker image and fuzz targets locally, so you can test them before you push them to the OSS-Fuzz repository.
 
 1. Run the same helper script you used to create your directory structure, this time using it to build your docker image and [fuzz targets]({{ site.baseurl }}/reference/glossary/#fuzz-target):
 
@@ -296,8 +308,8 @@
     **Note:** You *must* run your fuzz target binaries inside the base-runner docker
     container to make sure that they work properly.
 
-2. Find failures to fix by running the `check_build` command: 
-    
+2. Find failures to fix by running the `check_build` command:
+
     ```bash
     $ python infra/helper.py check_build $PROJECT_NAME
     ```
@@ -305,16 +317,28 @@
 3. If you want to test changes against a particular fuzz target, run the following command:
 
     ```bash
-    $ python infra/helper.py run_fuzzer $PROJECT_NAME <fuzz_target>
+    $ python infra/helper.py run_fuzzer $PROJECT_NAME <fuzz_target> --corpus-dir=<path-to-temp-corpus-dir>
     ```
 
-4. We recommend taking a look at your code coverage as a sanity check to make sure that your
-fuzz targets get to the code you expect. Please refer to [code coverage]({{ site.baseurl }}/advanced-topics/code-coverage/).
+4. We recommend taking a look at your code coverage as a sanity check to make
+sure that your fuzz targets get to the code you expect. This would use the
+corpus generated from the previous `run_fuzzer` step in your local corpus
+directory.
 
-**Note:** Currently, we only support AddressSanitizer (address) and UndefinedBehaviorSanitizer (undefined) 
+    ```bash
+    $ python infra/helper.py build_fuzzers --sanitizer coverage $PROJECT_NAME
+    $ python infra/helper.py coverage $PROJECT_NAME --fuzz-target=<fuzz_target> --corpus-dir=<path-to-temp-corpus-dir>
+    ```
+
+Please refer to
+[code coverage]({{ site.baseurl }}/advanced-topics/code-coverage/) for detailed
+information on code coverage generation.
+
+
+**Note:** Currently, we only support AddressSanitizer (address) and UndefinedBehaviorSanitizer (undefined)
 configurations. MemorySanitizer is recommended, but needs to be enabled manually once you verify
 that all system dependencies are
-[instrumented](https://github.com/google/oss-fuzz/blob/master/infra/base-images/msan-builder/Dockerfile#L20).
+[instrumented](https://github.com/google/oss-fuzz/blob/master/infra/base-images/msan-libs-builder/Dockerfile#L20).
 <b>Make sure to test each
 of the supported build configurations with the above commands (build_fuzzers -> run_fuzzer -> coverage).</b>
 
diff --git a/docs/index.md b/docs/index.md
index cce3be1..c202a06 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -9,41 +9,53 @@
 
 # OSS-Fuzz
 
-[Fuzz testing](https://en.wikipedia.org/wiki/Fuzz_testing) is a well-known
-technique for uncovering programming errors in software.
-Many of these detectable errors, like [buffer overflow](https://en.wikipedia.org/wiki/Buffer_overflow),
-can have serious security implications. Google has found [thousands] of security vulnerabilities and
-stability bugs by deploying
-[guided in-process fuzzing of Chrome components](https://security.googleblog.com/2016/08/guided-in-process-fuzzing-of-chrome.html),
-and we now want to share that service with the open source community.
+[Fuzz testing] is a well-known technique for uncovering programming errors in
+software. Many of these detectable errors, like [buffer overflow], can have
+serious security implications. Google has found [thousands] of security
+vulnerabilities and stability bugs by deploying [guided in-process fuzzing of
+Chrome components], and we now want to share that service with the open source
+community.
 
+[Fuzz testing]: https://en.wikipedia.org/wiki/Fuzz_testing
+[buffer overflow]: https://en.wikipedia.org/wiki/Buffer_overflow
 [thousands]: https://bugs.chromium.org/p/chromium/issues/list?q=label%3AStability-LibFuzzer%2CStability-AFL%20-status%3ADuplicate%2CWontFix&can=1
+[guided in-process fuzzing of Chrome components]: https://security.googleblog.com/2016/08/guided-in-process-fuzzing-of-chrome.html
 
-In cooperation with the [Core Infrastructure Initiative](https://www.coreinfrastructure.org/), 
-OSS-Fuzz aims to make common open source software more secure and stable by
-combining modern fuzzing techniques with scalable,
-distributed execution.
+In cooperation with the [Core Infrastructure Initiative], OSS-Fuzz aims to make
+common open source software more secure and stable by combining modern fuzzing
+techniques with scalable, distributed execution.
 
-We support the [libFuzzer](http://llvm.org/docs/LibFuzzer.html) and [AFL](https://lcamtuf.coredump.cx/afl/) fuzzing engines
-in combination with [Sanitizers](https://github.com/google/sanitizers), as well as
-[ClusterFuzz](https://github.com/google/clusterfuzz),
-a distributed fuzzer execution environment and reporting tool. 
+[Core Infrastructure Initiative]: https://www.coreinfrastructure.org/
 
-Currently, OSS-Fuzz supports C/C++, Rust, and Go code. Other languages supported by [LLVM](http://llvm.org) may work too.
-OSS-Fuzz supports fuzzing x86_64 and i386 builds.
+We support the [libFuzzer], [AFL], and [Honggfuzz] fuzzing engines in
+combination with [Sanitizers], as well as [ClusterFuzz], a distributed fuzzer
+execution environment and reporting tool.
+
+[libFuzzer]: https://llvm.org/docs/LibFuzzer.html
+[AFL]: https://lcamtuf.coredump.cx/afl/
+[Honggfuzz]: https://github.com/google/honggfuzz
+[Sanitizers]: https://github.com/google/sanitizers
+[ClusterFuzz]: https://github.com/google/clusterfuzz
+
+Currently, OSS-Fuzz supports C/C++, Rust, and Go code. Other languages supported
+by [LLVM] may work too. OSS-Fuzz supports fuzzing x86_64 and i386 builds.
+
+[LLVM]: https://llvm.org
 
 ## Learn more about fuzzing
 
-This documentation describes how to use OSS-Fuzz service for your open source project.
-To learn more about fuzzing in general, we recommend reading [libFuzzer tutorial]
-and the other docs in [google/fuzzing] repository. These and some other resources
-are listed on the [useful links]({{ site.baseurl }}/reference/useful-links/#tutorials) page.
+This documentation describes how to use OSS-Fuzz service for your open source
+project. To learn more about fuzzing in general, we recommend reading [libFuzzer
+tutorial] and the other docs in [google/fuzzing] repository. These and some
+other resources are listed on the [useful links] page.
 
 [google/fuzzing]: https://github.com/google/fuzzing/tree/master/docs
 [libFuzzer tutorial]: https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md
+[useful links]: {{ site.baseurl }}/reference/useful-links/#tutorials
 
 ## Trophies
-As of January 2020, OSS-Fuzz has found over [16,000] bugs in [250] open source projects.
+As of June 2020, OSS-Fuzz has found over [20,000] bugs in [300] open source
+projects.
 
-[16,000]: https://bugs.chromium.org/p/oss-fuzz/issues/list?q=-status%3AWontFix%2CDuplicate%20-component%3AInfra&can=1
-[250]: https://github.com/google/oss-fuzz/tree/master/projects
+[20,000]: https://bugs.chromium.org/p/oss-fuzz/issues/list?q=-status%3AWontFix%2CDuplicate%20-component%3AInfra&can=1
+[300]: https://github.com/google/oss-fuzz/tree/master/projects
diff --git a/docs/reference/useful_links.md b/docs/reference/useful_links.md
index efbcfed..6d6dc47 100644
--- a/docs/reference/useful_links.md
+++ b/docs/reference/useful_links.md
@@ -21,8 +21,6 @@
 * [This page](https://oss-fuzz-build-logs.storage.googleapis.com/index.html)
   gives the latest build logs for each project.
 
-* (Internal only) [Builds dashboard](https://builder.oss-fuzz.com).
-
 ## Blog posts
 
 * 2016-12-01 - Announcing OSS-Fuzz: Continuous fuzzing for open source software
diff --git a/infra/base-images/base-builder/Dockerfile b/infra/base-images/base-builder/Dockerfile
index 7e85009..4a4d4c3 100644
--- a/infra/base-images/base-builder/Dockerfile
+++ b/infra/base-images/base-builder/Dockerfile
@@ -16,7 +16,8 @@
 
 FROM gcr.io/oss-fuzz-base/base-clang
 
-RUN apt-get update && \
+RUN dpkg --add-architecture i386 && \
+    apt-get update && \
     apt-get install -y software-properties-common && \
     add-apt-repository ppa:git-core/ppa && \
     apt-get update && \
diff --git a/infra/base-images/base-builder/precompile_honggfuzz b/infra/base-images/base-builder/precompile_honggfuzz
index 152922d..2565bb8 100755
--- a/infra/base-images/base-builder/precompile_honggfuzz
+++ b/infra/base-images/base-builder/precompile_honggfuzz
@@ -31,8 +31,9 @@
 pushd $SRC/honggfuzz > /dev/null
 make clean
 # These CFLAGs match honggfuzz's default, with the exception of -mtune to
-# improve portability.
-CC=clang CFLAGS="-O3 -funroll-loops" make
+# improve portability and `-D_HF_LINUX_NO_BFD` to remove assembly instructions
+# from the filenames.
+CC=clang CFLAGS="-O3 -funroll-loops -D_HF_LINUX_NO_BFD" make
 
 # libhfuzz.a will be added by CC/CXX linker directly during linking,
 # but it's defined here to satisfy the build infrastructure
diff --git a/infra/base-images/base-clang/Dockerfile b/infra/base-images/base-clang/Dockerfile
index df8376d..853a374 100644
--- a/infra/base-images/base-clang/Dockerfile
+++ b/infra/base-images/base-clang/Dockerfile
@@ -18,6 +18,15 @@
 
 FROM gcr.io/oss-fuzz-base/base-image
 
+# Install newer cmake.
+ENV CMAKE_VERSION 3.18.1
+RUN apt-get update && apt-get install -y wget sudo && \
+    wget https://github.com/Kitware/CMake/releases/download/v$CMAKE_VERSION/cmake-$CMAKE_VERSION-Linux-x86_64.sh && \
+    chmod +x cmake-$CMAKE_VERSION-Linux-x86_64.sh && \
+    ./cmake-$CMAKE_VERSION-Linux-x86_64.sh --skip-license --prefix="/usr/local" && \
+    rm cmake-$CMAKE_VERSION-Linux-x86_64.sh && \
+    SUDO_FORCE_REMOVE=yes apt-get remove --purge -y wget sudo
+
 COPY checkout_build_install_llvm.sh /root/
 # Keep all steps in the same script to decrease the number of intermediate
 # layes in docker file.
diff --git a/infra/base-images/base-clang/checkout_build_install_llvm.sh b/infra/base-images/base-clang/checkout_build_install_llvm.sh
index 44e512b..ec0d8ba 100755
--- a/infra/base-images/base-clang/checkout_build_install_llvm.sh
+++ b/infra/base-images/base-clang/checkout_build_install_llvm.sh
@@ -41,6 +41,19 @@
   return $CHECKOUT_RETURN_CODE
 }
 
+function cmake_llvm {
+  extra_args="$@"
+  cmake -G "Ninja" \
+      -DLIBCXX_ENABLE_SHARED=OFF \
+      -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON \
+      -DLIBCXXABI_ENABLE_SHARED=OFF \
+      -DCMAKE_BUILD_TYPE=Release \
+      -DLLVM_TARGETS_TO_BUILD="$TARGET_TO_BUILD" \
+      -DLLVM_ENABLE_PROJECTS="$PROJECTS_TO_BUILD" \
+      $extra_args \
+      $LLVM_SRC/llvm
+}
+
 # Use chromium's clang revision
 mkdir $SRC/chromium_tools
 cd $SRC/chromium_tools
@@ -55,7 +68,7 @@
 # To allow for manual downgrades. Set to 0 to use Chrome's clang version (i.e.
 # *not* force a manual downgrade). Set to 1 to force a manual downgrade.
 FORCE_OUR_REVISION=0
-LLVM_REVISION=$(grep -Po "CLANG_REVISION = '\K[a-f0-9]+(?=')" scripts/update.py)
+LLVM_REVISION=$(grep -Po "CLANG_REVISION = '\K([^']+)" scripts/update.py)
 
 clone_with_retries https://github.com/llvm/llvm-project.git $LLVM_SRC
 
@@ -94,40 +107,33 @@
 esac
 
 PROJECTS_TO_BUILD="libcxx;libcxxabi;compiler-rt;clang;lld"
-cmake -G "Ninja" \
-      -DLIBCXX_ENABLE_SHARED=OFF -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON -DLIBCXXABI_ENABLE_SHARED=OFF \
-      -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="$TARGET_TO_BUILD" \
-      -DLLVM_ENABLE_PROJECTS=$PROJECTS_TO_BUILD \
-      $LLVM_SRC/llvm
+cmake_llvm
 ninja
 
 cd $WORK/llvm-stage2
 export CC=$WORK/llvm-stage1/bin/clang
 export CXX=$WORK/llvm-stage1/bin/clang++
-cmake -G "Ninja" \
-      -DLIBCXX_ENABLE_SHARED=OFF -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON -DLIBCXXABI_ENABLE_SHARED=OFF \
-      -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="$TARGET_TO_BUILD" \
-      -DLLVM_ENABLE_PROJECTS=$PROJECTS_TO_BUILD \
-      $LLVM_SRC/llvm
+cmake_llvm
 ninja
 ninja install
 rm -rf $WORK/llvm-stage1 $WORK/llvm-stage2
 
+# Use the clang we just built from now on.
+CMAKE_EXTRA_ARGS="-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++"
+
+# 32-bit libraries.
 mkdir -p $WORK/i386
 cd $WORK/i386
-cmake -G "Ninja" \
-      -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
-      -DCMAKE_INSTALL_PREFIX=/usr/i386/ -DLIBCXX_ENABLE_SHARED=OFF \
-      -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON -DCMAKE_BUILD_TYPE=Release \
-      -DCMAKE_C_FLAGS="-m32" -DCMAKE_CXX_FLAGS="-m32" \
-      -DLLVM_TARGETS_TO_BUILD="$TARGET_TO_BUILD" \
-      -DLLVM_ENABLE_PROJECTS=$PROJECTS_TO_BUILD \
-      $LLVM_SRC/llvm
+cmake_llvm $CMAKE_EXTRA_ARGS \
+    -DCMAKE_INSTALL_PREFIX=/usr/i386/ \
+    -DCMAKE_C_FLAGS="-m32" \
+    -DCMAKE_CXX_FLAGS="-m32"
 
 ninja cxx
 ninja install-cxx
 rm -rf $WORK/i386
 
+# MemorySanitizer instrumented libraries.
 mkdir -p $WORK/msan
 cd $WORK/msan
 
@@ -136,19 +142,30 @@
 fun:__gxx_personality_*
 EOF
 
-cmake -G "Ninja" \
-      -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
-      -DLLVM_USE_SANITIZER=Memory -DCMAKE_INSTALL_PREFIX=/usr/msan/ \
-      -DLIBCXX_ENABLE_SHARED=OFF -DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON \
-      -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="$TARGET_TO_BUILD" \
-      -DCMAKE_CXX_FLAGS="-fsanitize-blacklist=$WORK/msan/blacklist.txt" \
-      -DLLVM_ENABLE_PROJECTS=$PROJECTS_TO_BUILD \
-      $LLVM_SRC/llvm
+cmake_llvm $CMAKE_EXTRA_ARGS \
+    -DLLVM_USE_SANITIZER=Memory \
+    -DCMAKE_INSTALL_PREFIX=/usr/msan/ \
+    -DCMAKE_CXX_FLAGS="-fsanitize-blacklist=$WORK/msan/blacklist.txt"
+
 ninja cxx
 ninja install-cxx
 rm -rf $WORK/msan
 
+# DataFlowSanitizer instrumented libraries.
+mkdir -p $WORK/dfsan
+cd $WORK/dfsan
+
+cmake_llvm $CMAKE_EXTRA_ARGS \
+    -DLLVM_USE_SANITIZER=DataFlow \
+    -DCMAKE_INSTALL_PREFIX=/usr/dfsan/
+
+ninja cxx cxxabi
+ninja install-cxx install-cxxabi
+rm -rf $WORK/dfsan
+
+# libFuzzer sources.
 cp -r $LLVM_SRC/compiler-rt/lib/fuzzer $SRC/libfuzzer
+
 # Cleanup
 rm -rf $LLVM_SRC
 rm -rf $SRC/chromium_tools
diff --git a/infra/base-images/base-runner/Dockerfile b/infra/base-images/base-runner/Dockerfile
index b35e567..b1b7bec 100644
--- a/infra/base-images/base-runner/Dockerfile
+++ b/infra/base-images/base-runner/Dockerfile
@@ -49,6 +49,7 @@
     reproduce \
     run_fuzzer \
     run_minijail \
+    parse_options.py \
     targets_list \
     test_all \
     test_one \
diff --git a/infra/base-images/base-runner/collect_dft b/infra/base-images/base-runner/collect_dft
index 81b8688..3f6c689 100755
--- a/infra/base-images/base-runner/collect_dft
+++ b/infra/base-images/base-runner/collect_dft
@@ -23,7 +23,7 @@
 fi
 
 # Timeout for running a single fuzz target.
-if [ -z "$COLLECT_DFT_TIMEOUT"]; then
+if [ -z "$COLLECT_DFT_TIMEOUT" ]; then
   COLLECT_DFT_TIMEOUT=1h
 fi
 
diff --git a/infra/base-images/base-runner/coverage b/infra/base-images/base-runner/coverage
index 79dba62..d2bd4dd 100755
--- a/infra/base-images/base-runner/coverage
+++ b/infra/base-images/base-runner/coverage
@@ -63,7 +63,6 @@
   local profraw_file_mask="$DUMPS_DIR/$target.*.profraw"
   local profdata_file="$DUMPS_DIR/$target.profdata"
   local corpus_real="/corpus/${target}"
-  mkdir -p $corpus_real
 
   # -merge=1 requires an output directory, create a dummy dir for that.
   local corpus_dummy="$OUT/dummy_corpus_dir_for_${target}"
diff --git a/infra/base-images/base-runner/download_corpus b/infra/base-images/base-runner/download_corpus
index 05ea63a..1b7ebe8 100755
--- a/infra/base-images/base-runner/download_corpus
+++ b/infra/base-images/base-runner/download_corpus
@@ -22,7 +22,7 @@
 
 for pair in "$@"; do
   read path url <<< "$pair"
-  wget -q -O $path $url || rm $path
+  wget -q -O $path $url
 done
 
 # Always exit with 0 as we do not track wget return codes and should not rely
diff --git a/infra/base-images/base-runner/parse_options.py b/infra/base-images/base-runner/parse_options.py
new file mode 100755
index 0000000..6612a30
--- /dev/null
+++ b/infra/base-images/base-runner/parse_options.py
@@ -0,0 +1,58 @@
+#!/usr/bin/env python3
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Helper script for parsing custom fuzzing options."""
+import configparser
+import sys
+
+
+def parse_options(options_file_path, options_section):
+  """Parses the given file and returns options from the given section."""
+  parser = configparser.ConfigParser()
+  parser.read(options_file_path)
+
+  if not parser.has_section(options_section):
+    return None
+
+  options = parser[options_section]
+
+  if options_section == 'libfuzzer':
+    options_string = ' '.join(
+        '-%s=%s' % (key, value) for key, value in options.items())
+  else:
+    # Sanitizer options.
+    options_string = ':'.join(
+        '%s=%s' % (key, value) for key, value in options.items())
+
+  return options_string
+
+
+def main():
+  """Processes the arguments and prints the options in the correct format."""
+  if len(sys.argv) < 3:
+    sys.stderr.write('Usage: %s <path_to_options_file> <options_section>\n' %
+                     sys.argv[0])
+    return 1
+
+  options = parse_options(sys.argv[1], sys.argv[2])
+  if options is not None:
+    print(options)
+
+  return 0
+
+
+if __name__ == "__main__":
+  sys.exit(main())
diff --git a/infra/base-images/base-runner/run_fuzzer b/infra/base-images/base-runner/run_fuzzer
index 37785db..cebcebb 100755
--- a/infra/base-images/base-runner/run_fuzzer
+++ b/infra/base-images/base-runner/run_fuzzer
@@ -63,6 +63,28 @@
   unzip -d ${CORPUS_DIR}/ $SEED_CORPUS > /dev/null
 fi
 
+OPTIONS_FILE="${FUZZER}.options"
+CUSTOM_LIBFUZZER_OPTIONS=""
+
+if [ -f $OPTIONS_FILE ]; then
+  custom_asan_options=$(parse_options.py $OPTIONS_FILE asan)
+  if [ ! -z $custom_asan_options ]; then
+    export ASAN_OPTIONS="$ASAN_OPTIONS:$custom_asan_options"
+  fi
+
+  custom_msan_options=$(parse_options.py $OPTIONS_FILE msan)
+  if [ ! -z $custom_msan_options ]; then
+    export MSAN_OPTIONS="$MSAN_OPTIONS:$custom_msan_options"
+  fi
+
+  custom_ubsan_options=$(parse_options.py $OPTIONS_FILE ubsan)
+  if [ ! -z $custom_ubsan_options ]; then
+    export UBSAN_OPTIONS="$UBSAN_OPTIONS:$custom_ubsan_options"
+  fi
+
+  CUSTOM_LIBFUZZER_OPTIONS=$(parse_options.py $OPTIONS_FILE libfuzzer)
+fi
+
 if [[ "$FUZZING_ENGINE" = afl ]]; then
   # https://chromium.googlesource.com/chromium/src/+/master/third_party/afl/src/docs/env_variables.txt
   export ASAN_OPTIONS="$ASAN_OPTIONS:abort_on_error=1:symbolize=0"
@@ -70,6 +92,7 @@
   export UBSAN_OPTIONS="$UBSAN_OPTIONS:symbolize=0"
   export AFL_I_DONT_CARE_ABOUT_MISSING_CRASHES=1
   export AFL_SKIP_CPUFREQ=1
+  export AFL_NO_AFFINITY=1
   # AFL expects at least 1 file in the input dir.
   echo input > ${CORPUS_DIR}/input
   CMD_LINE="$OUT/afl-fuzz $AFL_FUZZER_ARGS -i $CORPUS_DIR -o $FUZZER_OUT $(get_dictionary) $* $OUT/$FUZZER"
@@ -88,10 +111,8 @@
 else
   CMD_LINE="$OUT/$FUZZER $FUZZER_ARGS $* $CORPUS_DIR"
 
-  OPTIONS_FILE="${FUZZER}.options"
-  if [ -f $OPTIONS_FILE ]; then
-    OPTIONS_ARGS=$(grep "=" $OPTIONS_FILE | sed 's/\(\w*\)\W*=\W*\(.*\)/-\1=\2 /g' | tr '\n' ' ')
-    CMD_LINE="$CMD_LINE $OPTIONS_ARGS"
+  if [ ! -z $CUSTOM_LIBFUZZER_OPTIONS ]; then
+    CMD_LINE="$CMD_LINE $CUSTOM_LIBFUZZER_OPTIONS"
   fi
 
   if [[ ! "$CMD_LINE" =~ "-dict=" ]]; then
diff --git a/infra/base-images/base-runner/test_all b/infra/base-images/base-runner/test_all
index 3a38e62..d2ddea6 100755
--- a/infra/base-images/base-runner/test_all
+++ b/infra/base-images/base-runner/test_all
@@ -133,7 +133,7 @@
 
   # TODO: figure out how to not fail the "special" cases handled below. Those
   # are from "example" and "c-ares" projects and are too small targets to pass.
-  if [ "$(ls $OUT/do_stuff_fuzzer $OUT/ares_*_fuzzer $OUT/checksum_fuzzer $OUT/xmltest $OUT/fuzz_compression_sas_rle 2>/dev/null | wc -l)" -gt "0" ]; then
+  if [ "$(ls $OUT/do_stuff_fuzzer $OUT/ares_*_fuzzer $OUT/checksum_fuzzer $OUT/fuzz_dump $OUT/fuzz_keyring $OUT/xmltest $OUT/fuzz_compression_sas_rle 2>/dev/null | wc -l)" -gt "0" ]; then
     exit 0
   fi
 
diff --git a/infra/base-images/base-msan-builder/Dockerfile b/infra/base-images/base-sanitizer-libs-builder/Dockerfile
similarity index 90%
rename from infra/base-images/base-msan-builder/Dockerfile
rename to infra/base-images/base-sanitizer-libs-builder/Dockerfile
index 315730b..b1a17b9 100644
--- a/infra/base-images/base-msan-builder/Dockerfile
+++ b/infra/base-images/base-sanitizer-libs-builder/Dockerfile
@@ -18,11 +18,5 @@
 RUN sed -i -r 's/#\s*deb-src/deb-src/g' /etc/apt/sources.list
 RUN apt-get update && apt-get install -y python dpkg-dev patchelf python-apt zip
 
-# Take all libraries from lib/msan
-RUN cp -R /usr/msan/lib/* /usr/lib/
-
 COPY compiler_wrapper.py msan_build.py patch_build.py wrapper_utils.py /usr/local/bin/
 COPY packages /usr/local/bin/packages
-
-RUN mkdir /msan
-WORKDIR /msan
diff --git a/infra/base-images/base-msan-builder/compiler_wrapper.py b/infra/base-images/base-sanitizer-libs-builder/compiler_wrapper.py
similarity index 100%
rename from infra/base-images/base-msan-builder/compiler_wrapper.py
rename to infra/base-images/base-sanitizer-libs-builder/compiler_wrapper.py
diff --git a/infra/base-images/base-msan-builder/compiler_wrapper_test.py b/infra/base-images/base-sanitizer-libs-builder/compiler_wrapper_test.py
similarity index 100%
rename from infra/base-images/base-msan-builder/compiler_wrapper_test.py
rename to infra/base-images/base-sanitizer-libs-builder/compiler_wrapper_test.py
diff --git a/infra/base-images/base-msan-builder/msan_build.py b/infra/base-images/base-sanitizer-libs-builder/msan_build.py
similarity index 100%
rename from infra/base-images/base-msan-builder/msan_build.py
rename to infra/base-images/base-sanitizer-libs-builder/msan_build.py
diff --git a/infra/base-images/base-msan-builder/packages/__init__.py b/infra/base-images/base-sanitizer-libs-builder/packages/__init__.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/__init__.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/__init__.py
diff --git a/infra/base-images/base-msan-builder/packages/boost1_58.py b/infra/base-images/base-sanitizer-libs-builder/packages/boost1_58.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/boost1_58.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/boost1_58.py
diff --git a/infra/base-images/base-msan-builder/packages/gnutls28.py b/infra/base-images/base-sanitizer-libs-builder/packages/gnutls28.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/gnutls28.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/gnutls28.py
diff --git a/infra/base-images/base-msan-builder/packages/libgcrypt20.py b/infra/base-images/base-sanitizer-libs-builder/packages/libgcrypt20.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/libgcrypt20.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/libgcrypt20.py
diff --git a/infra/base-images/base-msan-builder/packages/mesa.py b/infra/base-images/base-sanitizer-libs-builder/packages/mesa.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/mesa.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/mesa.py
diff --git a/infra/base-images/base-msan-builder/packages/nettle.py b/infra/base-images/base-sanitizer-libs-builder/packages/nettle.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/nettle.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/nettle.py
diff --git a/infra/base-images/base-msan-builder/packages/openssl.py b/infra/base-images/base-sanitizer-libs-builder/packages/openssl.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/openssl.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/openssl.py
diff --git a/infra/base-images/base-msan-builder/packages/package.py b/infra/base-images/base-sanitizer-libs-builder/packages/package.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/package.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/package.py
diff --git a/infra/base-images/base-msan-builder/packages/pixman.py b/infra/base-images/base-sanitizer-libs-builder/packages/pixman.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/pixman.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/pixman.py
diff --git a/infra/base-images/base-msan-builder/packages/pixman_blacklist.txt b/infra/base-images/base-sanitizer-libs-builder/packages/pixman_blacklist.txt
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/pixman_blacklist.txt
rename to infra/base-images/base-sanitizer-libs-builder/packages/pixman_blacklist.txt
diff --git a/infra/base-images/base-msan-builder/packages/pulseaudio.py b/infra/base-images/base-sanitizer-libs-builder/packages/pulseaudio.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/pulseaudio.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/pulseaudio.py
diff --git a/infra/base-images/base-msan-builder/packages/pulseaudio_fix_android.patch b/infra/base-images/base-sanitizer-libs-builder/packages/pulseaudio_fix_android.patch
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/pulseaudio_fix_android.patch
rename to infra/base-images/base-sanitizer-libs-builder/packages/pulseaudio_fix_android.patch
diff --git a/infra/base-images/base-msan-builder/packages/sqlite3.py b/infra/base-images/base-sanitizer-libs-builder/packages/sqlite3.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/sqlite3.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/sqlite3.py
diff --git a/infra/base-images/base-msan-builder/packages/systemd.py b/infra/base-images/base-sanitizer-libs-builder/packages/systemd.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/systemd.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/systemd.py
diff --git a/infra/base-images/base-msan-builder/packages/tar.py b/infra/base-images/base-sanitizer-libs-builder/packages/tar.py
similarity index 100%
rename from infra/base-images/base-msan-builder/packages/tar.py
rename to infra/base-images/base-sanitizer-libs-builder/packages/tar.py
diff --git a/infra/base-images/base-msan-builder/patch_build.py b/infra/base-images/base-sanitizer-libs-builder/patch_build.py
similarity index 98%
rename from infra/base-images/base-msan-builder/patch_build.py
rename to infra/base-images/base-sanitizer-libs-builder/patch_build.py
index 04fc97c..cb1f4b1 100755
--- a/infra/base-images/base-msan-builder/patch_build.py
+++ b/infra/base-images/base-sanitizer-libs-builder/patch_build.py
@@ -120,6 +120,10 @@
   for root_dir, _, filenames in os.walk(output_directory):
     for filename in filenames:
       file_path = os.path.join(root_dir, filename)
+
+      if os.path.islink(file_path):
+        continue
+
       if not IsElf(file_path):
         continue
 
diff --git a/infra/base-images/base-msan-builder/wrapper_utils.py b/infra/base-images/base-sanitizer-libs-builder/wrapper_utils.py
similarity index 100%
rename from infra/base-images/base-msan-builder/wrapper_utils.py
rename to infra/base-images/base-sanitizer-libs-builder/wrapper_utils.py
diff --git a/infra/base-images/msan-builder/Dockerfile b/infra/base-images/msan-libs-builder/Dockerfile
similarity index 86%
rename from infra/base-images/msan-builder/Dockerfile
rename to infra/base-images/msan-libs-builder/Dockerfile
index 5f6091a..7780c1f 100644
--- a/infra/base-images/msan-builder/Dockerfile
+++ b/infra/base-images/msan-libs-builder/Dockerfile
@@ -14,7 +14,14 @@
 #
 ################################################################################
 
-FROM gcr.io/oss-fuzz-base/base-msan-builder
+FROM gcr.io/oss-fuzz-base/base-sanitizer-libs-builder
+
+# Take all libraries from lib/msan
+RUN cp -R /usr/msan/lib/* /usr/lib/
+
+RUN mkdir /msan
+WORKDIR /msan
+
 ENV PYTHONUNBUFFERED 1
 RUN msan_build.py --work-dir=$WORK \
     libarchive13 \
diff --git a/infra/bisector.py b/infra/bisector.py
index ff8366d..f6e135e 100644
--- a/infra/bisector.py
+++ b/infra/bisector.py
@@ -32,9 +32,6 @@
 
 import argparse
 import collections
-import datetime
-from distutils import spawn
-import json
 import logging
 import os
 import sys
@@ -81,7 +78,8 @@
                       help='The newest commit SHA to be bisected.',
                       required=True)
   parser.add_argument('--old_commit',
-                      help='The oldest commit SHA to be bisected.')
+                      help='The oldest commit SHA to be bisected.',
+                      required=True)
   parser.add_argument('--fuzz_target',
                       help='The name of the fuzzer to be built.',
                       required=True)
@@ -121,34 +119,6 @@
   return 0
 
 
-def _load_base_builder_repo():
-  """Get base-image digests."""
-  gcloud_path = spawn.find_executable('gcloud')
-  if not gcloud_path:
-    logging.warning('gcloud not found in PATH.')
-    return None
-
-  result, _, _ = utils.execute([
-      gcloud_path,
-      'container',
-      'images',
-      'list-tags',
-      'gcr.io/oss-fuzz-base/base-builder',
-      '--format=json',
-      '--sort-by=timestamp',
-  ],
-                               check_result=True)
-  result = json.loads(result)
-
-  repo = build_specified_commit.BaseBuilderRepo()
-  for image in result:
-    timestamp = datetime.datetime.fromisoformat(
-        image['timestamp']['datetime']).astimezone(datetime.timezone.utc)
-    repo.add_digest(timestamp, image['digest'])
-
-  return repo
-
-
 def _get_dedup_token(output):
   """Get dedup token."""
   for line in output.splitlines():
@@ -196,11 +166,12 @@
 
 # pylint: disable=too-many-locals
 # pylint: disable=too-many-arguments
+# pylint: disable=too-many-statements
 def _bisect(bisect_type, old_commit, new_commit, test_case_path, fuzz_target,
             build_data):
   """Perform the bisect."""
   # pylint: disable=too-many-branches
-  base_builder_repo = _load_base_builder_repo()
+  base_builder_repo = build_specified_commit.load_base_builder_repo()
 
   with tempfile.TemporaryDirectory() as tmp_dir:
     repo_url, repo_path = build_specified_commit.detect_main_repo(
@@ -243,8 +214,8 @@
       logging.warning('new_commit crashed but not shouldn\'t. '
                       'Continuing to see if stack changes.')
 
-    # Check if the error is persistent through the commit range
-    if old_commit:
+    range_valid = False
+    for _ in range(2):
       logging.info('Testing against old_commit (%s)', commit_list[old_idx])
       if not build_specified_commit.build_fuzzers_from_commit(
           commit_list[old_idx],
@@ -256,7 +227,23 @@
 
       if _check_for_crash(build_data.project_name, fuzz_target,
                           test_case_path) == expected_error:
-        raise BisectError('old_commit had same result as new_commit', repo_url)
+        logging.warning('old_commit %s had same result as new_commit %s',
+                        old_commit, new_commit)
+        # Try again on an slightly older commit.
+        old_commit = bisect_repo_manager.get_parent(old_commit, 64)
+        if not old_commit:
+          break
+
+        commit_list = bisect_repo_manager.get_commit_list(
+            new_commit, old_commit)
+        old_idx = len(commit_list) - 1
+        continue
+
+      range_valid = True
+      break
+
+    if not range_valid:
+      raise BisectError('old_commit had same result as new_commit', repo_url)
 
     while old_idx - new_idx > 1:
       curr_idx = (old_idx + new_idx) // 2
diff --git a/infra/build/functions/__init__.py b/infra/build/functions/__init__.py
new file mode 100644
index 0000000..9f76bf6
--- /dev/null
+++ b/infra/build/functions/__init__.py
@@ -0,0 +1,15 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
diff --git a/infra/build/functions/base_images.py b/infra/build/functions/base_images.py
new file mode 100644
index 0000000..8c9b2d8
--- /dev/null
+++ b/infra/build/functions/base_images.py
@@ -0,0 +1,141 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Cloud function to build base images on Google Cloud Builder."""
+
+import datetime
+import logging
+
+import google.auth
+from googleapiclient.discovery import build
+
+BASE_IMAGES = [
+    'base-image',
+    'base-clang',
+    'base-builder',
+    'base-runner',
+    'base-runner-debug',
+]
+BASE_PROJECT = 'oss-fuzz-base'
+TAG_PREFIX = f'gcr.io/{BASE_PROJECT}/'
+
+BASE_SANITIZER_LIBS_IMAGE = TAG_PREFIX + 'base-sanitizer-libs-builder'
+MSAN_LIBS_IMAGE = TAG_PREFIX + 'msan-libs-builder'
+
+
+def _get_base_image_steps(images, tag_prefix=TAG_PREFIX):
+  """Returns build steps for given images."""
+  steps = [{
+      'args': [
+          'clone',
+          'https://github.com/google/oss-fuzz.git',
+      ],
+      'name': 'gcr.io/cloud-builders/git',
+  }]
+
+  for base_image in images:
+    steps.append({
+        'args': [
+            'build',
+            '-t',
+            tag_prefix + base_image,
+            '.',
+        ],
+        'dir': 'oss-fuzz/infra/base-images/' + base_image,
+        'name': 'gcr.io/cloud-builders/docker',
+    })
+
+  return steps
+
+
+def get_logs_url(build_id, project_id='oss-fuzz-base'):
+  """Returns url that displays the build logs."""
+  url_format = ('https://console.developers.google.com/logs/viewer?'
+                'resource=build%2Fbuild_id%2F{0}&project={1}')
+  return url_format.format(build_id, project_id)
+
+
+# pylint: disable=no-member
+def run_build(steps, images):
+  """Execute the retrieved build steps in gcp."""
+  credentials, _ = google.auth.default()
+  build_body = {
+      'steps': steps,
+      'timeout': str(6 * 3600) + 's',
+      'options': {
+          'machineType': 'N1_HIGHCPU_32'
+      },
+      'images': images
+  }
+  cloudbuild = build('cloudbuild',
+                     'v1',
+                     credentials=credentials,
+                     cache_discovery=False)
+  build_info = cloudbuild.projects().builds().create(projectId=BASE_PROJECT,
+                                                     body=build_body).execute()
+  build_id = build_info['metadata']['build']['id']
+  logging.info('Build ID: %s', build_id)
+  logging.info('Logs: %s', get_logs_url(build_id, BASE_PROJECT))
+
+
+def base_builder(event, context):
+  """Cloud function to build base images."""
+  del event, context
+
+  tag_prefix = f'gcr.io/{BASE_PROJECT}/'
+  steps = _get_base_image_steps(BASE_IMAGES, tag_prefix)
+  images = [tag_prefix + base_image for base_image in BASE_IMAGES]
+
+  run_build(steps, images)
+
+
+def _get_msan_steps(image):
+  """Get build steps for msan-libs-builder."""
+  timestamp = datetime.datetime.utcnow().strftime('%Y%m%d%H%M')
+  upload_name = 'msan-libs-' + timestamp + '.zip'
+
+  steps = _get_base_image_steps([
+      'base-sanitizer-libs-builder',
+      'msan-libs-builder',
+  ])
+  steps.extend([{
+      'name': image,
+      'args': [
+          'bash',
+          '-c',
+          'cd /msan && zip -r /workspace/libs.zip .',
+      ],
+  }, {
+      'name':
+          'gcr.io/cloud-builders/gsutil',
+      'args': [
+          'cp',
+          '/workspace/libs.zip',
+          'gs://oss-fuzz-msan-libs/' + upload_name,
+      ],
+  }])
+  return steps
+
+
+def base_msan_builder(event, context):
+  """Cloud function to build base images."""
+  del event, context
+  steps = _get_msan_steps(MSAN_LIBS_IMAGE)
+  images = [
+      BASE_SANITIZER_LIBS_IMAGE,
+      MSAN_LIBS_IMAGE,
+  ]
+
+  run_build(steps, images)
diff --git a/infra/gcb/build_and_run_coverage.py b/infra/build/functions/build_and_run_coverage.py
similarity index 78%
rename from infra/gcb/build_and_run_coverage.py
rename to infra/build/functions/build_and_run_coverage.py
index 6357192..dcb2f1a 100644
--- a/infra/gcb/build_and_run_coverage.py
+++ b/infra/build/functions/build_and_run_coverage.py
@@ -1,15 +1,27 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
 #!/usr/bin/python2
 """Starts and runs coverage build on Google Cloud Builder.
-
 Usage: build_and_run_coverage.py <project_dir>
 """
-
 import datetime
 import json
+import logging
 import os
-import requests
 import sys
-import urlparse
 
 import build_lib
 import build_project
@@ -39,36 +51,29 @@
 LANGUAGES_WITH_COVERAGE_SUPPORT = ['c', 'c++']
 
 
-def skip_build(message):
-  """Exit with 0 code not to mark code coverage job as failed."""
-  sys.stderr.write('%s\n' % message)
-
-  # Since the script should print build_id, print '0' as a special value.
-  print('0')
-  exit(0)
-
-
 def usage():
+  """Exit with code 1 and display syntax to use this file."""
   sys.stderr.write("Usage: " + sys.argv[0] + " <project_dir>\n")
-  exit(1)
+  sys.exit(1)
 
 
-def get_build_steps(project_dir):
-  project_name = os.path.basename(project_dir)
-  project_yaml = build_project.load_project_yaml(project_dir)
+# pylint: disable=too-many-locals
+def get_build_steps(project_name, project_yaml_file, dockerfile_lines,
+                    image_project, base_images_project):
+  """Returns build steps for project."""
+  project_yaml = build_project.load_project_yaml(project_name,
+                                                 project_yaml_file,
+                                                 image_project)
   if project_yaml['disabled']:
-    skip_build('Project "%s" is disabled.' % project_name)
+    logging.info('Project "%s" is disabled.', project_name)
+    return []
 
-  build_script_path = os.path.join(project_dir, 'build.sh')
-  if os.path.exists(build_script_path):
-    with open(build_script_path) as fh:
-      if project_yaml['language'] not in LANGUAGES_WITH_COVERAGE_SUPPORT:
-        skip_build(('Project "{project_name}" is written in "{language}", '
-                    'coverage is not supported yet.').format(
-                        project_name=project_name,
-                        language=project_yaml['language']))
+  if project_yaml['language'] not in LANGUAGES_WITH_COVERAGE_SUPPORT:
+    logging.info(
+        'Project "%s" is written in "%s", coverage is not supported yet.',
+        project_name, project_yaml['language'])
+    return []
 
-  dockerfile_path = os.path.join(project_dir, 'Dockerfile')
   name = project_yaml['name']
   image = project_yaml['image']
   language = project_yaml['language']
@@ -81,7 +86,7 @@
   env.append('OUT=' + out)
   env.append('FUZZING_LANGUAGE=' + language)
 
-  workdir = build_project.workdir_from_dockerfile(dockerfile_path)
+  workdir = build_project.workdir_from_dockerfile(dockerfile_lines)
   if not workdir:
     workdir = '/src'
 
@@ -111,7 +116,8 @@
 
   download_corpora_steps = build_lib.download_corpora_steps(project_name)
   if not download_corpora_steps:
-    skip_build("Skipping code coverage build for %s.\n" % project_name)
+    logging.info('Skipping code coverage build for %s.', project_name)
+    return []
 
   build_steps.extend(download_corpora_steps)
 
@@ -132,7 +138,7 @@
     coverage_env.append('FULL_SUMMARY_PER_TARGET=1')
 
   build_steps.append({
-      'name': 'gcr.io/oss-fuzz-base/base-runner',
+      'name': 'gcr.io/{0}/base-runner'.format(base_images_project),
       'env': coverage_env,
       'args': [
           'bash', '-c',
@@ -191,7 +197,7 @@
   # Upload the fuzzer logs. Delete the old ones just in case
   upload_fuzzer_logs_url = UPLOAD_URL_FORMAT.format(project=project_name,
                                                     type='logs',
-                                                    date=report_date),
+                                                    date=report_date)
   build_steps.append(build_lib.gsutil_rm_rf_step(upload_fuzzer_logs_url))
   build_steps.append({
       'name':
@@ -244,12 +250,24 @@
 
 
 def main():
+  """Build and run coverage for projects."""
   if len(sys.argv) != 2:
     usage()
 
+  image_project = 'oss-fuzz'
+  base_images_project = 'oss-fuzz-base'
   project_dir = sys.argv[1].rstrip(os.path.sep)
   project_name = os.path.basename(project_dir)
-  steps = get_build_steps(project_dir)
+  dockerfile_path = os.path.join(project_dir, 'Dockerfile')
+  project_yaml_path = os.path.join(project_dir, 'project.yaml')
+
+  with open(dockerfile_path) as docker_file:
+    dockerfile_lines = docker_file.readlines()
+
+  with open(project_yaml_path) as project_yaml_file:
+    steps = get_build_steps(project_name, project_yaml_file, dockerfile_lines,
+                            image_project, base_images_project)
+
   build_project.run_build(steps, project_name, COVERAGE_BUILD_TAG)
 
 
diff --git a/infra/gcb/build_lib.py b/infra/build/functions/build_lib.py
similarity index 74%
rename from infra/gcb/build_lib.py
rename to infra/build/functions/build_lib.py
index 0fe22bb..007579e 100644
--- a/infra/gcb/build_lib.py
+++ b/infra/build/functions/build_lib.py
@@ -1,13 +1,30 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
 """Utility module for Google Cloud Build scripts."""
 import base64
 import collections
 import os
-import requests
+import six.moves.urllib.parse as urlparse
 import sys
 import time
-import urllib
-import urlparse
 
+import requests
+
+import google.auth
+import googleapiclient.discovery
 from oauth2client.service_account import ServiceAccountCredentials
 
 BUILD_TIMEOUT = 12 * 60 * 60
@@ -55,16 +72,19 @@
 
 
 def get_targets_list_filename(sanitizer):
+  """Returns target list filename."""
   return TARGETS_LIST_BASENAME + '.' + sanitizer
 
 
 def get_targets_list_url(bucket, project, sanitizer):
+  """Returns target list url."""
   filename = get_targets_list_filename(sanitizer)
   url = GCS_UPLOAD_URL_FORMAT.format(bucket, project, filename)
   return url
 
 
 def _get_targets_list(project_name):
+  """Returns target list."""
   # libFuzzer ASan is the default configuration, get list of targets from it.
   url = get_targets_list_url(ENGINE_INFO['libfuzzer'].upload_bucket,
                              project_name, 'address')
@@ -80,22 +100,41 @@
   return response.text.split()
 
 
+# pylint: disable=no-member
 def get_signed_url(path, method='PUT', content_type=''):
+  """Returns signed url."""
   timestamp = int(time.time() + BUILD_TIMEOUT)
   blob = '{0}\n\n{1}\n{2}\n{3}'.format(method, content_type, timestamp, path)
 
-  creds = ServiceAccountCredentials.from_json_keyfile_name(
-      os.environ['GOOGLE_APPLICATION_CREDENTIALS'])
-  client_id = creds.service_account_email
-  signature = base64.b64encode(creds.sign_blob(blob)[1])
+  service_account_path = os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')
+  if service_account_path:
+    creds = ServiceAccountCredentials.from_json_keyfile_name(
+        os.environ['GOOGLE_APPLICATION_CREDENTIALS'])
+    client_id = creds.service_account_email
+    signature = base64.b64encode(creds.sign_blob(blob)[1])
+  else:
+    credentials, project = google.auth.default()
+    iam = googleapiclient.discovery.build('iamcredentials',
+                                          'v1',
+                                          credentials=credentials,
+                                          cache_discovery=False)
+    client_id = project + '@appspot.gserviceaccount.com'
+    service_account = 'projects/-/serviceAccounts/{0}'.format(client_id)
+    response = iam.projects().serviceAccounts().signBlob(
+        name=service_account,
+        body={
+            'delegates': [],
+            'payload': base64.b64encode(blob.encode('utf-8')).decode('utf-8'),
+        }).execute()
+    signature = response['signedBlob']
+
   values = {
       'GoogleAccessId': client_id,
       'Expires': timestamp,
       'Signature': signature,
   }
-
   return ('https://storage.googleapis.com{0}?'.format(path) +
-          urllib.urlencode(values))
+          urlparse.urlencode(values))
 
 
 def download_corpora_steps(project_name):
diff --git a/infra/gcb/build_project.py b/infra/build/functions/build_project.py
similarity index 71%
rename from infra/gcb/build_project.py
rename to infra/build/functions/build_project.py
index e9d0480..84cd7d5 100644
--- a/infra/gcb/build_project.py
+++ b/infra/build/functions/build_project.py
@@ -1,3 +1,18 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
 #!/usr/bin/python2
 """Starts project build on Google Cloud Builder.
 
@@ -8,9 +23,12 @@
 
 import datetime
 import json
+import logging
 import os
 import re
 import sys
+
+import six
 import yaml
 
 from oauth2client.client import GoogleCredentials
@@ -41,30 +59,31 @@
 LATEST_VERSION_FILENAME = 'latest.version'
 LATEST_VERSION_CONTENT_TYPE = 'text/plain'
 
+QUEUE_TTL_SECONDS = 60 * 60 * 24  # 24 hours.
+
 
 def usage():
+  """Exit with code 1 and display syntax to use this file."""
   sys.stderr.write('Usage: ' + sys.argv[0] + ' <project_dir>\n')
-  exit(1)
+  sys.exit(1)
 
 
-def load_project_yaml(project_dir):
-  project_name = os.path.basename(project_dir)
-  project_yaml_path = os.path.join(project_dir, 'project.yaml')
-  with open(project_yaml_path) as f:
-    project_yaml = yaml.safe_load(f)
-    project_yaml.setdefault('disabled', False)
-    project_yaml.setdefault('name', project_name)
-    project_yaml.setdefault('image', 'gcr.io/oss-fuzz/' + project_name)
-    project_yaml.setdefault('architectures', DEFAULT_ARCHITECTURES)
-    project_yaml.setdefault('sanitizers', DEFAULT_SANITIZERS)
-    project_yaml.setdefault('fuzzing_engines', DEFAULT_ENGINES)
-    project_yaml.setdefault('run_tests', True)
-    project_yaml.setdefault('coverage_extra_args', '')
-    project_yaml.setdefault('labels', {})
-    return project_yaml
+def set_yaml_defaults(project_name, project_yaml, image_project):
+  """Set project.yaml's default parameters."""
+  project_yaml.setdefault('disabled', False)
+  project_yaml.setdefault('name', project_name)
+  project_yaml.setdefault('image',
+                          'gcr.io/{0}/{1}'.format(image_project, project_name))
+  project_yaml.setdefault('architectures', DEFAULT_ARCHITECTURES)
+  project_yaml.setdefault('sanitizers', DEFAULT_SANITIZERS)
+  project_yaml.setdefault('fuzzing_engines', DEFAULT_ENGINES)
+  project_yaml.setdefault('run_tests', True)
+  project_yaml.setdefault('coverage_extra_args', '')
+  project_yaml.setdefault('labels', {})
 
 
 def is_supported_configuration(fuzzing_engine, sanitizer, architecture):
+  """Check if the given configuration is supported."""
   fuzzing_engine_info = build_lib.ENGINE_INFO[fuzzing_engine]
   if architecture == 'i386' and sanitizer != 'address':
     return False
@@ -73,29 +92,26 @@
 
 
 def get_sanitizers(project_yaml):
+  """Retrieve sanitizers from project.yaml."""
   sanitizers = project_yaml['sanitizers']
   assert isinstance(sanitizers, list)
 
   processed_sanitizers = []
   for sanitizer in sanitizers:
-    if isinstance(sanitizer, basestring):
+    if isinstance(sanitizer, six.string_types):
       processed_sanitizers.append(sanitizer)
     elif isinstance(sanitizer, dict):
-      for key in sanitizer.iterkeys():
+      for key in sanitizer.keys():
         processed_sanitizers.append(key)
 
   return processed_sanitizers
 
 
-def workdir_from_dockerfile(dockerfile):
+def workdir_from_dockerfile(dockerfile_lines):
   """Parse WORKDIR from the Dockerfile."""
-  WORKDIR_REGEX = re.compile(r'\s*WORKDIR\s*([^\s]+)')
-
-  with open(dockerfile) as f:
-    lines = f.readlines()
-
-  for line in lines:
-    match = re.match(WORKDIR_REGEX, line)
+  workdir_regex = re.compile(r'\s*WORKDIR\s*([^\s]+)')
+  for line in dockerfile_lines:
+    match = re.match(workdir_regex, line)
     if match:
       # We need to escape '$' since they're used for subsitutions in Container
       # Builer builds.
@@ -104,21 +120,34 @@
   return None
 
 
-def get_build_steps(project_dir):
-  project_yaml = load_project_yaml(project_dir)
-  dockerfile_path = os.path.join(project_dir, 'Dockerfile')
+def load_project_yaml(project_name, project_yaml_file, image_project):
+  """Loads project yaml and sets default values."""
+  project_yaml = yaml.safe_load(project_yaml_file)
+  set_yaml_defaults(project_name, project_yaml, image_project)
+  return project_yaml
+
+
+# pylint: disable=too-many-locals, too-many-statements, too-many-branches
+def get_build_steps(project_name, project_yaml_file, dockerfile_lines,
+                    image_project, base_images_project):
+  """Returns build steps for project."""
+  project_yaml = load_project_yaml(project_name, project_yaml_file,
+                                   image_project)
+
+  if project_yaml['disabled']:
+    logging.info('Project "%s" is disabled.', project_name)
+    return []
+
   name = project_yaml['name']
   image = project_yaml['image']
   language = project_yaml['language']
   run_tests = project_yaml['run_tests']
-
-  ts = datetime.datetime.now().strftime('%Y%m%d%H%M')
+  time_stamp = datetime.datetime.now().strftime('%Y%m%d%H%M')
 
   build_steps = build_lib.project_image_steps(name, image, language)
-
   # Copy over MSan instrumented libraries.
   build_steps.append({
-      'name': 'gcr.io/oss-fuzz-base/msan-builder',
+      'name': 'gcr.io/{0}/msan-libs-builder'.format(base_images_project),
       'args': [
           'bash',
           '-c',
@@ -136,7 +165,7 @@
         env = CONFIGURATIONS['engine-' + fuzzing_engine][:]
         env.extend(CONFIGURATIONS['sanitizer-' + sanitizer])
         out = '/workspace/out/' + sanitizer
-        stamped_name = '-'.join([name, sanitizer, ts])
+        stamped_name = '-'.join([name, sanitizer, time_stamp])
         latest_version_file = '-'.join(
             [name, sanitizer, LATEST_VERSION_FILENAME])
         zip_file = stamped_name + '.zip'
@@ -144,6 +173,7 @@
         bucket = build_lib.ENGINE_INFO[fuzzing_engine].upload_bucket
         if architecture != 'x86_64':
           bucket += '-' + architecture
+
         upload_url = build_lib.get_signed_url(
             build_lib.GCS_UPLOAD_URL_FORMAT.format(bucket, name, zip_file))
         srcmap_url = build_lib.get_signed_url(
@@ -163,7 +193,7 @@
         env.append('ARCHITECTURE=' + architecture)
         env.append('FUZZING_LANGUAGE=' + language)
 
-        workdir = workdir_from_dockerfile(dockerfile_path)
+        workdir = workdir_from_dockerfile(dockerfile_lines)
         if not workdir:
           workdir = '/src'
 
@@ -202,7 +232,7 @@
           # Patch dynamic libraries to use instrumented ones.
           build_steps.append({
               'name':
-                  'gcr.io/oss-fuzz-base/msan-builder',
+                  'gcr.io/{0}/msan-libs-builder'.format(base_images_project),
               'args': [
                   'bash',
                   '-c',
@@ -231,7 +261,7 @@
               # test binaries
               {
                   'name':
-                      'gcr.io/oss-fuzz-base/base-runner',
+                      'gcr.io/{0}/base-runner'.format(base_images_project),
                   'env':
                       env,
                   'args': [
@@ -255,7 +285,8 @@
           })
 
         if sanitizer == 'dataflow' and fuzzing_engine == 'dataflow':
-          dataflow_steps = dataflow_post_build_steps(name, env)
+          dataflow_steps = dataflow_post_build_steps(name, env,
+                                                     base_images_project)
           if dataflow_steps:
             build_steps.extend(dataflow_steps)
           else:
@@ -265,7 +296,7 @@
             # generate targets list
             {
                 'name':
-                    'gcr.io/oss-fuzz-base/base-runner',
+                    'gcr.io/{0}/base-runner'.format(base_images_project),
                 'env':
                     env,
                 'args': [
@@ -287,7 +318,7 @@
             },
             # upload srcmap
             {
-                'name': 'gcr.io/oss-fuzz-base/uploader',
+                'name': 'gcr.io/{0}/uploader'.format(base_images_project),
                 'args': [
                     '/workspace/srcmap.json',
                     srcmap_url,
@@ -295,7 +326,7 @@
             },
             # upload binaries
             {
-                'name': 'gcr.io/oss-fuzz-base/uploader',
+                'name': 'gcr.io/{0}/uploader'.format(base_images_project),
                 'args': [
                     os.path.join(out, zip_file),
                     upload_url,
@@ -304,7 +335,7 @@
             # upload targets list
             {
                 'name':
-                    'gcr.io/oss-fuzz-base/uploader',
+                    'gcr.io/{0}/uploader'.format(base_images_project),
                 'args': [
                     '/workspace/{0}'.format(targets_list_filename),
                     targets_list_url,
@@ -327,14 +358,15 @@
   return build_steps
 
 
-def dataflow_post_build_steps(project_name, env):
+def dataflow_post_build_steps(project_name, env, base_images_project):
+  """Appends dataflow post build steps."""
   steps = build_lib.download_corpora_steps(project_name)
   if not steps:
     return None
 
   steps.append({
       'name':
-          'gcr.io/oss-fuzz-base/base-runner',
+          'gcr.io/{0}/base-runner'.format(base_images_project),
       'env':
           env + [
               'COLLECT_DFT_TIMEOUT=2h',
@@ -355,13 +387,16 @@
   return steps
 
 
-def get_logs_url(build_id):
-  URL_FORMAT = ('https://console.developers.google.com/logs/viewer?'
-                'resource=build%2Fbuild_id%2F{0}&project=oss-fuzz')
-  return URL_FORMAT.format(build_id)
+def get_logs_url(build_id, image_project='oss-fuzz'):
+  """Returns url where logs are displayed for the build."""
+  url_format = ('https://console.developers.google.com/logs/viewer?'
+                'resource=build%2Fbuild_id%2F{0}&project={1}')
+  return url_format.format(build_id, image_project)
 
 
+# pylint: disable=no-member
 def run_build(build_steps, project_name, tag):
+  """Run the build for given steps on cloud build."""
   options = {}
   if 'GCB_OPTIONS' in os.environ:
     options = yaml.safe_load(os.environ['GCB_OPTIONS'])
@@ -372,10 +407,14 @@
       'options': options,
       'logsBucket': GCB_LOGS_BUCKET,
       'tags': [project_name + '-' + tag,],
+      'queueTtl': str(QUEUE_TTL_SECONDS) + 's',
   }
 
   credentials = GoogleCredentials.get_application_default()
-  cloudbuild = build('cloudbuild', 'v1', credentials=credentials)
+  cloudbuild = build('cloudbuild',
+                     'v1',
+                     credentials=credentials,
+                     cache_discovery=False)
   build_info = cloudbuild.projects().builds().create(projectId='oss-fuzz',
                                                      body=build_body).execute()
   build_id = build_info['metadata']['build']['id']
@@ -385,13 +424,24 @@
 
 
 def main():
+  """Build and run projects."""
   if len(sys.argv) != 2:
     usage()
 
+  image_project = 'oss-fuzz'
+  base_images_project = 'oss-fuzz-base'
   project_dir = sys.argv[1].rstrip(os.path.sep)
-  steps = get_build_steps(project_dir)
-
+  dockerfile_path = os.path.join(project_dir, 'Dockerfile')
+  project_yaml_path = os.path.join(project_dir, 'project.yaml')
   project_name = os.path.basename(project_dir)
+
+  with open(dockerfile_path) as dockerfile:
+    dockerfile_lines = dockerfile.readlines()
+
+  with open(project_yaml_path) as project_yaml_file:
+    steps = get_build_steps(project_name, project_yaml_file, dockerfile_lines,
+                            image_project, base_images_project)
+
   run_build(steps, project_name, FUZZING_BUILD_TAG)
 
 
diff --git a/infra/build/functions/datastore_entities.py b/infra/build/functions/datastore_entities.py
new file mode 100644
index 0000000..550ab82
--- /dev/null
+++ b/infra/build/functions/datastore_entities.py
@@ -0,0 +1,49 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Cloud datastore entity classes."""
+from google.cloud import ndb
+
+
+# pylint: disable=too-few-public-methods
+class Project(ndb.Model):
+  """Represents an integrated OSS-Fuzz project."""
+  name = ndb.StringProperty()
+  schedule = ndb.StringProperty()
+  project_yaml_contents = ndb.TextProperty()
+  dockerfile_contents = ndb.TextProperty()
+
+
+# pylint: disable=too-few-public-methods
+class GithubCreds(ndb.Model):
+  """Represents GitHub credentials."""
+  client_id = ndb.StringProperty()
+  client_secret = ndb.StringProperty()
+
+
+# pylint: disable=too-few-public-methods
+class BuildsHistory(ndb.Model):
+  """Container for build history of projects."""
+  build_tag = ndb.StringProperty()
+  project = ndb.StringProperty()
+  build_ids = ndb.StringProperty(repeated=True)
+
+
+class LastSuccessfulBuild(ndb.Model):
+  """Container for storing last successful build of project."""
+  build_tag = ndb.StringProperty()
+  project = ndb.StringProperty()
+  build_id = ndb.StringProperty()
+  finish_time = ndb.StringProperty()
diff --git a/infra/build/functions/deploy.sh b/infra/build/functions/deploy.sh
new file mode 100755
index 0000000..4af7f17
--- /dev/null
+++ b/infra/build/functions/deploy.sh
@@ -0,0 +1,156 @@
+#!/bin/bash -ex
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+BASE_IMAGE_JOB_TOPIC=schedule-base-image-build
+BASE_IMAGE_SCHEDULER_JOB=base-image-scheduler
+BASE_IMAGE_SCHEDULE="0 3 * * *"
+BASE_IMAGE_MESSAGE="Start base image build"
+
+BUILD_JOB_TOPIC=request-build
+
+COVERAGE_BUILD_JOB_TOPIC=request-coverage-build
+
+SYNC_JOB_TOPIC=schedule-project-sync
+SYNC_SCHEDULER_JOB=sync-scheduler
+SYNC_JOB_SCHEDULE="*/30 * * * *"
+SYNC_MESSAGE="Start Sync"
+
+UPDATE_BUILD_JOB_TOPIC=builds-status
+UPDATE_BUILD_SCHEDULER_JOB=builds-status-scheduler
+UPDATE_BUILD_JOB_SCHEDULE="*/30 * * * *"
+
+
+function deploy_pubsub_topic {
+	topic=$1
+	project=$2
+
+	if ! gcloud pubsub topics describe $topic --project $project ;
+		then
+			gcloud pubsub topics create $topic \
+			--project $project
+	fi
+}
+
+function deploy_scheduler {
+	scheduler_name=$1
+	schedule="$2"
+	topic=$3
+	message="$4"
+	project=$5
+
+	if gcloud scheduler jobs describe $scheduler_name --project $project ;
+		then
+			gcloud scheduler jobs update pubsub $scheduler_name \
+			--project $project \
+			--schedule "$schedule" \
+			--topic $topic \
+			--message-body "$message"
+		else
+			gcloud scheduler jobs create pubsub $scheduler_name \
+			--project $project \
+			--schedule "$schedule" \
+			--topic $topic \
+			--message-body "$message"
+	fi
+}
+
+function deploy_cloud_function {
+	name=$1
+	entry_point=$2
+	topic=$3
+	project=$4
+
+	gcloud functions deploy $name \
+	--entry-point $entry_point \
+	--trigger-topic $topic \
+	--runtime python37 \
+	--project $project \
+	--timeout 540 \
+  --max-instances 1
+}
+
+if [ $# == 1 ]; then
+	PROJECT_ID=$1
+else
+	echo -e "\n Usage ./deploy.sh <project-name>"; exit;
+fi
+
+deploy_pubsub_topic $BUILD_JOB_TOPIC $PROJECT_ID
+deploy_pubsub_topic $SYNC_JOB_TOPIC $PROJECT_ID
+deploy_pubsub_topic $BASE_IMAGE_JOB_TOPIC $PROJECT_ID
+deploy_pubsub_topic $COVERAGE_BUILD_JOB_TOPIC $PROJECT_ID
+deploy_pubsub_topic $UPDATE_BUILD_JOB_TOPIC $PROJECT_ID
+
+deploy_scheduler $SYNC_SCHEDULER_JOB \
+				 "$SYNC_JOB_SCHEDULE" \
+				 $SYNC_JOB_TOPIC \
+				 "$SYNC_MESSAGE" \
+				  $PROJECT_ID
+
+deploy_scheduler $BASE_IMAGE_SCHEDULER_JOB \
+				 "$BASE_IMAGE_SCHEDULE" \
+				  $BASE_IMAGE_JOB_TOPIC \
+				  "$BASE_IMAGE_MESSAGE" \
+				  $PROJECT_ID
+
+deploy_scheduler $UPDATE_BUILD_SCHEDULER_JOB-fuzzing \
+				 "$UPDATE_BUILD_JOB_SCHEDULE" \
+				 $UPDATE_BUILD_JOB_TOPIC \
+				 "fuzzing" \
+				 $PROJECT_ID
+deploy_scheduler $UPDATE_BUILD_SCHEDULER_JOB-coverage \
+				 "$UPDATE_BUILD_JOB_SCHEDULE" \
+				 $UPDATE_BUILD_JOB_TOPIC \
+				 "coverage" \
+				 $PROJECT_ID
+deploy_scheduler $UPDATE_BUILD_SCHEDULER_JOB-badges \
+				 "$UPDATE_BUILD_JOB_SCHEDULE" \
+				 $UPDATE_BUILD_JOB_TOPIC \
+				 "badges" \
+				 $PROJECT_ID
+
+deploy_cloud_function sync \
+					  sync \
+					  $SYNC_JOB_TOPIC \
+					  $PROJECT_ID
+
+deploy_cloud_function base-image-build \
+					  build_base_images \
+					  $BASE_IMAGE_JOB_TOPIC \
+					  $PROJECT_ID
+
+deploy_cloud_function base-msan-build \
+					  build_msan \
+					  $BASE_IMAGE_JOB_TOPIC \
+					  $PROJECT_ID
+
+deploy_cloud_function request-build \
+					  build_project \
+					  $BUILD_JOB_TOPIC \
+					  $PROJECT_ID
+
+deploy_cloud_function request-coverage-build \
+					  coverage_build \
+					  $COVERAGE_BUILD_JOB_TOPIC \
+					  $PROJECT_ID
+
+deploy_cloud_function update-builds \
+					  builds_status \
+					  $UPDATE_BUILD_JOB_TOPIC \
+					  $PROJECT_ID
+
+gcloud datastore indexes create index.yaml --project $PROJECT_ID
diff --git a/infra/build/functions/expected_build_steps.json b/infra/build/functions/expected_build_steps.json
new file mode 100644
index 0000000..f5b9856
--- /dev/null
+++ b/infra/build/functions/expected_build_steps.json
@@ -0,0 +1,330 @@
+[
+  {
+    "args": [
+      "clone",
+      "https://github.com/google/oss-fuzz.git"
+    ],
+    "name": "gcr.io/cloud-builders/git"
+  },
+  {
+    "name": "gcr.io/cloud-builders/docker",
+    "args": [
+      "build",
+      "-t",
+      "gcr.io/oss-fuzz/test-project",
+      "."
+    ],
+    "dir": "oss-fuzz/projects/test-project"
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "args": [
+      "bash",
+      "-c",
+      "srcmap > /workspace/srcmap.json && cat /workspace/srcmap.json"
+    ],
+    "env": [
+      "OSSFUZZ_REVISION=$REVISION_ID",
+      "FUZZING_LANGUAGE=c++"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/msan-libs-builder",
+    "args": [
+      "bash",
+      "-c",
+      "cp -r /msan /workspace"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "env": [
+      "FUZZING_ENGINE=libfuzzer",
+      "SANITIZER=address",
+      "OUT=/workspace/out/address",
+      "MSAN_LIBS_PATH=/workspace/msan",
+      "ARCHITECTURE=x86_64",
+      "FUZZING_LANGUAGE=c++"
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "rm -r /out && cd /src && cd /src && mkdir -p /workspace/out/address && compile || (echo \"********************************************************************************\nFailed to build.\nTo reproduce, run:\npython infra/helper.py build_image test-project\npython infra/helper.py build_fuzzers --sanitizer address --engine libfuzzer --architecture x86_64 test-project\n********************************************************************************\" && false)"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/base-runner",
+    "env": [
+      "FUZZING_ENGINE=libfuzzer",
+      "SANITIZER=address",
+      "OUT=/workspace/out/address",
+      "MSAN_LIBS_PATH=/workspace/msan",
+      "ARCHITECTURE=x86_64",
+      "FUZZING_LANGUAGE=c++"
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "test_all || (echo \"********************************************************************************\nBuild checks failed.\nTo reproduce, run:\npython infra/helper.py build_image test-project\npython infra/helper.py build_fuzzers --sanitizer address --engine libfuzzer --architecture x86_64 test-project\npython infra/helper.py check_build --sanitizer address --engine libfuzzer --architecture x86_64 test-project\n********************************************************************************\" && false)"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/base-runner",
+    "env": [
+      "FUZZING_ENGINE=libfuzzer",
+      "SANITIZER=address",
+      "OUT=/workspace/out/address",
+      "MSAN_LIBS_PATH=/workspace/msan",
+      "ARCHITECTURE=x86_64",
+      "FUZZING_LANGUAGE=c++"
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "targets_list > /workspace/targets.list.address"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "args": [
+      "bash",
+      "-c",
+      "cd /workspace/out/address && zip -r test-project-address-202001010000.zip *"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/uploader",
+    "args": [
+      "/workspace/srcmap.json",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/uploader",
+    "args": [
+      "/workspace/out/address/test-project-address-202001010000.zip",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/uploader",
+    "args": [
+      "/workspace/targets.list.address",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/curl",
+    "args": [
+      "-H",
+      "Content-Type: text/plain",
+      "-X",
+      "PUT",
+      "-d",
+      "test-project-address-202001010000.zip",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "args": [
+      "bash",
+      "-c",
+      "rm -r /workspace/out/address"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "env": [
+      "FUZZING_ENGINE=afl",
+      "SANITIZER=address",
+      "OUT=/workspace/out/address",
+      "MSAN_LIBS_PATH=/workspace/msan",
+      "ARCHITECTURE=x86_64",
+      "FUZZING_LANGUAGE=c++"
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "rm -r /out && cd /src && cd /src && mkdir -p /workspace/out/address && compile || (echo \"********************************************************************************\nFailed to build.\nTo reproduce, run:\npython infra/helper.py build_image test-project\npython infra/helper.py build_fuzzers --sanitizer address --engine afl --architecture x86_64 test-project\n********************************************************************************\" && false)"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/base-runner",
+    "env": [
+      "FUZZING_ENGINE=afl",
+      "SANITIZER=address",
+      "OUT=/workspace/out/address",
+      "MSAN_LIBS_PATH=/workspace/msan",
+      "ARCHITECTURE=x86_64",
+      "FUZZING_LANGUAGE=c++"
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "test_all || (echo \"********************************************************************************\nBuild checks failed.\nTo reproduce, run:\npython infra/helper.py build_image test-project\npython infra/helper.py build_fuzzers --sanitizer address --engine afl --architecture x86_64 test-project\npython infra/helper.py check_build --sanitizer address --engine afl --architecture x86_64 test-project\n********************************************************************************\" && false)"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/base-runner",
+    "env": [
+      "FUZZING_ENGINE=afl",
+      "SANITIZER=address",
+      "OUT=/workspace/out/address",
+      "MSAN_LIBS_PATH=/workspace/msan",
+      "ARCHITECTURE=x86_64",
+      "FUZZING_LANGUAGE=c++"
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "targets_list > /workspace/targets.list.address"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "args": [
+      "bash",
+      "-c",
+      "cd /workspace/out/address && zip -r test-project-address-202001010000.zip *"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/uploader",
+    "args": [
+      "/workspace/srcmap.json",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/uploader",
+    "args": [
+      "/workspace/out/address/test-project-address-202001010000.zip",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/uploader",
+    "args": [
+      "/workspace/targets.list.address",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/curl",
+    "args": [
+      "-H",
+      "Content-Type: text/plain",
+      "-X",
+      "PUT",
+      "-d",
+      "test-project-address-202001010000.zip",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "args": [
+      "bash",
+      "-c",
+      "rm -r /workspace/out/address"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "env": [
+      "FUZZING_ENGINE=honggfuzz",
+      "SANITIZER=address",
+      "OUT=/workspace/out/address",
+      "MSAN_LIBS_PATH=/workspace/msan",
+      "ARCHITECTURE=x86_64",
+      "FUZZING_LANGUAGE=c++"
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "rm -r /out && cd /src && cd /src && mkdir -p /workspace/out/address && compile || (echo \"********************************************************************************\nFailed to build.\nTo reproduce, run:\npython infra/helper.py build_image test-project\npython infra/helper.py build_fuzzers --sanitizer address --engine honggfuzz --architecture x86_64 test-project\n********************************************************************************\" && false)"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/base-runner",
+    "env": [
+      "FUZZING_ENGINE=honggfuzz",
+      "SANITIZER=address",
+      "OUT=/workspace/out/address",
+      "MSAN_LIBS_PATH=/workspace/msan",
+      "ARCHITECTURE=x86_64",
+      "FUZZING_LANGUAGE=c++"
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "test_all || (echo \"********************************************************************************\nBuild checks failed.\nTo reproduce, run:\npython infra/helper.py build_image test-project\npython infra/helper.py build_fuzzers --sanitizer address --engine honggfuzz --architecture x86_64 test-project\npython infra/helper.py check_build --sanitizer address --engine honggfuzz --architecture x86_64 test-project\n********************************************************************************\" && false)"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/base-runner",
+    "env": [
+      "FUZZING_ENGINE=honggfuzz",
+      "SANITIZER=address",
+      "OUT=/workspace/out/address",
+      "MSAN_LIBS_PATH=/workspace/msan",
+      "ARCHITECTURE=x86_64",
+      "FUZZING_LANGUAGE=c++"
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "targets_list > /workspace/targets.list.address"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "args": [
+      "bash",
+      "-c",
+      "cd /workspace/out/address && zip -r test-project-address-202001010000.zip *"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/uploader",
+    "args": [
+      "/workspace/srcmap.json",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/uploader",
+    "args": [
+      "/workspace/out/address/test-project-address-202001010000.zip",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/uploader",
+    "args": [
+      "/workspace/targets.list.address",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/curl",
+    "args": [
+      "-H",
+      "Content-Type: text/plain",
+      "-X",
+      "PUT",
+      "-d",
+      "test-project-address-202001010000.zip",
+      "test_url"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "args": [
+      "bash",
+      "-c",
+      "rm -r /workspace/out/address"
+    ]
+  }
+]
diff --git a/infra/build/functions/expected_coverage_build_steps.json b/infra/build/functions/expected_coverage_build_steps.json
new file mode 100644
index 0000000..19b1d5b
--- /dev/null
+++ b/infra/build/functions/expected_coverage_build_steps.json
@@ -0,0 +1,144 @@
+[
+  {
+    "args": [
+      "clone",
+      "https://github.com/google/oss-fuzz.git"
+    ],
+    "name": "gcr.io/cloud-builders/git"
+  },
+  {
+    "name": "gcr.io/cloud-builders/docker",
+    "args": [
+      "build",
+      "-t",
+      "gcr.io/oss-fuzz/test-project",
+      "."
+    ],
+    "dir": "oss-fuzz/projects/test-project"
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "args": [
+      "bash",
+      "-c",
+      "srcmap > /workspace/srcmap.json && cat /workspace/srcmap.json"
+    ],
+    "env": [
+      "OSSFUZZ_REVISION=$REVISION_ID",
+      "FUZZING_LANGUAGE=c++"
+    ]
+  },
+  {
+    "name": "gcr.io/oss-fuzz/test-project",
+    "env": [
+      "FUZZING_ENGINE=libfuzzer",
+      "SANITIZER=coverage",
+      "OUT=/workspace/out/coverage",
+      "FUZZING_LANGUAGE=c++"
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "rm -r /out && cd /src && cd /src && mkdir -p /workspace/out/coverage && compile || (echo \"********************************************************************************\nCoverage build failed.\nTo reproduce, run:\npython infra/helper.py build_image test-project\npython infra/helper.py build_fuzzers --sanitizer coverage test-project\n********************************************************************************\" && false)"
+    ]
+  },
+  {
+    "url": "test_download"
+  },
+  {
+    "name": "gcr.io/oss-fuzz-base/base-runner",
+    "env": [
+      "FUZZING_ENGINE=libfuzzer",
+      "SANITIZER=coverage",
+      "OUT=/workspace/out/coverage",
+      "FUZZING_LANGUAGE=c++",
+      "HTTP_PORT=",
+      "COVERAGE_EXTRA_ARGS="
+    ],
+    "args": [
+      "bash",
+      "-c",
+      "for f in /corpus/*.zip; do unzip -q $f -d ${f%%.*} || (echo \"Failed to unpack the corpus for $(basename ${f%%.*}). This usually means that corpus backup for a particular fuzz target does not exist. If a fuzz target was added in the last 24 hours, please wait one more day. Otherwise, something is wrong with the fuzz target or the infrastructure, and corpus pruning task does not finish successfully.\" && exit 1); done && coverage || (echo \"********************************************************************************\nCode coverage report generation failed.\nTo reproduce, run:\npython infra/helper.py build_image test-project\npython infra/helper.py build_fuzzers --sanitizer coverage test-project\npython infra/helper.py coverage test-project\n********************************************************************************\" && false)"
+    ],
+    "volumes": [
+      {
+        "name": "corpus",
+        "path": "/corpus"
+      }
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/gsutil",
+    "entrypoint": "sh",
+    "args": [
+      "-c",
+      "gsutil -m rm -rf gs://oss-fuzz-coverage/test-project/reports/20200101 || exit 0"
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/gsutil",
+    "args": [
+      "-m",
+      "cp",
+      "-r",
+      "/workspace/out/coverage/report",
+      "gs://oss-fuzz-coverage/test-project/reports/20200101"
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/gsutil",
+    "entrypoint": "sh",
+    "args": [
+      "-c",
+      "gsutil -m rm -rf gs://oss-fuzz-coverage/test-project/fuzzer_stats/20200101 || exit 0"
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/gsutil",
+    "args": [
+      "-m",
+      "cp",
+      "-r",
+      "/workspace/out/coverage/fuzzer_stats",
+      "gs://oss-fuzz-coverage/test-project/fuzzer_stats/20200101"
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/gsutil",
+    "entrypoint": "sh",
+    "args": [
+      "-c",
+      "gsutil -m rm -rf gs://oss-fuzz-coverage/test-project/logs/20200101 || exit 0"
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/gsutil",
+    "args": [
+      "-m",
+      "cp",
+      "-r",
+      "/workspace/out/coverage/logs",
+      "gs://oss-fuzz-coverage/test-project/logs/20200101"
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/gsutil",
+    "args": [
+      "cp",
+      "/workspace/srcmap.json",
+      "gs://oss-fuzz-coverage/test-project/srcmap/20200101.json"
+    ]
+  },
+  {
+    "name": "gcr.io/cloud-builders/curl",
+    "args": [
+      "-H",
+      "Content-Type: application/json",
+      "-X",
+      "PUT",
+      "-d",
+      "{\"fuzzer_stats_dir\": \"gs://oss-fuzz-coverage/test-project/fuzzer_stats/20200101\", \"html_report_url\": \"https://storage.googleapis.com/oss-fuzz-coverage/test-project/reports/20200101/linux/index.html\", \"report_date\": \"20200101\", \"report_summary_path\": \"gs://oss-fuzz-coverage/test-project/reports/20200101/linux/summary.json\"}",
+      "test_url"
+    ]
+  }
+]
\ No newline at end of file
diff --git a/infra/build/functions/index.yaml b/infra/build/functions/index.yaml
new file mode 100644
index 0000000..260bee2
--- /dev/null
+++ b/infra/build/functions/index.yaml
@@ -0,0 +1,5 @@
+indexes:
+  - kind: BuildsHistory
+    properties:
+      - name: build_tag
+      - name: project
diff --git a/infra/build/functions/main.py b/infra/build/functions/main.py
new file mode 100644
index 0000000..1bfd358
--- /dev/null
+++ b/infra/build/functions/main.py
@@ -0,0 +1,52 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Cloud functions for build infrastructure."""
+
+import base_images
+import project_sync
+import request_build
+import request_coverage_build
+import update_build_status
+
+
+def build_project(event, context):
+  """Entry point for cloud function to requesting project builds."""
+  request_build.request_build(event, context)
+
+
+def sync(event, context):
+  """Entry point for cloud function that syncs projects from github."""
+  project_sync.sync(event, context)
+
+
+def build_base_images(event, context):
+  """Entry point for cloud function that builds base images."""
+  base_images.base_builder(event, context)
+
+
+def coverage_build(event, context):
+  """Entry point for cloud function to build coverage reports."""
+  request_coverage_build.request_coverage_build(event, context)
+
+
+def builds_status(event, context):
+  """Entry point for builds status cloud function."""
+  update_build_status.update_status(event, context)
+
+
+def build_msan(event, context):
+  """Entry point for base msan builder."""
+  base_images.base_msan_builder(event, context)
diff --git a/infra/build/functions/project_sync.py b/infra/build/functions/project_sync.py
new file mode 100644
index 0000000..e695a3a
--- /dev/null
+++ b/infra/build/functions/project_sync.py
@@ -0,0 +1,232 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Cloud functions for build scheduling."""
+
+from collections import namedtuple
+import logging
+import os
+import re
+import yaml
+
+from github import Github
+from google.api_core import exceptions
+from google.cloud import ndb
+from google.cloud import scheduler_v1
+
+import build_and_run_coverage
+import build_project
+from datastore_entities import GithubCreds
+from datastore_entities import Project
+
+VALID_PROJECT_NAME = re.compile(r'^[a-zA-Z0-9_-]+$')
+DEFAULT_BUILDS_PER_DAY = 1
+MAX_BUILDS_PER_DAY = 4
+COVERAGE_SCHEDULE = '0 6 * * *'
+FUZZING_BUILD_TOPIC = 'request-build'
+COVERAGE_BUILD_TOPIC = 'request-coverage-build'
+
+ProjectMetadata = namedtuple(
+    'ProjectMetadata', 'schedule project_yaml_contents dockerfile_contents')
+
+
+class ProjectYamlError(Exception):
+  """Error in project.yaml format."""
+
+
+def create_scheduler(cloud_scheduler_client, project_name, schedule, tag,
+                     topic):
+  """Creates schedulers for new projects."""
+  project_id = os.environ.get('GCP_PROJECT')
+  location_id = os.environ.get('FUNCTION_REGION')
+  parent = cloud_scheduler_client.location_path(project_id, location_id)
+  job = {
+      'name': parent + '/jobs/' + project_name + '-scheduler-' + tag,
+      'pubsub_target': {
+          'topic_name': 'projects/' + project_id + '/topics/' + topic,
+          'data': project_name.encode()
+      },
+      'schedule': schedule
+  }
+
+  cloud_scheduler_client.create_job(parent, job)
+
+
+def delete_scheduler(cloud_scheduler_client, project_name):
+  """Deletes schedulers for projects that were removed."""
+  project_id = os.environ.get('GCP_PROJECT')
+  location_id = os.environ.get('FUNCTION_REGION')
+  name = cloud_scheduler_client.job_path(project_id, location_id,
+                                         project_name + '-scheduler')
+  cloud_scheduler_client.delete_job(name)
+
+
+def update_scheduler(cloud_scheduler_client, project, schedule):
+  """Updates schedule in case schedule was changed."""
+  project_id = os.environ.get('GCP_PROJECT')
+  location_id = os.environ.get('FUNCTION_REGION')
+  parent = cloud_scheduler_client.location_path(project_id, location_id)
+  job = {
+      'name': parent + '/jobs/' + project.name + '-scheduler',
+      'pubsub_target': {
+          'topic_name': 'projects/' + project_id + '/topics/request-build',
+          'data': project.name.encode()
+      },
+      'schedule': project.schedule
+  }
+
+  update_mask = {'schedule': schedule}
+  cloud_scheduler_client.update(job, update_mask)
+
+
+# pylint: disable=too-many-branches
+def sync_projects(cloud_scheduler_client, projects):
+  """Sync projects with cloud datastore."""
+  for project in Project.query():
+    if project.name in projects:
+      continue
+
+    logging.info('Deleting project %s', project.name)
+    try:
+      delete_scheduler(cloud_scheduler_client, project.name)
+      project.key.delete()
+    except exceptions.GoogleAPICallError as error:
+      logging.error('Scheduler deletion for %s failed with %s', project.name,
+                    error)
+
+  existing_projects = {project.name for project in Project.query()}
+  for project_name in projects:
+    if project_name in existing_projects:
+      continue
+
+    try:
+      create_scheduler(cloud_scheduler_client, project_name,
+                       projects[project_name].schedule,
+                       build_project.FUZZING_BUILD_TAG, FUZZING_BUILD_TOPIC)
+      create_scheduler(cloud_scheduler_client, project_name, COVERAGE_SCHEDULE,
+                       build_and_run_coverage.COVERAGE_BUILD_TAG,
+                       COVERAGE_BUILD_TOPIC)
+      project_metadata = projects[project_name]
+      Project(name=project_name,
+              schedule=project_metadata.schedule,
+              project_yaml_contents=project_metadata.project_yaml_contents,
+              dockerfile_contents=project_metadata.dockerfile_contents).put()
+    except exceptions.GoogleAPICallError as error:
+      logging.error('Scheduler creation for %s failed with %s', project_name,
+                    error)
+
+  for project in Project.query():
+    if project.name not in projects:
+      continue
+
+    logging.info('Setting up project %s', project.name)
+    project_metadata = projects[project.name]
+    project_changed = False
+    if project.schedule != project_metadata.schedule:
+      try:
+        logging.info('Schedule changed.')
+        update_scheduler(cloud_scheduler_client, project,
+                         projects[project.name].schedule)
+        project.schedule = project_metadata.schedule
+        project_changed = True
+      except exceptions.GoogleAPICallError as error:
+        logging.error('Updating scheduler for %s failed with %s', project.name,
+                      error)
+    if project.project_yaml_contents != project_metadata.project_yaml_contents:
+      project.project_yaml_contents = project_metadata.project_yaml_contents
+      project_changed = True
+
+    if project.dockerfile_contents != project_metadata.dockerfile_contents:
+      project.dockerfile_contents = project_metadata.dockerfile_contents
+      project_changed = True
+
+    if project_changed:
+      project.put()
+
+
+def _has_docker_file(project_contents):
+  """Checks if project has a Dockerfile."""
+  return any(
+      content_file.name == 'Dockerfile' for content_file in project_contents)
+
+
+def get_project_metadata(project_contents):
+  """Checks for schedule parameter in yaml file else uses DEFAULT_SCHEDULE."""
+  for content_file in project_contents:
+    if content_file.name == 'project.yaml':
+      project_yaml_contents = content_file.decoded_content.decode('utf-8')
+
+    if content_file.name == 'Dockerfile':
+      dockerfile_contents = content_file.decoded_content.decode('utf-8')
+
+  project_yaml = yaml.safe_load(project_yaml_contents)
+  builds_per_day = project_yaml.get('builds_per_day', DEFAULT_BUILDS_PER_DAY)
+  if not isinstance(builds_per_day, int) or builds_per_day not in range(
+      1, MAX_BUILDS_PER_DAY + 1):
+    raise ProjectYamlError('Parameter is not an integer in range [1-4]')
+
+  # Starting at 6:00 am, next build schedules are added at 'interval' slots
+  # Example for interval 2, hours = [6, 18] and schedule = '0 6,18 * * *'
+  interval = 24 // builds_per_day
+  hours = []
+  for hour in range(6, 30, interval):
+    hours.append(hour % 24)
+  schedule = '0 ' + ','.join(str(hour) for hour in hours) + ' * * *'
+
+  return ProjectMetadata(schedule, project_yaml_contents, dockerfile_contents)
+
+
+def get_projects(repo):
+  """Get project list from git repository."""
+  projects = {}
+  contents = repo.get_contents('projects')
+  for content_file in contents:
+    if content_file.type != 'dir' or not VALID_PROJECT_NAME.match(
+        content_file.name):
+      continue
+
+    project_contents = repo.get_contents(content_file.path)
+    if not _has_docker_file(project_contents):
+      continue
+
+    try:
+      projects[content_file.name] = get_project_metadata(project_contents)
+    except ProjectYamlError as error:
+      logging.error(
+          'Incorrect format for project.yaml file of %s with error %s',
+          content_file.name, error)
+
+  return projects
+
+
+def get_github_creds():
+  """Retrieves GitHub client credentials."""
+  git_creds = GithubCreds.query().get()
+  if git_creds is None:
+    raise RuntimeError('Git credentials not available.')
+  return git_creds
+
+
+def sync(event, context):
+  """Sync projects with cloud datastore."""
+  del event, context  #unused
+
+  with ndb.Client().context():
+    git_creds = get_github_creds()
+    github_client = Github(git_creds.client_id, git_creds.client_secret)
+    repo = github_client.get_repo('google/oss-fuzz')
+    projects = get_projects(repo)
+    cloud_scheduler_client = scheduler_v1.CloudSchedulerClient()
+    sync_projects(cloud_scheduler_client, projects)
diff --git a/infra/build/functions/project_sync_test.py b/infra/build/functions/project_sync_test.py
new file mode 100644
index 0000000..4d7214f
--- /dev/null
+++ b/infra/build/functions/project_sync_test.py
@@ -0,0 +1,314 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Unit tests for Cloud Function sync, which syncs the list of github projects
+and uploads them to the Cloud Datastore."""
+
+import unittest
+
+from google.cloud import ndb
+
+from datastore_entities import Project
+from project_sync import get_github_creds
+from project_sync import get_projects
+from project_sync import ProjectMetadata
+from project_sync import sync_projects
+import test_utils
+
+
+# pylint: disable=too-few-public-methods
+class Repository:
+  """Mocking Github Repository."""
+
+  def __init__(self, name, file_type, path, contents=None):
+    self.contents = contents or []
+    self.name = name
+    self.type = file_type
+    self.path = path
+    self.decoded_content = b"name: test"
+
+  def get_contents(self, path):
+    """"Get contents of repository."""
+    if self.path == path:
+      return self.contents
+
+    for content_file in self.contents:
+      if content_file.path == path:
+        return content_file.contents
+
+    return None
+
+  def set_yaml_contents(self, decoded_content):
+    """Set yaml_contents."""
+    self.decoded_content = decoded_content
+
+
+class CloudSchedulerClient:
+  """Mocking cloud scheduler client."""
+
+  def __init__(self):
+    self.schedulers = []
+
+  # pylint: disable=no-self-use
+  def location_path(self, project_id, location_id):
+    """Return project path."""
+    return 'projects/{}/location/{}'.format(project_id, location_id)
+
+  def create_job(self, parent, job):
+    """Simulate create job."""
+    del parent
+    self.schedulers.append(job)
+
+  # pylint: disable=no-self-use
+  def job_path(self, project_id, location_id, name):
+    """Return job path."""
+    return 'projects/{}/location/{}/jobs/{}'.format(project_id, location_id,
+                                                    name)
+
+  def delete_job(self, name):
+    """Simulate delete jobs."""
+    for job in self.schedulers:
+      if job['name'] == name:
+        self.schedulers.remove(job)
+        break
+
+  def update(self, job, update_mask):
+    """Simulate update jobs."""
+    for existing_job in self.schedulers:
+      if existing_job == job:
+        job['schedule'] = update_mask['schedule']
+
+
+class TestDataSync(unittest.TestCase):
+  """Unit tests for sync."""
+
+  @classmethod
+  def setUpClass(cls):
+    cls.ds_emulator = test_utils.start_datastore_emulator()
+    test_utils.wait_for_emulator_ready(cls.ds_emulator, 'datastore',
+                                       test_utils.DATASTORE_READY_INDICATOR)
+    test_utils.set_gcp_environment()
+
+  def setUp(self):
+    test_utils.reset_ds_emulator()
+
+  def test_sync_projects_update(self):
+    """Testing sync_projects() updating a schedule."""
+    cloud_scheduler_client = CloudSchedulerClient()
+
+    with ndb.Client().context():
+      Project(name='test1',
+              schedule='0 8 * * *',
+              project_yaml_contents='',
+              dockerfile_contents='').put()
+      Project(name='test2',
+              schedule='0 9 * * *',
+              project_yaml_contents='',
+              dockerfile_contents='').put()
+
+      projects = {
+          'test1': ProjectMetadata('0 8 * * *', '', ''),
+          'test2': ProjectMetadata('0 7 * * *', '', '')
+      }
+      sync_projects(cloud_scheduler_client, projects)
+
+      projects_query = Project.query()
+      self.assertEqual({
+          'test1': '0 8 * * *',
+          'test2': '0 7 * * *'
+      }, {project.name: project.schedule for project in projects_query})
+
+  def test_sync_projects_create(self):
+    """"Testing sync_projects() creating new schedule."""
+    cloud_scheduler_client = CloudSchedulerClient()
+
+    with ndb.Client().context():
+      Project(name='test1',
+              schedule='0 8 * * *',
+              project_yaml_contents='',
+              dockerfile_contents='').put()
+
+      projects = {
+          'test1': ProjectMetadata('0 8 * * *', '', ''),
+          'test2': ProjectMetadata('0 7 * * *', '', '')
+      }
+      sync_projects(cloud_scheduler_client, projects)
+
+      projects_query = Project.query()
+      self.assertEqual({
+          'test1': '0 8 * * *',
+          'test2': '0 7 * * *'
+      }, {project.name: project.schedule for project in projects_query})
+
+      self.assertCountEqual([
+          {
+              'name':
+                  'projects/test-project/location/us-central1/jobs/test2-scheduler-fuzzing',
+              'pubsub_target': {
+                  'topic_name': 'projects/test-project/topics/request-build',
+                  'data': b'test2'
+              },
+              'schedule':
+                  '0 7 * * *'
+          },
+          {
+              'name':
+                  'projects/test-project/location/us-central1/jobs/test2-scheduler-coverage',
+              'pubsub_target': {
+                  'topic_name':
+                      'projects/test-project/topics/request-coverage-build',
+                  'data':
+                      b'test2'
+              },
+              'schedule':
+                  '0 6 * * *'
+          },
+      ], cloud_scheduler_client.schedulers)
+
+  def test_sync_projects_delete(self):
+    """Testing sync_projects() deleting."""
+    cloud_scheduler_client = CloudSchedulerClient()
+
+    with ndb.Client().context():
+      Project(name='test1',
+              schedule='0 8 * * *',
+              project_yaml_contents='',
+              dockerfile_contents='').put()
+      Project(name='test2',
+              schedule='0 9 * * *',
+              project_yaml_contents='',
+              dockerfile_contents='').put()
+
+      projects = {'test1': ProjectMetadata('0 8 * * *', '', '')}
+      sync_projects(cloud_scheduler_client, projects)
+
+      projects_query = Project.query()
+      self.assertEqual(
+          {'test1': '0 8 * * *'},
+          {project.name: project.schedule for project in projects_query})
+
+  def test_get_projects_yaml(self):
+    """Testing get_projects() yaml get_schedule()."""
+
+    repo = Repository('oss-fuzz', 'dir', 'projects', [
+        Repository('test0', 'dir', 'projects/test0', [
+            Repository('Dockerfile', 'file', 'projects/test0/Dockerfile'),
+            Repository('project.yaml', 'file', 'projects/test0/project.yaml')
+        ]),
+        Repository('test1', 'dir', 'projects/test1', [
+            Repository('Dockerfile', 'file', 'projects/test1/Dockerfile'),
+            Repository('project.yaml', 'file', 'projects/test1/project.yaml')
+        ])
+    ])
+    repo.contents[0].contents[1].set_yaml_contents(b'builds_per_day: 2')
+    repo.contents[1].contents[1].set_yaml_contents(b'builds_per_day: 3')
+
+    self.assertEqual(
+        get_projects(repo), {
+            'test0':
+                ProjectMetadata('0 6,18 * * *', 'builds_per_day: 2',
+                                'name: test'),
+            'test1':
+                ProjectMetadata('0 6,14,22 * * *', 'builds_per_day: 3',
+                                'name: test')
+        })
+
+  def test_get_projects_no_docker_file(self):
+    """Testing get_projects() with missing dockerfile"""
+
+    repo = Repository('oss-fuzz', 'dir', 'projects', [
+        Repository('test0', 'dir', 'projects/test0', [
+            Repository('Dockerfile', 'file', 'projects/test0/Dockerfile'),
+            Repository('project.yaml', 'file', 'projects/test0/project.yaml')
+        ]),
+        Repository('test1', 'dir', 'projects/test1')
+    ])
+
+    self.assertEqual(
+        get_projects(repo),
+        {'test0': ProjectMetadata('0 6 * * *', 'name: test', 'name: test')})
+
+  def test_get_projects_invalid_project_name(self):
+    """Testing get_projects() with invalid project name"""
+
+    repo = Repository('oss-fuzz', 'dir', 'projects', [
+        Repository('test0', 'dir', 'projects/test0', [
+            Repository('Dockerfile', 'file', 'projects/test0/Dockerfile'),
+            Repository('project.yaml', 'file', 'projects/test0/project.yaml')
+        ]),
+        Repository('test1@', 'dir', 'projects/test1', [
+            Repository('Dockerfile', 'file', 'projects/test1/Dockerfile'),
+            Repository('project.yaml', 'file', 'projects/test0/project.yaml')
+        ])
+    ])
+
+    self.assertEqual(
+        get_projects(repo),
+        {'test0': ProjectMetadata('0 6 * * *', 'name: test', 'name: test')})
+
+  def test_get_projects_non_directory_type_project(self):
+    """Testing get_projects() when a file in projects/ is not of type 'dir'."""
+
+    repo = Repository('oss-fuzz', 'dir', 'projects', [
+        Repository('test0', 'dir', 'projects/test0', [
+            Repository('Dockerfile', 'file', 'projects/test0/Dockerfile'),
+            Repository('project.yaml', 'file', 'projects/test0/project.yaml')
+        ]),
+        Repository('test1', 'file', 'projects/test1')
+    ])
+
+    self.assertEqual(
+        get_projects(repo),
+        {'test0': ProjectMetadata('0 6 * * *', 'name: test', 'name: test')})
+
+  def test_invalid_yaml_format(self):
+    """Testing invalid yaml schedule parameter argument."""
+
+    repo = Repository('oss-fuzz', 'dir', 'projects', [
+        Repository('test0', 'dir', 'projects/test0', [
+            Repository('Dockerfile', 'file', 'projects/test0/Dockerfile'),
+            Repository('project.yaml', 'file', 'projects/test0/project.yaml')
+        ])
+    ])
+    repo.contents[0].contents[1].set_yaml_contents(
+        b'builds_per_day: some-string')
+
+    self.assertEqual(get_projects(repo), {})
+
+  def test_yaml_out_of_range(self):
+    """Testing invalid yaml schedule parameter argument."""
+
+    repo = Repository('oss-fuzz', 'dir', 'projects', [
+        Repository('test0', 'dir', 'projects/test0', [
+            Repository('Dockerfile', 'file', 'projects/test0/Dockerfile'),
+            Repository('project.yaml', 'file', 'projects/test0/project.yaml')
+        ])
+    ])
+    repo.contents[0].contents[1].set_yaml_contents(b'builds_per_day: 5')
+
+    self.assertEqual(get_projects(repo), {})
+
+  def test_get_github_creds(self):
+    """Testing get_github_creds()."""
+    with ndb.Client().context():
+      self.assertRaises(RuntimeError, get_github_creds)
+
+  @classmethod
+  def tearDownClass(cls):
+    test_utils.cleanup_emulator(cls.ds_emulator)
+
+
+if __name__ == '__main__':
+  unittest.main(exit=False)
diff --git a/infra/build/functions/request_build.py b/infra/build/functions/request_build.py
new file mode 100644
index 0000000..6f0ab62
--- /dev/null
+++ b/infra/build/functions/request_build.py
@@ -0,0 +1,115 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Cloud function to request builds."""
+import base64
+import logging
+
+import google.auth
+from googleapiclient.discovery import build
+from google.cloud import ndb
+
+import build_lib
+import build_project
+from datastore_entities import BuildsHistory
+from datastore_entities import Project
+
+BASE_PROJECT = 'oss-fuzz-base'
+MAX_BUILD_HISTORY_LENGTH = 64
+QUEUE_TTL_SECONDS = 60 * 60 * 24  # 24 hours.
+
+
+def update_build_history(project_name, build_id, build_tag):
+  """Update build history of project."""
+  project_key = ndb.Key(BuildsHistory, project_name + '-' + build_tag)
+  project = project_key.get()
+
+  if not project:
+    project = BuildsHistory(id=project_name + '-' + build_tag,
+                            build_tag=build_tag,
+                            project=project_name,
+                            build_ids=[])
+
+  if len(project.build_ids) >= MAX_BUILD_HISTORY_LENGTH:
+    project.build_ids.pop(0)
+
+  project.build_ids.append(build_id)
+  project.put()
+
+
+def get_project_data(project_name):
+  """Retrieve project metadata from datastore."""
+  query = Project.query(Project.name == project_name)
+  project = query.get()
+  if not project:
+    raise RuntimeError(
+        'Project {0} not available in cloud datastore'.format(project_name))
+  project_yaml_contents = project.project_yaml_contents
+  dockerfile_lines = project.dockerfile_contents.split('\n')
+
+  return (project_yaml_contents, dockerfile_lines)
+
+
+def get_build_steps(project_name, image_project, base_images_project):
+  """Retrieve build steps."""
+  project_yaml_contents, dockerfile_lines = get_project_data(project_name)
+  return build_project.get_build_steps(project_name, project_yaml_contents,
+                                       dockerfile_lines, image_project,
+                                       base_images_project)
+
+
+# pylint: disable=no-member
+def run_build(project_name, image_project, build_steps, credentials, tag):
+  """Execute build on cloud build."""
+  build_body = {
+      'steps': build_steps,
+      'timeout': str(build_lib.BUILD_TIMEOUT) + 's',
+      'options': {
+          'machineType': 'N1_HIGHCPU_32'
+      },
+      'logsBucket': build_project.GCB_LOGS_BUCKET,
+      'tags': [project_name + '-' + tag,],
+      'queueTtl': str(QUEUE_TTL_SECONDS) + 's',
+  }
+
+  cloudbuild = build('cloudbuild',
+                     'v1',
+                     credentials=credentials,
+                     cache_discovery=False)
+  build_info = cloudbuild.projects().builds().create(projectId=image_project,
+                                                     body=build_body).execute()
+  build_id = build_info['metadata']['build']['id']
+
+  update_build_history(project_name, build_id, tag)
+  logging.info('Build ID: %s', build_id)
+  logging.info('Logs: %s', build_project.get_logs_url(build_id, image_project))
+
+
+# pylint: disable=no-member
+def request_build(event, context):
+  """Entry point for cloud function to request builds."""
+  del context  #unused
+  if 'data' in event:
+    project_name = base64.b64decode(event['data']).decode('utf-8')
+  else:
+    raise RuntimeError('Project name missing from payload')
+
+  with ndb.Client().context():
+    credentials, image_project = google.auth.default()
+    build_steps = get_build_steps(project_name, image_project, BASE_PROJECT)
+    if not build_steps:
+      return
+    run_build(project_name, image_project, build_steps, credentials,
+              build_project.FUZZING_BUILD_TAG)
diff --git a/infra/build/functions/request_build_test.py b/infra/build/functions/request_build_test.py
new file mode 100644
index 0000000..d734672
--- /dev/null
+++ b/infra/build/functions/request_build_test.py
@@ -0,0 +1,111 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Unit tests for Cloud Function request builds which builds projects."""
+import json
+import datetime
+import os
+import unittest
+from unittest import mock
+
+from google.cloud import ndb
+
+from datastore_entities import BuildsHistory
+from datastore_entities import Project
+from request_build import get_build_steps
+from request_build import get_project_data
+from request_build import update_build_history
+import test_utils
+
+
+class TestRequestBuilds(unittest.TestCase):
+  """Unit tests for sync."""
+
+  @classmethod
+  def setUpClass(cls):
+    cls.ds_emulator = test_utils.start_datastore_emulator()
+    test_utils.wait_for_emulator_ready(cls.ds_emulator, 'datastore',
+                                       test_utils.DATASTORE_READY_INDICATOR)
+    test_utils.set_gcp_environment()
+
+  def setUp(self):
+    test_utils.reset_ds_emulator()
+
+  @mock.patch('build_lib.get_signed_url', return_value='test_url')
+  @mock.patch('datetime.datetime')
+  def test_get_build_steps(self, mocked_url, mocked_time):
+    """Test for get_build_steps."""
+    del mocked_url, mocked_time
+    datetime.datetime = test_utils.SpoofedDatetime
+    project_yaml_contents = ('language: c++\n'
+                             'sanitizers:\n'
+                             '  - address\n'
+                             'architectures:\n'
+                             '  - x86_64\n')
+    image_project = 'oss-fuzz'
+    base_images_project = 'oss-fuzz-base'
+    testcase_path = os.path.join(os.path.dirname(__file__),
+                                 'expected_build_steps.json')
+    with open(testcase_path) as testcase_file:
+      expected_build_steps = json.load(testcase_file)
+
+    with ndb.Client().context():
+      Project(name='test-project',
+              project_yaml_contents=project_yaml_contents,
+              dockerfile_contents='test line').put()
+      build_steps = get_build_steps('test-project', image_project,
+                                    base_images_project)
+    self.assertEqual(build_steps, expected_build_steps)
+
+  def test_get_build_steps_no_project(self):
+    """Test for when project isn't available in datastore."""
+    with ndb.Client().context():
+      self.assertRaises(RuntimeError, get_build_steps, 'test-project',
+                        'oss-fuzz', 'oss-fuzz-base')
+
+  def test_build_history(self):
+    """Testing build history."""
+    with ndb.Client().context():
+      BuildsHistory(id='test-project-fuzzing',
+                    build_tag='fuzzing',
+                    project='test-project',
+                    build_ids=[str(i) for i in range(1, 65)]).put()
+      update_build_history('test-project', '65', 'fuzzing')
+      expected_build_ids = [str(i) for i in range(2, 66)]
+
+      self.assertEqual(BuildsHistory.query().get().build_ids,
+                       expected_build_ids)
+
+  def test_build_history_no_existing_project(self):
+    """Testing build history when build history object is missing."""
+    with ndb.Client().context():
+      update_build_history('test-project', '1', 'fuzzing')
+      expected_build_ids = ['1']
+
+      self.assertEqual(BuildsHistory.query().get().build_ids,
+                       expected_build_ids)
+
+  def test_get_project_data(self):
+    """Testing get project data."""
+    with ndb.Client().context():
+      self.assertRaises(RuntimeError, get_project_data, 'test-project')
+
+  @classmethod
+  def tearDownClass(cls):
+    test_utils.cleanup_emulator(cls.ds_emulator)
+
+
+if __name__ == '__main__':
+  unittest.main(exit=False)
diff --git a/infra/build/functions/request_coverage_build.py b/infra/build/functions/request_coverage_build.py
new file mode 100644
index 0000000..1b4ac0e
--- /dev/null
+++ b/infra/build/functions/request_coverage_build.py
@@ -0,0 +1,53 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Cloud function that requests coverage builds."""
+import base64
+
+import google.auth
+from google.cloud import ndb
+
+import build_and_run_coverage
+import request_build
+
+BASE_PROJECT = 'oss-fuzz-base'
+
+
+def get_build_steps(project_name, image_project, base_images_project):
+  """Retrieve build steps."""
+  project_yaml_contents, dockerfile_lines = request_build.get_project_data(
+      project_name)
+  return build_and_run_coverage.get_build_steps(project_name,
+                                                project_yaml_contents,
+                                                dockerfile_lines, image_project,
+                                                base_images_project)
+
+
+def request_coverage_build(event, context):
+  """Entry point for coverage build cloud function."""
+  del context  #unused
+  if 'data' in event:
+    project_name = base64.b64decode(event['data']).decode('utf-8')
+  else:
+    raise RuntimeError('Project name missing from payload')
+
+  with ndb.Client().context():
+    credentials, image_project = google.auth.default()
+    build_steps = get_build_steps(project_name, image_project, BASE_PROJECT)
+    if not build_steps:
+      return
+    request_build.run_build(project_name, image_project, build_steps,
+                            credentials,
+                            build_and_run_coverage.COVERAGE_BUILD_TAG)
diff --git a/infra/build/functions/request_coverage_build_test.py b/infra/build/functions/request_coverage_build_test.py
new file mode 100644
index 0000000..0264e80
--- /dev/null
+++ b/infra/build/functions/request_coverage_build_test.py
@@ -0,0 +1,84 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Unit tests for Cloud Function that builds coverage reports."""
+import json
+import datetime
+import os
+import unittest
+from unittest import mock
+
+from google.cloud import ndb
+
+from datastore_entities import Project
+from build_and_run_coverage import get_build_steps
+import test_utils
+
+
+class TestRequestCoverageBuilds(unittest.TestCase):
+  """Unit tests for sync."""
+
+  @classmethod
+  def setUpClass(cls):
+    cls.ds_emulator = test_utils.start_datastore_emulator()
+    test_utils.wait_for_emulator_ready(cls.ds_emulator, 'datastore',
+                                       test_utils.DATASTORE_READY_INDICATOR)
+    test_utils.set_gcp_environment()
+
+  def setUp(self):
+    test_utils.reset_ds_emulator()
+
+  @mock.patch('build_lib.get_signed_url', return_value='test_url')
+  @mock.patch('build_lib.download_corpora_steps',
+              return_value=[{
+                  'url': 'test_download'
+              }])
+  @mock.patch('datetime.datetime')
+  def test_get_coverage_build_steps(self, mocked_url, mocked_corpora_steps,
+                                    mocked_time):
+    """Test for get_build_steps."""
+    del mocked_url, mocked_corpora_steps, mocked_time
+    datetime.datetime = test_utils.SpoofedDatetime
+    project_yaml_contents = ('language: c++\n'
+                             'sanitizers:\n'
+                             '  - address\n'
+                             'architectures:\n'
+                             '  - x86_64\n')
+    dockerfile_contents = 'test line'
+    image_project = 'oss-fuzz'
+    base_images_project = 'oss-fuzz-base'
+    testcase_path = os.path.join(os.path.dirname(__file__),
+                                 'expected_coverage_build_steps.json')
+    with open(testcase_path) as testcase_file:
+      expected_coverage_build_steps = json.load(testcase_file)
+
+    with ndb.Client().context():
+      Project(name='test-project',
+              project_yaml_contents=project_yaml_contents,
+              dockerfile_contents=dockerfile_contents).put()
+
+    dockerfile_lines = dockerfile_contents.split('\n')
+    build_steps = get_build_steps('test-project', project_yaml_contents,
+                                  dockerfile_lines, image_project,
+                                  base_images_project)
+    self.assertEqual(build_steps, expected_coverage_build_steps)
+
+  @classmethod
+  def tearDownClass(cls):
+    test_utils.cleanup_emulator(cls.ds_emulator)
+
+
+if __name__ == '__main__':
+  unittest.main(exit=False)
diff --git a/infra/build/functions/requirements.txt b/infra/build/functions/requirements.txt
new file mode 100644
index 0000000..1e5f510
--- /dev/null
+++ b/infra/build/functions/requirements.txt
@@ -0,0 +1,27 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+PyYaml==5.1
+PyGithub==1.51
+grpcio==1.29.0
+google-auth==1.18.0
+google-cloud-ndb==1.3.0
+google-cloud-scheduler==1.3.0
+google-cloud-storage==1.29.0
+google-api-core==1.21.0
+google-api-python-client==1.9.3
+oauth2client==4.1.3
+python-dateutil==2.8.1 
diff --git a/infra/build/functions/test_utils.py b/infra/build/functions/test_utils.py
new file mode 100644
index 0000000..9aac8ea
--- /dev/null
+++ b/infra/build/functions/test_utils.py
@@ -0,0 +1,104 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Utility functions for testing cloud functions."""
+import datetime
+import os
+import subprocess
+import threading
+
+import requests
+
+DATASTORE_READY_INDICATOR = b'is now running'
+DATASTORE_EMULATOR_PORT = 8432
+EMULATOR_TIMEOUT = 20
+TEST_PROJECT_ID = 'test-project'
+
+
+# pylint: disable=arguments-differ
+class SpoofedDatetime(datetime.datetime):
+  """Mocking Datetime class for now() function."""
+
+  @classmethod
+  def now(cls):
+    return datetime.datetime(2020, 1, 1, 0, 0, 0)
+
+
+def start_datastore_emulator():
+  """Start Datastore emulator."""
+  return subprocess.Popen([
+      'gcloud',
+      'beta',
+      'emulators',
+      'datastore',
+      'start',
+      '--consistency=1.0',
+      '--host-port=localhost:' + str(DATASTORE_EMULATOR_PORT),
+      '--project=' + TEST_PROJECT_ID,
+      '--no-store-on-disk',
+  ],
+                          stdout=subprocess.PIPE,
+                          stderr=subprocess.STDOUT)
+
+
+def wait_for_emulator_ready(proc,
+                            emulator,
+                            indicator,
+                            timeout=EMULATOR_TIMEOUT):
+  """Wait for emulator to be ready."""
+
+  def _read_thread(proc, ready_event):
+    """Thread to continuously read from the process stdout."""
+    ready = False
+    while True:
+      line = proc.stdout.readline()
+      if not line:
+        break
+      if not ready and indicator in line:
+        ready = True
+        ready_event.set()
+
+  # Wait for process to become ready.
+  ready_event = threading.Event()
+  thread = threading.Thread(target=_read_thread, args=(proc, ready_event))
+  thread.daemon = True
+  thread.start()
+  if not ready_event.wait(timeout):
+    raise RuntimeError(
+        '{} emulator did not get ready in time.'.format(emulator))
+  return thread
+
+
+def reset_ds_emulator():
+  """Reset ds emulator/clean all entities."""
+  req = requests.post(
+      'http://localhost:{}/reset'.format(DATASTORE_EMULATOR_PORT))
+  req.raise_for_status()
+
+
+def cleanup_emulator(ds_emulator):
+  """Cleanup the system processes made by ds emulator."""
+  del ds_emulator  #To do, find a better way to cleanup emulator
+  os.system('pkill -f datastore')
+
+
+def set_gcp_environment():
+  """Set environment variables for simulating in google cloud platform."""
+  os.environ['DATASTORE_EMULATOR_HOST'] = 'localhost:' + str(
+      DATASTORE_EMULATOR_PORT)
+  os.environ['GOOGLE_CLOUD_PROJECT'] = TEST_PROJECT_ID
+  os.environ['DATASTORE_DATASET'] = TEST_PROJECT_ID
+  os.environ['GCP_PROJECT'] = TEST_PROJECT_ID
+  os.environ['FUNCTION_REGION'] = 'us-central1'
diff --git a/infra/build/functions/update_build_status.py b/infra/build/functions/update_build_status.py
new file mode 100644
index 0000000..b5f9552
--- /dev/null
+++ b/infra/build/functions/update_build_status.py
@@ -0,0 +1,300 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Cloud function to request builds."""
+import base64
+import concurrent.futures
+import json
+import sys
+
+import google.auth
+from googleapiclient.discovery import build
+from google.cloud import ndb
+from google.cloud import storage
+
+import build_and_run_coverage
+import build_project
+from datastore_entities import BuildsHistory
+from datastore_entities import LastSuccessfulBuild
+from datastore_entities import Project
+
+BADGE_DIR = 'badge_images'
+BADGE_IMAGE_TYPES = {'svg': 'image/svg+xml', 'png': 'image/png'}
+DESTINATION_BADGE_DIR = 'badges'
+MAX_BUILD_LOGS = 7
+
+STATUS_BUCKET = 'oss-fuzz-build-logs'
+
+FUZZING_STATUS_FILENAME = 'status.json'
+COVERAGE_STATUS_FILENAME = 'status-coverage.json'
+
+# pylint: disable=invalid-name
+_client = None
+
+
+class MissingBuildLogError(Exception):
+  """Missing build log file in cloud storage."""
+
+
+# pylint: disable=global-statement
+def get_storage_client():
+  """Return storage client."""
+  global _client
+  if not _client:
+    _client = storage.Client()
+
+  return _client
+
+
+def is_build_successful(build_obj):
+  """Check build success."""
+  return build_obj['status'] == 'SUCCESS'
+
+
+def upload_status(data, status_filename):
+  """Upload json file to cloud storage."""
+  bucket = get_storage_client().get_bucket(STATUS_BUCKET)
+  blob = bucket.blob(status_filename)
+  blob.cache_control = 'no-cache'
+  blob.upload_from_string(json.dumps(data), content_type='application/json')
+
+
+def sort_projects(projects):
+  """Sort projects in order Failures, Successes, Not yet built."""
+
+  def key_func(project):
+    if not project['history']:
+      return 2  # Order projects without history last.
+
+    if project['history'][0]['success']:
+      # Successful builds come second.
+      return 1
+
+    # Build failures come first.
+    return 0
+
+  projects.sort(key=key_func)
+
+
+def get_build(cloudbuild, image_project, build_id):
+  """Get build object from cloudbuild."""
+  return cloudbuild.projects().builds().get(projectId=image_project,
+                                            id=build_id).execute()
+
+
+def update_last_successful_build(project, build_tag):
+  """Update last successful build."""
+  last_successful_build = ndb.Key(LastSuccessfulBuild,
+                                  project['name'] + '-' + build_tag).get()
+  if not last_successful_build and 'last_successful_build' not in project:
+    return
+
+  if 'last_successful_build' not in project:
+    project['last_successful_build'] = {
+        'build_id': last_successful_build.build_id,
+        'finish_time': last_successful_build.finish_time
+    }
+  else:
+    if last_successful_build:
+      last_successful_build.build_id = project['last_successful_build'][
+          'build_id']
+      last_successful_build.finish_time = project['last_successful_build'][
+          'finish_time']
+    else:
+      last_successful_build = LastSuccessfulBuild(
+          id=project['name'] + '-' + build_tag,
+          project=project['name'],
+          build_id=project['last_successful_build']['build_id'],
+          finish_time=project['last_successful_build']['finish_time'])
+    last_successful_build.put()
+
+
+# pylint: disable=no-member
+def get_build_history(build_ids):
+  """Returns build object for the last finished build of project."""
+  credentials, image_project = google.auth.default()
+  cloudbuild = build('cloudbuild',
+                     'v1',
+                     credentials=credentials,
+                     cache_discovery=False)
+
+  history = []
+  last_successful_build = None
+
+  for build_id in reversed(build_ids):
+    project_build = get_build(cloudbuild, image_project, build_id)
+    if project_build['status'] not in ('SUCCESS', 'FAILURE', 'TIMEOUT'):
+      continue
+
+    if (not last_successful_build and is_build_successful(project_build)):
+      last_successful_build = {
+          'build_id': build_id,
+          'finish_time': project_build['finishTime'],
+      }
+
+    if not upload_log(build_id):
+      log_name = 'log-{0}'.format(build_id)
+      raise MissingBuildLogError('Missing build log file {0}'.format(log_name))
+
+    history.append({
+        'build_id': build_id,
+        'finish_time': project_build['finishTime'],
+        'success': is_build_successful(project_build)
+    })
+
+    if len(history) == MAX_BUILD_LOGS:
+      break
+
+  project = {'history': history}
+  if last_successful_build:
+    project['last_successful_build'] = last_successful_build
+  return project
+
+
+# pylint: disable=too-many-locals
+def update_build_status(build_tag, status_filename):
+  """Update build statuses."""
+  projects = []
+
+  def process_project(project_build):
+    """Process a project."""
+    project = get_build_history(project_build.build_ids)
+    project['name'] = project_build.project
+    print('Processing project', project['name'])
+    return project
+
+  with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:
+    futures = []
+    for project_build in BuildsHistory.query(
+        BuildsHistory.build_tag == build_tag).order('project'):
+      futures.append(executor.submit(process_project, project_build))
+
+    for future in concurrent.futures.as_completed(futures):
+      project = future.result()
+      update_last_successful_build(project, build_tag)
+      projects.append(project)
+
+  sort_projects(projects)
+  data = {'projects': projects}
+  upload_status(data, status_filename)
+
+
+def update_build_badges(project, last_build_successful,
+                        last_coverage_build_successful):
+  """Upload badges of given project."""
+  badge = 'building'
+  if not last_coverage_build_successful:
+    badge = 'coverage_failing'
+  if not last_build_successful:
+    badge = 'failing'
+
+  print("[badge] {}: {}".format(project, badge))
+
+  for extension in BADGE_IMAGE_TYPES:
+    badge_name = '{badge}.{extension}'.format(badge=badge, extension=extension)
+
+    # Copy blob from badge_images/badge_name to badges/project/
+    blob_name = '{badge_dir}/{badge_name}'.format(badge_dir=BADGE_DIR,
+                                                  badge_name=badge_name)
+
+    destination_blob_name = '{badge_dir}/{project_name}.{extension}'.format(
+        badge_dir=DESTINATION_BADGE_DIR,
+        project_name=project,
+        extension=extension)
+
+    status_bucket = get_storage_client().get_bucket(STATUS_BUCKET)
+    badge_blob = status_bucket.blob(blob_name)
+    status_bucket.copy_blob(badge_blob,
+                            status_bucket,
+                            new_name=destination_blob_name)
+
+
+def upload_log(build_id):
+  """Upload log file to GCS."""
+  status_bucket = get_storage_client().get_bucket(STATUS_BUCKET)
+  gcb_bucket = get_storage_client().get_bucket(build_project.GCB_LOGS_BUCKET)
+  log_name = 'log-{0}.txt'.format(build_id)
+  log = gcb_bucket.blob(log_name)
+  dest_log = status_bucket.blob(log_name)
+
+  if not log.exists():
+    print('Failed to find build log {0}'.format(log_name), file=sys.stderr)
+    return False
+
+  if dest_log.exists():
+    return True
+
+  gcb_bucket.copy_blob(log, status_bucket)
+  return True
+
+
+# pylint: disable=no-member
+def update_status(event, context):
+  """Entry point for cloud function to update build statuses and badges."""
+  del context
+
+  if 'data' in event:
+    status_type = base64.b64decode(event['data']).decode()
+  else:
+    raise RuntimeError('No data')
+
+  if status_type == 'badges':
+    update_badges()
+    return
+
+  if status_type == 'fuzzing':
+    tag = build_project.FUZZING_BUILD_TAG
+    status_filename = FUZZING_STATUS_FILENAME
+  elif status_type == 'coverage':
+    tag = build_and_run_coverage.COVERAGE_BUILD_TAG
+    status_filename = COVERAGE_STATUS_FILENAME
+  else:
+    raise RuntimeError('Invalid build status type ' + status_type)
+
+  with ndb.Client().context():
+    update_build_status(tag, status_filename)
+
+
+def load_status_from_gcs(filename):
+  """Load statuses from bucket."""
+  status_bucket = get_storage_client().get_bucket(STATUS_BUCKET)
+  status = json.loads(status_bucket.blob(filename).download_as_string())
+  result = {}
+
+  for project in status['projects']:
+    if project['history']:
+      result[project['name']] = project['history'][0]['success']
+
+  return result
+
+
+def update_badges():
+  """Update badges."""
+  project_build_statuses = load_status_from_gcs(FUZZING_STATUS_FILENAME)
+  coverage_build_statuses = load_status_from_gcs(COVERAGE_STATUS_FILENAME)
+
+  with concurrent.futures.ThreadPoolExecutor(max_workers=32) as executor:
+    futures = []
+    with ndb.Client().context():
+      for project in Project.query():
+        if (project.name not in project_build_statuses or
+            project.name not in coverage_build_statuses):
+          continue
+
+        futures.append(
+            executor.submit(update_build_badges, project.name,
+                            project_build_statuses[project.name],
+                            coverage_build_statuses[project.name]))
+    concurrent.futures.wait(futures)
diff --git a/infra/build/functions/update_build_status_test.py b/infra/build/functions/update_build_status_test.py
new file mode 100644
index 0000000..b877474
--- /dev/null
+++ b/infra/build/functions/update_build_status_test.py
@@ -0,0 +1,298 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+"""Unit tests for Cloud Function update builds status."""
+import unittest
+from unittest import mock
+from unittest.mock import MagicMock
+
+from google.cloud import ndb
+
+from datastore_entities import BuildsHistory
+from datastore_entities import LastSuccessfulBuild
+import test_utils
+import update_build_status
+
+
+# pylint: disable=too-few-public-methods
+class MockGetBuild:
+  """Spoofing get_builds function."""
+
+  def __init__(self, builds):
+    self.builds = builds
+
+  def get_build(self, cloudbuild, image_project, build_id):
+    """Mimic build object retrieval."""
+    del cloudbuild, image_project
+    for build in self.builds:
+      if build['build_id'] == build_id:
+        return build
+
+    return None
+
+
+@mock.patch('google.auth.default', return_value=['temp', 'temp'])
+@mock.patch('update_build_status.build', return_value='cloudbuild')
+@mock.patch('update_build_status.upload_log')
+class TestGetBuildHistory(unittest.TestCase):
+  """Unit tests for get_build_history."""
+
+  def test_get_build_history(self, mocked_upload_log, mocked_cloud_build,
+                             mocked_google_auth):
+    """Test for get_build_steps."""
+    del mocked_cloud_build, mocked_google_auth
+    mocked_upload_log.return_value = True
+    builds = [{'build_id': '1', 'finishTime': 'test_time', 'status': 'SUCCESS'}]
+    mocked_get_build = MockGetBuild(builds)
+    update_build_status.get_build = mocked_get_build.get_build
+
+    expected_projects = {
+        'history': [{
+            'build_id': '1',
+            'finish_time': 'test_time',
+            'success': True
+        }],
+        'last_successful_build': {
+            'build_id': '1',
+            'finish_time': 'test_time'
+        }
+    }
+    self.assertDictEqual(update_build_status.get_build_history(['1']),
+                         expected_projects)
+
+  def test_get_build_history_missing_log(self, mocked_upload_log,
+                                         mocked_cloud_build,
+                                         mocked_google_auth):
+    """Test for missing build log file."""
+    del mocked_cloud_build, mocked_google_auth
+    builds = [{'build_id': '1', 'finishTime': 'test_time', 'status': 'SUCCESS'}]
+    mocked_get_build = MockGetBuild(builds)
+    update_build_status.get_build = mocked_get_build.get_build
+    mocked_upload_log.return_value = False
+    self.assertRaises(update_build_status.MissingBuildLogError,
+                      update_build_status.get_build_history, ['1'])
+
+  def test_get_build_history_no_last_success(self, mocked_upload_log,
+                                             mocked_cloud_build,
+                                             mocked_google_auth):
+    """Test when there is no last successful build."""
+    del mocked_cloud_build, mocked_google_auth
+    builds = [{'build_id': '1', 'finishTime': 'test_time', 'status': 'FAILURE'}]
+    mocked_get_build = MockGetBuild(builds)
+    update_build_status.get_build = mocked_get_build.get_build
+    mocked_upload_log.return_value = True
+
+    expected_projects = {
+        'history': [{
+            'build_id': '1',
+            'finish_time': 'test_time',
+            'success': False
+        }]
+    }
+    self.assertDictEqual(update_build_status.get_build_history(['1']),
+                         expected_projects)
+
+
+class TestSortProjects(unittest.TestCase):
+  """Unit tests for testing sorting functionality."""
+
+  def test_sort_projects(self):
+    """Test sorting functionality."""
+    projects = [{
+        'name': '1',
+        'history': []
+    }, {
+        'name': '2',
+        'history': [{
+            'success': True
+        }]
+    }, {
+        'name': '3',
+        'history': [{
+            'success': False
+        }]
+    }]
+    expected_order = ['3', '2', '1']
+    update_build_status.sort_projects(projects)
+    self.assertEqual(expected_order, [project['name'] for project in projects])
+
+
+class TestUpdateLastSuccessfulBuild(unittest.TestCase):
+  """Unit tests for updating last successful build."""
+
+  @classmethod
+  def setUpClass(cls):
+    cls.ds_emulator = test_utils.start_datastore_emulator()
+    test_utils.wait_for_emulator_ready(cls.ds_emulator, 'datastore',
+                                       test_utils.DATASTORE_READY_INDICATOR)
+    test_utils.set_gcp_environment()
+
+  def setUp(self):
+    test_utils.reset_ds_emulator()
+
+  def test_update_last_successful_build_new(self):
+    """When last successful build isn't available in datastore."""
+    with ndb.Client().context():
+      project = {
+          'name': 'test-project',
+          'last_successful_build': {
+              'build_id': '1',
+              'finish_time': 'test_time'
+          }
+      }
+      update_build_status.update_last_successful_build(project, 'fuzzing')
+      expected_build_id = '1'
+      self.assertEqual(
+          expected_build_id,
+          ndb.Key(LastSuccessfulBuild, 'test-project-fuzzing').get().build_id)
+
+  def test_update_last_successful_build_datastore(self):
+    """When last successful build is only available in datastore."""
+    with ndb.Client().context():
+      project = {'name': 'test-project'}
+      LastSuccessfulBuild(id='test-project-fuzzing',
+                          build_tag='fuzzing',
+                          project='test-project',
+                          build_id='1',
+                          finish_time='test_time').put()
+
+      update_build_status.update_last_successful_build(project, 'fuzzing')
+      expected_project = {
+          'name': 'test-project',
+          'last_successful_build': {
+              'build_id': '1',
+              'finish_time': 'test_time'
+          }
+      }
+      self.assertDictEqual(project, expected_project)
+
+  def test_update_last_successful_build(self):
+    """When last successful build is available at both places."""
+    with ndb.Client().context():
+      project = {
+          'name': 'test-project',
+          'last_successful_build': {
+              'build_id': '2',
+              'finish_time': 'test_time'
+          }
+      }
+      LastSuccessfulBuild(id='test-project-fuzzing',
+                          build_tag='fuzzing',
+                          project='test-project',
+                          build_id='1',
+                          finish_time='test_time').put()
+
+      update_build_status.update_last_successful_build(project, 'fuzzing')
+      expected_build_id = '2'
+      self.assertEqual(
+          expected_build_id,
+          ndb.Key(LastSuccessfulBuild, 'test-project-fuzzing').get().build_id)
+
+  @classmethod
+  def tearDownClass(cls):
+    test_utils.cleanup_emulator(cls.ds_emulator)
+
+
+class TestUpdateBuildStatus(unittest.TestCase):
+  """Unit test for update build status."""
+
+  @classmethod
+  def setUpClass(cls):
+    cls.ds_emulator = test_utils.start_datastore_emulator()
+    test_utils.wait_for_emulator_ready(cls.ds_emulator, 'datastore',
+                                       test_utils.DATASTORE_READY_INDICATOR)
+    test_utils.set_gcp_environment()
+
+  def setUp(self):
+    test_utils.reset_ds_emulator()
+
+  # pylint: disable=no-self-use
+  @mock.patch('google.auth.default', return_value=['temp', 'temp'])
+  @mock.patch('update_build_status.build', return_value='cloudbuild')
+  @mock.patch('update_build_status.upload_log')
+  def test_update_build_status(self, mocked_upload_log, mocked_cloud_build,
+                               mocked_google_auth):
+    """Testing update build status as a whole."""
+    del self, mocked_cloud_build, mocked_google_auth
+    update_build_status.upload_status = MagicMock()
+    mocked_upload_log.return_value = True
+    status_filename = 'status.json'
+    with ndb.Client().context():
+      BuildsHistory(id='test-project-1-fuzzing',
+                    build_tag='fuzzing',
+                    project='test-project-1',
+                    build_ids=['1']).put()
+
+      BuildsHistory(id='test-project-2-fuzzing',
+                    build_tag='fuzzing',
+                    project='test-project-2',
+                    build_ids=['2']).put()
+
+      BuildsHistory(id='test-project-3-fuzzing',
+                    build_tag='fuzzing',
+                    project='test-project-3',
+                    build_ids=['3']).put()
+
+      builds = [{
+          'build_id': '1',
+          'finishTime': 'test_time',
+          'status': 'SUCCESS'
+      }, {
+          'build_id': '2',
+          'finishTime': 'test_time',
+          'status': 'FAILURE'
+      }, {
+          'build_id': '3',
+          'status': 'WORKING'
+      }]
+      mocked_get_build = MockGetBuild(builds)
+      update_build_status.get_build = mocked_get_build.get_build
+
+      expected_data = {
+          'projects': [{
+              'history': [{
+                  'build_id': '2',
+                  'finish_time': 'test_time',
+                  'success': False
+              }],
+              'name': 'test-project-2'
+          }, {
+              'history': [{
+                  'build_id': '1',
+                  'finish_time': 'test_time',
+                  'success': True
+              }],
+              'last_successful_build': {
+                  'build_id': '1',
+                  'finish_time': 'test_time'
+              },
+              'name': 'test-project-1'
+          }, {
+              'history': [],
+              'name': 'test-project-3'
+          }]
+      }
+
+      update_build_status.update_build_status('fuzzing', 'status.json')
+      update_build_status.upload_status.assert_called_with(
+          expected_data, status_filename)
+
+  @classmethod
+  def tearDownClass(cls):
+    test_utils.cleanup_emulator(cls.ds_emulator)
+
+
+if __name__ == '__main__':
+  unittest.main(exit=False)
diff --git a/infra/build/request_all_builds.sh b/infra/build/request_all_builds.sh
new file mode 100755
index 0000000..1527386
--- /dev/null
+++ b/infra/build/request_all_builds.sh
@@ -0,0 +1,24 @@
+#!/bin/bash -ex
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+for project in ../../projects/*; do
+  if [[ ! -f $project/Dockerfile ]]; then
+    continue
+  fi
+
+  ./request_build.sh $(basename $project) $1
+done
diff --git a/infra/build/request_build.sh b/infra/build/request_build.sh
new file mode 100755
index 0000000..36a9cb4
--- /dev/null
+++ b/infra/build/request_build.sh
@@ -0,0 +1,27 @@
+#!/bin/bash -ex
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+if [ "$2" = "fuzzing" ]; then
+  topic=request-build
+elif [ "$2" = "coverage" ]; then
+  topic=request-coverage-build
+else
+  echo "Invalid build type $2."
+  exit 1
+fi
+
+gcloud pubsub topics publish $topic --message "$1" --project oss-fuzz
diff --git a/infra/gcb/templates/bower.json b/infra/build/status/bower.json
similarity index 100%
rename from infra/gcb/templates/bower.json
rename to infra/build/status/bower.json
diff --git a/infra/build/status/deploy.sh b/infra/build/status/deploy.sh
new file mode 100755
index 0000000..060eba9
--- /dev/null
+++ b/infra/build/status/deploy.sh
@@ -0,0 +1,18 @@
+#!/bin/bash -ex
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+gsutil -h "Cache-Control:no-cache,max-age=0" -m cp -r bower_components index.html src manifest.json gs://oss-fuzz-build-logs
diff --git a/infra/build/status/index.html b/infra/build/status/index.html
new file mode 100644
index 0000000..25a3d8e
--- /dev/null
+++ b/infra/build/status/index.html
@@ -0,0 +1,39 @@
+<!-- Copyright 2020 Google Inc.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+     http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
+<!doctype html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
+    <title>OSS-Fuzz build status</title>
+    <meta name="description" content="OSS-Fuzz build status">
+
+    <!-- See https://goo.gl/OOhYW5 -->
+    <link rel="manifest" href="/manifest.json">
+
+    <script src="/bower_components/webcomponentsjs/webcomponents-loader.js"></script>
+
+
+    <link rel="import" href="/src/build-status/build-status.html">
+
+    <style>
+      body {
+        font-family: 'Roboto', 'Noto', sans-serif;
+        background: #f1f1f1;
+        margin: 0;
+      }
+    </style>
+  </head>
+  <body>
+    <build-status></build-status>
+  </body>
+</html>
diff --git a/infra/gcb/templates/manifest.json b/infra/build/status/manifest.json
similarity index 100%
rename from infra/gcb/templates/manifest.json
rename to infra/build/status/manifest.json
diff --git a/infra/gcb/templates/polymer.json b/infra/build/status/polymer.json
similarity index 100%
rename from infra/gcb/templates/polymer.json
rename to infra/build/status/polymer.json
diff --git a/infra/build/status/src/build-status/build-status.html b/infra/build/status/src/build-status/build-status.html
new file mode 100644
index 0000000..1170e57
--- /dev/null
+++ b/infra/build/status/src/build-status/build-status.html
@@ -0,0 +1,355 @@
+<!-- Copyright 2020 Google Inc.
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+     http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. -->
+
+<link rel="import" href="../../bower_components/polymer/polymer-element.html">
+<link rel="import" href="../../bower_components/app-layout/app-drawer-layout/app-drawer-layout.html">
+<link rel="import" href="../../bower_components/app-layout/app-drawer/app-drawer.html">
+<link rel="import" href="../../bower_components/app-layout/app-scroll-effects/app-scroll-effects.html">
+<link rel="import" href="../../bower_components/app-layout/app-header/app-header.html">
+<link rel="import" href="../../bower_components/app-layout/app-header-layout/app-header-layout.html">
+<link rel="import" href="../../bower_components/app-layout/app-toolbar/app-toolbar.html">
+<link rel="import" href="../../bower_components/paper-item/paper-item.html">
+<link rel="import" href="../../bower_components/paper-item/paper-item-body.html">
+<link rel="import" href="../../bower_components/paper-button/paper-button.html">
+<link rel="import" href="../../bower_components/paper-card/paper-card.html">
+<link rel="import" href="../../bower_components/paper-tabs/paper-tabs.html">
+<link rel="import" href="../../bower_components/paper-icon-button/paper-icon-button.html">
+<link rel="import" href="../../bower_components/iron-icons/iron-icons.html">
+<link rel="import" href="../../bower_components/iron-ajax/iron-ajax.html">
+<link rel="import" href="../../bower_components/iron-flex-layout/iron-flex-layout-classes.html">
+<link rel="import" href="../../bower_components/polymer/lib/elements/dom-if.html">
+<link rel="import" href="../../bower_components/polymer/lib/elements/dom-repeat.html">
+<link rel="import" href="../../bower_components/app-route/app-location.html">
+<link rel="import" href="../../bower_components/app-route/app-route.html">
+
+<dom-module id="build-status">
+  <template>
+    <app-location route="{{route}}" use-hash-as-path></app-location>
+    <app-route route="{{route}}"
+      pattern=":project_name"
+      data="{{routeData}}">
+    </app-route>
+    <style is="custom-style" include="iron-flex iron-flex-alignment">
+    <style>
+      .paper-item-link {
+        color: inherit;
+        text-decoration: none;
+      }
+
+      a {
+        text-decoration: none;
+      }
+
+      app-header {
+        background-color: #2ba4ad;
+        color: #fff;
+      }
+
+      paper-button {
+        font-weight: normal;
+        font-size: 14px;
+        -webkit-font-smoothing: antialiased;
+      }
+
+      paper-button.green:hover {
+        background-color: var(--paper-green-400);
+      }
+
+      paper-button.green {
+        background-color: var(--paper-green-500);
+        color: white;
+      }
+
+      paper-card {
+        margin: 0.5em;
+      }
+
+      paper-item {
+        cursor: pointer;
+      }
+
+      paper-tabs {
+        -webkit-font-smoothing: antialiased;
+        width: 100%;
+        margin-bottom: 1px;
+        height: 40px;
+      }
+
+      :host {
+        display: block;
+      }
+
+      .icon-error {
+        color: #e83030;
+        margin-right: 0.2em;
+      }
+
+      .icon-success {
+        color: var(--paper-green-500);
+        margin-right: 0.2em;
+      }
+
+      .icon-waiting {
+        color: var(--paper-yellow-500);
+        margin-right: 0.2em;
+      }
+
+      .projects {
+        min-width: 10em;
+      }
+
+      .log {
+        width: 80%;
+        display: inline;
+      }
+
+      .buildHistory {
+        margin: 20px 0;
+      }
+
+      pre {
+        white-space: pre-wrap;
+      }
+    </style>
+    <app-header reveals>
+      <app-toolbar>
+        <div main-title>OSS-Fuzz build status</div>
+        <div><small>(Updated every 30 minutes)</small></div>
+      </app-toolbar>
+    </app-header>
+    <div class="layout horizontal">
+      <paper-card class="projects">
+        <div class="card-tabs">
+          <paper-tabs selected="fuzzing" id="build_type" attr-for-selected="type" on-click="onChanged">
+            <paper-tab type="fuzzing">Fuzzing Builds</paper-tab>
+            <paper-tab type="coverage">Coverage Builds</paper-tab>
+          </paper-tabs>
+        </div>
+        <div class="card-content">
+          <template is="dom-repeat" items="[[status.projects]]" as="project">
+            <paper-item on-tap="onTap">
+              <paper-item-body two-line>
+                <div>
+                  <template is="dom-if" if="[[!isSuccessful(project)]]">
+                    <iron-icon class="icon-error" icon="icons:error"></iron-icon>
+                  </template>
+                  <template is="dom-if" if="[[!project.history.length]]">
+                    <iron-icon class="icon-waiting" icon="icons:error"></iron-icon>
+                  </template>
+                  [[project.name]]
+                </div>
+                <template is="dom-if" if="[[project.history.length]]">
+                 <div secondary title$="Last built [[toLocalDate(project.finish_time)]]">
+                    Last built [[toLocalDate(project.history.0.finish_time)]]
+                 </div>
+                </template>
+                <template is="dom-if" if="[[!project.history.length]]">
+                  <div secondary title$="Not built yet">
+                    Not built yet
+                  </div>
+                </template>
+              </paper-item-body>
+            </paper-item>
+          </template>
+        </div>
+      </paper-card>
+      <paper-card class="log">
+        <div class="card-content">
+          <template is="dom-if" if="[[!project]]">
+            Select a project to see logs.
+          </template>
+          <template is="dom-if" if="[[build_history.length]]">
+            Last Successful build:
+            <template is="dom-if" if="[[last_successful_build]]">
+              <paper-button raised on-click="onLastBuildSuccessful" class="green">
+                [[getLocalDate(last_successful_build.finish_time)]]
+              </paper-button>
+            </template>
+            <template is="dom-if" if="[[!last_successful_build]]">
+              None yet.
+            </template>
+              <div class="buildHistory">
+                Build History: <br>
+                <template is="dom-repeat" items="[[build_history]]" as="history">
+                  <paper-button raised on-click="onBuildHistory">
+                    <template is="dom-if" if="[[history.success]]">
+                      <iron-icon class="icon-success" icon="icons:done"></iron-icon>
+                    </template>
+                    <template is="dom-if" if="[[!history.success]]">
+                      <iron-icon class="icon-error" icon="icons:error"></iron-icon>
+                    </template>
+                    [[getLocalDate(history.finish_time)]]
+                  </paper-button>
+                </template>
+              </div>
+              <template is="dom-if" if=[[!finish_time]]>
+              <pre>Select a build to see logs.</pre>
+            </template>
+              <template is="dom-if" if="[[finish_time]]">
+                <a href="/log-[[build_id]].txt" target="_blank" tabindex="-1">
+                  <paper-button raised>
+                    Open in new tab
+                    <iron-icon icon="icons:link"></iron-iron>
+                  </paper-button>
+                </a>
+                <pre>Finish Time : [[finish_time]]</pre>
+              </template>
+          </template>
+          <template is="dom-if" if="[[loading_log]]">
+            Loading...
+          </template>
+          <pre>[[log]]</pre>
+        </div>
+      </paper-card>
+    </div>
+      <iron-ajax id="status_fuzzing" auto handle-as="json" url="/status.json" on-response="onResponseForFuzzing"></iron-ajax>
+      <iron-ajax id="status_coverage" auto handle-as="json" url="/status-coverage.json" on-response="onResponseForCoverage"></iron-ajax>
+    <iron-ajax id="logxhr" handle-as="text" on-response="onLogResponse"></iron-ajax>
+  </template>
+
+  <script>
+    /** @polymerElement */
+    class BuildStatus extends Polymer.Element {
+      static get is() {
+        return "build-status";
+      }
+      static get properties() {
+        return {
+          log: {
+            type: String,
+            value: '',
+          },
+          loading_log: {
+            type: Boolean,
+            value: false,
+          },
+          finish_time: {
+            type: String,
+            value: '',
+          }
+        }
+      }
+      static get observers() {
+        return ["_routeChanged(route.*)"]
+      }
+
+      _routeChanged() {
+        if(!this.routeData.project_name)
+          this.project = "";
+        if (!this.status || !this.routeData.project_name) {
+          // If our status json is loaded and there is a project_name specified
+          // in the URL, we can proceed to load that project's log.
+          return
+        }
+        this.project = this.getProjectByName(this.routeData.project_name);
+        this.build_history = this.project.history;
+        if (this.project['last_successful_build']){
+          this.last_successful_build = this.project.last_successful_build;
+        } else{
+          this.last_successful_build = "";
+        }
+        this.log = "";
+        this.finish_time = "";
+      }
+
+      getProjectByName(project_name) {
+        return this.status.projects.find(
+          p => p.name === project_name
+        );
+      }
+
+      onResponseForFuzzing(e) {
+        this.status_fuzzing = e.detail.response;
+        if (!this.status) {
+          // Show status of the fuzzing builds by default.
+          this.status = this.status_fuzzing;
+          // Manually invoke a _routeChanged call, in order to load the log for
+          // someone going directly to a project's URL.
+          this._routeChanged();
+        }
+      }
+
+      onResponseForCoverage(e) {
+        this.status_coverage = e.detail.response;
+      }
+
+      onLogResponse(e) {
+        this.log = e.detail.response;
+        this.loading_log = false;
+      }
+
+      onTap(e) {
+        // Change the route, this should auto-magically update the url in the
+        // browser and invoke the _routeChanged method.
+        this.set("route.path", e.model.project.name);
+      }
+
+      onChanged(e) {
+        if (this.$.build_type.selected == "coverage") {
+          this.status = this.status_coverage;
+        } else {
+          this.status = this.status_fuzzing;
+        }
+      }
+
+      requestLog() {
+        var ajax = this.$.logxhr;
+        ajax.url = "/log-" + this.build_id + ".txt";
+        ajax.generateRequest();
+        this.loading_log = true;
+        this.log = "";
+        this.finish_time = this.toLocalDate(this.finish_time);
+      }
+
+      onLastBuildSuccessful(e) {
+        this.build_id = this.last_successful_build.build_id
+        this.finish_time = this.last_successful_build.finish_time
+        this.requestLog()
+      }
+
+      onBuildHistory(e) {
+        this.build_id = e.model.history.build_id
+        this.finish_time = e.model.history.finish_time
+        this.requestLog()
+      }
+
+      showLog(log) {
+        return log !== "";
+      }
+
+      showTabs() {
+        return this.tab_count !== 0;
+      }
+
+      toLocalDate(str) {
+        let date = new Date(str);
+        let ds = date.toString();
+        let timezone = ds.substring(ds.indexOf("("));
+        return date.toLocaleString() + " " + timezone;
+      }
+
+      pad(n) {
+        return n<10 ? '0'+n : n;
+      }
+
+      getLocalDate(str) {
+        let date = new Date(str);
+        return date.toLocaleString()
+      }
+
+      isSuccessful(project) {
+        return (!project.history.length || project.history[0].success)
+      }
+    }
+
+    window.customElements.define(BuildStatus.is, BuildStatus)
+  </script>
+</dom-module>
diff --git a/infra/build_specified_commit.py b/infra/build_specified_commit.py
index 72c3bad..eef671b 100644
--- a/infra/build_specified_commit.py
+++ b/infra/build_specified_commit.py
@@ -17,12 +17,17 @@
 from a specific point in time. This feature can be used for implementations
 like continuious integration fuzzing and bisection to find errors
 """
+import argparse
 import bisect
+import datetime
+from distutils import spawn
 import os
 import collections
+import json
 import logging
 import re
 import shutil
+import tempfile
 import time
 
 import helper
@@ -152,6 +157,34 @@
   return result
 
 
+def get_required_post_checkout_steps(dockerfile_path):
+  """Get required post checkout steps (best effort)."""
+
+  checkout_pattern = re.compile(r'\s*RUN\s*(git|svn|hg)')
+
+  # If the build.sh is copied from upstream, we need to copy it again after
+  # changing the revision to ensure correct building.
+  post_run_pattern = re.compile(r'\s*RUN\s*(.*build\.sh.*(\$SRC|/src).*)')
+
+  with open(dockerfile_path) as handle:
+    lines = handle.readlines()
+
+  subsequent_run_cmds = []
+  for i, line in enumerate(lines):
+    if checkout_pattern.match(line):
+      subsequent_run_cmds = []
+      continue
+
+    match = post_run_pattern.match(line)
+    if match:
+      workdir = helper.workdir_from_lines(lines[:i])
+      command = match.group(1)
+      subsequent_run_cmds.append((workdir, command))
+
+  return subsequent_run_cmds
+
+
+# pylint: disable=too-many-locals
 def build_fuzzers_from_commit(commit,
                               build_repo_manager,
                               host_src_path,
@@ -175,8 +208,27 @@
     copy_src_from_docker(build_data.project_name,
                          os.path.dirname(host_src_path))
 
+  projects_dir = os.path.join('projects', build_data.project_name)
+  dockerfile_path = os.path.join(projects_dir, 'Dockerfile')
+
   for i in range(num_retry + 1):
     build_repo_manager.checkout_commit(commit, clean=False)
+
+    post_checkout_steps = get_required_post_checkout_steps(dockerfile_path)
+    for workdir, post_checkout_step in post_checkout_steps:
+      logging.info('Running post-checkout step `%s` in %s.', post_checkout_step,
+                   workdir)
+      helper.docker_run([
+          '-w',
+          workdir,
+          '-v',
+          host_src_path + ':' + '/src',
+          'gcr.io/oss-fuzz/' + build_data.project_name,
+          '/bin/bash',
+          '-c',
+          post_checkout_step,
+      ])
+
     result = helper.build_fuzzers_impl(project_name=build_data.project_name,
                                        clean=True,
                                        engine=build_data.engine,
@@ -191,7 +243,6 @@
     # Retry with an OSS-Fuzz builder container that's closer to the project
     # commit date.
     commit_date = build_repo_manager.commit_date(commit)
-    projects_dir = os.path.join('projects', build_data.project_name)
 
     # Find first change in the projects/<PROJECT> directory before the project
     # commit date.
@@ -216,8 +267,7 @@
     if base_builder_repo:
       base_builder_digest = base_builder_repo.find_digest(commit_date)
       logging.info('Using base-builder with digest %s.', base_builder_digest)
-      _replace_base_builder_digest(os.path.join(projects_dir, 'Dockerfile'),
-                                   base_builder_digest)
+      _replace_base_builder_digest(dockerfile_path, base_builder_digest)
 
     # Rebuild image and re-copy src dir since things in /src could have changed.
     if not _build_image_with_retries(build_data.project_name):
@@ -273,3 +323,80 @@
 
   logging.error('Failed to detect repo:\n%s', out)
   return None, None
+
+
+def load_base_builder_repo():
+  """Get base-image digests."""
+  gcloud_path = spawn.find_executable('gcloud')
+  if not gcloud_path:
+    logging.warning('gcloud not found in PATH.')
+    return None
+
+  result, _, _ = utils.execute([
+      gcloud_path,
+      'container',
+      'images',
+      'list-tags',
+      'gcr.io/oss-fuzz-base/base-builder',
+      '--format=json',
+      '--sort-by=timestamp',
+  ],
+                               check_result=True)
+  result = json.loads(result)
+
+  repo = BaseBuilderRepo()
+  for image in result:
+    timestamp = datetime.datetime.fromisoformat(
+        image['timestamp']['datetime']).astimezone(datetime.timezone.utc)
+    repo.add_digest(timestamp, image['digest'])
+
+  return repo
+
+
+def main():
+  """Main function."""
+  logging.getLogger().setLevel(logging.INFO)
+
+  parser = argparse.ArgumentParser(
+      description='Build fuzzers at a specific commit')
+  parser.add_argument('--project_name',
+                      help='The name of the project where the bug occurred.',
+                      required=True)
+  parser.add_argument('--commit',
+                      help='The newest commit SHA to be bisected.',
+                      required=True)
+  parser.add_argument('--engine',
+                      help='The default is "libfuzzer".',
+                      default='libfuzzer')
+  parser.add_argument('--sanitizer',
+                      default='address',
+                      help='The default is "address".')
+  parser.add_argument('--architecture', default='x86_64')
+
+  args = parser.parse_args()
+
+  repo_url, repo_path = detect_main_repo(args.project_name, commit=args.commit)
+
+  if not repo_url or not repo_path:
+    raise ValueError('Main git repo can not be determined.')
+
+  with tempfile.TemporaryDirectory() as tmp_dir:
+    host_src_dir = copy_src_from_docker(args.project_name, tmp_dir)
+    build_repo_manager = repo_manager.BaseRepoManager(
+        os.path.join(host_src_dir, os.path.basename(repo_path)))
+    base_builder_repo = load_base_builder_repo()
+
+    build_data = BuildData(project_name=args.project_name,
+                           engine=args.engine,
+                           sanitizer=args.sanitizer,
+                           architecture=args.architecture)
+    if not build_fuzzers_from_commit(args.commit,
+                                     build_repo_manager,
+                                     host_src_dir,
+                                     build_data,
+                                     base_builder_repo=base_builder_repo):
+      raise RuntimeError('Failed to build.')
+
+
+if __name__ == '__main__':
+  main()
diff --git a/infra/travis/travis_build.py b/infra/ci/build.py
similarity index 77%
rename from infra/travis/travis_build.py
rename to infra/ci/build.py
index f62b127..15dd4fb 100755
--- a/infra/travis/travis_build.py
+++ b/infra/ci/build.py
@@ -28,14 +28,15 @@
 DEFAULT_ENGINES = ['afl', 'honggfuzz', 'libfuzzer']
 DEFAULT_SANITIZERS = ['address', 'undefined']
 
+# Languages from project.yaml that have code coverage support.
+LANGUAGES_WITH_COVERAGE_SUPPORT = ['c', 'c++']
+
 
 def get_modified_buildable_projects():
   """Returns a list of all the projects modified in this commit that have a
   build.sh file."""
-  master_head_sha = subprocess.check_output(
-      ['git', 'merge-base', 'HEAD', 'FETCH_HEAD']).decode().strip()
-  output = subprocess.check_output(
-      ['git', 'diff', '--name-only', 'HEAD', master_head_sha]).decode()
+  output = subprocess.check_output(['git', 'diff', '--name-only',
+                                    'FETCH_HEAD']).decode()
   projects_regex = '.*projects/(?P<name>.*)/.*\n'
   modified_projects = set(re.findall(projects_regex, output))
   projects_dir = os.path.join(get_oss_fuzz_root(), 'projects')
@@ -87,22 +88,21 @@
 
 
 def should_build(project_yaml):
-  """Is the build specified by travis enabled in the |project_yaml|?"""
+  """Return bool on if the build specified is enabled in the project.yaml."""
 
   def is_enabled(env_var, yaml_name, defaults):
     """Is the value of |env_var| enabled in |project_yaml| (in the |yaml_name|
     section)? Uses |defaults| if |yaml_name| section is unspecified."""
     return os.getenv(env_var) in project_yaml.get(yaml_name, defaults)
 
-  return (is_enabled('TRAVIS_ENGINE', 'fuzzing_engines', DEFAULT_ENGINES) and
-          is_enabled('TRAVIS_SANITIZER', 'sanitizers', DEFAULT_SANITIZERS) and
-          is_enabled('TRAVIS_ARCHITECTURE', 'architectures',
-                     DEFAULT_ARCHITECTURES))
+  return (is_enabled('ENGINE', 'fuzzing_engines', DEFAULT_ENGINES) and
+          is_enabled('SANITIZER', 'sanitizers', DEFAULT_SANITIZERS) and
+          is_enabled('ARCHITECTURE', 'architectures', DEFAULT_ARCHITECTURES))
 
 
 def build_project(project):
-  """Do the build of |project| that is specified by the TRAVIS_* environment
-  variables (TRAVIS_SANITIZER, TRAVIS_ENGINE, and TRAVIS_ARCHITECTURE)."""
+  """Do the build of |project| that is specified by the environment variables -
+  SANITIZER, ENGINE, and ARCHITECTURE."""
   root = get_oss_fuzz_root()
   project_yaml_path = os.path.join(root, 'projects', project, 'project.yaml')
   with open(project_yaml_path) as file_handle:
@@ -112,11 +112,19 @@
     print('Project {0} is disabled, skipping build.'.format(project))
     return
 
-  engine = os.getenv('TRAVIS_ENGINE')
-  sanitizer = os.getenv('TRAVIS_SANITIZER')
-  architecture = os.getenv('TRAVIS_ARCHITECTURE')
+  engine = os.getenv('ENGINE')
+  sanitizer = os.getenv('SANITIZER')
+  architecture = os.getenv('ARCHITECTURE')
+  language = project_yaml.get('language')
 
-  if not should_build(project_yaml):
+  if (sanitizer == 'coverage' and
+      language not in LANGUAGES_WITH_COVERAGE_SUPPORT):
+    print(('Project "{project}" is written in "{language}", '
+           'coverage is not supported yet.').format(project=project,
+                                                    language=language))
+    return
+
+  if sanitizer != 'coverage' and not should_build(project_yaml):
     print(('Specified build: engine: {0}, sanitizer: {1}, architecture: {2} '
            'not enabled for this project: {3}. skipping build.').format(
                engine, sanitizer, architecture, project))
@@ -126,12 +134,12 @@
   print('Building project', project)
   build_fuzzers(project, engine, sanitizer, architecture)
 
-  if engine != 'none':
+  if engine != 'none' and sanitizer != 'coverage':
     check_build(project, engine, sanitizer, architecture)
 
 
 def main():
-  """Build modified projects on travis."""
+  """Build modified projects."""
   projects = get_modified_buildable_projects()
   failed_projects = []
   for project in projects:
diff --git a/infra/travis/requirements.txt b/infra/ci/requirements.txt
similarity index 63%
rename from infra/travis/requirements.txt
rename to infra/ci/requirements.txt
index 2ddcb47..2a21c2a 100644
--- a/infra/travis/requirements.txt
+++ b/infra/ci/requirements.txt
@@ -1,6 +1,6 @@
 # Requirements for submitting code changes to infra/ (needed by presubmit.py).
-pylint==2.4.4
-yapf==0.28.0
-PyYAML==5.1
-pyfakefs==3.7.1
 parameterized==0.7.4
+pyfakefs==4.1.0
+pylint==2.5.3
+PyYAML==5.3.1
+yapf==0.30.0
diff --git a/infra/cifuzz/actions/build_fuzzers/action.yml b/infra/cifuzz/actions/build_fuzzers/action.yml
index 4c19018..534f715 100644
--- a/infra/cifuzz/actions/build_fuzzers/action.yml
+++ b/infra/cifuzz/actions/build_fuzzers/action.yml
@@ -11,6 +11,9 @@
   allowed-broken-targets-percentage:
     description: 'The percentage of broken targets allowed in bad_build_check.'
     required: false
+  sanitizer:
+    description: 'The sanitizer to build the fuzzers with.'
+    default: 'address'
 runs:
   using: 'docker'
   image: 'Dockerfile'
@@ -18,3 +21,4 @@
     OSS_FUZZ_PROJECT_NAME: ${{ inputs.oss-fuzz-project-name }}
     DRY_RUN: ${{ inputs.dry-run}}
     ALLOWED_BROKEN_TARGETS_PERCENTAGE: ${{ inputs.allowed-broken-targets-percentage}}
+    SANITIZER: ${{ inputs.sanitizer }}
diff --git a/infra/cifuzz/actions/build_fuzzers/build_fuzzers_entrypoint.py b/infra/cifuzz/actions/build_fuzzers/build_fuzzers_entrypoint.py
index c203068..f46e639 100644
--- a/infra/cifuzz/actions/build_fuzzers/build_fuzzers_entrypoint.py
+++ b/infra/cifuzz/actions/build_fuzzers/build_fuzzers_entrypoint.py
@@ -46,6 +46,8 @@
       The path to the file containing the POST payload of the webhook:
       https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners#filesystems-on-github-hosted-runners
     GITHUB_WORKSPACE: The shared volume directory where input artifacts are.
+    DRY_RUN: If true, no failures will surface.
+    SANITIZER: The sanitizer to use when running fuzzers.
 
   Returns:
     0 on success or 1 on Failure.
@@ -55,6 +57,7 @@
   commit_sha = os.environ.get('GITHUB_SHA')
   event = os.environ.get('GITHUB_EVENT_NAME')
   workspace = os.environ.get('GITHUB_WORKSPACE')
+  sanitizer = os.environ.get('SANITIZER').lower()
 
   # Check if failures should not be reported.
   dry_run = (os.environ.get('DRY_RUN').lower() == 'true')
@@ -69,25 +72,33 @@
     logging.error('This script needs to be run in the Github action context.')
     return returncode
 
-  if event == 'push' and not cifuzz.build_fuzzers(
-      oss_fuzz_project_name, github_repo_name, workspace,
-      commit_sha=commit_sha):
+  if event == 'push' and not cifuzz.build_fuzzers(oss_fuzz_project_name,
+                                                  github_repo_name,
+                                                  workspace,
+                                                  commit_sha=commit_sha,
+                                                  sanitizer=sanitizer):
     logging.error('Error building fuzzers for project %s with commit %s.',
                   oss_fuzz_project_name, commit_sha)
     return returncode
+
   if event == 'pull_request':
     with open(os.environ.get('GITHUB_EVENT_PATH'), encoding='utf-8') as file:
       event = json.load(file)
       pr_ref = 'refs/pull/{0}/merge'.format(event['pull_request']['number'])
-      if not cifuzz.build_fuzzers(
-          oss_fuzz_project_name, github_repo_name, workspace, pr_ref=pr_ref):
+      if not cifuzz.build_fuzzers(oss_fuzz_project_name,
+                                  github_repo_name,
+                                  workspace,
+                                  pr_ref=pr_ref,
+                                  sanitizer=sanitizer):
         logging.error(
             'Error building fuzzers for project %s with pull request %s.',
             oss_fuzz_project_name, pr_ref)
         return returncode
+
   out_dir = os.path.join(workspace, 'out')
-  if cifuzz.check_fuzzer_build(out_dir):
-    return 0
+  if cifuzz.check_fuzzer_build(out_dir, sanitizer=sanitizer):
+    returncode = 0
+
   return returncode
 
 
diff --git a/infra/cifuzz/actions/run_fuzzers/action.yml b/infra/cifuzz/actions/run_fuzzers/action.yml
index ca40c4f..3ce951d 100644
--- a/infra/cifuzz/actions/run_fuzzers/action.yml
+++ b/infra/cifuzz/actions/run_fuzzers/action.yml
@@ -12,6 +12,9 @@
   dry-run:
     description: 'If set, run the action without actually reporting a failure.'
     default: false
+  sanitizer:
+    description: 'The sanitizer to run the fuzzers with.'
+    default: 'address'
 runs:
   using: 'docker'
   image: 'Dockerfile'
@@ -19,3 +22,4 @@
     OSS_FUZZ_PROJECT_NAME: ${{ inputs.oss-fuzz-project-name }}
     FUZZ_SECONDS: ${{ inputs.fuzz-seconds }}
     DRY_RUN: ${{ inputs.dry-run}}
+    SANITIZER: ${{ inputs.sanitizer }}
diff --git a/infra/cifuzz/actions/run_fuzzers/run_fuzzers_entrypoint.py b/infra/cifuzz/actions/run_fuzzers/run_fuzzers_entrypoint.py
index 4d80e5e..7f39388 100644
--- a/infra/cifuzz/actions/run_fuzzers/run_fuzzers_entrypoint.py
+++ b/infra/cifuzz/actions/run_fuzzers/run_fuzzers_entrypoint.py
@@ -47,6 +47,7 @@
     GITHUB_WORKSPACE: The shared volume directory where input artifacts are.
     DRY_RUN: If true, no failures will surface.
     OSS_FUZZ_PROJECT_NAME: The name of the relevant OSS-Fuzz project.
+    SANITIZER: The sanitizer to use when running fuzzers.
 
   Returns:
     0 on success or 1 on Failure.
@@ -54,6 +55,8 @@
   fuzz_seconds = int(os.environ.get('FUZZ_SECONDS', 600))
   workspace = os.environ.get('GITHUB_WORKSPACE')
   oss_fuzz_project_name = os.environ.get('OSS_FUZZ_PROJECT_NAME')
+  sanitizer = os.environ.get('SANITIZER').lower()
+
   # Check if failures should not be reported.
   dry_run = (os.environ.get('DRY_RUN').lower() == 'true')
 
@@ -74,8 +77,10 @@
     logging.error('This script needs to be run in the Github action context.')
     return returncode
   # Run the specified project's fuzzers from the build.
-  run_status, bug_found = cifuzz.run_fuzzers(fuzz_seconds, workspace,
-                                             oss_fuzz_project_name)
+  run_status, bug_found = cifuzz.run_fuzzers(fuzz_seconds,
+                                             workspace,
+                                             oss_fuzz_project_name,
+                                             sanitizer=sanitizer)
   if not run_status:
     logging.error('Error occured while running in workspace %s.', workspace)
     return returncode
diff --git a/infra/cifuzz/cifuzz-base/Dockerfile b/infra/cifuzz/cifuzz-base/Dockerfile
index ecb889a..3d887b4 100644
--- a/infra/cifuzz/cifuzz-base/Dockerfile
+++ b/infra/cifuzz/cifuzz-base/Dockerfile
@@ -34,4 +34,4 @@
 RUN apt-get update && apt-get install docker-ce docker-ce-cli containerd.io -y
 
 ENV OSS_FUZZ_ROOT=/opt/oss-fuzz
-RUN git clone https://github.com/google/oss-fuzz.git ${OSS_FUZZ_ROOT}
+ADD . ${OSS_FUZZ_ROOT}
diff --git a/infra/cifuzz/cifuzz.py b/infra/cifuzz/cifuzz.py
index 2733dd1..e20dc45 100644
--- a/infra/cifuzz/cifuzz.py
+++ b/infra/cifuzz/cifuzz.py
@@ -68,7 +68,6 @@
 
 #  Default fuzz configuration.
 DEFAULT_ENGINE = 'libfuzzer'
-DEFAULT_SANITIZER = 'address'
 DEFAULT_ARCHITECTURE = 'x86_64'
 
 # The path to get project's latest report json files.
@@ -80,11 +79,28 @@
     level=logging.DEBUG)
 
 
+def checkout_specified_commit(build_repo_manager, pr_ref, commit_sha):
+  """Checks out the specified commit or pull request using
+  build_repo_manager."""
+  try:
+    if pr_ref:
+      build_repo_manager.checkout_pr(pr_ref)
+    else:
+      build_repo_manager.checkout_commit(commit_sha)
+  except (RuntimeError, ValueError):
+    logging.error(
+        'Can not check out requested state %s. '
+        'Using current repo state', pr_ref or commit_sha)
+
+
+# pylint: disable=too-many-arguments
+# pylint: disable=too-many-locals
 def build_fuzzers(project_name,
                   project_repo_name,
                   workspace,
                   pr_ref=None,
-                  commit_sha=None):
+                  commit_sha=None,
+                  sanitizer='address'):
   """Builds all of the fuzzers for a specific OSS-Fuzz project.
 
   Args:
@@ -94,6 +110,7 @@
       artifacts.
     pr_ref: The pull request reference to be built.
     commit_sha: The commit sha for the project to be built at.
+    sanitizer: The sanitizer the fuzzers should be built with.
 
   Returns:
     True if build succeeded or False on failure.
@@ -104,44 +121,49 @@
     logging.error('Invalid workspace: %s.', workspace)
     return False
 
-  git_workspace = os.path.join(workspace, 'storage')
-  os.makedirs(git_workspace, exist_ok=True)
+  logging.info("Using %s sanitizer.", sanitizer)
+
   out_dir = os.path.join(workspace, 'out')
   os.makedirs(out_dir, exist_ok=True)
 
-  # Detect repo information.
-  inferred_url, oss_fuzz_repo_path = build_specified_commit.detect_main_repo(
-      project_name, repo_name=project_repo_name)
-  if not inferred_url or not oss_fuzz_repo_path:
+  # Build Fuzzers using docker run.
+  inferred_url, project_builder_repo_path = (
+      build_specified_commit.detect_main_repo(project_name,
+                                              repo_name=project_repo_name))
+  if not inferred_url or not project_builder_repo_path:
     logging.error('Could not detect repo from project %s.', project_name)
     return False
-  src_in_docker = os.path.dirname(oss_fuzz_repo_path)
-  oss_fuzz_repo_name = os.path.basename(oss_fuzz_repo_path)
+  project_repo_name = os.path.basename(project_builder_repo_path)
+  src_in_project_builder = os.path.dirname(project_builder_repo_path)
+
+  manual_src_path = os.getenv('MANUAL_SRC_PATH')
+  if manual_src_path:
+    if not os.path.exists(manual_src_path):
+      logging.error(
+          'MANUAL_SRC_PATH: %s does not exist. '
+          'Are you mounting it correctly?', manual_src_path)
+      return False
+    # This is the path taken outside of GitHub actions.
+    git_workspace = os.path.dirname(manual_src_path)
+  else:
+    git_workspace = os.path.join(workspace, 'storage')
+    os.makedirs(git_workspace, exist_ok=True)
 
   # Checkout projects repo in the shared volume.
   build_repo_manager = repo_manager.RepoManager(inferred_url,
                                                 git_workspace,
-                                                repo_name=oss_fuzz_repo_name)
-  try:
-    if pr_ref:
-      build_repo_manager.checkout_pr(pr_ref)
-    else:
-      build_repo_manager.checkout_commit(commit_sha)
-  except RuntimeError:
-    logging.error('Can not check out requested state.')
-    return False
-  except ValueError:
-    logging.error('Invalid commit SHA requested %s.', commit_sha)
-    return False
+                                                repo_name=project_repo_name)
 
-  # Build Fuzzers using docker run.
+  if not manual_src_path:
+    checkout_specified_commit(build_repo_manager, pr_ref, commit_sha)
+
   command = [
       '--cap-add',
       'SYS_PTRACE',
       '-e',
       'FUZZING_ENGINE=' + DEFAULT_ENGINE,
       '-e',
-      'SANITIZER=' + DEFAULT_SANITIZER,
+      'SANITIZER=' + sanitizer,
       '-e',
       'ARCHITECTURE=' + DEFAULT_ARCHITECTURE,
       '-e',
@@ -151,13 +173,14 @@
   if container:
     command += ['-e', 'OUT=' + out_dir, '--volumes-from', container]
     bash_command = 'rm -rf {0} && cp -r {1} {2} && compile'.format(
-        os.path.join(src_in_docker, oss_fuzz_repo_name, '*'),
-        os.path.join(git_workspace, oss_fuzz_repo_name), src_in_docker)
+        os.path.join(src_in_project_builder, project_repo_name, '*'),
+        os.path.join(git_workspace, project_repo_name), src_in_project_builder)
   else:
     command += [
         '-e', 'OUT=' + '/out', '-v',
-        '%s:%s' % (os.path.join(git_workspace, oss_fuzz_repo_name),
-                   os.path.join(src_in_docker, oss_fuzz_repo_name)), '-v',
+        '%s:%s' % (os.path.join(git_workspace, project_repo_name),
+                   os.path.join(src_in_project_builder, project_repo_name)),
+        '-v',
         '%s:%s' % (out_dir, '/out')
     ]
     bash_command = 'compile'
@@ -173,11 +196,11 @@
     return False
   remove_unaffected_fuzzers(project_name, out_dir,
                             build_repo_manager.get_git_diff(),
-                            oss_fuzz_repo_path)
+                            project_builder_repo_path)
   return True
 
 
-def run_fuzzers(fuzz_seconds, workspace, project_name):
+def run_fuzzers(fuzz_seconds, workspace, project_name, sanitizer='address'):
   """Runs all fuzzers for a specific OSS-Fuzz project.
 
   Args:
@@ -185,6 +208,7 @@
     workspace: The location in a shared volume to store a git repo and build
       artifacts.
     project_name: The name of the relevant OSS-Fuzz project.
+    sanitizer: The sanitizer the fuzzers should be run with.
 
   Returns:
     (True if run was successful, True if bug was found).
@@ -193,6 +217,9 @@
   if not os.path.exists(workspace):
     logging.error('Invalid workspace: %s.', workspace)
     return False, False
+
+  logging.info("Using %s sanitizer.", sanitizer)
+
   out_dir = os.path.join(workspace, 'out')
   artifacts_dir = os.path.join(out_dir, 'artifacts')
   os.makedirs(artifacts_dir, exist_ok=True)
@@ -216,8 +243,11 @@
     run_seconds = max(fuzz_seconds // fuzzers_left_to_run,
                       min_seconds_per_fuzzer)
 
-    target = fuzz_target.FuzzTarget(fuzzer_path, run_seconds, out_dir,
-                                    project_name)
+    target = fuzz_target.FuzzTarget(fuzzer_path,
+                                    run_seconds,
+                                    out_dir,
+                                    project_name,
+                                    sanitizer=sanitizer)
     start_time = time.time()
     test_case, stack_trace = target.fuzz()
     fuzz_seconds -= (time.time() - start_time)
@@ -234,11 +264,12 @@
   return True, False
 
 
-def check_fuzzer_build(out_dir):
+def check_fuzzer_build(out_dir, sanitizer='address'):
   """Checks the integrity of the built fuzzers.
 
   Args:
     out_dir: The directory containing the fuzzer binaries.
+    sanitizer: The sanitizer the fuzzers are built with.
 
   Returns:
     True if fuzzers are correct.
@@ -256,7 +287,7 @@
       '-e',
       'FUZZING_ENGINE=' + DEFAULT_ENGINE,
       '-e',
-      'SANITIZER=' + DEFAULT_SANITIZER,
+      'SANITIZER=' + sanitizer,
       '-e',
       'ARCHITECTURE=' + DEFAULT_ARCHITECTURE,
   ]
diff --git a/infra/cifuzz/cifuzz_test.py b/infra/cifuzz/cifuzz_test.py
index d76756f..abc2446 100644
--- a/infra/cifuzz/cifuzz_test.py
+++ b/infra/cifuzz/cifuzz_test.py
@@ -25,7 +25,11 @@
 from unittest import mock
 
 # pylint: disable=wrong-import-position
-sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+INFRA_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+sys.path.append(INFRA_DIR)
+
+OSS_FUZZ_DIR = os.path.dirname(INFRA_DIR)
+
 import cifuzz
 import fuzz_target
 
@@ -50,6 +54,12 @@
 # A fuzzer to be built in build_fuzzers integration tests.
 EXAMPLE_BUILD_FUZZER = 'do_stuff_fuzzer'
 
+MEMORY_FUZZER_DIR = os.path.join(TEST_FILES_PATH, 'memory')
+MEMORY_FUZZER = 'curl_fuzzer_memory'
+
+UNDEFINED_FUZZER_DIR = os.path.join(TEST_FILES_PATH, 'undefined')
+UNDEFINED_FUZZER = 'curl_fuzzer_undefined'
+
 # pylint: disable=no-self-use
 
 
@@ -88,7 +98,7 @@
     with tempfile.TemporaryDirectory() as tmp_dir:
       out_path = os.path.join(tmp_dir, 'out')
       os.mkdir(out_path)
-      self.assertFalse(
+      self.assertTrue(
           cifuzz.build_fuzzers(EXAMPLE_PROJECT,
                                'oss-fuzz',
                                tmp_dir,
@@ -134,16 +144,70 @@
         ))
 
 
-class RunFuzzersIntegrationTest(unittest.TestCase):
+class RunMemoryFuzzerIntegrationTest(unittest.TestCase):
+  """Test build_fuzzers function in the cifuzz module."""
+
+  def tearDown(self):
+    """Remove any existing crashes and test files."""
+    out_dir = os.path.join(MEMORY_FUZZER_DIR, 'out')
+    for out_file in os.listdir(out_dir):
+      out_path = os.path.join(out_dir, out_file)
+      #pylint: disable=consider-using-in
+      if out_file == MEMORY_FUZZER:
+        continue
+      if os.path.isdir(out_path):
+        shutil.rmtree(out_path)
+      else:
+        os.remove(out_path)
+
+  def test_run_with_memory_sanitizer(self):
+    """Test run_fuzzers with a valid build."""
+    run_success, bug_found = cifuzz.run_fuzzers(10,
+                                                MEMORY_FUZZER_DIR,
+                                                'curl',
+                                                sanitizer='memory')
+    self.assertTrue(run_success)
+    self.assertFalse(bug_found)
+
+
+class RunUndefinedFuzzerIntegrationTest(unittest.TestCase):
+  """Test build_fuzzers function in the cifuzz module."""
+
+  def tearDown(self):
+    """Remove any existing crashes and test files."""
+    out_dir = os.path.join(UNDEFINED_FUZZER_DIR, 'out')
+    for out_file in os.listdir(out_dir):
+      out_path = os.path.join(out_dir, out_file)
+      #pylint: disable=consider-using-in
+      if out_file == UNDEFINED_FUZZER:
+        continue
+      if os.path.isdir(out_path):
+        shutil.rmtree(out_path)
+      else:
+        os.remove(out_path)
+
+  def test_run_with_undefined_sanitizer(self):
+    """Test run_fuzzers with a valid build."""
+    run_success, bug_found = cifuzz.run_fuzzers(10,
+                                                UNDEFINED_FUZZER_DIR,
+                                                'curl',
+                                                sanitizer='undefined')
+    self.assertTrue(run_success)
+    self.assertFalse(bug_found)
+
+
+class RunAddressFuzzersIntegrationTest(unittest.TestCase):
   """Test build_fuzzers function in the cifuzz module."""
 
   def tearDown(self):
     """Remove any existing crashes and test files."""
     out_dir = os.path.join(TEST_FILES_PATH, 'out')
+    files_to_keep = [
+        'undefined', 'memory', EXAMPLE_CRASH_FUZZER, EXAMPLE_NOCRASH_FUZZER
+    ]
     for out_file in os.listdir(out_dir):
       out_path = os.path.join(out_dir, out_file)
-      #pylint: disable=consider-using-in
-      if out_file == EXAMPLE_CRASH_FUZZER or out_file == EXAMPLE_NOCRASH_FUZZER:
+      if out_file in files_to_keep:
         continue
       if os.path.isdir(out_path):
         shutil.rmtree(out_path)
@@ -433,5 +497,31 @@
         self.assertEqual(2, len(os.listdir(tmp_dir)))
 
 
+@unittest.skip('Test is too long to be run with presubmit.')
+class BuildSantizerIntegrationTest(unittest.TestCase):
+  """Integration tests for the build_fuzzers function in the cifuzz module.
+    Note: This test relies on the curl project being an OSS-Fuzz project."""
+
+  def test_valid_project_curl_memory(self):
+    """Test if sanitizers can be detected from project.yaml"""
+    with tempfile.TemporaryDirectory() as tmp_dir:
+      self.assertTrue(
+          cifuzz.build_fuzzers('curl',
+                               'curl',
+                               tmp_dir,
+                               pr_ref='fake_pr',
+                               sanitizer='memory'))
+
+  def test_valid_project_curl_undefined(self):
+    """Test if sanitizers can be detected from project.yaml"""
+    with tempfile.TemporaryDirectory() as tmp_dir:
+      self.assertTrue(
+          cifuzz.build_fuzzers('curl',
+                               'curl',
+                               tmp_dir,
+                               pr_ref='fake_pr',
+                               sanitizer='undefined'))
+
+
 if __name__ == '__main__':
   unittest.main()
diff --git a/infra/cifuzz/fuzz_target.py b/infra/cifuzz/fuzz_target.py
index d32322a..7050ae2 100644
--- a/infra/cifuzz/fuzz_target.py
+++ b/infra/cifuzz/fuzz_target.py
@@ -51,9 +51,6 @@
 # Zip file name containing the corpus.
 CORPUS_ZIP_NAME = 'public.zip'
 
-# The sanitizer build to download.
-SANITIZER = 'address'
-
 # The number of reproduce attempts for a crash.
 REPRODUCE_ATTEMPTS = 10
 
@@ -83,7 +80,13 @@
     project_name: The name of the relevant OSS-Fuzz project.
   """
 
-  def __init__(self, target_path, duration, out_dir, project_name=None):
+  #pylint: disable=too-many-arguments
+  def __init__(self,
+               target_path,
+               duration,
+               out_dir,
+               project_name=None,
+               sanitizer='address'):
     """Represents a single fuzz target.
 
     Note: project_name should be none when the fuzzer being run is not
@@ -100,6 +103,7 @@
     self.target_path = target_path
     self.out_dir = out_dir
     self.project_name = project_name
+    self.sanitizer = sanitizer
 
   def fuzz(self):
     """Starts the fuzz target run for the length of time specified by duration.
@@ -119,8 +123,8 @@
       command += ['-v', '%s:%s' % (self.out_dir, '/out')]
 
     command += [
-        '-e', 'FUZZING_ENGINE=libfuzzer', '-e', 'SANITIZER=address', '-e',
-        'RUN_FUZZER_MODE=interactive', 'gcr.io/oss-fuzz-base/base-runner',
+        '-e', 'FUZZING_ENGINE=libfuzzer', '-e', 'SANITIZER=' + self.sanitizer,
+        '-e', 'RUN_FUZZER_MODE=interactive', 'gcr.io/oss-fuzz-base/base-runner',
         'bash', '-c'
     ]
 
@@ -301,7 +305,7 @@
       return None
 
     version = VERSION_STRING.format(project_name=self.project_name,
-                                    sanitizer=SANITIZER)
+                                    sanitizer=self.sanitizer)
     version_url = url_join(GCS_BASE_URL, CLUSTERFUZZ_BUILDS, self.project_name,
                            version)
     try:
diff --git a/infra/cifuzz/test_files/memory/out/curl_fuzzer_memory b/infra/cifuzz/test_files/memory/out/curl_fuzzer_memory
new file mode 100755
index 0000000..c602ce9
--- /dev/null
+++ b/infra/cifuzz/test_files/memory/out/curl_fuzzer_memory
Binary files differ
diff --git a/infra/cifuzz/test_files/undefined/out/curl_fuzzer_undefined b/infra/cifuzz/test_files/undefined/out/curl_fuzzer_undefined
new file mode 100755
index 0000000..504cab1
--- /dev/null
+++ b/infra/cifuzz/test_files/undefined/out/curl_fuzzer_undefined
Binary files differ
diff --git a/infra/gcb/.gitignore b/infra/gcb/.gitignore
deleted file mode 100644
index 4d3dae7..0000000
--- a/infra/gcb/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-default/
diff --git a/infra/gcb/badge_images/building.png b/infra/gcb/badge_images/building.png
deleted file mode 100644
index 9e7e734..0000000
--- a/infra/gcb/badge_images/building.png
+++ /dev/null
Binary files differ
diff --git a/infra/gcb/badge_images/building.svg b/infra/gcb/badge_images/building.svg
deleted file mode 100644
index 19f28d7..0000000
--- a/infra/gcb/badge_images/building.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="104" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="104" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h55v20H0z"/><path fill="#4c1" d="M55 0h49v20H55z"/><path fill="url(#b)" d="M0 0h104v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"> <text x="285" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="450">oss-fuzz</text><text x="285" y="140" transform="scale(.1)" textLength="450">oss-fuzz</text><text x="785" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="390">fuzzing</text><text x="785" y="140" transform="scale(.1)" textLength="390">fuzzing</text></g> </svg>
\ No newline at end of file
diff --git a/infra/gcb/badge_images/coverage_failing.png b/infra/gcb/badge_images/coverage_failing.png
deleted file mode 100644
index 85abe23..0000000
--- a/infra/gcb/badge_images/coverage_failing.png
+++ /dev/null
Binary files differ
diff --git a/infra/gcb/badge_images/coverage_failing.svg b/infra/gcb/badge_images/coverage_failing.svg
deleted file mode 100644
index dc7b72e..0000000
--- a/infra/gcb/badge_images/coverage_failing.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="152" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="152" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h55v20H0z"/><path fill="#dfb317" d="M55 0h97v20H55z"/><path fill="url(#b)" d="M0 0h152v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"> <text x="285" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="450">oss-fuzz</text><text x="285" y="140" transform="scale(.1)" textLength="450">oss-fuzz</text><text x="1025" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="870">coverage failing</text><text x="1025" y="140" transform="scale(.1)" textLength="870">coverage failing</text></g> </svg>
\ No newline at end of file
diff --git a/infra/gcb/badge_images/failing.png b/infra/gcb/badge_images/failing.png
deleted file mode 100644
index 0d2bb47..0000000
--- a/infra/gcb/badge_images/failing.png
+++ /dev/null
Binary files differ
diff --git a/infra/gcb/badge_images/failing.svg b/infra/gcb/badge_images/failing.svg
deleted file mode 100644
index ed0f862..0000000
--- a/infra/gcb/badge_images/failing.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="128" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h55v20H0z"/><path fill="#e05d44" d="M55 0h73v20H55z"/><path fill="url(#b)" d="M0 0h128v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"> <text x="285" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="450">oss-fuzz</text><text x="285" y="140" transform="scale(.1)" textLength="450">oss-fuzz</text><text x="905" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="630">build failing</text><text x="905" y="140" transform="scale(.1)" textLength="630">build failing</text></g> </svg>
\ No newline at end of file
diff --git a/infra/gcb/build_base_images.py b/infra/gcb/build_base_images.py
deleted file mode 100755
index 3c2bace..0000000
--- a/infra/gcb/build_base_images.py
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/python2
-"""Build base images on Google Cloud Builder.
-
-Usage: build_base_images.py
-"""
-
-import os
-import sys
-import yaml
-
-from oauth2client.client import GoogleCredentials
-from googleapiclient.discovery import build
-
-BASE_IMAGES = [
-    'base-image',
-    'base-clang',
-    'base-builder',
-    'base-runner',
-    'base-runner-debug',
-    'base-msan-builder',
-]
-
-TAG_PREFIX = 'gcr.io/oss-fuzz-base/'
-
-
-def get_steps(images):
-  steps = [{
-      'args': [
-          'clone',
-          'https://github.com/google/oss-fuzz.git',
-      ],
-      'name': 'gcr.io/cloud-builders/git',
-  }]
-
-  for base_image in images:
-    steps.append({
-        'args': [
-            'build',
-            '-t',
-            TAG_PREFIX + base_image,
-            '.',
-        ],
-        'dir': 'oss-fuzz/infra/base-images/' + base_image,
-        'name': 'gcr.io/cloud-builders/docker',
-    })
-
-  return steps
-
-
-def get_logs_url(build_id):
-  URL_FORMAT = ('https://console.developers.google.com/logs/viewer?'
-                'resource=build%2Fbuild_id%2F{0}&project=oss-fuzz-base')
-  return URL_FORMAT.format(build_id)
-
-
-def main():
-  options = {}
-  if 'GCB_OPTIONS' in os.environ:
-    options = yaml.safe_load(os.environ['GCB_OPTIONS'])
-
-  build_body = {
-      'steps': get_steps(BASE_IMAGES),
-      'timeout': str(4 * 3600) + 's',
-      'options': options,
-      'images': [TAG_PREFIX + base_image for base_image in BASE_IMAGES],
-  }
-
-  credentials = GoogleCredentials.get_application_default()
-  cloudbuild = build('cloudbuild', 'v1', credentials=credentials)
-  build_info = cloudbuild.projects().builds().create(
-      projectId='oss-fuzz-base', body=build_body).execute()
-  build_id = build_info['metadata']['build']['id']
-
-  print >> sys.stderr, 'Logs:', get_logs_url(build_id)
-  print build_id
-
-
-if __name__ == '__main__':
-  main()
diff --git a/infra/gcb/build_msan_libs.py b/infra/gcb/build_msan_libs.py
deleted file mode 100755
index 2c87b15..0000000
--- a/infra/gcb/build_msan_libs.py
+++ /dev/null
@@ -1,66 +0,0 @@
-#!/usr/bin/python2
-"""Build base images on Google Cloud Builder.
-
-Usage: build_base_images.py
-"""
-
-import datetime
-import os
-import yaml
-import sys
-
-from oauth2client.client import GoogleCredentials
-from googleapiclient.discovery import build
-
-import build_base_images
-
-
-def main():
-  options = {}
-  if 'GCB_OPTIONS' in os.environ:
-    options = yaml.safe_load(os.environ['GCB_OPTIONS'])
-
-  image = 'gcr.io/oss-fuzz-base/msan-builder'
-  steps = build_base_images.get_steps(['base-msan-builder', 'msan-builder'])
-  ts = datetime.datetime.utcnow().strftime('%Y%m%d%H%M')
-  upload_name = 'msan-libs-' + ts + '.zip'
-
-  steps.extend([{
-      'name': image,
-      'args': [
-          'bash',
-          '-c',
-          'cd /msan && zip -r /workspace/libs.zip .',
-      ],
-  }, {
-      'name':
-          'gcr.io/cloud-builders/gsutil',
-      'args': [
-          'cp',
-          '/workspace/libs.zip',
-          'gs://oss-fuzz-msan-libs/' + upload_name,
-      ],
-  }])
-
-  build_body = {
-      'steps': steps,
-      'timeout': str(6 * 3600) + 's',
-      'options': options,
-      'images': [
-          'gcr.io/oss-fuzz-base/base-msan-builder',
-          image,
-      ],
-  }
-
-  credentials = GoogleCredentials.get_application_default()
-  cloudbuild = build('cloudbuild', 'v1', credentials=credentials)
-  build_info = cloudbuild.projects().builds().create(
-      projectId='oss-fuzz-base', body=build_body).execute()
-  build_id = build_info['metadata']['build']['id']
-
-  print >> sys.stderr, 'Logs:', build_base_images.get_logs_url(build_id)
-  print build_id
-
-
-if __name__ == '__main__':
-  main()
diff --git a/infra/gcb/builds_status.py b/infra/gcb/builds_status.py
deleted file mode 100755
index 087df6f..0000000
--- a/infra/gcb/builds_status.py
+++ /dev/null
@@ -1,246 +0,0 @@
-#!/usr/bin/env python2
-
-import datetime
-import os
-import sys
-import json
-import tempfile
-import time
-
-import dateutil.parser
-from oauth2client.client import GoogleCredentials
-from googleapiclient.discovery import build as gcb_build
-from google.cloud import storage
-
-import build_and_run_coverage
-import build_project
-
-STATUS_BUCKET = 'oss-fuzz-build-logs'
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-BADGE_DIR = 'badges'
-RETRY_COUNT = 3
-RETRY_WAIT = 5
-MAX_BUILD_RESULTS = 2000
-BUILDS_PAGE_SIZE = 256
-BADGE_IMAGE_TYPES = {'svg': 'image/svg+xml', 'png': 'image/png'}
-
-_client = None
-
-
-def _get_storage_client():
-  """Return storage client."""
-  global _client
-  if not _client:
-    _client = storage.Client()
-
-  return _client
-
-
-def usage():
-  sys.stderr.write('Usage: ' + sys.argv[0] + ' <projects_dir>\n')
-  exit(1)
-
-
-def scan_project_names(projects_dir):
-  projects = []
-  for root, dirs, files in os.walk(projects_dir):
-    for f in files:
-      if f == 'Dockerfile':
-        projects.append(os.path.basename(root))
-  return sorted(projects)
-
-
-def upload_status(successes, failures, status_filename):
-  """Upload main status page."""
-  data = {
-      'projects': failures + successes,
-      'failures': failures,
-      'successes': successes,
-      'last_updated': datetime.datetime.utcnow().ctime()
-  }
-
-  bucket = _get_storage_client().get_bucket(STATUS_BUCKET)
-  blob = bucket.blob(status_filename)
-  blob.cache_control = 'no-cache'
-  blob.upload_from_string(json.dumps(data), content_type='application/json')
-
-
-def is_build_successful(build):
-  return build['status'] == 'SUCCESS'
-
-
-def find_last_build(builds, project, build_tag_suffix):
-  DELAY_MINUTES = 40
-  tag = project + '-' + build_tag_suffix
-
-  builds = builds.get(tag)
-  if not builds:
-    print >> sys.stderr, 'Failed to find builds with tag', tag
-    return None
-
-  for build in builds:
-    if build['status'] == 'WORKING':
-      continue
-
-    if tag not in build['tags']:
-      continue
-
-    if not 'finishTime' in build:
-      continue
-
-    finish_time = dateutil.parser.parse(build['finishTime'], ignoretz=True)
-    if (datetime.datetime.utcnow() - finish_time >=
-        datetime.timedelta(minutes=DELAY_MINUTES)):
-      status_bucket = _get_storage_client().get_bucket(STATUS_BUCKET)
-      gcb_bucket = _get_storage_client().get_bucket(
-          build_project.GCB_LOGS_BUCKET)
-      log_name = 'log-{0}.txt'.format(build['id'])
-      log = gcb_bucket.blob(log_name)
-      if not log.exists():
-        print >> sys.stderr, 'Failed to find build log', log_name
-        continue
-
-      with tempfile.NamedTemporaryFile() as f:
-        log.download_to_filename(f.name)
-        dest_log = status_bucket.blob(log_name)
-        dest_log.upload_from_filename(f.name, content_type='text/plain')
-
-      return build
-
-  return None
-
-
-def execute_with_retries(request):
-  for i in xrange(RETRY_COUNT + 1):
-    try:
-      return request.execute()
-    except Exception as e:
-      print('request failed with {0}, retrying...'.format(str(e)))
-      if i < RETRY_COUNT:
-        time.sleep(RETRY_WAIT)
-        continue
-
-      raise
-
-
-def get_builds(cloudbuild):
-  """Get a batch of the latest builds (up to MAX_BUILD_RESULTS), grouped by
-  tag."""
-  ungrouped_builds = []
-  next_page_token = None
-
-  while True:
-    page_size = min(BUILDS_PAGE_SIZE, MAX_BUILD_RESULTS - len(ungrouped_builds))
-    response = execute_with_retries(cloudbuild.projects().builds().list(
-        projectId='oss-fuzz', pageSize=page_size, pageToken=next_page_token))
-
-    if not 'builds' in response:
-      print >> sys.stderr, 'Invalid response from builds list:', response
-      return None
-
-    ungrouped_builds.extend(response['builds'])
-    if len(ungrouped_builds) >= MAX_BUILD_RESULTS:
-      break
-
-    next_page_token = response.get('nextPageToken')
-
-  builds = {}
-  for build in ungrouped_builds:
-    for tag in build['tags']:
-      builds.setdefault(tag, []).append(build)
-
-  return builds
-
-
-def update_build_status(builds, projects, build_tag_suffix, status_filename):
-  successes = []
-  failures = []
-
-  for project in projects:
-    print project
-
-    last_build = find_last_build(builds, project, build_tag_suffix)
-    if not last_build:
-      print >> sys.stderr, 'Failed to get build for', project
-      continue
-
-    print last_build['startTime'], last_build['status'], last_build['id']
-    if is_build_successful(last_build):
-      successes.append({
-          'name': project,
-          'build_id': last_build['id'],
-          'finish_time': last_build['finishTime'],
-          'success': True,
-      })
-    else:
-      failures.append({
-          'name': project,
-          'build_id': last_build['id'],
-          'finish_time': last_build['finishTime'],
-          'success': False,
-      })
-
-  upload_status(successes, failures, status_filename)
-
-
-def update_build_badges(builds, projects, build_tag, coverage_tag):
-  for project in projects:
-    last_build = find_last_build(builds, project, build_tag)
-    last_coverage_build = find_last_build(builds, project, coverage_tag)
-    if not last_build or not last_coverage_build:
-      continue
-
-    badge = 'building'
-    if not is_build_successful(last_coverage_build):
-      badge = 'coverage_failing'
-    if not is_build_successful(last_build):
-      badge = 'failing'
-
-    print("[badge] {}: {}".format(project, badge))
-
-    for extension, mime_type in BADGE_IMAGE_TYPES.items():
-      badge_name = '{badge}.{extension}'.format(
-          badge=badge, extension=extension)
-      # Retrieve the image relative to this script's location
-      badge_file = os.path.join(SCRIPT_DIR, 'badge_images', badge_name)
-
-      # The uploaded blob name should look like `badges/project.png`
-      blob_name = '{badge_dir}/{project_name}.{extension}'.format(
-          badge_dir=BADGE_DIR, project_name=project, extension=extension)
-
-      status_bucket = _get_storage_client().get_bucket(STATUS_BUCKET)
-      badge_blob = status_bucket.blob(blob_name)
-      badge_blob.upload_from_filename(badge_file, content_type=mime_type)
-
-
-def main():
-  if len(sys.argv) != 2:
-    usage()
-
-  projects_dir = sys.argv[1]
-  projects = scan_project_names(projects_dir)
-
-  credentials = GoogleCredentials.get_application_default()
-  cloudbuild = gcb_build('cloudbuild', 'v1', credentials=credentials)
-
-  builds = get_builds(cloudbuild)
-  update_build_status(
-      builds,
-      projects,
-      build_project.FUZZING_BUILD_TAG,
-      status_filename='status.json')
-  update_build_status(
-      builds,
-      projects,
-      build_and_run_coverage.COVERAGE_BUILD_TAG,
-      status_filename='status-coverage.json')
-
-  update_build_badges(
-      builds,
-      projects,
-      build_tag=build_project.FUZZING_BUILD_TAG,
-      coverage_tag=build_and_run_coverage.COVERAGE_BUILD_TAG)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/infra/gcb/cancel.py b/infra/gcb/cancel.py
deleted file mode 100755
index 8393a51..0000000
--- a/infra/gcb/cancel.py
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/python2
-"""Cancels project build on Google Cloud Builder.
-
-Usage: cancel.py <build_id>
-"""
-
-import base64
-import collections
-import datetime
-import os
-import subprocess
-import sys
-import time
-import urllib
-import yaml
-
-from oauth2client.client import GoogleCredentials
-from googleapiclient.discovery import build
-
-
-def usage():
-  sys.stderr.write('Usage: ' + sys.argv[0] + ' <build_id>\n')
-  exit(1)
-
-
-def main():
-  if len(sys.argv) != 2:
-    usage()
-
-  build_id = sys.argv[1]
-
-  credentials = GoogleCredentials.get_application_default()
-  cloudbuild = build('cloudbuild', 'v1', credentials=credentials)
-  print cloudbuild.projects().builds().cancel(projectId='oss-fuzz',
-                                              id=build_id,
-                                              body={}).execute()
-
-
-if __name__ == '__main__':
-  main()
diff --git a/infra/gcb/jenkins_config/base_job.xml b/infra/gcb/jenkins_config/base_job.xml
deleted file mode 100644
index fa90aa4..0000000
--- a/infra/gcb/jenkins_config/base_job.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<project>
-  <actions/>
-  <description></description>
-  <keepDependencies>false</keepDependencies>
-  <properties/>
-  <scm class="hudson.plugins.git.GitSCM" plugin="git@3.1.0">
-    <configVersion>2</configVersion>
-    <userRemoteConfigs>
-      <hudson.plugins.git.UserRemoteConfig>
-        <url>https://github.com/google/oss-fuzz.git</url>
-      </hudson.plugins.git.UserRemoteConfig>
-    </userRemoteConfigs>
-    <branches>
-      <hudson.plugins.git.BranchSpec>
-        <name>*/master</name>
-      </hudson.plugins.git.BranchSpec>
-    </branches>
-    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
-    <submoduleCfg class="list"/>
-    <extensions>
-      <hudson.plugins.git.extensions.impl.RelativeTargetDirectory>
-        <relativeTargetDir>oss-fuzz</relativeTargetDir>
-      </hudson.plugins.git.extensions.impl.RelativeTargetDirectory>
-    </extensions>
-  </scm>
-  <canRoam>true</canRoam>
-  <disabled>false</disabled>
-  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
-  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
-  <triggers>
-    <jenkins.triggers.ReverseBuildTrigger>
-      <spec/>
-      <upstreamProjects>infra/base-images</upstreamProjects>
-      <threshold>
-        <name>SUCCESS</name>
-        <ordinal>0</ordinal>
-        <color>BLUE</color>
-        <completeBuild>true</completeBuild>
-      </threshold>
-    </jenkins.triggers.ReverseBuildTrigger>
-  </triggers>
-  <concurrentBuild>false</concurrentBuild>
-  <builders>
-    <hudson.tasks.Shell>
-      <command>#!/bin/bash -eux
-
-virtualenv ENV
-set +o nounset
-. ENV/bin/activate
-set -o nounset
-
-cd $WORKSPACE/oss-fuzz/infra/gcb
-pip install -r requirements.txt
-build_id=$(python build_project.py $WORKSPACE/oss-fuzz/$JOB_NAME)
-python wait_for_build.py $build_id
-</command>
-    </hudson.tasks.Shell>
-  </builders>
-  <publishers/>
-  <buildWrappers/>
-</project>
diff --git a/infra/gcb/jenkins_config/coverage_job.xml b/infra/gcb/jenkins_config/coverage_job.xml
deleted file mode 100644
index be5cb82..0000000
--- a/infra/gcb/jenkins_config/coverage_job.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<project>
-  <actions/>
-  <description></description>
-  <keepDependencies>false</keepDependencies>
-  <properties/>
-  <scm class="hudson.plugins.git.GitSCM" plugin="git@3.1.0">
-    <configVersion>2</configVersion>
-    <userRemoteConfigs>
-      <hudson.plugins.git.UserRemoteConfig>
-        <url>https://github.com/google/oss-fuzz.git</url>
-      </hudson.plugins.git.UserRemoteConfig>
-    </userRemoteConfigs>
-    <branches>
-      <hudson.plugins.git.BranchSpec>
-        <name>*/master</name>
-      </hudson.plugins.git.BranchSpec>
-    </branches>
-    <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
-    <submoduleCfg class="list"/>
-    <extensions>
-      <hudson.plugins.git.extensions.impl.RelativeTargetDirectory>
-        <relativeTargetDir>oss-fuzz</relativeTargetDir>
-      </hudson.plugins.git.extensions.impl.RelativeTargetDirectory>
-    </extensions>
-  </scm>
-  <canRoam>true</canRoam>
-  <disabled>false</disabled>
-  <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
-  <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
-  <triggers>
-    <hudson.triggers.TimerTrigger>
-      <spec>H 6 * * *</spec>
-    </hudson.triggers.TimerTrigger>
-  </triggers>
-  <concurrentBuild>false</concurrentBuild>
-  <builders>
-    <hudson.tasks.Shell>
-      <command>#!/bin/bash -eux
-
-virtualenv ENV
-set +o nounset
-. ENV/bin/activate
-set -o nounset
-
-cd $WORKSPACE/oss-fuzz/infra/gcb
-pip install -r requirements.txt
-project_dir=$WORKSPACE/oss-fuzz/projects/$(basename $JOB_NAME)
-build_id=$(python build_and_run_coverage.py $project_dir)
-if [[ "$build_id" == "0" ]]; then
-  echo "Intentionally skipping code coverage job."
-else
-  python wait_for_build.py $build_id
-fi
-</command>
-    </hudson.tasks.Shell>
-  </builders>
-  <publishers/>
-  <buildWrappers/>
-</project>
diff --git a/infra/gcb/requirements.txt b/infra/gcb/requirements.txt
deleted file mode 100644
index 584c701..0000000
--- a/infra/gcb/requirements.txt
+++ /dev/null
@@ -1,35 +0,0 @@
-cachetools==2.1.0
-certifi==2018.4.16
-chardet==3.0.4
-enum34==1.1.6
-futures==3.2.0
-google-api-core==1.2.0
-google-api-python-client==1.7.0
-google-auth==1.5.0
-google-auth-httplib2==0.0.3
-google-cloud-core==0.28.1
-google-cloud-logging==1.6.0
-google-cloud-pubsub==0.35.2
-google-cloud-storage==1.10.0
-google-resumable-media==0.3.1
-googleapis-common-protos==1.5.3
-grpc-google-iam-v1==0.11.4
-grpcio==1.12.0
-httplib2==0.18.0
-idna==2.6
-Jinja2==2.10.1
-MarkupSafe==1.0
-multi-key-dict==2.0.3
-oauth2client==4.1.2
-pbr==4.0.3
-protobuf==3.5.2.post1
-pyasn1==0.4.3
-pyasn1-modules==0.2.1
-python-dateutil==2.7.3
-python-jenkins==1.0.0
-pytz==2018.4
-PyYAML==5.1
-requests==2.21.0
-rsa==3.4.2
-six==1.11.0
-uritemplate==3.0.0
diff --git a/infra/gcb/sync.py b/infra/gcb/sync.py
deleted file mode 100755
index 9004678..0000000
--- a/infra/gcb/sync.py
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/usr/bin/env python
-"""Script to sync CF and Jenkins jobs."""
-
-import json
-import os
-import re
-import sys
-import yaml
-
-import jenkins
-
-JENKINS_SERVER = ('localhost', 8080)
-
-JOB_TEMPLATES = [
-    {'prefix': 'projects/', 'config': 'base_job.xml'},
-    {'prefix': 'coverage/', 'config': 'coverage_job.xml'},
-]
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-OSSFUZZ_DIR = os.path.dirname(os.path.dirname(SCRIPT_DIR))
-
-VALID_PROJECT_NAME = re.compile(r'^[a-zA-Z0-9_-]+$')
-
-
-def main():
-  # Connect to jenkins server.
-  jenkins_login = get_jenkins_login()
-  server = jenkins.Jenkins(
-      'http://%s:%d' % JENKINS_SERVER,
-      username=jenkins_login[0],
-      password=jenkins_login[1])
-
-  for project in get_projects():
-    print 'syncing configs for', project
-    try:
-      # Create/update jenkins build job.
-      sync_jenkins_job(server, project)
-
-    except Exception as e:
-      print >> sys.stderr, 'Failed to setup job with exception', e
-
-
-def _has_dockerfile(project_dir):
-  """Whether or not the project has a Dockerfile."""
-  if os.path.exists(os.path.join(project_dir, 'Dockerfile')):
-    return True
-
-  project_yaml_path = os.path.join(project_dir, 'project.yaml')
-  if not os.path.exists(project_yaml_path):
-    return False
-
-  with open(project_yaml_path) as f:
-    project_info = yaml.safe_load(f)
-
-  return 'dockerfile' in project_info
-
-
-def get_projects():
-  """Return list of projects for oss-fuzz."""
-  projects = []
-  projects_dir = os.path.join(OSSFUZZ_DIR, 'projects')
-  for name in os.listdir(projects_dir):
-    full_path = os.path.join(projects_dir, name)
-    if not os.path.isdir(full_path) or not _has_dockerfile(full_path):
-      continue
-
-    if not VALID_PROJECT_NAME.match(name):
-      print >> sys.stderr, 'Invalid project name:', name
-      continue
-
-    projects.append(name)
-
-  if not projects:
-    print >> sys.stderr, 'No projects found.'
-
-  return projects
-
-
-def get_jenkins_login():
-  """Returns (username, password) for jenkins."""
-  username = os.getenv('JENKINS_USER')
-  password = os.getenv('JENKINS_PASS')
-
-  return username, password
-
-
-def sync_jenkins_job(server, project):
-  """Sync the config with jenkins."""
-  project_yaml = os.path.join(OSSFUZZ_DIR, 'projects', project, 'project.yaml')
-  with open(project_yaml, 'r') as f:
-    project_json_string = json.dumps(json.dumps(yaml.safe_load(f)))
-
-  for job in JOB_TEMPLATES:
-    job_name = job['prefix'] + project
-    with open(os.path.join(SCRIPT_DIR, 'jenkins_config', job['config'])) as f:
-      job_config_xml = f.read()
-
-    if server.job_exists(job_name):
-      server.reconfig_job(job_name, job_config_xml)
-    else:
-      server.create_job(job_name, job_config_xml)
-      server.build_job(job_name)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/infra/gcb/templates/deploy.sh b/infra/gcb/templates/deploy.sh
deleted file mode 100755
index 36aa871..0000000
--- a/infra/gcb/templates/deploy.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/bash
-
-gsutil -h "Cache-Control:no-cache,max-age=0" -m cp -r bower_components index.html src manifest.json gs://oss-fuzz-build-logs
diff --git a/infra/gcb/templates/index.html b/infra/gcb/templates/index.html
deleted file mode 100644
index 36dd15b..0000000
--- a/infra/gcb/templates/index.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!doctype html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8">
-    <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
-    <title>OSS-Fuzz build status</title>
-    <meta name="description" content="OSS-Fuzz build status">
-
-    <!-- See https://goo.gl/OOhYW5 -->
-    <link rel="manifest" href="/manifest.json">
-
-    <script src="/bower_components/webcomponentsjs/webcomponents-loader.js"></script>
-
-
-    <link rel="import" href="/src/build-status/build-status.html">
-
-    <style>
-      body {
-        font-family: 'Roboto', 'Noto', sans-serif;
-        background: #f1f1f1;
-        margin: 0;
-      }
-    </style>
-  </head>
-  <body>
-    <build-status></build-status>
-  </body>
-</html>
diff --git a/infra/gcb/templates/src/build-status/build-status.html b/infra/gcb/templates/src/build-status/build-status.html
deleted file mode 100644
index 35ee99a..0000000
--- a/infra/gcb/templates/src/build-status/build-status.html
+++ /dev/null
@@ -1,223 +0,0 @@
-<link rel="import" href="../../bower_components/polymer/polymer-element.html">
-<link rel="import" href="../../bower_components/app-layout/app-drawer-layout/app-drawer-layout.html">
-<link rel="import" href="../../bower_components/app-layout/app-drawer/app-drawer.html">
-<link rel="import" href="../../bower_components/app-layout/app-scroll-effects/app-scroll-effects.html">
-<link rel="import" href="../../bower_components/app-layout/app-header/app-header.html">
-<link rel="import" href="../../bower_components/app-layout/app-header-layout/app-header-layout.html">
-<link rel="import" href="../../bower_components/app-layout/app-toolbar/app-toolbar.html">
-<link rel="import" href="../../bower_components/paper-item/paper-item.html">
-<link rel="import" href="../../bower_components/paper-item/paper-item-body.html">
-<link rel="import" href="../../bower_components/paper-card/paper-card.html">
-<link rel="import" href="../../bower_components/paper-tabs/paper-tabs.html">
-<link rel="import" href="../../bower_components/paper-icon-button/paper-icon-button.html">
-<link rel="import" href="../../bower_components/iron-icons/iron-icons.html">
-<link rel="import" href="../../bower_components/iron-ajax/iron-ajax.html">
-<link rel="import" href="../../bower_components/iron-flex-layout/iron-flex-layout-classes.html">
-<link rel="import" href="../../bower_components/polymer/lib/elements/dom-if.html">
-<link rel="import" href="../../bower_components/polymer/lib/elements/dom-repeat.html">
-<link rel="import" href="../../bower_components/app-route/app-location.html">
-<link rel="import" href="../../bower_components/app-route/app-route.html">
-
-<dom-module id="build-status">
-  <template>
-    <app-location route="{{route}}" use-hash-as-path></app-location>
-    <app-route route="{{route}}"
-      pattern=":project_name"
-      data="{{routeData}}">
-    </app-route>
-    <style is="custom-style" include="iron-flex iron-flex-alignment">
-    <style>
-      .paper-item-link {
-        color: inherit;
-        text-decoration: none;
-      }
-
-      app-header {
-        background-color: #2ba4ad;
-        color: #fff;
-      }
-
-      paper-card {
-        margin: 0.5em;
-      }
-
-      paper-item {
-        cursor: pointer;
-      }
-
-      paper-tabs {
-        -webkit-font-smoothing: antialiased;
-        width: 100%;
-        margin-bottom: 1px;
-        height: 40px;
-      }
-
-      :host {
-        display: block;
-      }
-
-      .icon-error {
-        color: #e83030;
-        margin-right: 0.2em;
-      }
-
-      .projects {
-        min-width: 10em;
-      }
-
-      .log {
-        width: 80%;
-        display: inline;
-      }
-
-      pre {
-        white-space: pre-wrap;
-      }
-    </style>
-    <app-header reveals>
-      <app-toolbar>
-        <div main-title>OSS-Fuzz build status</div>
-        <div><small>(Updated every 30 minutes)</small></div>
-      </app-toolbar>
-    </app-header>
-    <div class="layout horizontal">
-      <paper-card class="projects">
-        <div class="card-tabs">
-          <paper-tabs selected="fuzzing" id="build_type" attr-for-selected="type" on-click="onChanged">
-            <paper-tab type="fuzzing">Fuzzing Builds</paper-tab>
-            <paper-tab type="coverage">Coverage Builds</paper-tab>
-          </paper-tabs>
-        </div>
-        <div class="card-content">
-          <template is="dom-repeat" items="[[status.projects]]" as="project">
-            <paper-item on-tap="onTap">
-              <paper-item-body two-line>
-                <div>
-                  <template is="dom-if" if="[[!project.success]]">
-                    <iron-icon class="icon-error" icon="icons:error"></iron-icon>
-                  </template>
-                  [[project.name]]
-                </div>
-                <div secondary title$="Last built [[toLocalDate(project.finish_time)]]">
-                  Last built [[toLocalDate(project.finish_time)]]
-                </div>
-              </paper-item-body>
-            </paper-item>
-          </template>
-        </div>
-      </paper-card>
-      <paper-card class="log">
-        <div class="card-content">
-          <template is="dom-if" if="[[showMessage(loading_log, log)]]">
-            Select a project to see logs.
-          </template>
-          <template is="dom-if" if="[[loading_log]]">
-            Loading...
-          </template>
-          <template is="dom-if" if="[[showLog(log)]]">
-            <a href="/log-[[build_id]].txt" tabindex="-1">
-              <iron-icon icon="icons:link"></iron-iron>
-            </a>
-          </template>
-          <pre>[[log]]</pre>
-        </div>
-      </paper-card>
-    </div>
-      <iron-ajax id="status_fuzzing" auto handle-as="json" url="/status.json" on-response="onResponseForFuzzing"></iron-ajax>
-      <iron-ajax id="status_coverage" auto handle-as="json" url="/status-coverage.json" on-response="onResponseForCoverage"></iron-ajax>
-    <iron-ajax id="logxhr" auto handle-as="text" on-response="onLogResponse"></iron-ajax>
-  </template>
-
-  <script>
-    /** @polymerElement */
-    class BuildStatus extends Polymer.Element {
-      static get is() { return 'build-status'; }
-      static get properties() {
-        return {
-          log: {
-            type: String,
-            value: ''
-          },
-          loading_log: {
-            type: Boolean,
-            value: false
-          }
-        };
-      }
-      static get observers() {
-        return [
-          '_routeChanged(route.*)'
-        ];
-      }
-
-      _routeChanged() {
-        if (!this.status || !this.routeData.project_name) {
-          // If our status json is loaded and there is a project_name specified
-          // in the URL, we can proceed to load that project's log.
-          return;
-        }
-        var project = this.getProjectByName(this.routeData.project_name);
-
-        this.$.logxhr.url = "/log-" + project.build_id + ".txt";
-        this.build_id = project.build_id;
-        this.log = '';
-        this.loading_log = true;
-      }
-
-      getProjectByName(project_name) {
-        return this.status.projects.find(p => p.name === project_name);
-      }
-
-      onResponseForFuzzing(e) {
-        this.status_fuzzing = e.detail.response;
-        if (!this.status) {
-          // Show status of the fuzzing builds by default.
-          this.status = this.status_fuzzing;
-          // Manually invoke a _routeChanged call, in order to load the log for
-          // someone going directly to a project's URL.
-          this._routeChanged();
-        }
-      }
-
-      onResponseForCoverage(e) {
-        this.status_coverage = e.detail.response;
-      }
-
-      onLogResponse(e) {
-        this.log = e.detail.response;
-        this.loading_log = false;
-      }
-
-      onTap(e) {
-        // Change the route, this should auto-magically update the url in the
-        // browser and invoke the _routeChanged method.
-        this.set('route.path', e.model.project.name);
-      }
-
-      onChanged(e) {
-        if (this.$.build_type.selected == 'coverage') {
-          this.status = this.status_coverage
-        } else {
-          this.status = this.status_fuzzing
-        }
-      }
-
-      showMessage(loading_log, log) {
-        return !loading_log && log === '';
-      }
-
-      showLog(log) {
-        return log !== '';
-      }
-
-      toLocalDate(str) {
-        let date = new Date(str);
-        let ds = date.toString();
-        let timezone = ds.substring(ds.indexOf("("));
-        return date.toLocaleString() + " " + timezone;
-      }
-    };
-
-    window.customElements.define(BuildStatus.is, BuildStatus);
-  </script>
-</dom-module>
diff --git a/infra/gcb/wait_for_build.py b/infra/gcb/wait_for_build.py
deleted file mode 100755
index e610315..0000000
--- a/infra/gcb/wait_for_build.py
+++ /dev/null
@@ -1,82 +0,0 @@
-#!/usr/bin/python2
-"""Waits for project build on Google Cloud Builder.
-
-Usage: wait_for_build.py <build_id>
-"""
-
-import argparse
-import sys
-import time
-import datetime
-
-from googleapiclient.discovery import build
-from oauth2client.client import GoogleCredentials
-
-POLL_INTERVAL = 15
-cloudbuild = None
-
-
-def _print(msg):
-  # Print helper writing to stdout and instantly flushing it to ensure the
-  # output is visible in Jenkins console viewer as soon as possible.
-  sys.stdout.write(msg)
-  sys.stdout.write('\n')
-  sys.stdout.flush()
-
-
-def get_build(build_id, cloudbuild, project):
-  return cloudbuild.projects().builds().get(projectId=project,
-                                            id=build_id).execute()
-
-
-def wait_for_build(build_id, project):
-  DONE_STATUSES = [
-      'SUCCESS',
-      'FAILURE',
-      'INTERNAL_ERROR',
-      'CANCELLED',
-      'TIMEOUT',
-  ]
-
-  status = None
-  while True:
-    build_info = get_build(build_id, cloudbuild, project)
-
-    current_status = build_info['status']
-    if current_status != status:
-      _print('%s %s' % (str(datetime.datetime.now()), current_status))
-    status = current_status
-    if status in DONE_STATUSES:
-      return status == 'SUCCESS'
-
-    time.sleep(POLL_INTERVAL)
-
-
-def main():
-  global cloudbuild
-
-  parser = argparse.ArgumentParser(description='Wait for build to complete')
-  parser.add_argument('-p',
-                      '--project',
-                      help='Cloud Project',
-                      default='oss-fuzz')
-  parser.add_argument('build_id', help='The Container Builder build ID.')
-
-  args = parser.parse_args()
-
-  credentials = GoogleCredentials.get_application_default()
-  cloudbuild = build('cloudbuild', 'v1', credentials=credentials)
-
-  if wait_for_build(args.build_id, args.project):
-    return
-
-  _print('The build failed. Retrying the same build one more time.')
-  retry_info = cloudbuild.projects().builds().retry(projectId=args.project,
-                                                    id=args.build_id).execute()
-  new_build_id = retry_info['metadata']['build']['id']
-  if not wait_for_build(new_build_id, args.project):
-    sys.exit(1)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/infra/helper.py b/infra/helper.py
index 668f31d..b1266c2 100755
--- a/infra/helper.py
+++ b/infra/helper.py
@@ -39,8 +39,8 @@
     'gcr.io/oss-fuzz-base/base-builder',
     'gcr.io/oss-fuzz-base/base-runner',
     'gcr.io/oss-fuzz-base/base-runner-debug',
-    'gcr.io/oss-fuzz-base/base-msan-builder',
-    'gcr.io/oss-fuzz-base/msan-builder',
+    'gcr.io/oss-fuzz-base/base-sanitizer-libs-builder',
+    'gcr.io/oss-fuzz-base/msan-libs-builder',
 ]
 
 VALID_PROJECT_NAME_REGEX = re.compile(r'^[a-zA-Z0-9_-]+$')
@@ -121,6 +121,8 @@
   _add_engine_args(run_fuzzer_parser)
   _add_sanitizer_args(run_fuzzer_parser)
   _add_environment_args(run_fuzzer_parser)
+  run_fuzzer_parser.add_argument(
+      '--corpus-dir', help='directory to store corpus for the fuzz target')
   run_fuzzer_parser.add_argument('project_name', help='name of the project')
   run_fuzzer_parser.add_argument('fuzzer_name', help='name of the fuzzer')
   run_fuzzer_parser.add_argument('fuzzer_args',
@@ -363,13 +365,8 @@
 WORKDIR_REGEX = re.compile(r'\s*WORKDIR\s*([^\s]+)')
 
 
-def _workdir_from_dockerfile(project_name):
-  """Parse WORKDIR from the Dockerfile for the given project."""
-  dockerfile_path = get_dockerfile_path(project_name)
-
-  with open(dockerfile_path) as file_handle:
-    lines = file_handle.readlines()
-
+def workdir_from_lines(lines, default='/src'):
+  """Get the WORKDIR from the given lines."""
   for line in reversed(lines):  # reversed to get last WORKDIR.
     match = re.match(WORKDIR_REGEX, line)
     if match:
@@ -381,7 +378,17 @@
 
       return os.path.normpath(workdir)
 
-  return os.path.join('/src', project_name)
+  return default
+
+
+def _workdir_from_dockerfile(project_name):
+  """Parse WORKDIR from the Dockerfile for the given project."""
+  dockerfile_path = get_dockerfile_path(project_name)
+
+  with open(dockerfile_path) as file_handle:
+    lines = file_handle.readlines()
+
+  return workdir_from_lines(lines, default=os.path.join('/src', project_name))
 
 
 def docker_run(run_args, print_output=True):
@@ -519,7 +526,7 @@
   if sanitizer == 'memory':
     docker_run([
         '-v',
-        '%s:/work' % project_work_dir, 'gcr.io/oss-fuzz-base/msan-builder',
+        '%s:/work' % project_work_dir, 'gcr.io/oss-fuzz-base/msan-libs-builder',
         'bash', '-c', 'cp -r /msan /work'
     ])
     env.append('MSAN_LIBS_PATH=' + '/work/msan')
@@ -557,13 +564,14 @@
 
   # Patch MSan builds to use instrumented shared libraries.
   if sanitizer == 'memory':
-    docker_run(
-        [
-            '-v',
-            '%s:/out' % project_out_dir, '-v',
-            '%s:/work' % project_work_dir
-        ] + _env_to_docker_args(env) +
-        ['gcr.io/oss-fuzz-base/base-msan-builder', 'patch_build.py', '/out'])
+    docker_run([
+        '-v',
+        '%s:/out' % project_out_dir, '-v',
+        '%s:/work' % project_work_dir
+    ] + _env_to_docker_args(env) + [
+        'gcr.io/oss-fuzz-base/base-sanitizer-libs-builder', 'patch_build.py',
+        '/out'
+    ])
 
   return 0
 
@@ -733,6 +741,12 @@
 
   run_args = _env_to_docker_args(env)
 
+  if args.port:
+    run_args.extend([
+        '-p',
+        '%s:%s' % (args.port, args.port),
+    ])
+
   if args.corpus_dir:
     if not os.path.exists(args.corpus_dir):
       print('ERROR: the path provided in --corpus-dir argument does not exist',
@@ -746,8 +760,6 @@
   run_args.extend([
       '-v',
       '%s:/out' % _get_output_dir(args.project_name),
-      '-p',
-      '%s:%s' % (args.port, args.port),
       '-t',
       'gcr.io/oss-fuzz-base/base-runner',
   ])
@@ -782,14 +794,28 @@
   if args.e:
     env += args.e
 
-  run_args = _env_to_docker_args(env) + [
+  run_args = _env_to_docker_args(env)
+
+  if args.corpus_dir:
+    if not os.path.exists(args.corpus_dir):
+      print('ERROR: the path provided in --corpus-dir argument does not exist',
+            file=sys.stderr)
+      return 1
+    corpus_dir = os.path.realpath(args.corpus_dir)
+    run_args.extend([
+        '-v',
+        '{corpus_dir}:/tmp/{fuzzer}_corpus'.format(corpus_dir=corpus_dir,
+                                                   fuzzer=args.fuzzer_name)
+    ])
+
+  run_args.extend([
       '-v',
       '%s:/out' % _get_output_dir(args.project_name),
       '-t',
       'gcr.io/oss-fuzz-base/base-runner',
       'run_fuzzer',
       args.fuzzer_name,
-  ] + args.fuzzer_args
+  ] + args.fuzzer_args)
 
   return docker_run(run_args)
 
diff --git a/infra/jenkins-cluster/deployment-jenkins.yaml b/infra/jenkins-cluster/deployment-jenkins.yaml
deleted file mode 100644
index 6ff526d..0000000
--- a/infra/jenkins-cluster/deployment-jenkins.yaml
+++ /dev/null
@@ -1,60 +0,0 @@
-apiVersion: extensions/v1beta1
-kind: Deployment
-metadata:
-  name: jenkins-master
-spec:
-  replicas: 1
-  template:
-    metadata:
-      name: jenkins-master
-      labels:
-        app: jenkins-master
-    spec:
-      containers:
-      - name: jenkins
-        image: gcr.io/oss-fuzz-base/jenkins:20170726v4
-        env:
-          - name: JAVA_OPTS
-            value: "-Duser.timezone=America/Los_Angeles -Dhudson.security.csrf.requestfield=Jenkins-Crumb -Xmx16g -Djenkins.security.ApiTokenProperty.showTokenToAdmins=true"
-        ports:
-        - containerPort: 8080
-        - containerPort: 50000
-        volumeMounts:
-        - name: jenkins-home
-          mountPath: "/var/jenkins_home"
-        - name: secrets
-          mountPath: "/var/secrets"
-          readOnly: true
-        livenessProbe:
-          httpGet:
-            path: "/login"
-            port: 8080
-          initialDelaySeconds: 60
-          timeoutSeconds: 15
-        resources:
-          requests:
-            memory: "4Gi"
-            cpu: "4"
-      - name: kubectl-proxy
-        image: lachlanevenson/k8s-kubectl
-        args:
-          - "proxy"
-          - "-p"
-          - "8081"
-      volumes:
-      - name: jenkins-home
-        gcePersistentDisk:
-          pdName: jenkins-home
-          fsType: ext4
-      - name: secrets
-        secret:
-          secretName: secrets
-          items:
-            - key: build-service-account.json
-              path: build-service-account.json
-            - key: base-build-service-account.json
-              path: base-build-service-account.json
-            - key: tls-cert
-              path: cert.pem
-            - key: tls-key
-              path: cert.key
diff --git a/infra/jenkins-cluster/ingress-jenkins-https.yaml b/infra/jenkins-cluster/ingress-jenkins-https.yaml
deleted file mode 100644
index 396a9b6..0000000
--- a/infra/jenkins-cluster/ingress-jenkins-https.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
-  name: jenkins-https-ingress
-spec:
-  backend:
-    serviceName: jenkins-master
-    servicePort: 8080
-  tls:
-    - secretName: tls
diff --git a/infra/jenkins-cluster/server/Dockerfile b/infra/jenkins-cluster/server/Dockerfile
deleted file mode 100644
index c164a0c..0000000
--- a/infra/jenkins-cluster/server/Dockerfile
+++ /dev/null
@@ -1,19 +0,0 @@
-FROM jenkins/jenkins:lts
-USER root
-
-RUN mkdir /var/secrets
-RUN apt-get -y update && apt-get -y upgrade && apt-get -y install python-dev virtualenv python-pip build-essential
-
-WORKDIR /
-RUN wget https://dl.google.com/dl/cloudsdk/release/google-cloud-sdk.zip
-RUN unzip google-cloud-sdk.zip
-
-RUN /google-cloud-sdk/install.sh --usage-reporting=false --bash-completion=false --disable-installation-options
-RUN /google-cloud-sdk/bin/gcloud -q components install alpha beta
-RUN /google-cloud-sdk/bin/gcloud -q components update
-
-RUN chown -R jenkins:jenkins /google-cloud-sdk
-
-USER jenkins
-ENV JENKINS_OPTS --httpPort=8080 --httpsPort=8082 --httpsCertificate=/var/secrets/cert.pem --httpsPrivateKey=/var/secrets/cert.key
-ENV PATH=$PATH:/google-cloud-sdk/bin
diff --git a/infra/jenkins-cluster/service-jenkins-master.yaml b/infra/jenkins-cluster/service-jenkins-master.yaml
deleted file mode 100644
index f68dc2c..0000000
--- a/infra/jenkins-cluster/service-jenkins-master.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
-  name: jenkins-master
-  labels:
-    app: jenkins-master
-spec:
-  type: NodePort
-  selector:
-    app: jenkins-master
-  ports:
-  - name: agent
-    port: 50000
-  - name: http
-    port: 8080
-    targetPort: 8080
diff --git a/infra/presubmit.py b/infra/presubmit.py
index a4d61bd..8b56225 100755
--- a/infra/presubmit.py
+++ b/infra/presubmit.py
@@ -82,18 +82,19 @@
   VALID_SECTION_NAMES = [
       'architectures',
       'auto_ccs',
+      'builds_per_day',
       'coverage_extra_args',
       'disabled',
       'fuzzing_engines',
+      'help_url',
       'homepage',
+      'language',
+      'labels',  # For internal use only, hard to lint as it uses fuzzer names.
       'primary_contact',
       'sanitizers',
+      'selective_unpack',
       'vendor_ccs',
       'view_restrictions',
-      'language',
-      'help_url',
-      'labels',  # For internal use only, hard to lint as it uses fuzzer names.
-      'selective_unpack',
   ]
 
   LANGUAGES_SUPPORTED = [
diff --git a/infra/repo_manager.py b/infra/repo_manager.py
index 9465598..71f3e78 100644
--- a/infra/repo_manager.py
+++ b/infra/repo_manager.py
@@ -109,7 +109,21 @@
       The current active commit SHA.
     """
     out, _, _ = self.git(['rev-parse', 'HEAD'], check_result=True)
-    return out.strip('\n')
+    return out.strip()
+
+  def get_parent(self, commit, count):
+    """Gets the count'th parent of the given commit.
+
+    Returns:
+      The parent commit SHA.
+    """
+    self.fetch_unshallow()
+    out, _, err_code = self.git(['rev-parse', commit + '~' + str(count)],
+                                check_result=False)
+    if err_code:
+      return None
+
+    return out.strip()
 
   def get_commit_list(self, newest_commit, oldest_commit=None):
     """Gets the list of commits(inclusive) between the old and new commits.
diff --git a/infra/templates.py b/infra/templates.py
index 517a354..00ca322 100755
--- a/infra/templates.py
+++ b/infra/templates.py
@@ -39,7 +39,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER your@email.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 <git_url> %(project_name)s     # or use other version control
 WORKDIR %(project_name)s
diff --git a/infra/utils.py b/infra/utils.py
index 17cc237..1cde401 100644
--- a/infra/utils.py
+++ b/infra/utils.py
@@ -89,15 +89,15 @@
 
 def get_container_name():
   """Gets the name of the current docker container you are in.
-  /proc/self/cgroup can be used to check control groups e.g. Docker.
-  See: https://docs.docker.com/config/containers/runmetrics/ for more info.
 
   Returns:
     Container name or None if not in a container.
   """
-  with open('/proc/self/cgroup') as file_handle:
-    if 'docker' not in file_handle.read():
-      return None
+  result = subprocess.run(  # pylint: disable=subprocess-run-check
+      ['systemd-detect-virt', '-c'],
+      stdout=subprocess.PIPE).stdout
+  if b'docker' not in result:
+    return None
   with open('/etc/hostname') as file_handle:
     return file_handle.read().strip()
 
diff --git a/projects/abseil-cpp/BUILD b/projects/abseil-cpp/BUILD
new file mode 100644
index 0000000..d40194e
--- /dev/null
+++ b/projects/abseil-cpp/BUILD
@@ -0,0 +1,30 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+cc_binary(
+	name = "string_escape_fuzzer",
+	deps = ["@com_google_absl//absl/strings"],
+	srcs = ["string_escape_fuzzer.cc"],
+)
+
+cc_binary(
+	name = "string_utilities_fuzzer",
+	deps = [
+		"@com_google_absl//absl/strings",
+		"@com_google_absl//absl/strings:cord"
+		],
+	srcs = ["string_utilities_fuzzer.cc"],
+)
\ No newline at end of file
diff --git a/projects/abseil-cpp/Dockerfile b/projects/abseil-cpp/Dockerfile
new file mode 100644
index 0000000..09f6684
--- /dev/null
+++ b/projects/abseil-cpp/Dockerfile
@@ -0,0 +1,30 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get --no-install-recommends install -y build-essential make curl wget rsync
+
+RUN echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | tee /etc/apt/sources.list.d/bazel.list
+RUN curl https://bazel.build/bazel-release.pub.gpg | apt-key add -
+RUN apt-get update && apt-get install -y bazel
+RUN curl -Lo /usr/bin/bazel \
+        https://github.com/bazelbuild/bazelisk/releases/download/v1.1.0/bazelisk-linux-amd64 \
+        && \
+    chmod +x /usr/bin/bazel
+
+RUN git clone --depth 1 https://github.com/abseil/abseil-cpp.git
+
+COPY BUILD WORKSPACE build.sh string_escape_fuzzer.cc string_utilities_fuzzer.cc $SRC/
\ No newline at end of file
diff --git a/projects/abseil-cpp/WORKSPACE b/projects/abseil-cpp/WORKSPACE
new file mode 100644
index 0000000..e155690
--- /dev/null
+++ b/projects/abseil-cpp/WORKSPACE
@@ -0,0 +1,20 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+local_repository(
+	name = "com_google_absl",
+	path = "abseil-cpp/",
+)
diff --git a/projects/abseil-cpp/build.sh b/projects/abseil-cpp/build.sh
new file mode 100644
index 0000000..ec3acd4
--- /dev/null
+++ b/projects/abseil-cpp/build.sh
@@ -0,0 +1,68 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+readonly EXTRA_BAZEL_FLAGS="$(
+for f in ${CFLAGS}; do
+  echo "--conlyopt=${f}" "--linkopt=${f}"
+done
+for f in ${CXXFLAGS}; do
+  echo "--cxxopt=${f}" "--linkopt=${f}"
+done
+
+if [ "$SANITIZER" = "undefined" ]
+then
+  # Bazel uses clang to link binary, which does not link clang_rt ubsan library for C++ automatically.
+  # See issue: https://github.com/bazelbuild/bazel/issues/8777
+  echo "--linkopt=\"$(find $(llvm-config --libdir) -name libclang_rt.ubsan_standalone_cxx-x86_64.a | head -1)\""
+fi
+)"
+
+declare FUZZ_TARGETS=("string_escape_fuzzer" "string_utilities_fuzzer")
+
+bazel build \
+	--verbose_failures \
+	--dynamic_mode=off \
+	--spawn_strategy=standalone \
+	--genrule_strategy=standalone \
+	--strip=never \
+	--linkopt=-pthread \
+	--copt=${LIB_FUZZING_ENGINE} \
+	--linkopt=${LIB_FUZZING_ENGINE} \
+	--linkopt=-lc++ \
+	${EXTRA_BAZEL_FLAGS} \
+	${FUZZ_TARGETS[*]}
+
+
+if [ "$SANITIZER" = "coverage" ]
+then
+  # The build invoker looks for sources in $SRC, but it turns out that we need
+  # to not be buried under src/, paths are expected at out/proc/self/cwd by
+  # the profiler.
+  declare -r REMAP_PATH="${OUT}/proc/self/cwd"
+  mkdir -p "${REMAP_PATH}"
+  mkdir -p "${REMAP_PATH}/external/com_google_absl"
+  rsync -av "${SRC}"/abseil-cpp/absl "${REMAP_PATH}/external/com_google_absl"
+
+  declare -r RSYNC_FILTER_ARGS=("--include" "*.h" "--include" "*.cc" "--include" \
+    "*.hpp" "--include" "*.cpp" "--include" "*.c" "--include" "*/" "--exclude" "*")
+  rsync -avLk "${RSYNC_FILTER_ARGS[@]}" "${SRC}"/bazel-out "${REMAP_PATH}"
+  rsync -avLkR "${RSYNC_FILTER_ARGS[@]}" "${HOME}" "${OUT}"
+  rsync -avLkR "${RSYNC_FILTER_ARGS[@]}" /tmp "${OUT}"
+
+  cp *fuzzer.cc "${OUT}/proc/self/cwd"
+fi
+
+cp "./bazel-bin/"*fuzzer "${OUT}/"
diff --git a/projects/abseil-cpp/project.yaml b/projects/abseil-cpp/project.yaml
new file mode 100644
index 0000000..241f9c8
--- /dev/null
+++ b/projects/abseil-cpp/project.yaml
@@ -0,0 +1,3 @@
+homepage: "abseil.io"
+language: c++
+primary_contact: "abseil-io@googlegroups.com"
diff --git a/projects/abseil-cpp/string_escape_fuzzer.cc b/projects/abseil-cpp/string_escape_fuzzer.cc
new file mode 100644
index 0000000..581afab
--- /dev/null
+++ b/projects/abseil-cpp/string_escape_fuzzer.cc
@@ -0,0 +1,62 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include <string> 
+
+#include "absl/strings/escaping.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+	std::string str (reinterpret_cast<const char*>(data), size);
+	std::string escaped, unescaped;
+	escaped = absl::CHexEscape(str);
+	absl::CUnescape(escaped, &unescaped);
+	if (str != unescaped)
+		abort();
+
+	escaped = absl::CEscape(str);
+	absl::CUnescape(escaped, &unescaped);
+	if (str != unescaped)
+		abort();
+
+	escaped = absl::Utf8SafeCEscape(str);
+	absl::CUnescape(escaped, &unescaped);
+	if (str != unescaped)
+		abort();
+	
+	escaped = absl::Utf8SafeCHexEscape(str);
+	absl::CUnescape(escaped, &unescaped);
+	if (str != unescaped)
+		abort();
+	
+	std::string encoded, decoded;
+	absl::Base64Escape(str, &encoded);
+	absl::Base64Unescape(encoded, &decoded);
+	if (str != unescaped)
+		abort();
+
+	absl::WebSafeBase64Escape(str, &encoded);
+	absl::WebSafeBase64Unescape(encoded, &decoded);
+	if (str != decoded)
+		abort();
+
+	std::string hex_result, bytes_result;
+	hex_result = absl::BytesToHexString(str);
+	bytes_result = absl::HexStringToBytes(hex_result);
+	if (str != decoded)
+		abort();
+
+	return 0;
+}
\ No newline at end of file
diff --git a/projects/abseil-cpp/string_utilities_fuzzer.cc b/projects/abseil-cpp/string_utilities_fuzzer.cc
new file mode 100644
index 0000000..6735b7b
--- /dev/null
+++ b/projects/abseil-cpp/string_utilities_fuzzer.cc
@@ -0,0 +1,56 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include <string>
+
+#include <fuzzer/FuzzedDataProvider.h>
+
+#include "absl/strings/str_format.h"
+#include "absl/strings/str_join.h"
+#include "absl/strings/str_split.h"
+#include "absl/strings/numbers.h"
+#include "absl/strings/str_cat.h"
+
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+	FuzzedDataProvider fuzzed_data(data, size);
+	float float_value = fuzzed_data.ConsumeFloatingPoint<float>();
+	double double_value = fuzzed_data.ConsumeFloatingPoint<double>();
+	int int_value = fuzzed_data.ConsumeIntegral<int>();
+	bool bool_value = fuzzed_data.ConsumeBool();
+	std::string str1 = fuzzed_data.ConsumeRandomLengthString();
+	std::string str2 = fuzzed_data.ConsumeRemainingBytesAsString();
+
+	std::string float_str = absl::StrFormat("%g", float_value);
+	std::string double_str = absl::StrFormat("%g", double_value);
+	std::string int_str = absl::StrFormat("%d", int_value);
+	std::string bool_str = absl::StrFormat("%d", bool_value);
+	
+	if (!absl::SimpleAtof(float_str, &float_value))
+		return 0;
+	if (!absl::SimpleAtod(double_str, &double_value))
+		return 0;
+	if (!absl::SimpleAtoi(int_str, &int_value))
+		return 0;
+	if (!absl::SimpleAtob(bool_str, &bool_value))
+		return 0;
+
+	absl::StrAppend(&str1, str2);
+	std::string str_result = absl::StrCat(str1, float_value, double_value, int_value, bool_value);
+	std::vector<std::string> v = absl::StrSplit(str_result, ".");
+	absl::StrJoin(v, ".");
+	return 0;
+}
\ No newline at end of file
diff --git a/projects/arduinojson/Dockerfile b/projects/arduinojson/Dockerfile
index 66fb411..e2561d4 100644
--- a/projects/arduinojson/Dockerfile
+++ b/projects/arduinojson/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER oss-fuzz@benoitblanchon.fr
 RUN apt-get update && apt-get install -y make zip git
 RUN git clone --depth 1 https://github.com/bblanchon/ArduinoJson.git arduinojson
 WORKDIR arduinojson
diff --git a/projects/arrow/Dockerfile b/projects/arrow/Dockerfile
index 0cf533b..5161c28 100644
--- a/projects/arrow/Dockerfile
+++ b/projects/arrow/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER dev@arrow.apache.org
 
 ENV DEBIAN_FRONTEND noninteractive
 RUN apt-get update -y -q && \
diff --git a/projects/aspell/Dockerfile b/projects/aspell/Dockerfile
index a444a36..44c3ea0 100644
--- a/projects/aspell/Dockerfile
+++ b/projects/aspell/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER cmeister2@gmail.com
 
 RUN git clone --depth 1 https://github.com/gnuaspell/aspell.git $SRC/aspell
 RUN git clone --depth 1 -b master https://github.com/gnuaspell/aspell-fuzz.git $SRC/aspell-fuzz
diff --git a/projects/assimp/Dockerfile b/projects/assimp/Dockerfile
new file mode 100644
index 0000000..88564a7
--- /dev/null
+++ b/projects/assimp/Dockerfile
@@ -0,0 +1,22 @@
+# Copyright 2019 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y cmake ninja-build
+RUN git clone --depth 1 --recursive https://github.com/assimp/assimp.git
+WORKDIR assimp
+COPY build.sh $SRC/
+
diff --git a/projects/assimp/build.sh b/projects/assimp/build.sh
new file mode 100644
index 0000000..55efcb7
--- /dev/null
+++ b/projects/assimp/build.sh
@@ -0,0 +1,25 @@
+#!/bin/bash -eu
+# Copyright 2019 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+# generate build env and build assimp
+cmake CMakeLists.txt -G "Ninja" -DBUILD_SHARED_LIBS=OFF -DASSIMP_BUILD_ZLIB=ON -DASSIMP_BUILD_TESTS=OFF -DASSIMP_BUILD_ASSIMP_TOOLS=OFF -DASSIMP_BUILD_SAMPLES=OFF
+cmake --build .
+
+# build the fuzzer
+$CXX $CXXFLAGS -std=c++11 -I$SRC/assimp/include \
+	fuzz/assimp_fuzzer.cc -o $OUT/assimp_fuzzer \
+	$LIB_FUZZING_ENGINE $SRC/assimp/lib/libassimp.a $SRC/assimp/lib/libIrrXML.a $SRC/assimp/lib/libzlibstatic.a
diff --git a/projects/assimp/project.yaml b/projects/assimp/project.yaml
new file mode 100644
index 0000000..e2b0362
--- /dev/null
+++ b/projects/assimp/project.yaml
@@ -0,0 +1,8 @@
+homepage: "https://github.com/assimp/assimp"
+language: c++
+primary_contact: "kim.kulling@googlemail.com"
+sanitizers:
+  - address
+  - memory:
+     experimental: True
+  - undefined
diff --git "a/projects/assimp/\043project.yaml\043" b/projects/assimp/project_proposed.yaml
similarity index 100%
rename from "projects/assimp/\043project.yaml\043"
rename to projects/assimp/project_proposed.yaml
diff --git a/projects/augeas/Dockerfile b/projects/augeas/Dockerfile
index 5b84069..651be93 100644
--- a/projects/augeas/Dockerfile
+++ b/projects/augeas/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER hhan@redhat.com
 RUN apt-get update && apt-get install -y libreadline-dev libselinux1-dev \
     libxml2-dev make autoconf automake libtool pkg-config bison flex
 
diff --git a/projects/avahi/Dockerfile b/projects/avahi/Dockerfile
index 91f0b5f..d9e9c64 100644
--- a/projects/avahi/Dockerfile
+++ b/projects/avahi/Dockerfile
@@ -15,9 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER alex.gaynor@gmail.com
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
+RUN apt-get update && \
     apt-get install -y autoconf gettext libtool m4 automake pkg-config libexpat-dev libexpat-dev:i386
 RUN git clone --depth 1 https://github.com/lathiat/avahi
 WORKDIR avahi
diff --git a/projects/bad_example/Dockerfile b/projects/bad_example/Dockerfile
index eb69f25..d0a6810 100644
--- a/projects/bad_example/Dockerfile
+++ b/projects/bad_example/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mmoroz@chromium.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 
 # Using a real zlib project, but with broken build script and/or fuzz target.
diff --git a/projects/bignum-fuzzer/Dockerfile b/projects/bignum-fuzzer/Dockerfile
index cc31b61..4fcced6 100644
--- a/projects/bignum-fuzzer/Dockerfile
+++ b/projects/bignum-fuzzer/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get update && apt-get install -y software-properties-common python-software-properties wget curl sudo mercurial autoconf bison texinfo libboost-all-dev cmake
 RUN add-apt-repository -y ppa:gophers/archive && apt-get update && apt-get install -y golang-1.9-go
 RUN ln -s /usr/lib/go-1.9/bin/go /usr/bin/go
diff --git a/projects/bignum-fuzzer/project.yaml b/projects/bignum-fuzzer/project.yaml
index fd46e88..f85c934 100644
--- a/projects/bignum-fuzzer/project.yaml
+++ b/projects/bignum-fuzzer/project.yaml
@@ -12,6 +12,6 @@
     - "agl@google.com"
     - "davidben@google.com"
     - "svaldez@google.com"
-    - "support-mbedtls@arm.com"
+    - "mbed-tls-security@lists.trustedfirmware.org"
     - "libmpdec@gmail.com"
     - "richard@levitte.org"
diff --git a/projects/binutils/Dockerfile b/projects/binutils/Dockerfile
index d4b55e1..694e0bf 100644
--- a/projects/binutils/Dockerfile
+++ b/projects/binutils/Dockerfile
@@ -16,7 +16,6 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 #TODO change
-MAINTAINER bug-binutils@gnu.org
 RUN apt-get update && apt-get install -y make
 RUN apt-get install -y flex bison
 RUN git clone --recursive --depth 1 git://sourceware.org/git/binutils-gdb.git binutils-gdb
diff --git a/projects/bloaty/Dockerfile b/projects/bloaty/Dockerfile
index c41cdb9..7a08527 100644
--- a/projects/bloaty/Dockerfile
+++ b/projects/bloaty/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jhaberman@gmail.com
 RUN apt-get update && apt-get install -y cmake ninja-build g++
 RUN git clone --depth 1 https://github.com/google/bloaty.git bloaty
 WORKDIR bloaty
diff --git a/projects/boringssl/Dockerfile b/projects/boringssl/Dockerfile
index 4760fbf..33cc1c2 100644
--- a/projects/boringssl/Dockerfile
+++ b/projects/boringssl/Dockerfile
@@ -15,8 +15,12 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mike.aizatsky@gmail.com
-RUN apt-get update && apt-get install -y cmake ninja-build golang
-
+RUN apt-get update && apt-get install -y wget \
+    golang binutils cmake ninja-build liblzma-dev libz-dev \
+    pkg-config autoconf libtool
 RUN git clone --depth 1 https://boringssl.googlesource.com/boringssl
-COPY build.sh $SRC/
+# Use ASN.1 pdu protobuf and converter from the google/fuzzing repo.
+RUN git clone --depth 1 https://github.com/google/fuzzing.git
+RUN git clone --depth 1 https://github.com/google/libprotobuf-mutator.git
+RUN (mkdir LPM && cd LPM && cmake ../libprotobuf-mutator -GNinja -DLIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF=ON -DLIB_PROTO_MUTATOR_TESTING=OFF -DCMAKE_BUILD_TYPE=Release && ninja)
+COPY *.cc build.sh $SRC/
\ No newline at end of file
diff --git a/projects/boringssl/build.sh b/projects/boringssl/build.sh
index 26d9330..7e6302f 100755
--- a/projects/boringssl/build.sh
+++ b/projects/boringssl/build.sh
@@ -32,7 +32,6 @@
       $CMAKE_DEFINES $SRC/boringssl/
 ninja
 
-
 fuzzerFiles=$(find $SRC/boringssl/fuzz/ -name "*.cc")
 
 find . -name "*.a"
@@ -48,3 +47,26 @@
     zip -j $OUT/${fuzzerName}_seed_corpus.zip $SRC/boringssl/fuzz/${fuzzerName}_corpus/*
   fi
 done
+
+if [[ $CFLAGS != *sanitize=memory* ]]; then
+  fuzzerLPMFiles=$(find $SRC/ -maxdepth 1 -name "*.cc")
+
+  cp $SRC/fuzzing/proto/asn1-pdu/* $SRC/
+
+  rm -rf genfiles && mkdir genfiles && $SRC/LPM/external.protobuf/bin/protoc asn1_pdu.proto --cpp_out=genfiles --proto_path=$SRC/
+
+  for F in $fuzzerLPMFiles
+  do
+    fuzzerName=$(echo ${F#*_})
+    fuzzerName=$(basename $fuzzerName .cc)
+    echo "Building fuzzer $fuzzerName"
+    $CXX $CXXFLAGS -I genfiles -I . -I $SRC/libprotobuf-mutator/ -I $SRC/LPM/external.protobuf/include -I include $LIB_FUZZING_ENGINE \
+        -I $SRC/boringssl/include \
+        $F genfiles/asn1_pdu.pb.cc $SRC/asn1_pdu_to_der.cc $SRC/common.cc \
+        ./ssl/libssl.a ./crypto/libcrypto.a \
+        $SRC/LPM/src/libfuzzer/libprotobuf-mutator-libfuzzer.a \
+        $SRC/LPM/src/libprotobuf-mutator.a \
+        $SRC/LPM/external.protobuf/lib/libprotobuf.a \
+        -o $OUT/"${fuzzerName}_lpm"
+  done
+fi
diff --git a/projects/boringssl/fuzz_certs.cc b/projects/boringssl/fuzz_certs.cc
new file mode 100644
index 0000000..d8d2a24
--- /dev/null
+++ b/projects/boringssl/fuzz_certs.cc
@@ -0,0 +1,46 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// This fuzz target fuzzes the same API as
+// https://github.com/google/boringssl/blob/master/fuzz/cert.cc, but it employs
+// libprotobuf-mutator for structure-aware fuzzing.
+
+#include <openssl/err.h>
+#include <openssl/mem.h>
+#include <openssl/x509.h>
+#include "asn1_pdu.pb.h"
+#include "asn1_pdu_to_der.h"
+#include "libprotobuf-mutator/src/libfuzzer/libfuzzer_macro.h"
+
+DEFINE_PROTO_FUZZER(const asn1_pdu::PDU& asn1) {
+  asn1_pdu::ASN1PDUToDER converter;
+  std::vector<uint8_t> encoded = converter.PDUToDER(asn1);
+  const uint8_t* buf = encoded.data();
+  size_t len = encoded.size();
+
+  X509* x509 = d2i_X509(NULL, &buf, len);
+  if (x509 != NULL) {
+    // Extract the public key.
+    EVP_PKEY_free(X509_get_pubkey(x509));
+
+    // Reserialize the structure.
+    uint8_t* der = NULL;
+    i2d_X509(x509, &der);
+    OPENSSL_free(der);
+  }
+  X509_free(x509);
+  ERR_clear_error();
+}
\ No newline at end of file
diff --git a/projects/boringssl/fuzz_pkcs12.cc b/projects/boringssl/fuzz_pkcs12.cc
new file mode 100644
index 0000000..11cded4
--- /dev/null
+++ b/projects/boringssl/fuzz_pkcs12.cc
@@ -0,0 +1,41 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// This fuzz target fuzzes the same API as
+// https://github.com/google/boringssl/blob/master/fuzz/pkcs12.cc, but it
+// employs libprotobuf-mutator for structure-aware fuzzing.
+
+#include <openssl/bytestring.h>
+#include <openssl/evp.h>
+#include <openssl/pkcs8.h>
+#include <openssl/x509.h>
+#include "asn1_pdu.pb.h"
+#include "asn1_pdu_to_der.h"
+#include "libprotobuf-mutator/src/libfuzzer/libfuzzer_macro.h"
+
+DEFINE_PROTO_FUZZER(const asn1_pdu::PDU& asn1) {
+  asn1_pdu::ASN1PDUToDER converter;
+  std::vector<uint8_t> encoded = converter.PDUToDER(asn1);
+  const uint8_t* buf = encoded.data();
+  size_t len = encoded.size();
+
+  bssl::UniquePtr<STACK_OF(X509)> certs(sk_X509_new_null());
+  EVP_PKEY* key = nullptr;
+  CBS cbs;
+  CBS_init(&cbs, buf, len);
+  PKCS12_get_key_and_certs(&key, certs.get(), &cbs, "foo");
+  EVP_PKEY_free(key);
+}
\ No newline at end of file
diff --git a/projects/boringssl/fuzz_pkcs8.cc b/projects/boringssl/fuzz_pkcs8.cc
new file mode 100644
index 0000000..a657d8b
--- /dev/null
+++ b/projects/boringssl/fuzz_pkcs8.cc
@@ -0,0 +1,51 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// This fuzz target fuzzes the same API as
+// https://github.com/google/boringssl/blob/master/fuzz/pkcs8.cc, but it employs
+// libprotobuf-mutator for structure-aware fuzzing.
+
+#include <openssl/bytestring.h>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include <openssl/mem.h>
+#include "asn1_pdu.pb.h"
+#include "asn1_pdu_to_der.h"
+#include "libprotobuf-mutator/src/libfuzzer/libfuzzer_macro.h"
+
+DEFINE_PROTO_FUZZER(const asn1_pdu::PDU& asn1) {
+  asn1_pdu::ASN1PDUToDER converter;
+  std::vector<uint8_t> encoded = converter.PDUToDER(asn1);
+  const uint8_t* buf = encoded.data();
+  size_t len = encoded.size();
+
+  CBS cbs;
+  CBS_init(&cbs, buf, len);
+  bssl::UniquePtr<EVP_PKEY> pkey(EVP_parse_private_key(&cbs));
+  if (pkey == NULL) {
+    return;
+  }
+
+  uint8_t* der;
+  size_t der_len;
+  bssl::ScopedCBB cbb;
+  if (CBB_init(cbb.get(), 0) &&
+      EVP_marshal_private_key(cbb.get(), pkey.get()) &&
+      CBB_finish(cbb.get(), &der, &der_len)) {
+    OPENSSL_free(der);
+  }
+  ERR_clear_error();
+}
\ No newline at end of file
diff --git a/projects/botan/Dockerfile b/projects/botan/Dockerfile
index d048940..8055967 100644
--- a/projects/botan/Dockerfile
+++ b/projects/botan/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jack@randombit.net
 RUN apt-get update && apt-get install -y make python
 RUN git clone --depth 1 https://github.com/randombit/botan.git botan
 RUN git clone --depth 1 https://github.com/randombit/crypto-corpus.git fuzzer_corpus
diff --git a/projects/brotli/Dockerfile b/projects/brotli/Dockerfile
index db25382..1f20de2 100644
--- a/projects/brotli/Dockerfile
+++ b/projects/brotli/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER eustas@chromium.org
 RUN apt-get update && apt-get install -y cmake libtool make
 
 RUN git clone --depth 1 https://github.com/google/brotli.git
diff --git a/projects/brunsli/Dockerfile b/projects/brunsli/Dockerfile
new file mode 100644
index 0000000..24dc994
--- /dev/null
+++ b/projects/brunsli/Dockerfile
@@ -0,0 +1,24 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y cmake libtool make
+
+RUN git clone --depth 1 https://github.com/google/brunsli.git && \
+    cd brunsli && \
+    git submodule update --init --depth 1
+WORKDIR brunsli
+COPY build.sh $SRC/
diff --git a/projects/brunsli/build.sh b/projects/brunsli/build.sh
new file mode 100755
index 0000000..adf4cf2
--- /dev/null
+++ b/projects/brunsli/build.sh
@@ -0,0 +1,34 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+cmake . -DBUILD_TESTING=OFF
+make clean
+make -j$(nproc) brunslidec-static
+
+# TODO(eustas): add seed corpus
+
+$CXX $CXXFLAGS -std=c++11 -I./c/include c/tests/fuzz_decode.cc \
+    -o $OUT/fuzz_decode $LIB_FUZZING_ENGINE \
+    ./libbrunslidec-static.a ./libbrunslicommon-static.a \
+    ./third_party/brotli/libbrotlidec-static.a \
+    ./third_party/brotli/libbrotlicommon-static.a
+
+$CXX $CXXFLAGS -std=c++11 -I./c/include c/tests/fuzz_decode_streaming.cc \
+    -o $OUT/fuzz_decode_streaming $LIB_FUZZING_ENGINE \
+    ./libbrunslidec-static.a ./libbrunslicommon-static.a \
+    ./third_party/brotli/libbrotlidec-static.a \
+    ./third_party/brotli/libbrotlicommon-static.a
diff --git a/projects/brunsli/project.yaml b/projects/brunsli/project.yaml
new file mode 100644
index 0000000..7eb3aeb
--- /dev/null
+++ b/projects/brunsli/project.yaml
@@ -0,0 +1,17 @@
+homepage: "https://github.com/google/brunsli"
+language: c++
+primary_contact: "eustas@chromium.org"
+vendor_ccs:
+  - "jkew@mozilla.com"
+  - "twsmith@mozilla.com"
+fuzzing_engines:
+  - libfuzzer
+  - afl
+  - honggfuzz
+sanitizers:
+  - address
+  - memory
+  - undefined
+architectures:
+  - x86_64
+  - i386
diff --git a/projects/bzip2/Dockerfile b/projects/bzip2/Dockerfile
index 356ad82..0031695 100644
--- a/projects/bzip2/Dockerfile
+++ b/projects/bzip2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER bshas3@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool wget
 RUN git clone git://sourceware.org/git/bzip2.git
 RUN git clone git://sourceware.org/git/bzip2-tests.git
diff --git a/projects/c-ares/Dockerfile b/projects/c-ares/Dockerfile
index 96b4eec..ea15506 100644
--- a/projects/c-ares/Dockerfile
+++ b/projects/c-ares/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mmoroz@chromium.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://github.com/c-ares/c-ares.git
 WORKDIR c-ares
diff --git a/projects/c-blosc/Dockerfile b/projects/c-blosc/Dockerfile
index aed3eca..5037037 100644
--- a/projects/c-blosc/Dockerfile
+++ b/projects/c-blosc/Dockerfile
@@ -15,8 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER blosc.oss.fuzz@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool cmake
 RUN git clone --depth 1 https://github.com/Blosc/c-blosc.git c-blosc
 WORKDIR c-blosc
-COPY build.sh blosc_fuzzer.cc $SRC/
+COPY build.sh $SRC/
\ No newline at end of file
diff --git a/projects/c-blosc/build.sh b/projects/c-blosc/build.sh
index 311ed2c..4b1a5a6 100755
--- a/projects/c-blosc/build.sh
+++ b/projects/c-blosc/build.sh
@@ -15,17 +15,15 @@
 #
 ################################################################################
 
-# build project
-mkdir -p build_dir
-pushd build_dir
-cmake ..
+# Build project
+cmake . -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" -DBUILD_FUZZERS=ON
+make clean
 make -j$(nproc)
-popd
 
-# build fuzzers
-for fuzzers in $(find $SRC -name '*_fuzzer.cc'); do
-  fuzz_basename=$(basename -s .cc $fuzzers)
-  $CXX $CXXFLAGS -std=c++11 -I. -I../blosc/ \
-  $fuzzers $LIB_FUZZING_ENGINE ./build_dir/blosc/libblosc.a  \
-  -o $OUT/$fuzz_basename
-done
+# Package seed corpus
+zip -j $OUT/decompress_fuzzer_seed_corpus.zip compat/*.cdata
+
+# Copy the fuzzer executables, zip-ed corpora, and dictionary files to $OUT
+find . -name '*_fuzzer' -exec cp -v '{}' $OUT ';'
+find . -name '*_fuzzer.dict' -exec cp -v '{}' $OUT ';'
+find . -name '*_fuzzer_seed_corpus.zip' -exec cp -v '{}' $OUT ';'
\ No newline at end of file
diff --git a/projects/c-blosc/project.yaml b/projects/c-blosc/project.yaml
index c87aa39..b4c35d8 100644
--- a/projects/c-blosc/project.yaml
+++ b/projects/c-blosc/project.yaml
@@ -1,9 +1,12 @@
 homepage: "https://github.com/Blosc/c-blosc"
 language: c++
 primary_contact: "blosc.oss.fuzz@gmail.com"
+auto_ccs:
+  - "nathan.moinvaziri@gmail.com"
 sanitizers:
   - address
   - memory
+  - undefined
 architectures:
   - x86_64
   - i386
diff --git a/projects/c-blosc2/Dockerfile b/projects/c-blosc2/Dockerfile
new file mode 100644
index 0000000..cdd4200
--- /dev/null
+++ b/projects/c-blosc2/Dockerfile
@@ -0,0 +1,21 @@
+# Copyright 2019 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y make autoconf automake libtool cmake
+RUN git clone --depth 1 https://github.com/Blosc/c-blosc2.git c-blosc2
+WORKDIR c-blosc2
+COPY build.sh $SRC/
\ No newline at end of file
diff --git a/projects/c-blosc2/build.sh b/projects/c-blosc2/build.sh
new file mode 100755
index 0000000..4b1a5a6
--- /dev/null
+++ b/projects/c-blosc2/build.sh
@@ -0,0 +1,29 @@
+#!/bin/bash -eu
+# Copyright 2019 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+# Build project
+cmake . -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" -DBUILD_FUZZERS=ON
+make clean
+make -j$(nproc)
+
+# Package seed corpus
+zip -j $OUT/decompress_fuzzer_seed_corpus.zip compat/*.cdata
+
+# Copy the fuzzer executables, zip-ed corpora, and dictionary files to $OUT
+find . -name '*_fuzzer' -exec cp -v '{}' $OUT ';'
+find . -name '*_fuzzer.dict' -exec cp -v '{}' $OUT ';'
+find . -name '*_fuzzer_seed_corpus.zip' -exec cp -v '{}' $OUT ';'
\ No newline at end of file
diff --git a/projects/c-blosc2/project.yaml b/projects/c-blosc2/project.yaml
new file mode 100644
index 0000000..1a1e641
--- /dev/null
+++ b/projects/c-blosc2/project.yaml
@@ -0,0 +1,12 @@
+homepage: "https://github.com/Blosc/c-blosc2"
+language: c++
+primary_contact: "blosc.oss.fuzz@gmail.com"
+auto_ccs:
+  - "nathan.moinvaziri@gmail.com"
+sanitizers:
+  - address
+  - memory
+  - undefined
+architectures:
+  - x86_64
+  - i386
diff --git a/projects/capstone/Dockerfile b/projects/capstone/Dockerfile
index d4ef223..6f157a9 100644
--- a/projects/capstone/Dockerfile
+++ b/projects/capstone/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER capstone.engine@gmail.com
 RUN apt-get update && apt-get install -y make cmake python python-setuptools
 RUN git clone --depth 1 --branch v4 https://github.com/aquynh/capstone.git capstonev4
 RUN git clone --depth 1 --branch next https://github.com/aquynh/capstone.git capstonenext
diff --git a/projects/cascadia/Dockerfile b/projects/cascadia/Dockerfile
index c1b7c93..7c6f58d 100644
--- a/projects/cascadia/Dockerfile
+++ b/projects/cascadia/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER cascadia@balholm.com
 RUN go get github.com/andybalholm/cascadia
 
 COPY build.sh $SRC/
diff --git a/projects/casync/Dockerfile b/projects/casync/Dockerfile
index 6351a4c..da6bab7 100644
--- a/projects/casync/Dockerfile
+++ b/projects/casync/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER zbyszek@in.waw.pl
 RUN apt-get update && \
     apt-get install -y \
         python3-pip pkg-config wget \
diff --git a/projects/cifuzz-example/Dockerfile b/projects/cifuzz-example/Dockerfile
new file mode 100644
index 0000000..af1fd05
--- /dev/null
+++ b/projects/cifuzz-example/Dockerfile
@@ -0,0 +1,22 @@
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y make
+
+RUN git clone https://github.com/jonathanmetzman/cifuzz-example.git
+WORKDIR cifuzz-example
+COPY build.sh $SRC/
diff --git a/projects/cifuzz-example/build.sh b/projects/cifuzz-example/build.sh
new file mode 100755
index 0000000..874a55a
--- /dev/null
+++ b/projects/cifuzz-example/build.sh
@@ -0,0 +1,26 @@
+#!/bin/bash -eu
+# Copyright 2020 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+make clean  # Not strictly necessary, since we are building in a fresh dir.
+make -j$(nproc) all    # Build the fuzz targets.
+# make -j$(nproc) check  # Sanity check, not strictly required, but nice to have.
+
+# Copy the fuzzer executables, zip-ed corpora, option and dictionary files to $OUT
+find . -name '*_fuzzer' -exec cp -v '{}' $OUT ';'
+find . -name '*_fuzzer.dict' -exec cp -v '{}' $OUT ';'     # If you have dictionaries.
+find . -name '*_fuzzer.options' -exec cp -v '{}' $OUT ';'  # If you have custom options.
+find . -name '*_fuzzer_seed_corpus.zip' -exec cp -v '{}' $OUT ';' # If you have seed corpora (you better have them!)
diff --git a/projects/cifuzz-example/project.yaml b/projects/cifuzz-example/project.yaml
new file mode 100644
index 0000000..d81c298
--- /dev/null
+++ b/projects/cifuzz-example/project.yaml
@@ -0,0 +1,8 @@
+language: c++
+sanitizers:
+  - address
+
+disabled: true
+
+primary_contact:
+  fake@example.com
diff --git a/projects/cjson/Dockerfile b/projects/cjson/Dockerfile
index 925dd66..30597b8 100644
--- a/projects/cjson/Dockerfile
+++ b/projects/cjson/Dockerfile
@@ -17,7 +17,6 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 
-MAINTAINER randy408@protonmail.com
 
 RUN apt-get update && apt-get install -y cmake
 
diff --git a/projects/clamav/Dockerfile b/projects/clamav/Dockerfile
index 0b97bc3..c38ae91 100644
--- a/projects/clamav/Dockerfile
+++ b/projects/clamav/Dockerfile
@@ -15,9 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER clamav.fuzz@gmail.com
 RUN apt-get update && apt-get install -y \
     flex bison \
+    automake autoconf pkg-config m4 libtool \
     libssl-dev \
     libcurl4-openssl-dev
 RUN git clone --depth 1 https://github.com/Cisco-Talos/clamav-devel.git
diff --git a/projects/clamav/build.sh b/projects/clamav/build.sh
index 4b54632..0ab07e0 100755
--- a/projects/clamav/build.sh
+++ b/projects/clamav/build.sh
@@ -24,6 +24,15 @@
 mkdir -p ${WORK}/build
 cd ${WORK}/build
 
+if [ -f "${SRC}/clamav-devel/autogen.sh" ]
+then
+    /bin/chmod +x ${SRC}/clamav-devel/autogen.sh
+    ${SRC}/clamav-devel/autogen.sh
+fi
+
+# Remove ltdl so clamav build doesn't detect it and add it as a dependency.
+apt remove -y libtool libltdl-dev libltdl7
+
 #
 # Run ./configure
 #
diff --git a/projects/cmark/Dockerfile b/projects/cmark/Dockerfile
index ad404ac..99d8112 100644
--- a/projects/cmark/Dockerfile
+++ b/projects/cmark/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER philipturnbull@github.com
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone --depth 1 https://github.com/commonmark/cmark.git cmark
 WORKDIR cmark
diff --git a/projects/cppcheck/Dockerfile b/projects/cppcheck/Dockerfile
index 2686254..5bec928 100644
--- a/projects/cppcheck/Dockerfile
+++ b/projects/cppcheck/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER daniel.marjamaki@gmail.com
 
 RUN git clone https://github.com/danmar/cppcheck.git
 
diff --git a/projects/cpython3/Dockerfile b/projects/cpython3/Dockerfile
index 154076b..6ca60d4 100644
--- a/projects/cpython3/Dockerfile
+++ b/projects/cpython3/Dockerfile
@@ -1,5 +1,4 @@
 FROM gcr.io/oss-fuzz-base/base-builder
-LABEL maintainer="aaskar@google.com; ammar@ammaraskar.com"
 
 RUN apt-get update
 RUN apt-get install -y build-essential libncursesw5-dev \
diff --git a/projects/cras/Dockerfile b/projects/cras/Dockerfile
index 0b77c63..8740fcc 100644
--- a/projects/cras/Dockerfile
+++ b/projects/cras/Dockerfile
@@ -5,7 +5,6 @@
 # Defines a docker image that can build cras fuzzers.
 #
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER dgreid@chromium.org
 
 RUN apt-get -y update && \
       apt-get install -y \
diff --git a/projects/cryptofuzz/Dockerfile b/projects/cryptofuzz/Dockerfile
index 85411e5..63b07b3 100644
--- a/projects/cryptofuzz/Dockerfile
+++ b/projects/cryptofuzz/Dockerfile
@@ -15,14 +15,13 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 
 RUN apt-get update && \
     apt-get install -y apt-transport-https ca-certificates gnupg software-properties-common wget && \
     wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | apt-key add - && \
     apt-add-repository 'deb https://apt.kitware.com/ubuntu/ xenial main' && \
     apt-get update && \
-    apt-get install -y software-properties-common python-software-properties make autoconf automake libtool build-essential cmake libboost-all-dev mercurial gyp ninja-build zlib1g-dev libsqlite3-dev
+    apt-get install -y software-properties-common python-software-properties make autoconf automake libtool build-essential cmake libboost-all-dev mercurial gyp ninja-build zlib1g-dev libsqlite3-dev bison flex texinfo
 
 # BoringSSL needs Go to build
 RUN add-apt-repository -y ppa:gophers/archive && apt-get update && apt-get install -y golang-1.9-go
@@ -43,12 +42,15 @@
 RUN git clone --depth 1 https://github.com/golang/go
 RUN git clone --depth 1 https://github.com/randombit/botan.git
 RUN git clone --depth 1 https://github.com/wolfSSL/wolfssl.git
-RUN git clone --depth 1 https://github.com/ARMmbed/mbed-crypto.git
+RUN git clone --depth 1 https://github.com/ARMmbed/mbedtls.git
 RUN hg clone https://hg.mozilla.org/projects/nspr
 RUN hg clone https://hg.mozilla.org/projects/nss
 RUN git clone --depth 1 https://github.com/jedisct1/libsodium.git
 RUN git clone --depth 1 https://github.com/libtom/libtomcrypt.git
 RUN git clone --depth 1 https://github.com/microsoft/SymCrypt.git
+RUN git clone --depth 1 https://git.lysator.liu.se/nettle/nettle
+RUN hg clone https://gmplib.org/repo/gmp/ libgmp/
+RUN wget https://www.bytereef.org/software/mpdecimal/releases/mpdecimal-2.5.0.tar.gz
 RUN apt-get remove -y libunwind8
 RUN apt-get install -y libssl-dev
 
diff --git a/projects/cryptofuzz/build.sh b/projects/cryptofuzz/build.sh
index 04a8987..5b43a04 100755
--- a/projects/cryptofuzz/build.sh
+++ b/projects/cryptofuzz/build.sh
@@ -116,6 +116,65 @@
     make -B
 fi
 
+# Compile Nettle
+mkdir $SRC/nettle-install/
+cd $SRC/nettle/
+bash .bootstrap
+if [[ $CFLAGS != *sanitize=memory* ]]
+then
+    ./configure --disable-documentation --disable-openssl --prefix=`realpath ../nettle-install`
+else
+    ./configure --disable-documentation --disable-openssl --disable-assembler --prefix=`realpath ../nettle-install`
+fi
+make -j$(nproc)
+make install
+if [[ $CFLAGS != *-m32* ]]
+then
+export LIBNETTLE_A_PATH=`realpath ../nettle-install/lib/libnettle.a`
+else
+export LIBNETTLE_A_PATH=`realpath ../nettle-install/lib32/libnettle.a`
+fi
+export NETTLE_INCLUDE_PATH=`realpath ../nettle-install/include`
+export CXXFLAGS="$CXXFLAGS -DCRYPTOFUZZ_NETTLE"
+# Compile Cryptofuzz Nettle module
+cd $SRC/cryptofuzz/modules/nettle
+make -B
+
+# Compile libgmp
+if [[ $CFLAGS != *sanitize=memory* ]]
+then
+    cd $SRC/libgmp/
+    autoreconf -ivf
+    if [[ $CFLAGS != *-m32* ]]
+    then
+        ./configure --enable-maintainer-mode
+    else
+        setarch i386 ./configure --enable-maintainer-mode
+    fi
+    make -j$(nproc)
+    export CXXFLAGS="$CXXFLAGS -DCRYPTOFUZZ_LIBGMP"
+    export LIBGMP_INCLUDE_PATH=$(realpath .)
+    export LIBGMP_A_PATH=$(realpath .libs/libgmp.a)
+    # Compile Cryptofuzz libgmp module
+    cd $SRC/cryptofuzz/modules/libgmp
+    make -B
+fi
+
+# Compile mpdecimal
+cd $SRC/
+tar zxf mpdecimal-2.5.0.tar.gz
+cd mpdecimal-2.5.0/
+./configure
+cd libmpdec/
+make libmpdec.a -j$(nproc)
+cd ../
+export CXXFLAGS="$CXXFLAGS -DCRYPTOFUZZ_MPDECIMAL"
+export LIBMPDEC_A_PATH=$(realpath libmpdec/libmpdec.a)
+export LIBMPDEC_INCLUDE_PATH=$(realpath libmpdec/)
+# Compile Cryptofuzz mpdecimal module
+cd $SRC/cryptofuzz/modules/mpdecimal
+make -B
+
 # Compile Cityhash
 cd $SRC/cityhash
 if [[ $CFLAGS != *-m32* ]]
@@ -148,9 +207,14 @@
 make -B
 
 ##############################################################################
-# Compile mbed crypto
-cd $SRC/mbed-crypto/
+# Compile mbed TLS
+cd $SRC/mbedtls/
 scripts/config.pl set MBEDTLS_PLATFORM_MEMORY
+scripts/config.pl set MBEDTLS_CMAC_C
+scripts/config.pl set MBEDTLS_NIST_KW_C
+scripts/config.pl set MBEDTLS_ARIA_C
+scripts/config.pl set MBEDTLS_MD2_C
+scripts/config.pl set MBEDTLS_MD4_C
 if [[ $CFLAGS == *sanitize=memory* ]]
 then
     scripts/config.pl unset MBEDTLS_HAVE_ASM
@@ -161,8 +225,8 @@
 cd build/
 cmake .. -DENABLE_PROGRAMS=0 -DENABLE_TESTING=0
 make -j$(nproc) >/dev/null 2>&1
-export MBEDTLS_LIBMBEDCRYPTO_A_PATH="$SRC/mbed-crypto/build/library/libmbedcrypto.a"
-export MBEDTLS_INCLUDE_PATH="$SRC/mbed-crypto/include"
+export MBEDTLS_LIBMBEDCRYPTO_A_PATH="$SRC/mbedtls/build/library/libmbedcrypto.a"
+export MBEDTLS_INCLUDE_PATH="$SRC/mbedtls/include"
 export CXXFLAGS="$CXXFLAGS -DCRYPTOFUZZ_MBEDTLS"
 # Compile Cryptofuzz mbed crypto module
 cd $SRC/cryptofuzz/modules/mbedtls
@@ -326,7 +390,7 @@
 cd $SRC/wolfssl
 autoreconf -ivf
 
-export WOLFCRYPT_CONFIGURE_PARAMS="--enable-static --enable-md2 --enable-md4 --enable-ripemd --enable-blake2 --enable-blake2s --enable-pwdbased --enable-scrypt --enable-hkdf --enable-cmac --enable-arc4 --enable-camellia --enable-rabbit --enable-aesccm --enable-aesctr --enable-hc128 --enable-xts --enable-des3 --enable-idea --enable-x963kdf --enable-harden --enable-aescfb --enable-aesofb"
+export WOLFCRYPT_CONFIGURE_PARAMS="--enable-static --enable-md2 --enable-md4 --enable-ripemd --enable-blake2 --enable-blake2s --enable-pwdbased --enable-scrypt --enable-hkdf --enable-cmac --enable-arc4 --enable-camellia --enable-rabbit --enable-aesccm --enable-aesctr --enable-hc128 --enable-xts --enable-des3 --enable-idea --enable-x963kdf --enable-harden --enable-aescfb --enable-aesofb --enable-aeskeywrap --enable-shake256 --enable-curve25519 --enable-curve448 --disable-crypttests --disable-examples"
 
 if [[ $CFLAGS = *sanitize=memory* ]]
 then
diff --git a/projects/cryptofuzz/project.yaml b/projects/cryptofuzz/project.yaml
index 91b002b..ee27959 100644
--- a/projects/cryptofuzz/project.yaml
+++ b/projects/cryptofuzz/project.yaml
@@ -30,6 +30,7 @@
     - "tvandermerwe@mozilla.com"
     - "matthias.st.pierre@gmail.com"
     - "kaleb.himes@gmail.com"
+    - "polubelovam@gmail.com"
 sanitizers:
  - address
  - undefined
diff --git a/projects/curl/Dockerfile b/projects/curl/Dockerfile
index dcd1239..1dc106a 100644
--- a/projects/curl/Dockerfile
+++ b/projects/curl/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER dvyukov@google.com
 
 RUN git clone --depth 1 https://github.com/curl/curl.git /src/curl
 RUN git clone --depth 1 https://github.com/curl/curl-fuzzer.git /src/curl_fuzzer
diff --git a/projects/dav1d/Dockerfile b/projects/dav1d/Dockerfile
index 9ce8fe7..81a4e59 100644
--- a/projects/dav1d/Dockerfile
+++ b/projects/dav1d/Dockerfile
@@ -15,14 +15,12 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER janne-vlc@jannau.net
 
 ADD nasm.list /etc/apt/sources.list.d/nasm.list
 ADD nasm_apt.pin /etc/apt/preferences
 
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
-    apt-get install --no-install-recommends -y libstdc++-5-dev libstdc++-5-dev:i386 curl python3-pip python3-setuptools python3-wheel nasm && \
+RUN apt-get update && \
+    apt-get install --no-install-recommends -y curl python3-pip python3-setuptools python3-wheel nasm && \
     pip3 install meson ninja
 RUN curl --silent -O https://storage.googleapis.com/aom-test-data/fuzzer/dec_fuzzer_seed_corpus.zip
 RUN curl --silent -O https://jannau.net/dav1d_fuzzer_seed_corpus.zip
diff --git a/projects/dav1d/build.sh b/projects/dav1d/build.sh
index 252817f..e1384ee 100755
--- a/projects/dav1d/build.sh
+++ b/projects/dav1d/build.sh
@@ -46,7 +46,7 @@
 (cd ${WORK}/tmp && zip -q -m -r -0 ${WORK}/tmp/seed_corpus.zip testdata)
 
 # copy fuzzers and link testdata
-for fuzzer in $(find ${build} -name 'dav1d_fuzzer*'); do
+for fuzzer in $(find ${build}/tests/libfuzzer -maxdepth 1 -type f -executable -name 'dav1d_fuzzer*'); do
 	cp "${fuzzer}" $OUT/
 	cp ${WORK}/tmp/seed_corpus.zip $OUT/$(basename "$fuzzer")_seed_corpus.zip
 done
diff --git a/projects/django/Dockerfile b/projects/django/Dockerfile
index 8d55326..3df03f9 100644
--- a/projects/django/Dockerfile
+++ b/projects/django/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get install -y build-essential libncursesw5-dev libreadline-dev libssl-dev libgdbm-dev libc6-dev libsqlite3-dev tk-dev libbz2-dev zlib1g-dev libffi-dev wget
 RUN wget -q https://github.com/python/cpython/archive/v3.8.0b2.tar.gz
 RUN git clone --depth 1 https://github.com/guidovranken/django-fuzzers.git
diff --git a/projects/dlplibs/Dockerfile b/projects/dlplibs/Dockerfile
index ec2e29e..9c52a61 100644
--- a/projects/dlplibs/Dockerfile
+++ b/projects/dlplibs/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER dtardon@redhat.com
 # install build requirements
 RUN apt-get update && \
     apt-get install -y wget xz-utils autoconf automake libtool pkg-config \
diff --git a/projects/double-conversion/Dockerfile b/projects/double-conversion/Dockerfile
index 08aa8db..56ac7cb 100644
--- a/projects/double-conversion/Dockerfile
+++ b/projects/double-conversion/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER sbucur@google.com
 
 RUN apt-get update && \
     apt-get install -y --no-install-recommends \
diff --git a/projects/dovecot/Dockerfile b/projects/dovecot/Dockerfile
index 65393c4..b888e65 100755
--- a/projects/dovecot/Dockerfile
+++ b/projects/dovecot/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER david@adalogics.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool wget gettext automake libxml2-dev m4 pkg-config
 RUN git clone --depth 1 --single-branch --branch fuzzer https://github.com/dovecot/core dovecot
 WORKDIR dovecot
diff --git a/projects/draco/Dockerfile b/projects/draco/Dockerfile
new file mode 100644
index 0000000..772ae6d
--- /dev/null
+++ b/projects/draco/Dockerfile
@@ -0,0 +1,21 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y git cmake make pkg-config
+RUN git clone --depth 1 https://github.com/google/draco draco
+COPY build.sh $SRC/
+WORKDIR $WORK/
diff --git a/projects/draco/build.sh b/projects/draco/build.sh
new file mode 100755
index 0000000..1ebc898
--- /dev/null
+++ b/projects/draco/build.sh
@@ -0,0 +1,18 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+sh $SRC/draco/src/draco/tools/fuzz/build.sh
diff --git a/projects/draco/project.yaml b/projects/draco/project.yaml
new file mode 100644
index 0000000..cef10f4
--- /dev/null
+++ b/projects/draco/project.yaml
@@ -0,0 +1,6 @@
+homepage: "https://github.com/google/draco"
+language: c++
+primary_contact: "fgalligan@google.com"
+auto_ccs:
+  - "ostava@google.com"
+  - "vytyaz@google.com"
diff --git a/projects/dragonfly/Dockerfile b/projects/dragonfly/Dockerfile
index 932c86f..2d04a8f 100644
--- a/projects/dragonfly/Dockerfile
+++ b/projects/dragonfly/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER zj3142063@gmail.com
 RUN go get	github.com/go-openapi/swag \
 		github.com/go-openapi/validate \
 		gopkg.in/warnings.v0 \
diff --git a/projects/dropbear/Dockerfile b/projects/dropbear/Dockerfile
index aaca681..0b4ba30 100644
--- a/projects/dropbear/Dockerfile
+++ b/projects/dropbear/Dockerfile
@@ -15,10 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER matt@ucc.asn.au
 RUN apt-get update && apt-get install -y libz-dev autoconf mercurial
-RUN hg clone https://secure.ucc.asn.au/hg/dropbear dropbear
-RUN hg clone https://secure.ucc.asn.au/hg/dropbear-fuzzcorpus dropbear/corpus
+RUN hg clone https://hg.ucc.asn.au/dropbear dropbear
+RUN hg clone https://hg.ucc.asn.au/dropbear-fuzzcorpus dropbear/corpus
 WORKDIR dropbear
 COPY build.sh *.options $SRC/
 
diff --git a/projects/e2fsprogs/Dockerfile b/projects/e2fsprogs/Dockerfile
new file mode 100644
index 0000000..484525b
--- /dev/null
+++ b/projects/e2fsprogs/Dockerfile
@@ -0,0 +1,23 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get install -y --allow-downgrades --allow-remove-essential --allow-change-held-packages git make texinfo
+RUN git clone --depth 1 https://github.com/tytso/e2fsprogs
+
+COPY build.sh $SRC/
+COPY fuzz/ $SRC/fuzz/
+WORKDIR $SRC/e2fsprogs
diff --git a/projects/e2fsprogs/build.sh b/projects/e2fsprogs/build.sh
new file mode 100755
index 0000000..7b19f10
--- /dev/null
+++ b/projects/e2fsprogs/build.sh
@@ -0,0 +1,33 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+# build project
+export LDFLAGS="$CXXFLAGS"
+$SRC/e2fsprogs/configure
+make -j$(nproc) all
+
+# build fuzzers
+for fuzzer in $(find $SRC/fuzz -name '*_fuzzer.cc'); do
+  fuzzer_basename=$(basename -s .cc $fuzzer)
+  $CXX $CXXFLAGS \
+      $LIB_FUZZING_ENGINE \
+      -I $SRC/e2fsprogs/lib \
+      $fuzzer \
+      -L'./lib/ext2fs' -lext2fs \
+      -L'./lib/et' -lcom_err \
+      -o $OUT/$fuzzer_basename
+done
diff --git a/projects/e2fsprogs/fuzz/ext2fs_check_directory_fuzzer.cc b/projects/e2fsprogs/fuzz/ext2fs_check_directory_fuzzer.cc
new file mode 100644
index 0000000..bd5240b
--- /dev/null
+++ b/projects/e2fsprogs/fuzz/ext2fs_check_directory_fuzzer.cc
@@ -0,0 +1,43 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stddef.h>
+#include <stdint.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "ext2fs/ext2fs.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  static const char* fname = "/tmp/ext2_test_file";
+
+  // Write our data to a temp file.
+  int fd = open(fname, O_RDWR|O_CREAT|O_TRUNC);
+  write(fd, data, size);
+  close(fd);
+
+  ext2_filsys fs;
+  errcode_t retval = ext2fs_open(
+      fname,
+      0, 0, 0,
+      unix_io_manager,
+      &fs);
+
+  if (!retval) {
+    retval = ext2fs_check_directory(fs, EXT2_ROOT_INO);
+    ext2fs_close(fs);
+  }
+
+  return 0;
+}
diff --git a/projects/e2fsprogs/fuzz/ext2fs_image_read_write_fuzzer.cc b/projects/e2fsprogs/fuzz/ext2fs_image_read_write_fuzzer.cc
new file mode 100644
index 0000000..80128bf
--- /dev/null
+++ b/projects/e2fsprogs/fuzz/ext2fs_image_read_write_fuzzer.cc
@@ -0,0 +1,88 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stddef.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <assert.h>
+#include <sys/syscall.h>
+#include <linux/memfd.h>
+#include <fuzzer/FuzzedDataProvider.h>
+
+#include "ext2fs/ext2fs.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+
+  enum FuzzerType {
+    ext2fsImageBitmapRead,
+    ext2fsImageInodeRead,
+    ext2fsImageSuperRead,
+    ext2fsImageBitmapWrite,
+    ext2fsImageInodeWrite,
+    ext2fsImageSuperWrite,
+    kMaxValue = ext2fsImageSuperWrite
+  };
+
+  FuzzedDataProvider stream(data, size);
+  const FuzzerType f = stream.ConsumeEnum<FuzzerType>();
+  static const char* fname = "/tmp/ext2_test_file";
+
+  // Write our data to a temp file.
+  int fd = syscall(SYS_memfd_create, fname, 0);
+  std::vector<char> buffer = stream.ConsumeRemainingBytes<char>();
+  write(fd, buffer.data(), buffer.size());
+  close(fd);
+
+  ext2_filsys fs;
+  errcode_t retval = ext2fs_open(
+      fname,
+      0, 0, 0,
+      unix_io_manager,
+      &fs);
+
+  if (!retval) {
+    switch (f) {
+      case ext2fsImageBitmapRead: {
+        ext2fs_image_bitmap_read(fs, fd, 0);
+        break;
+      }
+      case ext2fsImageInodeRead: {
+        ext2fs_image_inode_read(fs, fd, 0);
+        break;
+      }
+      case ext2fsImageSuperRead: {
+        ext2fs_image_super_read(fs, fd, 0);
+        break;
+      }
+      case ext2fsImageBitmapWrite: {
+        ext2fs_image_bitmap_write(fs, fd, 0);
+        break;
+      }
+      case ext2fsImageInodeWrite: {
+        ext2fs_image_inode_write(fs, fd, 0);
+        break;
+      }
+      case ext2fsImageSuperWrite: {
+        ext2fs_image_super_write(fs, fd, 0);
+        break;
+      }
+      default: {
+        assert(false);
+      }
+    }
+    ext2fs_close(fs);
+  }
+
+  return 0;
+}
diff --git a/projects/e2fsprogs/fuzz/ext2fs_read_bitmap_fuzzer.cc b/projects/e2fsprogs/fuzz/ext2fs_read_bitmap_fuzzer.cc
new file mode 100644
index 0000000..861d4b5
--- /dev/null
+++ b/projects/e2fsprogs/fuzz/ext2fs_read_bitmap_fuzzer.cc
@@ -0,0 +1,68 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stddef.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <assert.h>
+#include <sys/syscall.h>
+#include <linux/memfd.h>
+#include <fuzzer/FuzzedDataProvider.h>
+
+#include "ext2fs/ext2fs.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+
+  enum FuzzerType {
+    ext2fsReadBlockBitmap,
+    ext2fsReadInodeBitmap,
+    kMaxValue = ext2fsReadInodeBitmap
+  };
+
+  FuzzedDataProvider stream(data, size);
+  const FuzzerType f = stream.ConsumeEnum<FuzzerType>();
+  static const char* fname = "/tmp/ext2_test_file";
+
+  // Write our data to a temp file.
+  int fd = syscall(SYS_memfd_create, fname, 0);
+  std::vector<char> buffer = stream.ConsumeRemainingBytes<char>();
+  write(fd, buffer.data(), buffer.size());
+  close(fd);
+
+  ext2_filsys fs;
+  errcode_t retval = ext2fs_open(
+      fname,
+      0, 0, 0,
+      unix_io_manager,
+      &fs);
+
+  if (!retval) {
+    switch (f) {
+      case ext2fsReadBlockBitmap: {
+        ext2fs_read_block_bitmap(fs);
+        break;
+      }
+      case ext2fsReadInodeBitmap: {
+        ext2fs_read_inode_bitmap(fs);
+        break;
+      }
+      default: {
+        assert(false);
+      }
+    }
+    ext2fs_close(fs);
+  }
+
+  return 0;
+}
diff --git a/projects/e2fsprogs/fuzz/ext2fs_read_write_dir_block_fuzzer.cc b/projects/e2fsprogs/fuzz/ext2fs_read_write_dir_block_fuzzer.cc
new file mode 100644
index 0000000..ca6d509
--- /dev/null
+++ b/projects/e2fsprogs/fuzz/ext2fs_read_write_dir_block_fuzzer.cc
@@ -0,0 +1,89 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stddef.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <assert.h>
+#include <sys/syscall.h>
+#include <linux/memfd.h>
+#include <fuzzer/FuzzedDataProvider.h>
+
+#include "ext2fs/ext2fs.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+
+  enum FuzzerType {
+    ext2fsReadDirBlock,
+    ext2fsReadDirBlock2,
+    ext2fsReadDirBlock3,
+    ext2fsWriteDirBlock,
+    ext2fsWriteDirBlock2,
+    ext2fsWriteDirBlock3,
+    kMaxValue = ext2fsWriteDirBlock3
+  };
+
+  FuzzedDataProvider stream(data, size);
+  const FuzzerType f = stream.ConsumeEnum<FuzzerType>();
+  static const char* fname = "/tmp/ext2_test_file";
+
+  // Write our data to a temp file.
+  int fd = syscall(SYS_memfd_create, fname, 0);
+  std::vector<char> buffer = stream.ConsumeRemainingBytes<char>();
+  write(fd, buffer.data(), buffer.size());
+  close(fd);
+
+  ext2_filsys fs;
+  errcode_t retval = ext2fs_open(
+      fname,
+      0, 0, 0,
+      unix_io_manager,
+      &fs);
+
+  if (!retval) {
+    void *buf;
+    switch (f) {
+      case ext2fsReadDirBlock: {
+        ext2fs_read_dir_block(fs, 0, buf);
+        break;
+      }
+      case ext2fsReadDirBlock2: {
+        ext2fs_read_dir_block2(fs, 0, buf, 0);
+        break;
+      }
+      case ext2fsReadDirBlock3: {
+        ext2fs_read_dir_block3(fs, 0, buf, 0);
+        break;
+      }
+      case ext2fsWriteDirBlock: {
+        ext2fs_write_dir_block(fs, 0, buf);
+        break;
+      }
+      case ext2fsWriteDirBlock2: {
+        ext2fs_write_dir_block2(fs, 0, buf, 0);
+        break;
+      }
+      case ext2fsWriteDirBlock3: {
+        ext2fs_write_dir_block3(fs, 0, buf, 0);
+        break;
+      }
+      default: {
+        assert(false);
+      }
+    }
+    ext2fs_close(fs);
+  }
+
+  return 0;
+}
diff --git a/projects/e2fsprogs/project.yaml b/projects/e2fsprogs/project.yaml
new file mode 100644
index 0000000..b18f4c2
--- /dev/null
+++ b/projects/e2fsprogs/project.yaml
@@ -0,0 +1,3 @@
+homepage: "https://github.com/tytso/e2fsprogs"
+language: c
+primary_contact: "tytso@mit.edu"
diff --git a/projects/easywsclient/Dockerfile b/projects/easywsclient/Dockerfile
index 44678f0..5f0cbf1 100644
--- a/projects/easywsclient/Dockerfile
+++ b/projects/easywsclient/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER dhbaird@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://github.com/dhbaird/easywsclient easywsclient
 WORKDIR easywsclient
diff --git a/projects/ecc-diff-fuzzer/Dockerfile b/projects/ecc-diff-fuzzer/Dockerfile
index 40b519e..85ec600 100644
--- a/projects/ecc-diff-fuzzer/Dockerfile
+++ b/projects/ecc-diff-fuzzer/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER p.antoine@catenacyber.fr
 RUN apt-get update && apt-get install -y make cmake bzip2 autoconf automake gettext libtool python nodejs npm
 RUN rustup target add i686-unknown-linux-gnu
 RUN npm install -g browserify
diff --git a/projects/ecc-diff-fuzzer/build.sh b/projects/ecc-diff-fuzzer/build.sh
index b7083f1..2834a9b 100755
--- a/projects/ecc-diff-fuzzer/build.sh
+++ b/projects/ecc-diff-fuzzer/build.sh
@@ -28,7 +28,7 @@
 make install
 cd ..
 autoreconf
-./configure --disable-shared
+./configure --disable-shared --disable-openssl
 make -j$(nproc)
 make install
 )
diff --git a/projects/eigen/Dockerfile b/projects/eigen/Dockerfile
index 02008be..f44dbfa 100644
--- a/projects/eigen/Dockerfile
+++ b/projects/eigen/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER eigen-core-team@lists.tuxfamily.org
 RUN apt-get update && apt-get install --yes cmake mercurial
 RUN hg clone https://GOOGLE-AUTOFUZZ@bitbucket.org/eigen/eigen
 WORKDIR eigen
diff --git a/projects/envoy/Dockerfile b/projects/envoy/Dockerfile
index b656659..9bb3ad0 100644
--- a/projects/envoy/Dockerfile
+++ b/projects/envoy/Dockerfile
@@ -16,7 +16,6 @@
 
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER htuch@google.com
 
 RUN apt-get update && apt-get -y install  \
 	build-essential \
@@ -28,17 +27,13 @@
     libtool         \
     wget            \
     golang          \
-    python
+    python	    \
+    rsync
 
 # Install Bazelisk
 RUN wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/v0.0.8/bazelisk-linux-amd64
 RUN chmod +x /usr/local/bin/bazel
 
-# Install cmake
-RUN wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5-Linux-x86_64.sh; \
-    chmod +x cmake-3.14.5-Linux-x86_64.sh; \
-    ./cmake-3.14.5-Linux-x86_64.sh --skip-license --prefix="/usr/local"
-
 RUN git clone https://github.com/envoyproxy/envoy.git
 WORKDIR $SRC/envoy/
 COPY build.sh $SRC/
diff --git a/projects/envoy/build.sh b/projects/envoy/build.sh
index 9ca013c..ec789cb 100755
--- a/projects/envoy/build.sh
+++ b/projects/envoy/build.sh
@@ -18,8 +18,7 @@
 export CFLAGS="$CFLAGS"
 export CXXFLAGS="$CXXFLAGS"
 
-declare -r FUZZER_TARGETS_CC=$(find . -name *_fuzz_test.cc)
-declare -r FUZZER_TARGETS="$(for t in ${FUZZER_TARGETS_CC}; do echo "${t:2:-3}"; done)"
+declare -r FUZZER_TARGETS=$(bazel query "attr('tags', 'fuzz_target', "...") except attr('tags', 'no_fuzz', '...')")
 
 FUZZER_DICTIONARIES="\
 "
@@ -57,25 +56,23 @@
 
 declare BAZEL_BUILD_TARGETS=""
 declare BAZEL_CORPUS_TARGETS=""
-declare FILTERED_FUZZER_TARGETS=""
 for t in ${FUZZER_TARGETS}
 do
-  declare BAZEL_PATH="//"$(dirname "$t")":"$(basename "$t")
-  declare TAGGED=$(bazel query "attr('tags', 'no_fuzz', ${BAZEL_PATH})")
-  if [ -z "${TAGGED}" ]
-  then
-    FILTERED_FUZZER_TARGETS+="$t "
-    BAZEL_BUILD_TARGETS+="${BAZEL_PATH}_driverless "
-    BAZEL_CORPUS_TARGETS+="${BAZEL_PATH}_corpus_tar "
-  fi
+  BAZEL_BUILD_TARGETS+="${t}_driverless "
+  BAZEL_CORPUS_TARGETS+="${t}_corpus_tar "
 done
 
 # Build driverless libraries.
+# Benchmark about 2 GB per CPU (14 threads for 28.8 GB RAM)
+# TODO(asraa): Remove deprecation warnings when Envoy moves to C++17
 bazel build --verbose_failures --dynamic_mode=off --spawn_strategy=standalone \
+  --discard_analysis_cache --notrack_incremental_state --nokeep_state_after_build \
+  --local_cpu_resources=HOST_CPUS*0.45 \
   --genrule_strategy=standalone --strip=never \
   --copt=-fno-sanitize=vptr --linkopt=-fno-sanitize=vptr \
   --define tcmalloc=disabled --define signal_trace=disabled \
   --define ENVOY_CONFIG_ASAN=1 --copt -D__SANITIZE_ADDRESS__ \
+  --copt -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS \
   --define force_libcpp=enabled --build_tag_filters=-no_asan \
   --linkopt=-lc++ --linkopt=-pthread ${EXTRA_BAZEL_FLAGS} \
   ${BAZEL_BUILD_TARGETS[*]} ${BAZEL_CORPUS_TARGETS[*]}
@@ -91,6 +88,7 @@
   mkdir -p "${REMAP_PATH}"
   # For .cc, we only really care about source/ today.
   rsync -av "${SRC}"/envoy/source "${REMAP_PATH}"
+  rsync -av "${SRC}"/envoy/third_party "${REMAP_PATH}"
   rsync -av "${SRC}"/envoy/test "${REMAP_PATH}"
   # Remove filesystem loop manually.
   rm -rf "${SRC}"/envoy/bazel-envoy/external/envoy
@@ -108,10 +106,11 @@
 fi
 
 # Copy out test driverless binaries from bazel-bin/.
-for t in ${FILTERED_FUZZER_TARGETS}
+for t in ${FUZZER_TARGETS}
 do
-  TARGET_BASE="$(expr "$t" : '.*/\(.*\)_fuzz_test')"
-  TARGET_DRIVERLESS=bazel-bin/"${t}"_driverless
+  TARGET_PATH=${t/://}
+  TARGET_BASE="$(expr "$TARGET_PATH" : '.*/\(.*\)_fuzz_test')"
+  TARGET_DRIVERLESS=bazel-bin/"${TARGET_PATH:2}"_driverless
   echo "Copying fuzzer $t"
   cp "${TARGET_DRIVERLESS}" "${OUT}"/"${TARGET_BASE}"_fuzz_test
 done
@@ -120,13 +119,14 @@
 # TODO(htuch): just use the .tar directly when
 # https://github.com/google/oss-fuzz/issues/1918 is fixed.
 CORPUS_UNTAR_PATH="${PWD}"/_tmp_corpus
-for t in ${FILTERED_FUZZER_TARGETS}
+for t in ${FUZZER_TARGETS}
 do
   echo "Extracting and zipping fuzzer $t corpus"
+  TARGET_PATH=${t/://}
   rm -rf "${CORPUS_UNTAR_PATH}"
   mkdir -p "${CORPUS_UNTAR_PATH}"
-  tar -C "${CORPUS_UNTAR_PATH}" -xvf bazel-bin/"${t}"_corpus_tar.tar
-  TARGET_BASE="$(expr "$t" : '.*/\(.*\)_fuzz_test')"
+  tar -C "${CORPUS_UNTAR_PATH}" -xvf bazel-bin/"${TARGET_PATH:2}"_corpus_tar.tar
+  TARGET_BASE="$(expr "$TARGET_PATH" : '.*/\(.*\)_fuzz_test')"
   # There may be *.dict files in this folder that need to be moved into the OUT dir.
   find "${CORPUS_UNTAR_PATH}" -type f -name *.dict -exec mv -n {} "${OUT}"/ \;
   zip "${OUT}/${TARGET_BASE}"_fuzz_test_seed_corpus.zip \
diff --git a/projects/envoy/project.yaml b/projects/envoy/project.yaml
index 41b1057..1cb9b5c 100644
--- a/projects/envoy/project.yaml
+++ b/projects/envoy/project.yaml
@@ -18,4 +18,6 @@
   - "samflattery@google.com"
   - "jianwendong@google.com"
   - "skerner@google.com"
+  - "arthuryan@google.com"
+  - "rdsmith@google.com"
 coverage_extra_args: -ignore-filename-regex=.*\.cache.*envoy_deps_cache.*
diff --git a/projects/esp-v2/Dockerfile b/projects/esp-v2/Dockerfile
index d623901..0e5a296 100644
--- a/projects/esp-v2/Dockerfile
+++ b/projects/esp-v2/Dockerfile
@@ -17,7 +17,6 @@
 ## This file was copied from envoy (with minor changes).
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER nareddyt@google.com
 
 RUN apt-get update && apt-get -y install  \
     build-essential \
@@ -29,17 +28,13 @@
     libtool         \
     wget            \
     golang          \
-    python
+    python          \
+    rsync
 
 # Install Bazelisk
 RUN wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/v0.0.8/bazelisk-linux-amd64; \
     chmod +x /usr/local/bin/bazel
 
-# Install cmake
-RUN wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5-Linux-x86_64.sh; \
-    chmod +x cmake-3.14.5-Linux-x86_64.sh; \
-    ./cmake-3.14.5-Linux-x86_64.sh --skip-license --prefix="/usr/local"
-
 RUN git clone --depth 1 https://github.com/GoogleCloudPlatform/esp-v2.git
 WORKDIR $SRC/esp-v2/
 COPY build.sh $SRC/
diff --git a/projects/esp-v2/build.sh b/projects/esp-v2/build.sh
index 6f9bc78..8a214e1 100755
--- a/projects/esp-v2/build.sh
+++ b/projects/esp-v2/build.sh
@@ -94,7 +94,9 @@
     "*.hpp" "--include" "*.cpp" "--include" "*.c" "--include" "*/" "--exclude" "*")
   rsync -avLk "${RSYNC_FILTER_ARGS[@]}" "${SRC}"/esp-v2/bazel-out "${REMAP_PATH}"
   rsync -avLkR "${RSYNC_FILTER_ARGS[@]}" "${HOME}" "${OUT}"
-  rsync -avLkR "${RSYNC_FILTER_ARGS[@]}" /tmp "${OUT}"
+  # Some low-level libraries are built located /tmp.
+  # But ESPv2 engineeers don't really look at them.
+  # rsync -avLkR "${RSYNC_FILTER_ARGS[@]}" /tmp "${OUT}"
 fi
 
 # Copy out test driverless binaries from bazel-bin/.
diff --git a/projects/excelize/project.yaml b/projects/excelize/project.yaml
new file mode 100644
index 0000000..428a813
--- /dev/null
+++ b/projects/excelize/project.yaml
@@ -0,0 +1,3 @@
+homepage: "https://xuri.me/excelize"
+language: go
+primary_contact: "xuri.me@gmail.com"
\ No newline at end of file
diff --git a/projects/expat/Dockerfile b/projects/expat/Dockerfile
index 64efaff..b9aedc9 100644
--- a/projects/expat/Dockerfile
+++ b/projects/expat/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mike.aizatsky@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool docbook2x cmake
 
 RUN git clone --depth 1 https://github.com/libexpat/libexpat expat
diff --git a/projects/expat/build.sh b/projects/expat/build.sh
index 21c4f51..333d258 100755
--- a/projects/expat/build.sh
+++ b/projects/expat/build.sh
@@ -15,9 +15,33 @@
 #
 ################################################################################
 
+: ${LD:="${CXX}"}
+: ${LDFLAGS:="${CXXFLAGS}"}  # to make sure we link with sanitizer runtime
+
+cmake_args=(
+    # Specific to Expat
+    -DEXPAT_BUILD_FUZZERS=ON
+    -DEXPAT_OSSFUZZ_BUILD=ON
+    -DEXPAT_SHARED_LIBS=OFF
+
+    # C compiler
+    -DCMAKE_C_COMPILER="${CC}"
+    -DCMAKE_C_FLAGS="${CFLAGS}"
+
+    # C++ compiler
+    -DCMAKE_CXX_COMPILER="${CXX}"
+    -DCMAKE_CXX_FLAGS="${CXXFLAGS}"
+
+    # Linker
+    -DCMAKE_LINKER="${LD}"
+    -DCMAKE_EXE_LINKER_FLAGS="${LDFLAGS}"
+    -DCMAKE_MODULE_LINKER_FLAGS="${LDFLAGS}"
+    -DCMAKE_SHARED_LINKER_FLAGS="${LDFLAGS}"
+)
+
 mkdir -p build
 cd build
-cmake ../expat -DEXPAT_BUILD_FUZZERS=ON -DEXPAT_OSSFUZZ_BUILD=ON -DEXPAT_SHARED_LIBS=OFF
+cmake ../expat "${cmake_args[@]}"
 make -j$(nproc)
 
 for fuzzer in fuzz/*;
diff --git a/projects/fasthttp/Dockerfile b/projects/fasthttp/Dockerfile
index 87cca72..6904598 100644
--- a/projects/fasthttp/Dockerfile
+++ b/projects/fasthttp/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER adam@adalogics.com
 RUN go get github.com/valyala/fasthttp
 
 COPY build.sh $SRC/
diff --git a/projects/fastjson/Dockerfile b/projects/fastjson/Dockerfile
index 3d0ba3d..7da61ee 100644
--- a/projects/fastjson/Dockerfile
+++ b/projects/fastjson/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER adam@adalogics.com
 RUN go get github.com/valyala/fastjson
 
 COPY build.sh $SRC/
diff --git a/projects/ffmpeg/Dockerfile b/projects/ffmpeg/Dockerfile
index 6b9e9c1..8e8e14f 100644
--- a/projects/ffmpeg/Dockerfile
+++ b/projects/ffmpeg/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mmoroz@chromium.org
 ADD bionic.list /etc/apt/sources.list.d/bionic.list
 ADD nasm_apt.pin /etc/apt/preferences
 RUN apt-get update && apt-get install -y make autoconf automake libtool build-essential \
diff --git a/projects/ffmpeg/build.sh b/projects/ffmpeg/build.sh
index 9a89825..315fac4 100755
--- a/projects/ffmpeg/build.sh
+++ b/projects/ffmpeg/build.sh
@@ -139,6 +139,7 @@
     --enable-nonfree \
     --disable-muxers \
     --disable-protocols \
+    --disable-demuxer=rtp,rtsp,sdp \
     --disable-devices \
     --disable-shared
 make clean
diff --git a/projects/ffmpeg/project.yaml b/projects/ffmpeg/project.yaml
index 5ecf618..a17ee7e 100644
--- a/projects/ffmpeg/project.yaml
+++ b/projects/ffmpeg/project.yaml
@@ -1,4 +1,4 @@
-homepage: "https://www.ffmpeg.org/"
+homepage: "https://www.ffmpeg.org"
 language: c++
 primary_contact: "ffmpeg-security@ffmpeg.org"
 auto_ccs:
diff --git a/projects/file/Dockerfile b/projects/file/Dockerfile
index 57c5479..b6f6408 100644
--- a/projects/file/Dockerfile
+++ b/projects/file/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mike.aizatsky@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool shtool
 RUN git clone --depth 1 https://github.com/file/file.git
 WORKDIR file
diff --git a/projects/firefox/Dockerfile b/projects/firefox/Dockerfile
index abc077c..39725c6 100644
--- a/projects/firefox/Dockerfile
+++ b/projects/firefox/Dockerfile
@@ -15,15 +15,16 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER pdknsk@gmail.com
+RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
 RUN apt-get update && apt-get install -y --no-install-recommends \
+  libstdc++6 \
   python \
   gawk \
   software-properties-common
-RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
-RUN apt-get update && apt-get upgrade -y && apt-get install -y --no-install-recommends \
-  libstdc++6
 RUN git clone --depth 1 https://github.com/mozilla/gecko-dev mozilla-central
 RUN git clone --depth 1 https://github.com/mozillasecurity/fuzzdata
 WORKDIR mozilla-central
 COPY build.sh target.c *.options mozconfig.* $SRC/
+# Install dependencies.
+ENV SHELL /bin/bash
+RUN ./mach bootstrap --no-interactive --application-choice browser
diff --git a/projects/firefox/build.sh b/projects/firefox/build.sh
index b864d59..431cfb8 100755
--- a/projects/firefox/build.sh
+++ b/projects/firefox/build.sh
@@ -24,6 +24,7 @@
   ContentParentIPC
   CompositorManagerParentIPC
   ContentSecurityPolicyParser
+  FeaturePolicyParser
   # Image
   ImageGIF
   ImageICO
@@ -41,9 +42,7 @@
 export MOZ_OBJDIR=$WORK/obj-fuzz
 export MOZCONFIG=$SRC/mozconfig.$SANITIZER
 
-# Install dependencies.
 export SHELL=/bin/bash
-./mach bootstrap --no-interactive --application-choice browser
 
 # Skip patches for now
 rm tools/fuzzing/libfuzzer/patches/*.patch
diff --git a/projects/firefox/mozconfig.coverage b/projects/firefox/mozconfig.coverage
index 8178d90..a99a377 100644
--- a/projects/firefox/mozconfig.coverage
+++ b/projects/firefox/mozconfig.coverage
@@ -1,3 +1,4 @@
+mk_add_options AUTOCLOBBER=1
 ac_add_options --disable-debug
 ac_add_options --disable-elf-hack
 ac_add_options --disable-jemalloc
diff --git a/projects/firestore/Dockerfile b/projects/firestore/Dockerfile
index b2f1376..bb024aa 100644
--- a/projects/firestore/Dockerfile
+++ b/projects/firestore/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER varconst@google.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool wget golang python python-protobuf python-six
 RUN git clone --depth 1 https://github.com/firebase/firebase-ios-sdk.git
 COPY build.sh $SRC/
diff --git a/projects/firestore/build.sh b/projects/firestore/build.sh
index ec9a429..7ada1b9 100755
--- a/projects/firestore/build.sh
+++ b/projects/firestore/build.sh
@@ -15,17 +15,7 @@
 #
 ################################################################################
 
-# The cmake version that is available on Ubuntu 16.04 is 3.5.1. While Firestore
-# itself requires cmake 3.5, it depends on leveldb which requires cmake 3.9
-# (https://github.com/google/leveldb/blob/master/CMakeLists.txt#L5).
-# There is an open issue (https://github.com/google/leveldb/issues/607) to
-# lower the required cmake version of leveldb. Therefore, we need to download
-# a newer version of cmake until leveldb lowers the required version or a newer
-# cmake version becomes available in the OSS Fuzz environment.
 cd $WORK
-wget https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.tar.gz
-tar -xzf cmake-3.12.0-Linux-x86_64.tar.gz
-rm cmake-3.12.0-Linux-x86_64.tar.gz
 
 # Disable UBSan vptr since Firestore depends on other libraries that are built
 # with -fno-rtti.
@@ -36,7 +26,7 @@
 # fuzzing library defined in ${LIB_FUZZING_ENGINE}.
 cd $SRC/firebase-ios-sdk
 mkdir build && cd build
-$WORK/cmake-3.12.0-Linux-x86_64/bin/cmake -DFUZZING=ON ..
+cmake -DFUZZING=ON ..
 make -j$(nproc)
 
 # Copy fuzzing targets, dictionaries, and zipped corpora to $OUT.
diff --git a/projects/flac/Dockerfile b/projects/flac/Dockerfile
index 2111fb7..5af9225 100644
--- a/projects/flac/Dockerfile
+++ b/projects/flac/Dockerfile
@@ -15,9 +15,11 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-RUN apt-get update && apt-get install -y make autoconf automake libtool libtool-bin pkg-config gettext sudo
+RUN apt-get update && apt-get install -y make autoconf automake libtool libtool-bin pkg-config gettext sudo default-jdk
 RUN git clone --depth 1 https://github.com/xiph/flac.git
 RUN git clone --depth 1 https://github.com/xiph/ogg.git
+RUN git clone --depth 1 https://github.com/google/ExoPlayer.git
 RUN git clone --depth 1 https://github.com/guidovranken/fuzzing-headers.git
 RUN git clone --depth 1 https://github.com/guidovranken/flac-fuzzers.git
+COPY fuzzer_exo.cpp $SRC/flac-fuzzers
 COPY build.sh $SRC/
diff --git a/projects/flac/build.sh b/projects/flac/build.sh
index f4ef563..c94ba22 100755
--- a/projects/flac/build.sh
+++ b/projects/flac/build.sh
@@ -53,6 +53,8 @@
 
 # Build fuzzers
 cd $SRC/flac-fuzzers/
+$CXX $CXXFLAGS -I $SRC/flac/include/ -I $SRC/ExoPlayer/extensions/flac/src/main/jni/ -I /usr/lib/jvm/java-8-openjdk-amd64/include/ -I /usr/lib/jvm/java-8-openjdk-amd64/include/linux/ fuzzer_exo.cpp \
+    $SRC/flac/src/libFLAC++/.libs/libFLAC++.a $SRC/flac/src/libFLAC/.libs/libFLAC.a $SRC/libogg-install/lib/libogg.a $LIB_FUZZING_ENGINE -o $OUT/fuzzer_exo
 $CXX $CXXFLAGS -I $SRC/flac/include/ fuzzer_decoder.cpp $SRC/flac/src/libFLAC++/.libs/libFLAC++.a $SRC/flac/src/libFLAC/.libs/libFLAC.a $SRC/libogg-install/lib/libogg.a $LIB_FUZZING_ENGINE -o $OUT/fuzzer_decoder
 $CXX $CXXFLAGS -I $SRC/flac/include/ fuzzer_encoder.cpp $SRC/flac/src/libFLAC++/.libs/libFLAC++.a $SRC/flac/src/libFLAC/.libs/libFLAC.a $SRC/libogg-install/lib/libogg.a $LIB_FUZZING_ENGINE -o $OUT/fuzzer_encoder
 cp fuzzer_encoder.dict $OUT/
diff --git a/projects/flac/fuzzer_exo.cpp b/projects/flac/fuzzer_exo.cpp
new file mode 100644
index 0000000..9c0eac6
--- /dev/null
+++ b/projects/flac/fuzzer_exo.cpp
@@ -0,0 +1,477 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <assert.h>
+#include <string>
+
+#include "include/flac_parser.h"
+
+#include <jni.h>
+
+// #include <android/log.h>
+
+#include <cassert>
+#include <cstdlib>
+#include <cstring>
+
+#define LOG_TAG "FLACParser"
+
+#define LITERAL_TO_STRING_INTERNAL(x) #x
+#define LITERAL_TO_STRING(x) LITERAL_TO_STRING_INTERNAL(x)
+
+#define CHECK(x) if (!(x)) return 0;
+
+const int endian = 1;
+#define isBigEndian() (*(reinterpret_cast<const char *>(&endian)) == 0)
+
+// The FLAC parser calls our C++ static callbacks using C calling conventions,
+// inside FLAC__stream_decoder_process_until_end_of_metadata
+// and FLAC__stream_decoder_process_single.
+// We immediately then call our corresponding C++ instance methods
+// with the same parameter list, but discard redundant information.
+
+FLAC__StreamDecoderReadStatus FLACParser::read_callback(
+    const FLAC__StreamDecoder * /* decoder */, FLAC__byte buffer[],
+    size_t *bytes, void *client_data) {
+  return reinterpret_cast<FLACParser *>(client_data)
+      ->readCallback(buffer, bytes);
+}
+
+FLAC__StreamDecoderSeekStatus FLACParser::seek_callback(
+    const FLAC__StreamDecoder * /* decoder */,
+    FLAC__uint64 absolute_byte_offset, void *client_data) {
+  return reinterpret_cast<FLACParser *>(client_data)
+      ->seekCallback(absolute_byte_offset);
+}
+
+FLAC__StreamDecoderTellStatus FLACParser::tell_callback(
+    const FLAC__StreamDecoder * /* decoder */,
+    FLAC__uint64 *absolute_byte_offset, void *client_data) {
+  return reinterpret_cast<FLACParser *>(client_data)
+      ->tellCallback(absolute_byte_offset);
+}
+
+FLAC__StreamDecoderLengthStatus FLACParser::length_callback(
+    const FLAC__StreamDecoder * /* decoder */, FLAC__uint64 *stream_length,
+    void *client_data) {
+  return reinterpret_cast<FLACParser *>(client_data)
+      ->lengthCallback(stream_length);
+}
+
+FLAC__bool FLACParser::eof_callback(const FLAC__StreamDecoder * /* decoder */,
+                                    void *client_data) {
+  return reinterpret_cast<FLACParser *>(client_data)->eofCallback();
+}
+
+FLAC__StreamDecoderWriteStatus FLACParser::write_callback(
+    const FLAC__StreamDecoder * /* decoder */, const FLAC__Frame *frame,
+    const FLAC__int32 *const buffer[], void *client_data) {
+  return reinterpret_cast<FLACParser *>(client_data)
+      ->writeCallback(frame, buffer);
+}
+
+void FLACParser::metadata_callback(const FLAC__StreamDecoder * /* decoder */,
+                                   const FLAC__StreamMetadata *metadata,
+                                   void *client_data) {
+  reinterpret_cast<FLACParser *>(client_data)->metadataCallback(metadata);
+}
+
+void FLACParser::error_callback(const FLAC__StreamDecoder * /* decoder */,
+                                FLAC__StreamDecoderErrorStatus status,
+                                void *client_data) {
+  reinterpret_cast<FLACParser *>(client_data)->errorCallback(status);
+}
+
+// These are the corresponding callbacks with C++ calling conventions
+
+FLAC__StreamDecoderReadStatus FLACParser::readCallback(FLAC__byte buffer[],
+                                                       size_t *bytes) {
+  size_t requested = *bytes;
+  ssize_t actual = mDataSource->readAt(mCurrentPos, buffer, requested);
+  if (0 > actual) {
+    *bytes = 0;
+    return FLAC__STREAM_DECODER_READ_STATUS_ABORT;
+  } else if (0 == actual) {
+    *bytes = 0;
+    mEOF = true;
+    return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;
+  } else {
+    assert(actual <= requested);
+    *bytes = actual;
+    mCurrentPos += actual;
+    return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;
+  }
+}
+
+FLAC__StreamDecoderSeekStatus FLACParser::seekCallback(
+    FLAC__uint64 absolute_byte_offset) {
+  mCurrentPos = absolute_byte_offset;
+  mEOF = false;
+  return FLAC__STREAM_DECODER_SEEK_STATUS_OK;
+}
+
+FLAC__StreamDecoderTellStatus FLACParser::tellCallback(
+    FLAC__uint64 *absolute_byte_offset) {
+  *absolute_byte_offset = mCurrentPos;
+  return FLAC__STREAM_DECODER_TELL_STATUS_OK;
+}
+
+FLAC__StreamDecoderLengthStatus FLACParser::lengthCallback(
+    FLAC__uint64 *stream_length) {
+  return FLAC__STREAM_DECODER_LENGTH_STATUS_UNSUPPORTED;
+}
+
+FLAC__bool FLACParser::eofCallback() { return mEOF; }
+
+FLAC__StreamDecoderWriteStatus FLACParser::writeCallback(
+    const FLAC__Frame *frame, const FLAC__int32 *const buffer[]) {
+  if (mWriteRequested) {
+    mWriteRequested = false;
+    // FLAC parser doesn't free or realloc buffer until next frame or finish
+    mWriteHeader = frame->header;
+    mWriteBuffer = buffer;
+    mWriteCompleted = true;
+    return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
+  } else {
+    return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;
+  }
+}
+
+void FLACParser::metadataCallback(const FLAC__StreamMetadata *metadata) {
+  switch (metadata->type) {
+    case FLAC__METADATA_TYPE_STREAMINFO:
+      if (!mStreamInfoValid) {
+        mStreamInfo = metadata->data.stream_info;
+        mStreamInfoValid = true;
+      } else {
+        break;
+      }
+      break;
+    case FLAC__METADATA_TYPE_SEEKTABLE:
+      mSeekTable = &metadata->data.seek_table;
+      break;
+    case FLAC__METADATA_TYPE_VORBIS_COMMENT:
+      if (!mVorbisCommentsValid) {
+        FLAC__StreamMetadata_VorbisComment vorbisComment =
+            metadata->data.vorbis_comment;
+        for (FLAC__uint32 i = 0; i < vorbisComment.num_comments; ++i) {
+          FLAC__StreamMetadata_VorbisComment_Entry vorbisCommentEntry =
+              vorbisComment.comments[i];
+          if (vorbisCommentEntry.entry != NULL) {
+            std::string comment(
+                reinterpret_cast<char *>(vorbisCommentEntry.entry),
+                vorbisCommentEntry.length);
+            mVorbisComments.push_back(comment);
+          }
+        }
+        mVorbisCommentsValid = true;
+      } else {
+        break;
+      }
+      break;
+    case FLAC__METADATA_TYPE_PICTURE: {
+      const FLAC__StreamMetadata_Picture *parsedPicture =
+          &metadata->data.picture;
+      FlacPicture picture;
+      picture.mimeType.assign(std::string(parsedPicture->mime_type));
+      picture.description.assign(
+          std::string((char *)parsedPicture->description));
+      picture.data.assign(parsedPicture->data,
+                          parsedPicture->data + parsedPicture->data_length);
+      picture.width = parsedPicture->width;
+      picture.height = parsedPicture->height;
+      picture.depth = parsedPicture->depth;
+      picture.colors = parsedPicture->colors;
+      picture.type = parsedPicture->type;
+      mPictures.push_back(picture);
+      mPicturesValid = true;
+      break;
+    }
+    default:
+      break;
+  }
+}
+
+void FLACParser::errorCallback(FLAC__StreamDecoderErrorStatus status) {
+  mErrorStatus = status;
+}
+
+// Copy samples from FLAC native 32-bit non-interleaved to
+// correct bit-depth (non-zero padded), interleaved.
+// These are candidates for optimization if needed.
+static void copyToByteArrayBigEndian(int8_t *dst, const int *const *src,
+                                     unsigned bytesPerSample, unsigned nSamples,
+                                     unsigned nChannels) {
+  for (unsigned i = 0; i < nSamples; ++i) {
+    for (unsigned c = 0; c < nChannels; ++c) {
+      // point to the first byte of the source address
+      // and then skip the first few bytes (most significant bytes)
+      // depending on the bit depth
+      const int8_t *byteSrc =
+          reinterpret_cast<const int8_t *>(&src[c][i]) + 4 - bytesPerSample;
+      memcpy(dst, byteSrc, bytesPerSample);
+      dst = dst + bytesPerSample;
+    }
+  }
+}
+
+static void copyToByteArrayLittleEndian(int8_t *dst, const int *const *src,
+                                        unsigned bytesPerSample,
+                                        unsigned nSamples, unsigned nChannels) {
+  for (unsigned i = 0; i < nSamples; ++i) {
+    for (unsigned c = 0; c < nChannels; ++c) {
+      // with little endian, the most significant bytes will be at the end
+      // copy the bytes in little endian will remove the most significant byte
+      // so we are good here.
+      memcpy(dst, &(src[c][i]), bytesPerSample);
+      dst = dst + bytesPerSample;
+    }
+  }
+}
+
+static void copyTrespass(int8_t * /* dst */, const int *const * /* src */,
+                         unsigned /* bytesPerSample */, unsigned /* nSamples */,
+                         unsigned /* nChannels */) {
+  ;
+}
+
+// FLACParser
+
+FLACParser::FLACParser(DataSource *source)
+    : mDataSource(source),
+      mCopy(copyTrespass),
+      mDecoder(NULL),
+      mCurrentPos(0LL),
+      mEOF(false),
+      mStreamInfoValid(false),
+      mSeekTable(NULL),
+      firstFrameOffset(0LL),
+      mVorbisCommentsValid(false),
+      mPicturesValid(false),
+      mWriteRequested(false),
+      mWriteCompleted(false),
+      mWriteBuffer(NULL),
+      mErrorStatus((FLAC__StreamDecoderErrorStatus)-1) {
+  memset(&mStreamInfo, 0, sizeof(mStreamInfo));
+  memset(&mWriteHeader, 0, sizeof(mWriteHeader));
+}
+
+FLACParser::~FLACParser() {
+  if (mDecoder != NULL) {
+    FLAC__stream_decoder_delete(mDecoder);
+    mDecoder = NULL;
+  }
+}
+
+bool FLACParser::init() {
+  // setup libFLAC parser
+  mDecoder = FLAC__stream_decoder_new();
+  if (mDecoder == NULL) {
+    // The new should succeed, since probably all it does is a malloc
+    // that always succeeds in Android.  But to avoid dependence on the
+    // libFLAC internals, we check and log here.
+    return false;
+  }
+  FLAC__stream_decoder_set_md5_checking(mDecoder, false);
+  FLAC__stream_decoder_set_metadata_ignore_all(mDecoder);
+  FLAC__stream_decoder_set_metadata_respond(mDecoder,
+                                            FLAC__METADATA_TYPE_STREAMINFO);
+  FLAC__stream_decoder_set_metadata_respond(mDecoder,
+                                            FLAC__METADATA_TYPE_SEEKTABLE);
+  FLAC__stream_decoder_set_metadata_respond(mDecoder,
+                                            FLAC__METADATA_TYPE_VORBIS_COMMENT);
+  FLAC__stream_decoder_set_metadata_respond(mDecoder,
+                                            FLAC__METADATA_TYPE_PICTURE);
+  FLAC__StreamDecoderInitStatus initStatus;
+  initStatus = FLAC__stream_decoder_init_stream(
+      mDecoder, read_callback, seek_callback, tell_callback, length_callback,
+      eof_callback, write_callback, metadata_callback, error_callback,
+      reinterpret_cast<void *>(this));
+  if (initStatus != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
+    // A failure here probably indicates a programming error and so is
+    // unlikely to happen. But we check and log here similarly to above.
+    return false;
+  }
+  return true;
+}
+
+bool FLACParser::decodeMetadata() {
+  // parse all metadata
+  if (!FLAC__stream_decoder_process_until_end_of_metadata(mDecoder)) {
+    return false;
+  }
+  // store first frame offset
+  FLAC__stream_decoder_get_decode_position(mDecoder, &firstFrameOffset);
+
+  if (mStreamInfoValid) {
+    // check channel count
+    if (getChannels() == 0 || getChannels() > 8) {
+      return false;
+    }
+    // check bit depth
+    switch (getBitsPerSample()) {
+      case 8:
+      case 16:
+      case 24:
+      case 32:
+        break;
+      default:
+        return false;
+    }
+    // configure the appropriate copy function based on device endianness.
+    if (isBigEndian()) {
+      mCopy = copyToByteArrayBigEndian;
+    } else {
+      mCopy = copyToByteArrayLittleEndian;
+    }
+  } else {
+    return false;
+  }
+  return true;
+}
+
+size_t FLACParser::readBuffer(void *output, size_t output_size) {
+  mWriteRequested = true;
+  mWriteCompleted = false;
+
+  if (!FLAC__stream_decoder_process_single(mDecoder)) {
+    return -1;
+  }
+  if (!mWriteCompleted) {
+    if (FLAC__stream_decoder_get_state(mDecoder) !=
+        FLAC__STREAM_DECODER_END_OF_STREAM) {
+    }
+    return -1;
+  }
+
+  // verify that block header keeps the promises made by STREAMINFO
+  unsigned blocksize = mWriteHeader.blocksize;
+  if (blocksize == 0 || blocksize > getMaxBlockSize()) {
+    return -1;
+  }
+  if (mWriteHeader.sample_rate != getSampleRate() ||
+      mWriteHeader.channels != getChannels() ||
+      mWriteHeader.bits_per_sample != getBitsPerSample()) {
+    return -1;
+  }
+
+  unsigned bytesPerSample = getBitsPerSample() >> 3;
+  size_t bufferSize = blocksize * getChannels() * bytesPerSample;
+  if (bufferSize > output_size) {
+    return -1;
+  }
+
+  // copy PCM from FLAC write buffer to our media buffer, with interleaving.
+  (*mCopy)(reinterpret_cast<int8_t *>(output), mWriteBuffer, bytesPerSample,
+           blocksize, getChannels());
+
+  // fill in buffer metadata
+  CHECK(mWriteHeader.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER);
+
+  return bufferSize;
+}
+
+bool FLACParser::getSeekPositions(int64_t timeUs,
+                                  std::array<int64_t, 4> &result) {
+  if (!mSeekTable) {
+    return false;
+  }
+
+  unsigned sampleRate = getSampleRate();
+  int64_t totalSamples = getTotalSamples();
+  int64_t targetSampleNumber = (timeUs * sampleRate) / 1000000LL;
+  if (targetSampleNumber >= totalSamples) {
+    targetSampleNumber = totalSamples - 1;
+  }
+
+  FLAC__StreamMetadata_SeekPoint* points = mSeekTable->points;
+  unsigned length = mSeekTable->num_points;
+
+  for (unsigned i = length; i != 0; i--) {
+    int64_t sampleNumber = points[i - 1].sample_number;
+    if (sampleNumber == -1) {  // placeholder
+      continue;
+    }
+    if (sampleNumber <= targetSampleNumber) {
+      result[0] = (sampleNumber * 1000000LL) / sampleRate;
+      result[1] = firstFrameOffset + points[i - 1].stream_offset;
+      if (sampleNumber == targetSampleNumber || i >= length ||
+          points[i].sample_number == -1) {  // placeholder
+        // exact seek, or no following non-placeholder seek point
+        result[2] = result[0];
+        result[3] = result[1];
+      } else {
+        result[2] = (points[i].sample_number * 1000000LL) / sampleRate;
+        result[3] = firstFrameOffset + points[i].stream_offset;
+      }
+      return true;
+    }
+  }
+  result[0] = 0;
+  result[1] = firstFrameOffset;
+  result[2] = 0;
+  result[3] = firstFrameOffset;
+  return true;
+}
+
+namespace {
+
+  class FuzzDataSource : public DataSource {
+    const uint8_t *data_;
+    size_t size_;
+
+   public:
+    FuzzDataSource(const uint8_t *data, size_t size) {
+      data_ = data;
+      size_ = size;
+    }
+
+    ssize_t readAt(off64_t offset, void *const data, size_t size) {
+      if (offset > size_)
+        return -1;
+      size_t remaining = size_ - offset;
+      if (remaining < size)
+        size = remaining;
+      memcpy(data, data_ + offset, size);
+      return size;
+    }
+  };
+
+}  // namespace
+
+// Fuzz FLAC format and instrument the result as exoplayer JNI would:
+// https://github.com/google/ExoPlayer/blob/release-v2/extensions/flac/src/main/jni/
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  FuzzDataSource source(data, size);
+  FLACParser parser(&source);
+
+  // Early parsing
+  if (!parser.init() || !parser.decodeMetadata())
+    return 0;
+
+  auto streamInfo = parser.getStreamInfo();
+
+  // Similar implementation than ExoPlayer
+  int buffer_size = streamInfo.max_blocksize * streamInfo.channels * 2;
+  assert(buffer_size >= 0);  // Not expected
+  auto buffer = new uint8_t[buffer_size];
+  int runs = 0;
+  while (parser.readBuffer(buffer, buffer_size) >= buffer_size) {
+    runs++;
+    continue;
+  }
+  delete[] buffer;
+
+  return 0;
+}
diff --git a/projects/fluent-bit/Dockerfile b/projects/fluent-bit/Dockerfile
index a87b1b7..e61bfca 100755
--- a/projects/fluent-bit/Dockerfile
+++ b/projects/fluent-bit/Dockerfile
@@ -14,7 +14,6 @@
 #
 ################################################################################
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER david@adalogics.com
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone https://github.com/fluent/fluent-bit/
 
diff --git a/projects/fluent-bit/build.sh b/projects/fluent-bit/build.sh
index 7e14af2..460f5ee 100755
--- a/projects/fluent-bit/build.sh
+++ b/projects/fluent-bit/build.sh
@@ -21,7 +21,7 @@
 
 # Commandline arguments to turn off a lot of plugins.
 INPUT_PLUGINS="-DFLB_IN_COLLECTD=OFF -DFLB_IN_CPU=OFF -DFLB_IN_DISK=OFF -DFLB_IN_DOCKER=OFF -DFLB_IN_EXEC=OFF -DFLB_IN_FORWARD=OFF -DFLB_IN_HEAD=OFF -DFLB_IN_HEALTH=OFF -DFLB_IN_KMSG=OFF -DFLB_IN_MEM=OFF -DFLB_IN_MQTT=OFF -DFLB_IN_NETIF=OFF -DFLB_IN_PROC=OFF -DFLB_IN_RANDOM=OFF -DFLB_IN_SERIAL=OFF -DFLB_IN_STDIN=OFF -DFLB_IN_SYSLOG=OFF -DFLB_IN_SYSTEMD=OFF -DFLB_IN_TAIL=OFF -DFLB_IN_TCP=OFF -DFLB_IN_THERMAL=OFF -DFLB_IN_WINLOG=OFF"
-OUTPUT_PLUGINS="-DFLB_RECORD_ACCESSOR=Off -DFLB_STREAM_PROCESSOR=Off -DFLB_LUAJIT=OFF -DFLB_FILTER_GREP=OFF -DFLB_FILTER_REWRITE_TAG=OFF -DFLB_OUT_AZURE=OFF -DFLB_OUT_BIGQUERY=OFF -DFLB_OUT_COUNTER=OFF -DFLB_OUT_DATADOG=OFF -DFLB_OUT_ES=OFF -DFLB_OUT_FILE=OFF -DFLB_OUT_FLOWCOUNTER=OFF -DFLB_OUT_FORWARD=OFF -DFLB_OUT_GELF=OFF -DFLB_OUT_HTTP=OFF -DFLB_OUT_INFLUXDB=OFF -DFLB_OUT_KAFKA=OFF -DFLB_OUT_KAFKA_REST=OFF -DFLB_OUT_NATS=OFF -DFLB_OUT_NULL=OFF -DFLB_OUT_PGSQL=OFF -DFLB_OUT_PLOT=OFF -DFLB_OUT_SLACK=OFF -DFLB_OUT_SPLUNK=OFF -DFLB_OUT_STACKDRIVER=OFF -DFLB_OUT_STDOUT=OFF -DFLB_OUT_TCP=OFF -DFLB_OUT_SYSLOG=OFF"
+OUTPUT_PLUGINS="-DFLB_RECORD_ACCESSOR=Off -DFLB_STREAM_PROCESSOR=Off -DFLB_LUAJIT=OFF -DFLB_FILTER_GREP=OFF -DFLB_FILTER_REWRITE_TAG=OFF -DFLB_OUT_AZURE=OFF -DFLB_OUT_BIGQUERY=OFF -DFLB_OUT_COUNTER=OFF -DFLB_OUT_DATADOG=OFF -DFLB_OUT_ES=OFF -DFLB_OUT_FILE=OFF -DFLB_OUT_FLOWCOUNTER=OFF -DFLB_OUT_FORWARD=OFF -DFLB_OUT_GELF=OFF -DFLB_OUT_HTTP=OFF -DFLB_OUT_INFLUXDB=OFF -DFLB_OUT_KAFKA=OFF -DFLB_OUT_KAFKA_REST=OFF -DFLB_OUT_NATS=OFF -DFLB_OUT_NULL=OFF -DFLB_OUT_PGSQL=OFF -DFLB_OUT_PLOT=OFF -DFLB_OUT_SLACK=OFF -DFLB_OUT_SPLUNK=OFF -DFLB_OUT_STACKDRIVER=OFF -DFLB_OUT_STDOUT=OFF -DFLB_OUT_TCP=OFF -DFLB_OUT_SYSLOG=OFF -DFLB_OUT_NRLOGS=OFF"
 FILTER_PLUGINS="-DFLB_FILTER_RECORD_MODIFIER=OFF -DFLB_FILTER_MODIFY=OFF -DFLB_FILTER_THROTTLE=OFF -DFLB_FILTER_KUBERNETES=OFF -DFLB_FILTER_NEST=OFF -DFLB_FILTER_PARSER=OFF -DFLB_FILTER_AWS=OFF -DFLB_FILTER_ALTER_SIZE=OFF"
 
 cmake ${INPUT_PLUGINS} ${FILTER_PLUGINS} ${OUTPUT_PLUGINS} -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON ..
@@ -34,9 +34,14 @@
 $CC $CFLAGS -c flb_json_fuzzer.c -o flb_json_fuzzer.o
 $CXX flb_json_fuzzer.o -o $OUT/flb_json_fuzzer $CXXFLAGS $LIB_FUZZING_ENGINE  library/libfluent-bit.a  library/libmk_core.a library/libjsmn.a library/libmsgpackc.a library/libmpack-static.a
 
+mkdir library_files
+find library/ -name *.a -exec cp {} ./library_files/ \;
+
 for fuzzer_name in parse_json parse_ltsv parse_logfmt
 do
     $CC $CFLAGS -c ${fuzzer_name}_fuzzer.c -o ${fuzzer_name}_fuzzer.o -I/src/fluent-bit/include -I/src/fluent-bit/lib -I/src/fluent-bit/lib/flb_libco -I/src/fluent-bit/lib/rbtree -I/src/fluent-bit/lib/msgpack-3.2.0/include -I/src/fluent-bit/lib/chunkio/include -I/src/fluent-bit/lib/LuaJIT-2.1.0-beta3/src -I/src/fluent-bit/lib/monkey/include -I/src/fluent-bit/lib/mbedtls-2.16.5/include -I/src/fluent-bit/lib/sqlite-amalgamation-3310000 -I/src/fluent-bit/lib/mpack-amalgamation-1.0/src -I/src/fluent-bit/lib/miniz -I/src/fluent-bit/lib/onigmo -I/src/fluent-bit/build/include -I/src/fluent-bit/lib/tutf8e/include -I/src/fluent-bit/build/backtrace-prefix/include -I/src/fluent-bit/build/lib/msgpack-3.2.0/include
 
-    $CXX ${fuzzer_name}_fuzzer.o -o $OUT/${fuzzer_name}_fuzzer $CXXFLAGS $LIB_FUZZING_ENGINE library/libfluent-bit.a library/libflb-plugin-in_emitter.a library/libflb-plugin-in_dummy.a library/libflb-plugin-in_statsd.a library/libflb-plugin-in_storage_backlog.a library/libflb-plugin-in_lib.a library/libflb-plugin-out_exit.a library/libflb-plugin-out_logdna.a library/libflb-plugin-out_newrelic.a library/libflb-plugin-out_td.a library/libflb-plugin-out_lib.a library/libflb-plugin-filter_stdout.a library/libfluent-bit.a -lm -lrt library/libmk_core.a library/libjsmn.a library/libmsgpackc.a library/libmpack-static.a library/libchunkio-static.a library/libcio-crc32.a library/libminiz.a library/libflb-plugin-proxy-go.a library/libmbedtls.a library/libmbedx509.a library/libmbedcrypto.a library/libco.a library/librbtree.a lib/libonigmo.a library/libsqlite3.a -ldl library/libtutf8e.a
+    $CXX ${fuzzer_name}_fuzzer.o -o $OUT/${fuzzer_name}_fuzzer $CXXFLAGS $LIB_FUZZING_ENGINE -lm -lrt -ldl \
+        ./library_files/libfluent-bit.a ./library_files/libmbedtls.a ./library_files/libmbedx509.a \
+        ./library_files/libmbedcrypto.a ./library_files/*.a lib/libonigmo.a
 done
diff --git a/projects/freetype2/Dockerfile b/projects/freetype2/Dockerfile
index 01c0f06..3d01c2d 100644
--- a/projects/freetype2/Dockerfile
+++ b/projects/freetype2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER prince.cherusker@gmail.com
 
 RUN apt-get update &&  \
     apt-get install -y \
diff --git a/projects/fuzzing-puzzles/Dockerfile b/projects/fuzzing-puzzles/Dockerfile
index 25031ff..cc7ee62 100644
--- a/projects/fuzzing-puzzles/Dockerfile
+++ b/projects/fuzzing-puzzles/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mmoroz@chromium.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 ADD https://raw.githubusercontent.com/llvm-mirror/compiler-rt/master/test/fuzzer/MultipleConstraintsOnSmallInputTest.cpp \
     $SRC/fuzzing-puzzles/
diff --git a/projects/fuzzing-puzzles/project.yaml b/projects/fuzzing-puzzles/project.yaml
index fae4665..6f709ab 100644
--- a/projects/fuzzing-puzzles/project.yaml
+++ b/projects/fuzzing-puzzles/project.yaml
@@ -10,3 +10,5 @@
 
 fuzzing_engines:
   - honggfuzz
+
+disabled: True
diff --git a/projects/gdal/Dockerfile b/projects/gdal/Dockerfile
index f3004c2..00f0723 100644
--- a/projects/gdal/Dockerfile
+++ b/projects/gdal/Dockerfile
@@ -15,9 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER even.rouault@spatialys.com
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
+RUN apt-get update && \
     apt-get install -y make autoconf automake libtool g++ curl cmake sqlite3 pkg-config
 
 RUN git clone --depth 1 https://github.com/OSGeo/gdal gdal
diff --git a/projects/gfwx/Dockerfile b/projects/gfwx/Dockerfile
index 3344848..30a9bb7 100644
--- a/projects/gfwx/Dockerfile
+++ b/projects/gfwx/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER fyffe@google.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://github.com/guidovranken/gfwx-fuzzers.git gfwx-fuzzers
 WORKDIR gfwx-fuzzers
diff --git a/projects/ghostscript/Dockerfile b/projects/ghostscript/Dockerfile
index 2243155..ad74a56 100644
--- a/projects/ghostscript/Dockerfile
+++ b/projects/ghostscript/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER skau@google.com
 
 RUN apt-get update && apt-get install -y autoconf zlibc libtool liblcms2-dev libpng-dev
 RUN git clone --branch branch-2.2 --single-branch --depth 1 https://github.com/apple/cups.git cups
diff --git a/projects/giflib/Dockerfile b/projects/giflib/Dockerfile
index 0de6c7a..382ee81 100644
--- a/projects/giflib/Dockerfile
+++ b/projects/giflib/Dockerfile
@@ -15,10 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER esr@thyrsus.com
-RUN apt-get update && apt-get install -y make autoconf automake libtool wget zlib1g-dev
-RUN apt-get update && \
-apt-get install -y  libtool ninja-build cmake
+RUN apt-get update -y && \
+    apt-get install -y make autoconf automake libtool wget zlib1g-dev \
+    binutils cmake ninja-build liblzma-dev libz-dev pkg-config
 RUN git clone --depth=1 https://git.code.sf.net/p/giflib/code $SRC/giflib-code
 RUN git clone --depth 1 https://github.com/google/libprotobuf-mutator.git
 RUN (mkdir LPM && cd LPM && cmake ../libprotobuf-mutator -GNinja -DLIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF=ON -DLIB_PROTO_MUTATOR_TESTING=OFF -DCMAKE_BUILD_TYPE=Release && ninja)
diff --git a/projects/git/Dockerfile b/projects/git/Dockerfile
index 3dbe4c6..91c05e4 100644
--- a/projects/git/Dockerfile
+++ b/projects/git/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER steadmon@google.com
 RUN apt-get update && \
     apt-get install --no-install-recommends -y \
         cvs cvsps gettext libcgi-pm-perl libcurl4-gnutls-dev \
diff --git a/projects/glib/Dockerfile b/projects/glib/Dockerfile
index a834934..72449d5 100644
--- a/projects/glib/Dockerfile
+++ b/projects/glib/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER pdknsk@gmail.com
 RUN apt-get update && apt-get install -y python3-pip
 RUN pip3 install -U meson ninja
 RUN git clone --depth 1 https://gitlab.gnome.org/GNOME/glib
diff --git a/projects/gnupg/Dockerfile b/projects/gnupg/Dockerfile
index 02bc37e..57dc905 100644
--- a/projects/gnupg/Dockerfile
+++ b/projects/gnupg/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER p.antoine@catenacyber.fr
 RUN apt-get update && apt-get install -y make autoconf automake libtool gettext bzip2 gnupg bison flex
 
 RUN git clone --depth 1 git://git.gnupg.org/libgpg-error.git libgpg-error
diff --git a/projects/gnutls/Dockerfile b/projects/gnutls/Dockerfile
index a2182ee..4630429 100644
--- a/projects/gnutls/Dockerfile
+++ b/projects/gnutls/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER alex.gaynor@gmail.com
 RUN apt-get update && apt-get install -y \
  make \
  pkg-config \
diff --git a/projects/go-attestation/Dockerfile b/projects/go-attestation/Dockerfile
index ff24e92..4e1651c 100644
--- a/projects/go-attestation/Dockerfile
+++ b/projects/go-attestation/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER bweeks@google.com
 
 RUN go get -u -d github.com/google/go-attestation/...
 
diff --git a/projects/go-coredns/Dockerfile b/projects/go-coredns/Dockerfile
index e8cb195..f77a462 100644
--- a/projects/go-coredns/Dockerfile
+++ b/projects/go-coredns/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER miek@miek.nl
 RUN git clone --depth 1 https://github.com/coredns/coredns coredns
 
 COPY build.sh $SRC/
diff --git a/projects/go-dns/Dockerfile b/projects/go-dns/Dockerfile
index 84206b4..a5576e7 100644
--- a/projects/go-dns/Dockerfile
+++ b/projects/go-dns/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER miek@miek.nl
 RUN go get -t github.com/miekg/dns
 
 COPY build.sh $SRC/
diff --git a/projects/go-json-iterator/Dockerfile b/projects/go-json-iterator/Dockerfile
index 78972b6..bcbb635 100644
--- a/projects/go-json-iterator/Dockerfile
+++ b/projects/go-json-iterator/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER taowen@gmail.com
 RUN go get github.com/json-iterator/go
 
 RUN mkdir fuzz
diff --git a/projects/golang-protobuf/Dockerfile b/projects/golang-protobuf/Dockerfile
index be337f8..85803b7 100644
--- a/projects/golang-protobuf/Dockerfile
+++ b/projects/golang-protobuf/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER dneil@google.com
 
 ENV GO111MODULE="on"
 ENV GOFUZZ111MODULE="on"
diff --git a/projects/golang/Dockerfile b/projects/golang/Dockerfile
index bb59761..1118ce4 100644
--- a/projects/golang/Dockerfile
+++ b/projects/golang/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 
 RUN mkdir -p $GOPATH/src/github.com/dvyukov/ && \
     cd $GOPATH/src/github.com/dvyukov/ && \
diff --git a/projects/gonids/Dockerfile b/projects/gonids/Dockerfile
index 7d82c0a..a6231a1 100644
--- a/projects/gonids/Dockerfile
+++ b/projects/gonids/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER duane.security@gmail.com
 RUN go get github.com/google/gonids
 
 ADD https://rules.emergingthreats.net/open/suricata/emerging.rules.zip emerging.rules.zip
diff --git a/projects/graphicsmagick/Dockerfile b/projects/graphicsmagick/Dockerfile
index d973e68..868758f 100644
--- a/projects/graphicsmagick/Dockerfile
+++ b/projects/graphicsmagick/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER alex.gaynor@gmail.com
 RUN apt-get update && apt-get install -y mercurial automake autopoint cmake libtool nasm pkg-config po4a
 RUN hg clone --time -b default http://hg.code.sf.net/p/graphicsmagick/code graphicsmagick || \
     hg clone --time -b default http://hg.code.sf.net/p/graphicsmagick/code graphicsmagick || \
diff --git a/projects/grok/Dockerfile b/projects/grok/Dockerfile
index 88b4bdd..c8ea8f8 100644
--- a/projects/grok/Dockerfile
+++ b/projects/grok/Dockerfile
@@ -15,10 +15,8 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER boxerab@gmail.com
-RUN apt-get update && apt-get install -y make wget
-RUN wget --no-check-certificate -qO - https://cmake.org/files/v3.17/cmake-3.17.0-Linux-x86_64.tar.gz | tar -xz
-RUN mv cmake-3.17.0-Linux-x86_64 cmake-install
+RUN apt-get update && apt-get install -y wget
+
 RUN git clone --depth 1 https://github.com/GrokImageCompression/grok.git grok
 RUN git clone --depth 1 https://github.com/GrokImageCompression/grok-test-data.git grok/data
 WORKDIR grok
diff --git a/projects/grok/build.sh b/projects/grok/build.sh
index 7619a48..4ec01fb 100755
--- a/projects/grok/build.sh
+++ b/projects/grok/build.sh
@@ -14,7 +14,7 @@
 # limitations under the License.
 #
 ################################################################################
-export PATH=${SRC}/cmake-install/bin:${PATH}
+
 mkdir build
 cd build
 cmake ..
diff --git a/projects/grpc-gateway/Dockerfile b/projects/grpc-gateway/Dockerfile
index deeaa22..5ec3c70 100644
--- a/projects/grpc-gateway/Dockerfile
+++ b/projects/grpc-gateway/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER adam@adalogics.com
 RUN go get github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
 COPY build.sh $SRC/
 WORKDIR $SRC/
diff --git a/projects/grpc/Dockerfile b/projects/grpc/Dockerfile
index 8f004bf..69f44b2 100644
--- a/projects/grpc/Dockerfile
+++ b/projects/grpc/Dockerfile
@@ -17,7 +17,6 @@
 # TODO(https://github.com/google/oss-fuzz/issues/3093): Stop specifying the
 # image SHA once the bug is fixed.
 FROM gcr.io/oss-fuzz-base/base-builder@sha256:276813aef0ce5972db43c0230f96162003994fa742fb1b2f4e66c67498575c65
-MAINTAINER yangg@google.com
 
 RUN apt-get update && apt-get install -y software-properties-common python-software-properties
 RUN add-apt-repository ppa:webupd8team/java
diff --git a/projects/gstreamer/Dockerfile b/projects/gstreamer/Dockerfile
index 12af905..f578866 100644
--- a/projects/gstreamer/Dockerfile
+++ b/projects/gstreamer/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER bilboed@bilboed.com
 # Install the build dependencies
 
 # install the minimum
diff --git a/projects/guetzli/Dockerfile b/projects/guetzli/Dockerfile
index fab938a..cb17099 100644
--- a/projects/guetzli/Dockerfile
+++ b/projects/guetzli/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER robryk@google.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool libpng-dev pkg-config curl
 
 RUN mkdir afl-testcases
diff --git a/projects/h2o/Dockerfile b/projects/h2o/Dockerfile
index ad2f4e4..02cf2c5 100644
--- a/projects/h2o/Dockerfile
+++ b/projects/h2o/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jonathan.foote@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool cmake zlib1g-dev pkg-config libssl-dev
 RUN git clone https://github.com/h2o/h2o
 WORKDIR h2o
diff --git a/projects/h2o/project.yaml b/projects/h2o/project.yaml
index 0acde7f..8c330bc 100644
--- a/projects/h2o/project.yaml
+++ b/projects/h2o/project.yaml
@@ -1,6 +1,9 @@
 homepage: "https://github.com/h2o/h2o"
 language: c++
 primary_contact: "jonathan.foote@gmail.com"
+sanitizers:
+  - address
+  - undefined
 auto_ccs:
   - "frederik.deweerdt@gmail.com"
   - "kazuhooku@gmail.com"
diff --git a/projects/haproxy/Dockerfile b/projects/haproxy/Dockerfile
index c43f141..92a30f6 100755
--- a/projects/haproxy/Dockerfile
+++ b/projects/haproxy/Dockerfile
@@ -14,7 +14,6 @@
 #
 ################################################################################
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER david@adalogics.com
 RUN apt-get update && apt-get install -y make
 RUN git clone https://github.com/haproxy/haproxy
 
diff --git a/projects/haproxy/build.sh b/projects/haproxy/build.sh
index 7b41b81..70a61ac 100755
--- a/projects/haproxy/build.sh
+++ b/projects/haproxy/build.sh
@@ -27,19 +27,17 @@
 # We dont want the main function but we need the rest of the stuff in haproxy.c
 cd /src/haproxy
 sed 's/int main(int argc/int main2(int argc/g' -i ./src/haproxy.c
-sed 's/dladdr(main,/dladdr(main2,/g' -i ./src/standard.c
-sed 's/(void*)main/(void*)main2/g' -i ./src/standard.c
+sed 's/dladdr(main,/dladdr(main2,/g' -i ./src/tools.c
+sed 's/(void*)main/(void*)main2/g' -i ./src/tools.c
 
-$CC $CFLAGS -Iinclude -Iebtree  -g -DUSE_POLL -DUSE_TPROXY -DCONFIG_HAPROXY_VERSION=\"\" -DCONFIG_HAPROXY_DATE=\"\" -c -o ./src/haproxy.o ./src/haproxy.c
-ar cr libetree.a ./ebtree/*.o
+
+SETTINGS="-Iinclude -g -DUSE_POLL -DUSE_TPROXY -DCONFIG_HAPROXY_VERSION=\"\" -DCONFIG_HAPROXY_DATE=\"\""
+
+$CC $CFLAGS $SETTINGS -c -o ./src/haproxy.o ./src/haproxy.c
 ar cr libhaproxy.a ./src/*.o
 
-cp $SRC/fuzz_hpack_decode.c .
-$CC $CFLAGS -Iinclude -Iebtree  -g  -DUSE_POLL -DUSE_TPROXY -DCONFIG_HAPROXY_VERSION=\"\" -DCONFIG_HAPROXY_DATE=\"\" -c fuzz_hpack_decode.c  -o fuzz_hpack_decode.o
-$CXX -g $CXXFLAGS $LIB_FUZZING_ENGINE  fuzz_hpack_decode.o libhaproxy.a libetree.a -o $OUT/fuzz_hpack_decode
-
-# Now compile more fuzzers
-cp $SRC/fuzz_cfg_parser.c .
-$CC $CFLAGS -Iinclude -Iebtree  -g  -DUSE_POLL -DUSE_TPROXY -DCONFIG_HAPROXY_VERSION=\"\" -DCONFIG_HAPROXY_DATE=\"\" -c -o fuzz_cfg_parser.o fuzz_cfg_parser.c
-$CXX -g $CXXFLAGS $LIB_FUZZING_ENGINE  fuzz_cfg_parser.o libhaproxy.a libetree.a -o $OUT/fuzz_cfg_parser
-################################################################################
+for fuzzer in hpack_decode cfg_parser; do
+  cp $SRC/fuzz_${fuzzer}.c .
+  $CC $CFLAGS $SETTINGS -c fuzz_${fuzzer}.c  -o fuzz_${fuzzer}.o
+  $CXX -g $CXXFLAGS $LIB_FUZZING_ENGINE  fuzz_${fuzzer}.o libhaproxy.a -o $OUT/fuzz_${fuzzer}
+done
diff --git a/projects/haproxy/fuzz_cfg_parser.c b/projects/haproxy/fuzz_cfg_parser.c
index 3666734..2879731 100644
--- a/projects/haproxy/fuzz_cfg_parser.c
+++ b/projects/haproxy/fuzz_cfg_parser.c
@@ -22,6 +22,9 @@
 int
 LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
 {
+    if (size < 50)
+        return 0;
+
 	char filename[256];
 	sprintf(filename, "/tmp/libfuzzer.%d", getpid());
 
diff --git a/projects/haproxy/fuzz_hpack_decode.c b/projects/haproxy/fuzz_hpack_decode.c
index 32c0b3e..80ba8c3 100644
--- a/projects/haproxy/fuzz_hpack_decode.c
+++ b/projects/haproxy/fuzz_hpack_decode.c
@@ -15,6 +15,8 @@
  * #
  * ################################################################################
  * */
+#define HPACK_STANDALONE
+
 #include <stdint.h>
 #include <string.h>
 #include <stdlib.h>
@@ -24,10 +26,8 @@
 #include <stdlib.h>
 #include <unistd.h>
 
-#include <common/chunk.h>
-#include <common/hpack-dec.h>
-#include <common/mini-clist.h>
-#define HPACK_STANDALONE
+#include <haproxy/chunk.h>
+#include <haproxy/hpack-dec.h>
 
 #define MAX_RQ_SIZE 65536
 #define MAX_HDR_NUM 1000
diff --git a/projects/haproxy/project.yaml b/projects/haproxy/project.yaml
index f1400c2..cfd5a3f 100755
--- a/projects/haproxy/project.yaml
+++ b/projects/haproxy/project.yaml
@@ -5,5 +5,10 @@
   - "david@adalogics.com"
   - "timwolla@googlemail.com"
   - "willy@1wt.eu"
+  - "tribuslukas58@gmail.com"
+  - "christopher.faulet@gmail.com"
 sanitizers:
   - address
+
+# Bug reports are public by default:
+view_restrictions: none
diff --git a/projects/harfbuzz/Dockerfile b/projects/harfbuzz/Dockerfile
index 7de247d..d8131b0 100644
--- a/projects/harfbuzz/Dockerfile
+++ b/projects/harfbuzz/Dockerfile
@@ -15,9 +15,8 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mmoroz@chromium.org
-RUN apt-get update && apt-get install -y make autoconf automake libtool ragel pkg-config
-
+RUN apt-get update && apt-get install -y python3-pip ragel pkg-config && \
+    pip3 install meson==0.53.0 ninja
 RUN git clone --depth 1 https://github.com/harfbuzz/harfbuzz.git
 WORKDIR harfbuzz
 COPY build.sh $SRC/
diff --git a/projects/harfbuzz/build.sh b/projects/harfbuzz/build.sh
index 768bfa9..3509a67 100755
--- a/projects/harfbuzz/build.sh
+++ b/projects/harfbuzz/build.sh
@@ -17,31 +17,26 @@
 
 # Disable:
 # 1. UBSan vptr since target built with -fno-rtti.
-export CFLAGS="$CFLAGS -fno-sanitize=vptr"
-export CXXFLAGS="$CXXFLAGS -fno-sanitize=vptr"
+export CFLAGS="$CFLAGS -fno-sanitize=vptr -DHB_NO_VISIBILITY"
+export CXXFLAGS="$CXXFLAGS -fno-sanitize=vptr -DHB_NO_VISIBILITY"
+
+# setup
+build=$WORK/build
+
+# cleanup
+rm -rf $build
+mkdir -p $build
 
 # Build the library.
-./autogen.sh
-./configure --enable-static --disable-shared
-make clean
-make -j$(nproc) CPPFLAGS="-DHB_NO_VISIBILITY" V=1 all
+meson --default-library=static --wrap-mode=nodownload \
+      -Dexperimental_api=true \
+      -Dfuzzer_ldflags="$(echo $LIB_FUZZING_ENGINE)" \
+      $build \
+  || (cat build/meson-logs/meson-log.txt && false)
 
-# Build the fuzzer.
-$CXX $CXXFLAGS -std=c++11 -Isrc \
-    ./test/fuzzing/hb-shape-fuzzer.cc -o $OUT/hb-shape-fuzzer \
-    $LIB_FUZZING_ENGINE ./src/.libs/libharfbuzz.a
-
-$CXX $CXXFLAGS -std=c++11 -Isrc \
-    ./test/fuzzing/hb-draw-fuzzer.cc -o $OUT/hb-draw-fuzzer \
-    $LIB_FUZZING_ENGINE ./src/.libs/libharfbuzz.a
-
-$CXX $CXXFLAGS -std=c++11 -Isrc \
-    ./test/fuzzing/hb-subset-fuzzer.cc -o $OUT/hb-subset-fuzzer \
-    $LIB_FUZZING_ENGINE ./src/.libs/libharfbuzz-subset.a ./src/.libs/libharfbuzz.a
-
-$CXX $CXXFLAGS -std=c++11 -Isrc \
-    ./test/fuzzing/hb-set-fuzzer.cc -o $OUT/hb-set-fuzzer \
-    $LIB_FUZZING_ENGINE ./src/.libs/libharfbuzz.a
+# Build the fuzzers.
+ninja -v -j$(nproc) -C $build test/fuzzing/hb-{shape,draw,subset,set}-fuzzer
+mv $build/test/fuzzing/hb-{shape,draw,subset,set}-fuzzer $OUT/
 
 # Archive and copy to $OUT seed corpus if the build succeeded.
 mkdir all-fonts
diff --git a/projects/harfbuzz/project.yaml b/projects/harfbuzz/project.yaml
index 95d393c..3cbcbce 100644
--- a/projects/harfbuzz/project.yaml
+++ b/projects/harfbuzz/project.yaml
@@ -19,15 +19,15 @@
   - "lsalzman@mozilla.com"
   - "twsmith@mozilla.com"
 fuzzing_engines:
- - libfuzzer
- - afl
- - honggfuzz
- - dataflow
+  - libfuzzer
+  - afl
+  - honggfuzz
+  - dataflow
 sanitizers:
- - address
- - undefined
- - memory
- - dataflow
+  - address
+  - undefined
+  - memory
+  - dataflow
 architectures:
   - x86_64
   - i386
diff --git a/projects/hermes/Dockerfile b/projects/hermes/Dockerfile
index d88b2cd..eb59a38 100644
--- a/projects/hermes/Dockerfile
+++ b/projects/hermes/Dockerfile
@@ -15,14 +15,10 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER neildhar@fb.com
 RUN apt-get update && \
     apt-get install -y make autoconf automake libtool wget libicu-dev \
     ninja-build python zip libreadline-dev libatomic-ops-dev
-# Install cmake
-RUN wget https://github.com/Kitware/CMake/releases/download/v3.16.6/cmake-3.16.6-Linux-x86_64.sh; \
-    chmod +x cmake-3.16.6-Linux-x86_64.sh; \
-    ./cmake-3.16.6-Linux-x86_64.sh --skip-license --prefix="/usr/local"
+
 RUN git clone https://github.com/facebook/hermes.git
 WORKDIR hermes
 COPY build.sh $SRC/
diff --git a/projects/hermes/build.sh b/projects/hermes/build.sh
index abc0909..b951599 100755
--- a/projects/hermes/build.sh
+++ b/projects/hermes/build.sh
@@ -26,6 +26,6 @@
 fi
 
 ./utils/build/configure.py "${OUT}/build" --build-system "Ninja" ${CONFIGURE_FLAGS} \
-                           --cmake-flags="-DHERMES_USE_STATIC_ICU=ON -DHERMES_FUZZING_FLAG=${LIB_FUZZING_ENGINE}"
+                           --cmake-flags="-DHERMES_USE_STATIC_ICU=ON -DHERMES_FUZZING_FLAG=${LIB_FUZZING_ENGINE} -DHERMES_ENABLE_FUZZING=ON"
 cmake --build "$OUT/build"  --parallel --target fuzzer-jsi-entry
 cp "${OUT}/build/bin/fuzzer-jsi-entry" "${OUT}"
diff --git a/projects/hoextdown/Dockerfile b/projects/hoextdown/Dockerfile
index d4f7d1d..075ef60 100644
--- a/projects/hoextdown/Dockerfile
+++ b/projects/hoextdown/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kjclev@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://github.com/kjdev/hoextdown.git hoextdown
 WORKDIR hoextdown
diff --git a/projects/hostap/Dockerfile b/projects/hostap/Dockerfile
index cc215e9..3a1df86 100644
--- a/projects/hostap/Dockerfile
+++ b/projects/hostap/Dockerfile
@@ -15,9 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER elver@google.com
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
+RUN apt-get update && \
     apt-get install -y make autoconf automake libtool g++ libssl-dev \
                        libssl-dev:i386
 RUN git clone --depth 1 git://w1.fi/srv/git/hostap.git hostap
diff --git a/projects/htslib/Dockerfile b/projects/htslib/Dockerfile
index 1ad58da..5735b7b 100644
--- a/projects/htslib/Dockerfile
+++ b/projects/htslib/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER rmd@sanger.ac.uk
 RUN apt-get update && apt-get install -y make autoconf automake zlib1g-dev libbz2-dev liblzma-dev libcurl4-gnutls-dev libssl-dev
 RUN git clone --depth 1 https://github.com/samtools/htslib.git htslib
 WORKDIR htslib
diff --git a/projects/http-parser/Dockerfile b/projects/http-parser/Dockerfile
index 5d263f9..88e93fd 100755
--- a/projects/http-parser/Dockerfile
+++ b/projects/http-parser/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER david@adalogics.com
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone https://github.com/nodejs/http-parser
 
diff --git a/projects/hunspell/Dockerfile b/projects/hunspell/Dockerfile
index c6fdbed..632863f 100644
--- a/projects/hunspell/Dockerfile
+++ b/projects/hunspell/Dockerfile
@@ -15,9 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER twsmith@mozilla.com
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
+RUN apt-get update && \
     apt-get install -y autoconf automake autopoint libtool
 RUN git clone --depth 1 https://github.com/hunspell/hunspell.git hunspell
 WORKDIR hunspell
diff --git a/projects/ibmswtpm2/Dockerfile b/projects/ibmswtpm2/Dockerfile
index 18fe690..2f707e3 100644
--- a/projects/ibmswtpm2/Dockerfile
+++ b/projects/ibmswtpm2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER john.s.andersen@intel.com
 ARG SIM_DL_URL=https://downloads.sourceforge.net/project/ibmswtpm2/ibmtpm1332.tar.gz
 RUN apt-get update && apt-get install -y make autoconf automake libtool libssl-dev curl tar g++
 RUN mkdir ibmswtpm2 && \
diff --git a/projects/icu/Dockerfile b/projects/icu/Dockerfile
index 366cedc..af7e2db 100644
--- a/projects/icu/Dockerfile
+++ b/projects/icu/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mike.aizatsky@gmail.com
 RUN apt-get update && apt-get install -y make
 
 RUN git clone --depth 1 https://github.com/unicode-org/icu.git icu
diff --git a/projects/icu/project.yaml b/projects/icu/project.yaml
index e81a50a..c0e1612 100644
--- a/projects/icu/project.yaml
+++ b/projects/icu/project.yaml
@@ -8,6 +8,7 @@
  - shane@unicode.org
  - srl295@gmail.com
  - nrunge@google.com
+ - ftang@google.com
 sanitizers:
  - address
  - memory
diff --git a/projects/imagemagick/Dockerfile b/projects/imagemagick/Dockerfile
index 346e5fe..5874944 100644
--- a/projects/imagemagick/Dockerfile
+++ b/projects/imagemagick/Dockerfile
@@ -15,9 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER paul.l.kehrer@gmail.com
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
+RUN apt-get update && \
     apt-get install -y make autoconf automake libtool pkg-config cmake nasm autopoint po4a libc6:i386 libc6-dev:i386
 RUN git clone --depth 1 https://github.com/imagemagick/imagemagick
 RUN git clone --depth 1 https://gitlab.com/libtiff/libtiff
diff --git a/projects/immer/Dockerfile b/projects/immer/Dockerfile
new file mode 100644
index 0000000..6605b72
--- /dev/null
+++ b/projects/immer/Dockerfile
@@ -0,0 +1,21 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y cmake libgc-dev
+RUN git clone --depth 1 https://github.com/arximboldi/immer.git immer
+WORKDIR immer
+COPY build.sh $SRC/
diff --git a/projects/immer/build.sh b/projects/immer/build.sh
new file mode 100755
index 0000000..cf367fe
--- /dev/null
+++ b/projects/immer/build.sh
@@ -0,0 +1,30 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+
+mkdir build
+cd build
+cmake .. \
+      -DBOEHM_GC_INCLUDE_DIR=/usr/include \
+      -DBOEHM_GC_LIBRARIES=/usr/lib/x86_64-linux-gnu/libgc.a
+make -j$(nproc) fuzzers
+
+for fuzzer in extra/fuzzer/*; do
+    if [[ -f $fuzzer && -x $fuzzer ]]; then
+        cp $fuzzer $OUT
+    fi
+done
diff --git a/projects/immer/project.yaml b/projects/immer/project.yaml
new file mode 100644
index 0000000..31c16ff
--- /dev/null
+++ b/projects/immer/project.yaml
@@ -0,0 +1,3 @@
+homepage: "https://sinusoid.es/immer"
+language: c++
+primary_contact: "juanpe@sinusoid.al"
diff --git a/projects/influxdb/Dockerfile b/projects/influxdb/Dockerfile
new file mode 100644
index 0000000..e00af14
--- /dev/null
+++ b/projects/influxdb/Dockerfile
@@ -0,0 +1,23 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+MAINTAINER william@influxdata.com
+RUN go get github.com/influxdata/influxdb
+RUN go get github.com/dgrijalva/jwt-go
+
+COPY build.sh $SRC/
+WORKDIR $SRC/
diff --git a/projects/influxdb/build.sh b/projects/influxdb/build.sh
new file mode 100644
index 0000000..93ea8ab
--- /dev/null
+++ b/projects/influxdb/build.sh
@@ -0,0 +1,30 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+function compile_fuzzer {
+  path=$1
+  function=$2
+  fuzzer=$3
+
+   # Instrument all Go files relevant to this fuzzer
+  go-fuzz -func $function -o $fuzzer.a $path
+
+   # Instrumented, compiled Go ($fuzzer.a) + fuzzing engine = fuzzer binary
+  $CXX $CXXFLAGS $LIB_FUZZING_ENGINE $fuzzer.a -o $OUT/$fuzzer
+}
+
+compile_fuzzer github.com/influxdata/influxdb/jsonweb FuzzJsonWeb fuzzjsonweb
diff --git a/projects/influxdb/project.yaml b/projects/influxdb/project.yaml
new file mode 100644
index 0000000..56066ed
--- /dev/null
+++ b/projects/influxdb/project.yaml
@@ -0,0 +1,10 @@
+homepage: "https://github.com/influxdata/influxdb"
+language: go
+primary_contact: "william@influxdata.com"
+auto_ccs:
+  - "palbert@influxdata.com"
+  - "ryan@influxdata.com"
+fuzzing_engines:
+  - libfuzzer
+sanitizers:
+  - address
\ No newline at end of file
diff --git a/projects/ipfs/Dockerfile b/projects/ipfs/Dockerfile
index cd3eb78..29590e0 100644
--- a/projects/ipfs/Dockerfile
+++ b/projects/ipfs/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER will.scott@protocol.io
 RUN go get -t github.com/ipfs/go-datastore
 
 COPY build.sh $SRC/
diff --git a/projects/iroha/Dockerfile b/projects/iroha/Dockerfile
index 1185576..8a3e83e 100644
--- a/projects/iroha/Dockerfile
+++ b/projects/iroha/Dockerfile
@@ -15,18 +15,13 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER konstantin@soramitsu.co.jp
   
 RUN set -e; \
     apt-get update && \
     apt-get -y --no-install-recommends install libicu-dev \
         apt-utils git curl wget unzip tar; \
     apt-get -y clean
-     
-RUN wget https://github.com/Kitware/CMake/releases/download/v3.14.4/cmake-3.14.4-Linux-x86_64.tar.gz && tar -xzvf cmake-3.14.4-Linux-x86_64.tar.gz && cp -a cmake-3.14.4-Linux-x86_64/bin/. /usr/bin/ && cp -a cmake-3.14.4-Linux-x86_64/share/. /usr/share/
-  
-  
-# Get *your* source code here.
+
 RUN git clone --depth 1 --single-branch --branch master https://github.com/hyperledger/iroha.git
 
 WORKDIR iroha
diff --git a/projects/irssi/Dockerfile b/projects/irssi/Dockerfile
index 7d2c694..5ec650f 100644
--- a/projects/irssi/Dockerfile
+++ b/projects/irssi/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER joseph.bisch@gmail.com
 RUN apt-get update && apt-get install -y pkg-config libncurses5-dev libssl-dev python3-pip
 RUN pip3 install -U meson ninja
 RUN git clone https://github.com/irssi/irssi
diff --git a/projects/janet/Dockerfile b/projects/janet/Dockerfile
index e684088..0a24e47 100755
--- a/projects/janet/Dockerfile
+++ b/projects/janet/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER david@adalogics.com
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone https://github.com/janet-lang/janet
 
diff --git a/projects/janet/build.sh b/projects/janet/build.sh
index 3ef222f..0627307 100755
--- a/projects/janet/build.sh
+++ b/projects/janet/build.sh
@@ -14,6 +14,7 @@
 # limitations under the License.
 #
 ################################################################################
+export CFLAGS="$CFLAGS -fPIC"
 cd janet
 make
 
diff --git a/projects/jansson/Dockerfile b/projects/jansson/Dockerfile
index dd0ed50..fc5fef3 100644
--- a/projects/jansson/Dockerfile
+++ b/projects/jansson/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER cmeister2@gmail.com
 
 RUN git clone --depth 1 https://github.com/akheron/jansson.git /src/jansson
 
diff --git a/projects/janus-gateway/Dockerfile b/projects/janus-gateway/Dockerfile
index 791997d..f0c56cd 100644
--- a/projects/janus-gateway/Dockerfile
+++ b/projects/janus-gateway/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER toppi.ale@gmail.com
 RUN apt-get update && apt-get install -y \
 	autoconf autoconf-archive \
 	automake \
diff --git a/projects/jbig2dec/Dockerfile b/projects/jbig2dec/Dockerfile
index c0ff588..22d95b7 100644
--- a/projects/jbig2dec/Dockerfile
+++ b/projects/jbig2dec/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER sebastian.rasmussen@artifex.com
 RUN apt-get update && apt-get install -y make libtool pkg-config vim libreadline-dev wget autoconf
 RUN git clone --recursive --depth 1 git://git.ghostscript.com/jbig2dec.git jbig2dec
 RUN mkdir tests
diff --git a/projects/jsc/Dockerfile b/projects/jsc/Dockerfile
index 3b77300..d98b69e 100644
--- a/projects/jsc/Dockerfile
+++ b/projects/jsc/Dockerfile
@@ -15,12 +15,8 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER ochang@google.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool python ruby ninja-build bison flex gperf wget
-# Requires newer CMake than available in Ubuntu 16.04
-RUN wget -q -O - https://github.com/Kitware/CMake/releases/download/v3.14.4/cmake-3.14.4-Linux-x86_64.sh > /tmp/install_cmake.sh && \
-    cd /usr && bash /tmp/install_cmake.sh -- --skip-license && \
-    rm /tmp/install_cmake.sh
+
 RUN git clone --depth 1 git://git.webkit.org/WebKit.git
 RUN wget https://github.com/unicode-org/icu/releases/download/release-66-1/icu4c-66_1-src.tgz && tar xzvf icu4c-66_1-src.tgz
 WORKDIR WebKit
diff --git a/projects/json-c/Dockerfile b/projects/json-c/Dockerfile
index ed40c49..3bb1222 100644
--- a/projects/json-c/Dockerfile
+++ b/projects/json-c/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER chriswwolfe@gmail.com
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone --depth 1 https://github.com/json-c/json-c.git json-c
 WORKDIR json-c
diff --git a/projects/json/Dockerfile b/projects/json/Dockerfile
index 18203ea..6bf74ed 100644
--- a/projects/json/Dockerfile
+++ b/projects/json/Dockerfile
@@ -15,9 +15,8 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER vitalybuka@chromium.org
 RUN apt-get update && apt-get install -y binutils make
 
 RUN git clone --depth 1 -b develop https://github.com/nlohmann/json.git
 WORKDIR json/
-COPY build.sh *.options $SRC/
+COPY build.sh *.options parse_afl_fuzzer.dict $SRC/
diff --git a/projects/json/build.sh b/projects/json/build.sh
index d53a1b4..3cf7802 100755
--- a/projects/json/build.sh
+++ b/projects/json/build.sh
@@ -23,3 +23,4 @@
     FUZZER=$(basename $F .cpp)
     cp $SRC/fuzzer-parse.options $OUT/$FUZZER.options
 done
+cp $SRC/parse_afl_fuzzer.dict $OUT/
diff --git a/projects/json/parse_afl_fuzzer.dict b/projects/json/parse_afl_fuzzer.dict
new file mode 100644
index 0000000..c9ced21
--- /dev/null
+++ b/projects/json/parse_afl_fuzzer.dict
@@ -0,0 +1,52 @@
+#
+# AFL dictionary for JSON
+# -----------------------
+#
+# Just the very basics.
+#
+# Inspired by a dictionary by Jakub Wilk <jwilk@jwilk.net>
+#
+
+"0"
+",0"
+":0"
+"0:"
+"-1.2e+3"
+
+"true"
+"false"
+"null"
+
+"\"\""
+",\"\""
+":\"\""
+"\"\":"
+
+"{}"
+",{}"
+":{}"
+"{\"\":0}"
+"{{}}"
+
+"[]"
+",[]"
+":[]"
+"[0]"
+"[[]]"
+
+"''"
+"\\"
+"\\b"
+"\\f"
+"\\n"
+"\\r"
+"\\t"
+"\\u0000"
+"\\x00"
+"\\0"
+"\\uD800\\uDC00"
+"\\uDBFF\\uDFFF"
+
+"\"\":0"
+"//"
+"/**/"
\ No newline at end of file
diff --git a/projects/json/project.yaml b/projects/json/project.yaml
index 63fbc36..d563d89 100644
--- a/projects/json/project.yaml
+++ b/projects/json/project.yaml
@@ -1,6 +1,8 @@
 homepage: "https://github.com/nlohmann/json"
 language: c++
 primary_contact: "niels.lohmann@gmail.com"
+auto_ccs:
+  - "tanujgarg@google.com"
 sanitizers:
  - address
  - undefined
diff --git a/projects/jsoncons/Dockerfile b/projects/jsoncons/Dockerfile
index bdd0995..c3ade88 100755
--- a/projects/jsoncons/Dockerfile
+++ b/projects/jsoncons/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER david@adalogics.com
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone https://github.com/danielaparker/jsoncons
 
diff --git a/projects/jsoncpp/Dockerfile b/projects/jsoncpp/Dockerfile
index c649d70..eefbce9 100644
--- a/projects/jsoncpp/Dockerfile
+++ b/projects/jsoncpp/Dockerfile
@@ -1,4 +1,4 @@
-# Copyright 2019 Google Inc.
+# Copyright 2020 Google Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -15,15 +15,10 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-RUN apt-get update && apt-get install -y build-essential make curl wget
-
-# Install latest cmake.
-RUN wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5-Linux-x86_64.sh; \
-    chmod +x cmake-3.14.5-Linux-x86_64.sh; \
-    ./cmake-3.14.5-Linux-x86_64.sh --skip-license --prefix="/usr/local"
-
+RUN apt-get update -y && apt-get install -y curl wget \
+    binutils cmake ninja-build liblzma-dev libz-dev pkg-config autoconf libtool
 RUN git clone --depth 1 https://github.com/open-source-parsers/jsoncpp
 WORKDIR jsoncpp
-
-COPY build.sh $SRC/
-
+RUN git clone --depth 1 https://github.com/google/libprotobuf-mutator.git
+RUN (mkdir LPM && cd LPM && cmake ../libprotobuf-mutator -GNinja -DLIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF=ON -DLIB_PROTO_MUTATOR_TESTING=OFF -DCMAKE_BUILD_TYPE=Release && ninja)
+COPY build.sh *.proto *.h *.cc $SRC/
diff --git a/projects/jsoncpp/build.sh b/projects/jsoncpp/build.sh
index 6c55653..739dcd8 100644
--- a/projects/jsoncpp/build.sh
+++ b/projects/jsoncpp/build.sh
@@ -1,5 +1,5 @@
 #!/bin/bash -eu
-# Copyright 2018 Google Inc.
+# Copyright 2020 Google Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -28,3 +28,17 @@
 
 # Add dictionary.
 cp $SRC/jsoncpp/src/test_lib_json/fuzz.dict $OUT/jsoncpp_fuzzer.dict
+
+if [[ $CFLAGS != *sanitize=memory* ]]; then
+# Compile json proto.
+rm -rf genfiles && mkdir genfiles && ../LPM/external.protobuf/bin/protoc json.proto --cpp_out=genfiles --proto_path=$SRC
+
+# Compile LPM fuzzer.
+$CXX $CXXFLAGS -I genfiles -I .. -I ../libprotobuf-mutator/ -I ../LPM/external.protobuf/include -I ../include $LIB_FUZZING_ENGINE \
+    $SRC/jsoncpp_fuzz_proto.cc genfiles/json.pb.cc $SRC/json_proto_converter.cc \
+    ../LPM/src/libfuzzer/libprotobuf-mutator-libfuzzer.a \
+    ../LPM/src/libprotobuf-mutator.a \
+    ../LPM/external.protobuf/lib/libprotobuf.a \
+    -o  $OUT/jsoncpp_proto_fuzzer \
+    lib/libjsoncpp.a
+fi
\ No newline at end of file
diff --git a/projects/jsoncpp/json.proto b/projects/jsoncpp/json.proto
new file mode 100644
index 0000000..8dd9de4
--- /dev/null
+++ b/projects/jsoncpp/json.proto
@@ -0,0 +1,99 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// The proto definition for JSON format has been written based on
+// http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
+
+syntax = "proto2";
+
+package json_proto;
+
+message JsonParseAPI {
+  required int32 settings = 1;
+  required JsonObject object_value = 2;
+}
+
+message JsonObject {
+  required int32 settings = 1;
+  required string name = 2;
+  required JsonValue value = 3;
+}
+
+message JsonValue {
+  oneof value {
+    // Json value types:
+
+    // null: null, will be used when 'oneof' contains nothing
+
+    // object: another json object of any type
+    JsonObject object_value = 1;
+
+    // array: an array of values
+    ArrayValue array_value = 2;
+
+    // number: can be an integer, a float, an exponent
+    NumberValue number_value = 3;
+
+    // string: unicode string
+    StringValue string_value = 4;
+
+    // boolean: true or talse
+    BooleanValue boolean_value = 5;
+  }
+}
+
+message ArrayValue {
+  repeated JsonValue value = 1;
+}
+
+message NumberInteger {
+  required int64 value = 1;
+}
+
+message NumberFloat {
+  required double value = 1;
+}
+
+message NumberExponent {
+  required int32 base = 1;
+  required int32 exponent = 2;
+  required bool use_uppercase = 3;
+}
+
+message NumberExponentFrac {
+  required float base = 1;
+  required int32 exponent = 2;
+  required bool use_uppercase = 3;
+}
+
+message NumberValue {
+  required NumberInteger integer_value = 1;
+
+  // integer_value is used when oneof field below has nothing.
+  oneof value {
+    NumberFloat float_value = 2;
+    NumberExponent exponent_value = 3;
+    NumberExponentFrac exponent_frac_value = 4;
+  }
+}
+
+message StringValue {
+  required string value = 1;
+}
+
+message BooleanValue {
+  required bool value = 1;
+}
diff --git a/projects/jsoncpp/json_proto_converter.cc b/projects/jsoncpp/json_proto_converter.cc
new file mode 100644
index 0000000..ed453be
--- /dev/null
+++ b/projects/jsoncpp/json_proto_converter.cc
@@ -0,0 +1,87 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "json_proto_converter.h"
+
+namespace json_proto {
+
+void JsonProtoConverter::AppendArray(const ArrayValue& array_value) {
+  data_ << '[';
+  bool need_comma = false;
+  for (const auto& value : array_value.value()) {
+    // Trailing comma inside of an array makes JSON invalid, avoid adding that.
+    if (need_comma)
+      data_ << ',';
+    else
+      need_comma = true;
+
+    AppendValue(value);
+  }
+  data_ << ']';
+}
+
+void JsonProtoConverter::AppendNumber(const NumberValue& number_value) {
+  if (number_value.has_float_value()) {
+    data_ << number_value.float_value().value();
+  } else if (number_value.has_exponent_value()) {
+    auto value = number_value.exponent_value();
+    data_ << value.base();
+    data_ << (value.use_uppercase() ? 'E' : 'e');
+    data_ << value.exponent();
+  } else if (number_value.has_exponent_frac_value()) {
+    auto value = number_value.exponent_value();
+    data_ << value.base();
+    data_ << (value.use_uppercase() ? 'E' : 'e');
+    data_ << value.exponent();
+  } else {
+    data_ << number_value.integer_value().value();
+  }
+}
+
+void JsonProtoConverter::AppendObject(const JsonObject& json_object) {
+  data_ << '{' << '"' << json_object.name() << '"' << ':';
+  AppendValue(json_object.value());
+  data_ << '}';
+}
+
+void JsonProtoConverter::AppendValue(const JsonValue& json_value) {
+  if (json_value.has_object_value()) {
+    AppendObject(json_value.object_value());
+  } else if (json_value.has_array_value()) {
+    AppendArray(json_value.array_value());
+  } else if (json_value.has_number_value()) {
+    AppendNumber(json_value.number_value());
+  } else if (json_value.has_string_value()) {
+    data_ << '"' << json_value.string_value().value() << '"';
+  } else if (json_value.has_boolean_value()) {
+    data_ << (json_value.boolean_value().value() ? "true" : "false");
+  } else {
+    data_ << "null";
+  }
+}
+
+std::string JsonProtoConverter::Convert(const JsonObject& json_object) {
+  AppendObject(json_object);
+  return data_.str();
+}
+
+std::string JsonProtoConverter::Convert(
+    const json_proto::ArrayValue& json_array) {
+  AppendArray(json_array);
+  return data_.str();
+}
+
+}  // namespace json_proto
diff --git a/projects/jsoncpp/json_proto_converter.h b/projects/jsoncpp/json_proto_converter.h
new file mode 100644
index 0000000..c354672
--- /dev/null
+++ b/projects/jsoncpp/json_proto_converter.h
@@ -0,0 +1,43 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef JSON_PROTO_CONVERTER_H_
+#define JSON_PROTO_CONVERTER_H_
+
+#include <sstream>
+#include <string>
+
+#include "json.pb.h"
+
+namespace json_proto {
+
+class JsonProtoConverter {
+ public:
+  std::string Convert(const json_proto::JsonObject&);
+  std::string Convert(const json_proto::ArrayValue&);
+
+ private:
+  std::stringstream data_;
+
+  void AppendArray(const json_proto::ArrayValue&);
+  void AppendNumber(const json_proto::NumberValue&);
+  void AppendObject(const json_proto::JsonObject&);
+  void AppendValue(const json_proto::JsonValue&);
+};
+
+}  // namespace json_proto
+
+#endif  // TESTING_LIBFUZZER_PROTO_JSON_PROTO_CONVERTER_H_
diff --git a/projects/jsoncpp/jsoncpp_fuzz_proto.cc b/projects/jsoncpp/jsoncpp_fuzz_proto.cc
new file mode 100644
index 0000000..773821e
--- /dev/null
+++ b/projects/jsoncpp/jsoncpp_fuzz_proto.cc
@@ -0,0 +1,68 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#include "json.pb.h"
+#include "json_proto_converter.h"
+#include "libprotobuf-mutator/src/libfuzzer/libfuzzer_macro.h"
+
+#include <cstdint>
+#include <json/config.h>
+#include <json/json.h>
+#include <memory>
+#include <string>
+#include <iostream>
+#include <cstddef>
+#include <stdint.h>
+#include <cstring>
+#include <iostream>
+
+namespace Json {
+class Exception;
+}
+
+void FuzzJson(std::string data_str, int32_t hash_settings) {
+  Json::CharReaderBuilder builder;
+
+  builder.settings_["failIfExtra"] = hash_settings & (1 << 0);
+  builder.settings_["allowComments_"] = hash_settings & (1 << 1);
+  builder.settings_["strictRoot_"] = hash_settings & (1 << 2);
+  builder.settings_["allowDroppedNullPlaceholders_"] = hash_settings & (1 << 3);
+  builder.settings_["allowNumericKeys_"] = hash_settings & (1 << 4);
+  builder.settings_["allowSingleQuotes_"] = hash_settings & (1 << 5);
+  builder.settings_["failIfExtra_"] = hash_settings & (1 << 6);
+  builder.settings_["rejectDupKeys_"] = hash_settings & (1 << 7);
+  builder.settings_["allowSpecialFloats_"] = hash_settings & (1 << 8);
+  builder.settings_["collectComments"] = hash_settings & (1 << 9);
+  builder.settings_["allowTrailingCommas_"] = hash_settings & (1 << 10);
+
+  std::unique_ptr<Json::CharReader> reader(builder.newCharReader());
+  
+  const char* begin = data_str.c_str();
+  const char* end = begin + data_str.length();
+
+  Json::Value root;
+  try {
+    reader->parse(begin, end, &root, nullptr);
+  } catch (Json::Exception const&) {
+  }
+}
+
+DEFINE_PROTO_FUZZER(const json_proto::JsonParseAPI &json_proto) {
+  json_proto::JsonProtoConverter converter;
+  std::string data_str = converter.Convert(json_proto.object_value());
+  int32_t hash_settings = json_proto.settings();
+  FuzzJson(data_str, hash_settings);
+}
diff --git a/projects/jsonparser/Dockerfile b/projects/jsonparser/Dockerfile
index 59f56a6..17f6cd1 100644
--- a/projects/jsonparser/Dockerfile
+++ b/projects/jsonparser/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER adam@adalogics.com
 RUN go get github.com/buger/jsonparser
 
 COPY build.sh $SRC/
diff --git a/projects/jsonparser/build.sh b/projects/jsonparser/build.sh
index 92a0c90..fda6e8d 100755
--- a/projects/jsonparser/build.sh
+++ b/projects/jsonparser/build.sh
@@ -15,14 +15,4 @@
 #
 ################################################################################
 
-function compile_fuzzer {
-  path=$1
-  function=$2
-  fuzzer=$3
-
-  go-fuzz -func $function -o $fuzzer.a $path
-
-  $CXX $CXXFLAGS $LIB_FUZZING_ENGINE $fuzzer.a -o $OUT/$fuzzer
-}
-
-compile_fuzzer github.com/buger/jsonparser FuzzParseString fuzz
+$GOPATH/src/github.com/buger/jsonparser/oss-fuzz-build.sh
diff --git a/projects/jsonparser/project.yaml b/projects/jsonparser/project.yaml
index 3141924..f9dbd26 100644
--- a/projects/jsonparser/project.yaml
+++ b/projects/jsonparser/project.yaml
@@ -2,6 +2,7 @@
 primary_contact: "leonsbox@gmail.com"
 auto_ccs :
   - "adam@adalogics.com"
+  - "leloucharcher@gmail.com"
 language: go
 fuzzing_engines:
 - libfuzzer
diff --git a/projects/karchive/Dockerfile b/projects/karchive/Dockerfile
index 55347a8..d6c65e0 100644
--- a/projects/karchive/Dockerfile
+++ b/projects/karchive/Dockerfile
@@ -15,15 +15,14 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER tsdgeos@gmail.com
 RUN apt-get update && apt-get install --yes cmake make autoconf automake autopoint libtool wget po4a
 RUN git clone --depth 1 https://github.com/madler/zlib.git
 RUN git clone --depth 1 https://github.com/nih-at/libzip.git
 RUN wget https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz
 RUN git clone https://git.tukaani.org/xz.git
 RUN git clone --depth 1 --branch=5.15 git://code.qt.io/qt/qtbase.git
-RUN git clone --depth 1 git://anongit.kde.org/extra-cmake-modules
-RUN git clone --depth 1 git://anongit.kde.org/karchive
+RUN git clone --depth 1 https://invent.kde.org/frameworks/extra-cmake-modules.git
+RUN git clone --depth 1 https://invent.kde.org/frameworks/karchive.git
 COPY build.sh $SRC
 COPY karchive_fuzzer.cc $SRC
 WORKDIR karchive
diff --git a/projects/kcodecs/Dockerfile b/projects/kcodecs/Dockerfile
index 3a234bb..3d70e83 100644
--- a/projects/kcodecs/Dockerfile
+++ b/projects/kcodecs/Dockerfile
@@ -15,11 +15,10 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER tsdgeos@gmail.com
 RUN apt-get install --yes cmake gperf
 RUN git clone --depth 1 --branch=5.15 git://code.qt.io/qt/qtbase.git
-RUN git clone --depth 1 git://anongit.kde.org/kcodecs
-RUN git clone --depth 1 git://anongit.kde.org/extra-cmake-modules
+RUN git clone --depth 1 https://invent.kde.org/frameworks/kcodecs.git
+RUN git clone --depth 1 https://invent.kde.org/frameworks/extra-cmake-modules.git
 RUN git clone --depth 1 https://gitlab.freedesktop.org/uchardet/uchardet.git
 COPY build.sh $SRC
 COPY kcodecs_fuzzer.cc $SRC
diff --git a/projects/keystone/Dockerfile b/projects/keystone/Dockerfile
index 3d0bbae..29bcdfd 100644
--- a/projects/keystone/Dockerfile
+++ b/projects/keystone/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER keystone.engine@gmail.com
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone --depth 1 https://github.com/keystone-engine/keystone.git
 WORKDIR $SRC
diff --git a/projects/kimageformats/Dockerfile b/projects/kimageformats/Dockerfile
index 8e92b33..fbd62bc 100644
--- a/projects/kimageformats/Dockerfile
+++ b/projects/kimageformats/Dockerfile
@@ -15,14 +15,13 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER tsdgeos@gmail.com
 RUN apt-get install --yes cmake
 RUN git clone --depth 1 https://github.com/madler/zlib.git
 RUN git clone --depth 1 https://github.com/nih-at/libzip.git
-RUN git clone --depth 1 git://anongit.kde.org/extra-cmake-modules
+RUN git clone --depth 1 https://invent.kde.org/frameworks/extra-cmake-modules.git
 RUN git clone --depth 1 --branch=5.15 git://code.qt.io/qt/qtbase.git
-RUN git clone --depth 1 git://anongit.kde.org/karchive
-RUN git clone --depth 1 git://anongit.kde.org/kimageformats
+RUN git clone --depth 1 https://invent.kde.org/frameworks/karchive.git
+RUN git clone --depth 1 https://invent.kde.org/frameworks/kimageformats.git
 COPY build.sh $SRC
 COPY kimgio_fuzzer.cc $SRC
 WORKDIR kimageformats
diff --git a/projects/knot-dns/Dockerfile b/projects/knot-dns/Dockerfile
index 7583895..3c96b70 100644
--- a/projects/knot-dns/Dockerfile
+++ b/projects/knot-dns/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jonathan.foote@gmail.com
 RUN apt-get update && apt-get install -y \
  autoconf \
  autogen \
diff --git a/projects/lame/Dockerfile b/projects/lame/Dockerfile
index 565626b..8667b64 100644
--- a/projects/lame/Dockerfile
+++ b/projects/lame/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool subversion
 RUN git clone --depth 1 https://github.com/guidovranken/LAME-fuzzers
 RUN svn checkout https://svn.code.sf.net/p/lame/svn/trunk/lame $SRC/lame
diff --git a/projects/lcms/Dockerfile b/projects/lcms/Dockerfile
index c720537..ed65328 100644
--- a/projects/lcms/Dockerfile
+++ b/projects/lcms/Dockerfile
@@ -15,8 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kcwu@google.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://github.com/mm2/Little-CMS.git lcms
 WORKDIR lcms
-COPY build.sh cmsIT8_load_fuzzer.* cms_transform_fuzzer.* icc.dict $SRC/
+COPY build.sh cmsIT8_load_fuzzer.* cms_transform_fuzzer.* cms_overwrite_transform_fuzzer.* icc.dict $SRC/
diff --git a/projects/lcms/build.sh b/projects/lcms/build.sh
index 4015b1b..9a79b2c 100755
--- a/projects/lcms/build.sh
+++ b/projects/lcms/build.sh
@@ -20,7 +20,7 @@
 make -j$(nproc) all
 
 # build your fuzzer(s)
-FUZZERS="cmsIT8_load_fuzzer cms_transform_fuzzer"
+FUZZERS="cmsIT8_load_fuzzer cms_transform_fuzzer cms_overwrite_transform_fuzzer"
 for F in $FUZZERS; do
     $CC $CFLAGS -c -Iinclude \
         $SRC/$F.c -o $SRC/$F.o
diff --git a/projects/lcms/cms_overwrite_transform_fuzzer.c b/projects/lcms/cms_overwrite_transform_fuzzer.c
new file mode 100644
index 0000000..df077ee
--- /dev/null
+++ b/projects/lcms/cms_overwrite_transform_fuzzer.c
@@ -0,0 +1,39 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stdint.h>
+#include "lcms2.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+ if (size < 2) {
+   return 0;
+ }
+
+ size_t mid = size / 2;
+
+ cmsHPROFILE hInProfile, hOutProfile;
+ cmsHTRANSFORM hTransform;
+
+ hInProfile = cmsOpenProfileFromMem(data, mid);
+ hOutProfile = cmsOpenProfileFromMem(data + mid, size - mid);
+ hTransform = cmsCreateTransform(hInProfile, TYPE_BGR_8, hOutProfile,
+                                 TYPE_BGR_8, INTENT_PERCEPTUAL, 0);
+ cmsCloseProfile(hInProfile);
+ cmsCloseProfile(hOutProfile);
+
+ if (hTransform) {
+   cmsDeleteTransform(hTransform);
+ }
+ return 0;
+}
diff --git a/projects/lcms/cms_overwrite_transform_fuzzer.options b/projects/lcms/cms_overwrite_transform_fuzzer.options
new file mode 100644
index 0000000..beabdc2
--- /dev/null
+++ b/projects/lcms/cms_overwrite_transform_fuzzer.options
@@ -0,0 +1,2 @@
+[libfuzzer]
+dict = icc.dict
diff --git a/projects/leptonica/Dockerfile b/projects/leptonica/Dockerfile
index ccf467f..cf79bf5 100644
--- a/projects/leptonica/Dockerfile
+++ b/projects/leptonica/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER taking@google.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool \
   pkg-config cmake nasm
 RUN git clone --depth 1 https://github.com/DanBloomberg/leptonica.git leptonica
diff --git a/projects/leptonica/project.yaml b/projects/leptonica/project.yaml
index c0fbe08..c9b0020 100644
--- a/projects/leptonica/project.yaml
+++ b/projects/leptonica/project.yaml
@@ -6,6 +6,7 @@
   - "dbloomberg@google.com"
   - "stjoweil@googlemail.com"
   - "Adam@adalogics.com"
+  - "ballbach@google.com"
 sanitizers:
   - address
   - undefined
diff --git a/projects/libaom/Dockerfile b/projects/libaom/Dockerfile
index 0619ac0..a911f33 100644
--- a/projects/libaom/Dockerfile
+++ b/projects/libaom/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER urvang@google.com
 RUN apt-get update && apt-get install -y cmake yasm wget
 RUN git clone https://aomedia.googlesource.com/aom
 ADD https://storage.googleapis.com/aom-test-data/fuzzer/dec_fuzzer_seed_corpus.zip $SRC/
diff --git a/projects/libarchive/Dockerfile b/projects/libarchive/Dockerfile
index d85739d..bd07669 100644
--- a/projects/libarchive/Dockerfile
+++ b/projects/libarchive/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kcwu@google.com
 
 # Installing optional libraries can utilize more code path and/or improve
 # performance (avoid calling external programs).
diff --git a/projects/libass/Dockerfile b/projects/libass/Dockerfile
index bc1999d..5253bb9 100644
--- a/projects/libass/Dockerfile
+++ b/projects/libass/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER eugeni.stepanov@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config libfreetype6-dev libfontconfig1-dev
 
 RUN git clone --depth 1 https://github.com/libass/libass.git
diff --git a/projects/libavc/Dockerfile b/projects/libavc/Dockerfile
index 5d4bf22..9998c24 100644
--- a/projects/libavc/Dockerfile
+++ b/projects/libavc/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER harish.mahendrakar@ittiam.com
 RUN apt-get update && apt-get install -y wget cmake
 RUN git clone https://android.googlesource.com/platform/external/libavc
 ADD https://storage.googleapis.com/android_media/external/libavc/fuzzer/avc_dec_fuzzer_seed_corpus.zip $SRC/
diff --git a/projects/libavif/Dockerfile b/projects/libavif/Dockerfile
index 90421aa..e7358e7 100644
--- a/projects/libavif/Dockerfile
+++ b/projects/libavif/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER joedrago@gmail.com
 
 ADD bionic.list /etc/apt/sources.list.d/bionic.list
 ADD nasm_apt.pin /etc/apt/preferences
diff --git a/projects/libcacard/Dockerfile b/projects/libcacard/Dockerfile
index 706c033..5e280b9 100644
--- a/projects/libcacard/Dockerfile
+++ b/projects/libcacard/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jjelen@redhat.com
 RUN apt-get update && apt-get install -y pkg-config libglib2.0-dev gyp libsqlite3-dev mercurial python3-pip
 # Because Ubuntu has really ancient meson out there
 RUN pip3 install meson ninja
diff --git a/projects/libcbor/Dockerfile b/projects/libcbor/Dockerfile
index 155d336..7ac62c5 100644
--- a/projects/libcbor/Dockerfile
+++ b/projects/libcbor/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER alex.gaynor@gmail.com
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone --depth 1 https://github.com/PJK/libcbor
 WORKDIR libcbor
diff --git a/projects/libchewing/Dockerfile b/projects/libchewing/Dockerfile
index b361dac..4a77e24 100644
--- a/projects/libchewing/Dockerfile
+++ b/projects/libchewing/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kcwu@csie.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool texinfo
 
 RUN git clone --depth 1 https://github.com/chewing/libchewing.git
diff --git a/projects/libcoap/Dockerfile b/projects/libcoap/Dockerfile
index 1a63bc5..483ce97 100644
--- a/projects/libcoap/Dockerfile
+++ b/projects/libcoap/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER bergmann@tzi.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool \
     pkg-config
 RUN git clone --depth 1 https://github.com/obgm/libcoap.git libcoap
diff --git a/projects/libevent/Dockerfile b/projects/libevent/Dockerfile
new file mode 100644
index 0000000..04fdc04
--- /dev/null
+++ b/projects/libevent/Dockerfile
@@ -0,0 +1,21 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y make autoconf automake libtool cmake
+RUN git clone --depth 1 https://github.com/libevent/libevent.git libevent
+WORKDIR libevent
+COPY build.sh *.cc $SRC/
diff --git a/projects/libevent/build.sh b/projects/libevent/build.sh
new file mode 100755
index 0000000..d6e44b6
--- /dev/null
+++ b/projects/libevent/build.sh
@@ -0,0 +1,32 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+# build project
+sh autogen.sh
+./configure --disable-openssl
+make -j$(nproc) clean
+make -j$(nproc) all
+make install
+
+# build fuzzer
+for fuzzers in $(find $SRC -name '*_fuzzer.cc'); do
+  fuzz_basename=$(basename -s .cc $fuzzers)
+  $CXX $CXXFLAGS -std=c++11 -Iinclude \
+      $fuzzers $LIB_FUZZING_ENGINE ./.libs/libevent.a ./.libs/libevent_core.a  \
+      ./.libs/libevent_pthreads.a ./.libs/libevent_extra.a \
+      -o $OUT/$fuzz_basename
+done
diff --git a/projects/c-blosc/blosc_fuzzer.cc b/projects/libevent/parse_query_fuzzer.cc
similarity index 64%
rename from projects/c-blosc/blosc_fuzzer.cc
rename to projects/libevent/parse_query_fuzzer.cc
index c769c38..2271b39 100644
--- a/projects/c-blosc/blosc_fuzzer.cc
+++ b/projects/libevent/parse_query_fuzzer.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -15,19 +15,16 @@
 #include <stddef.h>
 #include <stdint.h>
 #include <stdlib.h>
+#include <string>
 
-#include "blosc/blosc.h"
+#include "libevent/include/event2/http.h"
+#include "libevent/include/event2/keyvalq_struct.h"
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
-  if (size < BLOSC_MIN_HEADER_LENGTH) return 0;
-
-  size_t nbytes, cbytes, blocksize;
-  blosc_cbuffer_sizes(data, &nbytes, &cbytes, &blocksize);
-  if (cbytes != size) return 0;
-  if (nbytes == 0) return 0;
-
-  void *output = malloc(nbytes);
-  blosc_decompress_ctx(data, output, nbytes, /*numinternalthreads=*/1);
-  free(output);
+  std::string fuzz_string(reinterpret_cast<const char *>(data), size);
+  struct evkeyvalq headers;
+  if (evhttp_parse_query(fuzz_string.c_str(), &headers) == 0) {
+    evhttp_clear_headers(&headers);
+  }
   return 0;
 }
diff --git a/projects/libevent/project.yaml b/projects/libevent/project.yaml
new file mode 100644
index 0000000..2b4282f
--- /dev/null
+++ b/projects/libevent/project.yaml
@@ -0,0 +1,10 @@
+homepage: "https://github.com/libevent/libevent"
+language: c++
+primary_contact: "a3at.mail@gmail.com"
+sanitizers:
+  - address
+  - memory
+  - undefined
+architectures:
+  - x86_64
+  - i386
diff --git a/projects/libexif/Dockerfile b/projects/libexif/Dockerfile
index 927c71e..465fd02 100644
--- a/projects/libexif/Dockerfile
+++ b/projects/libexif/Dockerfile
@@ -15,9 +15,8 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER paul.l.kehrer@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool gettext autopoint
 RUN git clone --depth 1 https://github.com/libexif/libexif
 RUN git clone --depth 1 https://github.com/ianare/exif-samples
 WORKDIR libexif
-COPY exif_loader_fuzzer.cc build.sh $SRC/
+COPY exif_loader_fuzzer.cc exif_from_data_fuzzer.cc build.sh $SRC/
diff --git a/projects/libexif/build.sh b/projects/libexif/build.sh
index a533bff..790e511 100755
--- a/projects/libexif/build.sh
+++ b/projects/libexif/build.sh
@@ -24,7 +24,17 @@
 mkdir -p exif_corpus
 find exif-samples -type f -name '*.jpg' -exec mv -n {} exif_corpus/ \; -o -name '*.tiff' -exec mv -n {} exif_corpus/ \;
 cp libexif/test/testdata/*.jpg exif_corpus
-zip -r "$OUT/exif_loader_fuzzer_seed_corpus.zip" exif_corpus/
+zip -r "$WORK/exif_seed_corpus.zip" exif_corpus/
 popd
 
-$CXX $CXXFLAGS -std=c++11 -I"$WORK/include" "$SRC/exif_loader_fuzzer.cc" -o $OUT/exif_loader_fuzzer $LIB_FUZZING_ENGINE "$WORK/lib/libexif.a"
+for fuzzer in $(find $SRC/ -name '*_fuzzer.cc'); do
+  fuzzer_basename=$(basename -s .cc $fuzzer)
+  $CXX $CXXFLAGS \
+      -std=c++11 \
+      -I"$WORK/include" \
+      $fuzzer \
+      -o $OUT/$fuzzer_basename \
+      $LIB_FUZZING_ENGINE \
+      "$WORK/lib/libexif.a"
+  cp $WORK/exif_seed_corpus.zip "${OUT}/${fuzzer_basename}_seed_corpus.zip"
+done
diff --git a/projects/libexif/exif_from_data_fuzzer.cc b/projects/libexif/exif_from_data_fuzzer.cc
new file mode 100644
index 0000000..2289328
--- /dev/null
+++ b/projects/libexif/exif_from_data_fuzzer.cc
@@ -0,0 +1,66 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <libexif/exif-data.h>
+#include <libexif/exif-loader.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+/* Extract all MakerNote tags */
+static void mnote_dump(ExifData *data) {
+    ExifMnoteData *mn = exif_data_get_mnote_data(data);
+    if (mn) {
+        int num = exif_mnote_data_count(mn);
+
+        /* Loop through all MakerNote tags */
+        for (int i=0; i < num; ++i) {
+            char buf[1024];
+            exif_mnote_data_get_value(mn, i, buf, sizeof(buf));
+        }
+    }
+}
+
+static void dump_value(ExifEntry *entry, void *user_data) {
+  char buf[1024];
+  exif_entry_get_value(entry, buf, sizeof(buf));
+}
+
+static void data_func(ExifContent *content, void *user_data) {
+  exif_content_foreach_entry(content, dump_value, NULL);
+}
+
+/* This is like exif_data_dump but without writing to stdout */
+static void data_dump(ExifData *data) {
+  exif_data_foreach_content(data, data_func, NULL);
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+
+  // Parse tags using (ultimately) exif_data_load_data()
+  auto image = exif_data_new_from_data(data, size);
+  if (image) {
+    // Exercise the EXIF tag manipulation code
+    exif_data_get_mnote_data(image);
+    data_dump(image);
+    mnote_dump(image);
+    unsigned char *buf;
+    unsigned int sz;
+    exif_data_save_data(image, &buf, &sz);
+    free(buf);
+    exif_data_fix(image);
+    exif_data_unref(image);
+  }
+
+  return 0;
+}
diff --git a/projects/libexif/exif_loader_fuzzer.cc b/projects/libexif/exif_loader_fuzzer.cc
index 98365b7..6389820 100644
--- a/projects/libexif/exif_loader_fuzzer.cc
+++ b/projects/libexif/exif_loader_fuzzer.cc
@@ -1,3 +1,17 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 #include <stdio.h>
 #include <stdint.h>
 #include <libexif/exif-loader.h>
diff --git a/projects/libexif/project.yaml b/projects/libexif/project.yaml
index be5c9d9..73a1647 100644
--- a/projects/libexif/project.yaml
+++ b/projects/libexif/project.yaml
@@ -4,6 +4,7 @@
 auto_ccs:
   - paul.l.kehrer@gmail.com
   - marcus@jet.franken.de
+  - marcusmeissner@googlemail.com
 fuzzing_engines:
   - libfuzzer
   - afl
diff --git a/projects/libfdk-aac/Dockerfile b/projects/libfdk-aac/Dockerfile
index 441bcf9..ed0ddca 100644
--- a/projects/libfdk-aac/Dockerfile
+++ b/projects/libfdk-aac/Dockerfile
@@ -15,6 +15,5 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kcc@google.com
 RUN git clone --depth 1 https://android.googlesource.com/platform/external/aac/
 COPY build.sh *.cpp $SRC/
diff --git a/projects/libfido2/Dockerfile b/projects/libfido2/Dockerfile
index 29fc7fb..b288499 100644
--- a/projects/libfido2/Dockerfile
+++ b/projects/libfido2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER g.kihlman@yubico.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN apt-get install -y cmake libudev-dev pkg-config chrpath
 RUN git clone --branch v0.7.0 https://github.com/PJK/libcbor
diff --git a/projects/libfmt/Dockerfile b/projects/libfmt/Dockerfile
index 3249bb0..f9da43c 100644
--- a/projects/libfmt/Dockerfile
+++ b/projects/libfmt/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER pauldreikossfuzz@gmail.com
 RUN echo "CXX=$CXX"
 RUN echo "CXXFLAGS=$CXXFLAGS"
 RUN apt-get update && apt-get install -y cmake ninja-build
diff --git a/projects/libgd/Dockerfile b/projects/libgd/Dockerfile
index 617b0a5..0ff48b0 100644
--- a/projects/libgd/Dockerfile
+++ b/projects/libgd/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER ossfuzz@tds.xyz
 RUN apt-get update && \
     apt-get install -y make autoconf automake libtool pkg-config libz-dev
 RUN git clone --depth 1 https://github.com/libgd/libgd
diff --git a/projects/libgit2/Dockerfile b/projects/libgit2/Dockerfile
index eb75510..7f5a6c7 100644
--- a/projects/libgit2/Dockerfile
+++ b/projects/libgit2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER Nelson Elhage <nelhage@nelhage.com>
 RUN apt-get update && apt-get install -y make autoconf automake libtool cmake
 RUN git clone --depth 1 https://github.com/libgit2/libgit2 libgit2
 WORKDIR libgit2
diff --git a/projects/libheif/Dockerfile b/projects/libheif/Dockerfile
index a89584d..06eb814 100644
--- a/projects/libheif/Dockerfile
+++ b/projects/libheif/Dockerfile
@@ -16,7 +16,6 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 
-MAINTAINER mail@joachim-bauch.de
 
 RUN apt-get update && apt-get install -y \
     autoconf \
diff --git a/projects/libhevc/Dockerfile b/projects/libhevc/Dockerfile
index ca83129..d483313 100644
--- a/projects/libhevc/Dockerfile
+++ b/projects/libhevc/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER harish.mahendrakar@ittiam.com
 RUN apt-get update && apt-get install -y wget cmake
 RUN git clone https://android.googlesource.com/platform/external/libhevc
 ADD https://storage.googleapis.com/android_media/external/libhevc/fuzzer/hevc_dec_fuzzer_seed_corpus.zip $SRC/
diff --git a/projects/libhtp/Dockerfile b/projects/libhtp/Dockerfile
index 3eec92c..cb44a8f 100644
--- a/projects/libhtp/Dockerfile
+++ b/projects/libhtp/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER victor@inliniac.net
 RUN apt-get update && apt-get install -y make autoconf automake libtool zlib1g-dev liblzma-dev
 RUN git clone --depth 1 https://github.com/OISF/libhtp.git libhtp
 WORKDIR $SRC
diff --git a/projects/libical/Dockerfile b/projects/libical/Dockerfile
index 9679108..7402d6d 100644
--- a/projects/libical/Dockerfile
+++ b/projects/libical/Dockerfile
@@ -15,12 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER tsdgeos@gmail.com
-RUN apt-get update && apt-get install --yes cmake
-
-# libical requires cmake 3.11 whereas Ubuntu 16.04 only has 3.5.1
-ADD https://github.com/Kitware/CMake/releases/download/v3.14.3/cmake-3.14.3-Linux-x86_64.tar.gz $WORK
-RUN cd $WORK && tar -xzf cmake-3.14.3-Linux-x86_64.tar.gz && rm cmake-3.14.3-Linux-x86_64.tar.gz
 
 RUN git clone --depth 1 https://github.com/libical/libical.git
 COPY build.sh $SRC
diff --git a/projects/libical/build.sh b/projects/libical/build.sh
index 9af1325..830a55b 100644
--- a/projects/libical/build.sh
+++ b/projects/libical/build.sh
@@ -1,4 +1,4 @@
-$WORK/cmake-3.14.3-Linux-x86_64/bin/cmake . -DSTATIC_ONLY=ON -DICAL_GLIB=False
+cmake . -DSTATIC_ONLY=ON -DICAL_GLIB=False
 make install -j$(nproc)
 
 $CXX $CXXFLAGS -std=c++11 $SRC/libical_fuzzer.cc $LIB_FUZZING_ENGINE /usr/local/lib/libical.a -o $OUT/libical_fuzzer
diff --git a/projects/libidn/Dockerfile b/projects/libidn/Dockerfile
index 70ccdd6..3bb5413 100644
--- a/projects/libidn/Dockerfile
+++ b/projects/libidn/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER rockdaboot@gmail.com
 RUN apt-get update && apt-get install -y \
  pkg-config \
  autopoint \
diff --git a/projects/libidn2/Dockerfile b/projects/libidn2/Dockerfile
index 193fc16..a832bd4 100644
--- a/projects/libidn2/Dockerfile
+++ b/projects/libidn2/Dockerfile
@@ -15,8 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER rockdaboot@gmail.com
-RUN apt-get update && apt-get install -y make autoconf automake gettext libtool autopoint pkg-config gengetopt curl gperf
+RUN apt-get update && apt-get install -y make autoconf automake gettext libtool autopoint pkg-config gengetopt curl gperf rsync wget
 
 RUN git clone --depth=1 --recursive https://gitlab.com/libidn/libidn2.git
 
diff --git a/projects/libjpeg-turbo/Dockerfile b/projects/libjpeg-turbo/Dockerfile
index 4c3d99a..329be45 100644
--- a/projects/libjpeg-turbo/Dockerfile
+++ b/projects/libjpeg-turbo/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER alex.gaynor@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool nasm curl cmake
 RUN git clone --depth 1 https://github.com/libjpeg-turbo/libjpeg-turbo
 
diff --git a/projects/libldac/Dockerfile b/projects/libldac/Dockerfile
index d5c2a65..9aad216 100644
--- a/projects/libldac/Dockerfile
+++ b/projects/libldac/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER cdiehl@mozilla.com
 
 RUN apt-get update && apt-get install -y automake libtool
 RUN git clone --depth 1 -b master https://android.googlesource.com/platform/external/libldac
diff --git a/projects/libmpeg2/Dockerfile b/projects/libmpeg2/Dockerfile
index 849e9ab..9d823a1 100644
--- a/projects/libmpeg2/Dockerfile
+++ b/projects/libmpeg2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER harish.mahendrakar@ittiam.com
 RUN apt-get update && apt-get install -y wget cmake
 RUN git clone https://android.googlesource.com/platform/external/libmpeg2
 ADD https://storage.googleapis.com/android_media/external/libmpeg2/fuzzer/mpeg2_dec_fuzzer_seed_corpus.zip $SRC/
diff --git a/projects/libpcap/Dockerfile b/projects/libpcap/Dockerfile
index 3879928..fcd2b30 100644
--- a/projects/libpcap/Dockerfile
+++ b/projects/libpcap/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER security@tcpdump.org
 RUN apt-get update && apt-get install -y make cmake flex bison
 RUN git clone --depth 1 https://github.com/the-tcpdump-group/libpcap.git libpcap
 # for corpus as wireshark
diff --git a/projects/libplist/Dockerfile b/projects/libplist/Dockerfile
index 76432e1..375fff6 100644
--- a/projects/libplist/Dockerfile
+++ b/projects/libplist/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER nikias@gmx.li
 RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config
 
 RUN git clone --depth 1 https://github.com/libimobiledevice/libplist
diff --git a/projects/libplist/build.sh b/projects/libplist/build.sh
index 14a29c4..7ad2c04 100755
--- a/projects/libplist/build.sh
+++ b/projects/libplist/build.sh
@@ -23,7 +23,7 @@
 for fuzzer in bplist_fuzzer xplist_fuzzer; do
   $CXX $CXXFLAGS -std=c++11 -Iinclude/ \
       fuzz/$fuzzer.cc -o $OUT/$fuzzer \
-      $LIB_FUZZING_ENGINE src/.libs/libplist.a
+      $LIB_FUZZING_ENGINE src/.libs/libplist-2.0.a
 done
 
 zip -j $OUT/bplist_fuzzer_seed_corpus.zip test/data/*.bplist
diff --git a/projects/libpng-proto/Dockerfile b/projects/libpng-proto/Dockerfile
index 05558de..26d3917 100644
--- a/projects/libpng-proto/Dockerfile
+++ b/projects/libpng-proto/Dockerfile
@@ -15,10 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kcc@google.com
-RUN apt-get update && \
-    apt-get install -y make autoconf automake libtool zlib1g-dev ninja-build cmake
-
+RUN apt-get update -y && \
+    apt-get install -y make autoconf automake libtool zlib1g-dev \
+    binutils cmake ninja-build liblzma-dev libz-dev pkg-config
 RUN git clone --depth 1 https://github.com/glennrp/libpng.git
 RUN git clone --depth 1 https://github.com/google/libprotobuf-mutator.git
 RUN git clone --depth 1 https://github.com/google/fuzzer-test-suite
diff --git a/projects/libpng/Dockerfile b/projects/libpng/Dockerfile
index 80c0830..4723286 100644
--- a/projects/libpng/Dockerfile
+++ b/projects/libpng/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER glennrp@gmail.com
 RUN apt-get update && \
     apt-get install -y make autoconf automake libtool zlib1g-dev
 
diff --git a/projects/libprotobuf-mutator/Dockerfile b/projects/libprotobuf-mutator/Dockerfile
index 5eb0da0..14adeb8 100644
--- a/projects/libprotobuf-mutator/Dockerfile
+++ b/projects/libprotobuf-mutator/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER vitalybuka@chromium.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config cmake \
     ninja-build liblzma-dev libz-dev docbook2x
 
diff --git a/projects/libpsl/Dockerfile b/projects/libpsl/Dockerfile
index 14724c0..303c5bb 100644
--- a/projects/libpsl/Dockerfile
+++ b/projects/libpsl/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER rockdaboot@gmail.com
 RUN apt-get update && apt-get install -y \
  make \
  pkg-config \
diff --git a/projects/libra/Dockerfile b/projects/libra/Dockerfile
index 3a2cd4d..426e547 100644
--- a/projects/libra/Dockerfile
+++ b/projects/libra/Dockerfile
@@ -16,7 +16,6 @@
 
 # google oss-fuzz stuff
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER davidwg@fb.com
 
 # install other tools we might need
 RUN apt-get update && apt-get install -y cmake curl
diff --git a/projects/libraw/Dockerfile b/projects/libraw/Dockerfile
new file mode 100644
index 0000000..7ed9213
--- /dev/null
+++ b/projects/libraw/Dockerfile
@@ -0,0 +1,26 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config
+RUN git clone --depth 1 https://github.com/libraw/libraw
+WORKDIR libraw
+
+ADD http://oss-fuzz-corpus.storage.googleapis.com/libraw/libraw_cr2_fuzzer_seed_corpus.zip $SRC/
+ADD http://oss-fuzz-corpus.storage.googleapis.com/libraw/libraw_nef_fuzzer_seed_corpus.zip $SRC/
+ADD http://oss-fuzz-corpus.storage.googleapis.com/libraw/libraw_raf_fuzzer_seed_corpus.zip $SRC/
+
+COPY build.sh libraw_fuzzer.cc $SRC/
diff --git a/projects/libraw/build.sh b/projects/libraw/build.sh
new file mode 100755
index 0000000..6c46d3f
--- /dev/null
+++ b/projects/libraw/build.sh
@@ -0,0 +1,44 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+# copy corpuses
+cp $SRC/libraw_cr2_fuzzer_seed_corpus.zip \
+    $SRC/libraw_nef_fuzzer_seed_corpus.zip \
+    $SRC/libraw_raf_fuzzer_seed_corpus.zip \
+    $OUT/
+
+# build project
+autoreconf --install
+./configure --disable-examples
+make
+
+# build fuzzers
+$CXX $CXXFLAGS -std=c++11 -Ilibraw \
+    $SRC/libraw_fuzzer.cc -o $OUT/libraw_fuzzer \
+    $LIB_FUZZING_ENGINE lib/.libs/libraw.a
+
+$CXX $CXXFLAGS -std=c++11 -Ilibraw \
+    $SRC/libraw_fuzzer.cc -o $OUT/libraw_cr2_fuzzer \
+    $LIB_FUZZING_ENGINE lib/.libs/libraw.a
+
+$CXX $CXXFLAGS -std=c++11 -Ilibraw \
+    $SRC/libraw_fuzzer.cc -o $OUT/libraw_nef_fuzzer \
+    $LIB_FUZZING_ENGINE lib/.libs/libraw.a
+
+$CXX $CXXFLAGS -std=c++11 -Ilibraw \
+    $SRC/libraw_fuzzer.cc -o $OUT/libraw_raf_fuzzer \
+    $LIB_FUZZING_ENGINE lib/.libs/libraw.a
diff --git a/projects/libraw/libraw_fuzzer.cc b/projects/libraw/libraw_fuzzer.cc
new file mode 100644
index 0000000..74c9b61
--- /dev/null
+++ b/projects/libraw/libraw_fuzzer.cc
@@ -0,0 +1,64 @@
+/*  Copyright 2020 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+#include <stddef.h>
+#include <stdint.h>
+
+#include <string>
+
+#include <libraw.h>
+
+enum InterpolationOptions {
+  Linear = 0,
+  Vng = 1, 
+  Ppg = 2,
+  Ahd = 3,
+  Dcb = 4,
+  Dht = 11,
+  AhdModified = 12
+};
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  // Input less than 15mb
+  if (size > 15000000) {
+    return 0;
+  }
+
+  LibRaw lib_raw;
+
+  int result = lib_raw.open_buffer(
+      const_cast<char*>(reinterpret_cast<const char*>(data)), size);
+  if (result != LIBRAW_SUCCESS) {
+    return 0;
+  }
+
+  result = lib_raw.unpack();
+  if (result != LIBRAW_SUCCESS) {
+    return 0;
+  }
+
+  InterpolationOptions options[] = {Linear, Vng, Ppg, Ahd, Dcb, Dht, AhdModified};
+
+  for (int i = 0; i < sizeof(options)/sizeof(*options); i++) {
+    lib_raw.output_params_ptr()->user_qual = static_cast<int>(options[i]);
+
+    result = lib_raw.dcraw_process();
+    if (result != LIBRAW_SUCCESS) {
+      return 0;
+    }
+  }
+
+  return 0;
+}
diff --git a/projects/libraw/project.yaml b/projects/libraw/project.yaml
new file mode 100644
index 0000000..301821d
--- /dev/null
+++ b/projects/libraw/project.yaml
@@ -0,0 +1,10 @@
+homepage: "https://www.libraw.org/"
+language: c++
+primary_contact: "jesteele@google.com"
+auto_ccs:
+    - "nchusid@google.com"
+    - "pinheirojamie@google.com"
+sanitizers:
+    - address
+    - memory
+    - undefined
diff --git a/projects/librawspeed/Dockerfile b/projects/librawspeed/Dockerfile
index d3ae084..54bb66d 100644
--- a/projects/librawspeed/Dockerfile
+++ b/projects/librawspeed/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER lebedev.ri@gmail.com
 RUN apt-get update && \
     apt-get install -y apt-transport-https ca-certificates gnupg software-properties-common wget && \
     wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | apt-key add - && \
diff --git a/projects/libreoffice/Dockerfile b/projects/libreoffice/Dockerfile
index 8070efc..6e8d211 100644
--- a/projects/libreoffice/Dockerfile
+++ b/projects/libreoffice/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER officesecurity@lists.freedesktop.org
 # enable source repos
 RUN sed -i -e '/^#\s*deb-src.*\smain\s\+restricted/s/^#//' /etc/apt/sources.list
 #build requirements
diff --git a/projects/libressl/Dockerfile b/projects/libressl/Dockerfile
index 2c3b031..7123950 100644
--- a/projects/libressl/Dockerfile
+++ b/projects/libressl/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER ab@pompel.me
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone --depth 1 https://github.com/libressl-portable/portable.git libressl
 RUN git clone --depth 1 https://github.com/libressl-portable/fuzz.git libressl.fuzzers
diff --git a/projects/libsodium/Dockerfile b/projects/libsodium/Dockerfile
index cb3fb04..f995865 100644
--- a/projects/libsodium/Dockerfile
+++ b/projects/libsodium/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER chriswwolfe@gmail.com
 RUN apt-get update && apt-get install -y make
 RUN git clone --depth 1 https://github.com/jedisct1/libsodium.git --branch stable libsodium
 WORKDIR libsodium
diff --git a/projects/libspectre/Dockerfile b/projects/libspectre/Dockerfile
index 3d8782e..2ec0fcf 100755
--- a/projects/libspectre/Dockerfile
+++ b/projects/libspectre/Dockerfile
@@ -16,7 +16,6 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 
-MAINTAINER randy408@protonmail.com
 
 RUN apt-get update && \
     apt-get install -y pkg-config make automake libtool wget
diff --git a/projects/libspng/Dockerfile b/projects/libspng/Dockerfile
index 95a02b3..f91f825 100644
--- a/projects/libspng/Dockerfile
+++ b/projects/libspng/Dockerfile
@@ -16,7 +16,6 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 
-MAINTAINER randy408@protonmail.com
 
 RUN apt-get update && \
     apt-get install -y wget tar cmake
@@ -24,5 +23,9 @@
 RUN git clone --depth 1 https://github.com/randy408/libspng.git
 RUN git clone --depth 1 https://github.com/google/fuzzer-test-suite
 
+RUN wget -O $WORK/zlib.tar.gz http://www.zlib.net/zlib-1.2.11.tar.gz
+RUN tar xzvf $WORK/zlib.tar.gz --directory $SRC/
+RUN mv $SRC/zlib-1.2.11 $SRC/zlib
+
 WORKDIR libspng
 COPY build.sh $SRC/
diff --git a/projects/libsrtp/Dockerfile b/projects/libsrtp/Dockerfile
index b2db89b..e3731dc 100644
--- a/projects/libsrtp/Dockerfile
+++ b/projects/libsrtp/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get update && apt-get install -y sudo autoconf build-essential libssl-dev pkg-config
 
 RUN git clone --depth 1 https://github.com/cisco/libsrtp
diff --git a/projects/libssh/Dockerfile b/projects/libssh/Dockerfile
index 58aae70..5e5c060 100644
--- a/projects/libssh/Dockerfile
+++ b/projects/libssh/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER alex.gaynor@gmail.com
 RUN apt-get update && apt-get install -y cmake zlib1g-dev libssl-dev
 
 RUN git clone --depth=1 https://git.libssh.org/projects/libssh.git
diff --git a/projects/libssh/project.yaml b/projects/libssh/project.yaml
index a5b3668..8389064 100644
--- a/projects/libssh/project.yaml
+++ b/projects/libssh/project.yaml
@@ -4,6 +4,7 @@
 auto_ccs:
  - "cryptomilk@gmail.com"
  - "jakuje@gmail.com"
+ - "anderson.sasaki@gmail.com"
 sanitizers:
   - address
   - memory
diff --git a/projects/libssh2/Dockerfile b/projects/libssh2/Dockerfile
index c80b7b4..f092df3 100644
--- a/projects/libssh2/Dockerfile
+++ b/projects/libssh2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER cmeister2@gmail.com
 
 # libssh2 at revision 9662c96 with fuzzer changes on top.
 RUN git clone --depth 1 -b cmeister2/ossfuzz_9662c96 https://github.com/cmeister2/libssh2.git /src/libssh2
diff --git a/projects/libtasn1/Dockerfile b/projects/libtasn1/Dockerfile
index f6342e1..e09b338 100644
--- a/projects/libtasn1/Dockerfile
+++ b/projects/libtasn1/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER rockdaboot@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool bison
 
 RUN git clone git://git.savannah.gnu.org/gnulib.git
diff --git a/projects/libteken/Dockerfile b/projects/libteken/Dockerfile
index 8eb252f..c8c6f0e 100644
--- a/projects/libteken/Dockerfile
+++ b/projects/libteken/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kcwu@csie.org
 RUN apt-get update && apt-get install -y pmake
 RUN svn co https://svn.freebsd.org/base/head/sys/teken libteken
 WORKDIR libteken
diff --git a/projects/libtheora/Dockerfile b/projects/libtheora/Dockerfile
index 7f9d344..4736474 100644
--- a/projects/libtheora/Dockerfile
+++ b/projects/libtheora/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://gitlab.xiph.org/xiph/ogg.git
 RUN git clone --depth 1 https://gitlab.xiph.org/xiph/theora.git libtheora
diff --git a/projects/libtiff/Dockerfile b/projects/libtiff/Dockerfile
index 9f7ecc2..b6c5fd8 100644
--- a/projects/libtiff/Dockerfile
+++ b/projects/libtiff/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER paul.l.kehrer@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool cmake nasm
 RUN git clone --depth 1 https://gitlab.com/libtiff/libtiff
 RUN git clone --depth 1 https://github.com/madler/zlib
diff --git a/projects/libtorrent/Dockerfile b/projects/libtorrent/Dockerfile
index d74ab14..566b8b4 100644
--- a/projects/libtorrent/Dockerfile
+++ b/projects/libtorrent/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER arvid@libtorrent.org
 RUN apt-get update && apt-get install -y wget libssl-dev
 
 RUN git clone --depth 1 --single-branch --branch boost-1.73.0 --recurse-submodules https://github.com/boostorg/boost.git
diff --git a/projects/libtpms/Dockerfile b/projects/libtpms/Dockerfile
index f1b1872..50496fe 100644
--- a/projects/libtpms/Dockerfile
+++ b/projects/libtpms/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER marcandre.lureau@redhat.com
 RUN \
         apt-get update && \
         apt-get install -y \
diff --git a/projects/libtsm/Dockerfile b/projects/libtsm/Dockerfile
index 7b162ea..f0889fd 100644
--- a/projects/libtsm/Dockerfile
+++ b/projects/libtsm/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kcwu@csie.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config
 
 RUN git clone --depth 1 git://people.freedesktop.org/~dvdhrm/libtsm
diff --git a/projects/libucl/Dockerfile b/projects/libucl/Dockerfile
index 41907ca..0babaa2 100644
--- a/projects/libucl/Dockerfile
+++ b/projects/libucl/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER adam@adalogics.com
 RUN apt-get update && apt-get install -y make cmake autoconf pkg-config libtool
 RUN git clone https://github.com/vstakhov/libucl
 
diff --git a/projects/libusb/Dockerfile b/projects/libusb/Dockerfile
index 71d03ab..ee3e490 100644
--- a/projects/libusb/Dockerfile
+++ b/projects/libusb/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER christopher.a.dickens@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool libudev-dev
 RUN git clone --depth 1 https://github.com/libusb/libusb libusb
 WORKDIR libusb
diff --git a/projects/libvips/Dockerfile b/projects/libvips/Dockerfile
index 2425ef7..cd19864 100644
--- a/projects/libvips/Dockerfile
+++ b/projects/libvips/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER oscar.mira@adevinta.com
 RUN apt-get update && apt-get install -y \
   curl \
   automake \
diff --git a/projects/libvpx/Dockerfile b/projects/libvpx/Dockerfile
index 262848d..a75dc13 100644
--- a/projects/libvpx/Dockerfile
+++ b/projects/libvpx/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jzern@google.com
 RUN apt-get update && apt-get install -y yasm wget gcc
 RUN git clone https://chromium.googlesource.com/webm/libvpx
 ADD https://storage.googleapis.com/downloads.webmproject.org/test_data/fuzzer/vpx_fuzzer_seed_corpus.zip $SRC/
diff --git a/projects/libwebp/Dockerfile b/projects/libwebp/Dockerfile
index 233ffbb..e3981e0 100644
--- a/projects/libwebp/Dockerfile
+++ b/projects/libwebp/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER yguyon@google.com
 RUN apt-get update && apt-get install -y autoconf make libtool zip
 RUN git clone https://chromium.googlesource.com/webm/libwebp
 RUN git clone https://chromium.googlesource.com/webm/libwebp-test-data
diff --git a/projects/libxls/Dockerfile b/projects/libxls/Dockerfile
index a6de95c..069fdd4 100644
--- a/projects/libxls/Dockerfile
+++ b/projects/libxls/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER emmiller@gmail.com
 RUN apt-get update && apt-get install -y make autoconf autoconf-archive automake gettext libtool
 
 RUN git clone --depth 1 https://github.com/libxls/libxls libxls
diff --git a/projects/libxml2/Dockerfile b/projects/libxml2/Dockerfile
index fc821c8..6d64df3 100644
--- a/projects/libxml2/Dockerfile
+++ b/projects/libxml2/Dockerfile
@@ -15,11 +15,11 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER ochang@chromium.org
-RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config
 
+RUN apt-get update && \
+    apt-get install -y --no-install-recommends \
+        make autoconf automake libtool pkg-config \
+        zlib1g-dev zlib1g-dev:i386 liblzma-dev liblzma-dev:i386
 RUN git clone --depth 1 https://gitlab.gnome.org/GNOME/libxml2.git
 WORKDIR libxml2
-
 COPY build.sh $SRC/
-COPY *.cc *.h *.options *.dict $SRC/
diff --git a/projects/libxml2/build.sh b/projects/libxml2/build.sh
index 418792b..f18cadd 100755
--- a/projects/libxml2/build.sh
+++ b/projects/libxml2/build.sh
@@ -16,19 +16,34 @@
 #
 ################################################################################
 
-./autogen.sh
-./configure --with-http=no
-make -j$(nproc) clean
-make -j$(nproc) all
+if [ "$SANITIZER" = undefined ]; then
+    export CFLAGS="$CFLAGS -fsanitize=unsigned-integer-overflow -fno-sanitize-recover=unsigned-integer-overflow"
+    export CXXFLAGS="$CXXFLAGS -fsanitize=unsigned-integer-overflow -fno-sanitize-recover=unsigned-integer-overflow"
+fi
 
-seed_corpus_temp_file="$OUT/xml_seed_corpus.zip"
-zip -r $seed_corpus_temp_file $SRC/libxml2/test
+./autogen.sh \
+    --disable-shared \
+    --without-debug \
+    --without-ftp \
+    --without-http \
+    --without-legacy \
+    --without-python
+make -j$(nproc) V=1
 
-for fuzzer in libxml2_xml_read_memory_fuzzer libxml2_xml_reader_for_file_fuzzer; do
-  $CXX $CXXFLAGS -std=c++11 -Iinclude/ \
-      $SRC/$fuzzer.cc -o $OUT/$fuzzer \
-      $LIB_FUZZING_ENGINE .libs/libxml2.a
+cd fuzz
+make V=1 fuzz.o
 
-  cp $SRC/*.dict $OUT/$fuzzer.dict
-  cp $seed_corpus_temp_file $OUT/${fuzzer}_seed_corpus.zip
+for fuzzer in html regexp schema uri xml; do
+    make V=1 $fuzzer.o
+    # Link with $CXX
+    $CXX $CXXFLAGS \
+        $fuzzer.o fuzz.o \
+        -o $OUT/$fuzzer \
+        $LIB_FUZZING_ENGINE \
+        ../.libs/libxml2.a -Wl,-Bstatic -lz -llzma -Wl,-Bdynamic
+
+    [ -e seed/$fuzzer ] || make V=1 seed/$fuzzer.stamp
+    zip -j $OUT/${fuzzer}_seed_corpus.zip seed/$fuzzer/*
 done
+
+cp *.dict *.options $OUT/
diff --git a/projects/libxml2/libxml2_xml_read_memory_fuzzer.cc b/projects/libxml2/libxml2_xml_read_memory_fuzzer.cc
deleted file mode 100644
index 6f1d549..0000000
--- a/projects/libxml2/libxml2_xml_read_memory_fuzzer.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-
-#include <functional>
-#include <limits>
-#include <string>
-
-#include "libxml/parser.h"
-#include "libxml/xmlsave.h"
-
-void ignore (void* ctx, const char* msg, ...) {
-  // Error handler to avoid spam of error messages from libxml parser.
-}
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  xmlSetGenericErrorFunc(NULL, &ignore);
-
-  // Test default empty options value and some random combination.
-  std::string data_string(reinterpret_cast<const char*>(data), size);
-  const std::size_t data_hash = std::hash<std::string>()(data_string);
-  const int max_option_value = std::numeric_limits<int>::max();
-  int random_option_value = data_hash % max_option_value;
-
-  // Disable XML_PARSE_HUGE to avoid stack overflow.
-  random_option_value &= ~XML_PARSE_HUGE;
-  const int options[] = {0, random_option_value};
-
-  for (const auto option_value : options) {
-    // Intentionally pass raw data as the API does not require trailing \0.
-    if (auto doc = xmlReadMemory(reinterpret_cast<const char*>(data), size,
-                                 "noname.xml", NULL, option_value)) {
-      auto buf = xmlBufferCreate();
-      assert(buf);
-      auto ctxt = xmlSaveToBuffer(buf, NULL, 0);
-      xmlSaveDoc(ctxt, doc);
-      xmlSaveClose(ctxt);
-      xmlFreeDoc(doc);
-      xmlBufferFree(buf);
-    }
-  }
-
-  return 0;
-}
diff --git a/projects/libxml2/libxml2_xml_reader_for_file_fuzzer.cc b/projects/libxml2/libxml2_xml_reader_for_file_fuzzer.cc
deleted file mode 100644
index 4a71aa5..0000000
--- a/projects/libxml2/libxml2_xml_reader_for_file_fuzzer.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#include <fuzzer/FuzzedDataProvider.h>
-
-#include <cstddef>
-#include <cstdint>
-#include <string>
-
-#include "fuzzer_temp_file.h"
-
-#include "libxml/xmlreader.h"
-
-void ignore (void* ctx, const char* msg, ...) {
-  // Error handler to avoid spam of error messages from libxml parser.
-}
-
-extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
-  xmlSetGenericErrorFunc(NULL, &ignore);
-
-  FuzzedDataProvider provider(data, size);
-  const int options = provider.ConsumeIntegral<int>();
-
-  // libxml does not expect more than 100 characters, let's go beyond that.
-  const std::string encoding = provider.ConsumeRandomLengthString(128);
-  auto file_contents = provider.ConsumeRemainingBytes<uint8_t>();
-
-  FuzzerTemporaryFile file(file_contents.data(), file_contents.size());
-
-  xmlTextReaderPtr xmlReader =
-      xmlReaderForFile(file.filename(), encoding.c_str(), options);
-
-  constexpr int kReadSuccessful = 1;
-  while (xmlTextReaderRead(xmlReader) == kReadSuccessful) {
-    xmlTextReaderNodeType(xmlReader);
-    xmlTextReaderConstValue(xmlReader);
-  }
-
-  xmlFreeTextReader(xmlReader);
-  return EXIT_SUCCESS;
-}
diff --git a/projects/libxml2/project.yaml b/projects/libxml2/project.yaml
index 38a5adb..d6a6c70 100644
--- a/projects/libxml2/project.yaml
+++ b/projects/libxml2/project.yaml
@@ -5,13 +5,11 @@
   - "akilsrin@apple.com"
   - "ddkilzer@apple.com"
   - "benl@google.com"
+  - "simon.lewis@apple.com"
 sanitizers:
   - address
   - memory
   - undefined
-labels:
-  libxml2_xml_reader_for_file_fuzzer:
-    - sundew
 architectures:
   - x86_64
   - i386
diff --git a/projects/libxml2/xml.dict b/projects/libxml2/xml.dict
deleted file mode 100644
index 4ffa6c8..0000000
--- a/projects/libxml2/xml.dict
+++ /dev/null
@@ -1,87 +0,0 @@
-# Copyright 2016 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-################################################################################
-#
-# AFL dictionary for XML
-# ----------------------
-#
-# Several basic syntax elements and attributes, modeled on libxml2.
-#
-# Created by Michal Zalewski <lcamtuf@google.com>
-#
-
-attr_encoding=" encoding=\"1\""
-attr_generic=" a=\"1\""
-attr_href=" href=\"1\""
-attr_standalone=" standalone=\"no\""
-attr_version=" version=\"1\""
-attr_xml_base=" xml:base=\"1\""
-attr_xml_id=" xml:id=\"1\""
-attr_xml_lang=" xml:lang=\"1\""
-attr_xml_space=" xml:space=\"1\""
-attr_xmlns=" xmlns=\"1\""
-
-entity_builtin="&lt;"
-entity_decimal="&#1;"
-entity_external="&a;"
-entity_hex="&#x1;"
-
-string_any="ANY"
-string_brackets="[]"
-string_cdata="CDATA"
-string_col_fallback=":fallback"
-string_col_generic=":a"
-string_col_include=":include"
-string_dashes="--"
-string_empty="EMPTY"
-string_empty_dblquotes="\"\""
-string_empty_quotes="''"
-string_entities="ENTITIES"
-string_entity="ENTITY"
-string_fixed="#FIXED"
-string_id="ID"
-string_idref="IDREF"
-string_idrefs="IDREFS"
-string_implied="#IMPLIED"
-string_nmtoken="NMTOKEN"
-string_nmtokens="NMTOKENS"
-string_notation="NOTATION"
-string_parentheses="()"
-string_pcdata="#PCDATA"
-string_percent="%a"
-string_public="PUBLIC"
-string_required="#REQUIRED"
-string_schema=":schema"
-string_system="SYSTEM"
-string_ucs4="UCS-4"
-string_utf16="UTF-16"
-string_utf8="UTF-8"
-string_xmlns="xmlns:"
-
-tag_attlist="<!ATTLIST"
-tag_cdata="<![CDATA["
-tag_close="</a>"
-tag_doctype="<!DOCTYPE"
-tag_element="<!ELEMENT"
-tag_entity="<!ENTITY"
-tag_ignore="<![IGNORE["
-tag_include="<![INCLUDE["
-tag_notation="<!NOTATION"
-tag_open="<a>"
-tag_open_close="<a />"
-tag_open_exclamation="<!"
-tag_open_q="<?"
-tag_sq2_close="]]>"
-tag_xml_q="<?xml?>"
diff --git a/projects/libxslt/Dockerfile b/projects/libxslt/Dockerfile
index b020aeb..2592e6a 100644
--- a/projects/libxslt/Dockerfile
+++ b/projects/libxslt/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER wellnhofer@aevum.de
 
 # Note that we don't use the system libxml2 but a custom instrumented build.
 # libgcrypt is required for the crypto extensions of libexslt.
diff --git a/projects/libyal/Dockerfile b/projects/libyal/Dockerfile
new file mode 100644
index 0000000..e619b5f
--- /dev/null
+++ b/projects/libyal/Dockerfile
@@ -0,0 +1,49 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+
+RUN apt-get update && apt-get install -y make autoconf automake autopoint libtool pkg-config flex byacc
+
+RUN git clone --depth 1 https://github.com/libyal/libfplist.git libfplist
+RUN git clone --depth 1 https://github.com/libyal/libftxf.git libftxf
+RUN git clone --depth 1 https://github.com/libyal/libfusn.git libfusn
+RUN git clone --depth 1 https://github.com/libyal/libfwnt.git libfwnt
+RUN git clone --depth 1 https://github.com/libyal/libfwsi.git libfwsi
+
+RUN git clone --depth 1 https://github.com/libyal/libesedb.git libesedb
+RUN git clone --depth 1 https://github.com/libyal/libevt.git libevt
+RUN git clone --depth 1 https://github.com/libyal/libevtx.git libevtx
+RUN git clone --depth 1 https://github.com/libyal/libexe.git libexe
+RUN git clone --depth 1 https://github.com/libyal/liblnk.git liblnk
+RUN git clone --depth 1 https://github.com/libyal/libmsiecf.git libmsiecf
+RUN git clone --depth 1 https://github.com/libyal/libolecf.git libolecf
+RUN git clone --depth 1 https://github.com/libyal/libregf.git libregf
+RUN git clone --depth 1 https://github.com/libyal/libscca.git libscca
+
+RUN git clone --depth 1 https://github.com/libyal/libfsapfs.git libfsapfs
+RUN git clone --depth 1 https://github.com/libyal/libfsext.git libfsext
+RUN git clone --depth 1 https://github.com/libyal/libfshfs.git libfshfs
+RUN git clone --depth 1 https://github.com/libyal/libfsntfs.git libfsntfs
+
+RUN git clone --depth 1 https://github.com/libyal/libbde.git libbde
+
+RUN git clone --depth 1 https://github.com/libyal/libqcow.git libqcow
+RUN git clone --depth 1 https://github.com/libyal/libvhdi.git libvhdi
+RUN git clone --depth 1 https://github.com/libyal/libvmdk.git libvmdk
+
+WORKDIR libyal
+COPY build.sh $SRC/
diff --git a/projects/libyal/build.sh b/projects/libyal/build.sh
new file mode 100755
index 0000000..c61ee51
--- /dev/null
+++ b/projects/libyal/build.sh
@@ -0,0 +1,67 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+for PROJECT in ${SRC}/*;
+do
+  PROJECT=$(basename ${PROJECT})
+
+  # A libyal project should have an ossfuzz directory and a synclibs.sh script.
+  if ! test -d ${SRC}/${PROJECT}/ossfuzz || ! test -x ${SRC}/${PROJECT}/synclibs.sh;
+  then
+    continue
+  fi
+  cd ${SRC}/${PROJECT}
+
+  # Prepare the project source for build.
+  ./synclibs.sh
+  ./autogen.sh
+  ./configure --enable-shared=no
+
+  # Build the project and fuzzer binaries.
+  make -j$(nproc) LIB_FUZZING_ENGINE=${LIB_FUZZING_ENGINE}
+
+  # Download the test data if supported.
+  if test -x ./synctestdata.sh;
+  then
+    ./synctestdata.sh
+  fi
+
+  # Copy the fuzzer binaries and test data to the output directory.
+  for FUZZ_TARGET in $(cd ossfuzz && find . -executable -type f);
+  do
+    FUZZ_TARGET=$(basename ${FUZZ_TARGET})
+
+    # Prefix the fuzzer binaries with the project name.
+    cp ossfuzz/${FUZZ_TARGET} ${OUT}/${PROJECT}_${FUZZ_TARGET}
+
+    # Download the test data if supported.
+    LIBYAL_TYPE_NAME=${FUZZ_TARGET/_fuzzer/};
+
+    if test -f tests/data/${LIBYAL_TYPE_NAME/}.1;
+    then
+      (cd tests/data && zip ${OUT}/${PROJECT}_${FUZZ_TARGET}_seed_corpus.zip ${LIBYAL_TYPE_NAME}.*)
+
+    elif test -d tests/input/public;
+    then
+      (cd tests/input/public && zip ${OUT}/${PROJECT}_${FUZZ_TARGET}_seed_corpus.zip *)
+
+    else
+      echo "Missing test data for seed corpus."
+      exit 1
+    fi
+  done
+done
diff --git a/projects/libyal/project.yaml b/projects/libyal/project.yaml
new file mode 100644
index 0000000..b1a3102
--- /dev/null
+++ b/projects/libyal/project.yaml
@@ -0,0 +1,10 @@
+homepage: "https://github.com/libyal"
+language: c
+primary_contact: "joachim.metz@gmail.com"
+sanitizers:
+- address
+- memory
+- undefined
+architectures:
+- x86_64
+- i386
diff --git a/projects/libyaml/Dockerfile b/projects/libyaml/Dockerfile
index dd99a1c..d52249e 100644
--- a/projects/libyaml/Dockerfile
+++ b/projects/libyaml/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER alex.gaynor@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 
 RUN git clone --depth=1 https://github.com/yaml/libyaml
diff --git a/projects/libyuv/project.yaml b/projects/libyuv/project.yaml
new file mode 100644
index 0000000..8a47b6f
--- /dev/null
+++ b/projects/libyuv/project.yaml
@@ -0,0 +1,13 @@
+homepage: "https://chromium.googlesource.com/libyuv/libyuv/"
+language: c++
+primary_contact: "mikhal@webrtc.org"
+auto_ccs:
+    - "fbarchard@google.com"
+    - "frkoenig@google.com"
+fuzzing_engines:
+    - libfuzzer
+    - afl
+sanitizers:
+    - address
+    - memory
+    - undefined
diff --git a/projects/libzip/Dockerfile b/projects/libzip/Dockerfile
index fb19311..a2c0b42 100644
--- a/projects/libzip/Dockerfile
+++ b/projects/libzip/Dockerfile
@@ -17,7 +17,6 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 
-MAINTAINER randy408@protonmail.com
 
 RUN apt-get update && apt-get install -y cmake pkg-config zlib1g-dev liblzma-dev
 
diff --git a/projects/libzmq/Dockerfile b/projects/libzmq/Dockerfile
index 40769f2..dbefc17 100644
--- a/projects/libzmq/Dockerfile
+++ b/projects/libzmq/Dockerfile
@@ -15,9 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER bluca@debian.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool gettext pkg-config build-essential
 RUN git clone --depth 1 https://github.com/zeromq/libzmq.git
+RUN git clone --depth 1 https://github.com/zeromq/libzmq-fuzz-corpora.git
 RUN git clone --depth 1 -b stable https://github.com/jedisct1/libsodium.git
 WORKDIR libzmq
 COPY build.sh $SRC/
diff --git a/projects/libzmq/build.sh b/projects/libzmq/build.sh
index 389b7f6..519696f 100755
--- a/projects/libzmq/build.sh
+++ b/projects/libzmq/build.sh
@@ -16,17 +16,4 @@
 #
 ################################################################################
 
-# build project and dependencies
-cd "${SRC}/libsodium"
-DO_NOT_UPDATE_CONFIG_SCRIPTS=1 ./autogen.sh
-./configure --disable-shared --prefix=/install_prefix --disable-asm
-make -j$(nproc) V=1 install DESTDIR=/tmp/zmq_install_dir
-
-cd "${SRC}/libzmq"
-./autogen.sh
-export LDFLAGS+=" $(PKG_CONFIG_PATH=/tmp/zmq_install_dir/install_prefix/lib/pkgconfig pkg-config --static --libs --define-prefix libsodium)"
-export CXXFLAGS+=" $(PKG_CONFIG_PATH=/tmp/zmq_install_dir/install_prefix/lib/pkgconfig pkg-config --static --cflags --define-prefix libsodium)"
-./configure --disable-shared --prefix=/install_prefix --disable-perf --disable-curve-keygen PKG_CONFIG_PATH=/tmp/zmq_install_dir/install_prefix/lib/pkgconfig --with-libsodium=yes --with-fuzzing-installdir=fuzzers --with-fuzzing-engine=$LIB_FUZZING_ENGINE
-make -j$(nproc) V=1 install DESTDIR=/tmp/zmq_install_dir
-
-cp /tmp/zmq_install_dir/install_prefix/fuzzers/* "${OUT}"
+${SRC}/libzmq/builds/fuzz/ci_build.sh
diff --git a/projects/llvm/Dockerfile b/projects/llvm/Dockerfile
index f6cc0c8..1fd4c55 100644
--- a/projects/llvm/Dockerfile
+++ b/projects/llvm/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kcc@google.com
 RUN apt-get update -y
 RUN apt-get install -y autoconf automake libtool curl make g++ unzip wget git \
     binutils liblzma-dev libz-dev python-all cmake ninja-build subversion \
diff --git a/projects/llvm_libcxxabi/Dockerfile b/projects/llvm_libcxxabi/Dockerfile
index 15ca3e1..b66bd78 100644
--- a/projects/llvm_libcxxabi/Dockerfile
+++ b/projects/llvm_libcxxabi/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kcc@google.com
 RUN apt-get update && apt-get install -y subversion
 
 RUN git clone --depth 1 https://github.com/llvm/llvm-project.git
diff --git a/projects/lodepng/Dockerfile b/projects/lodepng/Dockerfile
index f5c9c27..f295e56 100644
--- a/projects/lodepng/Dockerfile
+++ b/projects/lodepng/Dockerfile
@@ -15,8 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER lvandeve@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://github.com/lvandeve/lodepng.git lodepng     # or use other version control
 WORKDIR lodepng
+ADD http://oss-fuzz-corpus.storage.googleapis.com/lodepng/lodepng_fuzzer_seed_corpus.zip $SRC/
+ADD https://raw.githubusercontent.com/google/AFL/master/dictionaries/png.dict $SRC/lodepng_fuzzer.dict
 COPY build.sh $SRC/
diff --git a/projects/lodepng/build.sh b/projects/lodepng/build.sh
index be59342..491b0fc 100755
--- a/projects/lodepng/build.sh
+++ b/projects/lodepng/build.sh
@@ -19,3 +19,9 @@
 # allocate more than 100MB memory, which prevents OOM with the 2GB limit.
 $CXX $CXXFLAGS -DLODEPNG_MAX_ALLOC=100000000 lodepng.cpp lodepng_fuzzer.cpp -o\
  $OUT/lodepng_fuzzer $LIB_FUZZING_ENGINE
+
+# copy seed corpus
+cp $SRC/lodepng_fuzzer_seed_corpus.zip $OUT/
+
+# copy dictionary file
+cp $SRC/*.dict $OUT/
diff --git a/projects/lodepng/project.yaml b/projects/lodepng/project.yaml
index ef5395a..80f07c3 100644
--- a/projects/lodepng/project.yaml
+++ b/projects/lodepng/project.yaml
@@ -1,6 +1,8 @@
 homepage: "https://github.com/lvandeve/lodepng"
 language: c++
 primary_contact: "lvandeve@gmail.com"
+auto_ccs:
+  - "singharshdeep@google.com"
 sanitizers:
 - address
 - undefined
diff --git a/projects/lwan/Dockerfile b/projects/lwan/Dockerfile
index a342314..6499373 100644
--- a/projects/lwan/Dockerfile
+++ b/projects/lwan/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER leandro.pereira@gmail.com
 RUN apt-get update
 RUN apt-get install -y build-essential cmake git ninja-build zlib1g-dev
 
diff --git a/projects/lz4/Dockerfile b/projects/lz4/Dockerfile
index 93da98d..2f9f429 100644
--- a/projects/lz4/Dockerfile
+++ b/projects/lz4/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER cmeister2@gmail.com
 
 RUN git clone --depth 1 https://github.com/lz4/lz4.git /src/lz4
 
diff --git a/projects/lzma/Dockerfile b/projects/lzma/Dockerfile
index 36e9306..38e5dfe 100644
--- a/projects/lzma/Dockerfile
+++ b/projects/lzma/Dockerfile
@@ -16,7 +16,6 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 
-MAINTAINER mail@joachim-bauch.de
 
 RUN apt-get update && apt-get install -y \
 	autoconf \
diff --git a/projects/lzo/Dockerfile b/projects/lzo/Dockerfile
index e309f62..32127b1 100644
--- a/projects/lzo/Dockerfile
+++ b/projects/lzo/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER info@oberhumer.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool wget
 RUN wget -O lzo.tar.gz \
     http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz
diff --git a/projects/matio/Dockerfile b/projects/matio/Dockerfile
index 42c0dd4..b2aef99 100644
--- a/projects/matio/Dockerfile
+++ b/projects/matio/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER t-beu@users.sourceforge.net
 RUN apt-get update && apt-get install -y make autoconf automake libhdf5-dev libtool zlib1g-dev
 ENV HDF5_DIR /usr/lib/x86_64-linux-gnu/hdf5/serial
 RUN git clone --depth 1 git://git.code.sf.net/p/matio/matio matio
diff --git a/projects/mbedtls/Dockerfile b/projects/mbedtls/Dockerfile
index 9c49e60..3a8908f 100644
--- a/projects/mbedtls/Dockerfile
+++ b/projects/mbedtls/Dockerfile
@@ -16,7 +16,6 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 #TODO change
-MAINTAINER support-mbedtls@arm.com
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone --recursive --depth 1 https://github.com/ARMmbed/mbedtls.git mbedtls
 RUN git clone --depth 1 https://github.com/google/boringssl.git boringssl
diff --git a/projects/mbedtls/project.yaml b/projects/mbedtls/project.yaml
index 045af39..f7f408d 100644
--- a/projects/mbedtls/project.yaml
+++ b/projects/mbedtls/project.yaml
@@ -1,5 +1,5 @@
-homepage: "https://tls.mbed.org"
+homepage: "https://developer.trustedfirmware.org/w/mbed-tls/"
 language: c++
-primary_contact: "support-mbedtls@arm.com"
+primary_contact: "mbed-tls-security@lists.trustedfirmware.org"
 auto_ccs :
   - "p.antoine@catenacyber.fr"
diff --git a/projects/mercurial/Dockerfile b/projects/mercurial/Dockerfile
index 09b5220..334d95d 100644
--- a/projects/mercurial/Dockerfile
+++ b/projects/mercurial/Dockerfile
@@ -15,10 +15,28 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER security@mercurial-scm.org
-RUN apt-get update && apt-get install -y make autoconf automake libtool \
-  python-dev mercurial curl
-RUN cd $SRC && curl https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz | tar xzf -
+RUN apt-get update && apt-get install -y \
+  autoconf \
+  automake \
+  build-essential \
+  curl \
+  libbz2-dev \
+  libncurses5-dev \
+  libncursesw5-dev \
+  libreadline-dev \
+  libsqlite3-dev \
+  libssl-dev \
+  libtool \
+  llvm \
+  lzma-dev \
+  make \
+  python3-dev \
+  tk-dev \
+  wget \
+  xz-utils \
+  zlib1g-dev \
+  mercurial
+RUN cd $SRC && curl https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz | tar xzf -
 RUN hg clone https://www.mercurial-scm.org/repo/hg mercurial
 WORKDIR mercurial
 COPY build.sh $SRC/
diff --git a/projects/mercurial/build.sh b/projects/mercurial/build.sh
index 30ee281..abb6ba6 100755
--- a/projects/mercurial/build.sh
+++ b/projects/mercurial/build.sh
@@ -15,49 +15,43 @@
 #
 ################################################################################
 
-pushd $SRC/Python-2.7.15/
-patch -p1 <<'EOF'
-Index: v2_7_unstable/Python/pymath.c
-===================================================================
---- v2_7_unstable.orig/Python/pymath.c
-+++ v2_7_unstable/Python/pymath.c
-@@ -18,6 +18,7 @@ double _Py_force_double(double x)
- /* inline assembly for getting and setting the 387 FPU control word on
-    gcc/x86 */
+# Ignore memory leaks from python scripts invoked in the build
+export ASAN_OPTIONS="detect_leaks=0"
+export MSAN_OPTIONS="halt_on_error=0:exitcode=0:report_umrs=0"
 
-+__attribute__((no_sanitize_memory))
- unsigned short _Py_get_387controlword(void) {
-     unsigned short cw;
-     __asm__ __volatile__ ("fnstcw %0" : "=m" (cw));
-Index: v2_7_unstable/Modules/_ctypes/callproc.c
-===================================================================
---- v2_7_unstable.orig/Modules/_ctypes/callproc.c
-+++ v2_7_unstable/Modules/_ctypes/callproc.c
-@@ -1166,6 +1166,10 @@ PyObject *_ctypes_callproc(PPROC pProc,
+# Remove -pthread from CFLAGS, this trips up ./configure
+# which thinks pthreads are available without any CLI flags
+CFLAGS=${CFLAGS//"-pthread"/}
 
-     rtype = _ctypes_get_ffi_type(restype);
-     resbuf = alloca(max(rtype->size, sizeof(ffi_arg)));
-+    /* ffi_call actually initializes resbuf, but from asm, which
-+     * MemorySanitizer can't detect. Avoid false positives from MSan. */
-+    if (resbuf != NULL)
-+        memset(resbuf, 0, max(rtype->size, sizeof(ffi_arg)));
+FLAGS=()
+case $SANITIZER in
+  address)
+    FLAGS+=("--with-address-sanitizer")
+    ;;
+  memory)
+    FLAGS+=("--with-memory-sanitizer")
+    # installing ensurepip takes a while with MSAN instrumentation, so
+    # we disable it here
+    FLAGS+=("--without-ensurepip")
+    ;;
+  undefined)
+    FLAGS+=("--with-undefined-behavior-sanitizer")
+    ;;
+esac
 
-     avalues = (void **)alloca(sizeof(void *) * argcount);
-     atypes = (ffi_type **)alloca(sizeof(ffi_type *) * argcount);
-EOF
-
+pushd $SRC/Python-3.8.3/
 if [ -e $OUT/sanpy/cflags -a "$(cat $OUT/sanpy/cflags)" = "${CFLAGS}" ] ; then
     echo 'Python cflags unchanged, no need to rebuild'
 else
     rm -rf $OUT/sanpy
-    ASAN_OPTIONS=detect_leaks=0 ./configure --without-pymalloc \
+    ./configure "${FLAGS[@]:-}" \
                 --prefix=$OUT/sanpy CFLAGS="${CFLAGS}" LINKCC="${CXX}" \
                 LDFLAGS="${CXXFLAGS}"
     grep -v HAVE_GETC_UNLOCKED < pyconfig.h > tmp && mv tmp pyconfig.h
-    ASAN_OPTIONS=detect_leaks=0 make && make install
+    make && make install
     echo "${CFLAGS}" > $OUT/sanpy/cflags
 fi
 popd
 
 cd contrib/fuzz
-make clean oss-fuzz
+make clean oss-fuzz PYTHON_CONFIG=$OUT/sanpy/bin/python3.8-config PYTHON_CONFIG_FLAGS="--ldflags --embed"
diff --git a/projects/mercurial/project.yaml b/projects/mercurial/project.yaml
index bd68d69..2908b04 100644
--- a/projects/mercurial/project.yaml
+++ b/projects/mercurial/project.yaml
@@ -10,3 +10,4 @@
   - address
   - undefined
   - memory
+coverage_extra_args: -ignore-filename-regex=.*/sanpy/.*
diff --git a/projects/minify/Dockerfile b/projects/minify/Dockerfile
index 6b6cbe9..025632d 100644
--- a/projects/minify/Dockerfile
+++ b/projects/minify/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER adam@adalogics.com
 RUN go get -u github.com/tdewolff/minify
 COPY build.sh $SRC/
 WORKDIR $SRC/
diff --git a/projects/miniz/Dockerfile b/projects/miniz/Dockerfile
new file mode 100644
index 0000000..5658ff3
--- /dev/null
+++ b/projects/miniz/Dockerfile
@@ -0,0 +1,25 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+
+RUN apt-get update && \
+    apt-get install -y cmake
+
+RUN git clone --depth 1 https://github.com/richgel999/miniz.git
+
+WORKDIR miniz
+COPY build.sh $SRC/
diff --git a/projects/miniz/build.sh b/projects/miniz/build.sh
new file mode 100755
index 0000000..9e7a489
--- /dev/null
+++ b/projects/miniz/build.sh
@@ -0,0 +1,19 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+# Run the OSS-Fuzz script in the project
+$SRC/miniz/tests/ossfuzz.sh
diff --git a/projects/minizip/Dockerfile b/projects/minizip/Dockerfile
index c9eb382..3d14fba 100644
--- a/projects/minizip/Dockerfile
+++ b/projects/minizip/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER nathan.moinvaziri@gmail.com
 RUN apt-get update && apt-get install -y make cmake pkg-config
 
 RUN git clone -b dev https://github.com/nmoinvaz/minizip
diff --git a/projects/monero/Dockerfile b/projects/monero/Dockerfile
new file mode 100644
index 0000000..fe2dbbe
--- /dev/null
+++ b/projects/monero/Dockerfile
@@ -0,0 +1,121 @@
+# Copyright 2020 The Monero Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+# Multistage docker build, requires docker 17.05
+
+# builder stage
+FROM gcr.io/oss-fuzz-base/base-builder
+
+RUN set -ex && \
+    apt-get update && \
+    apt-get --no-install-recommends --yes install \
+        ca-certificates \
+        cmake \
+        g++ \
+        make \
+        pkg-config \
+        graphviz \
+        doxygen \
+        git \
+        curl \
+        libtool-bin \
+        autoconf \
+        automake \
+        bzip2 \
+        xsltproc \
+        gperf \
+        unzip \
+        cmake \
+        ccache \
+        libsodium-dev \
+        libreadline-dev \
+        libudev-dev \
+        libprotobuf-dev \
+        protobuf-compiler
+
+WORKDIR monero
+
+ENV CFLAGS="${CFLAGS} -fPIC -pthread"
+ENV CXXFLAGS="${CXXFLAGS} -fPIC -pthread"
+
+## Boost
+ARG BOOST_VERSION=1_70_0
+ARG BOOST_VERSION_DOT=1.70.0
+ARG BOOST_HASH=430ae8354789de4fd19ee52f3b1f739e1fba576f0aded0897c3c2bc00fb38778
+RUN set -ex \
+    && curl -s -L -o  boost_${BOOST_VERSION}.tar.bz2 https://downloads.getmonero.org/libs/boost_${BOOST_VERSION}.tar.bz2 \
+    && echo "${BOOST_HASH}  boost_${BOOST_VERSION}.tar.bz2" | sha256sum -c \
+    && tar -xjf boost_${BOOST_VERSION}.tar.bz2 \
+    && cd boost_${BOOST_VERSION} \
+    && sed -i -e 's/use(* m_instance)/if (m_instance) use(* m_instance)/' boost/serialization/singleton.hpp \
+    && ./bootstrap.sh --with-toolset=clang \
+    && ./b2 --build-type=minimal link=static runtime-link=static --with-chrono --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread --with-locale threading=multi threadapi=pthread cflags="$CFLAGS" cxxflags="$CXXFLAGS" stage
+ENV BOOST_ROOT /usr/local/boost_${BOOST_VERSION}
+
+# OpenSSL
+ARG OPENSSL_VERSION=1.1.1g
+ARG OPENSSL_HASH=ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46
+RUN set -ex \
+    && curl -s -O https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \
+    && echo "${OPENSSL_HASH}  openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c \
+    && tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \
+    && cd openssl-${OPENSSL_VERSION} \
+    && ./Configure linux-x86_64 no-shared --static "$CFLAGS" \
+    && make build_generated \
+    && make libcrypto.a \
+    && make install
+ENV OPENSSL_ROOT_DIR=/usr/local/openssl-${OPENSSL_VERSION}
+
+# ZMQ
+ARG ZMQ_VERSION=v4.3.2
+ARG ZMQ_HASH=a84ffa12b2eb3569ced199660bac5ad128bff1f0
+RUN set -ex \
+    && git clone --depth=1 https://github.com/zeromq/libzmq.git -b ${ZMQ_VERSION} \
+    && cd libzmq \
+    && test `git rev-parse HEAD` = ${ZMQ_HASH} || exit 1 \
+    && sed -i -e 's/::~generic_mtrie_t /::~generic_mtrie_t<T> /' src/generic_mtrie_impl.hpp \
+    && ./autogen.sh \
+    && ./configure --enable-static --disable-shared --with-libsodium \
+    && make \
+    && make install \
+    && ldconfig
+
+# Libusb
+ARG USB_VERSION=v1.0.22
+ARG USB_HASH=0034b2afdcdb1614e78edaa2a9e22d5936aeae5d
+RUN set -ex \
+    && git clone --depth=1 https://github.com/libusb/libusb.git -b ${USB_VERSION} \
+    && cd libusb \
+    && test `git rev-parse HEAD` = ${USB_HASH} || exit 1 \
+    && ./autogen.sh \
+    && ./configure --disable-shared \
+    && make \
+    && make install
+
+# Hidapi
+ARG HIDAPI_VERSION=hidapi-0.8.0-rc1
+ARG HIDAPI_HASH=40cf516139b5b61e30d9403a48db23d8f915f52c
+RUN set -ex \
+    && git clone --depth=1 https://github.com/signal11/hidapi -b ${HIDAPI_VERSION} \
+    && cd hidapi \
+    && test `git rev-parse HEAD` = ${HIDAPI_HASH} || exit 1 \
+    && ./bootstrap \
+    && ./configure --enable-static --disable-shared \
+    && make \
+    && make install
+
+RUN git clone --depth 1 https://github.com/monero-project/monero.git monero
+COPY build.sh $SRC/
diff --git a/projects/monero/build.sh b/projects/monero/build.sh
new file mode 100755
index 0000000..ff3001b
--- /dev/null
+++ b/projects/monero/build.sh
@@ -0,0 +1,70 @@
+#!/bin/bash -eu
+# Copyright 2020 The Monero Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+export BOOST_ROOT=/src/monero/boost_1_70_0
+export OPENSSL_ROOT_DIR=/src/monero/openssl-1.1.1g
+
+cd monero
+sed -i -e 's/include(FindCcache)/# include(FindCcache)/' CMakeLists.txt
+git submodule init
+git submodule update
+mkdir -p build
+cd build
+export CXXFLAGS="$CXXFLAGS -fPIC"
+cmake -D OSSFUZZ=ON -D STATIC=ON -D BUILD_TESTS=ON -D USE_LTO=OFF -D ARCH="default" ..
+
+TESTS="\
+  base58_fuzz_tests \
+  block_fuzz_tests \
+  transaction_fuzz_tests \
+  load-from-binary_fuzz_tests \
+  load-from-json_fuzz_tests \
+  parse-url_fuzz_tests \
+  http-client_fuzz_tests \
+  levin_fuzz_tests \
+  bulletproof_fuzz_tests \
+  tx-extra_fuzz_tests \
+"
+
+# only libfuzzer can run the slow to start ones
+if test "x$FUZZING_ENGINE" == 'xlibfuzzer'
+then
+  TESTS="$TESTS \
+    signature_fuzz_tests \
+    cold-outputs_fuzz_tests \
+    cold-transaction_fuzz_tests \
+  "
+fi
+
+make -C tests/fuzz $TESTS
+
+cd /src/monero/monero/build/tests/fuzz
+for fuzzer in *_fuzz_tests
+do
+  cp "$fuzzer" "$OUT"
+  base=$(echo $fuzzer | sed -e s/_fuzz_tests//)
+  cd "/src/monero/monero/tests/data/fuzz/$base"
+  rm -f "${OUT}/${fuzzer}_seed_corpus.zip"
+  for f in *
+  do
+    h=$(sha1sum "$f" | awk '{print $1}')
+    cp "$f" "$h"
+    zip "${OUT}/${fuzzer}_seed_corpus.zip" "$h"
+    rm -f "$h"
+  done
+  cd -
+done
diff --git a/projects/monero/project.yaml b/projects/monero/project.yaml
new file mode 100644
index 0000000..5254d54
--- /dev/null
+++ b/projects/monero/project.yaml
@@ -0,0 +1,15 @@
+homepage: "https://getmonero.org/"
+language: c++
+primary_contact: "binaryfate01@gmail.com"
+auto_ccs:
+  - luigi1111w@gmail.com
+  - ric@ts.org
+  - moneromooo@protonmail.com
+sanitizers:
+  - address
+fuzzing_engines:
+  - libfuzzer
+  - afl
+  - honggfuzz
+architectures:
+  - x86_64
diff --git a/projects/mp4parse-rust/Dockerfile b/projects/mp4parse-rust/Dockerfile
index b125761..3732a37 100644
--- a/projects/mp4parse-rust/Dockerfile
+++ b/projects/mp4parse-rust/Dockerfile
@@ -15,10 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mgregan@mozilla.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool curl cmake python llvm-dev libclang-dev clang
 
 RUN git clone --depth 1 https://github.com/mozilla/mp4parse-rust mp4parse-rust
 WORKDIR mp4parse-rust
 
-COPY build.sh $SRC/
+COPY build.sh default.options $SRC/
diff --git a/projects/mp4parse-rust/build.sh b/projects/mp4parse-rust/build.sh
index 860a7ac..d07f29a 100755
--- a/projects/mp4parse-rust/build.sh
+++ b/projects/mp4parse-rust/build.sh
@@ -29,5 +29,6 @@
     FUZZ_TARGET_NAME=$(basename ${f%.*})
     cp $FUZZ_TARGET_OUTPUT_DIR/$FUZZ_TARGET_NAME $OUT/
     cp $PROJECT_DIR/mp4parse_capi/fuzz/mp4.dict $OUT/$FUZZ_TARGET_NAME.dict
+    cp $SRC/default.options $OUT/$FUZZ_TARGET_NAME.options
     zip -jr $OUT/${FUZZ_TARGET_NAME}_seed_corpus.zip $PROJECT_DIR/corpus/
 done
diff --git a/projects/mp4parse-rust/default.options b/projects/mp4parse-rust/default.options
new file mode 100644
index 0000000..84c33f6
--- /dev/null
+++ b/projects/mp4parse-rust/default.options
@@ -0,0 +1,2 @@
+[asan]
+max_allocation_size_mb=512
diff --git a/projects/mp4parse-rust/project.yaml b/projects/mp4parse-rust/project.yaml
index 8948c4e..a28ecd2 100644
--- a/projects/mp4parse-rust/project.yaml
+++ b/projects/mp4parse-rust/project.yaml
@@ -6,4 +6,5 @@
   - libfuzzer
 language: rust
 vendor_ccs:
+- "jbauman@mozilla.com"
 - "twsmith@mozilla.com"
diff --git a/projects/mruby/Dockerfile b/projects/mruby/Dockerfile
index 6183b72..36aa167 100644
--- a/projects/mruby/Dockerfile
+++ b/projects/mruby/Dockerfile
@@ -16,7 +16,7 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 RUN apt-get update && apt-get install -y build-essential ruby bison ninja-build \
-    cmake zlib1g-dev libbz2-dev
+    cmake zlib1g-dev libbz2-dev liblzma-dev
 RUN git clone --depth 1 https://github.com/mruby/mruby mruby
 RUN git clone --depth 1 https://github.com/bshastry/mruby_seeds.git mruby_seeds
 RUN git clone --depth 1 https://github.com/google/libprotobuf-mutator.git
diff --git a/projects/msgpack-c/Dockerfile b/projects/msgpack-c/Dockerfile
index 4dea0b3..87efd76 100644
--- a/projects/msgpack-c/Dockerfile
+++ b/projects/msgpack-c/Dockerfile
@@ -15,8 +15,14 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER chriswwolfe@gmail.com
-RUN apt-get update && apt-get install -y cmake
-RUN git clone --depth 1 https://github.com/msgpack/msgpack-c.git msgpack-c
+RUN apt-get update && apt-get install -y cmake wget bzip2
+RUN git clone --depth 1 --single-branch --branch cpp_master https://github.com/msgpack/msgpack-c.git msgpack-c
+
+RUN wget https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.bz2 && \
+    tar xf boost_1_70_0.tar.bz2 && \
+    cd boost_1_70_0 && \
+    ./bootstrap.sh --with-toolset=clang --prefix=/usr && \
+    ./b2 -j$(nproc) toolset=clang --with-chrono --with-context --with-filesystem --with-system --with-timer address-model=64 cflags="$CFLAGS" cxxflags="$CXXFLAGS"  link=static variant=release runtime-link=static threading=multi install
+
 WORKDIR msgpack-c
 COPY build.sh $SRC/
diff --git a/projects/msgpack-c/build.sh b/projects/msgpack-c/build.sh
index 21faacf..9a065ff 100755
--- a/projects/msgpack-c/build.sh
+++ b/projects/msgpack-c/build.sh
@@ -15,11 +15,6 @@
 #
 ################################################################################
 
-cmake -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" \
-      -DCMAKE_C_FLAGS="$CFLAGS" -DCMAKE_CXX_FLAGS="$CXXFLAGS" \
-      -DMSGPACK_CXX11=ON .
-make -j$(nproc) all
-
 for f in $SRC/msgpack-c/fuzz/*_fuzzer.cpp; do
     # NOTE(derwolfe): the naming scheme for fuzzers and seed corpora is
     # fuzzer = something_something_fuzzer.cpp
@@ -27,7 +22,7 @@
     fuzzer=$(basename "$f" .cpp)
     $CXX $CXXFLAGS -std=c++11 -Iinclude -I"$SRC/msgpack-c/include" \
          "$f" -o "$OUT/${fuzzer}" \
-         $LIB_FUZZING_ENGINE "$SRC/msgpack-c/libmsgpackc.a"
+         $LIB_FUZZING_ENGINE
 
     if [ -d "$SRC/msgpack-c/fuzz/${fuzzer}_seed_corpus" ]; then
         zip -rj "$OUT/${fuzzer}_seed_corpus.zip" "$SRC/msgpack-c/fuzz/${fuzzer}_seed_corpus/"
diff --git a/projects/mtail/Dockerfile b/projects/mtail/Dockerfile
index 42b94f5..3f2c070 100644
--- a/projects/mtail/Dockerfile
+++ b/projects/mtail/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jaq@spacepants.org
 RUN mkdir -p github.com/google
 RUN git clone --depth 1 https://github.com/google/mtail github.com/google/mtail
 WORKDIR github.com/google/mtail
diff --git a/projects/muparser/build.sh b/projects/muparser/build.sh
index bbfb6b0..c42359d 100755
--- a/projects/muparser/build.sh
+++ b/projects/muparser/build.sh
@@ -15,8 +15,11 @@
 #
 ################################################################################
 
+CFLAGS="${CFLAGS} -fno-sanitize=integer-divide-by-zero,float-divide-by-zero"
+CXXFLAGS="${CXXFLAGS} -fno-sanitize=integer-divide-by-zero,float-divide-by-zero"
+
 # build project
-cmake . -DBUILD_SHARED_LIBS=OFF
+cmake . -DBUILD_SHARED_LIBS=OFF  -DENABLE_OPENMP=OFF
 make -j$(nproc)
 
 # install
diff --git a/projects/mupdf/Dockerfile b/projects/mupdf/Dockerfile
index 0b0b760..160ce0e 100644
--- a/projects/mupdf/Dockerfile
+++ b/projects/mupdf/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jonathan@titanous.com
 RUN apt-get update && apt-get install -y make libtool pkg-config
 RUN git clone --recursive --depth 1 git://git.ghostscript.com/mupdf.git mupdf
 RUN git clone --depth 1 https://github.com/mozilla/pdf.js pdf.js && \
diff --git a/projects/myanmar-tools/Dockerfile b/projects/myanmar-tools/Dockerfile
index d2513bb..62ed215 100644
--- a/projects/myanmar-tools/Dockerfile
+++ b/projects/myanmar-tools/Dockerfile
@@ -13,7 +13,6 @@
 # limitations under the License.
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER sffc@google.com
 
 RUN apt-get update && apt-get -y install \
     build-essential \
diff --git a/projects/mysql-server/Dockerfile b/projects/mysql-server/Dockerfile
index d2ee3fb..fddad91 100644
--- a/projects/mysql-server/Dockerfile
+++ b/projects/mysql-server/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER secalert_us@oracle.com
 RUN apt-get update
 RUN apt-get install -y build-essential libssl-dev libncurses5-dev libncursesw5-dev make cmake perl bison pkg-config
 RUN git clone --depth 1 https://github.com/mysql/mysql-server
diff --git a/projects/mysql-server/fix.diff b/projects/mysql-server/fix.diff
index 7fc18c0..0744eb1 100644
--- a/projects/mysql-server/fix.diff
+++ b/projects/mysql-server/fix.diff
@@ -1,8 +1,8 @@
 diff --git a/CMakeLists.txt b/CMakeLists.txt
-index ba974215d2a..eeda8656f9f 100644
+index eb0885f95e2..b30095535a8 100644
 --- a/CMakeLists.txt
 +++ b/CMakeLists.txt
-@@ -547,6 +547,7 @@ IF(WITH_JEMALLOC)
+@@ -565,6 +565,7 @@ IF(WITH_JEMALLOC)
    STRING_APPEND(CMAKE_CXX_FLAGS " -fno-builtin-realloc -fno-builtin-free")
  ENDIF()
  
@@ -10,7 +10,7 @@
  OPTION(ENABLED_PROFILING "Enable profiling" ON)
  OPTION(WITHOUT_SERVER OFF)
  IF(UNIX)
-@@ -1494,6 +1495,10 @@ IF(NOT WITHOUT_SERVER AND WITH_UNIT_TESTS)
+@@ -1520,6 +1521,10 @@ IF(NOT WITHOUT_SERVER AND WITH_UNIT_TESTS)
    TARGET_LINK_LIBRARIES(server_unittest_library ${ICU_LIBRARIES})
  ENDIF()
  
@@ -22,10 +22,10 @@
  # It is referenced by some of the directories below, so we insert it here.
  ADD_SUBDIRECTORY(scripts)
 diff --git a/include/mysql.h b/include/mysql.h
-index 1f499e9d9e5..a85c181ae78 100644
+index 9172c3e5b86..5005f38857c 100644
 --- a/include/mysql.h
 +++ b/include/mysql.h
-@@ -261,7 +261,8 @@ enum mysql_protocol_type {
+@@ -262,7 +262,8 @@ enum mysql_protocol_type {
    MYSQL_PROTOCOL_TCP,
    MYSQL_PROTOCOL_SOCKET,
    MYSQL_PROTOCOL_PIPE,
@@ -35,8 +35,22 @@
  };
  
  enum mysql_ssl_mode {
+diff --git a/include/mysql.h.pp b/include/mysql.h.pp
+index 2ec68913ba0..80dc99d1aaa 100644
+--- a/include/mysql.h.pp
++++ b/include/mysql.h.pp
+@@ -483,7 +483,8 @@ enum mysql_protocol_type {
+   MYSQL_PROTOCOL_TCP,
+   MYSQL_PROTOCOL_SOCKET,
+   MYSQL_PROTOCOL_PIPE,
+-  MYSQL_PROTOCOL_MEMORY
++  MYSQL_PROTOCOL_MEMORY,
++  MYSQL_PROTOCOL_FUZZ
+ };
+ enum mysql_ssl_mode {
+   SSL_MODE_DISABLED = 1,
 diff --git a/include/violite.h b/include/violite.h
-index 18e0d5736bd..d9badcbb667 100644
+index c04e82505a7..2498ba0053c 100644
 --- a/include/violite.h
 +++ b/include/violite.h
 @@ -108,12 +108,14 @@ enum enum_vio_type : int {
@@ -55,7 +69,7 @@
  };
  
  /**
-@@ -443,4 +445,20 @@ struct Vio {
+@@ -444,4 +446,20 @@ struct Vio {
  
  #define SSL_handle SSL *
  
@@ -127,10 +141,10 @@
      *failed = true;
      return 0;
 diff --git a/sql-common/client.cc b/sql-common/client.cc
-index 2f058e8d7d7..7885fa53f01 100644
+index ffb136b5b28..eca117c5ed6 100644
 --- a/sql-common/client.cc
 +++ b/sql-common/client.cc
-@@ -5802,6 +5802,12 @@ static mysql_state_machine_status csm_begin_connect(mysql_async_connect *ctx) {
+@@ -5774,6 +5774,12 @@ static mysql_state_machine_status csm_begin_connect(mysql_async_connect *ctx) {
      }
    }
  #endif /* _WIN32 */
@@ -144,10 +158,10 @@
    if (!net->vio &&
        (!mysql->options.protocol ||
 diff --git a/sql/mysqld.cc b/sql/mysqld.cc
-index 85b93bbf97e..26cf655b8c1 100644
+index 682e8d5ae13..68935ea75de 100644
 --- a/sql/mysqld.cc
 +++ b/sql/mysqld.cc
-@@ -6500,7 +6500,9 @@ int mysqld_main(int argc, char **argv)
+@@ -6784,7 +6784,9 @@ int mysqld_main(int argc, char **argv)
      unireg_abort(MYSQLD_ABORT_EXIT);  // Will do exit
    }
  
@@ -157,7 +171,7 @@
  
    size_t guardize = 0;
  #ifndef _WIN32
-@@ -6985,8 +6987,10 @@ int mysqld_main(int argc, char **argv)
+@@ -7269,8 +7271,10 @@ int mysqld_main(int argc, char **argv)
      unireg_abort(MYSQLD_ABORT_EXIT);
  
  #ifndef _WIN32
@@ -168,7 +182,7 @@
  #endif
  
    /* set all persistent options */
-@@ -7128,8 +7132,9 @@ int mysqld_main(int argc, char **argv)
+@@ -7412,8 +7416,9 @@ int mysqld_main(int argc, char **argv)
    }
  
    start_handle_manager();
@@ -179,7 +193,7 @@
  
    LogEvent()
        .type(LOG_TYPE_ERROR)
-@@ -7176,6 +7181,10 @@ int mysqld_main(int argc, char **argv)
+@@ -7460,6 +7465,10 @@ int mysqld_main(int argc, char **argv)
  
    (void)RUN_HOOK(server_state, before_handle_connection, (nullptr));
  
@@ -190,7 +204,7 @@
  #if defined(_WIN32)
    setup_conn_event_handler_threads();
  #else
-@@ -9983,6 +9992,9 @@ static int get_options(int *argc_ptr, char ***argv_ptr) {
+@@ -10289,6 +10298,9 @@ static int get_options(int *argc_ptr, char ***argv_ptr) {
  
    if (opt_short_log_format) opt_specialflag |= SPECIAL_SHORT_LOG_FORMAT;
  
@@ -201,10 +215,10 @@
      LogErr(ERROR_LEVEL, ER_CONNECTION_HANDLING_OOM);
      return 1;
 diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc
-index 25aec18f5bd..1dd4f7809db 100644
+index d4a5459a171..72101c888e1 100644
 --- a/storage/innobase/buf/buf0buf.cc
 +++ b/storage/innobase/buf/buf0buf.cc
-@@ -1483,18 +1483,14 @@ dberr_t buf_pool_init(ulint total_size, ulint n_instances) {
+@@ -1484,18 +1484,14 @@ dberr_t buf_pool_init(ulint total_size, ulint n_instances) {
        n = n_instances;
      }
  
@@ -238,38 +252,37 @@
  
  IF(WIN32)
 diff --git a/vio/vio.cc b/vio/vio.cc
-index 57e9d069f58..63d6254e917 100644
+index 38e3d90f20e..abbc9a52478 100644
 --- a/vio/vio.cc
 +++ b/vio/vio.cc
-@@ -291,6 +291,27 @@ static bool vio_init(Vio *vio, enum enum_vio_type type, my_socket sd,
-     vio->is_blocking_flag = true;
-     return false;
-   }
-+  if (type == VIO_TYPE_FUZZ) {
-+    vio->viodelete = vio_delete;
-+    vio->vioerrno = vio_errno;
-+    vio->read = vio_read_buff_fuzz;
-+    vio->write = vio_write_buff_fuzz;
-+    vio->fastsend = vio_fastsend_fuzz;
-+    vio->viokeepalive = vio_keepalive_fuzz;
-+    vio->should_retry = vio_should_retry_fuzz;
-+    vio->was_timeout = vio_was_timeout_fuzz;
-+    vio->vioshutdown = vio_shutdown_fuzz;
-+    vio->peer_addr = vio_peer_addr;
-+    vio->timeout = vio_socket_timeout_fuzz;
-+    vio->io_wait = vio_io_wait_fuzz;
-+    vio->is_connected = vio_is_connected_fuzz;
-+    vio->has_data = vio->read_buffer ? vio_buff_has_data : has_no_data;
-+    vio->is_blocking = vio_is_blocking;
-+    vio->set_blocking = vio_set_blocking;
-+    vio->set_blocking_flag = vio_set_blocking_flag;
-+    vio->is_blocking_flag = false;
-+    return false;
-+  }
-   vio->viodelete = vio_delete;
-   vio->vioerrno = vio_errno;
-   vio->read = vio->read_buffer ? vio_read_buff : vio_read;
-@@ -560,7 +581,8 @@ static const vio_string vio_type_names[] = {{"", 0},
+@@ -284,6 +284,26 @@ static bool vio_init(Vio *vio, enum enum_vio_type type, my_socket sd,
+       vio->is_blocking_flag = true;
+       break;
+ 
++    case VIO_TYPE_FUZZ:
++      vio->viodelete = vio_delete;
++      vio->vioerrno = vio_errno;
++      vio->read = vio_read_buff_fuzz;
++      vio->write = vio_write_buff_fuzz;
++      vio->fastsend = vio_fastsend_fuzz;
++      vio->viokeepalive = vio_keepalive_fuzz;
++      vio->should_retry = vio_should_retry_fuzz;
++      vio->was_timeout = vio_was_timeout_fuzz;
++      vio->vioshutdown = vio_shutdown_fuzz;
++      vio->peer_addr = vio_peer_addr;
++      vio->timeout = vio_socket_timeout_fuzz;
++      vio->io_wait = vio_io_wait_fuzz;
++      vio->is_connected = vio_is_connected_fuzz;
++      vio->has_data = vio->read_buffer ? vio_buff_has_data : has_no_data;
++      vio->is_blocking = vio_is_blocking;
++      vio->set_blocking = vio_set_blocking;
++      vio->set_blocking_flag = vio_set_blocking_flag;
++      vio->is_blocking_flag = false;
++
+     default:
+       vio->viodelete = vio_delete;
+       vio->vioerrno = vio_errno;
+@@ -568,7 +588,8 @@ static const vio_string vio_type_names[] = {{"", 0},
                                              {STRING_WITH_LEN("SSL/TLS")},
                                              {STRING_WITH_LEN("Shared Memory")},
                                              {STRING_WITH_LEN("Internal")},
diff --git a/projects/mysql-server/targets/CMakeLists.txt b/projects/mysql-server/targets/CMakeLists.txt
index ef2fc6e..4cf3671 100644
--- a/projects/mysql-server/targets/CMakeLists.txt
+++ b/projects/mysql-server/targets/CMakeLists.txt
@@ -8,10 +8,6 @@
   MYSQL_ADD_EXECUTABLE(fuzz_mysqld fuzz_mysqld.cc util_fuzz.cc onefile.cc)
   TARGET_LINK_LIBRARIES(fuzz_mysqld sql_main sql_gis binlog rpl master slave sql_dd mysys minchassis binlogevents_static ${ICU_LIBRARIES})
 
-  MYSQL_ADD_EXECUTABLE(fuzz_docommand fuzz_docommand.cc util_fuzz.cc onefile.cc)
-  TARGET_LINK_LIBRARIES(fuzz_docommand sql_main sql_gis binlog rpl master slave sql_dd mysys minchassis binlogevents_static ${ICU_LIBRARIES})
-
-
   MYSQL_ADD_EXECUTABLE(fuzz_initfile fuzz_initfile.cc util_fuzz.cc onefile.cc)
   TARGET_LINK_LIBRARIES(fuzz_initfile sql_main sql_gis binlog rpl master slave sql_dd mysys minchassis binlogevents_static ${ICU_LIBRARIES})
 else()
@@ -27,10 +23,6 @@
   TARGET_LINK_LIBRARIES(fuzz_mysqld sql_main sql_gis binlog rpl master slave sql_dd mysys minchassis binlogevents_static ${ICU_LIBRARIES})
   TARGET_LINK_LIBRARIES(fuzz_mysqld $ENV{LIB_FUZZING_ENGINE})
 
-  MYSQL_ADD_EXECUTABLE(fuzz_docommand fuzz_docommand.cc util_fuzz.cc)
-  TARGET_LINK_LIBRARIES(fuzz_docommand sql_main sql_gis binlog rpl master slave sql_dd mysys minchassis binlogevents_static ${ICU_LIBRARIES})
-  TARGET_LINK_LIBRARIES(fuzz_docommand $ENV{LIB_FUZZING_ENGINE})
-
   MYSQL_ADD_EXECUTABLE(fuzz_initfile fuzz_initfile.cc util_fuzz.cc)
   TARGET_LINK_LIBRARIES(fuzz_initfile sql_main sql_gis binlog rpl master slave sql_dd mysys minchassis binlogevents_static ${ICU_LIBRARIES})
   TARGET_LINK_LIBRARIES(fuzz_initfile $ENV{LIB_FUZZING_ENGINE})
diff --git a/projects/mysql-server/targets/fuzz_docommand.cc b/projects/mysql-server/targets/fuzz_docommand.cc
index 238618b..f77ec4f 100644
--- a/projects/mysql-server/targets/fuzz_docommand.cc
+++ b/projects/mysql-server/targets/fuzz_docommand.cc
@@ -1,3 +1,18 @@
+/* Copyright 2020 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
 //#include <stdint.h>
 //#include <stdlib.h>
 //#include <stdio.h>
@@ -40,6 +55,7 @@
 }
 
 
+// FIXME: Fix this buffer with succesful authenticated connection for mysql 8.21.
 const uint8_t startConn[] =
 "\xa6\x00\x00\x01\x85\xa6\xff\x01\x00\x00\x00\x01\x2d\x00\x00\x00" \
 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
diff --git a/projects/nanopb/Dockerfile b/projects/nanopb/Dockerfile
index f241ac9..25637f7 100644
--- a/projects/nanopb/Dockerfile
+++ b/projects/nanopb/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jpa@npb.mail.kapsi.fi
 RUN apt-get update && apt-get install -y python3-pip git wget
 RUN python3 -m pip install --upgrade pip
 RUN pip3 install protobuf grpcio-tools scons
diff --git a/projects/nanopb/build.sh b/projects/nanopb/build.sh
index f9fc81c..13cecd8 100755
--- a/projects/nanopb/build.sh
+++ b/projects/nanopb/build.sh
@@ -30,17 +30,30 @@
 for f in fuzztest_seed_corpus/*; do
     mv $f fuzztest_seed_corpus/$(sha1sum $f | cut -f 1 -d ' ')
 done
-zip -r "$OUT/fuzztest_seed_corpus.zip" fuzztest_seed_corpus
+zip -r "$OUT/corpus.zip" fuzztest_seed_corpus
 
-# Build the fuzz testing stub with instrumentation
+# Build the fuzz testing stubs with instrumentation
 rm -rf build
+
+FUZZERS="build/fuzztest/fuzztest_proto2_static
+         build/fuzztest/fuzztest_proto2_pointer
+         build/fuzztest/fuzztest_proto3_static
+         build/fuzztest/fuzztest_proto3_pointer
+         build/fuzztest/fuzztest_io_errors"
+
 scons CC="$CC" CXX="$CXX" LINK="$CXX" \
       CCFLAGS="-Wall -Wextra -g -DLLVMFUZZER $CFLAGS" \
       CXXFLAGS="-Wall -Wextra -g -DLLVMFUZZER $CXXFLAGS" \
       NODEFARGS="1" \
       LINKFLAGS="-std=c++11 $CXXFLAGS" \
-      LINKLIBS="$LIB_FUZZING_ENGINE" build/fuzztest/fuzztest
+      LINKLIBS="$LIB_FUZZING_ENGINE" $FUZZERS
 
-cp build/fuzztest/fuzztest "$OUT/fuzztest"
+cp $FUZZERS "$OUT"
 
+# The fuzzer test cases are closely related, so use the same seed corpus
+# for all of them.
+for fuzzer in $FUZZERS
+    do cp "$OUT/corpus.zip" "$OUT/$(basename $fuzzer)_seed_corpus.zip"
+done
+rm "$OUT/corpus.zip"
 
diff --git a/projects/ndpi/Dockerfile b/projects/ndpi/Dockerfile
index 7004308..3cf1cdc 100644
--- a/projects/ndpi/Dockerfile
+++ b/projects/ndpi/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER deri@ntop.org
 RUN apt-get update && apt-get install -y make autoconf automake autogen pkg-config libtool flex bison
 RUN git clone --depth 1 https://github.com/ntop/nDPI.git ndpi
 ADD https://www.tcpdump.org/release/libpcap-1.9.1.tar.gz libpcap-1.9.1.tar.gz
diff --git a/projects/ndpi/build.sh b/projects/ndpi/build.sh
index 53ef132..a48c042 100755
--- a/projects/ndpi/build.sh
+++ b/projects/ndpi/build.sh
@@ -28,4 +28,4 @@
 sh autogen.sh
 ./configure --enable-fuzztargets
 make
-ls fuzz/fuzz* | grep -v "\." | while read i; do cp $i $OUT/; done
+ls fuzz/fuzz* | grep -v "\." | grep -v "with_main" | while read i; do cp $i $OUT/; done
diff --git a/projects/neomutt/Dockerfile b/projects/neomutt/Dockerfile
index ed2800b..920e71d 100644
--- a/projects/neomutt/Dockerfile
+++ b/projects/neomutt/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER joseph.bisch@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool xsltproc libncursesw5-dev libtinfo5 libxml2-dev libxml2-utils libidn11-dev
 RUN git clone https://github.com/neomutt/neomutt neomutt
 WORKDIR neomutt
diff --git a/projects/nestegg/Dockerfile b/projects/nestegg/Dockerfile
index 633edb6..5afe078 100644
--- a/projects/nestegg/Dockerfile
+++ b/projects/nestegg/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kinetik@flim.org
 RUN apt-get update && apt-get install -y subversion wget
 RUN git clone https://github.com/kinetiknz/nestegg.git
 
diff --git a/projects/net-snmp/Dockerfile b/projects/net-snmp/Dockerfile
index a5114b4..c9e6a79 100644
--- a/projects/net-snmp/Dockerfile
+++ b/projects/net-snmp/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER fenner@gmail.com
 RUN apt-get update && apt-get install -y make autoconf libtool libssl-dev
 RUN git clone --depth 1 git://git.code.sf.net/p/net-snmp/code net-snmp
 WORKDIR net-snmp
diff --git a/projects/nghttp2/Dockerfile b/projects/nghttp2/Dockerfile
index ff5cb94..58a0309 100644
--- a/projects/nghttp2/Dockerfile
+++ b/projects/nghttp2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER tatsuhiro.t@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config
 RUN git clone --depth 1 https://github.com/nghttp2/nghttp2.git
 WORKDIR nghttp2
diff --git a/projects/njs/Dockerfile b/projects/njs/Dockerfile
index 05bf5dd..0066c4a 100644
--- a/projects/njs/Dockerfile
+++ b/projects/njs/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mmoroz@chromium.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool \
     mercurial libpcre3-dev subversion
 RUN hg clone http://hg.nginx.org/njs
diff --git a/projects/nodejs/Dockerfile b/projects/nodejs/Dockerfile
new file mode 100644
index 0000000..69c64a7
--- /dev/null
+++ b/projects/nodejs/Dockerfile
@@ -0,0 +1,24 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y make
+RUN apt-get install -y flex bison build-essential
+RUN git clone --recursive --depth 1 https://github.com/nodejs/node
+WORKDIR $SRC
+COPY build.sh $SRC/
+
+COPY fuzz_url.cc $SRC/
diff --git a/projects/nodejs/build.sh b/projects/nodejs/build.sh
new file mode 100755
index 0000000..075ebb6
--- /dev/null
+++ b/projects/nodejs/build.sh
@@ -0,0 +1,46 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+cd $SRC/node
+
+# Build node
+export LDFLAGS="$CXXFLAGS"
+export LD="$CXX"
+./configure --without-intl --without-node-code-cache --without-dtrace --without-snapshot --without-ssl
+make -j$(nproc)
+
+# Gather static libraries
+cd $SRC/node/out
+rm -rf ./library_files && mkdir library_files
+find . -name "*.a" -exec cp {} ./library_files/ \;
+
+# Build the fuzzers
+CMDS="-D__STDC_FORMAT_MACROS -D__POSIX__ -DNODE_HAVE_I18N_SUPPORT=1 \
+ -DNODE_ARCH=\"x64\" -DNODE_PLATFORM=\"linux\" -DNODE_WANT_INTERNALS=1"
+INCLUDES="-I../src -I../deps/v8/include -I../deps/uv/include"
+
+# Compilation
+$CXX -o fuzz_url.o $SRC/fuzz_url.cc $CXXFLAGS $CMDS $INCLUDES \
+        -pthread -fno-omit-frame-pointer -fno-rtti -fno-exceptions -std=gnu++1y -MMD -c
+
+# Linking
+$CXX -o $OUT/fuzz_url $LIB_FUZZING_ENGINE $CXXFLAGS \
+  -rdynamic -Wl,-z,noexecstack,-z,relro,-z,now \
+  -pthread -Wl,--start-group \
+  ./Release/obj.target/cctest/src/node_snapshot_stub.o \
+  ./Release/obj.target/cctest/src/node_code_cache_stub.o \
+  fuzz_url.o ./library_files/*.a \
+  -latomic -lm -ldl -Wl,--end-group
diff --git a/projects/nodejs/fuzz_url.cc b/projects/nodejs/fuzz_url.cc
new file mode 100644
index 0000000..1c07fac
--- /dev/null
+++ b/projects/nodejs/fuzz_url.cc
@@ -0,0 +1,25 @@
+/* Copyright 2020 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+#include <stdlib.h>
+
+#include "node.h"
+#include "node_internals.h"
+#include "node_url.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+    node::url::URL url2((char*)data, size);
+
+    return 0;
+} 
diff --git a/projects/nodejs/project.yaml b/projects/nodejs/project.yaml
index 80ca11e..e6173db 100644
--- a/projects/nodejs/project.yaml
+++ b/projects/nodejs/project.yaml
@@ -1,2 +1,7 @@
 homepage: "https://nodejs.org"
 primary_contact: "security@nodejs.org"
+language: c++
+sanitizers:
+  - address
+auto_ccs:
+  - "david@adalogics.com"
diff --git a/projects/nss/Dockerfile b/projects/nss/Dockerfile
index 0a4df4f..5ad8b5e 100644
--- a/projects/nss/Dockerfile
+++ b/projects/nss/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mmoroz@chromium.org
 RUN apt-get update && apt-get install -y make mercurial zlib1g-dev gyp ninja-build libssl-dev
 
 RUN hg clone https://hg.mozilla.org/projects/nspr nspr
diff --git a/projects/ntp/Dockerfile b/projects/ntp/Dockerfile
index d942c8c..40de20c 100644
--- a/projects/ntp/Dockerfile
+++ b/projects/ntp/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER security@ntp.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool bison flex rsync lynx
 ADD https://www.bitkeeper.org/downloads/7.3.3/bk-7.3.3-x86_64-glibc213-linux.bin bk-7.3.3-x86_64-glibc213-linux.bin
 RUN chmod +x bk-7.3.3-x86_64-glibc213-linux.bin
diff --git a/projects/oak/Dockerfile b/projects/oak/Dockerfile
index 9d74398..e6f44f3 100644
--- a/projects/oak/Dockerfile
+++ b/projects/oak/Dockerfile
@@ -17,7 +17,6 @@
 # TODO(https://github.com/google/oss-fuzz/issues/3093): Stop specifying the
 # image SHA once the bug is fixed.
 FROM gcr.io/oss-fuzz-base/base-builder@sha256:276813aef0ce5972db43c0230f96162003994fa742fb1b2f4e66c67498575c65
-MAINTAINER tzn@google.com
 
 # Use a fixed Bazel version.
 # https://github.com/google/asylo/blob/088ea3490dd4579655bd5b65b0e31fe18de7f6dd/asylo/distrib/toolchain/Dockerfile#L48-L71
diff --git a/projects/oak/build.sh b/projects/oak/build.sh
index 3ade813..2e46c77 100755
--- a/projects/oak/build.sh
+++ b/projects/oak/build.sh
@@ -42,34 +42,35 @@
 # Temporary hack, see https://github.com/google/oss-fuzz/issues/383
 readonly NO_VPTR='--copt=-fno-sanitize=vptr --linkopt=-fno-sanitize=vptr'
 
-readonly FUZZER_TARGETS=(
-  'oak/server:wasm_node_fuzz'
-)
+readonly FUZZER_TARGETS=()
+readonly ENABLED=false
 
-bazel build \
-  --client_env=CC=${CC} \
-  --client_env=CXX=${CXX} \
-  --dynamic_mode=off \
-  --spawn_strategy=standalone \
-  --genrule_strategy=standalone \
-  ${NO_VPTR} \
-  --strip=never \
-  --linkopt=-lc++ \
-  --linkopt=-pthread \
-  --cxxopt=-std=c++11 \
-  --copt=${LIB_FUZZING_ENGINE} \
-  --linkopt=${LIB_FUZZING_ENGINE} \
-  --remote_cache=https://storage.googleapis.com/oak-bazel-cache \
-  --remote_upload_local_results=false \
-  ${EXTRA_BAZEL_FLAGS} \
-  ${FUZZER_TARGETS[@]}
+if [ "$ENABLED" = true ]; then
+  bazel build \
+    --client_env=CC=${CC} \
+    --client_env=CXX=${CXX} \
+    --dynamic_mode=off \
+    --spawn_strategy=standalone \
+    --genrule_strategy=standalone \
+    ${NO_VPTR} \
+    --strip=never \
+    --linkopt=-lc++ \
+    --linkopt=-pthread \
+    --cxxopt=-std=c++11 \
+    --copt=${LIB_FUZZING_ENGINE} \
+    --linkopt=${LIB_FUZZING_ENGINE} \
+    --remote_cache=https://storage.googleapis.com/oak-bazel-cache \
+    --remote_upload_local_results=false \
+    ${EXTRA_BAZEL_FLAGS} \
+    ${FUZZER_TARGETS[@]}
 
-for target in ${FUZZER_TARGETS}; do
-  # Replace : with /.
-  fuzzer_name="${target/:/\/}"
-  cp "./bazel-bin/${fuzzer_name}" "${OUT}/"
-done
+  for target in ${FUZZER_TARGETS}; do
+    # Replace : with /.
+    fuzzer_name="${target/:/\/}"
+    cp "./bazel-bin/${fuzzer_name}" "${OUT}/"
+  done
 
-# Cleanup bazel- symlinks to avoid oss-fuzz trying to copy out of the build
-# cache.
-rm -f ./bazel-*
+  # Cleanup bazel- symlinks to avoid oss-fuzz trying to copy out of the build
+  # cache.
+  rm -f ./bazel-*
+fi
diff --git a/projects/oak/project.yaml b/projects/oak/project.yaml
index e0a4f01..2dbe32e 100644
--- a/projects/oak/project.yaml
+++ b/projects/oak/project.yaml
@@ -1,3 +1,4 @@
+disabled: True
 homepage: "https://github.com/project-oak/oak"
 language: c++
 primary_contact: "tzn@google.com"
diff --git a/projects/oniguruma/Dockerfile b/projects/oniguruma/Dockerfile
index 3042d2f..9334f9d 100644
--- a/projects/oniguruma/Dockerfile
+++ b/projects/oniguruma/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kkosako0@gmail.com
 
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://github.com/kkos/oniguruma.git oniguruma
diff --git a/projects/open62541/Dockerfile b/projects/open62541/Dockerfile
index 5704524..12c1e1f 100644
--- a/projects/open62541/Dockerfile
+++ b/projects/open62541/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER git@s.profanter.me
 RUN apt-get update && apt-get install -y make cmake python-six wget
 # We need libmbedtls > 2.5.1 otherwise it does not include the lib for static linking
 RUN wget https://open62541.org/libmbedtls/libmbedtls-dev_2.6.0-1_amd64.deb && \
diff --git a/projects/opencv/build.sh b/projects/opencv/build.sh
index a3fb653..165f403 100755
--- a/projects/opencv/build.sh
+++ b/projects/opencv/build.sh
@@ -30,7 +30,10 @@
 popd
 
 pushd $SRC
-for fuzzer in imdecode_fuzzer imread_fuzzer; do
+for fuzzer in core_fuzzer filestorage_read_file_fuzzer \
+   filestorage_read_filename_fuzzer filestorage_read_string_fuzzer \
+   generateusergallerycollage_fuzzer imdecode_fuzzer imencode_fuzzer \
+   imread_fuzzer; do
 $CXX $CXXFLAGS $LIB_FUZZING_ENGINE $fuzzer.cc -std=c++11 \
 -I$install_dir/include/opencv4 -L$install_dir/lib \
 -L$install_dir/lib/opencv4/3rdparty \
diff --git a/projects/opencv/core_fuzzer.cc b/projects/opencv/core_fuzzer.cc
new file mode 100644
index 0000000..089b6d7
--- /dev/null
+++ b/projects/opencv/core_fuzzer.cc
@@ -0,0 +1,92 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+#include <cstdint>
+
+#include <opencv2/opencv.hpp>
+#include <fuzzer/FuzzedDataProvider.h>
+
+namespace {
+
+bool GetCVImage(const std::string& image_string, const int max_pixels,
+                cv::Mat* original_image) {
+  if (image_string.empty()) return false;
+  std::vector<uchar> raw_data(image_string.size());
+  const char* ptr = image_string.data();
+  std::copy(ptr, ptr + image_string.size(), raw_data.data());
+  try {
+    *original_image = cv::imdecode(raw_data, cv::IMREAD_UNCHANGED);
+  } catch (cv::Exception e) {}
+  return !original_image->empty();
+}
+
+void TestExternalMethods(const cv::Mat& mat) {
+  try{
+    cv::sum(mat);
+  } catch (cv::Exception e) {}
+  try {
+    cv::mean(mat);
+  } catch (cv::Exception e) {}
+  try {
+    cv::trace(mat);
+  } catch (cv::Exception e) {}
+}
+
+void TestInternalMethods(const cv::Mat& mat) {
+  try {
+    mat.t();
+  } catch (cv::Exception e) {}
+  try {
+    mat.inv();
+  } catch (cv::Exception e) {}
+  try {
+    mat.diag();
+  } catch (cv::Exception e) {}
+}
+
+void TestSplitAndMerge(const cv::Mat& image) {
+  std::vector<cv::Mat> split_image(image.channels());
+  cv::split(image, split_image);
+  if (!split_image.empty()) {
+    cv::Mat new_image;
+    cv::merge(split_image, new_image);
+  }
+}
+
+}  // namespace
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  // Prepares a backup image we will use if we cannot successfully get an image
+  // by decoding the string.
+  std::vector<uint8_t> image_data = {data, data + size};
+  cv::Mat backup_image =
+      cv::Mat(1, image_data.size(), CV_8UC1, image_data.data());
+
+  FuzzedDataProvider fuzzed_data_provider(data, size);
+  const int max_pixels = fuzzed_data_provider.ConsumeIntegral<int>();
+  const std::string image_string =
+      fuzzed_data_provider.ConsumeRemainingBytesAsString();
+  cv::Mat original_image;
+  // Tests the clone method.
+  cv::Mat cloned_image = GetCVImage(image_string, max_pixels, &original_image)
+                             ? original_image.clone()
+                             : backup_image.clone();
+
+  // TODO: enabling the following crashes right away.
+  // TestExternalMethods(cloned_image);
+  TestInternalMethods(cloned_image);
+  TestSplitAndMerge(cloned_image);
+  return 0;
+}
diff --git a/projects/opencv/filestorage_read_file_fuzzer.cc b/projects/opencv/filestorage_read_file_fuzzer.cc
new file mode 100644
index 0000000..03e06e6
--- /dev/null
+++ b/projects/opencv/filestorage_read_file_fuzzer.cc
@@ -0,0 +1,34 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+#include <cstdint>
+
+#include <opencv2/opencv.hpp>
+#include "fuzzer_temp_file.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  // Tests reading from a file using cv::FileStorage, which attempts to parse
+  // JSON, XML, and YAML, using the first few bytes of a file to determine which
+  // type to parse it as.
+  const FuzzerTemporaryFile temp_file(data, size);
+  cv::FileStorage storage;
+  try {
+    // TODO: enabling the following crashes right away.
+//    storage.open(temp_file.filename(), cv::FileStorage::READ);
+  } catch (cv::Exception e) {
+    // Do nothing.
+  }
+  return 0;
+}
diff --git a/projects/opencv/filestorage_read_filename_fuzzer.cc b/projects/opencv/filestorage_read_filename_fuzzer.cc
new file mode 100644
index 0000000..122f1db
--- /dev/null
+++ b/projects/opencv/filestorage_read_filename_fuzzer.cc
@@ -0,0 +1,36 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+#include <cstdint>
+
+#include <opencv2/opencv.hpp>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  // Tests filename parsing when opening cv::FileStorage for reading. The file
+  // doesn't actually exist, so any logic prediated on successfully opening the
+  // file will not be tested.
+  //
+  // Note that this may actually generate filenames that do exist. If so, this
+  // could result in some bugs being difficult to reproduce. If a case doesn't
+  // reproduce and looks like a real filename, this may be the cause.
+  cv::FileStorage storage;
+  try {
+    storage.open(std::string(reinterpret_cast<const char*>(data), size),
+                 cv::FileStorage::READ);
+  } catch (cv::Exception e) {
+    // Do nothing.
+  }
+  return 0;
+}
diff --git a/projects/opencv/filestorage_read_string_fuzzer.cc b/projects/opencv/filestorage_read_string_fuzzer.cc
new file mode 100644
index 0000000..d9db91e
--- /dev/null
+++ b/projects/opencv/filestorage_read_string_fuzzer.cc
@@ -0,0 +1,32 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+#include <cstdint>
+
+#include <opencv2/opencv.hpp>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  // Tests reading from a string (instead of a file) using cv::FileStorage,
+  // which attempts to parse JSON, XML, and YAML, using the first few bytes of a
+  // string to determine which type to parse it as.
+  cv::FileStorage storage;
+  try {
+    storage.open(std::string(reinterpret_cast<const char*>(data), size),
+                 cv::FileStorage::READ);
+  } catch (cv::Exception e) {
+    // Do nothing.
+  }
+  return 0;
+}
diff --git a/projects/opencv/generateusergallerycollage_fuzzer.cc b/projects/opencv/generateusergallerycollage_fuzzer.cc
new file mode 100644
index 0000000..4d8432f
--- /dev/null
+++ b/projects/opencv/generateusergallerycollage_fuzzer.cc
@@ -0,0 +1,83 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+#include <cstdint>
+#include <iosfwd>
+
+#include <opencv2/opencv.hpp>
+#include <fuzzer/FuzzedDataProvider.h>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  const int kMaxXResolution = 6000;
+  const int kMaxYResolution = 6000;
+  const int kMaxLineThickness = 10;
+  const double kMaxFontScale = 10.0;
+
+  FuzzedDataProvider fuzz_provider(data, size);
+
+  int fuzz_font_face = fuzz_provider.PickValueInArray(
+      {cv::FONT_HERSHEY_SIMPLEX, cv::FONT_HERSHEY_PLAIN,
+       cv::FONT_HERSHEY_DUPLEX, cv::FONT_HERSHEY_COMPLEX,
+       cv::FONT_HERSHEY_TRIPLEX, cv::FONT_HERSHEY_COMPLEX_SMALL,
+       cv::FONT_HERSHEY_SCRIPT_SIMPLEX, cv::FONT_HERSHEY_SCRIPT_COMPLEX});
+
+  int fuzz_linetype = fuzz_provider.PickValueInArray({
+      cv::LINE_8,     // 8-connected line
+      cv::LINE_4,     // 4-connected line
+      cv::LINE_AA     // anti-aliased line
+  });
+
+  double fuzz_font_scale =
+      fuzz_provider.ConsumeFloatingPointInRange(0.0, kMaxFontScale);
+  int fuzz_width =
+      fuzz_provider.ConsumeIntegralInRange<int>(0, kMaxXResolution);
+  int fuzz_height =
+      fuzz_provider.ConsumeIntegralInRange<int>(0, kMaxYResolution);
+  int fuzz_x_pos =
+      fuzz_provider.ConsumeIntegralInRange<int>(0, kMaxXResolution);
+  int fuzz_y_pos =
+      fuzz_provider.ConsumeIntegralInRange<int>(0, kMaxYResolution);
+  int fuzz_thickness =
+      fuzz_provider.ConsumeIntegralInRange<int>(0, kMaxLineThickness);
+
+  std::vector<uint8_t> color_scalar_vals;
+  std::vector<uint8_t> canvas_fill_scalar_vals;
+
+  // Ensure that all 3D vectors are fully populated,
+  // even if fuzz_provider is exhausted.
+  for (int i = 0; i < 3; i++) {
+    color_scalar_vals.insert(color_scalar_vals.begin(),
+                             fuzz_provider.ConsumeIntegralInRange(0, 255));
+    canvas_fill_scalar_vals.insert(
+        canvas_fill_scalar_vals.begin(),
+        fuzz_provider.ConsumeIntegralInRange(0, 255));
+  }
+
+  cv::Scalar fuzz_color(color_scalar_vals[0], color_scalar_vals[1],
+                        color_scalar_vals[2]);
+  cv::Scalar fuzz_canvas_fill(canvas_fill_scalar_vals[0],
+                              canvas_fill_scalar_vals[1],
+                              canvas_fill_scalar_vals[2]);
+
+  cv::Point fuzz_text_pos(fuzz_x_pos, fuzz_y_pos);
+  cv::Mat fuzz_canvas(fuzz_height, fuzz_width, CV_8UC3, fuzz_canvas_fill);
+
+  std::basic_string<char> fuzz_annotation =
+      fuzz_provider.ConsumeRemainingBytesAsString();
+
+  cv::putText(fuzz_canvas, fuzz_annotation, fuzz_text_pos, fuzz_font_face,
+              fuzz_font_scale, fuzz_color, fuzz_thickness, fuzz_linetype);
+  return 0;
+}
diff --git a/projects/opencv/imencode_fuzzer.cc b/projects/opencv/imencode_fuzzer.cc
new file mode 100644
index 0000000..735fcd7
--- /dev/null
+++ b/projects/opencv/imencode_fuzzer.cc
@@ -0,0 +1,31 @@
+// Copyright 2020 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+#include <cstdint>
+
+#include <opencv2/opencv.hpp>
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  std::vector<uint8_t> image_data = {data, data + size};
+  cv::Mat data_matrix =
+      cv::Mat(1, image_data.size(), CV_8UC1, image_data.data());
+  try {
+    std::vector<uchar> buffer;
+    cv::imencode(".tiff", data_matrix, buffer);
+  } catch (cv::Exception e) {
+    // Do nothing.
+  }
+  return 0;
+}
diff --git a/projects/opendnp3/Dockerfile b/projects/opendnp3/Dockerfile
index c619c9c..e602568 100644
--- a/projects/opendnp3/Dockerfile
+++ b/projects/opendnp3/Dockerfile
@@ -15,16 +15,8 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER info@automatak.com
 RUN apt-get update && apt-get install -y make wget tshark
-# The CMake version that is available on Ubuntu 16.04 is 3.5.1. OpenDNP3
-# needs CMake 3.8 or higher, because of the C# bindings. Therefore, we
-# manually install a modern CMake until the OSS Fuzz environment updates
-# to a more recent Ubuntu.
-# This section was taken from JSC Dockerfile
-RUN wget -q -O - https://github.com/Kitware/CMake/releases/download/v3.14.4/cmake-3.14.4-Linux-x86_64.sh > /tmp/install_cmake.sh && \
-    cd /usr && bash /tmp/install_cmake.sh -- --skip-license && \
-    rm /tmp/install_cmake.sh
+
 RUN git clone --recursive -b release-2.x --depth 1 https://github.com/dnp3/opendnp3.git opendnp3
 WORKDIR opendnp3
 COPY build.sh $SRC/
diff --git a/projects/openexr/Dockerfile b/projects/openexr/Dockerfile
new file mode 100644
index 0000000..8757145
--- /dev/null
+++ b/projects/openexr/Dockerfile
@@ -0,0 +1,21 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y make autoconf automake libtool zlib1g-dev
+RUN git clone --depth 1 https://github.com/AcademySoftwareFoundation/openexr openexr
+WORKDIR openexr
+COPY build.sh *_fuzzer.cc *.h $SRC/
diff --git a/projects/openexr/build.sh b/projects/openexr/build.sh
new file mode 100755
index 0000000..dcf71f8
--- /dev/null
+++ b/projects/openexr/build.sh
@@ -0,0 +1,57 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+cd $WORK/
+
+CMAKE_SETTINGS=(
+  "-D BUILD_SHARED_LIBS=OFF"         # Build static libraries only
+  "-D PYILMBASE_ENABLE=OFF"          # Don't build Python support
+  "-D BUILD_TESTING=OFF"             # Or tests
+  "-D INSTALL_OPENEXR_EXAMPLES=OFF"  # Or examples
+  "-D OPENEXR_LIB_SUFFIX="           # Don't append the version number to library files
+  "-D ILMBASE_LIB_SUFFIX="
+)
+cmake $SRC/openexr ${CMAKE_SETTINGS[@]}
+make -j$(nproc)
+
+ar -qc $WORK/OpenEXR/libOpenexrUtils.a $(find $WORK/ -name "*.o")
+
+INCLUDES=(
+  "-I $SRC"
+  "-I $SRC/openexr/OpenEXR/IlmImf"
+  "-I $SRC/openexr/OpenEXR/exrenvmap"
+  "-I $SRC/openexr/IlmBase/Imath"
+  "-I $SRC/openexr/IlmBase/Iex"
+  "-I $SRC/openexr/IlmBase/Half"
+  "-I $WORK/OpenEXR/config"
+  "-I $WORK/IlmBase/config"
+)
+
+LIBS=(
+  "$WORK/OpenEXR/IlmImf/libIlmImf.a"
+  "$WORK/IlmBase/Iex/libIex.a"
+  "$WORK/IlmBase/Half/libHalf.a"
+  "$WORK/IlmBase/IlmThread/libIlmThread.a"
+  "$WORK/IlmBase/Imath/libImath.a"
+  "$WORK/OpenEXR/libOpenexrUtils.a"
+)
+
+for fuzzer in $SRC/*_fuzzer.cc; do
+  fuzzer_basename=$(basename -s .cc $fuzzer)
+  $CXX $CXXFLAGS -std=c++11 -pthread ${INCLUDES[@]} $fuzzer $LIB_FUZZING_ENGINE ${LIBS[@]} -lz \
+    -o $OUT/$fuzzer_basename
+done
diff --git a/projects/libxml2/fuzzer_temp_file.h b/projects/openexr/fuzzer_temp_file.h
similarity index 78%
rename from projects/libxml2/fuzzer_temp_file.h
rename to projects/openexr/fuzzer_temp_file.h
index fe25cab..b5442f1 100644
--- a/projects/libxml2/fuzzer_temp_file.h
+++ b/projects/openexr/fuzzer_temp_file.h
@@ -1,4 +1,4 @@
-// Copyright 2018 Google Inc.
+// Copyright 2020 Google Inc.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -26,8 +26,8 @@
 
 // Pure-C interface for creating and cleaning up temporary files.
 
-static char* fuzzer_get_tmpfile(const uint8_t* data, size_t size) {
-  char* filename_buffer = strdup("/tmp/generate_temporary_file.XXXXXX");
+static char *fuzzer_get_tmpfile(const uint8_t *data, size_t size) {
+  char *filename_buffer = strdup("/tmp/generate_temporary_file.XXXXXX");
   if (!filename_buffer) {
     perror("Failed to allocate file name buffer.");
     abort();
@@ -37,15 +37,15 @@
     perror("Failed to make temporary file.");
     abort();
   }
-  FILE* file = fdopen(file_descriptor, "wb");
+  FILE *file = fdopen(file_descriptor, "wb");
   if (!file) {
     perror("Failed to open file descriptor.");
     close(file_descriptor);
     abort();
   }
   const size_t bytes_written = fwrite(data, sizeof(uint8_t), size, file);
-  if (bytes_written < size) {
-    close(file_descriptor);
+  if (bytes_written != size) {
+    fclose(file);
     fprintf(stderr, "Failed to write all bytes to file (%zu out of %zu)",
             bytes_written, size);
     abort();
@@ -54,7 +54,7 @@
   return filename_buffer;
 }
 
-static void fuzzer_release_tmpfile(char* filename) {
+static void fuzzer_release_tmpfile(char *filename) {
   if (unlink(filename) != 0) {
     perror("WARNING: Failed to delete temporary file.");
   }
@@ -65,17 +65,17 @@
 
 #ifdef __cplusplus
 class FuzzerTemporaryFile {
- public:
-  FuzzerTemporaryFile(const uint8_t* data, size_t size)
+public:
+  FuzzerTemporaryFile(const uint8_t *data, size_t size)
       : filename_(fuzzer_get_tmpfile(data, size)) {}
 
   ~FuzzerTemporaryFile() { fuzzer_release_tmpfile(filename_); }
 
-  const char* filename() const { return filename_; }
+  const char *filename() const { return filename_; }
 
- private:
-  char* filename_;
+private:
+  char *filename_;
 };
 #endif
 
-#endif  // FUZZER_TEMP_FILE_H_
+#endif // FUZZER_TEMP_FILE_H_
diff --git a/projects/openexr/openexr_deepscanlines_fuzzer.cc b/projects/openexr/openexr_deepscanlines_fuzzer.cc
new file mode 100644
index 0000000..a91671e
--- /dev/null
+++ b/projects/openexr/openexr_deepscanlines_fuzzer.cc
@@ -0,0 +1,173 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <vector>
+
+#include <ImfArray.h>
+#include <ImfChannelList.h>
+#include <ImfDeepFrameBuffer.h>
+#include <ImfDeepScanLineInputPart.h>
+#include <ImfMultiPartInputFile.h>
+#include <ImfNamespace.h>
+#include <ImfStdIO.h>
+
+#include <fuzzer/FuzzedDataProvider.h>
+
+namespace IMF = OPENEXR_IMF_NAMESPACE;
+using namespace IMF;
+using IMATH_NAMESPACE::Box2i;
+using IMATH_NAMESPACE::V2i;
+
+namespace {
+
+const int width = 90;
+const int height = 80;
+const int minX = 10;
+const int minY = 11;
+const Box2i dataWindow(V2i(minX, minY),
+                       V2i(minX + width - 1, minY + height - 1));
+const Box2i displayWindow(V2i(0, 0), V2i(minX + width * 2, minY + height * 2));
+
+template <typename T>
+static void readFile(T *inpart) {
+  const Header &fileHeader = inpart->header();
+
+  int channelCount = 0;
+  for (ChannelList::ConstIterator i = fileHeader.channels().begin();
+       i != fileHeader.channels().end(); ++i, ++channelCount) {
+  }
+
+  Array2D<unsigned int> localSampleCount;
+  localSampleCount.resizeErase(height, width);
+  Array<Array2D<void *> > data(channelCount);
+
+  for (int i = 0; i < channelCount; i++) data[i].resizeErase(height, width);
+
+  DeepFrameBuffer frameBuffer;
+
+  frameBuffer.insertSampleCountSlice(
+      Slice(IMF::UINT,
+            (char *)(&localSampleCount[0][0] - dataWindow.min.x -
+                     dataWindow.min.y * width),
+            sizeof(unsigned int) * 1, sizeof(unsigned int) * width));
+
+  std::vector<int> read_channel(channelCount);
+
+  for (int i = 0; i < channelCount; i++) {
+    PixelType type = IMF::FLOAT;
+
+    std::stringstream ss;
+    ss << i;
+    std::string str = ss.str();
+
+    int sampleSize = sizeof(float);
+
+    int pointerSize = sizeof(char *);
+
+    frameBuffer.insert(
+        str, DeepSlice(type,
+                       (char *)(&data[i][0][0] - dataWindow.min.x -
+                                dataWindow.min.y * width),
+                       pointerSize * 1, pointerSize * width, sampleSize));
+  }
+
+  inpart->setFrameBuffer(frameBuffer);
+  inpart->readPixelSampleCounts(dataWindow.min.y, dataWindow.max.y);
+  for (int i = 0; i < dataWindow.max.y - dataWindow.min.y + 1; i++) {
+    int y = i + dataWindow.min.y;
+
+    for (int j = 0; j < width; j++) {
+      for (int k = 0; k < channelCount; k++) {
+        data[k][i][j] = new float[localSampleCount[i][j]];
+      }
+    }
+  }
+  try {
+    inpart->readPixels(dataWindow.min.y, dataWindow.max.y);
+  } catch (...) {
+  }
+
+  for (int i = 0; i < height; i++) {
+    for (int j = 0; j < width; j++) {
+      for (int k = 0; k < channelCount; k++) {
+        delete[](float *) data[k][i][j];
+      }
+    }
+  }
+}
+
+static void readFileSingle(IStream& is, uint64_t width, uint64_t height) {
+  DeepScanLineInputFile *file = NULL;
+  try {
+    Header header(width, height);
+    file = new DeepScanLineInputFile(header, &is, EXR_VERSION, 0);
+  } catch (...) {
+    return;
+  }
+
+  try {
+    readFile(file);
+  } catch (...) {
+  }
+
+  delete file;
+}
+
+static void readFileMulti(IStream& is) {
+  MultiPartInputFile *file = NULL;
+  try {
+    file = new MultiPartInputFile(is, 0);
+  } catch (...) {
+    return;
+  }
+
+  for (int p = 0; p < file->parts(); p++) {
+    DeepScanLineInputPart *inpart = NULL;
+    try {
+      inpart = new DeepScanLineInputPart(*file, p);
+    } catch (...) {
+      continue;
+    }
+    try {
+      readFile(inpart);
+    } catch (...) {
+    }
+    delete inpart;
+  }
+
+  delete file;
+}
+
+}  // namespace
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  if (size < 16) return 0;
+
+  FuzzedDataProvider stream(data, size);
+  uint64_t width = stream.ConsumeIntegral<uint64_t>();
+  uint64_t height = stream.ConsumeIntegral<uint64_t>();
+  std::vector<char> buffer = stream.ConsumeRemainingBytes<char>();
+
+  const std::string s(buffer.data(), buffer.size());
+  StdISStream is;
+  is.str(s);
+
+  readFileSingle(is, width, height);
+  readFileMulti(is);
+  return 0;
+}
diff --git a/projects/openexr/openexr_deeptiles_fuzzer.cc b/projects/openexr/openexr_deeptiles_fuzzer.cc
new file mode 100644
index 0000000..27a79fa
--- /dev/null
+++ b/projects/openexr/openexr_deeptiles_fuzzer.cc
@@ -0,0 +1,176 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <ImfArray.h>
+#include <ImfChannelList.h>
+#include <ImfDeepTiledInputFile.h>
+#include <ImfDeepTiledInputPart.h>
+#include <ImfTiledInputPart.h>
+#include <ImfStdIO.h>
+
+namespace IMF = OPENEXR_IMF_NAMESPACE;
+using namespace IMF;
+using IMATH_NAMESPACE::Box2i;
+
+namespace {
+
+template <typename T>
+static void readFile(T *part) {
+  const Header &fileHeader = part->header();
+
+  Array2D<unsigned int> localSampleCount;
+
+  Box2i dataWindow = fileHeader.dataWindow();
+
+  int height = dataWindow.size().y + 1;
+  int width = dataWindow.size().x + 1;
+
+  localSampleCount.resizeErase(height, width);
+
+  int channelCount = 0;
+  for (ChannelList::ConstIterator i = fileHeader.channels().begin();
+       i != fileHeader.channels().end(); ++i, channelCount++) {
+  }
+
+  Array<Array2D<void *> > data(channelCount);
+
+  for (int i = 0; i < channelCount; i++) {
+    data[i].resizeErase(height, width);
+  }
+
+  DeepFrameBuffer frameBuffer;
+
+  int memOffset = dataWindow.min.x + dataWindow.min.y * width;
+  frameBuffer.insertSampleCountSlice(
+      Slice(IMF::UINT, (char *)(&localSampleCount[0][0] - memOffset),
+            sizeof(unsigned int) * 1, sizeof(unsigned int) * width));
+
+  for (int i = 0; i < channelCount; i++) {
+    std::stringstream ss;
+    ss << i;
+    std::string str = ss.str();
+
+    int sampleSize = sizeof(float);
+
+    int pointerSize = sizeof(char *);
+
+    frameBuffer.insert(
+        str, DeepSlice(IMF::FLOAT, (char *)(&data[i][0][0] - memOffset),
+                       pointerSize * 1, pointerSize * width, sampleSize));
+  }
+
+  part->setFrameBuffer(frameBuffer);
+  for (int ly = 0; ly < part->numYLevels(); ly++) {
+    for (int lx = 0; lx < part->numXLevels(); lx++) {
+      Box2i dataWindowL = part->dataWindowForLevel(lx, ly);
+
+      part->readPixelSampleCounts(0, part->numXTiles(lx) - 1, 0,
+                                  part->numYTiles(ly) - 1, lx, ly);
+
+      for (int i = 0; i < part->numYTiles(ly); i++) {
+        for (int j = 0; j < part->numXTiles(lx); j++) {
+          Box2i box = part->dataWindowForTile(j, i, lx, ly);
+          for (int y = box.min.y; y <= box.max.y; y++)
+            for (int x = box.min.x; x <= box.max.x; x++) {
+              int dwy = y - dataWindowL.min.y;
+              int dwx = x - dataWindowL.min.x;
+
+              for (int k = 0; k < channelCount; k++) {
+                data[k][dwy][dwx] = new float[localSampleCount[dwy][dwx]];
+              }
+            }
+        }
+      }
+
+      try {
+        part->readTiles(0, part->numXTiles(lx) - 1, 0, part->numYTiles(ly) - 1,
+                        lx, ly);
+      } catch (...) {
+      }
+
+      for (int i = 0; i < part->levelHeight(ly); i++) {
+        for (int j = 0; j < part->levelWidth(lx); j++) {
+          for (int k = 0; k < channelCount; k++) {
+            delete[](float *) data[k][i][j];
+          }
+        }
+      }
+    }
+  }
+}
+
+static void readFileSingle(IStream& is) {
+  DeepTiledInputFile *file;
+  try {
+    file = new DeepTiledInputFile(is, 8);
+  } catch (...) {
+    return;
+  }
+
+  try {
+    readFile(file);
+  } catch (...) {
+  }
+
+  delete file;
+}
+
+static void readFileMulti(IStream& is) {
+  MultiPartInputFile *file;
+
+  try {
+    file = new MultiPartInputFile(is, 8);
+  } catch (...) {
+    return;
+  }
+
+  for (int p = 0; p < file->parts(); p++) {
+    DeepTiledInputPart *part;
+    try {
+      part = new DeepTiledInputPart(*file, p);
+    } catch (...) {
+      continue;
+    }
+
+    try {
+      readFile(part);
+    } catch (...) {
+    }
+
+    delete part;
+  }
+
+  delete file;
+}
+
+}  // namespace
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+
+  const std::string s(reinterpret_cast<const char*>(data), size);
+  StdISStream is;
+  is.str(s);
+
+  Header::setMaxImageSize(10000, 10000);
+  readFileSingle(is);
+  readFileMulti(is);
+
+  return 0;
+}
diff --git a/projects/openexr/openexr_exrenvmap_fuzzer.cc b/projects/openexr/openexr_exrenvmap_fuzzer.cc
new file mode 100644
index 0000000..68c6643
--- /dev/null
+++ b/projects/openexr/openexr_exrenvmap_fuzzer.cc
@@ -0,0 +1,92 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <EnvmapImage.h>
+#include <ImfEnvmap.h>
+#include <ImfHeader.h>
+#include <blurImage.h>
+#include <makeCubeMap.h>
+#include <makeLatLongMap.h>
+
+#include <exception>
+#include <iostream>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <string>
+#include <unistd.h>
+
+#include "fuzzer_temp_file.h"
+
+using namespace OPENEXR_IMF_NAMESPACE;
+using namespace std;
+
+static char *buf_to_file(const char *buf, size_t size) {
+  char *name = strdup("/tmp/fuzz-XXXXXX");
+  int fd = mkstemp(name);
+  if (fd < 0) {
+    perror("open");
+    exit(1);
+  }
+  size_t pos = 0;
+  while (pos < size) {
+    int nbytes = write(fd, &buf[pos], size - pos);
+    if (nbytes <= 0) {
+      perror("write");
+      exit(1);
+    }
+    pos += nbytes;
+  }
+  if (close(fd) != 0) {
+    perror("close");
+    exit(1);
+  }
+  return name;
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+
+  FuzzerTemporaryFile tempFile(data, size);
+  const char *filename = tempFile.filename();
+  if (!filename)
+    return 0;
+
+  Envmap overrideInputType = NUM_ENVMAPTYPES;
+  LevelMode levelMode = ONE_LEVEL;
+  LevelRoundingMode roundingMode = ROUND_DOWN;
+  Compression compression = ZIP_COMPRESSION;
+  int mapWidth = 256;
+  int tileWidth = 64;
+  int tileHeight = 64;
+  int numSamples = 5;
+  float filterRadius = 1;
+
+  EnvmapImage image;
+  Header header;
+  RgbaChannels channels;
+
+  try {
+    readInputImage(filename, 0, 0, overrideInputType, false, image, header,
+                   channels);
+
+    makeCubeMap(image, header, channels, "/dev/null", tileWidth, tileHeight,
+                levelMode, roundingMode, compression, mapWidth, filterRadius,
+                numSamples, false);
+  } catch (...) {
+    ;
+  }
+
+  return 0;
+}
diff --git a/projects/openexr/openexr_exrheader_fuzzer.cc b/projects/openexr/openexr_exrheader_fuzzer.cc
new file mode 100644
index 0000000..c771059
--- /dev/null
+++ b/projects/openexr/openexr_exrheader_fuzzer.cc
@@ -0,0 +1,176 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "ImfNamespace.h"
+#include <ImfBoxAttribute.h>
+#include <ImfChannelListAttribute.h>
+#include <ImfChromaticitiesAttribute.h>
+#include <ImfCompressionAttribute.h>
+#include <ImfDoubleAttribute.h>
+#include <ImfEnvmapAttribute.h>
+#include <ImfFloatAttribute.h>
+#include <ImfHeader.h>
+#include <ImfIntAttribute.h>
+#include <ImfKeyCodeAttribute.h>
+#include <ImfLineOrderAttribute.h>
+#include <ImfMatrixAttribute.h>
+#include <ImfMultiPartInputFile.h>
+#include <ImfPreviewImageAttribute.h>
+#include <ImfRationalAttribute.h>
+#include <ImfStdIO.h>
+#include <ImfStringAttribute.h>
+#include <ImfStringVectorAttribute.h>
+#include <ImfTileDescriptionAttribute.h>
+#include <ImfTimeCodeAttribute.h>
+#include <ImfVecAttribute.h>
+#include <ImfVersion.h>
+
+#include <iomanip>
+#include <iostream>
+
+using namespace OPENEXR_IMF_NAMESPACE;
+using namespace std;
+
+void dumpTimeCode(TimeCode tc) {
+  tc.hours();
+  tc.minutes();
+  tc.seconds();
+  tc.frame();
+
+  tc.dropFrame();
+  tc.colorFrame();
+  tc.fieldPhase();
+  tc.bgf0();
+  tc.bgf1();
+  tc.bgf2();
+  tc.userData();
+}
+
+void dumpChannelList(const ChannelList &cl) {
+  for (ChannelList::ConstIterator i = cl.begin(); i != cl.end(); ++i) {
+    i.name();
+    i.channel();
+  }
+}
+
+void dumpInfo(IStream &is) {
+  MultiPartInputFile in(is, 0);
+  int parts = in.parts();
+
+  getVersion(in.version());
+  getFlags(in.version());
+
+  for (int p = 0; p < parts; ++p) {
+    const Header &h = in.header(p);
+
+    if (parts != 1) {
+      in.partComplete(p);
+    }
+
+    for (Header::ConstIterator i = h.begin(); i != h.end(); ++i) {
+      const Attribute *a = &i.attribute();
+      i.name();
+      a->typeName();
+
+      if (const Box2iAttribute *ta = dynamic_cast<const Box2iAttribute *>(a)) {
+        ta->value();
+      }
+
+      else if (const Box2fAttribute *ta =
+                   dynamic_cast<const Box2fAttribute *>(a)) {
+        ta->value();
+      } else if (const ChannelListAttribute *ta =
+                     dynamic_cast<const ChannelListAttribute *>(a)) {
+        dumpChannelList(ta->value());
+      } else if (const ChromaticitiesAttribute *ta =
+                     dynamic_cast<const ChromaticitiesAttribute *>(a)) {
+        ta->value();
+      } else if (const DoubleAttribute *ta =
+                     dynamic_cast<const DoubleAttribute *>(a)) {
+        ta->value();
+      } else if (const FloatAttribute *ta =
+                     dynamic_cast<const FloatAttribute *>(a)) {
+        ta->value();
+      } else if (const IntAttribute *ta =
+                     dynamic_cast<const IntAttribute *>(a)) {
+        ta->value();
+      } else if (const KeyCodeAttribute *ta =
+                     dynamic_cast<const KeyCodeAttribute *>(a)) {
+        ta->value().filmMfcCode();
+        ta->value().filmType();
+        ta->value().prefix();
+        ta->value().count();
+        ta->value().perfOffset();
+        ta->value().perfsPerFrame();
+        ta->value().perfsPerCount();
+      } else if (const M33fAttribute *ta =
+                     dynamic_cast<const M33fAttribute *>(a)) {
+        ta->value();
+      } else if (const M44fAttribute *ta =
+                     dynamic_cast<const M44fAttribute *>(a)) {
+        ta->value();
+      } else if (const PreviewImageAttribute *ta =
+                     dynamic_cast<const PreviewImageAttribute *>(a)) {
+        ta->value().width();
+        ta->value().height();
+      } else if (const StringAttribute *ta =
+                     dynamic_cast<const StringAttribute *>(a)) {
+        ta->value();
+      } else if (const StringVectorAttribute *ta =
+                     dynamic_cast<const StringVectorAttribute *>(a)) {
+        for (StringVector::const_iterator i = ta->value().begin();
+             i != ta->value().end(); ++i) {
+          *i;
+        }
+      } else if (const RationalAttribute *ta =
+                     dynamic_cast<const RationalAttribute *>(a)) {
+        ta->value();
+      } else if (const TileDescriptionAttribute *ta =
+                     dynamic_cast<const TileDescriptionAttribute *>(a)) {
+        ta->value();
+
+      } else if (const TimeCodeAttribute *ta =
+                     dynamic_cast<const TimeCodeAttribute *>(a)) {
+        dumpTimeCode(ta->value());
+      } else if (const V2iAttribute *ta =
+                     dynamic_cast<const V2iAttribute *>(a)) {
+        ta->value();
+      } else if (const V2fAttribute *ta =
+                     dynamic_cast<const V2fAttribute *>(a)) {
+        ta->value();
+      } else if (const V3iAttribute *ta =
+                     dynamic_cast<const V3iAttribute *>(a)) {
+        ta->value();
+      } else if (const V3fAttribute *ta =
+                     dynamic_cast<const V3fAttribute *>(a)) {
+        ta->value();
+      }
+    }
+  }
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+
+  const std::string s(reinterpret_cast<const char *>(data), size);
+  StdISStream is;
+  is.str(s);
+
+  try {
+    dumpInfo(is);
+  } catch (...) {
+    ;
+  }
+
+  return 0;
+}
diff --git a/projects/openexr/openexr_scanlines_fuzzer.cc b/projects/openexr/openexr_scanlines_fuzzer.cc
new file mode 100644
index 0000000..26623a1
--- /dev/null
+++ b/projects/openexr/openexr_scanlines_fuzzer.cc
@@ -0,0 +1,110 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <ImfArray.h>
+#include <ImfInputPart.h>
+#include <ImfMultiPartInputFile.h>
+#include <ImfRgbaFile.h>
+#include <ImfStdIO.h>
+
+using namespace OPENEXR_IMF_INTERNAL_NAMESPACE;
+using IMATH_NAMESPACE::Box2i;
+
+namespace {
+
+static void readSingle(IStream& is) {
+  RgbaInputFile *in = NULL;
+  try {
+    in = new RgbaInputFile(is);
+  } catch (...) {
+    return;
+  }
+
+  try {
+    const Box2i &dw = in->dataWindow();
+
+    int w = dw.max.x - dw.min.x + 1;
+    int dx = dw.min.x;
+
+    if (w > (1 << 24)) return;
+
+    Array<Rgba> pixels(w);
+    in->setFrameBuffer(&pixels[-dx], 1, 0);
+
+    for (int y = dw.min.y; y <= dw.max.y; ++y) in->readPixels(y);
+  } catch (...) {
+  }
+
+  delete in;
+}
+
+static void readMulti(IStream& is) {
+  MultiPartInputFile *file;
+  try {
+    file = new MultiPartInputFile(is);
+  } catch (...) {
+    return;
+  }
+
+  for (int p = 0; p < file->parts(); p++) {
+    InputPart *in;
+    try {
+      in = new InputPart(*file, p);
+    } catch (...) {
+      continue;
+    }
+
+    try {
+      const Box2i &dw = in->header().dataWindow();
+
+      int w = dw.max.x - dw.min.x + 1;
+      int dx = dw.min.x;
+
+      if (w > (1 << 24)) return;
+
+      Array<Rgba> pixels(w);
+      FrameBuffer i;
+      i.insert("R", Slice(HALF, (char *)&(pixels[-dx].r), sizeof(Rgba), 0));
+      i.insert("G", Slice(HALF, (char *)&(pixels[-dx].g), sizeof(Rgba), 0));
+      i.insert("B", Slice(HALF, (char *)&(pixels[-dx].b), sizeof(Rgba), 0));
+      i.insert("A", Slice(HALF, (char *)&(pixels[-dx].a), sizeof(Rgba), 0));
+
+      in->setFrameBuffer(i);
+      for (int y = dw.min.y; y <= dw.max.y; ++y) in->readPixels(y);
+    } catch (...) {
+    }
+
+    delete in;
+  }
+
+  delete file;
+}
+
+}  // namespace
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  const std::string s(reinterpret_cast<const char*>(data), size);
+  StdISStream is;
+  is.str(s);
+
+  readSingle(is);
+  readMulti(is);
+  return 0;
+}
diff --git a/projects/openexr/openexr_tiles_fuzzer.cc b/projects/openexr/openexr_tiles_fuzzer.cc
new file mode 100644
index 0000000..d473021
--- /dev/null
+++ b/projects/openexr/openexr_tiles_fuzzer.cc
@@ -0,0 +1,174 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <ImfArray.h>
+#include <ImfTiledRgbaFile.h>
+
+// Handle the case when the custom namespace is not exposed
+#include <ImfChannelList.h>
+#include <ImfMultiPartInputFile.h>
+#include <ImfMultiPartOutputFile.h>
+#include <ImfPartType.h>
+#include <ImfTiledInputPart.h>
+#include <ImfTiledOutputPart.h>
+#include <OpenEXRConfig.h>
+#include <ImfStdIO.h>
+
+using namespace OPENEXR_IMF_INTERNAL_NAMESPACE;
+using IMATH_NAMESPACE::Box2i;
+
+namespace {
+
+void readImageONE(TiledRgbaInputFile *in, int dwx, int dwy) {
+  try {
+    const Box2i &dw = in->dataWindow();
+
+    int w = dw.max.x - dw.min.x + 1;
+    int h = dw.max.y - dw.min.y + 1;
+
+    Array2D<Rgba> pixels(h, w);
+    in->setFrameBuffer(&pixels[-dwy][-dwx], 1, w);
+    in->readTiles(0, in->numXTiles() - 1, 0, in->numYTiles() - 1);
+  } catch (...) {
+  }
+}
+
+void readImageONE2(IStream& is) {
+  MultiPartInputFile *in;
+  try {
+    in = new MultiPartInputFile(is);
+  } catch (...) {
+    return;
+  }
+
+  TiledInputPart *inpart;
+  try {
+    for (int p = 0; p < in->parts(); p++) {
+      try {
+        inpart = new TiledInputPart(*in, p);
+      } catch (...) {
+        inpart = NULL;
+        continue;
+      }
+
+      const Box2i &dw = inpart->header().dataWindow();
+
+      int w = dw.max.x - dw.min.x + 1;
+      int h = dw.max.y - dw.min.y + 1;
+      int dwx = dw.min.x;
+      int dwy = dw.min.y;
+
+      Array2D<Rgba> pixels(h, w);
+      FrameBuffer i;
+      i.insert("R", Slice(HALF, (char *)&(pixels[-dwy][-dwx].r), sizeof(Rgba),
+                          w * sizeof(Rgba)));
+      i.insert("G", Slice(HALF, (char *)&(pixels[-dwy][-dwx].g), sizeof(Rgba),
+                          w * sizeof(Rgba)));
+      i.insert("B", Slice(HALF, (char *)&(pixels[-dwy][-dwx].b), sizeof(Rgba),
+                          w * sizeof(Rgba)));
+      i.insert("A", Slice(HALF, (char *)&(pixels[-dwy][-dwx].a), sizeof(Rgba),
+                          w * sizeof(Rgba)));
+
+      inpart->setFrameBuffer(i);
+      inpart->readTiles(0, inpart->numXTiles() - 1, 0, inpart->numYTiles() - 1);
+
+      delete inpart;
+      inpart = NULL;
+    }
+  } catch (...) {
+    delete inpart;
+  }
+
+  delete in;
+}
+
+void readImageMIP(TiledRgbaInputFile *in, int dwx, int dwy) {
+  try {
+    int numLevels = in->numLevels();
+    Array<Array2D<Rgba> > levels2(numLevels);
+
+    for (int level = 0; level < numLevels; ++level) {
+      int levelWidth = in->levelWidth(level);
+      int levelHeight = in->levelHeight(level);
+      levels2[level].resizeErase(levelHeight, levelWidth);
+
+      in->setFrameBuffer(&(levels2[level])[-dwy][-dwx], 1, levelWidth);
+      in->readTiles(0, in->numXTiles(level) - 1, 0, in->numYTiles(level) - 1,
+                    level);
+    }
+  } catch (...) {
+  }
+}
+
+void readImageRIP(TiledRgbaInputFile *in, int dwx, int dwy) {
+  try {
+    int numXLevels = in->numXLevels();
+    int numYLevels = in->numYLevels();
+    Array2D<Array2D<Rgba> > levels2(numYLevels, numXLevels);
+
+    for (int ylevel = 0; ylevel < numYLevels; ++ylevel) {
+      for (int xlevel = 0; xlevel < numXLevels; ++xlevel) {
+        int levelWidth = in->levelWidth(xlevel);
+        int levelHeight = in->levelHeight(ylevel);
+        levels2[ylevel][xlevel].resizeErase(levelHeight, levelWidth);
+        in->setFrameBuffer(&(levels2[ylevel][xlevel])[-dwy][-dwx], 1,
+                           levelWidth);
+
+        in->readTiles(0, in->numXTiles(xlevel) - 1, 0,
+                      in->numYTiles(ylevel) - 1, xlevel, ylevel);
+      }
+    }
+  } catch (...) {
+  }
+}
+
+}  // namespace
+
+static void fuzzImage(IStream& is) {
+  Header::setMaxImageSize(10000, 10000);
+  Header::setMaxTileSize(10000, 10000);
+
+  TiledRgbaInputFile *in;
+  try {
+    in = new TiledRgbaInputFile(is);
+  } catch (...) {
+    return;
+  }
+
+  const Box2i &dw = in->dataWindow();
+  int dwx = dw.min.x;
+  int dwy = dw.min.y;
+
+  readImageMIP(in, dwx, dwy);
+  readImageRIP(in, dwx, dwy);
+  readImageONE(in, dwx, dwy);
+  readImageONE2(is);
+
+  delete in;
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  const std::string s(reinterpret_cast<const char*>(data), size);
+  StdISStream is;
+  is.str(s);
+
+  fuzzImage(is);
+  return 0;
+}
diff --git a/projects/openexr/project.yaml b/projects/openexr/project.yaml
new file mode 100644
index 0000000..7f1aa28
--- /dev/null
+++ b/projects/openexr/project.yaml
@@ -0,0 +1,6 @@
+homepage: "https://openexr.com"
+language: c++
+primary_contact: "twodeecoda@gmail.com"
+auto_ccs:
+  - "cbpilm@gmail.com"
+  - "security@openexr.org"
diff --git a/projects/openh264/Dockerfile b/projects/openh264/Dockerfile
index bb34782..f7cc712 100644
--- a/projects/openh264/Dockerfile
+++ b/projects/openh264/Dockerfile
@@ -15,9 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER twsmith@mozilla.com
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
+RUN apt-get update && \
     apt-get install -y libstdc++-5-dev libstdc++-5-dev:i386 nasm subversion
 RUN git clone --depth 1 https://github.com/cisco/openh264.git openh264
 WORKDIR openh264
diff --git a/projects/openjpeg/Dockerfile b/projects/openjpeg/Dockerfile
index 629a5cc..865a7e3 100644
--- a/projects/openjpeg/Dockerfile
+++ b/projects/openjpeg/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER antonin@gmail.com
 RUN apt-get update && apt-get install -y make cmake g++
 RUN git clone --depth 1 https://github.com/uclouvain/openjpeg openjpeg
 # openjpeg-data is used to create a seed corpus
diff --git a/projects/opensc/Dockerfile b/projects/opensc/Dockerfile
index eb8e30e..4393c71 100644
--- a/projects/opensc/Dockerfile
+++ b/projects/opensc/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER frankmorgner@gmail.com
 RUN apt-get update && apt-get install -y pcscd libccid libpcsclite-dev libssl-dev libreadline-dev autoconf automake build-essential docbook-xsl xsltproc libtool pkg-config zlib1g-dev
 RUN git clone --depth 1 --single-branch --branch master https://github.com/OpenSC/OpenSC opensc
 WORKDIR opensc
diff --git a/projects/openssh/Dockerfile b/projects/openssh/Dockerfile
index dad44cd..929d57c 100644
--- a/projects/openssh/Dockerfile
+++ b/projects/openssh/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER djm@mindrot.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN apt-get install -y libz-dev libssl1.0.0 libssl-dev libedit-dev zip
 RUN git clone --depth 1 https://github.com/openssh/openssh-portable openssh
diff --git a/projects/openssl/Dockerfile b/projects/openssl/Dockerfile
index 7dd8360..ae28436 100644
--- a/projects/openssl/Dockerfile
+++ b/projects/openssl/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kurt@roeckx.be
 RUN apt-get update && apt-get install -y make
 RUN git clone --depth 1 https://github.com/openssl/openssl.git
 WORKDIR openssl
diff --git a/projects/openthread/Dockerfile b/projects/openthread/Dockerfile
index 829cadc..e54e7e7 100644
--- a/projects/openthread/Dockerfile
+++ b/projects/openthread/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jonhui@nestlabs.com
 
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://github.com/openthread/openthread
diff --git a/projects/openvswitch/Dockerfile b/projects/openvswitch/Dockerfile
index b7da141..f7c149f 100644
--- a/projects/openvswitch/Dockerfile
+++ b/projects/openvswitch/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER blp@ovn.org
 RUN apt-get update && apt-get install -y make autoconf automake \
     libtool python python3-pip \
     libz-dev libssl-dev libssl1.0.0 wget
diff --git a/projects/opus/Dockerfile b/projects/opus/Dockerfile
index 29f828e..717b882 100644
--- a/projects/opus/Dockerfile
+++ b/projects/opus/Dockerfile
@@ -15,10 +15,10 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER flim@google.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool wget
 
 RUN git clone https://gitlab.xiph.org/xiph/opus.git
 RUN wget https://opus-codec.org/static/testvectors/opus_testvectors.tar.gz
 WORKDIR opus
 COPY build.sh $SRC/
+COPY *.c tests/
diff --git a/projects/opus/build.sh b/projects/opus/build.sh
index ae86054..8500071 100644
--- a/projects/opus/build.sh
+++ b/projects/opus/build.sh
@@ -16,11 +16,15 @@
 ##############################################################################
 set -eu
 
-FUZZERS="opus_decode_fuzzer"
+FUZZERS="opus_decode_fuzzer opus_multi_fuzzer"
 BUILDS=(floating fixed)
 
 tar xvf $SRC/opus_testvectors.tar.gz
 
+if [[ $CFLAGS = *sanitize=memory* ]]; then
+  CFLAGS+=" -D_FORTIFY_SOURCE=0"
+fi
+
 ./autogen.sh
 
 for build in "${BUILDS[@]}"; do
@@ -34,7 +38,6 @@
   esac
 
   ./configure $extra_args --enable-static --disable-shared --disable-doc
-  make clean
   make -j$(nproc)
 
   # Build all fuzzers
@@ -42,6 +45,7 @@
     $CC $CFLAGS -c -Iinclude \
       tests/$fuzzer.c \
       -o $fuzzer.o
+
     $CXX $CXXFLAGS \
       $fuzzer.o \
       -o $OUT/${fuzzer}_${build} \
@@ -49,7 +53,8 @@
 
     # Setup the .options and test corpus zip files using the corresponding
     # fuzzer's name
-    cp tests/$fuzzer.options $OUT/${fuzzer}_${build}.options
+    [ -f tests/$fuzzer.options ] \
+        && cp tests/$fuzzer.options $OUT/${fuzzer}_${build}.options
     zip -r $OUT/${fuzzer}_${build}_seed_corpus.zip opus_testvectors/
   done
 done
diff --git a/projects/opus/opus_multi_fuzzer.c b/projects/opus/opus_multi_fuzzer.c
new file mode 100644
index 0000000..de63bfb
--- /dev/null
+++ b/projects/opus/opus_multi_fuzzer.c
@@ -0,0 +1,99 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <stddef.h>
+#include <stdlib.h>
+
+#include "opus.h"
+#include "opus_multistream.h"
+
+struct TocInfo {
+  opus_int32 frequency;  // in [Hz*1000]
+  int channels;          // number of channels; either 1 or 2
+  int frame_len_x2;      // in [ms*2]. x2 is to avoid float value of 2.5 ms
+};
+
+void extractTocInfo(const uint8_t toc, struct TocInfo *const info) {
+  const int frame_lengths_x2[3][4] = {
+    {20, 40, 80, 120},
+    {20, 40, 20, 40},
+    {5, 10, 20, 40}
+  };
+
+  info->channels = toc & 4 ? 2 : 1;
+
+  const uint8_t config = toc >> 3;
+
+  int len_index;
+  if (config < 12) {
+    len_index = 0;
+  } else if (config < 16) {
+    len_index = 1;
+  } else {
+    len_index = 2;
+  }
+  info->frame_len_x2 = frame_lengths_x2[len_index][config & 3];
+
+  switch (config >> 2) {
+    case 0: info->frequency = 8; break;
+    case 1: info->frequency = 12; break;
+    case 2: info->frequency = 16; break;
+    case 3: info->frequency = (config < 14) ? 24 : 48; break;
+    case 4: info->frequency = 8; break;
+    case 5: info->frequency = 16; break;
+    case 6: info->frequency = 24; break;
+    default: info->frequency = 48; break;
+  }
+}
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  if (size < 3 || size > 1000000) return 0;
+
+  // Using last byte as a number of streams (instead of rand_r). Each stream
+  // should be at least 3 bytes long hence divmod.
+  int streams = 1 + data[size - 1] % (size / 3);
+  if (streams > 255) streams = 255;
+  unsigned char *mapping = (unsigned char*) malloc(sizeof(unsigned char)*streams);
+  if (!mapping) return 0;
+
+  for (int i = 0; i < streams; ++i) {
+    mapping[i] = i;
+  }
+
+  struct TocInfo info;
+  extractTocInfo(*data, &info);
+
+  int error = 0;
+  OpusMSDecoder *const decoder = opus_multistream_decoder_create(
+      info.frequency * 1000, streams, streams, 0, mapping, &error);
+
+  if (!decoder || error) return 0;
+
+  const int frame_size = (info.frequency * info.frame_len_x2) / 2;
+  opus_int16 *pcm = (opus_int16*) malloc(sizeof(opus_int16)*frame_size*streams);
+  if (!pcm) goto exit;
+
+  // opus_decode wants us to use its return value, but we don't really care.
+  const int foo =
+      opus_multistream_decode(decoder, data, size, pcm, frame_size, 0);
+  (void)foo;
+
+  opus_multistream_decoder_destroy(decoder);
+
+  free(pcm);
+
+exit:
+  free(mapping);
+  return 0;
+}
diff --git a/projects/opusfile/Dockerfile b/projects/opusfile/Dockerfile
new file mode 100644
index 0000000..452f301
--- /dev/null
+++ b/projects/opusfile/Dockerfile
@@ -0,0 +1,21 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y autoconf automake git libogg0 libogg-dev libopus0 libopus-dev libssl-dev libtool make pkg-config
+RUN git clone --depth 1 https://gitlab.xiph.org/xiph/opusfile
+WORKDIR opusfile
+COPY build.sh *.c $SRC/
diff --git a/projects/opusfile/build.sh b/projects/opusfile/build.sh
new file mode 100755
index 0000000..b850c8b
--- /dev/null
+++ b/projects/opusfile/build.sh
@@ -0,0 +1,34 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+./autogen.sh
+./configure --enable-static --disable-shared --disable-doc
+make -j$(nproc)
+ldconfig
+
+for fuzzer in $SRC/*_fuzzer.c; do
+  fuzzer_basename=$(basename -s .c $fuzzer)
+
+  $CC $CFLAGS -c \
+      -I $SRC -I /usr/include/opus -I /usr/include/ogg \
+      $fuzzer -o ${fuzzer_basename}.o
+
+  $CXX $CXXFLAGS \
+      ${fuzzer_basename}.o \
+      -o $OUT/${fuzzer_basename} $LIB_FUZZING_ENGINE \
+      $SRC/opusfile/.libs/libopusfile.a -l:libopus.a -l:libogg.a
+done
diff --git a/projects/opusfile/opusfile_fuzzer.c b/projects/opusfile/opusfile_fuzzer.c
new file mode 100644
index 0000000..db162aa
--- /dev/null
+++ b/projects/opusfile/opusfile_fuzzer.c
@@ -0,0 +1,107 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <errno.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "opusfile/config.h"
+#include "opusfile/include/opusfile.h"
+
+// Opusfile fuzzing wrapper to help with automated fuzz testing. It's based on
+// https://github.com/xiph/opusfile/blob/master/examples/opusfile_example.c
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  int ret, tmp;
+  OggOpusFile *of = op_open_memory(data, size, &ret);
+  if (!of)
+    return 0;
+
+  op_link_count(of);
+
+  int link_index = -1;
+  op_pcm_total(of, link_index);
+  op_raw_total(of, link_index);
+  op_pcm_tell(of);
+  op_raw_tell(of);
+
+  ogg_int64_t total_sample_count = 0;
+  const int pcm_size = 120 * 48 * 2; // 120ms/ch@48kHz is recommended
+  opus_int16 pcm[pcm_size];
+  for (;;) {
+    ret = op_read_stereo(of, pcm, pcm_size);
+    if (ret < 0) {
+      break;
+    }
+
+    if (op_current_link(of) != link_index) {
+      link_index = op_current_link(of);
+      op_pcm_total(of, link_index);
+      op_raw_total(of, link_index);
+      op_pcm_tell(of);
+      op_raw_tell(of);
+      op_bitrate_instant(of);
+      tmp = op_head(of, link_index)->version;
+
+      const OpusTags *tags = op_tags(of, link_index);
+      for (int i = 0; i < tags->comments; ++i) {
+        // Note: The compare also touches memory allocated for user_comments[i].
+        // This is a desired side effect and should be kept even if this
+        // comparison is removed.
+        if (opus_tagncompare("METADATA_BLOCK_PICTURE", 22,
+                             tags->user_comments[i]) == 0) {
+          OpusPictureTag pic;
+          if (opus_picture_tag_parse(&pic, tags->user_comments[i]) >= 0) {
+            opus_picture_tag_clear(&pic);
+          }
+        }
+      }
+
+      if (tags->vendor) {
+        tmp = tags->vendor[0];
+      }
+
+      int binary_suffix_len;
+      opus_tags_get_binary_suffix(tags, &binary_suffix_len);
+    }
+
+    if (ret == 0) {
+      break;
+    }
+
+    total_sample_count += ret;
+  }
+
+  if (total_sample_count > 0) {
+    // Try random-access PCM reads. The number of tests is arbitrary and the
+    // offset is designed to be pseudo-random, but deterministic - this is
+    // implemented using Lehmer RNG with a minor hack that probably breaks some
+    // properties of the RNG (but that is acceptable).
+    ogg_int64_t rng_seed = 1307832949LL;
+    for (int i = 0; i < 32; ++i) {
+      // Derive the next deterministic offset to test and iterate the RNG.
+      rng_seed = (rng_seed * 279470273LL);
+      const ogg_int64_t offset = rng_seed % total_sample_count;
+      rng_seed = rng_seed % 4294967291LL;
+
+      if (op_pcm_seek(of, offset) == 0) {
+        tmp = op_read_stereo(of, pcm, pcm_size);
+      }
+    }
+  }
+
+  op_free(of);
+  return 0;
+}
diff --git a/projects/opusfile/project.yaml b/projects/opusfile/project.yaml
new file mode 100644
index 0000000..604d127
--- /dev/null
+++ b/projects/opusfile/project.yaml
@@ -0,0 +1,3 @@
+homepage: "https://opus-codec.org/"
+language: c
+primary_contact: "jmvalin@jmvalin.ca"
diff --git a/projects/osquery/Dockerfile b/projects/osquery/Dockerfile
index 58e73df..c1c8ff5 100755
--- a/projects/osquery/Dockerfile
+++ b/projects/osquery/Dockerfile
@@ -15,27 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER theopolis@osquery.io
 RUN apt-get update
 RUN apt-get install -y --no-install-recommends python python3 bison flex make wget xz-utils libunwind-dev
 
-# Install specific git version.
-RUN export GIT_VER=2.21.0 \
- && apt-get install -y libz-dev gettext nano libssl-dev autoconf libcurl4-openssl-dev \
- && wget https://github.com/git/git/archive/v$GIT_VER.tar.gz \
- && tar xf v$GIT_VER.tar.gz \
- && cd git-$GIT_VER/ \
- && make configure \
- && ./configure --with-openssl \
- && make -j4 install \
- && cd .. \
- && rm -rf v$GIT_VER.tar.gz git-$GIT_VER
-
-# Installer newer cmake
-RUN wget -q https://github.com/Kitware/CMake/releases/download/v3.14.6/cmake-3.14.6-Linux-x86_64.tar.gz \
- && tar xf cmake-3.14.6-Linux-x86_64.tar.gz -C /usr/local --strip 1 \
- && rm cmake-3.14.6-Linux-x86_64.tar.gz
-
 RUN git clone --depth 1 https://github.com/osquery/osquery osquery
 
 WORKDIR osquery
diff --git a/projects/ots/Dockerfile b/projects/ots/Dockerfile
index d86342c..c4485fc 100644
--- a/projects/ots/Dockerfile
+++ b/projects/ots/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mmoroz@chromium.org
 RUN apt-get update && apt-get install -y python3-pip pkg-config zlib1g-dev && \
     pip3 install meson==0.52.0 ninja
 RUN git clone --depth 1 https://github.com/khaledhosny/ots.git
diff --git a/projects/ots/build.sh b/projects/ots/build.sh
index 27ead8f..8627188 100755
--- a/projects/ots/build.sh
+++ b/projects/ots/build.sh
@@ -23,7 +23,8 @@
 mkdir -p $build
 
 # Configure the project.
-meson -Dfuzzer_ldflags=$LIB_FUZZING_ENGINE \
+meson -Dfuzzer_ldflags="$(echo $LIB_FUZZING_ENGINE)" \
+      --wrap-mode=forcefallback \
       $build \
    || (cat build/meson-logs/meson-log.txt && false)
 
diff --git a/projects/ots/project.yaml b/projects/ots/project.yaml
index 5812daf..2512999 100644
--- a/projects/ots/project.yaml
+++ b/projects/ots/project.yaml
@@ -8,3 +8,15 @@
   - "jmuizelaar@mozilla.com"
   - "lsalzman@mozilla.com"
   - "twsmith@mozilla.com"
+fuzzing_engines:
+  - libfuzzer
+  - afl
+  - honggfuzz
+  - dataflow
+sanitizers:
+  - address
+  - undefined
+  - memory
+architectures:
+  - x86_64
+  - i386
diff --git a/projects/p9/Dockerfile b/projects/p9/Dockerfile
new file mode 100644
index 0000000..fbbe65a
--- /dev/null
+++ b/projects/p9/Dockerfile
@@ -0,0 +1,24 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+MAINTAINER s@sevki.org
+
+RUN go get -v -u github.com/hugelgupf/p9/...
+
+WORKDIR /root/go/src/github.com/hugelgupf/p9
+
+COPY build.sh $SRC/
diff --git a/projects/p9/build.sh b/projects/p9/build.sh
new file mode 100644
index 0000000..34a0eac
--- /dev/null
+++ b/projects/p9/build.sh
@@ -0,0 +1,29 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+function compile_fuzzer {
+  path=$1
+  function=$2
+  fuzzer=$3
+
+  # Compile and instrument all Go files relevant to this fuzz target.
+  go-fuzz -func $function -o $fuzzer.a $path
+
+  # Link Go code ($fuzzer.a) with fuzzing engine to produce fuzz target binary.
+  $CXX $CXXFLAGS $LIB_FUZZING_ENGINE $fuzzer.a -o $OUT/$fuzzer
+}
+
+compile_fuzzer github.com/hugelgupf/p9/p9 Fuzz p9_fuzzer
diff --git a/projects/p9/project.yaml b/projects/p9/project.yaml
new file mode 100644
index 0000000..053319a
--- /dev/null
+++ b/projects/p9/project.yaml
@@ -0,0 +1,10 @@
+homepage: "https://github.com/hugelgupf/p9"
+language: go
+primary_contact: "harvey@googlegroups.com"
+auto_ccs:
+  - "s@sevki.org"
+  - "c@chrisko.ch"
+fuzzing_engines:
+- libfuzzer
+sanitizers:
+- address
diff --git a/projects/pcapplusplus/Dockerfile b/projects/pcapplusplus/Dockerfile
index c015f2b..8d93b53 100644
--- a/projects/pcapplusplus/Dockerfile
+++ b/projects/pcapplusplus/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER zlowram@gmail.com
 
 RUN apt-get update && apt-get install -y gcc g++ make cmake flex bison
 RUN git clone https://github.com/seladb/PcapPlusPlus PcapPlusPlus
diff --git a/projects/pcre2/Dockerfile b/projects/pcre2/Dockerfile
index 72e8a34..a979103 100644
--- a/projects/pcre2/Dockerfile
+++ b/projects/pcre2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kcc@google.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool subversion
 
 RUN svn co svn://vcs.exim.org/pcre2/code/trunk pcre2
diff --git a/projects/perfetto/Dockerfile b/projects/perfetto/Dockerfile
index d733a95..1ab2c35 100644
--- a/projects/perfetto/Dockerfile
+++ b/projects/perfetto/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER fmayer@google.com
 
 RUN apt-get update
 RUN apt-get -y install python curl
diff --git a/projects/pffft/Dockerfile b/projects/pffft/Dockerfile
index 61e69f1..d7ce13a 100644
--- a/projects/pffft/Dockerfile
+++ b/projects/pffft/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER alessiob@webrtc.org
 RUN apt-get update && apt-get install -y mercurial python-numpy
 RUN hg clone https://bitbucket.org/jpommier/pffft $SRC/pffft
 WORKDIR pffft
diff --git a/projects/php/Dockerfile b/projects/php/Dockerfile
index 2a391d5..a2cb115 100644
--- a/projects/php/Dockerfile
+++ b/projects/php/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER stas@php.net
 RUN apt-get update && \
     apt-get install -y autoconf automake libtool bison re2c pkg-config
 RUN git clone --depth 1 --branch master https://github.com/php/php-src.git php-src
diff --git a/projects/php/build.sh b/projects/php/build.sh
index 3c007e8..fd11356 100755
--- a/projects/php/build.sh
+++ b/projects/php/build.sh
@@ -42,17 +42,20 @@
     --with-pic
 make -j$(nproc)
 
-# Generate dictionary for unserialize fuzzer
-sapi/cli/php sapi/fuzzer/generate_unserialize_dict.php
+# Generate corpuses and dictionaries.
+sapi/cli/php sapi/fuzzer/generate_all.php
+
+# Copy dictionaries to expected locations.
 cp sapi/fuzzer/dict/unserialize $OUT/php-fuzz-unserialize.dict
-
-# Generate initial corpus for parser fuzzer
-sapi/cli/php sapi/fuzzer/generate_parser_corpus.php
 cp sapi/fuzzer/dict/parser $OUT/php-fuzz-parser.dict
-
 cp sapi/fuzzer/json.dict $OUT/php-fuzz-json.dict
 
-FUZZERS="php-fuzz-json php-fuzz-exif php-fuzz-mbstring php-fuzz-unserialize php-fuzz-parser"
+FUZZERS="php-fuzz-json
+php-fuzz-exif
+php-fuzz-mbstring
+php-fuzz-unserialize
+php-fuzz-unserializehash
+php-fuzz-parser"
 for fuzzerName in $FUZZERS; do
 	cp sapi/fuzzer/$fuzzerName $OUT/
 done
diff --git a/projects/picotls/Dockerfile b/projects/picotls/Dockerfile
index e645633..5d7dcc9 100644
--- a/projects/picotls/Dockerfile
+++ b/projects/picotls/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jonathan.foote@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool cmake pkg-config libssl-dev
 RUN git clone https://github.com/h2o/picotls
 WORKDIR picotls
diff --git a/projects/piex/Dockerfile b/projects/piex/Dockerfile
index 9adb45d..13824b1 100644
--- a/projects/piex/Dockerfile
+++ b/projects/piex/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone https://github.com/guidovranken/piex.git piex
 WORKDIR piex
diff --git a/projects/pigweed/Dockerfile b/projects/pigweed/Dockerfile
index b41594e..fd1d270 100644
--- a/projects/pigweed/Dockerfile
+++ b/projects/pigweed/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER keir@google.com
 RUN apt-get update && apt-get install -y git build-essential python
 
 RUN git clone 'https://chromium.googlesource.com/chromium/tools/depot_tools.git' --depth 1
diff --git a/projects/pillow/Dockerfile b/projects/pillow/Dockerfile
index aa67d85..33e811c 100644
--- a/projects/pillow/Dockerfile
+++ b/projects/pillow/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake build-essential libbz2-dev libc6-dev libffi-dev libfreetype6-dev libgdbm-dev libjpeg-turbo8-dev liblcms2-dev libncursesw5-dev libreadline-dev libsqlite3-dev libssl-dev libtiff5-dev libtool libwebp-dev make python python-dev python-setuptools tk-dev wget zlib1g-dev libwebp-dev
 RUN wget https://github.com/python/cpython/archive/v3.8.1.tar.gz
 RUN git clone --depth 1 https://github.com/python-pillow/Pillow.git pillow
diff --git a/projects/poppler/Dockerfile b/projects/poppler/Dockerfile
index 6ae7c2c..863cb40 100644
--- a/projects/poppler/Dockerfile
+++ b/projects/poppler/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jonathan@titanous.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config cmake
 RUN git clone --depth 1 https://anongit.freedesktop.org/git/poppler/poppler.git
 RUN git clone --depth 1 git://git.sv.nongnu.org/freetype/freetype2.git
diff --git a/projects/postgis/Dockerfile b/projects/postgis/Dockerfile
index fdab216..67b7a69 100644
--- a/projects/postgis/Dockerfile
+++ b/projects/postgis/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER lr@pcorp.us
 RUN echo deb http://archive.ubuntu.com/ubuntu/ bionic main restricted universe multiverse >> /etc/apt/sources.list
 RUN apt-get update && apt-get install -y make autoconf automake libtool g++ postgresql-server-dev-10 libgeos-dev libproj-dev libxml2-dev pkg-config libjson-c-dev
 RUN git clone --depth 1 https://git.osgeo.org/gitea/postgis/postgis.git postgis
diff --git a/projects/postgresql/Dockerfile b/projects/postgresql/Dockerfile
new file mode 100644
index 0000000..c0e0003
--- /dev/null
+++ b/projects/postgresql/Dockerfile
@@ -0,0 +1,25 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+
+RUN apt-get update && apt-get install -y make libreadline-dev zlib1g-dev bison flex
+
+RUN git clone git://git.postgresql.org/git/postgresql.git
+
+WORKDIR postgresql
+COPY fuzzer $SRC/fuzzer
+COPY add_fuzzers.diff build.sh $SRC/
diff --git a/projects/postgresql/add_fuzzers.diff b/projects/postgresql/add_fuzzers.diff
new file mode 100644
index 0000000..8d7a274
--- /dev/null
+++ b/projects/postgresql/add_fuzzers.diff
@@ -0,0 +1,38 @@
+diff --git a/src/backend/Makefile b/src/backend/Makefile
+index 9706a95848..4312c346a4 100644
+--- a/src/backend/Makefile
++++ b/src/backend/Makefile
+@@ -43,6 +43,8 @@ OBJS = \
+ 	$(top_builddir)/src/common/libpgcommon_srv.a \
+ 	$(top_builddir)/src/port/libpgport_srv.a
+ 
++OBJS_WITHOUT_MAIN = $(filter-out main/objfiles.txt, $(OBJS))
++
+ # We put libpgport and libpgcommon into OBJS, so remove it from LIBS; also add
+ # libldap and ICU
+ LIBS := $(filter-out -lpgport -lpgcommon, $(LIBS)) $(LDAP_LIBS_BE) $(ICU_LIBS)
+@@ -56,7 +58,10 @@ endif
+ 
+ ##########################################################################
+ 
+-all: submake-libpgport submake-catalog-headers submake-utils-headers postgres $(POSTGRES_IMP)
++all: submake-libpgport submake-catalog-headers submake-utils-headers postgres fuzzer $(POSTGRES_IMP)
++
++fuzzer: fuzzer/simple_query_fuzzer \
++	fuzzer/json_parser_fuzzer
+ 
+ ifneq ($(PORTNAME), cygwin)
+ ifneq ($(PORTNAME), win32)
+@@ -65,6 +70,12 @@ ifneq ($(PORTNAME), aix)
+ postgres: $(OBJS)
+ 	$(CC) $(CFLAGS) $(call expand_subsys,$^) $(LDFLAGS) $(LDFLAGS_EX) $(export_dynamic) $(LIBS) -o $@
+ 
++fuzzer/json_parser_fuzzer: fuzzer/json_parser_fuzzer.o $(OBJS_WITHOUT_MAIN)
++	$(CXX) $(CFLAGS) $(call expand_subsys,$^) -o $@ $(LIB_FUZZING_ENGINE)
++
++fuzzer/simple_query_fuzzer: fuzzer/simple_query_fuzzer.o $(OBJS_WITHOUT_MAIN)
++	$(CXX) $(CFLAGS) $(call expand_subsys,$^) -o $@ $(LIB_FUZZING_ENGINE)
++
+ endif
+ endif
+ endif
diff --git a/projects/postgresql/build.sh b/projects/postgresql/build.sh
new file mode 100644
index 0000000..9dec178
--- /dev/null
+++ b/projects/postgresql/build.sh
@@ -0,0 +1,25 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+git apply ../add_fuzzers.diff
+cp -r $SRC/fuzzer src/backend/
+mkdir bld
+cd bld
+
+../configure --prefix /usr/local/
+make -j$(nproc)
+
+cp src/backend/fuzzer/*_fuzzer $OUT/
diff --git a/projects/postgresql/fuzzer/Makefile b/projects/postgresql/fuzzer/Makefile
new file mode 100644
index 0000000..ee40efa
--- /dev/null
+++ b/projects/postgresql/fuzzer/Makefile
@@ -0,0 +1,18 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for the fuzzer module
+#
+# src/backend/fuzzer/Makefile
+#
+#-------------------------------------------------------------------------
+
+subdir = src/backend/fuzzer
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+OBJS = \
+	json_parser_fuzzer.o \
+	simple_query_fuzzer.o
+
+include $(top_srcdir)/src/backend/common.mk
+
diff --git a/projects/postgresql/fuzzer/json_parser_fuzzer.c b/projects/postgresql/fuzzer/json_parser_fuzzer.c
new file mode 100644
index 0000000..244e469
--- /dev/null
+++ b/projects/postgresql/fuzzer/json_parser_fuzzer.c
@@ -0,0 +1,46 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "postgres.h"
+#include "common/jsonapi.h"
+#include "mb/pg_wchar.h"
+#include "utils/memutils.h"
+#include "utils/memdebug.h"
+
+const char *progname = "progname";
+
+/*
+** Main entry point.  The fuzzer invokes this function with each
+** fuzzed input.
+*/
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+	MemoryContextInit();
+	sigjmp_buf local_sigjmp_buf;
+	char *buffer = (char *) calloc(size+1, sizeof(char));
+	memcpy(buffer, data, size);
+	JsonSemAction sem = nullSemAction;
+	JsonLexContext *lex = makeJsonLexContextCstringLen(buffer, size+1, PG_UTF8, true);
+	if(!sigsetjmp(local_sigjmp_buf,0)){
+		error_context_stack = NULL;
+		PG_exception_stack = &local_sigjmp_buf;
+		pg_parse_json(lex, &sem);
+	}
+	free(buffer);
+	FlushErrorState();
+	MemoryContextReset(TopMemoryContext);
+	TopMemoryContext->ident = NULL;
+	TopMemoryContext->methods->delete_context(TopMemoryContext);
+	VALGRIND_DESTROY_MEMPOOL(TopMemoryContext);
+	return 0;
+}
diff --git a/projects/postgresql/fuzzer/simple_query_fuzzer.c b/projects/postgresql/fuzzer/simple_query_fuzzer.c
new file mode 100644
index 0000000..64f3550
--- /dev/null
+++ b/projects/postgresql/fuzzer/simple_query_fuzzer.c
@@ -0,0 +1,123 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "postgres.h"
+#include "parser/gramparse.h"
+#include "parser/parser.h"
+#include "parser/analyze.h"
+#include "utils/memutils.h"
+#include "utils/memdebug.h"
+#include "rewrite/rewriteHandler.h"
+#include "optimizer/optimizer.h"
+#include "utils/snapmgr.h"
+#include "nodes/params.h"
+#include "nodes/plannodes.h"
+#include "nodes/pg_list.h"
+
+const char *progname = "progname";
+
+List *plan_queries(List *querytrees, const char *query_string, int cursorOptions,
+                 ParamListInfo boundParams) {
+     List       *stmt_list = NIL;
+     ListCell   *query_list;
+ 
+     foreach(query_list, querytrees) {
+         Query      *query = lfirst_node(Query, query_list);
+         PlannedStmt *stmt;
+
+		 if (query->commandType == CMD_UTILITY) {
+             stmt = makeNode(PlannedStmt);
+             stmt->commandType = CMD_UTILITY;
+             stmt->canSetTag = query->canSetTag;
+             stmt->utilityStmt = query->utilityStmt;
+             stmt->stmt_location = query->stmt_location;
+             stmt->stmt_len = query->stmt_len;
+         } else {
+			 stmt = planner(query, query_string, cursorOptions,
+							boundParams);
+		 }
+ 
+		 stmt_list = lappend(stmt_list, stmt);
+     }
+ 
+     return stmt_list;
+ }
+
+
+/*
+** Main entry point.  The fuzzer invokes this function with each
+** fuzzed input.
+*/
+int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+	char* query_string;
+	sigjmp_buf local_sigjmp_buf;
+	List       *parsetree_list;
+	ListCell   *parsetree_item;
+
+   	MemoryContextInit();
+ 	query_string = (char*) calloc( (size+1), sizeof(char) );
+	memcpy(query_string, data, size);
+	MessageContext = AllocSetContextCreate(TopMemoryContext,
+                                            "MessageContext",
+                                            ALLOCSET_DEFAULT_SIZES);
+
+	if(!sigsetjmp(local_sigjmp_buf,0)){
+		MemoryContext oldcontext;
+
+		error_context_stack = NULL;
+		PG_exception_stack = &local_sigjmp_buf;
+
+		oldcontext = MemoryContextSwitchTo(MessageContext);
+		parsetree_list = raw_parser(query_string);
+		MemoryContextSwitchTo(oldcontext);
+		
+		foreach(parsetree_item, parsetree_list) {
+			RawStmt    *parsetree = lfirst_node(RawStmt, parsetree_item);
+			MemoryContext per_parsetree_context = NULL;
+			List       *querytree_list;
+			Query *query;
+
+			if (analyze_requires_snapshot(parsetree)){
+				PushActiveSnapshot(GetTransactionSnapshot());
+			}
+			if (lnext(parsetree_list, parsetree_item) != NULL){
+				per_parsetree_context =
+					AllocSetContextCreate(MessageContext,
+										  "per-parsetree message context",
+										  ALLOCSET_DEFAULT_SIZES);
+				MemoryContextSwitchTo(per_parsetree_context);
+			} else {
+				MemoryContextSwitchTo(MessageContext);
+			}
+			query = parse_analyze(parsetree, query_string, NULL, 0, NULL);
+			if (query->commandType == CMD_UTILITY) {
+				querytree_list = list_make1(query);
+			} else {
+				querytree_list = QueryRewrite(query);
+			}
+ 			plan_queries(querytree_list, query_string, CURSOR_OPT_PARALLEL_OK, NULL);
+ 			if (per_parsetree_context){
+				MemoryContextDelete(per_parsetree_context);
+			}
+		}
+	}
+	
+	free(query_string);
+	FlushErrorState();
+	MemoryContextReset(TopMemoryContext);
+	TopMemoryContext->ident = NULL;
+	TopMemoryContext->methods->delete_context(TopMemoryContext);
+	VALGRIND_DESTROY_MEMPOOL(TopMemoryContext);
+	return 0;
+}
diff --git a/projects/postgresql/project.yaml b/projects/postgresql/project.yaml
index 6f35108..d2ff7f5 100644
--- a/projects/postgresql/project.yaml
+++ b/projects/postgresql/project.yaml
@@ -1,2 +1,12 @@
 homepage: "https://postgresql.org"
 primary_contact: "sfrost@snowman.net"
+language: c
+auto_ccs :
+  - "ouyangyunshu@google.com"
+  - "frost.stephen.p@gmail.com"
+fuzzing_engines:
+  - libfuzzer
+  - honggfuzz
+sanitizers:
+  - address
+  - undefined
diff --git a/projects/powerdns/Dockerfile b/projects/powerdns/Dockerfile
index 8307ace..d48093c 100644
--- a/projects/powerdns/Dockerfile
+++ b/projects/powerdns/Dockerfile
@@ -18,7 +18,6 @@
 FROM gcr.io/oss-fuzz-base/base-builder
 
 # maintainer for this file
-MAINTAINER remi.gacogne@powerdns.com
 
 # install required packages to build your project
 RUN apt-get update && apt-get install -y autoconf automake bison dh-autoreconf flex libboost-all-dev libluajit-5.1-dev libedit-dev libprotobuf-dev libssl-dev libtool make pkg-config protobuf-compiler ragel
diff --git a/projects/proj4/Dockerfile b/projects/proj4/Dockerfile
index 6e9ca2c..8d97906 100644
--- a/projects/proj4/Dockerfile
+++ b/projects/proj4/Dockerfile
@@ -15,9 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER even.rouault@spatialys.com
-RUN dpkg --add-architecture i386 && \
-    apt-get update && \
+RUN apt-get update && \
     apt-get install -y make autoconf automake libtool g++ sqlite3 pkg-config
 
 RUN git clone --depth 1 https://github.com/OSGeo/proj proj
diff --git a/projects/prometheus/Dockerfile b/projects/prometheus/Dockerfile
index 0d2326b..d856df0 100644
--- a/projects/prometheus/Dockerfile
+++ b/projects/prometheus/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER julius.volz@gmail.com
 RUN go get github.com/prometheus/prometheus/cmd/...
 COPY build.sh $SRC/
 RUN mkdir $SRC/prometheus/
diff --git a/projects/proxygen/Dockerfile b/projects/proxygen/Dockerfile
index d1f7155..bf3ddd7 100644
--- a/projects/proxygen/Dockerfile
+++ b/projects/proxygen/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mhl@fb.com
 
 # Install packages we need to build dependencies
 RUN apt-get update && \
@@ -31,20 +30,6 @@
     python \
     python-dev
 
-# We need a newer version of CMake than is available in the base builder image
-RUN wget https://github.com/Kitware/CMake/releases/download/v3.15.2/cmake-3.15.2.tar.gz && \
-    tar xzf cmake-3.15.2.tar.gz && \
-    cd cmake-3.15.2 && \
-    export CC=clang && \
-    export CXX=clang++ && \
-    CXXFLAGS="" && \
-    CFLAGS="" && \
-    ./bootstrap && \
-    make -j$(nproc) && \
-    make install && \
-    cd .. && \
-    rm -rf cmake-3.15.2
-
 # Install and build boost from source so we can have it use libc++
 RUN wget https://sourceforge.net/projects/boost/files/boost/1.70.0/boost_1_70_0.tar.gz && \
     tar xzf boost_1_70_0.tar.gz && \
diff --git a/projects/python3-libraries/Dockerfile b/projects/python3-libraries/Dockerfile
index 76467e2..3da576e 100644
--- a/projects/python3-libraries/Dockerfile
+++ b/projects/python3-libraries/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get install -y build-essential libncursesw5-dev libreadline-dev libssl-dev libgdbm-dev libc6-dev libsqlite3-dev tk-dev libbz2-dev zlib1g-dev libffi-dev
 RUN git clone https://github.com/python/cpython.git cpython
 RUN git clone --depth 1 https://github.com/guidovranken/python-library-fuzzers.git
diff --git a/projects/qcms/Dockerfile b/projects/qcms/Dockerfile
index 3f66e5d..c124a14 100644
--- a/projects/qcms/Dockerfile
+++ b/projects/qcms/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER pdknsk@gmail.com
 RUN apt-get update && apt-get install -y mercurial
 RUN hg clone --uncompressed https://hg.mozilla.org/mozilla-central/
 COPY build.sh $SRC/
diff --git a/projects/qemu/Dockerfile b/projects/qemu/Dockerfile
new file mode 100644
index 0000000..4ad57b9
--- /dev/null
+++ b/projects/qemu/Dockerfile
@@ -0,0 +1,21 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y make autoconf automake libtool libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev patchelf
+RUN git clone --depth 1 https://git.qemu.org/git/qemu.git qemu
+WORKDIR qemu
+RUN cp scripts/oss-fuzz/build.sh $SRC
diff --git a/projects/qemu/project.yaml b/projects/qemu/project.yaml
index 06620e1..469221a 100644
--- a/projects/qemu/project.yaml
+++ b/projects/qemu/project.yaml
@@ -9,6 +9,8 @@
 sanitizers:
   - address
   - undefined
-  - memory
+fuzzing_engines:
+  - libfuzzer
+  - honggfuzz
 architectures:
   - x86_64
diff --git a/projects/qpdf/Dockerfile b/projects/qpdf/Dockerfile
index 932c60a..2c48bc5 100644
--- a/projects/qpdf/Dockerfile
+++ b/projects/qpdf/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER ejb@ql.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool cmake nasm
 RUN git clone --depth 1 https://github.com/qpdf/qpdf.git qpdf
 RUN git clone --depth 1 https://github.com/madler/zlib.git zlib
diff --git a/projects/qpid-proton/Dockerfile b/projects/qpid-proton/Dockerfile
index 956a659..ca113d8 100644
--- a/projects/qpid-proton/Dockerfile
+++ b/projects/qpid-proton/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jdanek@redhat.com
 RUN apt-get update && \
     apt-get install -y \
         cmake
diff --git a/projects/qt/Dockerfile b/projects/qt/Dockerfile
index 71eb4a7..19417c1 100644
--- a/projects/qt/Dockerfile
+++ b/projects/qt/Dockerfile
@@ -15,14 +15,11 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER rlohningqt@gmail.com
-RUN dpkg --add-architecture i386
 RUN apt-get update && apt-get install -y libc6-dev:i386
 RUN git clone --branch 5.15 --depth 1 git://code.qt.io/qt/qt5.git qt
 WORKDIR qt
 RUN git submodule update --init --depth 1 qtbase
-RUN git submodule update --init --depth 1 qtdeclarative
+RUN git submodule update --init --depth 1 qtsvg
 WORKDIR $SRC
 RUN git clone --depth 1 git://code.qt.io/qt/qtqa.git
-RUN git clone --depth 1 https://github.com/google/AFL.git
-COPY build.sh $SRC/
+RUN cp qtqa/fuzzing/oss-fuzz/build.sh $SRC/
diff --git a/projects/qt/build.sh b/projects/qt/build.sh
deleted file mode 100755
index c44d9f1..0000000
--- a/projects/qt/build.sh
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/bin/bash -eu
-# Copyright 2019 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-################################################################################
-
-# add the flags to Qt build, gratefully borrowed from karchive
-cd $SRC/qt/qtbase/mkspecs
-sed -i -e "s/QMAKE_CXXFLAGS    += -stdlib=libc++/QMAKE_CXXFLAGS    += -stdlib=libc++  $CXXFLAGS\nQMAKE_CFLAGS += $CFLAGS/g" linux-clang-libc++/qmake.conf
-sed -i -e "s/QMAKE_LFLAGS      += -stdlib=libc++/QMAKE_LFLAGS      += -stdlib=libc++ -lpthread $CXXFLAGS/g" linux-clang-libc++/qmake.conf
-
-# set optimization to O1
-sed -i -e "s/QMAKE_CFLAGS_OPTIMIZE      = -O2/QMAKE_CFLAGS_OPTIMIZE      = -O1/g" common/gcc-base.conf
-sed -i -e "s/QMAKE_CFLAGS_OPTIMIZE_FULL = -O3/QMAKE_CFLAGS_OPTIMIZE_FULL = -O1/g" common/gcc-base.conf
-
-# remove -fno-rtti which conflicts with -fsanitize=vptr when building with sanitizer undefined
-sed -i -e "s/QMAKE_CXXFLAGS_RTTI_OFF    = -fno-rtti/QMAKE_CXXFLAGS_RTTI_OFF    = /g" common/gcc-base.conf
-
-# build project
-cd $WORK
-MAKEFLAGS=-j$(nproc) $SRC/qt/configure -qt-libmd4c -platform linux-clang-libc++ -static -opensource -confirm-license -no-opengl -nomake tests -nomake examples -prefix $PWD/qtbase -D QT_NO_DEPRECATED_WARNINGS
-make -j$(nproc) > /dev/null
-
-# prepare corpus files
-zip -j $WORK/cbor $SRC/qtqa/fuzzing/testcases/cbor/*
-zip -j $WORK/html $SRC/qtqa/fuzzing/testcases/html/*
-zip -j $WORK/images $SRC/qtqa/fuzzing/testcases/svg/* $SRC/AFL/testcases/images/*/*
-zip -j $WORK/markdown $SRC/qtqa/fuzzing/testcases/markdown/*
-zip -j $WORK/qml $SRC/qtqa/fuzzing/testcases/qml/*
-zip -j $WORK/ssl.pem.zip $SRC/qtqa/fuzzing/testcases/ssl.pem/*
-zip -j $WORK/text $SRC/qtqa/fuzzing/testcases/text/* $SRC/AFL/testcases/others/text/*
-zip -j $WORK/xml $SRC/qtqa/fuzzing/testcases/xml/* $SRC/AFL/testcases/others/xml/*
-
-# build fuzzers
-
-build_fuzzer() {
-    local nameScheme=$1
-    local module=$2
-    local proFilePath=$3
-    local format=${4-""}
-    local dictionary=${5-""}
-    local proFileName=${proFilePath##*/}
-    local exeName=${proFileName%%.*}
-    local proFileDir=${proFilePath%/*}
-    local targetName="$module"_${proFileDir//\//_}
-    mkdir build_fuzzer
-    cd build_fuzzer
-    $WORK/qtbase/bin/qmake $SRC/qt/$module/tests/libfuzzer/$proFilePath
-    make -j$(nproc)
-
-    # use old names of fuzzers, so open issues don't change state accidentally
-    local lowercaseExeName=$exeName
-    if [ "$exeName" == "setmarkdown" ]; then
-        exeName=setMarkdown
-    fi
-    if [ "$lowercaseExeName" != "$exeName" ]; then
-        mv $lowercaseExeName $exeName
-    fi
-    if [ "$nameScheme" == "old" ]; then
-        targetName="$exeName"
-    fi
-
-    mv $exeName $OUT/$targetName
-    if [ -n "$format" ]; then
-        cp $WORK/$format.zip $OUT/"$targetName"_seed_corpus.zip
-    fi
-    if [ -n "$dictionary" ]; then
-        cp $dictionary $OUT/$targetName.dict
-    fi
-    cd ..
-    rm -r build_fuzzer
-}
-
-build_fuzzer "new" "qtbase" "corelib/serialization/qcborstreamreader/next/next.pro" "cbor"
-build_fuzzer "new" "qtbase" "corelib/serialization/qcborvalue/fromcbor/fromcbor.pro" "cbor"
-build_fuzzer "new" "qtbase" "corelib/serialization/qtextstream/extractionoperator-float/extractionoperator-float.pro" "text"
-build_fuzzer "old" "qtbase" "corelib/serialization/qxmlstream/qxmlstreamreader/readnext/readnext.pro" "xml" "$SRC/AFL/dictionaries/xml.dict"
-build_fuzzer "new" "qtbase" "corelib/text/qregularexpression/optimize/optimize.pro" "" "$SRC/AFL/dictionaries/regexp.dict"
-build_fuzzer "new" "qtbase" "gui/image/qimage/loadfromdata/loadfromdata.pro" "images"
-build_fuzzer "new" "qtbase" "gui/painting/qcolorspace/fromiccprofile/fromiccprofile.pro"
-build_fuzzer "new" "qtbase" "gui/text/qtextdocument/sethtml/sethtml.pro" "html" "$SRC/AFL/dictionaries/html_tags.dict"
-build_fuzzer "old" "qtbase" "gui/text/qtextdocument/setmarkdown/setmarkdown.pro" "markdown"
-build_fuzzer "new" "qtbase" "gui/text/qtextlayout/beginlayout/beginlayout.pro" "text"
-build_fuzzer "new" "qtbase" "network/ssl/qsslcertificate/qsslcertificate/pem/pem.pro" "ssl.pem"
-build_fuzzer "new" "qtdeclarative" "qml/qml/qqmlcomponent/create/create.pro " "qml"
diff --git a/projects/qubes-os/Dockerfile b/projects/qubes-os/Dockerfile
index 8cabc38..a955c69 100644
--- a/projects/qubes-os/Dockerfile
+++ b/projects/qubes-os/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER paras.chetal@gmail.com
 
 RUN apt-get update && apt-get -y install build-essential automake libtool git python libsystemd-dev
 
diff --git a/projects/quic-go/Dockerfile b/projects/quic-go/Dockerfile
new file mode 100644
index 0000000..202f867
--- /dev/null
+++ b/projects/quic-go/Dockerfile
@@ -0,0 +1,23 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+
+RUN go get -u -d github.com/lucas-clemente/quic-go/ && \
+  cd /root/go/src/github.com/lucas-clemente/quic-go && \
+  go build
+
+COPY build.sh .
diff --git a/projects/quic-go/build.sh b/projects/quic-go/build.sh
new file mode 100644
index 0000000..fce686d
--- /dev/null
+++ b/projects/quic-go/build.sh
@@ -0,0 +1,33 @@
+#!/bin/bash
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+set -ex
+
+function compile_fuzzer {
+  path=$1
+  function=$2
+  fuzzer=$3
+
+  # Compile and instrument all Go files relevant to this fuzz target.
+  go-fuzz -func $function -o $fuzzer.a $path
+
+  # Link Go code ($fuzzer.a) with fuzzing engine to produce fuzz target binary.
+  $CXX $CXXFLAGS $LIB_FUZZING_ENGINE $fuzzer.a -o $OUT/$fuzzer
+}
+
+compile_fuzzer github.com/lucas-clemente/quic-go/fuzzing/frames Fuzz frame_fuzzer
+compile_fuzzer github.com/lucas-clemente/quic-go/fuzzing/header Fuzz header_fuzzer
diff --git a/projects/quic-go/project.yaml b/projects/quic-go/project.yaml
new file mode 100644
index 0000000..89e1fcf
--- /dev/null
+++ b/projects/quic-go/project.yaml
@@ -0,0 +1,7 @@
+homepage: "https://github.com/lucas-clemente/quic-go"
+primary_contact: "martenseemann@gmail.com"
+language: go
+fuzzing_engines:
+- libfuzzer
+sanitizers:
+- address
diff --git a/projects/radare2/Dockerfile b/projects/radare2/Dockerfile
index c5ab9ca..b0140e0 100644
--- a/projects/radare2/Dockerfile
+++ b/projects/radare2/Dockerfile
@@ -1,5 +1,4 @@
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER zlowram@gmail.com
 RUN apt-get update
 RUN git clone https://github.com/radare/radare2 radare2
 RUN git clone https://github.com/radare/radare2-regressions radare2-regressions
diff --git a/projects/radon/Dockerfile b/projects/radon/Dockerfile
new file mode 100644
index 0000000..9dbcd12
--- /dev/null
+++ b/projects/radon/Dockerfile
@@ -0,0 +1,20 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN go get github.com/radondb/radon/src/fuzz/sqlparser
+COPY build.sh $SRC/
+WORKDIR $SRC/
diff --git a/projects/radon/build.sh b/projects/radon/build.sh
new file mode 100644
index 0000000..e8c7280
--- /dev/null
+++ b/projects/radon/build.sh
@@ -0,0 +1,27 @@
+#/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+function compile_fuzzer {
+  path=$1
+  function=$2
+  fuzzer=$3
+
+  go-fuzz -func $function -o $fuzzer.a $path
+
+  $CXX $CXXFLAGS $LIB_FUZZING_ENGINE $fuzzer.a -o $OUT/$fuzzer
+}
+
+compile_fuzzer github.com/radondb/radon/src/fuzz/sqlparser Fuzz fuzz
diff --git a/projects/radon/project.yaml b/projects/radon/project.yaml
new file mode 100644
index 0000000..4e7d192
--- /dev/null
+++ b/projects/radon/project.yaml
@@ -0,0 +1,9 @@
+homepage: "https://github.com/radondb/radon"
+primary_contact: "overred.shuttler@gmail.com"
+auto_ccs :
+  - "adam@adalogics.com"
+language: go
+fuzzing_engines:
+  - libfuzzer
+sanitizers:
+  - address
diff --git a/projects/rapidjson/Dockerfile b/projects/rapidjson/Dockerfile
index afd7ea5..81df5f1 100644
--- a/projects/rapidjson/Dockerfile
+++ b/projects/rapidjson/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool cmake
 RUN git clone --depth 1 https://github.com/Tencent/rapidjson.git rapidjson
 RUN git clone --depth 1 https://github.com/guidovranken/rapidjson-fuzzers.git rapidjson-fuzzers
diff --git a/projects/rdkit/Dockerfile b/projects/rdkit/Dockerfile
index 365cd93..1dad793 100644
--- a/projects/rdkit/Dockerfile
+++ b/projects/rdkit/Dockerfile
@@ -15,28 +15,7 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER greg.landrum@gmail.com
-RUN apt-get update && apt-get install -y make wget cmake \
-  libeigen3-dev python3 libpython3-all-dev \
-  zlib1g-dev \
-  libbz2-dev
-
-# Install latest cmake
-RUN wget --quiet https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5-Linux-x86_64.sh; \
-    chmod +x cmake-3.14.5-Linux-x86_64.sh; \
-    ./cmake-3.14.5-Linux-x86_64.sh --skip-license --prefix="/usr/local"
-
-# We're building `rdkit` using clang, but the boost package is built using gcc.
-# For whatever reason, linking would fail.
-# (Mismatch between libstdc++ and libc++ maybe?)
-# It works if we build `rdkit` using gcc or build boost using clang instead.
-# We've opted for building boost using clang.
-RUN cd $SRC && \
-    wget --quiet https://sourceforge.net/projects/boost/files/boost/1.69.0/boost_1_69_0.tar.bz2 && \
-    tar xjf boost_1_69_0.tar.bz2 && \
-    cd $SRC/boost_1_69_0 && \
-    ./bootstrap.sh --with-toolset=clang --with-libraries=serialization,system,iostreams,regex && \
-    ./b2 -q -j2 toolset=clang cxxflags="-fPIC $CXXFLAGS $CXXFLAGS_EXTRA" link=static install
+RUN apt-get update && apt-get install -y wget libeigen3-dev
 
 RUN git clone --depth 1 https://github.com/rdkit/rdkit.git $SRC/rdkit
 WORKDIR $SRC/rdkit
diff --git a/projects/rdkit/build.sh b/projects/rdkit/build.sh
index d7999d2..2ad830e 100755
--- a/projects/rdkit/build.sh
+++ b/projects/rdkit/build.sh
@@ -1,5 +1,5 @@
 #!/bin/bash -eu
-# Copyright 2017 Google Inc.
+# Copyright 2020 Google Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -15,8 +15,35 @@
 #
 ################################################################################
 
+# Build zlib
+git clone --depth 1 -b master https://github.com/madler/zlib.git $SRC/zlib
+cd $SRC/zlib
+OLD_CFLAGS="$CFLAGS"
+export LDFLAGS="-fPIC $CFLAGS"
+export CFLAGS="-fPIC $CFLAGS"
+# Only build static libraries, so we don't accidentally link to zlib dynamically.
+./configure --static
+make -j$(nproc) clean
+make -j$(nproc) all install
+unset LDFLAGS
+export CFLAGS="$OLD_CFLAGS"
+
+# We're building `rdkit` using clang, but the boost package is built using gcc.
+# For whatever reason, linking would fail.
+# (Mismatch between libstdc++ and libc++ maybe?)
+# It works if we build `rdkit` using gcc or build boost using clang instead.
+# We've opted for building boost using clang.
+cd $SRC && \
+wget --quiet https://sourceforge.net/projects/boost/files/boost/1.69.0/boost_1_69_0.tar.bz2 && \
+tar xjf boost_1_69_0.tar.bz2 && \
+cd $SRC/boost_1_69_0 && \
+./bootstrap.sh --with-toolset=clang --with-libraries=serialization,system,iostreams,regex && \
+./b2 -q -j$(nproc) toolset=clang linkflags="-fPIC $CXXFLAGS $CXXFLAGS_EXTRA" cxxflags="-fPIC $CXXFLAGS $CXXFLAGS_EXTRA" link=static install
+
+cd $SRC/rdkit
+
 mkdir -p build && cd build
-cmake -DRDK_BUILD_PYTHON_WRAPPERS=OFF -DLIB_FUZZING_ENGINE=${LIB_FUZZING_ENGINE} -DRDK_BUILD_FUZZ_TARGETS=ON -DRDK_INSTALL_STATIC_LIBS=ON -DBoost_USE_STATIC_LIBS=ON ..
+cmake -DRDK_BUILD_PYTHON_WRAPPERS=OFF -DRDK_BUILD_FREETYPE_SUPPORT=OFF -DLIB_FUZZING_ENGINE=${LIB_FUZZING_ENGINE} -DRDK_BUILD_FUZZ_TARGETS=ON -DRDK_INSTALL_STATIC_LIBS=ON -DBoost_USE_STATIC_LIBS=ON ..
 make -j$(nproc)
 make install
 
diff --git a/projects/rdkit/project.yaml b/projects/rdkit/project.yaml
index ef82b38..238bccc 100644
--- a/projects/rdkit/project.yaml
+++ b/projects/rdkit/project.yaml
@@ -4,5 +4,7 @@
 sanitizers:
   - address
   - undefined
+  - memory
 architectures:
   - x86_64
+  - i386
diff --git a/projects/re2/Dockerfile b/projects/re2/Dockerfile
index 038e09c..5f948da 100644
--- a/projects/re2/Dockerfile
+++ b/projects/re2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER wrengr@chromium.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 
 RUN git clone --depth 1 https://code.googlesource.com/re2
diff --git a/projects/readstat/Dockerfile b/projects/readstat/Dockerfile
index c8e4759..d68a1ae 100644
--- a/projects/readstat/Dockerfile
+++ b/projects/readstat/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER emmiller@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake gettext libtool zip zlib1g-dev
 
 RUN git clone --depth 1 https://github.com/WizardMac/ReadStat readstat
diff --git a/projects/resiprocate/Dockerfile b/projects/resiprocate/Dockerfile
index 02a4a2f..58f7a92 100644
--- a/projects/resiprocate/Dockerfile
+++ b/projects/resiprocate/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER gjasny@googlemail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config
 RUN git clone --depth 1 https://github.com/resiprocate/resiprocate.git resiprocate
 WORKDIR resiprocate
diff --git a/projects/rnp/Dockerfile b/projects/rnp/Dockerfile
new file mode 100755
index 0000000..ce149a4
--- /dev/null
+++ b/projects/rnp/Dockerfile
@@ -0,0 +1,35 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update
+RUN apt-get install -y \
+    make \
+    autoconf \
+    automake \
+    libtool \
+    cmake \
+    chrpath \
+    libbz2-dev \
+    zlib1g-dev \
+    libjson-c-dev \
+    build-essential \
+    python-minimal \
+    wget
+
+RUN git clone --depth 1 https://github.com/rnpgp/rnp.git rnp
+WORKDIR rnp/..
+COPY build.sh $SRC/
diff --git a/projects/rnp/build.sh b/projects/rnp/build.sh
new file mode 100755
index 0000000..e31c3b4
--- /dev/null
+++ b/projects/rnp/build.sh
@@ -0,0 +1,55 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+wget -qO- https://botan.randombit.net/releases/Botan-2.12.1.tar.xz | tar xvJ
+cd Botan-2.12.1
+./configure.py --prefix=/usr --cc-bin=$CXX --cc-abi-flags="$CXXFLAGS" \
+               --disable-modules=locking_allocator \
+               --unsafe-fuzzer-mode --build-fuzzers=libfuzzer \
+               --with-fuzzer-lib='FuzzingEngine'
+make
+make install
+cd ..
+
+# -DENABLE_SANITIZERS=0 because oss-fuzz will add the sanitizer flags in CFLAGS
+# See https://github.com/google/oss-fuzz/pull/4189 to explain CMAKE_C_LINK_EXECUTABLE
+
+mkdir rnp-build
+cd rnp-build
+cmake \
+    -DENABLE_SANITIZERS=0 \
+    -DENABLE_FUZZERS=1 \
+    -DCMAKE_C_COMPILER=$CC \
+    -DCMAKE_CXX_COMPILER=$CXX \
+    -DCMAKE_C_LINK_EXECUTABLE="$CXX <FLAGS> <CMAKE_C_LINK_FLAGS> <LINK_FLAGS> <OBJECTS>  -o <TARGET> <LINK_LIBRARIES>" \
+    -DCMAKE_INSTALL_PREFIX=/usr \
+    -DBUILD_SHARED_LIBS=on \
+    -DBUILD_TESTING=off \
+    -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
+    ../rnp/
+make
+
+FUZZERS="fuzz_dump fuzz_keyring"
+for f in $FUZZERS; do
+    cp src/fuzzing/$f "${OUT}/"
+    chrpath -r '$ORIGIN/lib' "${OUT}/$f"
+done
+
+mkdir -p "${OUT}/lib"
+cp src/lib/librnp-0.so.0 "${OUT}/lib/"
+cp /usr/lib/libbotan-2.so.12 "${OUT}/lib/"
+cp /lib/x86_64-linux-gnu/libjson-c.so.2 "${OUT}/lib/"
diff --git a/projects/rnp/project.yaml b/projects/rnp/project.yaml
new file mode 100755
index 0000000..a1c74df
--- /dev/null
+++ b/projects/rnp/project.yaml
@@ -0,0 +1,14 @@
+homepage: "https://www.rnpgp.com/"
+language: c++
+primary_contact: "tse@ribose.com"
+auto_ccs:
+  - "tom@ritter.vg"
+  - "o.nickolay@gmail.com"
+  - "daniel.wyatt@gmail.com"
+sanitizers:
+  - address
+  - undefined
+fuzzing_engines:
+  - libfuzzer
+  - honggfuzz
+  - afl
\ No newline at end of file
diff --git a/projects/s2opc/Dockerfile b/projects/s2opc/Dockerfile
index 3358e14..79d5841 100644
--- a/projects/s2opc/Dockerfile
+++ b/projects/s2opc/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER pab.systerel@gmail.com
 RUN apt-get update && apt-get install -y make cmake git curl
 
 # Sources and dependencies
diff --git a/projects/sentencepiece/Dockerfile b/projects/sentencepiece/Dockerfile
new file mode 100644
index 0000000..81d7cfa
--- /dev/null
+++ b/projects/sentencepiece/Dockerfile
@@ -0,0 +1,21 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y make autoconf automake libtool cmake build-essential pkg-config libgoogle-perftools-dev
+RUN git clone --depth 1 https://github.com/google/sentencepiece.git sentencepiece
+WORKDIR sentencepiece
+COPY build.sh *.cc $SRC/
diff --git a/projects/sentencepiece/build.sh b/projects/sentencepiece/build.sh
new file mode 100755
index 0000000..69d511c
--- /dev/null
+++ b/projects/sentencepiece/build.sh
@@ -0,0 +1,31 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+# build project
+mkdir build
+cd build
+cmake -DSPM_ENABLE_SHARED=ON ..
+make -j $(nproc)
+make install
+
+# build fuzzers
+for fuzzer in $(find $SRC -name '*_fuzzer.cc'); do
+  fuzz_basename=$(basename -s .cc $fuzzer)
+  $CXX $CXXFLAGS -std=c++11 -I. \
+        $fuzzer $LIB_FUZZING_ENGINE ./src/libsentencepiece.a \
+        -o $OUT/$fuzz_basename
+done
diff --git a/projects/sentencepiece/project.yaml b/projects/sentencepiece/project.yaml
new file mode 100644
index 0000000..e3295f2
--- /dev/null
+++ b/projects/sentencepiece/project.yaml
@@ -0,0 +1,9 @@
+homepage: "https://github.com/google/sentencepiece"
+language: c++
+primary_contact: "taku@google.com"
+sanitizers:
+  - address
+  - memory
+  - undefined
+architectures:
+  - x86_64
diff --git a/projects/sentencepiece/sample_encode_fuzzer.cc b/projects/sentencepiece/sample_encode_fuzzer.cc
new file mode 100644
index 0000000..7beb06f
--- /dev/null
+++ b/projects/sentencepiece/sample_encode_fuzzer.cc
@@ -0,0 +1,33 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <fuzzer/FuzzedDataProvider.h>
+
+#include <cstddef>
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include "sentencepiece_processor.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+  sentencepiece::SentencePieceProcessor fuzz_sp_processor;
+  FuzzedDataProvider data_provider(data, size);
+  const int nbest_size = data_provider.ConsumeIntegral<int>();
+  const float alpha = data_provider.ConsumeFloatingPoint<float>();
+  const std::string in_string = data_provider.ConsumeRemainingBytesAsString();
+
+  fuzz_sp_processor.SampleEncodeAsSerializedProto(in_string, nbest_size, alpha);
+  return 0;
+}
diff --git a/projects/serde-yaml/Dockerfile b/projects/serde-yaml/Dockerfile
new file mode 100644
index 0000000..42b1ce3
--- /dev/null
+++ b/projects/serde-yaml/Dockerfile
@@ -0,0 +1,21 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+FROM gcr.io/oss-fuzz-base/base-builder
+
+RUN git clone --depth 1 https://github.com/dtolnay/serde-yaml serde-yaml
+WORKDIR $SRC
+
+COPY build.sh $SRC/
diff --git a/projects/serde-yaml/build.sh b/projects/serde-yaml/build.sh
new file mode 100755
index 0000000..dd128bb
--- /dev/null
+++ b/projects/serde-yaml/build.sh
@@ -0,0 +1,20 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+cd $SRC/serde-yaml
+cargo fuzz build -O 
+cp fuzz/target/x86_64-unknown-linux-gnu/release/fuzz_from_slice $OUT/
diff --git a/projects/serde-yaml/project.yaml b/projects/serde-yaml/project.yaml
new file mode 100644
index 0000000..3e0bd99
--- /dev/null
+++ b/projects/serde-yaml/project.yaml
@@ -0,0 +1,9 @@
+homepage: "https://github.com/dtolnay/serde-yaml"
+primary_contact: "dtolnay@gmail.com"
+sanitizers:
+  - address
+fuzzing_engines:
+  - libfuzzer
+language: rust
+auto_ccs:
+  - "david@adalogics.com"
diff --git a/projects/serde_json/Dockerfile b/projects/serde_json/Dockerfile
index 2bc753a..d27ebda 100644
--- a/projects/serde_json/Dockerfile
+++ b/projects/serde_json/Dockerfile
@@ -14,7 +14,6 @@
 #
 ################################################################################
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER david@adalogics.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool curl cmake python llvm-dev libclang-dev clang
 
 RUN git clone --depth 1 https://github.com/serde-rs/json json
diff --git a/projects/servo/Dockerfile b/projects/servo/Dockerfile
new file mode 100644
index 0000000..a0e081d
--- /dev/null
+++ b/projects/servo/Dockerfile
@@ -0,0 +1,22 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+FROM gcr.io/oss-fuzz-base/base-builder
+
+RUN git clone --depth 1 https://github.com/servo/html5ever
+RUN git clone --depth 1 https://github.com/servo/rust-url
+
+WORKDIR $SRC
+COPY build.sh $SRC/
diff --git a/projects/servo/build.sh b/projects/servo/build.sh
new file mode 100755
index 0000000..b9c3710
--- /dev/null
+++ b/projects/servo/build.sh
@@ -0,0 +1,24 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+cd $SRC/html5ever/html5ever
+cargo fuzz build -O 
+cp fuzz/target/x86_64-unknown-linux-gnu/release/fuzz_document_parse $OUT/
+
+cd $SRC/rust-url
+cargo fuzz build -O
+cp fuzz/target/x86_64-unknown-linux-gnu/release/parse $OUT/fuzz-url-parse
diff --git a/projects/servo/project.yaml b/projects/servo/project.yaml
new file mode 100644
index 0000000..48953fc
--- /dev/null
+++ b/projects/servo/project.yaml
@@ -0,0 +1,11 @@
+homepage: "https://github.com/servo"
+primary_contact: "servo-ops@mozilla.com"
+sanitizers:
+  - address
+fuzzing_engines:
+  - libfuzzer
+language: rust
+auto_ccs:
+  - "jmatthews@mozilla.com"
+  - "vgosu@mozilla.com"
+  - "david@adalogics.com"
diff --git a/projects/simdjson/Dockerfile b/projects/simdjson/Dockerfile
index 9000a9b..88ba833 100644
--- a/projects/simdjson/Dockerfile
+++ b/projects/simdjson/Dockerfile
@@ -15,16 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER pauldreikossfuzz@gmail.com
 
 RUN apt-get update && apt-get install -y ninja-build wget
 
-# We need a modern cmake
-ENV CMAKEVER 3.15.4
-RUN wget --quiet https://github.com/Kitware/CMake/releases/download/v${CMAKEVER}/cmake-${CMAKEVER}-Linux-x86_64.sh ;\
-    chmod +x cmake-${CMAKEVER}-Linux-x86_64.sh ; \
-    ./cmake-${CMAKEVER}-Linux-x86_64.sh --skip-license --prefix="/usr/local"
-
 RUN git clone --depth 1 https://github.com/simdjson/simdjson.git simdjson
 WORKDIR simdjson
 COPY build.sh $SRC/
diff --git a/projects/skcms/Dockerfile b/projects/skcms/Dockerfile
index dffd98e..de7cd1c 100644
--- a/projects/skcms/Dockerfile
+++ b/projects/skcms/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kjlubick@chromium.org
 
 RUN apt-get update && apt-get install -y wget
 
diff --git a/projects/skia/BUILD.gn.diff b/projects/skia/BUILD.gn.diff
index ffa088c..cb9f961 100644
--- a/projects/skia/BUILD.gn.diff
+++ b/projects/skia/BUILD.gn.diff
@@ -117,6 +117,35 @@
   ]
 }
 
+test_app("api_create_ddl") {
+  include_dirs = [
+    "include",
+    "include/gpu",
+  ]
+  sources = [
+    "fuzz/Fuzz.cpp",
+    "fuzz/FuzzCreateDDL.cpp",
+    "fuzz/FuzzCommon.cpp",
+    "fuzz/oss_fuzz/FuzzAPICreateDDL.cpp",
+    "tools/Resources.cpp",
+    "tools/UrlDataManager.cpp",
+    "tools/debugger/DebugCanvas.cpp",
+    "tools/debugger/DebugLayerManager.cpp",
+    "tools/debugger/DrawCommand.cpp",
+    "tools/debugger/JsonWriteBuffer.cpp",
+    "tools/fonts/TestFontMgr.cpp",
+    "tools/fonts/TestSVGTypeface.cpp",
+    "tools/fonts/TestTypeface.cpp",
+  ]
+  deps = [
+    ":experimental_svg_model",
+    ":flags",
+    ":gpu_tool_utils",
+    ":skia",
+    "//third_party/libpng",
+  ]
+}
+
 test_app("api_draw_functions") {
   sources = [
     "fuzz/Fuzz.cpp",
@@ -284,6 +313,35 @@
   ]
 }
 
+test_app("api_svg_canvas") {
+  include_dirs = [
+    "include",
+    "include/svg",
+  ]
+  sources = [
+    "fuzz/Fuzz.cpp",
+    "fuzz/FuzzCanvas.cpp",
+    "fuzz/FuzzCommon.cpp",
+    "fuzz/oss_fuzz/FuzzAPISVGCanvas.cpp",
+    "tools/Resources.cpp",
+    "tools/UrlDataManager.cpp",
+    "tools/debugger/DebugCanvas.cpp",
+    "tools/debugger/DebugLayerManager.cpp",
+    "tools/debugger/DrawCommand.cpp",
+    "tools/debugger/JsonWriteBuffer.cpp",
+    "tools/fonts/TestFontMgr.cpp",
+    "tools/fonts/TestSVGTypeface.cpp",
+    "tools/fonts/TestTypeface.cpp",
+  ]
+  deps = [
+    ":experimental_svg_model",
+    ":flags",
+    ":gpu_tool_utils",
+    ":skia",
+    "//third_party/libpng",
+  ]
+}
+
 test_app("png_encoder") {
   sources = [
     "fuzz/Fuzz.cpp",
@@ -428,19 +486,6 @@
   ]
 }
 
-test_app("api_skdescriptor") {
-  sources = [
-    "fuzz/Fuzz.cpp",
-    "fuzz/FuzzCommon.cpp",
-    "fuzz/FuzzSkDescriptor.cpp",
-    "fuzz/oss_fuzz/FuzzAPISkDescriptor.cpp",
-  ]
-  deps = [
-    ":flags",
-    ":skia",
-  ]
-}
-
 test_app("skdescriptor_deserialize") {
   sources = [
     "fuzz/Fuzz.cpp",
@@ -451,4 +496,42 @@
     ":flags",
     ":skia",
   ]
+}
+
+test_app("svg_dom") {
+  sources = [
+    "fuzz/Fuzz.cpp",
+    "fuzz/FuzzCommon.cpp",
+    "fuzz/oss_fuzz/FuzzSVG.cpp",
+  ]
+  deps = [
+    ":experimental_svg_model",
+    ":flags",
+    ":skia",
+  ]
+}
+
+test_app("skruntimeeffect") {
+  sources = [
+    "fuzz/Fuzz.cpp",
+    "fuzz/FuzzCommon.cpp",
+    "fuzz/oss_fuzz/FuzzSkRuntimeEffect.cpp",
+  ]
+  deps = [
+    ":gpu_tool_utils",
+    ":skia",
+  ]
+}
+
+test_app("skp") {
+  sources = [
+    "fuzz/Fuzz.cpp",
+    "fuzz/FuzzCommon.cpp",
+    "fuzz/oss_fuzz/FuzzSKP.cpp",
+  ]
+  deps = [
+    ":gpu_tool_utils",
+    ":flags",
+    ":skia",
+  ]
 }
\ No newline at end of file
diff --git a/projects/skia/Dockerfile b/projects/skia/Dockerfile
index 801c543..b68fc19 100644
--- a/projects/skia/Dockerfile
+++ b/projects/skia/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER kjlubick@chromium.org
 
 # Mesa needed to build swiftshader
 RUN apt-get update && apt-get install -y python wget libglu1-mesa-dev cmake
@@ -34,8 +33,7 @@
 WORKDIR $SRC/skia/third_party/externals/swiftshader/
 # TODO(metzman): Come up with a better long term solution, such as downloading
 # prebuilt libraries, than pinning swiftshader to a known working revision.
-RUN git checkout bf8fd5b5fb6892dabcc21b4b86d41cd40cb9b4b5
-RUN git submodule update --init
+RUN git checkout 45510ad8a77862c1ce2e33f0efed41544f5f048b
 WORKDIR $SRC/skia
 
 RUN wget -O $SRC/skia/image_filter_deserialize_seed_corpus.zip https://storage.googleapis.com/skia-fuzzer/oss-fuzz/image_filter_deserialize_seed_corpus.zip
@@ -72,45 +70,18 @@
 
 RUN wget -O $SRC/skia/sksl_seed_corpus.zip https://storage.googleapis.com/skia-fuzzer/oss-fuzz/sksl_seed_corpus.zip
 
-RUN wget -O $SRC/skia/api_skdescriptor_seed_corpus.zip https://storage.googleapis.com/skia-fuzzer/oss-fuzz/api_skdescriptor_seed_corpus.zip
+RUN wget -O $SRC/skia/svg_dom_seed_corpus.zip https://storage.googleapis.com/skia-fuzzer/oss-fuzz/svg_seed_corpus.zip
+
+RUN wget -O $SRC/skia/sksl_with_256_padding_seed_corpus.zip https://storage.googleapis.com/skia-fuzzer/oss-fuzz/sksl_with_256_padding_seed_corpus.zip
+
+RUN wget -O $SRC/skia/skp_seed_corpus.zip https://storage.googleapis.com/skia-fuzzer/oss-fuzz/skp_seed_corpus.zip
 
 COPY build.sh $SRC/
 
 COPY skia.diff $SRC/skia/skia.diff
 RUN git apply skia.diff
 
-COPY region_deserialize.options $SRC/skia/region_deserialize.options
-COPY region_set_path.options $SRC/skia/region_set_path.options
-COPY image_filter_deserialize.options $SRC/skia/image_filter_deserialize.options
 COPY image_filter_deserialize_width.options $SRC/skia/image_filter_deserialize_width.options
-COPY textblob_deserialize.options $SRC/skia/textblob_deserialize.options
-COPY path_deserialize.options $SRC/skia/path_deserialize.options
-COPY encoder.options $SRC/skia/encoder.options
-COPY skdescriptor_deserialize.options $SRC/skia/skdescriptor_deserialize.options
-
-# Codec fuzzers can share options
-COPY image_codec.options $SRC/skia/android_codec.options
-COPY image_codec.options $SRC/skia/animated_image_decode.options
-COPY image_codec.options $SRC/skia/image_decode.options
-COPY image_codec.options $SRC/skia/image_decode_incremental.options
-
-# API fuzzers can share options
-COPY api_fuzzers.options $SRC/skia/api_draw_functions.options
-COPY api_fuzzers.options $SRC/skia/api_gradients.options
-COPY api_fuzzers.options $SRC/skia/api_image_filter.options
-COPY api_fuzzers.options $SRC/skia/api_mock_gpu_canvas.options
-COPY api_fuzzers.options $SRC/skia/api_null_canvas.options
-COPY api_fuzzers.options $SRC/skia/api_path_measure.options
-COPY api_fuzzers.options $SRC/skia/api_pathop.options
-COPY api_fuzzers.options $SRC/skia/api_polyutils.options
-COPY api_fuzzers.options $SRC/skia/api_raster_n32_canvas.options
-COPY api_fuzzers.options $SRC/skia/api_skdescriptor.options
-
-# SKSL fuzzers can share options
-COPY sksl.options $SRC/skia/sksl2glsl.options
-COPY sksl.options $SRC/skia/sksl2spirv.options
-COPY sksl.options $SRC/skia/sksl2metal.options
-COPY sksl.options $SRC/skia/sksl2pipeline.options
 
 COPY json.dict $SRC/skia/json.dict
 
diff --git a/projects/skia/api_fuzzers.options b/projects/skia/api_fuzzers.options
deleted file mode 100644
index a48b657..0000000
--- a/projects/skia/api_fuzzers.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-max_len = 4000
\ No newline at end of file
diff --git a/projects/skia/build.sh b/projects/skia/build.sh
index fbbf2ab..ce0e0a0 100644
--- a/projects/skia/build.sh
+++ b/projects/skia/build.sh
@@ -18,26 +18,29 @@
 # Build SwiftShader
 pushd third_party/externals/swiftshader/
 export SWIFTSHADER_INCLUDE_PATH=$PWD/include
-rm -rf build
-mkdir build
+# SwiftShader already has a build/ directory, use something else
+rm -rf build_swiftshader
+mkdir build_swiftshader
 
-cd build
-if [ $SANITIZER == "coverage" ]; then
-  cmake ..
+cd build_swiftshader
+if [ $SANITIZER == "address" ]; then
+  CMAKE_SANITIZER="SWIFTSHADER_ASAN"
+elif [ $SANITIZER == "memory" ]; then
+  CMAKE_SANITIZER="SWIFTSHADER_MSAN"
+elif [ $SANITIZER == "undefined" ]; then
+  # The current SwiftShader build needs -fno-sanitize=vptr, but it cannot be
+  # specified here since -fsanitize=undefined will always come after any
+  # user specified flags passed to cmake. SwiftShader does not need to be
+  # built with the undefined sanitizer in order to fuzz Skia, so don't.
+  CMAKE_SANITIZER="SWIFTSHADER_UBSAN_DISABLED"
+elif [ $SANITIZER == "coverage" ]; then
+  CMAKE_SANITIZER="SWIFTSHADER_EMIT_COVERAGE"
 else
-  if [ $SANITIZER == "address" ]; then
-    CMAKE_SANITIZER="ASAN"
-  elif [ $SANITIZER == "memory" ]; then
-    CMAKE_SANITIZER="MSAN"
-  elif [ $SANITIZER == "undefined" ]; then
-    CMAKE_SANITIZER="UBSAN"
-  else
-    exit 1
-  fi
-  CFLAGS= CXXFLAGS="-stdlib=libc++" cmake .. -D$CMAKE_SANITIZER=1
+  exit 1
 fi
+CFLAGS= CXXFLAGS="-stdlib=libc++" cmake .. -GNinja -DCMAKE_MAKE_PROGRAM="$SRC/depot_tools/ninja" -D$CMAKE_SANITIZER=1
 
-make -j
+$SRC/depot_tools/ninja libGLESv2 libEGL
 cp libGLESv2.so libEGL.so $OUT
 export SWIFTSHADER_LIB_PATH=$OUT
 
@@ -46,11 +49,9 @@
 DISABLE="-Wno-zero-as-null-pointer-constant -Wno-unused-template
          -Wno-cast-qual"
 # Disable UBSan vptr since target built with -fno-rtti.
-# TODO(metzman): Stop using gold when
-# bugs.chromium.org/p/oss-fuzz/issues/detail?id=16777 gets resolved.
 export CFLAGS="$CFLAGS $DISABLE -I$SWIFTSHADER_INCLUDE_PATH -DGR_EGL_TRY_GLES3_THEN_GLES2 -fno-sanitize=vptr"
 export CXXFLAGS="$CXXFLAGS $DISABLE -I$SWIFTSHADER_INCLUDE_PATH -DGR_EGL_TRY_GLES3_THEN_GLES2 -fno-sanitize=vptr "-DIS_FUZZING_WITH_LIBFUZZER""
-export LDFLAGS="$LIB_FUZZING_ENGINE $CXXFLAGS -L$SWIFTSHADER_LIB_PATH -fuse-ld=gold"
+export LDFLAGS="$LIB_FUZZING_ENGINE $CXXFLAGS -L$SWIFTSHADER_LIB_PATH"
 
 # This splits a space separated list into a quoted, comma separated list for gn.
 export CFLAGS_ARR=`echo $CFLAGS | sed -e "s/\s/\",\"/g"`
@@ -63,11 +64,13 @@
 $SRC/depot_tools/gn gen out/Fuzz\
     --args='cc="'$CC'"
       cxx="'$CXX'"
+      link_pool_depth=1
       is_debug=false
       extra_cflags_c=["'"$CFLAGS_ARR"'"]
       extra_cflags_cc=["'"$CXXFLAGS_ARR"'"]
       extra_ldflags=["'"$LDFLAGS_ARR"'"]
-      skia_enable_fontmgr_custom=false
+      skia_enable_fontmgr_custom_directory=false
+      skia_enable_fontmgr_custom_embedded=false
       skia_enable_fontmgr_custom_empty=true
       skia_enable_gpu=true
       skia_enable_skottie=true
@@ -80,11 +83,13 @@
 $SRC/depot_tools/gn gen out/Fuzz_mem_constraints\
     --args='cc="'$CC'"
       cxx="'$CXX'"
+      link_pool_depth=1
       is_debug=false
       extra_cflags_c=["'"$CFLAGS_ARR"'"]
       extra_cflags_cc=["'"$CXXFLAGS_ARR"'","-DIS_FUZZING"]
       extra_ldflags=["'"$LDFLAGS_ARR"'"]
-      skia_enable_fontmgr_custom=false
+      skia_enable_fontmgr_custom_directory=false
+      skia_enable_fontmgr_custom_embedded=false
       skia_enable_fontmgr_custom_empty=true
       skia_enable_gpu=true
       skia_enable_skottie=true
@@ -103,37 +108,32 @@
                                    api_null_canvas api_image_filter api_pathop \
                                    api_polyutils android_codec image_decode_incremental \
                                    sksl2glsl sksl2spirv sksl2metal sksl2pipeline \
-                                   api_skdescriptor skdescriptor_deserialize
+                                   skdescriptor_deserialize\
+                                   svg_dom api_svg_canvas skruntimeeffect api_create_ddl \
+                                   skp
 
 $SRC/depot_tools/ninja -C out/Fuzz_mem_constraints image_filter_deserialize \
                                                    api_raster_n32_canvas \
                                                    api_mock_gpu_canvas
 
 cp out/Fuzz/region_deserialize $OUT/region_deserialize
-cp ./region_deserialize.options $OUT/region_deserialize.options
 
 cp out/Fuzz/region_set_path $OUT/region_set_path
-cp ./region_set_path.options $OUT/region_set_path.options
 cp ./region_set_path_seed_corpus.zip $OUT/region_set_path_seed_corpus.zip
 
 cp out/Fuzz/textblob_deserialize $OUT/textblob_deserialize
-cp ./textblob_deserialize.options $OUT/textblob_deserialize.options
 cp ./textblob_deserialize_seed_corpus.zip $OUT/textblob_deserialize_seed_corpus.zip
 
 cp out/Fuzz/path_deserialize $OUT/path_deserialize
-cp ./path_deserialize.options $OUT/path_deserialize.options
 cp ./path_deserialize_seed_corpus.zip $OUT/path_deserialize_seed_corpus.zip
 
 cp out/Fuzz/image_decode $OUT/image_decode
-cp ./image_decode.options $OUT/image_decode.options
 cp ./image_decode_seed_corpus.zip $OUT/image_decode_seed_corpus.zip
 
 cp out/Fuzz/animated_image_decode $OUT/animated_image_decode
-cp ./animated_image_decode.options $OUT/animated_image_decode.options
 cp ./animated_image_decode_seed_corpus.zip $OUT/animated_image_decode_seed_corpus.zip
 
 cp out/Fuzz_mem_constraints/image_filter_deserialize $OUT/image_filter_deserialize
-cp ./image_filter_deserialize.options $OUT/image_filter_deserialize.options
 cp ./image_filter_deserialize_seed_corpus.zip $OUT/image_filter_deserialize_seed_corpus.zip
 
 # Only create the width version of image_filter_deserialize if building with
@@ -148,31 +148,24 @@
 fi
 
 cp out/Fuzz/api_draw_functions $OUT/api_draw_functions
-cp ./api_draw_functions.options $OUT/api_draw_functions.options
 cp ./api_draw_functions_seed_corpus.zip $OUT/api_draw_functions_seed_corpus.zip
 
 cp out/Fuzz/api_gradients $OUT/api_gradients
-cp ./api_gradients.options $OUT/api_gradients.options
 cp ./api_gradients_seed_corpus.zip $OUT/api_gradients_seed_corpus.zip
 
 cp out/Fuzz/api_path_measure $OUT/api_path_measure
-cp ./api_path_measure.options $OUT/api_path_measure.options
 cp ./api_path_measure_seed_corpus.zip $OUT/api_path_measure_seed_corpus.zip
 
 cp out/Fuzz/api_pathop $OUT/api_pathop
-cp ./api_pathop.options $OUT/api_pathop.options
 cp ./api_pathop_seed_corpus.zip $OUT/api_pathop_seed_corpus.zip
 
 cp out/Fuzz/png_encoder $OUT/png_encoder
-cp ./encoder.options $OUT/png_encoder.options
 cp ./encoder_seed_corpus.zip $OUT/png_encoder_seed_corpus.zip
 
 cp out/Fuzz/jpeg_encoder $OUT/jpeg_encoder
-cp ./encoder.options $OUT/jpeg_encoder.options
 cp ./encoder_seed_corpus.zip $OUT/jpeg_encoder_seed_corpus.zip
 
 cp out/Fuzz/webp_encoder $OUT/webp_encoder
-cp ./encoder.options $OUT/webp_encoder.options
 cp ./encoder_seed_corpus.zip $OUT/webp_encoder_seed_corpus.zip
 
 cp out/Fuzz/skottie_json $OUT/skottie_json
@@ -183,55 +176,53 @@
 cp ./skjson_seed_corpus.zip $OUT/skjson_seed_corpus.zip
 
 cp out/Fuzz_mem_constraints/api_mock_gpu_canvas $OUT/api_mock_gpu_canvas
-cp ./api_mock_gpu_canvas.options $OUT/api_mock_gpu_canvas.options
 cp ./canvas_seed_corpus.zip $OUT/api_mock_gpu_canvas_seed_corpus.zip
 
 cp out/Fuzz_mem_constraints/api_raster_n32_canvas $OUT/api_raster_n32_canvas
-cp ./api_raster_n32_canvas.options $OUT/api_raster_n32_canvas.options
 cp ./canvas_seed_corpus.zip $OUT/api_raster_n32_canvas_seed_corpus.zip
 
 cp out/Fuzz/api_image_filter $OUT/api_image_filter
-cp ./api_image_filter.options $OUT/api_image_filter.options
 cp ./api_image_filter_seed_corpus.zip $OUT/api_image_filter_seed_corpus.zip
 
 cp out/Fuzz/api_null_canvas $OUT/api_null_canvas
-cp ./api_null_canvas.options $OUT/api_null_canvas.options
 cp ./canvas_seed_corpus.zip $OUT/api_null_canvas_seed_corpus.zip
 
 cp out/Fuzz/api_polyutils $OUT/api_polyutils
-cp ./api_polyutils.options $OUT/api_polyutils.options
 cp ./api_polyutils_seed_corpus.zip $OUT/api_polyutils_seed_corpus.zip
 
 # These 2 can use the same corpus as the (non animated) image_decode.
 cp out/Fuzz/android_codec $OUT/android_codec
-cp ./android_codec.options $OUT/android_codec.options
 cp ./image_decode_seed_corpus.zip $OUT/android_codec_seed_corpus.zip.
 
 cp out/Fuzz/image_decode_incremental $OUT/image_decode_incremental
-cp ./image_decode_incremental.options $OUT/image_decode_incremental.options
 cp ./image_decode_seed_corpus.zip $OUT/image_decode_incremental_seed_corpus.zip
 
 cp out/Fuzz/sksl2glsl $OUT/sksl2glsl
-cp ./sksl2glsl.options $OUT/sksl2glsl.options
 cp ./sksl_seed_corpus.zip $OUT/sksl2glsl_seed_corpus.zip
 
 cp out/Fuzz/sksl2spirv $OUT/sksl2spirv
-cp ./sksl2spirv.options $OUT/sksl2spirv.options
 cp ./sksl_seed_corpus.zip $OUT/sksl2spirv_seed_corpus.zip
 
 cp out/Fuzz/sksl2metal $OUT/sksl2metal
-cp ./sksl2metal.options $OUT/sksl2metal.options
 cp ./sksl_seed_corpus.zip $OUT/sksl2metal_seed_corpus.zip
 
 cp out/Fuzz/sksl2pipeline $OUT/sksl2pipeline
-cp ./sksl2pipeline.options $OUT/sksl2pipeline.options
 cp ./sksl_seed_corpus.zip $OUT/sksl2pipeline_seed_corpus.zip
 
-cp out/Fuzz/api_skdescriptor $OUT/api_skdescriptor
-cp ./api_skdescriptor.options $OUT/api_skdescriptor.options
-cp ./api_skdescriptor_seed_corpus.zip $OUT/api_skdescriptor_seed_corpus.zip
-
 # Don't have any examples of an SkDescriptor atm, so some random bytes is all we have.
 cp out/Fuzz/skdescriptor_deserialize $OUT/skdescriptor_deserialize
-cp ./skdescriptor_deserialize.options $OUT/skdescriptor_deserialize.options
-cp ./api_skdescriptor_seed_corpus.zip $OUT/skdescriptor_deserialize_seed_corpus.zip
\ No newline at end of file
+cp ./api_polyutils_seed_corpus.zip $OUT/skdescriptor_deserialize_seed_corpus.zip
+
+cp out/Fuzz/svg_dom $OUT/svg_dom
+cp ./svg_dom_seed_corpus.zip $OUT/svg_dom_seed_corpus.zip
+
+cp out/Fuzz/api_svg_canvas $OUT/api_svg_canvas
+cp ./canvas_seed_corpus.zip $OUT/api_svg_canvas_seed_corpus.zip
+
+cp out/Fuzz/skruntimeeffect $OUT/skruntimeeffect
+cp ./sksl_with_256_padding_seed_corpus.zip $OUT/skruntimeeffect_seed_corpus.zip
+
+cp out/Fuzz/api_create_ddl $OUT/api_create_ddl
+
+cp out/Fuzz/skp $OUT/skp
+cp ./skp_seed_corpus.zip $OUT/skp_seed_corpus.zip
\ No newline at end of file
diff --git a/projects/skia/encoder.options b/projects/skia/encoder.options
deleted file mode 100644
index a360502..0000000
--- a/projects/skia/encoder.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-max_len = 262150
\ No newline at end of file
diff --git a/projects/skia/image_codec.options b/projects/skia/image_codec.options
deleted file mode 100644
index 4709741..0000000
--- a/projects/skia/image_codec.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-max_len = 10240
\ No newline at end of file
diff --git a/projects/skia/image_filter_deserialize.options b/projects/skia/image_filter_deserialize.options
deleted file mode 100644
index 0bde038..0000000
--- a/projects/skia/image_filter_deserialize.options
+++ /dev/null
@@ -1,3 +0,0 @@
-[libfuzzer]
-max_len = 10024
-timeout = 10
diff --git a/projects/skia/path_deserialize.options b/projects/skia/path_deserialize.options
deleted file mode 100644
index 9b7b54d..0000000
--- a/projects/skia/path_deserialize.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-max_len = 2000
\ No newline at end of file
diff --git a/projects/skia/project.yaml b/projects/skia/project.yaml
index 34a53aa..3ed9b48 100644
--- a/projects/skia/project.yaml
+++ b/projects/skia/project.yaml
@@ -6,6 +6,7 @@
   - "mtklein@google.com"
   - "reed@google.com"
   - "bsalomon@google.com"
+  - "zepenghu@google.com"
 vendor_ccs:
   - "lsalzman@mozilla.com"
   - "twsmith@mozilla.com"
diff --git a/projects/skia/region_deserialize.options b/projects/skia/region_deserialize.options
deleted file mode 100644
index 14b7dbf..0000000
--- a/projects/skia/region_deserialize.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-max_len = 512
\ No newline at end of file
diff --git a/projects/skia/region_set_path.options b/projects/skia/region_set_path.options
deleted file mode 100644
index 14b7dbf..0000000
--- a/projects/skia/region_set_path.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-max_len = 512
\ No newline at end of file
diff --git a/projects/skia/skdescriptor_deserialize.options b/projects/skia/skdescriptor_deserialize.options
deleted file mode 100644
index 0090e8b..0000000
--- a/projects/skia/skdescriptor_deserialize.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-max_len = 1024
\ No newline at end of file
diff --git a/projects/skia/skia.diff b/projects/skia/skia.diff
index 9d47766..4cb9c10 100644
--- a/projects/skia/skia.diff
+++ b/projects/skia/skia.diff
@@ -30,7 +30,7 @@
          const uint8_t* rowA = nullptr;
          const uint8_t* rowB = nullptr;
 diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
-index 99c8bd8284..335d2e97a0 100644
+index 48858d1c9b..8fe7057a26 100644
 --- a/src/core/SkDraw.cpp
 +++ b/src/core/SkDraw.cpp
 @@ -958,6 +958,12 @@ void SkDraw::drawPath(const SkPath& origSrcPath, const SkPaint& origPaint,
@@ -47,10 +47,10 @@
  }
  
 diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
-index 80f4d0b62d..c4aabb0540 100644
+index 11bbd36693..f5fb7247af 100644
 --- a/src/core/SkImageFilter.cpp
 +++ b/src/core/SkImageFilter.cpp
-@@ -176,6 +176,12 @@ bool SkImageFilter_Base::Common::unflatten(SkReadBuffer& buffer, int expectedCou
+@@ -174,6 +174,12 @@ bool SkImageFilter_Base::Common::unflatten(SkReadBuffer& buffer, int expectedCou
          return false;
      }
  
@@ -64,12 +64,12 @@
      for (int i = 0; i < count; i++) {
          fInputs.push_back(buffer.readBool() ? buffer.readImageFilter() : nullptr);
 diff --git a/src/core/SkMallocPixelRef.cpp b/src/core/SkMallocPixelRef.cpp
-index d998029a2b..8807c1fc4d 100644
+index 02fd9c4580..7a23974b85 100644
 --- a/src/core/SkMallocPixelRef.cpp
 +++ b/src/core/SkMallocPixelRef.cpp
-@@ -37,6 +37,11 @@ sk_sp<SkPixelRef> SkMallocPixelRef::MakeAllocate(const SkImageInfo& info, size_t
-             return nullptr;
-         }
+@@ -34,6 +34,11 @@ sk_sp<SkPixelRef> SkMallocPixelRef::MakeAllocate(const SkImageInfo& info, size_t
+     if (SkImageInfo::ByteSizeOverflowed(size)) {
+         return nullptr;
      }
 +#if defined(IS_FUZZING)
 +    if (size > 100000) {
@@ -80,7 +80,7 @@
      if (nullptr == addr) {
          return nullptr;
 diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp
-index c840a68a03..5692773a33 100644
+index 222a5943e1..466307e9b3 100644
 --- a/src/core/SkMaskFilter.cpp
 +++ b/src/core/SkMaskFilter.cpp
 @@ -262,6 +262,11 @@ bool SkMaskFilterBase::filterPath(const SkPath& devPath, const SkMatrix& matrix,
@@ -96,10 +96,10 @@
                              SkMask::kComputeBoundsAndRenderImage_CreateMode,
                              style)) {
 diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
-index f294dbe4a0..12100e1624 100644
+index 001fa39338..f0b2bcd684 100644
 --- a/src/core/SkPaint.cpp
 +++ b/src/core/SkPaint.cpp
-@@ -449,6 +449,13 @@ bool SkPaint::getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect
+@@ -333,6 +333,13 @@ bool SkPaint::getFillPath(const SkPath& src, SkPath* dst, const SkRect* cullRect
  
      SkStrokeRec rec(*this, resScale);
  
@@ -114,39 +114,22 @@
      SkPath tmpPath;
  
 diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
-index 09c061de51..34b3f0bd63 100644
+index 0122601937..8c46011fe3 100644
 --- a/src/core/SkPath.cpp
 +++ b/src/core/SkPath.cpp
-@@ -3173,7 +3173,11 @@ void SkPathPriv::CreateDrawArcPath(SkPath* path, const SkRect& oval, SkScalar st
+@@ -3182,7 +3182,11 @@ void SkPathPriv::CreateDrawArcPath(SkPath* path, const SkRect& oval, SkScalar st
                                     SkScalar sweepAngle, bool useCenter, bool isFillNoPathEffect) {
      SkASSERT(!oval.isEmpty());
      SkASSERT(sweepAngle);
 -
 +#if defined(IS_FUZZING)
-+    if (sweepAngle > 3600.0f || sweepAngle < 3600.0f) {
++    if (sweepAngle > 3600.0f || sweepAngle < -3600.0f) {
 +        return;
 +    }
 +#endif
      path->reset();
      path->setIsVolatile(true);
      path->setFillType(SkPathFillType::kWinding);
-diff --git a/src/core/SkReadBuffer.cpp b/src/core/SkReadBuffer.cpp
-index c7e26df8d4..eb9b28141d 100644
---- a/src/core/SkReadBuffer.cpp
-+++ b/src/core/SkReadBuffer.cpp
-@@ -277,7 +277,12 @@ sk_sp<SkData> SkReadBuffer::readByteArrayAsData() {
- uint32_t SkReadBuffer::getArrayCount() {
-     const size_t inc = sizeof(uint32_t);
-     fError = fError || !IsPtrAlign4(fReader.peek()) || !fReader.isAvailable(inc);
-+#if defined(IS_FUZZING)
-+    uint32_t retVal = fError ? 0 : *(uint32_t*)fReader.peek();
-+    return retVal < 1000 ? retVal: 1000;
-+#else
-     return fError ? 0 : *(uint32_t*)fReader.peek();
-+#endif
- }
- 
- /*  Format:
 diff --git a/src/core/SkScan_Hairline.cpp b/src/core/SkScan_Hairline.cpp
 index eeea9e78f0..4c8d2a8f3f 100644
 --- a/src/core/SkScan_Hairline.cpp
@@ -178,7 +161,7 @@
              SkFixed startX = SkFDot6ToFixed(x0) + (slope * ((32 - y0) & 63) >> 6);
  
 diff --git a/src/effects/Sk1DPathEffect.cpp b/src/effects/Sk1DPathEffect.cpp
-index 360179d663..04df451f2a 100644
+index 16dee4a90b..a306585b20 100644
 --- a/src/effects/Sk1DPathEffect.cpp
 +++ b/src/effects/Sk1DPathEffect.cpp
 @@ -19,6 +19,11 @@
@@ -209,23 +192,6 @@
  
      const SkMatrix& mat = this->getMatrix();
      SkPoint src, dst;
-diff --git a/src/effects/SkDashPathEffect.cpp b/src/effects/SkDashPathEffect.cpp
-index d392dc2317..d71515f1d4 100644
---- a/src/effects/SkDashPathEffect.cpp
-+++ b/src/effects/SkDashPathEffect.cpp
-@@ -381,6 +381,12 @@ sk_sp<SkFlattenable> SkDashImpl::CreateProc(SkReadBuffer& buffer) {
-         return nullptr;
-     }
- 
-+#if defined(IS_FUZZING)
-+    // TODO(kjlubick) Can this be removed now that we have the check above?
-+    if (count > 20) {
-+        return nullptr;
-+    }
-+#endif
-     SkAutoSTArray<32, SkScalar> intervals(count);
-     if (buffer.readScalarArray(intervals.get(), count)) {
-         return SkDashPathEffect::Make(intervals.get(), SkToInt(count), phase);
 diff --git a/src/effects/SkDiscretePathEffect.cpp b/src/effects/SkDiscretePathEffect.cpp
 index 4ad1165b0f..a79526a909 100644
 --- a/src/effects/SkDiscretePathEffect.cpp
diff --git a/projects/skia/sksl.options b/projects/skia/sksl.options
deleted file mode 100644
index 648edd4..0000000
--- a/projects/skia/sksl.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-max_len = 3000
\ No newline at end of file
diff --git a/projects/skia/textblob_deserialize.options b/projects/skia/textblob_deserialize.options
deleted file mode 100644
index 0090e8b..0000000
--- a/projects/skia/textblob_deserialize.options
+++ /dev/null
@@ -1,2 +0,0 @@
-[libfuzzer]
-max_len = 1024
\ No newline at end of file
diff --git a/projects/solidity/Dockerfile b/projects/solidity/Dockerfile
index 58ffe84..0df952f 100644
--- a/projects/solidity/Dockerfile
+++ b/projects/solidity/Dockerfile
@@ -16,11 +16,7 @@
 
 FROM gcr.io/oss-fuzz-base/base-builder
 RUN apt-get update && apt-get install -y make autoconf automake libtool \
-    build-essential libbz2-dev ninja-build zlib1g-dev wget python python-dev
-# Install cmake 3.14 (minimum requirement is cmake 3.10)
-RUN wget https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5-Linux-x86_64.sh; \
-    chmod +x cmake-3.14.5-Linux-x86_64.sh; \
-    ./cmake-3.14.5-Linux-x86_64.sh --skip-license --prefix="/usr"
+    build-essential libbz2-dev ninja-build zlib1g-dev wget python python-dev liblzma-dev
 
 RUN git clone --recursive https://github.com/ethereum/solidity.git solidity
 RUN git clone --depth 1 https://github.com/ethereum/solidity-fuzzing-corpus.git
diff --git a/projects/spanner_emulator/Dockerfile b/projects/spanner_emulator/Dockerfile
new file mode 100644
index 0000000..0f13a7f
--- /dev/null
+++ b/projects/spanner_emulator/Dockerfile
@@ -0,0 +1,27 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+MAINTAINER evmaus@google.com
+RUN apt-get update && apt-get -y install make autoconf automake libtool wget openjdk-8-jdk python libunwind-dev tzdata
+
+# Install Bazelisk
+RUN wget -O /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/download/v0.0.8/bazelisk-linux-amd64
+RUN chmod +x /usr/local/bin/bazel
+
+RUN git clone https://github.com/googleinterns/cloud-spanner-emulator-fuzzing.git fuzz
+WORKDIR fuzz
+COPY build.sh $SRC/
diff --git a/projects/spanner_emulator/build.sh b/projects/spanner_emulator/build.sh
new file mode 100755
index 0000000..79e7978
--- /dev/null
+++ b/projects/spanner_emulator/build.sh
@@ -0,0 +1,78 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+export CFLAGS="$CFLAGS"
+export CXXFLAGS="$CXXFLAGS"
+
+declare -r FUZZER_TARGETS_CC=$(find . -name *_fuzz_test.cc)
+declare -r FUZZER_TARGETS="$(for t in ${FUZZER_TARGETS_CC}; do echo "${t:2:-3}"; done)"
+
+# Copy $CFLAGS and $CXXFLAGS into Bazel command-line flags, for both
+# compilation and linking.
+#
+# Some flags, such as `-stdlib=libc++`, generate warnings if used on a C source
+# file. Since the build runs with `-Werror` this will cause it to break, so we
+# use `--conlyopt` and `--cxxopt` instead of `--copt`.
+declare -r EXTRA_BAZEL_FLAGS="$(
+for f in ${CFLAGS}; do
+  echo "--conlyopt=${f}" "--linkopt=${f}"
+done
+for f in ${CXXFLAGS}; do
+  echo "--cxxopt=${f}" "--linkopt=${f}"
+done
+)"
+
+declare BAZEL_TARGET_PATH="k8-fastbuild/bin/src/fuzz"
+declare BAZEL_BUILD_TARGETS="//src/fuzz:all"
+
+# Temporary hack, see https://github.com/google/oss-fuzz/issues/383
+readonly NO_VPTR='--copt=-fno-sanitize=vptr --linkopt=-fno-sanitize=vptr'
+
+# Build driverless libraries.
+bazel build --verbose_failures  --strip=never \
+  --dynamic_mode=off \
+  --copt=-fno-sanitize=vptr \
+  --linkopt=-fno-sanitize=vptr \
+  --copt -D__SANITIZE_ADDRESS__ \
+  --copt -D__OSS_FUZZ__ \
+  --copt -fno-sanitize-blacklist \
+  --cxxopt="-stdlib=libc++" \
+  --linkopt="--rtlib=compiler-rt" \
+  --linkopt="--unwindlib=libunwind" \
+  --linkopt="-stdlib=libc++" \
+  --linkopt="-lc++" \
+  --linkopt=-pthread ${EXTRA_BAZEL_FLAGS} \
+  --define LIB_FUZZING_ENGINE=${LIB_FUZZING_ENGINE} \
+  --linkopt="-rpath '\$ORIGIN\/lib'" \
+  ${NO_VPTR} \
+  ${EXTRA_BAZEL_FLAGS} \
+  ${BAZEL_BUILD_TARGETS[*]}
+
+# Move out dynamically linked libraries
+mkdir -p $OUT/lib
+cp /usr/lib/x86_64-linux-gnu/libunwind.so.8 $OUT/lib/
+
+# Move out tzdata
+mkdir -p $OUT/data
+cp -r /usr/share/zoneinfo $OUT/data/
+
+# Move out fuzz target
+cp "${SRC}"/fuzz/bazel-out/"${BAZEL_TARGET_PATH}"/*_fuzz_test "${OUT}"/
+
+# Cleanup bazel- symlinks to avoid oss-fuzz trying to copy out of the build
+# cache.
+rm -f bazel-*
diff --git a/projects/spanner_emulator/project.yaml b/projects/spanner_emulator/project.yaml
new file mode 100644
index 0000000..3b895c2
--- /dev/null
+++ b/projects/spanner_emulator/project.yaml
@@ -0,0 +1,10 @@
+homepage: "https://github.com/googleinterns/cloud-spanner-emulator-fuzzing"
+language: c++
+primary_contact: "evmaus@google.com"
+auto_ccs:
+  - "cloud-spanner-emulator-dev+fuzztests@google.com"
+fuzzing_engines:
+  - libfuzzer
+  - honggfuzz
+sanitizers:
+  - address
diff --git a/projects/spdlog/Dockerfile b/projects/spdlog/Dockerfile
index 6c2c73d..9adf61f 100644
--- a/projects/spdlog/Dockerfile
+++ b/projects/spdlog/Dockerfile
@@ -1,4 +1,4 @@
-# Copyright 2019 Google Inc.
+# Copyright 2020 Google Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -15,10 +15,10 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER gmelman1@gmail.com
 
 RUN apt-get update && apt-get install --yes cmake
-
 RUN git clone --depth 1 https://github.com/gabime/spdlog.git
+RUN zip spdlog_fuzzer_seed_corpus.zip spdlog/example/*
 WORKDIR spdlog
-COPY build.sh log_fuzzer.cc $SRC/
+COPY build.sh spdlog_fuzzer.dict $SRC/
+COPY fuzz/* $SRC/
diff --git a/projects/spdlog/build.sh b/projects/spdlog/build.sh
index 5e9087d..60c9a97 100755
--- a/projects/spdlog/build.sh
+++ b/projects/spdlog/build.sh
@@ -1,5 +1,5 @@
 #!/bin/bash -eu
-# Copyright 2019 Google Inc.
+# Copyright 2020 Google Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -25,3 +25,6 @@
     $f $LIB_FUZZING_ENGINE ./libspdlog.a \
     -o $OUT/$b
 done
+
+cp $SRC/spdlog_fuzzer_seed_corpus.zip $OUT/
+cp $SRC/*.dict $SRC/*.options $OUT/
diff --git a/projects/spdlog/log_fuzzer.cc b/projects/spdlog/fuzz/backtrace_fuzzer.cc
similarity index 74%
rename from projects/spdlog/log_fuzzer.cc
rename to projects/spdlog/fuzz/backtrace_fuzzer.cc
index f512191..2964812 100644
--- a/projects/spdlog/log_fuzzer.cc
+++ b/projects/spdlog/fuzz/backtrace_fuzzer.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -32,11 +32,12 @@
 
   FuzzedDataProvider stream(data, size);
 
-  const size_t size_arg = stream.ConsumeIntegral<size_t>();
-  const int int_arg = stream.ConsumeIntegral<int>();
-  const std::string string_arg = stream.ConsumeRandomLengthString(size);
-  const std::string format_string = stream.ConsumeRemainingBytesAsString();
-  spdlog::info(format_string.c_str(), size_arg, int_arg, string_arg);
+  const uint16_t size_arg = stream.ConsumeIntegral<uint16_t>();
 
+  spdlog::enable_backtrace(size_arg);
+  for(int i=0; i<size_arg; i++){
+    spdlog::debug(stream.ConsumeRandomLengthString(size));
+  }
+  spdlog::dump_backtrace();
   return 0;
 }
diff --git a/projects/spdlog/fuzz/format_fuzzer.cc b/projects/spdlog/fuzz/format_fuzzer.cc
new file mode 100644
index 0000000..809fe40
--- /dev/null
+++ b/projects/spdlog/fuzz/format_fuzzer.cc
@@ -0,0 +1,70 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+
+#include <fuzzer/FuzzedDataProvider.h>
+
+#include "spdlog/spdlog.h"
+#include "spdlog/sinks/basic_file_sink.h"
+#include "spdlog/pattern_formatter.h"
+
+
+std::string my_formatter_txt = "custom-flag";
+
+class my_formatter_flag : public spdlog::custom_flag_formatter
+{
+  
+public:
+    void format(const spdlog::details::log_msg &, const std::tm &, spdlog::memory_buf_t &dest) override
+    {
+        dest.append(my_formatter_txt.data(), my_formatter_txt.data() + my_formatter_txt.size());
+    }
+
+    std::unique_ptr<custom_flag_formatter> clone() const override
+    {
+        return spdlog::details::make_unique<my_formatter_flag>();
+    }
+};
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  if (size == 0) {
+    return 0;
+  }
+
+  static std::shared_ptr<spdlog::logger> my_logger;
+  if (!my_logger.get()) {
+    my_logger = spdlog::basic_logger_mt("basic_logger", "/dev/null");
+    spdlog::set_default_logger(my_logger);
+  }
+
+  FuzzedDataProvider stream(data, size);
+
+  const unsigned long size_arg = stream.ConsumeIntegral<unsigned long>();
+  const unsigned long  int_arg = stream.ConsumeIntegral<unsigned long>();
+  const char flag = (char)(stream.ConsumeIntegral<char>());
+  const std::string pattern = stream.ConsumeRandomLengthString();
+  my_formatter_txt = stream.ConsumeRandomLengthString();
+  const std::string string_arg = stream.ConsumeRandomLengthString();
+  const std::string format_string = stream.ConsumeRemainingBytesAsString();
+
+  using spdlog::details::make_unique;
+  auto formatter = make_unique<spdlog::pattern_formatter>();
+  formatter->add_flag<my_formatter_flag>(flag).set_pattern(pattern);
+  spdlog::set_formatter(std::move(formatter));
+  
+  spdlog::info(format_string.c_str(), size_arg, int_arg, string_arg);
+
+  return 0;
+}
diff --git a/projects/spdlog/fuzz/format_fuzzer.options b/projects/spdlog/fuzz/format_fuzzer.options
new file mode 100644
index 0000000..a1728af
--- /dev/null
+++ b/projects/spdlog/fuzz/format_fuzzer.options
@@ -0,0 +1,2 @@
+[libfuzzer]
+dict = spdlog_fuzzer.dict
\ No newline at end of file
diff --git a/projects/spdlog/log_fuzzer.cc b/projects/spdlog/fuzz/levels_fuzzer.cc
similarity index 60%
copy from projects/spdlog/log_fuzzer.cc
copy to projects/spdlog/fuzz/levels_fuzzer.cc
index f512191..b1bac03 100644
--- a/projects/spdlog/log_fuzzer.cc
+++ b/projects/spdlog/fuzz/levels_fuzzer.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -18,25 +18,38 @@
 
 #include "spdlog/spdlog.h"
 #include "spdlog/sinks/basic_file_sink.h"
+#include "spdlog/cfg/argv.h"
+#include "spdlog/cfg/env.h"
 
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  if (size == 0) {
+    return 0;
+  }
+
   static std::shared_ptr<spdlog::logger> my_logger;
   if (!my_logger.get()) {
     my_logger = spdlog::basic_logger_mt("basic_logger", "/dev/null");
     spdlog::set_default_logger(my_logger);
   }
 
-  if (size == 0) {
-    return 0;
-  }
-
   FuzzedDataProvider stream(data, size);
-
-  const size_t size_arg = stream.ConsumeIntegral<size_t>();
-  const int int_arg = stream.ConsumeIntegral<int>();
-  const std::string string_arg = stream.ConsumeRandomLengthString(size);
-  const std::string format_string = stream.ConsumeRemainingBytesAsString();
-  spdlog::info(format_string.c_str(), size_arg, int_arg, string_arg);
-
+  
+  std::vector<std::string> strings;
+  const unsigned char strsize = stream.ConsumeIntegral<unsigned char>();
+  for(unsigned char i=0; i<strsize; i++){
+    strings.push_back(stream.ConsumeRandomLengthString());
+  }
+  std::vector<char*> argvv; argvv.reserve(strsize);
+  for(unsigned char i=0; i< strsize; ++i){
+    argvv.push_back(const_cast<char*>(strings[i].c_str()));
+  }
+  
+  if(strsize==0) return 0;
+  
+  const char** argv = (const char**) &argvv[0];
+  spdlog::cfg::load_env_levels();
+  spdlog::cfg::load_argv_levels(strsize, argv);
+  spdlog::info(stream.ConsumeRemainingBytesAsString());
+  
   return 0;
 }
diff --git a/projects/spdlog/fuzz/levels_fuzzer.options b/projects/spdlog/fuzz/levels_fuzzer.options
new file mode 100644
index 0000000..a1728af
--- /dev/null
+++ b/projects/spdlog/fuzz/levels_fuzzer.options
@@ -0,0 +1,2 @@
+[libfuzzer]
+dict = spdlog_fuzzer.dict
\ No newline at end of file
diff --git a/projects/spdlog/fuzz/log_fuzzer.cc b/projects/spdlog/fuzz/log_fuzzer.cc
new file mode 100644
index 0000000..e6d299d
--- /dev/null
+++ b/projects/spdlog/fuzz/log_fuzzer.cc
@@ -0,0 +1,56 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+
+#include <fuzzer/FuzzedDataProvider.h>
+
+#include "spdlog/spdlog.h"
+#include "spdlog/sinks/basic_file_sink.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  static std::shared_ptr<spdlog::logger> my_logger;
+  if (!my_logger.get()) {
+    my_logger = spdlog::basic_logger_mt("basic_logger", "/dev/null");
+    spdlog::set_default_logger(my_logger);
+  }
+
+  if (size == 0) {
+    return 0;
+  }
+
+
+  FuzzedDataProvider stream(data, size);
+
+  const unsigned long size_arg = stream.ConsumeIntegral<unsigned long>();
+  const unsigned long int_arg = stream.ConsumeIntegral<unsigned long>();
+  const std::string string_arg = stream.ConsumeRandomLengthString(size);
+  const std::string format_string = stream.ConsumeRemainingBytesAsString();
+
+  spdlog::info(format_string.c_str(), size_arg, int_arg, string_arg);
+  spdlog::trace(format_string.c_str(), size_arg, int_arg, string_arg);
+  spdlog::debug(format_string.c_str(), size_arg, int_arg, string_arg);
+  spdlog::error(format_string.c_str(), size_arg, int_arg, string_arg);
+  spdlog::warn(format_string.c_str(), size_arg, int_arg, string_arg);
+  spdlog::critical(format_string.c_str(), size_arg, int_arg, string_arg);
+
+  SPDLOG_INFO(format_string.c_str(), size_arg, int_arg, string_arg);
+  SPDLOG_TRACE(format_string.c_str(), size_arg, int_arg, string_arg);
+  SPDLOG_DEBUG(format_string.c_str(), size_arg, int_arg, string_arg);
+  SPDLOG_ERROR(format_string.c_str(), size_arg, int_arg, string_arg);
+  SPDLOG_WARN(format_string.c_str(), size_arg, int_arg, string_arg);
+  SPDLOG_CRITICAL(format_string.c_str(), size_arg, int_arg, string_arg);
+
+  return 0;
+}
diff --git a/projects/spdlog/fuzz/log_fuzzer.options b/projects/spdlog/fuzz/log_fuzzer.options
new file mode 100644
index 0000000..a1728af
--- /dev/null
+++ b/projects/spdlog/fuzz/log_fuzzer.options
@@ -0,0 +1,2 @@
+[libfuzzer]
+dict = spdlog_fuzzer.dict
\ No newline at end of file
diff --git a/projects/spdlog/log_fuzzer.cc b/projects/spdlog/fuzz/pattern_fuzzer.cc
similarity index 74%
copy from projects/spdlog/log_fuzzer.cc
copy to projects/spdlog/fuzz/pattern_fuzzer.cc
index f512191..0a2d73b 100644
--- a/projects/spdlog/log_fuzzer.cc
+++ b/projects/spdlog/fuzz/pattern_fuzzer.cc
@@ -1,4 +1,4 @@
-// Copyright 2019 Google LLC
+// Copyright 2020 Google LLC
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -31,12 +31,8 @@
   }
 
   FuzzedDataProvider stream(data, size);
-
-  const size_t size_arg = stream.ConsumeIntegral<size_t>();
-  const int int_arg = stream.ConsumeIntegral<int>();
-  const std::string string_arg = stream.ConsumeRandomLengthString(size);
-  const std::string format_string = stream.ConsumeRemainingBytesAsString();
-  spdlog::info(format_string.c_str(), size_arg, int_arg, string_arg);
+  const std::string str = stream.ConsumeRemainingBytesAsString();
+  spdlog::set_pattern(str);
 
   return 0;
 }
diff --git a/projects/spdlog/fuzz/pattern_fuzzer.options b/projects/spdlog/fuzz/pattern_fuzzer.options
new file mode 100644
index 0000000..a1728af
--- /dev/null
+++ b/projects/spdlog/fuzz/pattern_fuzzer.options
@@ -0,0 +1,2 @@
+[libfuzzer]
+dict = spdlog_fuzzer.dict
\ No newline at end of file
diff --git a/projects/spdlog/project.yaml b/projects/spdlog/project.yaml
index ad6c346..fa83902 100644
--- a/projects/spdlog/project.yaml
+++ b/projects/spdlog/project.yaml
@@ -1,7 +1,9 @@
-homepage: "https://github.com/google/zopfli"
+homepage: "https://github.com/gabime/spdlog"
 language: c++
 primary_contact: "gmelman1@gmail.com"
+auto_ccs:
+  - "ouyangyunshu@google.com"
 sanitizers:
   - address
   - memory
-  - undefined
+  - undefined
\ No newline at end of file
diff --git a/projects/spdlog/spdlog_fuzzer.dict b/projects/spdlog/spdlog_fuzzer.dict
new file mode 100644
index 0000000..dc7d1eb
--- /dev/null
+++ b/projects/spdlog/spdlog_fuzzer.dict
@@ -0,0 +1,20 @@
+"{}"
+"{:08d}"
+"{0:d}"
+"{0:x}"
+"{0:o}"
+"{0:b}"
+"{:03.2f}"
+"{1}"
+"{0}"
+"{:<8}"
+"{:<999999999999999999999999}"
+"[%H:%M:%S %z]"
+"[%^%L%$]"
+"[thread %t]"
+"%v"
+"%+"
+"{:X}"
+"{:s}"
+"{:p}"
+"{:n}"
\ No newline at end of file
diff --git a/projects/speex/Dockerfile b/projects/speex/Dockerfile
index 7ed9981..f8d8ef6 100644
--- a/projects/speex/Dockerfile
+++ b/projects/speex/Dockerfile
@@ -15,10 +15,8 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER tmatth@videolan.org
 RUN apt-get update && apt-get install -y make autoconf libtool pkg-config wget
-RUN git clone https://gitlab.xiph.org/xiph/ogg.git
-RUN git clone https://gitlab.xiph.org/xiph/speex.git speex
+RUN git clone --depth 1 https://gitlab.xiph.org/xiph/ogg.git
+RUN git clone --depth 1 https://gitlab.xiph.org/xiph/speex.git speex
 WORKDIR speex
-RUN git checkout speexdec-fuzz-target
 COPY build.sh $SRC/
diff --git a/projects/spidermonkey-ufi/Dockerfile b/projects/spidermonkey-ufi/Dockerfile
index 5217c06..bf95bdf 100644
--- a/projects/spidermonkey-ufi/Dockerfile
+++ b/projects/spidermonkey-ufi/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER cdiehl@mozilla.com
 RUN apt-get update && apt-get install -y --no-install-recommends \
     autoconf2.13 \
     python \
diff --git a/projects/spidermonkey-ufi/build.sh b/projects/spidermonkey-ufi/build.sh
index cd1498b..31c5b95 100755
--- a/projects/spidermonkey-ufi/build.sh
+++ b/projects/spidermonkey-ufi/build.sh
@@ -61,4 +61,3 @@
 mkdir -p $OUT/lib
 cp -L /usr/lib/x86_64-linux-gnu/libc++.so.1 $OUT/lib
 cp -L /usr/lib/x86_64-linux-gnu/libc++abi.so.1 $OUT/lib
-
diff --git a/projects/spidermonkey/Dockerfile b/projects/spidermonkey/Dockerfile
index 2581814..78419f5 100644
--- a/projects/spidermonkey/Dockerfile
+++ b/projects/spidermonkey/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER alex.gaynor@gmail.com
 RUN apt-get update && apt-get install -y \
   autoconf2.13 \
   yasm \
diff --git a/projects/sqlite3/Dockerfile b/projects/sqlite3/Dockerfile
index e25694f..cb5a83b 100644
--- a/projects/sqlite3/Dockerfile
+++ b/projects/sqlite3/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER tanin@google.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool curl tcl zlib1g-dev
 
 # We won't be able to poll fossil for changes, so this will build
diff --git a/projects/stb/Dockerfile b/projects/stb/Dockerfile
index 89129f4..bca2bd0 100644
--- a/projects/stb/Dockerfile
+++ b/projects/stb/Dockerfile
@@ -19,7 +19,6 @@
 RUN apt-get update && \
     apt-get install -y wget tar
 
-MAINTAINER randy408@protonmail.com
 
 RUN git clone --depth 1 https://github.com/nothings/stb.git
 
diff --git a/projects/stb/build.sh b/projects/stb/build.sh
index 1cbf4c0..e32e0e6 100644
--- a/projects/stb/build.sh
+++ b/projects/stb/build.sh
@@ -14,28 +14,5 @@
 # limitations under the License.
 #
 ################################################################################
-
-# remove this line when this change is upstreamed
-sed '2d' $SRC/stb/tests/stb_png_read_fuzzer.cpp > $SRC/stb/tests/stbi_read_fuzzer.c
-
-$CXX $CXXFLAGS -std=c++11 -I. -DSTBI_ONLY_PNG  \
-    $SRC/stb/tests/stbi_read_fuzzer.c \
-    -o $OUT/stb_png_read_fuzzer $LIB_FUZZING_ENGINE
-
-$CXX $CXXFLAGS -std=c++11 -I. \
-    $SRC/stb/tests/stbi_read_fuzzer.c \
-    -o $OUT/stbi_read_fuzzer $LIB_FUZZING_ENGINE
-
-find $SRC/stb/tests/pngsuite -name "*.png" | \
-     xargs zip $OUT/stb_png_read_fuzzer_seed_corpus.zip
-
-cp $SRC/stb/tests/stb_png.dict $OUT/stb_png_read_fuzzer.dict
-
-tar xvzf $SRC/stb/jpg.tar.gz --directory $SRC/stb/tests
-tar xvzf $SRC/stb/gif.tar.gz --directory $SRC/stb/tests
-
-find $SRC/stb/tests -name "*.png" -o -name "*.jpg" -o -name ".gif" | \
-     xargs zip $OUT/stbi_read_fuzzer_seed_corpus.zip
-
-echo "" >> $SRC/stb/tests/gif.dict
-cat $SRC/stb/tests/gif.dict $SRC/stb/tests/stb_png.dict > $OUT/stbi_read_fuzzer.dict
+# Run the OSS-Fuzz script in the project
+$SRC/stb/tests/ossfuzz.sh
diff --git a/projects/strongswan/Dockerfile b/projects/strongswan/Dockerfile
index cfd1aa7..ea003db 100644
--- a/projects/strongswan/Dockerfile
+++ b/projects/strongswan/Dockerfile
@@ -15,7 +15,6 @@
 ##############################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER tobias@strongswan.org
 RUN apt-get update && apt-get install -y automake autoconf libtool pkg-config gettext perl python flex bison gperf lcov libgmp3-dev
 RUN git clone --depth 1 https://github.com/strongswan/strongswan.git strongswan
 RUN git clone --depth 1 https://github.com/strongswan/fuzzing-corpora.git strongswan/fuzzing-corpora
diff --git a/projects/systemd/Dockerfile b/projects/systemd/Dockerfile
index b920555..ee351ed 100644
--- a/projects/systemd/Dockerfile
+++ b/projects/systemd/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jonathan@titanous.com
 RUN apt-get update &&\
     apt-get install -y gperf m4 gettext python3-pip \
         libcap-dev libmount-dev libkmod-dev \
diff --git a/projects/syzkaller/Dockerfile b/projects/syzkaller/Dockerfile
index 983c8fa..142313f 100644
--- a/projects/syzkaller/Dockerfile
+++ b/projects/syzkaller/Dockerfile
@@ -15,13 +15,12 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mmoroz@chromium.org
 
-RUN go get -u -d github.com/google/syzkaller/...
+RUN go get -u -d github.com/google/syzkaller/prog
 
 # Dependency for one of the fuzz targets.
+# Note: this should not be necessary because this package is in syzkaller/vendor.
 RUN go get github.com/ianlancetaylor/demangle
 
-RUN git clone --depth 1 https://github.com/google/syzkaller.git
-WORKDIR syzkaller
+WORKDIR /root/go/src/github.com/google/syzkaller
 COPY build.sh $SRC/
diff --git a/projects/syzkaller/build.sh b/projects/syzkaller/build.sh
index 744ae34..cf1fdc2 100755
--- a/projects/syzkaller/build.sh
+++ b/projects/syzkaller/build.sh
@@ -1,4 +1,4 @@
-#!/bin/bash -eu
+#!/bin/bash -eux
 # Copyright 2019 Google Inc.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,10 +27,11 @@
   $CXX $CXXFLAGS $LIB_FUZZING_ENGINE $fuzzer.a -o $OUT/$fuzzer
 }
 
-compile_fuzzer ./pkg/compiler Fuzz compiler_fuzzer
-compile_fuzzer ./prog/test FuzzDeserialize prog_deserialize_fuzzer
-compile_fuzzer ./prog/test FuzzParseLog prog_parselog_fuzzer
-compile_fuzzer ./pkg/report Fuzz report_fuzzer
+make descriptions
+compile_fuzzer github.com/google/syzkaller/pkg/compiler Fuzz compiler_fuzzer
+compile_fuzzer github.com/google/syzkaller/prog/test FuzzDeserialize prog_deserialize_fuzzer
+compile_fuzzer github.com/google/syzkaller/prog/test FuzzParseLog prog_parselog_fuzzer
+compile_fuzzer github.com/google/syzkaller/pkg/report Fuzz report_fuzzer
 
 # This target is way too spammy and OOMs very quickly.
 # compile_fuzzer ./tools/syz-trace2syz/proggen Fuzz trace2syz_fuzzer
diff --git a/projects/tensorflow/Dockerfile b/projects/tensorflow/Dockerfile
index 64100cf..44f7d45 100644
--- a/projects/tensorflow/Dockerfile
+++ b/projects/tensorflow/Dockerfile
@@ -15,21 +15,24 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mihaimaruseac@google.com
 
 RUN apt-get update && apt-get install -y --no-install-recommends \
         curl \
-        python-dev \
-        python-future \
         rsync \
         && \
     apt-get clean && \
     rm -rf /var/lib/apt/lists/*
+RUN python3 -m pip install numpy
 
-# Install Bazel from apt-get to ensure dependencies are there
-RUN echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | tee /etc/apt/sources.list.d/bazel.list
-RUN curl https://bazel.build/bazel-release.pub.gpg | apt-key add -
-RUN apt-get update && apt-get install -y bazel
+# Due to Bazel bug, need to symlink python3 to python
+# See https://github.com/bazelbuild/bazel/issues/8665
+RUN ln -s /usr/local/bin/python3 /usr/local/bin/python
+
+# Install Bazelisk to keep bazel in sync with the version required by TensorFlow
+RUN curl -Lo /usr/bin/bazel \
+        https://github.com/bazelbuild/bazelisk/releases/download/v1.1.0/bazelisk-linux-amd64 \
+        && \
+    chmod +x /usr/bin/bazel
 
 RUN git clone --depth 1 https://github.com/tensorflow/tensorflow tensorflow
 WORKDIR $SRC/tensorflow
diff --git a/projects/tensorflow/build.sh b/projects/tensorflow/build.sh
index b1589e0..0412009 100755
--- a/projects/tensorflow/build.sh
+++ b/projects/tensorflow/build.sh
@@ -15,154 +15,86 @@
 #
 ################################################################################
 
-# First, determine the latest Bazel we can support
-BAZEL_VERSION=$(
-  grep '_TF_MAX_BAZEL_VERSION =' configure.py | \
-  cut -d\' -f2 | tr -d '[:space:]'
-)
-if [ -z ${BAZEL_VERSION} ]; then
-  echo "Couldn't find a valid bazel version in configure.py script"
-  exit 1
-fi
+# Force Python3, run configure.py to pick the right build config
+PYTHON=python3
+yes "" | ${PYTHON} configure.py
 
-# Then, install it
-curl -fSsL -O https://github.com/bazelbuild/bazel/releases/download/${BAZEL_VERSION}/bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh
-chmod +x ./bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh
-./bazel-${BAZEL_VERSION}-installer-linux-x86_64.sh
-
-# Finally, check instalation before proceeding to compile
-INSTALLED_VERSION=$(
-  bazel version | grep 'Build label' | cut -d: -f2 | tr -d '[:space:]'
-)
-if [ ${INSTALLED_VERSION} != ${BAZEL_VERSION} ]; then
-  echo "Couldn't install required Bazel. "
-  echo "Want ${BAZEL_VERSION}. Got ${INSTALLED_VERSION}."
-  exit 1
-fi
-
-# Generate the list of fuzzers we have (only the base/op name).
-FUZZING_BUILD_FILE="tensorflow/core/kernels/fuzzing/BUILD"
-declare -r FUZZERS=$(
-  grep '^tf_ops_fuzz_target' ${FUZZING_BUILD_FILE} | cut -d'"' -f2 | head -n5
-)
-
-# Add a few more flags to make sure fuzzers build and run successfully.
-# Note the c++11/libc++ flags to build using the same toolchain as the one used
-# to build libFuzzingEngine.
-CFLAGS="${CFLAGS} -fno-sanitize=vptr"
-CXXFLAGS="${CXXFLAGS} -fno-sanitize=vptr -std=c++11 -stdlib=libc++"
-
-# Make sure we run ./configure to detect when we are using a Bazel out of range
-yes "" | ./configure
-
-# See https://github.com/bazelbuild/bazel/issues/6697
-sed '/::kM..SeedBytes/d' -i tensorflow/stream_executor/rng.cc
-
-# Due to statically linking boringssl dependency, we have to define one extra
-# flag when compiling for memory fuzzing (see the boringssl project).
-if [ "$SANITIZER" = "memory" ]
-then
-  CFLAGS="${CFLAGS} -DOPENSSL_NO_ASM=1"
-  CXXFLAGS="${CXXFLAGS} -DOPENSSL_NO_ASM=1"
-fi
-
-# All of the flags in $CFLAGS and $CXXFLAGS need to be passed to bazel too.
-# Also, pass in flags to ensure static build and to help in debugging failures.
+# Since Bazel passes flags to compilers via `--copt`, `--conlyopt` and
+# `--cxxopt`, we need to move all flags from `$CFLAGS` and `$CXXFLAGS` to these.
+# We don't use `--copt` as warnings issued by C compilers when encountering a
+# C++-only option results in errors during build.
+#
+# Note: Make sure that by this line `$CFLAGS` and `$CXXFLAGS` are properly set
+# up as further changes to them won't be visible to Bazel.
+#
+# Note: for builds using the undefined behavior sanitizer we need to link
+# `clang_rt` ubsan library. Since Bazel uses `clang` for linking instead of
+# `clang++`, we need to add the additional `--linkopt` flag.
+# See issue: https://github.com/bazelbuild/bazel/issues/8777
 declare -r EXTRA_FLAGS="\
---config=monolithic --dynamic_mode=off \
---verbose_failures \
 $(
 for f in ${CFLAGS}; do
   echo "--conlyopt=${f}" "--linkopt=${f}"
 done
 for f in ${CXXFLAGS}; do
-  echo "--cxxopt=${f}" "--linkopt=${f}"
+    echo "--cxxopt=${f}" "--linkopt=${f}"
 done
+if [ "$SANITIZER" = "undefined" ]
+then
+  echo "--linkopt=$(find $(llvm-config --libdir) -name libclang_rt.ubsan_standalone_cxx-x86_64.a | head -1)"
+fi
 )"
 
-# We need a new bazel function to build the actual binary.
-cat >> tensorflow/core/kernels/fuzzing/tf_ops_fuzz_target_lib.bzl << END
+# Determine all fuzz targets. To control what gets fuzzed with OSSFuzz, all
+# supported fuzzers are in `//tensorflow/security/fuzzing`.
+declare -r FUZZERS=$(bazel query 'tests(//tensorflow/security/fuzzing/...)' | grep -v identity)
 
-def cc_tf(name):
-    native.cc_test(
-        name = name + "_fuzz",
-        deps = [
-            "//tensorflow/core/kernels/fuzzing:fuzz_session",
-            "//tensorflow/core/kernels/fuzzing:" + name + "_fuzz_lib",
-            "//tensorflow/cc:cc_ops",
-            "//tensorflow/cc:scope",
-            "//tensorflow/core:core_cpu",
-        ],
-    )
-END
+# Build the fuzzer targets.
+# Pass in `--config=libc++` to link against libc++.
+# Pass in `--verbose_failures` so it is easy to debug compile crashes.
+# Pass in `--strip=never` to ensure coverage support.
+# Pass in `$LIB_FUZZING_ENGINE` to `--copt` and `--linkopt` to ensure we have a
+# `main` symbol defined (all these fuzzers build without a `main` and by default
+# `$CFLAGS` and `CXXFLAGS` compile with `-fsanitize=fuzzer-no-link`).
+# Since we have `assert` in fuzzers, make sure `NDEBUG` is not defined
+bazel build \
+  --config=libc++ \
+  ${EXTRA_FLAGS} \
+  --verbose_failures \
+  --strip=never \
+  --copt=${LIB_FUZZING_ENGINE} \
+  --linkopt=${LIB_FUZZING_ENGINE} \
+  --copt='-UNDEBUG' \
+  -- ${FUZZERS}
 
-# Import this function in the proper BUILD file.
-cat >> ${FUZZING_BUILD_FILE} << END
-
-load("//tensorflow/core/kernels/fuzzing:tf_ops_fuzz_target_lib.bzl", "cc_tf")
-
-END
-
-# And invoke it for all fuzzers.
-for fuzzer in ${FUZZERS}; do
-  echo cc_tf\(\"${fuzzer}\"\) >> ${FUZZING_BUILD_FILE}
+# The fuzzers built above are in the `bazel-bin/` symlink. But they need to be
+# in `$OUT`, so move them accordingly.
+for bazel_target in ${FUZZERS}; do
+  colon_index=$(expr index "${bazel_target}" ":")
+  fuzz_name="${bazel_target:$colon_index}"
+  bazel_location="bazel-bin/${bazel_target/:/\/}"
+  cp ${bazel_location} ${OUT}/$fuzz_name
 done
 
-# Since we force the environment, we expect bazel to fail during the linking of
-# each fuzzer. Hence, we will do the linking manually at the end of the process.
-# We just need to make sure we use the same invocation as bazel would use, so
-# use --verbose_failures (in ${EXTRA_FLAGS}) to get it and then encode it in the
-# following ${LINK_ARGS}.
-declare -r LINK_ARGS="\
--pthread -fuse-ld=gold \
--Wl,-no-as-needed -Wl,-z,relro,-z,now \
--B/usr/local/bin -B/usr/bin -Wl,--gc-sections \
-"
-
-# This should always look as successful despite linking error mentioned above.
-bazel build --jobs=2 ${EXTRA_FLAGS} -k //tensorflow/core/kernels/fuzzing:all || true
-
-# For each fuzzer target, we only have to link it manually to get the binary.
-for fuzzer in ${FUZZERS}; do
-  fz=${fuzzer}_fuzz
-
-  # Get the file with the parameters for linking or fail if it didn't exist.
-  lfile=`ls -1 bazel-bin/tensorflow/core/kernels/fuzzing/${fz}*.params | head -n1`
-
-  # Manually link everything.
-  ${CXX} ${CXXFLAGS} $LIB_FUZZING_ENGINE -o ${OUT}/${fz} ${LINK_ARGS} -Wl,@${lfile}
-done
-
-# For coverage, we need one extra step, see the envoy and grpc projects.
+# For coverage, we need to remap source files to correspond to the Bazel build
+# paths. We also need to resolve all symlinks that Bazel creates.
 if [ "$SANITIZER" = "coverage" ]
 then
-  declare -r REMAP_PATH=${OUT}/proc/self/cwd
+  declare -r RSYNC_CMD="rsync -aLkR"
+  declare -r REMAP_PATH=${OUT}/proc/self/cwd/
   mkdir -p ${REMAP_PATH}
-  rsync -ak ${SRC}/tensorflow/tensorflow ${REMAP_PATH}
-  rsync -ak ${SRC}/tensorflow/third_party ${REMAP_PATH}
 
-  # Also copy bazel generated files (via genrules)
-  declare -r BAZEL_PREFIX=bazel-out/k8-opt
-  declare -r REMAP_BAZEL_PATH=${REMAP_PATH}/${BAZEL_PREFIX}
-  mkdir -p ${REMAP_BAZEL_PATH}
-  rsync -ak ${SRC}/tensorflow/${BAZEL_PREFIX}/genfiles ${REMAP_BAZEL_PATH}
+  # Sync existing code.
+  ${RSYNC_CMD} tensorflow/ ${REMAP_PATH}
 
-  # Finally copy the external archives source files
-  rsync -ak ${SRC}/tensorflow/bazel-tensorflow/external ${REMAP_PATH}
+  # Sync generated proto files.
+  ${RSYNC_CMD} ./bazel-out/k8-opt/bin/tensorflow/core/protobuf ${REMAP_PATH}
+
+  # Sync external dependencies. We don't need to include `bazel-tensorflow`.
+  pushd bazel-tensorflow
+  ${RSYNC_CMD} external/ ${REMAP_PATH}
+  popd
 fi
 
-# Now that all is done, we just have to copy the existing corpora and
-# dictionaries to have them available in the runtime environment.
-# The tweaks to the filenames below are to make sure corpora/dictionary have
-# similar names as the fuzzer binary.
-for dict in tensorflow/core/kernels/fuzzing/dictionaries/*; do
-  name=$(basename -- $dict)
-  cp ${dict} ${OUT}/${name/.dict/_fuzz.dict}
-done
-for corpus in tensorflow/core/kernels/fuzzing/corpus/*; do
-  name=$(basename -- $corpus)
-  zip ${OUT}/${name}_fuzz_seed_corpus.zip ${corpus}/*
-done
-
 # Finally, make sure we don't accidentally run with stuff from the bazel cache.
 rm -f bazel-*
diff --git a/projects/tensorflow/project.yaml b/projects/tensorflow/project.yaml
index dfdd609..bc4f4c4 100644
--- a/projects/tensorflow/project.yaml
+++ b/projects/tensorflow/project.yaml
@@ -2,9 +2,8 @@
 language: c++
 primary_contact: "mihaimaruseac@google.com"
 auto_ccs:
- - "dga@google.com"
  - "frankchn@google.com"
-fuzzing_engines:
-  - libfuzzer
 sanitizers:
   - address
+  - undefined
+  - memory
diff --git a/projects/tesseract-ocr/Dockerfile b/projects/tesseract-ocr/Dockerfile
index daf6070..20094e7 100644
--- a/projects/tesseract-ocr/Dockerfile
+++ b/projects/tesseract-ocr/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get update && apt-get install -y autoconf automake libtool pkg-config libpng-dev libjpeg8-dev libtiff5-dev zlib1g-dev
 RUN git clone --depth 1 https://github.com/danbloomberg/leptonica
 RUN git clone --depth 1 https://github.com/tesseract-ocr/tesseract
diff --git a/projects/tidb/Dockerfile b/projects/tidb/Dockerfile
index 4061d68..86995d6 100644
--- a/projects/tidb/Dockerfile
+++ b/projects/tidb/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER adam@adalogics.com
 RUN go get github.com/pingcap/tidb/store
 COPY build.sh $SRC/
 WORKDIR $SRC/
diff --git a/projects/tidy-html5/Dockerfile b/projects/tidy-html5/Dockerfile
index 1f4cf06..febef54 100644
--- a/projects/tidy-html5/Dockerfile
+++ b/projects/tidy-html5/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER sbucur@google.com
 
 RUN apt-get update && \
     apt-get install -y --no-install-recommends \
diff --git a/projects/tor/Dockerfile b/projects/tor/Dockerfile
index cc04502..37d9753 100644
--- a/projects/tor/Dockerfile
+++ b/projects/tor/Dockerfile
@@ -15,7 +15,6 @@
 ##############################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER nickm@torproject.org
 RUN apt-get update && apt-get install -y autoconf automake make libtool
 RUN git clone --depth 1 https://git.torproject.org/tor.git
 RUN git clone --depth 1 https://git.torproject.org/fuzzing-corpora.git tor-fuzz-corpora
diff --git a/projects/tremor/Dockerfile b/projects/tremor/Dockerfile
index 6491cbc..d190c22 100644
--- a/projects/tremor/Dockerfile
+++ b/projects/tremor/Dockerfile
@@ -15,10 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER twsmith@mozilla.com
 RUN apt-get update && apt-get install -y make autoconf automake libogg-dev libtool pkg-config wget
-RUN git clone https://gitlab.xiph.org/xiph/ogg.git
-RUN git clone https://gitlab.xiph.org/xiph/tremor.git
+RUN git clone --depth 1 https://gitlab.xiph.org/xiph/ogg.git
+RUN git clone --depth 1 https://gitlab.xiph.org/xiph/tremor.git
 RUN svn export https://github.com/mozillasecurity/fuzzdata.git/trunk/samples/vorbis decode_corpus
 WORKDIR tremor
 COPY decode_fuzzer.cc $SRC/tremor/
diff --git a/projects/unbound/Dockerfile b/projects/unbound/Dockerfile
index 0bd7743..fd9223d 100644
--- a/projects/unbound/Dockerfile
+++ b/projects/unbound/Dockerfile
@@ -14,7 +14,6 @@
 #
 ################################################################################
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jsha@letsencrypt.org
 RUN apt-get update
 RUN apt-get install -y make libtool libssl-dev libexpat-dev wget
 RUN git clone --depth=1 https://github.com/NLnetLabs/unbound unbound
diff --git a/projects/unicorn/Dockerfile b/projects/unicorn/Dockerfile
index 68a4955..1ae7e56 100644
--- a/projects/unicorn/Dockerfile
+++ b/projects/unicorn/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER unicorn.emu@gmail.com
 RUN apt-get update && apt-get install -y make python
 RUN git clone --depth 1 https://github.com/unicorn-engine/unicorn.git
 WORKDIR $SRC
diff --git a/projects/unrar/Dockerfile b/projects/unrar/Dockerfile
index cc61b26..8ff4b95 100644
--- a/projects/unrar/Dockerfile
+++ b/projects/unrar/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER vakh@chromium.org
 RUN apt-get update && apt-get install -y make build-essential
 
 RUN git clone -b oss_fuzz --depth 1 https://github.com/aawc/unrar.git
diff --git a/projects/uriparser/Dockerfile b/projects/uriparser/Dockerfile
index f66ca53..0f6ba06 100644
--- a/projects/uriparser/Dockerfile
+++ b/projects/uriparser/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER webmaster@hartwork.org
 RUN apt-get update && apt-get install -y make autoconf automake wget sudo libtool cmake
 RUN git clone --depth 1 https://github.com/uriparser/uriparser uriparser
 WORKDIR uriparser
diff --git a/projects/uriparser/uri_dissect_query_malloc_fuzzer.cc b/projects/uriparser/uri_dissect_query_malloc_fuzzer.cc
new file mode 100644
index 0000000..3714f85
--- /dev/null
+++ b/projects/uriparser/uri_dissect_query_malloc_fuzzer.cc
@@ -0,0 +1,61 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Fuzz UriQuery.c:
+//   uriDissectQueryMallocA
+//   uriComposeQueryA
+
+#include <cstddef>
+#include <cstdint>
+#include <string>
+#include <utility>
+#include <vector>
+
+using std::string;
+#include "uriparser/include/uriparser/Uri.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+
+  const string query(reinterpret_cast<const char *>(data), size);
+
+  UriQueryListA *query_list = nullptr;
+  int item_count = -1;
+
+  const char *query_start = query.c_str();
+  const char *query_end = query_start + size;
+
+  // Break a query like "a=b&2=3" into key/value pairs.
+  int result =
+      uriDissectQueryMallocA(&query_list, &item_count, query_start, query_end);
+
+  if (query_list == nullptr || result != URI_SUCCESS || item_count < 0)
+    return 0;
+
+  int chars_required = 0;
+  if (uriComposeQueryCharsRequiredA(query_list, &chars_required) != URI_SUCCESS)
+    return 0;
+
+  if (!chars_required) {
+    uriFreeQueryListA(query_list);
+    return 0;
+  }
+
+  std::vector<char> buf(chars_required, 0);
+  int written = -1;
+  // Reverse the process of uriDissectQueryMallocA.
+  result = uriComposeQueryA(buf.data(), query_list, chars_required, &written);
+
+  uriFreeQueryListA(query_list);
+  return 0;
+}
diff --git a/projects/uriparser/uri_parse_fuzzer.cc b/projects/uriparser/uri_parse_fuzzer.cc
new file mode 100644
index 0000000..4eca669
--- /dev/null
+++ b/projects/uriparser/uri_parse_fuzzer.cc
@@ -0,0 +1,120 @@
+// Copyright 2020 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+#include <cstring>
+#include <string>
+#include <vector>
+#include <fuzzer/FuzzedDataProvider.h>
+
+using std::string;
+#include "uriparser/include/uriparser/Uri.h"
+#include "uriparser/include/uriparser/UriIp4.h"
+
+class UriParserA {
+ public:
+  UriParserA() { memset((void *)&uri_, 0, sizeof(uri_)); }
+  ~UriParserA() { uriFreeUriMembersA(&uri_); }
+
+  UriUriA *get_mutable_uri() { return &uri_; }
+  UriUriA *get_uri() const { return const_cast<UriUriA *>(&uri_); }
+
+ private:
+  UriUriA uri_;
+};
+
+void Escapes(const string &uri) {
+  const char *first = uri.c_str();
+  // A new line char takes 6 char to encode.
+  // Use a vector to make a C string.
+  std::vector<char> buf1(uri.size() * 6 + 1);
+  std::vector<char> buf2(uri.size() * 3 + 1);
+
+  char *result;
+  result = uriEscapeA(first, &buf1[0], URI_TRUE, URI_TRUE);
+  result = uriEscapeA(first, &buf1[0], URI_FALSE, URI_TRUE);
+  if (buf1.data()) uriUnescapeInPlaceA(&buf1[0]);
+
+  result = uriEscapeA(first, &buf2[0], URI_TRUE, URI_FALSE);
+  result = uriEscapeA(first, &buf2[0], URI_FALSE, URI_FALSE);
+  if (buf2.data()) uriUnescapeInPlaceA(&buf2[0]);
+}
+
+void FileNames(const string &uri) {
+  const size_t size = 8 + 3 * uri.size() + 1;
+  std::vector<char> buf(size);
+
+  uriUnixFilenameToUriStringA(uri.c_str(), &buf[0]);
+  uriWindowsFilenameToUriStringA(uri.c_str(), &buf[0]);
+  uriUriStringToUnixFilenameA(uri.c_str(), &buf[0]);
+  uriUriStringToWindowsFilenameA(uri.c_str(), &buf[0]);
+}
+
+int uriParseIpFourAddressA(unsigned char *octetOutput, const char *first,
+                           const char *afterLast);
+
+void Ipv4(const string &s) {
+  const char *cstr = s.c_str();
+  unsigned char result[4] = {};
+  uriParseIpFourAddressA(result, cstr, &cstr[s.size()]);
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
+
+  FuzzedDataProvider stream(data, size);
+  bool domainRelative = stream.ConsumeBool();
+  size_t uriSize = stream.remaining_bytes() / 2;
+
+  const string uri1 = stream.ConsumeBytesAsString(uriSize);
+  const string uri2 = stream.ConsumeRemainingBytesAsString();
+
+  Escapes(uri1);
+  Escapes(uri2);
+
+  FileNames(uri1);
+  FileNames(uri2);
+
+  Ipv4(uri1);
+  Ipv4(uri2);
+
+  UriParserA parser1;
+  UriParserStateA state1;
+  state1.uri = parser1.get_mutable_uri();
+  if (uriParseUriA(&state1, uri1.c_str()) != URI_SUCCESS)
+    return 0;
+
+  char buf[1024 * 8] = {0};
+  int written = 0;
+  uriToStringA(buf, state1.uri, sizeof(buf), &written);
+
+  UriParserA parser2;
+  UriParserStateA state2;
+  state2.uri = parser2.get_mutable_uri();
+  if (uriParseUriA(&state2, uri2.c_str()) != URI_SUCCESS)
+    return 0;
+
+  uriEqualsUriA(state1.uri, state2.uri);
+
+  uriNormalizeSyntaxA(state1.uri);
+
+  UriUriA absUri;
+  uriAddBaseUriA(&absUri, state1.uri, state2.uri);
+  uriFreeUriMembersA(&absUri);
+
+  UriUriA relUri;
+  uriRemoveBaseUriA(&relUri, state1.uri, state2.uri, domainRelative);
+  uriFreeUriMembersA(&relUri);
+
+  return 0;
+}
diff --git a/projects/usbguard/Dockerfile b/projects/usbguard/Dockerfile
index b3e362c..4b1759c 100644
--- a/projects/usbguard/Dockerfile
+++ b/projects/usbguard/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER allenwebb@google.com
 
 RUN apt-get update && apt-get install -y \
   make \
diff --git a/projects/usrsctp/Dockerfile b/projects/usrsctp/Dockerfile
index 0f98a60..2a1ec00 100644
--- a/projects/usrsctp/Dockerfile
+++ b/projects/usrsctp/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER weinrank@fh-muenster.de
 RUN apt-get update && apt-get install -y make cmake
 RUN git clone --depth 1 --branch oss-fuzz https://github.com/weinrank/usrsctp usrsctp
 WORKDIR usrsctp
diff --git a/projects/usrsctp/build.sh b/projects/usrsctp/build.sh
index f7bcd18..c3e35ca 100755
--- a/projects/usrsctp/build.sh
+++ b/projects/usrsctp/build.sh
@@ -15,7 +15,7 @@
 #
 ################################################################################
 
-cmake -Dsctp_build_programs=0 -Dsctp_debug=0 -Dsctp_invariants=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo .
+cmake -Dsctp_build_programs=0 -Dsctp_debug=0 -Dsctp_invariants=1 -Dsctp_build_fuzzer=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo .
 make -j$(nproc)
 cd fuzzer
 
diff --git a/projects/usrsctp/project.yaml b/projects/usrsctp/project.yaml
index f6d30d0..77c09f2 100644
--- a/projects/usrsctp/project.yaml
+++ b/projects/usrsctp/project.yaml
@@ -4,6 +4,8 @@
 auto_ccs:
   - "t00fcxen@googlemail.com"
   - "markwo@google.com"
+  - "natashenka@google.com"
+  - "yuquanw@google.com"
 fuzzing_engines:
   - libfuzzer
   - afl
@@ -13,4 +15,3 @@
   - address
   - undefined
   - memory
-  - dataflow
diff --git a/projects/util-linux/Dockerfile b/projects/util-linux/Dockerfile
new file mode 100644
index 0000000..16ea63d
--- /dev/null
+++ b/projects/util-linux/Dockerfile
@@ -0,0 +1,21 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get install -y autoconf automake autopoint bison libtool pkg-config
+RUN git clone --depth 1 https://github.com/karelzak/util-linux
+WORKDIR util-linux
+COPY build.sh $SRC/
diff --git a/projects/util-linux/build.sh b/projects/util-linux/build.sh
new file mode 100755
index 0000000..3c4195c
--- /dev/null
+++ b/projects/util-linux/build.sh
@@ -0,0 +1,18 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+./tools/oss-fuzz.sh
diff --git a/projects/util-linux/project.yaml b/projects/util-linux/project.yaml
index 5c8395e..40d8098 100644
--- a/projects/util-linux/project.yaml
+++ b/projects/util-linux/project.yaml
@@ -1,4 +1,15 @@
 homepage: "https://github.com/karelzak/util-linux"
 primary_contact: "ruediger.meier@ga-group.nl"
+language: c
 auto_ccs:
   - "kzak@redhat.com"
+  - "evvers@ya.ru"
+  - "evverx@gmail.com"
+  - "kerolasa@gmail.com"
+architectures:
+  - x86_64
+  - i386
+sanitizers:
+  - address
+  - undefined
+  - memory
diff --git a/projects/uwebsockets/Dockerfile b/projects/uwebsockets/Dockerfile
index b51f3cb..e8977c3 100644
--- a/projects/uwebsockets/Dockerfile
+++ b/projects/uwebsockets/Dockerfile
@@ -15,8 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER alexhultman@gmail.com
-RUN apt-get update && apt-get install -y libz-dev
 RUN git clone --recursive https://github.com/uNetworking/uWebSockets.git uWebSockets
 WORKDIR uWebSockets
 COPY build.sh $SRC/
diff --git a/projects/uwebsockets/project.yaml b/projects/uwebsockets/project.yaml
index be5ec65..1e42d20 100644
--- a/projects/uwebsockets/project.yaml
+++ b/projects/uwebsockets/project.yaml
@@ -1,8 +1,8 @@
 homepage: "https://github.com/uNetworking/uWebSockets"
 language: c++
 primary_contact: "alexhultman@gmail.com"
+builds_per_day: 4
 sanitizers:
   - address
-  - memory:
-     experimental: True
+  - memory
   - undefined
diff --git a/projects/vitess/Dockerfile b/projects/vitess/Dockerfile
index 2bdbfc4..8c242c0 100644
--- a/projects/vitess/Dockerfile
+++ b/projects/vitess/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER adam@adalogics.com
 RUN go get 	github.com/vitessio/vitess \
 		vitess.io/vitess/go/bytes2 \
 		vitess.io/vitess/go/sqltypes \
diff --git a/projects/vorbis/Dockerfile b/projects/vorbis/Dockerfile
index 8b5838a..80523ce 100644
--- a/projects/vorbis/Dockerfile
+++ b/projects/vorbis/Dockerfile
@@ -15,10 +15,9 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER paul.l.kehrer@mail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool pkg-config wget
-RUN git clone https://gitlab.xiph.org/xiph/ogg.git
-RUN git clone https://gitlab.xiph.org/xiph/vorbis.git
+RUN git clone --depth 1 https://gitlab.xiph.org/xiph/ogg.git
+RUN git clone --depth 1 https://gitlab.xiph.org/xiph/vorbis.git
 RUN svn export https://github.com/mozillasecurity/fuzzdata.git/trunk/samples/ogg decode_corpus
 RUN svn export --force https://github.com/mozillasecurity/fuzzdata.git/trunk/samples/vorbis decode_corpus
 # TODO: remove `people.xiph.org` lines once upstream build script is updated
diff --git a/projects/wabt/Dockerfile b/projects/wabt/Dockerfile
index 86caa31..ac7efab 100644
--- a/projects/wabt/Dockerfile
+++ b/projects/wabt/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER binji@chromium.org
 RUN apt-get update && apt-get install -y cmake libtool make python
 RUN git clone --recursive https://github.com/WebAssembly/wabt
 WORKDIR wabt
diff --git a/projects/wasmtime/Dockerfile b/projects/wasmtime/Dockerfile
index 8057ecd..78280a0 100644
--- a/projects/wasmtime/Dockerfile
+++ b/projects/wasmtime/Dockerfile
@@ -15,9 +15,10 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER foote@fastly.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool curl cmake python llvm-dev libclang-dev clang
 
+RUN git clone --depth 1 https://github.com/bytecodealliance/wasm-tools wasm-tools
+
 RUN git clone --depth 1 https://github.com/bytecodealliance/wasmtime wasmtime
 WORKDIR wasmtime
 RUN git submodule update --init --recursive
diff --git a/projects/wasmtime/build.sh b/projects/wasmtime/build.sh
index 5fbbdd5..d52edfb 100755
--- a/projects/wasmtime/build.sh
+++ b/projects/wasmtime/build.sh
@@ -16,17 +16,35 @@
 ################################################################################
 
 # Note: This project creates Rust fuzz targets exclusively
-PROJECT_DIR=$SRC/wasmtime
+
+build() {
+  project=$1
+  shift
+  fuzzer_prefix=$1
+  shift
+  PROJECT_DIR=$SRC/$project
+
+  cd $PROJECT_DIR/fuzz && cargo fuzz build -O --debug-assertions "$@"
+
+  FUZZ_TARGET_OUTPUT_DIR=$PROJECT_DIR/target/x86_64-unknown-linux-gnu/release
+
+  for f in $PROJECT_DIR/fuzz/fuzz_targets/*.rs; do
+      src_name=$(basename ${f%.*})
+      dst_name=$fuzzer_prefix$src_name
+      cp $FUZZ_TARGET_OUTPUT_DIR/$src_name $OUT/$dst_name
+
+      if [[ -d $SRC/wasmtime/wasmtime-libfuzzer-corpus/$dst_name/ ]]; then
+          zip -jr \
+              $OUT/${dst_name}_seed_corpus.zip \
+              $SRC/wasmtime/wasmtime-libfuzzer-corpus/$dst_name/
+      fi
+
+      cp $SRC/default.options $OUT/$dst_name.options
+  done
+}
 
 # Build with all features to enable the binaryen-using fuzz targets, and
 # the peepmatic fuzz targets.
-cd $PROJECT_DIR/fuzz && cargo fuzz build -O --debug-assertions --all-features
+build wasmtime "" --all-features
 
-FUZZ_TARGET_OUTPUT_DIR=$PROJECT_DIR/target/x86_64-unknown-linux-gnu/release
-for f in $SRC/wasmtime/fuzz/fuzz_targets/*.rs
-do
-    FUZZ_TARGET_NAME=$(basename ${f%.*})
-    cp $FUZZ_TARGET_OUTPUT_DIR/$FUZZ_TARGET_NAME $OUT/
-    zip -jr $OUT/${FUZZ_TARGET_NAME}_seed_corpus.zip $PROJECT_DIR/wasmtime-libfuzzer-corpus/$FUZZ_TARGET_NAME/
-    cp $SRC/default.options $OUT/$FUZZ_TARGET_NAME.options
-done
+build wasm-tools wasm-tools-
diff --git a/projects/wasmtime/default.options b/projects/wasmtime/default.options
index 1a5e42a..06422d9 100644
--- a/projects/wasmtime/default.options
+++ b/projects/wasmtime/default.options
@@ -1,3 +1,4 @@
 [asan]
 allow_user_segv_handler=1
 handle_sigill=0
+handle_segv=1
diff --git a/projects/wavpack/Dockerfile b/projects/wavpack/Dockerfile
index 05e342c..2cee9fd 100644
--- a/projects/wavpack/Dockerfile
+++ b/projects/wavpack/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER david@wavpack.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://github.com/dbry/WavPack.git wavpack
 RUN cp wavpack/fuzzing/build.sh $SRC
diff --git a/projects/wget/Dockerfile b/projects/wget/Dockerfile
index ecef1d4..ec20c7c 100644
--- a/projects/wget/Dockerfile
+++ b/projects/wget/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER rockdaboot@gmail.com
 RUN apt-get update && apt-get install -y \
  make \
  pkg-config \
diff --git a/projects/wget2/Dockerfile b/projects/wget2/Dockerfile
index 8ccce12..bc2451e 100644
--- a/projects/wget2/Dockerfile
+++ b/projects/wget2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER rockdaboot@gmail.com
 RUN apt-get update && apt-get install -y \
  make \
  pkg-config \
diff --git a/projects/wireshark/Dockerfile b/projects/wireshark/Dockerfile
index a531a2e..4baee80 100644
--- a/projects/wireshark/Dockerfile
+++ b/projects/wireshark/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER Jakub Zawadzki <darkjames-ws@darkjames.pl>
 
 RUN apt-get update && apt-get install -y ninja-build cmake \
                        flex bison libc-ares-dev \
diff --git a/projects/woff2/Dockerfile b/projects/woff2/Dockerfile
index fa42046..caccff5 100644
--- a/projects/woff2/Dockerfile
+++ b/projects/woff2/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER mmoroz@chromium.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 
 RUN git clone --depth 1 --recursive https://github.com/google/woff2
diff --git a/projects/wolfssl/Dockerfile b/projects/wolfssl/Dockerfile
index 3d41948..12742e1 100644
--- a/projects/wolfssl/Dockerfile
+++ b/projects/wolfssl/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER levi@wolfssl.com
 
 RUN apt-get update && apt-get install -y make autoconf automake libtool zip
 RUN git clone https://github.com/wolfssl/wolfssl --depth 1 $SRC/wolfssl
diff --git a/projects/wpantund/Dockerfile b/projects/wpantund/Dockerfile
index 2f0efba..c4cbe7c 100644
--- a/projects/wpantund/Dockerfile
+++ b/projects/wpantund/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER rquattle@google.com
 
 RUN apt-get -y update \
 	&& DEBIAN_FRONTEND=noninteractive \
diff --git a/projects/wuffs/Dockerfile b/projects/wuffs/Dockerfile
index 734a19a..c495515 100644
--- a/projects/wuffs/Dockerfile
+++ b/projects/wuffs/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER nigeltao@golang.org
 RUN apt-get update && apt-get install -y wget
 
 # Get Wuffs' first-party code.
diff --git a/projects/wxwidgets/Dockerfile b/projects/wxwidgets/Dockerfile
index 85a0afa..9ac1e68 100644
--- a/projects/wxwidgets/Dockerfile
+++ b/projects/wxwidgets/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER vadim@wxwidgets.org
 RUN apt-get update && apt-get install -y make
 RUN git clone --recurse-submodules --depth 1 https://github.com/wxWidgets/wxWidgets.git wxwidgets
 WORKDIR wxwidgets
diff --git a/projects/xerces-c/Dockerfile b/projects/xerces-c/Dockerfile
index 9df098e..c13bd9e 100755
--- a/projects/xerces-c/Dockerfile
+++ b/projects/xerces-c/Dockerfile
@@ -13,8 +13,9 @@
 #
 ################################################################################
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER vincent.ulitzsch@live.de
-RUN apt-get update && apt-get install -y make autoconf automake libtool wget zlib1g-dev libtool ninja-build cmake subversion
+RUN apt-get update -y && \
+    apt-get install -y make autoconf automake libtool wget zlib1g-dev \
+    binutils cmake subversion ninja-build liblzma-dev libz-dev pkg-config
 RUN svn co https://svn.apache.org/repos/asf/xerces/c/trunk $SRC/xerces-c
 RUN git clone --depth 1 https://github.com/google/libprotobuf-mutator.git
 RUN (mkdir LPM && cd LPM && cmake ../libprotobuf-mutator -GNinja -DLIB_PROTO_MUTATOR_DOWNLOAD_PROTOBUF=ON -DLIB_PROTO_MUTATOR_TESTING=OFF -DCMAKE_BUILD_TYPE=Release && ninja)
diff --git a/projects/xpdf/Dockerfile b/projects/xpdf/Dockerfile
index 4413a49..a3090f0 100755
--- a/projects/xpdf/Dockerfile
+++ b/projects/xpdf/Dockerfile
@@ -15,10 +15,10 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER david@adalogics.com
 RUN apt-get update && apt-get install -y make wget cmake libqt4-dev
-RUN wget https://xpdfreader-dl.s3.amazonaws.com/xpdf-4.02.tar.gz
+RUN wget --no-check-certificate https://dl.xpdfreader.com/xpdf-latest.tar.gz
 
 WORKDIR $SRC
 COPY fuzz_*.cc $SRC/
 COPY build.sh $SRC/
+COPY fuzz_pdfload.options $SRC/fuzz_pdfload.options
diff --git a/projects/xpdf/build.sh b/projects/xpdf/build.sh
index 4dfc189..584f504 100755
--- a/projects/xpdf/build.sh
+++ b/projects/xpdf/build.sh
@@ -15,11 +15,10 @@
 #
 ################################################################################
 
-# Unpack the file
-tar -zxvf xpdf-4.02.tar.gz   
-
-# Now make the build directory
-cd xpdf-4.02
+# Unpack the file and cd into it
+tar -zxvf xpdf-latest.tar.gz
+dir_name=`tar -tzf xpdf-latest.tar.gz | head -1 | cut -f1 -d"/"`
+cd $dir_name
 
 # Make minor change in the CMakeFiles file.
 sed -i 's/#--- object files needed by XpdfWidget/add_library(testXpdfStatic STATIC $<TARGET_OBJECTS:xpdf_objs>)\n#--- object files needed by XpdfWidget/' ./xpdf/CMakeLists.txt
@@ -31,5 +30,12 @@
 make -i || true
 
 # Build fuzzers
-cp ../../fuzz_zxdoc.cc .
-$CXX fuzz_zxdoc.cc -o $OUT/fuzz_zxdoc ./xpdf/libtestXpdfStatic.a ./fofi/libfofi.a ./goo/libgoo.a -I../ -I../goo -I../fofi -I. -I../xpdf $CXXFLAGS $LIB_FUZZING_ENGINE
+for fuzzer in zxdoc pdfload; do
+    cp ../../fuzz_$fuzzer.cc .
+    $CXX fuzz_$fuzzer.cc -o $OUT/fuzz_$fuzzer $CXXFLAGS $LIB_FUZZING_ENGINE \
+      ./xpdf/libtestXpdfStatic.a ./fofi/libfofi.a ./goo/libgoo.a \
+      -I../ -I../goo -I../fofi -I. -I../xpdf
+done
+
+# Copy over options files
+cp $SRC/fuzz_pdfload.options $OUT/
diff --git a/projects/xpdf/fuzz_pdfload.cc b/projects/xpdf/fuzz_pdfload.cc
new file mode 100644
index 0000000..fba7a90
--- /dev/null
+++ b/projects/xpdf/fuzz_pdfload.cc
@@ -0,0 +1,64 @@
+/*  Copyright 2020 Google Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <exception>
+#include "PDFDoc.h"
+#include "GlobalParams.h"
+#include "Zoox.h"
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+    char filename[256];
+    sprintf(filename, "/tmp/libfuzzer.%d", getpid());
+    FILE *fp = fopen(filename, "wb");
+    if (!fp)
+        return 0;
+    fwrite(data, size, 1, fp);
+    fclose(fp);
+
+    // Main fuzzing logic
+    Object info, xfa;
+    Object *acroForm;
+    globalParams = new GlobalParams(NULL);
+    globalParams->setErrQuiet(1);
+    globalParams->setupBaseFonts(NULL);
+
+    PDFDoc *doc = NULL;
+    try {
+        doc = new PDFDoc(filename, NULL, NULL);
+        if (doc->isOk() == gTrue)
+        {
+            doc->getNumPages();
+            if ((acroForm = doc->getCatalog()->getAcroForm())->isDict()) {
+                acroForm->dictLookup("XFA", &xfa);
+                xfa.free();
+            }
+        }
+    } catch (...) {
+
+    }
+
+    // Cleanup
+    if (doc != NULL)
+        delete doc;
+    delete globalParams;
+
+    // cleanup temporary file
+    unlink(filename);
+    return 0;
+}
+
diff --git a/projects/xpdf/fuzz_pdfload.options b/projects/xpdf/fuzz_pdfload.options
new file mode 100644
index 0000000..f9d0965
--- /dev/null
+++ b/projects/xpdf/fuzz_pdfload.options
@@ -0,0 +1,2 @@
+[libfuzzer]
+detect_leaks=0
diff --git a/projects/xpdf/project.yaml b/projects/xpdf/project.yaml
index 64eb5e5..b0956ee 100755
--- a/projects/xpdf/project.yaml
+++ b/projects/xpdf/project.yaml
@@ -1,5 +1,7 @@
 homepage: "https://www.xpdfreader.com/"
 primary_contact: "xpdf@xpdfreader.com"
 language: c++
+sanitizers:
+  - address
 auto_ccs :
   - "david@adalogics.com"
diff --git a/projects/xvid/Dockerfile b/projects/xvid/Dockerfile
index 7ff63d7..9b76763 100644
--- a/projects/xvid/Dockerfile
+++ b/projects/xvid/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER guidovranken@gmail.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool subversion
 RUN svn checkout http://svn.xvid.org/trunk --username anonymous --password "" --non-interactive --no-auth-cache
 RUN git clone --depth 1 https://github.com/guidovranken/fuzzing-headers.git
diff --git a/projects/xz/Dockerfile b/projects/xz/Dockerfile
index 7c79467..7e03362 100644
--- a/projects/xz/Dockerfile
+++ b/projects/xz/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER bshas3@email.com
 RUN apt-get update && apt-get install -y make autoconf autopoint libtool zip
 RUN git clone https://git.tukaani.org/xz.git
 COPY build.sh $SRC/
diff --git a/projects/yajl-ruby/Dockerfile b/projects/yajl-ruby/Dockerfile
index 9cd5f99..58ebe95 100644
--- a/projects/yajl-ruby/Dockerfile
+++ b/projects/yajl-ruby/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jonathan@titanous.com
 RUN git clone --depth 1 https://github.com/brianmario/yajl-ruby
 WORKDIR yajl-ruby
 COPY json_fuzzer.c $SRC/yajl-ruby/fuzz/
diff --git a/projects/yara/Dockerfile b/projects/yara/Dockerfile
index ab71c69..25c91ff 100644
--- a/projects/yara/Dockerfile
+++ b/projects/yara/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER vmalvarez@google.com
 RUN \
   apt-get update && apt-get install -y \
   automake \
diff --git a/projects/zeek/Dockerfile b/projects/zeek/Dockerfile
index 8eb9d54..ab64826 100644
--- a/projects/zeek/Dockerfile
+++ b/projects/zeek/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER jsiwek@corelight.com
 
 RUN apt-get update && apt-get install -y --no-install-recommends \
         patchelf \
diff --git a/projects/zetasql/Dockerfile b/projects/zetasql/Dockerfile
new file mode 100644
index 0000000..ebd2d25
--- /dev/null
+++ b/projects/zetasql/Dockerfile
@@ -0,0 +1,31 @@
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+FROM gcr.io/oss-fuzz-base/base-builder
+RUN apt-get update && apt-get --no-install-recommends install -y \
+        make autoconf automake libtool apt-transport-https \
+        libunwind-dev tzdata rsync \
+        curl gnupg openjdk-8-jdk
+
+RUN curl https://bazel.build/bazel-release.pub.gpg | apt-key add - && \
+    echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | tee /etc/apt/sources.list.d/bazel.list
+
+RUN apt-get update && apt-get -y install bazel-1.0.0
+
+RUN git clone -b master --depth 1 \
+    https://github.com/googleinterns/zetasql-fuzzing.git zetasql
+COPY build.sh $SRC/
+WORKDIR zetasql
diff --git a/projects/zetasql/build.sh b/projects/zetasql/build.sh
new file mode 100755
index 0000000..0e9e711
--- /dev/null
+++ b/projects/zetasql/build.sh
@@ -0,0 +1,123 @@
+#!/bin/bash -eu
+# Copyright 2020 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+################################################################################
+
+# This build.sh is partly modeled after that of envoyproxy:
+# https://github.com/google/oss-fuzz/blob/master/projects/envoy/build.sh
+
+export CFLAGS="$CFLAGS"
+export CXXFLAGS="$CXXFLAGS"
+
+# Copy $CFLAGS and $CXXFLAGS into Bazel command-line flags, for both
+# compilation and linking.
+#
+# Some flags, such as `-stdlib=libc++`, generate warnings if used on a C source
+# file. Since the build runs with `-Werror` this will cause it to break, so we
+# use `--conlyopt` and `--cxxopt` instead of `--copt`.
+declare -r EXTRA_BAZEL_FLAGS="$(
+for f in ${CFLAGS}; do
+  echo "--conlyopt=${f}" "--linkopt=${f}"
+done
+for f in ${CXXFLAGS}; do
+  echo "--cxxopt=${f}" "--linkopt=${f}"
+done
+
+# Questionable code block currently under investigation.
+if [ "$SANITIZER" = "undefined" ]
+then
+  # Bazel uses clang to link binary, which does not link clang_rt ubsan library for C++ automatically.
+  # See issue: https://github.com/bazelbuild/bazel/issues/8777
+  # echo "--linkopt=\"$(find $(llvm-config --libdir) -name libclang_rt.ubsan_standalone_cxx-x86_64.a | head -1)\""
+
+  # Modeled after: https://github.com/envoyproxy/envoy/blob/master/bazel/setup_clang.sh
+  echo "--linkopt=-L$(dirname $(find $(llvm-config --libdir) -name libclang_rt.ubsan_standalone_cxx-x86_64.a | head -1))"
+  echo "--linkopt=-l:libclang_rt.ubsan_standalone_cxx-x86_64.a"
+fi
+)"
+
+# Temporary hack, see https://github.com/google/oss-fuzz/issues/383
+readonly NO_VPTR='--copt=-fno-sanitize=vptr --linkopt=-fno-sanitize=vptr --cxxopt=-fno-sanitize=vptr'
+
+# Get all fuzz targets via `bazal query` and output error info to stderr. 
+# Exit status from `bazel query` is preserved from variable substitution.
+exec {FD}>&2; FUZZ_TARGETS=($(bazel-1.0.0 query 'attr("tags", "fuzzer", //...)' 2>&${FD})); exec {FD}>&-
+declare -ar FUZZ_TARGETS
+
+# Build fuzz target
+# see https://google.github.io/oss-fuzz/further-reading/fuzzer-environment/
+bazel-1.0.0 build --verbose_failures --compilation_mode=dbg \
+  --dynamic_mode=off \
+  --spawn_strategy=standalone \
+  --genrule_strategy=standalone \
+  --conlyopt=-Wno-error=c99-extensions \
+  --copt -D__OSS_FUZZ__ \
+  --copt -fno-sanitize-blacklist \
+  --linkopt=--rtlib=compiler-rt \
+  --linkopt=--unwindlib=libunwind \
+  --linkopt=-lc++ \
+  --linkopt="-rpath '\$ORIGIN\/lib'" \
+  --define LIB_FUZZING_ENGINE=${LIB_FUZZING_ENGINE} \
+  ${EXTRA_BAZEL_FLAGS} ${NO_VPTR} \
+  "${FUZZ_TARGETS[@]}"
+
+# Profiling with coverage requires that we resolve+copy all Bazel symlinks and
+# also remap everything under proc/self/cwd to correspond to Bazel build paths.
+if [ "$SANITIZER" = "coverage" ]
+then
+  # The build invoker looks for sources in $SRC, but it turns out that we need
+  # to not be buried under src/, paths are expected at out/proc/self/cwd by
+  # the profiler.
+  declare -r REMAP_PATH="${OUT}/proc/self/cwd"
+  mkdir -p "${REMAP_PATH}"
+  # For .cc, we only really care about source/ today.
+  rsync -av "${SRC}"/zetasql/zetasql "${REMAP_PATH}"
+  # Remove filesystem loop manually.
+  rm -rf "${SRC}"/zetasql/bazel-zetasql/external/com_google_zetasql
+  # Clean up symlinks with a missing referrant.
+  find "${SRC}"/zetasql/bazel-zetasql/external -follow -type l -ls -delete || echo "Symlink cleanup soft fail"
+  rsync -avLk "${SRC}"/zetasql/bazel-zetasql/external "${REMAP_PATH}"
+  # For .h, and some generated artifacts, we need bazel-out/. Need to heavily
+  # filter out the build objects from bazel-out/. Also need to resolve symlinks,
+  # since they don't make sense outside the build container.
+  declare -r RSYNC_FILTER_ARGS=("--include" "*.h" "--include" "*.cc" "--include" \
+    "*.hpp" "--include" "*.cpp" "--include" "*.c" "--include" "*.hh" "--include" \
+    "*.inc" "--include" "*/" "--exclude" "*")
+  rsync -avLk "${RSYNC_FILTER_ARGS[@]}" "${SRC}"/zetasql/bazel-out "${REMAP_PATH}"
+  rsync -avLkR "${RSYNC_FILTER_ARGS[@]}" "${HOME}" "${OUT}"
+  rsync -avLkR "${RSYNC_FILTER_ARGS[@]}" /tmp "${OUT}"
+fi
+
+# Move out dynamically linked libraries
+mkdir -p $OUT/lib
+cp /usr/lib/x86_64-linux-gnu/libunwind.so.8 $OUT/lib/
+
+# Move out tzdata
+mkdir -p $OUT/data
+cp -r /usr/share/zoneinfo $OUT/data/
+# Set localtime to UTC
+ln -sf Etc/UTC $OUT/data/zoneinfo/localtime
+
+# Move out fuzz target
+for target in ${FUZZ_TARGETS[@]};
+do
+    # Transform //foo/bar:baz to foo/bar/baz
+    relative_path=$(sed 's/^\/\/\(.*\):/\1\//' <<< "$target")
+    cp bazel-bin/"${relative_path}" "${OUT}"/
+done
+
+# Cleanup bazel- symlinks to avoid oss-fuzz trying to copy out of the build
+# cache.
+rm -f bazel-*
diff --git a/projects/zetasql/project.yaml b/projects/zetasql/project.yaml
new file mode 100644
index 0000000..93bd030
--- /dev/null
+++ b/projects/zetasql/project.yaml
@@ -0,0 +1,9 @@
+homepage: "https://github.com/google/zetasql"
+language: c++
+primary_contact: "evmaus@google.com"
+auto_ccs:
+ - "zdwho@google.com"
+ - "shumway@google.com"
+sanitizers:
+ - address
+ - undefined
diff --git a/projects/zlib-ng/Dockerfile b/projects/zlib-ng/Dockerfile
index 4f8dbf6..d860078 100644
--- a/projects/zlib-ng/Dockerfile
+++ b/projects/zlib-ng/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER sebpop@gmail.com
 RUN apt-get update && apt-get install -y make
 
 RUN git clone --depth 1 -b develop https://github.com/zlib-ng/zlib-ng.git
diff --git a/projects/zlib-ng/build.sh b/projects/zlib-ng/build.sh
index 10d9535..cb225ec 100755
--- a/projects/zlib-ng/build.sh
+++ b/projects/zlib-ng/build.sh
@@ -18,6 +18,7 @@
 export LDSHARED=$CXX
 export LDFLAGS="$CFLAGS -stdlib=libc++"
 ./configure
+
 sed -i "/^LDSHARED=.*/s#=.*#=$CXX#" Makefile
 sed -i 's/$(CC) $(LDFLAGS)/$(CXX) $(LDFLAGS)/g' Makefile
 
diff --git a/projects/zlib-ng/project.yaml b/projects/zlib-ng/project.yaml
index d9d8b13..2ef5854 100644
--- a/projects/zlib-ng/project.yaml
+++ b/projects/zlib-ng/project.yaml
@@ -3,6 +3,7 @@
 primary_contact: "zlib-ng@circlestorm.org"
 auto_ccs:
   - "sebpop@gmail.com"
+  - "nathan.moinvaziri@gmail.com"
 fuzzing_engines:
   - libfuzzer
   - afl
diff --git a/projects/zlib/Dockerfile b/projects/zlib/Dockerfile
index ade5269..be1cb4c 100644
--- a/projects/zlib/Dockerfile
+++ b/projects/zlib/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER inferno@chromium.org
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 -b develop https://github.com/madler/zlib.git
 WORKDIR zlib
diff --git a/projects/zopfli/Dockerfile b/projects/zopfli/Dockerfile
index 378b76e..502c451 100644
--- a/projects/zopfli/Dockerfile
+++ b/projects/zopfli/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER lode@google.com
 RUN apt-get update && apt-get install -y make autoconf automake libtool
 RUN git clone --depth 1 https://github.com/google/zopfli
 WORKDIR zopfli
diff --git a/projects/zstd/Dockerfile b/projects/zstd/Dockerfile
index 5e41221..d8b8c5e 100644
--- a/projects/zstd/Dockerfile
+++ b/projects/zstd/Dockerfile
@@ -15,7 +15,6 @@
 ################################################################################
 
 FROM gcr.io/oss-fuzz-base/base-builder
-MAINTAINER nickrterrell@gmail.com
 RUN apt-get update && apt-get install -y make python wget
 # Clone source
 RUN git clone --depth 1 https://github.com/facebook/zstd