diff --git a/cli.py b/cli.py
index d0d785e..bb389df 100644
--- a/cli.py
+++ b/cli.py
@@ -564,8 +564,6 @@ class YumBaseCli(yum.YumBase, output.YumOutput):
         toBeInstalled = {} # keyed on name
         passToUpdate = [] # list of pkgtups to pass along to updatecheck
 
-        self.verbose_logger.log(yum.logginglevels.INFO_2,
-            _('Parsing package install arguments'))
         for arg in userlist:
             if os.path.exists(arg) and arg.endswith('.rpm'): # this is hurky, deal w/it
                 val, msglist = self.localInstall(filelist=[arg])
diff --git a/output.py b/output.py
index 3416459..885babc 100755
--- a/output.py
+++ b/output.py
@@ -75,7 +75,7 @@ class YumTerm:
     __enabled = True
 
     if hasattr(urlgrabber.progress, 'terminal_width_cached'):
-        __auto_columns = property(lambda self: _term_width())
+        columns = property(lambda self: _term_width())
 
     __cap_names = {
         'underline' : 'smul',
@@ -143,9 +143,7 @@ class YumTerm:
             return
 
         self.__enabled = True
-        if hasattr(urlgrabber.progress, 'terminal_width_cached'):
-            self.columns = self.__auto_columns
-        else:
+        if not hasattr(urlgrabber.progress, 'terminal_width_cached'):
             self.columns = 80
         self.lines = 24
 
@@ -1209,7 +1207,7 @@ class YumCliRPMCallBack(RPMBaseCallback):
     Yum specific callback class for RPM operations.
     """
 
-    _width = property(lambda x: _term_width())
+    width = property(lambda x: _term_width())
 
     def __init__(self):
         RPMBaseCallback.__init__(self)
@@ -1221,8 +1219,6 @@ class YumCliRPMCallBack(RPMBaseCallback):
         self.mark = "#"
         self.marks = 22
         
-        self.width = self._width
-        
     def event(self, package, action, te_current, te_total, ts_current, ts_total):
         # this is where a progress bar would be called
         process = self.action[action]
diff --git a/yum/yumRepo.py b/yum/yumRepo.py
index 7a83756..c2cad51 100644
--- a/yum/yumRepo.py
+++ b/yum/yumRepo.py
@@ -167,8 +167,10 @@ class YumPackageSack(packageSack.PackageSack):
 
                 db_un_fn = self._check_uncompressed_db(repo, mydbtype)
                 if not db_un_fn:
-                    db_fn = repo._retrieveMD(mydbtype)
-                    if db_fn:
+                    db_fn = repo._retrieveMD(mydbtype, unbzip2=True)
+                    if db_fn and not db_fn.endswith('.bz2'):
+                        db_un_fn = self._check_uncompressed_db(repo, mydbtype)
+                    elif db_fn:
                         db_un_fn = db_fn.replace('.bz2', '')
                         if not repo.cache:
                             misc.bunzipFile(db_fn, db_un_fn)
@@ -222,6 +224,64 @@ class YumPackageSack(packageSack.PackageSack):
     def _check_db_version(self, repo, mdtype):
         return repo._check_db_version(mdtype)
 
+_avahi_cache_timestamp = 0
+_avahi_cache_baseurls  = []
+def _avahi_baseurls():
+    """ Return a list of URLs we can try to get checksumed data from. """
+    import dbus, gobject, avahi
+    from dbus import DBusException
+    from dbus.mainloop.glib import DBusGMainLoop
+
+    global _avahi_cache_timestamp, _avahi_cache_baseurls
+    now = time.time()
+    if now <= (_avahi_cache_timestamp + 30):
+        return _avahi_cache_baseurls
+
+    __DNS__  = "_checksum_data._tcp"
+
+    urls = []
+    def found(interface, protocol, name, stype, domain, flags):
+        """ Found some data from Avahi. """
+        info = server.ResolveService(interface, protocol, name, stype,
+                                     domain,
+                                     avahi.PROTO_UNSPEC, dbus.UInt32(0))
+        url = "http://%s:%s/" % (str(info[7]), str(info[8]))
+        if flags & avahi.LOOKUP_RESULT_LOCAL:
+            urls.append(url)
+        else:
+            urls.insert(0, url)
+    def all_done():
+        # Avahi callbacks finished
+        mainloop.quit()
+
+    # FIXME: I guess we should probably cache something here...
+    loop = DBusGMainLoop()
+    bus = dbus.SystemBus(mainloop=loop)
+    server = dbus.Interface(bus.get_object(avahi.DBUS_NAME,
+                                           avahi.DBUS_PATH_SERVER),
+                            avahi.DBUS_INTERFACE_SERVER)
+
+    path = server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_INET,
+                                    __DNS__, "local", dbus.UInt32(0))
+
+    sbrowser = dbus.Interface(bus.get_object(avahi.DBUS_NAME, path), 
+                              avahi.DBUS_INTERFACE_SERVICE_BROWSER)
+
+    sbrowser.connect_to_signal('ItemNew', found)
+    sbrowser.connect_to_signal('AllForNow', all_done)
+
+    mainloop = gobject.MainLoop()
+
+    mainloop.run()
+    sbrowser.Free()
+
+    print "JDBG: avahi urls:", now, urls
+    _avahi_cache_baseurls  = urls
+    _avahi_cache_timestamp = now
+    return urls
+
+
+
 class YumRepository(Repository, config.RepoConf):
     """
     This is an actual repository object
@@ -651,8 +711,52 @@ class YumRepository(Repository, config.RepoConf):
                                                               value),
                              fdel=lambda self: setattr(self, "_metalink", None))
 
