diff --git a/.cockpit.metadata b/.cockpit.metadata
index e89eb46..3e9e1da 100644
--- a/.cockpit.metadata
+++ b/.cockpit.metadata
@@ -1 +1 @@
-c188051bfac8fc5b7b50f7ad25ba16972584138a SOURCES/cockpit-0.96.tar.xz
+2bd41c0c665037e937b1dc37a664c4a793b98195 SOURCES/cockpit-0.103.tar.xz
diff --git a/.gitignore b/.gitignore
index b75a0cb..a9086ad 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/cockpit-0.96.tar.xz
+SOURCES/cockpit-0.103.tar.xz
diff --git a/SOURCES/0001-test-Fix-selenium-test.patch b/SOURCES/0001-test-Fix-selenium-test.patch
deleted file mode 100644
index ba0cd71..0000000
--- a/SOURCES/0001-test-Fix-selenium-test.patch
+++ /dev/null
@@ -1,110 +0,0 @@
-From 0a1baf5a3c9eda9a827cbb69a3bb096983baf359 Mon Sep 17 00:00:00 2001
-From: Jan Scotka <jscotka@redhat.com>
-Date: Thu, 3 Mar 2016 16:40:19 +0100
-Subject: [PATCH] test: Fix selenium test
-
-We shouldn't assume that we're the only ones working in /tmp during
-the tests, so take a bit more care with the filenames we choose.
-
-Also:
- - Handle exceptions in avocado tests while fetching results
- - Limit length of selenium debug output
-
-Reviewed-by: Dominik Perpeet <dperpeet@redhat.com>
----
- test/avocado/run-tests         | 13 +++++++++++--
- test/avocado/selenium-login.py | 31 +++++++++++++++++--------------
- test/avocado/seleniumlib.py    |  3 ++-
- 3 files changed, 30 insertions(+), 17 deletions(-)
-
-diff --git a/test/avocado/run-tests b/test/avocado/run-tests
-index cc72fb1..e35b7e5 100755
---- a/test/avocado/run-tests
-+++ b/test/avocado/run-tests
-@@ -55,7 +55,12 @@ def prepare_avocado_tests(machine):
-     machine.upload([os.path.join(machine.test_dir, "avocado")], machine_test_dir)
- 
- def tap_output(machine):
--    json_info = json.loads(machine.execute(command="cat " + os.path.join(avocado_results_dir, "latest/results.json"), quiet=True))
-+    try:
-+        json_info = json.loads(machine.execute(command="cat " + os.path.join(avocado_results_dir, "latest/results.json"), quiet=True))
-+    except Exception as e:
-+        print "ERROR: Unable to fetch JSON from remote machine:", os.path.join(avocado_results_dir, "latest/results.json")
-+        print e
-+        return None
-     print "\nTAP output -------------------------"
-     print "1..%s" % len(json_info['tests'])
-     counter = 1
-@@ -67,7 +72,11 @@ def tap_output(machine):
-         print "# ----------------------------------------------------------------------"
-         print "# %s (time %d secs)" % (test_name, test_time)
-         print "#"
--        print machine.execute(command="cat " + test_log, quiet=True)
-+        try:
-+            print machine.execute(command="cat " + test_log, quiet=True)
-+        except Exception as e:
-+            print "ERROR: Unable to fetch testlog from remote machine:", test_log
-+            print e
-         print "# TEST LOG END -------"
-         if test_status == 'PASS':
-             print "ok %s %s (time %d secs)" % (counter, test_name, test_time)
-diff --git a/test/avocado/selenium-login.py b/test/avocado/selenium-login.py
-index 29c4404..1e9e081 100755
---- a/test/avocado/selenium-login.py
-+++ b/test/avocado/selenium-login.py
-@@ -174,20 +174,23 @@ class BasicTestSuite(SeleniumTest):
-         self.wait_frame("terminal")
-         self.wait_id('terminal')
-         terminal = self.wait_xpath("//*[@class='terminal']")
--        self.send_keys(terminal, "touch /tmp/testabc\n", clear=False)
--        self.wait_text("touch /tmp/testabc", user, element="div")
--        self.send_keys(terminal, "touch /tmp/testabd\n", clear=False)
--        self.wait_text("touch /tmp/testabd",user, element="div")
--        self.send_keys(terminal, "ls /tmp/test*\n", clear=False)
--        self.wait_text("ls /tmp/test*",'/tmp/testabc /tmp/testabd', element="div")
--        process.run("ls /tmp/testabc", shell=True)
--        process.run("ls /tmp/testabd", shell=True)
--        self.send_keys(terminal, "rm /tmp/testabc /tmp/testabd\n", clear=False)
--        self.wait_text("rm /tmp/testabc /tmp/testabd",user, element="div")
--        self.send_keys(terminal, "ls /tmp/test*\n", clear=False)
--        self.wait_text("ls /tmp/test*",'cannot access', element="div")
--        process.run("ls /tmp/testabc |wc -l |grep 0", shell=True)
--        process.run("ls /tmp/testabd |wc -l |grep 0", shell=True)
-+        prefix = "/tmp/cockpitrndadr/"
-+        self.send_keys(terminal, "mkdir {0}\n".format(prefix), clear=False)
-+        self.wait_text("mkdir {0}".format(prefix), user, element="div")
-+        self.send_keys(terminal, "touch {0}abc\n".format(prefix), clear=False)
-+        self.wait_text("touch {0}abc".format(prefix), user, element="div")
-+        self.send_keys(terminal, "touch {0}abd\n".format(prefix), clear=False)
-+        self.wait_text("touch {0}abd".format(prefix), user, element="div")
-+        self.send_keys(terminal, "ls {0}*\n".format(prefix), clear=False)
-+        self.wait_text("ls {0}*".format(prefix), '{0}abc'.format(prefix), element="div")
-+        process.run("ls {0}abc".format(prefix), shell=True)
-+        process.run("ls {0}abd".format(prefix), shell=True)
-+        self.send_keys(terminal, "rm {0}abc {0}abd\n".format(prefix), clear=False)
-+        self.wait_text("rm {0}abc {0}abd".format(prefix), user, element="div")
-+        self.send_keys(terminal, "ls {0}*\n".format(prefix), clear=False)
-+        self.wait_text("ls {0}*".format(prefix), 'cannot access', element="div")
-+        process.run("ls {0}abc |wc -l |grep 0".format(prefix), shell=True)
-+        process.run("ls {0}abd |wc -l |grep 0".format(prefix), shell=True)
-         self.mainframe()
-         self.error=False
- 
-diff --git a/test/avocado/seleniumlib.py b/test/avocado/seleniumlib.py
-index 8d99cd3..e8e05f9 100755
---- a/test/avocado/seleniumlib.py
-+++ b/test/avocado/seleniumlib.py
-@@ -111,8 +111,9 @@ class SeleniumTest(Test):
-                 self.log.info('ERR: Unable to close WEBdriver: {0}'.format(e))
- 
-     def get_debug_logs(self, logs=['browser','driver','client','server']):
-+        max_line_log_count = 10
-         for log in logs:
--            receivedlog = self.driver.get_log(log)
-+            receivedlog = [x for x in self.driver.get_log(log)][-max_line_log_count:]
-             if receivedlog:
-                 self.log.info(">>>>> " + log)
-                 for line in receivedlog:
--- 
-1.8.3.1
-
diff --git a/SPECS/cockpit.spec b/SPECS/cockpit.spec
index 19ffb39..0c5d8a6 100644
--- a/SPECS/cockpit.spec
+++ b/SPECS/cockpit.spec
@@ -4,12 +4,11 @@
 #
 
 %define branding auto
