Merge pull request #5 from paulcastro/issue_4

Issue #4 update code to beta 6
diff --git a/WhiskSwiftTools.xcodeproj/project.pbxproj b/WhiskSwiftTools.xcodeproj/project.pbxproj
index 1500296..dd8fc69 100644
--- a/WhiskSwiftTools.xcodeproj/project.pbxproj
+++ b/WhiskSwiftTools.xcodeproj/project.pbxproj
@@ -7,6 +7,21 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		D676B4AD1D64AAA400A29AE5 /* aescrypt.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B48A1D64AAA400A29AE5 /* aescrypt.c */; };
+		D676B4AE1D64AAA400A29AE5 /* aeskey.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B48B1D64AAA400A29AE5 /* aeskey.c */; };
+		D676B4AF1D64AAA400A29AE5 /* aestab.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B48D1D64AAA400A29AE5 /* aestab.c */; };
+		D676B4B01D64AAA400A29AE5 /* entropy.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B4911D64AAA400A29AE5 /* entropy.c */; };
+		D676B4B11D64AAA400A29AE5 /* fileenc.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B4931D64AAA400A29AE5 /* fileenc.c */; };
+		D676B4B21D64AAA400A29AE5 /* hmac.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B4951D64AAA400A29AE5 /* hmac.c */; };
+		D676B4B31D64AAA400A29AE5 /* prng.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B4971D64AAA400A29AE5 /* prng.c */; };
+		D676B4B41D64AAA400A29AE5 /* pwd2key.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B4991D64AAA400A29AE5 /* pwd2key.c */; };
+		D676B4B51D64AAA400A29AE5 /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B49B1D64AAA400A29AE5 /* sha1.c */; };
+		D676B4B61D64AAA400A29AE5 /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B4A01D64AAA400A29AE5 /* ioapi.c */; };
+		D676B4B71D64AAA400A29AE5 /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B4A21D64AAA400A29AE5 /* mztools.c */; };
+		D676B4B81D64AAA400A29AE5 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B4A41D64AAA400A29AE5 /* unzip.c */; };
+		D676B4B91D64AAA400A29AE5 /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = D676B4A61D64AAA400A29AE5 /* zip.c */; };
+		D676B4BA1D64AAA400A29AE5 /* SSZipArchive+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = D676B4A81D64AAA400A29AE5 /* SSZipArchive+Swift.swift */; };
+		D676B4BB1D64AAA400A29AE5 /* SSZipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = D676B4AA1D64AAA400A29AE5 /* SSZipArchive.m */; };
 		D6BC1BF61D4017BE00C2334C /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1BF51D4017BE00C2334C /* main.swift */; };
 		D6BC1BFD1D4017FD00C2334C /* WhiskInstaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1BFC1D4017FD00C2334C /* WhiskInstaller.swift */; };
 		D6BC1BFF1D40180A00C2334C /* ConsoleIO.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1BFE1D40180A00C2334C /* ConsoleIO.swift */; };
@@ -18,20 +33,6 @@
 		D6BC1C331D4119FB00C2334C /* WhiskAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C2D1D4119FB00C2334C /* WhiskAPI.swift */; };
 		D6BC1C351D41391D00C2334C /* WhiskTokenizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C341D41391D00C2334C /* WhiskTokenizer.swift */; };
 		D6BC1C701D41659C00C2334C /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D6BC1C6F1D41659C00C2334C /* libz.tbd */; };
