Merge branch 'master' of https://github.com/KhronosGroup/MoltenVK
diff --git a/.travis.yml b/.travis.yml
index f580812..503dc99 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,7 +2,7 @@
 
 # macOS and Xcode Version
 os: osx
-osx_image: xcode11.5
+osx_image: xcode12
 
 # Build with verbose logging to avoid Travis timing out.
 script:
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 48723fe..c7e6862 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/project.pbxproj
+++ b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 48;
+	objectVersion = 52;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -27,6 +27,8 @@
 		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 */; };
+		A991E26924FCA59600D968D4 /* MoltenVK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A991E26824FCA59600D968D4 /* MoltenVK.xcframework */; };
+		A991E26A24FCA59600D968D4 /* MoltenVK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A991E26824FCA59600D968D4 /* MoltenVK.xcframework */; };
 		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 */; };
@@ -39,10 +41,6 @@
 		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 */
@@ -90,6 +88,7 @@
 		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; };
+		A991E26824FCA59600D968D4 /* MoltenVK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = MoltenVK.xcframework; path = ../../../MoltenVK/MoltenVK.xcframework; sourceTree = "<group>"; };
 		A99B2F0D24436190001117F7 /* generateSPIRVShaders */ = {isa = PBXFileReference; lastKnownFileType = text; path = generateSPIRVShaders; 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>"; };
@@ -111,10 +110,6 @@
 		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>"; };
-		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 */
@@ -122,8 +117,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9C2ABA3218505B000DDBC03 /* MoltenVK.framework in Frameworks */,
-				A9C2ABA2218505B000DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */,
+				A991E26924FCA59600D968D4 /* MoltenVK.xcframework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -131,8 +125,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9C2ABA7218505CB00DDBC03 /* MoltenVK.framework in Frameworks */,
-				A9C2ABA6218505CB00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework in Frameworks */,
+				A991E26A24FCA59600D968D4 /* MoltenVK.xcframework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -496,10 +489,7 @@
 		A9C2AB9F218505B000DDBC03 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				A9C2ABA5218505CB00DDBC03 /* MoltenVK.framework */,
-				A9C2ABA4218505CB00DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */,
-				A9C2ABA1218505B000DDBC03 /* MoltenVK.framework */,
-				A9C2ABA0218505B000DDBC03 /* MoltenVKGLSLToSPIRVConverter.framework */,
+				A991E26824FCA59600D968D4 /* MoltenVK.xcframework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -643,10 +633,6 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
-				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/iOS/framework\"",
-					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS/framework\"",
-				);
 				GCC_PREFIX_HEADER = "$(SRCROOT)/iOS/Prefix.pch";
 				GCC_PREPROCESSOR_DEFINITIONS = (
 					"$(inherited)",
@@ -670,10 +656,6 @@
 				CODE_SIGN_IDENTITY = "iPhone Developer";
 				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_TEAM = "";
-				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/iOS/framework\"",
-					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS/framework\"",
-				);
 				GCC_PREFIX_HEADER = "$(SRCROOT)/iOS/Prefix.pch";
 				GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
 				GCC_WARN_64_TO_32_BIT_CONVERSION = NO;
@@ -692,10 +674,6 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				COMBINE_HIDPI_IMAGES = YES;
-				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/macOS/framework\"",
-					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS/framework\"",
-				);
 				GCC_PREFIX_HEADER = "$(SRCROOT)/macOS/Prefix.pch";
 				GCC_PREPROCESSOR_DEFINITIONS = (
 					"$(inherited)",
@@ -719,10 +697,6 @@
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				COMBINE_HIDPI_IMAGES = YES;
-				FRAMEWORK_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/macOS/framework\"",
-					"\"$(SRCROOT)/../../../MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS/framework\"",
-				);
 				GCC_PREFIX_HEADER = "$(SRCROOT)/macOS/Prefix.pch";
 				GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
 				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info.plist";
@@ -759,7 +733,7 @@
 				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				HEADER_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/include\"",
+					"\"$(SRCROOT)/include\"",
 					"\"$(SRCROOT)/../VulkanSamples/API-Samples/utils\"",
 				);
 				ONLY_ACTIVE_ARCH = YES;
@@ -787,7 +761,7 @@
 				GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = NO;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
 				HEADER_SEARCH_PATHS = (
-					"\"$(SRCROOT)/../../../MoltenVK/include\"",
+					"\"$(SRCROOT)/include\"",
 					"\"$(SRCROOT)/../VulkanSamples/API-Samples/utils\"",
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = "com.moltenvk.${PRODUCT_NAME:identifier}";
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-iOS.xcscheme b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-iOS.xcscheme
index 5275333..0d68747 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-iOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-iOS.xcscheme
@@ -27,15 +27,6 @@
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "1D6058900D05DD3D006BFB54"
-            BuildableName = "API-Samples.app"
-            BlueprintName = "API-Samples-iOS"
-            ReferencedContainer = "container:API-Samples.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
       <Testables>
       </Testables>
    </TestAction>
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-macOS.xcscheme b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-macOS.xcscheme
index beeee17..6be3dac 100644
--- a/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-macOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj/xcshareddata/xcschemes/API-Samples-macOS.xcscheme
@@ -27,15 +27,6 @@
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A977BCBD1B66BB010067E5BF"
-            BuildableName = "API-Samples.app"
-            BlueprintName = "API-Samples-macOS"
-            ReferencedContainer = "container:API-Samples.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
       <Testables>
       </Testables>
    </TestAction>
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/include/MoltenVK b/Demos/LunarG-VulkanSamples/API-Samples/include/MoltenVK
new file mode 120000
index 0000000..aa025ad
--- /dev/null
+++ b/Demos/LunarG-VulkanSamples/API-Samples/include/MoltenVK
@@ -0,0 +1 @@
+../../../../MoltenVK/include/MoltenVK
\ No newline at end of file
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/include/MoltenVKGLSLToSPIRVConverter b/Demos/LunarG-VulkanSamples/API-Samples/include/MoltenVKGLSLToSPIRVConverter
new file mode 120000
index 0000000..b03c7b1
--- /dev/null
+++ b/Demos/LunarG-VulkanSamples/API-Samples/include/MoltenVKGLSLToSPIRVConverter
@@ -0,0 +1 @@
+../../../../MoltenVKShaderConverter/include/MoltenVKShaderConverter
\ No newline at end of file
diff --git a/Demos/LunarG-VulkanSamples/API-Samples/include/vulkan b/Demos/LunarG-VulkanSamples/API-Samples/include/vulkan
new file mode 120000
index 0000000..00414df
--- /dev/null
+++ b/Demos/LunarG-VulkanSamples/API-Samples/include/vulkan
@@ -0,0 +1 @@
+../../../../MoltenVK/include/vulkan
\ No newline at end of file
diff --git a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj
index cc2ab9d..943125e 100644
--- a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj
+++ b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 48;
+	objectVersion = 52;
 	objects = {
 
 /* Begin PBXBuildFile section */
@@ -13,9 +13,10 @@
 		A93DBF4124A2A4D500079F64 /* DemoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B6F1C3AAE9800373FFD /* DemoViewController.m */; };
 		A93DBF4224A2A4D500079F64 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B6C1C3AAE9800373FFD /* AppDelegate.m */; };
 		A93DBF4324A2A4D500079F64 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = A9B67B711C3AAE9800373FFD /* main.m */; };
-		A93DBF4E24A2A6F000079F64 /* libMoltenVK.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A93DBF4D24A2A6F000079F64 /* libMoltenVK.dylib */; };
-		A93DBF4F24A2A6F000079F64 /* libMoltenVK.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A93DBF4D24A2A6F000079F64 /* libMoltenVK.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
 		A94D4CB724A2C9A3009C9139 /* MainTV.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A94D4CB624A2C9A3009C9139 /* MainTV.storyboard */; };
+		A991E27624FD543A00D968D4 /* MoltenVK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A991E27524FD543A00D968D4 /* MoltenVK.xcframework */; };
+		A991E27724FD543A00D968D4 /* MoltenVK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A991E27524FD543A00D968D4 /* MoltenVK.xcframework */; };
+		A991E27824FD543A00D968D4 /* MoltenVK.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A991E27524FD543A00D968D4 /* MoltenVK.xcframework */; };
 		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 */; };
@@ -28,53 +29,16 @@
 		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 */
-		A91F43A11EDDD48800733D01 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = "";
-			dstSubfolderSpec = 10;
-			files = (
-				A9C2ABB02185098A00DDBC03 /* libMoltenVK.dylib in CopyFiles */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		A93DBF4624A2A4D500079F64 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = "";
-			dstSubfolderSpec = 10;
-			files = (
-				A93DBF4F24A2A6F000079F64 /* libMoltenVK.dylib in CopyFiles */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		A9B2A5571D7E4FC400F66656 /* CopyFiles */ = {
-			isa = PBXCopyFilesBuildPhase;
-			buildActionMask = 2147483647;
-			dstPath = "";
-			dstSubfolderSpec = 10;
-			files = (
-				A9C2ABB12185099500DDBC03 /* libMoltenVK.dylib in CopyFiles */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-/* End PBXCopyFilesBuildPhase section */
-
 /* Begin PBXFileReference section */
 		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>"; };
 		A93DBF4B24A2A4D500079F64 /* Cube.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cube.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		A93DBF4D24A2A6F000079F64 /* libMoltenVK.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libMoltenVK.dylib; path = ../../../MoltenVK/tvOS/dynamic/libMoltenVK.dylib; sourceTree = "<group>"; };
 		A94D4CB424A2A95E009C9139 /* InfoTV.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = InfoTV.plist; sourceTree = "<group>"; };
 		A94D4CB624A2C9A3009C9139 /* MainTV.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = MainTV.storyboard; sourceTree = "<group>"; };
+		A991E27524FD543A00D968D4 /* MoltenVK.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = MoltenVK.xcframework; path = ../../../MoltenVK/MoltenVK.xcframework; 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>"; };
@@ -97,8 +61,6 @@
 		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>"; };
-		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 */
@@ -106,7 +68,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A93DBF4E24A2A6F000079F64 /* libMoltenVK.dylib in Frameworks */,
+				A991E27724FD543A00D968D4 /* MoltenVK.xcframework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -114,7 +76,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9C2ABAD2185087500DDBC03 /* libMoltenVK.dylib in Frameworks */,
+				A991E27824FD543A00D968D4 /* MoltenVK.xcframework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -122,7 +84,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9C2ABAC2185086D00DDBC03 /* libMoltenVK.dylib in Frameworks */,
+				A991E27624FD543A00D968D4 /* MoltenVK.xcframework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -217,9 +179,7 @@
 		A9C2ABA82185085B00DDBC03 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				A93DBF4D24A2A6F000079F64 /* libMoltenVK.dylib */,
-				A9C2ABAB2185086D00DDBC03 /* libMoltenVK.dylib */,
-				A9C2ABA92185085B00DDBC03 /* libMoltenVK.dylib */,
+				A991E27524FD543A00D968D4 /* MoltenVK.xcframework */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -234,7 +194,6 @@
 				A93DBF3B24A2A4D500079F64 /* Resources */,
 				A93DBF4024A2A4D500079F64 /* Sources */,
 				A93DBF4424A2A4D500079F64 /* Frameworks */,
-				A93DBF4624A2A4D500079F64 /* CopyFiles */,
 			);
 			buildRules = (
 			);
@@ -252,7 +211,6 @@
 				A9B53B141C3AC0BE00ABC6F6 /* Resources */,
 				A9B53B171C3AC0BE00ABC6F6 /* Sources */,
 				A9B53B1B1C3AC0BE00ABC6F6 /* Frameworks */,
-				A9B2A5571D7E4FC400F66656 /* CopyFiles */,
 			);
 			buildRules = (
 			);
@@ -270,7 +228,6 @@
 				A9B53B2E1C3AC15200ABC6F6 /* Resources */,
 				A9B53B331C3AC15200ABC6F6 /* Sources */,
 				A9B53B371C3AC15200ABC6F6 /* Frameworks */,
-				A91F43A11EDDD48800733D01 /* CopyFiles */,
 			);
 			buildRules = (
 			);
@@ -391,8 +348,6 @@
 					MVK_SAMP_CUBE,
 				);
 				INFOPLIST_FILE = "$(SRCROOT)/iOS/InfoTV.plist";
-				LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/tvOS/dynamic\"";
 				MARKETING_VERSION = 1;
 				PRODUCT_NAME = Cube;
 				SDKROOT = appletvos;
@@ -412,8 +367,6 @@
 					MVK_SAMP_CUBE,
 				);
 				INFOPLIST_FILE = "$(SRCROOT)/iOS/InfoTV.plist";
-				LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/tvOS/dynamic\"";
 				MARKETING_VERSION = 1;
 				PRODUCT_NAME = Cube;
 				SDKROOT = appletvos;
@@ -432,8 +385,6 @@
 					MVK_SAMP_CUBE,
 				);
 				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info.plist";
-				LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/macOS/dynamic\"";
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				PRODUCT_NAME = Cube;
 				SDKROOT = macosx;
@@ -451,8 +402,6 @@
 					MVK_SAMP_CUBE,
 				);
 				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info.plist";
-				LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/macOS/dynamic\"";
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				PRODUCT_NAME = Cube;
 				SDKROOT = macosx;
@@ -472,8 +421,6 @@
 				);
 				INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
-				LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/iOS/dynamic\"";
 				MARKETING_VERSION = 1;
 				PRODUCT_NAME = Cube;
 				SDKROOT = iphoneos;
@@ -494,8 +441,6 @@
 				);
 				INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
-				LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/iOS/dynamic\"";
 				MARKETING_VERSION = 1;
 				PRODUCT_NAME = Cube;
 				SDKROOT = iphoneos;
@@ -529,7 +474,10 @@
 					"\"$(SRCROOT)/../../../MoltenVK/include\"",
 				);
 				ONLY_ACTIVE_ARCH = YES;
-				OTHER_LDFLAGS = "-ObjC";
+				OTHER_LDFLAGS = (
+					"-ObjC",
+					"-lstdc++",
+				);
 				PRODUCT_BUNDLE_IDENTIFIER = "com.moltenvk.${PRODUCT_NAME:identifier}";
 			};
 			name = Debug;
@@ -553,7 +501,10 @@
 					"\"$(SRCROOT)/include\"",
 					"\"$(SRCROOT)/../../../MoltenVK/include\"",
 				);
-				OTHER_LDFLAGS = "-ObjC";
+				OTHER_LDFLAGS = (
+					"-ObjC",
+					"-lstdc++",
+				);
 				PRODUCT_BUNDLE_IDENTIFIER = "com.moltenvk.${PRODUCT_NAME:identifier}";
 			};
 			name = Release;
diff --git a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-iOS.xcscheme b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-iOS.xcscheme
index 6c3e35a..7e7431a 100644
--- a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-iOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-iOS.xcscheme
@@ -27,15 +27,6 @@
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A9B53B291C3AC15200ABC6F6"
-            BuildableName = "Cube.app"
-            BlueprintName = "Cube-iOS"
-            ReferencedContainer = "container:Cube.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
       <Testables>
       </Testables>
    </TestAction>
diff --git a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-macOS.xcscheme b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-macOS.xcscheme
index 6344ada..ee686bb 100644
--- a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-macOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-macOS.xcscheme
@@ -27,15 +27,6 @@
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A9B53B0F1C3AC0BE00ABC6F6"
-            BuildableName = "Cube.app"
-            BlueprintName = "Cube-macOS"
-            ReferencedContainer = "container:Cube.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
       <Testables>
       </Testables>
    </TestAction>
diff --git a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-tvOS.xcscheme b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-tvOS.xcscheme
index 694d0ac..851887a 100644
--- a/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-tvOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj/xcshareddata/xcschemes/Cube-tvOS.xcscheme
@@ -27,15 +27,6 @@
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A9B53B291C3AC15200ABC6F6"
-            BuildableName = "Cube.app"
-            BlueprintName = "Cube-iOS"
-            ReferencedContainer = "container:Cube.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
       <Testables>
       </Testables>
    </TestAction>
diff --git a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj
index bda4518..902ad08 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj
+++ b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/project.pbxproj
@@ -7,6 +7,10 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
+		A92806E724FD77C00082B2CF /* libMoltenVK.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A991E27124FD520900D968D4 /* libMoltenVK.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
+		A92806E924FD77EC0082B2CF /* libMoltenVK.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = A991E27324FD521600D968D4 /* libMoltenVK.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
+		A991E27224FD520900D968D4 /* libMoltenVK.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A991E27124FD520900D968D4 /* libMoltenVK.dylib */; };
+		A991E27424FD521600D968D4 /* libMoltenVK.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = A991E27324FD521600D968D4 /* libMoltenVK.dylib */; };
 		A99789AF1CD3D4E2005E7DAC /* Hologram.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A99789831CD3D4E2005E7DAC /* Hologram.cpp */; };
 		A99789B01CD3D4E2005E7DAC /* Hologram.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A99789831CD3D4E2005E7DAC /* Hologram.cpp */; };
 		A99789B71CD3D4E2005E7DAC /* Main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A99789881CD3D4E2005E7DAC /* Main.cpp */; };
@@ -31,12 +35,33 @@
 		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 */; };
-		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 */; };
 /* End PBXBuildFile section */
 
+/* Begin PBXCopyFilesBuildPhase section */
+		A92806E624FD77AA0082B2CF /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+				A92806E724FD77C00082B2CF /* libMoltenVK.dylib in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		A92806E824FD77D50082B2CF /* CopyFiles */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = "";
+			dstSubfolderSpec = 10;
+			files = (
+				A92806E924FD77EC0082B2CF /* libMoltenVK.dylib in CopyFiles */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
 /* Begin PBXFileReference section */
 		1D6058910D05DD3D006BFB54 /* Hologram.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Hologram.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		A93374642284CD260059D36E /* Hologram.vert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Hologram.vert.h; path = android/src/main/jni/Hologram.vert.h; sourceTree = "<group>"; };
@@ -45,6 +70,8 @@
 		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>"; };
 		A977BCFE1B66BB010067E5BF /* Hologram.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Hologram.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		A991E27124FD520900D968D4 /* libMoltenVK.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libMoltenVK.dylib; path = ../../../MoltenVK/dylib/iOS/libMoltenVK.dylib; sourceTree = "<group>"; };
+		A991E27324FD521600D968D4 /* libMoltenVK.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libMoltenVK.dylib; path = ../../../MoltenVK/dylib/macOS/libMoltenVK.dylib; sourceTree = "<group>"; };
 		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>"; };
@@ -79,8 +106,6 @@
 		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>"; };
-		A9C2AB97218503A400DDBC03 /* libMoltenVK.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libMoltenVK.a; path = ../../../MoltenVK/iOS/static/libMoltenVK.a; 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 = "<group>"; };
 		A9D516F71CD575E300097D96 /* HelpersDispatchTable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HelpersDispatchTable.h; sourceTree = "<group>"; };
 /* End PBXFileReference section */
@@ -90,7 +115,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9C2AB99218503A400DDBC03 /* libMoltenVK.a in Frameworks */,
+				A991E27224FD520900D968D4 /* libMoltenVK.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -98,7 +123,7 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A9C2AB9E218503BA00DDBC03 /* libMoltenVK.a in Frameworks */,
+				A991E27424FD521600D968D4 /* libMoltenVK.dylib in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -207,8 +232,8 @@
 		A9C2AB96218503A400DDBC03 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
-				A9C2AB9C218503BA00DDBC03 /* libMoltenVK.a */,
-				A9C2AB97218503A400DDBC03 /* libMoltenVK.a */,
+				A991E27124FD520900D968D4 /* libMoltenVK.dylib */,
+				A991E27324FD521600D968D4 /* libMoltenVK.dylib */,
 			);
 			name = Frameworks;
 			sourceTree = "<group>";
@@ -232,6 +257,7 @@
 				1D60588D0D05DD3D006BFB54 /* Resources */,
 				1D60588E0D05DD3D006BFB54 /* Sources */,
 				1D60588F0D05DD3D006BFB54 /* Frameworks */,
+				A92806E624FD77AA0082B2CF /* CopyFiles */,
 			);
 			buildRules = (
 			);
@@ -249,6 +275,7 @@
 				A977BCBE1B66BB010067E5BF /* Resources */,
 				A977BCC91B66BB010067E5BF /* Sources */,
 				A977BCF11B66BB010067E5BF /* Frameworks */,
+				A92806E824FD77D50082B2CF /* CopyFiles */,
 			);
 			buildRules = (
 			);
@@ -358,7 +385,8 @@
 				GCC_PREFIX_HEADER = "$(SRCROOT)/iOS/Prefix.pch";
 				INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/iOS/static\"";
+				LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/dylib/iOS\"";
 				MARKETING_VERSION = 1;
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
@@ -374,7 +402,8 @@
 				GCC_PREFIX_HEADER = "$(SRCROOT)/iOS/Prefix.pch";
 				INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist";
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/iOS/static\"";
+				LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/dylib/iOS\"";
 				MARKETING_VERSION = 1;
 				SDKROOT = iphoneos;
 				TARGETED_DEVICE_FAMILY = "1,2";
@@ -388,7 +417,8 @@
 				COMBINE_HIDPI_IMAGES = YES;
 				GCC_PREFIX_HEADER = "$(SRCROOT)/macOS/Prefix.pch";
 				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info.plist";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/macOS/static\"";