-%define tag 0.96
-%define rev 2
+%define tag 0.103
+%define rev 1
 
 %if %{defined gitcommit}
 %define extra_flags CFLAGS='-O2 -Wall -Werror -fPIC -g -DWITH_DEBUG'
-%define branding default
 %endif
 
 %if 0%{?centos}
@@ -41,8 +40,6 @@ Source0:        cockpit-%{version}.tar.gz
 Source0:        https://github.com/cockpit-project/cockpit/releases/download/%{version}/cockpit-%{version}.tar.xz
 %endif
 
-Patch1:		0001-test-Fix-selenium-test.patch
-
 BuildRequires: pkgconfig(gio-unix-2.0)
 BuildRequires: pkgconfig(json-glib-1.0)
 BuildRequires: pkgconfig(polkit-agent-1) >= 0.105
@@ -90,6 +87,7 @@ Recommends: %{name}-docker = %{version}-%{release}
 %endif
 Suggests: %{name}-pcp = %{version}-%{release}
 Suggests: %{name}-kubernetes = %{version}-%{release}
+Suggests: %{name}-selinux = %{version}-%{release}
 
 # Older releases need to have strict requirements
 %else
@@ -148,14 +146,10 @@ The Cockpit Web Service listens on the network, and authenticates users.
 
 %prep
 %setup -q
