diff --git a/projects/browser/Bundle-Data/PTConfigs/linux/torrc-defaults-appendix b/projects/browser/Bundle-Data/PTConfigs/linux/torrc-defaults-appendix
index c15471bce404b0fd673b844793f6c437e25b34d9..34aaedc46185804c0240cb419a013ac45045d149 100644
--- a/projects/browser/Bundle-Data/PTConfigs/linux/torrc-defaults-appendix
+++ b/projects/browser/Bundle-Data/PTConfigs/linux/torrc-defaults-appendix
@@ -3,3 +3,6 @@ ClientTransportPlugin meek_lite,obfs2,obfs3,obfs4,scramblesuit exec ./TorBrowser
 
 ## snowflake configuration
 ClientTransportPlugin snowflake exec ./TorBrowser/Tor/PluggableTransports/snowflake-client
+
+## webtunnel configuration
+ClientTransportPlugin webtunnel exec ./TorBrowser/Tor/PluggableTransports/webtunnel-client
diff --git a/projects/browser/Bundle-Data/PTConfigs/mac/torrc-defaults-appendix b/projects/browser/Bundle-Data/PTConfigs/mac/torrc-defaults-appendix
index 020b071adce97e0190e621eef624ef11aa35740b..9e17f053c2f73f6a3a4f356b05abfc3f2ec219e9 100644
--- a/projects/browser/Bundle-Data/PTConfigs/mac/torrc-defaults-appendix
+++ b/projects/browser/Bundle-Data/PTConfigs/mac/torrc-defaults-appendix
@@ -3,3 +3,6 @@ ClientTransportPlugin meek_lite,obfs2,obfs3,obfs4,scramblesuit exec PluggableTra
 
 ## snowflake configuration
 ClientTransportPlugin snowflake exec PluggableTransports/snowflake-client
+
+## webtunnel configuration
+ClientTransportPlugin webtunnel exec PluggableTransports/webtunnel-client
diff --git a/projects/browser/Bundle-Data/PTConfigs/windows/torrc-defaults-appendix b/projects/browser/Bundle-Data/PTConfigs/windows/torrc-defaults-appendix
index 00166e08c0fe67e92f249b5dc3426188d3317f21..7c593a5efaf616dea3f1491ecc608769fde962a4 100644
--- a/projects/browser/Bundle-Data/PTConfigs/windows/torrc-defaults-appendix
+++ b/projects/browser/Bundle-Data/PTConfigs/windows/torrc-defaults-appendix
@@ -3,3 +3,6 @@ ClientTransportPlugin meek_lite,obfs2,obfs3,obfs4,scramblesuit exec TorBrowser\T
 
 ## snowflake configuration
 ClientTransportPlugin snowflake exec TorBrowser\Tor\PluggableTransports\snowflake-client.exe
+
+## webtunnel configuration
+ClientTransportPlugin webtunnel exec TorBrowser\Tor\PluggableTransports\webtunnel-client.exe
diff --git a/projects/browser/build b/projects/browser/build
index 57544b461852a94d12420d0fec4be112c55305c3..cb42b5fb676e9c6b5ac8ff8768a113f7d2199e38 100644
--- a/projects/browser/build
+++ b/projects/browser/build
@@ -88,9 +88,13 @@ mv [% c('input_files_by_name/noscript') %] "$TBDIR/$EXTSPATH/{73a6fe31-595d-460b
     rm -f aarch64/tor/pluggable_transports/bridges_list.*.txt
   [% END -%]
 
-  # Snowflake's README is the only documentation shipped in tor-expert-bundle
+  # Snowflake's README is a documentation shipped in tor-expert-bundle
   mkdir -p "$TBDIR/$DOCSPATH/snowflake" [% IF c("var/macos_universal") %]"$TBDIR_AARCH64/$DOCSPATH/snowflake"[% END %]
   mv_tbdir tor/pluggable_transports/README.SNOWFLAKE.md "$DOCSPATH/snowflake/README.md"
+  
+  # WebTunnel's README is a documentation shipped in tor-expert-bundle
+  mkdir -p "$TBDIR/$DOCSPATH/webtunnel" [% IF c("var/macos_universal") %]"$TBDIR_AARCH64/$DOCSPATH/webtunnel"[% END %]
+  mv_tbdir tor/pluggable_transports/README.WEBTUNNEL.md "$DOCSPATH/webtunnel/README.md"
 
   # Move the PTs to where TB expects them
   mkdir -p "$TBDIR/$TORBINPATH" [% IF c("var/macos_universal") %]"$TBDIR_AARCH64/$TORBINPATH"[% END %]
