diff --git a/mp.cabal b/mp.cabal
--- a/mp.cabal
+++ b/mp.cabal
@@ -1,5 +1,5 @@
 name:               mp
-version:            0.1.3
+version:            0.2.0
 cabal-version:      >=1.16
 build-type:         Simple
 author:             Piotr Borek <piotrborek@op.pl>
@@ -9,6 +9,7 @@
 synopsis:           Music player for linux.
 description:        Music player for linux.
 category:           Sound
+homepage:           http://code.google.com/p/linux-music-player
 
 data-files:
   gen_gettext
@@ -53,4 +54,3 @@
     Mp.Utils.Shuffle
     Mp.Utils.Colors
     Mp.Utils.Network
-
diff --git a/src/Mp/Player/Client.hs b/src/Mp/Player/Client.hs
--- a/src/Mp/Player/Client.hs
+++ b/src/Mp/Player/Client.hs
@@ -41,7 +41,8 @@
     clientSendSeekBackward,
     clientSendGetFlags,
     clientSendToggleRepeat,
-    clientSendToggleShuffle
+    clientSendToggleShuffle,
+    clientSendSaveState
 ) where
 
 import System.FilePath.Posix
@@ -162,3 +163,6 @@
 
 clientSendToggleShuffle :: IO ()
 clientSendToggleShuffle = withConnection $ sendMessage_ "ToggleShuffle"
+
+clientSendSaveState :: IO ()
+clientSendSaveState = withConnection $ sendMessage_ "SaveState"
diff --git a/src/Mp/Player/Server.hs b/src/Mp/Player/Server.hs
--- a/src/Mp/Player/Server.hs
+++ b/src/Mp/Player/Server.hs
@@ -58,6 +58,12 @@
     state <- readMVar serverState
     encodeFile (cfgDir </> "server.state") state
 
+saveServerIndex :: MVar ServerState -> IO ()
+saveServerIndex serverState = do
+    cfgDir <- configDirFilePath
+    state <- readMVar serverState
+    encodeFile (cfgDir </> "server.index") (PlayingIndex $ getPlaying state)
+
 startServerBlocking :: String -> IO ()
 startServerBlocking socName = do
     player <- initGstPlayer
@@ -90,16 +96,19 @@
     where
         readServerState player serverState = do
             cfgDir <- configDirFilePath
-            let file = cfgDir </> "server.state"
-            exists <- doesFileExist file
-            when exists $ do
-                modifyMVar_ serverState $ \_ -> do
-                    state <- readStateFromFile file :: IO ServerState
-                    gstPlayerSetVolume player $ getVolume state
-                    when (getStatus state == "Playing") $ do
-                        let f = getPlaylist state !! (shuffleFunc state) (getPlaying state)
-                        gstPlayerPlay player f
-                    return state
+            let file0 = cfgDir </> "server.state"
+            let file1 = cfgDir </> "server.index"
+            modifyMVar_ serverState $ \_ -> do
+                state0                <- readStateFromFile file0 :: IO ServerState
+                (PlayingIndex index)  <- readIndexFromFile file1 :: IO PlayingIndex
+                let state = state0 {
+                    getPlaying = index
+                }
+                gstPlayerSetVolume player $ getVolume state
+                when (getStatus state == "Playing") $ do
+                    let f = getPlaylist state !! (shuffleFunc state) (getPlaying state)
+                    gstPlayerPlay player f
+                return state
 
         schedulePlayerInfo player serverState =
             gstPlayerTimeoutAdd 100 $ do
@@ -145,6 +154,8 @@
                 else
                     modifyPlayerStop st player
 
+    saveServerIndex serverState
+
 modifyPlayerStop :: ServerState -> GstPlayer -> IO ServerState
 modifyPlayerStop st player = do
     gstPlayerStop player
@@ -173,7 +184,6 @@
 talkBlocking :: MVar ServerState -> GstPlayer -> Socket -> IO ()
 talkBlocking serverState player sock = do
     _ <- try' processMessages
-    saveServerState serverState
     gstPlayerStop player
     gstPlayerQuit player
 
@@ -203,12 +213,18 @@
                 "GetFlags"       -> talkGetFlags serverState conn
                 "ToggleRepeat"   -> talkToggleRepeat serverState conn
                 "ToggleShuffle"  -> talkToggleShuffle serverState player conn
+                "SaveState"      -> talkSaveState serverState conn
                 "Quit"           -> sendString conn "OK"
                 _                -> sendString conn "NOK"
 
             close conn
 
             when (msg /= "Quit") processMessages
+
+talkSaveState :: MVar ServerState -> Socket -> IO ()
+talkSaveState serverState conn = do
+    sendString conn "OK"
+    saveServerState serverState
 
 talkGetPlaylist :: MVar ServerState -> Socket -> IO ()
 talkGetPlaylist serverState conn = do
diff --git a/src/Mp/Player/ServerState.hs b/src/Mp/Player/ServerState.hs
--- a/src/Mp/Player/ServerState.hs
+++ b/src/Mp/Player/ServerState.hs
@@ -30,6 +30,8 @@
 import Mp.Utils.Shuffle
 import Mp.Utils.Exception
 