+				LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks";
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/dylib/macOS\"";
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				OTHER_LDFLAGS = (
 					"$(inherited)",
@@ -405,7 +435,8 @@
 				COMBINE_HIDPI_IMAGES = YES;
 				GCC_PREFIX_HEADER = "$(SRCROOT)/macOS/Prefix.pch";
 				INFOPLIST_FILE = "$(SRCROOT)/macOS/Info.plist";
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/macOS/static\"";
+				LD_RUNPATH_SEARCH_PATHS = "@executable_path/../Frameworks";
+				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../../../MoltenVK/dylib/macOS\"";
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				OTHER_LDFLAGS = (
 					"$(inherited)",
diff --git a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-iOS.xcscheme b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-iOS.xcscheme
index 3e0f340..3d15109 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-iOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-iOS.xcscheme
@@ -27,15 +27,6 @@
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "1D6058900D05DD3D006BFB54"
-            BuildableName = "Hologram.app"
-            BlueprintName = "Hologram-iOS"
-            ReferencedContainer = "container:Hologram.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
       <Testables>
       </Testables>
    </TestAction>
diff --git a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-macOS.xcscheme b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-macOS.xcscheme
index 354ab2d..b597c72 100644
--- a/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-macOS.xcscheme
+++ b/Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj/xcshareddata/xcschemes/Hologram-macOS.xcscheme
@@ -27,15 +27,6 @@
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A977BCBD1B66BB010067E5BF"
-            BuildableName = "Hologram.app"
-            BlueprintName = "Hologram-macOS"
-            ReferencedContainer = "container:Hologram.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
       <Testables>
       </Testables>
    </TestAction>
diff --git a/Demos/README.md b/Demos/README.md
index aeccf91..0334bb3 100644
--- a/Demos/README.md
+++ b/Demos/README.md
@@ -56,9 +56,8 @@
 The *macOS* version of 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.
 
-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.
+The `Cube` demo is a simple example of installing **MoltenVK** as an `XCFramework` 
+that is statically linked to the application.
 
 
 <a name="lunarg-vulkan-samples-hologram"></a>
@@ -82,7 +81,9 @@
 To customize, modify the arguments created in the `DemoViewController viewDidLoad` method
 found in the `iOS/DemoViewController.mm` or `macOS/DemoViewController.mm` file.
 
-The `Hologram` demo is a simple example of installing **MoltenVK** as a *static library*.
+The `Hologram` demo is a simple example of installing **MoltenVK** as a *dynamic library* that is 
+dynamically linked to the application. In this demo, the **MoltenVK** *dynamic library* is copied 
+into and embedded in the application, but it could have been installed as a system library instead.
 
 
 <a name="lunarg-vulkan-samples-api"></a>
@@ -119,7 +120,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*.
+The `API-Samples` demo is a simple example of installing **MoltenVK** as an `XCFramework` that 
+is statically linked to the application.
 
 
 
diff --git a/Docs/MoltenVK_Runtime_UserGuide.md b/Docs/MoltenVK_Runtime_UserGuide.md
index ba27473..f1fc211 100644
--- a/Docs/MoltenVK_Runtime_UserGuide.md
+++ b/Docs/MoltenVK_Runtime_UserGuide.md
@@ -20,8 +20,9 @@
 - [About This Document](#about_this)
 - [About **MoltenVK**](#about_moltenvk)
 - [Installing **MoltenVK** in Your *Vulkan* Application](#install)
+	- [Install *MoltenVK* as a Universal `XCFramework`](#install_xcfwk)
+	- [Install *MoltenVK* as a Dynamic Library](#install_dylib)
 	- [Build and Runtime Requirements](#requirements)
-	- [Install as Static Framework, Static Library, or Dynamic Library](#install_lib)
 - [Interacting with the **MoltenVK** Runtime](#interaction)
 	- [MoltenVK `VK_MVK_moltenvk` Extension](#moltenvk_extension)
 	- [Configuring MoltenVK](#moltenvk_config)
@@ -76,6 +77,144 @@
 Installing **MoltenVK** in Your *Vulkan* Application
 ----------------------------------------------------
 
+Installation of **MoltenVK** in your application is straightforward and easy!
+
+Depending on your build and deployment needs, you can link **MoltenVK** to your application either 
+as a universal `XCFramework` or as a *dynamic library* (`.dylib`). Distributing an app containing 
+a dynamic library via the *iOS App Store* or *tvOS App Store* can require specialized bundling. 
+If you are unsure about which linking and deployment option you need, or on *iOS* or *tvOS*, 
+unless you have specific needs for dynamic libraries, follow the steps for linking **MoltenVK** 
+as an `XCFramework`, as it is the simpler option.
+
+The demo apps, found in the `Demos.xcworkspace`, located in the `Demos` folder, demonstrate both
+of the installation techniques discussed above:
+
+- `XCFramework`: `Cube` and `API-Samples` demos.
+- Dynamic library: `Hologram` demo.
+
+
+<a name="install_xcfwk"></a>
+### Install *MoltenVK* as a Universal `XCFramework`
+
+To link **MoltenVK** to your application as an `XCFramework`, follow these steps:
+
+1. Open your application in *Xcode* and select your application's target in the 
+   *Project Navigator* panel.
+
+2. Open 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.
+
+	2. 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,  or if using `IOSurfaces` on *tvOS*, 
+	   open the **tvOS Deployment Target** (aka `TVOS_DEPLOYMENT_TARGET`) setting, and ensure it is set to a
+	   value of `tvOS 11.0` or greater.
+
+3. Open the *Build Phases* tab and open the *Link Binary With Libraries* list.
+   
+	1. Drag `MoltenVK/MoltenVK.xcframework` to the *Link Binary With Libraries* list.
+
+	2. If your application does **_not_** use use `C++`, click the **+** button, 
+	   and add `libc++.tbd` by selecting it from the list of system frameworks. 
+	   This is needed because **MoltenVK** uses `C++` system libraries internally.
+      
+	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 add the following items by selecting them from the list of system frameworks:
+	   - `libc++.tbd` *(if not already done in Step 2)*
+	   - `Metal.framework`
+	   - `Foundation.framework`.
+	   - `QuartzCore.framework`
+	   - `IOKit.framework` (*macOS*)
+	   - `UIKit.framework` (*iOS* or *tvOS*)
+	   - `IOSurface.framework` (*macOS*, or *iOS* if `IPHONEOS_DEPLOYMENT_TARGET` is at least `iOS 11.0`, 
+	      or *tvOS* if `TVOS_DEPLOYMENT_TARGET` is at least `tvOS 11.0`)
+
+
+
+<a name="install_dylib"></a>
+### Install *MoltenVK* as a Dynamic Library
+
+To link **MoltenVK** to your application as a dynamic library (`.dylib`), follow these steps:
+
+1. Open your application in *Xcode* and select your application's target in the 
+   *Project Navigator* panel.
+
+
+2. Open 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.
+       
+    2. In the **Library Search Paths** (aka `LIBRARY_SEARCH_PATHS`) setting, 
+       add an entry that points to **_one_** of the following folders:
+          - `MoltenVK/dylib/macOS` *(macOS)*
+          - `MoltenVK/dylib/iOS` *(iOS)*
+          - `MoltenVK/dylib/tvOS` *(tvOS)*
+          
+    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 to  **_one_** of these values:
+
+       - `@executable_path/../Frameworks` *(macOS)*
+       - `@executable_path/Frameworks` *(iOS or tvOS)*
+       
+       The `libMoltenVK.dylib` library is internally configured to be located at 
+       `@rpath/libMoltenVK.dylib`.
+
+	3. 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,  or if using `IOSurfaces` on *tvOS*, 
+	   open the **tvOS Deployment Target** (aka `TVOS_DEPLOYMENT_TARGET`) setting, and ensure it is set to a
+	   value of `tvOS 11.0` or greater.
+
+3. Open the *Build Phases* tab and open the *Link Binary With Libraries* list.
+   
+	1. Drag **_one_** of the following files to the *Link Binary With Libraries* list:
+      - `MoltenVK/dylib/macOS/libMoltenVK.dylib` *(macOS)* 
+      - `MoltenVK/dylib/iOS/libMoltenVK.dylib` *(iOS)* 
+      - `MoltenVK/dylib/tvOS/libMoltenVK.dylib` *(tvOS)* 
+
+	2. If your application does **_not_** use use `C++`, click the **+** button, 
+	   and add `libc++.tbd` by selecting it from the list of system frameworks. 
+	   This is needed because **MoltenVK** uses `C++` system libraries internally.
+      
+	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 add the following items by selecting them from the list of system frameworks:
+	   - `libc++.tbd` *(if not already done in Step 2)*
+	   - `Metal.framework`
+	   - `Foundation.framework`.
+	   - `QuartzCore.framework`
+	   - `IOKit.framework` (*macOS*)
+	   - `UIKit.framework` (*iOS* or *tvOS*)
+	   - `IOSurface.framework` (*macOS*, or *iOS* if `IPHONEOS_DEPLOYMENT_TARGET` is at least `iOS 11.0`, 
+	      or *tvOS* if `TVOS_DEPLOYMENT_TARGET` is at least `tvOS 11.0`)
+
+4. 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 *Frameworks* (and it should match the **Runpath Search Paths** 
+	      (aka `LD_RUNPATH_SEARCH_PATHS`) build setting you added above).
+	    
+	   3. Drag **_one_** of the following files to the *Copy Files* list in this new build phase:
+	     - `MoltenVK/dylib/macOS/libMoltenVK.dylib` *(macOS)* 
+	     - `MoltenVK/dylib/iOS/libMoltenVK.dylib` *(iOS)* 
+	     - `MoltenVK/dylib/tvOS/libMoltenVK.dylib` *(tvOS)* 
+   
+   - Alternately, you may create your own installation mechanism to install one of the following 
+     files into a standard *macOS*, *iOS*, or  *tvOS* system library folder on the user's device:
+      - `MoltenVK/dylib/macOS/libMoltenVK.dylib` *(macOS)* 
+      - `MoltenVK/dylib/iOS/libMoltenVK.dylib` *(iOS)* 
+      - `MoltenVK/dylib/tvOS/libMoltenVK.dylib` *(tvOS)* 
+     
+
+
 <a name="requirements"></a>
 ### Build and Runtime Requirements
 
@@ -97,145 +236,19 @@
 - Information on *iOS* devices that are compatible with *Metal* can be found in 
   [this article](https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/HardwareGPUInformation/HardwareGPUInformation.html).
 
-
-
-<a name="install_lib"></a>
-### Install as Static Framework, Static Library, or Dynamic Library
-
-Installation of **MoltenVK** is straightforward and easy!
-
-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.
-  
->**_Note:_** Distributing an app containing a dynamic library via the *iOS App Store* or 
- *tvOS App Store* can require specialized bundling. Unless you have specific needs for 
- dynamic libraries, the recommended approach on *iOS* or *tvOS* is to link **MoltenVK** 
- to your app as a static library or framework.
- 
-
-1. Open your application in *Xcode* and select your application's target in the 
-   *Project Navigator* panel.
-
-
-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)*
-	          - `MoltenVK/tvOS/framework` *(tvOS)*
-
-	- 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)*
-	          - `MoltenVK/tvOS/static` *(tvOS)*
-	          
-        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)*
-	          - `MoltenVK/tvOS/dynamic` *(tvOS)*
-	          
-        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/../Frameworks` *(macOS)*
-           - `@executable_path/Frameworks` *(iOS or tvOS)*
-           
-           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, 
-   or if using `IOSurfaces` on *tvOS*, open the **tvOS Deployment Target** (aka `TVOS_DEPLOYMENT_TARGET`)
-   setting, and ensure it is set to a value of `tvOS 11.0` or greater.
-
-4. On the *Build Phases* tab, open the *Link Binary With Libraries* list.
+When a *Metal* app is running from *Xcode*, the default ***Scheme*** settings may reduce performance. 
+To improve performance and gain the benefits of *Metal*, perform the following in *Xcode*:
    
-   - 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)* 
-
-   - 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)* 
-
-   - For *tvOS*, drag **_one_** of the following files to the *Link Binary With Libraries* list:
-      - `MoltenVK/tvOS/framework/MoltenVK.framework ` *(static framework)* 
-      - `MoltenVK/tvOS/static/libMoltenVK.a` *(static library)* 
-      - `MoltenVK/tvOS/dynamic/libMoltenVK.dylib` *(dynamic library)* 
-
-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* or *tvOS*)
-   - `IOSurface.framework` (*macOS*, or *iOS* if `IPHONEOS_DEPLOYMENT_TARGET` is at least `iOS 11.0`, 
-      or *tvOS* if `TVOS_DEPLOYMENT_TARGET` is at least `tvOS 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 *Frameworks* (and should match the **Runpath Search Paths** 
-           (aka `LD_RUNPATH_SEARCH_PATHS`) build setting you set above).
-        
-        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)*
-	          - `MoltenVK/tvOS/dynamic/libMoltenVK.dylib` *(tvOS)*
-   
-   - Alternately, you may create your own installation mechanism to install one of the 
-     `MoltenVK/macOS/dynamic/libMoltenVK.dylib`, `MoltenVK/iOS/dynamic/libMoltenVK.dylib`, 
-     or `MoltenVK/tvOS/dynamic/libMoltenVK.dylib` file into a standard *macOS*, *iOS*, or 
-     *tvOS* 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*:
-   
-	1. Open the ***Scheme Editor*** for building your main application. You can do 
-	   this by selecting ***Edit Scheme...*** from the ***Scheme*** drop-down menu, or select 
-	   ***Product -> Scheme -> Edit Scheme...*** from the main menu.
-	2. On the ***Info*** tab, set the ***Build Configuration*** to ***Release***, and disable the 
-	   ***Debug executable*** check-box.
-	3. On the ***Options*** tab, disable both the ***Metal API Validation*** and ***GPU Frame Capture***
-	   options. For optimal performance, you may also consider disabling the other simulation
-	   and debugging options on this tab. For further information, see the 
-	   [Xcode Scheme Settings and Performance](https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/Dev-Technique/Dev-Technique.html#//apple_ref/doc/uid/TP40014221-CH8-SW3) 
-	   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:
-
-- Static Framework: `API-Samples`.
-- Static library: `Hologram`.
-- Dynamic library: `Cube`.
+1. Open the ***Scheme Editor*** for building your main application. You can do 
+   this by selecting ***Edit Scheme...*** from the ***Scheme*** drop-down menu, or select 
+   ***Product -> Scheme -> Edit Scheme...*** from the main menu.
+2. On the ***Info*** tab, set the ***Build Configuration*** to ***Release***, and disable the 
+   ***Debug executable*** check-box.
+3. On the ***Options*** tab, disable both the ***Metal API Validation*** and ***GPU Frame Capture***
+   options. For optimal performance, you may also consider disabling the other simulation
+   and debugging options on this tab. For further information, see the 
+   [Xcode Scheme Settings and Performance](https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/Dev-Technique/Dev-Technique.html#//apple_ref/doc/uid/TP40014221-CH8-SW3) 
+   section of Apple's *Metal Programming Guide* documentation.
 
 
 
diff --git a/Docs/Whats_New.md b/Docs/Whats_New.md
index 03b2cc5..001246a 100644
--- a/Docs/Whats_New.md
+++ b/Docs/Whats_New.md
@@ -18,6 +18,8 @@
 
 Released 2020/09/28
 
+>**_Note:_** This release contains changes to library paths and framework linking options.
+
 - Add support for Vulkan 1.1, including:
 	- The `vkEnumerateInstanceVersion()` function
 	- The `vkGetDeviceQueue2()` function
@@ -38,12 +40,20 @@
 	  future `MTLSharedEvent` Vulkan extension)
 	- `VK_KHR_multiview`
 - Remove support for obsolete `VK_EXTX_portability_subset` extension.
+- Redesign build and linking options that leverage newer framework technology:
+	- Add comprehensive support for multi-platform, multi-architecture `XCFrameworks`.
+	- Build fat single-platform, multi-architecture `dylibs`.
+	- Add support for *Apple Silicon* builds for *macOS* and *Simulators*.
+	- Remove support for distinct legacy frameworks and static libraries.
+	- Remove support for fat libraries and frameworks that span device and simulators.
 - Improve performance of tessellation control pipeline stage by processing multiple 
   patches per workgroup.
 - `vkCmdBindDescriptorSets` order `pDynamicOffsets` by descriptor binding number 
   within each descriptor set.
 - `vkCmdCopyImage` on macOS flush non-coherent image memory before copy operation.
 - Re-add support for bitcode generation on *iOS* and *tvOS*.
+- Combine `MoltenVKSPIRVToMSLConverter` and `MoltenVKGLSLToSPIRVConverter` 
+  frameworks into a single `MoltenVKShaderConverter` framework.
 - Fix Metal validation error when occlusion query and renderpass are in separate 
   Vulkan command buffers.
 
diff --git a/ExternalDependencies.xcodeproj/project.pbxproj b/ExternalDependencies.xcodeproj/project.pbxproj
index d308c9f..3dab9b0 100644
--- a/ExternalDependencies.xcodeproj/project.pbxproj
+++ b/ExternalDependencies.xcodeproj/project.pbxproj
@@ -11,8 +11,6 @@
 			isa = PBXAggregateTarget;
 			buildConfigurationList = 2FEA0AE52490320500EEF3AD /* Build configuration list for PBXAggregateTarget "ExternalDependencies-tvOS" */;
 			buildPhases = (
-				A9A5F2C1249D09820016D8B1 /* Create Fat Libraries */,
-				2FEA0AE42490320500EEF3AD /* Package External Libraries */,
 			);
 			dependencies = (
 				2FEA0CF12490325400EEF3AD /* PBXTargetDependency */,
@@ -26,7 +24,6 @@
 			isa = PBXAggregateTarget;
 			buildConfigurationList = A972A7E721CEC72F0013AB25 /* Build configuration list for PBXAggregateTarget "ExternalDependencies-macOS" */;
 			buildPhases = (
-				A9679AB021D26C7000856BF7 /* Package Libraries */,
 			);
 			dependencies = (
 				A972A7E921CEC76A0013AB25 /* PBXTargetDependency */,
@@ -40,8 +37,6 @@
 			isa = PBXAggregateTarget;
 			buildConfigurationList = A972A7ED21CEC8030013AB25 /* Build configuration list for PBXAggregateTarget "ExternalDependencies-iOS" */;
 			buildPhases = (
-				A932E9C6249A7B9B00D64150 /* Create Fat Libraries */,
-				A9679AAF21D26C1400856BF7 /* Package Libraries */,
 			);
 			dependencies = (
 				A972A7F121CEC8140013AB25 /* PBXTargetDependency */,
@@ -55,6 +50,7 @@
 			isa = PBXAggregateTarget;
 			buildConfigurationList = A972A7F521CEC81B0013AB25 /* Build configuration list for PBXAggregateTarget "ExternalDependencies" */;
 			buildPhases = (
+				A9194DF624E8990C00FB127B /* Create XCFramework */,
 				A9FC5F8B249DB48D003CB086 /* Package Finish */,
 			);
 			dependencies = (
@@ -1728,8 +1724,8 @@
 		A913F24424CF87AE006CB02F /* ShaderLang.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ShaderLang.h; sourceTree = "<group>"; };
 		A913F25724CF87AE006CB02F /* CodeGen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CodeGen.cpp; sourceTree = "<group>"; };
 		A913F25824CF87AE006CB02F /* Link.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Link.cpp; sourceTree = "<group>"; };
-		A932E9C5249A743B00D64150 /* create_fat_lib_func.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_fat_lib_func.sh; sourceTree = "<group>"; };
-		A932E9DF249BC44D00D64150 /* create_fat_ext_libs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_fat_ext_libs.sh; sourceTree = "<group>"; };
+		A9194DF424E8940600FB127B /* copy_ext_lib_to_staging.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = copy_ext_lib_to_staging.sh; sourceTree = "<group>"; };
+		A9194DF524E8979100FB127B /* create_ext_lib_xcframeworks.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_ext_lib_xcframeworks.sh; sourceTree = "<group>"; };
 		A9415EF624366B0E00566F16 /* packagePregenSpirvToolsHeaders */ = {isa = PBXFileReference; lastKnownFileType = text; path = packagePregenSpirvToolsHeaders; sourceTree = "<group>"; };
 		A95D90FE23A7F1E500CBCC60 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
 		A95D90FF23A7F1E500CBCC60 /* InitializeDll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InitializeDll.h; sourceTree = "<group>"; };
@@ -1760,7 +1756,6 @@
 		A95D911923A7F1E500CBCC60 /* Logger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Logger.h; sourceTree = "<group>"; };
 		A95D911A23A7F1E500CBCC60 /* doc.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = doc.cpp; sourceTree = "<group>"; };
 		A95D911B23A7F1E500CBCC60 /* disassemble.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = disassemble.cpp; sourceTree = "<group>"; };
-		A9679AAE21D269D900856BF7 /* package_ext_libs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_ext_libs.sh; sourceTree = "<group>"; };
 		A972A80F21CECBBF0013AB25 /* libSPIRVTools.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSPIRVTools.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		A972A82321CECBE90013AB25 /* libSPIRVTools.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSPIRVTools.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		A972ABDC21CED7BC0013AB25 /* libglslang.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libglslang.a; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -2179,6 +2174,8 @@
 		A9765DEE2485758500FDD115 /* validation_state.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validation_state.cpp; sourceTree = "<group>"; };
 		A9765DEF2485758500FDD115 /* validate_primitives.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = validate_primitives.cpp; sourceTree = "<group>"; };
 		A9765DF02485758500FDD115 /* decoration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = decoration.h; sourceTree = "<group>"; };
+		A9772CFF24F9930E002617D0 /* copy_lib_to_staging.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = copy_lib_to_staging.sh; sourceTree = "<group>"; };
+		A991DB2124E6016E00AEEC36 /* create_xcframework_func.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_xcframework_func.sh; sourceTree = "<group>"; };
 		A9C2104521D14FD7006BA2D3 /* fetchDependencies */ = {isa = PBXFileReference; lastKnownFileType = text; path = fetchDependencies; sourceTree = "<group>"; };
 		A9C2104721D15843006BA2D3 /* ExternalRevisions */ = {isa = PBXFileReference; lastKnownFileType = folder; path = ExternalRevisions; sourceTree = "<group>"; };
 		A9FC5F7F249DA96D003CB086 /* package_ext_libs_finish.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_ext_libs_finish.sh; sourceTree = "<group>"; };
@@ -2381,10 +2378,11 @@
 		A9679AAB21D2699800856BF7 /* Scripts */ = {
 			isa = PBXGroup;
 			children = (
-				A932E9DF249BC44D00D64150 /* create_fat_ext_libs.sh */,
-				A932E9C5249A743B00D64150 /* create_fat_lib_func.sh */,
+				A9194DF424E8940600FB127B /* copy_ext_lib_to_staging.sh */,
+				A9772CFF24F9930E002617D0 /* copy_lib_to_staging.sh */,
+				A9194DF524E8979100FB127B /* create_ext_lib_xcframeworks.sh */,
+				A991DB2124E6016E00AEEC36 /* create_xcframework_func.sh */,
 				A9FC5F7F249DA96D003CB086 /* package_ext_libs_finish.sh */,
-				A9679AAE21D269D900856BF7 /* package_ext_libs.sh */,
 				A9415EF624366B0E00566F16 /* packagePregenSpirvToolsHeaders */,
 			);
 			path = Scripts;
@@ -3725,6 +3723,7 @@
 			buildPhases = (
 				2FEA0AE92490321700EEF3AD /* Headers */,
 				2FEA0B1C2490321700EEF3AD /* Sources */,
+				A9194DF124E8855F00FB127B /* Copy to Staging */,
 			);
 			buildRules = (
 			);
@@ -3741,6 +3740,7 @@
 			buildPhases = (
 				2FEA0B4C2490322100EEF3AD /* Headers */,
 				2FEA0C0A2490322100EEF3AD /* Sources */,
+				A9194DEE24E8852B00FB127B /* Copy to Staging */,
 			);
 			buildRules = (
 			);
@@ -3757,6 +3757,7 @@
 			buildPhases = (
 				2FEA0CDA2490322B00EEF3AD /* Headers */,
 				2FEA0CE32490322B00EEF3AD /* Sources */,
+				A9194DEC24E884FC00FB127B /* Copy to Staging */,
 			);
 			buildRules = (
 			);
@@ -3773,6 +3774,7 @@
 			buildPhases = (
 				A976290021CC608E00B52A68 /* Headers */,
 				A976290121CC609100B52A68 /* Sources */,
+				A9194DE724E8431600FB127B /* Copy to Staging */,
 			);
 			buildRules = (
 			);
@@ -3789,6 +3791,7 @@
 			buildPhases = (
 				A97628FF21CC608900B52A68 /* Headers */,
 				A97628FE21CC608400B52A68 /* Sources */,
+				A9194DEB24E85ABC00FB127B /* Copy to Staging */,
 			);
 			buildRules = (
 			);
@@ -3805,6 +3808,7 @@
 			buildPhases = (
 				A972A7FD21CECBBF0013AB25 /* Headers */,
 				A972A80521CECBBF0013AB25 /* Sources */,
+				A9194DED24E8851900FB127B /* Copy to Staging */,
 			);
 			buildRules = (
 			);
@@ -3821,6 +3825,7 @@
 			buildPhases = (
 				A972A81121CECBE90013AB25 /* Headers */,
 				A972A81921CECBE90013AB25 /* Sources */,
+				A9194DEF24E8853B00FB127B /* Copy to Staging */,
 			);
 			buildRules = (
 			);
@@ -3837,6 +3842,7 @@
 			buildPhases = (
 				A972ABCA21CED7BC0013AB25 /* Headers */,
 				A972ABD221CED7BC0013AB25 /* Sources */,
+				A9194DF024E8854D00FB127B /* Copy to Staging */,
 			);
 			buildRules = (
 			);
@@ -3853,6 +3859,7 @@
 			buildPhases = (
 				A972ABDE21CED7CB0013AB25 /* Headers */,
 				A972ABE621CED7CB0013AB25 /* Sources */,
+				A9194DF224E8856E00FB127B /* Copy to Staging */,
 			);
 			buildRules = (
 			);
@@ -3918,7 +3925,7 @@
 /* End PBXProject section */
 
 /* Begin PBXShellScriptBuildPhase section */
-		2FEA0AE42490320500EEF3AD /* Package External Libraries */ = {
+		A9194DE724E8431600FB127B /* Copy to Staging */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -3927,16 +3934,16 @@
 			);
 			inputPaths = (
 			);
-			name = "Package External Libraries";
+			name = "Copy to Staging";
 			outputFileListPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_OS=\"tvOS\"\nexport MVK_BUILT_PROD_DIR=\"${BUILT_PRODUCTS_DIR}-${MVK_OS}\"\n\n. \"${SRCROOT}/Scripts/package_ext_libs.sh\"\n";
+			shellScript = ". \"${SRCROOT}/Scripts/copy_ext_lib_to_staging.sh\"\n";
 		};
-		A932E9C6249A7B9B00D64150 /* Create Fat Libraries */ = {
+		A9194DEB24E85ABC00FB127B /* Copy to Staging */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -3945,16 +3952,16 @@
 			);
 			inputPaths = (
 			);
-			name = "Create Fat Libraries";
+			name = "Copy to Staging";
 			outputFileListPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_OS=\"iOS\"\nexport MVK_OS_PROD_EXTN=\"iphoneos\"\nexport MVK_SIM_PROD_EXTN=\"iphonesimulator\"\n\n. \"${SRCROOT}/Scripts/create_fat_ext_libs.sh\"\n";
+			shellScript = ". \"${SRCROOT}/Scripts/copy_ext_lib_to_staging.sh\"\n";
 		};
-		A9679AAF21D26C1400856BF7 /* Package Libraries */ = {
+		A9194DEC24E884FC00FB127B /* Copy to Staging */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -3963,16 +3970,16 @@
 			);
 			inputPaths = (
 			);
-			name = "Package Libraries";
+			name = "Copy to Staging";
 			outputFileListPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_OS=\"iOS\"\nexport MVK_BUILT_PROD_DIR=\"${BUILT_PRODUCTS_DIR}-${MVK_OS}\"\n\n. \"${SRCROOT}/Scripts/package_ext_libs.sh\"\n";
+			shellScript = ". \"${SRCROOT}/Scripts/copy_ext_lib_to_staging.sh\"\n";
 		};
-		A9679AB021D26C7000856BF7 /* Package Libraries */ = {
+		A9194DED24E8851900FB127B /* Copy to Staging */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -3981,16 +3988,16 @@
 			);
 			inputPaths = (
 			);
-			name = "Package Libraries";
+			name = "Copy to Staging";
 			outputFileListPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_OS=\"macOS\"\nexport MVK_BUILT_PROD_DIR=\"${BUILT_PRODUCTS_DIR}\"\n\n. \"${SRCROOT}/Scripts/package_ext_libs.sh\"\n";
+			shellScript = ". \"${SRCROOT}/Scripts/copy_ext_lib_to_staging.sh\"\n";
 		};
-		A9A5F2C1249D09820016D8B1 /* Create Fat Libraries */ = {
+		A9194DEE24E8852B00FB127B /* Copy to Staging */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -3999,14 +4006,104 @@
 			);
 			inputPaths = (
 			);
-			name = "Create Fat Libraries";
+			name = "Copy to Staging";
 			outputFileListPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_OS=\"tvOS\"\nexport MVK_OS_PROD_EXTN=\"appletvos\"\nexport MVK_SIM_PROD_EXTN=\"appletvsimulator\"\n\n. \"${SRCROOT}/Scripts/create_fat_ext_libs.sh\"\n";
+			shellScript = ". \"${SRCROOT}/Scripts/copy_ext_lib_to_staging.sh\"\n";
+		};
+		A9194DEF24E8853B00FB127B /* Copy to Staging */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Copy to Staging";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = ". \"${SRCROOT}/Scripts/copy_ext_lib_to_staging.sh\"\n";
+		};
+		A9194DF024E8854D00FB127B /* Copy to Staging */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Copy to Staging";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = ". \"${SRCROOT}/Scripts/copy_ext_lib_to_staging.sh\"\n";
+		};
+		A9194DF124E8855F00FB127B /* Copy to Staging */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Copy to Staging";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = ". \"${SRCROOT}/Scripts/copy_ext_lib_to_staging.sh\"\n\n";
+		};
+		A9194DF224E8856E00FB127B /* Copy to Staging */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Copy to Staging";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = ". \"${SRCROOT}/Scripts/copy_ext_lib_to_staging.sh\"\n";
+		};
+		A9194DF624E8990C00FB127B /* Create XCFramework */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Create XCFramework";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = ". \"${SRCROOT}/Scripts/create_ext_lib_xcframeworks.sh\"\n";
 		};
 		A9FC5F8B249DB48D003CB086 /* Package Finish */ = {
 			isa = PBXShellScriptBuildPhase;
diff --git a/ExternalRevisions/README.md b/ExternalRevisions/README.md
index cbf5c1c..8a52555 100644
--- a/ExternalRevisions/README.md
+++ b/ExternalRevisions/README.md
@@ -43,7 +43,7 @@
 To retrieve and build these libraries from their sources, run the `fetchDependencies`
 script in the main repository directory:
 
-	./fetchDependencies [--debug]
+	./fetchDependencies --all [--debug]
 
 The `--debug` option will build the external libraries in Debug mode, which may
 be useful when debugging and tracing calls into those libraries.
diff --git a/Makefile b/Makefile
index ebfee2c..b2c8406 100644
--- a/Makefile
+++ b/Makefile
@@ -5,14 +5,18 @@
 .PHONY: all
 all:
 	@$(MAKE) macos
-	@$(MAKE) iosfat
-	@$(MAKE) tvosfat
+	@$(MAKE) ios
+	@$(MAKE) iossim
+	@$(MAKE) tvos
+	@$(MAKE) tvossim
 
 .PHONY: all-debug
 all-debug:
 	@$(MAKE) macos-debug
-	@$(MAKE) iosfat-debug
-	@$(MAKE) tvosfat-debug
+	@$(MAKE) ios-debug
+	@$(MAKE) iossim-debug
+	@$(MAKE) tvos-debug
+	@$(MAKE) tvossim-debug
 
 .PHONY: macos
 macos:
@@ -30,12 +34,12 @@
 ios-debug:
 	xcodebuild build -quiet -project "$(XC_PROJ)" -scheme "$(XC_SCHEME) (iOS only)" -configuration "Debug"
 
-.PHONY: iosfat
-iosfat: ios
+.PHONY: iossim
+iossim:
 	xcodebuild build -quiet -project "$(XC_PROJ)" -scheme "$(XC_SCHEME) (iOS only)" -destination "generic/platform=iOS Simulator"
 
-.PHONY: iosfat-debug
-iosfat-debug: ios-debug
+.PHONY: iossim-debug
+iossim-debug:
 	xcodebuild build -quiet -project "$(XC_PROJ)" -scheme "$(XC_SCHEME) (iOS only)" -destination "generic/platform=iOS Simulator" -configuration "Debug"
 
 .PHONY: tvos
@@ -46,12 +50,12 @@
 tvos-debug:
 	xcodebuild build -quiet -project "$(XC_PROJ)" -scheme "$(XC_SCHEME) (tvOS only)" -configuration "Debug"
 
-.PHONY: tvosfat
-tvosfat: tvos
+.PHONY: tvossim
+tvossim:
 	xcodebuild build -quiet -project "$(XC_PROJ)" -scheme "$(XC_SCHEME) (tvOS only)" -destination "generic/platform=tvOS Simulator"
 
-.PHONY: tvosfat-debug
-tvosfat-debug: tvos-debug
+.PHONY: tvossim-debug
+tvossim-debug:
 	xcodebuild build -quiet -project "$(XC_PROJ)" -scheme "$(XC_SCHEME) (tvOS only)" -destination "generic/platform=tvOS Simulator" -configuration "Debug"
 
 .PHONY: clean
@@ -63,5 +67,26 @@
 .PHONY: install
 install:
 	rm -rf /Library/Frameworks/MoltenVK.framework
-	cp -a Package/Latest/MoltenVK/macOS/framework/MoltenVK.framework /Library/Frameworks/
+	rm -rf /Library/Frameworks/MoltenVK.xcframework
+	cp -a Package/Latest/MoltenVK/MoltenVK.xcframework /Library/Frameworks/
 
+# Deprecated target names
+.PHONY: iosfat
+iosfat:
+	@$(MAKE) ios
+	@$(MAKE) iossim
+
+.PHONY: iosfat-debug
+iosfat-debug:
+	@$(MAKE) ios-debug
+	@$(MAKE) iossim-debug
+
+.PHONY: tvosfat
+tvosfat:
+	@$(MAKE) tvos
+	@$(MAKE) tvossim
+
+.PHONY: tvosfat-debug
+tvosfat-debug:
+	@$(MAKE) tvos-debug
+	@$(MAKE) tvossim-debug
diff --git a/MoltenVK/MoltenVK.xcframework b/MoltenVK/MoltenVK.xcframework
new file mode 120000
index 0000000..a3abb4a
--- /dev/null
+++ b/MoltenVK/MoltenVK.xcframework
@@ -0,0 +1 @@
+../Package/Latest/MoltenVK/MoltenVK.xcframework
\ No newline at end of file
diff --git a/MoltenVK/MoltenVK.xcodeproj/project.pbxproj b/MoltenVK/MoltenVK.xcodeproj/project.pbxproj
index ffdf19a..3998810 100644
--- a/MoltenVK/MoltenVK.xcodeproj/project.pbxproj
+++ b/MoltenVK/MoltenVK.xcodeproj/project.pbxproj
@@ -365,13 +365,6 @@
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
-		2F21D82C24983488009BEA5F /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = 2FEA0AC42490305800EEF3AD;
-			remoteInfo = "MoltenVKGLSLToSPIRVConverter-tvOS";
-		};
 		2F21D82E24983488009BEA5F /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
@@ -379,13 +372,6 @@
 			remoteGlobalIDString = 2FEA0CFF2490381A00EEF3AD;
 			remoteInfo = "MoltenVKSPIRVToMSLConverter-tvOS";
 		};
-		2FEA0D19249040CA00EEF3AD /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 2;
-			remoteGlobalIDString = 2FEA0AD72490305800EEF3AD;
-			remoteInfo = "MoltenVKGLSLToSPIRVConverter-tvOS";
-		};
 		2FEA0D1B249040CA00EEF3AD /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
@@ -393,20 +379,6 @@
 			remoteGlobalIDString = 2FEA0D142490381A00EEF3AD;
 			remoteInfo = "MoltenVKSPIRVToMSLConverter-tvOS";
 		};
-		A96B8156227BF6FD008A772B /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = A937472B1A9A8B2900F29B34;
-			remoteInfo = "MoltenVKGLSLToSPIRVConverter-iOS";
-		};
-		A96B8158227BF715008A772B /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = A93747701A9A98D000F29B34;
-			remoteInfo = "MoltenVKGLSLToSPIRVConverter-macOS";
-		};
 		A981497B1FB6B566005F00B4 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
