diff --git a/call-alloy.cabal b/call-alloy.cabal
--- a/call-alloy.cabal
+++ b/call-alloy.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: cb90623890ff4edd9f37856fc196d7ff619272da4c3519f2c2d1c082670a936a
+-- hash: 54c29a66869bf88b9365e7543b6507d23efdcb3cdac0ac437540d41f4ca0e8c0
 
 name:           call-alloy
-version:        0.1.0.0
+version:        0.1.0.2
 synopsis:       A simple library to call Alloy given a specification
 description:    Please see the README on GitHub at <https://github.com/marcellussiegburg/call-alloy#readme>
 category:       Language
@@ -48,6 +48,13 @@
     , hashable
     , process
     , split
+  if os(windows)
+    cpp-options: -DWINDOWS
+    build-depends:
+        Win32
+  else
+    build-depends:
+        unix
   default-language: Haskell2010
 
 test-suite call-alloy-test
@@ -70,4 +77,11 @@
     , hspec
     , process
     , split
+  if os(windows)
+    cpp-options: -DWINDOWS
+    build-depends:
+        Win32
+  else
+    build-depends:
+        unix
   default-language: Haskell2010
diff --git a/src/Language/Alloy/Call.hs b/src/Language/Alloy/Call.hs
--- a/src/Language/Alloy/Call.hs
+++ b/src/Language/Alloy/Call.hs
@@ -11,6 +11,7 @@
 A requirement for this library to work is a Java Runtime Environment
 (as it is required by Alloy).
 -}
