diff --git a/Changelog.markdown b/Changelog.markdown
--- a/Changelog.markdown
+++ b/Changelog.markdown
@@ -1,3 +1,8 @@
+# 2018-10-03 (v0.5.1)
+
+* fix atom function type validation
+* add support for GHC 8.4 (now we support GHC 8.0, 8.2, and 8.4)
+	
 # 2018-08-10 (v0.5)
 
 * fix critical type bug which allowed unresolved types to be used
diff --git a/project-m36.cabal b/project-m36.cabal
--- a/project-m36.cabal
+++ b/project-m36.cabal
@@ -1,5 +1,5 @@
 Name: project-m36
-Version: 0.5
+Version: 0.5.1
 License: PublicDomain
 Build-Type: Simple
 Homepage: https://github.com/agentm/project-m36
@@ -22,73 +22,14 @@
   Default: False
   Manual: True
 
+--flag to allow stack to use its older, pinned packages
+Flag stack
+    Description: build with stack and stackage
+    Manual: True
+    Default: False
+
 Library
-    Build-Depends: base>=4.8 && < 6.0
-                   ,ghc >= 7.8 && < 8.3
-                   ,ghc-paths
-                   ,mtl
-                   ,containers
-                   ,unordered-containers
-                   ,hashable
-                   ,haskeline
-                   ,directory
-                   ,MonadRandom
-                   ,random-shuffle
-                   --critical uuid bug in lesser versions https://www.reddit.com/r/haskell/comments/4myot5/psa_make_sure_to_use_uuid_1312/
-                   ,uuid >= 1.3.12
-                   ,cassava >= 0.4.5.1 && < 0.6
-                   ,text
-                   ,bytestring
-                   ,deepseq
-                   ,deepseq-generics
-                   ,vector
-                   ,parallel
-                   ,monad-parallel
-                   ,exceptions
-                   ,transformers
-                   ,gnuplot
-                   ,binary
-                   ,filepath
-                   ,zlib
-                   ,directory
-                   ,vector-binary-instances
-                   ,temporary
-                   ,stm
-                   ,time
-                   ,hashable-time
-                   ,old-locale
-                   ,rset
-                   --used for CSV parsing
-                   ,attoparsec
-                   ,either
-                   ,base64-bytestring
-                   ,data-interval
-                   ,extended-reals
-                   ,network-transport
-                   -- aeson 1.1 and above includes instances for UUID types
-                   ,aeson >= 1.1
-                   ,path-pieces
-                   ,conduit
-                   ,resourcet
-                   ,http-api-data
-                   ,semigroups
-                   -- used for arbitrary tuples
-                   ,QuickCheck
---needed for remote access
-                   ,distributed-process-client-server >= 0.2.3
-                   ,distributed-process >= 0.7.2
-                   ,distributed-process-extras >= 0.3.2
-                   ,distributed-process-async >= 0.2.4.1
-                   ,network-transport-tcp >= 0.6.0
-                   ,network-transport
-                   ,list-t
-                   ,stm-containers >= 0.2.15
-                   ,foldl
-                   ,deferred-folds
-                   ,optparse-applicative
-                   ,Glob
---used for hashing the transaction graph file to check for differences
-                   ,cryptohash-sha256
+    Build-Depends: base>=4.8 && < 4.12, ghc >= 7.8 && < 8.5, ghc-paths, mtl, containers, unordered-containers, hashable, haskeline, directory, MonadRandom, random-shuffle, uuid >= 1.3.12, cassava >= 0.4.5.1 && < 0.6, text, bytestring, deepseq, deepseq-generics, vector, parallel, monad-parallel, exceptions, transformers, gnuplot, binary, filepath, zlib, directory, vector-binary-instances, temporary, stm, time, hashable-time, old-locale, rset, attoparsec, either, base64-bytestring, data-interval, extended-reals, network-transport, aeson >= 1.1, path-pieces, conduit, resourcet, http-api-data, semigroups, QuickCheck, quickcheck-instances, distributed-process-client-server >= 0.2.3, distributed-process >= 0.7.2, distributed-process-extras >= 0.3.2, distributed-process-async >= 0.2.4.1, network-transport-tcp >= 0.6.0, network-transport, list-t, stm-containers >= 0.2.15, foldl, optparse-applicative, Glob, cryptohash-sha256
     Exposed-Modules: ProjectM36.Error,
                      ProjectM36.Transaction,
                      ProjectM36.TransactionGraph,
@@ -160,7 +101,7 @@
                      ProjectM36.FileLock,
                      ProjectM36.FSType,
                      ProjectM36.Arbitrary
-    GHC-Options: -Wall -rdynamic
+    GHC-Options: -Wall -rdynamic 
     if os(windows)
       Build-Depends: Win32 >= 2.5.4.1
       Other-Modules: ProjectM36.Win32Handle
