diff --git a/roles/postgres/files/upgrade_pg.sh b/roles/postgres/files/upgrade_pg.sh
index 57790d3359a072a8012de7398e83d7fea7c6ff09..0662285544687b769720111d49ed1eb171645647 100755
--- a/roles/postgres/files/upgrade_pg.sh
+++ b/roles/postgres/files/upgrade_pg.sh
@@ -5,7 +5,7 @@ set -e
 TO_VERSION=$(pacman -Q postgresql | grep -Po '(?<=postgresql )[0-9]+\.[0-9]')
 
 to_major=${TO_VERSION%%.*}
-if (( $to_major != 15 )); then
+if (( $to_major != 16 )); then
 	# NOTE: When this happens you should check the changelog and add any
 	# necessary changes here. Then bump the version check.
 	echo "ERROR: major upgrade detected, aborting..."
diff --git a/roles/postgres/templates/postgresql.conf.j2 b/roles/postgres/templates/postgresql.conf.j2
index 843f8070e7d543c032d4986663417f3151a24bbf..d7b5c42c132d7aaac6579783d1976eeaaa74dc7c 100644
--- a/roles/postgres/templates/postgresql.conf.j2
+++ b/roles/postgres/templates/postgresql.conf.j2
@@ -63,6 +63,7 @@ listen_addresses = '{{ postgres_listen_addresses }}'		# what IP address(es) to l
 					# (change requires restart)
 #port = 5432				# (change requires restart)
 max_connections = {{ postgres_max_connections }}			# (change requires restart)
+#reserved_connections = 0		# (change requires restart)
 #superuser_reserved_connections = 3	# (change requires restart)
 #unix_socket_directories = '/run/postgresql'	# comma-separated list of directories
 					# (change requires restart)
@@ -94,11 +95,13 @@ max_connections = {{ postgres_max_connections }}			# (change requires restart)
 
 #authentication_timeout = 1min		# 1s-600s
 #password_encryption = scram-sha-256	# scram-sha-256 or md5
+#scram_iterations = 4096
 #db_user_namespace = off
 
 # GSSAPI using Kerberos
 #krb_server_keyfile = 'FILE:${sysconfdir}/krb5.keytab'
 #krb_caseins_users = off
+#gss_accept_delegation = off
 
 # - SSL -
 
@@ -147,7 +150,7 @@ maintenance_work_mem = {{ postgres_maintenance_work_mem }}		# min 1MB
 					#   sysv
 					#   windows
 					# (change requires restart)
-dynamic_shared_memory_type = posix	# the default is usually the first option
+#dynamic_shared_memory_type = posix	# the default is usually the first option
 					# supported by the operating system:
 					#   posix
 					#   sysv
@@ -155,6 +158,9 @@ dynamic_shared_memory_type = posix	# the default is usually the first option
 					#   mmap
 					# (change requires restart)
 #min_dynamic_shared_memory = 0MB	# (change requires restart)
+#vacuum_buffer_usage_limit = 256kB	# size of vacuum and analyze buffer access strategy ring;
+					# 0 to disable vacuum buffer access strategy;
+					# range 128kB to 16GB
 
 # - Disk -
 
@@ -179,7 +185,7 @@ dynamic_shared_memory_type = posix	# the default is usually the first option
 #bgwriter_delay = 200ms			# 10-10000ms between rounds
 #bgwriter_lru_maxpages = 100		# max buffers written/round, 0 disables
 #bgwriter_lru_multiplier = 2.0		# 0-10.0 multiplier on buffers scanned/round
-#bgwriter_flush_after = 512kB		# measured in pages, 0 disables
+#bgwriter_flush_after = 0		# measured in pages, 0 disables
 
 # - Asynchronous Behavior -
 
@@ -236,10 +242,10 @@ dynamic_shared_memory_type = posix	# the default is usually the first option
 
 #checkpoint_timeout = 5min		# range 30s-1d
 #checkpoint_completion_target = 0.9	# checkpoint target duration, 0.0 - 1.0
-#checkpoint_flush_after = 256kB		# measured in pages, 0 disables
+#checkpoint_flush_after = 0		# measured in pages, 0 disables
 #checkpoint_warning = 30s		# 0 disables
