diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index 888c20a..9207568 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -297,6 +297,7 @@
   include/windows.applicationmodel.idl \
   include/windows.data.json.idl \
   include/windows.data.xml.dom.idl \
+  include/windows.devices.bluetooth.advertisement.idl \
   include/windows.devices.bluetooth.genericattributeprofile.idl \
   include/windows.devices.bluetooth.idl \
   include/windows.devices.bluetooth.rfcomm.idl \
@@ -327,13 +328,16 @@
   include/windows.management.deployment.idl \
   include/windows.media.capture.idl \
   include/windows.media.closedcaptioning.idl \
+  include/windows.media.core.idl \
   include/windows.media.devices.idl \
   include/windows.media.effects.idl \
   include/windows.media.faceanalysis.idl \
   include/windows.media.idl \
+  include/windows.media.mediaproperties.idl \
   include/windows.media.render.idl \
   include/windows.media.speechrecognition.idl \
   include/windows.media.speechsynthesis.idl \
+  include/windows.media.transcoding.idl \
   include/windows.networking.connectivity.idl \
   include/windows.networking.idl \
   include/windows.networking.sockets.idl \
@@ -365,6 +369,7 @@
   include/windows.ui.notifications.idl \
   include/windows.ui.viewmanagement.core.idl \
   include/windows.ui.viewmanagement.idl \
+  include/windows.ui.windowmanagement.idl \
   include/windows.ui.xaml.hosting.desktopwindowxamlsource.idl \
   include/windows.ui.xaml.idl \
   include/windows.ui.xaml.interop.idl \
diff --git a/mingw-w64-headers/include/dmusicf.h b/mingw-w64-headers/include/dmusicf.h
index 4e22b1b..624803a 100644
--- a/mingw-w64-headers/include/dmusicf.h
+++ b/mingw-w64-headers/include/dmusicf.h
@@ -429,7 +429,7 @@
 	MUSIC_TIME mtTime;
 	MUSIC_TIME mtDuration;
 	DWORD      dwPChannel;
-	short      nOffset; 
+	short      nOffset;
 	BYTE       bStatus;
 	BYTE       bByte1;
 	BYTE       bByte2;
@@ -489,7 +489,7 @@
 
 struct _DMUS_IO_STYLE {
 	DMUS_IO_TIMESIG timeSig;
-	double          dblTempo;   
+	double          dblTempo;
 };
 
 struct _DMUS_IO_VERSION {
@@ -503,6 +503,7 @@
 	BYTE            bGrooveTop;
 	WORD            wEmbellishment;
 	WORD            wNbrMeasures;
+        /* DX8 */
 	BYTE            bDestGrooveBottom;
 	BYTE            bDestGrooveTop;
 	DWORD           dwFlags;
@@ -516,6 +517,7 @@
 	BYTE            bPlayModeFlags;
 	BYTE            bInvertUpper;
 	BYTE            bInvertLower;
+	/* DX8 */
 	BYTE            bPad[3];
 	DWORD           dwFlags;
 };
@@ -527,8 +529,9 @@
 	BYTE  bSubChordLevel;
 	BYTE  bPriority;
 	BYTE  bRandomVariation;
+	/* DX8 */
 	WORD  wPad;
-	DWORD dwPChannel;
+	DWORD dwPChannel;       /* Replaces wLogicalPartID */
 };
 
 
@@ -600,6 +603,7 @@
 	MUSIC_TIME mtTime;
 	WORD       wMeasure;
 	BYTE       bBeat;
+        /* DX8 */
 	BYTE       bFlags;
 };
 
@@ -619,6 +623,7 @@
 	BYTE       bCommand;
 	BYTE       bGrooveLevel;
 	BYTE       bGrooveRange;
+        /* DX8 */
 	BYTE       bRepeatMode;
 };
 
@@ -673,6 +678,7 @@
 	BYTE  bVolume;
 	short nTranspose;
 	DWORD dwChannelPriority;
+        /* DX8 */
 	short nPitchBendRange;
 };
 
@@ -707,6 +713,7 @@
 	DWORD          dwLoopStart;
 	DWORD          dwLoopEnd;
 	DWORD          dwFlags;
+        /* DX9 */
 	WORD           wVolumeRange;
 	WORD           wPitchRange;
 };
diff --git a/mingw-w64-headers/include/windows.data.json.idl b/mingw-w64-headers/include/windows.data.json.idl
index c37c0a5..c38e592 100644
--- a/mingw-w64-headers/include/windows.data.json.idl
+++ b/mingw-w64-headers/include/windows.data.json.idl
@@ -132,7 +132,7 @@
         activatable(Windows.Foundation.UniversalApiContract, 1.0),
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
-        static(Windows.Data.Json.IJsonArrayStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        /* static(Windows.Data.Json.IJsonArrayStatics, Windows.Foundation.UniversalApiContract, 1.0), */
         threading(both)
     ]
     runtimeclass JsonArray
@@ -148,7 +148,7 @@
         activatable(Windows.Foundation.UniversalApiContract, 1.0),
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
-        static(Windows.Data.Json.IJsonObjectStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        /* static(Windows.Data.Json.IJsonObjectStatics, Windows.Foundation.UniversalApiContract, 1.0), */
         threading(both)
     ]
     runtimeclass JsonObject
@@ -165,7 +165,7 @@
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         static(Windows.Data.Json.IJsonValueStatics, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.Data.Json.IJsonValueStatics2, Windows.Foundation.UniversalApiContract, 1.0),
+        /* static(Windows.Data.Json.IJsonValueStatics2, Windows.Foundation.UniversalApiContract, 1.0), */
         threading(both)
     ]
     runtimeclass JsonValue