@@ -174,10 +115,12 @@
     if impl(ghc>= 8)
       build-depends:
         ghc-boot, ghci
+    if !flag(stack) 
+      Build-Depends: deferred-folds
 
 Executable tutd
     Build-Depends: base >=4.8 && <5.0,
-                   ghc >= 7.8 && < 8.3,
+                   ghc >= 7.8 && < 8.5,
                    ghc-paths,
                    project-m36,
                    containers,
@@ -233,14 +176,14 @@
                    TutorialD.Interpreter.SchemaOperator
     main-is: TutorialD/tutd.hs
     CC-Options: -fPIC
-    GHC-Options: -Wall -rdynamic
+    GHC-Options: -Wall -rdynamic -threaded
     Hs-Source-Dirs: ./src/bin
     Default-Language: Haskell2010
     Default-Extensions: OverloadedStrings
 
 Executable project-m36-server
     Build-Depends: base,
-                   ghc >= 7.8 && < 8.3,
+                   ghc >= 7.8 && < 8.5,
                    ghc-paths,
                    project-m36,
                    binary,
@@ -270,7 +213,7 @@
                    list-t,
                    base64-bytestring
     Main-Is: ./src/bin/ProjectM36/Server/project-m36-server.hs
-    GHC-Options: -Wall -threaded -rtsopts
+    GHC-Options: -Wall -threaded -rtsopts 
     if flag(profiler)
       GHC-Prof-Options: -fprof-auto -rtsopts -threaded -Wall
     Default-Language: Haskell2010
@@ -308,7 +251,7 @@
     main-is: test/TutorialD/Interpreter.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, stm-containers, list-t, project-m36, random, MonadRandom, semigroups
     Other-Modules: TutorialD.Interpreter, TutorialD.Interpreter.Base, TutorialD.Interpreter.Export.Base, TutorialD.Interpreter.Export.CSV, TutorialD.Interpreter.Import.Base, TutorialD.Interpreter.Import.CSV, TutorialD.Interpreter.Import.TutorialD, TutorialD.Interpreter.RODatabaseContextOperator, TutorialD.Interpreter.RelationalExpr, TutorialD.Interpreter.TransactionGraphOperator, TutorialD.Interpreter.Types, TutorialD.Interpreter.DatabaseContextExpr, TutorialD.Interpreter.InformationOperator, TutorialD.Interpreter.Import.BasicExamples, TutorialD.Interpreter.DatabaseContextIOOperator, TutorialD.Interpreter.TestBase, TutorialD.Interpreter.TransGraphRelationalOperator, TutorialD.Interpreter.SchemaOperator
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin, ., test
 
 Test-Suite test-tutoriald-atomfunctionscript
@@ -318,7 +261,7 @@
     Other-Modules: TutorialD.Interpreter, TutorialD.Interpreter.Base, TutorialD.Interpreter.DatabaseContextExpr, TutorialD.Interpreter.DatabaseContextIOOperator, TutorialD.Interpreter.Export.Base, TutorialD.Interpreter.Export.CSV, TutorialD.Interpreter.Import.Base, TutorialD.Interpreter.Import.BasicExamples, TutorialD.Interpreter.Import.CSV, TutorialD.Interpreter.Import.TutorialD, TutorialD.Interpreter.InformationOperator, TutorialD.Interpreter.RODatabaseContextOperator, TutorialD.Interpreter.RelationalExpr, TutorialD.Interpreter.TestBase, TutorialD.Interpreter.TransGraphRelationalOperator, TutorialD.Interpreter.TransactionGraphOperator, TutorialD.Interpreter.Types, TutorialD.Interpreter.SchemaOperator
     main-is: test/TutorialD/Interpreter/AtomFunctionScript.hs
     Build-Depends: base, HUnit, project-m36, uuid, containers, megaparsec, text, vector, directory, bytestring, mtl, haskeline, random, MonadRandom, semigroups, time
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin, ./test, .
 
 Test-Suite test-tutoriald-databasecontextfunctionscript