-%patch1 -p1
 
 %build
 exec 2>&1
-%if %{defined gitcommit}
-env NOCONFIGURE=1 ./autogen.sh
-%endif
-%configure --disable-silent-rules --with-cockpit-user=cockpit-ws --with-branding=%{branding} --with-selinux-config-type=etc_t
+%configure --disable-silent-rules --with-cockpit-user=cockpit-ws --with-branding=auto --with-selinux-config-type=etc_t
 make -j4 %{?extra_flags} all
 
 %check
@@ -216,6 +210,14 @@ find %{buildroot}%{_datadir}/%{name}/network -type f >> networkmanager.list
 echo '%dir %{_datadir}/%{name}/ostree' > ostree.list
 find %{buildroot}%{_datadir}/%{name}/ostree -type f >> ostree.list
 
+# on RHEL systems we don't have the required setroubleshoot-server packages
+%if 0%{?rhel}
+rm -rf %{buildroot}%{_datadir}/%{name}/selinux
+%else
+echo '%dir %{_datadir}/%{name}/selinux' > selinux.list
+find %{buildroot}%{_datadir}/%{name}/selinux -type f >> selinux.list
+%endif
+
 %ifarch x86_64 armv7hl
 echo '%dir %{_datadir}/%{name}/docker' > docker.list
 find %{buildroot}%{_datadir}/%{name}/docker -type f >> docker.list
@@ -225,17 +227,14 @@ touch docker.list
 %endif
 
 %ifarch x86_64
-echo '%dir %{_datadir}/%{name}/kubernetes' > kubernetes.list
-find %{buildroot}%{_datadir}/%{name}/kubernetes -type f >> kubernetes.list
 %if %{defined gitcommit}
 %else
-mv %{buildroot}/%{_datadir}/%{name}/registry/manifest.json %{buildroot}/%{_datadir}/%{name}/registry/manifest.disabled
+rm %{buildroot}/%{_datadir}/%{name}/kubernetes/override.json
 %endif
-echo '%dir %{_datadir}/%{name}/registry' >> kubernetes.list
-find %{buildroot}%{_datadir}/%{name}/registry -type f >> kubernetes.list
+echo '%dir %{_datadir}/%{name}/kubernetes' > kubernetes.list
+find %{buildroot}%{_datadir}/%{name}/kubernetes -type f >> kubernetes.list
 %else
 rm -rf %{buildroot}/%{_datadir}/%{name}/kubernetes
-rm -rf %{buildroot}/%{_datadir}/%{name}/registry
 touch kubernetes.list
 %endif
 
@@ -365,6 +364,7 @@ This package contains the Cockpit shell UI assets.
 
 %package storaged
 Summary: Cockpit user interface for storage, using Storaged