diff --git a/mingw-w64-headers/include/windows.devices.bluetooth.advertisement.idl b/mingw-w64-headers/include/windows.devices.bluetooth.advertisement.idl
new file mode 100644
index 0000000..a150ea9
--- /dev/null
+++ b/mingw-w64-headers/include/windows.devices.bluetooth.advertisement.idl
@@ -0,0 +1,522 @@
+/*
+ * Copyright 2025 Vibhav Pant
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+#ifndef DO_NO_IMPORTS
+import "inspectable.idl";
+import "asyncinfo.idl";
+import "eventtoken.idl";
+import "windowscontracts.idl";
+import "windows.foundation.idl";
+import "windows.storage.streams.idl";
+import "windows.devices.bluetooth.idl";
+#endif
+
+namespace Windows.Devices.Bluetooth {
+    typedef enum BluetoothAddressType BluetoothAddressType;
+    typedef enum BluetoothError BluetoothError;
+
+    runtimeclass BluetoothSignalStrengthFilter;
+}
+
+namespace Windows.Devices.Bluetooth.Advertisement {
+    typedef enum BluetoothLEAdvertisementFlags BluetoothLEAdvertisementFlags;
+    typedef enum BluetoothLEAdvertisementWatcherStatus BluetoothLEAdvertisementWatcherStatus;
+    typedef enum BluetoothLEScanningMode BluetoothLEScanningMode;
+    typedef enum BluetoothLEAdvertisementType BluetoothLEAdvertisementType;
+    typedef enum BluetoothLEAdvertisementPhyType BluetoothLEAdvertisementPhyType;
+
+    interface IBluetoothLEManufacturerData;
+    interface IBluetoothLEAdvertisementDataSection;
+    interface IBluetoothLEAdvertisementDataSectionFactory;
+    interface IBluetoothLEManufacturerData;
+    interface IBluetoothLEManufacturerDataFactory;
+    interface IBluetoothLEAdvertisementWatcher;
+    interface IBluetoothLEAdvertisementWatcher2;
+    interface IBluetoothLEAdvertisementWatcher3;
+    interface IBluetoothLEAdvertisementFilter;
+    interface IBluetoothLEAdvertisementReceivedEventArgs;
+    interface IBluetoothLEAdvertisementReceivedEventArgs2;
+    interface IBluetoothLEAdvertisementReceivedEventArgs3;
+    interface IBluetoothLEAdvertisementWatcherStoppedEventArgs;
+    interface IBluetoothLEAdvertisementBytePattern;
+    interface IBluetoothLEAdvertisementBytePatternFactory;
+    interface IBluetoothLEAdvertisementScanParameters;
+    interface IBluetoothLEAdvertisementScanParametersStatics;
+
+
+    runtimeclass BluetoothLEAdvertisement;
+    runtimeclass BluetoothLEManufacturerData;
+    runtimeclass BluetoothLEAdvertisementDataSection;
+    runtimeclass BluetoothLEManufacturerData;
+    runtimeclass BluetoothLEAdvertisementWatcher;
+    runtimeclass BluetoothLEAdvertisementFilter;
+    runtimeclass BluetoothLEAdvertisementReceivedEventArgs;
+    runtimeclass BluetoothLEAdvertisementWatcherStoppedEventArgs;
+    runtimeclass BluetoothLEAdvertisementBytePattern;
+    runtimeclass BluetoothLEAdvertisementScanParameters;
+
+    declare {
+        interface Windows.Foundation.IReference<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementFlags>;
+        interface Windows.Foundation.Collections.IVector<GUID>;
+        interface Windows.Foundation.Collections.IVector<Windows.Devices.Bluetooth.Advertisement.BluetoothLEManufacturerData *>;
+        interface Windows.Foundation.Collections.IVector<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementDataSection *>;
+        interface Windows.Foundation.Collections.IVector<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementBytePattern *>;
+        interface Windows.Foundation.Collections.IVectorView<GUID>;
+        interface Windows.Foundation.Collections.IVectorView<Windows.Devices.Bluetooth.Advertisement.BluetoothLEManufacturerData *>;
+        interface Windows.Foundation.Collections.IVectorView<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementDataSection *>;
+        interface Windows.Foundation.Collections.IVectorView<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementBytePattern *>;
+        interface Windows.Foundation.Collections.IIterable<GUID>;
+        interface Windows.Foundation.Collections.IIterable<Windows.Devices.Bluetooth.Advertisement.BluetoothLEManufacturerData *>;
+        interface Windows.Foundation.Collections.IIterable<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementDataSection *>;
+        interface Windows.Foundation.Collections.IIterable<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementBytePattern *>;
+        interface Windows.Foundation.Collections.IIterator<GUID>;
+        interface Windows.Foundation.Collections.IIterator<Windows.Devices.Bluetooth.Advertisement.BluetoothLEManufacturerData *>;
+        interface Windows.Foundation.Collections.IIterator<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementDataSection *>;
+        interface Windows.Foundation.Collections.IIterator<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementBytePattern *>;
+        interface Windows.Foundation.TypedEventHandler<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher *, Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementReceivedEventArgs *>;
+        interface Windows.Foundation.TypedEventHandler<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher *, Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcherStoppedEventArgs *>;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        flags
+    ]
+    enum BluetoothLEAdvertisementFlags
+    {
+        None = 0x00,
+        LimitedDiscoverableMode = 0x01,
+        GeneralDiscoverableMode = 0x02,
+        ClassicNotSupported = 0x04,
+        DualModeControllerCapable = 0x08,
+        DualModeHostCapable = 0x10,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+    ]
+    enum BluetoothLEAdvertisementPublisherStatus
+    {
+        Created = 0,
+        Waiting = 1,
+        Started = 2,
+        Stopping = 3,
+        Stopped = 4,
+        Aborted = 5,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+    ]
+    enum BluetoothLEAdvertisementType
+    {
+        ConnectableUndirected = 0,
+        ConnectableDirected = 1,
+        ScannableUndirected = 2,
+        NonConnectableUndirected = 3,
+        ScanResponse = 4,
+        [contract(Windows.Foundation.UniversalApiContract, 10.0)]
+        Extended = 5,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+    ]
+    enum BluetoothLEAdvertisementWatcherStatus
+    {
+        Created = 0,
+        Started = 1,
+        Stopping = 2,
+        Stopped = 3,
+        Aborted = 4,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+    ]
+    enum BluetoothLEScanningMode
+    {
+        Passive = 0,
+        Active = 1,
+        [contract(Windows.Foundation.UniversalApiContract, 10.0)]
+        None = 2,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 19.0),
+    ]
+    enum BluetoothLEAdvertisementPhyType
+    {
+        Unspecified = 0,
+        Uncoded1MPhy = 1,
+        Uncoded2MPhy = 2,
+        CodedPhy = 3,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisement),
+        uuid(066fb2b7-33d1-4e7d-8367-cf81d0f79653)
+    ]
+    interface IBluetoothLEAdvertisement : IInspectable
+    {
+        [propget] HRESULT Flags([out, retval] Windows.Foundation.IReference<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementFlags> **value);
+        [propput] HRESULT Flags([in] Windows.Foundation.IReference<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementFlags> *value);
+        [propget] HRESULT LocalName([out, retval] HSTRING *value);
+        [propput] HRESULT LocalName([in] HSTRING value);
+        [propget] HRESULT ServiceUuids([out, retval] Windows.Foundation.Collections.IVector<GUID> **value);
+        [propget] HRESULT ManufacturerData([out, retval] Windows.Foundation.Collections.IVector<Windows.Devices.Bluetooth.Advertisement.BluetoothLEManufacturerData *> **value);
+        [propget] HRESULT DataSections([out, retval] Windows.Foundation.Collections.IVector<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementDataSection *> **value);
+        HRESULT GetManufacturerDataByCompanyId([in] UINT16 id, [out, retval] Windows.Foundation.Collections.IVectorView<Windows.Devices.Bluetooth.Advertisement.BluetoothLEManufacturerData *> **value);
+        HRESULT GetSectionsByType([in] BYTE type, [out, retval] Windows.Foundation.Collections.IVectorView<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementDataSection *> **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass BluetoothLEAdvertisement
+    {
+        [default] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisement;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementDataSection),
+        uuid(d7213314-3a43-40f9-b6f0-92bfefc34ae3)
+    ]
+    interface IBluetoothLEAdvertisementDataSection : IInspectable
+    {
+        [propget] HRESULT DataType([out, retval] BYTE *value);
+        [propput] HRESULT DataType([in] BYTE value);
+        [propget] HRESULT Data([out, retval] Windows.Storage.Streams.IBuffer **value);
+        [propput] HRESULT Data([in] Windows.Storage.Streams.IBuffer *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementDataSection),
+        uuid(e7a40942-a845-4045-bf7e-3e9971db8a6b)
+    ]
+    interface IBluetoothLEAdvertisementDataSectionFactory : IInspectable
+    {
+        HRESULT Create([in] BYTE type, [in] Windows.Storage.Streams.IBuffer *data,
+                       [out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementDataSection **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementDataSectionFactory, Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass BluetoothLEAdvertisementDataSection
+    {
+        [default] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementDataSection;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEManufacturerData),
+        uuid(912dba18-6963-4533-b061-4694dafb34e5)
+    ]
+    interface IBluetoothLEManufacturerData : IInspectable
+    {
+        [propget] HRESULT CompanyId([out, retval] UINT16 *value);
+        [propput] HRESULT CompanyId([in] UINT16 value);
+        [propget] HRESULT Data([out, retval] Windows.Storage.Streams.IBuffer **value);
+        [propput] HRESULT Data([in] Windows.Storage.Streams.IBuffer *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEManufacturerData),
+        uuid(c09b39f8-319a-441e-8de5-66a81e877a6c)
+    ]
+    interface IBluetoothLEManufacturerDataFactory : IInspectable
+    {
+        HRESULT Create([in] UINT16 id, [in] Windows.Storage.Streams.IBuffer *data,
+                       [out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEManufacturerData **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Devices.Bluetooth.Advertisement.IBluetoothLEManufacturerDataFactory, Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass BluetoothLEManufacturerData
+    {
+        [default] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEManufacturerData;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher),
+        uuid(a6ac336f-f3d3-4297-8d6c-c81ea6623f40)
+    ]
+    interface IBluetoothLEAdvertisementWatcher : IInspectable
+    {
+        [propget] HRESULT MinSamplingInterval([out, retval] Windows.Foundation.TimeSpan *value);
+        [propget] HRESULT MaxSamplingInterval([out, retval] Windows.Foundation.TimeSpan *value);
+        [propget] HRESULT MinOutOfRangeTimeout([out, retval] Windows.Foundation.TimeSpan *value);
+        [propget] HRESULT MaxOutOfRangeTimeout([out, retval] Windows.Foundation.TimeSpan *value);
+        [propget] HRESULT Status([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcherStatus *value);
+        [propget] HRESULT ScanningMode([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEScanningMode *value);
+        [propput] HRESULT ScanningMode([in] Windows.Devices.Bluetooth.Advertisement.BluetoothLEScanningMode value);
+        [propget] HRESULT SignalStrengthFilter([out, retval] Windows.Devices.Bluetooth.BluetoothSignalStrengthFilter **value);
+        [propput] HRESULT SignalStrengthFilter([in] Windows.Devices.Bluetooth.BluetoothSignalStrengthFilter *value);
+        [propget] HRESULT AdvertisementFilter([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementFilter **value);
+        [propput] HRESULT AdvertisementFilter([in] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementFilter *value);
+        HRESULT Start();
+        HRESULT Stop();
+        [eventadd] HRESULT Received([in] Windows.Foundation.TypedEventHandler<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher *, Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementReceivedEventArgs *> *handler,
+                                    [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT Received([in] EventRegistrationToken token);
+        [eventadd] HRESULT Stopped([in] Windows.Foundation.TypedEventHandler<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher *, Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcherStoppedEventArgs *> *handler,
+                                   [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT Stopped([in] EventRegistrationToken token);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 10.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher),
+        uuid(01bf26bc-b164-5805-90a3-e8a7997ff225)
+    ]
+    interface IBluetoothLEAdvertisementWatcher2 : IInspectable
+    {
+        [propget] HRESULT AllowExtendedAdvertisements([out, retval] boolean *value);
+        [propput] HRESULT AllowExtendedAdvertisements([in] boolean value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 19.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher),
+        uuid(14d980be-4002-5dbe-8519-ffca6ca389f0)
+    ]
+    interface IBluetoothLEAdvertisementWatcher3 : IInspectable
+    {
+        [propget] HRESULT UseUncoded1MPhy([out, retval] boolean *value);
+        [propput] HRESULT UseUncoded1MPhy([in] boolean value);
+        [propget] HRESULT UseCodedPhy([out, retval] boolean *value);
+        [propput] HRESULT UseCodedPhy([in] boolean value);
+        [propget] HRESULT ScanParameters([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementScanParameters **value);
+        [propput] HRESULT ScanParameters([in] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementScanParameters *value);
+        [propget] HRESULT UseHardwareFilter([out, retval] boolean *value);
+        [propput] HRESULT UseHardwareFilter([in] boolean value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher),
+        uuid(9aaf2d56-39ac-453e-b32a-85c657e017f1)
+    ]
+    interface IBluetoothLEAdvertisementWatcherFactory : IInspectable
+    {
+        HRESULT Create([in] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementFilter *filter,
+                       [out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcher **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementWatcherFactory, Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass BluetoothLEAdvertisementWatcher
+    {
+        [default] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementWatcher;
+        [contract(Windows.Foundation.UniversalApiContract, 10.0)] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementWatcher2;
+        [contract(Windows.Foundation.UniversalApiContract, 19.0)] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementWatcher3;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementFilter),
+        uuid(131eb0d3-d04e-47b1-837e-49405bf6f80f)
+    ]
+    interface IBluetoothLEAdvertisementFilter : IInspectable
+    {
+        [propget] HRESULT Advertisement([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisement **value);
+        [propput] HRESULT Advertisement([in] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisement *value);
+        [propget] HRESULT BytePatterns([out, retval] Windows.Foundation.Collections.IVector<Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementBytePattern *> **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass BluetoothLEAdvertisementFilter
+    {
+        [default] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementFilter;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 10.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementReceivedEventArgs),
+        uuid(27987ddf-e596-41be-8d43-9e6731d4a913)
+    ]
+    interface IBluetoothLEAdvertisementReceivedEventArgs : IInspectable
+    {
+        [propget] HRESULT RawSignalStrengthInDBm([out, retval] INT16 *value);
+        [propget] HRESULT BluetoothAddress([out, retval] UINT64 *value);
+        [propget] HRESULT AdvertisementType([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementType *value);
+        [propget] HRESULT Timestamp([out, retval] Windows.Foundation.DateTime *value);
+        [propget] HRESULT Advertisement([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisement **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 10.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementReceivedEventArgs),
+        uuid(12d9c87b-0399-5f0e-a348-53b02b6b162e)
+    ]
+    interface IBluetoothLEAdvertisementReceivedEventArgs2 : IInspectable
+    {
+        [propget] HRESULT BluetoothAddressType([out, retval] Windows.Devices.Bluetooth.BluetoothAddressType *value);
+        [propget] HRESULT TransmitPowerLevelInDBm([out, retval] Windows.Foundation.IReference<INT16> **value);
+        [propget] HRESULT IsAnonymous([out, retval] boolean *value);
+        [propget] HRESULT IsConnectable([out, retval] boolean *value);
+        [propget] HRESULT IsScannable([out, retval] boolean *value);
+        [propget] HRESULT IsDirected([out, retval] boolean *value);
+        [propget] HRESULT IsScanResponse([out, retval] boolean *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 19.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementReceivedEventArgs),
+        uuid(8d204b54-ff86-5d84-a25a-137dccd96f7a)
+    ]
+    interface IBluetoothLEAdvertisementReceivedEventArgs3 : IInspectable
+    {
+        [propget] HRESULT PrimaryPhy([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementPhyType *value);
+        [propget] HRESULT SecondaryPhy([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementPhyType *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass BluetoothLEAdvertisementReceivedEventArgs
+    {
+        [default] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementReceivedEventArgs;
+        [contract(Windows.Foundation.UniversalApiContract, 10.0)] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementReceivedEventArgs2;
+        [contract(Windows.Foundation.UniversalApiContract, 19.0)] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementReceivedEventArgs3;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementWatcherStoppedEventArgs),
+        uuid(dd40f84d-e7b9-43e3-9c04-0685d085fd8c)
+    ]
+    interface IBluetoothLEAdvertisementWatcherStoppedEventArgs : IInspectable
+    {
+        [propget] HRESULT Error([out, retval] Windows.Devices.Bluetooth.BluetoothError *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass BluetoothLEAdvertisementWatcherStoppedEventArgs
+    {
+        [default] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementWatcherStoppedEventArgs;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementBytePattern),
+        uuid(fbfad7f2-b9c5-4a08-bc51-502f8ef68a79)
+    ]
+    interface IBluetoothLEAdvertisementBytePattern : IInspectable
+    {
+        [propget] HRESULT DataType([out, retval] BYTE *value);
+        [propput] HRESULT DataType([in] BYTE value);
+        [propget] HRESULT Offset([out, retval] INT16 *value);
+        [propput] HRESULT Offset([in] INT16 value);
+        [propget] HRESULT Data([out, retval] Windows.Storage.Streams.IBuffer **value);
+        [propput] HRESULT Data([in] Windows.Storage.Streams.IBuffer *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementBytePattern),
+        uuid(c2e24d73-fd5c-4ec3-be2a-9ca6fa11b7bd)
+    ]
+    interface IBluetoothLEAdvertisementBytePatternFactory : IInspectable
+    {
+        HRESULT Create([in] BYTE type, [in] INT16 offset, [in] Windows.Storage.Streams.IBuffer *data,
+                       [out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementBytePattern **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementBytePatternFactory, Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass BluetoothLEAdvertisementBytePattern
+    {
+        [default] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementBytePattern;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 19.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementScanParameters),
+        uuid(94f91413-63d9-53bd-af4c-e6b1a6514595)
+    ]
+    interface IBluetoothLEAdvertisementScanParameters : IInspectable
+    {
+        [propget] HRESULT ScanWindow([out, retval] UINT16 *value);
+        [propget] HRESULT ScanInterval([out, retval] UINT16 *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 19.0),
+        exclusiveto(Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementScanParameters),
+        uuid(548e39cd-3c9e-5f8d-b5e1-adebed5c357c)
+    ]
+    interface IBluetoothLEAdvertisementScanParametersStatics : IInspectable
+    {
+        HRESULT CoexistenceOptimized([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementScanParameters **value);
+        HRESULT LowLatency([out, retval] Windows.Devices.Bluetooth.Advertisement.BluetoothLEAdvertisementScanParameters **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 19.0),
+        static(Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementScanParametersStatics, Windows.Foundation.UniversalApiContract, 19.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass BluetoothLEAdvertisementScanParameters
+    {
+        [default] interface Windows.Devices.Bluetooth.Advertisement.IBluetoothLEAdvertisementScanParameters;
+    }
+}
diff --git a/mingw-w64-headers/include/windows.devices.bluetooth.genericattributeprofile.idl b/mingw-w64-headers/include/windows.devices.bluetooth.genericattributeprofile.idl
index e716454..b545bcc 100644
--- a/mingw-w64-headers/include/windows.devices.bluetooth.genericattributeprofile.idl
+++ b/mingw-w64-headers/include/windows.devices.bluetooth.genericattributeprofile.idl
@@ -753,8 +753,8 @@
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
-        static(Windows.Devices.Bluetooth.GenericAttributeProfile.IGattPresentationFormatStatics, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.Devices.Bluetooth.GenericAttributeProfile.IGattPresentationFormatStatics2, Windows.Foundation.UniversalApiContract, 4.0),
+        /* static(Windows.Devices.Bluetooth.GenericAttributeProfile.IGattPresentationFormatStatics, Windows.Foundation.UniversalApiContract, 1.0), */
+        /* static(Windows.Devices.Bluetooth.GenericAttributeProfile.IGattPresentationFormatStatics2, Windows.Foundation.UniversalApiContract, 4.0), */
         threading(both)
     ]
     runtimeclass GattPresentationFormat
diff --git a/mingw-w64-headers/include/windows.devices.bluetooth.idl b/mingw-w64-headers/include/windows.devices.bluetooth.idl
index ef14b25..bca654d 100644
--- a/mingw-w64-headers/include/windows.devices.bluetooth.idl
+++ b/mingw-w64-headers/include/windows.devices.bluetooth.idl
@@ -41,6 +41,7 @@
     typedef enum BluetoothMinorClass BluetoothMinorClass;
     typedef enum BluetoothServiceCapabilities BluetoothServiceCapabilities;
     typedef enum BluetoothError BluetoothError;
