diff --git a/.cockpit.metadata b/.cockpit.metadata
index 9e5b49f..e79a3c0 100644
--- a/.cockpit.metadata
+++ b/.cockpit.metadata
@@ -1 +1 @@
-dca96395c50ceb53ea1b9ccebdd48545977b9e91 SOURCES/cockpit-165.tar.xz
+09fbed228c0d65cf2a54fb127a7652fc1c659a6d SOURCES/cockpit-169.tar.xz
diff --git a/.gitignore b/.gitignore
index afd96c1..2db1bb1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/cockpit-165.tar.xz
+SOURCES/cockpit-169.tar.xz
diff --git a/SPECS/cockpit.spec b/SPECS/cockpit.spec
index daff981..6511e4c 100644
--- a/SPECS/cockpit.spec
+++ b/SPECS/cockpit.spec
@@ -22,6 +22,13 @@
 # define to build the dashboard
 %define build_dashboard 1
 
+# build basic packages like cockpit-bridge
+%define build_basic 1
+# build optional extensions like cockpit-docker
+%define build_optional 1
+
+%define __lib lib
+
 # on RHEL 7.x we build subscriptions; superseded in RHEL 8 (and Fedora) by
 # external subscription-manager-cockpit
 %if 0%{?rhel} >= 7 && 0%{?rhel} < 8
@@ -34,18 +41,24 @@
 %define libssh_version 0.6.0
 %endif
 
+%if 0%{?rhel} >= 8
+%global go_scl_prefix go-toolset-7-
+%else
+%global go_scl_prefix %{nil}
+%endif
+
 Name:           cockpit
 Summary:        A user interface for Linux servers
 
 License:        LGPLv2+
-URL:            http://cockpit-project.org/
+URL:            https://cockpit-project.org/
 
-Version:        165
+Version:        169
 %if %{defined wip}
 Release:        1.%{wip}%{?dist}
 Source0:        cockpit-%{version}.tar.gz
 %else
-Release:        3%{?dist}
+Release:        1%{?dist}
 Source0:        https://github.com/cockpit-project/cockpit/releases/download/%{version}/cockpit-%{version}.tar.xz
 %endif
 
@@ -88,36 +101,21 @@ Requires: %{name}-system = %{version}-%{release}
 # Optional components (for f24 we use soft deps)
 %if 0%{?fedora} >= 24 || 0%{?rhel} >= 8
 Recommends: %{name}-dashboard = %{version}-%{release}
-Recommends: %{name}-networkmanager = %{version}-%{release}
-Recommends: %{name}-storaged = %{version}-%{release}
-Recommends: sscg >= 2.3
+Recommends: (%{name}-networkmanager = %{version}-%{release} if NetworkManager)
+Recommends: (%{name}-storaged = %{version}-%{release} if udisks2)
+Recommends: (%{name}-packagekit = %{version}-%{release} if PackageKit)
 %if 0%{?rhel} >= 8
 Recommends: subscription-manager-cockpit
 %endif
 %ifarch x86_64 %{arm} aarch64 ppc64le i686 s390x
-Recommends: %{name}-docker = %{version}-%{release}
+Recommends: (%{name}-docker = %{version}-%{release} if /usr/bin/docker)
 %endif
 Suggests: %{name}-pcp = %{version}-%{release}
 Suggests: %{name}-kubernetes = %{version}-%{release}
 Suggests: %{name}-selinux = %{version}-%{release}
 Suggests: %{name}-packagekit = %{version}-%{release}
-
 %endif
 
-%description
-Cockpit runs in a browser and can manage your network of GNU/Linux
-machines.
-
-%files
-%{_docdir}/%{name}/AUTHORS
-%{_docdir}/%{name}/COPYING
-%{_docdir}/%{name}/README.md
-%dir %{_datadir}/%{name}
-%{_datadir}/metainfo/cockpit.appdata.xml
-%{_datadir}/applications/cockpit.desktop
-%{_datadir}/pixmaps/cockpit.png
-%doc %{_mandir}/man1/cockpit.1.gz
-
 %prep
 %setup -q
 
@@ -143,6 +141,7 @@ exec 2>&1
     --with-selinux-config-type=etc_t \
     %{?rhel:--without-storaged-iscsi-sessions} \
     --with-appstream-data-packages='[ "appstream-data" ]' \
