diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,5 +1,9 @@
 # `hidden-char`
 
+[![Travis branch](https://img.shields.io/travis/rcook/hidden-char/master.svg)](https://travis-ci.org/rcook/hidden-char)
+[![Hackage](https://img.shields.io/hackage/v/hidden-char.svg)](http://hackage.haskell.org/package/hidden-char)
+[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/rcook/hidden-char/master/LICENSE)
+
 Provides a `getHiddenChar` function that works on Windows, Linux and macOS
 
 ## Licence
diff --git a/hidden-char.cabal b/hidden-char.cabal
--- a/hidden-char.cabal
+++ b/hidden-char.cabal
@@ -1,5 +1,5 @@
 name:                               hidden-char
-version:                            0.1.0.0
+version:                            0.1.0.1
 synopsis:                           Provides getHiddenChar function
 description:                        Provides a @getHiddenChar@ function that works on Windows, Linux and macOS
 homepage:                           https://github.com/rcook/hidden-char#readme
@@ -32,10 +32,11 @@
 test-suite hidden-char-test
   type:                             exitcode-stdio-1.0
   default-language:                 Haskell2010
-  ghc-options:                      -W -Wall
+  ghc-options:                      -W -Wall -threaded
   hs-source-dirs:                   test
   main-is:                          Main.hs
   build-depends:                    base >= 4.7 && < 5
+                                  , hidden-char
                                   , hspec
   if os(linux)
     cpp-options:                    -DOS_LINUX
@@ -43,3 +44,4 @@
     cpp-options:                    -DOS_WINDOWS
   if os(darwin)
     cpp-options:                    -DOS_MACOS
+  other-modules:                    HiddenCharSpec
diff --git a/src/System/IO/HiddenChar/Windows.hs b/src/System/IO/HiddenChar/Windows.hs
--- a/src/System/IO/HiddenChar/Windows.hs
+++ b/src/System/IO/HiddenChar/Windows.hs
@@ -15,7 +15,9 @@
 import           Data.Char
 import           Foreign.C.Types
 
-foreign import ccall unsafe "conio.h getch" c_getch :: IO CInt
+-- Must import as "safe" in order to prevent FFI call from blocking other threads
+-- https://github.com/rcook/hidden-char/issues/1
+foreign import ccall safe "conio.h getch" c_getch :: IO CInt
 
 -- | Read a character from the standard input device with buffering and echoing disabled
 -- Hack based on http://stackoverflow.com/questions/2983974/haskell-read-input-character-from-console-immediately-not-after-newline
diff --git a/test/HiddenCharSpec.hs b/test/HiddenCharSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/HiddenCharSpec.hs
@@ -0,0 +1,45 @@
+{-|
+Module      : HiddenCharSpec
+Description : Tests for @System.IO.HiddenChar@ module
+Copyright   : (C) Richard Cook, 2017
+Licence     : MIT
+Maintainer  : rcook@rcook.org
+Stability   : stable
+Portability : portable
+-}
+
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module HiddenCharSpec (spec) where
+
+import           Control.Concurrent
+import           Control.Exception
+import           System.IO.HiddenChar
+import           System.Timeout
+import           Test.Hspec
+
+spec :: Spec
+spec = do
+    describe "concurrent use of getHiddenChar" $
+        it "doesn't block other threads" $ do
+            -- Run getHiddenChar in a bound thread and swallow all exceptions
+            _ <- forkOS $ do
+                _ <- getHiddenChar `catch` (\(_ :: SomeException) -> return ' ')
+                return ()
+
+            -- On another bound thread, count up to a given value with a small
+            -- delay at each step. runInBoundThread should terminate and return
+            -- the expected value if getHiddenChar works correctly. In the presence
+            -- of calls to functions via the "unsafe", then this thread will block.
+            -- This is a behaviour we would like to avoid.
+            -- https://github.com/rcook/hidden-char/issues/1
+            let countUpTo :: Int -> IO Int
+                countUpTo n = helper n n
+                    where
+                        helper n' i
+                            | i == 0 = return n'
+                            | otherwise = do
+                                threadDelay 1
+                                helper n' (i - 1)
+            result <- timeout 1000000 $ runInBoundThread (countUpTo 5)
+            result `shouldBe` Just 5