-		D6BC1C971D4165BA00C2334C /* aescrypt.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C751D4165BA00C2334C /* aescrypt.c */; };
-		D6BC1C981D4165BA00C2334C /* aeskey.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C761D4165BA00C2334C /* aeskey.c */; };
-		D6BC1C991D4165BA00C2334C /* aestab.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C781D4165BA00C2334C /* aestab.c */; };
-		D6BC1C9A1D4165BA00C2334C /* entropy.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C7C1D4165BA00C2334C /* entropy.c */; };
-		D6BC1C9B1D4165BA00C2334C /* fileenc.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C7E1D4165BA00C2334C /* fileenc.c */; };
-		D6BC1C9C1D4165BA00C2334C /* hmac.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C801D4165BA00C2334C /* hmac.c */; };
-		D6BC1C9D1D4165BA00C2334C /* prng.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C821D4165BA00C2334C /* prng.c */; };
-		D6BC1C9E1D4165BA00C2334C /* pwd2key.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C841D4165BA00C2334C /* pwd2key.c */; };
-		D6BC1C9F1D4165BA00C2334C /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C861D4165BA00C2334C /* sha1.c */; };
-		D6BC1CA01D4165BA00C2334C /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C8C1D4165BA00C2334C /* ioapi.c */; };
-		D6BC1CA11D4165BA00C2334C /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C8E1D4165BA00C2334C /* mztools.c */; };
-		D6BC1CA21D4165BA00C2334C /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C901D4165BA00C2334C /* unzip.c */; };
-		D6BC1CA31D4165BA00C2334C /* zip.c in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C921D4165BA00C2334C /* zip.c */; };
-		D6BC1CA41D4165BA00C2334C /* SSZipArchive.m in Sources */ = {isa = PBXBuildFile; fileRef = D6BC1C951D4165BA00C2334C /* SSZipArchive.m */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -47,6 +48,42 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
+		D676B4881D64AAA400A29AE5 /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = "<group>"; };
+		D676B4891D64AAA400A29AE5 /* aes_via_ace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes_via_ace.h; sourceTree = "<group>"; };
+		D676B48A1D64AAA400A29AE5 /* aescrypt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aescrypt.c; sourceTree = "<group>"; };
+		D676B48B1D64AAA400A29AE5 /* aeskey.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aeskey.c; sourceTree = "<group>"; };
+		D676B48C1D64AAA400A29AE5 /* aesopt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aesopt.h; sourceTree = "<group>"; };
+		D676B48D1D64AAA400A29AE5 /* aestab.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aestab.c; sourceTree = "<group>"; };
+		D676B48E1D64AAA400A29AE5 /* aestab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aestab.h; sourceTree = "<group>"; };
+		D676B48F1D64AAA400A29AE5 /* brg_endian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = brg_endian.h; sourceTree = "<group>"; };
+		D676B4901D64AAA400A29AE5 /* brg_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = brg_types.h; sourceTree = "<group>"; };
+		D676B4911D64AAA400A29AE5 /* entropy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = entropy.c; sourceTree = "<group>"; };
+		D676B4921D64AAA400A29AE5 /* entropy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = entropy.h; sourceTree = "<group>"; };
+		D676B4931D64AAA400A29AE5 /* fileenc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fileenc.c; sourceTree = "<group>"; };
+		D676B4941D64AAA400A29AE5 /* fileenc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fileenc.h; sourceTree = "<group>"; };
+		D676B4951D64AAA400A29AE5 /* hmac.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hmac.c; sourceTree = "<group>"; };
+		D676B4961D64AAA400A29AE5 /* hmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hmac.h; sourceTree = "<group>"; };
+		D676B4971D64AAA400A29AE5 /* prng.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prng.c; sourceTree = "<group>"; };
+		D676B4981D64AAA400A29AE5 /* prng.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prng.h; sourceTree = "<group>"; };
+		D676B4991D64AAA400A29AE5 /* pwd2key.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pwd2key.c; sourceTree = "<group>"; };
+		D676B49A1D64AAA400A29AE5 /* pwd2key.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pwd2key.h; sourceTree = "<group>"; };
+		D676B49B1D64AAA400A29AE5 /* sha1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sha1.c; sourceTree = "<group>"; };
+		D676B49C1D64AAA400A29AE5 /* sha1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha1.h; sourceTree = "<group>"; };
+		D676B49D1D64AAA400A29AE5 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		D676B49F1D64AAA400A29AE5 /* crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypt.h; sourceTree = "<group>"; };
+		D676B4A01D64AAA400A29AE5 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = "<group>"; };
+		D676B4A11D64AAA400A29AE5 /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = "<group>"; };
+		D676B4A21D64AAA400A29AE5 /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mztools.c; sourceTree = "<group>"; };
+		D676B4A31D64AAA400A29AE5 /* mztools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mztools.h; sourceTree = "<group>"; };
+		D676B4A41D64AAA400A29AE5 /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unzip.c; sourceTree = "<group>"; };
+		D676B4A51D64AAA400A29AE5 /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = "<group>"; };
+		D676B4A61D64AAA400A29AE5 /* zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip.c; sourceTree = "<group>"; };
+		D676B4A71D64AAA400A29AE5 /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zip.h; sourceTree = "<group>"; };
+		D676B4A81D64AAA400A29AE5 /* SSZipArchive+Swift.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SSZipArchive+Swift.swift"; sourceTree = "<group>"; };
+		D676B4A91D64AAA400A29AE5 /* SSZipArchive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSZipArchive.h; sourceTree = "<group>"; };
+		D676B4AA1D64AAA400A29AE5 /* SSZipArchive.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSZipArchive.m; sourceTree = "<group>"; };
+		D676B4AB1D64AAA400A29AE5 /* SSZipCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSZipCommon.h; sourceTree = "<group>"; };
+		D676B4AC1D64AAA400A29AE5 /* ZipArchive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZipArchive.h; sourceTree = "<group>"; };
 		D6BC1BF21D4017BE00C2334C /* wsktool */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = wsktool; sourceTree = BUILT_PRODUCTS_DIR; };
 		D6BC1BF51D4017BE00C2334C /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
 		D6BC1BFC1D4017FD00C2334C /* WhiskInstaller.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhiskInstaller.swift; sourceTree = "<group>"; };
@@ -61,41 +98,6 @@
 		D6BC1C341D41391D00C2334C /* WhiskTokenizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WhiskTokenizer.swift; sourceTree = "<group>"; };
 		D6BC1C391D413D9700C2334C /* ZipArchive.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ZipArchive.framework; path = ../ZipArchive/build/Debug/ZipArchive.framework; sourceTree = "<group>"; };
 		D6BC1C6F1D41659C00C2334C /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
-		D6BC1C731D4165BA00C2334C /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = "<group>"; };
-		D6BC1C741D4165BA00C2334C /* aes_via_ace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes_via_ace.h; sourceTree = "<group>"; };
-		D6BC1C751D4165BA00C2334C /* aescrypt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aescrypt.c; sourceTree = "<group>"; };
-		D6BC1C761D4165BA00C2334C /* aeskey.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aeskey.c; sourceTree = "<group>"; };
-		D6BC1C771D4165BA00C2334C /* aesopt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aesopt.h; sourceTree = "<group>"; };
-		D6BC1C781D4165BA00C2334C /* aestab.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = aestab.c; sourceTree = "<group>"; };
-		D6BC1C791D4165BA00C2334C /* aestab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aestab.h; sourceTree = "<group>"; };
-		D6BC1C7A1D4165BA00C2334C /* brg_endian.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = brg_endian.h; sourceTree = "<group>"; };
-		D6BC1C7B1D4165BA00C2334C /* brg_types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = brg_types.h; sourceTree = "<group>"; };
-		D6BC1C7C1D4165BA00C2334C /* entropy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = entropy.c; sourceTree = "<group>"; };
-		D6BC1C7D1D4165BA00C2334C /* entropy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = entropy.h; sourceTree = "<group>"; };
-		D6BC1C7E1D4165BA00C2334C /* fileenc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fileenc.c; sourceTree = "<group>"; };
-		D6BC1C7F1D4165BA00C2334C /* fileenc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fileenc.h; sourceTree = "<group>"; };
-		D6BC1C801D4165BA00C2334C /* hmac.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hmac.c; sourceTree = "<group>"; };
-		D6BC1C811D4165BA00C2334C /* hmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hmac.h; sourceTree = "<group>"; };
-		D6BC1C821D4165BA00C2334C /* prng.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prng.c; sourceTree = "<group>"; };
-		D6BC1C831D4165BA00C2334C /* prng.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prng.h; sourceTree = "<group>"; };
-		D6BC1C841D4165BA00C2334C /* pwd2key.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pwd2key.c; sourceTree = "<group>"; };
-		D6BC1C851D4165BA00C2334C /* pwd2key.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pwd2key.h; sourceTree = "<group>"; };
-		D6BC1C861D4165BA00C2334C /* sha1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sha1.c; sourceTree = "<group>"; };
-		D6BC1C871D4165BA00C2334C /* sha1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha1.h; sourceTree = "<group>"; };
-		D6BC1C881D4165BA00C2334C /* Common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Common.h; sourceTree = "<group>"; };
-		D6BC1C891D4165BA00C2334C /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		D6BC1C8B1D4165BA00C2334C /* crypt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypt.h; sourceTree = "<group>"; };
-		D6BC1C8C1D4165BA00C2334C /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ioapi.c; sourceTree = "<group>"; };
-		D6BC1C8D1D4165BA00C2334C /* ioapi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ioapi.h; sourceTree = "<group>"; };
-		D6BC1C8E1D4165BA00C2334C /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mztools.c; sourceTree = "<group>"; };
-		D6BC1C8F1D4165BA00C2334C /* mztools.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mztools.h; sourceTree = "<group>"; };
-		D6BC1C901D4165BA00C2334C /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unzip.c; sourceTree = "<group>"; };
-		D6BC1C911D4165BA00C2334C /* unzip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = unzip.h; sourceTree = "<group>"; };
-		D6BC1C921D4165BA00C2334C /* zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = zip.c; sourceTree = "<group>"; };
-		D6BC1C931D4165BA00C2334C /* zip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = zip.h; sourceTree = "<group>"; };
-		D6BC1C941D4165BA00C2334C /* SSZipArchive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SSZipArchive.h; sourceTree = "<group>"; };
-		D6BC1C951D4165BA00C2334C /* SSZipArchive.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SSZipArchive.m; sourceTree = "<group>"; };
-		D6BC1C961D4165BA00C2334C /* ZipArchive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZipArchive.h; sourceTree = "<group>"; };
 		D6BC1CA81D41675800C2334C /* WhiskSwiftTools-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WhiskSwiftTools-Bridging-Header.h"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -111,11 +113,71 @@
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
+		D676B4861D64AAA400A29AE5 /* SSZipArchive */ = {
+			isa = PBXGroup;
+			children = (
+				D676B4871D64AAA400A29AE5 /* aes */,
+				D676B49D1D64AAA400A29AE5 /* Info.plist */,
+				D676B49E1D64AAA400A29AE5 /* minizip */,
+				D676B4A81D64AAA400A29AE5 /* SSZipArchive+Swift.swift */,
+				D676B4A91D64AAA400A29AE5 /* SSZipArchive.h */,
+				D676B4AA1D64AAA400A29AE5 /* SSZipArchive.m */,
+				D676B4AB1D64AAA400A29AE5 /* SSZipCommon.h */,
+				D676B4AC1D64AAA400A29AE5 /* ZipArchive.h */,
+			);
+			name = SSZipArchive;
+			path = ../ZipArchive/SSZipArchive;
+			sourceTree = "<group>";
+		};
+		D676B4871D64AAA400A29AE5 /* aes */ = {
+			isa = PBXGroup;
+			children = (
+				D676B4881D64AAA400A29AE5 /* aes.h */,
+				D676B4891D64AAA400A29AE5 /* aes_via_ace.h */,
+				D676B48A1D64AAA400A29AE5 /* aescrypt.c */,
+				D676B48B1D64AAA400A29AE5 /* aeskey.c */,
+				D676B48C1D64AAA400A29AE5 /* aesopt.h */,
+				D676B48D1D64AAA400A29AE5 /* aestab.c */,
+				D676B48E1D64AAA400A29AE5 /* aestab.h */,
+				D676B48F1D64AAA400A29AE5 /* brg_endian.h */,
+				D676B4901D64AAA400A29AE5 /* brg_types.h */,
+				D676B4911D64AAA400A29AE5 /* entropy.c */,
+				D676B4921D64AAA400A29AE5 /* entropy.h */,
+				D676B4931D64AAA400A29AE5 /* fileenc.c */,
+				D676B4941D64AAA400A29AE5 /* fileenc.h */,
+				D676B4951D64AAA400A29AE5 /* hmac.c */,
+				D676B4961D64AAA400A29AE5 /* hmac.h */,
+				D676B4971D64AAA400A29AE5 /* prng.c */,
+				D676B4981D64AAA400A29AE5 /* prng.h */,
+				D676B4991D64AAA400A29AE5 /* pwd2key.c */,
+				D676B49A1D64AAA400A29AE5 /* pwd2key.h */,
+				D676B49B1D64AAA400A29AE5 /* sha1.c */,
+				D676B49C1D64AAA400A29AE5 /* sha1.h */,
+			);
+			path = aes;
+			sourceTree = "<group>";
+		};
+		D676B49E1D64AAA400A29AE5 /* minizip */ = {
+			isa = PBXGroup;
+			children = (
+				D676B49F1D64AAA400A29AE5 /* crypt.h */,
+				D676B4A01D64AAA400A29AE5 /* ioapi.c */,
+				D676B4A11D64AAA400A29AE5 /* ioapi.h */,
+				D676B4A21D64AAA400A29AE5 /* mztools.c */,
+				D676B4A31D64AAA400A29AE5 /* mztools.h */,
+				D676B4A41D64AAA400A29AE5 /* unzip.c */,
+				D676B4A51D64AAA400A29AE5 /* unzip.h */,
+				D676B4A61D64AAA400A29AE5 /* zip.c */,
+				D676B4A71D64AAA400A29AE5 /* zip.h */,
+			);
+			path = minizip;
+			sourceTree = "<group>";
+		};
 		D6BC1BE91D4017BE00C2334C = {
 			isa = PBXGroup;
 			children = (
+				D676B4861D64AAA400A29AE5 /* SSZipArchive */,
 				D6BC1CA81D41675800C2334C /* WhiskSwiftTools-Bridging-Header.h */,
-				D6BC1C711D4165BA00C2334C /* SSZipArchive */,
 				D6BC1C001D40183900C2334C /* WhiskKit */,
 				D6BC1BF41D4017BE00C2334C /* WhiskTool */,
 				D6BC1BF31D4017BE00C2334C /* Products */,
@@ -167,65 +229,6 @@
 			name = Frameworks;
 			sourceTree = "<group>";
 		};
-		D6BC1C711D4165BA00C2334C /* SSZipArchive */ = {
-			isa = PBXGroup;
-			children = (
-				D6BC1C721D4165BA00C2334C /* aes */,
-				D6BC1C881D4165BA00C2334C /* Common.h */,
-				D6BC1C891D4165BA00C2334C /* Info.plist */,
-				D6BC1C8A1D4165BA00C2334C /* minizip */,
-				D6BC1C941D4165BA00C2334C /* SSZipArchive.h */,
-				D6BC1C951D4165BA00C2334C /* SSZipArchive.m */,
-				D6BC1C961D4165BA00C2334C /* ZipArchive.h */,
-			);
-			name = SSZipArchive;
-			path = WhiskSwiftTools/ZipArchive/SSZipArchive;
-			sourceTree = "<group>";
-		};
-		D6BC1C721D4165BA00C2334C /* aes */ = {
-			isa = PBXGroup;
-			children = (
-				D6BC1C731D4165BA00C2334C /* aes.h */,
-				D6BC1C741D4165BA00C2334C /* aes_via_ace.h */,
-				D6BC1C751D4165BA00C2334C /* aescrypt.c */,
-				D6BC1C761D4165BA00C2334C /* aeskey.c */,
-				D6BC1C771D4165BA00C2334C /* aesopt.h */,
-				D6BC1C781D4165BA00C2334C /* aestab.c */,
-				D6BC1C791D4165BA00C2334C /* aestab.h */,
-				D6BC1C7A1D4165BA00C2334C /* brg_endian.h */,
-				D6BC1C7B1D4165BA00C2334C /* brg_types.h */,
-				D6BC1C7C1D4165BA00C2334C /* entropy.c */,
-				D6BC1C7D1D4165BA00C2334C /* entropy.h */,
-				D6BC1C7E1D4165BA00C2334C /* fileenc.c */,
-				D6BC1C7F1D4165BA00C2334C /* fileenc.h */,
-				D6BC1C801D4165BA00C2334C /* hmac.c */,
-				D6BC1C811D4165BA00C2334C /* hmac.h */,
-				D6BC1C821D4165BA00C2334C /* prng.c */,
-				D6BC1C831D4165BA00C2334C /* prng.h */,
-				D6BC1C841D4165BA00C2334C /* pwd2key.c */,
-				D6BC1C851D4165BA00C2334C /* pwd2key.h */,
-				D6BC1C861D4165BA00C2334C /* sha1.c */,
-				D6BC1C871D4165BA00C2334C /* sha1.h */,
-			);
-			path = aes;
-			sourceTree = "<group>";
-		};
-		D6BC1C8A1D4165BA00C2334C /* minizip */ = {
-			isa = PBXGroup;
-			children = (
-				D6BC1C8B1D4165BA00C2334C /* crypt.h */,
-				D6BC1C8C1D4165BA00C2334C /* ioapi.c */,
-				D6BC1C8D1D4165BA00C2334C /* ioapi.h */,
-				D6BC1C8E1D4165BA00C2334C /* mztools.c */,
-				D6BC1C8F1D4165BA00C2334C /* mztools.h */,
-				D6BC1C901D4165BA00C2334C /* unzip.c */,
-				D6BC1C911D4165BA00C2334C /* unzip.h */,
-				D6BC1C921D4165BA00C2334C /* zip.c */,
-				D6BC1C931D4165BA00C2334C /* zip.h */,
-			);
-			path = minizip;
-			sourceTree = "<group>";
-		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -260,6 +263,7 @@
 						CreatedOnToolsVersion = 8.0;
 						DevelopmentTeam = 76CMF53Q35;
 						DevelopmentTeamName = "International Business Machines Corp.";
+						LastSwiftMigration = 0800;
 						ProvisioningStyle = Automatic;
 					};
 				};