@@ -414,20 +386,6 @@
 			remoteGlobalIDString = A964BD5F1C57EFBD00D930D8;
 			remoteInfo = MoltenVKShaderConverter;
 		};
-		A981497D1FB6B566005F00B4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 2;
-			remoteGlobalIDString = A964BD611C57EFBD00D930D8;
-			remoteInfo = "MVKGLSLToSPIRVConverter-iOS";
-		};
-		A981497F1FB6B566005F00B4 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 2;
-			remoteGlobalIDString = A964BD601C57EFBD00D930D8;
-			remoteInfo = "MVKGLSLToSPIRVConverter-macOS";
-		};
 		A98149811FB6B566005F00B4 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
@@ -449,12 +407,12 @@
 			remoteGlobalIDString = A93903B81C57E9D700FE90DC;
 			remoteInfo = "MVKSPIRVToMSLConverter-iOS";
 		};
-		A98149A31FB6B9EB005F00B4 /* PBXContainerItemProxy */ = {
+		A9B1C7F4251AA5AF001D12CC /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = A9C86CB61C55B8350096CAF2 /* MoltenVKShaderConverter.xcodeproj */;
 			proxyType = 1;
-			remoteGlobalIDString = A93903C01C57E9ED00FE90DC;
-			remoteInfo = "MVKSPIRVToMSLConverter-macOS";
+			remoteGlobalIDString = A9092A8C1A81717B00051823;
+			remoteInfo = MoltenVKShaderConverter;
 		};
 /* End PBXContainerItemProxy section */
 
@@ -749,9 +707,6 @@
 			isa = PBXGroup;
 			children = (
 				A981497C1FB6B566005F00B4 /* MoltenVKShaderConverter */,
-				A981497E1FB6B566005F00B4 /* libMoltenVKGLSLToSPIRVConverter.a */,
-				2FEA0D1A249040CA00EEF3AD /* libMoltenVKGLSLToSPIRVConverter.a */,
-				A98149801FB6B566005F00B4 /* libMoltenVKGLSLToSPIRVConverter.a */,
 				A98149821FB6B566005F00B4 /* libMoltenVKSPIRVToMSLConverter.a */,
 				2FEA0D1C249040CA00EEF3AD /* libMoltenVKSPIRVToMSLConverter.a */,
 				A98149841FB6B566005F00B4 /* libMoltenVKSPIRVToMSLConverter.a */,
@@ -1061,14 +1016,12 @@
 				A980A25D24C6288D007A8F6F /* Generate Version Header */,
 				2FEA0A4024902F9F00EEF3AD /* Headers */,
 				2FEA0A8224902F9F00EEF3AD /* Sources */,
+				A9CBBFF124F89F79006D41EF /* Copy to Staging */,
 				2FEA0AB524902F9F00EEF3AD /* Create Dynamic Library */,
-				A9FC5F6D249D39F3003CB086 /* Create Fat Libraries */,
-				2FEA0AB624902F9F00EEF3AD /* Create Framework */,
 			);
 			buildRules = (
 			);
 			dependencies = (
-				2F21D82D24983488009BEA5F /* PBXTargetDependency */,
 				2F21D82F24983488009BEA5F /* PBXTargetDependency */,
 			);
 			name = "MoltenVK-tvOS";
@@ -1083,15 +1036,13 @@
 				A980A25B24C6283D007A8F6F /* Generate Version Header */,
 				A9B8EE071A98D796009C5A02 /* Headers */,
 				A9B8EE051A98D796009C5A02 /* Sources */,
+				A9CBBFEF24F89F5F006D41EF /* Copy to Staging */,
 				A9731FAD1EDDAE39006B7298 /* Create Dynamic Library */,
-				A9EE084F249BD4AE00E523A2 /* Create Fat Libraries */,
-				A92EF79721854B3300C8B91B /* Create Framework */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 				A981499B1FB6B9CF005F00B4 /* PBXTargetDependency */,
-				A96B8157227BF6FD008A772B /* PBXTargetDependency */,
 			);
 			name = "MoltenVK-iOS";
 			productName = MoltenVK;
@@ -1105,14 +1056,13 @@
 				A980A25E24C62895007A8F6F /* Generate Version Header */,
 				A9CBED871B6299D800E45FDC /* Headers */,
 				A9CBEDCE1B6299D800E45FDC /* Sources */,
+				A9CBBFF224F89F87006D41EF /* Copy to Staging */,
 				A93F47C91D7E389E002AF700 /* Create Dynamic Library */,
-				A92EF78D21852B2400C8B91B /* Create Framework */,
 			);
 			buildRules = (
 			);
 			dependencies = (
-				A98149A41FB6B9EB005F00B4 /* PBXTargetDependency */,
-				A96B8159227BF715008A772B /* PBXTargetDependency */,
+				A9B1C7F5251AA5AF001D12CC /* PBXTargetDependency */,
 			);
 			name = "MoltenVK-macOS";
 			productName = MoltenVK;
@@ -1164,17 +1114,10 @@
 /* End PBXProject section */
 
 /* Begin PBXReferenceProxy section */
-		2FEA0D1A249040CA00EEF3AD /* libMoltenVKGLSLToSPIRVConverter.a */ = {
-			isa = PBXReferenceProxy;
-			fileType = archive.ar;
-			path = libMoltenVKGLSLToSPIRVConverter.a;
-			remoteRef = 2FEA0D19249040CA00EEF3AD /* PBXContainerItemProxy */;
-			sourceTree = BUILT_PRODUCTS_DIR;
-		};
 		2FEA0D1C249040CA00EEF3AD /* libMoltenVKSPIRVToMSLConverter.a */ = {
 			isa = PBXReferenceProxy;
 			fileType = archive.ar;
-			path = libMoltenVKSPIRVToMSLConverter.a;
+			path = libMoltenVKShaderConverter.a;
 			remoteRef = 2FEA0D1B249040CA00EEF3AD /* PBXContainerItemProxy */;
 			sourceTree = BUILT_PRODUCTS_DIR;
 		};
@@ -1185,31 +1128,17 @@
 			remoteRef = A981497B1FB6B566005F00B4 /* PBXContainerItemProxy */;
 			sourceTree = BUILT_PRODUCTS_DIR;
 		};
-		A981497E1FB6B566005F00B4 /* libMoltenVKGLSLToSPIRVConverter.a */ = {
-			isa = PBXReferenceProxy;
-			fileType = archive.ar;
-			path = libMoltenVKGLSLToSPIRVConverter.a;
-			remoteRef = A981497D1FB6B566005F00B4 /* PBXContainerItemProxy */;
-			sourceTree = BUILT_PRODUCTS_DIR;
-		};
-		A98149801FB6B566005F00B4 /* libMoltenVKGLSLToSPIRVConverter.a */ = {
-			isa = PBXReferenceProxy;
-			fileType = archive.ar;
-			path = libMoltenVKGLSLToSPIRVConverter.a;
-			remoteRef = A981497F1FB6B566005F00B4 /* PBXContainerItemProxy */;
-			sourceTree = BUILT_PRODUCTS_DIR;
-		};
 		A98149821FB6B566005F00B4 /* libMoltenVKSPIRVToMSLConverter.a */ = {
 			isa = PBXReferenceProxy;
 			fileType = archive.ar;
-			path = libMoltenVKSPIRVToMSLConverter.a;
+			path = libMoltenVKShaderConverter.a;
 			remoteRef = A98149811FB6B566005F00B4 /* PBXContainerItemProxy */;
 			sourceTree = BUILT_PRODUCTS_DIR;
 		};
 		A98149841FB6B566005F00B4 /* libMoltenVKSPIRVToMSLConverter.a */ = {
 			isa = PBXReferenceProxy;
 			fileType = archive.ar;
-			path = libMoltenVKSPIRVToMSLConverter.a;
+			path = libMoltenVKShaderConverter.a;
 			remoteRef = A98149831FB6B566005F00B4 /* PBXContainerItemProxy */;
 			sourceTree = BUILT_PRODUCTS_DIR;
 		};
@@ -1230,60 +1159,6 @@
 			shellPath = /bin/sh;
 			shellScript = ". \"${SRCROOT}/../Scripts/create_dylib_tvos.sh\"\n";
 		};
-		2FEA0AB624902F9F00EEF3AD /* Create Framework */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Framework";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_framework_tvos.sh\"\n";
-		};
-		A92EF78D21852B2400C8B91B /* Create Framework */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Framework";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_framework_macos.sh\"\n";
-		};
-		A92EF79721854B3300C8B91B /* Create Framework */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Framework";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_framework_ios.sh\"\n";
-		};
 		A93F47C91D7E389E002AF700 /* Create Dynamic Library */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
@@ -1366,7 +1241,7 @@
 			shellPath = /bin/sh;
 			shellScript = "\"${SRCROOT}/../Scripts/gen_moltenvk_rev_hdr.sh\"\n";
 		};
-		A9EE084F249BD4AE00E523A2 /* Create Fat Libraries */ = {
+		A9CBBFEF24F89F5F006D41EF /* Copy to Staging */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -1375,16 +1250,16 @@
 			);
 			inputPaths = (
 			);
-			name = "Create Fat Libraries";
+			name = "Copy to Staging";
 			outputFileListPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_fat_libs_ios.sh\"\n";
+			shellScript = ". \"${SRCROOT}/../Scripts/copy_to_staging.sh\"\n";
 		};
-		A9FC5F6D249D39F3003CB086 /* Create Fat Libraries */ = {
+		A9CBBFF124F89F79006D41EF /* Copy to Staging */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -1393,14 +1268,32 @@
 			);
 			inputPaths = (
 			);
-			name = "Create Fat Libraries";
+			name = "Copy to Staging";
 			outputFileListPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_fat_libs_tvos.sh\"\n";
+			shellScript = ". \"${SRCROOT}/../Scripts/copy_to_staging.sh\"\n";
+		};
+		A9CBBFF224F89F87006D41EF /* Copy to Staging */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Copy to Staging";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = ". \"${SRCROOT}/../Scripts/copy_to_staging.sh\"\n\n";
 		};
 /* End PBXShellScriptBuildPhase section */
 
@@ -1584,35 +1477,20 @@
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXTargetDependency section */
-		2F21D82D24983488009BEA5F /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = "MoltenVKGLSLToSPIRVConverter-tvOS";
-			targetProxy = 2F21D82C24983488009BEA5F /* PBXContainerItemProxy */;
-		};
 		2F21D82F24983488009BEA5F /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			name = "MoltenVKSPIRVToMSLConverter-tvOS";
 			targetProxy = 2F21D82E24983488009BEA5F /* PBXContainerItemProxy */;
 		};
-		A96B8157227BF6FD008A772B /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = "MoltenVKGLSLToSPIRVConverter-iOS";
-			targetProxy = A96B8156227BF6FD008A772B /* PBXContainerItemProxy */;
-		};
-		A96B8159227BF715008A772B /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = "MoltenVKGLSLToSPIRVConverter-macOS";
-			targetProxy = A96B8158227BF715008A772B /* PBXContainerItemProxy */;
-		};
 		A981499B1FB6B9CF005F00B4 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			name = "MVKSPIRVToMSLConverter-iOS";
 			targetProxy = A981499A1FB6B9CF005F00B4 /* PBXContainerItemProxy */;
 		};
-		A98149A41FB6B9EB005F00B4 /* PBXTargetDependency */ = {
+		A9B1C7F5251AA5AF001D12CC /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			name = "MVKSPIRVToMSLConverter-macOS";
-			targetProxy = A98149A31FB6B9EB005F00B4 /* PBXContainerItemProxy */;
+			name = MoltenVKShaderConverter;
+			targetProxy = A9B1C7F4251AA5AF001D12CC /* PBXContainerItemProxy */;
 		};
 /* End PBXTargetDependency section */
 
@@ -1721,8 +1599,11 @@
 				);
 				MACH_O_TYPE = staticlib;
 				MTL_ENABLE_DEBUG_INFO = YES;
+				MVK_SKIP_DYLIB = "";
+				"MVK_SKIP_DYLIB[sdk=appletvsimulator*]" = YES;
+				"MVK_SKIP_DYLIB[sdk=iphonesimulator*]" = YES;
 				ONLY_ACTIVE_ARCH = YES;
-				PRELINK_LIBS = "${CONFIGURATION_BUILD_DIR}/libMoltenVKSPIRVToMSLConverter.a ${CONFIGURATION_BUILD_DIR}/libMoltenVKGLSLToSPIRVConverter.a";
+				PRELINK_LIBS = "${CONFIGURATION_BUILD_DIR}/libMoltenVKShaderConverter.a";
 				PRODUCT_NAME = MoltenVK;
 				SKIP_INSTALL = YES;
 			};
@@ -1782,7 +1663,10 @@
 				);
 				MACH_O_TYPE = staticlib;
 				MTL_ENABLE_DEBUG_INFO = NO;
-				PRELINK_LIBS = "${CONFIGURATION_BUILD_DIR}/libMoltenVKSPIRVToMSLConverter.a ${CONFIGURATION_BUILD_DIR}/libMoltenVKGLSLToSPIRVConverter.a";
+				MVK_SKIP_DYLIB = "";
+				"MVK_SKIP_DYLIB[sdk=appletvsimulator*]" = YES;
+				"MVK_SKIP_DYLIB[sdk=iphonesimulator*]" = YES;
+				PRELINK_LIBS = "${CONFIGURATION_BUILD_DIR}/libMoltenVKShaderConverter.a";
 				PRODUCT_NAME = MoltenVK;
 				SKIP_INSTALL = YES;
 				VALIDATE_PRODUCT = YES;
diff --git a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
index 1e5d460..105483f 100644
--- a/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
+++ b/MoltenVK/MoltenVK/Commands/MVKCommandResourceFactory.h
@@ -186,7 +186,7 @@
         // even if the structure contains alignment gaps.
         mvkClear(this);
 
-        enabled = false,
+        enabled = false;
         stencilCompareFunction = MTLCompareFunctionAlways;
         stencilFailureOperation = MTLStencilOperationKeep;
         depthFailureOperation = MTLStencilOperationKeep;
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
index cd7ab9e..61ebd09 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKDevice.mm
@@ -33,7 +33,7 @@
 #include "MVKCodec.h"
 #include "MVKEnvironment.h"
 #include "MVKLogging.h"
-#include <MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h>
+#include <MoltenVKShaderConverter/SPIRVToMSLConverter.h>
 #include "vk_mvk_moltenvk.h"
 
 #import "CAMetalLayer+MoltenVK.h"
@@ -1251,6 +1251,12 @@
 	_metalFeatures.mslVersion = SPIRV_CROSS_NAMESPACE::CompilerMSL::Options::make_msl_version(maj, min);
 
 	switch (_metalFeatures.mslVersionEnum) {
+#if (defined(__MAC_OS_X_VERSION_MAX_ALLOWED) && __MAC_OS_X_VERSION_MAX_ALLOWED >= 101600) ||  \
+	(defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 140000)		// also covers tvOS
+		case MTLLanguageVersion2_3:
+			setMSLVersion(2, 3);
+			break;
+#endif
 		case MTLLanguageVersion2_2:
 			setMSLVersion(2, 2);
 			break;
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.h b/MoltenVK/MoltenVK/GPUObjects/MVKImage.h
index 227fe3e..ea8c68c 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.h
@@ -22,7 +22,7 @@
 #include "MVKCommandResourceFactory.h"
 #include "MVKSync.h"
 #include "MVKSmallVector.h"
-#include <MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h>
+#include <MoltenVKShaderConverter/SPIRVToMSLConverter.h>
 #include <unordered_map>
 #include <mutex>
 
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
index e615c7f..7db5dfd 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKImage.mm
@@ -1256,6 +1256,11 @@
 	}];
 	
 	if (hasPresentTime) {
+#if MVK_OS_SIMULATOR
+		// If MTLDrawable.presentedTime/addPresentedHandler isn't supported, just treat it as if the
+		// present happened when requested
+		_swapchain->recordPresentTime(presentID, desiredPresentTime, desiredPresentTime);
+#else
 		if ([_mtlDrawable respondsToSelector: @selector(addPresentedHandler:)]) {
 			[_mtlDrawable addPresentedHandler: ^(id<MTLDrawable> drawable) {
 				// Record the presentation time
@@ -1268,7 +1273,9 @@
 			// present happened when requested
 			_swapchain->recordPresentTime(presentID, desiredPresentTime, desiredPresentTime);
 		}
+#endif
 	}
+
 }
 
 // Resets the MTLTexture and CAMetalDrawable underlying this image.
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
index 9b9b40a..7c53e82 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.h
@@ -23,8 +23,8 @@
 #include "MVKShaderModule.h"
 #include "MVKSync.h"
 #include "MVKSmallVector.h"
-#include <MoltenVKSPIRVToMSLConverter/SPIRVReflection.h>
-#include <MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h>
+#include <MoltenVKShaderConverter/SPIRVReflection.h>
+#include <MoltenVKShaderConverter/SPIRVToMSLConverter.h>
 #include <unordered_map>
 #include <unordered_set>
 #include <ostream>
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
index 28d7c9c..4f59111 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKPipeline.mm
@@ -17,7 +17,7 @@
  */
 
 #include "MVKPipeline.h"
-#include <MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h>
+#include <MoltenVKShaderConverter/SPIRVToMSLConverter.h>
 #include "MVKRenderPass.h"
 #include "MVKCommandBuffer.h"
 #include "MVKFoundation.h"
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h
index 3af05fc..832189e 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKShaderModule.h
@@ -21,8 +21,8 @@
 #include "MVKDevice.h"
 #include "MVKSync.h"
 #include "MVKSmallVector.h"
-#include <MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h>
-#include <MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h>
+#include <MoltenVKShaderConverter/SPIRVToMSLConverter.h>
+#include <MoltenVKShaderConverter/GLSLToSPIRVConverter.h>
 #include <mutex>
 
 #import <Metal/Metal.h>
diff --git a/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm b/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
index 4f8ec3d..c63a16e 100644
--- a/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
+++ b/MoltenVK/MoltenVK/GPUObjects/MVKSync.mm
@@ -78,7 +78,7 @@
 
 
 #pragma mark -
-#pragma mark MVKSemaphoreMTLEvent
+#pragma mark MVKSemaphoreMTLFence
 
 // Could use any encoder. Assume BLIT is fastest and lightest.
 // Nil mtlCmdBuff will do nothing.
diff --git a/MoltenVK/MoltenVK/Utility/MVKFoundation.h b/MoltenVK/MoltenVK/Utility/MVKFoundation.h
index 3ce5714..d8d1ed2 100644
--- a/MoltenVK/MoltenVK/Utility/MVKFoundation.h
+++ b/MoltenVK/MoltenVK/Utility/MVKFoundation.h
@@ -26,6 +26,7 @@
 #include <cassert>
 #include <limits>
 #include <string>
+#include <cassert>
 #include <simd/simd.h>
 #include <type_traits>
 
diff --git a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
index 8bee86e..623c648 100644
--- a/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
+++ b/MoltenVK/MoltenVK/Vulkan/mvk_datatypes.mm
@@ -22,7 +22,7 @@
 #include "MVKFoundation.h"
 #include "MVKOSExtensions.h"
 #include "MVKBaseObject.h"
-#include <MoltenVKSPIRVToMSLConverter/SPIRVReflection.h>
+#include <MoltenVKShaderConverter/SPIRVReflection.h>
 #include <unordered_map>
 #include <string>
 #include <limits>
diff --git a/MoltenVK/dylib b/MoltenVK/dylib
new file mode 120000
index 0000000..d7bc57e
--- /dev/null
+++ b/MoltenVK/dylib
@@ -0,0 +1 @@
+../Package/Latest/MoltenVK/dylib
\ No newline at end of file
diff --git a/MoltenVK/iOS b/MoltenVK/iOS
deleted file mode 120000
index fcdc7b4..0000000
--- a/MoltenVK/iOS
+++ /dev/null
@@ -1 +0,0 @@
-../Package/Latest/MoltenVK/iOS
\ No newline at end of file
diff --git a/MoltenVK/macOS b/MoltenVK/macOS
deleted file mode 120000
index c83d7e9..0000000
--- a/MoltenVK/macOS
+++ /dev/null
@@ -1 +0,0 @@
-../Package/Latest/MoltenVK/macOS
\ No newline at end of file
diff --git a/MoltenVK/tvOS b/MoltenVK/tvOS
deleted file mode 120000
index 5b0bd8e..0000000
--- a/MoltenVK/tvOS
+++ /dev/null
@@ -1 +0,0 @@
-../Package/Latest/MoltenVK/tvOS
\ No newline at end of file
diff --git a/MoltenVKPackaging.xcodeproj/project.pbxproj b/MoltenVKPackaging.xcodeproj/project.pbxproj
index 584c18f..983965f 100644
--- a/MoltenVKPackaging.xcodeproj/project.pbxproj
+++ b/MoltenVKPackaging.xcodeproj/project.pbxproj
@@ -15,7 +15,6 @@
 			);
 			dependencies = (
 				2FEA0AC32490303F00EEF3AD /* PBXTargetDependency */,
-				2FEA0AD92490308E00EEF3AD /* PBXTargetDependency */,
 			);
 			name = "MoltenVK-tvOS";
 			productName = Package;
