diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,16 @@
 CHANGELOG
 
+2.20131201 -> 2.20131203
+  - Bug fixes
+
+1.20131130 -> 2.20131201
+  - Fallback to mplayer when mpd is unavailable
+
+1.20131124 -> 1.20131130
+  - Added support to http://8tracks.com
+
+1.20131115 -> 1.20131124
+  - Updated "other-modules" field in cabalfile, installable now.
+
 1.20130928 -> 1.20131115
   - Added support to http://radioreddit.com
diff --git a/Radio.hs b/Radio.hs
--- a/Radio.hs
+++ b/Radio.hs
@@ -20,6 +20,7 @@
 import           Control.Concurrent.MVar
 import qualified Control.Exception as E
 import           Control.Monad (liftM, when, void)
+import           Data.Aeson hiding (encode)
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Char8 as C
 import           Data.Conduit (runResourceT, ($$+-))
@@ -245,7 +246,27 @@
         B.writeFile yml $ B.append bs (encode config)
         putStrLn $ "Your token has been saved to " ++ yml
 
-    readToken :: String -> IO (Maybe (Param a))
+    mkParam :: Param a -> String -> Param a
+
+    readToken :: FromJSON (Config a)
+              => (Config a -> Param a) -> String -> IO (Maybe (Param a))
+    readToken selector keywords = do
+        home <- Radio.getLordDir
+        let yml = home ++ "/lord.yml"
+        exist <- doesFileExist yml
+        if exist
+           then do
+                conf <- decodeFile yml
+                case conf of
+                    Nothing -> error $ "Invalid YAML file: " ++ show conf
+                    Just c -> 
+                        case fromJSON c of
+                            Success tok -> return $ Just $ 
+                                mkParam (selector tok) keywords
+                            Error err -> do
+                                print $ "Parse token failed: " ++ show err
+                                return Nothing
+           else return Nothing
 
 getLordDir :: IO FilePath
 getLordDir = (++ "/.lord") <$> getHomeDirectory
diff --git a/Radio/EightTracks.hs b/Radio/EightTracks.hs
--- a/Radio/EightTracks.hs
+++ b/Radio/EightTracks.hs
@@ -13,8 +13,7 @@
 import           Data.Aeson
 import           Data.Aeson.Types (defaultOptions, Options(..))
 import qualified Data.ByteString.Char8 as C
-import           Data.Maybe (fromJust)
-import           Data.Yaml hiding (decode)
+import           Data.Maybe (fromMaybe, fromJust)
 import           Data.CaseInsensitive (mk)
 import           Data.Char (isDigit)
 import           Data.Conduit (($$+-))
@@ -25,7 +24,6 @@
 import           Network.HTTP.Conduit
 import           Prelude hiding (id)
 import           System.Console.ANSI
-import           System.Directory (doesFileExist)
 import           System.IO.Unsafe (unsafePerformIO)
 
 import Radio
@@ -79,7 +77,7 @@
     , track_file_stream_url :: String
     , name                  :: String
     , performer             :: String
-    , release_name          :: String
+    , release_name          :: Maybe String
     , url                   :: String
     } deriving (Show, Generic)
 instance FromJSON EightTracks
@@ -139,7 +137,8 @@
 
     songUrl _ x = return $ track_file_stream_url x
 
-    songMeta x = Radio.SongMeta (performer x) (release_name x) (name x)
+    songMeta x = Radio.SongMeta (performer x) 
+                                (fromMaybe "" $ release_name x) (name x)
 
     tagged _ = False
     
@@ -186,23 +185,7 @@
 
     mkConfig = Config
 
-    readToken strMixId = do
-        mId <- getMixId strMixId
-        home <- Radio.getLordDir
-        let yml = home ++ "/lord.yml"
-        exist <- doesFileExist yml
-        if exist
-           then do
-                conf <- decodeFile yml
-                case conf of
-                    Nothing -> error $ "Invalid YAML file: " ++ show conf
-                    Just c -> 
-                        case fromJSON c of
-                            Success tok -> return $ Just $ (eight tok) { mixId = mId }
-                            Error err -> do
-                                print $ "Parse token failed: " ++ show err
-                                return Nothing
-           else return Nothing
+    mkParam param key = param { mixId = read key }
 
 instance FromJSON (Radio.Config EightTracks)
 instance ToJSON (Radio.Config EightTracks)
diff --git a/Radio/Jing.hs b/Radio/Jing.hs
--- a/Radio/Jing.hs
+++ b/Radio/Jing.hs
@@ -17,14 +17,12 @@
 import qualified Data.HashMap.Strict as HM
 import           Data.Maybe (fromJust, fromMaybe)
 import qualified Data.Text as T
-import           Data.Yaml
 import           Data.CaseInsensitive (mk)
 import           Data.Conduit (runResourceT, ($$+-))
 import           Data.Conduit.Attoparsec (sinkParser)
 import           GHC.Generics (Generic)
 import           Network.HTTP.Types 
 import           Network.HTTP.Conduit