@@ -286,30 +290,31 @@
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				D6BC1C9C1D4165BA00C2334C /* hmac.c in Sources */,
+				D676B4B41D64AAA400A29AE5 /* pwd2key.c in Sources */,
+				D676B4B21D64AAA400A29AE5 /* hmac.c in Sources */,
+				D676B4BB1D64AAA400A29AE5 /* SSZipArchive.m in Sources */,
 				D6BC1C351D41391D00C2334C /* WhiskTokenizer.swift in Sources */,
+				D676B4B71D64AAA400A29AE5 /* mztools.c in Sources */,
 				D6BC1C311D4119FB00C2334C /* ProjectReader.swift in Sources */,
-				D6BC1C991D4165BA00C2334C /* aestab.c in Sources */,
-				D6BC1C9B1D4165BA00C2334C /* fileenc.c in Sources */,
+				D676B4B51D64AAA400A29AE5 /* sha1.c in Sources */,
+				D676B4AF1D64AAA400A29AE5 /* aestab.c in Sources */,
 				D6BC1C321D4119FB00C2334C /* SequenceCode.swift in Sources */,
-				D6BC1C981D4165BA00C2334C /* aeskey.c in Sources */,
-				D6BC1C9D1D4165BA00C2334C /* prng.c in Sources */,
+				D676B4B91D64AAA400A29AE5 /* zip.c in Sources */,
 				D6BC1C2E1D4119FB00C2334C /* Git.swift in Sources */,
-				D6BC1C971D4165BA00C2334C /* aescrypt.c in Sources */,
 				D6BC1C301D4119FB00C2334C /* ProjectManager.swift in Sources */,
-				D6BC1CA11D4165BA00C2334C /* mztools.c in Sources */,
-				D6BC1CA21D4165BA00C2334C /* unzip.c in Sources */,
+				D676B4AE1D64AAA400A29AE5 /* aeskey.c in Sources */,
+				D676B4B81D64AAA400A29AE5 /* unzip.c in Sources */,
+				D676B4B31D64AAA400A29AE5 /* prng.c in Sources */,
 				D6BC1BFF1D40180A00C2334C /* ConsoleIO.swift in Sources */,
-				D6BC1C9F1D4165BA00C2334C /* sha1.c in Sources */,
+				D676B4B11D64AAA400A29AE5 /* fileenc.c in Sources */,
 				D6BC1BF61D4017BE00C2334C /* main.swift in Sources */,
-				D6BC1CA01D4165BA00C2334C /* ioapi.c in Sources */,
+				D676B4BA1D64AAA400A29AE5 /* SSZipArchive+Swift.swift in Sources */,
 				D6BC1C2F1D4119FB00C2334C /* ManifestReader.swift in Sources */,
-				D6BC1CA31D4165BA00C2334C /* zip.c in Sources */,
+				D676B4AD1D64AAA400A29AE5 /* aescrypt.c in Sources */,
 				D6BC1BFD1D4017FD00C2334C /* WhiskInstaller.swift in Sources */,
-				D6BC1CA41D4165BA00C2334C /* SSZipArchive.m in Sources */,
 				D6BC1C331D4119FB00C2334C /* WhiskAPI.swift in Sources */,