@@ -28,7 +27,6 @@
 			);
 			dependencies = (
 				A975D5792140585200D4834F /* PBXTargetDependency */,
-				A975D5812140585200D4834F /* PBXTargetDependency */,
 			);
 			name = "MoltenVK-iOS";
 			productName = Package;
@@ -41,7 +39,6 @@
 			);
 			dependencies = (
 				A975D58E2140586700D4834F /* PBXTargetDependency */,
-				A975D5982140586700D4834F /* PBXTargetDependency */,
 			);
 			name = "MoltenVK-macOS";
 			productName = Package;
@@ -62,11 +59,12 @@
 			isa = PBXAggregateTarget;
 			buildConfigurationList = A9FEADDC1F3517480010240E /* Build configuration list for PBXAggregateTarget "MoltenVK" */;
 			buildPhases = (
+				A9B1008824F84BE400EADC6E /* Package MoltenVK */,
 			);
 			dependencies = (
-				A9AFC2622184EEF60084B396 /* PBXTargetDependency */,
-				A9AFC2602184EEF60084B396 /* PBXTargetDependency */,
-				A9FC5F5F249D277E003CB086 /* PBXTargetDependency */,
+				A9B1008124F84BA700EADC6E /* PBXTargetDependency */,
+				A9B1008324F84BA700EADC6E /* PBXTargetDependency */,
+				A9B1008524F84BA700EADC6E /* PBXTargetDependency */,
 			);
 			name = MoltenVK;
 			productName = Package;
@@ -88,13 +86,6 @@
 			remoteGlobalIDString = 2FEA0A3B24902F9F00EEF3AD;
 			remoteInfo = "MoltenVK-tvOS";
 		};
-		2FEA0AD82490308E00EEF3AD /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = 2FEA0AC42490305800EEF3AD;
-			remoteInfo = "MoltenVKGLSLToSPIRVConverter-tvOS";
-		};
 		2FEA0ADB2490308E00EEF3AD /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
@@ -123,13 +114,6 @@
 			remoteGlobalIDString = A9B8EE091A98D796009C5A02;
 			remoteInfo = "MoltenVK-iOS";
 		};
-		A975D5822140585200D4834F /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = A937472B1A9A8B2900F29B34;
-			remoteInfo = "MoltenVKGLSLToSPIRVConverter-iOS";
-		};
 		A975D58F2140586700D4834F /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = A92DB3EE1CE0F72500FBC835 /* MoltenVK.xcodeproj */;
@@ -137,13 +121,6 @@
 			remoteGlobalIDString = A9CBED861B6299D800E45FDC;
 			remoteInfo = "MoltenVK-macOS";
 		};
-		A975D5992140586700D4834F /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
-			proxyType = 1;
-			remoteGlobalIDString = A9092A8C1A81717B00051823;
-			remoteInfo = MoltenVKShaderConverter;
-		};
 		A981498A1FB6B566005F00B4 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
@@ -186,20 +163,27 @@
 			remoteGlobalIDString = A9092A8C1A81717B00051823;
 			remoteInfo = MoltenVKShaderConverter;
 		};
-		A9AFC25F2184EEF60084B396 /* PBXContainerItemProxy */ = {
+		A9B1008024F84BA700EADC6E /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
-			containerPortal = A90B2B1D1A9B6170008EE819 /* Project object */;
+			containerPortal = A92DB3EE1CE0F72500FBC835 /* MoltenVK.xcodeproj */;
 			proxyType = 1;
-			remoteGlobalIDString = A975D5782140585200D4834F;
+			remoteGlobalIDString = A9B8EE091A98D796009C5A02;
 			remoteInfo = "MoltenVK-iOS";
 		};
-		A9AFC2612184EEF60084B396 /* PBXContainerItemProxy */ = {
+		A9B1008224F84BA700EADC6E /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
-			containerPortal = A90B2B1D1A9B6170008EE819 /* Project object */;
+			containerPortal = A92DB3EE1CE0F72500FBC835 /* MoltenVK.xcodeproj */;
 			proxyType = 1;
-			remoteGlobalIDString = A975D58B2140586700D4834F;
+			remoteGlobalIDString = A9CBED861B6299D800E45FDC;
 			remoteInfo = "MoltenVK-macOS";
 		};
+		A9B1008424F84BA700EADC6E /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = A92DB3EE1CE0F72500FBC835 /* MoltenVK.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = 2FEA0A3B24902F9F00EEF3AD;
+			remoteInfo = "MoltenVK-tvOS";
+		};
 		A9FC5F5C249D2547003CB086 /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = A92DB40E1CE0F89600FBC835 /* MoltenVKShaderConverter.xcodeproj */;
@@ -207,17 +191,9 @@
 			remoteGlobalIDString = 2FEA0D142490381A00EEF3AD;
 			remoteInfo = "MoltenVKSPIRVToMSLConverter-tvOS";
 		};
-		A9FC5F5E249D277E003CB086 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A90B2B1D1A9B6170008EE819 /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = 2FEA0A2F24902F5E00EEF3AD;
-			remoteInfo = "MoltenVK-tvOS";
-		};
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
-		A9149F7A221A528900DD7C6C /* package_shader_converter_lib.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_shader_converter_lib.sh; sourceTree = "<group>"; };
 		A92DB3E41CE0F37D00FBC835 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
 		A92DB3E51CE0F37D00FBC835 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
 		A92DB3E61CE0F37D00FBC835 /* Whats_New.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = Whats_New.md; path = Docs/Whats_New.md; sourceTree = "<group>"; };
@@ -227,25 +203,21 @@
 		A92EF7C721856EA200C8B91B /* package_shader_converter_tool.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_shader_converter_tool.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>"; };
+		A92EF7CB21856EA300C8B91B /* package_shader_converter_xcframework.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_shader_converter_xcframework.sh; sourceTree = "<group>"; };
 		A92EF7DE2186451700C8B91B /* Makefile */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.make; name = Makefile; path = ../Makefile; sourceTree = "<group>"; };
-		A941E2B1221AEBD000890C56 /* create_framework_ios.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_framework_ios.sh; sourceTree = "<group>"; };
-		A941E2B2221AEBD000890C56 /* create_framework_macos.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_framework_macos.sh; sourceTree = "<group>"; };
+		A93ED4DE24F59CDB00FEB018 /* copy_lib_to_staging.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = copy_lib_to_staging.sh; sourceTree = "<group>"; };
+		A93ED4E324F59CDB00FEB018 /* copy_to_staging.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = copy_to_staging.sh; sourceTree = "<group>"; };
 		A975D55C213F25D700D4834F /* create_dylib.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_dylib.sh; sourceTree = "<group>"; };
 		A980A25F24C628F3007A8F6F /* gen_moltenvk_rev_hdr.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = gen_moltenvk_rev_hdr.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; path = create_framework.sh; sourceTree = "<group>"; };
+		A9B1007A24F837AF00EADC6E /* create_xcframework_func.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_xcframework_func.sh; sourceTree = "<group>"; };
 		A9C70F41221B04C800FBA31A /* create_dylib_macos.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_dylib_macos.sh; sourceTree = "<group>"; };
 		A9C70F45221B04C800FBA31A /* create_dylib_ios.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_dylib_ios.sh; sourceTree = "<group>"; };
+		A9CBBFF924F8A1EB006D41EF /* package_moltenvk_xcframework.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_moltenvk_xcframework.sh; sourceTree = "<group>"; };
 		A9DA8340218A198C002AA662 /* .travis.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .travis.yml; sourceTree = "<group>"; };
 		A9DA8341218A198C002AA662 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = "<group>"; };
-		A9EE084A249BD49200E523A2 /* create_fat_lib_func.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_fat_lib_func.sh; sourceTree = "<group>"; };
-		A9EE084E249BD49200E523A2 /* create_fat_libs.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_fat_libs.sh; sourceTree = "<group>"; };
-		A9EE0851249BD71C00E523A2 /* create_fat_libs_ios.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_fat_libs_ios.sh; sourceTree = "<group>"; };
 		A9FC5F60249D2ED3003CB086 /* package_all.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = package_all.sh; sourceTree = "<group>"; };
 		A9FC5F64249D3778003CB086 /* create_dylib_tvos.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_dylib_tvos.sh; sourceTree = "<group>"; };
-		A9FC5F69249D3843003CB086 /* create_framework_tvos.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_framework_tvos.sh; sourceTree = "<group>"; };
-		A9FC5F6A249D38DF003CB086 /* create_fat_libs_tvos.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = create_fat_libs_tvos.sh; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXGroup section */
@@ -284,25 +256,20 @@
 		A975D55B213F25AD00D4834F /* Scripts */ = {
 			isa = PBXGroup;
 			children = (
+				A93ED4E324F59CDB00FEB018 /* copy_to_staging.sh */,
+				A93ED4DE24F59CDB00FEB018 /* copy_lib_to_staging.sh */,
 				A9C70F45221B04C800FBA31A /* create_dylib_ios.sh */,
 				A9C70F41221B04C800FBA31A /* create_dylib_macos.sh */,
 				A9FC5F64249D3778003CB086 /* create_dylib_tvos.sh */,
 				A975D55C213F25D700D4834F /* create_dylib.sh */,
-				A9EE084A249BD49200E523A2 /* create_fat_lib_func.sh */,
-				A9EE0851249BD71C00E523A2 /* create_fat_libs_ios.sh */,
-				A9FC5F6A249D38DF003CB086 /* create_fat_libs_tvos.sh */,
-				A9EE084E249BD49200E523A2 /* create_fat_libs.sh */,
-				A941E2B1221AEBD000890C56 /* create_framework_ios.sh */,
-				A941E2B2221AEBD000890C56 /* create_framework_macos.sh */,
-				A9FC5F69249D3843003CB086 /* create_framework_tvos.sh */,
-				A99A760321852584000A8E2A /* create_framework.sh */,
+				A9B1007A24F837AF00EADC6E /* create_xcframework_func.sh */,
 				A980A25F24C628F3007A8F6F /* gen_moltenvk_rev_hdr.sh */,
 				A9FC5F60249D2ED3003CB086 /* package_all.sh */,
 				A92EF7C921856EA200C8B91B /* package_docs.sh */,
+				A9CBBFF924F8A1EB006D41EF /* package_moltenvk_xcframework.sh */,
 				A92EF7C621856EA200C8B91B /* package_moltenvk.sh */,
-				A9149F7A221A528900DD7C6C /* package_shader_converter_lib.sh */,
 				A92EF7C721856EA200C8B91B /* package_shader_converter_tool.sh */,
-				A92EF7CB21856EA300C8B91B /* package_shader_converter.sh */,
+				A92EF7CB21856EA300C8B91B /* package_shader_converter_xcframework.sh */,
 				A92EF7CA21856EA200C8B91B /* package_update_latest.sh */,
 				A92EF7DE2186451700C8B91B /* Makefile */,
 			);
@@ -462,7 +429,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_OS=\"tvOS\"\nexport MVK_BUILT_PROD_DIR=\"${BUILT_PRODUCTS_DIR}-${MVK_OS}\"\n\n. \"${SRCROOT}/Scripts/package_all.sh\"\n";
+			shellScript = ". \"${SRCROOT}/Scripts/package_all.sh\"\n";
 		};
 		A975D5872140585200D4834F /* Package MoltenVK */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -476,7 +443,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_OS=\"iOS\"\nexport MVK_BUILT_PROD_DIR=\"${BUILT_PRODUCTS_DIR}-${MVK_OS}\"\n\n. \"${SRCROOT}/Scripts/package_all.sh\"\n";
+			shellScript = ". \"${SRCROOT}/Scripts/package_all.sh\"\n";
 		};
 		A975D59A2140586700D4834F /* Package MoltenVK */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -490,7 +457,7 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_OS=\"macOS\"\nexport MVK_BUILT_PROD_DIR=\"${BUILT_PRODUCTS_DIR}\"\n\n. \"${SRCROOT}/Scripts/package_all.sh\"\n. \"${SRCROOT}/Scripts/package_shader_converter_tool.sh\"\n";
+			shellScript = ". \"${SRCROOT}/Scripts/package_all.sh\"\n. \"${SRCROOT}/Scripts/package_shader_converter_tool.sh\"\n";
 		};
 		A9AD70122440ED3B00B9E254 /* Package MoltenVK */ = {
 			isa = PBXShellScriptBuildPhase;
@@ -504,7 +471,25 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = "export MVK_BUILT_PROD_DIR=\"${BUILT_PRODUCTS_DIR}\"\n. \"${SRCROOT}/Scripts/package_shader_converter_tool.sh\"\n. \"${SRCROOT}/Scripts/package_update_latest.sh\"\n";
+			shellScript = ". \"${SRCROOT}/Scripts/package_shader_converter_tool.sh\"\n. \"${SRCROOT}/Scripts/package_update_latest.sh\"\n";
+		};
+		A9B1008824F84BE400EADC6E /* Package MoltenVK */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+			);
+			inputPaths = (
+			);
+			name = "Package MoltenVK";
+			outputFileListPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = ". \"${SRCROOT}/Scripts/package_all.sh\"\n. \"${SRCROOT}/Scripts/package_shader_converter_tool.sh\"\n\n";
 		};
 /* End PBXShellScriptBuildPhase section */
 
@@ -514,50 +499,35 @@
 			name = "MoltenVK-tvOS";
 			targetProxy = 2FEA0AC22490303F00EEF3AD /* PBXContainerItemProxy */;
 		};
-		2FEA0AD92490308E00EEF3AD /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = "MoltenVKGLSLToSPIRVConverter-tvOS";
-			targetProxy = 2FEA0AD82490308E00EEF3AD /* PBXContainerItemProxy */;
-		};
 		A975D5792140585200D4834F /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			name = "MoltenVK-iOS";
 			targetProxy = A975D57A2140585200D4834F /* PBXContainerItemProxy */;
 		};
-		A975D5812140585200D4834F /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = "MoltenVKGLSLToSPIRVConverter-iOS";
-			targetProxy = A975D5822140585200D4834F /* PBXContainerItemProxy */;
-		};
 		A975D58E2140586700D4834F /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			name = "MoltenVK-macOS";
 			targetProxy = A975D58F2140586700D4834F /* PBXContainerItemProxy */;
 		};
-		A975D5982140586700D4834F /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			name = MoltenVKShaderConverter;
-			targetProxy = A975D5992140586700D4834F /* PBXContainerItemProxy */;
-		};
 		A9AD70102440ED3B00B9E254 /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			name = MoltenVKShaderConverter;
 			targetProxy = A9AD70112440ED3B00B9E254 /* PBXContainerItemProxy */;
 		};
-		A9AFC2602184EEF60084B396 /* PBXTargetDependency */ = {
+		A9B1008124F84BA700EADC6E /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			target = A975D5782140585200D4834F /* MoltenVK-iOS */;
-			targetProxy = A9AFC25F2184EEF60084B396 /* PBXContainerItemProxy */;
+			name = "MoltenVK-iOS";
+			targetProxy = A9B1008024F84BA700EADC6E /* PBXContainerItemProxy */;
 		};
-		A9AFC2622184EEF60084B396 /* PBXTargetDependency */ = {
+		A9B1008324F84BA700EADC6E /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			target = A975D58B2140586700D4834F /* MoltenVK-macOS */;
-			targetProxy = A9AFC2612184EEF60084B396 /* PBXContainerItemProxy */;
+			name = "MoltenVK-macOS";
+			targetProxy = A9B1008224F84BA700EADC6E /* PBXContainerItemProxy */;
 		};
-		A9FC5F5F249D277E003CB086 /* PBXTargetDependency */ = {
+		A9B1008524F84BA700EADC6E /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			target = 2FEA0A2F24902F5E00EEF3AD /* MoltenVK-tvOS */;
-			targetProxy = A9FC5F5E249D277E003CB086 /* PBXContainerItemProxy */;
+			name = "MoltenVK-tvOS";
+			targetProxy = A9B1008424F84BA700EADC6E /* PBXContainerItemProxy */;
 		};
 /* End PBXTargetDependency section */
 
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS
deleted file mode 120000
index 4a4b357..0000000
--- a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS
+++ /dev/null
@@ -1 +0,0 @@
-../../Package/Latest/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS
deleted file mode 120000
index ffa407b..0000000
--- a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS
+++ /dev/null
@@ -1 +0,0 @@
-../../Package/Latest/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/tvOS b/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/tvOS
deleted file mode 120000
index 15a8980..0000000
--- a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/tvOS
+++ /dev/null
@@ -1 +0,0 @@
-../../Package/Latest/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/tvOS
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/iOS b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/iOS
deleted file mode 120000
index 4a4b357..0000000
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/iOS
+++ /dev/null
@@ -1 +0,0 @@
-../../Package/Latest/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/iOS
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/macOS b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/macOS
deleted file mode 120000
index ffa407b..0000000
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/macOS
+++ /dev/null
@@ -1 +0,0 @@
-../../Package/Latest/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/macOS
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/tvOS b/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/tvOS
deleted file mode 120000
index 15a8980..0000000
--- a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/tvOS
+++ /dev/null
@@ -1 +0,0 @@
-../../Package/Latest/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/tvOS
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcframework b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcframework
new file mode 120000
index 0000000..326ce4d
--- /dev/null
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcframework
@@ -0,0 +1 @@
+../Package/Latest/MoltenVKShaderConverter/MoltenVKShaderConverter.xcframework
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj
index 49986c6..0375ed4 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/project.pbxproj
@@ -3,20 +3,10 @@
 	archiveVersion = 1;
 	classes = {
 	};
-	objectVersion = 48;
+	objectVersion = 52;
 	objects = {
 
 /* Begin PBXBuildFile section */
-		2FEA0AC62490305800EEF3AD /* SPIRVSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C70F5D221B321600FBA31A /* SPIRVSupport.h */; };
-		2FEA0AC72490305800EEF3AD /* GLSLConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A90941A21C581F840094110D /* GLSLConversion.h */; };
-		2FEA0AC82490305800EEF3AD /* GLSLToSPIRVConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = A90940A41C5808BB0094110D /* GLSLToSPIRVConverter.h */; };
-		2FEA0AC92490305800EEF3AD /* MVKCommonEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = A9F042AA1FB4D060009FCCB8 /* MVKCommonEnvironment.h */; };
-		2FEA0ACA2490305800EEF3AD /* MVKStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149651FB6A98A005F00B4 /* MVKStrings.h */; };
-		2FEA0ACC2490305800EEF3AD /* GLSLConversion.mm in Sources */ = {isa = PBXBuildFile; fileRef = A90941A11C581F840094110D /* GLSLConversion.mm */; };
-		2FEA0ACD2490305800EEF3AD /* SPIRVSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C70F5E221B321700FBA31A /* SPIRVSupport.cpp */; };
-		2FEA0ACE2490305800EEF3AD /* GLSLToSPIRVConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A90940A31C5808BB0094110D /* GLSLToSPIRVConverter.cpp */; };
-		2FEA0CFC249037E300EEF3AD /* libglslang.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FEA0CFB249037DA00EEF3AD /* libglslang.a */; };
-		2FEA0CFE2490380B00EEF3AD /* libSPIRVTools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FEA0CF9249037DA00EEF3AD /* libSPIRVTools.a */; };
 		2FEA0D012490381A00EEF3AD /* SPIRVReflection.h in Headers */ = {isa = PBXBuildFile; fileRef = 450A4F5E220CB180007203D7 /* SPIRVReflection.h */; };
 		2FEA0D022490381A00EEF3AD /* MVKStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149651FB6A98A005F00B4 /* MVKStrings.h */; };
 		2FEA0D032490381A00EEF3AD /* SPIRVSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C70F5D221B321600FBA31A /* SPIRVSupport.h */; };
@@ -27,24 +17,28 @@
 		2FEA0D092490381A00EEF3AD /* SPIRVToMSLConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9093F5A1C58013E0094110D /* SPIRVToMSLConverter.cpp */; };
 		2FEA0D0A2490381A00EEF3AD /* SPIRVSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C70F5E221B321700FBA31A /* SPIRVSupport.cpp */; };
 		2FEA0D0B2490381A00EEF3AD /* SPIRVConversion.mm in Sources */ = {isa = PBXBuildFile; fileRef = A928C9181D0488DC00071B88 /* SPIRVConversion.mm */; };
-		2FEA0D15249038E000EEF3AD /* libSPIRVCross.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FEA0CFA249037DA00EEF3AD /* libSPIRVCross.a */; };
-		2FEA0D16249038E600EEF3AD /* libSPIRVTools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2FEA0CF9249037DA00EEF3AD /* libSPIRVTools.a */; };
 		450A4F61220CB180007203D7 /* SPIRVReflection.h in Headers */ = {isa = PBXBuildFile; fileRef = 450A4F5E220CB180007203D7 /* SPIRVReflection.h */; };
 		450A4F62220CB180007203D7 /* SPIRVReflection.h in Headers */ = {isa = PBXBuildFile; fileRef = 450A4F5E220CB180007203D7 /* SPIRVReflection.h */; };
 		A909408A1C58013E0094110D /* SPIRVToMSLConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9093F5A1C58013E0094110D /* SPIRVToMSLConverter.cpp */; };
 		A909408B1C58013E0094110D /* SPIRVToMSLConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9093F5A1C58013E0094110D /* SPIRVToMSLConverter.cpp */; };
 		A909408C1C58013E0094110D /* SPIRVToMSLConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = A9093F5B1C58013E0094110D /* SPIRVToMSLConverter.h */; };
 		A909408D1C58013E0094110D /* SPIRVToMSLConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = A9093F5B1C58013E0094110D /* SPIRVToMSLConverter.h */; };
-		A90940A71C5808BB0094110D /* GLSLToSPIRVConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A90940A31C5808BB0094110D /* GLSLToSPIRVConverter.cpp */; };
-		A90940A81C5808BB0094110D /* GLSLToSPIRVConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A90940A31C5808BB0094110D /* GLSLToSPIRVConverter.cpp */; };
-		A90940A91C5808BB0094110D /* GLSLToSPIRVConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = A90940A41C5808BB0094110D /* GLSLToSPIRVConverter.h */; };
-		A90940AA1C5808BB0094110D /* GLSLToSPIRVConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = A90940A41C5808BB0094110D /* GLSLToSPIRVConverter.h */; };
-		A90941A31C581F840094110D /* GLSLConversion.mm in Sources */ = {isa = PBXBuildFile; fileRef = A90941A11C581F840094110D /* GLSLConversion.mm */; };
-		A90941A41C581F840094110D /* GLSLConversion.mm in Sources */ = {isa = PBXBuildFile; fileRef = A90941A11C581F840094110D /* GLSLConversion.mm */; };
-		A90941A51C581F840094110D /* GLSLConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A90941A21C581F840094110D /* GLSLConversion.h */; };
-		A90941A61C581F840094110D /* GLSLConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A90941A21C581F840094110D /* GLSLConversion.h */; };
-		A925B71A1C78DEB2006E7ECD /* libMoltenVKGLSLToSPIRVConverter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A964BD601C57EFBD00D930D8 /* libMoltenVKGLSLToSPIRVConverter.a */; };
-		A925B71B1C78DEB2006E7ECD /* libMoltenVKSPIRVToMSLConverter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A93903C71C57E9ED00FE90DC /* libMoltenVKSPIRVToMSLConverter.a */; };
+		A920A8A3251B75B70076851C /* GLSLToSPIRVConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A920A89F251B75B70076851C /* GLSLToSPIRVConverter.cpp */; };
+		A920A8A4251B75B70076851C /* GLSLToSPIRVConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A920A89F251B75B70076851C /* GLSLToSPIRVConverter.cpp */; };
+		A920A8A5251B75B70076851C /* GLSLToSPIRVConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A920A89F251B75B70076851C /* GLSLToSPIRVConverter.cpp */; };
+		A920A8A6251B75B70076851C /* GLSLConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A920A8A0251B75B70076851C /* GLSLConversion.h */; };
+		A920A8A7251B75B70076851C /* GLSLConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A920A8A0251B75B70076851C /* GLSLConversion.h */; };
+		A920A8A8251B75B70076851C /* GLSLConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A920A8A0251B75B70076851C /* GLSLConversion.h */; };
+		A920A8A9251B75B70076851C /* GLSLConversion.mm in Sources */ = {isa = PBXBuildFile; fileRef = A920A8A1251B75B70076851C /* GLSLConversion.mm */; };
+		A920A8AA251B75B70076851C /* GLSLConversion.mm in Sources */ = {isa = PBXBuildFile; fileRef = A920A8A1251B75B70076851C /* GLSLConversion.mm */; };
+		A920A8AB251B75B70076851C /* GLSLConversion.mm in Sources */ = {isa = PBXBuildFile; fileRef = A920A8A1251B75B70076851C /* GLSLConversion.mm */; };
+		A920A8AC251B75B70076851C /* GLSLToSPIRVConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = A920A8A2251B75B70076851C /* GLSLToSPIRVConverter.h */; };
+		A920A8AD251B75B80076851C /* GLSLToSPIRVConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = A920A8A2251B75B70076851C /* GLSLToSPIRVConverter.h */; };
+		A920A8AE251B75B80076851C /* GLSLToSPIRVConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = A920A8A2251B75B70076851C /* GLSLToSPIRVConverter.h */; };
+		A920A8AF251B77900076851C /* glslang.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A98386FD24EEE93700199A05 /* glslang.xcframework */; };
+		A920A8B0251B77910076851C /* glslang.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A98386FD24EEE93700199A05 /* glslang.xcframework */; };
+		A920A8B1251B77920076851C /* glslang.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A98386FD24EEE93700199A05 /* glslang.xcframework */; };
+		A925B71B1C78DEB2006E7ECD /* libMoltenVKShaderConverter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A93903C71C57E9ED00FE90DC /* libMoltenVKShaderConverter.a */; };
 		A928C9191D0488DC00071B88 /* SPIRVConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A928C9171D0488DC00071B88 /* SPIRVConversion.h */; };
 		A928C91A1D0488DC00071B88 /* SPIRVConversion.h in Headers */ = {isa = PBXBuildFile; fileRef = A928C9171D0488DC00071B88 /* SPIRVConversion.h */; };
 		A928C91B1D0488DC00071B88 /* SPIRVConversion.mm in Sources */ = {isa = PBXBuildFile; fileRef = A928C9181D0488DC00071B88 /* SPIRVConversion.mm */; };
@@ -52,33 +46,23 @@
 		A95096BB2003D00300F10950 /* FileSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = A925B70A1C7754B2006E7ECD /* FileSupport.mm */; };
 		A95096BC2003D00300F10950 /* FileSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = A925B70A1C7754B2006E7ECD /* FileSupport.mm */; };
 		A95096BF2003D32400F10950 /* OSSupport.mm in Sources */ = {isa = PBXBuildFile; fileRef = A95096BD2003D32400F10950 /* OSSupport.mm */; };
-		A972AD2B21CEE6A90013AB25 /* libglslang.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A972AD2A21CEE6A90013AB25 /* libglslang.a */; };
-		A972AD3121CEE7040013AB25 /* libSPIRVCross.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A972AD2F21CEE7040013AB25 /* libSPIRVCross.a */; };
-		A972AD3221CEE7040013AB25 /* libSPIRVTools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A972AD3021CEE7040013AB25 /* libSPIRVTools.a */; };
-		A972AD3621CEE7330013AB25 /* libSPIRVTools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A972AD3421CEE7330013AB25 /* libSPIRVTools.a */; };
-		A972AD3721CEE7330013AB25 /* libSPIRVCross.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A972AD3521CEE7330013AB25 /* libSPIRVCross.a */; };
-		A972AD3921CEE7480013AB25 /* libglslang.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A972AD3821CEE7480013AB25 /* libglslang.a */; };
 		A97CC7401C7527F3004A5C7E /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A97CC73D1C7527F3004A5C7E /* main.cpp */; };
 		A97CC7411C7527F3004A5C7E /* MoltenVKShaderConverterTool.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A97CC73E1C7527F3004A5C7E /* MoltenVKShaderConverterTool.cpp */; };
-		A98149661FB6A98A005F00B4 /* MVKStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149651FB6A98A005F00B4 /* MVKStrings.h */; };
-		A98149671FB6A98A005F00B4 /* MVKStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149651FB6A98A005F00B4 /* MVKStrings.h */; };
 		A98149681FB6A98A005F00B4 /* MVKStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149651FB6A98A005F00B4 /* MVKStrings.h */; };
 		A98149691FB6A98A005F00B4 /* MVKStrings.h in Headers */ = {isa = PBXBuildFile; fileRef = A98149651FB6A98A005F00B4 /* MVKStrings.h */; };
+		A98386FA24EEE91A00199A05 /* SPIRVCross.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A98386F824EEE91A00199A05 /* SPIRVCross.xcframework */; };
+		A98386FB24EEE91A00199A05 /* SPIRVCross.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A98386F824EEE91A00199A05 /* SPIRVCross.xcframework */; };
+		A98386FC24EEE91A00199A05 /* SPIRVCross.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A98386F824EEE91A00199A05 /* SPIRVCross.xcframework */; };
+		A983870724EEE94800199A05 /* SPIRVTools.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A983870224EEE94800199A05 /* SPIRVTools.xcframework */; };
+		A983870824EEE94800199A05 /* SPIRVTools.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A983870224EEE94800199A05 /* SPIRVTools.xcframework */; };
+		A983870924EEE94800199A05 /* SPIRVTools.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A983870224EEE94800199A05 /* SPIRVTools.xcframework */; };
 		A9A14E332244388700C080F3 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9A14E322244388700C080F3 /* Metal.framework */; };
 		A9B51BDD225E98BB00AC74D2 /* MVKOSExtensions.mm in Sources */ = {isa = PBXBuildFile; fileRef = A9B51BDB225E98BB00AC74D2 /* MVKOSExtensions.mm */; };
-		A9C70F5A221B2F6500FBA31A /* libSPIRVTools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A972AD3021CEE7040013AB25 /* libSPIRVTools.a */; };
-		A9C70F5B221B2F8100FBA31A /* libSPIRVTools.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A972AD3421CEE7330013AB25 /* libSPIRVTools.a */; };
-		A9C70F5F221B321700FBA31A /* SPIRVSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C70F5D221B321600FBA31A /* SPIRVSupport.h */; };
-		A9C70F60221B321700FBA31A /* SPIRVSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C70F5D221B321600FBA31A /* SPIRVSupport.h */; };
 		A9C70F61221B321700FBA31A /* SPIRVSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C70F5D221B321600FBA31A /* SPIRVSupport.h */; };
 		A9C70F62221B321700FBA31A /* SPIRVSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = A9C70F5D221B321600FBA31A /* SPIRVSupport.h */; };
 		A9C70F63221B321700FBA31A /* SPIRVSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C70F5E221B321700FBA31A /* SPIRVSupport.cpp */; };
-		A9C70F64221B321700FBA31A /* SPIRVSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C70F5E221B321700FBA31A /* SPIRVSupport.cpp */; };
-		A9C70F65221B321700FBA31A /* SPIRVSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C70F5E221B321700FBA31A /* SPIRVSupport.cpp */; };
 		A9C70F66221B321700FBA31A /* SPIRVSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C70F5E221B321700FBA31A /* SPIRVSupport.cpp */; };
 		A9C70F67221B321700FBA31A /* SPIRVSupport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A9C70F5E221B321700FBA31A /* SPIRVSupport.cpp */; };
-		A9F042B01FB4D060009FCCB8 /* MVKCommonEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = A9F042AA1FB4D060009FCCB8 /* MVKCommonEnvironment.h */; };
-		A9F042B11FB4D060009FCCB8 /* MVKCommonEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = A9F042AA1FB4D060009FCCB8 /* MVKCommonEnvironment.h */; };
 		A9F042B21FB4D060009FCCB8 /* MVKCommonEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = A9F042AA1FB4D060009FCCB8 /* MVKCommonEnvironment.h */; };
 		A9F042B31FB4D060009FCCB8 /* MVKCommonEnvironment.h in Headers */ = {isa = PBXBuildFile; fileRef = A9F042AA1FB4D060009FCCB8 /* MVKCommonEnvironment.h */; };
 /* End PBXBuildFile section */
@@ -91,49 +75,33 @@
 			remoteGlobalIDString = A93903C01C57E9ED00FE90DC;
 			remoteInfo = "MoltenVKSPIRVToMSLConverter-macOS";
 		};
-		A93749CE1A9AA7AF00F29B34 /* PBXContainerItemProxy */ = {
-			isa = PBXContainerItemProxy;
-			containerPortal = A9F55D25198BE6A7004EC31B /* Project object */;
-			proxyType = 1;
-			remoteGlobalIDString = A93747701A9A98D000F29B34;
-			remoteInfo = "MetalGLShaderConverter-macOS";
-		};
 /* End PBXContainerItemProxy section */
 
 /* Begin PBXFileReference section */
-		2FEA0AD72490305800EEF3AD /* libMoltenVKGLSLToSPIRVConverter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVKGLSLToSPIRVConverter.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		2FEA0CF9249037DA00EEF3AD /* libSPIRVTools.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSPIRVTools.a; path = ../Release/tvOS/libSPIRVTools.a; sourceTree = "<group>"; };
-		2FEA0CFA249037DA00EEF3AD /* libSPIRVCross.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSPIRVCross.a; path = ../Release/tvOS/libSPIRVCross.a; sourceTree = "<group>"; };
-		2FEA0CFB249037DA00EEF3AD /* libglslang.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libglslang.a; path = ../Release/tvOS/libglslang.a; sourceTree = "<group>"; };
-		2FEA0D142490381A00EEF3AD /* libMoltenVKSPIRVToMSLConverter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVKSPIRVToMSLConverter.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		2FEA0D142490381A00EEF3AD /* libMoltenVKShaderConverter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVKShaderConverter.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		450A4F5E220CB180007203D7 /* SPIRVReflection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPIRVReflection.h; sourceTree = "<group>"; };
 		A9093F5A1C58013E0094110D /* SPIRVToMSLConverter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SPIRVToMSLConverter.cpp; sourceTree = "<group>"; };
 		A9093F5B1C58013E0094110D /* SPIRVToMSLConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPIRVToMSLConverter.h; sourceTree = "<group>"; };
-		A90940A31C5808BB0094110D /* GLSLToSPIRVConverter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GLSLToSPIRVConverter.cpp; sourceTree = "<group>"; };
-		A90940A41C5808BB0094110D /* GLSLToSPIRVConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSLToSPIRVConverter.h; sourceTree = "<group>"; };
-		A90941A11C581F840094110D /* GLSLConversion.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GLSLConversion.mm; sourceTree = "<group>"; };
-		A90941A21C581F840094110D /* GLSLConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSLConversion.h; sourceTree = "<group>"; };
+		A920A89F251B75B70076851C /* GLSLToSPIRVConverter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GLSLToSPIRVConverter.cpp; sourceTree = "<group>"; };
+		A920A8A0251B75B70076851C /* GLSLConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSLConversion.h; sourceTree = "<group>"; };
+		A920A8A1251B75B70076851C /* GLSLConversion.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GLSLConversion.mm; sourceTree = "<group>"; };
+		A920A8A2251B75B70076851C /* GLSLToSPIRVConverter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GLSLToSPIRVConverter.h; sourceTree = "<group>"; };
 		A925B70A1C7754B2006E7ECD /* FileSupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = FileSupport.mm; sourceTree = "<group>"; };
 		A925B70B1C7754B2006E7ECD /* FileSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileSupport.h; sourceTree = "<group>"; };
 		A928C9171D0488DC00071B88 /* SPIRVConversion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SPIRVConversion.h; sourceTree = "<group>"; };
 		A928C9181D0488DC00071B88 /* SPIRVConversion.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SPIRVConversion.mm; sourceTree = "<group>"; };
-		A93903BF1C57E9D700FE90DC /* libMoltenVKSPIRVToMSLConverter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVKSPIRVToMSLConverter.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		A93903C71C57E9ED00FE90DC /* libMoltenVKSPIRVToMSLConverter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVKSPIRVToMSLConverter.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		A93903BF1C57E9D700FE90DC /* libMoltenVKShaderConverter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVKShaderConverter.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		A93903C71C57E9ED00FE90DC /* libMoltenVKShaderConverter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVKShaderConverter.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		A95096BD2003D32400F10950 /* OSSupport.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OSSupport.mm; sourceTree = "<group>"; };
 		A95096BE2003D32400F10950 /* OSSupport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OSSupport.h; sourceTree = "<group>"; };
 		A964BD5F1C57EFBD00D930D8 /* MoltenVKShaderConverter */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MoltenVKShaderConverter; sourceTree = BUILT_PRODUCTS_DIR; };
-		A964BD601C57EFBD00D930D8 /* libMoltenVKGLSLToSPIRVConverter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVKGLSLToSPIRVConverter.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		A964BD611C57EFBD00D930D8 /* libMoltenVKGLSLToSPIRVConverter.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libMoltenVKGLSLToSPIRVConverter.a; sourceTree = BUILT_PRODUCTS_DIR; };
-		A972AD2A21CEE6A90013AB25 /* libglslang.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libglslang.a; path = iOS/libglslang.a; sourceTree = "<group>"; };
-		A972AD2F21CEE7040013AB25 /* libSPIRVCross.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSPIRVCross.a; path = iOS/libSPIRVCross.a; sourceTree = "<group>"; };
-		A972AD3021CEE7040013AB25 /* libSPIRVTools.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSPIRVTools.a; path = iOS/libSPIRVTools.a; sourceTree = "<group>"; };
-		A972AD3421CEE7330013AB25 /* libSPIRVTools.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSPIRVTools.a; path = macOS/libSPIRVTools.a; sourceTree = "<group>"; };
-		A972AD3521CEE7330013AB25 /* libSPIRVCross.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libSPIRVCross.a; path = macOS/libSPIRVCross.a; sourceTree = "<group>"; };
-		A972AD3821CEE7480013AB25 /* libglslang.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libglslang.a; path = macOS/libglslang.a; sourceTree = "<group>"; };
 		A97CC73D1C7527F3004A5C7E /* main.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = main.cpp; sourceTree = "<group>"; };
 		A97CC73E1C7527F3004A5C7E /* MoltenVKShaderConverterTool.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MoltenVKShaderConverterTool.cpp; sourceTree = "<group>"; };
 		A97CC73F1C7527F3004A5C7E /* MoltenVKShaderConverterTool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MoltenVKShaderConverterTool.h; sourceTree = "<group>"; };
 		A98149651FB6A98A005F00B4 /* MVKStrings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKStrings.h; sourceTree = "<group>"; };
+		A98386F824EEE91A00199A05 /* SPIRVCross.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = SPIRVCross.xcframework; sourceTree = "<group>"; };
+		A98386FD24EEE93700199A05 /* glslang.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = glslang.xcframework; sourceTree = "<group>"; };
+		A983870224EEE94800199A05 /* SPIRVTools.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = SPIRVTools.xcframework; sourceTree = "<group>"; };
 		A9A14E322244388700C080F3 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = System/Library/Frameworks/Metal.framework; sourceTree = SDKROOT; };
 		A9B51BDB225E98BB00AC74D2 /* MVKOSExtensions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MVKOSExtensions.mm; sourceTree = "<group>"; };
 		A9B51BDC225E98BB00AC74D2 /* MVKOSExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVKOSExtensions.h; sourceTree = "<group>"; };
@@ -143,21 +111,13 @@
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
-		2FEA0ACF2490305800EEF3AD /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				2FEA0CFE2490380B00EEF3AD /* libSPIRVTools.a in Frameworks */,
-				2FEA0CFC249037E300EEF3AD /* libglslang.a in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 		2FEA0D0C2490381A00EEF3AD /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				2FEA0D16249038E600EEF3AD /* libSPIRVTools.a in Frameworks */,
-				2FEA0D15249038E000EEF3AD /* libSPIRVCross.a in Frameworks */,
+				A983870824EEE94800199A05 /* SPIRVTools.xcframework in Frameworks */,
+				A98386FB24EEE91A00199A05 /* SPIRVCross.xcframework in Frameworks */,
+				A920A8B0251B77910076851C /* glslang.xcframework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -166,26 +126,7 @@
 			buildActionMask = 2147483647;
 			files = (
 				A9A14E332244388700C080F3 /* Metal.framework in Frameworks */,
-				A925B71A1C78DEB2006E7ECD /* libMoltenVKGLSLToSPIRVConverter.a in Frameworks */,
-				A925B71B1C78DEB2006E7ECD /* libMoltenVKSPIRVToMSLConverter.a in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		A972AD2821CEE6310013AB25 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				A972AD2B21CEE6A90013AB25 /* libglslang.a in Frameworks */,
-				A9C70F5A221B2F6500FBA31A /* libSPIRVTools.a in Frameworks */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		A972AD2C21CEE6C30013AB25 /* Frameworks */ = {
-			isa = PBXFrameworksBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				A972AD3921CEE7480013AB25 /* libglslang.a in Frameworks */,
-				A9C70F5B221B2F8100FBA31A /* libSPIRVTools.a in Frameworks */,
+				A925B71B1C78DEB2006E7ECD /* libMoltenVKShaderConverter.a in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -193,8 +134,9 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A972AD3221CEE7040013AB25 /* libSPIRVTools.a in Frameworks */,
-				A972AD3121CEE7040013AB25 /* libSPIRVCross.a in Frameworks */,
+				A983870724EEE94800199A05 /* SPIRVTools.xcframework in Frameworks */,
+				A98386FA24EEE91A00199A05 /* SPIRVCross.xcframework in Frameworks */,
+				A920A8AF251B77900076851C /* glslang.xcframework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -202,47 +144,40 @@
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
-				A972AD3621CEE7330013AB25 /* libSPIRVTools.a in Frameworks */,
-				A972AD3721CEE7330013AB25 /* libSPIRVCross.a in Frameworks */,
+				A983870924EEE94800199A05 /* SPIRVTools.xcframework in Frameworks */,
+				A98386FC24EEE91A00199A05 /* SPIRVCross.xcframework in Frameworks */,
+				A920A8B1251B77920076851C /* glslang.xcframework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXFrameworksBuildPhase section */
 
 /* Begin PBXGroup section */
-		A9093C561C58013D0094110D /* MoltenVKSPIRVToMSLConverter */ = {
+		A9093C561C58013D0094110D /* MoltenVKShaderConverter */ = {
 			isa = PBXGroup;
 			children = (
 				A925B70B1C7754B2006E7ECD /* FileSupport.h */,
 				A925B70A1C7754B2006E7ECD /* FileSupport.mm */,
+				A920A8A0251B75B70076851C /* GLSLConversion.h */,
+				A920A8A1251B75B70076851C /* GLSLConversion.mm */,
+				A920A89F251B75B70076851C /* GLSLToSPIRVConverter.cpp */,
+				A920A8A2251B75B70076851C /* GLSLToSPIRVConverter.h */,
 				A928C9171D0488DC00071B88 /* SPIRVConversion.h */,
 				A928C9181D0488DC00071B88 /* SPIRVConversion.mm */,
 				450A4F5E220CB180007203D7 /* SPIRVReflection.h */,
 				A9093F5A1C58013E0094110D /* SPIRVToMSLConverter.cpp */,
 				A9093F5B1C58013E0094110D /* SPIRVToMSLConverter.h */,
 			);
-			path = MoltenVKSPIRVToMSLConverter;
-			sourceTree = "<group>";
-		};
-		A90940A11C5808BB0094110D /* MoltenVKGLSLToSPIRVConverter */ = {
-			isa = PBXGroup;
-			children = (
-				A90941A21C581F840094110D /* GLSLConversion.h */,
-				A90941A11C581F840094110D /* GLSLConversion.mm */,
-				A90940A31C5808BB0094110D /* GLSLToSPIRVConverter.cpp */,
-				A90940A41C5808BB0094110D /* GLSLToSPIRVConverter.h */,
-			);
-			path = MoltenVKGLSLToSPIRVConverter;
+			path = MoltenVKShaderConverter;
 			sourceTree = "<group>";
 		};
 		A964B28D1C57EBC400D930D8 /* Products */ = {
 			isa = PBXGroup;
 			children = (
-				A93903C71C57E9ED00FE90DC /* libMoltenVKSPIRVToMSLConverter.a */,
-				A93903BF1C57E9D700FE90DC /* libMoltenVKSPIRVToMSLConverter.a */,
+				A93903C71C57E9ED00FE90DC /* libMoltenVKShaderConverter.a */,
+				A93903BF1C57E9D700FE90DC /* libMoltenVKShaderConverter.a */,
+				2FEA0D142490381A00EEF3AD /* libMoltenVKShaderConverter.a */,
 				A964BD5F1C57EFBD00D930D8 /* MoltenVKShaderConverter */,
-				A964BD601C57EFBD00D930D8 /* libMoltenVKGLSLToSPIRVConverter.a */,
-				A964BD611C57EFBD00D930D8 /* libMoltenVKGLSLToSPIRVConverter.a */,
 			);
 			name = Products;
 			sourceTree = "<group>";
@@ -250,16 +185,10 @@
 		A972AD2921CEE6A80013AB25 /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				A98386F824EEE91A00199A05 /* SPIRVCross.xcframework */,
+				A98386FD24EEE93700199A05 /* glslang.xcframework */,
+				A983870224EEE94800199A05 /* SPIRVTools.xcframework */,
 				A9A14E322244388700C080F3 /* Metal.framework */,
-				2FEA0CF9249037DA00EEF3AD /* libSPIRVTools.a */,
-				2FEA0CFA249037DA00EEF3AD /* libSPIRVCross.a */,
-				2FEA0CFB249037DA00EEF3AD /* libglslang.a */,
-				A972AD2A21CEE6A90013AB25 /* libglslang.a */,
-				A972AD3821CEE7480013AB25 /* libglslang.a */,
-				A972AD2F21CEE7040013AB25 /* libSPIRVCross.a */,
-				A972AD3521CEE7330013AB25 /* libSPIRVCross.a */,
-				A972AD3021CEE7040013AB25 /* libSPIRVTools.a */,
-				A972AD3421CEE7330013AB25 /* libSPIRVTools.a */,
 			);
 			name = Frameworks;
 			path = ../External/build/Latest;
@@ -294,13 +223,10 @@
 		A9F55D24198BE6A7004EC31B = {
 			isa = PBXGroup;
 			children = (
-				A9093C561C58013D0094110D /* MoltenVKSPIRVToMSLConverter */,
-				A90940A11C5808BB0094110D /* MoltenVKGLSLToSPIRVConverter */,
+				A9093C561C58013D0094110D /* MoltenVKShaderConverter */,
 				A97CC73C1C7527F3004A5C7E /* MoltenVKShaderConverterTool */,
 				A9F042A81FB4D060009FCCB8 /* Common */,
 				A964B28D1C57EBC400D930D8 /* Products */,
-				2FEA0AD72490305800EEF3AD /* libMoltenVKGLSLToSPIRVConverter.a */,
-				2FEA0D142490381A00EEF3AD /* libMoltenVKSPIRVToMSLConverter.a */,
 				A972AD2921CEE6A80013AB25 /* Frameworks */,
 			);
 			sourceTree = "<group>";
@@ -308,63 +234,31 @@
 /* End PBXGroup section */
 
 /* Begin PBXHeadersBuildPhase section */
-		2FEA0AC52490305800EEF3AD /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				2FEA0AC62490305800EEF3AD /* SPIRVSupport.h in Headers */,
-				2FEA0AC72490305800EEF3AD /* GLSLConversion.h in Headers */,
-				2FEA0AC82490305800EEF3AD /* GLSLToSPIRVConverter.h in Headers */,
-				2FEA0AC92490305800EEF3AD /* MVKCommonEnvironment.h in Headers */,
-				2FEA0ACA2490305800EEF3AD /* MVKStrings.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 		2FEA0D002490381A00EEF3AD /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				2FEA0D012490381A00EEF3AD /* SPIRVReflection.h in Headers */,
+				A920A8A7251B75B70076851C /* GLSLConversion.h in Headers */,
 				2FEA0D022490381A00EEF3AD /* MVKStrings.h in Headers */,
 				2FEA0D032490381A00EEF3AD /* SPIRVSupport.h in Headers */,
 				2FEA0D042490381A00EEF3AD /* SPIRVConversion.h in Headers */,
+				A920A8AD251B75B80076851C /* GLSLToSPIRVConverter.h in Headers */,
 				2FEA0D052490381A00EEF3AD /* SPIRVToMSLConverter.h in Headers */,
 				2FEA0D062490381A00EEF3AD /* MVKCommonEnvironment.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		A93747291A9A8B2900F29B34 /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				A9C70F5F221B321700FBA31A /* SPIRVSupport.h in Headers */,
-				A90941A51C581F840094110D /* GLSLConversion.h in Headers */,
-				A90940A91C5808BB0094110D /* GLSLToSPIRVConverter.h in Headers */,
-				A9F042B01FB4D060009FCCB8 /* MVKCommonEnvironment.h in Headers */,
-				A98149661FB6A98A005F00B4 /* MVKStrings.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		A937476E1A9A98D000F29B34 /* Headers */ = {
-			isa = PBXHeadersBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				A9C70F60221B321700FBA31A /* SPIRVSupport.h in Headers */,
-				A90941A61C581F840094110D /* GLSLConversion.h in Headers */,
-				A90940AA1C5808BB0094110D /* GLSLToSPIRVConverter.h in Headers */,
-				A9F042B11FB4D060009FCCB8 /* MVKCommonEnvironment.h in Headers */,
-				A98149671FB6A98A005F00B4 /* MVKStrings.h in Headers */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 		A93903B91C57E9D700FE90DC /* Headers */ = {
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				450A4F61220CB180007203D7 /* SPIRVReflection.h in Headers */,
+				A920A8A6251B75B70076851C /* GLSLConversion.h in Headers */,
 				A98149681FB6A98A005F00B4 /* MVKStrings.h in Headers */,
 				A9C70F61221B321700FBA31A /* SPIRVSupport.h in Headers */,
 				A928C9191D0488DC00071B88 /* SPIRVConversion.h in Headers */,
+				A920A8AC251B75B70076851C /* GLSLToSPIRVConverter.h in Headers */,
 				A909408C1C58013E0094110D /* SPIRVToMSLConverter.h in Headers */,
 				A9F042B21FB4D060009FCCB8 /* MVKCommonEnvironment.h in Headers */,
 			);
@@ -375,9 +269,11 @@
 			buildActionMask = 2147483647;
 			files = (
 				450A4F62220CB180007203D7 /* SPIRVReflection.h in Headers */,
+				A920A8A8251B75B70076851C /* GLSLConversion.h in Headers */,
 				A98149691FB6A98A005F00B4 /* MVKStrings.h in Headers */,
 				A9C70F62221B321700FBA31A /* SPIRVSupport.h in Headers */,
 				A928C91A1D0488DC00071B88 /* SPIRVConversion.h in Headers */,
+				A920A8AE251B75B80076851C /* GLSLToSPIRVConverter.h in Headers */,
 				A909408D1C58013E0094110D /* SPIRVToMSLConverter.h in Headers */,
 				A9F042B31FB4D060009FCCB8 /* MVKCommonEnvironment.h in Headers */,
 			);
@@ -386,44 +282,22 @@
 /* End PBXHeadersBuildPhase section */
 
 /* Begin PBXNativeTarget section */
-		2FEA0AC42490305800EEF3AD /* MoltenVKGLSLToSPIRVConverter-tvOS */ = {
+		2FEA0CFF2490381A00EEF3AD /* MoltenVKShaderConverter-tvOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = 2FEA0AD42490305800EEF3AD /* Build configuration list for PBXNativeTarget "MoltenVKGLSLToSPIRVConverter-tvOS" */;
-			buildPhases = (
-				2FEA0AC52490305800EEF3AD /* Headers */,
-				2FEA0ACB2490305800EEF3AD /* Sources */,
-				2FEA0ACF2490305800EEF3AD /* Frameworks */,
-				2FEA0AD22490305800EEF3AD /* Create Dynamic Library */,
-				A9FC5F6B249D3959003CB086 /* Create Fat Libraries */,
-				2FEA0AD32490305800EEF3AD /* Create Framework */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = "MoltenVKGLSLToSPIRVConverter-tvOS";
-			productName = "MetalGLShaderConverter-iOS";
-			productReference = 2FEA0AD72490305800EEF3AD /* libMoltenVKGLSLToSPIRVConverter.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-		2FEA0CFF2490381A00EEF3AD /* MoltenVKSPIRVToMSLConverter-tvOS */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = 2FEA0D112490381A00EEF3AD /* Build configuration list for PBXNativeTarget "MoltenVKSPIRVToMSLConverter-tvOS" */;
+			buildConfigurationList = 2FEA0D112490381A00EEF3AD /* Build configuration list for PBXNativeTarget "MoltenVKShaderConverter-tvOS" */;
 			buildPhases = (
 				2FEA0D002490381A00EEF3AD /* Headers */,
 				2FEA0D072490381A00EEF3AD /* Sources */,
 				2FEA0D0C2490381A00EEF3AD /* Frameworks */,
-				2FEA0D0F2490381A00EEF3AD /* Create Dynamic Library */,
-				A9FC5F6C249D3987003CB086 /* Create Fat Libraries */,
-				2FEA0D102490381A00EEF3AD /* Create Framework */,
+				A93ED4E824F59E1100FEB018 /* Copy to Staging */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = "MoltenVKSPIRVToMSLConverter-tvOS";
+			name = "MoltenVKShaderConverter-tvOS";
 			productName = "MetalGLShaderConverter-iOS";
-			productReference = 2FEA0D142490381A00EEF3AD /* libMoltenVKSPIRVToMSLConverter.a */;
+			productReference = 2FEA0D142490381A00EEF3AD /* libMoltenVKShaderConverter.a */;
 			productType = "com.apple.product-type.library.static";
 		};
 		A9092A8C1A81717B00051823 /* MoltenVKShaderConverter */ = {
@@ -437,89 +311,46 @@
 			);
 			dependencies = (
 				A925B71D1C78DEBF006E7ECD /* PBXTargetDependency */,
-				A93749CF1A9AA7AF00F29B34 /* PBXTargetDependency */,
 			);
 			name = MoltenVKShaderConverter;
 			productName = MetalGLShaderConverterTool;
 			productReference = A964BD5F1C57EFBD00D930D8 /* MoltenVKShaderConverter */;
 			productType = "com.apple.product-type.tool";
 		};
-		A937472B1A9A8B2900F29B34 /* MoltenVKGLSLToSPIRVConverter-iOS */ = {
+		A93903B81C57E9D700FE90DC /* MoltenVKShaderConverter-iOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = A937473F1A9A8B2900F29B34 /* Build configuration list for PBXNativeTarget "MoltenVKGLSLToSPIRVConverter-iOS" */;
-			buildPhases = (
-				A93747291A9A8B2900F29B34 /* Headers */,
-				A93747271A9A8B2900F29B34 /* Sources */,
-				A972AD2821CEE6310013AB25 /* Frameworks */,
-				A9C70F49221B075700FBA31A /* Create Dynamic Library */,
-				A9303625249BDF6B00DE139C /* Create Fat Libraries */,
-				A941E2A7221AC9C300890C56 /* Create Framework */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = "MoltenVKGLSLToSPIRVConverter-iOS";
-			productName = "MetalGLShaderConverter-iOS";
-			productReference = A964BD611C57EFBD00D930D8 /* libMoltenVKGLSLToSPIRVConverter.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-		A93747701A9A98D000F29B34 /* MoltenVKGLSLToSPIRVConverter-macOS */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = A93747841A9A98D000F29B34 /* Build configuration list for PBXNativeTarget "MoltenVKGLSLToSPIRVConverter-macOS" */;
-			buildPhases = (
-				A937476E1A9A98D000F29B34 /* Headers */,
-				A937476C1A9A98D000F29B34 /* Sources */,
-				A972AD2C21CEE6C30013AB25 /* Frameworks */,
-				A9C70F4A221B076D00FBA31A /* Create Dynamic Library */,
-				A941E2A9221ACA2C00890C56 /* Create Framework */,
-			);
-			buildRules = (
-			);
-			dependencies = (
-			);
-			name = "MoltenVKGLSLToSPIRVConverter-macOS";
-			productName = "MetalGLShaderConverter-macOS";
-			productReference = A964BD601C57EFBD00D930D8 /* libMoltenVKGLSLToSPIRVConverter.a */;
-			productType = "com.apple.product-type.library.static";
-		};
-		A93903B81C57E9D700FE90DC /* MoltenVKSPIRVToMSLConverter-iOS */ = {
-			isa = PBXNativeTarget;
-			buildConfigurationList = A93903BC1C57E9D700FE90DC /* Build configuration list for PBXNativeTarget "MoltenVKSPIRVToMSLConverter-iOS" */;
+			buildConfigurationList = A93903BC1C57E9D700FE90DC /* Build configuration list for PBXNativeTarget "MoltenVKShaderConverter-iOS" */;
 			buildPhases = (
 				A93903B91C57E9D700FE90DC /* Headers */,
 				A93903BA1C57E9D700FE90DC /* Sources */,
 				A972AD2E21CEE6F50013AB25 /* Frameworks */,
-				A9C70F4B221B077C00FBA31A /* Create Dynamic Library */,
-				A9303626249BDFA000DE139C /* Create Fat Libraries */,
-				A941E2A8221AC9E800890C56 /* Create Framework */,
+				A93ED4E724F59E0900FEB018 /* Copy to Staging */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = "MoltenVKSPIRVToMSLConverter-iOS";
+			name = "MoltenVKShaderConverter-iOS";
 			productName = "MetalGLShaderConverter-iOS";
-			productReference = A93903BF1C57E9D700FE90DC /* libMoltenVKSPIRVToMSLConverter.a */;
+			productReference = A93903BF1C57E9D700FE90DC /* libMoltenVKShaderConverter.a */;
 			productType = "com.apple.product-type.library.static";
 		};
-		A93903C01C57E9ED00FE90DC /* MoltenVKSPIRVToMSLConverter-macOS */ = {
+		A93903C01C57E9ED00FE90DC /* MoltenVKShaderConverter-macOS */ = {
 			isa = PBXNativeTarget;
-			buildConfigurationList = A93903C41C57E9ED00FE90DC /* Build configuration list for PBXNativeTarget "MoltenVKSPIRVToMSLConverter-macOS" */;
+			buildConfigurationList = A93903C41C57E9ED00FE90DC /* Build configuration list for PBXNativeTarget "MoltenVKShaderConverter-macOS" */;
 			buildPhases = (
 				A93903C11C57E9ED00FE90DC /* Headers */,
 				A93903C21C57E9ED00FE90DC /* Sources */,
 				A972AD3321CEE7230013AB25 /* Frameworks */,
-				A9C70F4C221B078C00FBA31A /* Create Dynamic Library */,
-				A941E2AA221ACA4C00890C56 /* Create Framework */,
+				A93ED4E924F59E1800FEB018 /* Copy to Staging */,
 			);
 			buildRules = (
 			);
 			dependencies = (
 			);
-			name = "MoltenVKSPIRVToMSLConverter-macOS";
+			name = "MoltenVKShaderConverter-macOS";
 			productName = "MetalGLShaderConverter-macOS";
-			productReference = A93903C71C57E9ED00FE90DC /* libMoltenVKSPIRVToMSLConverter.a */;
+			productReference = A93903C71C57E9ED00FE90DC /* libMoltenVKShaderConverter.a */;
 			productType = "com.apple.product-type.library.static";
 		};
 /* End PBXNativeTarget section */
@@ -535,14 +366,6 @@
 						CreatedOnToolsVersion = 6.1.1;
 						DevelopmentTeam = VU3TCKU48B;
 					};
-					A937472B1A9A8B2900F29B34 = {
-						CreatedOnToolsVersion = 6.1.1;
-						DevelopmentTeam = VU3TCKU48B;
-					};
-					A93747701A9A98D000F29B34 = {
-						CreatedOnToolsVersion = 6.1.1;
-						DevelopmentTeam = VU3TCKU48B;
-					};
 					A93903B81C57E9D700FE90DC = {
 						DevelopmentTeam = VU3TCKU48B;
 					};
@@ -565,18 +388,15 @@
 			projectRoot = "";
 			targets = (
 				A9092A8C1A81717B00051823 /* MoltenVKShaderConverter */,
-				A937472B1A9A8B2900F29B34 /* MoltenVKGLSLToSPIRVConverter-iOS */,
-				2FEA0AC42490305800EEF3AD /* MoltenVKGLSLToSPIRVConverter-tvOS */,
-				A93747701A9A98D000F29B34 /* MoltenVKGLSLToSPIRVConverter-macOS */,
-				A93903B81C57E9D700FE90DC /* MoltenVKSPIRVToMSLConverter-iOS */,
-				2FEA0CFF2490381A00EEF3AD /* MoltenVKSPIRVToMSLConverter-tvOS */,
-				A93903C01C57E9ED00FE90DC /* MoltenVKSPIRVToMSLConverter-macOS */,
+				A93903B81C57E9D700FE90DC /* MoltenVKShaderConverter-iOS */,
+				2FEA0CFF2490381A00EEF3AD /* MoltenVKShaderConverter-tvOS */,
+				A93903C01C57E9ED00FE90DC /* MoltenVKShaderConverter-macOS */,
 			);
 		};
 /* End PBXProject section */
 
 /* Begin PBXShellScriptBuildPhase section */
-		2FEA0AD22490305800EEF3AD /* Create Dynamic Library */ = {
+		A93ED4E724F59E0900FEB018 /* Copy to Staging */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -585,16 +405,16 @@
 			);
 			inputPaths = (
 			);
-			name = "Create Dynamic Library";
+			name = "Copy to Staging";
 			outputFileListPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_dylib_tvos.sh\"\n";
+			shellScript = ". \"${SRCROOT}/../Scripts/copy_to_staging.sh\"\n";
 		};
-		2FEA0AD32490305800EEF3AD /* Create Framework */ = {
+		A93ED4E824F59E1100FEB018 /* Copy to Staging */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -603,16 +423,16 @@
 			);
 			inputPaths = (
 			);
-			name = "Create Framework";
+			name = "Copy to Staging";
 			outputFileListPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_framework_tvos.sh\"\n";
+			shellScript = ". \"${SRCROOT}/../Scripts/copy_to_staging.sh\"\n";
 		};
-		2FEA0D0F2490381A00EEF3AD /* Create Dynamic Library */ = {
+		A93ED4E924F59E1800FEB018 /* Copy to Staging */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
@@ -621,267 +441,25 @@
 			);
 			inputPaths = (
 			);
-			name = "Create Dynamic Library";
+			name = "Copy to Staging";
 			outputFileListPaths = (
 			);
 			outputPaths = (
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_dylib_tvos.sh\"\n";
-		};
-		2FEA0D102490381A00EEF3AD /* Create Framework */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Framework";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_framework_tvos.sh\"\n";
-		};
-		A9303625249BDF6B00DE139C /* Create Fat Libraries */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Fat Libraries";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_fat_libs_ios.sh\"\n";
-		};
-		A9303626249BDFA000DE139C /* Create Fat Libraries */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Fat Libraries";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_fat_libs_ios.sh\"\n";
-		};
-		A941E2A7221AC9C300890C56 /* Create Framework */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Framework";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_framework_ios.sh\"\n";
-		};
-		A941E2A8221AC9E800890C56 /* Create Framework */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Framework";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_framework_ios.sh\"\n";
-		};
-		A941E2A9221ACA2C00890C56 /* Create Framework */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Framework";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_framework_macos.sh\"\n";
-		};
-		A941E2AA221ACA4C00890C56 /* Create Framework */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Framework";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_framework_macos.sh\"\n";
-		};
-		A9C70F49221B075700FBA31A /* Create Dynamic Library */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Dynamic Library";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_dylib_ios.sh\"\n";
-		};
-		A9C70F4A221B076D00FBA31A /* Create Dynamic Library */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Dynamic Library";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_dylib_macos.sh\"\n";
-		};
-		A9C70F4B221B077C00FBA31A /* Create Dynamic Library */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Dynamic Library";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_dylib_ios.sh\"\n";
-		};
-		A9C70F4C221B078C00FBA31A /* Create Dynamic Library */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Dynamic Library";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_dylib_macos.sh\"\n";
-		};
-		A9FC5F6B249D3959003CB086 /* Create Fat Libraries */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Fat Libraries";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_fat_libs_tvos.sh\"\n";
-		};
-		A9FC5F6C249D3987003CB086 /* Create Fat Libraries */ = {
-			isa = PBXShellScriptBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-			);
-			inputFileListPaths = (
-			);
-			inputPaths = (
-			);
-			name = "Create Fat Libraries";
-			outputFileListPaths = (
-			);
-			outputPaths = (
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-			shellPath = /bin/sh;
-			shellScript = ". \"${SRCROOT}/../Scripts/create_fat_libs_tvos.sh\"\n";
+			shellScript = ". \"${SRCROOT}/../Scripts/copy_to_staging.sh\"\n";
 		};
 /* End PBXShellScriptBuildPhase section */
 
 /* Begin PBXSourcesBuildPhase section */
-		2FEA0ACB2490305800EEF3AD /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				2FEA0ACC2490305800EEF3AD /* GLSLConversion.mm in Sources */,
-				2FEA0ACD2490305800EEF3AD /* SPIRVSupport.cpp in Sources */,
-				2FEA0ACE2490305800EEF3AD /* GLSLToSPIRVConverter.cpp in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 		2FEA0D072490381A00EEF3AD /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				2FEA0D082490381A00EEF3AD /* FileSupport.mm in Sources */,
+				A920A8AA251B75B70076851C /* GLSLConversion.mm in Sources */,
+				A920A8A4251B75B70076851C /* GLSLToSPIRVConverter.cpp in Sources */,
 				2FEA0D092490381A00EEF3AD /* SPIRVToMSLConverter.cpp in Sources */,
 				2FEA0D0A2490381A00EEF3AD /* SPIRVSupport.cpp in Sources */,
 				2FEA0D0B2490381A00EEF3AD /* SPIRVConversion.mm in Sources */,
@@ -900,31 +478,13 @@
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
-		A93747271A9A8B2900F29B34 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				A90941A31C581F840094110D /* GLSLConversion.mm in Sources */,
-				A9C70F64221B321700FBA31A /* SPIRVSupport.cpp in Sources */,
-				A90940A71C5808BB0094110D /* GLSLToSPIRVConverter.cpp in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
-		A937476C1A9A98D000F29B34 /* Sources */ = {
-			isa = PBXSourcesBuildPhase;
-			buildActionMask = 2147483647;
-			files = (
-				A90941A41C581F840094110D /* GLSLConversion.mm in Sources */,
-				A9C70F65221B321700FBA31A /* SPIRVSupport.cpp in Sources */,
-				A90940A81C5808BB0094110D /* GLSLToSPIRVConverter.cpp in Sources */,
-			);
-			runOnlyForDeploymentPostprocessing = 0;
-		};
 		A93903BA1C57E9D700FE90DC /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
 				A95096BB2003D00300F10950 /* FileSupport.mm in Sources */,
+				A920A8A9251B75B70076851C /* GLSLConversion.mm in Sources */,
+				A920A8A3251B75B70076851C /* GLSLToSPIRVConverter.cpp in Sources */,
 				A909408A1C58013E0094110D /* SPIRVToMSLConverter.cpp in Sources */,
 				A9C70F66221B321700FBA31A /* SPIRVSupport.cpp in Sources */,
 				A928C91B1D0488DC00071B88 /* SPIRVConversion.mm in Sources */,
@@ -936,6 +496,8 @@
 			buildActionMask = 2147483647;
 			files = (
 				A95096BC2003D00300F10950 /* FileSupport.mm in Sources */,
+				A920A8AB251B75B70076851C /* GLSLConversion.mm in Sources */,
+				A920A8A5251B75B70076851C /* GLSLToSPIRVConverter.cpp in Sources */,
 				A909408B1C58013E0094110D /* SPIRVToMSLConverter.cpp in Sources */,
 				A9C70F67221B321700FBA31A /* SPIRVSupport.cpp in Sources */,
 				A928C91C1D0488DC00071B88 /* SPIRVConversion.mm in Sources */,
@@ -947,47 +509,12 @@
 /* Begin PBXTargetDependency section */
 		A925B71D1C78DEBF006E7ECD /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
-			target = A93903C01C57E9ED00FE90DC /* MoltenVKSPIRVToMSLConverter-macOS */;
+			target = A93903C01C57E9ED00FE90DC /* MoltenVKShaderConverter-macOS */;
 			targetProxy = A925B71C1C78DEBF006E7ECD /* PBXContainerItemProxy */;
 		};
-		A93749CF1A9AA7AF00F29B34 /* PBXTargetDependency */ = {
-			isa = PBXTargetDependency;
-			target = A93747701A9A98D000F29B34 /* MoltenVKGLSLToSPIRVConverter-macOS */;
-			targetProxy = A93749CE1A9AA7AF00F29B34 /* PBXContainerItemProxy */;
-		};
 /* End PBXTargetDependency section */
 
 /* Begin XCBuildConfiguration section */
-		2FEA0AD52490305800EEF3AD /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
-				CLANG_WARN_UNREACHABLE_CODE = NO;
-				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
-				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
-				GCC_WARN_UNUSED_PARAMETER = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/tvOS\"";
-				PRODUCT_NAME = MoltenVKGLSLToSPIRVConverter;
-				SDKROOT = appletvos;
-				TVOS_DEPLOYMENT_TARGET = 11.0;
-			};
-			name = Debug;
-		};
-		2FEA0AD62490305800EEF3AD /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
-				CLANG_WARN_UNREACHABLE_CODE = NO;
-				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
-				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
-				GCC_WARN_UNUSED_PARAMETER = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/tvOS\"";
-				PRODUCT_NAME = MoltenVKGLSLToSPIRVConverter;
-				SDKROOT = appletvos;
-				TVOS_DEPLOYMENT_TARGET = 11.0;
-			};
-			name = Release;
-		};
 		2FEA0D122490381A00EEF3AD /* Debug */ = {
 			isa = XCBuildConfiguration;
 			buildSettings = {
@@ -996,8 +523,6 @@
 					"SPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross",
 				);
 				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/tvOS\"";
-				PRODUCT_NAME = MoltenVKSPIRVToMSLConverter;
 				SDKROOT = appletvos;
 				TVOS_DEPLOYMENT_TARGET = 11.0;
 			};
@@ -1011,8 +536,6 @@
 					"SPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross",
 				);
 				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/tvOS\"";
-				PRODUCT_NAME = MoltenVKSPIRVToMSLConverter;
 				SDKROOT = appletvos;
 				TVOS_DEPLOYMENT_TARGET = 11.0;
 			};
@@ -1027,7 +550,6 @@
 					"-ObjC",
 					"-w",
 				);
-				PRODUCT_NAME = MoltenVKShaderConverter;
 				SDKROOT = macosx;
 			};
 			name = Debug;
@@ -1041,63 +563,6 @@
 					"-ObjC",
 					"-w",
 				);
-				PRODUCT_NAME = MoltenVKShaderConverter;
-				SDKROOT = macosx;
-			};
-			name = Release;
-		};
-		A93747401A9A8B2900F29B34 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
-				CLANG_WARN_UNREACHABLE_CODE = NO;
-				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
-				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
-				GCC_WARN_UNUSED_PARAMETER = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/iOS\"";
-				PRODUCT_NAME = MoltenVKGLSLToSPIRVConverter;
-				SDKROOT = iphoneos;
-			};
-			name = Debug;
-		};
-		A93747411A9A8B2900F29B34 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
-				CLANG_WARN_UNREACHABLE_CODE = NO;
-				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
-				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
-				GCC_WARN_UNUSED_PARAMETER = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/iOS\"";
-				PRODUCT_NAME = MoltenVKGLSLToSPIRVConverter;
-				SDKROOT = iphoneos;
-			};
-			name = Release;
-		};
-		A93747851A9A98D000F29B34 /* Debug */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
-				CLANG_WARN_UNREACHABLE_CODE = NO;
-				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
-				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
-				GCC_WARN_UNUSED_PARAMETER = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/macOS\"";
-				PRODUCT_NAME = MoltenVKGLSLToSPIRVConverter;
-				SDKROOT = macosx;
-			};
-			name = Debug;
-		};
-		A93747861A9A98D000F29B34 /* Release */ = {
-			isa = XCBuildConfiguration;
-			buildSettings = {
-				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
-				CLANG_WARN_UNREACHABLE_CODE = NO;
-				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = NO;
-				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
-				GCC_WARN_UNUSED_PARAMETER = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/macOS\"";
-				PRODUCT_NAME = MoltenVKGLSLToSPIRVConverter;
 				SDKROOT = macosx;
 			};
 			name = Release;
@@ -1110,8 +575,6 @@
 					"SPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross",
 				);
 				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/iOS\"";
-				PRODUCT_NAME = MoltenVKSPIRVToMSLConverter;
 				SDKROOT = iphoneos;
 			};
 			name = Debug;
@@ -1124,8 +587,6 @@
 					"SPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross",
 				);
 				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/iOS\"";
-				PRODUCT_NAME = MoltenVKSPIRVToMSLConverter;
 				SDKROOT = iphoneos;
 			};
 			name = Release;
@@ -1138,8 +599,6 @@
 					"SPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross",
 				);
 				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/macOS\"";
-				PRODUCT_NAME = MoltenVKSPIRVToMSLConverter;
 				SDKROOT = macosx;
 			};
 			name = Debug;
@@ -1152,8 +611,6 @@
 					"SPIRV_CROSS_NAMESPACE_OVERRIDE=MVK_spirv_cross",
 				);
 				GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO;
-				LIBRARY_SEARCH_PATHS = "\"$(SRCROOT)/../External/build/Latest/macOS\"";
-				PRODUCT_NAME = MoltenVKSPIRVToMSLConverter;
 				SDKROOT = macosx;
 			};
 			name = Release;
@@ -1177,10 +634,8 @@
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 				CLANG_WARN_UNGUARDED_AVAILABILITY = NO;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = NO;
 				ENABLE_STRICT_OBJC_MSGSEND = YES;
@@ -1191,15 +646,14 @@
 				GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1";
 				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
 				GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
 				GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
 				GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
 				GCC_WARN_UNDECLARED_SELECTOR = YES;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = NO;
 				HEADER_SEARCH_PATHS = (
 					"$(inherited)",
 					"\"$(SRCROOT)\"",
@@ -1210,6 +664,7 @@
 				MACH_O_TYPE = staticlib;
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
 				ONLY_ACTIVE_ARCH = YES;
+				PRODUCT_NAME = MoltenVKShaderConverter;
 				SKIP_INSTALL = YES;
 			};
 			name = Debug;
@@ -1233,10 +688,8 @@
 				CLANG_WARN_INT_CONVERSION = YES;
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
-				CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 				CLANG_WARN_UNGUARDED_AVAILABILITY = NO;
-				CLANG_WARN_UNREACHABLE_CODE = YES;
 				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
 				COPY_PHASE_STRIP = YES;
 				ENABLE_NS_ASSERTIONS = NO;
@@ -1247,15 +700,14 @@
 				GCC_OPTIMIZATION_LEVEL = fast;
 				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
 				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
-				GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
 				GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_CHECK_SWITCH_STATEMENTS = NO;
 				GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES;
 				GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES;
 				GCC_WARN_UNDECLARED_SELECTOR = YES;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
-				GCC_WARN_UNUSED_VARIABLE = NO;
 				HEADER_SEARCH_PATHS = (
 					"$(inherited)",
 					"\"$(SRCROOT)\"",
@@ -1265,6 +717,7 @@
 				IPHONEOS_DEPLOYMENT_TARGET = 9.0;
 				MACH_O_TYPE = staticlib;
 				MACOSX_DEPLOYMENT_TARGET = 10.11;
+				PRODUCT_NAME = MoltenVKShaderConverter;
 				SKIP_INSTALL = YES;
 				VALIDATE_PRODUCT = YES;
 			};
@@ -1273,16 +726,7 @@
 /* End XCBuildConfiguration section */
 
 /* Begin XCConfigurationList section */
-		2FEA0AD42490305800EEF3AD /* Build configuration list for PBXNativeTarget "MoltenVKGLSLToSPIRVConverter-tvOS" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				2FEA0AD52490305800EEF3AD /* Debug */,
-				2FEA0AD62490305800EEF3AD /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		2FEA0D112490381A00EEF3AD /* Build configuration list for PBXNativeTarget "MoltenVKSPIRVToMSLConverter-tvOS" */ = {
+		2FEA0D112490381A00EEF3AD /* Build configuration list for PBXNativeTarget "MoltenVKShaderConverter-tvOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				2FEA0D122490381A00EEF3AD /* Debug */,
@@ -1300,25 +744,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		A937473F1A9A8B2900F29B34 /* Build configuration list for PBXNativeTarget "MoltenVKGLSLToSPIRVConverter-iOS" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				A93747401A9A8B2900F29B34 /* Debug */,
-				A93747411A9A8B2900F29B34 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		A93747841A9A98D000F29B34 /* Build configuration list for PBXNativeTarget "MoltenVKGLSLToSPIRVConverter-macOS" */ = {
-			isa = XCConfigurationList;
-			buildConfigurations = (
-				A93747851A9A98D000F29B34 /* Debug */,
-				A93747861A9A98D000F29B34 /* Release */,
-			);
-			defaultConfigurationIsVisible = 0;
-			defaultConfigurationName = Release;
-		};
-		A93903BC1C57E9D700FE90DC /* Build configuration list for PBXNativeTarget "MoltenVKSPIRVToMSLConverter-iOS" */ = {
+		A93903BC1C57E9D700FE90DC /* Build configuration list for PBXNativeTarget "MoltenVKShaderConverter-iOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				A93903BD1C57E9D700FE90DC /* Debug */,
@@ -1327,7 +753,7 @@
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 		};
-		A93903C41C57E9ED00FE90DC /* Build configuration list for PBXNativeTarget "MoltenVKSPIRVToMSLConverter-macOS" */ = {
+		A93903C41C57E9ED00FE90DC /* Build configuration list for PBXNativeTarget "MoltenVKShaderConverter-macOS" */ = {
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				A93903C51C57E9ED00FE90DC /* Debug */,
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme
deleted file mode 100644
index 0ec7c34..0000000
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-iOS.xcscheme
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   LastUpgradeVersion = "1170"
-   version = "2.0">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "A937472B1A9A8B2900F29B34"
-               BuildableName = "libMoltenVKGLSLToSPIRVConverter.a"
-               BlueprintName = "MoltenVKGLSLToSPIRVConverter-iOS"
-               ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
-      <Testables>
-      </Testables>
-   </TestAction>
-   <LaunchAction
-      buildConfiguration = "Release"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      disableMainThreadChecker = "YES"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      ignoresPersistentStateOnLaunch = "NO"
-      debugDocumentVersioning = "YES"
-      debugXPCServices = "NO"
-      debugServiceExtension = "internal"
-      enableGPUFrameCaptureMode = "3"
-      enableGPUValidationMode = "1"
-      allowLocationSimulation = "NO"
-      queueDebuggingEnabled = "No">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A937472B1A9A8B2900F29B34"
-            BuildableName = "libMoltenVKGLSLToSPIRVConverter.a"
-            BlueprintName = "MoltenVKGLSLToSPIRVConverter-iOS"
-            ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-   </LaunchAction>
-   <ProfileAction
-      buildConfiguration = "Release"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      debugDocumentVersioning = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A937472B1A9A8B2900F29B34"
-            BuildableName = "libMoltenVKGLSLToSPIRVConverter.a"
-            BlueprintName = "MoltenVKGLSLToSPIRVConverter-iOS"
-            ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-macOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-macOS.xcscheme
deleted file mode 100644
index b53d82d..0000000
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-macOS.xcscheme
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   LastUpgradeVersion = "1170"
-   version = "2.0">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "A93747701A9A98D000F29B34"
-               BuildableName = "libMoltenVKGLSLToSPIRVConverter.a"
-               BlueprintName = "MoltenVKGLSLToSPIRVConverter-macOS"
-               ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
-      <Testables>
-      </Testables>
-   </TestAction>
-   <LaunchAction
-      buildConfiguration = "Release"
-      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 = "3"
-      enableGPUValidationMode = "1"
-      allowLocationSimulation = "NO"
-      queueDebuggingEnabled = "No">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A93747701A9A98D000F29B34"
-            BuildableName = "libMoltenVKGLSLToSPIRVConverter.a"
-            BlueprintName = "MoltenVKGLSLToSPIRVConverter-macOS"
-            ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-   </LaunchAction>
-   <ProfileAction
-      buildConfiguration = "Release"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      debugDocumentVersioning = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A93747701A9A98D000F29B34"
-            BuildableName = "libMoltenVKGLSLToSPIRVConverter.a"
-            BlueprintName = "MoltenVKGLSLToSPIRVConverter-macOS"
-            ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-tvOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-tvOS.xcscheme
deleted file mode 100644
index b2f6ebc..0000000
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKGLSLToSPIRVConverter-tvOS.xcscheme
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Scheme
-   LastUpgradeVersion = "1170"
-   version = "1.3">
-   <BuildAction
-      parallelizeBuildables = "YES"
-      buildImplicitDependencies = "YES">
-      <BuildActionEntries>
-         <BuildActionEntry
-            buildForTesting = "YES"
-            buildForRunning = "YES"
-            buildForProfiling = "YES"
-            buildForArchiving = "YES"
-            buildForAnalyzing = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "2FEA0AC42490305800EEF3AD"
-               BuildableName = "libMoltenVKGLSLToSPIRVConverter.a"
-               BlueprintName = "MoltenVKGLSLToSPIRVConverter-tvOS"
-               ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
-            </BuildableReference>
-         </BuildActionEntry>
-      </BuildActionEntries>
-   </BuildAction>
-   <TestAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
-      <Testables>
-      </Testables>
-   </TestAction>
-   <LaunchAction
-      buildConfiguration = "Debug"
-      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
-      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      launchStyle = "0"
-      useCustomWorkingDirectory = "NO"
-      ignoresPersistentStateOnLaunch = "NO"
-      debugDocumentVersioning = "YES"
-      debugServiceExtension = "internal"
-      allowLocationSimulation = "YES">
-   </LaunchAction>
-   <ProfileAction
-      buildConfiguration = "Release"
-      shouldUseLaunchSchemeArgsEnv = "YES"
-      savedToolIdentifier = ""
-      useCustomWorkingDirectory = "NO"
-      debugDocumentVersioning = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "2FEA0AC42490305800EEF3AD"
-            BuildableName = "libMoltenVKGLSLToSPIRVConverter.a"
-            BlueprintName = "MoltenVKGLSLToSPIRVConverter-tvOS"
-            ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
-   </ProfileAction>
-   <AnalyzeAction
-      buildConfiguration = "Debug">
-   </AnalyzeAction>
-   <ArchiveAction
-      buildConfiguration = "Release"
-      revealArchiveInOrganizer = "YES">
-   </ArchiveAction>
-</Scheme>
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter-iOS.xcscheme
similarity index 87%
rename from MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme
rename to MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter-iOS.xcscheme
index 0b5a9f4..075d0da 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-iOS.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter-iOS.xcscheme
@@ -15,8 +15,8 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "A93903B81C57E9D700FE90DC"
-               BuildableName = "libMoltenVKSPIRVToMSLConverter.a"
-               BlueprintName = "MoltenVKSPIRVToMSLConverter-iOS"
+               BuildableName = "libMoltenVKShaderConverter.a"
+               BlueprintName = "MoltenVKShaderConverter-iOS"
                ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
@@ -49,8 +49,8 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "A93903B81C57E9D700FE90DC"
-            BuildableName = "libMoltenVKSPIRVToMSLConverter.a"
-            BlueprintName = "MoltenVKSPIRVToMSLConverter-iOS"
+            BuildableName = "libMoltenVKShaderConverter.a"
+            BlueprintName = "MoltenVKShaderConverter-iOS"
             ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -65,8 +65,8 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "A93903B81C57E9D700FE90DC"
-            BuildableName = "libMoltenVKSPIRVToMSLConverter.a"
-            BlueprintName = "MoltenVKSPIRVToMSLConverter-iOS"
+            BuildableName = "libMoltenVKShaderConverter.a"
+            BlueprintName = "MoltenVKShaderConverter-iOS"
             ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-macOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter-macOS.xcscheme
similarity index 87%
rename from MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-macOS.xcscheme
rename to MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter-macOS.xcscheme
index d58a425..662ab6a 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-macOS.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter-macOS.xcscheme
@@ -15,8 +15,8 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "A93903C01C57E9ED00FE90DC"
-               BuildableName = "libMoltenVKSPIRVToMSLConverter.a"
-               BlueprintName = "MoltenVKSPIRVToMSLConverter-macOS"
+               BuildableName = "libMoltenVKShaderConverter.a"
+               BlueprintName = "MoltenVKShaderConverter-macOS"
                ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
@@ -49,8 +49,8 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "A93903C01C57E9ED00FE90DC"
-            BuildableName = "libMoltenVKSPIRVToMSLConverter.a"
-            BlueprintName = "MoltenVKSPIRVToMSLConverter-macOS"
+            BuildableName = "libMoltenVKShaderConverter.a"
+            BlueprintName = "MoltenVKShaderConverter-macOS"
             ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
@@ -65,8 +65,8 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "A93903C01C57E9ED00FE90DC"
-            BuildableName = "libMoltenVKSPIRVToMSLConverter.a"
-            BlueprintName = "MoltenVKSPIRVToMSLConverter-macOS"
+            BuildableName = "libMoltenVKShaderConverter.a"
+            BlueprintName = "MoltenVKShaderConverter-macOS"
             ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-tvOS.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter-tvOS.xcscheme
similarity index 89%
rename from MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-tvOS.xcscheme
rename to MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter-tvOS.xcscheme
index 6f7462c..2a8d372 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKSPIRVToMSLConverter-tvOS.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter-tvOS.xcscheme
@@ -15,8 +15,8 @@
             <BuildableReference
                BuildableIdentifier = "primary"
                BlueprintIdentifier = "2FEA0CFF2490381A00EEF3AD"
-               BuildableName = "libMoltenVKSPIRVToMSLConverter.a"
-               BlueprintName = "MoltenVKSPIRVToMSLConverter-tvOS"
+               BuildableName = "libMoltenVKShaderConverter.a"
+               BlueprintName = "MoltenVKShaderConverter-tvOS"
                ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
@@ -51,8 +51,8 @@
          <BuildableReference
             BuildableIdentifier = "primary"
             BlueprintIdentifier = "2FEA0CFF2490381A00EEF3AD"
-            BuildableName = "libMoltenVKSPIRVToMSLConverter.a"
-            BlueprintName = "MoltenVKSPIRVToMSLConverter-tvOS"
+            BuildableName = "libMoltenVKShaderConverter.a"
+            BlueprintName = "MoltenVKShaderConverter-tvOS"
             ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
          </BuildableReference>
       </MacroExpansion>
diff --git a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter.xcscheme b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter.xcscheme
index cb3a6c8..dc03203 100644
--- a/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter.xcscheme
+++ b/MoltenVKShaderConverter/MoltenVKShaderConverter.xcodeproj/xcshareddata/xcschemes/MoltenVKShaderConverter.xcscheme
@@ -27,15 +27,6 @@
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES">
-      <MacroExpansion>
-         <BuildableReference
-            BuildableIdentifier = "primary"
-            BlueprintIdentifier = "A9092A8C1A81717B00051823"
-            BuildableName = "MoltenVKShaderConverter"
-            BlueprintName = "MoltenVKShaderConverter"
-            ReferencedContainer = "container:MoltenVKShaderConverter.xcodeproj">
-         </BuildableReference>
-      </MacroExpansion>
       <Testables>
       </Testables>
    </TestAction>
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.h b/MoltenVKShaderConverter/MoltenVKShaderConverter/FileSupport.h
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.h
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/FileSupport.h
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.mm b/MoltenVKShaderConverter/MoltenVKShaderConverter/FileSupport.mm
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/FileSupport.mm
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/FileSupport.mm
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.h b/MoltenVKShaderConverter/MoltenVKShaderConverter/GLSLConversion.h
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.h
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/GLSLConversion.h
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.mm b/MoltenVKShaderConverter/MoltenVKShaderConverter/GLSLConversion.mm
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLConversion.mm
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/GLSLConversion.mm
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.cpp b/MoltenVKShaderConverter/MoltenVKShaderConverter/GLSLToSPIRVConverter.cpp
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.cpp
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/GLSLToSPIRVConverter.cpp
diff --git a/MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h b/MoltenVKShaderConverter/MoltenVKShaderConverter/GLSLToSPIRVConverter.h
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/GLSLToSPIRVConverter.h
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.h b/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVConversion.h
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.h
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVConversion.h
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm b/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVConversion.mm
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVConversion.mm
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVConversion.mm
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVReflection.h b/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVReflection.h
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVReflection.h
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVReflection.h
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp b/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVToMSLConverter.cpp
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.cpp
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVToMSLConverter.cpp
diff --git a/MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h b/MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVToMSLConverter.h
similarity index 100%
rename from MoltenVKShaderConverter/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h
rename to MoltenVKShaderConverter/MoltenVKShaderConverter/SPIRVToMSLConverter.h
diff --git a/MoltenVKShaderConverter/include/MoltenVKGLSLToSPIRVConverter/GLSLConversion.h b/MoltenVKShaderConverter/include/MoltenVKGLSLToSPIRVConverter/GLSLConversion.h
deleted file mode 120000
index 12a69d1..0000000
--- a/MoltenVKShaderConverter/include/MoltenVKGLSLToSPIRVConverter/GLSLConversion.h
+++ /dev/null
@@ -1 +0,0 @@
-../../MoltenVKGLSLToSPIRVConverter/GLSLConversion.h
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/include/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h b/MoltenVKShaderConverter/include/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h
deleted file mode 120000
index 1fbe2d3..0000000
--- a/MoltenVKShaderConverter/include/MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h
+++ /dev/null
@@ -1 +0,0 @@
-../../MoltenVKGLSLToSPIRVConverter/GLSLToSPIRVConverter.h
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/include/MoltenVKSPIRVToMSLConverter/SPIRVConversion.h b/MoltenVKShaderConverter/include/MoltenVKSPIRVToMSLConverter/SPIRVConversion.h
deleted file mode 120000
index b0ffadc..0000000
--- a/MoltenVKShaderConverter/include/MoltenVKSPIRVToMSLConverter/SPIRVConversion.h
+++ /dev/null
@@ -1 +0,0 @@
-../../MoltenVKSPIRVToMSLConverter/SPIRVConversion.h
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/include/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h b/MoltenVKShaderConverter/include/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h
deleted file mode 120000
index b9a5def..0000000
--- a/MoltenVKShaderConverter/include/MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h
+++ /dev/null
@@ -1 +0,0 @@
-../../MoltenVKSPIRVToMSLConverter/SPIRVToMSLConverter.h
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/include/MoltenVKShaderConverter/GLSLConversion.h b/MoltenVKShaderConverter/include/MoltenVKShaderConverter/GLSLConversion.h
new file mode 120000
index 0000000..f4c5096
--- /dev/null
+++ b/MoltenVKShaderConverter/include/MoltenVKShaderConverter/GLSLConversion.h
@@ -0,0 +1 @@
+../../MoltenVKShaderConverter/GLSLConversion.h
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/include/MoltenVKShaderConverter/GLSLToSPIRVConverter.h b/MoltenVKShaderConverter/include/MoltenVKShaderConverter/GLSLToSPIRVConverter.h
new file mode 120000
index 0000000..d12b2a6
--- /dev/null
+++ b/MoltenVKShaderConverter/include/MoltenVKShaderConverter/GLSLToSPIRVConverter.h
@@ -0,0 +1 @@
+../../MoltenVKShaderConverter/GLSLToSPIRVConverter.h
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/include/MoltenVKShaderConverter/SPIRVConversion.h b/MoltenVKShaderConverter/include/MoltenVKShaderConverter/SPIRVConversion.h
new file mode 120000
index 0000000..4bbf302
--- /dev/null
+++ b/MoltenVKShaderConverter/include/MoltenVKShaderConverter/SPIRVConversion.h
@@ -0,0 +1 @@
+../../MoltenVKShaderConverter/SPIRVConversion.h
\ No newline at end of file
diff --git a/MoltenVKShaderConverter/include/MoltenVKShaderConverter/SPIRVToMSLConverter.h b/MoltenVKShaderConverter/include/MoltenVKShaderConverter/SPIRVToMSLConverter.h
new file mode 120000
index 0000000..e4a3e40
--- /dev/null
+++ b/MoltenVKShaderConverter/include/MoltenVKShaderConverter/SPIRVToMSLConverter.h
@@ -0,0 +1 @@
+../../MoltenVKShaderConverter/SPIRVToMSLConverter.h
\ No newline at end of file
diff --git a/README.md b/README.md
index 0591f77..a546e3c 100644
--- a/README.md
+++ b/README.md
@@ -80,11 +80,10 @@
 
 - **MoltenVKShaderConverter** converts *SPIR-V* shader code to *Metal Shading Language (MSL)*
   shader code, and converts *GLSL* shader source code to *SPIR-V* shader code and/or
-  *Metal Shading Language (MSL)* shader code. The *SPIR-V* portion of the converter is also 
-  embedded in the **MoltenVK** runtime to automatically convert *SPIR-V* shaders to their *MSL* 
-  equivalents. In addition, both the *SPIR-V* and *GLSL* converters are packaged into a 
-  stand-alone command-line `MoltenVKShaderConverter` *macOS* tool for converting shaders 
-  at development time from the command line.
+  *Metal Shading Language (MSL)* shader code. The converter is embedded in the **MoltenVK** 
+  runtime to automatically convert *SPIR-V* shaders to their *MSL* equivalents. In addition, 
+  both the *SPIR-V* and *GLSL* converters are packaged into a stand-alone command-line 
+  `MoltenVKShaderConverter` *macOS* tool for converting shaders at development time from the command line.
 
 
 
@@ -117,14 +116,23 @@
 When running the `fetchDependencies` script, you must specify one or more platforms 
 for which to build the external libraries. The platform choices include: 
 
-	--all --macos --ios --iosfat --tvos --tvosfat
+	--all 
+	--macos 
+	--ios 
+	--iossim 
+	--tvos 
+	--tvossim
 
-You can specify multiple of these selections. The `--iosfat` and `--tvosfat` selection builds one 
-binary for each external library, with each binary including code for both *iOS* and *iOS Simulator* 
-platforms, or  *tvOS* and *tvOS Simulator* platforms, respectively. The `--all` selection is the same 
-as selecting `--macos --iosfat --tvosfat` and results in three binaries for each external library: 
-a *macOS* binary, a *fat iOS* binary, and a *fat tvOS* binary. The more selections you include,
-the longer the build time.
+You can specify multiple of these selections. The result is a single `XCFramework` 
+for each external dependency library, with each `XCFramework` containing binaries for 
+each of the requested platforms. 
+
+The `--all` selection is the same as entering all of the other platform choices,
+and will result in a single `XCFramework` for each external dependency library, 
+with each `XCFramework` containing binaries for all supported platforms and simulators.
+
+Running `fetchDependencies` repeatedly with different platforms will accumulate 
+targets in the `XCFramework`.
 
 For more information about the external open-source libraries used by **MoltenVK**,
 see the [`ExternalRevisions/README.md`](ExternalRevisions/README.md) document.
@@ -196,29 +204,28 @@
 	make all
 	make macos
 	make ios
-	make iosfat
+	make iossim
 	make tvos
-	make tvosfat
+	make tvossim
 	
 	make all-debug
 	make macos-debug
 	make ios-debug
-	make iosfat-debug
+	make iossim-debug
 	make tvos-debug
-	make tvosfat-debug
+	make tvossim-debug
 	
 	make clean
 	make install
 
+- Running `make` repeatedly with different targets will accumulate binaries for these different targets.
+- The `all` target executes all platform targets.
 - The `all` target is the default target. Running `make` with no arguments is the same as running `make all`.
-- The `*fat*` targets build fat binaries containing both platform and simulator code.
 - The `*-debug` targets build the binaries using the **_Debug_** configuration.
-- The `all` target executes the `macos`, `iosfat`, and `tvosfat` targets.
-- The `all-debug` target executes the `macos-debug`, `iosfat-debug`, and `tvosfat-debug` targets.
-- The `install` target will copy the most recently built *macOS* `MoltenVK.framework` into 
-  the `/Library/Frameworks` folder of your computer. Since `/Library/Frameworks` is protected, 
+- The `install` target will copy the most recently built `MoltenVK.xcframework` into the 
+  `/Library/Frameworks` folder of your computer. Since `/Library/Frameworks` is protected, 
   you will generally need to run it as `sudo make install` and enter your password.
-  The `install` target just installs the   built framework, it does not first build the framework.
+  The `install` target just installs the built framework, it does not first build the framework.
   You will first need to at least run `make macos` first.
 
 The `make` targets all require that *Xcode* is installed on your system. 
diff --git a/Scripts/copy_ext_lib_to_staging.sh b/Scripts/copy_ext_lib_to_staging.sh
new file mode 100755
index 0000000..77ec865
--- /dev/null
+++ b/Scripts/copy_ext_lib_to_staging.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+export MVK_XCFWK_STAGING_DIR="${PROJECT_DIR}/External/build/Intermediates/XCFrameworkStaging/${CONFIGURATION}"
+. "${SRCROOT}/Scripts/copy_lib_to_staging.sh"
diff --git a/Scripts/copy_lib_to_staging.sh b/Scripts/copy_lib_to_staging.sh
new file mode 100755
index 0000000..0441cbe
--- /dev/null
+++ b/Scripts/copy_lib_to_staging.sh
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# Copy the static library file to its own directory within the XCFrameworkStaging directory.
+#
+# Requires the variable MVK_XCFWK_STAGING_DIR.
+#
+export MVK_PROD_FILENAME="lib${PRODUCT_NAME}.a"
+export MVK_BUILT_PROD_FILE="${BUILT_PRODUCTS_DIR}/${MVK_PROD_FILENAME}"
+
+staging_dir="${MVK_XCFWK_STAGING_DIR}/Platform${EFFECTIVE_PLATFORM_NAME}"
+mkdir -p "${staging_dir}"
+cp -a "${MVK_BUILT_PROD_FILE}" "${staging_dir}/${MVK_PROD_FILENAME}"
diff --git a/Scripts/copy_to_staging.sh b/Scripts/copy_to_staging.sh
new file mode 100755
index 0000000..17044f4
--- /dev/null
+++ b/Scripts/copy_to_staging.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+export MVK_XCFWK_STAGING_DIR="${BUILT_PRODUCTS_DIR}/../XCFrameworkStaging/${CONFIGURATION}"
+. "${SRCROOT}/../Scripts/copy_lib_to_staging.sh"
diff --git a/Scripts/create_dylib.sh b/Scripts/create_dylib.sh
index ca0e316..35ff8da 100755
--- a/Scripts/create_dylib.sh
+++ b/Scripts/create_dylib.sh
@@ -1,6 +1,12 @@
 #!/bin/bash
 
-set -e
+# Allow dylib building to be skipped based on bulid setting.
+# For example, skipping the build of a dylib for Simulator builds
+# because Xcode cannot currently handle creating a Simulator dylib
+# containing both x86_64 and arm64 (Apple Silicon) architectures.
+if [ "${MVK_SKIP_DYLIB}" == "YES" ]; then
+	exit 0
+fi
 
 export MVK_BUILT_PROD_DIR="${BUILT_PRODUCTS_DIR}"
 export MVK_DYLIB_NAME="lib${PRODUCT_NAME}.dylib"
diff --git a/Scripts/create_ext_lib_xcframeworks.sh b/Scripts/create_ext_lib_xcframeworks.sh
new file mode 100755
index 0000000..33cd977
--- /dev/null
+++ b/Scripts/create_ext_lib_xcframeworks.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+. "${PROJECT_DIR}/Scripts/create_xcframework_func.sh"
+
+export MVK_EXT_DIR="${PROJECT_DIR}/External"
+export MVK_XCFWK_STAGING_DIR="${MVK_EXT_DIR}/build/Intermediates/XCFrameworkStaging"
+export MVK_XCFWK_DEST_DIR="${MVK_EXT_DIR}/build/${CONFIGURATION}"
+
+# Assemble the headers for the external libraries
+abs_ext_dir=`cd "${MVK_EXT_DIR}"; pwd; cd - > /dev/null`
+hdr_dir="${MVK_XCFWK_STAGING_DIR}/Headers"
+rm -rf "${hdr_dir}"
+mkdir -p "${hdr_dir}"
+ln -sfn "${abs_ext_dir}/SPIRV-Cross" "${hdr_dir}/SPIRVCross"
+ln -sfn "${abs_ext_dir}/glslang/External/spirv-tools/include/spirv-tools" "${hdr_dir}/SPIRVTools"
+ln -sfn "${abs_ext_dir}/glslang" "${hdr_dir}/glslang"
+
+create_xcframework "SPIRVCross"
+create_xcframework "SPIRVTools"
+create_xcframework "glslang"
diff --git a/Scripts/create_fat_ext_libs.sh b/Scripts/create_fat_ext_libs.sh
deleted file mode 100755
index fb0a3ac..0000000
--- a/Scripts/create_fat_ext_libs.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-# Load functions
-. "${SRCROOT}/Scripts/create_fat_lib_func.sh"
-
-set -e
-
-export MVK_BUILT_OS_PROD_DIR="${BUILT_PRODUCTS_DIR}-${MVK_OS_PROD_EXTN}"
-export MVK_BUILT_SIM_PROD_DIR="${BUILT_PRODUCTS_DIR}-${MVK_SIM_PROD_EXTN}"
-export MVK_BUILT_FAT_PROD_DIR="${BUILT_PRODUCTS_DIR}-${MVK_OS}"
-
-create_fat_lib "libSPIRVCross.a"
-create_fat_lib "libSPIRVTools.a"
-create_fat_lib "libglslang.a"
-
diff --git a/Scripts/create_fat_lib_func.sh b/Scripts/create_fat_lib_func.sh
deleted file mode 100755
index 6d48b6f..0000000
--- a/Scripts/create_fat_lib_func.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/bash
-
-# If both platform and simulator lib files exist, create a fat file
-# from them both, otherwise if only one exists, copy it to the fat file.
-#
-# Takes one parameter:
-#   1 - filename
-#
-# Requires 3 build settings:
-#   MVK_BUILT_OS_PROD_DIR  - location to find OS input file
-#   MVK_BUILT_SIM_PROD_DIR - location to find simulator input file
-#   MVK_BUILT_FAT_PROD_DIR - location to put fat output file
-function create_fat_lib() {
-	FILE_NAME=${1}
-	BUILT_OS_PROD_FILE="${MVK_BUILT_OS_PROD_DIR}/${FILE_NAME}"
-	BUILT_SIM_PROD_FILE="${MVK_BUILT_SIM_PROD_DIR}/${FILE_NAME}"
-	BUILT_FAT_PROD_FILE="${MVK_BUILT_FAT_PROD_DIR}/${FILE_NAME}"
-
-	if [ ! -e "${MVK_BUILT_FAT_PROD_DIR}" ]; then
-		mkdir -p "${MVK_BUILT_FAT_PROD_DIR}"
-	fi
-	rm -rf "${BUILT_FAT_PROD_FILE}"
-
-	if test -e "${BUILT_OS_PROD_FILE}"; then
-		if test -e "${BUILT_SIM_PROD_FILE}"; then
-			lipo \
-			-create \
-			-output "${BUILT_FAT_PROD_FILE}" \
-			"${BUILT_OS_PROD_FILE}" \
-			"${BUILT_SIM_PROD_FILE}"
-		else
-			cp -a "${BUILT_OS_PROD_FILE}" "${BUILT_FAT_PROD_FILE}"
-		fi
-	elif test -e "${BUILT_SIM_PROD_FILE}"; then
-		cp -a "${BUILT_SIM_PROD_FILE}" "${BUILT_FAT_PROD_FILE}"
-	fi
-}
diff --git a/Scripts/create_fat_libs.sh b/Scripts/create_fat_libs.sh
deleted file mode 100755
index 4a2f922..0000000
--- a/Scripts/create_fat_libs.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash
-
-# Load functions
-. "${SRCROOT}/../Scripts/create_fat_lib_func.sh"
-
-set -e
-
-#Static library
-export MVK_BUILT_OS_PROD_DIR="${BUILT_PRODUCTS_DIR}/../${CONFIGURATION}-${MVK_OS_PROD_EXTN}"
-export MVK_BUILT_SIM_PROD_DIR="${BUILT_PRODUCTS_DIR}/../${CONFIGURATION}-${MVK_SIM_PROD_EXTN}"
-export MVK_BUILT_FAT_PROD_DIR="${BUILT_PRODUCTS_DIR}/../${CONFIGURATION}-${MVK_OS}"
-create_fat_lib "lib${PRODUCT_NAME}.a"
-
-# Dynamic library
-export MVK_BUILT_OS_PROD_DIR="${MVK_BUILT_OS_PROD_DIR}/dynamic"
-export MVK_BUILT_SIM_PROD_DIR="${MVK_BUILT_SIM_PROD_DIR}/dynamic"
-export MVK_BUILT_FAT_PROD_DIR="${MVK_BUILT_FAT_PROD_DIR}/dynamic"
-create_fat_lib "lib${PRODUCT_NAME}.dylib"
-
-# Dynamic library dSYM
-if [ "${CONFIGURATION}" == "Debug" ]; then
-	cp -a  "${MVK_BUILT_OS_PROD_DIR}/lib${PRODUCT_NAME}.dylib.dSYM" "${MVK_BUILT_FAT_PROD_DIR}"
-	export MVK_BUILT_OS_PROD_DIR="${MVK_BUILT_OS_PROD_DIR}/lib${PRODUCT_NAME}.dylib.dSYM/Contents/Resources/DWARF"
-	export MVK_BUILT_SIM_PROD_DIR="${MVK_BUILT_SIM_PROD_DIR}/lib${PRODUCT_NAME}.dylib.dSYM/Contents/Resources/DWARF"
-	export MVK_BUILT_FAT_PROD_DIR="${MVK_BUILT_FAT_PROD_DIR}/lib${PRODUCT_NAME}.dylib.dSYM/Contents/Resources/DWARF"
-	create_fat_lib "lib${PRODUCT_NAME}.dylib"
-fi
diff --git a/Scripts/create_fat_libs_ios.sh b/Scripts/create_fat_libs_ios.sh
deleted file mode 100755
index b5d3797..0000000
--- a/Scripts/create_fat_libs_ios.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_OS="iOS"
-export MVK_OS_PROD_EXTN="iphoneos"
-export MVK_SIM_PROD_EXTN="iphonesimulator"
-
-. "${SRCROOT}/../Scripts/create_fat_libs.sh"
-
diff --git a/Scripts/create_fat_libs_tvos.sh b/Scripts/create_fat_libs_tvos.sh
deleted file mode 100755
index 9003f0c..0000000
--- a/Scripts/create_fat_libs_tvos.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_OS="tvOS"
-export MVK_OS_PROD_EXTN="appletvos"
-export MVK_SIM_PROD_EXTN="appletvsimulator"
-
-. "${SRCROOT}/../Scripts/create_fat_libs.sh"
-
diff --git a/Scripts/create_framework.sh b/Scripts/create_framework.sh
deleted file mode 100755
index 37aaca4..0000000
--- a/Scripts/create_framework.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_TMPLT_PATH="${PROJECT_DIR}/../Templates/framework/${MVK_OS}"
-export MVK_BUILT_FRWK_PATH="${MVK_BUILT_PROD_DIR}/framework/${PRODUCT_NAME}.framework"
-export MVK_BUILT_FRWK_CONTENT_PATH="${MVK_BUILT_FRWK_PATH}/${MVK_FRWK_SUBPATH}"
-
-mkdir -p "${MVK_BUILT_PROD_DIR}/framework"
-
-rm -rf "${MVK_BUILT_FRWK_PATH}"
-cp -a  "${MVK_TMPLT_PATH}/Template.framework" "${MVK_BUILT_FRWK_PATH}"
-cp -a  "${MVK_BUILT_PROD_DIR}/lib${PRODUCT_NAME}.a" "${MVK_BUILT_FRWK_CONTENT_PATH}${PRODUCT_NAME}"
-cp -pRL "${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/Scripts/create_framework_ios.sh b/Scripts/create_framework_ios.sh
deleted file mode 100755
index c75be1f..0000000
--- a/Scripts/create_framework_ios.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_OS="iOS"
-export MVK_BUILT_PROD_DIR="${BUILT_PRODUCTS_DIR}/../${CONFIGURATION}-${MVK_OS}"
-export MVK_FRWK_SUBPATH=""
-
-. "${SRCROOT}/../Scripts/create_framework.sh"
diff --git a/Scripts/create_framework_macos.sh b/Scripts/create_framework_macos.sh
deleted file mode 100755
index d776044..0000000
--- a/Scripts/create_framework_macos.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_OS="macOS"
-export MVK_BUILT_PROD_DIR="${BUILT_PRODUCTS_DIR}"
-export MVK_FRWK_SUBPATH="Versions/Current/"
-
-. "${SRCROOT}/../Scripts/create_framework.sh"
-
-ln -sfn "${MVK_FRWK_SUBPATH}${PRODUCT_NAME}" "${MVK_BUILT_FRWK_PATH}/${PRODUCT_NAME}"
diff --git a/Scripts/create_framework_tvos.sh b/Scripts/create_framework_tvos.sh
deleted file mode 100755
index 7cfde03..0000000
--- a/Scripts/create_framework_tvos.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_OS="tvOS"
-export MVK_BUILT_PROD_DIR="${BUILT_PRODUCTS_DIR}/../${CONFIGURATION}-${MVK_OS}"
-export MVK_FRWK_SUBPATH=""
-
-. "${SRCROOT}/../Scripts/create_framework.sh"
diff --git a/Scripts/create_xcframework_func.sh b/Scripts/create_xcframework_func.sh
new file mode 100755
index 0000000..c7b20cf
--- /dev/null
+++ b/Scripts/create_xcframework_func.sh
@@ -0,0 +1,31 @@
+#!/bin/bash
+
+# Creates a universal XCFramework for a product from any libraries that can be found for the product.
+#
+# Takes one parameter:
+#   1 - product_name
+#
+# Requires the variables MVK_XCFWK_STAGING_DIR and MVK_XCFWK_DEST_DIR.
+#
+function create_xcframework() {
+	prod_name=${1}
+	xcfwk_path="${MVK_XCFWK_DEST_DIR}/${prod_name}.xcframework"
+	hdr_path="${MVK_XCFWK_STAGING_DIR}/Headers/${prod_name}"
+
+	xcfwk_cmd="xcodebuild -quiet -create-xcframework -output \"${xcfwk_path}\""
+
+	# For each platform directory in the staging directory, add the library to the
+	# XCFramework if it exists, and for each library, add headers if they exist.
+	for prod_staging_dir in "${MVK_XCFWK_STAGING_DIR}/${CONFIGURATION}"/*; do
+		prod_lib_path="${prod_staging_dir}/lib${prod_name}.a"
+		if [[ -e "${prod_lib_path}" ]]; then
+			xcfwk_cmd+=" -library \"${prod_lib_path}\""
+#			if [[ -e "${hdr_path}" ]]; then
+#				xcfwk_cmd+=" -headers \"${hdr_path}\""		# Headers currently break build due to Xcode 12 ProcessXCFramework bug: https://developer.apple.com/forums/thread/651043?answerId=628400022#628400022
+#			fi
+		fi
+	done
+
+	rm -rf "${xcfwk_path}"
+	eval "${xcfwk_cmd}"
+}
diff --git a/Scripts/package_all.sh b/Scripts/package_all.sh
index 2a6c0ef..e8b65c2 100755
--- a/Scripts/package_all.sh
+++ b/Scripts/package_all.sh
@@ -1,7 +1,8 @@
 #!/bin/bash
 
 . "${SRCROOT}/Scripts/package_moltenvk.sh"
-. "${SRCROOT}/Scripts/package_shader_converter.sh"
+. "${SRCROOT}/Scripts/package_moltenvk_xcframework.sh"
+. "${SRCROOT}/Scripts/package_shader_converter_xcframework.sh"
 . "${SRCROOT}/Scripts/package_docs.sh"
 . "${SRCROOT}/Scripts/package_update_latest.sh"
 
diff --git a/Scripts/package_ext_libs.sh b/Scripts/package_ext_libs.sh
deleted file mode 100755
index 8ec1a59..0000000
--- a/Scripts/package_ext_libs.sh
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_EXT_LIB_DST_PATH="${PROJECT_DIR}/External/build/"
-export MVK_EXT_LIB_DST_OS_PATH="${MVK_EXT_LIB_DST_PATH}/${CONFIGURATION}/${MVK_OS}"
-
-rm -rf "${MVK_EXT_LIB_DST_OS_PATH}"
-mkdir -p "${MVK_EXT_LIB_DST_OS_PATH}"
-
-cp -a "${MVK_BUILT_PROD_DIR}/"*.a "${MVK_EXT_LIB_DST_OS_PATH}"
diff --git a/Scripts/package_moltenvk.sh b/Scripts/package_moltenvk.sh
index 766865b..61f99b2 100755
--- a/Scripts/package_moltenvk.sh
+++ b/Scripts/package_moltenvk.sh
@@ -2,28 +2,39 @@
 
 set -e
 
+# Copy dylibs only if the source directory exists.
+# Takes two args: source build path OS suffix and destination path OS directory name
+function copy_dylib() {
+	src_dir="${BUILD_DIR}/${CONFIGURATION}${1}/dynamic"
+	dst_dir="${MVK_PKG_PROD_PATH}/dylib/${2}"
+
+	# If dylib file exists, copy it, any debug symbol file, and the Vulkan layer JSON file
+	src_file="${src_dir}/lib${MVK_PROD_NAME}.dylib"
+	if [[ -e "${src_file}" ]]; then
+		rm -rf "${dst_dir}"
+		mkdir -p "${dst_dir}"
+
+		cp -a "${src_file}" "${dst_dir}"
+
+		src_file+=".dSYM"
+		if [[ -e "${src_file}" ]]; then
+		   cp -a "${src_file}" "${dst_dir}"
+		fi
+
+		cp -a "${MVK_PROD_PROJ_PATH}/icd/${MVK_PROD_NAME}_icd.json" "${dst_dir}"
+
+	fi
+}
+
 export MVK_PROD_NAME="MoltenVK"
 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}"
 
-rm -rf "${MVK_PKG_PROD_PATH_OS}"
-
-mkdir -p "${MVK_PKG_PROD_PATH_OS}/static"
-cp -a "${MVK_BUILT_PROD_DIR}/lib${MVK_PROD_NAME}.a" "${MVK_PKG_PROD_PATH_OS}/static"
-
-mkdir -p "${MVK_PKG_PROD_PATH_OS}/dynamic"
-cp -a "${MVK_BUILT_PROD_DIR}/dynamic/lib${MVK_PROD_NAME}.dylib" "${MVK_PKG_PROD_PATH_OS}/dynamic"
-if test "$CONFIGURATION" = Debug; then
-   cp -a "${MVK_BUILT_PROD_DIR}/dynamic/lib${MVK_PROD_NAME}.dylib.dSYM" "${MVK_PKG_PROD_PATH_OS}/dynamic"
-fi
-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_DIR}/framework/${MVK_PROD_NAME}.framework" "${MVK_PKG_PROD_PATH_OS}/framework"
-
-# Remove the code signature
-rm -rf "${MVK_PKG_PROD_PATH_OS}/framework/${MVK_PROD_NAME}.framework/_CodeSignature"
+copy_dylib "" "macOS"
+copy_dylib "-iphoneos" "iOS"
+copy_dylib "-iphonesimulator" "iOS-simulator"
+copy_dylib "-appletvos" "tvOS"
+copy_dylib "-appletvsimulator" "tvOS-simulator"
 
 # Remove and replace header include folder
 rm -rf "${MVK_PKG_PROD_PATH}/include"
diff --git a/Scripts/package_moltenvk_xcframework.sh b/Scripts/package_moltenvk_xcframework.sh
new file mode 100755
index 0000000..adbf883
--- /dev/null
+++ b/Scripts/package_moltenvk_xcframework.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+set -e
+
+. "${PROJECT_DIR}/Scripts/create_xcframework_func.sh"
+
+export MVK_PROD_BASE_NAME="MoltenVK"
+export MVK_XCFWK_STAGING_DIR="${BUILD_DIR}/XCFrameworkStaging"
+export MVK_XCFWK_DEST_DIR="${PROJECT_DIR}/Package/${CONFIGURATION}/${MVK_PROD_BASE_NAME}"
+
+# Assemble the headers
+hdr_dir="${MVK_XCFWK_STAGING_DIR}/Headers"
+mkdir -p "${hdr_dir}"
+rm -rf "${hdr_dir}/${MVK_PROD_BASE_NAME}"
+cp -pRL "${PROJECT_DIR}/${MVK_PROD_BASE_NAME}/include/${MVK_PROD_BASE_NAME}" "${hdr_dir}"
+
+create_xcframework "MoltenVK"
diff --git a/Scripts/package_shader_converter.sh b/Scripts/package_shader_converter.sh
deleted file mode 100755
index 98568b6..0000000
--- a/Scripts/package_shader_converter.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_PROD_BASE_NAME="MoltenVKShaderConverter"
-export MVK_PKG_BASE_PATH="${PROJECT_DIR}/Package/${CONFIGURATION}/${MVK_PROD_BASE_NAME}"
-export MVK_PKG_INCLUDE_PATH="${MVK_PKG_BASE_PATH}/include"
-
-# Remove and replace header include folder
-rm -rf "${MVK_PKG_INCLUDE_PATH}"
-mkdir -p "${MVK_PKG_INCLUDE_PATH}"
-cp -pRL "${PROJECT_DIR}/${MVK_PROD_BASE_NAME}/include/" "${MVK_PKG_INCLUDE_PATH}"
-
-#-----------------------------------
-# MoltenVKSPIRVToMSLConverter
-export MVK_PROD_NAME="MoltenVKSPIRVToMSLConverter"
-
-. "${SRCROOT}/Scripts/package_shader_converter_lib.sh"
-
-#-----------------------------------
-# MoltenVKGLSLToSPIRVConverter
-export MVK_PROD_NAME="MoltenVKGLSLToSPIRVConverter"
-
-. "${SRCROOT}/Scripts/package_shader_converter_lib.sh"
diff --git a/Scripts/package_shader_converter_lib.sh b/Scripts/package_shader_converter_lib.sh
deleted file mode 100755
index 14cf732..0000000
--- a/Scripts/package_shader_converter_lib.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export MVK_PROD_PROJ_PATH="${PROJECT_DIR}/${MVK_PROD_BASE_NAME}/${MVK_PROD_NAME}"
-export MVK_PKG_PROD_PATH="${MVK_PKG_BASE_PATH}/${MVK_PROD_NAME}"
-export MVK_PKG_PROD_PATH_OS="${MVK_PKG_PROD_PATH}/${MVK_OS}"
-
-rm -rf "${MVK_PKG_PROD_PATH_OS}"
-
-mkdir -p "${MVK_PKG_PROD_PATH_OS}/static"
-cp -a "${MVK_BUILT_PROD_DIR}/lib${MVK_PROD_NAME}.a" "${MVK_PKG_PROD_PATH_OS}/static"
-
-mkdir -p "${MVK_PKG_PROD_PATH_OS}/dynamic"
-cp -a "${MVK_BUILT_PROD_DIR}/dynamic/lib${MVK_PROD_NAME}.dylib" "${MVK_PKG_PROD_PATH_OS}/dynamic"
-if test "$CONFIGURATION" = Debug; then
-    cp -a "${MVK_BUILT_PROD_DIR}/dynamic/lib${MVK_PROD_NAME}.dylib.dSYM" "${MVK_PKG_PROD_PATH_OS}/dynamic"
-fi
-
-mkdir -p "${MVK_PKG_PROD_PATH_OS}/framework"
-cp -a "${MVK_BUILT_PROD_DIR}/framework/${MVK_PROD_NAME}.framework" "${MVK_PKG_PROD_PATH_OS}/framework"
diff --git a/Scripts/package_shader_converter_tool.sh b/Scripts/package_shader_converter_tool.sh
index 43330d4..98cb659 100755
--- a/Scripts/package_shader_converter_tool.sh
+++ b/Scripts/package_shader_converter_tool.sh
@@ -4,6 +4,7 @@
 
 export MVK_PROD_NAME="MoltenVKShaderConverter"
 export MVK_PKG_PROD_PATH_OS="${PROJECT_DIR}/Package/${CONFIGURATION}/${MVK_PROD_NAME}/Tools"
+export MVK_BUILT_PROD_DIR="${BUILT_PRODUCTS_DIR}"
 
 rm -rf "${MVK_PKG_PROD_PATH_OS}"
 mkdir -p "${MVK_PKG_PROD_PATH_OS}"
diff --git a/Scripts/package_shader_converter_xcframework.sh b/Scripts/package_shader_converter_xcframework.sh
new file mode 100755
index 0000000..3425515
--- /dev/null
+++ b/Scripts/package_shader_converter_xcframework.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+set -e
+
+. "${PROJECT_DIR}/Scripts/create_xcframework_func.sh"
+
+export MVK_PROD_BASE_NAME="MoltenVKShaderConverter"
+export MVK_XCFWK_STAGING_DIR="${BUILD_DIR}/XCFrameworkStaging"
+export MVK_XCFWK_DEST_DIR="${PROJECT_DIR}/Package/${CONFIGURATION}/${MVK_PROD_BASE_NAME}"
+
+# Assemble the headers for the shader frameworks
+hdr_dir="${MVK_XCFWK_STAGING_DIR}/Headers"
+mkdir -p "${hdr_dir}"
+rm -rf "${hdr_dir}/MoltenVKShaderConverter"
+cp -pRL "${PROJECT_DIR}/${MVK_PROD_BASE_NAME}/include/MoltenVKShaderConverter" "${hdr_dir}"
+
+# Also copy headers to an include directory in the package.
+# This will not be needed once the XCFramework can be created with a Headers directory.
+mkdir -p "${MVK_XCFWK_DEST_DIR}"
+cp -pRL "${PROJECT_DIR}/${MVK_PROD_BASE_NAME}/include/" "${MVK_XCFWK_DEST_DIR}/include"
+
+create_xcframework "MoltenVKShaderConverter"
diff --git a/Templates/framework/iOS/Template.framework/Headers/README b/Templates/framework/iOS/Template.framework/Headers/README
deleted file mode 100644
index 26382bc..0000000
--- a/Templates/framework/iOS/Template.framework/Headers/README
+++ /dev/null
@@ -1 +0,0 @@
-Placeholder for empty git directory.
\ No newline at end of file
diff --git a/Templates/framework/macOS/Template.framework/Headers b/Templates/framework/macOS/Template.framework/Headers
deleted file mode 120000
index a177d2a..0000000
--- a/Templates/framework/macOS/Template.framework/Headers
+++ /dev/null
@@ -1 +0,0 @@
-Versions/Current/Headers
\ No newline at end of file
diff --git a/Templates/framework/macOS/Template.framework/Versions/A/Headers/README b/Templates/framework/macOS/Template.framework/Versions/A/Headers/README
deleted file mode 100644
index 26382bc..0000000
--- a/Templates/framework/macOS/Template.framework/Versions/A/Headers/README
+++ /dev/null
@@ -1 +0,0 @@
-Placeholder for empty git directory.
\ No newline at end of file
diff --git a/Templates/framework/macOS/Template.framework/Versions/Current b/Templates/framework/macOS/Template.framework/Versions/Current
deleted file mode 120000
index 8c7e5a6..0000000
--- a/Templates/framework/macOS/Template.framework/Versions/Current
+++ /dev/null
@@ -1 +0,0 @@
-A
\ No newline at end of file
diff --git a/Templates/framework/tvOS b/Templates/framework/tvOS
deleted file mode 120000
index d4676fd..0000000
--- a/Templates/framework/tvOS
+++ /dev/null
@@ -1 +0,0 @@
-iOS
\ No newline at end of file
diff --git a/fetchDependencies b/fetchDependencies
index d6602d5..28bd8d7 100755
--- a/fetchDependencies
+++ b/fetchDependencies
@@ -4,31 +4,29 @@
 #
 # fetchDependencies - Retrieves the correct versions of all dependencies
 #
-# macOS usage: ./fetchDependencies [--ios] [--iosfat] [--tvos] [--tvosfat] [--macos] [--all] [--none]
+# macOS usage: ./fetchDependencies [--macos] [--ios] [--iossim] [--tvos] [--tvossim] [--all] [--none]
 #                                  [-v] [--debug] [--build-spirv-tools]
 #                                  [--v-headers-root path] [--spirv-cross-root path] [--glslang-root path]
 #
-#      --ios
-#              Build the external libraries for the iOS platform.
-#
-#      --iosfat
-#              Build a single binary for each external library, each containing code
-#              for both iOS and iOS Simulator platforms.
-#
-#      --tvos
-#              Build the external libraries for the tvOS platform.
-#
-#      --tvosfat
-#              Build a single binary for each external library, each containing code
-#              for both tvOS and tvOS Simulator platforms.
-#
 #      --macos
 #              Build the external libraries for the macOS platform.
 #
+#      --ios
+#              Build the external libraries for the iOS platform.
+#
+#      --iossim
+#              Build the external libraries for the iOS Simulator platform.
+#
+#      --tvos
+#              Build the external libraries for the tvOS platform.
+#
+#      --tvossim
+#              Build the external libraries for the tvOS Simulator platform.
+#
 #      --all
-#              Equivalent to specifying [--iosfat --tvosfat --macos]. Results in thee
-#              binaries for each external library: one for the iOS and iOS Simulator platforms,
-#              one for the tvOS and tvOS Simulator platforms, and one for the macOS platform.
+#              Equivalent to specifying [--macos --ios --iossim --tvos --tvossim].
+#              Results in one XCFramework for each external library, each containing
+#              binaries for all supported platforms.
 #
 #      --none
 #              Don't build the external libraries for any platform.
@@ -94,8 +92,7 @@
          BLD_SPECIFIED="Y"
          shift 1
          ;;
-       --iosfat)
-         BLD_IOS="Y"
+       --iossim)
          BLD_IOS_SIM="Y"
          BLD_SPECIFIED="Y"
          shift 1
@@ -105,8 +102,7 @@
          BLD_SPECIFIED="Y"
          shift 1
          ;;
-       --tvosfat)
-         BLD_TVOS="Y"
+       --tvossim)
          BLD_TVOS_SIM="Y"
          BLD_SPECIFIED="Y"
          shift 1
@@ -363,7 +359,7 @@
 if [ "$BLD_SPECIFIED" = "" ]; then
 	echo "ERROR: You did not specify a platform to build."
 	echo "Include one or more of the following platform options:"
-	echo "    --ios --iosfat --tvos --tvosfat --macos --all"
+	echo "    --macos --ios --iossim --tvos --tvossim --all"
 	echo "See the instructions in the fetchDependencies script for more info."
 	exit 1
 fi
@@ -380,7 +376,7 @@
 	XC_PLTFM=${2}
 
 	XC_SCHEME="${EXT_DEPS}-${XC_OS}"
-	XC_LCL_DD_PATH="${XC_DD_PATH}/Intermediates/${XC_OS}"
+	XC_LCL_DD_PATH="${XC_DD_PATH}/Intermediates/${XC_PLTFM}"
 	XC_DEST="generic/platform=${XC_PLTFM}"
 
 	echo Building external libraries for ${XC_PLTFM}
@@ -402,29 +398,9 @@
 # 2 - platform
 function build() {
 	if [ "$XC_USE_BCKGND" != "" ]; then
-		build_impl ${1} ${2} &
+		build_impl "${1}" "${2}" &
 	else
-		build_impl ${1} ${2}
-	fi
-}
-
-# Build a fat library for the OS containing code for the OS and its Simulator
-# Builds serially to ensure both are built
-# 1 - OS
-function build_fat_impl() {
-	XC_OS=${1}
-
-	build_impl ${XC_OS} ${XC_OS}
-	build_impl ${XC_OS} "${XC_OS} Simulator"
-}
-
-# Select whether or not to run the build in parallel.
-# 1 - OS
-function build_fat() {
-	if [ "$XC_USE_BCKGND" != "" ]; then
-		build_fat_impl ${1} &
-	else
-		build_fat_impl ${1}
+		build_impl "${1}" "${2}"
 	fi
 }
 
@@ -448,19 +424,19 @@
 fi
 
 if [ "$BLD_IOS" != "" ]; then
-	if [ "$BLD_IOS_SIM" != "" ]; then
-		build_fat "iOS"
-	else
-		build "iOS" "iOS"
-	fi
+	build "iOS" "iOS"
+fi
+
+if [ "$BLD_IOS_SIM" != "" ]; then
+	build "iOS" "iOS Simulator"
 fi
 
 if [ "$BLD_TVOS" != "" ]; then
-	if [ "$BLD_TVOS_SIM" != "" ]; then
-		build_fat "tvOS"
-	else
-		build "tvOS" "tvOS"
-	fi
+	build "tvOS" "tvOS"
+fi
+
+if [ "$BLD_TVOS_SIM" != "" ]; then
+	build "tvOS" "tvOS Simulator"
 fi
 
 # Wait for any background process (if selected) to finish
@@ -468,9 +444,10 @@
 	wait
 fi
 
-# Update latest symlink and clean MoltenVK for rebuild
+# Build XCFrameworks, update latest symlink, and clean MoltenVK for rebuild
 PROJECT_DIR="."
 CONFIGURATION=${XC_CONFIG}
+. "./Scripts/create_ext_lib_xcframeworks.sh"
 . "./Scripts/package_ext_libs_finish.sh"
 
 echo ========== Finished at `date +"%r"` ==========