-import           System.Directory (doesFileExist)
 
 import Radio
 
@@ -159,20 +157,7 @@
 
     mkConfig = Config 
 
-    readToken keywords = do
-        home <- Radio.getLordDir
-        let yml = home ++ "/lord.yml"
-        exist <- doesFileExist yml
-        if exist
-           then do
-                conf <- decodeFile yml
-                case conf of
-                    Nothing -> error $ "Invalid YAML file: " ++ show conf
-                    Just c -> 
-                        case fromJSON c of
-                            Success tok -> return $ Just $ (jing tok) { cmbt = keywords }
-                            Error err -> error $ "Parse token failed: " ++ show err
-           else return Nothing
+    mkParam param key = param { cmbt = key }
 
 instance FromJSON (Radio.Config Jing)
 instance ToJSON (Radio.Config Jing)
diff --git a/lord.cabal b/lord.cabal
--- a/lord.cabal
+++ b/lord.cabal
@@ -1,8 +1,8 @@
 name:                lord
-version:             2.20131201
+version:             2.20131203
 synopsis:            A command line interface to online radios.
 description:         
-    A unified command line interface to several online radios, use @mpd@ (<http://musicpd.org>) as backend by default. Will fallback to mplayer (http://www.mplayerhq.hu) when mpd is unavailable.
+    A unified command line interface to several online radios, use mpd (<http://musicpd.org>) as backend by default. Will fallback to mplayer (<http://www.mplayerhq.hu>) when mpd is unavailable.
     .
     Supported radios:
     .
@@ -53,7 +53,7 @@
 source-repository   head
   type:             git
   location:         git://github.com/rnons/lord.git
- 
+
 executable lord
   main-is:              main.hs         
   other-modules:        Radio,
diff --git a/main.hs b/main.hs
--- a/main.hs
+++ b/main.hs
@@ -210,7 +210,8 @@
 
 etListen :: Bool -> Keywords -> IO ()
 etListen nodaemon k = do
-    tok <- readToken k
+    mId <- ET.getMixId k
+    tok <- readToken ET.eight $ show mId
     case tok of
         Just tok' -> do
             putStrLn $ "Welcome back, " ++ ET.userName tok'
@@ -224,7 +225,7 @@
 
 jingListen :: Bool -> Keywords -> IO ()
 jingListen nodaemon k = do
-    tok <- readToken k
+    tok <- readToken jing k
     case tok of
         Just tok' -> do
             putStrLn $ "Welcome back, " ++ C.unpack (nick tok')
diff --git a/test/main.hs b/test/main.hs
--- a/test/main.hs
+++ b/test/main.hs
@@ -5,7 +5,7 @@
 
 import Radio
 import qualified Radio.Cmd as Cmd
-import qualified Radio.EightTracks as ET
+import Radio.EightTracks
 import Radio.Douban
 import Radio.Jing
 import qualified Radio.Reddit as Reddit
@@ -17,27 +17,35 @@
 spec :: Spec
 spec = describe "getPlaylist" $ do
     it "cmd: given genre" $ do
-        ss <- Radio.getPlaylist (Cmd.Genre "Dream Pop")
-        assert $ not $ null ss
+        ss <- getPlaylist (Cmd.Genre "Dream Pop")
+        assertNotNull ss
 
     it "douban: given channel id" $ do
-        ss <- Radio.getPlaylist (Cid 6)
-        assert $ not $ null ss
+        ss <- getPlaylist (Cid 6)
+        assertNotNull ss
 
     it "douban: given musician name" $ do
-        ss <- Radio.getPlaylist (Musician "Sigur RóS")
-        assert $ not $ null ss
+        ss <- getPlaylist (Musician "Sigur RóS")
+        assertNotNull ss
 
     it "8tracks: given mix id" $ do
-        tok <- readToken "14" :: IO (Maybe (Radio.Param ET.EightTracks))
-        ss <- Radio.getPlaylist $ fromJust tok
-        assert $ not $ null ss
+        tok <- readToken eight "14"
+        ss <- getPlaylist $ fromJust tok
+        assertNotNull ss
 
+    it "8tracks: given mix url" $ do
+        mId <- getMixId "http://8tracks.com/an-nie/oblitus"
+        tok <- readToken eight $ show mId
+        ss <- getPlaylist $ fromJust tok
+        assertNotNull ss
+
     it "jing: given keywords" $ do
-        tok <- readToken "postrock" :: IO (Maybe (Radio.Param Jing))
-        ss <- Radio.getPlaylist $ fromJust tok
-        assert $ not $ null ss
+        tok <- readToken jing "postrock"
+        ss <- getPlaylist $ fromJust tok
+        assertNotNull ss
 
     it "reddit: given genre" $ do
-        ss <- Radio.getPlaylist (Reddit.Genre "indie")
-        assert $ not $ null ss
+        ss <- getPlaylist (Reddit.Genre "indie")
+        assertNotNull ss
+  where
+    assertNotNull = assert . not .null