@@ -328,7 +271,7 @@
     Other-Modules: TutorialD.Interpreter, TutorialD.Interpreter.Base, TutorialD.Interpreter.DatabaseContextExpr, TutorialD.Interpreter.DatabaseContextIOOperator, TutorialD.Interpreter.Export.Base, TutorialD.Interpreter.Export.CSV, TutorialD.Interpreter.Import.Base, TutorialD.Interpreter.Import.BasicExamples, TutorialD.Interpreter.Import.CSV, TutorialD.Interpreter.Import.TutorialD, TutorialD.Interpreter.InformationOperator, TutorialD.Interpreter.RODatabaseContextOperator, TutorialD.Interpreter.RelationalExpr, TutorialD.Interpreter.TestBase, TutorialD.Interpreter.TransGraphRelationalOperator, TutorialD.Interpreter.TransactionGraphOperator, TutorialD.Interpreter.Types, TutorialD.Interpreter.SchemaOperator
     main-is: test/TutorialD/Interpreter/DatabaseContextFunctionScript.hs
     Build-Depends: base, HUnit, project-m36, uuid, containers, megaparsec, text, vector, directory, bytestring, mtl, haskeline, random, MonadRandom, semigroups, time
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin, ./test, .
 
 Test-Suite test-relation
@@ -337,7 +280,7 @@
     type: exitcode-stdio-1.0
     main-is: test/Relation/Basic.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring,  uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, stm-containers, project-m36, transformers
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 Test-Suite test-static-optimizer
     Default-Language: Haskell2010
@@ -345,7 +288,7 @@
     type: exitcode-stdio-1.0
     main-is: test/Relation/StaticOptimizer.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, stm-containers, project-m36, transformers
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 Test-Suite test-transactiongraph-persist
     Default-Language: Haskell2010
@@ -355,7 +298,7 @@
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, stm-containers, project-m36, random, MonadRandom, semigroups
     Other-Modules: TutorialD.Interpreter.Base, TutorialD.Interpreter.RelationalExpr, TutorialD.Interpreter.Types, TutorialD.Interpreter.DatabaseContextExpr, TutorialD.Interpreter.Import.BasicExamples
     Hs-Source-Dirs: ., ./src/bin
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 Test-Suite test-relation-import-csv
     Default-Language: Haskell2010
@@ -363,7 +306,7 @@
     type: exitcode-stdio-1.0
     main-is: test/Relation/Import/CSV.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, stm-containers, project-m36
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 Test-Suite test-tutoriald-import-tutoriald
     Default-Language: Haskell2010
@@ -372,7 +315,7 @@
     main-is: test/TutorialD/Interpreter/Import/TutorialD.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, stm-containers, project-m36, random, MonadRandom, semigroups
     Other-Modules: TutorialD.Interpreter.Base, TutorialD.Interpreter.Import.Base, TutorialD.Interpreter.Import.TutorialD, TutorialD.Interpreter.RelationalExpr, TutorialD.Interpreter.Types, TutorialD.Interpreter.DatabaseContextExpr, TutorialD.Interpreter.Import.BasicExamples
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ., ./src/bin
 
 Test-Suite test-relation-export-csv
@@ -381,7 +324,7 @@
     type: exitcode-stdio-1.0
     main-is: test/Relation/Export/CSV.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, stm-containers, project-m36
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 Test-Suite test-transactiongraph-merge
     Default-Language: Haskell2010
@@ -389,7 +332,7 @@
     type: exitcode-stdio-1.0
     main-is: test/TransactionGraph/Merge.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, template-haskell, transformers, aeson, conduit, either, path-pieces, http-api-data, stm-containers, list-t, project-m36
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 benchmark bench
     Default-Language: Haskell2010
@@ -397,7 +340,7 @@
     type: exitcode-stdio-1.0
     main-is: benchmark/Relation.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, criterion, stm-containers, project-m36
-    GHC-Options: -Wall -rtsopts
+    GHC-Options: -Wall -rtsopts -threaded
     Hs-Source-Dirs: ./src/bin
 
 Test-Suite test-server
@@ -407,28 +350,28 @@
     main-is: test/Server/Main.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, network-transport-tcp, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, project-m36, network-transport, semigroups
     HS-Source-Dirs: ., ./src/bin
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 Executable Example-SimpleClient
     Default-Language: Haskell2010
     Default-Extensions: OverloadedStrings
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, ghc, ghc-paths, project-m36, random, MonadRandom
     Main-Is: examples/SimpleClient.hs
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 Executable Example-OutOfTheTarpit
     Default-Language: Haskell2010
     Default-Extensions: OverloadedStrings
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, aeson, path-pieces, either, conduit, http-api-data, template-haskell, ghc, ghc-paths, project-m36
     Main-Is: examples/out_of_the_tarpit.hs
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 Executable Example-Blog
     Default-Language: Haskell2010
     Default-Extensions: OverloadedStrings
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, aeson, path-pieces, either, conduit, http-api-data, template-haskell, ghc, ghc-paths, project-m36, scotty, blaze-html, http-types
     Main-Is: examples/blog.hs
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 
 Executable Example-Hair
