diff --git a/docs/user/site.rst b/docs/user/site.rst
index a206c1d1ff2b14358451c07c09af334ddc573fae..7097a3e0008c29600a96c143fb532ea1fbb40f67 100644
--- a/docs/user/site.rst
+++ b/docs/user/site.rst
@@ -229,6 +229,9 @@ mesh_on_wan \: optional
 mesh_on_lan \: optional
     Enables the mesh on the LAN port (``true`` or ``false``).
 
+poe_passthrough \: optional
+    Enable PoE passthrough by default on hardware with such a feature.
+
 autoupdater \: package
     Configuration for the autoupdater feature of Gluon.
 
diff --git a/package/gluon-core/check_site.lua b/package/gluon-core/check_site.lua
index 1647d778e14d3d3c4b63ca7db65ac03273352df9..1c81371e08c350ce5c4c9f50138d4a4e97db628e 100644
--- a/package/gluon-core/check_site.lua
+++ b/package/gluon-core/check_site.lua
@@ -30,3 +30,5 @@ for _, config in ipairs({'wifi24', 'wifi5'}) do
     need_number(config .. '.channel')
   end
 end
+
+need_boolean('poe_passthrough', false)
diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/150-poe-passthrough b/package/gluon-core/luasrc/lib/gluon/upgrade/150-poe-passthrough
new file mode 100755
index 0000000000000000000000000000000000000000..81e6740bf78f9e5f526409c444ddbdba13a279ff
--- /dev/null
+++ b/package/gluon-core/luasrc/lib/gluon/upgrade/150-poe-passthrough
@@ -0,0 +1,13 @@
+#!/usr/bin/lua
+
+local sysconfig = require 'gluon.sysconfig'
+local site = require 'gluon.site_config'
+
+if (not sysconfig.gluon_version) and (site.poe_passthrough == true) then
+	local uci = require('luci.model.uci').cursor()
+
+  if uci:get('system', 'gpio_switch_poe_passthrough') then
+    uci:set('system', 'gpio_switch_poe_passthrough', 'value', 1)
+    uci:save('system')
+  end
+end