diff --git a/SOURCES/BZ-1047793-lvm-snapshot.patch b/SOURCES/BZ-1047793-lvm-snapshot.patch
new file mode 100644
index 0000000..8988f0e
--- /dev/null
+++ b/SOURCES/BZ-1047793-lvm-snapshot.patch
@@ -0,0 +1,297 @@
+commit 13bbacb4dd25b83cd29389e0608fde1614537257
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Mon Jan 12 15:21:46 2015 +0100
+
+     Multiple lvm fixes. BZ 1047793, BZ 1145485
+    - add fssnap_abort_on_errors config option
+    - fix default for fssnap_automatic_keep in the man page
+    - add logging for automatic fssnap events
+    - add lvm binary path test to _FSSnap.available
+    - check for lvm2 and lvm2-python-libs packages instead of python-lvm
+
+diff --git a/docs/yum.8 b/docs/yum.8
+index 998a5ad..a0038f6 100644
+--- a/docs/yum.8
++++ b/docs/yum.8
+@@ -741,7 +741,7 @@ then you can create and delete snapshots using:
+ .br 
+ 
+ .br
+-Configuration Options: \fBfssnap_automatic_pre\fP, \fBfssnap_automatic_post\fP, \fBfssnap_automatic_keep\fP, \fBfssnap_percentage\fP, \fBfssnap_devices\fP
++Configuration Options: \fBfssnap_automatic_pre\fP, \fBfssnap_automatic_post\fP, \fBfssnap_automatic_keep\fP, \fBfssnap_percentage\fP, \fBfssnap_devices\fP, \fBfssnap_abort_on_errors\fP
+ 
+ .IP
+ .IP "\fBfs\fP"
+diff --git a/docs/yum.conf.5 b/docs/yum.conf.5
+index 0362e85..272e07b 100644
+--- a/docs/yum.conf.5
++++ b/docs/yum.conf.5
+@@ -873,7 +873,7 @@ Boolean (1, 0, True, False, yes, no) Defaults to False
+ .IP
+ \fBfssnap_automatic_keep\fR
+ How many old snapshots should yum keep when trying to automatically create a 
+-new snapshot. Setting to 0 disables this feature. Default is '0'.
++new snapshot. Setting to 0 disables this feature. Default is '1'.
+ 
+ .IP
+ \fBfssnap_automatic_percentage\fR
+@@ -887,6 +887,21 @@ first match (positive or negative) wins.
+ Default is: !*/swap !*/lv_swap glob:/etc/yum/fssnap.d/*.conf
+ 
+ .IP
++\fBfssnap_abort_on_errors\fR
++When fssnap_automatic_pre or fssnap_automatic_post is enabled, it's possible to specify which
++fssnap errors should make the transaction fail. The default is `any'.
++
++`broken-setup' - Abort current transaction if snapshot support is unavailable because
++lvm is missing or broken.
++
++`snapshot-failure' - Abort current transaction if creating a snapshot fails (e.g. there is not enough
++free space to make a snapshot).
++
++`any' - Abort current transaction if any of the above occurs.
++
++`none' - Never abort a transaction in case of errors.
++
++.IP
+ \fBdepsolve_loop_limit\fR
+ Set the number of times any attempt to depsolve before we just give up. This
+ shouldn't be needed as yum should always solve or fail, however it has been
+diff --git a/yum/__init__.py b/yum/__init__.py
+index 6d2c078..347aa7c 100644
+--- a/yum/__init__.py
++++ b/yum/__init__.py
+@@ -1727,6 +1727,13 @@ much more problems).
+         :raises: :class:`yum.Errors.YumRPMTransError` if there is a
+            transaction cannot be completed
+         """
++        if (self.conf.fssnap_automatic_pre or self.conf.fssnap_automatic_post) and not self.fssnap.available:
++            msg = _("Snapshot support not available.")
++            if self.conf.fssnap_abort_on_errors in ('broken-setup', 'any'):
++                raise Errors.YumRPMTransError(msg="Aborting transaction.", errors=msg)
++            else:
++                self.verbose_logger.critical(msg)
++
+         if self.fssnap.available and ((self.conf.fssnap_automatic_pre or
+                                        self.conf.fssnap_automatic_post) and
+                                       self.conf.fssnap_automatic_keep):
+@@ -1748,17 +1755,30 @@ much more problems).
+                 if num > self.conf.fssnap_automatic_keep:
+                     todel.append(snap['dev'])
+             # Display something to the user?
+-            self.fssnap.del_snapshots(devices=todel)
++            snaps = self.fssnap.del_snapshots(devices=todel)
++            if len(snaps):
++                self.verbose_logger.info(_("Deleted %u snapshots.") % len(snaps))
+ 
+         if (self.fssnap.available and
+             (not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST) and
+             self.conf.fssnap_automatic_pre)):
+             if not self.fssnap.has_space(self.conf.fssnap_percentage):
+-                msg = _("Not enough space to create pre. FS snapshot, aborting transaction.")
+-                raise Errors.YumRPMTransError(msg=msg, errors=[])
++                msg = _("Not enough space to create pre. FS snapshot.")
++                if self.conf.fssnap_abort_on_errors in ('snapshot-failure', 'any'):
++                    raise Errors.YumRPMTransError(msg="Aborting transaction", errors=msg)
++                else:
++                    self.verbose_logger.critical(msg)
+             else:
+                 tags = {'*': ['reason=automatic']} # FIXME: pre. tags
+-                self.fssnap.snapshot(self.conf.fssnap_percentage, tags=tags)
++                snaps = self.fssnap.snapshot(self.conf.fssnap_percentage, tags=tags)
++                if not snaps:
++                    msg = _("Failed to create snapshot")
++                    if self.conf.fssnap_abort_on_errors in ('snapshot-failure', 'any'):
++                        raise Errors.YumRPMTransError(msg="Aborting transaction", errors=msg)
++                    else:
++                        self.verbose_logger.critical(msg)
++                for (odev, ndev) in snaps:
++                    self.verbose_logger.info(_("Created snapshot from %s, results is: %s") % (odev, ndev))
+ 
+         self.plugins.run('pretrans')
+ 
+@@ -1895,11 +1915,14 @@ much more problems).
+             self.conf.fssnap_automatic_post)):
+             if not self.fssnap.has_space(self.conf.fssnap_percentage):
+                 msg = _("Not enough space to create post trans FS snapshot.")
+-                self.logger.critical(msg)
++                self.verbose_logger.critical(msg)
+             else:
+                 tags = {'*': ['reason=automatic']} # FIXME: post tags
+-                self.fssnap.snapshot(self.conf.fssnap_percentage, tags=tags)
+-
++                snaps = self.fssnap.snapshot(self.conf.fssnap_percentage, tags=tags)
++                if not snaps:
++                    self.verbose_logger.critical(_("Failed to create snapshot"))
++                for (odev, ndev) in snaps:
++                    self.verbose_logger.info(_("Created snapshot from %s, results is: %s") % (odev, ndev))
+         return resultobject
+ 
+     def verifyTransaction(self, resultobject=None, txmbr_cb=None):
+diff --git a/yum/config.py b/yum/config.py
+index 8eab5bc..02061ba 100644
+--- a/yum/config.py
++++ b/yum/config.py
+@@ -899,6 +899,7 @@ class YumConf(StartupConf):
+     fssnap_devices = ListOption("!*/swap !*/lv_swap "
+                                 "glob:/etc/yum/fssnap.d/*.conf",
+                                 parse_default=True)
++    fssnap_abort_on_errors = SelectionOption('any', ('broken-setup', 'snapshot-failure', 'any', 'none'))
+ 
+     depsolve_loop_limit = PositiveIntOption(100, names_of_0=["<forever>"])
+ 
+diff --git a/yum/fssnapshots.py b/yum/fssnapshots.py
+index e912ea1..9af252d 100755
+--- a/yum/fssnapshots.py
++++ b/yum/fssnapshots.py
+@@ -146,7 +143,8 @@ class _FSSnap(object):
+             devices = []
+ 
+         self.version = _ver
+-        self.available = bool(lvm)
++        # Parts of the API seem to work even when lvm is not actually installed, hence the path test
++        self.available = bool(lvm and os.path.exists("/sbin/lvm"))
+         self.postfix_static = "_yum_"
+         self._postfix = None
+         self._root = root
+diff --git a/yumcommands.py b/yumcommands.py
+index a18bc5c..e77d209 100644
+--- a/yumcommands.py
++++ b/yumcommands.py
+@@ -4264,11 +4264,13 @@ class FSSnapshotCommand(YumCommand):
+             subcommand = 'summary'
+ 
+         if not base.fssnap.available:
+-            if not base.rpmdb.searchNames(['python-lvm']):
+-                print _("Snapshot support not available, no python-lvm package installed.")
+-            else:
+-                print _("Snapshot support not available, python-lvm is old/broken.")
+-            return 0, [basecmd + ' ' + subcommand + ' done']
++            msg = _("Snapshot support not available, please check your lvm installation.")
++            if not base.rpmdb.searchNames(['lvm2']):
++                msg += " " + _("No lvm2 package installed.")
++            if not base.rpmdb.searchNames(['lvm2-python-libs']):
++                msg += " " + _("No lvm2-python-libs package installed.")
++            print msg
++            return 1, [basecmd + ' ' + subcommand + ' done']
+ 
+         if subcommand == 'list':
+             snaps = base.fssnap.old_snapshots()
+@@ -4301,10 +4303,11 @@ class FSSnapshotCommand(YumCommand):
+         if subcommand == 'create':
+             tags = {'*': ['reason=manual']}
+             pc = base.conf.fssnap_percentage
+-            for (odev, ndev) in base.fssnap.snapshot(pc, tags=tags):
+-                print _("Created snapshot from %s, results is: %s") %(odev,ndev)
+-            else:
++            snaps = base.fssnap.snapshot(pc, tags=tags)
++            if not snaps:
+                 print _("Failed to create snapshots")
++            for (odev, ndev) in snaps:
++                print _("Created snapshot from %s, results is: %s") %(odev,ndev)
+ 
+         if subcommand == 'summary':
+             snaps = base.fssnap.old_snapshots()
+commit 29440b1175411c3ccaca6010df8dec2d96088fbd
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Thu Jul 9 15:26:29 2015 +0200
+
+    Stop caching fssnapshot postfixes and add microseconds
+
+diff --git a/yum/fssnapshots.py b/yum/fssnapshots.py
+index a07271d..10ec012 100755
+--- a/yum/fssnapshots.py
++++ b/yum/fssnapshots.py
+@@ -3,6 +3,7 @@
+ import os
+ import fnmatch
+ import time
++from datetime import datetime
+ 
+ import subprocess
+ 
+@@ -228,23 +229,13 @@ class _FSSnap(object):
+ 
+         return ret
+ 
+-    def _get_postfix(self):
+-        if self._postfix is None:
+-            self._postfix = self.postfix_static
+-            self._postfix += time.strftime("%Y%m%d%H%M%S")
+-        return self._postfix
+-
+-    postfix = property(fget=lambda self: self._get_postfix(),
+-                       fset=lambda self, value: setattr(self, "_postfix",value),
+-                       fdel=lambda self: setattr(self, "_postfix", None),
+-                       doc="postfix for snapshots")
+ 
+     def snapshot(self, percentage=100, prefix='', postfix=None, tags={}):
+         """ Attempt to take a snapshot, note that errors can happen after
+             this function succeeds. """
+ 
+         if postfix is None:
+-            postfix = self.postfix
++            postfix = '%s%s' % (self.postfix_static, datetime.now().strftime("%Y%m%d%H%M%S.%f"))
+ 
+         ret = []
+         for vgname in self._vgnames:
+commit 2678b0a2eb042e011bcafb507eae5ea3565c9110
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Mon Jul 13 16:28:32 2015 +0200
+
+    Test for lvm binary before using.
+
+diff --git a/yum/fssnapshots.py b/yum/fssnapshots.py
+index 10ec012..70f80a0 100755
+--- a/yum/fssnapshots.py
++++ b/yum/fssnapshots.py
+@@ -155,7 +155,7 @@ class _FSSnap(object):
+         if not self._devs:
+             return
+ 
+-        self._vgnames = _list_vg_names()
++        self._vgnames = _list_vg_names() if self.available else []
+ 
+     def _use_dev(self, vgname, lv=None):
+ 
+commit e756473a1b01f40f087488f72d002d9993843a84
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Wed Aug 12 12:54:55 2015 +0200
+
+    Update not enough space messages for fssnapshot
+
+diff --git a/yum/__init__.py b/yum/__init__.py
+index 48956e9..84bea3e 100644
+--- a/yum/__init__.py
++++ b/yum/__init__.py
+@@ -1773,7 +1773,7 @@ much more problems).
+             (not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST) and
+             self.conf.fssnap_automatic_pre)):
+             if not self.fssnap.has_space(self.conf.fssnap_percentage):
+-                msg = _("Not enough space to create pre. FS snapshot.")
++                msg = _("Not enough space on logical volumes to create pre. FS snapshot.")
+                 if self.conf.fssnap_abort_on_errors in ('snapshot-failure', 'any'):
+                     raise Errors.YumRPMTransError(msg="Aborting transaction", errors=msg)
+                 else:
+@@ -1926,7 +1926,7 @@ much more problems).
+             (not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST) and
+             self.conf.fssnap_automatic_post)):
+             if not self.fssnap.has_space(self.conf.fssnap_percentage):
+-                msg = _("Not enough space to create post trans FS snapshot.")
++                msg = _("Not enough space on logical volumes to create post trans FS snapshot.")
+                 self.verbose_logger.critical(msg)
+             else:
+                 tags = {'*': ['reason=automatic']} # FIXME: post tags
+diff --git a/yumcommands.py b/yumcommands.py
+index 4a39ddb..5234260 100644
+--- a/yumcommands.py
++++ b/yumcommands.py
+@@ -4311,7 +4311,7 @@ class FSSnapshotCommand(YumCommand):
+             if base.fssnap.has_space(pc):
+                 print _("Space available to take a snapshot.")
+             else:
+-                print _("Not enough space available to take a snapshot.")
++                print _("Not enough space available on logical volumes to take a snapshot.")
+ 
+         if subcommand == 'create':
+             tags = {'*': ['reason=manual']}
diff --git a/SOURCES/BZ-1063177-xml-traceback.patch b/SOURCES/BZ-1063177-xml-traceback.patch
new file mode 100644
index 0000000..25550c3
--- /dev/null
+++ b/SOURCES/BZ-1063177-xml-traceback.patch
@@ -0,0 +1,24 @@
+commit 6132fa0c489f85c93ce77587ae3db4930d5bb1a4
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Tue May 26 11:16:00 2015 +0200
+
+    Don't traceback on xml parsing. BZ#1063177
+
+diff --git a/yum/repos.py b/yum/repos.py
+index d5e50ac..a0ef28c 100644
+--- a/yum/repos.py
++++ b/yum/repos.py
+@@ -381,6 +381,13 @@ class RepoStorage:
+             sack = repo.getPackageSack()
+             try:
+                 sack.populate(repo, mdtype, callback, cacheonly)
++            except TypeError, e:
++                if not e.args[0].startswith('Parsing'):
++                    raise
++                if mdtype in ['all', 'metadata'] and repo.skip_if_unavailable:
++                    self.disableRepo(repo.id)
++                else:
++                    raise Errors.RepoError(e.args[0])
+             except Errors.RepoError, e:
+                 if mdtype in ['all', 'metadata'] and repo.skip_if_unavailable:
+                     self.disableRepo(repo.id)
diff --git a/SOURCES/BZ-1168120-manpage.patch b/SOURCES/BZ-1168120-manpage.patch
new file mode 100644
index 0000000..4b750ce
--- /dev/null
+++ b/SOURCES/BZ-1168120-manpage.patch
@@ -0,0 +1,37 @@
+commit eb04b4977d16c31435449a9796189f341e7dd7d3
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Thu Jul 10 12:05:04 2014 +0200
+
+    yum manpage: move 'history info' description to its proper place.
+
+diff --git a/docs/yum.8 b/docs/yum.8
+index 86df6b0..998a5ad 100644
+--- a/docs/yum.8
++++ b/docs/yum.8
+@@ -535,6 +535,13 @@ The info/list/summary commands take either a transaction id or a package (with
+ wildcards, as in \fBSpecifying package names\fP), all three can also be passed
+ no arguments. list can be passed the keyword "all" to list all the transactions.
+ 
++The info command can also take ranges of transaction ids, of the form start..end,
++which will then display a merged history as if all the transactions in the range
++had happened at once\&.
++.br
++Eg. "history info 1..4" will merge the first four transactions and display them
++as a single transaction.
++
+ The packages-list/packages-info commands takes a package  (with wildcards, as in
+ \fBSpecifying package names\fP). And show data from the point of view of that
+ package.
+@@ -779,12 +786,6 @@ Checks the local rpmdb and produces information on any problems it finds. You
+ can pass the check command the arguments "dependencies", "duplicates", "obsoletes" or "provides",
+ to limit the checking that is performed (the default is "all" which does all).
+ 
+-The info command can also take ranges of transaction ids, of the form
+-start..end, which will then display a merged history as if all the
+-transactions in the range had happened at once\&.
+-.br
+-Eg. "history info 1..4" will merge the first four transactions and display them
+-as a single transaction.
+ .IP
+ .IP "\fBhelp\fP"
+ Produces help, either for all commands or if given a command name then the help
diff --git a/SOURCES/BZ-1168385-group-conditionals-deselect.patch b/SOURCES/BZ-1168385-group-conditionals-deselect.patch
new file mode 100644
index 0000000..5a8cb33
--- /dev/null
+++ b/SOURCES/BZ-1168385-group-conditionals-deselect.patch
@@ -0,0 +1,58 @@
+commit 0df9058960d3fa24aa7695a4a14524127cc0e9be
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Tue Apr 21 08:44:52 2015 +0200
+
+    Fix tsInfo.conditionals in deselect() when the package is not yet in the transaction BZ#1168385
+
+diff --git a/AUTHORS b/AUTHORS
+index 71845e1..350e136 100644
+--- a/AUTHORS
++++ b/AUTHORS
+@@ -24,6 +24,7 @@ YUM AUTHORS
+     James Antill
+     Panu Matilainen
+     Tambet Ingo
++    Valentina Mukhamedzhanova
+ 
+ 
+ Original Yup people:
+diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py
+index 9ce5025..ec2c7cb 100644
+--- a/yum/transactioninfo.py
++++ b/yum/transactioninfo.py
+@@ -237,6 +237,7 @@ class TransactionData:
+         if not txmbrs:
+             if self._inSack is not None:
+                 pkgs = self._inSack.returnPackages(patterns=[pattern])
++            if pkgs: pass
+             elif self.pkgSack is None:
+                 pkgs = []
+             else:
+commit c8b564968286ffccbd46beeb40c95d5e1c74a2aa
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Mon Jul 13 13:45:45 2015 +0200
+
+    Fix UnboundLocalError in deselect()
+
+diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py
+index ec2c7cb..8d47caa 100644
+--- a/yum/transactioninfo.py
++++ b/yum/transactioninfo.py
+@@ -235,13 +235,13 @@ class TransactionData:
+                 txmbrs = self.matchNaevr(na[0], na[1])
+ 
+         if not txmbrs:
++            pkgs = []
+             if self._inSack is not None:
+                 pkgs = self._inSack.returnPackages(patterns=[pattern])
+-            if pkgs: pass
+-            elif self.pkgSack is None:
+-                pkgs = []
+-            else:
++
++            if not pkgs and self.pkgSack is not None:
+                 pkgs = self.pkgSack.returnPackages(patterns=[pattern])
++
+             if not pkgs:
+                 pkgs = self.rpmdb.returnPackages(patterns=[pattern])
+ 
diff --git a/SOURCES/BZ-1182075-yum-security-manpage.patch b/SOURCES/BZ-1182075-yum-security-manpage.patch
new file mode 100644
index 0000000..b89ef9c
--- /dev/null
+++ b/SOURCES/BZ-1182075-yum-security-manpage.patch
@@ -0,0 +1,88 @@
+commit 2e04296024bdb3b4745e7e36420eaffa04f80ec0
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Wed Jun 17 18:50:40 2015 +0200
+
+    Add missing documentation from yum-security manpage. bug#1182075
+
+diff --git a/docs/yum.8 b/docs/yum.8
+index a0038f6..99862fa 100644
+--- a/docs/yum.8
++++ b/docs/yum.8
+@@ -938,6 +938,20 @@ Specifies an alternate directory to store packages.
+ Set any config option in yum config or repo files. For options in the global 
+ config just use: \-\-setopt=option=value for repo options use: \-\-setopt=repoid.option=value
+ .PP
++.IP "\fB\-\-security\fP"
++This option includes packages that say they fix a security issue, in updates.
++.br
++.IP "\fB\--advisory=ADVS, --advisories=ADVS\fP"
++This option includes in updates packages corresponding to the advisory ID, Eg. FEDORA-2201-123.
++.IP "\fB\--bz=BZS\fP"
++This option includes in updates packages that say they fix a Bugzilla ID, Eg. 123.
++.IP "\fB\--cve=CVES\fP"
++This option includes in updates packages that say they fix a CVE - Common Vulnerabilities and Exposures ID (http://cve.mitre.org/about/), Eg. CVE-2201-0123.
++.IP "\fB\--bugfix\fP"
++This option includes in updates packages that say they fix a bugfix issue.
++.IP "\fB\--sec-severity=SEVS, --secseverity=SEVS\fP"
++This option includes in updates security relevant packages of the specified severity.
++
+ 
+ .SH "LIST OPTIONS"
+ The following are the ways which you can invoke \fByum\fP in list
+@@ -1045,6 +1059,56 @@ Tell any enabled plugins to eliminate their cached data.
+ .IP "\fByum clean all\fP"
+ Does all of the above.
+ 
++.SH "EXAMPLES"
++.PP
++To list all updates that are security relevant, and get a return code on whether there are security updates use:
++.IP
++yum --security check-update
++.PP
++To upgrade packages that have security errata (upgrades to the latest
++available package) use:
++.IP
++yum --security update
++.PP
++To upgrade packages that have security errata (upgrades to the last
++security errata package) use:
++.IP
++yum --security update-minimal
++.PP
++To get a list of all BZs that are fixed for packages you have installed use:
++.IP
++yum updateinfo list bugzillas
++.PP
++To get a list of all security advisories, including the ones you have already
++installed use:
++.IP
++yum updateinfo list all security
++.PP
++To get the information on advisory FEDORA-2707-4567 use:
++.IP
++yum updateinfo info FEDORA-2707-4567
++.PP
++To update packages to the latest version which contain fixes for Bugzillas 123, 456 and 789; and all security updates use:
++.IP
++yum --bz 123 --bz 456 --bz 789 --security update
++.PP
++To update to the packages which just update Bugzillas 123, 456 and 789; and all security updates use:
++.IP
++yum --bz 123 --bz 456 --bz 789 --security update-minimal
++.PP
++To get an info list of the latest packages which contain fixes for Bugzilla 123; CVEs CVE-2207-0123 and CVE-2207-3210; and Fedora advisories FEDORA-2707-4567 and FEDORA-2707-7654 use:
++.IP
++yum --bz 123 --cve CVE-2207-0123 --cve CVE-2207-3210 --advisory FEDORA-2707-4567 --advisory FEDORA-2707-7654 info updates
++.PP
++To get a list of packages which are "new".
++.IP
++yum updateinfo list new
++.PP
++To get a summary of advisories you haven't installed yet use:
++.IP
++yum updateinfo summary
++
++
+ .PP 
+ .SH "PLUGINS"
+ Yum can be extended through the use of plugins. A plugin is a Python ".py" file
diff --git a/SOURCES/BZ-1182096-yum-cron-conf-upgrade-minimal.patch b/SOURCES/BZ-1182096-yum-cron-conf-upgrade-minimal.patch
new file mode 100644
index 0000000..7b996b4
--- /dev/null
+++ b/SOURCES/BZ-1182096-yum-cron-conf-upgrade-minimal.patch
@@ -0,0 +1,40 @@
+commit cc4dc5b663b0be13fe6bf4de96458f87c90793ad
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Thu May 21 11:08:06 2015 +0200
+
+    Replace 'upgrade-minimal' with documented 'update-minimal' in yum-cron.conf files. BZ#1182096
+
+diff --git a/etc/yum-cron-hourly.conf b/etc/yum-cron-hourly.conf
+index 2a588cd..63c0bb6 100644
+--- a/etc/yum-cron-hourly.conf
++++ b/etc/yum-cron-hourly.conf
+@@ -3,9 +3,9 @@
+ # default                            = yum upgrade
+ # security                           = yum --security upgrade
+ # security-severity:Critical         = yum --sec-severity=Critical upgrade
+-# minimal                            = yum --bugfix upgrade-minimal
+-# minimal-security                   = yum --security upgrade-minimal
+-# minimal-security-severity:Critical =  --sec-severity=Critical upgrade-minimal
++# minimal                            = yum --bugfix update-minimal
++# minimal-security                   = yum --security update-minimal
++# minimal-security-severity:Critical =  --sec-severity=Critical update-minimal
+ update_cmd = default
+ 
+ # Whether a message should emitted when updates are available.
+diff --git a/etc/yum-cron.conf b/etc/yum-cron.conf
+index 960fcc9..7ab4d04 100644
+--- a/etc/yum-cron.conf
++++ b/etc/yum-cron.conf
+@@ -3,9 +3,9 @@
+ # default                            = yum upgrade
+ # security                           = yum --security upgrade
+ # security-severity:Critical         = yum --sec-severity=Critical upgrade
+-# minimal                            = yum --bugfix upgrade-minimal
+-# minimal-security                   = yum --security upgrade-minimal
+-# minimal-security-severity:Critical =  --sec-severity=Critical upgrade-minimal
++# minimal                            = yum --bugfix update-minimal
++# minimal-security                   = yum --security update-minimal
++# minimal-security-severity:Critical =  --sec-severity=Critical update-minimal
+ update_cmd = default
+ 
+ # Whether a message should be emitted when updates are available,
diff --git a/SOURCES/BZ-1188960-API-missing-requires.patch b/SOURCES/BZ-1188960-API-missing-requires.patch
new file mode 100644
index 0000000..27c2458
--- /dev/null
+++ b/SOURCES/BZ-1188960-API-missing-requires.patch
@@ -0,0 +1,161 @@
+commit 423f5ee15cb0184d6583b57429ba9cb5bd8cdd35
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Wed Jun 24 17:05:59 2015 +0200
+
+    Plugin API update: missing_requires, pretty_output_update and promptYN fix. BZ#1188960
+
+diff --git a/output.py b/output.py
+index 091b58e..5a73f8e 100755
+--- a/output.py
++++ b/output.py
+@@ -2795,6 +2795,13 @@ to exit.
+             if lastdbv.end_rpmdbversion != rpmdbv:
+                 self._rpmdb_warn_checks()
+ 
++    @staticmethod
++    def pretty_output_restring(restring):
++        for msg in restring:
++            prefix = _('Error: %s')
++            prefix2nd = (' ' * (utf8_width(prefix) - 2))
++            yield (prefix, msg.replace('\n', '\n' + prefix2nd))
++
+ 
+ class DepSolveProgressCallBack:
+     """A class to provide text output callback functions for Dependency Solver callback."""
+diff --git a/utils.py b/utils.py
+index dbcd605..5ba320f 100755
+--- a/utils.py
++++ b/utils.py
+@@ -393,10 +393,8 @@ class YumUtilBase(YumBaseCli):
+             return 0
+         elif result == 1:
+             # Fatal error
+-            for msg in resultmsgs:
+-                prefix = _('Error: %s')
+-                prefix2nd = (' ' * (utf8_width(prefix) - 2))
+-                self.logger.critical(prefix, msg.replace('\n', '\n' + prefix2nd))
++            for prefix, msg in self.pretty_output_restring(resultmsgs):
++                self.logger.critical(prefix, msg)
+             if not self.conf.skip_broken:
+                 self.verbose_logger.info(_(" You could try using --skip-broken to work around the problem"))
+             if not self._rpmdb_warn_checks(out=self.verbose_logger.info, warn=False):
+diff --git a/yum/depsolve.py b/yum/depsolve.py
+index 797826f..a1aeac3 100644
+--- a/yum/depsolve.py
++++ b/yum/depsolve.py
+@@ -120,6 +120,7 @@ class Depsolve(object):
+ 
+         self.installedFileRequires = None
+         self.installedUnresolvedFileRequires = None
++        self._missing_requires = False
+ 
+     def doTsSetup(self):
+         """Sets up the transaction set before it is used."""
+@@ -375,6 +376,7 @@ class Depsolve(object):
+         return self._prco_req_nfv2req(req[0], req[1], req[2])
+             
+     def _err_missing_requires(self, reqPo, reqTup):
++        self._missing_requires = True
+         if hasattr(self.dsCallback, 'format_missing_requires'):
+             msg = self.dsCallback.format_missing_requires(reqPo, reqTup)
+             if msg is not None: # PK
+diff --git a/yum/plugins.py b/yum/plugins.py
+index f34ea19..7034da9 100644
+--- a/yum/plugins.py
++++ b/yum/plugins.py
+@@ -63,7 +63,7 @@ from yum.i18n import utf8_width
+ # API, the major version number must be incremented and the minor version number
+ # reset to 0. If a change is made that doesn't break backwards compatibility,
+ # then the minor number must be incremented.
+-API_VERSION = '2.6'
++API_VERSION = '2.7'
+ 
+ class DeprecatedInt(int):
+     """A simple int subclass that is used to check when a deprecated
+@@ -416,18 +416,22 @@ class PluginConduit:
+         converted_level = logginglevels.logLevelFromErrorLevel(level)
+         self.logger.log(converted_level, msg)
+ 
+-    def promptYN(self, msg):
++    def promptYN(self, msg, prompt=None):
+         """Return a yes or no response, either from assumeyes already
+         being set, or from prompting the user.
+ 
+-        :param msg: the message to prompt the user with
++        :param msg: the message to show to the user
++        :param prompt: the question to ask the user (optional); defaults to 'Is this ok [y/N]: '
+         :return: 1 if the response is yes, and 0 if the response is no
+         """
+         self.info(2, msg)
++        if self._base.conf.assumeno:
++            return False
+         if self._base.conf.assumeyes:
+-            return 1
++            return True
+         else:
+-            return self._base.userconfirm()
++            kwargs = {'prompt': prompt} if prompt else {}
++            return bool(self._base.userconfirm(**kwargs))
+ 
+     def getYumVersion(self):
+         """Return a string representing the current version of yum."""
+@@ -704,6 +708,14 @@ class DepsolvePluginConduit(MainPluginConduit):
+         self.resultcode = rescode
+         self.resultstring = restring
+ 
++    @property
++    def missing_requires(self):
++        """Boolean indicating if depsolving failed due to missing dependencies."""
++        return self._base._missing_requires
++
++    def pretty_output_restring(self):
++        return '\n'.join(prefix % msg for prefix, msg in self._base.pretty_output_restring(self.resultstring))
++
+ class CompareProvidersPluginConduit(MainPluginConduit):
+     """Conduit to compare different providers of packages."""
+ 
+diff --git a/yummain.py b/yummain.py
+index 0c7c535..32680a8 100755
+--- a/yummain.py
++++ b/yummain.py
+@@ -248,10 +248,8 @@ def main(args):
+         return base.exit_code
+     elif result == 1:
+         # Fatal error
+-        for msg in resultmsgs:
+-            prefix = _('Error: %s')
+-            prefix2nd = (' ' * (utf8_width(prefix) - 2))
+-            logger.critical(prefix, msg.replace('\n', '\n' + prefix2nd))
++        for prefix, msg in base.pretty_output_restring(resultmsgs):
++            logger.critical(prefix, msg)
+         if base._depsolving_failed:
+             if not base.conf.skip_broken:
+                 verbose_logger.info(_(" You could try using --skip-broken to work around the problem"))
+commit 1c883b65432c288ad941a362a49c15a8e4fb74b9
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Mon Jun 29 16:56:13 2015 +0200
+
+    Add conduit.confList to plugin API
+
+diff --git a/yum/plugins.py b/yum/plugins.py
+index 7034da9..6857626 100644
+--- a/yum/plugins.py
++++ b/yum/plugins.py
+@@ -504,6 +504,17 @@ class PluginConduit:
+         """
+         return config.getOption(self._conf, section, opt, config.BoolOption(default))
+ 
++    def confList(self, section, opt, default=None):
++        """Read a boolean value from the plugin's own configuration file
++
++        :param section: configuration file section to read
++        :param opt: option name to read
++        :param default: value to read if the option is missing
++        :return: boolean option value read, or *default* if the option
++            was missing or could not be parsed
++        """
++        return config.getOption(self._conf, section, opt, config.ListOption(default))
++
+     def registerPackageName(self, name):
+         """Register the name of a package to use.
+ 
diff --git a/SOURCES/BZ-1192239-update-minimal.patch b/SOURCES/BZ-1192239-update-minimal.patch
new file mode 100644
index 0000000..2a1158f
--- /dev/null
+++ b/SOURCES/BZ-1192239-update-minimal.patch
@@ -0,0 +1,32 @@
+commit bfeae9135994630147c4d6af8679f95157a90d76
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Fri Feb 14 13:54:30 2014 +0100
+
+    Fix update-minimal traceback (#1048584) and ignoring updates.
+
+diff --git a/yum/updateinfo.py b/yum/updateinfo.py
+index 1cc207f..8d91f88 100644
+--- a/yum/updateinfo.py
++++ b/yum/updateinfo.py
+@@ -513,7 +513,7 @@ def update_minimal(base, extcmds=[]):
+             if extcmds and not _match_sec_cmd(extcmds, name, notice):
+                 continue
+             if (not ndata and
+-                not _ysp_should_filter_pkg(base, name, notice, used_map)):
++                not _ysp_should_filter_pkg(opts, name, notice, used_map)):
+                 continue
+             txmbrs.extend(base.update(name=pkgtup[0], arch=pkgtup[1],
+                                       epoch=pkgtup[2],
+diff --git a/yumcommands.py b/yumcommands.py
+index c93faa1..4e3b730 100644
+--- a/yumcommands.py
++++ b/yumcommands.py
+@@ -4156,7 +4156,7 @@ class UpdateMinimalCommand(YumCommand):
+ 
+         num = len(base.tsInfo)
+         _upi.update_minimal(base, extcmds)
+-        num -= len(base.tsInfo)
++        num = len(base.tsInfo) - num
+         
+         if num > 0:
+             msg = '%d packages marked for minimal Update' % num
diff --git a/SOURCES/BZ-1193871-updateinfo-notice-when-arch-changed.patch b/SOURCES/BZ-1193871-updateinfo-notice-when-arch-changed.patch
new file mode 100644
index 0000000..7e1d9a8
--- /dev/null
+++ b/SOURCES/BZ-1193871-updateinfo-notice-when-arch-changed.patch
@@ -0,0 +1,56 @@
+diff --git a/yum/update_md.py b/yum/update_md.py
+--- a/yum/update_md.py	2015-01-19 07:44:35.567107008 -0500
++++ b/yum/update_md.py	2015-01-19 08:57:31.576489424 -0500
+@@ -398,6 +399,9 @@ class UpdateMetadata(object):
+             except Errors.RepoMDError:
+                 continue # No metadata found for this repo
+ 
++        self.arch_storage = ArchStorage()
++        self.archlist = self.arch_storage.archlist
++
+     def get_notices(self, name=None):
+         """ Return all notices. """
+         if name is None:
+@@ -434,16 +438,29 @@ class UpdateMetadata(object):
+         name = oldpkgtup[0]
+         arch = oldpkgtup[1]
+         ret = []
++        other_arch_list = []
++        notices = set()
+         for notice in self.get_notices(name):
+             for upkg in notice['pkglist']:
+                 for pkg in upkg['packages']:
++                    other_arch = False
+                     if pkg['name'] != name or pkg['arch'] != arch:
+-                        continue
++                        if (notice not in notices and pkg['name'] == name and pkg['arch'] in self.archlist):
++                            other_arch = True
++                        else:
++                            continue
+                     pkgtup = (pkg['name'], pkg['arch'], pkg['epoch'] or '0',
+                               pkg['version'], pkg['release'])
+                     if _rpm_tup_vercmp(pkgtup, oldpkgtup) <= 0:
+                         continue
+-                    ret.append((pkgtup, notice))
++                    if other_arch:
++                        other_arch_list.append((pkgtup, notice))
++                    else:
++                        ret.append((pkgtup, notice))
++                        notices.add(notice)
++        for pkgtup, notice in other_arch_list:
++            if notice not in notices:
++                ret.append((pkgtup, notice))
+         ret.sort(cmp=_rpm_tup_vercmp, key=lambda x: x[0], reverse=True)
+         return ret
+ 
+diff -up yum-3.4.3/yum/update_md.py.old yum-3.4.3/yum/update_md.py
+--- yum-3.4.3/yum/update_md.py.old	2015-05-28 19:23:35.589691937 +0200
++++ yum-3.4.3/yum/update_md.py	2015-05-28 19:24:05.971806965 +0200
+@@ -33,6 +33,7 @@ import Errors
+ import logginglevels
+ 
+ import rpmUtils.miscutils
++from rpmUtils.arch import ArchStorage
+ 
+ 
+ def safe_iterparse(filename, logger=None):
diff --git a/SOURCES/BZ-1199976-kbase-articles.patch b/SOURCES/BZ-1199976-kbase-articles.patch
new file mode 100644
index 0000000..f2945eb
--- /dev/null
+++ b/SOURCES/BZ-1199976-kbase-articles.patch
@@ -0,0 +1,67 @@
+diff --git a/output.py b/output.py
+index 091b58e..b14f129 100755
+--- a/output.py
++++ b/output.py
+@@ -447,6 +447,8 @@ class YumOutput:
+         self.term = YumTerm()
+         self._last_interrupt = None
+ 
++        self.reported_error_msgs = {k: False for (k, v) in ERRORS_TO_KBASE_ARTICLES.iteritems()}
++
+     
+     def printtime(self):
+         """Return a string representing the current time in the form::
+@@ -471,8 +473,22 @@ class YumOutput:
+         """
+         self.logger.error('%s: %s', errobj.url, errobj.exception)
+         self.logger.error(_('Trying other mirror.'))
++        self.suggestKBaseArticle(errobj)
+         raise errobj.exception
+     
++    def suggestKBaseArticle(self, errobj):
++        errcode = None
++        if hasattr(errobj.exception, 'code') and errobj.exception.code in ERRORS_TO_KBASE_ARTICLES:
++            errcode = errobj.exception.code
++        elif hasattr(errobj.exception, 'errno') and errobj.exception.errno in ERRORS_TO_KBASE_ARTICLES:
++            errcode = errobj.exception.errno
++        if not errcode:
++            return
++
++        if not self.reported_error_msgs[errcode]:
++            self.logger.error(ERRORS_TO_KBASE_ARTICLES[errcode])
++            self.reported_error_msgs[errcode] = True
++    
+         
+     def simpleProgressBar(self, current, total, name=None):
+         """Output the current status to the terminal using a simple
+diff --git a/yum/constants.py b/yum/constants.py
+index 5c728d4..02b2527 100644
+--- a/yum/constants.py
++++ b/yum/constants.py
+@@ -120,3 +120,25 @@ REPO_PROBLEM_METADATA=2
+ REPO_PROBLEM_COMPS=3
+ REPO_PROBLEM_OTHER=4
+ REPO_PROBLEM_PACKAGE=5
++
++
++ERRORS_TO_KBASE_ARTICLES = {
++    404: """To address this issue please refer to the below knowledge base article 
++
++https://access.redhat.com/articles/1320623
++
++If above article doesn't help to resolve this issue please open a ticket with Red Hat Support.
++""",
++    403: """To address this issue please refer to the below knowledge base article
++
++https://access.redhat.com/solutions/69319
++
++If above article doesn't help to resolve this issue please open a ticket with Red Hat Support.
++""",
++    60: """It was impossible to connect to the Red Hat servers.
++This could mean a connectivity issue in your environment, such as the requirement to configure a proxy,
++or a transparent proxy that tampers with TLS security, or an incorrect system clock.
++Please collect information about the specific failure that occurs in your environment,
++using the instructions in: https://access.redhat.com/solutions/1527033 and open a ticket with Red Hat Support.
++"""
++}
+\ No newline at end of file
diff --git a/SOURCES/BZ-1211384-yum-grouplist-headers.patch b/SOURCES/BZ-1211384-yum-grouplist-headers.patch
new file mode 100644
index 0000000..2ba0b7b
--- /dev/null
+++ b/SOURCES/BZ-1211384-yum-grouplist-headers.patch
@@ -0,0 +1,74 @@
+diff -up yum-3.4.3/cli.py.old yum-3.4.3/cli.py
+--- yum-3.4.3/cli.py.old	2015-05-28 18:04:17.237676571 +0200
++++ yum-3.4.3/cli.py	2015-05-28 18:05:27.644943137 +0200
+@@ -1807,22 +1807,22 @@ class YumBaseCli(yum.YumBase, output.Yum
+                     msg += ' [%s]' % group.langonly
+                 self.verbose_logger.info('%s', msg)
+ 
+-        _out_grp(_('Installed environment groups:'), ievgrps)
+-        _out_grp(_('Available environment groups:'), evgrps)
++        _out_grp(_('Installed Environment Groups:'), ievgrps)
++        _out_grp(_('Available Environment Groups:'), evgrps)
+ 
+         groups = []
+         for group in installed:
+             if group.langonly: continue
+             if not wts['pkg']: continue
+             groups.append(group)
+-        _out_grp(_('Installed groups:'), groups)
++        _out_grp(_('Installed Groups:'), groups)
+ 
+         groups = []
+         for group in installed:
+             if not group.langonly: continue
+             if not wts['lang']: continue
+             groups.append(group)
+-        _out_grp(_('Installed language groups:'), groups)
++        _out_grp(_('Installed Language Groups:'), groups)
+ 
+         groups = []
+         for group in available:
+@@ -1836,7 +1836,7 @@ class YumBaseCli(yum.YumBase, output.Yum
+             if not group.langonly: continue
+             if not wts['lang']: continue
+             groups.append(group)
+-        _out_grp(_('Available language groups:'), groups)
++        _out_grp(_('Available Language Groups:'), groups)
+ 
+         if not done:
+             self.logger.error(_('Warning: no environments/groups match: %s'),
+diff -up yum-3.4.3/po/yum.pot.old yum-3.4.3/po/yum.pot
+--- yum-3.4.3/po/yum.pot.old	2015-05-28 18:05:37.610980869 +0200
++++ yum-3.4.3/po/yum.pot	2015-05-28 18:06:23.557154824 +0200
+@@ -398,11 +398,11 @@ msgid "Cleaning up plugins"
+ msgstr ""
+ 
+ #: ../cli.py:1732
+-msgid "Installed environment groups:"
++msgid "Installed Environment Groups:"
+ msgstr ""
+ 
+ #: ../cli.py:1733
+-msgid "Available environment groups:"
++msgid "Available Environment Groups:"
+ msgstr ""
+ 
+ #: ../cli.py:1740
+@@ -410,7 +410,7 @@ msgid "Installed groups:"
+ msgstr ""
+ 
+ #: ../cli.py:1747
+-msgid "Installed language groups:"
++msgid "Installed Language Groups:"
+ msgstr ""
+ 
+ #: ../cli.py:1754
+@@ -418,7 +418,7 @@ msgid "Available Groups:"
+ msgstr ""
+ 
+ #: ../cli.py:1761
+-msgid "Available language groups:"
++msgid "Available Language Groups:"
+ msgstr ""
+ 
+ #: ../cli.py:1764
diff --git a/SOURCES/BZ-1212506-running-kernel-epoch.patch b/SOURCES/BZ-1212506-running-kernel-epoch.patch
new file mode 100644
index 0000000..cc543c5
--- /dev/null
+++ b/SOURCES/BZ-1212506-running-kernel-epoch.patch
@@ -0,0 +1,19 @@
+commit fefb6a732e0c15c73300858c3fa7d7e89e79d18f
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Wed Mar 11 10:52:49 2015 +0100
+
+    Make sure epoch is a string while checking for running kernel. BZ#1200159
+
+diff --git a/yum/misc.py b/yum/misc.py
+index 6850ae2..f72f028 100644
+--- a/yum/misc.py
++++ b/yum/misc.py
+@@ -818,6 +818,8 @@ def get_running_kernel_pkgtup(ts):
+             e = h['epoch']
+             if h['epoch'] is None:
+                 e = '0'
++            else:
++                e = str(e)
+             return (h['name'], h['arch'], e, h['version'], h['release'])
+     
+     return (None, None, None, None, None)
diff --git a/SOURCES/BZ-1212514-not-enough-space.patch b/SOURCES/BZ-1212514-not-enough-space.patch
new file mode 100644
index 0000000..4b59ad9
--- /dev/null
+++ b/SOURCES/BZ-1212514-not-enough-space.patch
@@ -0,0 +1,57 @@
+commit 7b125d415195713596c798e8ac79e4812873d948
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Tue Dec 9 10:27:40 2014 +0100
+
+    Expect KB as well as MB in disk requirements message from rpm. BZ 1051931
+
+diff --git a/cli.py b/cli.py
+index b7f5b5a..f04fe63 100755
+--- a/cli.py
++++ b/cli.py
+@@ -498,13 +498,14 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+         """
+         summary = ''
+         # do disk space report first
+-        p = re.compile('needs (\d+)MB on the (\S+) filesystem')
++        p = re.compile('needs (\d+)(K|M)B on the (\S+) filesystem')
+         disk = {}
+         for m in p.finditer(errstring):
+-            if m.group(2) not in disk:
+-                disk[m.group(2)] = int(m.group(1))
+-            if disk[m.group(2)] < int(m.group(1)):
+-                disk[m.group(2)] = int(m.group(1))
++            size_in_mb = int(m.group(1)) if m.group(2) == 'M' else round(int(m.group(1))/1024.0, 3)
++            if m.group(3) not in disk:
++                disk[m.group(3)] = size_in_mb
++            if disk[m.group(3)] < size_in_mb:
++                disk[m.group(3)] = size_in_mb
+                 
+         if disk:
+             summary += _('Disk Requirements:\n')
+commit 6ea8a6cf572efa7d7601dfc8535f5cc3cd80c3bd
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Tue Mar 17 11:19:10 2015 +0100
+
+    Fix rounding issue in required disk space message.
+
+diff --git a/cli.py b/cli.py
+index cefc67e..9766f89 100755
+--- a/cli.py
++++ b/cli.py
+@@ -25,6 +25,7 @@ import sys
+ import time
+ import random
+ import logging
++import math
+ from optparse import OptionParser,OptionGroup,SUPPRESS_HELP
+ import rpm
+ 
+@@ -501,7 +502,7 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
+         p = re.compile('needs (\d+)(K|M)B on the (\S+) filesystem')
+         disk = {}
+         for m in p.finditer(errstring):
+-            size_in_mb = int(m.group(1)) if m.group(2) == 'M' else round(int(m.group(1))/1024.0, 3)
++            size_in_mb = int(m.group(1)) if m.group(2) == 'M' else math.ceil(int(m.group(1))/1024.0)
+             if m.group(3) not in disk:
+                 disk[m.group(3)] = size_in_mb
+             if disk[m.group(3)] < size_in_mb:
diff --git a/SOURCES/BZ-1212519-exclude-installed.patch b/SOURCES/BZ-1212519-exclude-installed.patch
new file mode 100644
index 0000000..d236c17
--- /dev/null
+++ b/SOURCES/BZ-1212519-exclude-installed.patch
@@ -0,0 +1,113 @@
+commit d875b67997356e7e1b4509607fec81ca8220c597
+Author: James Antill <james@and.org>
+Date:   Tue Mar 3 01:54:02 2015 -0500
+
+    Add query_install_excludes conf./docs and use it for list/info/search/provides.
+
+diff --git a/cli.py b/cli.py
+index f04fe63..cefc67e 100755
+--- a/cli.py
++++ b/cli.py
+@@ -2299,7 +2299,8 @@ class YumOptionParser(OptionParser):
+             self.base.conf.disable_excludes = self._splitArg(opts.disableexcludes)
+             self.base.conf.disable_includes = self._splitArg(opts.disableincludes)
+ 
+-            for exclude in self._splitArg(opts.exclude):
++            self.base.cmdline_excludes = self._splitArg(opts.exclude)
++            for exclude in self.base.cmdline_excludes:
+                 try:
+                     excludelist = self.base.conf.exclude
+                     excludelist.append(exclude)
+diff --git a/docs/yum.conf.5 b/docs/yum.conf.5
+index e0f4c8b..62aa78e 100644
+--- a/docs/yum.conf.5
++++ b/docs/yum.conf.5
+@@ -156,10 +156,20 @@ This is commonly used so a package isn't upgraded or installed accidentally, but
+ can be used to remove packages in any way that "yum list" will show packages.
+ Shell globs using wildcards (eg. * and ?) are allowed.
+ 
+-Can be disabled using --disableexcludes.
++Can be disabled using disable_excludes or --disableexcludes.
+ Command-line option: \fB\-x\fP
+ 
+ .IP
++\fBdisable_excludes\fR
++A way to permanently set the --disableexcludes command line option.
++
++.IP
++\fBquery_install_excludes\fR
++This applies the command line exclude option (only, not the configuration
++exclude above) to installed packages being shown in some query commands
++(currently: list/info/search/provides).
++
++.IP
+ \fBinstallonlypkgs \fR
+ List of package provides that should only ever be installed, never updated.
+ Kernels in particular fall into this category. Defaults to kernel,
+diff --git a/output.py b/output.py
+index 2787d86..091b58e 100755
+--- a/output.py
++++ b/output.py
+@@ -1330,6 +1330,13 @@ class YumOutput:
+         :param verbose: whether to output extra verbose information
+         :param highlight: highlighting options for the highlighted matches
+         """
++        if (po.repo.id == "installed" and
++            self.conf.query_install_excludes and self.cmdline_excludes):
++            # Very similar to _cmdline_exclude from yumcommands
++            e,m,u = yum.packages.parsePackages([po], self.cmdline_excludes)
++            if e or m:
++                return
++
+         if self.conf.showdupesfromrepos:
+             msg = '%s : ' % po
+         else:
+diff --git a/yum/config.py b/yum/config.py
+index 02061ba..efe7be9 100644
+--- a/yum/config.py
++++ b/yum/config.py
+@@ -821,6 +821,7 @@ class YumConf(StartupConf):
+     # XXX rpm_check_debug is unused, left around for API compatibility for now
+     rpm_check_debug = BoolOption(True)
+     disable_excludes = ListOption()    
++    query_install_excludes = BoolOption(True)
+     skip_broken = BoolOption(False)
+     #  Note that "instant" is the old behaviour, but group:primary is very
+     # similar but better :).
+diff --git a/yumcommands.py b/yumcommands.py
+index e77d209..6fa11fa 100644
+--- a/yumcommands.py
++++ b/yumcommands.py
+@@ -41,6 +41,7 @@ import errno
+ 
+ import yum.config
+ from yum import updateinfo
++from yum.packages import parsePackages
+ 
+ def _err_mini_usage(base, basecmd):
+     if basecmd not in base.yum_cli_commands:
+@@ -584,6 +585,14 @@ def _list_cmd_calc_columns(base, ypl):
+     columns = base.calcColumns(data, remainder_column=1)
+     return (-columns[0], -columns[1], -columns[2])
+ 
++def _cmdline_exclude(pkgs, cmdline_excludes):
++    """ Do an extra exclude for installed packages that match the cmd line. """
++    if not cmdline_excludes:
++        return pkgs
++    e,m,u = parsePackages(pkgs, cmdline_excludes)
++    excluded = set(e + m)
++    return [po for po in pkgs if po not in excluded]
++
+ class InfoCommand(YumCommand):
+     """A class containing methods needed by the cli to execute the
+     info command.
+@@ -682,6 +691,9 @@ class InfoCommand(YumCommand):
+             clin = base.conf.color_list_installed_newer
+             clir = base.conf.color_list_installed_reinstall
+             clie = base.conf.color_list_installed_extra
++            if base.conf.query_install_excludes:
++                ypl.installed = _cmdline_exclude(ypl.installed,
++                                                 base.cmdline_excludes)
+             rip = base.listPkgs(ypl.installed, _('Installed Packages'), basecmd,
+                                 highlight_na=update_pkgs, columns=columns,
+                                 highlight_modes={'>' : clio, '<' : clin,
diff --git a/SOURCES/BZ-1233152-pvm-api-lv_attr.patch b/SOURCES/BZ-1233152-pvm-api-lv_attr.patch
new file mode 100644
index 0000000..f02a96c
--- /dev/null
+++ b/SOURCES/BZ-1233152-pvm-api-lv_attr.patch
@@ -0,0 +1,35 @@
+commit 1ba900a1c6a0a6d4dc3c2fd7a5de3027ecb3a153
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Wed Jul 1 16:17:20 2015 +0200
+
+    Fix lvm API calls. Patch by Marek Marusic. BZ#1233152
+
+diff --git a/yum/fssnapshots.py b/yum/fssnapshots.py
+index 9af252d..a07271d 100755
+--- a/yum/fssnapshots.py
++++ b/yum/fssnapshots.py
+@@ -25,21 +25,21 @@ except:
+ 
+ 
+ def _is_origin(lv):
+-    snap = lv.getProperty("lv_attr")
++    snap = lv.getAttr()
+     # snap=(<value>, <is settable>)
+     if not snap[0]: # Broken??
+         return None
+     return snap[0][0] in ('o', 'O')
+ 
+ def _is_snap(lv):
+-    snap = lv.getProperty("lv_attr")
++    snap = lv.getAttr()
+     # snap=(<value>, <is settable>)
+     if not snap[0]: # Broken??
+         return None
+     return snap[0][0] in ('s', 'S')
+ 
+ def _is_virt(lv):
+-    snap = lv.getProperty("lv_attr")
++    snap = lv.getAttr()
+     # snap=(<value>, <is settable>)
+     if not snap[0]: # Broken??
+         return None
diff --git a/SOURCES/BZ-1244119-fssnapshot-automatic-percentage-manpage.patch b/SOURCES/BZ-1244119-fssnapshot-automatic-percentage-manpage.patch
new file mode 100644
index 0000000..62698f3
--- /dev/null
+++ b/SOURCES/BZ-1244119-fssnapshot-automatic-percentage-manpage.patch
@@ -0,0 +1,25 @@
+commit 7db4c7826a538e0a3a59f1f5d6fca26de7895204
+Author: Valentina Mukhamedzhanova <vmukhame@redhat.com>
+Date:   Thu Jul 30 15:20:27 2015 +0200
+
+    Fix fssnap_automatic_devices and fssnap_automatic_percentage in yum.conf manpage
+
+diff --git a/docs/yum.conf.5 b/docs/yum.conf.5
+index 22701e0..5993b57 100644
+--- a/docs/yum.conf.5
++++ b/docs/yum.conf.5
+@@ -894,12 +894,12 @@ How many old snapshots should yum keep when trying to automatically create a
+ new snapshot. Setting to 0 disables this feature. Default is '1'.
+ 
+ .IP
+-\fBfssnap_automatic_percentage\fR
++\fBfssnap_percentage\fR
+ The size of new snaphosts, expressed as a percentage of the old origin device. 
+ Any number between 1 and 100. Default is '100'.
+ 
+ .IP
+-\fBfssnap_automatic_devices\fR
++\fBfssnap_devices\fR
+ The origin LVM devices to use for snapshots. Wildcards and negation are allowed,
+ first match (positive or negative) wins.
+ Default is: !*/swap !*/lv_swap glob:/etc/yum/fssnap.d/*.conf
diff --git a/SOURCES/BZ-1259837-igroups-empty-lines.patch b/SOURCES/BZ-1259837-igroups-empty-lines.patch
new file mode 100644
index 0000000..58cd10b
--- /dev/null
+++ b/SOURCES/BZ-1259837-igroups-empty-lines.patch
@@ -0,0 +1,48 @@
+diff -up yum-3.4.3/yum/igroups.py.old yum-3.4.3/yum/igroups.py
+--- yum-3.4.3/yum/igroups.py.old	2015-09-09 16:18:23.494390878 +0200
++++ yum-3.4.3/yum/igroups.py	2015-09-09 17:10:33.451517354 +0200
+@@ -43,6 +43,12 @@ def _makedirs_no_umask(*args):
+ 
+     return ret
+ 
++def _read_str(fo):
++    for s in fo:
++        if s[:-1]:
++            return s[:-1]
++    return ''
++
+ class InstalledGroup(object):
+     def __init__(self, gid):
+         self.gid       = gid
+@@ -107,11 +113,11 @@ class InstalledGroups(object):
+         if not os.access(self.filename, os.R_OK):
+             return
+ 
+-        def _read_str(fo):
+-            return fo.readline()[:-1]
+-
+         fo = open(self.filename)
+-        ver = int(_read_str(fo))
++        try:
++            ver = int(_read_str(fo))
++        except ValueError:
++            return
+         if ver != 1:
+             return
+ 
+@@ -132,11 +138,11 @@ class InstalledGroups(object):
+         if not os.access(self.grp_filename, os.R_OK):
+             return
+ 
+-        def _read_str(fo):
+-            return fo.readline()[:-1]
+-
+         fo = open(self.grp_filename)
+-        ver = int(_read_str(fo))
++        try:
++            ver = int(_read_str(fo))
++        except ValueError:
++            return
+         if ver != 1:
+             return
+ 
diff --git a/SOURCES/yum.conf.centos b/SOURCES/yum.conf.centos
deleted file mode 100644
index 367126f..0000000
--- a/SOURCES/yum.conf.centos
+++ /dev/null
@@ -1,26 +0,0 @@
-[main]
-cachedir=/var/cache/yum/$basearch/$releasever
-keepcache=0
-debuglevel=2
-logfile=/var/log/yum.log
-exactarch=1
-obsoletes=1
-gpgcheck=1
-plugins=1
-installonly_limit=5
-bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
-distroverpkg=centos-release
-
-
-#  This is the default, if you make this bigger yum won't see if the metadata
-# is newer on the remote and so you'll "gain" the bandwidth of not having to
-# download the new metadata and "pay" for it by yum not having correct
-# information.
-#  It is esp. important, to have correct metadata, for distributions like
-# Fedora which don't keep old packages around. If you don't like this checking
-# interupting your command line usage, it's much better to have something
-# manually check the metadata once an hour (yum-updatesd will do this).
-# metadata_expire=90m
-
-# PUT YOUR REPOS HERE OR IN separate files named file.repo
-# in /etc/yum.repos.d
diff --git a/SPECS/yum.spec b/SPECS/yum.spec
index 4a50ea8..6c934f9 100644
--- a/SPECS/yum.spec
+++ b/SPECS/yum.spec
@@ -36,11 +36,11 @@ BuildRequires: bash-completion
 Summary: RPM package installer/updater/manager
 Name: yum
 Version: 3.4.3
-Release: 125%{?dist}
+Release: 132%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source0: http://yum.baseurl.org/download/3.4/%{name}-%{version}.tar.gz
-Source1: yum.conf.centos
+Source1: yum.conf.fedora
 Source2: yum-updatesd.conf.fedora
 Patch1: yum-distro-configs.patch
 Patch5: geode-arch.patch
@@ -77,6 +77,25 @@ Patch110: BZ-1063181-upgrades-for-install-only.patch
 Patch111: BZ-1147992-debuginfo-install-dolock-exception.patch
 Patch112: BZ-1095146-file-uris-normpath.patch
 
+# rhel-7.2
+Patch150: BZ-1192239-update-minimal.patch
+Patch151: BZ-1212514-not-enough-space.patch
+Patch152: BZ-1212506-running-kernel-epoch.patch
+Patch153: BZ-1168385-group-conditionals-deselect.patch
+Patch154: BZ-1182096-yum-cron-conf-upgrade-minimal.patch
+Patch155: BZ-1212519-exclude-installed.patch
+Patch156: BZ-1063177-xml-traceback.patch
+Patch157: BZ-1211384-yum-grouplist-headers.patch
+Patch158: BZ-1193871-updateinfo-notice-when-arch-changed.patch
+Patch159: BZ-1047793-lvm-snapshot.patch
+Patch160: BZ-1168120-manpage.patch
+Patch161: BZ-1182075-yum-security-manpage.patch
+Patch162: BZ-1199976-kbase-articles.patch
+Patch163: BZ-1188960-API-missing-requires.patch
+Patch164: BZ-1233152-pvm-api-lv_attr.patch
+Patch165: BZ-1244119-fssnapshot-automatic-percentage-manpage.patch
+Patch166: BZ-1259837-igroups-empty-lines.patch
+
 URL: http://yum.baseurl.org/
 BuildArchitectures: noarch
 BuildRequires: python
@@ -94,7 +113,6 @@ BuildRequires: pygpgme
 # End of CheckRequires
 Conflicts: pirut < 1.1.4
 Requires: python >= 2.4
-Requires: yum-plugin-fastestmirror
 Requires: rpm-python, rpm >= 0:4.4.2
 Requires: python-iniparse
 Requires: python-sqlite
@@ -233,6 +251,25 @@ Install this package if you want auto yum updates nightly via cron.
 %patch111 -p1
 %patch112 -p1
 
+# rhel-7.2
+%patch150 -p1
+%patch151 -p1
+%patch152 -p1
+%patch153 -p1
+%patch154 -p1
+%patch155 -p1
+%patch156 -p1
+%patch157 -p1
+%patch158 -p1
+%patch159 -p1
+%patch160 -p1
+%patch161 -p1
+%patch162 -p1
+%patch163 -p1
+%patch164 -p1
+%patch165 -p1
+%patch166 -p1
+
 # Do distro config. changes after everything else.
 %patch1 -p1
 
@@ -459,12 +496,65 @@ exit 0
 %endif
 
 %changelog
-* Thu Mar 05 2015 CentOS Sources <bugs@centos.org> - 3.4.3-125.el7.centos
-- CentOS yum config
--  use the CentOS bug tracker url
--  retain installonly limit of 5
--  ensure distrover is always from centos-release
-- Make yum require yum-plugin-fastestmirror
+* Wed Sep 09 2015 Valentina Mukhamedzhanova <vmukhame@redhat.com> - 3.4.3-132
+- Don't fail on empty lines in group files.
+- Resolves: bug#1259837
+
+* Wed Aug 12 2015 Valentina Mukhamedzhanova <vmukhame@redhat.com> - 3.4.3-131
+- Update not enough space messages for fssnapshot.
+- Related: bug#1047793
+
+* Thu Jul 30 2015 Valentina Mukhamedzhanova <vmukhame@redhat.com> - 3.4.3-130
+- Fix fssnap_automatic_devices and fssnap_automatic_percentage in yum.conf manpage.
+- Resolves: bug#1244119
+
+* Mon Jul 13 2015 Valentina Mukhamedzhanova <vmukhame@redhat.com> - 3.4.3-129
+- Fix UnboundLocalError in deselect().
+- Related: bug#1168385
+- Update the URL of kcs article.
+- Related: bug#1200338
+
+* Thu Jul 09 2015 Valentina Mukhamedzhanova <vmukhame@redhat.com> - 3.4.3-128
+- Stop caching fssnapshot postfixes and add microseconds.
+- Related: bug#1047793
+
+* Wed Jul 01 2015 Valentina Mukhamedzhanova <vmukhame@redhat.com> - 3.4.3-127
+- Fix lvm API calls. Patch by Marek Marusic.
+- Resolves: bug#1233152
+
+* Thu May 21 2015 Valentina Mukhamedzhanova <vmukhame@redhat.com> - 3.4.3-126
+- Fix update-minimal traceback and ignoring updates.
+- Resolves: bug#1192239
+- Expect KB as well as MB in disk requirements message from rpm.
+- Resolves: bug#1212514
+- Make sure epoch is a string while checking for running kernel.
+- Resolves: bug#1212506
+- Fix tsInfo.conditionals in deselect() when the package is not yet in the transaction.
+- Resolves: bug#1168385
+- Replace 'upgrade-minimal' with documented 'update-minimal' in yum-cron.conf files.
+- Resolves: bug#1182096
+- Add query_install_excludes conf./docs and use it for list/info/search/provides.
+- Resolves: bug#1212519
+- Don't traceback on xml parsing.
+- Resolves: bug#1063177
+- Fix casing of 'yum grouplist' headers.
+- Resolves: bug#1211384
+- Show advisory even if package arch changed.
+- Resolves: bug#1193871
+- Add fssnap_abort_on_errors config option and improve detecting if lvm is installed.
+- Resolves: bug#1047793
+- Fix default for fssnap_automatic_keep in the man page and dad logging for automatic fssnap events.
+- Resolves: bug#1145485
+- yum manpage: move 'history info' description to its proper place.
+- Resolves: bug#1168120
+- Add missing documentation from yum-security manpage.
+- Resolves: bug#1182075
+- Add links to knowledge base articles for http errors 404 and 403 and curl error 60.
+- Resolves: bug#1199976
+- Resolves: bug#1200312
+- Resolves: bug#1200338
+- API v2.7: missing_requires, pretty_output_update, promptYN fix, confList.
+- Resolves: bug#1188960
 
 * Mon Jan 12 2015 Valentina Mukhamedzhanova <vmukhame@redhat.com> - 3.4.3-125
 - Roll back the broken lvm patch.