diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+# 0.8.0
+- fix: distinct data and playback handles
+- introduce Sound handle type, an abstraction for playback audio track
+- soundLoop, soundPlay return a Sound handle
+- soundUpdate, soundStop take a Sound handle parameter
+
 # 0.7.1.0
 - add sampleFromMemoryPcm
 - update stb_vorbis to v1.14
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -13,6 +13,21 @@
 
 Samples can be loaded from file or memory.
 
+# Build
+
+### Stack
+
+```bash
+stack setup
+stack build
+```
+
+### Nix:
+
+``` bash
+stack --nix build
+```
+
 # Example
 
 ```haskell
@@ -27,9 +42,12 @@
 waitPayback = do
   n <- soundActive
   when  (n > 0) $ do
-    threadDelay 1000000
+    threadDelay oneSec
     waitPayback
 
+oneSec :: Int
+oneSec = 1000000 -- micro seconds
+
 main = do
     args <- getArgs
     filename <- case args of
@@ -42,7 +60,14 @@
     -- (A) load sample from file
     sampleA <- sampleFromFile filename 1.0 -- volume
 
-    soundPlay sampleA 1 1 0 1 -- left volume, right volume, time difference between left and right, pitch factor for playback
+    -- start two sound tracks with shared sample data
+    sndTrkA <- soundPlay sampleA 1 1 0 1 -- left volume, right volume, time difference between left and right, pitch factor for playback
+    threadDelay oneSec -- wait 1 sec
+    sndTrkB <- soundPlay sampleA 1 1 0 1 -- left volume, right volume, time difference between left and right, pitch factor for playback
+    -- play 3 sec
+    threadDelay $ 3 * oneSec
+    soundStop sndTrkB
+    -- wait sndTrkA to finish
     waitPayback
 
     -- (B) load from memory buffer
diff --git a/Sound/ProteaAudio.chs b/Sound/ProteaAudio.chs
--- a/Sound/ProteaAudio.chs
+++ b/Sound/ProteaAudio.chs
@@ -12,6 +12,7 @@
 module Sound.ProteaAudio (
     -- * Sample
     Sample(),
+    Sound(),
 
     -- * Audio System Setup
     initAudio,
@@ -29,7 +30,7 @@
     sampleFromMemoryOgg,
     sampleFromFile,
 
-    -- * Sample Palyback
+    -- * Sample Playback
     soundLoop,
     soundPlay,
     soundUpdate,
@@ -40,10 +41,13 @@
 import Foreign.C
 import Data.ByteString (ByteString, useAsCStringLen)
 
--- | Audio sample handle
+-- | Audio sample resource handle. A sample can be shared between multiple Sound tracks. (abstraction for data)
 newtype Sample = Sample{ fromSample :: {#type sample_t#} }
 
+-- | Sound track handle. It is used to control the audio playback. (abstraction for playback)
+newtype Sound = Sound{ fromSound :: {#type sound_t#} }
 
+
 -- | Initializes the audio system.
 {#fun initAudio
     { `Int' -- ^ the maximum number of sounds that are played parallely. Computation time is linearly correlated to this factor.
@@ -140,7 +144,7 @@
   , `Float' -- ^ right volume
   , `Float' -- ^ time difference between left and right channel in seconds. Use negative values to specify a delay for the left channel, positive for the right
   , `Float' -- ^ pitch factor for playback. 0.5 corresponds to one octave below, 2.0 to one above the original sample
-  } -> `()'
+  } -> `Sound' Sound
 #}
 
 -- | Plays a specified sound sample once and sets its parameters.
@@ -150,12 +154,12 @@
   , `Float' -- ^ right volume
   , `Float' -- ^ time difference between left and right channel in seconds. Use negative values to specify a delay for the left channel, positive for the right
   , `Float' -- ^ pitch factor for playback. 0.5 corresponds to one octave below, 2.0 to one above the original sample