+    --with-nfs-client-package='"nfs-utils"' \
     %{!?build_dashboard:--disable-ssh}
 make -j4 %{?extra_flags} all
 
@@ -258,6 +257,39 @@ rm %{buildroot}/%{_libexecdir}/cockpit-stub
 touch kubernetes.list
 %endif
 
+# when not building basic packages, remove their files
+%if 0%{?build_basic} == 0
+for pkg in base1 branding issue kdump networkmanager realmd selinux shell sosreport static storaged systemd tuned users; do
+    rm -r %{buildroot}/%{_datadir}/%{name}/$pkg
+done
+for data in applications doc locale man metainfo pixmaps; do
+    rm -r %{buildroot}/%{_datadir}/$data
+done
+for lib in systemd tmpfiles.d firewalld; do
+    rm -r %{buildroot}/%{_prefix}/%{__lib}/$lib
+done
+for libexec in cockpit-askpass cockpit-session cockpit-ws; do
+    rm %{buildroot}/%{_libexecdir}/$libexec
+done
+rm -r %{buildroot}/%{_libdir}/security %{buildroot}/%{_sysconfdir}/pam.d
+rm %{buildroot}/usr/bin/cockpit-bridge %{buildroot}/usr/sbin/remotectl
+%endif
+
+# when not building optional packages, remove their files
+%if 0%{?build_optional} == 0
+for pkg in apps dashboard docker kubernetes machines ostree ovirt packagekit pcp playground ssh; do
+    rm -r %{buildroot}/%{_datadir}/%{name}/$pkg
+done
+# files from -tests
+rm -r %{buildroot}/%{_prefix}/%{__lib}/cockpit-test-assets %{buildroot}/%{_sysconfdir}/cockpit/cockpit.conf
+# files from -pcp
+rm -r %{buildroot}/%{_libexecdir}/cockpit-pcp %{buildroot}/%{_localstatedir}/lib/pcp/
+# files from -kubernetes
+rm %{buildroot}/%{_libexecdir}/cockpit-kube-auth %{buildroot}/%{_libexecdir}/cockpit-kube-launch %{buildroot}/%{_libexecdir}/cockpit-stub
+# files from -dashboard
+rm %{buildroot}%{_libexecdir}/cockpit-ssh
+%endif
+
 # On RHEL, apps is not currently built
 %if 0%{?rhel}
 rm -rf %{buildroot}/%{_datadir}/%{name}/apps
@@ -280,7 +312,9 @@ rm %{buildroot}/usr/share/metainfo/org.cockpit-project.cockpit-sosreport.metainf
 rm %{buildroot}/usr/share/pixmaps/cockpit-sosreport.png
 %endif
 
+%if 0%{?build_basic}
 %find_lang %{name}
+%endif
 
 # dwz has trouble with the go binaries
 # https://fedoraproject.org/wiki/PackagingDrafts/Go
@@ -299,9 +333,28 @@ rm %{buildroot}/usr/share/pixmaps/cockpit-sosreport.png
 %{nil}
 
 # -------------------------------------------------------------------------------
-# Sub-packages
+# Basic Sub-packages
+
+%if 0%{?build_basic}
+
+%description
+Cockpit runs in a browser and can manage your network of GNU/Linux
+machines.
+
+%if 0%{?rhel} >= 8
+%enable_gotoolset7
+%endif
+
+%files
+%{_docdir}/%{name}/AUTHORS
+%{_docdir}/%{name}/COPYING
+%{_docdir}/%{name}/README.md
+%dir %{_datadir}/%{name}
+%{_datadir}/metainfo/cockpit.appdata.xml
+%{_datadir}/applications/cockpit.desktop
+%{_datadir}/pixmaps/cockpit.png
+%doc %{_mandir}/man1/cockpit.1.gz
 
-%define __lib lib
 
 %package bridge
 Summary: Cockpit bridge server-side component
@@ -331,106 +384,10 @@ embed or extend Cockpit.
 %exclude %{_docdir}/%{name}/README.md
 %{_docdir}/%{name}
 