+    typedef enum BluetoothAddressType BluetoothAddressType;
 
     interface IBluetoothAdapter;
     interface IBluetoothAdapter2;
@@ -65,12 +66,14 @@
     interface IBluetoothLEDevice6;
     interface IBluetoothLEDeviceStatics;
     interface IBluetoothLEDeviceStatics2;
+    interface IBluetoothSignalStrengthFilter;
 
     runtimeclass BluetoothAdapter;
     runtimeclass BluetoothClassOfDevice;
     runtimeclass BluetoothDevice;
     runtimeclass BluetoothDeviceId;
     runtimeclass BluetoothLEDevice;
+    runtimeclass BluetoothSignalStrengthFilter;
 
     namespace Rfcomm {
         runtimeclass RfcommDeviceService;
@@ -246,6 +249,17 @@
     };
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 2.0)
+    ]
+    enum BluetoothAddressType
+    {
+        Public = 0,
+        Random = 1,
+        [contract(Windows.Foundation.UniversalApiContract, 4.0)]
+        Unspecified = 2,
+    };
+
+    [
         contract(Windows.Foundation.UniversalApiContract, 4.0),
         exclusiveto(Windows.Devices.Bluetooth.BluetoothAdapter),
         uuid(7974f04c-5f7a-4a34-9225-a855f84b1a8b)
@@ -370,7 +384,7 @@
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         static(Windows.Devices.Bluetooth.IBluetoothDeviceStatics, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.Devices.Bluetooth.IBluetoothDeviceStatics2, Windows.Foundation.UniversalApiContract, 2.0),
+        /* static(Windows.Devices.Bluetooth.IBluetoothDeviceStatics2, Windows.Foundation.UniversalApiContract, 2.0), */
         threading(both)
     ]
     runtimeclass BluetoothDevice
@@ -460,7 +474,7 @@
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         static(Windows.Devices.Bluetooth.IBluetoothLEDeviceStatics, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.Devices.Bluetooth.IBluetoothLEDeviceStatics2, Windows.Foundation.UniversalApiContract, 2.0),
+        /* static(Windows.Devices.Bluetooth.IBluetoothLEDeviceStatics2, Windows.Foundation.UniversalApiContract, 2.0), */
         threading(both)
     ]
     runtimeclass BluetoothLEDevice
@@ -473,4 +487,32 @@
         [contract(Windows.Foundation.UniversalApiContract, 13.0)] interface Windows.Devices.Bluetooth.IBluetoothLEDevice6;
         interface Windows.Foundation.IClosable;
     }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Devices.Bluetooth.BluetoothSignalStrengthFilter),
+        uuid(df7b7391-6bb5-4cfe-90b1-5d7324edcf7f)
+    ]
+    interface IBluetoothSignalStrengthFilter : IInspectable
+    {
+        [propget] HRESULT InRangeThresholdInDBm([out, retval] Windows.Foundation.IReference<INT16> **value);
+        [propput] HRESULT InRangeThresholdInDBm([in] Windows.Foundation.IReference<INT16> *value);
+        [propget] HRESULT OutOfRangeThresholdInDBm([out, retval] Windows.Foundation.IReference<INT16> **value);
+        [propput] HRESULT OutOfRangeThresholdInDBm([in] Windows.Foundation.IReference<INT16> *value);
+        [propget] HRESULT OutOfRangeTimeout([out, retval] Windows.Foundation.IReference<Windows.Foundation.TimeSpan> **value);
+        [propput] HRESULT OutOfRangeTimeout([in] Windows.Foundation.IReference<Windows.Foundation.TimeSpan> *value);
+        [propget] HRESULT SamplingInterval([out, retval] Windows.Foundation.IReference<Windows.Foundation.TimeSpan> **value);
+        [propput] HRESULT SamplingInterval([in] Windows.Foundation.IReference<Windows.Foundation.TimeSpan> *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass BluetoothSignalStrengthFilter
+    {
+        [default] interface Windows.Devices.Bluetooth.IBluetoothSignalStrengthFilter;
+    }
 }
diff --git a/mingw-w64-headers/include/windows.devices.bluetooth.rfcomm.idl b/mingw-w64-headers/include/windows.devices.bluetooth.rfcomm.idl
index 14f9aca..ed56864 100644
--- a/mingw-w64-headers/include/windows.devices.bluetooth.rfcomm.idl
+++ b/mingw-w64-headers/include/windows.devices.bluetooth.rfcomm.idl
@@ -88,7 +88,7 @@
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         static(Windows.Devices.Bluetooth.Rfcomm.IRfcommDeviceServiceStatics, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.Devices.Bluetooth.Rfcomm.IRfcommDeviceServiceStatics2, Windows.Foundation.UniversalApiContract, 3.0),
+        /* static(Windows.Devices.Bluetooth.Rfcomm.IRfcommDeviceServiceStatics2, Windows.Foundation.UniversalApiContract, 3.0), */
         threading(both)
     ]
     runtimeclass RfcommDeviceService
@@ -102,7 +102,7 @@
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
-        static(Windows.Devices.Bluetooth.Rfcomm.IRfcommServiceIdStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        /* static(Windows.Devices.Bluetooth.Rfcomm.IRfcommServiceIdStatics, Windows.Foundation.UniversalApiContract, 1.0), */
         threading(both)
     ]
     runtimeclass RfcommServiceId
diff --git a/mingw-w64-headers/include/windows.devices.enumeration.idl b/mingw-w64-headers/include/windows.devices.enumeration.idl
index 4f15ac8..555b07d 100644
--- a/mingw-w64-headers/include/windows.devices.enumeration.idl
+++ b/mingw-w64-headers/include/windows.devices.enumeration.idl
@@ -324,6 +324,7 @@
     }
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
     ]
     runtimeclass DeviceInformationUpdate
@@ -333,6 +334,7 @@
     }
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
     ]
     runtimeclass DeviceThumbnail
@@ -346,6 +348,7 @@
     }
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
     ]
     runtimeclass DeviceWatcher
@@ -355,6 +358,7 @@
     }
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile)
     ]
     runtimeclass EnclosureLocation
diff --git a/mingw-w64-headers/include/windows.devices.geolocation.idl b/mingw-w64-headers/include/windows.devices.geolocation.idl
index ce4853f..054c795 100644
--- a/mingw-w64-headers/include/windows.devices.geolocation.idl
+++ b/mingw-w64-headers/include/windows.devices.geolocation.idl
@@ -208,6 +208,7 @@
     }
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile)
     ]
     runtimeclass StatusChangedEventArgs
diff --git a/mingw-w64-headers/include/windows.devices.usb.idl b/mingw-w64-headers/include/windows.devices.usb.idl
index 40d4312..abd0360 100644
--- a/mingw-w64-headers/include/windows.devices.usb.idl
+++ b/mingw-w64-headers/include/windows.devices.usb.idl
@@ -165,7 +165,7 @@
     }
 
     [
-        activatable(Windows.Devices.Usb.IUsbSetupPacketFactory, Windows.Foundation.UniversalApiContract, 1.0),
+        /* activatable(Windows.Devices.Usb.IUsbSetupPacketFactory, Windows.Foundation.UniversalApiContract, 1.0), */
         activatable(Windows.Foundation.UniversalApiContract, 1.0),
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile)
diff --git a/mingw-w64-headers/include/windows.foundation.idl b/mingw-w64-headers/include/windows.foundation.idl
index 5d08662..d6b9617 100644
--- a/mingw-w64-headers/include/windows.foundation.idl
+++ b/mingw-w64-headers/include/windows.foundation.idl
@@ -30,6 +30,8 @@
 namespace Windows.Foundation.Collections {
     interface IPropertySet;
 
+    runtimeclass PropertySet;
+
     declare {
         interface Windows.Foundation.Collections.IKeyValuePair<HSTRING, HSTRING>;
         interface Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *>;
@@ -63,6 +65,20 @@
         marshaling_behavior(agile),
         threading(both)
     ]
+    runtimeclass PropertySet
+    {
+        [default] interface Windows.Foundation.Collections.IPropertySet;
+        interface Windows.Foundation.Collections.IObservableMap<HSTRING, IInspectable *>;
+        interface Windows.Foundation.Collections.IMap<HSTRING, IInspectable *>;
+        interface Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, IInspectable *> *>;
+    }
+
+    [
+        activatable(Windows.Foundation.FoundationContract, 1.0),
+        contract(Windows.Foundation.FoundationContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
     runtimeclass ValueSet
     {
         [default] interface Windows.Foundation.Collections.IPropertySet;
diff --git a/mingw-w64-headers/include/windows.graphics.holographic.idl b/mingw-w64-headers/include/windows.graphics.holographic.idl
index 88a7aa9..204b1fd 100644
--- a/mingw-w64-headers/include/windows.graphics.holographic.idl
+++ b/mingw-w64-headers/include/windows.graphics.holographic.idl
@@ -153,7 +153,7 @@
     [
         contract(Windows.Foundation.UniversalApiContract, 2.0),
         marshaling_behavior(agile),
-        static(Windows.Graphics.Holographic.IHolographicSpaceStatics, Windows.Foundation.UniversalApiContract, 2.0),
+        /* static(Windows.Graphics.Holographic.IHolographicSpaceStatics, Windows.Foundation.UniversalApiContract, 2.0), */
         static(Windows.Graphics.Holographic.IHolographicSpaceStatics2, Windows.Foundation.UniversalApiContract, 4.0),
         static(Windows.Graphics.Holographic.IHolographicSpaceStatics3, Windows.Foundation.UniversalApiContract, 5.0),
         threading(both)
diff --git a/mingw-w64-headers/include/windows.media.core.idl b/mingw-w64-headers/include/windows.media.core.idl
new file mode 100644
index 0000000..7eb30ca
--- /dev/null
+++ b/mingw-w64-headers/include/windows.media.core.idl
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2025 Mohamad Al-Jaf
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+import "inspectable.idl";
+import "asyncinfo.idl";
+import "eventtoken.idl";
+import "windowscontracts.idl";
+import "windows.foundation.idl";
+/* import "windows.applicationmodel.appservice.idl"; */
+import "windows.graphics.directx.direct3d11.idl";
+import "windows.graphics.imaging.idl";
+import "windows.media.idl";
+import "windows.media.capture.idl";
+/* import "windows.media.capture.frames.idl"; */
+import "windows.media.devices.idl";
+/* import "windows.media.devices.core.idl"; */
+import "windows.media.effects.idl";
+import "windows.media.faceanalysis.idl";
+import "windows.media.mediaproperties.idl";
+/* import "windows.media.playback.idl"; */
+/* import "windows.media.protection.idl"; */
+/* import "windows.media.streaming.adaptive.idl"; */
+/* import "windows.networking.backgroundtransfer.idl"; */
+import "windows.storage.idl";
+import "windows.storage.fileproperties.idl";
+import "windows.storage.streams.idl";
+import "windows.ui.idl";
+
+namespace Windows.Media.Core {
+    interface IMediaSource;
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        uuid(e7bfb599-a09d-4c21-bcdf-20af4f86b3d9)
+    ]
+    interface IMediaSource : IInspectable
+    {
+    }
+}
diff --git a/mingw-w64-headers/include/windows.media.devices.idl b/mingw-w64-headers/include/windows.media.devices.idl
index d0b3fce..e538e71 100644
--- a/mingw-w64-headers/include/windows.media.devices.idl
+++ b/mingw-w64-headers/include/windows.media.devices.idl
@@ -98,6 +98,7 @@
             }
 
             [
+                contract(Windows.Foundation.UniversalApiContract, 1.0),
                 activatable(Windows.Foundation.UniversalApiContract, 1.0),
                 marshaling_behavior(agile),
                 static(Windows.Media.Devices.IMediaDeviceStatics, Windows.Foundation.UniversalApiContract, 1.0),
@@ -107,6 +108,7 @@
             }
 
             [
+                contract(Windows.Foundation.UniversalApiContract, 1.0),
                 marshaling_behavior(agile)
             ]
             runtimeclass DefaultAudioRenderDeviceChangedEventArgs
@@ -115,6 +117,7 @@
             }
 
             [
+                contract(Windows.Foundation.UniversalApiContract, 1.0),
                 marshaling_behavior(agile)
             ]
             runtimeclass DefaultAudioCaptureDeviceChangedEventArgs
diff --git a/mingw-w64-headers/include/windows.media.idl b/mingw-w64-headers/include/windows.media.idl
index 87ccc75..d908ede 100644
--- a/mingw-w64-headers/include/windows.media.idl
+++ b/mingw-w64-headers/include/windows.media.idl
@@ -363,6 +363,16 @@
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.SystemMediaTransportControls),
+        uuid(43ba380a-eca4-4832-91ab-d415fae484c6)
+    ]
+    interface ISystemMediaTransportControlsStatics : IInspectable
+    {
+        HRESULT GetForCurrentView([out, retval] Windows.Media.SystemMediaTransportControls **controls);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         exclusiveto(Windows.Media.SystemMediaTransportControlsTimelineProperties),
         uuid(5125316a-c3a2-475b-8507-93534dc88f15)
     ]
diff --git a/mingw-w64-headers/include/windows.media.mediaproperties.idl b/mingw-w64-headers/include/windows.media.mediaproperties.idl
new file mode 100644
index 0000000..9fa810f
--- /dev/null
+++ b/mingw-w64-headers/include/windows.media.mediaproperties.idl
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) 2025 Mohamad Al-Jaf
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+import "inspectable.idl";
+import "asyncinfo.idl";
+import "eventtoken.idl";
+import "windowscontracts.idl";
+import "windows.foundation.idl";
+import "windows.media.core.idl";
+import "windows.storage.idl";
+import "windows.storage.streams.idl";
+
+namespace Windows.Media.MediaProperties {
+    interface IAudioEncodingProperties;
+    interface IAudioEncodingProperties2;
+    interface IAudioEncodingProperties3;
+    interface IAudioEncodingPropertiesStatics;
+    interface IAudioEncodingPropertiesStatics2;
+    interface IAudioEncodingPropertiesWithFormatUserData;
+    interface IContainerEncodingProperties;
+    interface IContainerEncodingProperties2;
+    interface IMediaEncodingProfile;
+    interface IMediaEncodingProfile2;
+    interface IMediaEncodingProfile3;
+    interface IMediaEncodingProfileStatics;
+    interface IMediaEncodingProfileStatics2;
+    interface IMediaEncodingProfileStatics3;
+    interface IMediaEncodingProperties;
+    interface IMediaRatio;
+    interface IVideoEncodingProperties;
+    interface IVideoEncodingProperties2;
+    interface IVideoEncodingProperties3;
+    interface IVideoEncodingProperties4;
+    interface IVideoEncodingProperties5;
+    interface IVideoEncodingPropertiesStatics;
+    interface IVideoEncodingPropertiesStatics2;
+
+    runtimeclass AudioEncodingProperties;
+    runtimeclass ContainerEncodingProperties;
+    runtimeclass MediaEncodingProfile;
+    runtimeclass MediaRatio;
+    runtimeclass VideoEncodingProperties;
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.MediaProperties.AudioEncodingProperties),
+        uuid(62bc7a16-005c-4b3b-8a0b-0a090e9687f3)
+    ]
+    interface IAudioEncodingProperties : IInspectable
+        requires Windows.Media.MediaProperties.IMediaEncodingProperties
+    {
+        [propput] HRESULT Bitrate([in] UINT32 value);
+        [propget] HRESULT Bitrate([out, retval] UINT32 *value);
+        [propput] HRESULT ChannelCount([in] UINT32 value);
+        [propget] HRESULT ChannelCount([out, retval] UINT32 *value);
+        [propput] HRESULT SampleRate([in] UINT32 value);
+        [propget] HRESULT SampleRate([out, retval] UINT32 *value);
+        [propput] HRESULT BitsPerSample([in] UINT32 value);
+        [propget] HRESULT BitsPerSample([out, retval] UINT32 *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.MediaProperties.ContainerEncodingProperties),
+        uuid(59ac2a57-b32a-479e-8a61-4b7f2e9e7ea0)
+    ]
+    interface IContainerEncodingProperties : IInspectable
+        requires Windows.Media.MediaProperties.IMediaEncodingProperties
+    {
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.MediaProperties.MediaEncodingProfile),
+        uuid(e7dbf5a8-1db9-4783-876b-3dfe12acfdb3)
+    ]
+    interface IMediaEncodingProfile : IInspectable
+    {
+        [propput] HRESULT Audio([in] Windows.Media.MediaProperties.AudioEncodingProperties *value);
+        [propget] HRESULT Audio([out, retval] Windows.Media.MediaProperties.AudioEncodingProperties **value);
+        [propput] HRESULT Video([in] Windows.Media.MediaProperties.VideoEncodingProperties *value);
+        [propget] HRESULT Video([out, retval] Windows.Media.MediaProperties.VideoEncodingProperties **value);
+        [propput] HRESULT Container([in] Windows.Media.MediaProperties.ContainerEncodingProperties *value);
+        [propget] HRESULT Container([out, retval] Windows.Media.MediaProperties.ContainerEncodingProperties **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.MediaProperties.MediaRatio),
+        uuid(d2d0fee5-8929-401d-ac78-7d357e378163)
+    ]
+    interface IMediaRatio : IInspectable
+    {
+        [propput] HRESULT Numerator([in] UINT32 value);
+        [propget] HRESULT Numerator([out, retval] UINT32 *value);
+        [propput] HRESULT Denominator([in] UINT32 value);
+        [propget] HRESULT Denominator([out, retval] UINT32 *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.MediaProperties.VideoEncodingProperties),
+        uuid(76ee6c9a-37c2-4f2a-880a-1282bbb4373d)
+    ]
+    interface IVideoEncodingProperties : IInspectable
+        requires Windows.Media.MediaProperties.IMediaEncodingProperties
+    {
+        [propput] HRESULT Bitrate([in] UINT32 value);
+        [propget] HRESULT Bitrate([out, retval] UINT32 *value);
+        [propput] HRESULT Width([in] UINT32 value);
+        [propget] HRESULT Width([out, retval] UINT32 *value);
+        [propput] HRESULT Height([in] UINT32 value);
+        [propget] HRESULT Height([out, retval] UINT32 *value);
+        [propget] HRESULT FrameRate([out, retval] Windows.Media.MediaProperties.MediaRatio **value);
+        [propget] HRESULT PixelAspectRatio([out, retval] Windows.Media.MediaProperties.MediaRatio **value);
+    }
+
+    [
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        /* static(Windows.Media.MediaProperties.IAudioEncodingPropertiesStatics, Windows.Foundation.UniversalApiContract, 1.0), */
+        /* static(Windows.Media.MediaProperties.IAudioEncodingPropertiesStatics2, Windows.Foundation.UniversalApiContract, 4.0), */
+        threading(both)
+    ]
+    runtimeclass AudioEncodingProperties
+    {
+        [default] interface Windows.Media.MediaProperties.IAudioEncodingProperties;
+        interface Windows.Media.MediaProperties.IMediaEncodingProperties;
+        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Media.MediaProperties.IAudioEncodingPropertiesWithFormatUserData;
+        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Media.MediaProperties.IAudioEncodingProperties2;
+        [contract(Windows.Foundation.UniversalApiContract, 6.0)] interface Windows.Media.MediaProperties.IAudioEncodingProperties3;
+    }
+
+    [
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass ContainerEncodingProperties
+    {
+        [default] interface Windows.Media.MediaProperties.IContainerEncodingProperties;
+        interface Windows.Media.MediaProperties.IMediaEncodingProperties;
+        [contract(Windows.Foundation.UniversalApiContract, 6.0)] interface Windows.Media.MediaProperties.IContainerEncodingProperties2;
+    }
+
+    [
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        /* static(Windows.Media.MediaProperties.IMediaEncodingProfileStatics, Windows.Foundation.UniversalApiContract, 1.0), */
+        /* static(Windows.Media.MediaProperties.IMediaEncodingProfileStatics2, Windows.Foundation.UniversalApiContract, 1.0), */
+        /* static(Windows.Media.MediaProperties.IMediaEncodingProfileStatics3, Windows.Foundation.UniversalApiContract, 4.0), */
+        threading(mta)
+    ]
+    runtimeclass MediaEncodingProfile
+    {
+        [default] interface Windows.Media.MediaProperties.IMediaEncodingProfile;
+        [contract(Windows.Foundation.UniversalApiContract, 5.0)] interface Windows.Media.MediaProperties.IMediaEncodingProfile2;
+        [contract(Windows.Foundation.UniversalApiContract, 6.0)] interface Windows.Media.MediaProperties.IMediaEncodingProfile3;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass MediaRatio
+    {
+        [default] interface Windows.Media.MediaProperties.IMediaRatio;
+    }
+
+    [
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        /* static(Windows.Media.MediaProperties.IVideoEncodingPropertiesStatics, Windows.Foundation.UniversalApiContract, 1.0), */
+        /* static(Windows.Media.MediaProperties.IVideoEncodingPropertiesStatics2, Windows.Foundation.UniversalApiContract, 4.0), */
+        threading(both)
+    ]
+    runtimeclass VideoEncodingProperties
+    {
+        [default] interface Windows.Media.MediaProperties.IVideoEncodingProperties;
+        interface Windows.Media.MediaProperties.IMediaEncodingProperties;
+        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Media.MediaProperties.IVideoEncodingProperties2;
+        [contract(Windows.Foundation.UniversalApiContract, 3.0)] interface Windows.Media.MediaProperties.IVideoEncodingProperties3;
+        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.Media.MediaProperties.IVideoEncodingProperties4;
+        [contract(Windows.Foundation.UniversalApiContract, 6.0)] interface Windows.Media.MediaProperties.IVideoEncodingProperties5;
+    }
+}
diff --git a/mingw-w64-headers/include/windows.media.speechsynthesis.idl b/mingw-w64-headers/include/windows.media.speechsynthesis.idl
index 135cc8f..3800fe4 100644
--- a/mingw-w64-headers/include/windows.media.speechsynthesis.idl
+++ b/mingw-w64-headers/include/windows.media.speechsynthesis.idl
@@ -226,7 +226,7 @@
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         static(Windows.Media.SpeechSynthesis.IInstalledVoicesStatic, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.Media.SpeechSynthesis.IInstalledVoicesStatic2, Windows.Foundation.UniversalApiContract, 5.0)
+        /* static(Windows.Media.SpeechSynthesis.IInstalledVoicesStatic2, Windows.Foundation.UniversalApiContract, 5.0) */
     ]
     runtimeclass SpeechSynthesizer
     {
diff --git a/mingw-w64-headers/include/windows.media.transcoding.idl b/mingw-w64-headers/include/windows.media.transcoding.idl
new file mode 100644
index 0000000..f97c730
--- /dev/null
+++ b/mingw-w64-headers/include/windows.media.transcoding.idl
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2025 Mohamad Al-Jaf
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+import "inspectable.idl";
+import "asyncinfo.idl";
+import "eventtoken.idl";
+import "windowscontracts.idl";
+import "windows.foundation.idl";
+import "windows.media.core.idl";
+import "windows.media.mediaproperties.idl";
+import "windows.storage.idl";
+import "windows.storage.streams.idl";
+
+namespace Windows.Media.Transcoding {
+    typedef enum MediaVideoProcessingAlgorithm MediaVideoProcessingAlgorithm;
+    typedef enum TranscodeFailureReason TranscodeFailureReason;
+
+    interface IMediaTranscoder;
+    interface IMediaTranscoder2;
+    interface IPrepareTranscodeResult;
+
+    runtimeclass MediaTranscoder;
+    runtimeclass PrepareTranscodeResult;
+
+    declare {
+        interface Windows.Foundation.IAsyncActionWithProgress<DOUBLE>;
+        interface Windows.Foundation.AsyncActionProgressHandler<DOUBLE>;
+        interface Windows.Foundation.AsyncActionWithProgressCompletedHandler<DOUBLE>;
+        interface Windows.Foundation.IAsyncOperation<Windows.Media.Transcoding.PrepareTranscodeResult *>;
+        interface Windows.Foundation.IAsyncOperation<Windows.Media.Transcoding.TranscodeFailureReason>;
+        interface Windows.Foundation.IAsyncOperationWithProgress<Windows.Media.Transcoding.TranscodeFailureReason, DOUBLE>;
+        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Media.Transcoding.PrepareTranscodeResult *>;
+        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Media.Transcoding.TranscodeFailureReason>;
+        interface Windows.Foundation.AsyncOperationWithProgressCompletedHandler<Windows.Media.Transcoding.TranscodeFailureReason, DOUBLE>;
+        interface Windows.Foundation.AsyncOperationProgressHandler<Windows.Media.Transcoding.TranscodeFailureReason, DOUBLE>;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum MediaVideoProcessingAlgorithm
+    {
+        Default   = 0,
+        MrfCrf444 = 1,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum TranscodeFailureReason
+    {
+        None           = 0,
+        Unknown        = 1,
+        InvalidProfile = 2,
+        CodecNotFound  = 3,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.Transcoding.MediaTranscoder),
+        uuid(190c99d2-a0aa-4d34-86bc-eed1b12c2f5b)
+    ]
+    interface IMediaTranscoder : IInspectable
+    {
+        [propput] HRESULT TrimStartTime([in] Windows.Foundation.TimeSpan value);
+        [propget] HRESULT TrimStartTime([out, retval] Windows.Foundation.TimeSpan *value);
+        [propput] HRESULT TrimStopTime([in] Windows.Foundation.TimeSpan value);
+        [propget] HRESULT TrimStopTime([out, retval] Windows.Foundation.TimeSpan *value);
+        [propput] HRESULT AlwaysReencode([in] boolean value);
+        [propget] HRESULT AlwaysReencode([out, retval] boolean *value);
+        [propput] HRESULT HardwareAccelerationEnabled([in] boolean value);
+        [propget] HRESULT HardwareAccelerationEnabled([out, retval] boolean *value);
+        [overload("AddAudioEffect")] HRESULT AddAudioEffect([in] HSTRING activatable_class_id);
+        [overload("AddAudioEffect")] HRESULT AddAudioEffectWithSettings([in] HSTRING activatable_class_id, [in] boolean effect_required, [in] Windows.Foundation.Collections.IPropertySet *configuration);
+        [overload("AddVideoEffect")] HRESULT AddVideoEffect([in] HSTRING activatable_class_id);
+        [overload("AddVideoEffect")] HRESULT AddVideoEffectWithSettings([in] HSTRING activatable_class_id, [in] boolean effect_required, [in] Windows.Foundation.Collections.IPropertySet *configuration);
+        HRESULT ClearEffects();
+        HRESULT PrepareFileTranscodeAsync([in] Windows.Storage.IStorageFile *source, [in] Windows.Storage.IStorageFile *destination,
+                                          [in] Windows.Media.MediaProperties.MediaEncodingProfile *profile,
+                                          [out, retval] Windows.Foundation.IAsyncOperation<Windows.Media.Transcoding.PrepareTranscodeResult *> **operation);
+        HRESULT PrepareStreamTranscodeAsync([in] Windows.Storage.Streams.IRandomAccessStream *source, [in] Windows.Storage.Streams.IRandomAccessStream *destination,
+                                            [in] Windows.Media.MediaProperties.MediaEncodingProfile *profile,
+                                            [out, retval] Windows.Foundation.IAsyncOperation<Windows.Media.Transcoding.PrepareTranscodeResult *> **operation);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.Transcoding.MediaTranscoder),
+        uuid(40531d74-35e0-4f04-8574-ca8bc4e5a082)
+    ]
+    interface IMediaTranscoder2 : IInspectable
+    {
+        HRESULT PrepareMediaStreamSourceTranscodeAsync([in] Windows.Media.Core.IMediaSource *source, [in] Windows.Storage.Streams.IRandomAccessStream *destination,
+                                                       [in] Windows.Media.MediaProperties.MediaEncodingProfile *profile,
+                                                       [out, retval] Windows.Foundation.IAsyncOperation<Windows.Media.Transcoding.PrepareTranscodeResult *> **operation);
+        [propput] HRESULT VideoProcessingAlgorithm([in] Windows.Media.Transcoding.MediaVideoProcessingAlgorithm value);
+        [propget] HRESULT VideoProcessingAlgorithm([out, retval] Windows.Media.Transcoding.MediaVideoProcessingAlgorithm *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Media.Transcoding.PrepareTranscodeResult),
+        uuid(05f25dce-994f-4a34-9d68-97ccce1730d6)
+    ]
+    interface IPrepareTranscodeResult : IInspectable
+    {
+        [propget] HRESULT CanTranscode([out, retval] boolean *value);
+        [propget] HRESULT FailureReason([out, retval] Windows.Media.Transcoding.TranscodeFailureReason *value);
+        HRESULT TranscodeAsync([out, retval] Windows.Foundation.IAsyncActionWithProgress<DOUBLE> **operation);
+    }
+
+    [
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass MediaTranscoder
+    {
+        [default] interface Windows.Media.Transcoding.IMediaTranscoder;
+        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.Media.Transcoding.IMediaTranscoder2;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        threading(both)
+    ]
+    runtimeclass PrepareTranscodeResult
+    {
+        [default] interface Windows.Media.Transcoding.IPrepareTranscodeResult;
+    }
+}
diff --git a/mingw-w64-headers/include/windows.storage.fileproperties.idl b/mingw-w64-headers/include/windows.storage.fileproperties.idl
index 9426d02..8469e6c 100644
--- a/mingw-w64-headers/include/windows.storage.fileproperties.idl
+++ b/mingw-w64-headers/include/windows.storage.fileproperties.idl
@@ -20,6 +20,7 @@
 #pragma winrt ns_prefix
 #endif
 
+#ifndef DO_NO_IMPORTS
 import "inspectable.idl";
 import "asyncinfo.idl";
 import "eventtoken.idl";
@@ -28,6 +29,7 @@
 import "windows.devices.geolocation.idl";
 /* import "windows.storage.idl"; */
 import "windows.storage.streams.idl";
+#endif
 
 namespace Windows.Storage.FileProperties {
     interface IBasicProperties;
diff --git a/mingw-w64-headers/include/windows.storage.idl b/mingw-w64-headers/include/windows.storage.idl
index 483fc5a..1f4741a 100644
--- a/mingw-w64-headers/include/windows.storage.idl
+++ b/mingw-w64-headers/include/windows.storage.idl
@@ -20,6 +20,7 @@
 #pragma winrt ns_prefix
 #endif
 
+#ifndef DO_NO_IMPORTS
 import "inspectable.idl";
 import "asyncinfo.idl";
 import "eventtoken.idl";
@@ -30,6 +31,7 @@
 import "windows.storage.search.idl";
 import "windows.storage.streams.idl";
 import "windows.system.idl";
+#endif
 
 namespace Windows.Storage {
     typedef enum ApplicationDataCreateDisposition ApplicationDataCreateDisposition;
@@ -58,11 +60,11 @@
     interface IKnownFoldersStatics4;
     interface ISetVersionDeferral;
     interface ISetVersionRequest;
+    interface IStorageFileStatics;
+    interface IStorageFileStatics2;
     interface IStorageFolder;
     interface IStorageFolderStatics;
     interface IStorageFolderStatics2;
-    interface IStorageFileStatics;
-    interface IStorageFileStatics2;
     interface IStorageItem;
 
     runtimeclass ApplicationData;
@@ -77,17 +79,20 @@
     declare {
         interface Windows.Foundation.Collections.IKeyValuePair<HSTRING, Windows.Storage.ApplicationDataContainer *>;
         interface Windows.Foundation.Collections.IIterable<Windows.Foundation.Collections.IKeyValuePair<HSTRING, Windows.Storage.ApplicationDataContainer *> *>;
-        interface Windows.Foundation.Collections.IIterable<Windows.Storage.IStorageItem *>;
         interface Windows.Foundation.Collections.IIterator<Windows.Foundation.Collections.IKeyValuePair<HSTRING, Windows.Storage.ApplicationDataContainer *> *>;
-        interface Windows.Foundation.Collections.IIterator<Windows.Storage.IStorageItem *>;
         interface Windows.Foundation.Collections.IMapView<HSTRING, Windows.Storage.ApplicationDataContainer *>;
+        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.ApplicationData *>;
+        interface Windows.Foundation.IAsyncOperation<Windows.Storage.ApplicationData *>;
+        interface Windows.Foundation.TypedEventHandler<Windows.Storage.ApplicationData *, IInspectable *>;
+#ifndef _WINDOWS_APPLICATIONDATA
+        interface Windows.Foundation.Collections.IIterable<Windows.Storage.IStorageItem *>;
+        interface Windows.Foundation.Collections.IIterator<Windows.Storage.IStorageItem *>;
         interface Windows.Foundation.Collections.IVectorView<Windows.Storage.IStorageItem *>;
         interface Windows.Foundation.Collections.IVectorView<Windows.Storage.StorageFile *>;
         interface Windows.Foundation.Collections.IVectorView<Windows.Storage.StorageFolder *>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Foundation.Collections.IVectorView<Windows.Storage.IStorageItem *> *>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Foundation.Collections.IVectorView<Windows.Storage.StorageFile *> *>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Foundation.Collections.IVectorView<Windows.Storage.StorageFolder *> *>;
-        interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.ApplicationData *>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.KnownFoldersAccessStatus>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.IStorageItem *>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.StorageFile *>;
@@ -96,13 +101,12 @@
         interface Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IVectorView<Windows.Storage.IStorageItem *> *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IVectorView<Windows.Storage.StorageFile *> *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IVectorView<Windows.Storage.StorageFolder *> *>;
-        interface Windows.Foundation.IAsyncOperation<Windows.Storage.ApplicationData *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.KnownFoldersAccessStatus>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.IStorageItem *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.StorageFile *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.StorageFolder *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.StorageStreamTransaction *>;
-        interface Windows.Foundation.TypedEventHandler<Windows.Storage.ApplicationData *, IInspectable *>;
+#endif
     }
 
     [
@@ -127,6 +131,7 @@
         SharedLocal = 4,
     };
 
+#ifndef _WINDOWS_APPLICATIONDATA
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0)
     ]
@@ -232,6 +237,7 @@
         File   = 0x1,
         Folder = 0x2,
     };
+#endif
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
@@ -345,6 +351,7 @@
         );
     }
 