-				D6BC1C9E1D4165BA00C2334C /* pwd2key.c in Sources */,
-				D6BC1C9A1D4165BA00C2334C /* entropy.c in Sources */,
+				D676B4B61D64AAA400A29AE5 /* ioapi.c in Sources */,
+				D676B4B01D64AAA400A29AE5 /* entropy.c in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -405,6 +410,7 @@
 			buildSettings = {
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				"SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = "WhiskSwiftTools-Bridging-Header.h";
+				SWIFT_VERSION = 3.0;
 			};
 			name = Debug;
 		};
@@ -412,6 +418,7 @@
 			isa = XCBuildConfiguration;
 			buildSettings = {
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_VERSION = 3.0;
 			};
 			name = Release;
 		};
diff --git a/WhiskSwiftTools.xcodeproj/project.xcworkspace/xcshareddata/WhiskSwiftTools.xcscmblueprint b/WhiskSwiftTools.xcodeproj/project.xcworkspace/xcshareddata/WhiskSwiftTools.xcscmblueprint
index 5b66749..6023f9d 100644
--- a/WhiskSwiftTools.xcodeproj/project.xcworkspace/xcshareddata/WhiskSwiftTools.xcscmblueprint
+++ b/WhiskSwiftTools.xcodeproj/project.xcworkspace/xcshareddata/WhiskSwiftTools.xcscmblueprint
@@ -9,7 +9,7 @@
   },
   "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "06E1D60A-07E3-45BC-8101-A3D050C33727",
   "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : {
-    "65E71B0513DBFB09F39CEEF3A8B769CB93E66994" : "WhiskSwiftTools\/WhiskSwiftTools\/ZipArchive\/",
+    "65E71B0513DBFB09F39CEEF3A8B769CB93E66994" : "ZipArchive\/",
     "E9057848A6186DD9CAE5574816428252CA2E16CD" : "WhiskSwiftTools\/"
   },
   "DVTSourceControlWorkspaceBlueprintNameKey" : "WhiskSwiftTools",
diff --git a/WhiskSwiftTools/ConsoleIO.swift b/WhiskSwiftTools/ConsoleIO.swift
index 653aed7..504cecb 100644
--- a/WhiskSwiftTools/ConsoleIO.swift
+++ b/WhiskSwiftTools/ConsoleIO.swift
@@ -40,7 +40,8 @@
 
 class ConsoleIO {
     class func printUsage() {
-        let executableName = (Process.arguments[0] as NSString).lastPathComponent
+        
+        let executableName = (CommandLine.arguments[0] as NSString).lastPathComponent
         
         print ("usage:")
         print ("To install a project:")
@@ -57,7 +58,7 @@
         print ("Type \(executableName) -h or --help to show usage information")
     }
     
-    func getOption(option: String) -> (option: OptionType, value: String) {
+    func getOption(_ option: String) -> (option: OptionType, value: String) {
         return (OptionType(value: option), option)
     }
 }
diff --git a/WhiskSwiftTools/Git.swift b/WhiskSwiftTools/Git.swift
index b1dab3f..d05e464 100644
--- a/WhiskSwiftTools/Git.swift
+++ b/WhiskSwiftTools/Git.swift
@@ -21,9 +21,9 @@
     
     static let TempZipFile = "/tmp/openwhiskproject.zip"
     
-    class func cloneGitRepo(repo: String, toPath: String, group: DispatchGroup) throws {
-        guard let nsUrl = NSURL(string:repo) else {
-            throw WhiskNetworkError.MalformedUrlString(url: repo, cause: "Cannot create URL from url String")
+    class func cloneGitRepo(_ repo: String, toPath: String, group: DispatchGroup) throws {
+        guard let nsUrl = URL(string:repo) else {
+            throw WhiskNetworkError.malformedUrlString(url: repo, cause: "Cannot create URL from url String")
         }
         
         let sessionConfig = URLSessionConfiguration.default
@@ -65,7 +65,7 @@
             }
             
             group.leave()
-        })
+        } as! (Data?, URLResponse?, Error?) -> Void)
         task.resume()
     }
 }
diff --git a/WhiskSwiftTools/ManifestReader.swift b/WhiskSwiftTools/ManifestReader.swift
index b7d3f3b..930cb71 100644
--- a/WhiskSwiftTools/ManifestReader.swift
+++ b/WhiskSwiftTools/ManifestReader.swift
@@ -18,13 +18,13 @@
 
 class ManifestReader {
     
-    class func readManifest(atPath: NSString) throws -> [String: AnyObject] {
+    class func readManifest(_ atPath: NSString) throws -> [String: AnyObject] {
          
-        return try ManifestReader.parseJson(atPath: atPath)
+        return try ManifestReader.parseJson(atPath)
         
     }
     
-    class func parseJson(atPath: NSString) throws -> [String:AnyObject]  {
+    class func parseJson(_ atPath: NSString) throws -> [String:AnyObject]  {
         do {
             
             let jsonStr = try NSString(contentsOfFile: atPath as String, encoding: String.Encoding.utf8.rawValue)
@@ -34,14 +34,14 @@
                     if let openwhisk = result["openwhisk"] as? [String:AnyObject] {
                         return openwhisk
                     } else {
-                        throw WhiskProjectError.MalformedManifestFile(name: atPath as String, cause: "root of manifest file should be a JSON object called 'openwhisk'")
+                        throw WhiskProjectError.malformedManifestFile(name: atPath as String, cause: "root of manifest file should be a JSON object called 'openwhisk'")
                     }
                 } else {
-                    throw WhiskProjectError.MalformedManifestFile(name: atPath as String, cause: "JSON file does not appear to be an object.  Is in an array?")
+                    throw WhiskProjectError.malformedManifestFile(name: atPath as String, cause: "JSON file does not appear to be an object.  Is in an array?")
                 }
             }
         } catch {
-            throw WhiskProjectError.MalformedManifestFile(name: atPath as String, cause: "Error parsing JSON file contents \(error)")
+            throw WhiskProjectError.malformedManifestFile(name: atPath as String, cause: "Error parsing JSON file contents \(error)")
         }
         
         return [String:AnyObject]()
diff --git a/WhiskSwiftTools/ProjectManager.swift b/WhiskSwiftTools/ProjectManager.swift
index f7ef723..af76287 100644
--- a/WhiskSwiftTools/ProjectManager.swift
+++ b/WhiskSwiftTools/ProjectManager.swift
@@ -16,7 +16,7 @@
 
 import Foundation
 
-public class ProjectManager {
+open class ProjectManager {
     
     let whisk: WhiskAPI!
     let path: String!
@@ -38,7 +38,7 @@
         
     }
     
-    public func deployProject() throws {
+    open func deployProject() throws {
         if (projectReader) != nil {
             
             let group = DispatchGroup()
@@ -49,8 +49,8 @@
                 do {
                     self.projectReader?.clearAll()
                     
-                    if self.projectReader?.detectXcode(path: self.path) == false {
-                        try self.projectReader?.readRootDependencies(clone: true)
+                    if self.projectReader?.detectXcode(self.path) == false {
+                        try self.projectReader?.readRootDependencies(true)
                     }
                     
                     try self.projectReader?.readProjectDirectory()
@@ -72,9 +72,9 @@
             }
             
             switch group.wait(timeout: DispatchTime.distantFuture) {
-            case DispatchTimeoutResult.Success:
+            case DispatchTimeoutResult.success:
                 break
-            case DispatchTimeoutResult.TimedOut:
+            case DispatchTimeoutResult.timedOut:
                 break
                 
             }
@@ -84,7 +84,7 @@
         }
     }
     
-    public func deleteProject() throws {
+    open func deleteProject() throws {
         
         if projectReader != nil {
             let group = DispatchGroup()
@@ -95,8 +95,8 @@
                 do {
                     self.projectReader?.clearAll()
                     
-                    if self.projectReader?.detectXcode(path: self.path) == false {
-                        try self.projectReader?.readRootDependencies(clone: false)
+                    if self.projectReader?.detectXcode(self.path) == false {
+                        try self.projectReader?.readRootDependencies(false)
                     }
                     try self.projectReader?.readProjectDirectory()
                    // self.projectReader?.dumpProjectStructure()
@@ -116,9 +116,9 @@
             }
             
             switch group.wait(timeout: DispatchTime.distantFuture) {
-            case DispatchTimeoutResult.Success:
+            case DispatchTimeoutResult.success:
                 break
-            case DispatchTimeoutResult.TimedOut:
+            case DispatchTimeoutResult.timedOut:
                 break
                 
             }
@@ -128,7 +128,7 @@
     }
     
     
-    public func installSequences() throws {
+    open func installSequences() throws {
         let sequences = projectReader.sequenceDict
         
         let group = DispatchGroup()
@@ -138,17 +138,17 @@
         }
         
         switch group.wait(timeout: DispatchTime.distantFuture) {
-        case DispatchTimeoutResult.Success:
+        case DispatchTimeoutResult.success:
             print("Sequences installed successfully")
             break
-        case DispatchTimeoutResult.TimedOut:
+        case DispatchTimeoutResult.timedOut:
             print("Install sequence timed out")
             break
         }
         
         
     }
-    public func installPackages() throws {
+    open func installPackages() throws {
         let packages = projectReader.packageDict
         
         let group = DispatchGroup()
@@ -158,10 +158,10 @@
         }
         
         switch group.wait(timeout: DispatchTime.distantFuture) {
-        case DispatchTimeoutResult.Success:
+        case DispatchTimeoutResult.success:
             print("Packages installed successfully")
             break
-        case DispatchTimeoutResult.TimedOut:
+        case DispatchTimeoutResult.timedOut:
             print("Install pacakges timed out")
             break
         }
@@ -170,7 +170,7 @@
         
     }
     
-    public func deletePackages() throws {
+    open func deletePackages() throws {
         let packages = projectReader.packageDict
         
         let group = DispatchGroup()
@@ -180,10 +180,10 @@
         }
         
         switch group.wait(timeout: DispatchTime.distantFuture) {
-        case DispatchTimeoutResult.Success:
+        case DispatchTimeoutResult.success:
             print("Packages deleted successfully")
             break
-        case DispatchTimeoutResult.TimedOut:
+        case DispatchTimeoutResult.timedOut:
             print("delete packages timed out")
             break
         }
@@ -191,7 +191,7 @@
         
     }
     
-    public func installRules() throws {
+    open func installRules() throws {
         let rules = projectReader.ruleDict
         
         let group = DispatchGroup()
@@ -201,10 +201,10 @@
         }
         
         switch group.wait(timeout: DispatchTime.distantFuture) {
-        case DispatchTimeoutResult.Success:
+        case DispatchTimeoutResult.success:
             print("Rules installed successfully")
             break
-        case DispatchTimeoutResult.TimedOut:
+        case DispatchTimeoutResult.timedOut:
             print("Install rules timed out")
             break
         }
@@ -213,7 +213,7 @@
         
     }
     
-    public func enableRules() throws {
+    open func enableRules() throws {
         let rules = projectReader.ruleDict
         
         let group = DispatchGroup()
@@ -223,10 +223,10 @@
         }
         
         switch group.wait(timeout: DispatchTime.distantFuture) {
-        case DispatchTimeoutResult.Success:
+        case DispatchTimeoutResult.success:
             print("Rules enabled successfully")
             break
-        case DispatchTimeoutResult.TimedOut:
+        case DispatchTimeoutResult.timedOut:
             print("enable timed out")
             break
         }
@@ -237,7 +237,7 @@
     
     
     
-    public func deleteRules() throws {
+    open func deleteRules() throws {
         let rules = projectReader.ruleDict
         
         let group = DispatchGroup()
@@ -247,10 +247,10 @@
         }
         
         switch group.wait(timeout: DispatchTime.distantFuture) {
-        case DispatchTimeoutResult.Success:
+        case DispatchTimeoutResult.success:
             print("Rules deleted successfully")
             break
-        case DispatchTimeoutResult.TimedOut:
+        case DispatchTimeoutResult.timedOut:
             print("delete rules timed out")
             break
         }
@@ -259,7 +259,7 @@
         
     }
     
-    public func installTriggers() throws {
+    open func installTriggers() throws {
         let triggers = projectReader.triggerDict
         
         let group = DispatchGroup()
@@ -273,10 +273,10 @@
         }
         
         switch group.wait(timeout: DispatchTime.distantFuture) {
-        case DispatchTimeoutResult.Success:
+        case DispatchTimeoutResult.success:
             print("Triggers installed successfully")
             break
-        case DispatchTimeoutResult.TimedOut:
+        case DispatchTimeoutResult.timedOut:
             print("install timed out")
             break
         }
@@ -284,7 +284,7 @@
         
     }
     
-    public func deleteTriggers() throws {
+    open func deleteTriggers() throws {
         let triggers = projectReader.triggerDict
         
         let group = DispatchGroup()
@@ -294,10 +294,10 @@
         }
         
         switch group.wait(timeout: DispatchTime.distantFuture) {
-        case DispatchTimeoutResult.Success:
+        case DispatchTimeoutResult.success:
             print("Triggers deleted successfully success")
             break
-        case DispatchTimeoutResult.TimedOut:
+        case DispatchTimeoutResult.timedOut:
             print("delete triggers timed out")
             break
         }
@@ -306,7 +306,7 @@
         
     }
     
-    public func installActions() throws {
+    open func installActions() throws {
         let actions = projectReader.actionsDict
         
         let group = DispatchGroup()
@@ -322,13 +322,13 @@
             
             var runtimeStr = "nodejs"
             switch runtime {
-            case Runtime.Swift:
+            case Runtime.swift:
                 runtimeStr = "swift"
-            case Runtime.Swift3:
+            case Runtime.swift3:
                 runtimeStr = "swift:3"
-            case Runtime.Python:
+            case Runtime.python:
                 runtimeStr = "python"
-            case Runtime.Java:
+            case Runtime.java:
                 runtimeStr = "java"
             default:
                 break
@@ -339,10 +339,10 @@
         }
         
         switch group.wait(timeout: DispatchTime.distantFuture) {
-        case DispatchTimeoutResult.Success:
+        case DispatchTimeoutResult.success:
             print("Actions installed sucessfully")
             break
-        case DispatchTimeoutResult.TimedOut:
+        case DispatchTimeoutResult.timedOut:
             print("Install actions timed out")
             break
         }
@@ -351,7 +351,7 @@
         
     }
     
-    public func deleteActionsAndSequences() throws {
+    open func deleteActionsAndSequences() throws {
         let actions = projectReader.actionsDict
         let group = DispatchGroup()
         for (name, _) in actions {
@@ -364,10 +364,10 @@
         }
         
         switch group.wait(timeout: DispatchTime.distantFuture) {
-        case DispatchTimeoutResult.Success:
+        case DispatchTimeoutResult.success:
             print("Actions and sequences deleted successfully")
             break
-        case DispatchTimeoutResult.TimedOut:
+        case DispatchTimeoutResult.timedOut:
             print("delete actions and sequences timed out")
             break
         }
diff --git a/WhiskSwiftTools/ProjectReader.swift b/WhiskSwiftTools/ProjectReader.swift
index de3ffe5..1de5c22 100644
--- a/WhiskSwiftTools/ProjectReader.swift
+++ b/WhiskSwiftTools/ProjectReader.swift
@@ -25,20 +25,20 @@
  */
 
 