@@ -436,14 +379,14 @@
     Default-Extensions: OverloadedStrings
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, aeson, path-pieces, either, conduit, http-api-data, template-haskell, ghc, ghc-paths, project-m36
     Main-Is: examples/hair.hs
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 Executable Example-CustomTupleable
     Default-Language: Haskell2010
     Default-Extensions: OverloadedStrings
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, aeson, path-pieces, either, conduit, http-api-data, template-haskell, ghc, ghc-paths, project-m36
     Main-Is: examples/CustomTupleable.hs
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
 
 Test-Suite test-scripts
     Default-Language: Haskell2010
@@ -452,7 +395,7 @@
     main-is: test/scripts.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, network-transport-tcp, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, project-m36, random, MonadRandom, semigroups
     Other-Modules: TutorialD.Interpreter.Base, TutorialD.Interpreter.DatabaseContextExpr, TutorialD.Interpreter.Import.Base, TutorialD.Interpreter.Import.TutorialD, TutorialD.Interpreter.RelationalExpr, TutorialD.Interpreter.Types, TutorialD.Interpreter.Import.BasicExamples
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ., ./src/bin
 
 Executable project-m36-websocket-server
@@ -460,7 +403,7 @@
     Build-Depends: base, aeson, path-pieces, either, conduit, http-api-data, template-haskell, websockets, aeson, optparse-applicative, project-m36, containers, bytestring, text, vector, uuid, megaparsec, haskeline, mtl, directory, base64-bytestring, random, MonadRandom, time, network-transport-tcp, semigroups, attoparsec
     Main-Is: ProjectM36/Server/WebSocket/websocket-server.hs
     Other-Modules:  ProjectM36.Client.Json, ProjectM36.Server.RemoteCallTypes.Json, ProjectM36.Server.WebSocket, TutorialD.Interpreter, TutorialD.Interpreter.Base, TutorialD.Interpreter.DatabaseContextExpr, TutorialD.Interpreter.DatabaseContextIOOperator, TutorialD.Interpreter.Export.Base, TutorialD.Interpreter.Export.CSV, TutorialD.Interpreter.Import.Base, TutorialD.Interpreter.Import.BasicExamples, TutorialD.Interpreter.Import.CSV, TutorialD.Interpreter.Import.TutorialD, TutorialD.Interpreter.InformationOperator, TutorialD.Interpreter.RODatabaseContextOperator, TutorialD.Interpreter.RelationalExpr, TutorialD.Interpreter.TransactionGraphOperator, TutorialD.Interpreter.Types, TutorialD.Interpreter.TransGraphRelationalOperator, TutorialD.Interpreter.SchemaOperator
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin
     Default-Extensions: OverloadedStrings
 
@@ -471,7 +414,7 @@
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, websockets, optparse-applicative, network, aeson, project-m36, random, MonadRandom, network-transport-tcp, semigroups
     Other-Modules: TutorialD.Interpreter.Export.Base, TutorialD.Interpreter.Export.CSV, TutorialD.Interpreter.Import.BasicExamples, TutorialD.Interpreter.Import.CSV, TutorialD.Interpreter.InformationOperator, TutorialD.Interpreter.RODatabaseContextOperator, TutorialD.Interpreter.TransactionGraphOperator, ProjectM36.Client.Json, ProjectM36.Server.RemoteCallTypes.Json, ProjectM36.Server.WebSocket, TutorialD.Interpreter, TutorialD.Interpreter.Base, TutorialD.Interpreter.DatabaseContextExpr, TutorialD.Interpreter.Import.Base, TutorialD.Interpreter.Import.TutorialD, TutorialD.Interpreter.RelationalExpr, TutorialD.Interpreter.Types, TutorialD.Interpreter.DatabaseContextIOOperator, TutorialD.Interpreter.TransGraphRelationalOperator, TutorialD.Interpreter.SchemaOperator
     Default-Extensions: OverloadedStrings
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin, .
 
 Test-Suite test-isomorphic-schemas
@@ -480,7 +423,7 @@
     main-is: test/IsomorphicSchema.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, websockets, optparse-applicative, network, aeson, project-m36
     Default-Extensions: OverloadedStrings
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin, .
 
 Test-Suite test-atomable
@@ -490,7 +433,7 @@
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, websockets, optparse-applicative, network, aeson, project-m36, random, MonadRandom, semigroups
     Other-Modules: TutorialD.Interpreter, TutorialD.Interpreter.Base, TutorialD.Interpreter.DatabaseContextExpr, TutorialD.Interpreter.DatabaseContextIOOperator, TutorialD.Interpreter.Export.Base, TutorialD.Interpreter.Export.CSV, TutorialD.Interpreter.Import.Base, TutorialD.Interpreter.Import.BasicExamples, TutorialD.Interpreter.Import.CSV, TutorialD.Interpreter.Import.TutorialD, TutorialD.Interpreter.InformationOperator, TutorialD.Interpreter.RODatabaseContextOperator, TutorialD.Interpreter.RelationalExpr, TutorialD.Interpreter.SchemaOperator, TutorialD.Interpreter.TestBase, TutorialD.Interpreter.TransGraphRelationalOperator, TutorialD.Interpreter.TransactionGraphOperator, TutorialD.Interpreter.Types
     Default-Extensions: OverloadedStrings
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin, ., test/
 
 Test-Suite test-multiprocess-access