+#ifndef _WINDOWS_APPLICATIONDATA
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         exclusiveto(Windows.Storage.KnownFolders),
@@ -438,6 +445,7 @@
             [out, retval] Windows.Foundation.IAsyncOperation<Windows.Storage.StorageFolder *> **operation
         );
     }
+#endif
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
@@ -461,6 +469,7 @@
         HRESULT GetDeferral([out, retval] Windows.Storage.SetVersionDeferral **deferral);
     }
 
+#ifndef _WINDOWS_APPLICATIONDATA
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         uuid(fa3f6186-4214-428c-a64c-14c9ac7315ea)
@@ -591,6 +600,7 @@
         [propget] HRESULT Stream([out, retval] Windows.Storage.Streams.IRandomAccessStream **value);
         HRESULT CommitAsync([out, retval] Windows.Foundation.IAsyncAction **operation);
     }
+#endif
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
@@ -617,6 +627,7 @@
         [contract(Windows.Foundation.UniversalApiContract, 12.0)] interface Windows.Foundation.IClosable;
     }
 
+#ifndef _WINDOWS_APPLICATIONDATA
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
@@ -652,8 +663,8 @@
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.Storage.IStorageFileStatics, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.Storage.IStorageFileStatics2, Windows.Foundation.UniversalApiContract, 10.0)
+        /* static(Windows.Storage.IStorageFileStatics, Windows.Foundation.UniversalApiContract, 1.0), */
+        /* static(Windows.Storage.IStorageFileStatics2, Windows.Foundation.UniversalApiContract, 10.0) */
     ]
     runtimeclass StorageFile
     {
@@ -671,8 +682,8 @@
 
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.Storage.IStorageFolderStatics, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.Storage.IStorageFolderStatics2, Windows.Foundation.UniversalApiContract, 10.0)
+        /* static(Windows.Storage.IStorageFolderStatics, Windows.Foundation.UniversalApiContract, 1.0), */
+        /* static(Windows.Storage.IStorageFolderStatics2, Windows.Foundation.UniversalApiContract, 10.0) */
     ]
     runtimeclass StorageFolder
     {
@@ -695,4 +706,5 @@
         [default] interface Windows.Storage.IStorageStreamTransaction;
         interface Windows.Foundation.IClosable;
     }
+#endif
 }
diff --git a/mingw-w64-headers/include/windows.storage.search.idl b/mingw-w64-headers/include/windows.storage.search.idl
index 093b083..217889c 100644
--- a/mingw-w64-headers/include/windows.storage.search.idl
+++ b/mingw-w64-headers/include/windows.storage.search.idl
@@ -20,6 +20,7 @@
 #pragma winrt ns_prefix
 #endif
 
+#ifndef DO_NO_IMPORTS
 import "inspectable.idl";
 import "asyncinfo.idl";
 import "eventtoken.idl";
@@ -29,6 +30,7 @@
 /* import "windows.storage.idl"; */
 import "windows.storage.fileproperties.idl";
 import "windows.storage.streams.idl";
+#endif
 
 namespace Windows.Storage.Search {
     interface IStorageFolderQueryOperations;
diff --git a/mingw-w64-headers/include/windows.storage.streams.idl b/mingw-w64-headers/include/windows.storage.streams.idl
index 6c0dde0..3534089 100644
--- a/mingw-w64-headers/include/windows.storage.streams.idl
+++ b/mingw-w64-headers/include/windows.storage.streams.idl
@@ -73,11 +73,14 @@
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.Streams.IRandomAccessStreamReference *>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.Streams.IRandomAccessStreamWithContentType *>;
         interface Windows.Foundation.AsyncOperationCompletedHandler<Windows.Storage.Streams.RandomAccessStreamReference *>;
+        interface Windows.Foundation.AsyncOperationProgressHandler<UINT64,UINT64>;
+        interface Windows.Foundation.AsyncOperationWithProgressCompletedHandler<UINT64,UINT64>;
         interface Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IMapView<HSTRING, Windows.Storage.Streams.RandomAccessStreamReference *> *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.IRandomAccessStream *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.IRandomAccessStreamReference *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.IRandomAccessStreamWithContentType *>;
         interface Windows.Foundation.IAsyncOperation<Windows.Storage.Streams.RandomAccessStreamReference *>;
+        interface Windows.Foundation.IAsyncOperationWithProgress<UINT64,UINT64>;
 #endif
     }
 
@@ -198,6 +201,18 @@
 #ifndef _WINTYPES
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.Storage.Streams.RandomAccessStream),
+        uuid(524cedcf-6e29-4ce5-9573-6b753db66c3a)
+    ]
+    interface IRandomAccessStreamStatics : IInspectable
+    {
+        [overload("CopyAsync")] HRESULT CopyAsync([in] Windows.Storage.Streams.IInputStream *source, [in] Windows.Storage.Streams.IOutputStream *dest, [out, retval] Windows.Foundation.IAsyncOperationWithProgress<UINT64, UINT64> **operation);
+        [overload("CopyAsync")] HRESULT CopySizeAsync([in] Windows.Storage.Streams.IInputStream *source, [in] Windows.Storage.Streams.IOutputStream *dest, [in] UINT64 bytesToCopy, [out, retval] Windows.Foundation.IAsyncOperationWithProgress<UINT64, UINT64> **operation);
+        HRESULT CopyAndCloseAsync([in] Windows.Storage.Streams.IInputStream *source, [in] Windows.Storage.Streams.IOutputStream *dest, [out, retval] Windows.Foundation.IAsyncOperationWithProgress<UINT64, UINT64> **operation);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
         uuid(905a0fe1-bc53-11df-8c49-001e4fc686da),
     ]
     interface IRandomAccessStream : IInspectable
diff --git a/mingw-w64-headers/include/windows.system.idl b/mingw-w64-headers/include/windows.system.idl
index 152d4b6..954fe5f 100644
--- a/mingw-w64-headers/include/windows.system.idl
+++ b/mingw-w64-headers/include/windows.system.idl
@@ -466,7 +466,7 @@
     [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
-        static(Windows.System.IUserStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        /* static(Windows.System.IUserStatics, Windows.Foundation.UniversalApiContract, 1.0), */
         threading(both),
     ]
     runtimeclass User
diff --git a/mingw-w64-headers/include/windows.system.profile.idl b/mingw-w64-headers/include/windows.system.profile.idl
index 9e0b0ed..7032274 100644
--- a/mingw-w64-headers/include/windows.system.profile.idl
+++ b/mingw-w64-headers/include/windows.system.profile.idl
@@ -113,7 +113,7 @@
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         static(Windows.System.Profile.IAnalyticsInfoStatics, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.System.Profile.IAnalyticsInfoStatics2, Windows.Foundation.UniversalApiContract, 6.0),
+        /* static(Windows.System.Profile.IAnalyticsInfoStatics2, Windows.Foundation.UniversalApiContract, 6.0), */
         threading(both)
     ]
     runtimeclass AnalyticsInfo
diff --git a/mingw-w64-headers/include/windows.system.userprofile.idl b/mingw-w64-headers/include/windows.system.userprofile.idl
index 756302d..41b3797 100644
--- a/mingw-w64-headers/include/windows.system.userprofile.idl
+++ b/mingw-w64-headers/include/windows.system.userprofile.idl
@@ -69,8 +69,8 @@
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile),
         static(Windows.System.UserProfile.IGlobalizationPreferencesStatics, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.System.UserProfile.IGlobalizationPreferencesStatics2, Windows.Foundation.UniversalApiContract, 5.0),
-        static(Windows.System.UserProfile.IGlobalizationPreferencesStatics3, Windows.Foundation.UniversalApiContract, 6.0),
+        /* static(Windows.System.UserProfile.IGlobalizationPreferencesStatics2, Windows.Foundation.UniversalApiContract, 5.0), */
+        /* static(Windows.System.UserProfile.IGlobalizationPreferencesStatics3, Windows.Foundation.UniversalApiContract, 6.0), */
     ]
     runtimeclass GlobalizationPreferences
     {
@@ -82,7 +82,7 @@
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(standard),
         static(Windows.System.UserProfile.IAdvertisingManagerStatics, Windows.Foundation.UniversalApiContract, 1.0),
-        static(Windows.System.UserProfile.IAdvertisingManagerStatics2, Windows.Foundation.UniversalApiContract, 3.0),
+        /* static(Windows.System.UserProfile.IAdvertisingManagerStatics2, Windows.Foundation.UniversalApiContract, 3.0), */
     ]
     runtimeclass AdvertisingManager
     {
diff --git a/mingw-w64-headers/include/windows.ui.composition.idl b/mingw-w64-headers/include/windows.ui.composition.idl
index 92ca136..a8a8594 100644
--- a/mingw-w64-headers/include/windows.ui.composition.idl
+++ b/mingw-w64-headers/include/windows.ui.composition.idl
@@ -994,7 +994,7 @@
         composable(Windows.UI.Composition.ICompositionEasingFunctionFactory, public, Windows.Foundation.UniversalApiContract, 2.0),
         contract(Windows.Foundation.UniversalApiContract, 2.0),
         marshaling_behavior(agile),
-        static(Windows.UI.Composition.ICompositionEasingFunctionStatics, Windows.Foundation.UniversalApiContract, 12.0),
+        /* static(Windows.UI.Composition.ICompositionEasingFunctionStatics, Windows.Foundation.UniversalApiContract, 12.0), */
         threading(both)
     ]
     runtimeclass CompositionEasingFunction : Windows.UI.Composition.CompositionObject
@@ -1039,7 +1039,7 @@
         composable(Windows.UI.Composition.ICompositionObjectFactory, public, Windows.Foundation.UniversalApiContract, 2.0),
         contract(Windows.Foundation.UniversalApiContract, 2.0),
         marshaling_behavior(agile),
-        static(Windows.UI.Composition.ICompositionObjectStatics, Windows.Foundation.UniversalApiContract, 7.0),
+        /* static(Windows.UI.Composition.ICompositionObjectStatics, Windows.Foundation.UniversalApiContract, 7.0), */
         threading(both)
     ]
     runtimeclass CompositionObject
@@ -1100,7 +1100,7 @@
         activatable(Windows.Foundation.UniversalApiContract, 2.0),
         contract(Windows.Foundation.UniversalApiContract, 2.0),
         marshaling_behavior(agile),
-        static(Windows.UI.Composition.ICompositorStatics, Windows.Foundation.UniversalApiContract, 6.0),
+        /* static(Windows.UI.Composition.ICompositorStatics, Windows.Foundation.UniversalApiContract, 6.0), */
         threading(both)
     ]
     runtimeclass Compositor
diff --git a/mingw-w64-headers/include/windows.ui.viewmanagement.idl b/mingw-w64-headers/include/windows.ui.viewmanagement.idl
index 1be8fac..cfb63c5 100644
--- a/mingw-w64-headers/include/windows.ui.viewmanagement.idl
+++ b/mingw-w64-headers/include/windows.ui.viewmanagement.idl
@@ -31,15 +31,50 @@
 import "windows.ui.idl";
 import "windows.ui.core.idl";
 /* import "windows.ui.popups.idl"; */