+    def _avahi_grab(self, remote_data,
+                    local, text, range, reget, checkfunc, http_headers):
+        """ Try and get the data from avahi. """
+
+        if remote_data is None:
+            return None
+
+        relative = []
+        for key in ('sha256', 'sha1', 'md5', 'len'):
+            if key in remote_data:
+                relative.append(key)
+                relative.append(str(remote_data[key]))
+        if not relative:
+            return None
+        relative = '/'.join(relative)
+
+        ug = URLGrabber(progress_obj = self.callback,
+                        reget = reget,
+                        interrupt_callback=self.interrupt_callback,
+                        timeout=self.timeout,
+                        checkfunc=checkfunc,
+                        http_headers=http_headers,
+                        failure_callback=None)
+        ug.opts.user_agent = default_grabber.opts.user_agent
+
+        try:
+            urls = _avahi_baseurls()
+        except:
+            return None
+
+        print "JDBG: avahi rel :", relative
+
+        # NOTE: Not sure this failure_cb is right...
+        fcb = self.mirror_failure_obj
+        mug = urlgrabber.mirror.MGRandomOrder(ug, urls) #, failure_callback=fcb)
+        try:
+            result = mug.urlgrab(relative, local,
+                                 text=text, range=range)
+        except URLGrabError, e:
+            return None
+
+        return result
+
     def _getFile(self, url=None, relative=None, local=None, start=None, end=None,
-            copy_local=None, checkfunc=None, text=None, reget='simple', cache=True):
+            copy_local=None, checkfunc=None, text=None, reget='simple', cache=True,
+                 remote_data=None):
         """retrieve file from the mirrorgroup for the repo
            relative to local, optionally get range from
            start to end, also optionally retrieve from a specific baseurl"""
@@ -707,6 +811,9 @@ class YumRepository(Repository, config.RepoConf):
                 verbose_logger.log(logginglevels.DEBUG_2, "Error getting package from media; falling back to url %s" %(e,))
 
         if url is not None and scheme != "media":