-%package machines
-Summary: Cockpit user interface for virtual machines
-Requires: %{name}-bridge >= %{required_base}
-Requires: %{name}-system >= %{required_base}
-Requires: libvirt
-Requires: libvirt-client
-# Optional components (for f24 we use soft deps)
-%if 0%{?fedora} >= 24 || 0%{?rhel} >= 8
-Recommends: virt-install
-%endif
-
-%description machines
-The Cockpit components for managing virtual machines.
-
-If "virt-install" is installed, you can also create new virtual machines.
-
-%files machines -f machines.list
-
-%package machines-ovirt
-BuildArch: noarch
-Summary: Cockpit user interface for oVirt virtual machines
-Requires: %{name}-bridge >= %{required_base}
-Requires: %{name}-system >= %{required_base}
-Requires: libvirt
-Requires: libvirt-client
-# package of old name "cockpit-ovirt" was shipped on fedora only
-%if 0%{?fedora} >= 25
-Obsoletes: %{name}-ovirt < 161
-%endif
-
-%description machines-ovirt
-The Cockpit components for managing oVirt virtual machines.
-
-%files machines-ovirt -f ovirt.list
-
-%package ostree
-Summary: Cockpit user interface for rpm-ostree
-# Requires: Uses new translations functionality
-Requires: %{name}-bridge >= %{required_base}
-Requires: %{name}-system >= %{required_base}
-%if 0%{?fedora} > 0 && 0%{?fedora} < 24
-Requires: rpm-ostree >= 2015.10-1
-%else
-Requires: /usr/libexec/rpm-ostreed
-%endif
-
-%description ostree
-The Cockpit components for managing software updates for ostree based systems.
-
-%files ostree -f ostree.list
-
-%package pcp
-Summary: Cockpit PCP integration
-Requires: %{name}-bridge >= %{required_base}
-Requires: pcp
-
-%description pcp
-Cockpit support for reading PCP metrics and loading PCP archives.
-
-%files pcp -f pcp.list
-%{_libexecdir}/cockpit-pcp
-%{_localstatedir}/lib/pcp/config/pmlogconf/tools/cockpit
-
-%post pcp
-# HACK - https://bugzilla.redhat.com/show_bug.cgi?id=1185764
-# We can't use "systemctl reload-or-try-restart" since systemctl might
-# be out of sync with reality.
-/usr/share/pcp/lib/pmlogger condrestart
-
-%if %{defined build_dashboard}
-%package dashboard
-Summary: Cockpit remote servers and dashboard
-Requires: libssh >= %{libssh_version}
-Provides: %{name}-ssh = %{version}-%{release}
-# nothing depends on the dashboard, but we can't use it with older versions of the bridge
-Conflicts: %{name}-bridge < 135
-Conflicts: %{name}-ws < 135
-
-%description dashboard
-Cockpit support for connecting to remote servers (through ssh),
-bastion hosts, and a basic dashboard.
-
-%files dashboard -f dashboard.list
-%{_libexecdir}/cockpit-ssh
-
-%post dashboard
-# HACK: Until policy changes make it downstream
-echo "Applying workaround for broken SELinux policy: https://bugzilla.redhat.com/show_bug.cgi?id=1381331" >&2
-if type semanage >/dev/null 2>&1; then
-    semanage fcontext -a %{_libexecdir}/cockpit-ssh -t cockpit_ws_exec_t || true
-    restorecon %{_libexecdir}/cockpit-ssh || true
-else
-    chcon -t cockpit_ws_exec_t %{_libexecdir}/cockpit-ssh || true
-fi
-%endif
-
-# storaged on RHEL 7.4 and Fedora < 27, udisks on newer ones
+# storaged on Fedora < 27, udisks on newer ones
 # Recommends: not supported in RHEL < 8
 %package storaged
-Summary: Cockpit user interface for storage, using Storaged
+Summary: Cockpit user interface for storage, using udisks
 Requires: %{name}-shell >= %{required_base}
 Requires: udisks2 >= 2.6
 Requires: udisks2-lvm2 >= 2.6
@@ -446,7 +403,7 @@ Requires: python-dbus
 BuildArch: noarch
 
 %description storaged
-The Cockpit component for managing storage.  This package uses Storaged.
+The Cockpit component for managing storage.  This package uses udisks.
 
 %files storaged -f storaged.list
 