+data PlayingIndex = PlayingIndex Int
+
 data ServerState = ServerState {
     getPlaylist        :: ![String],
     getCurrentPosition :: !Integer,
@@ -44,11 +46,32 @@
     shuffleData        :: !ShuffleData
 }
 
+instance Binary PlayingIndex where
+    put (PlayingIndex i) = do
+        put (20150221 :: Word32)
+        put (0 :: Int)
+        put i
+
+    get = do
+        magic <- get :: Get Word32
+        if magic /= 20150221
+            then return defaultPlayingIndex
+            else do
+                version <- get :: Get Int
+                case version of
+                    0 -> getVersion0
+                    _ -> return defaultPlayingIndex
+        where
+            getVersion0 = do
+                index <- get
+                return $ PlayingIndex index
+
+            defaultPlayingIndex = PlayingIndex 0
+
 instance Binary ServerState where
     put st = do
         put (1113 :: Word32)
-        put (0 :: Int)
-        put $ getPlaying st
+        put (1 :: Int)
         if getStatus st == "Paused"
             then put "Playing"
             else put $ getStatus st
@@ -66,8 +89,15 @@
                 version <- get :: Get Int
                 case version of
                     0 -> getVersion0
+                    1 -> getVersion1
                     _ -> return defaultServerState
         where
+            generateShuffle shuffleMode r playlist = let g = mkStdGen r
+                                          in
+                                              if shuffleMode then
+                                                  State.runState (shuffleFilled $ length playlist) $ shuffleInitial g
+                                              else
+                                                  (id, shuffleInitial g)
             getVersion0 = do
                 playing     <- get
                 status      <- get
@@ -77,11 +107,7 @@
                 shuffleMode <- get
                 r           <- get
 
-                let g = mkStdGen r
-                let (f, d) = if shuffleMode then
-                                 State.runState (shuffleFilled $ length playlist) $ shuffleInitial g
-                             else
-                                 (id, shuffleInitial g)
+                let (f, d) = generateShuffle shuffleMode r playlist
 
                 return ServerState {
                     getPlaylist = playlist,
@@ -97,6 +123,30 @@
                     shuffleData = d
                 }
 
+            getVersion1 = do
+                status      <- get
+                volume      <- get
+                playlist    <- get
+                repeatMode  <- get
+                shuffleMode <- get
+                r           <- get
+
+                let (f, d) = generateShuffle shuffleMode r playlist
+
+                return ServerState {
+                    getPlaylist = playlist,
+                    getCurrentPosition = 0,
+                    getCurrentDuration = 0,
+                    getStatus = status,
+                    getPlaying = 0,
+                    getVolume = volume,
+                    isRepeatMode = repeatMode,
+                    isShuffleMode = shuffleMode,
+                    randomInitializer = r,
+                    shuffleFunc = f,
+                    shuffleData = d
+                }
+
 defaultServerState :: ServerState
 defaultServerState = ServerState {
     getPlaylist = [],
@@ -114,3 +164,6 @@
 
 readStateFromFile :: String -> IO ServerState
 readStateFromFile file = decodeFile file `catchAny` (\_ -> return defaultServerState)
+
+readIndexFromFile :: String -> IO PlayingIndex
+readIndexFromFile file = decodeFile file `catchAny` (\_ -> return $ PlayingIndex 0)
diff --git a/src/Mp/UI/Main.hs b/src/Mp/UI/Main.hs
--- a/src/Mp/UI/Main.hs
+++ b/src/Mp/UI/Main.hs
@@ -45,12 +45,15 @@
 import Mp.Utils.I18N
 import Mp.Player.Client
 
+exitUI :: IO ()
+exitUI = clientSendSaveState >> shutdownUi
+
 makeAndRunUI :: IO ()
 makeAndRunUI = do
-    _ <- installHandler sigINT  (Catch $ schedule shutdownUi) Nothing
-    _ <- installHandler sigHUP  (Catch $ schedule shutdownUi) Nothing
-    _ <- installHandler sigABRT (Catch $ schedule shutdownUi) Nothing
-    _ <- installHandler sigTERM (Catch $ schedule shutdownUi) Nothing
+    _ <- installHandler sigINT  (Catch $ schedule exitUI) Nothing
+    _ <- installHandler sigHUP  (Catch $ schedule exitUI) Nothing
+    _ <- installHandler sigABRT (Catch $ schedule exitUI) Nothing
+    _ <- installHandler sigTERM (Catch $ schedule exitUI) Nothing
 
     conf <- readConfiguration
 
@@ -107,8 +110,8 @@
                     KASCII '['  -> do
                         clientSendVolumeDown
                         return True
-                    KASCII 'q'  -> exitSuccess
-                    KASCII 'Q'  -> clientSendQuitMessage >> exitSuccess
+                    KASCII 'q'  -> clientSendSaveState >> exitSuccess
+                    KASCII 'Q'  -> clientSendSaveState >> clientSendQuitMessage >> exitSuccess
                     KASCII '1'  -> makeActive 0 >> return True
                     KASCII '2'  -> makeActive 1 >> return True
                     KASCII '3'  -> makeActive 2 >> playlistReset playlistPage >> return True