-/* import "windows.ui.windowmanagement.idl"; */
+import "windows.ui.windowmanagement.idl";
 #endif
 
 namespace Windows.UI.ViewManagement
 {
+    apicontract ViewManagementViewScalingContract;
+
+    typedef enum ApplicationViewBoundsMode ApplicationViewBoundsMode;
+    typedef enum ApplicationViewMode ApplicationViewMode;
+    typedef enum ApplicationViewOrientation ApplicationViewOrientation;
+    typedef enum ApplicationViewState ApplicationViewState;
+    typedef enum ApplicationViewSwitchingOptions ApplicationViewSwitchingOptions;
+    typedef enum ApplicationViewWindowingMode ApplicationViewWindowingMode;
+    typedef enum FullScreenSystemOverlayMode FullScreenSystemOverlayMode;
     typedef enum HandPreference HandPreference;
     typedef enum UIColorType UIColorType;
     typedef enum UIElementType UIElementType;
     typedef enum UserInteractionMode UserInteractionMode;
+    typedef enum ViewSizePreference ViewSizePreference;
+
+    interface IAccessibilitySettings;
+    interface IApplicationView;
+    interface IApplicationView2;
+    interface IApplicationView3;
+    interface IApplicationView4;
+    interface IApplicationView7;
+    interface IApplicationView9;
+    interface IApplicationViewConsolidatedEventArgs;
+    interface IApplicationViewConsolidatedEventArgs2;
+    interface IApplicationViewFullscreenStatics;
+    interface IApplicationViewInteropStatics;
+    interface IApplicationViewScaling;
+    interface IApplicationViewScalingStatics;
+    interface IApplicationViewStatics;
+    interface IApplicationViewStatics2;
+    interface IApplicationViewStatics3;
+    interface IApplicationViewStatics4;
+    interface IApplicationViewSwitcherStatics;
+    interface IApplicationViewSwitcherStatics2;
+    interface IApplicationViewSwitcherStatics3;
+    interface IApplicationViewTitleBar;
+    interface IApplicationViewTransferContext;
+    interface IApplicationViewTransferContextStatics;
+    interface IApplicationViewWithContext;
 
     interface IUISettings;
     interface IUISettings2;
@@ -53,6 +88,8 @@
 
     interface IUIViewSettings;
     interface IUIViewSettingsStatics;
+    interface IViewModePreferences;
+    interface IViewModePreferencesStatics;
 
     interface IInputPane;
     interface IInputPane2;
@@ -61,6 +98,17 @@
     interface IInputPaneStatics;
     interface IInputPaneStatics2;
 
+    runtimeclass AccessibilitySettings;
+#ifndef _WINDOWS_UI
+    runtimeclass ApplicationView;
+#endif
+    runtimeclass ApplicationViewConsolidatedEventArgs;
+    runtimeclass ApplicationViewScaling;
+#ifndef _WINDOWS_UI
+    runtimeclass ApplicationViewSwitcher;
+    runtimeclass ApplicationViewTitleBar;
+    runtimeclass ApplicationViewTransferContext;
+#endif
     runtimeclass UISettings;
     runtimeclass UISettingsAnimationsEnabledChangedEventArgs;
     runtimeclass UISettingsAutoHideScrollBarsChangedEventArgs;
@@ -68,8 +116,14 @@
     runtimeclass UIViewSettings;
     runtimeclass InputPane;
     runtimeclass InputPaneVisibilityEventArgs;
+    runtimeclass ViewModePreferences;
 
     declare {
+        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.AccessibilitySettings *, IInspectable *>;
+#ifndef _WINDOWS_UI
+        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, IInspectable *>;
+        interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs *>;
+#endif
         interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, IInspectable *>;
         interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsAnimationsEnabledChangedEventArgs *>;
         interface Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.UISettings *, Windows.UI.ViewManagement.UISettingsAutoHideScrollBarsChangedEventArgs *>;
@@ -78,6 +132,89 @@
     }
 
     [
+        contractversion(1.0)
+    ]
+    apicontract ViewManagementViewScalingContract
+    {
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum ApplicationViewBoundsMode
+    {
+        UseVisible    = 0,
+        UseCoreWindow = 1,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 4.0)
+    ]
+    enum ApplicationViewMode
+    {
+        Default        = 0,
+        CompactOverlay = 1,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum ApplicationViewOrientation
+    {
+        Landscape = 0,
+        Portrait  = 1,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum ApplicationViewState
+    {
+        FullScreenLandscape = 0,
+        Filled              = 1,
+        Snapped             = 2,
+        FullScreenPortrait  = 3,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        flags
+    ]
+    enum ApplicationViewSwitchingOptions
+    {
+        Default          = 0x0,
+        SkipAnimation    = 0x1,
+        ConsolidateViews = 0x2,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum ApplicationViewWindowingMode
+    {
+        Auto                    = 0,
+        PreferredLaunchViewSize = 1,
+        FullScreen              = 2,
+        [
+            contract(Windows.Foundation.UniversalApiContract, 7.0)
+        ]
+        CompactOverlay          = 3,
+        [
+            contract(Windows.Foundation.UniversalApiContract, 7.0)
+        ]
+        Maximized               = 4,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum FullScreenSystemOverlayMode
+    {
+        Standard = 0,
+        Minimal  = 1,
+    };
+
+    [
         contract(Windows.Foundation.UniversalApiContract, 1.0)
     ]
     enum HandPreference
@@ -159,6 +296,342 @@
     };
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 1.0)
+    ]
+    enum ViewSizePreference
+    {
+        Default    = 0,
+        UseLess    = 1,
+        UseHalf    = 2,
+        UseMore    = 3,
+        UseMinimum = 4,
+        UseNone    = 5,
+        [
+            contract(Windows.Foundation.UniversalApiContract, 4.0)
+        ]
+        Custom     = 6,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.AccessibilitySettings),
+        uuid(fe0e8147-c4c0-4562-b962-1327b52ad5b9)
+    ]
+    interface IAccessibilitySettings : IInspectable
+    {
+        [propget] HRESULT HighContrast([out, retval] boolean *value);
+        [propget] HRESULT HighContrastScheme([out, retval] HSTRING *value);
+        [eventadd] HRESULT HighContrastChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.AccessibilitySettings *, IInspectable *> *handler, [out, retval] EventRegistrationToken *cookie);
+        [eventremove] HRESULT HighContrastChanged([in] EventRegistrationToken cookie);
+    }
+
+#ifndef _WINDOWS_UI
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(d222d519-4361-451e-96c4-60f4f9742db0)
+    ]
+    interface IApplicationView : IInspectable
+    {
+        [propget] HRESULT Orientation([out, retval] Windows.UI.ViewManagement.ApplicationViewOrientation *value);
+        [propget] HRESULT AdjacentToLeftDisplayEdge([out, retval] boolean *value);
+        [propget] HRESULT AdjacentToRightDisplayEdge([out, retval] boolean *value);
+        [propget] HRESULT IsFullScreen([out, retval] boolean *value);
+        [propget] HRESULT IsOnLockScreen([out, retval] boolean *value);
+        [propget] HRESULT IsScreenCaptureEnabled([out, retval] boolean *value);
+        [propput] HRESULT IsScreenCaptureEnabled([in] boolean value);
+        [propput] HRESULT Title([in] HSTRING value);
+        [propget] HRESULT Title([out, retval] HSTRING *value);
+        [propget] HRESULT Id([out, retval] INT32 *value);
+        [eventadd] HRESULT Consolidated([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs *> *handler, [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT Consolidated([in] EventRegistrationToken token);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(e876b196-a545-40dc-b594-450cba68cc00)
+    ]
+    interface IApplicationView2 : IInspectable
+    {
+        [propget] HRESULT SuppressSystemOverlays([out, retval] boolean *value);
+        [propput] HRESULT SuppressSystemOverlays([in] boolean value);
+        [propget] HRESULT VisibleBounds([out, retval] Windows.Foundation.Rect *value);
+        [eventadd] HRESULT VisibleBoundsChanged([in] Windows.Foundation.TypedEventHandler<Windows.UI.ViewManagement.ApplicationView *, IInspectable *> *handler, [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT VisibleBoundsChanged([in] EventRegistrationToken token);
+        HRESULT SetDesiredBoundsMode([in] Windows.UI.ViewManagement.ApplicationViewBoundsMode mode, [out, retval] boolean *success);
+        [propget] HRESULT DesiredBoundsMode([out, retval] Windows.UI.ViewManagement.ApplicationViewBoundsMode *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(903c9ce5-793a-4fdf-a2b2-af1ac21e3108)
+    ]
+    interface IApplicationView3 : IInspectable
+    {
+        [propget] HRESULT TitleBar([out, retval] Windows.UI.ViewManagement.ApplicationViewTitleBar **value);
+        [propget] HRESULT FullScreenSystemOverlayMode([out, retval] Windows.UI.ViewManagement.FullScreenSystemOverlayMode *value);
+        [propput] HRESULT FullScreenSystemOverlayMode([in] Windows.UI.ViewManagement.FullScreenSystemOverlayMode value);
+        [propget] HRESULT IsFullScreenMode([out, retval] boolean *value);
+        HRESULT TryEnterFullScreenMode([out, retval] boolean *success);
+        HRESULT ExitFullScreenMode();
+        HRESULT ShowStandardSystemOverlays();
+        HRESULT TryResizeView([in] Windows.Foundation.Size value, [out, retval] boolean *success);
+        HRESULT SetPreferredMinSize([in] Windows.Foundation.Size size);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 4.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(15e5cbec-9e0f-46b5-bc3f-9bf653e74b5e)
+    ]
+    interface IApplicationView4 : IInspectable
+    {
+        [propget] HRESULT ViewMode([out, retval] Windows.UI.ViewManagement.ApplicationViewMode *value);
+        HRESULT IsViewModeSupported([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] boolean *is_mode_supported);
+        [overload("TryEnterViewModeAsync")] HRESULT TryEnterViewModeAsync([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+        [overload("TryEnterViewModeAsync")] HRESULT TryEnterViewModeWithPreferencesAsync([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [in] Windows.UI.ViewManagement.ViewModePreferences *preferences, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+        HRESULT TryConsolidateAsync([out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(a0369647-5faf-5aa6-9c38-befbb12a071e)
+    ]
+    interface IApplicationView7 : IInspectable
+    {
+        [propget] HRESULT PersistedStateId([out, retval] HSTRING *value);
+        [propput] HRESULT PersistedStateId([in] HSTRING value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(9c6516f9-021a-5f01-93e5-9bdad2647574)
+    ]
+    interface IApplicationView9 : IInspectable
+    {
+        [propget] HRESULT WindowingEnvironment([out, retval] Windows.UI.WindowManagement.WindowingEnvironment **value);
+        HRESULT GetDisplayRegions([out, retval] Windows.Foundation.Collections.IVectorView<Windows.UI.WindowManagement.DisplayRegion *> **result);
+    }
+#endif
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs),
+        uuid(514449ec-7ea2-4de7-a6a6-7dfbaaebb6fb)
+    ]
+    interface IApplicationViewConsolidatedEventArgs : IInspectable
+    {
+        [propget] HRESULT IsUserInitiated([out, retval] boolean *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 4.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationViewConsolidatedEventArgs),
+        uuid(1c199ecc-6dc1-40f4-afee-07d9ea296430)
+    ]
+    interface IApplicationViewConsolidatedEventArgs2 : IInspectable
+    {
+        [propget] HRESULT IsAppInitiated([out, retval] boolean *value);
+    }
+
+#ifndef _WINDOWS_UI
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(bc792ebd-64fe-4b65-a0c0-901ce2b68636)
+    ]
+    interface IApplicationViewFullscreenStatics : IInspectable
+    {
+        HRESULT TryUnsnapToFullscreen([out, retval] boolean *success);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(c446fb5d-4793-4896-a8e2-be57a8bb0f50)
+    ]
+    interface IApplicationViewInteropStatics : IInspectable
+    {
+        HRESULT GetApplicationViewIdForWindow([in] Windows.UI.Core.ICoreWindow *window, [out, retval] INT32 *id);
+    }
+#endif
+
+    [
+        contract(Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationViewScaling),
+        uuid(1d0ddc23-23f3-4b2d-84fe-74bf37b48b66)
+    ]
+    interface IApplicationViewScaling : IInspectable
+    {
+    }
+
+    [
+        contract(Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationViewScaling),
+        uuid(b08fecf0-b946-45c8-a5e3-71f5aa78f861)
+    ]
+    interface IApplicationViewScalingStatics : IInspectable
+    {
+        [propget] HRESULT DisableLayoutScaling([out, retval] boolean *value);
+        HRESULT TrySetDisableLayoutScaling([in] boolean disabled, [out, retval] boolean *success);
+    }
+
+#ifndef _WINDOWS_UI
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(010a6306-c433-44e5-a9f2-bd84d4030a95)
+    ]
+    interface IApplicationViewStatics : IInspectable
+    {
+        [propget] HRESULT Value([out, retval] Windows.UI.ViewManagement.ApplicationViewState *value);
+        HRESULT TryUnsnap([out, retval] boolean *success);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(af338ae5-cf64-423c-85e5-f3e72448fb23)
+    ]
+    interface IApplicationViewStatics2 : IInspectable
+    {
+        HRESULT GetForCurrentView([out, retval] Windows.UI.ViewManagement.ApplicationView **current);
+        [propget] HRESULT TerminateAppOnFinalViewClose([out, retval] boolean *value);
+        [propput] HRESULT TerminateAppOnFinalViewClose([in] boolean value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(a28d7594-8c41-4e13-9719-5164796fe4c7)
+    ]
+    interface IApplicationViewStatics3 : IInspectable
+    {
+        [propget] HRESULT PreferredLaunchWindowingMode([out, retval] Windows.UI.ViewManagement.ApplicationViewWindowingMode *value);
+        [propput] HRESULT PreferredLaunchWindowingMode([in] Windows.UI.ViewManagement.ApplicationViewWindowingMode value);
+        [propget] HRESULT PreferredLaunchViewSize([out, retval] Windows.Foundation.Size *value);
+        [propput] HRESULT PreferredLaunchViewSize([in] Windows.Foundation.Size value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(08fd8d33-2611-5336-a315-d98e6366c9db)
+    ]
+    interface IApplicationViewStatics4 : IInspectable
+    {
+        HRESULT ClearAllPersistedState();
+        HRESULT ClearPersistedState([in] HSTRING key);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationViewSwitcher),
+        uuid(975f2f1e-e656-4c5e-a0a1-717c6ffa7d64)
+    ]
+    interface IApplicationViewSwitcherStatics : IInspectable
+    {
+        HRESULT DisableShowingMainViewOnActivation();
+        [overload("TryShowAsStandaloneAsync")] HRESULT TryShowAsStandaloneAsync([in] INT32 view_id, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+        [overload("TryShowAsStandaloneAsync")] HRESULT TryShowAsStandaloneWithSizePreferenceAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ViewSizePreference preference, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+        [overload("TryShowAsStandaloneAsync")] HRESULT TryShowAsStandaloneWithAnchorViewAndSizePreferenceAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ViewSizePreference size_preference, [in] INT32 anchor_view_id, [in] Windows.UI.ViewManagement.ViewSizePreference anchor_size_preference, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+        [overload("SwitchAsync")] HRESULT SwitchAsync([in] INT32 view_id, [out, retval] Windows.Foundation.IAsyncAction **operation);
+        [overload("SwitchAsync")] HRESULT SwitchFromViewAsync([in] INT32 to_view_id, [in] INT32 from_view_id, [out, retval] Windows.Foundation.IAsyncAction **operation);
+        [overload("SwitchAsync")] HRESULT SwitchFromViewWithOptionsAsync([in] INT32 to_view_id, [in] INT32 from_view_id, [in] Windows.UI.ViewManagement.ApplicationViewSwitchingOptions options, [out, retval] Windows.Foundation.IAsyncAction **operation);
+        HRESULT PrepareForCustomAnimatedSwitchAsync([in] INT32 to_view_id, [in] INT32 from_view_id, [in] Windows.UI.ViewManagement.ApplicationViewSwitchingOptions options, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationViewSwitcher),
+        uuid(60e995cd-4fc2-48c4-b8e3-395f2b9f0fc1)
+    ]
+    interface IApplicationViewSwitcherStatics2 : IInspectable
+    {
+        HRESULT DisableSystemViewActivationPolicy();
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 4.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationViewSwitcher),
+        uuid(92059420-80a7-486d-b21f-c7a4a242a383)
+    ]
+    interface IApplicationViewSwitcherStatics3 : IInspectable
+    {
+        [overload("TryShowAsViewModeAsync")] HRESULT TryShowAsViewModeAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+        [overload("TryShowAsViewModeAsync")] HRESULT TryShowAsViewModeWithPreferencesAsync([in] INT32 view_id, [in] Windows.UI.ViewManagement.ApplicationViewMode mode, [in] Windows.UI.ViewManagement.ViewModePreferences *preferences, [out, retval] Windows.Foundation.IAsyncOperation<boolean> **operation);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationViewTitleBar),
+        uuid(00924ac0-932b-4a6b-9c4b-dc38c82478ce)
+    ]
+    interface IApplicationViewTitleBar : IInspectable
+    {
+        [propput] HRESULT ForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT ForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT BackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT BackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT ButtonForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT ButtonForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT ButtonBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT ButtonBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT ButtonHoverForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT ButtonHoverForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT ButtonHoverBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT ButtonHoverBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT ButtonPressedForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT ButtonPressedForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT ButtonPressedBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT ButtonPressedBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT InactiveForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT InactiveForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT InactiveBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT InactiveBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT ButtonInactiveForegroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT ButtonInactiveForegroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+        [propput] HRESULT ButtonInactiveBackgroundColor([in] Windows.Foundation.IReference<Windows.UI.Color> *value);
+        [propget] HRESULT ButtonInactiveBackgroundColor([out, retval] Windows.Foundation.IReference<Windows.UI.Color> **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 2.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationViewTransferContext),
+        uuid(8574bc63-3c17-408e-9408-8a1a9ea81bfa)
+    ]
+    interface IApplicationViewTransferContext : IInspectable
+    {
+        [propget] HRESULT ViewId([out, retval] INT32 *value);
+        [propput] HRESULT ViewId([in] INT32 value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 2.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationViewTransferContext),
+        uuid(15a89d92-dd79-4b0b-bc47-d5f195f14661)
+    ]
+    interface IApplicationViewTransferContextStatics : IInspectable
+    {
+        [propget] HRESULT DataPackageFormatId([out, retval] HSTRING *value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.UI.ViewManagement.ApplicationView),
+        uuid(bd55d512-9dc1-44fc-8501-666625df60dc)
+    ]
+    interface IApplicationViewWithContext : IInspectable
+    {
+        [propget] HRESULT UIContext([out, retval] Windows.UI.UIContext **value);
+    }
+#endif
+
+    [
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         exclusiveto(Windows.UI.ViewManagement.UISettings),
         uuid(85361600-1c63-4627-bcb1-3a89e0bc9c55)
@@ -367,6 +840,115 @@
     }
 
     [
+        contract(Windows.Foundation.UniversalApiContract, 4.0),
+        exclusiveto(Windows.UI.ViewManagement.ViewModePreferences),
+        uuid(878fcd3a-0b99-42c9-84d0-d3f1d403554b)
+    ]
+    interface IViewModePreferences : IInspectable
+    {
+        [propget] HRESULT ViewSizePreference([out, retval] Windows.UI.ViewManagement.ViewSizePreference *value);
+        [propput] HRESULT ViewSizePreference([in] Windows.UI.ViewManagement.ViewSizePreference value);
+        [propget] HRESULT CustomSize([out, retval] Windows.Foundation.Size *value);
+        [propput] HRESULT CustomSize([in] Windows.Foundation.Size value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 4.0),
+        exclusiveto(Windows.UI.ViewManagement.ViewModePreferences),
+        uuid(69b60a65-5de5-40d8-8306-3833df7a2274)
+    ]
+    interface IViewModePreferencesStatics : IInspectable
+    {
+        HRESULT CreateDefault([in] Windows.UI.ViewManagement.ApplicationViewMode mode, [out, retval] Windows.UI.ViewManagement.ViewModePreferences **result);
+    }
+
+    [
+        activatable(Windows.Foundation.UniversalApiContract, 1.0),
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass AccessibilitySettings
+    {
+        [default] interface Windows.UI.ViewManagement.IAccessibilitySettings;
+    }
+
+#ifndef _WINDOWS_UI
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        static(Windows.UI.ViewManagement.IApplicationViewFullscreenStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        static(Windows.UI.ViewManagement.IApplicationViewInteropStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        static(Windows.UI.ViewManagement.IApplicationViewStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        static(Windows.UI.ViewManagement.IApplicationViewStatics2, Windows.Foundation.UniversalApiContract, 1.0),
+        static(Windows.UI.ViewManagement.IApplicationViewStatics3, Windows.Foundation.UniversalApiContract, 1.0),
+        static(Windows.UI.ViewManagement.IApplicationViewStatics4, Windows.Foundation.UniversalApiContract, 8.0),
+        threading(both)
+    ]
+    runtimeclass ApplicationView
+    {
+        [contract(Windows.Foundation.UniversalApiContract, 1.0)] [default] interface Windows.UI.ViewManagement.IApplicationView;
+        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IApplicationView2;
+        [contract(Windows.Foundation.UniversalApiContract, 1.0)] interface Windows.UI.ViewManagement.IApplicationView3;
+        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.UI.ViewManagement.IApplicationView4;
+        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IApplicationView7;
+        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IApplicationView9;
+        [contract(Windows.Foundation.UniversalApiContract, 8.0)] interface Windows.UI.ViewManagement.IApplicationViewWithContext;
+    }
+#endif
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass ApplicationViewConsolidatedEventArgs
+    {
+        [default] interface Windows.UI.ViewManagement.IApplicationViewConsolidatedEventArgs;
+        [contract(Windows.Foundation.UniversalApiContract, 4.0)] interface Windows.UI.ViewManagement.IApplicationViewConsolidatedEventArgs2;
+    }
+
+    [
+        contract(Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0),
+        static(Windows.UI.ViewManagement.IApplicationViewScalingStatics, Windows.UI.ViewManagement.ViewManagementViewScalingContract, 1.0)
+    ]
+    runtimeclass ApplicationViewScaling
+    {
+        [default] interface Windows.UI.ViewManagement.IApplicationViewScaling;
+    }
+
+#ifndef _WINDOWS_UI
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile),
+        static(Windows.UI.ViewManagement.IApplicationViewSwitcherStatics, Windows.Foundation.UniversalApiContract, 1.0),
+        static(Windows.UI.ViewManagement.IApplicationViewSwitcherStatics2, Windows.Foundation.UniversalApiContract, 1.0),
+        static(Windows.UI.ViewManagement.IApplicationViewSwitcherStatics3, Windows.Foundation.UniversalApiContract, 4.0),
+        threading(both)
+    ]
+    runtimeclass ApplicationViewSwitcher
+    {
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 1.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass ApplicationViewTitleBar
+    {
+        [contract(Windows.Foundation.UniversalApiContract, 1.0), default] interface Windows.UI.ViewManagement.IApplicationViewTitleBar;
+    }
+
+    [
+        activatable(Windows.Foundation.UniversalApiContract, 2.0),
+        contract(Windows.Foundation.UniversalApiContract, 2.0),
+        static(Windows.UI.ViewManagement.IApplicationViewTransferContextStatics, Windows.Foundation.UniversalApiContract, 2.0)
+    ]
+    runtimeclass ApplicationViewTransferContext
+    {
+        [contract(Windows.Foundation.UniversalApiContract, 2.0), default] interface Windows.UI.ViewManagement.IApplicationViewTransferContext;
+    }
+#endif
+
+    [
         activatable(Windows.Foundation.UniversalApiContract, 1.0),
         contract(Windows.Foundation.UniversalApiContract, 1.0),
         marshaling_behavior(agile)
@@ -408,6 +990,7 @@
         [default] interface Windows.UI.ViewManagement.IUISettingsMessageDurationChangedEventArgs;
     }
 
+#ifndef _WINDOWS_UI
     [
         static(Windows.UI.ViewManagement.IUIViewSettingsStatics, Windows.Foundation.UniversalApiContract, 1.0),
         contract(Windows.Foundation.UniversalApiContract, 1.0),
@@ -417,6 +1000,7 @@
     {
         [default] interface Windows.UI.ViewManagement.IUIViewSettings;
     }
+#endif
 
     [
         static(Windows.UI.ViewManagement.IInputPaneStatics, Windows.Foundation.UniversalApiContract, 1.0),
@@ -439,4 +1023,15 @@
     {
         [default] interface Windows.UI.ViewManagement.IInputPaneVisibilityEventArgs;
     }
+
+#ifndef _WINDOWS_UI
+    [
+        contract(Windows.Foundation.UniversalApiContract, 4.0),
+        static(Windows.UI.ViewManagement.IViewModePreferencesStatics, Windows.Foundation.UniversalApiContract, 4.0)
+    ]
+    runtimeclass ViewModePreferences
+    {
+        [contract(Windows.Foundation.UniversalApiContract, 4.0), default] interface Windows.UI.ViewManagement.IViewModePreferences;
+    }
+#endif
 }
diff --git a/mingw-w64-headers/include/windows.ui.windowmanagement.idl b/mingw-w64-headers/include/windows.ui.windowmanagement.idl
new file mode 100644
index 0000000..b6ca12c
--- /dev/null
+++ b/mingw-w64-headers/include/windows.ui.windowmanagement.idl
@@ -0,0 +1,188 @@
+/*
+ * Copyright 2025 Zhiyi Zhang for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef __WIDL__
+#pragma winrt ns_prefix
+#endif
+
+#ifndef DO_NO_IMPORTS
+import "inspectable.idl";
+import "asyncinfo.idl";
+import "eventtoken.idl";
+import "windowscontracts.idl";
+import "windows.foundation.idl";
+import "windows.system.idl";
+import "windows.ui.idl";
+import "windows.ui.composition.idl";
+#endif
+
+namespace Windows.UI.WindowManagement
+{
+    typedef enum WindowingEnvironmentKind WindowingEnvironmentKind;
+
+    interface IDisplayRegion;
+    interface IWindowingEnvironment;
+    interface IWindowingEnvironmentAddedEventArgs;
+    interface IWindowingEnvironmentChangedEventArgs;
+    interface IWindowingEnvironmentRemovedEventArgs;
+    interface IWindowingEnvironmentStatics;
+
+    runtimeclass DisplayRegion;
+    runtimeclass WindowingEnvironment;
+    runtimeclass WindowingEnvironmentAddedEventArgs;
+    runtimeclass WindowingEnvironmentChangedEventArgs;
+    runtimeclass WindowingEnvironmentRemovedEventArgs;
+
+    declare {
+        interface Windows.Foundation.Collections.IIterable<Windows.UI.WindowManagement.DisplayRegion *>;
+        interface Windows.Foundation.Collections.IIterable<Windows.UI.WindowManagement.WindowingEnvironment *>;
+        interface Windows.Foundation.Collections.IIterator<Windows.UI.WindowManagement.DisplayRegion *>;
+        interface Windows.Foundation.Collections.IIterator<Windows.UI.WindowManagement.WindowingEnvironment *>;
+        interface Windows.Foundation.Collections.IVectorView<Windows.UI.WindowManagement.DisplayRegion *>;
+        interface Windows.Foundation.Collections.IVectorView<Windows.UI.WindowManagement.WindowingEnvironment *>;
+        interface Windows.Foundation.TypedEventHandler<Windows.UI.WindowManagement.DisplayRegion *, IInspectable *>;
+        interface Windows.Foundation.TypedEventHandler<Windows.UI.WindowManagement.WindowingEnvironment *, Windows.UI.WindowManagement.WindowingEnvironmentChangedEventArgs *>;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0)
+    ]
+    enum WindowingEnvironmentKind
+    {
+        Unknown = 0,
+        Overlapped = 1,
+        Tiled = 2,
+    };
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.UI.WindowManagement.DisplayRegion),
+        uuid(db50c3a2-4094-5f47-8cb1-ea01ddafaa94)
+    ]
+    interface IDisplayRegion : IInspectable
+    {
+        [propget] HRESULT DisplayMonitorDeviceId([out, retval] HSTRING *value);
+        [propget] HRESULT IsVisible([out, retval] boolean *value);
+        [propget] HRESULT WorkAreaOffset([out, retval] Windows.Foundation.Point *value);
+        [propget] HRESULT WorkAreaSize([out, retval] Windows.Foundation.Size *value);
+        [propget] HRESULT WindowingEnvironment([out, retval] Windows.UI.WindowManagement.WindowingEnvironment **value);
+        [eventadd] HRESULT Changed([in] Windows.Foundation.TypedEventHandler<Windows.UI.WindowManagement.DisplayRegion *, IInspectable *> *handler, [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT Changed([in] EventRegistrationToken token);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.UI.WindowManagement.WindowingEnvironment),
+        uuid(264363c0-2a49-5417-b3ae-48a71c63a3bd)
+    ]
+    interface IWindowingEnvironment : IInspectable
+    {
+        [propget] HRESULT IsEnabled([out, retval] boolean *value);
+        [propget] HRESULT Kind([out, retval] Windows.UI.WindowManagement.WindowingEnvironmentKind *value);
+        HRESULT GetDisplayRegions([out, retval] Windows.Foundation.Collections.IVectorView<Windows.UI.WindowManagement.DisplayRegion *> **result);
+        [eventadd] HRESULT Changed([in] Windows.Foundation.TypedEventHandler<Windows.UI.WindowManagement.WindowingEnvironment *, Windows.UI.WindowManagement.WindowingEnvironmentChangedEventArgs *> *handler, [out, retval] EventRegistrationToken *token);
+        [eventremove] HRESULT Changed([in] EventRegistrationToken token);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.UI.WindowManagement.WindowingEnvironmentAddedEventArgs),
+        uuid(ff2a5b7f-f183-5c66-99b2-429082069299)
+    ]
+    interface IWindowingEnvironmentAddedEventArgs : IInspectable
+    {
+        [propget] HRESULT WindowingEnvironment([out, retval] Windows.UI.WindowManagement.WindowingEnvironment **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.UI.WindowManagement.WindowingEnvironmentChangedEventArgs),
+        uuid(4160cfc6-023d-5e9a-b431-350e67dc978a)
+    ]
+    interface IWindowingEnvironmentChangedEventArgs : IInspectable
+    {
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.UI.WindowManagement.WindowingEnvironmentRemovedEventArgs),
+        uuid(2e5b5473-beff-5e53-9316-7e775fe568b3)
+    ]
+    interface IWindowingEnvironmentRemovedEventArgs : IInspectable
+    {
+        [propget] HRESULT WindowingEnvironment([out, retval] Windows.UI.WindowManagement.WindowingEnvironment **value);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        exclusiveto(Windows.UI.WindowManagement.WindowingEnvironment),
+        uuid(874e9fb7-c642-55ab-8aa2-162f734a9a72)
+    ]
+    interface IWindowingEnvironmentStatics : IInspectable
+    {
+        [overload("FindAll")] HRESULT FindAll([out, retval] Windows.Foundation.Collections.IVectorView<Windows.UI.WindowManagement.WindowingEnvironment *> **result);
+        [overload("FindAll")] HRESULT FindAllWithKind([in] Windows.UI.WindowManagement.WindowingEnvironmentKind kind, [out, retval] Windows.Foundation.Collections.IVectorView<Windows.UI.WindowManagement.WindowingEnvironment *> **result);
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass DisplayRegion
+    {
+        [default] interface Windows.UI.WindowManagement.IDisplayRegion;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        marshaling_behavior(agile),
+        static(Windows.UI.WindowManagement.IWindowingEnvironmentStatics, Windows.Foundation.UniversalApiContract, 8.0),
+        threading(both)
+    ]
+    runtimeclass WindowingEnvironment
+    {
+        [default] interface Windows.UI.WindowManagement.IWindowingEnvironment;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass WindowingEnvironmentAddedEventArgs
+    {
+        [default] interface Windows.UI.WindowManagement.IWindowingEnvironmentAddedEventArgs;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass WindowingEnvironmentChangedEventArgs
+    {
+        [default] interface Windows.UI.WindowManagement.IWindowingEnvironmentChangedEventArgs;
+    }
+
+    [
+        contract(Windows.Foundation.UniversalApiContract, 8.0),
+        marshaling_behavior(agile)
+    ]
+    runtimeclass WindowingEnvironmentRemovedEventArgs
+    {
+        [default] interface Windows.UI.WindowManagement.IWindowingEnvironmentRemovedEventArgs;
+    }
+}