+            if remote_data and 'avahi_only' in remote_data:
+                return None
+
             ug = URLGrabber(keepalive = self.keepalive,
                             bandwidth = self.bandwidth,
                             retry = self.retries,
@@ -740,6 +847,19 @@ class YumRepository(Repository, config.RepoConf):
 
 
         else:
+            result = self._avahi_grab(remote_data,
+                                      local, text = misc.to_utf8(text),
+                                      range = (start, end),
+                                      reget = reget,
+                                      checkfunc=checkfunc,
+                                      http_headers=headers,
+                                      )
+            if result is not None:
+                print "JDBG: avahi SUCCESS"
+                return result
+            if remote_data and 'avahi_only' in remote_data:
+                return None
+
             try:
                 result = self.grab.urlgrab(misc.to_utf8(relative), local,
                                            text = misc.to_utf8(text),
@@ -763,13 +883,17 @@ class YumRepository(Repository, config.RepoConf):
         remote = package.relativepath
         local = package.localPkg()
         basepath = package.basepath
+        remote_data = {} # FIXME: This needs work when we move to sha256/etc.
+        remote_data['sha1'] = package.pkgId
+        remote_data['len'] = package.packagesize
 
         return self._getFile(url=basepath,
                         relative=remote,
                         local=local,
                         checkfunc=checkfunc,
                         text=text,
-                        cache=cache
+                        cache=cache,
+                        remote_data=remote_data
                         )
 
     def getHeader(self, package, checkfunc = None, reget = 'simple',
@@ -893,15 +1017,26 @@ class YumRepository(Repository, config.RepoConf):
             grab_can_fail = 'old_repo_XML' in self._oldRepoMDData
         try:
             # This is named so that "yum clean metadata" picks it up
-            tfname = tempfile.mktemp(prefix='repomd', suffix="tmp.xml",
+            tfname = tempfile.mktemp(prefix='repomd', suffix=".tmp.xml",
                                      dir=os.path.dirname(local))
+            if not self.metalink:
+                remote_data = None
+            else:
+                # We only give the remote_data for the latest repomd.xml ...
+                remote_data = {}
+                for csum in ('md5', 'sha1', 'sha256', 'sha512'):
+                    if csum not in self.metalink_data.repomd.chksums:
+                        continue
+                    remote_data[csum] = self.metalink_data.repomd.chksums[csum]
+                remote_data['len']  = self.metalink_data.repomd.size
             result = self._getFile(relative=self.repoMDFile,
                                    local=tfname,
                                    copy_local=1,
                                    text=text,
                                    reget=None,
                                    checkfunc=checkfunc,
-                                   cache=self.http_caching == 'all')
+                                   cache=self.http_caching == 'all',
+                                   remote_data=remote_data)
 
         except URLGrabError, e:
             _cleanup_tmp()
@@ -1238,12 +1373,13 @@ class YumRepository(Repository, config.RepoConf):
             if self._groupCheckDataMDValid(ndata, nmdtype, mdtype):
                 continue
 
-            if not self._retrieveMD(nmdtype, retrieve_can_fail=True):
+            local = self._retrieveMD(nmdtype, retrieve_can_fail=True,
+                                     unbzip2=nmdtype.endswith("_db"))
+            if not local:
                 self._revertOldRepoXML()
                 return False
 
-            local = self._get_mdtype_fname(ndata, False)
-            if nmdtype.endswith("_db"): # Uncompress any .sqlite.bz2 files
+            if local.endswith(".bz2"): # Uncompress any .sqlite.bz2 files
                 dl_local = local
                 local = local.replace('.bz2', '')
                 misc.bunzipFile(dl_local, local)
@@ -1395,7 +1531,7 @@ class YumRepository(Repository, config.RepoConf):
            mdtype can be 'primary', 'filelists', 'other' or 'group'."""
         return self._retrieveMD(mdtype)
 
-    def _retrieveMD(self, mdtype, retrieve_can_fail=False):
+    def _retrieveMD(self, mdtype, retrieve_can_fail=False, unbzip2=False):
         """ Internal function, use .retrieveMD() from outside yum. """
         thisdata = self.repoXML.getData(mdtype)
 
@@ -1428,11 +1564,32 @@ class YumRepository(Repository, config.RepoConf):
                 return local # it's the same return the local one
 
         try:
-            checkfunc = (self.checkMD, (mdtype,), {})
             text = "%s/%s" % (self.id, mdtype)
+            mddata = self.repoXML.getData(mdtype)
+
+            if unbzip2: # Check for unbzip2'd data, _locally only_...
+                checkfunc = (self.checkMD, (mdtype, True), {})
+
+                remote_data = {'avahi_only' : True}
+                remote_data['sha1'] = mddata.openchecksum[1]
+
+                assert remote.endswith('.bz2')
+                unrem = remote.replace('.bz2', '')
+                ret = self._getFile(relative=unrem, local=local, copy_local=1,
+                                    checkfunc=checkfunc, reget=None, text=text,
+                                    cache=self.http_caching == 'all',
+                                    remote_data=remote_data)
+                if ret is not None:
+                    return ret
+
+            checkfunc = (self.checkMD, (mdtype,), {})
+
+            remote_data = {}
+            remote_data['sha1'] = mddata.checksum[1]
             local = self._getFile(relative=remote, local=local, copy_local=1,
                              checkfunc=checkfunc, reget=None, text=text,
-                             cache=self.http_caching == 'all')
+                             cache=self.http_caching == 'all',
+                             remote_data=remote_data)
         except (Errors.NoMoreMirrorsRepoError, Errors.RepoError):
             if retrieve_can_fail:
                 return None
diff --git a/yumcommands.py b/yumcommands.py
index 3783292..eb1ab5d 100644
--- a/yumcommands.py
+++ b/yumcommands.py
@@ -123,6 +123,14 @@ def checkShellArg(base, basecmd, extcmds):
 
 class YumCommand:
         
+    def __init__(self):
+        self.done_command_once = False
+
+    def doneCommand(self, base, msg, *args):
+        if not self.done_command_once:
+            base.verbose_logger.log(logginglevels.INFO_2, msg, *args)
+        self.done_command_once = True
+
     def getNames(self):
         return []
 
@@ -169,8 +177,7 @@ class InstallCommand(YumCommand):
         checkPackageArg(base, basecmd, extcmds)
 
     def doCommand(self, base, basecmd, extcmds):
-        base.verbose_logger.log(logginglevels.INFO_2, 
-                _("Setting up Install Process"))
+        self.doneCommand(base, _("Setting up Install Process"))
         try:
             return base.installPkgs(extcmds)
         except yum.Errors.YumBaseError, e:
@@ -191,8 +198,7 @@ class UpdateCommand(YumCommand):
         checkGPGKey(base)
 
     def doCommand(self, base, basecmd, extcmds):
-        base.verbose_logger.log(logginglevels.INFO_2, 
-                _("Setting up Update Process"))
+        self.doneCommand(base, _("Setting up Update Process"))
         try:
             return base.updatePkgs(extcmds)
         except yum.Errors.YumBaseError, e:
@@ -344,8 +350,7 @@ class EraseCommand(YumCommand):
         checkPackageArg(base, basecmd, extcmds)
 
     def doCommand(self, base, basecmd, extcmds):
-        base.verbose_logger.log(logginglevels.INFO_2, 
-                _("Setting up Remove Process"))
+        self.doneCommand(base, _("Setting up Remove Process"))
         try:
             return base.erasePkgs(extcmds)
         except yum.Errors.YumBaseError, e:
@@ -359,8 +364,7 @@ class EraseCommand(YumCommand):
 
 class GroupCommand(YumCommand):
     def doCommand(self, base, basecmd, extcmds):
-        base.verbose_logger.log(logginglevels.INFO_2, 
-                _("Setting up Group Process"))
+        self.doneCommand(base, _("Setting up Group Process"))
 
         base.doRepoSetup(dosack=0)
         try:
@@ -622,8 +626,7 @@ class UpgradeCommand(YumCommand):
 
     def doCommand(self, base, basecmd, extcmds):
         base.conf.obsoletes = 1
-        base.verbose_logger.log(logginglevels.INFO_2, 
-                _("Setting up Upgrade Process"))
+        self.doneCommand(base, _("Setting up Upgrade Process"))
         try:
             return base.updatePkgs(extcmds)
         except yum.Errors.YumBaseError, e:
@@ -645,8 +648,7 @@ class LocalInstallCommand(YumCommand):
         checkPackageArg(base, basecmd, extcmds)
         
     def doCommand(self, base, basecmd, extcmds):
-        base.verbose_logger.log(logginglevels.INFO_2,
-                                _("Setting up Local Package Process"))
+        self.doneCommand(base, _("Setting up Local Package Process"))
 
         updateonly = basecmd == 'localupdate'
         try:
@@ -688,7 +690,7 @@ class ShellCommand(YumCommand):
         checkShellArg(base, basecmd, extcmds)
 
     def doCommand(self, base, basecmd, extcmds):
-        base.verbose_logger.log(logginglevels.INFO_2, _('Setting up Yum Shell'))
+        self.doneCommand(base, _('Setting up Yum Shell'))
         try:
             return base.doShell()
         except yum.Errors.YumBaseError, e:
@@ -712,7 +714,7 @@ class DepListCommand(YumCommand):
         checkPackageArg(base, basecmd, extcmds)
 
     def doCommand(self, base, basecmd, extcmds):
-       base.verbose_logger.log(logginglevels.INFO_2, _("Finding dependencies: "))
+       self.doneCommand(base, _("Finding dependencies: "))
        try:
           return base.deplist(extcmds)
        except yum.Errors.YumBaseError, e:
@@ -973,8 +975,7 @@ class ReInstallCommand(YumCommand):
         checkPackageArg(base, basecmd, extcmds)
 
     def doCommand(self, base, basecmd, extcmds):
-        base.verbose_logger.log(logginglevels.INFO_2, 
-                _("Setting up Reinstall Process"))
+        self.doneCommand(base, _("Setting up Reinstall Process"))
         oldcount = len(base.tsInfo)
         try:
             for item in extcmds:
