Merge pull request #325 from billhollings/master

 Refactor the build environment.
diff --git a/.travis.yml b/.travis.yml
index c033ef1..33c4543 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -14,6 +14,6 @@
     - External
 
 script:
-  - xcodebuild -scheme "MoltenVK Package (Release)"
+  - xcodebuild -scheme "MoltenVK Package"
   - xcodebuild -workspace Demos/Demos.xcworkspace -scheme "Cube-macOS"
 
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/project.pbxproj b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/project.pbxproj
index f6e302d..992d96c 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/project.pbxproj
+++ b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/project.pbxproj
@@ -27,12 +27,6 @@
 		A964BD3E1E4EA6FC00CA9AF1 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A964BC611E4EA6FC00CA9AF1 /* util.cpp */; };
 		A964BD3F1E4EA6FC00CA9AF1 /* util_init.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A964BC631E4EA6FC00CA9AF1 /* util_init.cpp */; };
 		A964BD401E4EA6FC00CA9AF1 /* util_init.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A964BC631E4EA6FC00CA9AF1 /* util_init.cpp */; };
-		A9B5D09C1CF8830B00D7CBDD /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A9B5D09B1CF8830B00D7CBDD /* libc++.tbd */; };
-		A9B5D09E1CF8831400D7CBDD /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A9B5D09D1CF8831400D7CBDD /* libc++.tbd */; };
-		A9B5D0A01CF8834600D7CBDD /* MoltenVK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9B5D09F1CF8834600D7CBDD /* MoltenVK.framework */; };
-		A9B5D0A21CF8835500D7CBDD /* MoltenVK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9B5D0A11CF8835500D7CBDD /* MoltenVK.framework */; };
-		A9B5D0A41CF8837900D7CBDD /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9B5D0A31CF8837900D7CBDD /* MoltenVKGLSLToSPIRVConverter.framework */; };
-		A9B5D0A61CF8838E00D7CBDD /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9B5D0A51CF8838E00D7CBDD /* MoltenVKGLSLToSPIRVConverter.framework */; };
 		A9B67B781C3AAE9800373FFD /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B6C1C3AAE9800373FFD /* AppDelegate.m */; };
 		A9B67B7A1C3AAE9800373FFD /* DemoViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B6F1C3AAE9800373FFD /* DemoViewController.mm */; };
 		A9B67B7C1C3AAE9800373FFD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B711C3AAE9800373FFD /* main.m */; };
@@ -45,23 +39,15 @@
 		A9B67B8F1C3AAEA200373FFD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B871C3AAEA200373FFD /* main.m */; };
 		A9B67B901C3AAEA200373FFD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A9B67B8A1C3AAEA200373FFD /* Main.storyboard */; };
 		A9B67B911C3AAEA200373FFD /* macOS.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A9B67B8B1C3AAEA200373FFD /* macOS.xcassets */; };
+		A9C2ABA2218505B000DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C2ABA0218505B000DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */; };
+		A9C2ABA3218505B000DDBC03 /* MoltenVK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C2ABA1218505B000DDBC03 /* MoltenVK.framework */; };
+		A9C2ABA6218505CB00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C2ABA4218505CB00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */; };
+		A9C2ABA7218505CB00DDBC03 /* MoltenVK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C2ABA5218505CB00DDBC03 /* MoltenVK.framework */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
-		1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
-		1D3623EB0D0F72F000981E51 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
 		1D6058910D05DD3D006BFB54 /* API-Samples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "API-Samples.app"; sourceTree = BUILT_PRODUCTS_DIR; };
-		1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
-		2D500B990D5A79CF00DBA0E3 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
-		A900B1A21B5EAA1C00150D60 /* libc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.dylib"; path = "usr/lib/libc++.dylib"; sourceTree = SDKROOT; };
-		A90941BB1C582DF40094110D /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = "../../../../../../../../Library/Developer/Xcode/DerivedData/VulkanSamples-emusmkeclqfwfncmwqpcvdzumhpu/Build/Products/Release/MoltenVKGLSLToSPIRVConverter.framework"; sourceTree = "<group>"; };
-		A9096E4E1F7EF10300DFBEA6 /* IOSurface.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOSurface.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/System/Library/Frameworks/IOSurface.framework; sourceTree = DEVELOPER_DIR; };
 		A92F37071C7E1B2B008F8BC9 /* Samples.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Samples.h; sourceTree = "<group>"; };
-		A92F3CED1C7E5E9D008F8BC9 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../MoltenShaderConverter/build/Debug/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
-		A92F3CEF1C7E5EB5008F8BC9 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../MoltenShaderConverter/build/Debug/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
-		A92F3CF11C7E5EBF008F8BC9 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = "../../../MoltenShaderConverter/build/Debug-iphoneos/MoltenVKGLSLToSPIRVConverter.framework"; sourceTree = "<group>"; };
-		A94A67231B7BDE9B00F6D7C4 /* MetalGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalGL.framework; path = ../../MetalGL/macOS/MetalGL.framework; sourceTree = "<group>"; };
-		A94A67241B7BDE9B00F6D7C4 /* MetalGLShaderConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalGLShaderConverter.framework; path = ../../MetalGLShaderConverter/macOS/MetalGLShaderConverter.framework; sourceTree = "<group>"; };
 		A95C05021C98FC1100CC653D /* blue.ppm */ = {isa = PBXFileReference; lastKnownFileType = file; path = blue.ppm; sourceTree = "<group>"; };
 		A95C05031C98FC1100CC653D /* cube_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cube_data.h; sourceTree = "<group>"; };
 		A95C05041C98FC1100CC653D /* green.ppm */ = {isa = PBXFileReference; lastKnownFileType = file; path = green.ppm; sourceTree = "<group>"; };
@@ -71,8 +57,6 @@
 		A95C05081C98FC1100CC653D /* red.ppm */ = {isa = PBXFileReference; lastKnownFileType = file; path = red.ppm; sourceTree = "<group>"; };
 		A95C05091C98FC1100CC653D /* spotlight.ppm */ = {isa = PBXFileReference; lastKnownFileType = file; path = spotlight.ppm; sourceTree = "<group>"; };
 		A95C050A1C98FC1100CC653D /* yellow.ppm */ = {isa = PBXFileReference; lastKnownFileType = file; path = yellow.ppm; sourceTree = "<group>"; };
-		A95C07051C98FDB800CC653D /* MoltenSPIRVToMSLConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenSPIRVToMSLConverter.framework; path = "../../../../MoltenShaderConverter/build/Debug-iphoneos/MoltenSPIRVToMSLConverter.framework"; sourceTree = "<group>"; };
-		A95C07071C98FDD400CC653D /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = "../../../../../../../../../Library/Developer/Xcode/DerivedData/LunarGSamples-csovmpqhztbhjscdjbysjxxoqgvu/Build/Products/Debug/MoltenVKGLSLToSPIRVConverter.framework"; sourceTree = "<group>"; };
 		A964BAF11E4E95E500CA9AF1 /* copy_blit_image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = copy_blit_image.cpp; sourceTree = "<group>"; };
 		A964BAF51E4E968F00CA9AF1 /* 15-draw_cube.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "15-draw_cube.cpp"; sourceTree = "<group>"; };
 		A964BAF91E4E96B400CA9AF1 /* draw_subpasses.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = draw_subpasses.cpp; sourceTree = "<group>"; };
@@ -106,18 +90,6 @@
 		A964BC631E4EA6FC00CA9AF1 /* util_init.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = util_init.cpp; sourceTree = "<group>"; };
 		A964BC641E4EA6FC00CA9AF1 /* util_init.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = util_init.hpp; sourceTree = "<group>"; };
 		A977BCFE1B66BB010067E5BF /* API-Samples.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "API-Samples.app"; sourceTree = BUILT_PRODUCTS_DIR; };
-		A977BD211B67186B0067E5BF /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/AppKit.framework; sourceTree = DEVELOPER_DIR; };
-		A977BD221B67186B0067E5BF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
-		A977BD231B67186B0067E5BF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
-		A977BD251B67186B0067E5BF /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Metal.framework; sourceTree = DEVELOPER_DIR; };
-		A977BD261B67186B0067E5BF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
-		A9A222171B5D69F40050A5F9 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };
-		A9B5D09B1CF8830B00D7CBDD /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
-		A9B5D09D1CF8831400D7CBDD /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/usr/lib/libc++.tbd"; sourceTree = DEVELOPER_DIR; };
-		A9B5D09F1CF8834600D7CBDD /* MoltenVK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVK.framework; path = ../../../../Package/Latest/MoltenVK/macOS/MoltenVK.framework; sourceTree = "<group>"; };
-		A9B5D0A11CF8835500D7CBDD /* MoltenVK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVK.framework; path = ../../../../Package/Latest/MoltenVK/iOS/MoltenVK.framework; sourceTree = "<group>"; };
-		A9B5D0A31CF8837900D7CBDD /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../../Package/Latest/MoltenShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
-		A9B5D0A51CF8838E00D7CBDD /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../../Package/Latest/MoltenShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
 		A9B67B6B1C3AAE9800373FFD /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
 		A9B67B6C1C3AAE9800373FFD /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
 		A9B67B6E1C3AAE9800373FFD /* DemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoViewController.h; sourceTree = "<group>"; };
@@ -138,12 +110,10 @@
 		A9B67B881C3AAEA200373FFD /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = "<group>"; };
 		A9B67B8A1C3AAEA200373FFD /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
 		A9B67B8B1C3AAEA200373FFD /* macOS.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = macOS.xcassets; sourceTree = "<group>"; };
-		A9B6B75F1C0F795000A9E33A /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.1.sdk/System/Library/Frameworks/CoreAudio.framework; sourceTree = DEVELOPER_DIR; };
-		A9B6B7641C0F795D00A9E33A /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
-		A9BF67C21C582EC900B8CF77 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = "../../../MoltenShaderConverter/build/Debug-iphoneos/MoltenVKGLSLToSPIRVConverter.framework"; sourceTree = "<group>"; };
-		A9CDEA271B6A782C00F7B008 /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; };
-		A9E264761B671B0A00FE691A /* libc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.dylib"; path = "Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libc++.dylib"; sourceTree = DEVELOPER_DIR; };
-		BA240AC10FEFE77A00DE852D /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
+		A9C2ABA0218505B000DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
+		A9C2ABA1218505B000DDBC03 /* MoltenVK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVK.framework; path = ../../../MoltenVK/iOS/framework/MoltenVK.framework; sourceTree = "<group>"; };
+		A9C2ABA4218505CB00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
+		A9C2ABA5218505CB00DDBC03 /* MoltenVK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVK.framework; path = ../../../MoltenVK/macOS/framework/MoltenVK.framework; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -151,9 +121,8 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9B5D0A21CF8835500D7CBDD /* MoltenVK.framework in Frameworks */,
-				A9B5D0A61CF8838E00D7CBDD /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */,
-				A9B5D09E1CF8831400D7CBDD /* libc++.tbd in Frameworks */,
+				A9C2ABA3218505B000DDBC03 /* MoltenVK.framework in Frameworks */,
+				A9C2ABA2218505B000DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -161,9 +130,8 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9B5D0A01CF8834600D7CBDD /* MoltenVK.framework in Frameworks */,
-				A9B5D0A41CF8837900D7CBDD /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */,
-				A9B5D09C1CF8830B00D7CBDD /* libc++.tbd in Frameworks */,
+				A9C2ABA7218505CB00DDBC03 /* MoltenVK.framework in Frameworks */,
+				A9C2ABA6218505CB00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -186,37 +154,12 @@
 				A95C03971C98FBED00CC653D /* API-Samples */,
 				A9B67B6A1C3AAE9800373FFD /* iOS */,
 				A9B67B811C3AAEA200373FFD /* macOS */,
-				29B97323FDCFA39411CA2CEA /* Frameworks */,
 				19C28FACFE9D520D11CA2CBB /* Products */,
+				A9C2AB9F218505B000DDBC03 /* Frameworks */,
 			);
 			name = CustomTemplate;
 			sourceTree = "<group>";
 		};
-		29B97323FDCFA39411CA2CEA /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				A9096E4E1F7EF10300DFBEA6 /* IOSurface.framework */,
-				A9B5D0A51CF8838E00D7CBDD /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A9B5D0A31CF8837900D7CBDD /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A9B5D0A11CF8835500D7CBDD /* MoltenVK.framework */,
-				A9B5D09F1CF8834600D7CBDD /* MoltenVK.framework */,
-				A9B5D09D1CF8831400D7CBDD /* libc++.tbd */,
-				A9B5D09B1CF8830B00D7CBDD /* libc++.tbd */,
-				A95C07071C98FDD400CC653D /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A95C07051C98FDB800CC653D /* MoltenSPIRVToMSLConverter.framework */,
-				A92F3CF11C7E5EBF008F8BC9 /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A92F3CEF1C7E5EB5008F8BC9 /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A92F3CED1C7E5E9D008F8BC9 /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A9BF67C21C582EC900B8CF77 /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A90941BB1C582DF40094110D /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A9B6B7641C0F795D00A9E33A /* CoreAudio.framework */,
-				A9B6B75F1C0F795000A9E33A /* CoreAudio.framework */,
-				A9ADEC601B6EC2EB00DBA48C /* iOS */,
-				A9ADEC611B6EC2F300DBA48C /* macOS */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
 		A95C03971C98FBED00CC653D /* API-Samples */ = {
 			isa = PBXGroup;
 			children = (
@@ -498,36 +441,6 @@
 			path = utils;
 			sourceTree = "<group>";
 		};
-		A9ADEC601B6EC2EB00DBA48C /* iOS */ = {
-			isa = PBXGroup;
-			children = (
-				A9A222171B5D69F40050A5F9 /* Metal.framework */,
-				BA240AC10FEFE77A00DE852D /* OpenGLES.framework */,
-				1D3623EB0D0F72F000981E51 /* CoreGraphics.framework */,
-				2D500B990D5A79CF00DBA0E3 /* QuartzCore.framework */,
-				1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
-				1D30AB110D05D00D00671497 /* Foundation.framework */,
-				A9CDEA271B6A782C00F7B008 /* GLKit.framework */,
-				A900B1A21B5EAA1C00150D60 /* libc++.dylib */,
-			);
-			name = iOS;
-			sourceTree = "<group>";
-		};
-		A9ADEC611B6EC2F300DBA48C /* macOS */ = {
-			isa = PBXGroup;
-			children = (
-				A94A67231B7BDE9B00F6D7C4 /* MetalGL.framework */,
-				A94A67241B7BDE9B00F6D7C4 /* MetalGLShaderConverter.framework */,
-				A9E264761B671B0A00FE691A /* libc++.dylib */,
-				A977BD251B67186B0067E5BF /* Metal.framework */,
-				A977BD261B67186B0067E5BF /* QuartzCore.framework */,
-				A977BD211B67186B0067E5BF /* AppKit.framework */,
-				A977BD221B67186B0067E5BF /* CoreGraphics.framework */,
-				A977BD231B67186B0067E5BF /* Foundation.framework */,
-			);
-			name = macOS;
-			sourceTree = "<group>";
-		};
 		A9B67B6A1C3AAE9800373FFD /* iOS */ = {
 			isa = PBXGroup;
 			children = (
@@ -578,6 +491,17 @@
 			path = Resources;
 			sourceTree = "<group>";
 		};
+		A9C2AB9F218505B000DDBC03 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				A9C2ABA5218505CB00DDBC03 /* MoltenVK.framework */,
+				A9C2ABA4218505CB00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */,
+				A9C2ABA1218505B000DDBC03 /* MoltenVK.framework */,
+				A9C2ABA0218505B000DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -721,7 +645,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				DEVELOPMENT_TEAM = "";
 				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/iOS\"",
+					"\"$(SRCROOT)/../../../MoltenVK/iOS/framework\"",
 					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS\"",
 				);
 				GCC_PREFIX_HEADER = "$(SRCROOT)/iOS/Prefix.pch";
@@ -747,7 +671,7 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				DEVELOPMENT_TEAM = "";
 				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/iOS\"",
+					"\"$(SRCROOT)/../../../MoltenVK/iOS/framework\"",
 					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS\"",
 				);
 				GCC_PREFIX_HEADER = "$(SRCROOT)/iOS/Prefix.pch";
@@ -769,7 +693,7 @@
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				COMBINE_HIDPI_IMAGES = YES;
 				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/macOS\"",
+					"\"$(SRCROOT)/../../../MoltenVK/macOS/framework\"",
 					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS\"",
 				);
 				GCC_PREFIX_HEADER = "$(SRCROOT)/macOS/Prefix.pch";
@@ -792,7 +716,7 @@
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				COMBINE_HIDPI_IMAGES = YES;
 				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/macOS\"",
+					"\"$(SRCROOT)/../../../MoltenVK/macOS/framework\"",
 					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS\"",
 				);
 				GCC_PREFIX_HEADER = "$(SRCROOT)/macOS/Prefix.pch";
diff --git a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj
index 292c609..d3f84da 100644
--- a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj
+++ b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj
@@ -7,16 +7,6 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		A904B5711C9A08C90008C013 /* cube-frag.spv in Resources */ = {isa = PBXBuildFile; fileRef = A904B52E1C9A08C90008C013 /* cube-frag.spv */; };
-		A904B5721C9A08C90008C013 /* cube-frag.spv in Resources */ = {isa = PBXBuildFile; fileRef = A904B52E1C9A08C90008C013 /* cube-frag.spv */; };
-		A904B5751C9A08C90008C013 /* cube-vert.spv in Resources */ = {isa = PBXBuildFile; fileRef = A904B52F1C9A08C90008C013 /* cube-vert.spv */; };
-		A904B5761C9A08C90008C013 /* cube-vert.spv in Resources */ = {isa = PBXBuildFile; fileRef = A904B52F1C9A08C90008C013 /* cube-vert.spv */; };
-		A91F43A01EDDD46B00733D01 /* libMoltenVK.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A91F439F1EDDD46B00733D01 /* libMoltenVK.dylib */; };
-		A91F43A51EDDD5CF00733D01 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A91F43A41EDDD5CF00733D01 /* libc++.tbd */; };
-		A91F43A61EDDD61100733D01 /* libMoltenVK.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A91F439F1EDDD46B00733D01 /* libMoltenVK.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
-		A91F43A71EDDD61D00733D01 /* libMoltenVK.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A9B2A5551D7E4FB300F66656 /* libMoltenVK.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
-		A9A262E91CF0C60F00A87A75 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A9A262E71CF0C60500A87A75 /* libc++.tbd */; };
-		A9B2A5561D7E4FB300F66656 /* libMoltenVK.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A9B2A5551D7E4FB300F66656 /* libMoltenVK.dylib */; };
 		A9B53B151C3AC0BE00ABC6F6 /* macOS.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A9B67B8B1C3AAEA200373FFD /* macOS.xcassets */; };
 		A9B53B161C3AC0BE00ABC6F6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A9B67B8A1C3AAEA200373FFD /* Main.storyboard */; };
 		A9B53B181C3AC0BE00ABC6F6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B831C3AAEA200373FFD /* AppDelegate.m */; };
@@ -29,6 +19,10 @@
 		A9B53B341C3AC15200ABC6F6 /* DemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B6F1C3AAE9800373FFD /* DemoViewController.m */; };
 		A9B53B351C3AC15200ABC6F6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B6C1C3AAE9800373FFD /* AppDelegate.m */; };
 		A9B53B361C3AC15200ABC6F6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B711C3AAE9800373FFD /* main.m */; };
+		A9C2ABAC2185086D00DDBC03 /* libMoltenVK.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C2ABAB2185086D00DDBC03 /* libMoltenVK.dylib */; };
+		A9C2ABAD2185087500DDBC03 /* libMoltenVK.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C2ABA92185085B00DDBC03 /* libMoltenVK.dylib */; };
+		A9C2ABB02185098A00DDBC03 /* libMoltenVK.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A9C2ABAB2185086D00DDBC03 /* libMoltenVK.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
+		A9C2ABB12185099500DDBC03 /* libMoltenVK.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A9C2ABA92185085B00DDBC03 /* libMoltenVK.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
 /* End PBXBuildFile section */
 
 /* Begin PBXCopyFilesBuildPhase section */
@@ -38,7 +32,7 @@
 			dstPath = "";
 			dstSubfolderSpec = 6;
 			files = (
-				A91F43A61EDDD61100733D01 /* libMoltenVK.dylib in CopyFiles */,
+				A9C2ABB02185098A00DDBC03 /* libMoltenVK.dylib in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -48,23 +42,16 @@
 			dstPath = "";
 			dstSubfolderSpec = 6;
 			files = (
-				A91F43A71EDDD61D00733D01 /* libMoltenVK.dylib in CopyFiles */,
+				A9C2ABB12185099500DDBC03 /* libMoltenVK.dylib in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		A904B52E1C9A08C90008C013 /* cube-frag.spv */ = {isa = PBXFileReference; lastKnownFileType = file; path = "cube-frag.spv"; sourceTree = "<group>"; };
-		A904B52F1C9A08C90008C013 /* cube-vert.spv */ = {isa = PBXFileReference; lastKnownFileType = file; path = "cube-vert.spv"; sourceTree = "<group>"; };
 		A904B5301C9A08C90008C013 /* cube.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cube.c; sourceTree = "<group>"; };
 		A904B5311C9A08C90008C013 /* cube.frag */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = cube.frag; sourceTree = "<group>"; };
 		A904B5331C9A08C90008C013 /* cube.vert */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; path = cube.vert; sourceTree = "<group>"; };
-		A9096E501F7EF11A00DFBEA6 /* IOSurface.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOSurface.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/System/Library/Frameworks/IOSurface.framework; sourceTree = DEVELOPER_DIR; };
-		A91F439F1EDDD46B00733D01 /* libMoltenVK.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libMoltenVK.dylib; path = ../../../MoltenVK/iOS/libMoltenVK.dylib; sourceTree = "<group>"; };
-		A91F43A41EDDD5CF00733D01 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/usr/lib/libc++.tbd"; sourceTree = DEVELOPER_DIR; };
-		A9A262E71CF0C60500A87A75 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
-		A9B2A5551D7E4FB300F66656 /* libMoltenVK.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libMoltenVK.dylib; path = ../../../MoltenVK/macOS/libMoltenVK.dylib; sourceTree = "<group>"; };
 		A9B53B271C3AC0BE00ABC6F6 /* Cube.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cube.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		A9B53B431C3AC15200ABC6F6 /* Cube.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cube.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		A9B67B6B1C3AAE9800373FFD /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
@@ -87,8 +74,8 @@
 		A9B67B881C3AAEA200373FFD /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = "<group>"; };
 		A9B67B8A1C3AAEA200373FFD /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
 		A9B67B8B1C3AAEA200373FFD /* macOS.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = macOS.xcassets; sourceTree = "<group>"; };
-		A9E34B841CECF28700E40A7F /* MoltenVK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVK.framework; path = ../../../iOS/MoltenVK.framework; sourceTree = "<group>"; };
-		A9E34B871CECF29800E40A7F /* MoltenVK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVK.framework; path = ../../../macOS/MoltenVK.framework; sourceTree = "<group>"; };
+		A9C2ABA92185085B00DDBC03 /* libMoltenVK.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libMoltenVK.dylib; path = ../../../MoltenVK/macOS/dynamic/libMoltenVK.dylib; sourceTree = "<group>"; };
+		A9C2ABAB2185086D00DDBC03 /* libMoltenVK.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libMoltenVK.dylib; path = ../../../MoltenVK/iOS/dynamic/libMoltenVK.dylib; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -96,8 +83,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9B2A5561D7E4FB300F66656 /* libMoltenVK.dylib in Frameworks */,
-				A9A262E91CF0C60F00A87A75 /* libc++.tbd in Frameworks */,
+				A9C2ABAD2185087500DDBC03 /* libMoltenVK.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -105,8 +91,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A91F43A01EDDD46B00733D01 /* libMoltenVK.dylib in Frameworks */,
-				A91F43A51EDDD5CF00733D01 /* libc++.tbd in Frameworks */,
+				A9C2ABAC2185086D00DDBC03 /* libMoltenVK.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -128,8 +113,8 @@
 				A904B52C1C9A08C80008C013 /* cube */,
 				A9B67B6A1C3AAE9800373FFD /* iOS */,
 				A9B67B811C3AAEA200373FFD /* macOS */,
-				A9295EAA1CECEF0900EFC483 /* Frameworks */,
 				19C28FACFE9D520D11CA2CBB /* Products */,
+				A9C2ABA82185085B00DDBC03 /* Frameworks */,
 			);
 			name = CustomTemplate;
 			sourceTree = "<group>";
@@ -137,8 +122,6 @@
 		A904B52C1C9A08C80008C013 /* cube */ = {
 			isa = PBXGroup;
 			children = (
-				A904B52E1C9A08C90008C013 /* cube-frag.spv */,
-				A904B52F1C9A08C90008C013 /* cube-vert.spv */,
 				A904B5301C9A08C90008C013 /* cube.c */,
 				A904B5311C9A08C90008C013 /* cube.frag */,
 				A904B5331C9A08C90008C013 /* cube.vert */,
@@ -147,20 +130,6 @@
 			path = "../Vulkan-Tools/cube";
 			sourceTree = "<group>";
 		};
-		A9295EAA1CECEF0900EFC483 /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				A9096E501F7EF11A00DFBEA6 /* IOSurface.framework */,
-				A91F439F1EDDD46B00733D01 /* libMoltenVK.dylib */,
-				A9B2A5551D7E4FB300F66656 /* libMoltenVK.dylib */,
-				A9E34B841CECF28700E40A7F /* MoltenVK.framework */,
-				A9E34B871CECF29800E40A7F /* MoltenVK.framework */,
-				A9A262E71CF0C60500A87A75 /* libc++.tbd */,
-				A91F43A41EDDD5CF00733D01 /* libc++.tbd */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
 		A9B67B6A1C3AAE9800373FFD /* iOS */ = {
 			isa = PBXGroup;
 			children = (
@@ -211,6 +180,15 @@
 			path = Resources;
 			sourceTree = "<group>";
 		};
+		A9C2ABA82185085B00DDBC03 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				A9C2ABAB2185086D00DDBC03 /* libMoltenVK.dylib */,
+				A9C2ABA92185085B00DDBC03 /* libMoltenVK.dylib */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXNativeTarget section */
@@ -218,7 +196,6 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = A9B53B241C3AC0BE00ABC6F6 /* Build configuration list for PBXNativeTarget "Cube-macOS" */;
 			buildPhases = (
-				A9BA29C5204F24D400EA6575 /* Generate SPIR-V shaders */,
 				A9B53B141C3AC0BE00ABC6F6 /* Resources */,
 				A9B53B171C3AC0BE00ABC6F6 /* Sources */,
 				A9B53B1B1C3AC0BE00ABC6F6 /* Frameworks */,
@@ -237,7 +214,6 @@
 			isa = PBXNativeTarget;
 			buildConfigurationList = A9B53B401C3AC15200ABC6F6 /* Build configuration list for PBXNativeTarget "Cube-iOS" */;
 			buildPhases = (
-				A9BA29C6204F298800EA6575 /* Generate SPIR-V shaders */,
 				A9B53B2E1C3AC15200ABC6F6 /* Resources */,
 				A9B53B331C3AC15200ABC6F6 /* Sources */,
 				A9B53B371C3AC15200ABC6F6 /* Frameworks */,
@@ -290,8 +266,6 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A904B5761C9A08C90008C013 /* cube-vert.spv in Resources */,
-				A904B5721C9A08C90008C013 /* cube-frag.spv in Resources */,
 				A9B53B151C3AC0BE00ABC6F6 /* macOS.xcassets in Resources */,
 				A9B53B161C3AC0BE00ABC6F6 /* Main.storyboard in Resources */,
 			);
@@ -301,48 +275,15 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A904B5751C9A08C90008C013 /* cube-vert.spv in Resources */,
 				A9B53B2F1C3AC15200ABC6F6 /* Icon.png in Resources */,
 				A9B53B301C3AC15200ABC6F6 /* Main.storyboard in Resources */,
 				A9B53B311C3AC15200ABC6F6 /* Default~ipad.png in Resources */,
 				A9B53B321C3AC15200ABC6F6 /* Default-568h@2x.png in Resources */,
-				A904B5711C9A08C90008C013 /* cube-frag.spv in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXResourcesBuildPhase section */
 
-/* Begin PBXShellScriptBuildPhase section */
-		A9BA29C5204F24D400EA6575 /* Generate SPIR-V shaders */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Generate SPIR-V shaders";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "set -e\n\n\"${PROJECT_DIR}/../../../MoltenVKShaderConverter/Tools/MoltenVKShaderConverter\" -gi -so -xs \"-\" -d \"${PROJECT_DIR}/../Vulkan-Tools/cube\"\n";
-		};
-		A9BA29C6204F298800EA6575 /* Generate SPIR-V shaders */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Generate SPIR-V shaders";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "set -e\n\n\"${PROJECT_DIR}/../../../MoltenVKShaderConverter/Tools/MoltenVKShaderConverter\" -gi -so -xs \"-\" -d \"${PROJECT_DIR}/../Vulkan-Tools/cube\"\n";
-		};
-/* End PBXShellScriptBuildPhase section */
-
 /* Begin PBXSourcesBuildPhase section */
 		A9B53B171C3AC0BE00ABC6F6 /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
@@ -379,7 +320,7 @@
 				);
 				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "@executable_path";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/macOS\"";
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/macOS/dynamic\"";
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				PRODUCT_NAME = Cube;
 				SDKROOT = macosx;
@@ -398,7 +339,7 @@
 				);
 				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info.plist";
 				LD_RUNPATH_SEARCH_PATHS = "@executable_path";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/macOS\"";
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/macOS/dynamic\"";
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				PRODUCT_NAME = Cube;
 				SDKROOT = macosx;
@@ -418,7 +359,7 @@
 				INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
 				LD_RUNPATH_SEARCH_PATHS = "@executable_path";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/iOS\"";
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/iOS/dynamic\"";
 				PRODUCT_NAME = Cube;
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
@@ -439,7 +380,7 @@
 				INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
 				LD_RUNPATH_SEARCH_PATHS = "@executable_path";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/iOS\"";
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/iOS/dynamic\"";
 				PRODUCT_NAME = Cube;
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
diff --git a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj
index c9dbc2e..e1db4ad 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj
+++ b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj
@@ -37,35 +37,19 @@
 		A9B67B8F1C3AAEA200373FFD /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B871C3AAEA200373FFD /* main.m */; };
 		A9B67B901C3AAEA200373FFD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A9B67B8A1C3AAEA200373FFD /* Main.storyboard */; };
 		A9B67B911C3AAEA200373FFD /* macOS.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A9B67B8B1C3AAEA200373FFD /* macOS.xcassets */; };
+		A9C2AB99218503A400DDBC03 /* libMoltenVK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C2AB97218503A400DDBC03 /* libMoltenVK.a */; };
+		A9C2AB9A218503A400DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C2AB98218503A400DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */; };
+		A9C2AB9D218503BA00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C2AB9B218503BA00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */; };
+		A9C2AB9E218503BA00DDBC03 /* libMoltenVK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A9C2AB9C218503BA00DDBC03 /* libMoltenVK.a */; };
 		A9D516F81CD575E300097D96 /* HelpersDispatchTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D516F61CD575E300097D96 /* HelpersDispatchTable.cpp */; };
 		A9D516F91CD575E300097D96 /* HelpersDispatchTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9D516F61CD575E300097D96 /* HelpersDispatchTable.cpp */; };
-		A9F4FB461CF68822003FA0C3 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4FB451CF68822003FA0C3 /* libc++.tbd */; };
-		A9F4FB481CF6882E003FA0C3 /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4FB471CF6882E003FA0C3 /* libc++.tbd */; };
-		A9F4FB4A1CF688A5003FA0C3 /* MoltenVK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4FB491CF688A5003FA0C3 /* MoltenVK.framework */; };
-		A9F4FB4C1CF688B5003FA0C3 /* MoltenVK.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4FB4B1CF688B5003FA0C3 /* MoltenVK.framework */; };
-		A9F4FB4F1CF68C79003FA0C3 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4FB4E1CF68C79003FA0C3 /* MoltenVKGLSLToSPIRVConverter.framework */; };
-		A9F4FB511CF68C83003FA0C3 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9F4FB501CF68C83003FA0C3 /* MoltenVKGLSLToSPIRVConverter.framework */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXFileReference section */
-		1D30AB110D05D00D00671497 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
-		1D3623EB0D0F72F000981E51 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
 		1D6058910D05DD3D006BFB54 /* Hologram.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Hologram.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		1DF5F4DF0D08C38300B7A737 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
-		2D500B990D5A79CF00DBA0E3 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
-		A900B1A21B5EAA1C00150D60 /* libc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.dylib"; path = "usr/lib/libc++.dylib"; sourceTree = SDKROOT; };
-		A90941BB1C582DF40094110D /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = "../../../../../../../../Library/Developer/Xcode/DerivedData/VulkanSamples-emusmkeclqfwfncmwqpcvdzumhpu/Build/Products/Release/MoltenVKGLSLToSPIRVConverter.framework"; sourceTree = "<group>"; };
-		A9096E521F7EF13000DFBEA6 /* IOSurface.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = IOSurface.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/System/Library/Frameworks/IOSurface.framework; sourceTree = DEVELOPER_DIR; };
 		A93CC3701CD56B8F00EB8A56 /* generate-dispatch-table */ = {isa = PBXFileReference; explicitFileType = text.script.python; path = "generate-dispatch-table"; sourceTree = "<group>"; };
 		A93CC3711CD56FD600EB8A56 /* CMakeLists.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
-		A94A67231B7BDE9B00F6D7C4 /* MetalGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalGL.framework; path = ../../MetalGL/macOS/MetalGL.framework; sourceTree = "<group>"; };
-		A94A67241B7BDE9B00F6D7C4 /* MetalGLShaderConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalGLShaderConverter.framework; path = ../../MetalGLShaderConverter/macOS/MetalGLShaderConverter.framework; sourceTree = "<group>"; };
 		A977BCFE1B66BB010067E5BF /* Hologram.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Hologram.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		A977BD211B67186B0067E5BF /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/AppKit.framework; sourceTree = DEVELOPER_DIR; };
-		A977BD221B67186B0067E5BF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
-		A977BD231B67186B0067E5BF /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
-		A977BD251B67186B0067E5BF /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/Metal.framework; sourceTree = DEVELOPER_DIR; };
-		A977BD261B67186B0067E5BF /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
 		A997897F1CD3D4E2005E7DAC /* Game.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Game.h; sourceTree = "<group>"; };
 		A99789821CD3D4E2005E7DAC /* Helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Helpers.h; sourceTree = "<group>"; };
 		A99789831CD3D4E2005E7DAC /* Hologram.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Hologram.cpp; sourceTree = "<group>"; };
@@ -83,9 +67,6 @@
 		A99789961CD3D4E2005E7DAC /* Simulation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Simulation.h; sourceTree = "<group>"; };
 		A99789C71CD3D819005E7DAC /* ShellMVK.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ShellMVK.cpp; sourceTree = SOURCE_ROOT; };
 		A99789C81CD3D819005E7DAC /* ShellMVK.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShellMVK.h; sourceTree = SOURCE_ROOT; };
-		A99789E01CD4186E005E7DAC /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = "../../../../MoltenShaderConverter/build/Debug-iphoneos/MoltenVKGLSLToSPIRVConverter.framework"; sourceTree = "<group>"; };
-		A99789E21CD4187A005E7DAC /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../../MoltenShaderConverter/build/Debug/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
-		A9A222171B5D69F40050A5F9 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };
 		A9B67B6B1C3AAE9800373FFD /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
 		A9B67B6C1C3AAE9800373FFD /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
 		A9B67B6E1C3AAE9800373FFD /* DemoViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoViewController.h; sourceTree = "<group>"; };
@@ -106,20 +87,12 @@
 		A9B67B881C3AAEA200373FFD /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = "<group>"; };
 		A9B67B8A1C3AAEA200373FFD /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Main.storyboard; sourceTree = "<group>"; };
 		A9B67B8B1C3AAEA200373FFD /* macOS.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = macOS.xcassets; sourceTree = "<group>"; };
-		A9B6B75F1C0F795000A9E33A /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.1.sdk/System/Library/Frameworks/CoreAudio.framework; sourceTree = DEVELOPER_DIR; };
-		A9B6B7641C0F795D00A9E33A /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
-		A9BF67C21C582EC900B8CF77 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = "../../../MoltenShaderConverter/build/Debug-iphoneos/MoltenVKGLSLToSPIRVConverter.framework"; sourceTree = "<group>"; };
-		A9CDEA271B6A782C00F7B008 /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; };
+		A9C2AB97218503A400DDBC03 /* libMoltenVK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libMoltenVK.a; path = ../../../MoltenVK/iOS/static/libMoltenVK.a; sourceTree = "<group>"; };
+		A9C2AB98218503A400DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
+		A9C2AB9B218503BA00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
+		A9C2AB9C218503BA00DDBC03 /* libMoltenVK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libMoltenVK.a; path = ../../../MoltenVK/macOS/static/libMoltenVK.a; sourceTree = "<group>"; };
 		A9D516F61CD575E300097D96 /* HelpersDispatchTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HelpersDispatchTable.cpp; sourceTree = SOURCE_ROOT; };
 		A9D516F71CD575E300097D96 /* HelpersDispatchTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HelpersDispatchTable.h; sourceTree = SOURCE_ROOT; };
-		A9E264761B671B0A00FE691A /* libc++.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libc++.dylib"; path = "Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/lib/libc++.dylib"; sourceTree = DEVELOPER_DIR; };
-		A9F4FB451CF68822003FA0C3 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
-		A9F4FB471CF6882E003FA0C3 /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/usr/lib/libc++.tbd"; sourceTree = DEVELOPER_DIR; };
-		A9F4FB491CF688A5003FA0C3 /* MoltenVK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVK.framework; path = ../../../../Package/Latest/MoltenVK/iOS/MoltenVK.framework; sourceTree = "<group>"; };
-		A9F4FB4B1CF688B5003FA0C3 /* MoltenVK.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVK.framework; path = ../../../../Package/Latest/MoltenVK/macOS/MoltenVK.framework; sourceTree = "<group>"; };
-		A9F4FB4E1CF68C79003FA0C3 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../../Package/Latest/MoltenShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
-		A9F4FB501CF68C83003FA0C3 /* MoltenVKGLSLToSPIRVConverter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MoltenVKGLSLToSPIRVConverter.framework; path = ../../../../Package/Latest/MoltenShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS/MoltenVKGLSLToSPIRVConverter.framework; sourceTree = "<group>"; };
-		BA240AC10FEFE77A00DE852D /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -127,9 +100,8 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9F4FB4A1CF688A5003FA0C3 /* MoltenVK.framework in Frameworks */,
-				A9F4FB4F1CF68C79003FA0C3 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */,
-				A9F4FB481CF6882E003FA0C3 /* libc++.tbd in Frameworks */,
+				A9C2AB99218503A400DDBC03 /* libMoltenVK.a in Frameworks */,
+				A9C2AB9A218503A400DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -137,9 +109,8 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9F4FB4C1CF688B5003FA0C3 /* MoltenVK.framework in Frameworks */,
-				A9F4FB511CF68C83003FA0C3 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */,
-				A9F4FB461CF68822003FA0C3 /* libc++.tbd in Frameworks */,
+				A9C2AB9E218503BA00DDBC03 /* libMoltenVK.a in Frameworks */,
+				A9C2AB9D218503BA00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -161,34 +132,12 @@
 				A99789681CD3D4E2005E7DAC /* Hologram */,
 				A9B67B6A1C3AAE9800373FFD /* iOS */,
 				A9B67B811C3AAEA200373FFD /* macOS */,
-				29B97323FDCFA39411CA2CEA /* Frameworks */,
 				19C28FACFE9D520D11CA2CBB /* Products */,
+				A9C2AB96218503A400DDBC03 /* Frameworks */,
 			);
 			name = CustomTemplate;
 			sourceTree = "<group>";
 		};
-		29B97323FDCFA39411CA2CEA /* Frameworks */ = {
-			isa = PBXGroup;
-			children = (
-				A9096E521F7EF13000DFBEA6 /* IOSurface.framework */,
-				A9F4FB501CF68C83003FA0C3 /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A9F4FB4E1CF68C79003FA0C3 /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A9F4FB4B1CF688B5003FA0C3 /* MoltenVK.framework */,
-				A9F4FB491CF688A5003FA0C3 /* MoltenVK.framework */,
-				A9F4FB471CF6882E003FA0C3 /* libc++.tbd */,
-				A9F4FB451CF68822003FA0C3 /* libc++.tbd */,
-				A99789E21CD4187A005E7DAC /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A99789E01CD4186E005E7DAC /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A9BF67C21C582EC900B8CF77 /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A90941BB1C582DF40094110D /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A9B6B7641C0F795D00A9E33A /* CoreAudio.framework */,
-				A9B6B75F1C0F795000A9E33A /* CoreAudio.framework */,
-				A9ADEC601B6EC2EB00DBA48C /* iOS */,
-				A9ADEC611B6EC2F300DBA48C /* macOS */,
-			);
-			name = Frameworks;
-			sourceTree = "<group>";
-		};
 		A99789681CD3D4E2005E7DAC /* Hologram */ = {
 			isa = PBXGroup;
 			children = (
@@ -217,36 +166,6 @@
 			path = "../VulkanSamples/Sample-Programs/Hologram";
 			sourceTree = "<group>";
 		};
-		A9ADEC601B6EC2EB00DBA48C /* iOS */ = {
-			isa = PBXGroup;
-			children = (
-				A9A222171B5D69F40050A5F9 /* Metal.framework */,
-				BA240AC10FEFE77A00DE852D /* OpenGLES.framework */,
-				1D3623EB0D0F72F000981E51 /* CoreGraphics.framework */,
-				2D500B990D5A79CF00DBA0E3 /* QuartzCore.framework */,
-				1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
-				1D30AB110D05D00D00671497 /* Foundation.framework */,
-				A9CDEA271B6A782C00F7B008 /* GLKit.framework */,
-				A900B1A21B5EAA1C00150D60 /* libc++.dylib */,
-			);
-			name = iOS;
-			sourceTree = "<group>";
-		};
-		A9ADEC611B6EC2F300DBA48C /* macOS */ = {
-			isa = PBXGroup;
-			children = (
-				A94A67231B7BDE9B00F6D7C4 /* MetalGL.framework */,
-				A94A67241B7BDE9B00F6D7C4 /* MetalGLShaderConverter.framework */,
-				A9E264761B671B0A00FE691A /* libc++.dylib */,
-				A977BD251B67186B0067E5BF /* Metal.framework */,
-				A977BD261B67186B0067E5BF /* QuartzCore.framework */,
-				A977BD211B67186B0067E5BF /* AppKit.framework */,
-				A977BD221B67186B0067E5BF /* CoreGraphics.framework */,
-				A977BD231B67186B0067E5BF /* Foundation.framework */,
-			);
-			name = macOS;
-			sourceTree = "<group>";
-		};
 		A9B67B6A1C3AAE9800373FFD /* iOS */ = {
 			isa = PBXGroup;
 			children = (
@@ -297,6 +216,17 @@
 			path = Resources;
 			sourceTree = "<group>";
 		};
+		A9C2AB96218503A400DDBC03 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				A9C2AB9C218503BA00DDBC03 /* libMoltenVK.a */,
+				A9C2AB9B218503BA00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */,
+				A9C2AB97218503A400DDBC03 /* libMoltenVK.a */,
+				A9C2AB98218503A400DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
 		A9D516F51CD575B000097D96 /* Generated */ = {
 			isa = PBXGroup;
 			children = (
@@ -462,7 +392,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "../VulkanSamples/Sample-Programs/Hologram/generate-dispatch-table HelpersDispatchTable.cpp";
+			shellScript = "../VulkanSamples/Sample-Programs/Hologram/generate-dispatch-table HelpersDispatchTable.cpp\n";
 		};
 /* End PBXShellScriptBuildPhase section */
 
@@ -509,14 +439,12 @@
 			buildSettings = {
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				DEVELOPMENT_TEAM = "";
-				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/iOS\"",
-					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS\"",
-				);
+				FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS\"";
 				GCC_PREFIX_HEADER = "$(SRCROOT)/iOS/Prefix.pch";
 				GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
 				INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/iOS/static\"";
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				VALID_ARCHS = arm64;
@@ -528,14 +456,12 @@
 			buildSettings = {
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				DEVELOPMENT_TEAM = "";
-				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/iOS\"",
-					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS\"",
-				);
+				FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS\"";
 				GCC_PREFIX_HEADER = "$(SRCROOT)/iOS/Prefix.pch";
 				GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
 				INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/iOS/static\"";
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				VALID_ARCHS = arm64;
@@ -547,13 +473,11 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				COMBINE_HIDPI_IMAGES = YES;
-				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/macOS\"",
-					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS\"",
-				);
+				FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS\"";
 				GCC_PREFIX_HEADER = "$(SRCROOT)/macOS/Prefix.pch";
 				GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
 				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info.plist";
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/macOS/static\"";
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				SDKROOT = macosx;
 			};
@@ -564,13 +488,11 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				COMBINE_HIDPI_IMAGES = YES;
-				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/macOS\"",
-					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS\"",
-				);
+				FRAMEWORK_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS\"";
 				GCC_PREFIX_HEADER = "$(SRCROOT)/macOS/Prefix.pch";
 				GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
 				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info.plist";
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/macOS/static\"";
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				SDKROOT = macosx;
 			};
diff --git a/Demos/README.md b/Demos/README.md
index fff3f5e..a41724a 100644
--- a/Demos/README.md
+++ b/Demos/README.md
@@ -55,9 +55,9 @@
 This demo includes a sizable window, and represents an example of how to detect, within your
 *Vulkan* code, when a window has been resized, and to modify the *Vulkan* swapchain accordingly.
 
-This demo is a simple example of installing **MoltenVK** as a dynamic library, instead of as
-a statically-linked framework. In this demo, the **MoltenVK** dynamic library is embedded in 
-the application, but it could have been installed as a system library instead.
+The `Cube` demo is a simple example of installing **MoltenVK** as a *dynamic library*. In this demo, 
+the **MoltenVK** *dynamic library* is embedded in the application, but it could have been installed 
+as a system library instead.
 
 
 
@@ -85,6 +85,8 @@
 To see descriptions and screenshots of each of the demos, open 
 [this summary document](LunarG-VulkanSamples/VulkanSamples/samples_index.html#AdditionalVulkan).
 
+The `API-Samples` demo is a simple example of installing **MoltenVK** as a *static framework*.
+
 
 <a name="lunarg-vulkan-samples-hologram"></a>
 ### *Hologram*
@@ -113,6 +115,8 @@
 functions in the `Hologram/Hologram.cpp` file. To see the effect, modify the `Hologram-iOS` or 
 `Hologram-macOS` *Scheme* from within *Xcode* to use the **Debug** *Build Configuration* setting.
 
+The `Hologram` demo is a simple example of installing **MoltenVK** as a *static library*.
+
 
 
 <a name="sascha-willems-vulkan-samples"></a>
diff --git a/Docs/MoltenVK_Runtime_UserGuide.md b/Docs/MoltenVK_Runtime_UserGuide.md
index d277828..7466812 100644
--- a/Docs/MoltenVK_Runtime_UserGuide.md
+++ b/Docs/MoltenVK_Runtime_UserGuide.md
@@ -21,8 +21,7 @@
 - [About **MoltenVK**](#about_moltenvk)
 - [Installing **MoltenVK** in Your *Vulkan* Application](#install)
 	- [Build and Runtime Requirements](#requirements)
-	- [Install as Static Library Framework](#install_static_lib)
-	- [Install as Dynamic Library](#install_dynamic_lib)
+	- [Install as Static Framework, Static Library, or Dynamic Library](#install_lib)
 - [Interacting with the **MoltenVK** Runtime](#interaction)
 	- [MoltenVK Extension](#moltenvk_extension)
 - [*Metal Shading Language* Shaders](#shaders)
@@ -93,50 +92,94 @@
   [this article](https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/HardwareGPUInformation/HardwareGPUInformation.html).
 
 
-<a name="install_static_lib"></a>
-### Install as Static Library Framework
+<a name="install_lib"></a>
+### Install as Static Framework, Static Library, or Dynamic Library
 
 Installation of **MoltenVK** is straightforward and easy!
 
-For most applications, you can install **MoltenVK** as a *static library framework* that will be 
-embedded directly in your application executable, or a component library within your application.
-This is simple and straightforward, and is the recommended installation approach for all applications.
-
-To add **MoltenVK** as a *static library framework* to your existing *Vulkan* application, 
-follow the steps in this section. If you're new to **MoltenVK**, it is recommended that you 
-start with a smaller project to help you understand the transition, and to reduce the possibility
-of needing to make modifications to your [shaders](#shaders) to  ensure their compatibility with 
-the *Metal* environment. 
+Depending on your build and deployment needs, you can install **MoltenVK** as a *static framework*,
+*static library*, or *dynamic library*, by following the steps in this section. If you are unsure 
+about which linking and deployment option you need, follow the steps for installing a 
+*static framework*, as it is the simplest to install.
 
 1. Open your application in *Xcode* and select your application's target in the 
    *Project Navigator* panel.
 
-2. Open the *Build Settings* tab, and in the **Framework Search Paths** (aka `FRAMEWORK_SEARCH_PATHS`)
-   setting:
-    - If building for *iOS*, add an entry that points to the `MoltenVK/iOS` folder, 
-      found in the **MoltenVK** distribution package.
-    - If building for *macOS*, add an entry that points to the `MoltenVK/macOS` folder, 
-      found in the **MoltenVK** distribution package.
 
-3. If using `IOSurfaces` on *iOS*, in the *Build Settings* tab, open the **iOS Deployment Target** 
+2. Open the *Build Settings* tab.
+
+	- If installing **MoltenVK** as a *static framework* in your application:
+	    1. In the **Framework Search Paths** (aka `FRAMEWORK_SEARCH_PATHS`) 
+	       setting, add an entry that points to **_one_** of the following folders:
+	          - `MoltenVK/macOS/framework` *(macOS)*
+	          - `MoltenVK/iOS/framework` *(iOS)*
+
+	- If installing **MoltenVK** as a *static library* in your application:
+	    1. In the **Library Search Paths** (aka `LIBRARY_SEARCH_PATHS`) setting, 
+	       add an entry that points to **_one_** of the following folders:
+	          - `MoltenVK/macOS/static` *(macOS)*
+	          - `MoltenVK/iOS/static` *(iOS)*
+        2. In the **Header Search Paths** (aka `HEADER_SEARCH_PATHS`) setting, 
+           add an entry that points to the `MoltenVK/include` folder.
+
+	- If installing **MoltenVK** as a *dynamic library* in your application:
+	    1. In the **Library Search Paths** (aka `LIBRARY_SEARCH_PATHS`) setting, 
+	       add an entry that points to **_one_** of the following folders:
+	          - `MoltenVK/macOS/dynamic` *(macOS)*
+	          - `MoltenVK/iOS/dynamic` *(iOS)*
+        2. In the **Header Search Paths** (aka `HEADER_SEARCH_PATHS`) setting, 
+           add an entry that points to the `MoltenVK/include` folder.
+        3. In the **Runpath Search Paths** (aka `LD_RUNPATH_SEARCH_PATHS`) setting, 
+           add an entry that matches where the dynamic library will be located in your runtime
+           environment. If the dynamic library is to be embedded within your application, 
+           you would typically set this value to either `@executable_path` or `@loader_path`. 
+           The `libMoltenVK.dylib` library is internally configured to be located at 
+           `@rpath/libMoltenVK.dylib`.
+
+3. With the *Build Settings* tab open, if using `IOSurfaces` on *iOS*, open the **iOS Deployment Target** 
    (aka `IPHONEOS_DEPLOYMENT_TARGET`) setting, and ensure it is set to a value of `iOS 11.0` or greater.
 
 4. On the *Build Phases* tab, open the *Link Binary With Libraries* list.
+   
+   - For *macOS*, drag **_one_** of the following files to the *Link Binary With Libraries* list:
+      - `MoltenVK/macOS/framework/MoltenVK.framework ` *(static framework)* 
+      - `MoltenVK/macOS/static/libMoltenVK.a` *(static library)* 
+      - `MoltenVK/macOS/dynamic/libMoltenVK.dylib` *(dynamic library)* 
 
-   1. Drag the `MoltenVK/iOS/MoltenVK.framework` or `MoltenVK/macOS/MoltenVK.framework` folder, 
-      found  in the **MoltenVK** distribution package, to the *Link Binary With Libraries* list.
-   2. Click the **+** button, and (selecting from the list of system libraries) add `libc++.tbd`. 
-   3. If you do not have the **Link Frameworks Automatically** (aka `CLANG_MODULES_AUTOLINK`) and
-      **Enable Modules (C and Objective-C** (aka `CLANG_ENABLE_MODULES`) settings enabled, click the 
-      **+** button, and (selecting from the list of system frameworks) add the following frameworks:
-		- `Metal.framework`
-		- `Foundation.framework`.
-		- `QuartzCore.framework`
-		- `IOKit.framework` (*macOS*)
-		- `UIKit.framework` (*iOS*)
-		- `IOSurface.framework` (*macOS*, or *iOS* if `IPHONEOS_DEPLOYMENT_TARGET` is at least `iOS 11.0`)
+   - For *iOS*, drag **_one_** of the following files to the *Link Binary With Libraries* list:
+      - `MoltenVK/iOS/framework/MoltenVK.framework ` *(static framework)* 
+      - `MoltenVK/iOS/static/libMoltenVK.a` *(static library)* 
+      - `MoltenVK/iOS/dynamic/libMoltenVK.dylib` *(dynamic library)* 
 
-5. When a *Metal* app is running from *Xcode*, the default ***Scheme*** settings reduce
+5. While in the *Link Binary With Libraries* list on the *Build Phases* tab, if you do **_not_** 
+   have the **Link Frameworks Automatically** (aka `CLANG_MODULES_AUTOLINK`) and 
+   **Enable Modules (C and Objective-C)** (aka `CLANG_ENABLE_MODULES`) settings enabled, click
+   the **+** button, and (selecting from the list of system frameworks) add the following items:
+   - `libc++.tbd`
+   - `Metal.framework`
+   - `Foundation.framework`.
+   - `QuartzCore.framework`
+   - `IOKit.framework` (*macOS*)
+   - `UIKit.framework` (*iOS*)
+   - `IOSurface.framework` (*macOS*, or *iOS* if `IPHONEOS_DEPLOYMENT_TARGET` is at least `iOS 11.0`)
+
+
+6. If installing **MoltenVK** as a *dynamic library* in your application, arrange to install 
+   the `libMoltenVK.dylib` file in your application environment:
+
+   - To copy the `libMoltenVK.dylib` file into your application or component library:
+        1. On the *Build Phases* tab, add a new *Copy Files* build phase.
+        2. Set the *Destination* into which you want to place  the `libMoltenVK.dylib` file.
+           Typically this will be *Executables*.
+        3. Drag **_one_** of the following files to the *Copy Files* list in this new build phase:
+	          - `MoltenVK/macOS/dynamic/libMoltenVK.dylib` *(macOS)*
+	          - `MoltenVK/iOS/dynamic/libMoltenVK.dylib` *(iOS)*
+   
+   - Alternately, you may create your own installation mechanism to install either the 
+     `MoltenVK/macOS/dynamic/libMoltenVK.dylib` or `MoltenVK/iOS/dynamic/libMoltenVK.dylib` 
+     file into a standard *macOS* or *iOS* system library folder on the user's device.
+
+7. When a *Metal* app is running from *Xcode*, the default ***Scheme*** settings reduce
    performance. To improve performance and gain the benefits of *Metal*, perform the 
    following in *Xcode*:
    
@@ -152,70 +195,12 @@
 	   section of Apple's *Metal Programming Guide* documentation.
 
 
+The demo apps, found in the `Demos.xcworkspace`, located in the `Demos` folder, demonstrate each
+of the installation techniques discussed above:
 
-<a name="install_dynamic_lib"></a>
-### Install as Dynamic Library
-
-For some applications, you may prefer to install **MoltenVK** as a dynamic library.
-This is only recommended for developers who are used to working with dynamic libraries,
-and even then, the preferred approach is to link the **MoltenVK** 
-[*static library framework*](#install_static_lib) into a dynamic library of your own 
-creation, in order to give you the most flexibility for organizing your dynamic libraries.
-
-In order to install **MoltenVK** as its own dynamic library in your application, 
-follow these instructions:
-
-1. Open your application in *Xcode* and select your application's target in the 
-   *Project Navigator* panel.
-
-2. On the *Build Settings* tab:
-     1. In the **Header Search Paths** (aka `HEADER_SEARCH_PATHS`) setting, add an entry 
-        that points to the `MoltenVK/include` folder, found in the **MoltenVK** distribution package.
-     2. In the **Library Search Paths** (aka `LIBRARY_SEARCH_PATHS`) setting, add an entry 
-        that points to either the `MoltenVK/iOS` or `MoltenVK/macOS` folder, found in the
-        **MoltenVK** distribution package.
-     3. In the **Runpath Search Paths** (aka `LD_RUNPATH_SEARCH_PATHS`) setting, add a path 
-        that matches the library destination you established in **Step 2** above. If the dynamic 
-        library is to be embedded within your application, you would typically set this value to 
-        either `@executable_path` or `@loader_path`. The `libMoltenVK.dylib` library is internally 
-        configured to be located at `@rpath/libMoltenVK.dylib`.
-
-3. If using `IOSurfaces` on *iOS*, in the *Build Settings* tab, open the **iOS Deployment Target** 
-   (aka `IPHONEOS_DEPLOYMENT_TARGET`) setting, and ensure it is set to a value of `iOS 11.0` or greater.
-
-4. On the *Build Phases* tab, open the *Link Binary With Libraries* list.
-
-   1. Drag the `MoltenVK/iOS/libMoltenVK.dylib` or `MoltenVK/macOS/libMoltenVK.dylib` file, 
-      found  in the **MoltenVK** distribution package, to the *Link Binary With Libraries* list.
-   2. Click the **+** button, and (selecting from the list of system libraries) add `libc++.tbd`. 
-   3. If you do not have the **Link Frameworks Automatically** (aka `CLANG_MODULES_AUTOLINK`) and
-      **Enable Modules (C and Objective-C** (aka `CLANG_ENABLE_MODULES`) settings enabled, click the 
-      **+** button, and (selecting from the list of system frameworks) add the following frameworks:
-		- `Metal.framework`
-		- `Foundation.framework`.
-		- `QuartzCore.framework`
-		- `IOKit.framework` (*macOS*)
-		- `UIKit.framework` (*iOS*)
-		- `IOSurface.framework` (*macOS*, or *iOS* if `IPHONEOS_DEPLOYMENT_TARGET` is at least `iOS 11.0`)
-
-5. Arrange to install the `libMoltenVK.dylib` file in your application environment:
-
-   - To copy the `libMoltenVK.dylib` file into your application or component library:
-        1. On the *Build Phases* tab, add a new *Copy Files* build phase.
-        2. Set the *Destination* into which you want to place  the `libMoltenVK.dylib` file.
-           Typically this will be *Executables*.
-        3. Drag the `MoltenVK/iOS/libMoltenVK.dylib` or `MoltenVK/macOS/libMoltenVK.dylib` 
-           file to the *Copy Files* list in this new build phase.
-   
-   - Alternately, you may create your own installation mechanism to install the 
-     `MoltenVK/iOS/libMoltenVK.dylib` or `MoltenVK/macOS/libMoltenVK.dylib` file 
-     into a standard *iOS* or *macOS* system library folder on the user's device.
-
-
-The `Cube-iOS` and `Cube-macOS` **MoltenVK** demo apps, found in the `Demos.xcworkspace`,
-located in the `Demos` folder within the **MoltenVK** distribution package, are simple 
-examples of installing *MoltenVK* as a dynamic library embedded within an *iOS* or *macOS* 
-application, respectively.
+- Static Framework: `API-Samples`.
+- Static library: `Hologram`.
+- Dynamic library: `Cube`.
 
 
 
@@ -500,7 +485,3 @@
 - Pipeline statistics query pool:
 	- `vkCreateQueryPool(VK_QUERY_TYPE_PIPELINE_STATISTICS)`
 
-- `VkImageViewCreateInfo::VkComponentMapping` supports only the following per-texture swizzles:
-	- `VK_FORMAT_R8_UNORM`: `VkComponentMapping.r` = `VK_COMPONENT_SWIZZLE_R`
-	- `VK_FORMAT_R8G8B8A8_UNORM` <->	`VK_FORMAT_B8G8R8A8_UNORM`
-	- `VK_FORMAT_R8G8B8A8_SRGB` <->	`VK_FORMAT_B8G8R8A8_SRGB`
diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md
index fcf62e7..02af572 100644
--- a/Docs/Whats_New.md
+++ b/Docs/Whats_New.md
@@ -15,8 +15,15 @@
 MoltenVK 1.0.25
 ---------------
 
-Released TBD
+Released 2018/10/31
 
+- Refactor the build environment.
+	- Support creation of static library and build framework and dynamic library from it.
+	- Add Makefile to better support command line or script building integration.
+	- Update demos to each use one of framework, static library, and dynamic library.
+	- Refactor and rename the build scripts.
+	- Refactor and rename the Xcode Schemes.
+	- Update build and runtime documentation.
 - Update shader caching for compatibility with texture swizzling.
 - Support polygonMode VK_POLYGON_MODE_POINT.
 - vkCreateInstance returns VK_ERROR_INCOMPATIBLE_DRIVER if Metal not available.
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..a0868e4
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,19 @@
+XCODE_PROJ := MoltenVKPackaging.xcodeproj
+
+.PHONY: all
+all:
+	xcodebuild -quiet -project $(XCODE_PROJ) -scheme "MoltenVK Package" build
+
+.PHONY: macos
+macos:
+	xcodebuild -quiet -project $(XCODE_PROJ) -scheme "MoltenVK Package (macOS only)" build
+
+.PHONY: ios
+ios:
+	xcodebuild -quiet -project $(XCODE_PROJ) -scheme "MoltenVK Package (iOS only)" build
+
+.PHONY: clean
+clean:
+	xcodebuild -project $(XCODE_PROJ) -scheme "MoltenVK Package" clean
+	rm -rf Package
+
diff --git a/MoltenVK/MoltenVK.xcodeproj/project.pbxproj b/MoltenVK/MoltenVK.xcodeproj/project.pbxproj
index 96c1014..474310a 100644
--- a/MoltenVK/MoltenVK.xcodeproj/project.pbxproj
+++ b/MoltenVK/MoltenVK.xcodeproj/project.pbxproj
@@ -23,12 +23,12 @@
 		A93E83302121C5D4001FEBD4 /* MVKGPUCapture.h in Headers */ = {isa = PBXBuildFile; fileRef = A93E832E2121C5D3001FEBD4 /* MVKGPUCapture.h */; };
 		A93E83352121F0C8001FEBD4 /* MVKGPUCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = A93E83342121F0C8001FEBD4 /* MVKGPUCapture.mm */; };
 		A93E83362121F0C8001FEBD4 /* MVKGPUCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = A93E83342121F0C8001FEBD4 /* MVKGPUCapture.mm */; };
-		A948BB7F1E51642700DE59F2 /* mvk_vulkan.h in Headers */ = {isa = PBXBuildFile; fileRef = A948BB7E1E51642700DE59F2 /* mvk_vulkan.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		A948BB801E51642700DE59F2 /* mvk_vulkan.h in Headers */ = {isa = PBXBuildFile; fileRef = A948BB7E1E51642700DE59F2 /* mvk_vulkan.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		A94FB7B01C7DFB4800632CA3 /* mvk_datatypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB7671C7DFB4800632CA3 /* mvk_datatypes.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		A94FB7B11C7DFB4800632CA3 /* mvk_datatypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB7671C7DFB4800632CA3 /* mvk_datatypes.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		A94FB7B41C7DFB4800632CA3 /* vk_mvk_moltenvk.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB7691C7DFB4800632CA3 /* vk_mvk_moltenvk.h */; settings = {ATTRIBUTES = (Public, ); }; };
-		A94FB7B51C7DFB4800632CA3 /* vk_mvk_moltenvk.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB7691C7DFB4800632CA3 /* vk_mvk_moltenvk.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		A948BB7F1E51642700DE59F2 /* mvk_vulkan.h in Headers */ = {isa = PBXBuildFile; fileRef = A948BB7E1E51642700DE59F2 /* mvk_vulkan.h */; };
+		A948BB801E51642700DE59F2 /* mvk_vulkan.h in Headers */ = {isa = PBXBuildFile; fileRef = A948BB7E1E51642700DE59F2 /* mvk_vulkan.h */; };
+		A94FB7B01C7DFB4800632CA3 /* mvk_datatypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB7671C7DFB4800632CA3 /* mvk_datatypes.h */; };
+		A94FB7B11C7DFB4800632CA3 /* mvk_datatypes.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB7671C7DFB4800632CA3 /* mvk_datatypes.h */; };
+		A94FB7B41C7DFB4800632CA3 /* vk_mvk_moltenvk.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB7691C7DFB4800632CA3 /* vk_mvk_moltenvk.h */; };
+		A94FB7B51C7DFB4800632CA3 /* vk_mvk_moltenvk.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB7691C7DFB4800632CA3 /* vk_mvk_moltenvk.h */; };
 		A94FB7B81C7DFB4800632CA3 /* MVKCmdTransfer.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB76C1C7DFB4800632CA3 /* MVKCmdTransfer.h */; };
 		A94FB7B91C7DFB4800632CA3 /* MVKCmdTransfer.h in Headers */ = {isa = PBXBuildFile; fileRef = A94FB76C1C7DFB4800632CA3 /* MVKCmdTransfer.h */; };
 		A94FB7BA1C7DFB4800632CA3 /* MVKCmdTransfer.mm in Sources */ = {isa = PBXBuildFile; fileRef = A94FB76D1C7DFB4800632CA3 /* MVKCmdTransfer.mm */; };
@@ -342,11 +342,11 @@
 		A981494C1FB6A3F7005F00B4 /* MVKWatermarkTextureContent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKWatermarkTextureContent.h; sourceTree = "<group>"; };
 		A981496A1FB6A998005F00B4 /* MVKStrings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKStrings.h; sourceTree = "<group>"; };
 		A9AD67C72054DD6C00ED3C08 /* vulkan */ = {isa = PBXFileReference; lastKnownFileType = folder; path = vulkan; sourceTree = "<group>"; };
-		A9B8EE0A1A98D796009C5A02 /* MoltenVK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MoltenVK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		A9B8EE0A1A98D796009C5A02 /* libMoltenVK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVK.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MoltenVKShaderConverter.xcodeproj; path = ../MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj; sourceTree = "<group>"; };
 		A9C96DCE1DDC20C20053187F /* MVKMTLBufferAllocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKMTLBufferAllocation.h; sourceTree = "<group>"; };
 		A9C96DCF1DDC20C20053187F /* MVKMTLBufferAllocation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKMTLBufferAllocation.mm; sourceTree = "<group>"; };
-		A9CBEE011B6299D800E45FDC /* MoltenVK.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = MoltenVK.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		A9CBEE011B6299D800E45FDC /* libMoltenVK.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVK.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		A9DE1083200598C500F18F80 /* icd */ = {isa = PBXFileReference; lastKnownFileType = folder; path = icd; sourceTree = "<group>"; };
 		A9E4B7881E1D8AF10046A4CE /* MVKMTLResourceBindings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKMTLResourceBindings.h; sourceTree = "<group>"; };
 		A9E53DCD2100B197002781DD /* MTLSamplerDescriptor+MoltenVK.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MTLSamplerDescriptor+MoltenVK.m"; sourceTree = "<group>"; };
@@ -574,8 +574,8 @@
 		A9F55D2E198BE6A7004EC31B /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				A9B8EE0A1A98D796009C5A02 /* MoltenVK.framework */,
-				A9CBEE011B6299D800E45FDC /* MoltenVK.framework */,
+				A9B8EE0A1A98D796009C5A02 /* libMoltenVK.a */,
+				A9CBEE011B6299D800E45FDC /* libMoltenVK.a */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -587,11 +587,11 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A94FB7B41C7DFB4800632CA3 /* vk_mvk_moltenvk.h in Headers */,
 				A909F65F213B190700FCD6BE /* MVKExtensions.h in Headers */,
+				A94FB7B41C7DFB4800632CA3 /* vk_mvk_moltenvk.h in Headers */,
 				A94FB7B01C7DFB4800632CA3 /* mvk_datatypes.h in Headers */,
-				A98149511FB6A3F7005F00B4 /* MVKEnvironment.h in Headers */,
 				A948BB7F1E51642700DE59F2 /* mvk_vulkan.h in Headers */,
+				A98149511FB6A3F7005F00B4 /* MVKEnvironment.h in Headers */,
 				A94FB8101C7DFB4800632CA3 /* MVKSurface.h in Headers */,
 				A9E53E0121064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.h in Headers */,
 				A94FB7F41C7DFB4800632CA3 /* MVKInstance.h in Headers */,
@@ -648,11 +648,11 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A94FB7B51C7DFB4800632CA3 /* vk_mvk_moltenvk.h in Headers */,
 				A909F660213B190700FCD6BE /* MVKExtensions.h in Headers */,
+				A94FB7B51C7DFB4800632CA3 /* vk_mvk_moltenvk.h in Headers */,
 				A94FB7B11C7DFB4800632CA3 /* mvk_datatypes.h in Headers */,
-				A98149521FB6A3F7005F00B4 /* MVKEnvironment.h in Headers */,
 				A948BB801E51642700DE59F2 /* mvk_vulkan.h in Headers */,
+				A98149521FB6A3F7005F00B4 /* MVKEnvironment.h in Headers */,
 				A94FB8111C7DFB4800632CA3 /* MVKSurface.h in Headers */,
 				A9E53E0221064F84002781DD /* MTLRenderPipelineDescriptor+MoltenVK.h in Headers */,
 				A94FB7F51C7DFB4800632CA3 /* MVKInstance.h in Headers */,
@@ -715,6 +715,7 @@
 				A9B8EE071A98D796009C5A02 /* Headers */,
 				A9B8EE051A98D796009C5A02 /* Sources */,
 				A9731FAD1EDDAE39006B7298 /* Create Dynamic Library */,
+				A92EF79721854B3300C8B91B /* Create  Framework */,
 			);
 			buildRules = (
 			);
@@ -722,9 +723,9 @@
 				A981499B1FB6B9CF005F00B4 /* PBXTargetDependency */,
 			);
 			name = "MoltenVK-iOS";
-			productName = MetalGL;
-			productReference = A9B8EE0A1A98D796009C5A02 /* MoltenVK.framework */;
-			productType = "com.apple.product-type.framework";
+			productName = MoltenVK;
+			productReference = A9B8EE0A1A98D796009C5A02 /* libMoltenVK.a */;
+			productType = "com.apple.product-type.library.static";
 		};
 		A9CBED861B6299D800E45FDC /* MoltenVK-macOS */ = {
 			isa = PBXNativeTarget;
@@ -733,6 +734,7 @@
 				A9CBED871B6299D800E45FDC /* Headers */,
 				A9CBEDCE1B6299D800E45FDC /* Sources */,
 				A93F47C91D7E389E002AF700 /* Create Dynamic Library */,
+				A92EF78D21852B2400C8B91B /* Create Framework */,
 			);
 			buildRules = (
 			);
@@ -740,9 +742,9 @@
 				A98149A41FB6B9EB005F00B4 /* PBXTargetDependency */,
 			);
 			name = "MoltenVK-macOS";
-			productName = MetalGL;
-			productReference = A9CBEE011B6299D800E45FDC /* MoltenVK.framework */;
-			productType = "com.apple.product-type.framework";
+			productName = MoltenVK;
+			productReference = A9CBEE011B6299D800E45FDC /* libMoltenVK.a */;
+			productType = "com.apple.product-type.library.static";
 		};
 /* End PBXNativeTarget section */
 
@@ -825,6 +827,42 @@
 /* End PBXReferenceProxy section */
 
 /* Begin PBXShellScriptBuildPhase section */
+		A92EF78D21852B2400C8B91B /* Create Framework */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Create Framework";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "export MVK_OS=\"macOS\"\nexport MVK_FRWK_SUBPATH=\"/Versions/A\"\n\n\"${SRCROOT}/scripts/create_framework.sh\"\n";
+		};
+		A92EF79721854B3300C8B91B /* Create  Framework */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Create  Framework";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "export MVK_OS=\"iOS\"\nexport MVK_FRWK_SUBPATH=\"\"\n\n\"${SRCROOT}/scripts/create_framework.sh\"\n";
+		};
 		A93F47C91D7E389E002AF700 /* Create Dynamic Library */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
@@ -837,7 +875,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/scripts/create_dylib_macos.sh\"";
+			shellScript = "export MVK_OS=\"macosx\"\nexport MVK_ARCH=\"x86_64\"\nexport MVK_UX_FWK=\"AppKit\"\nexport MVK_MIN_OS_VERSION=${MACOSX_DEPLOYMENT_TARGET}\nexport MVK_IOSURFACE_FWK=\"-framework IOSurface\"\n\n\"${SRCROOT}/scripts/create_dylib.sh\"\n";
 		};
 		A9731FAD1EDDAE39006B7298 /* Create Dynamic Library */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -851,7 +889,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "${SRCROOT}/scripts/create_dylib_ios.sh";
+			shellScript = "export MVK_OS=\"ios\"\nexport MVK_ARCH=\"arm64\"\nexport MVK_UX_FWK=\"UIKit\"\nexport MVK_MIN_OS_VERSION=${IPHONEOS_DEPLOYMENT_TARGET}\nexport MVK_IOSURFACE_FWK=\"-framework IOSurface\"\n\n# Do not link to IOSurface if deploying to iOS versions below 11.0, doing so will\n# link IOSurface as a private framework, which will trigger App Store rejection.\nif [ $(echo \"${MVK_MIN_OS_VERSION} < 11.0\" | bc) -eq 1 ]; then\n    MVK_IOSURFACE_FWK=\"\"\nfi\n\n\"${SRCROOT}/scripts/create_dylib.sh\"\n";
 		};
 /* End PBXShellScriptBuildPhase section */
 
diff --git a/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-iOS.xcscheme b/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-iOS.xcscheme
index 86fc06d..678103b 100644
--- a/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-iOS.xcscheme
+++ b/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-iOS.xcscheme
@@ -15,7 +15,7 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "A9B8EE091A98D796009C5A02"
-               BuildableName = "MoltenVK.framework"
+               BuildableName = "libMoltenVK.a"
                BlueprintName = "MoltenVK-iOS"
                ReferencedContainer = "container:MoltenVK.xcodeproj">
             </BuildableReference>
@@ -51,7 +51,7 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "A9B8EE091A98D796009C5A02"
-            BuildableName = "MoltenVK.framework"
+            BuildableName = "libMoltenVK.a"
             BlueprintName = "MoltenVK-iOS"
             ReferencedContainer = "container:MoltenVK.xcodeproj">
          </BuildableReference>
@@ -69,7 +69,7 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "A9B8EE091A98D796009C5A02"
-            BuildableName = "MoltenVK.framework"
+            BuildableName = "libMoltenVK.a"
             BlueprintName = "MoltenVK-iOS"
             ReferencedContainer = "container:MoltenVK.xcodeproj">
          </BuildableReference>
diff --git a/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-macOS.xcscheme b/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-macOS.xcscheme
index 1155111..9c9303c 100644
--- a/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-macOS.xcscheme
+++ b/MoltenVK/MoltenVK.xcodeproj/xcshareddata/xcschemes/MoltenVK-macOS.xcscheme
@@ -15,7 +15,7 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "A9CBED861B6299D800E45FDC"
-               BuildableName = "MoltenVK.framework"
+               BuildableName = "libMoltenVK.a"
                BlueprintName = "MoltenVK-macOS"
                ReferencedContainer = "container:MoltenVK.xcodeproj">
             </BuildableReference>
@@ -51,7 +51,7 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "A9CBED861B6299D800E45FDC"
-            BuildableName = "MoltenVK.framework"
+            BuildableName = "libMoltenVK.a"
             BlueprintName = "MoltenVK-macOS"
             ReferencedContainer = "container:MoltenVK.xcodeproj">
          </BuildableReference>
@@ -69,7 +69,7 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "A9CBED861B6299D800E45FDC"
-            BuildableName = "MoltenVK.framework"
+            BuildableName = "libMoltenVK.a"
             BlueprintName = "MoltenVK-macOS"
             ReferencedContainer = "container:MoltenVK.xcodeproj">
          </BuildableReference>
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
index b92ee5b..3e3f246 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
@@ -75,7 +75,7 @@
 	const MVKShaderAuxBufferBinding& getAuxBufferIndex() { return _auxBufferIndex; }
 
 	/** Returns the number of textures in this layout. This is used to calculate the size of the auxiliary buffer. */
-	uint32_t getMaxTextureIndex() { return _pushConstantsMTLResourceIndexes.getMaxTextureIndex(); }
+	uint32_t getTextureCount() { return _pushConstantsMTLResourceIndexes.getMaxTextureIndex(); }
 
 	/** Constructs an instance for the specified device. */
 	MVKPipelineLayout(MVKDevice* device, const VkPipelineLayoutCreateInfo* pCreateInfo);
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
index 3d00f65..0c38b3b 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
@@ -306,7 +306,7 @@
     initMVKShaderConverterContext(shaderContext, pCreateInfo);
     auto* mvkLayout = (MVKPipelineLayout*)pCreateInfo->layout;
     _auxBufferIndex = mvkLayout->getAuxBufferIndex();
-    uint32_t auxBufferSize = sizeof(uint32_t) * mvkLayout->getMaxTextureIndex();
+    uint32_t auxBufferSize = sizeof(uint32_t) * mvkLayout->getTextureCount();
 
     // Retrieve the render subpass for which this pipeline is being constructed
     MVKRenderPass* mvkRendPass = (MVKRenderPass*)pCreateInfo->renderPass;
@@ -559,7 +559,7 @@
     MVKPipelineLayout* layout = (MVKPipelineLayout*)pCreateInfo->layout;
     layout->populateShaderConverterContext(shaderContext);
     _auxBufferIndex = layout->getAuxBufferIndex();
-    uint32_t auxBufferSize = sizeof(uint32_t) * layout->getMaxTextureIndex();
+    uint32_t auxBufferSize = sizeof(uint32_t) * layout->getTextureCount();
     shaderContext.options.auxBufferIndex = _auxBufferIndex.compute;
 
     MVKShaderModule* mvkShdrMod = (MVKShaderModule*)pSS->module;
diff --git a/MoltenVK/scripts/create_dylib.sh b/MoltenVK/scripts/create_dylib.sh
new file mode 100755
index 0000000..8dc0129
--- /dev/null
+++ b/MoltenVK/scripts/create_dylib.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+set -e
+
+export MVK_DYLIB_NAME="lib${PRODUCT_NAME}.dylib"
+export MVK_SYS_FWK_DIR="${SDK_DIR}/System/Library/Frameworks"
+export MVK_USR_LIB_DIR="${SDK_DIR}/usr/lib"
+
+if test x"${ENABLE_THREAD_SANITIZER}" = xYES; then
+	MVK_TSAN="-fsanitize=thread"
+fi
+
+clang \
+-dynamiclib ${MVK_TSAN} \
+-arch ${MVK_ARCH} \
+-m${MVK_OS}-version-min=${MVK_MIN_OS_VERSION} \
+-compatibility_version 1.0.0 -current_version 1.0.0  \
+-install_name "@rpath/${MVK_DYLIB_NAME}"  \
+-Wno-incompatible-sysroot \
+-isysroot ${SDK_DIR} \
+-iframework ${MVK_SYS_FWK_DIR}  \
+-framework Metal ${MVK_IOSURFACE_FWK} -framework ${MVK_UX_FWK} -framework QuartzCore -framework IOKit -framework Foundation \
+--library-directory ${MVK_USR_LIB_DIR} \
+-lSystem  -lc++ \
+-o "${BUILT_PRODUCTS_DIR}/${MVK_DYLIB_NAME}" \
+-force_load "${BUILT_PRODUCTS_DIR}/lib${PRODUCT_NAME}.a"
diff --git a/MoltenVK/scripts/create_dylib_ios.sh b/MoltenVK/scripts/create_dylib_ios.sh
deleted file mode 100755
index f1c1fc7..0000000
--- a/MoltenVK/scripts/create_dylib_ios.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_PROD_NAME="MoltenVK"
-export MVK_DYLIB_NAME="lib${MVK_PROD_NAME}.dylib"
-export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}"
-export MVK_SYS_FWK_DIR="${SDK_DIR}/System/Library/Frameworks"
-export MVK_USR_LIB_DIR="${SDK_DIR}/usr/lib"
-
-# Do not link to IOSurface if deploying to iOS versions below 11.0, doing so will
-# link IOSurface as a private framework, which will trigger App Store rejection.
-if [ $(echo "${IPHONEOS_DEPLOYMENT_TARGET} >= 11.0" | bc) -eq 1 ]
-then
-    export MVK_IOSURFACE_FWK="-framework IOSurface"
-else
-    export MVK_IOSURFACE_FWK=""
-fi
-
-clang \
--dynamiclib \
--arch arm64 \
--mios-version-min=${IPHONEOS_DEPLOYMENT_TARGET}  \
--compatibility_version 1.0.0 -current_version 1.0.0  \
--install_name "@rpath/${MVK_DYLIB_NAME}"  \
--Wno-incompatible-sysroot \
--isysroot ${SDK_DIR} \
--iframework ${MVK_SYS_FWK_DIR}  \
--framework Metal ${MVK_IOSURFACE_FWK} -framework UIKit -framework QuartzCore -framework UIKit -framework Foundation \
---library-directory ${MVK_USR_LIB_DIR} \
--lSystem  -lc++ \
--o "${MVK_BUILT_PROD_PATH}/${MVK_DYLIB_NAME}" \
--force_load "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework/${MVK_PROD_NAME}"
diff --git a/MoltenVK/scripts/create_dylib_macos.sh b/MoltenVK/scripts/create_dylib_macos.sh
deleted file mode 100755
index 2cf63b0..0000000
--- a/MoltenVK/scripts/create_dylib_macos.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_PROD_NAME="MoltenVK"
-export MVK_DYLIB_NAME="lib${MVK_PROD_NAME}.dylib"
-export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}"
-export MVK_SYS_FWK_DIR="${SDK_DIR}/System/Library/Frameworks"
-export MVK_USR_LIB_DIR="${SDK_DIR}/usr/lib"
-
-if test x"${ENABLE_THREAD_SANITIZER}" = xYES; then
-	MVK_TSAN="-fsanitize=thread"
-fi
-
-clang \
--dynamiclib ${MVK_TSAN} \
--arch x86_64 \
--mmacosx-version-min=${MACOSX_DEPLOYMENT_TARGET} \
--compatibility_version 1.0.0 -current_version 1.0.0  \
--install_name "@rpath/${MVK_DYLIB_NAME}"  \
--Wno-incompatible-sysroot \
--isysroot ${SDK_DIR} \
--iframework ${MVK_SYS_FWK_DIR}  \
--framework Metal -framework IOSurface -framework IOKit -framework QuartzCore -framework AppKit -framework Foundation \
---library-directory ${MVK_USR_LIB_DIR} \
--lSystem  -lc++ \
--o "${MVK_BUILT_PROD_PATH}/${MVK_DYLIB_NAME}" \
--force_load "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework/${MVK_PROD_NAME}"
diff --git a/MoltenVK/scripts/create_framework.sh b/MoltenVK/scripts/create_framework.sh
new file mode 100755
index 0000000..717a607
--- /dev/null
+++ b/MoltenVK/scripts/create_framework.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+set -e
+
+export MVK_TMPLT_PATH="${PROJECT_DIR}/templates/framework/${MVK_OS}"
+export MVK_BUILT_FRWK_PATH="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework"
+export MVK_BUILT_FRWK_CONTENT_PATH="${MVK_BUILT_FRWK_PATH}${MVK_FRWK_SUBPATH}"
+
+rm -rf "${MVK_BUILT_FRWK_PATH}"
+cp -a  "${MVK_TMPLT_PATH}/${PRODUCT_NAME}.framework" "${BUILT_PRODUCTS_DIR}"
+cp -a  "${BUILT_PRODUCTS_DIR}/lib${PRODUCT_NAME}.a" "${MVK_BUILT_FRWK_CONTENT_PATH}/${PRODUCT_NAME}"
+cp -a "${PROJECT_DIR}/include/${PRODUCT_NAME}/" "${MVK_BUILT_FRWK_CONTENT_PATH}/Headers"
+rm -f "${MVK_BUILT_FRWK_CONTENT_PATH}/Headers/README"	#Remove git empty directory placeholder file
diff --git a/MoltenVK/templates/framework/iOS/MoltenVK.framework/Headers/README b/MoltenVK/templates/framework/iOS/MoltenVK.framework/Headers/README
new file mode 100644
index 0000000..26382bc
--- /dev/null
+++ b/MoltenVK/templates/framework/iOS/MoltenVK.framework/Headers/README
@@ -0,0 +1 @@
+Placeholder for empty git directory.
\ No newline at end of file
diff --git a/MoltenVK/templates/framework/macOS/MoltenVK.framework/Headers b/MoltenVK/templates/framework/macOS/MoltenVK.framework/Headers
new file mode 120000
index 0000000..a177d2a
--- /dev/null
+++ b/MoltenVK/templates/framework/macOS/MoltenVK.framework/Headers
@@ -0,0 +1 @@
+Versions/Current/Headers
\ No newline at end of file
diff --git a/MoltenVK/templates/framework/macOS/MoltenVK.framework/MoltenVK b/MoltenVK/templates/framework/macOS/MoltenVK.framework/MoltenVK
new file mode 120000
index 0000000..97628cd
--- /dev/null
+++ b/MoltenVK/templates/framework/macOS/MoltenVK.framework/MoltenVK
@@ -0,0 +1 @@
+Versions/Current/MoltenVK
\ No newline at end of file
diff --git a/MoltenVK/templates/framework/macOS/MoltenVK.framework/Versions/A/Headers/README b/MoltenVK/templates/framework/macOS/MoltenVK.framework/Versions/A/Headers/README
new file mode 100644
index 0000000..26382bc
--- /dev/null
+++ b/MoltenVK/templates/framework/macOS/MoltenVK.framework/Versions/A/Headers/README
@@ -0,0 +1 @@
+Placeholder for empty git directory.
\ No newline at end of file
diff --git a/MoltenVK/templates/framework/macOS/MoltenVK.framework/Versions/Current b/MoltenVK/templates/framework/macOS/MoltenVK.framework/Versions/Current
new file mode 120000
index 0000000..8c7e5a6
--- /dev/null
+++ b/MoltenVK/templates/framework/macOS/MoltenVK.framework/Versions/Current
@@ -0,0 +1 @@
+A
\ No newline at end of file
diff --git a/MoltenVKPackaging.xcodeproj/project.pbxproj b/MoltenVKPackaging.xcodeproj/project.pbxproj
index 2929f50..65e8fd6 100644
--- a/MoltenVKPackaging.xcodeproj/project.pbxproj
+++ b/MoltenVKPackaging.xcodeproj/project.pbxproj
@@ -40,16 +40,10 @@
 			isa = PBXAggregateTarget;
 			buildConfigurationList = A9FEADDC1F3517480010240E /* Build configuration list for PBXAggregateTarget "MoltenVK" */;
 			buildPhases = (
-				A9FEADD61F3517480010240E /* Package MoltenVK */,
 			);
 			dependencies = (
-				A9FEADBD1F3517480010240E /* PBXTargetDependency */,
-				A9FEADBF1F3517480010240E /* PBXTargetDependency */,
-				A98149D11FB7689D005F00B4 /* PBXTargetDependency */,
-				A98149D31FB7689D005F00B4 /* PBXTargetDependency */,
-				A98149CD1FB7689D005F00B4 /* PBXTargetDependency */,
-				A98149CF1FB7689D005F00B4 /* PBXTargetDependency */,
-				A98149CB1FB7689D005F00B4 /* PBXTargetDependency */,
+				A9AFC2602184EEF60084B396 /* PBXTargetDependency */,
+				A9AFC2622184EEF60084B396 /* PBXTargetDependency */,
 			);
 			name = MoltenVK;
 			productName = Package;
@@ -155,53 +149,18 @@
 			remoteGlobalIDString = A93903C71C57E9ED00FE90DC;
 			remoteInfo = "MoltenVKSPIRVToMSLConverter-macOS";
 		};
-		A98149CA1FB7689D005F00B4 /* PBXContainerItemProxy */ = {
+		A9AFC25F2184EEF60084B396 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
-			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
+			containerPortal = A90B2B1D1A9B6170008EE819 /* Project object */;
 			proxyType = 1;
-			remoteGlobalIDString = A9092A8C1A81717B00051823;
-			remoteInfo = MoltenVKShaderConverter;
-		};
-		A98149CC1FB7689D005F00B4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = A937472B1A9A8B2900F29B34;
-			remoteInfo = "MoltenVKGLSLToSPIRVConverter-iOS";
-		};
-		A98149CE1FB7689D005F00B4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = A93747701A9A98D000F29B34;
-			remoteInfo = "MoltenVKGLSLToSPIRVConverter-macOS";
-		};
-		A98149D01FB7689D005F00B4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = A93903B81C57E9D700FE90DC;
-			remoteInfo = "MoltenVKSPIRVToMSLConverter-iOS";
-		};
-		A98149D21FB7689D005F00B4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = A93903C01C57E9ED00FE90DC;
-			remoteInfo = "MoltenVKSPIRVToMSLConverter-macOS";
-		};
-		A9FEADBE1F3517480010240E /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A92DB3EE1CE0F72500FBC835 /* MoltenVK.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = A9B8EE091A98D796009C5A02;
+			remoteGlobalIDString = A975D5782140585200D4834F;
 			remoteInfo = "MoltenVK-iOS";
 		};
-		A9FEADC01F3517480010240E /* PBXContainerItemProxy */ = {
+		A9AFC2612184EEF60084B396 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
-			containerPortal = A92DB3EE1CE0F72500FBC835 /* MoltenVK.xcodeproj */;
+			containerPortal = A90B2B1D1A9B6170008EE819 /* Project object */;
 			proxyType = 1;
-			remoteGlobalIDString = A9CBED861B6299D800E45FDC;
+			remoteGlobalIDString = A975D58B2140586700D4834F;
 			remoteInfo = "MoltenVK-macOS";
 		};
 /* End PBXContainerItemProxy section */
@@ -212,21 +171,26 @@
 		A92DB3E61CE0F37D00FBC835 /* Whats_New.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = Whats_New.md; path = Docs/Whats_New.md; sourceTree = "<group>"; };
 		A92DB3EE1CE0F72500FBC835 /* MoltenVK.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MoltenVK.xcodeproj; path = MoltenVK/MoltenVK.xcodeproj; sourceTree = "<group>"; };
 		A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = MoltenVKShaderConverter.xcodeproj; path = MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj; sourceTree = "<group>"; };
+		A92EF7C521856EA200C8B91B /* package_ios.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_ios.sh; sourceTree = "<group>"; };
+		A92EF7C621856EA200C8B91B /* package_moltenvk.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_moltenvk.sh; sourceTree = "<group>"; };
+		A92EF7C721856EA200C8B91B /* package_shader_converter_tool.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_shader_converter_tool.sh; sourceTree = "<group>"; };
+		A92EF7C821856EA200C8B91B /* package_macos.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_macos.sh; sourceTree = "<group>"; };
+		A92EF7C921856EA200C8B91B /* package_docs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_docs.sh; sourceTree = "<group>"; };
+		A92EF7CA21856EA200C8B91B /* package_update_latest.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_update_latest.sh; sourceTree = "<group>"; };
+		A92EF7CB21856EA300C8B91B /* package_shader_converter.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_shader_converter.sh; sourceTree = "<group>"; };
+		A92EF7DE2186451700C8B91B /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = ../Makefile; sourceTree = "<group>"; };
 		A943100220546CDD00F5CF87 /* fetchDependencies */ = {isa = PBXFileReference; lastKnownFileType = text; name = fetchDependencies; path = ../fetchDependencies; sourceTree = "<group>"; };
-		A975D55C213F25D700D4834F /* create_dylib_ios.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = create_dylib_ios.sh; path = MoltenVK/scripts/create_dylib_ios.sh; sourceTree = SOURCE_ROOT; };
-		A975D55D213F266000D4834F /* create_dylib_macos.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = create_dylib_macos.sh; path = MoltenVK/scripts/create_dylib_macos.sh; sourceTree = SOURCE_ROOT; };
-		A975D561213F299500D4834F /* update_latest.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = update_latest.sh; sourceTree = "<group>"; };
-		A975D562213F2B7700D4834F /* package_docs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_docs.sh; sourceTree = "<group>"; };
-		A975D566213F2DAA00D4834F /* package_shader_converter.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_shader_converter.sh; sourceTree = "<group>"; };
-		A975D573214050AB00D4834F /* package_moltenvk.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_moltenvk.sh; sourceTree = "<group>"; };
-		A975D5742140567B00D4834F /* package_all.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_all.sh; sourceTree = "<group>"; };
+		A975D55C213F25D700D4834F /* create_dylib.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = create_dylib.sh; path = ../MoltenVK/scripts/create_dylib.sh; sourceTree = "<group>"; };
 		A98149E51FB78829005F00B4 /* MoltenVK_Runtime_UserGuide.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = MoltenVK_Runtime_UserGuide.md; path = Docs/MoltenVK_Runtime_UserGuide.md; sourceTree = "<group>"; };
+		A99A760321852584000A8E2A /* create_framework.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = create_framework.sh; path = ../MoltenVK/scripts/create_framework.sh; sourceTree = "<group>"; };
 		A9AD67D12054E2D700ED3C08 /* VulkanSamples_repo_revision */ = {isa = PBXFileReference; lastKnownFileType = text; path = VulkanSamples_repo_revision; sourceTree = "<group>"; };
 		A9AD67D32054E2D700ED3C08 /* SPIRV-Cross_repo_revision */ = {isa = PBXFileReference; lastKnownFileType = text; path = "SPIRV-Cross_repo_revision"; sourceTree = "<group>"; };
 		A9AD67E92055D8A600ED3C08 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
 		A9D3560A20BB3A2900BE295C /* glslang_repo_revision */ = {isa = PBXFileReference; lastKnownFileType = text; path = glslang_repo_revision; sourceTree = "<group>"; };
 		A9D3560B20BB3A5600BE295C /* Vulkan-Headers_repo_revision */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Vulkan-Headers_repo_revision"; sourceTree = "<group>"; };
 		A9D3560C20BB3A7200BE295C /* Vulkan-Tools_repo_revision */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Vulkan-Tools_repo_revision"; sourceTree = "<group>"; };
+		A9DA8340218A198C002AA662 /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .travis.yml; sourceTree = "<group>"; };
+		A9DA8341218A198C002AA662 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = "<group>"; };
 		A9EE46412065766C00193200 /* cereal_repo_revision */ = {isa = PBXFileReference; lastKnownFileType = text; path = cereal_repo_revision; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -236,9 +200,10 @@
 			children = (
 				A92DB3EE1CE0F72500FBC835 /* MoltenVK.xcodeproj */,
 				A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */,
+				A939A6FB1F5479D0006ACA0C /* External */,
 				A975D55B213F25AD00D4834F /* Scripts */,
 				A92DB3E11CE0F34500FBC835 /* Docs */,
-				A939A6FB1F5479D0006ACA0C /* External */,
+				A9DA833F218A193F002AA662 /* Git */,
 			);
 			sourceTree = "<group>";
 		};
@@ -256,8 +221,8 @@
 		A92DB3EF1CE0F72500FBC835 /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				A92DB3F51CE0F72500FBC835 /* MoltenVK.framework */,
-				A92DB3F71CE0F72500FBC835 /* MoltenVK.framework */,
+				A92DB3F51CE0F72500FBC835 /* libMoltenVK.a */,
+				A92DB3F71CE0F72500FBC835 /* libMoltenVK.a */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -281,13 +246,16 @@
 		A975D55B213F25AD00D4834F /* Scripts */ = {
 			isa = PBXGroup;
 			children = (
-				A975D55C213F25D700D4834F /* create_dylib_ios.sh */,
-				A975D55D213F266000D4834F /* create_dylib_macos.sh */,
-				A975D5742140567B00D4834F /* package_all.sh */,
-				A975D562213F2B7700D4834F /* package_docs.sh */,
-				A975D573214050AB00D4834F /* package_moltenvk.sh */,
-				A975D566213F2DAA00D4834F /* package_shader_converter.sh */,
-				A975D561213F299500D4834F /* update_latest.sh */,
+				A975D55C213F25D700D4834F /* create_dylib.sh */,
+				A99A760321852584000A8E2A /* create_framework.sh */,
+				A92EF7C921856EA200C8B91B /* package_docs.sh */,
+				A92EF7C521856EA200C8B91B /* package_ios.sh */,
+				A92EF7C821856EA200C8B91B /* package_macos.sh */,
+				A92EF7C621856EA200C8B91B /* package_moltenvk.sh */,
+				A92EF7C721856EA200C8B91B /* package_shader_converter_tool.sh */,
+				A92EF7CB21856EA300C8B91B /* package_shader_converter.sh */,
+				A92EF7CA21856EA200C8B91B /* package_update_latest.sh */,
+				A92EF7DE2186451700C8B91B /* Makefile */,
 			);
 			path = Scripts;
 			sourceTree = "<group>";
@@ -304,6 +272,15 @@
 			name = Products;
 			sourceTree = "<group>";
 		};
+		A9DA833F218A193F002AA662 /* Git */ = {
+			isa = PBXGroup;
+			children = (
+				A9DA8341218A198C002AA662 /* .gitignore */,
+				A9DA8340218A198C002AA662 /* .travis.yml */,
+			);
+			name = Git;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 
 /* Begin PBXProject section */
@@ -346,17 +323,17 @@
 /* End PBXProject section */
 
 /* Begin PBXReferenceProxy section */
-		A92DB3F51CE0F72500FBC835 /* MoltenVK.framework */ = {
+		A92DB3F51CE0F72500FBC835 /* libMoltenVK.a */ = {
 			isa = PBXReferenceProxy;
-			fileType = wrapper.framework;
-			path = MoltenVK.framework;
+			fileType = archive.ar;
+			path = libMoltenVK.a;
 			remoteRef = A92DB3F41CE0F72500FBC835 /* PBXContainerItemProxy */;
 			sourceTree = BUILT_PRODUCTS_DIR;
 		};
-		A92DB3F71CE0F72500FBC835 /* MoltenVK.framework */ = {
+		A92DB3F71CE0F72500FBC835 /* libMoltenVK.a */ = {
 			isa = PBXReferenceProxy;
-			fileType = wrapper.framework;
-			path = MoltenVK.framework;
+			fileType = archive.ar;
+			path = libMoltenVK.a;
 			remoteRef = A92DB3F61CE0F72500FBC835 /* PBXContainerItemProxy */;
 			sourceTree = BUILT_PRODUCTS_DIR;
 		};
@@ -410,7 +387,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Scripts/package_all.sh\"\n";
+			shellScript = "\"${SRCROOT}/Scripts/package_ios.sh\"\n";
 		};
 		A975D59A2140586700D4834F /* Package MoltenVK */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -424,21 +401,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Scripts/package_all.sh\"";
-		};
-		A9FEADD61F3517480010240E /* Package MoltenVK */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputPaths = (
-			);
-			name = "Package MoltenVK";
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = "\"${SRCROOT}/Scripts/package_all.sh\"\n";
+			shellScript = "\"${SRCROOT}/Scripts/package_macos.sh\"\n";
 		};
 /* End PBXShellScriptBuildPhase section */
 
@@ -478,40 +441,15 @@
 			name = MoltenVKShaderConverter;
 			targetProxy = A975D5992140586700D4834F /* PBXContainerItemProxy */;
 		};
-		A98149CB1FB7689D005F00B4 /* PBXTargetDependency */ = {
+		A9AFC2602184EEF60084B396 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			name = MoltenVKShaderConverter;
-			targetProxy = A98149CA1FB7689D005F00B4 /* PBXContainerItemProxy */;
+			target = A975D5782140585200D4834F /* MoltenVK-iOS */;
+			targetProxy = A9AFC25F2184EEF60084B396 /* PBXContainerItemProxy */;
 		};
-		A98149CD1FB7689D005F00B4 /* PBXTargetDependency */ = {
+		A9AFC2622184EEF60084B396 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			name = "MoltenVKGLSLToSPIRVConverter-iOS";
-			targetProxy = A98149CC1FB7689D005F00B4 /* PBXContainerItemProxy */;
-		};
-		A98149CF1FB7689D005F00B4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = "MoltenVKGLSLToSPIRVConverter-macOS";
-			targetProxy = A98149CE1FB7689D005F00B4 /* PBXContainerItemProxy */;
-		};
-		A98149D11FB7689D005F00B4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = "MoltenVKSPIRVToMSLConverter-iOS";
-			targetProxy = A98149D01FB7689D005F00B4 /* PBXContainerItemProxy */;
-		};
-		A98149D31FB7689D005F00B4 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = "MoltenVKSPIRVToMSLConverter-macOS";
-			targetProxy = A98149D21FB7689D005F00B4 /* PBXContainerItemProxy */;
-		};
-		A9FEADBD1F3517480010240E /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = "MoltenVK-iOS";
-			targetProxy = A9FEADBE1F3517480010240E /* PBXContainerItemProxy */;
-		};
-		A9FEADBF1F3517480010240E /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = "MoltenVK-macOS";
-			targetProxy = A9FEADC01F3517480010240E /* PBXContainerItemProxy */;
+			target = A975D58B2140586700D4834F /* MoltenVK-macOS */;
+			targetProxy = A9AFC2612184EEF60084B396 /* PBXContainerItemProxy */;
 		};
 /* End PBXTargetDependency section */
 
diff --git "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051 \050iOS only\051.xcscheme" "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051 \050iOS only\051.xcscheme"
deleted file mode 100644
index fe1548c..0000000
--- "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051 \050iOS only\051.xcscheme"
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   LastUpgradeVersion = "1000"
-   version = "1.3">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "A975D5782140585200D4834F"
-               BuildableName = "MoltenVK-iOS"
-               BlueprintName = "MoltenVK-iOS"
-               ReferencedContainer = "container:MoltenVKPackaging.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
-      <Testables>
-      </Testables>
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </TestAction>
-   <LaunchAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      ignoresPersistentStateOnLaunch = "NO"
-      debugDocumentVersioning = "NO"
-      debugServiceExtension = "internal"
-      enableGPUFrameCaptureMode = "1"
-      allowLocationSimulation = "NO">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A975D5782140585200D4834F"
-            BuildableName = "MoltenVK-iOS"
-            BlueprintName = "MoltenVK-iOS"
-            ReferencedContainer = "container:MoltenVKPackaging.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </LaunchAction>
-   <ProfileAction
-      buildConfiguration = "Release"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      debugDocumentVersioning = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A975D5782140585200D4834F"
-            BuildableName = "MoltenVK-iOS"
-            BlueprintName = "MoltenVK-iOS"
-            ReferencedContainer = "container:MoltenVKPackaging.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>
diff --git "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051 \050macOS only\051.xcscheme" "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051 \050macOS only\051.xcscheme"
deleted file mode 100644
index fb4c6a2..0000000
--- "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051 \050macOS only\051.xcscheme"
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   LastUpgradeVersion = "1000"
-   version = "1.3">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "A975D58B2140586700D4834F"
-               BuildableName = "MoltenVK-macOS"
-               BlueprintName = "MoltenVK-macOS"
-               ReferencedContainer = "container:MoltenVKPackaging.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
-      <Testables>
-      </Testables>
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </TestAction>
-   <LaunchAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      ignoresPersistentStateOnLaunch = "NO"
-      debugDocumentVersioning = "NO"
-      debugServiceExtension = "internal"
-      enableGPUFrameCaptureMode = "1"
-      allowLocationSimulation = "NO">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A975D58B2140586700D4834F"
-            BuildableName = "MoltenVK-macOS"
-            BlueprintName = "MoltenVK-macOS"
-            ReferencedContainer = "container:MoltenVKPackaging.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-      <AdditionalOptions>
-      </AdditionalOptions>
-   </LaunchAction>
-   <ProfileAction
-      buildConfiguration = "Release"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      debugDocumentVersioning = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A975D58B2140586700D4834F"
-            BuildableName = "MoltenVK-macOS"
-            BlueprintName = "MoltenVK-macOS"
-            ReferencedContainer = "container:MoltenVKPackaging.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>
diff --git "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051.xcscheme" "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051.xcscheme"
index 6462029..5a51a8c 100644
--- "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051.xcscheme"
+++ "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Debug\051.xcscheme"
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
    LastUpgradeVersion = "1000"
-   version = "1.3">
+   version = "2.0">
    <BuildAction
       parallelizeBuildables = "YES"
       buildImplicitDependencies = "YES">
@@ -36,13 +36,17 @@
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"
       debugDocumentVersioning = "NO"
+      debugXPCServices = "NO"
       debugServiceExtension = "internal"
-      enableGPUFrameCaptureMode = "1"
-      allowLocationSimulation = "NO">
+      enableGPUFrameCaptureMode = "3"
+      enableGPUValidationMode = "1"
+      allowLocationSimulation = "NO"
+      queueDebuggingEnabled = "No">
       <MacroExpansion>
          <BuildableReference
             BuildableIdentifier = "primary"
diff --git "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Release\051 \050iOS only\051.xcscheme" "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050iOS only\051.xcscheme"
similarity index 100%
rename from "MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Release\051 \050iOS only\051.xcscheme"
rename to "MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050iOS only\051.xcscheme"
diff --git "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Release\051 \050macOS only\051.xcscheme" "b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050macOS only\051.xcscheme"
similarity index 100%
rename from "MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Release\051 \050macOS only\051.xcscheme"
rename to "MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050macOS only\051.xcscheme"
diff --git "a/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Release\051.xcscheme" b/MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package.xcscheme
similarity index 100%
rename from "MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package \050Release\051.xcscheme"
rename to MoltenVKPackaging.xcodeproj/xcshareddata/xcschemes/MoltenVK Package.xcscheme
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme
index e9ea96b..7ad6164 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme
@@ -45,7 +45,7 @@
       debugServiceExtension = "internal"
       enableGPUFrameCaptureMode = "3"
       enableGPUValidationMode = "1"
-      allowLocationSimulation = "YES"
+      allowLocationSimulation = "NO"
       queueDebuggingEnabled = "No">
       <MacroExpansion>
          <BuildableReference
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme
index feddd31..6eeffb4 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme
@@ -45,7 +45,7 @@
       debugServiceExtension = "internal"
       enableGPUFrameCaptureMode = "3"
       enableGPUValidationMode = "1"
-      allowLocationSimulation = "YES"
+      allowLocationSimulation = "NO"
       queueDebuggingEnabled = "No">
       <MacroExpansion>
          <BuildableReference
diff --git a/README.md b/README.md
index a2ace1f..e90cb15 100644
--- a/README.md
+++ b/README.md
@@ -134,37 +134,51 @@
 
 To build a **MoltenVK** runtime distribution package, suitable for testing and integrating into an app, 
 open `MoltenVKPackaging.xcodeproj` in *Xcode*, and use one of the following *Xcode Schemes*, depending
-on whether you want a *Debug* or *Release* configuration, and whether you want to build for both the 
-*iOS* and *macOS* platforms, or just one platform:
+on whether you want a **_Release_** or **_Debug_** configuration, and whether you want to build for both
+the *iOS* and *macOS* platforms, or just one platform (in **_Release_** configuration):
 
+- **MoltenVK Package** 
 - **MoltenVK Package (Debug)** 
-- **MoltenVK Package (Debug) (iOS only)**
-- **MoltenVK Package (Debug) (macOS only)** 
-- **MoltenVK Package (Release)**
-- **MoltenVK Package (Release) (iOS only)**
-- **MoltenVK Package (Release) (macOS only)**
+- **MoltenVK Package (iOS only)**
+- **MoltenVK Package (macOS only)** 
 
 Each of these`MoltenVKPackaging.xcodeproj` *Xcode* project *Schemes* puts the resulting packages in the 
 `Package` directory, creating it if necessary. This directory contains separate `Release` and `Debug` 
-directories, holding the most recent **Release** and **Debug** builds, respectively.
+directories, holding the most recent **_Release_** and **_Debug_** builds, respectively.
 
