diff --git a/README.md b/README.md
index 7573a32..4d58a84 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,7 @@ Finally, if installing on a low-end ARM device (e.g. Raspberry Pi):
 
 To learn more about the philosophy and goals of the project, [visit **discourse.org**](http://www.discourse.org).
 
-**Shipped version:** 2.2.6
+**Shipped version:** 2.3.0
 
 ## Screenshots
 
diff --git a/conf/app.src b/conf/app.src
index 76c956b..f0fc559 100644
--- a/conf/app.src
+++ b/conf/app.src
@@ -1,3 +1,3 @@
-SOURCE_URL=https://github.com/discourse/discourse/archive/v2.2.6.tar.gz
-SOURCE_SUM=6d64745f50f9fb6d99e3c766d758869a9baa36ad0ccfc254b215fbcba232f52a
+SOURCE_URL=https://github.com/discourse/discourse/archive/v2.3.0.tar.gz
+SOURCE_SUM=22a8c9dbc6df396f7ee4946f5a2ecdca3e42fad2d1c238dab17f65b316cce754
 SOURCE_FORMAT=tar.gz
diff --git a/manifest.json b/manifest.json
index e602cab..f0d4b8d 100644
--- a/manifest.json
+++ b/manifest.json
@@ -6,7 +6,7 @@
         "en": "Discussion platform",
         "fr": "Plateforme de discussion"
     },
-    "version": "2.2.6~ynh1",
+    "version": "2.3.0~ynh1",
     "url": "http://Discourse.org",
     "license": "GPL-2.0",
     "maintainer": {
diff --git a/scripts/_common.sh b/scripts/_common.sh
index d267bab..9131c28 100644
--- a/scripts/_common.sh
+++ b/scripts/_common.sh
@@ -3,7 +3,7 @@
 # Common variables
 #
 
-pkg_dependencies="libjemalloc1 libjemalloc-dev zlib1g-dev libreadline-dev libpq-dev libssl-dev libyaml-dev libcurl4-openssl-dev libapr1-dev libxslt1-dev checkinstall libxml2-dev vim imagemagick postgresql postgresql-server-dev-all postgresql-contrib optipng jhead jpegoptim gifsicle"
+pkg_dependencies="libjemalloc1 libjemalloc-dev zlib1g-dev libreadline-dev libpq-dev libssl-dev libyaml-dev libcurl4-openssl-dev libapr1-dev libxslt1-dev checkinstall libxml2-dev vim imagemagick postgresql postgresql-server-dev-all postgresql-contrib optipng jhead jpegoptim gifsicle brotli"
 RUBY_VERSION="2.6.0"
 
 # Execute a command as another user with login
diff --git a/scripts/upgrade b/scripts/upgrade
index 0c72732..ae463bd 100644
--- a/scripts/upgrade
+++ b/scripts/upgrade
@@ -114,7 +114,17 @@ if ! ynh_is_upstream_up_to_date ; then
 	if [ -d $tmpdir/log ] ; then
 		cp -Rp $tmpdir/log $final_path
 	fi
-	cp -Rp $tmpdir/plugins/* $final_path/plugins
+	(
+		cd $tmpdir/plugins/
+    for discourse_plugin_dir in */
+    do
+			# Only copy plugins not included in Discourse archive
+      if [ ! -d "$final_path/plugins/$discourse_plugin_dir" ]
+      then
+        cp -a "$discourse_plugin_dir" "$final_path/plugins/$discourse_plugin_dir"
+      fi
+    done
+  )
 	cp -Rp $tmpdir/log $final_path
 	cp -p $tmpdir/discourse.conf $final_path/config
 
diff --git a/sources/patches/app-1-use-latest_uglify-js.patch b/sources/patches/app-1-use-latest_uglify-js.patch
index 97d9375..5af4246 100644
--- a/sources/patches/app-1-use-latest_uglify-js.patch
+++ b/sources/patches/app-1-use-latest_uglify-js.patch
@@ -1,5 +1,5 @@
 diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake
-index 8575ca11dc..a643316bac 100644
+index 4a02d5f1b1..7b47f21658 100644
 --- a/lib/tasks/assets.rake
 +++ b/lib/tasks/assets.rake
 @@ -94,6 +94,7 @@ def compress_ruby(from, to)