@@ -499,7 +442,7 @@
     main-is: test/MultiProcessDatabaseAccess.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, websockets, optparse-applicative, network, aeson, project-m36, random, MonadRandom
     Default-Extensions: OverloadedStrings
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin, ., test/
 
 Test-Suite test-transactiongraph-automerge
@@ -509,7 +452,7 @@
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, websockets, optparse-applicative, network, aeson, project-m36, random, MonadRandom, semigroups
     Other-Modules: TutorialD.Interpreter, TutorialD.Interpreter.Base, TutorialD.Interpreter.DatabaseContextExpr, TutorialD.Interpreter.DatabaseContextIOOperator, TutorialD.Interpreter.Export.Base, TutorialD.Interpreter.Export.CSV, TutorialD.Interpreter.Import.Base, TutorialD.Interpreter.Import.BasicExamples, TutorialD.Interpreter.Import.CSV, TutorialD.Interpreter.Import.TutorialD, TutorialD.Interpreter.InformationOperator, TutorialD.Interpreter.RODatabaseContextOperator, TutorialD.Interpreter.RelationalExpr, TutorialD.Interpreter.SchemaOperator, TutorialD.Interpreter.TestBase, TutorialD.Interpreter.TransGraphRelationalOperator, TutorialD.Interpreter.TransactionGraphOperator, TutorialD.Interpreter.Types
     Default-Extensions: OverloadedStrings
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin, ., test/
 
 Test-Suite test-tupleable
@@ -518,7 +461,7 @@
     main-is: test/Relation/Tupleable.hs
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, websockets, optparse-applicative, network, aeson, project-m36, random, MonadRandom, semigroups
     Default-Extensions: OverloadedStrings
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin, ., test/
 
 Test-Suite test-client-simple
@@ -527,7 +470,7 @@
     type: exitcode-stdio-1.0
     Build-Depends: base, HUnit, Cabal, containers, hashable, unordered-containers, mtl, vector, vector-binary-instances, time, hashable-time, bytestring, uuid, stm, deepseq, deepseq-generics, binary, parallel, cassava, attoparsec, gnuplot, directory, temporary, haskeline, megaparsec, text, base64-bytestring, data-interval, filepath, transformers, stm-containers, list-t, websockets, optparse-applicative, network, aeson, project-m36, random, MonadRandom, semigroups
     Default-Extensions: OverloadedStrings
-    GHC-Options: -Wall
+    GHC-Options: -Wall -threaded
     Hs-Source-Dirs: ./src/bin, ., test/
 
 -- test for file handle leaks
diff --git a/src/lib/ProjectM36/Arbitrary.hs b/src/lib/ProjectM36/Arbitrary.hs
--- a/src/lib/ProjectM36/Arbitrary.hs
+++ b/src/lib/ProjectM36/Arbitrary.hs
@@ -10,8 +10,9 @@
 import ProjectM36.DataConstructorDef as DCD
 import ProjectM36.DataTypes.Interval
 import qualified Data.Vector as V
-import Data.Text (Text,pack)
+import Data.Text (Text)
 import Test.QuickCheck
+import Test.QuickCheck.Instances ()
 import qualified Data.ByteString.Char8 as B
 import Data.Time
 import Control.Monad.Reader
@@ -74,18 +75,6 @@
 maybeToRight :: b -> Maybe a -> Either b a
 maybeToRight _ (Just x) = Right x
 maybeToRight y Nothing  = Left y
-
-instance Arbitrary Text where
-  arbitrary = pack <$> elements (map (replicate 3) ['A'..'Z'])
-
-instance Arbitrary Day where
-  arbitrary = ModifiedJulianDay <$> (arbitrary :: Gen Integer)
-
-instance Arbitrary UTCTime where
- arbitrary = UTCTime <$> arbitrary <*> (secondsToDiffTime <$> choose(0,86400))
-
-instance Arbitrary B.ByteString where
-  arbitrary = B.pack <$> (arbitrary :: Gen String)
 
 arbitraryRelationTuple :: Attributes -> WithTCMap Gen (Either RelationalError RelationTuple)
 arbitraryRelationTuple attris = do