+Requires: %{name}-shell = %{version}-%{release}
 Requires: storaged >= 2.1.1
 Requires: storaged-lvm2 >= 2.1.1
 Requires: device-mapper-multipath
@@ -377,14 +377,13 @@ The Cockpit component for managing storage.  This package uses Storaged.
 
 %package ostree
 Summary: Cockpit user interface for rpm-ostree
+Requires: %{name}-shell = %{version}-%{release}
 %if 0%{?fedora} > 0 && 0%{?fedora} < 24
 Requires: rpm-ostree >= 2015.10-1
 %else
 Requires: /usr/libexec/rpm-ostreed
-Requires: rpm-ostree-client >= 2015.11-1
 %endif
 
-
 %description ostree
 The Cockpit components for managing software updates for ostree based systems.
 
@@ -396,6 +395,7 @@ The Cockpit components for managing software updates for ostree based systems.
 
 %package sosreport
 Summary: Cockpit user interface for diagnostic reports
+Requires: %{name}-shell = %{version}-%{release}
 Requires: sos
 BuildArch: noarch
 
@@ -407,6 +407,7 @@ sosreport tool.
 
 %package subscriptions
 Summary: Cockpit subscription user interface package
+Requires: %{name}-shell = %{version}-%{release}
 Requires: subscription-manager >= 1.13
 BuildArch: noarch
 
@@ -416,8 +417,21 @@ subscription management.
 
 %files subscriptions -f subscriptions.list
 
+%package selinux
+Summary: Cockpit SELinux package
+Requires: %{name}-shell = %{version}-%{release}
+Requires: setroubleshoot-server >= 3.3.3
+BuildArch: noarch
+
+%description selinux
+This package contains the Cockpit user interface integration with the
+utility setroubleshoot to diagnose and resolve SELinux issues.
+
+%files selinux -f selinux.list
+
 %package networkmanager
 Summary: Cockpit user interface for networking, using NetworkManager
+Requires: %{name}-shell = %{version}-%{release}
 Requires: NetworkManager
 BuildArch: noarch
 
@@ -432,6 +446,7 @@ The Cockpit component for managing networking.  This package uses NetworkManager
 
 %package docker
 Summary: Cockpit user interface for Docker containers
+Requires: %{name}-shell = %{version}-%{release}
 Requires: docker >= 1.3.0
 
 %description docker
@@ -465,6 +480,7 @@ cluster. Installed on the Kubernetes master. This package is not yet complete.
 
 %package test-assets
 Summary: Additional stuff for testing Cockpit
+Requires: %{name}-shell = %{version}-%{release}
 Requires: openssh-clients
 
 %description test-assets
@@ -478,8 +494,17 @@ pulls in some necessary packages via dependencies.
 %endif
 
 %changelog
-* Fri Apr  1 2016 Johnny Hughes <johnny@centos.org> - 0.96-2
-- add in Requries rpm-ostree-client to cockpit-ostree for CentOS
+* Tue Apr 19 2016 Dominik Perpeet <dperpeet@redhat.com> - 0.103-1
+- Update to 0.103 release
+- When Cockpit fails to connect to a host, relevant SSH command or host details are displayed to help resolve the issue
+- Docker restart policy can be configured when starting a new container
+- Display a single combined dialog for creating logical volumes
+- Don't offer a 'Computer OU' option when joining IPA domains
+- Display binary journal data correctly
+- Display IEC names (eg: MiB) for disk or file system sizes
+- Refuse to shrink logical volumes and prevent negative sizes in file system partition dialogs
+- Apply strict Content-Security-Policy on most of Cockpit to prevent a number of browser based attacks
+- Numerous other bug fixes and admin interface improvements
 
 * Thu Mar 10 2016 Dominik Perpeet <dperpeet@redhat.com> - 0.96-2
 - Fix selenium tests