-max_wal_size = 1GB
-min_wal_size = 80MB
+#max_wal_size = 1GB
+#min_wal_size = 80MB
 
 # - Prefetching during recovery -
 
@@ -251,21 +257,21 @@ min_wal_size = 80MB
 
 #archive_mode = off		# enables archiving; off, on, or always
 				# (change requires restart)
-#archive_library = ''		# library to use to archive a logfile segment
+#archive_library = ''		# library to use to archive a WAL file
 				# (empty string indicates archive_command should
 				# be used)
-#archive_command = ''		# command to use to archive a logfile segment
+#archive_command = ''		# command to use to archive a WAL file
 				# placeholders: %p = path of file to archive
 				#               %f = file name only
 				# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
-#archive_timeout = 0		# force a logfile segment switch after this
+#archive_timeout = 0		# force a WAL file switch after this
 				# number of seconds; 0 disables
 
 # - Archive Recovery -
 
 # These are only used in recovery mode.
 
-#restore_command = ''		# command to use to restore an archived logfile segment
+#restore_command = ''		# command to use to restore an archived WAL file
 				# placeholders: %p = path of file to restore
 				#               %f = file name only
 				# e.g. 'cp /mnt/server/archivedir/%f %p'
@@ -323,7 +329,6 @@ min_wal_size = 80MB
 				# method to choose sync standbys, number of sync standbys,
 				# and comma-separated list of application_name
 				# from standby(s); '*' = all
-#vacuum_defer_cleanup_age = 0	# number of xacts by which cleanup is delayed
 
 # - Standby Servers -
 
@@ -331,7 +336,6 @@ min_wal_size = 80MB
 
 #primary_conninfo = ''			# connection string to sending server
 #primary_slot_name = ''			# replication slot on sending server
-#promote_trigger_file = ''		# file name whose presence ends recovery
 #hot_standby = on			# "off" disallows queries during recovery
 					# (change requires restart)
 #max_standby_archive_delay = 30s	# max delay before canceling queries
@@ -360,6 +364,7 @@ min_wal_size = 80MB
 #max_logical_replication_workers = 4	# taken from max_worker_processes
 					# (change requires restart)
 #max_sync_workers_per_subscription = 2	# taken from max_logical_replication_workers
+#max_parallel_apply_workers_per_subscription = 2	# taken from max_logical_replication_workers
 
 
 #------------------------------------------------------------------------------
@@ -385,6 +390,7 @@ min_wal_size = 80MB
 #enable_partition_pruning = on
 #enable_partitionwise_join = off
 #enable_partitionwise_aggregate = off
+#enable_presorted_aggregate = on
 #enable_seqscan = on
 #enable_sort = on
 #enable_tidscan = on
@@ -596,10 +602,7 @@ log_line_prefix = '%d: '		# special values:
 					# -1 disables, 0 logs all temp files
 log_timezone = 'UTC'
 
-
-#------------------------------------------------------------------------------
-# PROCESS TITLE
-#------------------------------------------------------------------------------
+# - Process Title -
 
 #cluster_name = ''			# added to process titles if nonempty
 					# (change requires restart)
@@ -618,7 +621,7 @@ log_timezone = 'UTC'
 #track_io_timing = off
 #track_wal_io_timing = off
 #track_functions = none			# none, pl, all
-#stats_fetch_consistency = cache
+#stats_fetch_consistency = cache	# cache, none, snapshot
 
 
 # - Monitoring -
@@ -705,10 +708,11 @@ log_timezone = 'UTC'
 #xmlbinary = 'base64'
 #xmloption = 'content'
 #gin_pending_list_limit = 4MB
+#createrole_self_grant = ''		# set and/or inherit
 
 # - Locale and Formatting -
 
-datestyle = 'iso, mdy'
+#datestyle = 'iso, mdy'
 #intervalstyle = 'postgres'
 timezone = 'UTC'
 #timezone_abbreviations = 'Default'     # Select the set of available time zone
@@ -730,6 +734,9 @@ lc_monetary = 'C.UTF-8'			# locale for monetary formatting
 lc_numeric = 'C.UTF-8'			# locale for number formatting
 lc_time = 'C.UTF-8'				# locale for time formatting
 
+#icu_validation_level = warning		# report ICU locale validation
+					# errors at the given level
+
 # default configuration for text search
 default_text_search_config = 'pg_catalog.english'