diff --git a/projects/go/config b/projects/go/config
index 976f5485a3c19b754e32d71a8c87cb5d800e7ea0..c21c7765fdddcc0caf841fa227d3029234c107cd 100644
--- a/projects/go/config
+++ b/projects/go/config
@@ -26,7 +26,7 @@ var:
       export CGO_LDFLAGS_ALLOW="-z|noexecstack"
       export CGO_LDFLAGS="-z noexecstack"
     [% END -%]
-    [% IF c("var/linux-i686") -%]
+    [% IF c("var/cgo") -%]
       export CGO_ENABLED=1
     [% END -%]
     export GOTMPDIR=/var/tmp/build/go-tmp
diff --git a/projects/tor-expert-bundle/build b/projects/tor-expert-bundle/build
index 0a8957c5cefad047c336734bf4796bae6af36c62..b8bd5558729a0a00fd9179fa5c8a1c1ae5eda11a 100644
--- a/projects/tor-expert-bundle/build
+++ b/projects/tor-expert-bundle/build
@@ -11,6 +11,7 @@ mkdir pluggable_transports && cd pluggable_transports
 
 tar -xkf $rootdir/[% c('input_files_by_name/obfs4') %]
 tar -xkf $rootdir/[% c('input_files_by_name/snowflake') %]
+tar -xkf $rootdir/[% c('input_files_by_name/webtunnel') %]
 
 # copy in bridge lines for each pluggable transport
 mv $rootdir/bridges_list.obfs4.txt .
diff --git a/projects/tor-expert-bundle/config b/projects/tor-expert-bundle/config
index 894539efed806af30a09450b956d89436dca2f06..e93421da08712444b0af138f1b394b786b7ad81e 100644
--- a/projects/tor-expert-bundle/config
+++ b/projects/tor-expert-bundle/config
@@ -13,6 +13,8 @@ input_files:
     project: obfs4
   - name: snowflake
     project: snowflake
+  - project: webtunnel
+    name: webtunnel
   - filename: bridges_list.obfs4.txt
   - filename: bridges_list.meek-azure.txt
-  - filename: bridges_list.snowflake.txt
+  - filename: bridges_list.snowflake.txt
\ No newline at end of file
diff --git a/projects/webtunnel/build b/projects/webtunnel/build
new file mode 100644
index 0000000000000000000000000000000000000000..79450554c390763408545e90c6262b6fee0e0c68
--- /dev/null
+++ b/projects/webtunnel/build
@@ -0,0 +1,34 @@
+#!/bin/bash
+[% c("var/set_default_env") -%]
+[% pc('go', 'var/setup', { go_tarfile => c('input_files_by_name/go') }) %]
+distdir=/var/tmp/dist/[% project %]
+mkdir -p $distdir
+
+[% IF c("var/android") -%]
+  [% pc(c('var/compiler'), 'var/setup', { compiler_tarfile => c('input_files_by_name/' _ c('var/compiler')) }) %]
+  # We need to explicitly set CGO_ENABLED with Go 1.13.x as the Android build
+  # breaks otherwise.
+  export CGO_ENABLED=1
+[% END -%]
+
+tar -C /var/tmp/dist -xf [% c('input_files_by_name/goptlib') %]
+
+mkdir -p /var/tmp/build
+tar -C /var/tmp/build -xf [% project %]-[% c('version') %].tar.gz
+cd /var/tmp/build/[% project %]-[% c('version') %]
+
+mkdir -p "$GOPATH/src/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/webtunnel.git"
+ln -sf "$PWD" "$GOPATH/src/gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/webtunnel"
+
+cd main/client
+go build -ldflags '-s'
+cp -a client[% IF c("var/windows") %].exe[% END %] $distdir/webtunnel-client[% IF c("var/windows") %].exe[% END %]
+
+cd /var/tmp/build/[% project %]-[% c('version') %]
+cp -a README.md $distdir/README.WEBTUNNEL.md
+
+cd $distdir
+[% c('tar', {
+        tar_src => [ '.' ],
+        tar_args => '-czf ' _ dest_dir _ '/' _ c('filename'),
+    }) %]
diff --git a/projects/webtunnel/config b/projects/webtunnel/config
new file mode 100644
index 0000000000000000000000000000000000000000..ef26aeffa398a40f095f024d891fa67fd2a1e17c
--- /dev/null
+++ b/projects/webtunnel/config
@@ -0,0 +1,17 @@
+# vim: filetype=yaml sw=2
+version: '[% c("abbrev") %]'
+git_url: https://gitlab.torproject.org/tpo/anti-censorship/pluggable-transports/webtunnel.git
+git_hash: 2ecf64381bad8a5db45c5871dcad7d12831dca69
+filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.gz'
+container:
+  use_container: 1
+
+input_files:
+  - project: container-image
+  - name: go
+    project: go
+  - name: goptlib
+    project: goptlib
+  - name: '[% c("var/compiler") %]'
+    project: '[% c("var/compiler") %]'
+    enable: '[% c("var/android") %]'