@@ -466,6 +423,7 @@ Provides: %{name}-tuned = %{version}-%{release}
 Provides: %{name}-users = %{version}-%{release}
 %if 0%{?rhel}
 Provides: %{name}-networkmanager = %{version}-%{release}
+Obsoletes: %{name}-networkmanager < 135
 Requires: NetworkManager
 Provides: %{name}-kdump = %{version}-%{release}
 Requires: kexec-tools
@@ -490,28 +448,14 @@ This package contains the Cockpit shell and system configuration interfaces.
 
 %files system -f system.list
 
-%package tests
-Summary: Tests for Cockpit
-Requires: %{name}-bridge >= 138
-Requires: %{name}-system >= 138
-Requires: openssh-clients
-Provides: %{name}-test-assets = %{version}-%{release}
-Obsoletes: %{name}-test-assets < 132
-
-%description tests
-This package contains tests and files used while testing Cockpit.
-These files are not required for running Cockpit.
-
-%files tests
-%config(noreplace) %{_sysconfdir}/cockpit/cockpit.conf
-%{_datadir}/%{name}/playground
-%{_prefix}/%{__lib}/cockpit-test-assets
-
 %package ws
 Summary: Cockpit Web Service
 Requires: glib-networking
 Requires: openssl
 Requires: glib2 >= 2.37.4
+%if 0%{?fedora} >= 24 || 0%{?rhel} >= 8
+Recommends: sscg >= 2.3
+%endif
 Requires(post): systemd
 Requires(preun): systemd
 Requires(postun): systemd
@@ -526,9 +470,11 @@ The Cockpit Web Service listens on the network, and authenticates users.
 %doc %{_mandir}/man8/pam_ssh_add.8.gz
 %config(noreplace) %{_sysconfdir}/%{name}/ws-certs.d
 %config(noreplace) %{_sysconfdir}/pam.d/cockpit
-%{_datadir}/%{name}/issue/active.issue
-%{_datadir}/%{name}/issue/inactive.issue
+%config %{_sysconfdir}/motd.d/cockpit
+%{_datadir}/%{name}/motd/update-motd
+%{_datadir}/%{name}/motd/inactive.motd
 %{_unitdir}/cockpit.service
+%{_unitdir}/cockpit-motd.service
 %{_unitdir}/cockpit.socket
 %{_prefix}/%{__lib}/firewalld/services/cockpit.xml
 %{_prefix}/%{__lib}/tmpfiles.d/cockpit-tempfiles.conf
@@ -557,7 +503,7 @@ test -f %{_bindir}/firewall-cmd && firewall-cmd --reload --quiet || true
 %systemd_postun_with_restart cockpit.service
 
 # -------------------------------------------------------------------------------
-# Conditional Sub-packages
+# Sub-packages that are part of cockpit-system in RHEL, but separate in Fedora
 
 %if 0%{?rhel} == 0
 
@@ -625,6 +571,123 @@ utility setroubleshoot to diagnose and resolve SELinux issues.
 
 %endif
 
