diff --git a/.travis.yml b/.travis.yml
index 32a67c0729f66909541c450affb1fc2916b521d7..2799cf2f9fe24ec3a2551150c6035202a36e3de4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -10,6 +10,10 @@ branches:
 install:
   - pip install cheetah pyopenssl==0.13.1
 
+cache:
+  directories:
+    - $HOME/.cache/pip
+
 before_script:
  - chmod +x ./tests/all_tests.py
 
diff --git a/sickbeard/common.py b/sickbeard/common.py
index 84b2cd4934f9ccf5bf85f57ff1ebe4c8e1ce2700..bccb2acf60c9eaa5b84a3453cda6b558acf08cb9 100644
--- a/sickbeard/common.py
+++ b/sickbeard/common.py
@@ -23,10 +23,7 @@ import re
 import uuid
 
 INSTANCE_ID = str(uuid.uuid1())
-#Use Sick Beard USER_AGENT until they stop throttling us,
-#newznab searching has long been fixed, but we now limit it to 400 results just as they do.
-#USER_AGENT = ('SickRage/(' + platform.system() + '; ' + platform.release() + '; ' + INSTANCE_ID + ')')
-USER_AGENT = 'Sick Beard/alpha2-master' + ' (' + platform.system() + ' ' + platform.release() + ')'
+USER_AGENT = ('SickRage/(' + platform.system() + '; ' + platform.release() + '; ' + INSTANCE_ID + ')')
 
 mediaExtensions = ['avi', 'mkv', 'mpg', 'mpeg', 'wmv',
                    'ogm', 'mp4', 'iso', 'img', 'divx',
diff --git a/sickbeard/providers/generic.py b/sickbeard/providers/generic.py
index 7b6e8ca3ab3b6b148daa0a285d59aa3ee3369f51..c836c49d0b4d9b5565396e5ac396681454c0ba35 100644
--- a/sickbeard/providers/generic.py
+++ b/sickbeard/providers/generic.py
@@ -174,20 +174,21 @@ class GenericProvider:
             return
 
         for url in urls:
+            logger.log(u"Downloading a result from " + self.name + " at " + url)
             if helpers.download_file(url, filename, session=self.session):
-                logger.log(u"Downloading a result from " + self.name + " at " + url)
-
-                if self.providerType == GenericProvider.TORRENT:
-                    logger.log(u"Saved magnet link to " + filename, logger.INFO)
-                else:
-                    logger.log(u"Saved result to " + filename, logger.INFO)
-
                 if self._verify_download(filename):
+                    if self.providerType == GenericProvider.TORRENT:
+                        logger.log(u"Saved magnet link to " + filename, logger.INFO)
+                    else:
+                        logger.log(u"Saved result to " + filename, logger.INFO)
                     return True
                 else:
+                    logger.log(u"Could not download %s" % url, logger.WARNING)
                     helpers._remove_file_failed(filename)
 
-        logger.log(u"Failed to download result", logger.WARNING)
+        if len(urls):
+            logger.log(u"Failed to download any results", logger.WARNING)
+
         return False
 
     def _verify_download(self, file_name=None):
diff --git a/sickbeard/rssfeeds.py b/sickbeard/rssfeeds.py
index f87587bc63bb9de957e918a7ad3bddcf208495fd..0a06c49fa0fa6988be975f9d91a9378b64f08ac3 100644
--- a/sickbeard/rssfeeds.py
+++ b/sickbeard/rssfeeds.py
@@ -38,8 +38,8 @@ class RSSFeeds:
             url += urllib.urlencode(post_data)
 
         try:
-            resp = Cache(self.rssDB).fetch(url, force_update=True, request_headers=request_headers, handlers=handlers)
+            resp = Cache(self.rssDB, userAgent=sickbeard.common.USER_AGENT).fetch(url, force_update=True, request_headers=request_headers, handlers=handlers)
         finally:
             self.rssDB.close()
 
-        return resp
\ No newline at end of file
+        return resp
diff --git a/sickbeard/scene_numbering.py b/sickbeard/scene_numbering.py
index e72fae4c02fb274d26c85a6d6c0ec864c4acc874..109929c471ef54d8d806772a8c7048c8f2a1d9cf 100644
--- a/sickbeard/scene_numbering.py
+++ b/sickbeard/scene_numbering.py
@@ -498,7 +498,7 @@ def xem_refresh(indexer_id, indexer, force=False):
         try:
             parsedJSON = sickbeard.helpers.getURL(url, json=True)
             if not parsedJSON or parsedJSON == '':
-                logger.log(u'No XEN data for show "%s on %s"' % (indexer_id, sickbeard.indexerApi(indexer).name,), logger.INFO)
+                logger.log(u'No XEM data for show "%s on %s"' % (indexer_id, sickbeard.indexerApi(indexer).name,), logger.INFO)
                 return
 
             if 'success' in parsedJSON['result']:
diff --git a/tests/test_lib.py b/tests/test_lib.py
index 841b3a9688dfd243d716c810896610522b56e079..a4077eddc5a587081f62f0e47ea35cfc0e467e03 100644
--- a/tests/test_lib.py
+++ b/tests/test_lib.py
@@ -43,7 +43,7 @@ shutil.copyfile = lib.shutil_custom.copyfile_custom
 #=================
 # test globals
 #=================
-TESTDIR = os.path.abspath('.')
+TESTDIR = os.path.abspath(os.path.dirname(__file__))
 TESTDBNAME = "sickbeard.db"
 TESTCACHEDBNAME = "cache.db"
 TESTFAILEDDBNAME = "failed.db"
@@ -88,8 +88,8 @@ sickbeard.PROVIDER_ORDER = ["sick_beard_index"]
 sickbeard.newznabProviderList = providers.getNewznabProviderList("'Sick Beard Index|http://lolo.sickbeard.com/|0|5030,5040|0|eponly|0|0|0!!!NZBs.org|https://nzbs.org/||5030,5040,5060,5070,5090|0|eponly|0|0|0!!!Usenet-Crawler|https://www.usenet-crawler.com/||5030,5040,5060|0|eponly|0|0|0'")
 sickbeard.providerList = providers.makeProviderList()
 
-sickbeard.PROG_DIR = os.path.abspath('..')
-sickbeard.DATA_DIR = sickbeard.PROG_DIR
+sickbeard.PROG_DIR = os.path.abspath(os.path.join(TESTDIR, '..'))
+sickbeard.DATA_DIR = TESTDIR
 sickbeard.CONFIG_FILE = os.path.join(sickbeard.DATA_DIR, "config.ini")
 sickbeard.CFG = ConfigObj(sickbeard.CONFIG_FILE)
 
@@ -140,34 +140,36 @@ class SickbeardTestDBCase(unittest.TestCase):
         tearDown_test_episode_file()
         tearDown_test_show_dir()
 
-
 class TestDBConnection(db.DBConnection, object):
 
     def __init__(self, dbFileName=TESTDBNAME):
         dbFileName = os.path.join(TESTDIR, dbFileName)
         super(TestDBConnection, self).__init__(dbFileName)
 
-
 class TestCacheDBConnection(TestDBConnection, object):
-
-    def __init__(self, providerName):
+     def __init__(self, providerName):
         db.DBConnection.__init__(self, os.path.join(TESTDIR, TESTCACHEDBNAME))
 
         # Create the table if it's not already there
         try:
-            sql = "CREATE TABLE " + providerName + " (name TEXT, season NUMERIC, episodes TEXT, indexerid NUMERIC, url TEXT, time NUMERIC, quality TEXT);"
-            self.connection.execute(sql)
-            self.connection.commit()
-        except sqlite3.OperationalError, e:
-            if str(e) != "table " + providerName + " already exists":
+            if not self.hasTable(providerName):
+                sql = "CREATE TABLE [" + providerName + "] (name TEXT, season NUMERIC, episodes TEXT, indexerid NUMERIC, url TEXT, time NUMERIC, quality TEXT, release_group TEXT)"
+                self.connection.execute(sql)
+                self.connection.commit()
+        except Exception, e:
+            if str(e) != "table [" + providerName + "] already exists":
                 raise
 
+            # add version column to table if missing
+            if not self.hasColumn(providerName, 'version'):
+                self.addColumn(providerName, 'version', "NUMERIC", "-1")
+
         # Create the table if it's not already there
         try:
             sql = "CREATE TABLE lastUpdate (provider TEXT, time NUMERIC);"
             self.connection.execute(sql)
             self.connection.commit()
-        except sqlite3.OperationalError, e:
+        except Exception, e:
             if str(e) != "table lastUpdate already exists":
                 raise
 
@@ -195,31 +197,29 @@ def setUp_test_db():
 
 
 def tearDown_test_db():
-    """Deletes the test db
-        although this seams not to work on my system it leaves me with an zero kb file
-    """
-
-    #uncomment next line so leave the db intact between test and at the end
-    #return False
-
-    for current_db in [ TESTDBNAME, TESTCACHEDBNAME, TESTFAILEDDBNAME ]:
-        for file_name in [ os.path.join(TESTDIR, current_db), os.path.join(TESTDIR, current_db + '-journal') ]:
-            if os.path.exists(file_name):
-                try:
-                    os.remove(file_name)
-                except (IOError, OSError) as e:
-                    print 'ERROR: Failed to remove ' + file_name
-                    print ex(e)
-
+    from sickbeard.db import db_cons
+    for connection in db_cons:
+        db_cons[connection].commit()
+#        db_cons[connection].close()
+
+#    for current_db in [ TESTDBNAME, TESTCACHEDBNAME, TESTFAILEDDBNAME ]:
+#        file_name = os.path.join(TESTDIR, current_db)
+#        if os.path.exists(file_name):
+#            try:
+#                os.remove(file_name)
+#            except Exception as e:
+#                print 'ERROR: Failed to remove ' + file_name
+#                print ex(e)
 
 def setUp_test_episode_file():
     if not os.path.exists(FILEDIR):
         os.makedirs(FILEDIR)
 
     try:
-        with open(FILEPATH, 'w') as f:
+        with open(FILEPATH, 'wb') as f:
             f.write("foo bar")
-    except EnvironmentError:
+            f.flush()
+    except Exception:
         print "Unable to set up test episode"
         raise
 
diff --git a/tests/tv_tests.py b/tests/tv_tests.py
index 9b130d17cd019ab79fe66990c550cc9d2ce13f5e..a6b8cb30957b46e1a090abd359cd30d8f816a9b5 100644
--- a/tests/tv_tests.py
+++ b/tests/tv_tests.py
@@ -43,7 +43,7 @@ class TVShowTests(test.SickbeardTestDBCase):
         show.network = "cbs"
         show.genre = "crime"
         show.runtime = 40
-        show.status = "5"
+        show.status = "Ended"
         show.default_ep_status = "5"
         show.airs = "monday"
         show.startyear = 1987
@@ -92,7 +92,7 @@ class TVTests(test.SickbeardTestDBCase):
         show.network = "cbs"
         show.genre = "crime"
         show.runtime = 40
-        show.status = "5"
+        show.status = "Ended"
         show.default_ep_status = "5"
         show.airs = "monday"
         show.startyear = 1987