-public enum WhiskProjectError: ErrorProtocol {
-    case DuplicateNameError(name: String)
-    case MalformedManifestFile(name: String, cause: String)
-    case RuleStateError(type: String, cause: String)
-    case GitRequestError(cause: String)
-    case UnsupportedFeedType(cause: String)
+public enum WhiskProjectError: Error {
+    case duplicateNameError(name: String)
+    case malformedManifestFile(name: String, cause: String)
+    case ruleStateError(type: String, cause: String)
+    case gitRequestError(cause: String)
+    case unsupportedFeedType(cause: String)
 }
 
 enum Runtime {
-    case Swift
-    case Swift3
-    case NodeJS
-    case Java
-    case Python
+    case swift
+    case swift3
+    case nodeJS
+    case java
+    case python
 }
 
 public struct Package {
@@ -78,7 +78,7 @@
 }
 
 
-public class ProjectReader {
+open class ProjectReader {
     
     let BindingsFileName = "root-manifest.json"
     let ManifestFileName = "manifest.json"
@@ -107,29 +107,29 @@
                     let group = DispatchGroup()
                     
                     let zipFilePath = "\(repo)/archive/\(release).zip"
-                    try Git.cloneGitRepo(repo: zipFilePath, toPath: path, group: group)
+                    try Git.cloneGitRepo(zipFilePath, toPath: path, group: group)
                     
                     switch group.wait(timeout: DispatchTime.distantFuture) {
-                    case DispatchTimeoutResult.Success:
+                    case DispatchTimeoutResult.success:
                         let projectName = (repo as NSString).lastPathComponent
                         projectPath = "\(path)/\(projectName)-\(release)/src"
                         break
-                    case DispatchTimeoutResult.TimedOut:
-                        throw WhiskProjectError.GitRequestError(cause: "Failure cloning repo \(repo): request timed out.")
+                    case DispatchTimeoutResult.timedOut:
+                        throw WhiskProjectError.gitRequestError(cause: "Failure cloning repo \(repo): request timed out.")
                     }
                     
                 } catch {
                     print("Error cloning repo \(error)")
                 }
             } else {
-                throw WhiskProjectError.GitRequestError(cause: "Cannot clone, release version must be specified ")
+                throw WhiskProjectError.gitRequestError(cause: "Cannot clone, release version must be specified ")
             }
         } else {
             projectPath = path
         }
     }
     