+%else # build basic packages
+
+# RPM requires this
+%description
+Dummy package from building optional packages only; never install or publish me.
+
+%endif # build basic packages
+
+# -------------------------------------------------------------------------------
+# Sub-packages that are optional extensions
+
+%if 0%{?build_optional}
+
+%package tests
+Summary: Tests for Cockpit
+Requires: %{name}-bridge >= 138
+Requires: %{name}-system >= 138
+Requires: openssh-clients
+Provides: %{name}-test-assets = %{version}-%{release}
+Obsoletes: %{name}-test-assets < 132
+
+%description tests
+This package contains tests and files used while testing Cockpit.
+These files are not required for running Cockpit.
+
+%files tests
+%config(noreplace) %{_sysconfdir}/cockpit/cockpit.conf
+%{_datadir}/%{name}/playground
+%{_prefix}/%{__lib}/cockpit-test-assets
+
+%package machines
+Summary: Cockpit user interface for virtual machines
+Requires: %{name}-bridge >= %{required_base}
+Requires: %{name}-system >= %{required_base}
+Requires: libvirt
+Requires: libvirt-client
+# Optional components (for f24 we use soft deps)
+%if 0%{?fedora} >= 24 || 0%{?rhel} >= 8
+Recommends: virt-install
+%endif
+
+%description machines
+The Cockpit components for managing virtual machines.
+
+If "virt-install" is installed, you can also create new virtual machines.
+
+%files machines -f machines.list
+
+%package machines-ovirt
+BuildArch: noarch
+Summary: Cockpit user interface for oVirt virtual machines
+Requires: %{name}-bridge >= %{required_base}
+Requires: %{name}-system >= %{required_base}
+Requires: libvirt
+Requires: libvirt-client
+# package of old name "cockpit-ovirt" was shipped on fedora only
+%if 0%{?fedora} >= 25
+Obsoletes: %{name}-ovirt < 161
+%endif
+
+%description machines-ovirt
+The Cockpit components for managing oVirt virtual machines.
+
+%files machines-ovirt -f ovirt.list
+
+%package ostree
+Summary: Cockpit user interface for rpm-ostree
+# Requires: Uses new translations functionality
+Requires: %{name}-bridge >= %{required_base}
+Requires: %{name}-system >= %{required_base}
+%if 0%{?fedora} > 0 && 0%{?fedora} < 24
+Requires: rpm-ostree >= 2015.10-1
+%else
+Requires: /usr/libexec/rpm-ostreed
+%endif
+
+%description ostree
+The Cockpit components for managing software updates for ostree based systems.
+
+%files ostree -f ostree.list
+
+%package pcp
+Summary: Cockpit PCP integration
+Requires: %{name}-bridge >= %{required_base}
+Requires: pcp
+
+%description pcp
+Cockpit support for reading PCP metrics and loading PCP archives.
+
+%files pcp -f pcp.list
+%{_libexecdir}/cockpit-pcp
+%{_localstatedir}/lib/pcp/config/pmlogconf/tools/cockpit
+
+%post pcp
+# HACK - https://bugzilla.redhat.com/show_bug.cgi?id=1185764
+# We can't use "systemctl reload-or-try-restart" since systemctl might
+# be out of sync with reality.
+/usr/share/pcp/lib/pmlogger condrestart
+
+%if %{defined build_dashboard}
+%package dashboard
+Summary: Cockpit remote servers and dashboard
+Requires: libssh >= %{libssh_version}
+Provides: %{name}-ssh = %{version}-%{release}
+# nothing depends on the dashboard, but we can't use it with older versions of the bridge
+Conflicts: %{name}-bridge < 135
+Conflicts: %{name}-ws < 135
+
+%description dashboard
+Cockpit support for connecting to remote servers (through ssh),
+bastion hosts, and a basic dashboard.
+
+%files dashboard -f dashboard.list
+%{_libexecdir}/cockpit-ssh
+
+%endif
+
 %ifarch x86_64 %{arm} aarch64 ppc64le s390x
 
 %package docker
@@ -655,8 +718,8 @@ Requires: /usr/bin/kubectl
 # Requires: Needs newer localization support
 Requires: %{name}-bridge >= %{required_base}
 Requires: %{name}-shell >= %{required_base}
-BuildRequires: golang-bin
-BuildRequires: golang-src
+BuildRequires: %{go_scl_prefix}golang-bin
+BuildRequires: %{go_scl_prefix}golang-src
 Provides: cockpit-stub = %{version}-%{release}
 
 %description kubernetes
@@ -679,7 +742,17 @@ The Cockpit component for installing package updates, via PackageKit.
 
 %files packagekit -f packagekit.list
 
+%endif # build optional extension packages
+
 %changelog
+* Wed May 30 2018 Martin Pitt <mpitt@redhat.com> 169-1
+- Update to 169 release
+- Storage: Offer installation of NFS client support on demand
+- Containers: Don't try to manage "overlay2" storage without a volume group
+- Machines: Fix "Start VM" checkbox layout
+- Software Updates: Fix security update icon rhbz#1582570
+- Drop obsolete cockpit-bashboard SELinux %post hack rhbz#1570833
+
 * Tue Apr 17 2018 Martin Pitt <mpitt@redhat.com> 165-3
 - Revert "noarch" change for cockpit-doc as well