diff --git a/src/lib/ProjectM36/IsomorphicSchema.hs b/src/lib/ProjectM36/IsomorphicSchema.hs
--- a/src/lib/ProjectM36/IsomorphicSchema.hs
+++ b/src/lib/ProjectM36/IsomorphicSchema.hs
@@ -14,9 +14,7 @@
 import qualified Data.Map as M
 import qualified Data.Set as S
 import qualified Data.List as L
-import qualified Data.Text as T
 import Data.Monoid
---import Debug.Trace
 -- isomorphic schemas offer bi-directional functors between two schemas
 
 --TODO: note that renaming a relvar should alter any stored isomorphisms as well
@@ -304,11 +302,11 @@
 
 -- | Create inclusion dependencies mainly for IsoRestrict because the predicate should hold in the base schema.
 createIncDepsForIsomorph :: SchemaName -> SchemaIsomorph -> InclusionDependencies
-createIncDepsForIsomorph sname (IsoRestrict _ predi (rvTrue, rvFalse)) = let 
+createIncDepsForIsomorph sname (IsoRestrict origRv predi (rvTrue, rvFalse)) = let 
   newIncDep predicate rv = InclusionDependency (Project AN.empty (Restrict predicate (RelationVariable rv ()))) (ExistingRelation relationTrue)
-  incDepName b = "schema" <> "_" <> sname <> "_" <> T.pack (show b) in
-  M.fromList [(incDepName True, newIncDep predi rvTrue),
-              (incDepName False, newIncDep (NotPredicate predi) rvFalse)]
+  incDepName b = "schema" <> "_" <> sname <> "_" <> b in
+  M.fromList [(incDepName (origRv <> "_true"), newIncDep predi rvTrue),
+              (incDepName (origRv <> "_false"), newIncDep (NotPredicate predi) rvFalse)]
 createIncDepsForIsomorph _ _ = M.empty
 
 -- in the case of IsoRestrict, the database context should be updated with the restriction so that if the restriction does not hold, then the schema cannot be created
diff --git a/src/lib/ProjectM36/Relation.hs b/src/lib/ProjectM36/Relation.hs
--- a/src/lib/ProjectM36/Relation.hs
+++ b/src/lib/ProjectM36/Relation.hs
@@ -64,6 +64,10 @@
 mkRelationDeferVerify attrs tupleSet = return $ Relation attrs (RelationTupleSet (filter tupleFilter (asList tupleSet)))
   where
     tupleFilter tuple = isRight (verifyTuple attrs tuple)
+    
+--return a relation of the same type except without any tuples
+relationWithEmptyTupleSet :: Relation -> Relation    
+relationWithEmptyTupleSet (Relation attrs _) = emptyRelationWithAttrs attrs
 
 mkRelationFromTuples :: Attributes -> [RelationTuple] -> Either RelationalError Relation
 mkRelationFromTuples attrs tupleSetList = do
diff --git a/src/lib/ProjectM36/RelationalExpression.hs b/src/lib/ProjectM36/RelationalExpression.hs
--- a/src/lib/ProjectM36/RelationalExpression.hs
+++ b/src/lib/ProjectM36/RelationalExpression.hs
@@ -663,7 +663,10 @@
   --replace the relationVariables context element with a cloned set of relation devoid of tuples
   let context' = contextWithEmptyTupleSets context
       rstate' = setStateElemsContext rstate context'
-  pure (runReader (evalRelationalExpr expr) rstate')
+  --evalRelationalExpr could still return an existing relation with tuples, so strip them
+  pure $ case runReader (evalRelationalExpr expr) rstate' of
+    Left err -> Left err
+    Right typeRel -> Right (relationWithEmptyTupleSet typeRel)
 
 --returns a database context with all tuples removed
 --this is useful for type checking and optimization
@@ -750,18 +753,18 @@
   --merge attrs into the state attributes
   rstate <- ask
   runExceptT $ do
-    aType <- liftE (typeFromAtomExpr attrs atomExpr)
+    aType <- liftE (typeFromAtomExpr attrs  atomExpr)
     if aType /= BoolAtomType then
       throwE (AtomTypeMismatchError aType BoolAtomType)
       else
       pure (\tupleIn ->
-                pure $ case runReader (evalAtomExpr tupleIn atomExpr) rstate of
-                  Left _ -> False
-                  Right boolAtomValue -> boolAtomValue == BoolAtom True)
+             case runReader (evalAtomExpr tupleIn atomExpr) rstate of
+                  Left err -> Left err
+                  Right boolAtomValue -> pure (boolAtomValue == BoolAtom True))
 
 tupleExprCheckNewAttrName :: AttributeName -> Relation -> Either RelationalError Relation
 tupleExprCheckNewAttrName attrName rel = if isRight (attributeForName attrName rel) then
-                                           Left (error "SPAMMIT" $ AttributeNameInUseError attrName)
+                                           Left (AttributeNameInUseError attrName)
                                          else
                                            Right rel
 
@@ -800,13 +803,15 @@
     func <- either throwE pure (atomFunctionForName funcName functions)
     let expectedArgCount = length (atomFuncType func) - 1
         actualArgCount = length argTypes
-        safeInit [_] = []
         safeInit [] = [] -- different behavior from normal init
-        safeInit (_:xs) = safeInit xs
+        safeInit xs = init xs
     if expectedArgCount /= actualArgCount then
       throwE (FunctionArgumentCountMismatchError expectedArgCount actualArgCount)
       else do
-      mapM_ (\(expType, actType) -> either throwE pure (atomTypeVerify expType actType)) (safeInit (zip (atomFuncType func) argTypes))
+      let zippedArgs = zip (safeInit (atomFuncType func)) argTypes
+      mapM_ (\(expType, eActType) -> do
+                actType <- either throwE pure eActType
+                either throwE pure (atomTypeVerify expType actType)) zippedArgs
       evaldArgs <- mapM (liftE . evalAtomExpr tupIn) arguments
       case evalAtomFunction func evaldArgs of
         Left err -> throwE (AtomFunctionUserError err)
diff --git a/src/lib/ProjectM36/Sessions.hs b/src/lib/ProjectM36/Sessions.hs
--- a/src/lib/ProjectM36/Sessions.hs
+++ b/src/lib/ProjectM36/Sessions.hs
@@ -16,21 +16,23 @@
 import ProjectM36.Error
 import qualified Data.UUID as U
 import qualified Control.Foldl as Foldl
-import qualified DeferredFolds.UnfoldM as UnfoldM
+#if MIN_VERSION_stm_containers(1,0,0)
+import qualified DeferredFolds.UnfoldlM as UF
+#endif
 
 type Sessions = StmMap.Map SessionId Session
 
 --from https://github.com/nikita-volkov/stm-containers/blob/master/test/Main/MapTests.hs
 stmMapToList :: StmMap.Map k v -> STM [(k, v)]
 #if MIN_VERSION_stm_containers(1,0,0)
-stmMapToList = UnfoldM.foldM (Foldl.generalize Foldl.list) . StmMap.unfoldM
+stmMapToList = UF.foldM (Foldl.generalize Foldl.list) . StmMap.unfoldlM
 #else
 stmMapToList = ListT.fold (\l -> return . (:l)) [] . StmMap.stream
 #endif
 
 stmSetToList :: StmSet.Set v -> STM [v]
 #if MIN_VERSION_stm_containers(1,0,0)
-stmSetToList = UnfoldM.foldM (Foldl.generalize Foldl.list) . StmSet.unfoldM
+stmSetToList = UF.foldM (Foldl.generalize Foldl.list) . StmSet.unfoldlM
 #else
 stmSetToList = ListT.fold (\l -> return . (:l)) [] . StmSet.stream
 #endif
diff --git a/test/IsomorphicSchema.hs b/test/IsomorphicSchema.hs
--- a/test/IsomorphicSchema.hs
+++ b/test/IsomorphicSchema.hs
@@ -105,15 +105,15 @@
   --create motors relation which is split into low-power (<50 horsepower) and high-power (>=50 horsepower) motors
   --the schema is contains the split relvars
   motorsRel <- assertEither $ mkRelationFromList (A.attributesFromList [Attribute "name" TextAtomType,
-                                                                        Attribute "power" IntAtomType]) 
-               [[TextAtom "Puny", IntAtom 10],
-                [TextAtom "Scooter", IntAtom 49],
-                [TextAtom "Auto", IntAtom 200],
-                [TextAtom "Tractor", IntAtom 500]]
+                                                                        Attribute "power" IntegerAtomType]) 
+               [[TextAtom "Puny", IntegerAtom 10],
+                [TextAtom "Scooter", IntegerAtom 49],
+                [TextAtom "Auto", IntegerAtom 200],
+                [TextAtom "Tractor", IntegerAtom 500]]
   let baseSchema = mkRelationalExprState DBC.basicDatabaseContext {
         relationVariables = M.singleton "motor" motorsRel
         }
-      splitPredicate = AtomExprPredicate (FunctionAtomExpr "lt" [AttributeAtomExpr "power", NakedAtomExpr (IntAtom 50)] ())
+      splitPredicate = AtomExprPredicate (FunctionAtomExpr "lt" [AttributeAtomExpr "power", NakedAtomExpr (IntegerAtom 50)] ())
       splitIsomorphs = [IsoUnion ("lowpower", "highpower") splitPredicate "motor",
                         IsoRename "true" "true",
                         IsoRename "false" "false"]