-    public func dumpProjectStructure() {
+    open func dumpProjectStructure() {
         print("Packages:")
         print("=========")
         for (name, package) in packageDict {
@@ -181,71 +181,72 @@
         
     }
     
-    public func readRootDependencies(clone: Bool) throws {
+    open func readRootDependencies(_ clone: Bool) throws {
         
         let path = projectPath+"/"+BindingsFileName
-        let json = try ManifestReader.parseJson(atPath: path)
+        let json = try ManifestReader.parseJson(path as NSString)
         
         
         if let dependencies = json["dependencies"] {
             for dependency in dependencies as! Array<[String:AnyObject]> {
                 guard let url = dependency["url"] as? NSString else {
                     clearAll()
-                    throw WhiskProjectError.MalformedManifestFile(name: path as String, cause: "Declaration of dependency missing url")
+                    throw WhiskProjectError.malformedManifestFile(name: path as String, cause: "Declaration of dependency missing url")
                 }
                 
-                var repo = url
+                var repo = url as String
                 
                 if url.pathExtension == "git" {
+                    
                     repo = String((repo as String).characters.dropLast(4))
                 }
                 
-                let name = repo.lastPathComponent
+                let name = (repo as NSString).lastPathComponent as NSString
                 
                 var ver = "master"
                 if let version = dependency["version"] as? NSString {
                     ver = version as String
                 }
                 
-                let dep = Dependency(name: name as NSString, url: repo, version: ver)
+                let dep = Dependency(name: name as NSString, url: repo as NSString, version: ver as NSString)
                 dependenciesDict[name] = dep
             }
         }
         
-        try readDependencies(clone: clone)
+        try readDependencies(clone)
     }
     
-    public func readProjectDirectory() throws {
+    open func readProjectDirectory() throws {
         // read project directory
-        try readDirectory(dirPath: projectPath, isDependency: false)
+        try readDirectory(projectPath, isDependency: false)
         
         // read independent directories
     }
     
-    public func readDependencies(clone: Bool) throws {
+    open func readDependencies(_ clone: Bool) throws {
         for (name, dependency) in dependenciesDict {
             
             let group = DispatchGroup()
             
             let zipFilePath = "\(dependency.url)/archive/\(dependency.version).zip"
             if clone == true {
-                try Git.cloneGitRepo(repo: zipFilePath, toPath: projectPath+"/Packages/", group: group)
+                try Git.cloneGitRepo(zipFilePath, toPath: projectPath+"/Packages/", group: group)
             }
             
             switch group.wait(timeout: DispatchTime.distantFuture) {
-            case DispatchTimeoutResult.Success:
+            case DispatchTimeoutResult.success:
                 let packagePath = (name as String)+"-"+(dependency.version as String)
                 let depPath = projectPath+"/Packages/"+packagePath+"/src"
-                try readDirectory(dirPath: depPath, isDependency: true)
+                try readDirectory(depPath, isDependency: true)
                 break
-            case DispatchTimeoutResult.TimedOut:
+            case DispatchTimeoutResult.timedOut:
                 break
             }
             
         }
     }
     
-    public func detectXcode(path: String) -> Bool {
+    open func detectXcode(_ path: String) -> Bool {
         let fileManager = FileManager.default
         if let enumerator: FileManager.DirectoryEnumerator = fileManager.enumerator(atPath: path) {
             while let item = enumerator.nextObject() as? NSString {
@@ -259,9 +260,9 @@
         return false
     }
     
-    public func readDirectory(dirPath: String, isDependency: Bool) throws {
+    open func readDirectory(_ dirPath: String, isDependency: Bool) throws {
         
-        let isXcode = detectXcode(path: dirPath)
+        let isXcode = detectXcode(dirPath)
         
         if isXcode == false {
             let dir: FileManager = FileManager.default
@@ -292,9 +293,9 @@
                                 }
                                 
                             }  else if item.hasSuffix(".swift") {
-                                try addAction(fullPath: fullPath as NSString, item: item, runtime: .Swift)
+                                try addAction(fullPath as NSString, item: item, runtime: .swift)
                             }  else if item.hasSuffix(".js") {
-                                try addAction(fullPath: fullPath as NSString, item: item, runtime: .NodeJS)
+                                try addAction(fullPath as NSString, item: item, runtime: .nodeJS)
                             } else if item.hasSuffix(".json") {
                                 
                                 // in subdirectories we only look for manifest files
@@ -324,8 +325,8 @@
                     
                 }
                 
-                try self.processManifestFiles(manifest: self.bindingsDict)
-                try self.processManifestFiles(manifest: self.manifestDict)
+                try self.processManifestFiles(self.bindingsDict)
+                try self.processManifestFiles(self.manifestDict)
             }
         } else {
             let xcodeProject = WhiskTokenizer(from: dirPath, to:projectPath)
@@ -343,7 +344,7 @@
         }
     }
     
-    func addAction(fullPath: NSString, item: NSString, runtime: Runtime) throws {
+    func addAction(_ fullPath: NSString, item: NSString, runtime: Runtime) throws {
         
         let name = (item.lastPathComponent as NSString).deletingPathExtension
         
@@ -353,24 +354,24 @@
                 let package = item.pathComponents[0]
                 
                 let fullName = "\(package)/\(name)" as NSString
-                if !nameExists(name: fullName) {
+                if !nameExists(fullName) {
                     actionsDict[fullName] = Action(name: fullName, path: fullPath, runtime: runtime, parameters: nil)
                 } else {
                     clearAll()
-                    throw WhiskProjectError.DuplicateNameError(name:fullName as String)
+                    throw WhiskProjectError.duplicateNameError(name:fullName as String)
                 }
             }
         } else {
-            if !nameExists(name: name as NSString) {
+            if !nameExists(name as NSString) {
                 actionsDict[name as NSString] = Action(name: name as NSString, path: fullPath, runtime: runtime, parameters: nil)
             } else {
                 clearAll()
-                throw WhiskProjectError.DuplicateNameError(name: name)
+                throw WhiskProjectError.duplicateNameError(name: name)
             }
         }
     }
     
-    func nameExists(name: NSString) -> Bool {
+    func nameExists(_ name: NSString) -> Bool {
         if actionsDict[name] != nil || packageDict[name] != nil || triggerDict[name] != nil || ruleDict[name] != nil || sequenceDict[name] != nil {
             return true
         }
@@ -378,11 +379,11 @@
         return false
     }
     
-    func processManifestFiles(manifest: [NSString: NSString]) throws {
+    func processManifestFiles(_ manifest: [NSString: NSString]) throws {
         
         for (name, path) in manifest {
             
-            let json = try ManifestReader.parseJson(atPath: path)
+            let json = try ManifestReader.parseJson(path)
             
             var prefix = ""
             if name.pathComponents.count > 1 {
@@ -398,7 +399,7 @@
                         
                         guard let itemName = package["name"] as? String, let bindTo = (package["bindTo"]) as? String else {
                             clearAll()
-                            throw WhiskProjectError.MalformedManifestFile(name: path as String, cause: "Declaration of package binding missing name or bindTo")
+                            throw WhiskProjectError.malformedManifestFile(name: path as String, cause: "Declaration of package binding missing name or bindTo")
                         }
                         
                         let parameters = package["parameters"] as? Array<[String:AnyObject]>
@@ -414,7 +415,7 @@
                         
                         guard let itemName = trigger["name"] as? String else {
                             clearAll()
-                            throw WhiskProjectError.MalformedManifestFile(name: path as String, cause: "Declaration of trigger missing name")
+                            throw WhiskProjectError.malformedManifestFile(name: path as String, cause: "Declaration of trigger missing name")
                         }
                         
                         let parameters = trigger["parameters"] as? Array<[String:AnyObject]>
@@ -433,7 +434,7 @@
                         
                         guard let itemName = rule["name"] as? String, let triggerName = rule["trigger"] as? String, let actionName = rule["action"] as? String else {
                             clearAll()
-                            throw WhiskProjectError.MalformedManifestFile(name: path as String, cause: "Declaration of rule missing name, trigger, or action")
+                            throw WhiskProjectError.malformedManifestFile(name: path as String, cause: "Declaration of rule missing name, trigger, or action")
                         }
                         
                         let item = Rule(name: itemName as NSString, trigger: triggerName as NSString, action: actionName as NSString)
@@ -451,7 +452,7 @@
                     
                     guard let itemName = sequence["name"] as? String, let actions = sequence["actions"] as? Array<String> else {
                         clearAll()
-                        throw WhiskProjectError.MalformedManifestFile(name: path as String, cause: "Declaration of sequence missing name or action list")
+                        throw WhiskProjectError.malformedManifestFile(name: path as String, cause: "Declaration of sequence missing name or action list")
                     }
                     
                     let item = Sequence(name: prefix+itemName as NSString, actions: actions)
@@ -473,14 +474,14 @@
                     
                     guard let itemName = action["action"] as? String else {
                         clearAll()
-                        throw WhiskProjectError.MalformedManifestFile(name: path as String, cause: "Declaration of action parameters in manfiest file is missing \'action\' attribute")
+                        throw WhiskProjectError.malformedManifestFile(name: path as String, cause: "Declaration of action parameters in manfiest file is missing \'action\' attribute")
                     }
                     
                     if let item = actionsDict[(prefix+itemName) as NSString] {
                         var runtime = item.runtime
                         if let kind = action["kind"] as? String {
-                            if runtime == Runtime.Swift && kind == "swift:3" {
-                                runtime = Runtime.Swift3
+                            if runtime == Runtime.swift && kind == "swift:3" {
+                                runtime = Runtime.swift3
                             }
                         }
                         
@@ -489,7 +490,7 @@
                         
                     } else {
                         clearAll()
-                        throw WhiskProjectError.MalformedManifestFile(name: path as String, cause: "Setting parameters for an action \(itemName) that does not exist")
+                        throw WhiskProjectError.malformedManifestFile(name: path as String, cause: "Setting parameters for an action \(itemName) that does not exist")
                     }
                     
                 }
diff --git a/WhiskSwiftTools/WhiskAPI.swift b/WhiskSwiftTools/WhiskAPI.swift
index 402db83..37c7585 100644
--- a/WhiskSwiftTools/WhiskAPI.swift
+++ b/WhiskSwiftTools/WhiskAPI.swift
@@ -16,19 +16,19 @@
 
 import Foundation
 
-public enum WhiskNetworkError: ErrorProtocol {
-    case MalformedUrlString(url: String, cause: String)
-    case QualifiedNameFormat(description: String)
+public enum WhiskNetworkError: Error {
+    case malformedUrlString(url: String, cause: String)
+    case qualifiedNameFormat(description: String)
 }
 
 
 /* Type of Whisk operation requested */
 enum WhiskCallType {
-    case Action
-    case Trigger
-    case Package
-    case Rule
-    case Sequence
+    case action
+    case trigger
+    case package
+    case rule
+    case sequence
 }
 
 public struct WhiskCredentials {
@@ -45,8 +45,8 @@
         // set authorization string
         let loginString = (accessKey+":"+accessToken) as NSString
         
-        let loginData: NSData = loginString.data(using: String.Encoding.utf8.rawValue)!
-        let base64LoginString = loginData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
+        let loginData: Data = loginString.data(using: String.Encoding.utf8.rawValue)!
+        let base64LoginString = loginData.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
         
         return base64LoginString
     }
@@ -124,7 +124,7 @@
                 package = pathParts[1]
                 name = pathParts[2]
             } else {
-                throw WhiskNetworkError.QualifiedNameFormat(description: "Cannot parse \(qName)")
+                throw WhiskNetworkError.qualifiedNameFormat(description: "Cannot parse \(qName)")
             }
         } else {
             if pathParts.count == 1 {
@@ -133,7 +133,7 @@
                 package = pathParts[0]
                 name = pathParts[1]
             } else {
-                throw WhiskNetworkError.QualifiedNameFormat(description: "Cannot parse \(qName)")
+                throw WhiskNetworkError.qualifiedNameFormat(description: "Cannot parse \(qName)")
             }
         }
         
@@ -175,7 +175,7 @@
         case AlarmTriggerFeed:
             try createAlarmsFeed(name: name, namespace: namespace, trigger: trigger, group: group)
         default:
-            throw WhiskProjectError.UnsupportedFeedType(cause: "Feed trigger \(trigger.feed) not supported")
+            throw WhiskProjectError.unsupportedFeedType(cause: "Feed trigger \(trigger.feed) not supported")
         }
     }
     
@@ -183,11 +183,11 @@
         let urlStr: String = whiskBaseURL != nil ? whiskBaseURL! : DefaultBaseURL
         let path = "namespaces/\(namespace)/triggers/\(name)"
         
-        let annotations: [String:AnyObject] = ["value": trigger.feed!, "key": "feed"]
+        let annotations: [String:AnyObject] = ["value": trigger.feed!, "key": "feed" as AnyObject]
         let parameters: [String: [[String:AnyObject]]] = ["annotations": [annotations]]
         
         group.enter()
-        try networkManager.putCall(url: urlStr, path: path, parameters: parameters, group: group) { response, error in
+        try networkManager.putCall(url: urlStr, path: path, parameters: parameters as [String : AnyObject]?, group: group) { response, error in
             
             if let error = error {
                 print("Error creating trigger \(name) for feed \(trigger.feed), error: \(error)")
@@ -213,9 +213,9 @@
                             }
                         }
                         
-                        params?["authKey"] = self.networkManager.whiskCredentials.accessKey+":"+self.networkManager.whiskCredentials.accessToken
-                        params?["lifecycleEvent"] = "CREATE"
-                        params?["triggerName"] = "/"+namespace+"/"+name
+                        params?["authKey"] = "\(self.networkManager.whiskCredentials.accessKey):\(self.networkManager.whiskCredentials.accessToken)" as AnyObject
+                        params?["lifecycleEvent"] = "CREATE" as AnyObject
+                        params?["triggerName"] = ("/"+namespace+"/"+name) as AnyObject
                     }
                     
                     
@@ -252,7 +252,7 @@
         }
         
         let exec = ["kind":kind, "code": code] as [String:String]
-        let limits = ["timeout": 30000, "memory":256] as [String:AnyObject]
+        let limits = ["timeout": 30000 as AnyObject, "memory":256 as AnyObject] as [String:AnyObject]
         
         var whiskParameters: [String:AnyObject] = ["exec":exec as AnyObject, "limits":limits as AnyObject]
         
@@ -317,7 +317,7 @@
         let whiskParameters = ["trigger": triggerName, "action": actionName]
         
         group.enter()
-        try networkManager.putCall(url: urlStr, path: path, parameters: whiskParameters, group: group)
+        try networkManager.putCall(url: urlStr, path: path, parameters: whiskParameters as [String : AnyObject]?, group: group)
         
     }
     
@@ -330,7 +330,7 @@
         
         group.enter()
         
-        try networkManager.postCall(url: urlStr, path: path, parameters: ["status":"active"], group: group) {
+        try networkManager.postCall(url: urlStr, path: path, parameters: ["status":"active" as AnyObject], group: group) {
             response, error in
             if let error = error {
                 print("Error enabling rule \(name), error \(error)")
@@ -352,13 +352,13 @@
         }
         
         let exec = ["kind":"nodejs", "code": SequenceCode.getSequenceCode()] as [String:String]
-        let limits = ["timeout": 30000, "memory":256] as [String:AnyObject]
+        let limits = ["timeout": 30000 as AnyObject, "memory":256 as AnyObject] as [String:AnyObject]
         
         var whiskParameters: [String:AnyObject] = ["exec":exec as AnyObject, "limits":limits as AnyObject]
         
         var paramArray = Array<[String:AnyObject]>()
-        let actionList = ["key": "_actions", "value": actions as AnyObject]
-        paramArray.append(actionList)
+        let actionList = ["key": "_actions", "value": actions as AnyObject] as [String : Any]
+        paramArray.append(actionList as [String : AnyObject])
         whiskParameters["parameters"] = paramArray as AnyObject
         
         
@@ -446,9 +446,9 @@
     func deleteAlarmsFeed(namespace: String, name: String, group: DispatchGroup) throws {
         var params = [String:AnyObject]()
         
-        params["authKey"] = self.networkManager.whiskCredentials.accessKey+":"+self.networkManager.whiskCredentials.accessToken
-        params["lifecycleEvent"] = "DELETE"
-        params["triggerName"] = namespace+"/"+name
+        params["authKey"] = (self.networkManager.whiskCredentials.accessKey+":"+self.networkManager.whiskCredentials.accessToken) as AnyObject
+        params["lifecycleEvent"] = "DELETE" as AnyObject
+        params["triggerName"] = (namespace+"/"+name) as AnyObject
         
         let urlStr: String = whiskBaseURL != nil ? whiskBaseURL! : DefaultBaseURL
         let path = "namespaces/whisk.system/actions/alarms/alarm"
@@ -472,7 +472,7 @@
         let path = "namespaces/\(namespace)/rules/\(name)"
         
         group.enter()
-        try networkManager.postCall(url: urlStr, path: path, parameters: ["status":"inactive"], group: group) { response, error in
+        try networkManager.postCall(url: urlStr, path: path, parameters: ["status":"inactive" as AnyObject], group: group) { response, error in
             
             if let error = error {
                 print("Error disabling rule \(name), error: \(error)")
@@ -509,18 +509,18 @@
         self.urlSession = session
     }
     
-    func putCall(url: String, path: String, parameters: [String:AnyObject]? = nil, group: DispatchGroup, callback: ((response: [String:Any]?, error: ErrorProtocol?) -> Void)? = nil) throws  {
+    func putCall(url: String, path: String, parameters: [String:AnyObject]? = nil, group: DispatchGroup, callback: (([String:Any]?, Error?) -> Void)? = nil) throws  {
         
         let overwritePath = path+"?overwrite=true"
         
         // encode path
         guard let encodedPath = overwritePath.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) else {
-            throw WhiskNetworkError.MalformedUrlString(url: url, cause: "Cannot encode url path \(path)")
+            throw WhiskNetworkError.malformedUrlString(url: url, cause: "Cannot encode url path \(path)")
         }
         
         // create request
         guard let nsUrl = URL(string:url+encodedPath) else {
-            throw WhiskNetworkError.MalformedUrlString(url: url, cause: "Cannot create URL from url String")
+            throw WhiskNetworkError.malformedUrlString(url: url, cause: "Cannot create URL from url String")
         }
         
         var request = URLRequest(url: nsUrl)
@@ -545,14 +545,14 @@
             
             if let error = error {
                 if let callback = callback {
-                    callback(response: nil, error: error)
+                    callback(nil, error)
                 } else {
                     return
                 }
                 
             } else {
                 if let callback = callback {
-                    callback(response: ["status":statusCode, "msg":"PUT call success"], error: nil)
+                    callback(["status":statusCode, "msg":"PUT call success"], nil)
                 }
             }
             
@@ -564,16 +564,16 @@
         
     }
     
-    func deleteCall(url: String, path: String,group: DispatchGroup, callback: ((response: [String:AnyObject]?, error: ErrorProtocol?) -> Void)? = nil) throws {
+    func deleteCall(url: String, path: String,group: DispatchGroup, callback: (([String:AnyObject]?, Error?) -> Void)? = nil) throws {
         
         // encode path
         guard let encodedPath = path.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) else {
-            throw WhiskNetworkError.MalformedUrlString(url: url, cause: "Cannot encode url path \(path)")
+            throw WhiskNetworkError.malformedUrlString(url: url, cause: "Cannot encode url path \(path)")
         }
         
         // create request
         guard let nsUrl = URL(string:url+encodedPath) else {
-            throw WhiskNetworkError.MalformedUrlString(url: url, cause: "Cannot create URL from url String")
+            throw WhiskNetworkError.malformedUrlString(url: url, cause: "Cannot create URL from url String")
         }
         
         var request = URLRequest(url: nsUrl)
@@ -604,13 +604,13 @@
                 if let data = data {
                     do {
                         if let resp = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions()) as? [String:AnyObject] {
-                            callback(response: resp, error: nil)
+                            callback(resp, nil)
                         }
                     } catch {
                         print("Error in DELETE \(error)")
                     }
                 } else {
-                    callback(response: ["status":statusCode], error: nil)
+                    callback(["status":statusCode as AnyObject], nil)
                 }
                 
             }
@@ -623,16 +623,16 @@
         
     }
     
-    func postCall(url: String, path: String, parameters: [String:AnyObject]?, group: DispatchGroup?, callback: (response: [String:Any]?, error: ErrorProtocol?) -> Void) throws {
+    func postCall(url: String, path: String, parameters: [String:AnyObject]?, group: DispatchGroup?, callback: @escaping ([String:Any]?, Error?) -> Void) throws {
         
         // encode path
         guard let encodedPath = path.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed) else {
-            throw WhiskNetworkError.MalformedUrlString(url: url, cause: "Cannot encode url path \(path)")
+            throw WhiskNetworkError.malformedUrlString(url: url, cause: "Cannot encode url path \(path)")
         }
         
         // create request
         guard let nsUrl = URL(string:url+encodedPath) else {
-            throw WhiskNetworkError.MalformedUrlString(url: url, cause: "Cannot create URL from url String")
+            throw WhiskNetworkError.malformedUrlString(url: url, cause: "Cannot create URL from url String")
         }
         
         var request = URLRequest(url: nsUrl)
@@ -656,12 +656,12 @@
             
             if let error = error {
                 print("Error performing network call \(error), status: \(statusCode)")
-                callback(response: nil, error: error)
+                callback(nil, error)
                 return
                 
             } else {
                 
-                callback(response: ["status":statusCode, "description":"Post call success"], error: nil)
+                callback(["status":statusCode, "description":"Post call success"], nil)
             }
             
             if let group = group {
diff --git a/WhiskSwiftTools/WhiskInstaller.swift b/WhiskSwiftTools/WhiskInstaller.swift
index 57383ba..8ea2519 100644
--- a/WhiskSwiftTools/WhiskInstaller.swift
+++ b/WhiskSwiftTools/WhiskInstaller.swift
@@ -26,11 +26,11 @@
     }
     
     func staticMode() {
-        let argCount = Process.argc
-        let argument = Process.arguments[1]
+        let argCount = CommandLine.argc
+        let argument = CommandLine.arguments[1]
 
         if argCount > 2 {
-            projectPath = NSString(string: Process.arguments[2]).expandingTildeInPath as String
+            projectPath = NSString(string: CommandLine.arguments[2]).expandingTildeInPath as String
         }
         
         var offset = 0
@@ -41,7 +41,7 @@
         }
         
         let skipDashIndex = argument.index(argument.startIndex, offsetBy: offset)
-        let (option, value) = consoleIO.getOption(option: argument.substring(from: skipDashIndex))
+        let (option, _) = consoleIO.getOption(argument.substring(from: skipDashIndex))
         
         switch option {
         case .Build:
@@ -95,7 +95,7 @@
                 }
             }
             
-            if let tokens = tokens, namespace = namespace {
+            if let tokens = tokens, let namespace = namespace {
                 let credentials = WhiskCredentials(accessKey: tokens[0], accessToken: tokens[1])
                 return ProjectManager(path: projectPath!, credentials: credentials, namespace: namespace)
             }
diff --git a/WhiskSwiftTools/WhiskTokenizer.swift b/WhiskSwiftTools/WhiskTokenizer.swift
index 1dc2d89..52a2460 100644
--- a/WhiskSwiftTools/WhiskTokenizer.swift
+++ b/WhiskSwiftTools/WhiskTokenizer.swift
@@ -22,9 +22,9 @@
 }
 
 enum TokenState {
-    case InStarComment
-    case InSlashComment
-    case Initial
+    case inStarComment
+    case inSlashComment
+    case initial
     case inClass
     case inClassName
     case inClassQualifier
@@ -32,20 +32,20 @@
     case parseAction
 }
 
-public class WhiskTokenizer {
+open class WhiskTokenizer {
     
     let OpenWhiskActionDirectory = "OpenWhiskActions"
     
     var atPath: String!
     var toPath: String!
-    public var actions = [ActionToken]()
+    open var actions = [ActionToken]()
     
     public init(from: String, to: String) {
         atPath = from
         toPath = to
     }
     
-    public func readXCodeProjectDirectory() throws -> [Action] {
+    open func readXCodeProjectDirectory() throws -> [Action] {
         let dir: FileManager = FileManager.default
         
         var whiskActionArray = [Action]()
@@ -80,7 +80,7 @@
                                         let fileUrl = URL(fileURLWithPath: actionPath)
                                         try action.actionCode.write(to: fileUrl, atomically: false, encoding: String.Encoding.utf8)
                                         
-                                        let whiskAction = Action(name: action.actionName, path: actionPath, runtime: Runtime.Swift, parameters: nil)
+                                        let whiskAction = Action(name: action.actionName as NSString, path: actionPath as NSString, runtime: Runtime.swift, parameters: nil)
                                         
                                         whiskActionArray.append(whiskAction)
                                         
@@ -110,7 +110,7 @@
         let scanner = Scanner(string: str)
         
         var line: NSString?
-        var state = TokenState.Initial
+        var state = TokenState.initial
         var actionArray: [ActionToken]? = [ActionToken]()
         var actionName = ""
         var actionCode = ""
@@ -133,11 +133,11 @@
             if trimmedLine.hasPrefix("//") {
                 //print("Skipping comment")
             } else if trimmedLine.hasPrefix("/*") {
-                state = TokenState.InStarComment
+                state = TokenState.inStarComment
             } else {
                 
                 switch state {
-                case .Initial:
+                case .initial:
                     if trimmedLine.hasPrefix("class") {
                         
                         let classStr = trimmedLine.components(separatedBy: ":")
@@ -184,14 +184,14 @@
                         let newAction = ActionToken(actionName: actionName, actionCode: actionCode)
                         
                         actionArray?.append(newAction)
-                        state = TokenState.Initial
+                        state = TokenState.initial
                         actionName = ""
                         actionCode = ""
                         
                         leftBracketCount = 0
                         rightBracketCount = 0
                         
-                        state = TokenState.Initial
+                        state = TokenState.initial
                         
                     } else {
                         
@@ -205,9 +205,9 @@
                         }
                     }
                     
-                case .InStarComment:
+                case .inStarComment:
                     if trimmedLine.hasSuffix("*/") {
-                        state = TokenState.Initial
+                        state = TokenState.initial
                     }
                 default:
                     //print("Don't care")
diff --git a/WhiskSwiftTools/main.swift b/WhiskSwiftTools/main.swift
index e564be5..76790c5 100644
--- a/WhiskSwiftTools/main.swift
+++ b/WhiskSwiftTools/main.swift
@@ -18,7 +18,7 @@
 
 let installer = WhiskInstaller()
 
-if Process.argc < 2 {
+if CommandLine.argc < 2 {
     ConsoleIO.printUsage()
 } else {
     installer.staticMode()