-  } -> `()'
+  } -> `Sound' Sound
 #}
 
 -- | Updates parameters of a specified sound.
 {#fun soundUpdate
-  { fromSample `Sample' -- ^ handle of a currently active sound
+  { fromSound `Sound' -- ^ handle of a currently active sound
   , `Float' -- ^ left volume
   , `Float' -- ^ right volume
   , `Float' -- ^ time difference between left and right channel in seconds. Use negative values to specify a delay for the left channel, positive for the right
@@ -164,5 +168,5 @@
 #}
 
 -- | Stops a specified sound immediately.
-{#fun soundStop {fromSample `Sample'} -> `Bool'#}
+{#fun soundStop {fromSound `Sound'} -> `Bool'#}
 
diff --git a/cbits/proteaaudio_binding.cpp b/cbits/proteaaudio_binding.cpp
--- a/cbits/proteaaudio_binding.cpp
+++ b/cbits/proteaaudio_binding.cpp
@@ -127,26 +127,26 @@
 }
 
 // sound
-void soundLoop(sample_t sample, float volumeL, float volumeR, float disparity, float pitch) {
+sound_t soundLoop(sample_t sample, float volumeL, float volumeR, float disparity, float pitch) {
     DeviceAudio & audio = DeviceAudio::singleton();
-    if((&audio) == 0) return;
-    audio.soundLoop(sample, volumeL,volumeR,disparity,pitch);
+    if((&audio) == 0) return 0;
+    return audio.soundLoop(sample, volumeL, volumeR, disparity, pitch);
 }
 
-void soundPlay(sample_t sample, float volumeL, float volumeR, float disparity, float pitch) {
+sound_t  soundPlay(sample_t sample, float volumeL, float volumeR, float disparity, float pitch) {
     DeviceAudio & audio = DeviceAudio::singleton();
-    if((&audio) == 0) return;
-    audio.soundPlay(sample, volumeL,volumeR,disparity,pitch);
+    if((&audio) == 0) return 0;
+    return audio.soundPlay(sample, volumeL, volumeR, disparity, pitch);
 }
 
-int soundUpdate(sample_t sample, float volumeL, float volumeR, float disparity, float pitch) {
+int soundUpdate(sound_t sound, float volumeL, float volumeR, float disparity, float pitch) {
     DeviceAudio & audio = DeviceAudio::singleton();
     if((&audio) == 0) return 0;
-    return audio.soundUpdate(sample, volumeL,volumeR,disparity,pitch);
+    return audio.soundUpdate(sound, volumeL, volumeR, disparity, pitch);
 }
 
-int soundStop(sample_t sample) {
+int soundStop(sound_t sound) {
     DeviceAudio & audio = DeviceAudio::singleton();
     if((&audio) == 0) return 0;
-    return audio.soundStop(sample);
+    return audio.soundStop(sound);
 }
diff --git a/cbits/proteaaudio_binding.h b/cbits/proteaaudio_binding.h
--- a/cbits/proteaaudio_binding.h
+++ b/cbits/proteaaudio_binding.h
@@ -1,8 +1,9 @@
 #ifdef __cplusplus
-extern "C" { 
+extern "C" {
 #endif
 
 typedef int sample_t;
+typedef int sound_t;
 
 int initAudio(int nTracks, int frequency, int chunkSize);
 void finishAudio();
@@ -14,10 +15,10 @@
 sample_t sampleFromFile(char* filename, float volume);
 int soundActive();
 void soundStopAll();
-void soundLoop(sample_t sample, float volumeL, float volumeR, float disparity, float pitch);
-void soundPlay(sample_t sample, float volumeL, float volumeR, float disparity, float pitch);
-int soundUpdate(sample_t sample, float volumeL, float volumeR, float disparity, float pitch);
-int soundStop(sample_t sample);
+sound_t soundLoop(sample_t sample, float volumeL, float volumeR, float disparity, float pitch);
+sound_t soundPlay(sample_t sample, float volumeL, float volumeR, float disparity, float pitch);
+int soundUpdate(sound_t sound, float volumeL, float volumeR, float disparity, float pitch);
+int soundStop(sound_t sound);
 #ifdef __cplusplus
 }
 #endif
diff --git a/example/play.hs b/example/play.hs
--- a/example/play.hs
+++ b/example/play.hs
@@ -9,9 +9,12 @@
 waitPayback = do
   n <- soundActive
   when  (n > 0) $ do
-    threadDelay 1000000
+    threadDelay oneSec
     waitPayback
 
+oneSec :: Int
+oneSec = 1000000 -- micro seconds
+
 main = do
     args <- getArgs
     filename <- case args of
@@ -24,7 +27,14 @@
     -- (A) load sample from file
     sampleA <- sampleFromFile filename 1.0 -- volume
 
-    soundPlay sampleA 1 1 0 1 -- left volume, right volume, time difference between left and right, pitch factor for playback
+    -- start two sound tracks with shared sample data
+    sndTrkA <- soundPlay sampleA 1 1 0 1 -- left volume, right volume, time difference between left and right, pitch factor for playback
+    threadDelay oneSec -- wait 1 sec
+    sndTrkB <- soundPlay sampleA 1 1 0 1 -- left volume, right volume, time difference between left and right, pitch factor for playback
+    -- play 3 sec
+    threadDelay $ 3 * oneSec
+    soundStop sndTrkB
+    -- wait sndTrkA to finish
     waitPayback
 
     -- (B) load from memory buffer
diff --git a/proteaaudio.cabal b/proteaaudio.cabal
--- a/proteaaudio.cabal
+++ b/proteaaudio.cabal
@@ -1,5 +1,5 @@
 Name:                proteaaudio
-Version:             0.7.1.0
+Version:             0.8.0
 Synopsis:            Simple audio library for Windows, Linux, OSX.
 Description:         Simple audio library for Windows, Linux, OSX. Supports PCM, Ogg and Wav playback and multichannel mixing.
 License:             BSD3