+{-# LANGUAGE CPP #-}
 module Language.Alloy.Call (
   existsInstance,
   getInstances,
@@ -23,18 +24,35 @@
 import Data.IORef                       (IORef, newIORef, readIORef)
 import Data.List                        (intercalate)
 import Data.List.Split                  (splitOn)
-import Data.Maybe                       (fromMaybe)
+import Data.Maybe                       (fromMaybe, isJust)
 import System.Directory
-  (XdgDirectory (..), createDirectoryIfMissing, doesFileExist, getXdgDirectory)
+  (XdgDirectory (..), createDirectory, doesFileExist, doesDirectoryExist,
+   getTemporaryDirectory, getXdgDirectory)
+import System.Directory.Internal        (setFileMode)
+import System.Directory.Internal.Prelude
+  (catch, isDoesNotExistError)
+import System.Environment               (lookupEnv)
 import System.Exit                      (ExitCode (..))
-import System.FilePath                  ((</>), (<.>), searchPathSeparator)
+import System.FilePath
+  ((</>), (<.>), searchPathSeparator, takeDirectory)
 import System.IO                        (hClose, hGetLine, hIsEOF, hPutStr)
 import System.IO.Unsafe                 (unsafePerformIO)
 import System.Process
+#if defined(mingw32_HOST_OS)
+import System.Win32.Info                (getUserName)
+#else
+import System.Posix.User                (getLoginName)
+#endif
 
 import Language.Alloy.RessourceNames    (alloyJarName, className, classPackage)
 import Language.Alloy.Ressources        (alloyJar, classFile)
 
+data CallAlloyConfig = Config {
+    alloyJarFile   :: FilePath,
+    alloyClassFile :: FilePath,
+    keepFiles      :: Bool
+  }
+
 {-# NOINLINE mclassPath #-}
 {-|
 'IORef' for storing the class path.
@@ -95,7 +113,59 @@
   mclassPath' <- readIORef mclassPath
   maybe readClassPath return mclassPath'
 
+{-
+jarFileEnv :: String
+jarFileEnv = "ALLOY_JAR_FILE"
+
+callAlloyEnv :: String
+callAlloyEnv = "CALL_ALLOY_CLASS_FILE"
+
+keepFilesEnv :: String
+keepFilesEnv = "KEEP_ALLOY_FILES"
+
 {-|
+Lookup environment variables which are to prefer if present.
+-}
+getEnvironmentInformation :: IO CallAlloyConfig
+getEnvironmentInformation = do
+  alloy     <- lookupEnv jarFileEnv
+  callAlloy <- lookupEnv callAlloyEnv
+  keep      <- lookupEnv keepFilesEnv
+  let mconfig = Config <$> alloy <*> callAlloy <*> pure (isJust keep)
+  case mconfig of
+    Nothing -> do
+      dataDir <- getXdgDirectory XdgData $ appName </> "dataDir" 
+    Just c  -> return c
+-}
+{-
+getVersionFile :: IO FilePath
+getVersionFile = do
+  configDir <- getXdgDirectory XdgConfig appName
+  let versionFile = configDir </> "version"
+  exists <- doesFileExist versionFile
+  if exists
+    then do
+    version <- read <$> readFile versionFile
+    unless (version == versionHash) $ createVersionFile configDir versionFile
+    else createVersionFile configDir versionFile 
+-}
+
+fallbackToTempDir :: IO FilePath -> IO FilePath
+fallbackToTempDir m = catch m $ \e ->
+  if isDoesNotExistError e
+  then do
+    tmp    <- getTemporaryDirectory
+#if defined(mingw32_HOST_OS)
+    login  <- getUserName
+#else
+    login  <- getLoginName
+#endif
+    let tmpDir = tmp </> show (hash login) </> appName
+    createUserDirectoriesIfMissing $ tmpDir
+    return tmpDir
+  else error $ show e
+
+{-|
 Read the class path version specified in the user directory, if it is not
 current or if it does not exist, call 'createVersionFile'.
 
@@ -103,7 +173,7 @@
 -}
 readClassPath :: IO FilePath
 readClassPath = do
-  configDir <- getXdgDirectory XdgConfig appName
+  configDir <- fallbackToTempDir $ getXdgDirectory XdgConfig appName
   let versionFile = configDir </> "version"
   exists <- doesFileExist versionFile
   if exists
@@ -121,7 +191,7 @@
 createVersionFile :: FilePath -> FilePath -> IO ()
 createVersionFile configDir versionFile = do
   createDataDir
-  createDirectoryIfMissing True configDir
+  createUserDirectoriesIfMissing configDir
   writeFile versionFile $ show versionHash
 
 {-|
@@ -131,12 +201,26 @@
 -}
 createDataDir :: IO ()
 createDataDir = do
-  dataDir <- getXdgDirectory XdgData $ appName </> "dataDir"
-  createDirectoryIfMissing True $ dataDir </> classPackage
+  dataDir <- fallbackToTempDir $ getXdgDirectory XdgData $ appName </> "dataDir"
+  createUserDirectoriesIfMissing $ dataDir </> classPackage
   BS.writeFile (dataDir </> classPackage </> className <.> "class") classFile
   BS.writeFile (dataDir </> alloyJarName) alloyJar
 
 {-|
+Creates user directories using the file permissions 700.
+This function creates the specified directory and all its parent directories as
+well (if they are also missing).
+-}
+createUserDirectoriesIfMissing :: FilePath -> IO ()
+createUserDirectoriesIfMissing fp = do
+  isDir <- doesDirectoryExist fp
+  let parent = takeDirectory fp
+  unless (isDir || parent == fp) $ do
+    createUserDirectoriesIfMissing parent
+    createDirectory fp
+    setFileMode fp (7*8*8)
+
+{-|
 Check if there exists a model for the given specification. This function calls
 Alloy retrieving one instance. If there is no such instance, it returns false.
 This function calls 'getInstances'.
@@ -145,7 +229,7 @@
   :: String
   -- ^ The Alloy specification which should be loaded.
   -> IO Bool
-  -- ^ Whether there exists a instance (within the given scope)
+  -- ^ Whether there exists an instance (within the given scope)
 existsInstance = fmap (not . null) . getInstances (Just 1)
 
 {-|