diff --git a/sources/patches/app-3-Re-add-support-for-older-versions-of-brotli.patch b/sources/patches/app-3-Re-add-support-for-older-versions-of-brotli.patch
new file mode 100644
index 0000000..728758a
--- /dev/null
+++ b/sources/patches/app-3-Re-add-support-for-older-versions-of-brotli.patch
@@ -0,0 +1,29 @@
+diff --git a/lib/tasks/assets.rake b/lib/tasks/assets.rake
+index 7b47f21658..ea6d0da2c4 100644
+--- a/lib/tasks/assets.rake
++++ b/lib/tasks/assets.rake
+@@ -116,9 +116,21 @@ def gzip(path)
+ end
+
+ # different brotli versions use different parameters
+-def brotli_command(path, max_compress)
+-  compression_quality = max_compress ? "11" : "6"
+-  "brotli -f --quality=#{compression_quality} #{path} --output=#{path}.br"
++ver_out, _ver_err, ver_status = Open3.capture3('brotli --version')
++if !ver_status.success?
++  # old versions of brotli don't respond to --version
++  def brotli_command(path, max_compress)
++    compression_quality = max_compress ? "11" : "6"
++    "brotli --quality 11 --input #{path} --output #{path}.br"
++  end
++elsif ver_out >= "brotli 1.0.0"
++  def brotli_command(path, max_compress)
++    compression_quality = max_compress ? "11" : "6"
++    "brotli -f --quality=11 #{path} --output=#{path}.br"
++  end
++else
++  # not sure what to do here, not expecting this
++  raise "cannot determine brotli version"
+ end
+
+ def brotli(path, max_compress)
diff --git a/sources/patches/app-4-Fix-version-detection.patch b/sources/patches/app-4-Fix-version-detection.patch
new file mode 100644
index 0000000..efe97d0
--- /dev/null
+++ b/sources/patches/app-4-Fix-version-detection.patch
@@ -0,0 +1,12 @@
+diff --git a/lib/discourse.rb b/lib/discourse.rb
+index 2b53a91eb3..eec55647d5 100644
+--- a/lib/discourse.rb
++++ b/lib/discourse.rb
+@@ -439,7 +439,7 @@ module Discourse
+     $full_version ||=
+       begin
+         git_cmd = 'git describe --dirty --match "v[0-9]*"'
+-        self.try_git(git_cmd, 'unknown')
++        self.try_git(git_cmd, Discourse::VERSION::STRING)
+       end
+   end
diff --git a/sources/patches_arm/app-2-Revert-libv8-mini_racer-dependencies-for-ARM-compati.patch b/sources/patches_arm/app-2-Revert-libv8-mini_racer-dependencies-for-ARM-compati.patch
index 3acd77d..ef7a7c8 100644
--- a/sources/patches_arm/app-2-Revert-libv8-mini_racer-dependencies-for-ARM-compati.patch
+++ b/sources/patches_arm/app-2-Revert-libv8-mini_racer-dependencies-for-ARM-compati.patch
@@ -1,24 +1,24 @@
 diff --git a/Gemfile.lock b/Gemfile.lock
-index df7187902b..04c80a956c 100644
+index 0fa35801f0..2b7c4a3fc8 100644
 --- a/Gemfile.lock
 +++ b/Gemfile.lock
-@@ -172,7 +172,7 @@ GEM
-     jwt (2.1.0)
+@@ -154,7 +154,7 @@ GEM
+     json (2.2.0)
+     jwt (2.2.1)
      kgio (2.11.2)
-     kramdown (1.17.0)
 -    libv8 (7.3.492.27.1)
 +    libv8 (6.3.292.48.1)
      listen (3.1.5)
        rb-fsevent (~> 0.9, >= 0.9.4)
        rb-inotify (~> 0.9, >= 0.9.7)
-@@ -200,8 +200,8 @@ GEM
-     method_source (0.8.2)
+@@ -182,8 +182,8 @@ GEM
+     method_source (0.9.2)
      mini_mime (1.0.1)
      mini_portile2 (2.4.0)
--    mini_racer (0.2.5)
+-    mini_racer (0.2.6)
 -      libv8 (>= 6.9.411)
 +    mini_racer (0.1.15)
 +      libv8 (~> 6.3)
-     mini_scheduler (0.9.1)
+     mini_scheduler (0.9.2)
        sidekiq
-     mini_sql (0.1.10)
+     mini_sql (0.2.2)