diff --git a/SOURCES/CentOS-atomic-branding.patch b/SOURCES/CentOS-atomic-branding.patch
new file mode 100644
index 0000000..9d51cf2
--- /dev/null
+++ b/SOURCES/CentOS-atomic-branding.patch
@@ -0,0 +1,57 @@
+From 6b70a1867fef732cd75ef79782f71c13241622b7 Mon Sep 17 00:00:00 2001
+From: Colin Walters <walters@verbum.org>
+Date: Fri, 12 Jun 2015 13:59:05 -0400
+Subject: [PATCH] Use CentOS branding, increase install priority for Atomic
+
+This is similar to the patch CentOS normally applies to Anaconda,
+but updated for Atomic.
+---
+ pyanaconda/installclasses/rhel.py | 17 +++++++++++------
+ 1 file changed, 11 insertions(+), 6 deletions(-)
+
+diff --git a/pyanaconda/installclasses/rhel.py b/pyanaconda/installclasses/rhel.py
+index a9a99f6..b924cd2 100644
+--- a/pyanaconda/installclasses/rhel.py
++++ b/pyanaconda/installclasses/rhel.py
+@@ -30,9 +30,9 @@ from blivet.platform import platform
+ from blivet.devicelibs import swap
+ 
+ class RHELBaseInstallClass(BaseInstallClass):
+-    name = "Red Hat Enterprise Linux"
++    name = "CentOS Linux"
+     sortPriority = 20000
+-    if not productName.startswith("Red Hat "):
++    if not productName.startswith("CentOS "):
+         hidden = True
+     defaultFS = "xfs"
+ 
+@@ -45,7 +45,7 @@ class RHELBaseInstallClass(BaseInstallClass):
+ 
+     _l10n_domain = "comps"
+ 
+-    efi_dir = "redhat"
++    efi_dir = "centos"
+ 
+     def configure(self, anaconda):
+         BaseInstallClass.configure(self, anaconda)
+@@ -90,9 +90,14 @@ class RHELBaseInstallClass(BaseInstallClass):
+         BaseInstallClass.__init__(self)
+ 
+ class RHELAtomicInstallClass(RHELBaseInstallClass):
+-    name = "RHEL Atomic Host"
+-    if productName.startswith("RHEL Atomic"):
+-        hidden = False
++    name = "CentOS Atomic Host"
++    # We have to bump priority because RHEL upstream is relying on a
++    # side effect of the OS name starting with "RHEL" instead of "Red
++    # Hat" and thus the normal RHELBaseInstallClass above not
++    # matching.
++    sortPriority = 20001
++    if not productName.startswith("CentOS "):
++        hidden = True
+ 
+     def setDefaultPartitioning(self, storage):
+         autorequests = [PartSpec(mountpoint="/", fstype=storage.defaultFSType,
+-- 
+1.8.3.1
+
diff --git a/SOURCES/rpmostreepayload-Rework-remote-add-handling.patch b/SOURCES/rpmostreepayload-Rework-remote-add-handling.patch
new file mode 100644
index 0000000..16b0660
--- /dev/null
+++ b/SOURCES/rpmostreepayload-Rework-remote-add-handling.patch
@@ -0,0 +1,116 @@
+From c72f979499f5af3091ad8f2017442b3728cdff2f Mon Sep 17 00:00:00 2001
+From: Colin Walters <walters@verbum.org>
+Date: Tue, 16 Jun 2015 11:24:20 -0400
+Subject: [PATCH] Rebase
+
+---
+ pyanaconda/packaging/rpmostreepayload.py | 67 ++++++++++++++++++++------------
+ 1 file changed, 43 insertions(+), 24 deletions(-)
+
+diff --git a/pyanaconda/packaging/rpmostreepayload.py b/pyanaconda/packaging/rpmostreepayload.py
+index 5eacd9f..f979c3e 100644
+--- a/pyanaconda/packaging/rpmostreepayload.py
++++ b/pyanaconda/packaging/rpmostreepayload.py
+@@ -138,24 +138,25 @@ class RPMOSTreePayload(ArchivePayload):
+             ["admin", "--sysroot=" + iutil.getTargetPhysicalRoot(),
+              "init-fs", iutil.getTargetPhysicalRoot()])
+ 
+-        repo_arg = "--repo=" + iutil.getTargetPhysicalRoot() + '/ostree/repo'
++        self._sysroot_path = Gio.File.new_for_path(iutil.getTargetPhysicalRoot())
++        sysroot = OSTree.Sysroot.new(self._sysroot_path)
++        sysroot.load(cancellable)
++        repo = sysroot.get_repo(None)[1]
++        # We don't support resuming from interrupted installs
++        repo.set_disable_fsync(True)
+ 
+-        # Store this for use in postInstall too, where we need to
+-        # undo/redo this step.
+-        self._base_remote_args = ["remote", "add"]
++        self._remoteOptions = {}
++
++        # Handle variations in pykickstart
+         if ((hasattr(ostreesetup, 'noGpg') and ostreesetup.noGpg) or
+             (hasattr(ostreesetup, 'nogpg') and ostreesetup.nogpg)):
+-            self._base_remote_args.append("--set=gpg-verify=false")
+-        self._base_remote_args.extend([ostreesetup.remote,
+-                                     ostreesetup.url])
+-        self._safeExecWithRedirect("ostree", [repo_arg] + self._base_remote_args)
++            self._remoteOptions['gpg-verify'] = GLib.Variant('b', False)
+ 
+-        self._sysroot_path = sysroot_path = Gio.File.new_for_path(iutil.getTargetPhysicalRoot())
+-        sysroot = OSTree.Sysroot.new(sysroot_path)
+-        sysroot.load(cancellable)
++        repo.remote_change(None, OSTree.RepoRemoteChange.ADD_IF_NOT_EXISTS,
++                           ostreesetup.remote, ostreesetup.url,
++                           GLib.Variant('a{sv}', self._remoteOptions),
++                           cancellable)
+ 
+-        repo = sysroot.get_repo(None)[1]
+-        repo.set_disable_fsync(True)
+         progressQ.send_message(_("Starting pull of %(branchName)s from %(source)s") % \
+                                {"branchName": ostreesetup.ref, "source": ostreesetup.remote})
+ 
+@@ -174,6 +175,14 @@ class RPMOSTreePayload(ArchivePayload):
+ 
+         progressQ.send_message(_("Preparing deployment of %s") % (ostreesetup.ref, ))
+ 
++        # Now that we have the data pulled, delete the remote for now.
++        # This will allow a remote configuration defined in the tree
++        # (if any) to override what's in the kickstart.  Otherwise,
++        # we'll re-add it in post.  Ideally, ostree would support a
++        # pull without adding a remote, but that would get quite
++        # complex.
++        repo.remote_delete(self.data.ostreesetup.remote, None)
++
+         self._safeExecWithRedirect("ostree",
+             ["admin", "--sysroot=" + iutil.getTargetPhysicalRoot(),
+              "os-init", ostreesetup.osname])
+@@ -250,24 +259,34 @@ class RPMOSTreePayload(ArchivePayload):
+ 
+     def postInstall(self):
+         super(RPMOSTreePayload, self).postInstall()
+-
++        
+         from gi.repository import OSTree
+         cancellable = None
+ 
+-        # Reload this data - we couldn't keep it open across
+-        # the remounts happening.
+         sysroot = OSTree.Sysroot.new(self._sysroot_path)
+         sysroot.load(cancellable)
+         repo = sysroot.get_repo(None)[1]
+ 
+-        # This is an ugly hack - we didn't have /etc/ostree/remotes.d,
+-        # so the remote went into /ostree/repo/config.  But we want it
+-        # in /etc, so delete that remote, then re-add it to
+-        # /etc/ostree/remotes.d, executing ostree inside the sysroot
+-        # so that it understands it's a "system repository" and should
+-        # modify /etc.
+-        repo.remote_delete(self.data.ostreesetup.remote, None)
+-        self._safeExecWithRedirect("ostree", self._base_remote_args, root=iutil.getSysroot())
++        # CentOS specific patch (for now) - pull the remote config from usr/etc if it exists.
++        # The OSTree handling here was buggy in that it wasn't looking in the sysroot
++        # for existing remotes.
++        default_remote_path = iutil.getSysroot() + '/usr/etc/ostree/remotes.d/' + self.data.ostreesetup.osname + '.conf'
++        if os.path.isfile(default_remote_path):
++            destpath = iutil.getSysroot() + '/etc/ostree/remotes.d/' + os.path.basename(default_remote_path)
++            self._safeExecWithRedirect('cp', ['-r', '-p', default_remote_path, destpath])
++        else:
++            # Following up on the "remote delete" above, we removed the
++            # remote from /ostree/repo/config.  But we want it in /etc, so
++            # re-add it to /etc/ostree/remotes.d, using the sysroot path.
++            #
++            # However, we ignore the case where the remote already exists,
++            # which occurs when the content itself provides the remote
++            # config file.
++            repo.remote_change(Gio.File.new_for_path(iutil.getSysroot()),
++                               OSTree.RepoRemoteChange.ADD_IF_NOT_EXISTS,
++                               self.data.ostreesetup.remote, self.data.ostreesetup.url,
++                               GLib.Variant('a{sv}', self._remoteOptions),
++                               cancellable)
+ 
+         boot = iutil.getSysroot() + '/boot'
+ 
+-- 
+1.8.3.1
+
diff --git a/SPECS/anaconda.spec b/SPECS/anaconda.spec
index 21f7d65..b69b765 100644
--- a/SPECS/anaconda.spec
+++ b/SPECS/anaconda.spec
@@ -17,6 +17,8 @@ Source0: %{name}-%{version}.tar.bz2
 # backported for RHELAH 7.4.2
 Patch0: 0001-rpmostreepayload-Rollup-backport-of-Fedora-patches.patch
 Patch1: 0001-installclasses-rhelah-Bump-default-to-15GB-max.patch
+Patch2: rpmostreepayload-Rework-remote-add-handling.patch
+Patch3: CentOS-atomic-branding.patch
 
 # Versions of required components (done so we make sure the buildrequires
 # match the requires versions of things).
@@ -231,6 +233,8 @@ runtime on NFS/HTTP/FTP servers or local disks.
 %setup -q
 %patch0 -p1
 %patch1 -p1
+%patch2 -p1
+%patch3 -p1
 
 %build
 %configure --disable-static \
@@ -323,6 +327,10 @@ update-desktop-database &> /dev/null || :
 %{_prefix}/libexec/anaconda/dd_*
 
 %changelog
+* Thu Oct 19 2017 CentOS Sources <bugs@centos.org> - 21.48.22.121-3.rhelah.0.el7.centos
+- ostree remote repo url changes
+- Add CentOS branding for installclass
+
 * Mon Aug 21 2017 Colin Walters <walters@verbum.org> - 21.48.22.121-3.rhelah.0
 - Backport patches for RHELAH /var and ISO default storage increase
 - Related: rhbz#1098303