-A separate `Latest` directory links to  the most recent build, regardless of whether it was a **Release** 
-or **Debug** build. Effectively, the `Package/Latest` directory points to whichever of the `Package/Release` 
+A separate `Latest` directory links to  the most recent build, regardless of whether it was a **_Release_** 
+or **_Debug_** build. Effectively, the `Package/Latest` directory points to whichever of the `Package/Release` 
 or `Package/Debug` directories was most recently updated.
 
 With this packaging structure, you can follow the [instructions below](#using) to link your application 
 to the **MoltenVK** frameworks in the `Package/Latest` directory, to provide the flexibility to test your 
-app with either a **Debug** build, or a higher-performance **Release** build.
+app with either a **_Debug_** build, or a higher-performance **_Release_** build.
 
 
 ### Building from the Command Line
 
 If you prefer to build **MoltenVK** from the command line, or to include the activity in a larger build script,
-you can do so using the following command within the `MoltenVK` repository, and identifying one of the 
-*Xcode Schemes* from the list above:
+you can do so using the following command within the `MoltenVK` repository folder, and identifying one of the 
+*Xcode Schemes* from the list above. For example, the following command will build **MoltenVK** in the 
+**_Release_** configuration for both *macOS* and *iOS*:
 
-	xcodebuild -project MoltenVKPackaging.xcodeproj -scheme "MoltenVK Package (Release)" build
+	xcodebuild -quiet -project MoltenVKPackaging.xcodeproj -scheme "MoltenVK Package" build
 
+Alternately, you can use the basic `Makefile` in the `MoltenVK` repository folder to build **MoltenVK** 
+in the **_Release_** configuration from the command line. The following `make` targets are provided:
+
+	make
+	make all
+	make macos
+	make ios
+	make clean
+
+The `make` targets above all require that *Xcode* is installed on your system.
+
+The default `make` command with no arguments is the same as `make all`. 
+
+Building from the command line creates the same `Package` folder structure described above when building
+from within *Xcode*.
 
 
 <a name="demos"></a>
diff --git a/Scripts/package_all.sh b/Scripts/package_all.sh
deleted file mode 100755
index dbcbced..0000000
--- a/Scripts/package_all.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-
-"${SRCROOT}/Scripts/package_moltenvk.sh"
-"${SRCROOT}/Scripts/package_shader_converter.sh"
-"${SRCROOT}/Scripts/package_docs.sh"
-"${SRCROOT}/Scripts/update_latest.sh"
-
diff --git a/Scripts/package_docs.sh b/Scripts/package_docs.sh
index 2d634d4..4d1cfb2 100755
--- a/Scripts/package_docs.sh
+++ b/Scripts/package_docs.sh
@@ -3,10 +3,8 @@
 set -e
 
 # Package folder
-export MVK_WKSPC_PATH="${PROJECT_DIR}"
-export MVK_PKG_LOCN="${MVK_WKSPC_PATH}/Package"
-export MVK_PKG_CONFIG_PATH="${MVK_PKG_LOCN}/${CONFIGURATION}"
+export MVK_PKG_CONFIG_PATH="${PROJECT_DIR}/Package/${CONFIGURATION}"
 
-# Copy the docs. Allow silent fail if a symlinked doc is not built.
-cp -a "${MVK_WKSPC_PATH}/LICENSE" "${MVK_PKG_CONFIG_PATH}"
-cp -pRLf "${MVK_WKSPC_PATH}/Docs" "${MVK_PKG_CONFIG_PATH}" 2> /dev/null || true
+# Copy the docs.
+cp -a "${PROJECT_DIR}/Docs" "${MVK_PKG_CONFIG_PATH}"
+cp -a "${PROJECT_DIR}/LICENSE" "${MVK_PKG_CONFIG_PATH}"
diff --git a/Scripts/package_ios.sh b/Scripts/package_ios.sh
new file mode 100755
index 0000000..ef8e658
--- /dev/null
+++ b/Scripts/package_ios.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+export MVK_OS="iOS"
+export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}-iphoneos"
+
+"${SRCROOT}/Scripts/package_moltenvk.sh"
+"${SRCROOT}/Scripts/package_shader_converter.sh"
+"${SRCROOT}/Scripts/package_docs.sh"
+"${SRCROOT}/Scripts/package_update_latest.sh"
+
diff --git a/Scripts/package_macos.sh b/Scripts/package_macos.sh
new file mode 100755
index 0000000..3740158
--- /dev/null
+++ b/Scripts/package_macos.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+export MVK_OS="macOS"
+export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}"
+
+"${SRCROOT}/Scripts/package_moltenvk.sh"
+"${SRCROOT}/Scripts/package_shader_converter.sh"
+"${SRCROOT}/Scripts/package_shader_converter_tool.sh"
+"${SRCROOT}/Scripts/package_docs.sh"
+"${SRCROOT}/Scripts/package_update_latest.sh"
+
diff --git a/Scripts/package_moltenvk.sh b/Scripts/package_moltenvk.sh
index c22562e..f76b31c 100755
--- a/Scripts/package_moltenvk.sh
+++ b/Scripts/package_moltenvk.sh
@@ -2,42 +2,23 @@
 
 set -e
 
-# Package folder
 export MVK_PROD_NAME="MoltenVK"
-export MVK_DYLIB_NAME="lib${MVK_PROD_NAME}.dylib"
-export MVK_ICD_NAME="${MVK_PROD_NAME}_icd.json"
-export MVK_WKSPC_PATH="${PROJECT_DIR}"
-export MVK_PROD_PROJ_PATH="${MVK_WKSPC_PATH}/${MVK_PROD_NAME}"
-export MVK_PKG_LOCN="${MVK_WKSPC_PATH}/Package"
-export MVK_PKG_CONFIG_PATH="${MVK_PKG_LOCN}/${CONFIGURATION}"
-export MVK_PKG_PROD_PATH="${MVK_PKG_CONFIG_PATH}/${MVK_PROD_NAME}"
+export MVK_PROD_PROJ_PATH="${PROJECT_DIR}/${MVK_PROD_NAME}"
+export MVK_PKG_PROD_PATH="${PROJECT_DIR}/Package/${CONFIGURATION}/${MVK_PROD_NAME}"
+export MVK_PKG_PROD_PATH_OS="${MVK_PKG_PROD_PATH}/${MVK_OS}"
 
-# Remove the product folder
-rm -rf "${MVK_PKG_PROD_PATH}"
+rm -rf "${MVK_PKG_PROD_PATH_OS}"
+mkdir -p "${MVK_PKG_PROD_PATH_OS}/static"
+cp -a "${MVK_BUILT_PROD_PATH}/lib${MVK_PROD_NAME}.a" "${MVK_PKG_PROD_PATH_OS}/static"
+mkdir -p "${MVK_PKG_PROD_PATH_OS}/dynamic"
+cp -a "${MVK_BUILT_PROD_PATH}/lib${MVK_PROD_NAME}.dylib" "${MVK_PKG_PROD_PATH_OS}/dynamic"
+cp -a "${MVK_PROD_PROJ_PATH}/icd/${MVK_PROD_NAME}_icd.json" "${MVK_PKG_PROD_PATH_OS}/dynamic"
+mkdir -p "${MVK_PKG_PROD_PATH_OS}/framework"
+cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework" "${MVK_PKG_PROD_PATH_OS}/framework"
 
-# Remove and replace the existing macOS framework folder and copy framework into it
-export MVK_OS_PROD_PATH="${MVK_PKG_PROD_PATH}/macOS"
-export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}"
-rm -rf "${MVK_OS_PROD_PATH}"
-if [ -e "${MVK_BUILT_PROD_PATH}" ]; then
-	mkdir -p "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework" "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_BUILT_PROD_PATH}/${MVK_DYLIB_NAME}" "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_PROD_PROJ_PATH}/icd/${MVK_ICD_NAME}" "${MVK_OS_PROD_PATH}"
-fi
+# Remove the code signature
+rm -rf "${MVK_PKG_PROD_PATH_OS}/framework/${MVK_PROD_NAME}.framework/_CodeSignature"
 
-# Remove and replace the existing iOS framework folder and copy framework into it
-export MVK_OS_PROD_PATH="${MVK_PKG_PROD_PATH}/iOS"
-export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}-iphoneos"
-rm -rf "${MVK_OS_PROD_PATH}"
-echo MVK_BUILT_PROD_PATH = "${MVK_BUILT_PROD_PATH}"
-if [ -e "${MVK_BUILT_PROD_PATH}" ]; then
-	rm -rf "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework/_CodeSignature"
-	mkdir -p "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework" "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_BUILT_PROD_PATH}/${MVK_DYLIB_NAME}" "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_PROD_PROJ_PATH}/icd/${MVK_ICD_NAME}" "${MVK_OS_PROD_PATH}"
-fi
 # Remove and replace header include folder
 rm -rf "${MVK_PKG_PROD_PATH}/include"
 cp -pRL "${MVK_PROD_PROJ_PATH}/include" "${MVK_PKG_PROD_PATH}"
diff --git a/Scripts/package_shader_converter.sh b/Scripts/package_shader_converter.sh
index fc001a4..410f00f 100755
--- a/Scripts/package_shader_converter.sh
+++ b/Scripts/package_shader_converter.sh
@@ -2,72 +2,25 @@
 
 set -e
 
-# Package folder
 export MVK_PROD_BASE_NAME="MoltenVKShaderConverter"
-export MVK_WKSPC_PATH="${PROJECT_DIR}"
-export MVK_PKG_LOCN="${MVK_WKSPC_PATH}/Package"
-
-# Remove the base product folder
-rm -rf "${MVK_PKG_LOCN}/${CONFIGURATION}/${MVK_PROD_BASE_NAME}"
+export MVK_PKG_CONFIG_BASE_PATH="${PROJECT_DIR}/Package/${CONFIGURATION}/${MVK_PROD_BASE_NAME}"
 
 #-----------------------------------
 # MoltenVKGLSLToSPIRVConverter
 export MVK_PROD_NAME="MoltenVKGLSLToSPIRVConverter"
-export MVK_PKG_CONFIG_PATH="${MVK_PKG_LOCN}/${CONFIGURATION}/${MVK_PROD_BASE_NAME}/${MVK_PROD_NAME}"
+export MVK_PKG_PROD_PATH_OS="${MVK_PKG_CONFIG_BASE_PATH}/${MVK_PROD_NAME}/${MVK_OS}"
 
-# Remove and replace the existing macOS framework folder and copy framework into it
-export MVK_OS_PROD_PATH="${MVK_PKG_CONFIG_PATH}/macOS"
-export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}"
-rm -rf "${MVK_OS_PROD_PATH}"
-if [ -e "${MVK_BUILT_PROD_PATH}" ]; then
-	mkdir -p "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework" "${MVK_OS_PROD_PATH}"
-fi
-
-# Remove and replace the existing iOS framework folder and copy framework into it
-export MVK_OS_PROD_PATH="${MVK_PKG_CONFIG_PATH}/iOS"
-export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}-iphoneos"
-rm -rf "${MVK_OS_PROD_PATH}"
-if [ -e "${MVK_BUILT_PROD_PATH}" ]; then
-	rm -rf "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework/_CodeSignature"
-	mkdir -p "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework" "${MVK_OS_PROD_PATH}"
-fi
+rm -rf "${MVK_PKG_PROD_PATH_OS}"
+mkdir -p "${MVK_PKG_PROD_PATH_OS}"
+cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework" "${MVK_PKG_PROD_PATH_OS}"
+rm -rf "${MVK_PKG_PROD_PATH_OS}/${MVK_PROD_NAME}.framework/_CodeSignature"
 
 #-----------------------------------
 # MoltenVKSPIRVToMSLConverter
 export MVK_PROD_NAME="MoltenVKSPIRVToMSLConverter"
-export MVK_PKG_CONFIG_PATH="${MVK_PKG_LOCN}/${CONFIGURATION}/${MVK_PROD_BASE_NAME}/${MVK_PROD_NAME}"
+export MVK_PKG_PROD_PATH_OS="${MVK_PKG_CONFIG_BASE_PATH}/${MVK_PROD_NAME}/${MVK_OS}"
 
-# Remove and replace the existing macOS framework folder and copy framework into it
-export MVK_OS_PROD_PATH="${MVK_PKG_CONFIG_PATH}/macOS"
-export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}"
-rm -rf "${MVK_OS_PROD_PATH}"
-if [ -e "${MVK_BUILT_PROD_PATH}" ]; then
-	mkdir -p "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework" "${MVK_OS_PROD_PATH}"
-fi
-
-# Remove and replace the existing iOS framework folder and copy framework into it
-export MVK_OS_PROD_PATH="${MVK_PKG_CONFIG_PATH}/iOS"
-export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}-iphoneos"
-rm -rf "${MVK_OS_PROD_PATH}"
-if [ -e "${MVK_BUILT_PROD_PATH}" ]; then
-	rm -rf "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework/_CodeSignature"
-	mkdir -p "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework" "${MVK_OS_PROD_PATH}"
-fi
-
-#-----------------------------------
-# MoltenVKShaderConverter Tool
-export MVK_PROD_NAME="MoltenVKShaderConverter"
-export MVK_PKG_CONFIG_PATH="${MVK_PKG_LOCN}/${CONFIGURATION}/${MVK_PROD_BASE_NAME}"
-
-# Remove and replace the existing macOS framework folder and copy framework into it
-export MVK_OS_PROD_PATH="${MVK_PKG_CONFIG_PATH}/Tools"
-export MVK_BUILT_PROD_PATH="${BUILT_PRODUCTS_DIR}"
-rm -rf "${MVK_OS_PROD_PATH}"
-if [ -e "${MVK_BUILT_PROD_PATH}" ]; then
-	mkdir -p "${MVK_OS_PROD_PATH}"
-	cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}" "${MVK_OS_PROD_PATH}"
-fi
+rm -rf "${MVK_PKG_PROD_PATH_OS}"
+mkdir -p "${MVK_PKG_PROD_PATH_OS}"
+cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}.framework" "${MVK_PKG_PROD_PATH_OS}"
+rm -rf "${MVK_PKG_PROD_PATH_OS}/${MVK_PROD_NAME}.framework/_CodeSignature"
diff --git a/Scripts/package_shader_converter_tool.sh b/Scripts/package_shader_converter_tool.sh
new file mode 100755
index 0000000..e893ec6
--- /dev/null
+++ b/Scripts/package_shader_converter_tool.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+set -e
+
+export MVK_PROD_NAME="MoltenVKShaderConverter"
+export MVK_PKG_PROD_PATH_OS="${PROJECT_DIR}/Package/${CONFIGURATION}/${MVK_PROD_NAME}/Tools"
+
+rm -rf "${MVK_PKG_PROD_PATH_OS}"
+mkdir -p "${MVK_PKG_PROD_PATH_OS}"
+cp -a "${MVK_BUILT_PROD_PATH}/${MVK_PROD_NAME}" "${MVK_PKG_PROD_PATH_OS}"
diff --git a/Scripts/package_update_latest.sh b/Scripts/package_update_latest.sh
new file mode 100755
index 0000000..8032355
--- /dev/null
+++ b/Scripts/package_update_latest.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+
+set -e
+
+# Package folder
+export MVK_PKG_PATH="${PROJECT_DIR}/Package"
+
+# Assign symlink to Latest
+ln -sfn "${MVK_PKG_PATH}/${CONFIGURATION}" "${MVK_PKG_PATH}/Latest"
diff --git a/Scripts/update_latest.sh b/Scripts/update_latest.sh
deleted file mode 100755
index 8abc75c..0000000
--- a/Scripts/update_latest.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-
-set -e
-
-# Package folder
-export MVK_WKSPC_LOCN="${PROJECT_DIR}"
-export MVK_PKG_LOCN="${MVK_WKSPC_LOCN}/Package"
-
-# Configuration package folder location
-export MVK_PKG_CONFIG_LOCN="${CONFIGURATION}"
-export MVK_PKG_LATEST_LOCN="Latest"
-
-# Assign symlink from Latest
-ln -sfn "${MVK_PKG_LOCN}/${MVK_PKG_CONFIG_LOCN}" "${MVK_PKG_LOCN}/${MVK_PKG_LATEST_LOCN}"