diff --git a/.gitignore b/.gitignore
index 36c259b3c9f854636b6a702eea267cb92bfe7a0d..f081a23927ace05633476a242501b46c4c126988 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,12 @@ autoProcessTV/autoProcessTV.cfg
 server.crt
 server.key
 
+#  SB Test Related   #
+######################
+tests/Logs/*
+tests/sickbeard.*
+tests/cache.db
+
 #  Compiled source   #
 ######################
 *.py[co]
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..beeb64de7cb8962ead5eb5c68a2bb0336bc09451
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,13 @@
+language: python
+python:
+  - 2.5
+  - 2.6
+  - 2.7
+
+# whitelist
+branches:
+  only:
+    - unittest
+
+before_script: cd ./tests
+script: ./all_tests.py
\ No newline at end of file
diff --git a/tests/all_tests.py b/tests/all_tests.py
old mode 100644
new mode 100755
index fc0eac66c0c82436e51d169074b74dc27593b509..ad9c9433e3aa57655be82ae823fc7fafac35dc15
--- a/tests/all_tests.py
+++ b/tests/all_tests.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python
 # coding=UTF-8
 # Author: Dennis Lutter <lad1337@gmail.com>
 # URL: http://code.google.com/p/sickbeard/
diff --git a/tests/pp_tests.py b/tests/pp_tests.py
index 78df8e613472867d4bc4556b942cbe0e901344a0..2360ea9de8c864178b3f00079259d5b1fc616d35 100644
--- a/tests/pp_tests.py
+++ b/tests/pp_tests.py
@@ -80,13 +80,20 @@ class PPPrivateTests(test.SickbeardTestDBCase):
 
 
 class PPBasicTests(test.SickbeardTestDBCase):
-    def setUp(self):
-        super(PPBasicTests, self).setUp()
-        self.pp = PostProcessor(test.FILEPATH)
 
-    @unittest.skip("this test is not fully configured / implmented")
     def test_process(self):
-        self.assertTrue(self.pp.process())
+        show = TVShow(3)
+        show.name = test.SHOWNAME
+        show.location = test.SHOWDIR
+        show.saveToDB()
+
+        sickbeard.showList = [show]
+        ep = TVEpisode(show, test.SEASON, test.EPISODE)
+        ep.name = "some ep name"
+        ep.saveToDB()
+
+        pp = PostProcessor(test.FILEPATH)
+        self.assertTrue(pp.process())
 
 
 if __name__ == '__main__':
diff --git a/tests/snatch_tests.py b/tests/snatch_tests.py
index 6ca7df9280728eccfb911c89c3fb06f0d373bc35..5ae0ea3297c3914b8c42f02d4d80e354b3772b9f 100644
--- a/tests/snatch_tests.py
+++ b/tests/snatch_tests.py
@@ -44,12 +44,6 @@ def _create_fake_xml(items):
     return xml
 
 
-# the real one tries to contact tvdb just stop it from getting more info on the ep
-def _fake_specifyEP(self, season, episode):
-    pass
-
-TVEpisode.specifyEpisode = _fake_specifyEP
-
 searchItems = []
 
 
diff --git a/tests/test_lib.py b/tests/test_lib.py
index db399fa6c1969d10c705a2549878873ae6130ec3..b004146ead92921b6bd5d0fdc73537a7bec7652d 100644
--- a/tests/test_lib.py
+++ b/tests/test_lib.py
@@ -47,9 +47,19 @@ FILENAME = u"show name - s0" + str(SEASON) + "e0" + str(EPISODE) + ".mkv"
 FILEDIR = os.path.join(TESTDIR, SHOWNAME)
 FILEPATH = os.path.join(FILEDIR, FILENAME)
 
+SHOWDIR = os.path.join(TESTDIR, SHOWNAME+" final")
+
 #sickbeard.logger.sb_log_instance = sickbeard.logger.SBRotatingLogHandler(os.path.join(TESTDIR, 'sickbeard.log'), sickbeard.logger.NUM_LOGS, sickbeard.logger.LOG_SIZE)
 sickbeard.logger.SBRotatingLogHandler.log_file = os.path.join(os.path.join(TESTDIR, 'Logs'), 'test_sickbeard.log')
 
+#=================
+# prepare env functions
+#=================
+def createTestLogFolder():
+    if not os.path.isdir(sickbeard.LOG_DIR):
+        os.mkdir(sickbeard.LOG_DIR)
+
+# call env functions at apropriate time durin sickbeard var setup
 
 #=================
 # sickbeard globals
@@ -76,6 +86,7 @@ sickbeard.providerList = providers.makeProviderList()
 sickbeard.PROG_DIR = os.path.abspath('..')
 sickbeard.DATA_DIR = sickbeard.PROG_DIR
 sickbeard.LOG_DIR = os.path.join(TESTDIR, 'Logs')
+createTestLogFolder()
 sickbeard.logger.sb_log_instance.initLogging(False)
 
 #=================
@@ -87,6 +98,12 @@ def _dummy_saveConfig():
 # this might be considered a hack
 mainDB.sickbeard.save_config = _dummy_saveConfig
 
+# the real one tries to contact tvdb just stop it from getting more info on the ep
+def _fake_specifyEP(self, season, episode):
+    pass
+
+sickbeard.tv.TVEpisode.specifyEpisode = _fake_specifyEP
+
 
 #=================
 # test classes
@@ -96,11 +113,13 @@ class SickbeardTestDBCase(unittest.TestCase):
         sickbeard.showList = []
         setUp_test_db()
         setUp_test_episode_file()
+        setUp_test_show_dir()
 
     def tearDown(self):
         sickbeard.showList = []
         tearDown_test_db()
         tearDown_test_episode_file()
+        tearDown_test_show_dir()
 
 
 class TestDBConnection(db.DBConnection, object):
@@ -176,6 +195,15 @@ def setUp_test_episode_file():
 def tearDown_test_episode_file():
     shutil.rmtree(FILEDIR)
 
+
+def setUp_test_show_dir():
+    if not os.path.exists(SHOWDIR):
+        os.makedirs(SHOWDIR)
+
+
+def tearDown_test_show_dir():
+    shutil.rmtree(SHOWDIR)
+
 tearDown_test_db()
 
 if __name__ == '__main__':