diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -7,6 +7,8 @@
 It's recommend to use [`sdl2`](https://github.com/haskell-game/sdl2) and [`animate-sdl2`](https://github.com/jxv/animate-sdl2) for graphics.
 An example can be found [here](https://github.com/jxv/animate-sdl2/tree/master/example).
 
+[Video](https://youtu.be/9DDbeVvkcaE)
+
 ![Screenshot](https://github.com/jxv/animate-preview/blob/master/propaganda/screenshot.png)
 
 ## Try it!
diff --git a/animate-preview.cabal b/animate-preview.cabal
--- a/animate-preview.cabal
+++ b/animate-preview.cabal
@@ -2,10 +2,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: c4d0ff1bbcecbfbc048eaaab5b3fec7f52fb4cc7c0e6aa6e6703f5dd36df83c5
+-- hash: 97a9aa8948107d21c298dce29440851ea4b4bae06188f0317a52f4e7706c8ae4
 
 name:           animate-preview
-version:        0.1.1
+version:        0.1.2
 synopsis:       Preview tool for sprite animation
 description:    Preview tool for sprite animation
 category:       Game
@@ -79,6 +79,7 @@
       Animate.Preview.SDLRenderer
       Animate.Preview.State
       Animate.Preview.Timer
+      Animate.Preview.Watcher
   other-modules:
       Paths_animate_preview
   default-language: Haskell2010
diff --git a/library/Animate/Preview.hs b/library/Animate/Preview.hs
--- a/library/Animate/Preview.hs
+++ b/library/Animate/Preview.hs
@@ -11,7 +11,7 @@
 import Control.Monad.Reader (MonadReader, ReaderT, runReaderT)
 import Control.Monad.State (MonadState, StateT, evalStateT)
 import Control.Monad (when, forever, void)
-import Control.Concurrent (threadDelay, forkIO, newMVar)
+import Control.Concurrent (threadDelay, forkIO, newMVar, modifyMVar_)
 import Control.Exception.Safe (MonadThrow, MonadCatch)
 import Data.Maybe (fromMaybe)
 import Data.StateVar (get)
@@ -31,6 +31,7 @@
 import Animate.Preview.Scene
 import Animate.Preview.State
 import Animate.Preview.Timer
+import Animate.Preview.Watcher
 
 data Options = Options
   { target :: String  <?> "File path with sprite information (YAML or JSON)"
@@ -61,6 +62,7 @@
   resources <- loadResources highDpi' renderer
   loaded <- newMVar Nothing
   current <- newMVar Nothing
+  reloadVal <- newMVar False
 
   winSize <- fmap fromIntegral <$> get (SDL.windowSize window)
   drawSize <- fmap fromIntegral <$> SDL.glGetDrawableSize window
@@ -80,6 +82,7 @@
         , cLoaded = loaded
         , cFps = fps'
         , cFrameDeltaSeconds = 1.0 / fromIntegral fps'
+        , cReload = reloadVal
         }
 
   when (unHelpful $ watch options) $ do
@@ -95,17 +98,6 @@
   Font.quit
   SDL.quit
 
-runWatcherAndReloader :: Config -> String -> IO ()
-runWatcherAndReloader cfg filename = void $ forkIO $ withManager $ \mgr -> do
-  -- start a watching job (in the background)
-  void $ watchDir
-    mgr
-    (takeDirectory filename)
-    (\event -> takeFileName (eventPath event) == takeFileName filename)
-    (\_ -> runWatcher cfg reload)
-  -- sleep forever (until interrupted)
-  forever $ threadDelay 1000000
-
 newtype AnimatePreview a = AnimatePreview (ReaderT Config (StateT Vars IO) a)
   deriving (Functor, Applicative, Monad, MonadReader Config, MonadState Vars, MonadIO, MonadThrow, MonadCatch)
 
@@ -120,12 +112,3 @@
 instance Scene AnimatePreview
 instance Loader AnimatePreview
 instance Timer AnimatePreview
-
-newtype Watcher a = Watcher (ReaderT Config IO a)
-  deriving (Functor, Applicative, Monad, MonadReader Config, MonadIO, MonadThrow, MonadCatch)
-
-instance Logger Watcher
-instance Loader Watcher
-
-runWatcher :: Config -> Watcher a -> IO a
-runWatcher cfg (Watcher m) = runReaderT m cfg
diff --git a/library/Animate/Preview/Config.hs b/library/Animate/Preview/Config.hs
--- a/library/Animate/Preview/Config.hs
+++ b/library/Animate/Preview/Config.hs
@@ -37,6 +37,7 @@
   , cLoaded :: MVar (Maybe Loaded)
   , cFps :: Int
   , cFrameDeltaSeconds :: Seconds
+  , cReload :: MVar Bool
   }
 
 type R m = MonadReader Config m
diff --git a/library/Animate/Preview/Loader.hs b/library/Animate/Preview/Loader.hs
--- a/library/Animate/Preview/Loader.hs
+++ b/library/Animate/Preview/Loader.hs
@@ -60,8 +60,13 @@
                 let spriteSheet = Animate.SpriteSheet animations' tex
                 let totalKeys = V.length $ Animate.unAnimations animations'
                 let loaded = Loaded textToInt intToText spriteSheet totalKeys
+                oldLoaded <- getLoaded
                 setLoaded (Just loaded)
                 logText $ "Loaded: " `mappend` toText target
+                -- delete previous sprite texture
+                case Animate.ssImage . lSpriteSheet <$> oldLoaded of
+                  Nothing -> return ()
+                  Just i -> SDL.destroyTexture i
                 return True
     where
       loadTexture r path c = do
diff --git a/library/Animate/Preview/Scene.hs b/library/Animate/Preview/Scene.hs
--- a/library/Animate/Preview/Scene.hs
+++ b/library/Animate/Preview/Scene.hs
@@ -69,7 +69,12 @@
 updateReload :: (S m, R m, HasInput m, Loader m, MonadIO m) => m ()
 updateReload = do
   input <- getInput
-  when (isPressed $ iReload input)reload
+  mreload <- asks cReload
+  watchReload <- liftIO $ readMVar mreload
+  when watchReload $ do
+    reload
+    liftIO $ modifyMVar_ mreload $ \_ -> return False
+  when (isPressed $ iReload input) reload
 
 reload :: (R m, Loader m, MonadIO m) => m ()
 reload = do
diff --git a/library/Animate/Preview/Watcher.hs b/library/Animate/Preview/Watcher.hs
new file mode 100644
--- /dev/null
+++ b/library/Animate/Preview/Watcher.hs
@@ -0,0 +1,37 @@
+module Animate.Preview.Watcher where
+
+import Control.Exception.Safe (MonadThrow, MonadCatch)
+import Control.Monad.IO.Class (MonadIO(..))
+import Control.Monad.Reader (MonadReader, ReaderT, runReaderT)
+import Animate.Preview.Config
+import Control.Monad (when, forever, void)
+import Control.Concurrent (threadDelay, forkIO, newMVar, modifyMVar_)
+import Control.Exception.Safe (MonadThrow, MonadCatch)
+import Data.Maybe (fromMaybe)
+import Data.StateVar (get)
+import System.FSNotify (withManager, watchDir, eventPath)
+import System.FilePath (takeDirectory, takeFileName)
+
+import Animate.Preview.Loader
+import Animate.Preview.Logger
+import Animate.Preview.Scene
+
+newtype Watcher a = Watcher (ReaderT Config IO a)
+  deriving (Functor, Applicative, Monad, MonadReader Config, MonadIO, MonadThrow, MonadCatch)
+
+instance Logger Watcher
+instance Loader Watcher
+
+runWatcher :: Config -> Watcher a -> IO a
+runWatcher cfg (Watcher m) = runReaderT m cfg
+
+runWatcherAndReloader :: Config -> String -> IO ()
+runWatcherAndReloader cfg filename = void $ forkIO $ withManager $ \mgr -> do
+  -- start a watching job (in the background)
+  void $ watchDir
+    mgr
+    (takeDirectory filename)
+    (\event -> takeFileName (eventPath event) == takeFileName filename)
+    (\_ -> modifyMVar_ (cReload cfg) $ \_ -> return True)
+  -- sleep forever (until interrupted)
+  forever $ threadDelay 1000000
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: animate-preview
-version: '0.1.1'
+version: '0.1.2'
 github: jxv/animate-preview
 license: BSD3
 category: Game