diff --git a/test/Relation/Basic.hs b/test/Relation/Basic.hs
--- a/test/Relation/Basic.hs
+++ b/test/Relation/Basic.hs
@@ -25,7 +25,8 @@
                      testRelation "products" productsRel,
                      testRelation "supplierProducts" supplierProductsRel,
                      testMkRelationFromExprsBadAttrs,
-                     testDuplicateAttributes
+                     testDuplicateAttributes,
+                     testExistingRelationType
                     ]
 
 main :: IO ()           
@@ -104,3 +105,8 @@
   let eRel = mkRelation attrs emptyTupleSet
       attrs = attributesFromList [Attribute "a" IntAtomType, Attribute "a" TextAtomType]
   assertEqual "duplicate attribute names" (Left (DuplicateAttributeNamesError (S.singleton "a"))) eRel
+  
+testExistingRelationType :: Test
+testExistingRelationType = TestCase $ do
+  let typeResult = runReader (typeForRelationalExpr (ExistingRelation relationTrue)) (RelationalExprStateElems DBC.empty)
+  assertEqual "ExistingRelation with tuples type" (Right relationFalse) typeResult
diff --git a/test/Server/Main.hs b/test/Server/Main.hs
--- a/test/Server/Main.hs
+++ b/test/Server/Main.hs
@@ -222,12 +222,12 @@
 #if defined(linux_HOST_OS)
 --validate that creating a server, connecting a client, and then disconnecting doesn't leak file descriptors
 testFileDescriptorCount = TestCase $ do
-  (serverAddress, serverTid) <- launchTestServer 1000
+  (serverAddress, serverTid) <- launchTestServer 0
   unusedMVar <- newEmptyMVar
   startCount <- fdCount  
   Right (sess, testConn) <- testConnection serverAddress unusedMVar
   --add a test commit to trigger the fsync machinery
-  executeDatabaseContextExpr sess testConn (Assign "x" (ExistingRelation relationFalse)) >>= eitherFail  
+  executeDatabaseContextExpr sess testConn (Assign "x" (ExistingRelation relationFalse)) >>= eitherFail
   commit sess testConn >>= eitherFail
   close testConn
   endCount <- fdCount
diff --git a/test/TutorialD/Interpreter.hs b/test/TutorialD/Interpreter.hs
--- a/test/TutorialD/Interpreter.hs
+++ b/test/TutorialD/Interpreter.hs
@@ -72,7 +72,8 @@
       testArbitraryRelation,
       testNonEmptyListType,
       testUnresolvedAtomTypes,
-      testWithClause
+      testWithClause,
+      testAtomFunctionArgumentMismatch
       ]
     simpleRelTests = [("x:=true", Right relationTrue),
                       ("x:=false", Right relationFalse),
@@ -631,4 +632,12 @@
   
   expectTutorialDErr sessionId dbconn (T.isPrefixOf err1) "x:=with (s as sp) s"  
 
-  
+testAtomFunctionArgumentMismatch :: Test
+testAtomFunctionArgumentMismatch = TestCase $ do
+  (sessionId, dbconn) <- dateExamplesConnection emptyNotificationCallback
+  let err1 = "AtomTypeMismatchError"
+  --atom function type mismatch
+  expectTutorialDErr sessionId dbconn (T.isPrefixOf err1) "x:=relation{tuple{a 5}} where ^gt(@a,1.5)"
+  --wrong argument count
+  let err2 = "FunctionArgumentCountMismatchError"
+  expectTutorialDErr sessionId dbconn (T.isPrefixOf err2) "x:=relation{tuple{a 5}} where ^gt(@a,1,3)"
diff --git a/test/TutorialD/Interpreter/DatabaseContextFunctionScript.hs b/test/TutorialD/Interpreter/DatabaseContextFunctionScript.hs
--- a/test/TutorialD/Interpreter/DatabaseContextFunctionScript.hs
+++ b/test/TutorialD/Interpreter/DatabaseContextFunctionScript.hs
@@ -19,9 +19,7 @@
   (sess, conn) <- dateExamplesConnection emptyNotificationCallback
   let addfunc = "adddatabasecontextfunction \"addTrue2\" DatabaseContext -> Either DatabaseContextFunctionError DatabaseContext  \"\"\"(\\[] ctx -> executeDatabaseContextExpr (Assign \"true2\" (ExistingRelation relationTrue)) ctx) :: [Atom] -> DatabaseContext -> Either DatabaseContextFunctionError DatabaseContext\"\"\""
   executeTutorialD sess conn addfunc
-  putStrLn "spam1"
   executeTutorialD sess conn "execute addTrue2()"
-  putStrLn "spam2"
   {-
   let true2Expr = RelationVariable "true2" ()
   result <- executeRelationalExpr sess conn true2Expr
